openclaw-code-agent 3.2.1 → 4.0.0

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/dist/index.js CHANGED
@@ -1,19 +1,19 @@
1
- var Vg=Object.defineProperty;var u=(t,e)=>()=>(t&&(e=t(t=0)),e);var co=(t,e)=>{for(var r in e)Vg(t,r,{get:e[r],enumerable:!0})};var Me={};co(Me,{HasPropertyKey:()=>mo,IsArray:()=>pe,IsAsyncIterator:()=>Ds,IsBigInt:()=>pn,IsBoolean:()=>Dt,IsDate:()=>cr,IsFunction:()=>Ns,IsIterator:()=>Fs,IsNull:()=>Ls,IsNumber:()=>Ge,IsObject:()=>j,IsRegExp:()=>cn,IsString:()=>Q,IsSymbol:()=>Ws,IsUint8Array:()=>Nt,IsUndefined:()=>ce});function mo(t,e){return e in t}function Ds(t){return j(t)&&!pe(t)&&!Nt(t)&&Symbol.asyncIterator in t}function pe(t){return Array.isArray(t)}function pn(t){return typeof t=="bigint"}function Dt(t){return typeof t=="boolean"}function cr(t){return t instanceof globalThis.Date}function Ns(t){return typeof t=="function"}function Fs(t){return j(t)&&!pe(t)&&!Nt(t)&&Symbol.iterator in t}function Ls(t){return t===null}function Ge(t){return typeof t=="number"}function j(t){return typeof t=="object"&&t!==null}function cn(t){return t instanceof globalThis.RegExp}function Q(t){return typeof t=="string"}function Ws(t){return typeof t=="symbol"}function Nt(t){return t instanceof globalThis.Uint8Array}function ce(t){return t===void 0}var De=u(()=>{});function qg(t){return t.map(e=>fo(e))}function jg(t){return new Date(t.getTime())}function Gg(t){return new Uint8Array(t)}function Hg(t){return new RegExp(t.source,t.flags)}function zg(t){let e={};for(let r of Object.getOwnPropertyNames(t))e[r]=fo(t[r]);for(let r of Object.getOwnPropertySymbols(t))e[r]=fo(t[r]);return e}function fo(t){return pe(t)?qg(t):cr(t)?jg(t):Nt(t)?Gg(t):cn(t)?Hg(t):j(t)?zg(t):t}function ee(t){return fo(t)}var We=u(()=>{De()});function Dr(t,e){return e===void 0?ee(t):ee({...e,...t})}var go=u(()=>{We()});var Bs=u(()=>{go();We()});function kl(t){return t!==null&&typeof t=="object"}function vl(t){return globalThis.Array.isArray(t)&&!globalThis.ArrayBuffer.isView(t)}function Pl(t){return t===void 0}function wl(t){return typeof t=="number"}var Il=u(()=>{});var xl=u(()=>{Il()});var ho,bl=u(()=>{xl();(function(t){t.InstanceMode="default",t.ExactOptionalPropertyTypes=!1,t.AllowArrayObject=!1,t.AllowNaN=!1,t.AllowNullVoid=!1;function e(s,a){return t.ExactOptionalPropertyTypes?a in s:s[a]!==void 0}t.IsExactOptionalProperty=e;function r(s){let a=kl(s);return t.AllowArrayObject?a:a&&!vl(s)}t.IsObjectLike=r;function n(s){return r(s)&&!(s instanceof Date)&&!(s instanceof Uint8Array)}t.IsRecordLike=n;function o(s){return t.AllowNaN?wl(s):Number.isFinite(s)}t.IsNumberLike=o;function i(s){let a=Pl(s);return t.AllowNullVoid?a||s===null:a}t.IsVoidLike=i})(ho||(ho={}))});function Qg(t){return globalThis.Object.freeze(t).map(e=>mn(e))}function Jg(t){let e={};for(let r of Object.getOwnPropertyNames(t))e[r]=mn(t[r]);for(let r of Object.getOwnPropertySymbols(t))e[r]=mn(t[r]);return globalThis.Object.freeze(e)}function mn(t){return pe(t)?Qg(t):cr(t)?t:Nt(t)?t:cn(t)?t:j(t)?Jg(t):t}var Al=u(()=>{De()});function h(t,e){let r=e!==void 0?{...e,...t}:t;switch(ho.InstanceMode){case"freeze":return mn(r);case"clone":return ee(r);default:return r}}var T=u(()=>{bl();Al();We()});var Ft=u(()=>{T()});var we,Rl=u(()=>{we=class extends Error{constructor(e){super(e)}}});var At=u(()=>{Rl()});var ge,mt,be,rt,P,fn=u(()=>{ge=Symbol.for("TypeBox.Transform"),mt=Symbol.for("TypeBox.Readonly"),be=Symbol.for("TypeBox.Optional"),rt=Symbol.for("TypeBox.Hint"),P=Symbol.for("TypeBox.Kind")});var M=u(()=>{fn()});function Nr(t){return j(t)&&t[mt]==="Readonly"}function Be(t){return j(t)&&t[be]==="Optional"}function Us(t){return F(t,"Any")}function Ks(t){return F(t,"Argument")}function ft(t){return F(t,"Array")}function mr(t){return F(t,"AsyncIterator")}function fr(t){return F(t,"BigInt")}function Lt(t){return F(t,"Boolean")}function gt(t){return F(t,"Computed")}function ht(t){return F(t,"Constructor")}function Yg(t){return F(t,"Date")}function St(t){return F(t,"Function")}function yt(t){return F(t,"Integer")}function ie(t){return F(t,"Intersect")}function gr(t){return F(t,"Iterator")}function F(t,e){return j(t)&&P in t&&t[P]===e}function So(t){return Dt(t)||Ge(t)||Q(t)}function He(t){return F(t,"Literal")}function ze(t){return F(t,"MappedKey")}function te(t){return F(t,"MappedResult")}function Ht(t){return F(t,"Never")}function Xg(t){return F(t,"Not")}function gn(t){return F(t,"Null")}function kt(t){return F(t,"Number")}function me(t){return F(t,"Object")}function hr(t){return F(t,"Promise")}function Sr(t){return F(t,"Record")}function de(t){return F(t,"Ref")}function Vs(t){return F(t,"RegExp")}function Wt(t){return F(t,"String")}function hn(t){return F(t,"Symbol")}function Qe(t){return F(t,"TemplateLiteral")}function Zg(t){return F(t,"This")}function zt(t){return j(t)&&ge in t}function Je(t){return F(t,"Tuple")}function Sn(t){return F(t,"Undefined")}function L(t){return F(t,"Union")}function eh(t){return F(t,"Uint8Array")}function th(t){return F(t,"Unknown")}function rh(t){return F(t,"Unsafe")}function nh(t){return F(t,"Void")}function oh(t){return j(t)&&P in t&&Q(t[P])}function Ye(t){return Us(t)||Ks(t)||ft(t)||Lt(t)||fr(t)||mr(t)||gt(t)||ht(t)||Yg(t)||St(t)||yt(t)||ie(t)||gr(t)||He(t)||ze(t)||te(t)||Ht(t)||Xg(t)||gn(t)||kt(t)||me(t)||hr(t)||Sr(t)||de(t)||Vs(t)||Wt(t)||hn(t)||Qe(t)||Zg(t)||Je(t)||Sn(t)||L(t)||eh(t)||th(t)||rh(t)||nh(t)||oh(t)}var B=u(()=>{De();M()});var c={};co(c,{IsAny:()=>_l,IsArgument:()=>$l,IsArray:()=>El,IsAsyncIterator:()=>Ol,IsBigInt:()=>Dl,IsBoolean:()=>Nl,IsComputed:()=>Fl,IsConstructor:()=>Ll,IsDate:()=>Wl,IsFunction:()=>Bl,IsImport:()=>uh,IsInteger:()=>Ul,IsIntersect:()=>Kl,IsIterator:()=>Vl,IsKind:()=>gu,IsKindOf:()=>E,IsLiteral:()=>kn,IsLiteralBoolean:()=>ph,IsLiteralNumber:()=>jl,IsLiteralString:()=>ql,IsLiteralValue:()=>Gl,IsMappedKey:()=>Hl,IsMappedResult:()=>zl,IsNever:()=>Ql,IsNot:()=>Jl,IsNull:()=>Yl,IsNumber:()=>Xl,IsObject:()=>Zl,IsOptional:()=>lh,IsPromise:()=>eu,IsProperties:()=>yo,IsReadonly:()=>dh,IsRecord:()=>tu,IsRecursive:()=>ch,IsRef:()=>ru,IsRegExp:()=>nu,IsSchema:()=>Ie,IsString:()=>ou,IsSymbol:()=>iu,IsTemplateLiteral:()=>su,IsThis:()=>au,IsTransform:()=>du,IsTuple:()=>lu,IsUint8Array:()=>pu,IsUndefined:()=>uu,IsUnion:()=>Hs,IsUnionLiteral:()=>mh,IsUnknown:()=>cu,IsUnsafe:()=>mu,IsVoid:()=>fu,TypeGuardUnknownTypeError:()=>qs});function Tl(t){try{return new RegExp(t),!0}catch{return!1}}function js(t){if(!Q(t))return!1;for(let e=0;e<t.length;e++){let r=t.charCodeAt(e);if(r>=7&&r<=13||r===27||r===127)return!1}return!0}function Ml(t){return Gs(t)||Ie(t)}function yn(t){return ce(t)||pn(t)}function J(t){return ce(t)||Ge(t)}function Gs(t){return ce(t)||Dt(t)}function G(t){return ce(t)||Q(t)}function sh(t){return ce(t)||Q(t)&&js(t)&&Tl(t)}function ah(t){return ce(t)||Q(t)&&js(t)}function Cl(t){return ce(t)||Ie(t)}function dh(t){return j(t)&&t[mt]==="Readonly"}function lh(t){return j(t)&&t[be]==="Optional"}function _l(t){return E(t,"Any")&&G(t.$id)}function $l(t){return E(t,"Argument")&&Ge(t.index)}function El(t){return E(t,"Array")&&t.type==="array"&&G(t.$id)&&Ie(t.items)&&J(t.minItems)&&J(t.maxItems)&&Gs(t.uniqueItems)&&Cl(t.contains)&&J(t.minContains)&&J(t.maxContains)}function Ol(t){return E(t,"AsyncIterator")&&t.type==="AsyncIterator"&&G(t.$id)&&Ie(t.items)}function Dl(t){return E(t,"BigInt")&&t.type==="bigint"&&G(t.$id)&&yn(t.exclusiveMaximum)&&yn(t.exclusiveMinimum)&&yn(t.maximum)&&yn(t.minimum)&&yn(t.multipleOf)}function Nl(t){return E(t,"Boolean")&&t.type==="boolean"&&G(t.$id)}function Fl(t){return E(t,"Computed")&&Q(t.target)&&pe(t.parameters)&&t.parameters.every(e=>Ie(e))}function Ll(t){return E(t,"Constructor")&&t.type==="Constructor"&&G(t.$id)&&pe(t.parameters)&&t.parameters.every(e=>Ie(e))&&Ie(t.returns)}function Wl(t){return E(t,"Date")&&t.type==="Date"&&G(t.$id)&&J(t.exclusiveMaximumTimestamp)&&J(t.exclusiveMinimumTimestamp)&&J(t.maximumTimestamp)&&J(t.minimumTimestamp)&&J(t.multipleOfTimestamp)}function Bl(t){return E(t,"Function")&&t.type==="Function"&&G(t.$id)&&pe(t.parameters)&&t.parameters.every(e=>Ie(e))&&Ie(t.returns)}function uh(t){return E(t,"Import")&&mo(t,"$defs")&&j(t.$defs)&&yo(t.$defs)&&mo(t,"$ref")&&Q(t.$ref)&&t.$ref in t.$defs}function Ul(t){return E(t,"Integer")&&t.type==="integer"&&G(t.$id)&&J(t.exclusiveMaximum)&&J(t.exclusiveMinimum)&&J(t.maximum)&&J(t.minimum)&&J(t.multipleOf)}function yo(t){return j(t)&&Object.entries(t).every(([e,r])=>js(e)&&Ie(r))}function Kl(t){return E(t,"Intersect")&&!(Q(t.type)&&t.type!=="object")&&pe(t.allOf)&&t.allOf.every(e=>Ie(e)&&!du(e))&&G(t.type)&&(Gs(t.unevaluatedProperties)||Cl(t.unevaluatedProperties))&&G(t.$id)}function Vl(t){return E(t,"Iterator")&&t.type==="Iterator"&&G(t.$id)&&Ie(t.items)}function E(t,e){return j(t)&&P in t&&t[P]===e}function ql(t){return kn(t)&&Q(t.const)}function jl(t){return kn(t)&&Ge(t.const)}function ph(t){return kn(t)&&Dt(t.const)}function kn(t){return E(t,"Literal")&&G(t.$id)&&Gl(t.const)}function Gl(t){return Dt(t)||Ge(t)||Q(t)}function Hl(t){return E(t,"MappedKey")&&pe(t.keys)&&t.keys.every(e=>Ge(e)||Q(e))}function zl(t){return E(t,"MappedResult")&&yo(t.properties)}function Ql(t){return E(t,"Never")&&j(t.not)&&Object.getOwnPropertyNames(t.not).length===0}function Jl(t){return E(t,"Not")&&Ie(t.not)}function Yl(t){return E(t,"Null")&&t.type==="null"&&G(t.$id)}function Xl(t){return E(t,"Number")&&t.type==="number"&&G(t.$id)&&J(t.exclusiveMaximum)&&J(t.exclusiveMinimum)&&J(t.maximum)&&J(t.minimum)&&J(t.multipleOf)}function Zl(t){return E(t,"Object")&&t.type==="object"&&G(t.$id)&&yo(t.properties)&&Ml(t.additionalProperties)&&J(t.minProperties)&&J(t.maxProperties)}function eu(t){return E(t,"Promise")&&t.type==="Promise"&&G(t.$id)&&Ie(t.item)}function tu(t){return E(t,"Record")&&t.type==="object"&&G(t.$id)&&Ml(t.additionalProperties)&&j(t.patternProperties)&&(e=>{let r=Object.getOwnPropertyNames(e.patternProperties);return r.length===1&&Tl(r[0])&&j(e.patternProperties)&&Ie(e.patternProperties[r[0]])})(t)}function ch(t){return j(t)&&rt in t&&t[rt]==="Recursive"}function ru(t){return E(t,"Ref")&&G(t.$id)&&Q(t.$ref)}function nu(t){return E(t,"RegExp")&&G(t.$id)&&Q(t.source)&&Q(t.flags)&&J(t.maxLength)&&J(t.minLength)}function ou(t){return E(t,"String")&&t.type==="string"&&G(t.$id)&&J(t.minLength)&&J(t.maxLength)&&sh(t.pattern)&&ah(t.format)}function iu(t){return E(t,"Symbol")&&t.type==="symbol"&&G(t.$id)}function su(t){return E(t,"TemplateLiteral")&&t.type==="string"&&Q(t.pattern)&&t.pattern[0]==="^"&&t.pattern[t.pattern.length-1]==="$"}function au(t){return E(t,"This")&&G(t.$id)&&Q(t.$ref)}function du(t){return j(t)&&ge in t}function lu(t){return E(t,"Tuple")&&t.type==="array"&&G(t.$id)&&Ge(t.minItems)&&Ge(t.maxItems)&&t.minItems===t.maxItems&&(ce(t.items)&&ce(t.additionalItems)&&t.minItems===0||pe(t.items)&&t.items.every(e=>Ie(e)))}function uu(t){return E(t,"Undefined")&&t.type==="undefined"&&G(t.$id)}function mh(t){return Hs(t)&&t.anyOf.every(e=>ql(e)||jl(e))}function Hs(t){return E(t,"Union")&&G(t.$id)&&j(t)&&pe(t.anyOf)&&t.anyOf.every(e=>Ie(e))}function pu(t){return E(t,"Uint8Array")&&t.type==="Uint8Array"&&G(t.$id)&&J(t.minByteLength)&&J(t.maxByteLength)}function cu(t){return E(t,"Unknown")&&G(t.$id)}function mu(t){return E(t,"Unsafe")}function fu(t){return E(t,"Void")&&t.type==="void"&&G(t.$id)}function gu(t){return j(t)&&P in t&&Q(t[P])&&!ih.includes(t[P])}function Ie(t){return j(t)&&(_l(t)||$l(t)||El(t)||Nl(t)||Dl(t)||Ol(t)||Fl(t)||Ll(t)||Wl(t)||Bl(t)||Ul(t)||Kl(t)||Vl(t)||kn(t)||Hl(t)||zl(t)||Ql(t)||Jl(t)||Yl(t)||Xl(t)||Zl(t)||eu(t)||tu(t)||ru(t)||nu(t)||ou(t)||iu(t)||su(t)||au(t)||lu(t)||uu(t)||Hs(t)||pu(t)||cu(t)||mu(t)||fu(t)||gu(t))}var qs,ih,hu=u(()=>{De();M();At();qs=class extends we{},ih=["Argument","Any","Array","AsyncIterator","BigInt","Boolean","Computed","Constructor","Date","Enum","Function","Integer","Intersect","Iterator","Literal","MappedKey","MappedResult","Not","Null","Number","Object","Promise","Record","Ref","RegExp","String","Symbol","TemplateLiteral","This","Tuple","Undefined","Union","Uint8Array","Unknown","Void"]});var zs=u(()=>{B();hu();De()});var Su=u(()=>{});var yu=u(()=>{Su()});var Qs,vn,Js,fh,hb,Qt,Jt,ku,vu=u(()=>{Qs="(true|false)",vn="(0|[1-9][0-9]*)",Js="(.*)",fh="(?!.*)",hb=`^${Qs}$`,Qt=`^${vn}$`,Jt=`^${Js}$`,ku=`^${fh}$`});var Pn=u(()=>{vu()});var Pu=u(()=>{});var wu=u(()=>{});var Iu=u(()=>{Pu();wu()});function xu(t,e){return t.includes(e)}function bu(t){return[...new Set(t)]}function Sh(t,e){return t.filter(r=>e.includes(r))}function yh(t,e){return t.reduce((r,n)=>Sh(r,n),e)}function Au(t){return t.length===1?t[0]:t.length>1?yh(t.slice(1),t[0]):[]}function Ru(t){let e=[];for(let r of t)e.push(...r);return e}var Tu=u(()=>{});var wn=u(()=>{Tu()});function Yt(t){return h({[P]:"Any"},t)}var Mu=u(()=>{Ft();M()});var In=u(()=>{Mu()});function Fr(t,e){return h({[P]:"Array",type:"array",items:t},e)}var Cu=u(()=>{T();M()});var xn=u(()=>{Cu()});function _u(t){return h({[P]:"Argument",index:t})}var $u=u(()=>{T();M()});var Ys=u(()=>{$u()});function Lr(t,e){return h({[P]:"AsyncIterator",type:"AsyncIterator",items:t},e)}var Eu=u(()=>{M();T()});var bn=u(()=>{Eu()});function Z(t,e,r){return h({[P]:"Computed",target:t,parameters:e},r)}var Ou=u(()=>{Ft();fn()});var Xt=u(()=>{Ou()});function kh(t,e){let{[e]:r,...n}=t;return n}function se(t,e){return e.reduce((r,n)=>kh(r,n),t)}var ko=u(()=>{});var Ut=u(()=>{ko()});function W(t){return h({[P]:"Never",not:{}},t)}var Du=u(()=>{T();M()});var Ae=u(()=>{Du()});var Nu=u(()=>{});function U(t){return h({[P]:"MappedResult",properties:t})}var Xs=u(()=>{T();M()});function Wr(t,e,r){return h({[P]:"Constructor",type:"Constructor",parameters:t,returns:e},r)}var Fu=u(()=>{T();M()});var An=u(()=>{Fu()});function Rt(t,e,r){return h({[P]:"Function",type:"Function",parameters:t,returns:e},r)}var Lu=u(()=>{T();M()});var yr=u(()=>{Lu()});function Rn(t,e){return h({[P]:"Union",anyOf:t},e)}var Zs=u(()=>{T();M()});function vh(t){return t.some(e=>Be(e))}function Wu(t){return t.map(e=>Be(e)?Ph(e):e)}function Ph(t){return se(t,[be])}function wh(t,e){return vh(t)?Ce(Rn(Wu(t),e)):Rn(Wu(t),e)}function Tt(t,e){return t.length===1?h(t[0],e):t.length===0?W(e):wh(t,e)}var Bu=u(()=>{T();M();Ut();Ae();Kt();Zs();B()});var Uu=u(()=>{});function q(t,e){return t.length===0?W(e):t.length===1?h(t[0],e):Rn(t,e)}var Ku=u(()=>{Ae();T();Zs()});var he=u(()=>{Bu();Uu();Ku()});function Ih(t){return t.replace(/\\\$/g,"$").replace(/\\\*/g,"*").replace(/\\\^/g,"^").replace(/\\\|/g,"|").replace(/\\\(/g,"(").replace(/\\\)/g,")")}function ea(t,e,r){return t[e]===r&&t.charCodeAt(e-1)!==92}function Vt(t,e){return ea(t,e,"(")}function Tn(t,e){return ea(t,e,")")}function Vu(t,e){return ea(t,e,"|")}function xh(t){if(!(Vt(t,0)&&Tn(t,t.length-1)))return!1;let e=0;for(let r=0;r<t.length;r++)if(Vt(t,r)&&(e+=1),Tn(t,r)&&(e-=1),e===0&&r!==t.length-1)return!1;return!0}function bh(t){return t.slice(1,t.length-1)}function Ah(t){let e=0;for(let r=0;r<t.length;r++)if(Vt(t,r)&&(e+=1),Tn(t,r)&&(e-=1),Vu(t,r)&&e===0)return!0;return!1}function Rh(t){for(let e=0;e<t.length;e++)if(Vt(t,e))return!0;return!1}function Th(t){let[e,r]=[0,0],n=[];for(let i=0;i<t.length;i++)if(Vt(t,i)&&(e+=1),Tn(t,i)&&(e-=1),Vu(t,i)&&e===0){let s=t.slice(r,i);s.length>0&&n.push(Br(s)),r=i+1}let o=t.slice(r);return o.length>0&&n.push(Br(o)),n.length===0?{type:"const",const:""}:n.length===1?n[0]:{type:"or",expr:n}}function Mh(t){function e(o,i){if(!Vt(o,i))throw new vo("TemplateLiteralParser: Index must point to open parens");let s=0;for(let a=i;a<o.length;a++)if(Vt(o,a)&&(s+=1),Tn(o,a)&&(s-=1),s===0)return[i,a];throw new vo("TemplateLiteralParser: Unclosed group parens in expression")}function r(o,i){for(let s=i;s<o.length;s++)if(Vt(o,s))return[i,s];return[i,o.length]}let n=[];for(let o=0;o<t.length;o++)if(Vt(t,o)){let[i,s]=e(t,o),a=t.slice(i,s+1);n.push(Br(a)),o=s}else{let[i,s]=r(t,o),a=t.slice(i,s);a.length>0&&n.push(Br(a)),o=s-1}return n.length===0?{type:"const",const:""}:n.length===1?n[0]:{type:"and",expr:n}}function Br(t){return xh(t)?Br(bh(t)):Ah(t)?Th(t):Rh(t)?Mh(t):{type:"const",const:Ih(t)}}function Ur(t){return Br(t.slice(1,t.length-1))}var vo,Po=u(()=>{At();vo=class extends we{}});function Ch(t){return t.type==="or"&&t.expr.length===2&&t.expr[0].type==="const"&&t.expr[0].const==="0"&&t.expr[1].type==="const"&&t.expr[1].const==="[1-9][0-9]*"}function _h(t){return t.type==="or"&&t.expr.length===2&&t.expr[0].type==="const"&&t.expr[0].const==="true"&&t.expr[1].type==="const"&&t.expr[1].const==="false"}function $h(t){return t.type==="const"&&t.const===".*"}function kr(t){return Ch(t)||$h(t)?!1:_h(t)?!0:t.type==="and"?t.expr.every(e=>kr(e)):t.type==="or"?t.expr.every(e=>kr(e)):t.type==="const"?!0:(()=>{throw new ta("Unknown expression type")})()}function qu(t){let e=Ur(t.pattern);return kr(e)}var ta,ra=u(()=>{Po();At();ta=class extends we{}});function*ju(t){if(t.length===1)return yield*t[0];for(let e of t[0])for(let r of ju(t.slice(1)))yield`${e}${r}`}function*Eh(t){return yield*ju(t.expr.map(e=>[...Mn(e)]))}function*Oh(t){for(let e of t.expr)yield*Mn(e)}function*Dh(t){return yield t.const}function*Mn(t){return t.type==="and"?yield*Eh(t):t.type==="or"?yield*Oh(t):t.type==="const"?yield*Dh(t):(()=>{throw new na("Unknown expression")})()}function wo(t){let e=Ur(t.pattern);return kr(e)?[...Mn(e)]:[]}var na,oa=u(()=>{ra();Po();At();na=class extends we{}});function V(t,e){return h({[P]:"Literal",const:t,type:typeof t},e)}var Gu=u(()=>{T();M()});var Ue=u(()=>{Gu()});function Io(t){return h({[P]:"Boolean",type:"boolean"},t)}var Hu=u(()=>{M();Ft()});var xo=u(()=>{Hu()});function Kr(t){return h({[P]:"BigInt",type:"bigint"},t)}var zu=u(()=>{M();Ft()});var Cn=u(()=>{zu()});function nt(t){return h({[P]:"Number",type:"number"},t)}var Qu=u(()=>{T();M()});var vr=u(()=>{Qu()});function vt(t){return h({[P]:"String",type:"string"},t)}var Ju=u(()=>{T();M()});var Vr=u(()=>{Ju()});function*Nh(t){let e=t.trim().replace(/"|'/g,"");return e==="boolean"?yield Io():e==="number"?yield nt():e==="bigint"?yield Kr():e==="string"?yield vt():yield(()=>{let r=e.split("|").map(n=>V(n.trim()));return r.length===0?W():r.length===1?r[0]:Tt(r)})()}function*Fh(t){if(t[1]!=="{"){let e=V("$"),r=ia(t.slice(1));return yield*[e,...r]}for(let e=2;e<t.length;e++)if(t[e]==="}"){let r=Nh(t.slice(2,e)),n=ia(t.slice(e+1));return yield*[...r,...n]}yield V(t)}function*ia(t){for(let e=0;e<t.length;e++)if(t[e]==="$"){let r=V(t.slice(0,e)),n=Fh(t.slice(e));return yield*[r,...n]}yield V(t)}function Yu(t){return[...ia(t)]}var sa=u(()=>{Ue();xo();Cn();vr();Vr();he();Ae()});function Lh(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Xu(t,e){return Qe(t)?t.pattern.slice(1,t.pattern.length-1):L(t)?`(${t.anyOf.map(r=>Xu(r,e)).join("|")})`:kt(t)?`${e}${vn}`:yt(t)?`${e}${vn}`:fr(t)?`${e}${vn}`:Wt(t)?`${e}${Js}`:He(t)?`${e}${Lh(t.const.toString())}`:Lt(t)?`${e}${Qs}`:(()=>{throw new aa(`Unexpected Kind '${t[P]}'`)})()}function da(t){return`^${t.map(e=>Xu(e,"")).join("")}$`}var aa,la=u(()=>{Pn();M();At();B();aa=class extends we{}});function Pr(t){let r=wo(t).map(n=>V(n));return Tt(r)}var Zu=u(()=>{he();Ue();oa()});function bo(t,e){let r=Q(t)?da(Yu(t)):da(t);return h({[P]:"TemplateLiteral",type:"string",pattern:r},e)}var ep=u(()=>{T();sa();la();De();M()});var qt=u(()=>{ra();oa();sa();Po();la();Zu();ep()});function Wh(t){return wo(t).map(r=>r.toString())}function Bh(t){let e=[];for(let r of t)e.push(...Ke(r));return e}function Uh(t){return[t.toString()]}function Ke(t){return[...new Set(Qe(t)?Wh(t):L(t)?Bh(t.anyOf):He(t)?Uh(t.const):kt(t)?["[number]"]:yt(t)?["[number]"]:[])]}var Ao=u(()=>{qt();B()});function Kh(t,e,r){let n={};for(let o of Object.getOwnPropertyNames(e))n[o]=Zt(t,Ke(e[o]),r);return n}function Vh(t,e,r){return Kh(t,e.properties,r)}function tp(t,e,r){let n=Vh(t,e,r);return U(n)}var ua=u(()=>{ve();Ao();Mt()});function np(t,e){return t.map(r=>op(r,e))}function qh(t){return t.filter(e=>!Ht(e))}function jh(t,e){return Ro(qh(np(t,e)))}function Gh(t){return t.some(e=>Ht(e))?[]:t}function Hh(t,e){return Tt(Gh(np(t,e)))}function zh(t,e){return e in t?t[e]:e==="[number]"?Tt(t):W()}function Qh(t,e){return e==="[number]"?t:W()}function Jh(t,e){return e in t?t[e]:W()}function op(t,e){return ie(t)?jh(t.allOf,e):L(t)?Hh(t.anyOf,e):Je(t)?zh(t.items??[],e):ft(t)?Qh(t.items,e):me(t)?Jh(t.properties,e):W()}function pa(t,e){return e.map(r=>op(t,r))}function rp(t,e){return Tt(pa(t,e))}function Zt(t,e,r){if(de(t)||de(e)){let n="Index types using Ref parameters require both Type and Key to be of TSchema";if(!Ye(t)||!Ye(e))throw new we(n);return Z("Index",[t,e])}return te(e)?tp(t,e,r):ze(e)?ip(t,e,r):h(Ye(e)?rp(t,Ke(e)):rp(t,e),r)}var ca=u(()=>{T();At();Xt();Ae();ot();he();Ao();ma();ua();B()});function Yh(t,e,r){return{[e]:Zt(t,[e],ee(r))}}function Xh(t,e,r){return e.reduce((n,o)=>({...n,...Yh(t,o,r)}),{})}function Zh(t,e,r){return Xh(t,e.keys,r)}function ip(t,e,r){let n=Zh(t,e,r);return U(n)}var ma=u(()=>{ca();ve();We()});var Mt=u(()=>{ma();ua();Ao();ca()});function qr(t,e){return h({[P]:"Iterator",type:"Iterator",items:t},e)}var sp=u(()=>{T();M()});var _n=u(()=>{sp()});function eS(t){return globalThis.Object.keys(t).filter(e=>!Be(t[e]))}function tS(t,e){let r=eS(t),n=r.length>0?{[P]:"Object",type:"object",required:r,properties:t}:{[P]:"Object",type:"object",properties:t};return h(n,e)}var H,ap=u(()=>{T();M();B();H=tS});var Xe=u(()=>{ap()});function To(t,e){return h({[P]:"Promise",type:"Promise",item:t},e)}var dp=u(()=>{T();M()});var Mo=u(()=>{dp()});function rS(t){return h(se(t,[mt]))}function nS(t){return h({...t,[mt]:"Readonly"})}function oS(t,e){return e===!1?rS(t):nS(t)}function Ve(t,e){let r=e??!0;return te(t)?lp(t,r):oS(t,r)}var fa=u(()=>{T();M();Ut();ga();B()});function iS(t,e){let r={};for(let n of globalThis.Object.getOwnPropertyNames(t))r[n]=Ve(t[n],e);return r}function sS(t,e){return iS(t.properties,e)}function lp(t,e){let r=sS(t,e);return U(r)}var ga=u(()=>{ve();fa()});var wr=u(()=>{ga();fa()});function it(t,e){return h(t.length>0?{[P]:"Tuple",type:"array",items:t,additionalItems:!1,minItems:t.length,maxItems:t.length}:{[P]:"Tuple",type:"array",minItems:t.length,maxItems:t.length},e)}var up=u(()=>{T();M()});var er=u(()=>{up()});function pp(t,e){return t in e?st(t,e[t]):U(e)}function aS(t){return{[t]:V(t)}}function dS(t){let e={};for(let r of t)e[r]=V(r);return e}function lS(t,e){return xu(e,t)?aS(t):dS(e)}function uS(t,e){let r=lS(t,e);return pp(t,r)}function $n(t,e){return e.map(r=>st(t,r))}function pS(t,e){let r={};for(let n of globalThis.Object.getOwnPropertyNames(e))r[n]=st(t,e[n]);return r}function st(t,e){let r={...e};return Be(e)?Ce(st(t,se(e,[be]))):Nr(e)?Ve(st(t,se(e,[mt]))):te(e)?pp(t,e.properties):ze(e)?uS(t,e.keys):ht(e)?Wr($n(t,e.parameters),st(t,e.returns),r):St(e)?Rt($n(t,e.parameters),st(t,e.returns),r):mr(e)?Lr(st(t,e.items),r):gr(e)?qr(st(t,e.items),r):ie(e)?_e($n(t,e.allOf),r):L(e)?q($n(t,e.anyOf),r):Je(e)?it($n(t,e.items??[]),r):me(e)?H(pS(t,e.properties),r):ft(e)?Fr(st(t,e.items),r):hr(e)?To(st(t,e.item),r):e}function cS(t,e){let r={};for(let n of t)r[n]=st(n,e);return r}function cp(t,e,r){let n=Ye(t)?Ke(t):t,o=e({[P]:"MappedKey",keys:n}),i=cS(n,o);return H(i,r)}var mp=u(()=>{M();Ut();xn();bn();An();yr();Mt();ot();_n();Ue();Xe();Kt();Mo();wr();er();he();wn();Xs();B()});var ve=u(()=>{Nu();Xs();mp()});function mS(t){return h(se(t,[be]))}function fS(t){return h({...t,[be]:"Optional"})}function gS(t,e){return e===!1?mS(t):fS(t)}function Ce(t,e){let r=e??!0;return te(t)?fp(t,r):gS(t,r)}var ha=u(()=>{T();M();Ut();Sa();B()});function hS(t,e){let r={};for(let n of globalThis.Object.getOwnPropertyNames(t))r[n]=Ce(t[n],e);return r}function SS(t,e){return hS(t.properties,e)}function fp(t,e){let r=SS(t,e);return U(r)}var Sa=u(()=>{ve();ha()});var Kt=u(()=>{Sa();ha()});function En(t,e={}){let r=t.every(o=>me(o)),n=Ye(e.unevaluatedProperties)?{unevaluatedProperties:e.unevaluatedProperties}:{};return h(e.unevaluatedProperties===!1||Ye(e.unevaluatedProperties)||r?{...n,[P]:"Intersect",type:"object",allOf:t}:{...n,[P]:"Intersect",allOf:t},e)}var ya=u(()=>{T();M();B()});function yS(t){return t.every(e=>Be(e))}function kS(t){return se(t,[be])}function gp(t){return t.map(e=>Be(e)?kS(e):e)}function vS(t,e){return yS(t)?Ce(En(gp(t),e)):En(gp(t),e)}function Ro(t,e={}){if(t.length===1)return h(t[0],e);if(t.length===0)return W(e);if(t.some(r=>zt(r)))throw new Error("Cannot intersect transform types");return vS(t,e)}var hp=u(()=>{M();T();Ut();Ae();Kt();ya();B()});var Sp=u(()=>{});function _e(t,e){if(t.length===1)return h(t[0],e);if(t.length===0)return W(e);if(t.some(r=>zt(r)))throw new Error("Cannot intersect transform types");return En(t,e)}var yp=u(()=>{T();Ae();ya();B()});var ot=u(()=>{hp();Sp();yp()});function Ct(...t){let[e,r]=typeof t[0]=="string"?[t[0],t[1]]:[t[0].$id,t[1]];if(typeof e!="string")throw new we("Ref: $ref must be a string");return h({[P]:"Ref",$ref:e},r)}var kp=u(()=>{At();T();M()});var Ir=u(()=>{kp()});function PS(t,e){return Z("Awaited",[Z(t,e)])}function wS(t){return Z("Awaited",[Ct(t)])}function IS(t){return _e(vp(t))}function xS(t){return q(vp(t))}function bS(t){return jr(t)}function vp(t){return t.map(e=>jr(e))}function jr(t,e){return h(gt(t)?PS(t.target,t.parameters):ie(t)?IS(t.allOf):L(t)?xS(t.anyOf):hr(t)?bS(t.item):de(t)?wS(t.$ref):t,e)}var Pp=u(()=>{T();Xt();ot();he();Ir();B()});var Co=u(()=>{Pp()});function wp(t){let e=[];for(let r of t)e.push(On(r));return e}function AS(t){let e=wp(t);return Ru(e)}function RS(t){let e=wp(t);return Au(e)}function TS(t){return t.map((e,r)=>r.toString())}function MS(t){return["[number]"]}function CS(t){return globalThis.Object.getOwnPropertyNames(t)}function _S(t){return $S?globalThis.Object.getOwnPropertyNames(t).map(r=>r[0]==="^"&&r[r.length-1]==="$"?r.slice(1,r.length-1):r):[]}function On(t){return ie(t)?AS(t.allOf):L(t)?RS(t.anyOf):Je(t)?TS(t.items??[]):ft(t)?MS(t.items):me(t)?CS(t.properties):Sr(t)?_S(t.patternProperties):[]}var $S,ka=u(()=>{wn();B();$S=!1});function ES(t,e){return Z("KeyOf",[Z(t,e)])}function OS(t){return Z("KeyOf",[Ct(t)])}function DS(t,e){let r=On(t),n=NS(r),o=Tt(n);return h(o,e)}function NS(t){return t.map(e=>e==="[number]"?nt():V(e))}function Gr(t,e){return gt(t)?ES(t.target,t.parameters):de(t)?OS(t.$ref):te(t)?Ip(t,e):DS(t,e)}var va=u(()=>{T();Ue();vr();Xt();Ir();ka();he();Pa();B()});function FS(t,e){let r={};for(let n of globalThis.Object.getOwnPropertyNames(t))r[n]=Gr(t[n],ee(e));return r}function LS(t,e){return FS(t.properties,e)}function Ip(t,e){let r=LS(t,e);return U(r)}var Pa=u(()=>{ve();va();We()});var xp=u(()=>{});var Dn=u(()=>{Pa();xp();ka();va()});function WS(t){let e=[];for(let r of t)e.push(...On(r));return bu(e)}function BS(t){return t.filter(e=>!Ht(e))}function US(t,e){let r=[];for(let n of t)r.push(...pa(n,[e]));return BS(r)}function KS(t,e){let r={};for(let n of e)r[n]=Ro(US(t,n));return r}function bp(t,e){let r=WS(t),n=KS(t,r);return H(n,e)}var Ap=u(()=>{ot();Mt();Dn();Xe();wn();B()});var wa=u(()=>{Ap()});function _o(t){return h({[P]:"Date",type:"Date"},t)}var Rp=u(()=>{M();T()});var $o=u(()=>{Rp()});function Eo(t){return h({[P]:"Null",type:"null"},t)}var Tp=u(()=>{T();M()});var Oo=u(()=>{Tp()});function Do(t){return h({[P]:"Symbol",type:"symbol"},t)}var Mp=u(()=>{T();M()});var No=u(()=>{Mp()});function Fo(t){return h({[P]:"Undefined",type:"undefined"},t)}var Cp=u(()=>{T();M()});var Lo=u(()=>{Cp()});function Wo(t){return h({[P]:"Uint8Array",type:"Uint8Array"},t)}var _p=u(()=>{T();M()});var Bo=u(()=>{_p()});function tr(t){return h({[P]:"Unknown"},t)}var $p=u(()=>{T();M()});var Hr=u(()=>{$p()});function VS(t){return t.map(e=>Ia(e,!1))}function qS(t){let e={};for(let r of globalThis.Object.getOwnPropertyNames(t))e[r]=Ve(Ia(t[r],!1));return e}function Uo(t,e){return e===!0?t:Ve(t)}function Ia(t,e){return Ds(t)?Uo(Yt(),e):Fs(t)?Uo(Yt(),e):pe(t)?Ve(it(VS(t))):Nt(t)?Wo():cr(t)?_o():j(t)?Uo(H(qS(t)),e):Ns(t)?Uo(Rt([],tr()),e):ce(t)?Fo():Ls(t)?Eo():Ws(t)?Do():pn(t)?Kr():Ge(t)?V(t):Dt(t)?V(t):Q(t)?V(t):H({})}function Ep(t,e){return h(Ia(t,!0),e)}var Op=u(()=>{In();Cn();$o();yr();Ue();Oo();Xe();No();er();wr();Lo();Bo();Hr();Ft();De()});var xa=u(()=>{Op()});function Dp(t,e){return ht(t)?it(t.parameters,e):W(e)}var Np=u(()=>{er();Ae();B()});var ba=u(()=>{Np()});function Fp(t,e){if(ce(t))throw new Error("Enum undefined or empty");let r=globalThis.Object.getOwnPropertyNames(t).filter(i=>isNaN(i)).map(i=>t[i]),o=[...new Set(r)].map(i=>V(i));return q(o,{...e,[rt]:"Enum"})}var Lp=u(()=>{Ue();M();he();De()});var Aa=u(()=>{Lp()});function at(t){return t===S.False?t:S.True}function zr(t){throw new Ta(t)}function Se(t){return c.IsNever(t)||c.IsIntersect(t)||c.IsUnion(t)||c.IsUnknown(t)||c.IsAny(t)}function ye(t,e){return c.IsNever(e)?jp(t,e):c.IsIntersect(e)?Ko(t,e):c.IsUnion(e)?$a(t,e):c.IsUnknown(e)?Qp(t,e):c.IsAny(e)?_a(t,e):zr("StructuralRight")}function _a(t,e){return S.True}function jS(t,e){return c.IsIntersect(e)?Ko(t,e):c.IsUnion(e)&&e.anyOf.some(r=>c.IsAny(r)||c.IsUnknown(r))?S.True:c.IsUnion(e)?S.Union:c.IsUnknown(e)||c.IsAny(e)?S.True:S.Union}function GS(t,e){return c.IsUnknown(t)?S.False:c.IsAny(t)?S.Union:c.IsNever(t)?S.True:S.False}function HS(t,e){return c.IsObject(e)&&Vo(e)?S.True:Se(e)?ye(t,e):c.IsArray(e)?at(z(t.items,e.items)):S.False}function zS(t,e){return Se(e)?ye(t,e):c.IsAsyncIterator(e)?at(z(t.items,e.items)):S.False}function QS(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsBigInt(e)?S.True:S.False}function Vp(t,e){return c.IsLiteralBoolean(t)||c.IsBoolean(t)?S.True:S.False}function JS(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsBoolean(e)?S.True:S.False}function YS(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsConstructor(e)?t.parameters.length>e.parameters.length?S.False:t.parameters.every((r,n)=>at(z(e.parameters[n],r))===S.True)?at(z(t.returns,e.returns)):S.False:S.False}function XS(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsDate(e)?S.True:S.False}function ZS(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsFunction(e)?t.parameters.length>e.parameters.length?S.False:t.parameters.every((r,n)=>at(z(e.parameters[n],r))===S.True)?at(z(t.returns,e.returns)):S.False:S.False}function qp(t,e){return c.IsLiteral(t)&&Me.IsNumber(t.const)||c.IsNumber(t)||c.IsInteger(t)?S.True:S.False}function ey(t,e){return c.IsInteger(e)||c.IsNumber(e)?S.True:Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):S.False}function Ko(t,e){return e.allOf.every(r=>z(t,r)===S.True)?S.True:S.False}function ty(t,e){return t.allOf.some(r=>z(r,e)===S.True)?S.True:S.False}function ry(t,e){return Se(e)?ye(t,e):c.IsIterator(e)?at(z(t.items,e.items)):S.False}function ny(t,e){return c.IsLiteral(e)&&e.const===t.const?S.True:Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsString(e)?zp(t,e):c.IsNumber(e)?Gp(t,e):c.IsInteger(e)?qp(t,e):c.IsBoolean(e)?Vp(t,e):S.False}function jp(t,e){return S.False}function oy(t,e){return S.True}function Wp(t){let[e,r]=[t,0];for(;c.IsNot(e);)e=e.not,r+=1;return r%2===0?e:tr()}function iy(t,e){return c.IsNot(t)?z(Wp(t),e):c.IsNot(e)?z(t,Wp(e)):zr("Invalid fallthrough for Not")}function sy(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsNull(e)?S.True:S.False}function Gp(t,e){return c.IsLiteralNumber(t)||c.IsNumber(t)||c.IsInteger(t)?S.True:S.False}function ay(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsInteger(e)||c.IsNumber(e)?S.True:S.False}function qe(t,e){return Object.getOwnPropertyNames(t.properties).length===e}function Bp(t){return Vo(t)}function Up(t){return qe(t,0)||qe(t,1)&&"description"in t.properties&&c.IsUnion(t.properties.description)&&t.properties.description.anyOf.length===2&&(c.IsString(t.properties.description.anyOf[0])&&c.IsUndefined(t.properties.description.anyOf[1])||c.IsString(t.properties.description.anyOf[1])&&c.IsUndefined(t.properties.description.anyOf[0]))}function Ra(t){return qe(t,0)}function Kp(t){return qe(t,0)}function dy(t){return qe(t,0)}function ly(t){return qe(t,0)}function uy(t){return Vo(t)}function py(t){let e=nt();return qe(t,0)||qe(t,1)&&"length"in t.properties&&at(z(t.properties.length,e))===S.True}function cy(t){return qe(t,0)}function Vo(t){let e=nt();return qe(t,0)||qe(t,1)&&"length"in t.properties&&at(z(t.properties.length,e))===S.True}function my(t){let e=Rt([Yt()],Yt());return qe(t,0)||qe(t,1)&&"then"in t.properties&&at(z(t.properties.then,e))===S.True}function Hp(t,e){return z(t,e)===S.False||c.IsOptional(t)&&!c.IsOptional(e)?S.False:S.True}function $e(t,e){return c.IsUnknown(t)?S.False:c.IsAny(t)?S.Union:c.IsNever(t)||c.IsLiteralString(t)&&Bp(e)||c.IsLiteralNumber(t)&&Ra(e)||c.IsLiteralBoolean(t)&&Kp(e)||c.IsSymbol(t)&&Up(e)||c.IsBigInt(t)&&dy(e)||c.IsString(t)&&Bp(e)||c.IsSymbol(t)&&Up(e)||c.IsNumber(t)&&Ra(e)||c.IsInteger(t)&&Ra(e)||c.IsBoolean(t)&&Kp(e)||c.IsUint8Array(t)&&uy(e)||c.IsDate(t)&&ly(e)||c.IsConstructor(t)&&cy(e)||c.IsFunction(t)&&py(e)?S.True:c.IsRecord(t)&&c.IsString(Ma(t))?e[rt]==="Record"?S.True:S.False:c.IsRecord(t)&&c.IsNumber(Ma(t))&&qe(e,0)?S.True:S.False}function fy(t,e){return Se(e)?ye(t,e):c.IsRecord(e)?dt(t,e):c.IsObject(e)?(()=>{for(let r of Object.getOwnPropertyNames(e.properties)){if(!(r in t.properties)&&!c.IsOptional(e.properties[r]))return S.False;if(c.IsOptional(e.properties[r]))return S.True;if(Hp(t.properties[r],e.properties[r])===S.False)return S.False}return S.True})():S.False}function gy(t,e){return Se(e)?ye(t,e):c.IsObject(e)&&my(e)?S.True:c.IsPromise(e)?at(z(t.item,e.item)):S.False}function Ma(t){return Qt in t.patternProperties?nt():Jt in t.patternProperties?vt():zr("Unknown record key pattern")}function Ca(t){return Qt in t.patternProperties?t.patternProperties[Qt]:Jt in t.patternProperties?t.patternProperties[Jt]:zr("Unable to get record value schema")}function dt(t,e){let[r,n]=[Ma(e),Ca(e)];return c.IsLiteralString(t)&&c.IsNumber(r)&&at(z(t,n))===S.True?S.True:c.IsUint8Array(t)&&c.IsNumber(r)||c.IsString(t)&&c.IsNumber(r)||c.IsArray(t)&&c.IsNumber(r)?z(t,n):c.IsObject(t)?(()=>{for(let o of Object.getOwnPropertyNames(t.properties))if(Hp(n,t.properties[o])===S.False)return S.False;return S.True})():S.False}function hy(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?z(Ca(t),Ca(e)):S.False}function Sy(t,e){let r=c.IsRegExp(t)?vt():t,n=c.IsRegExp(e)?vt():e;return z(r,n)}function zp(t,e){return c.IsLiteral(t)&&Me.IsString(t.const)||c.IsString(t)?S.True:S.False}function yy(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsString(e)?S.True:S.False}function ky(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsSymbol(e)?S.True:S.False}function vy(t,e){return c.IsTemplateLiteral(t)?z(Pr(t),e):c.IsTemplateLiteral(e)?z(t,Pr(e)):zr("Invalid fallthrough for TemplateLiteral")}function Py(t,e){return c.IsArray(e)&&t.items!==void 0&&t.items.every(r=>z(r,e.items)===S.True)}function wy(t,e){return c.IsNever(t)?S.True:c.IsUnknown(t)?S.False:c.IsAny(t)?S.Union:S.False}function Iy(t,e){return Se(e)?ye(t,e):c.IsObject(e)&&Vo(e)||c.IsArray(e)&&Py(t,e)?S.True:c.IsTuple(e)?Me.IsUndefined(t.items)&&!Me.IsUndefined(e.items)||!Me.IsUndefined(t.items)&&Me.IsUndefined(e.items)?S.False:Me.IsUndefined(t.items)&&!Me.IsUndefined(e.items)||t.items.every((r,n)=>z(r,e.items[n])===S.True)?S.True:S.False:S.False}function xy(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsUint8Array(e)?S.True:S.False}function by(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsVoid(e)?Ty(t,e):c.IsUndefined(e)?S.True:S.False}function $a(t,e){return e.anyOf.some(r=>z(t,r)===S.True)?S.True:S.False}function Ay(t,e){return t.anyOf.every(r=>z(r,e)===S.True)?S.True:S.False}function Qp(t,e){return S.True}function Ry(t,e){return c.IsNever(e)?jp(t,e):c.IsIntersect(e)?Ko(t,e):c.IsUnion(e)?$a(t,e):c.IsAny(e)?_a(t,e):c.IsString(e)?zp(t,e):c.IsNumber(e)?Gp(t,e):c.IsInteger(e)?qp(t,e):c.IsBoolean(e)?Vp(t,e):c.IsArray(e)?GS(t,e):c.IsTuple(e)?wy(t,e):c.IsObject(e)?$e(t,e):c.IsUnknown(e)?S.True:S.False}function Ty(t,e){return c.IsUndefined(t)||c.IsUndefined(t)?S.True:S.False}function My(t,e){return c.IsIntersect(e)?Ko(t,e):c.IsUnion(e)?$a(t,e):c.IsUnknown(e)?Qp(t,e):c.IsAny(e)?_a(t,e):c.IsObject(e)?$e(t,e):c.IsVoid(e)?S.True:S.False}function z(t,e){return c.IsTemplateLiteral(t)||c.IsTemplateLiteral(e)?vy(t,e):c.IsRegExp(t)||c.IsRegExp(e)?Sy(t,e):c.IsNot(t)||c.IsNot(e)?iy(t,e):c.IsAny(t)?jS(t,e):c.IsArray(t)?HS(t,e):c.IsBigInt(t)?QS(t,e):c.IsBoolean(t)?JS(t,e):c.IsAsyncIterator(t)?zS(t,e):c.IsConstructor(t)?YS(t,e):c.IsDate(t)?XS(t,e):c.IsFunction(t)?ZS(t,e):c.IsInteger(t)?ey(t,e):c.IsIntersect(t)?ty(t,e):c.IsIterator(t)?ry(t,e):c.IsLiteral(t)?ny(t,e):c.IsNever(t)?oy(t,e):c.IsNull(t)?sy(t,e):c.IsNumber(t)?ay(t,e):c.IsObject(t)?fy(t,e):c.IsRecord(t)?hy(t,e):c.IsString(t)?yy(t,e):c.IsSymbol(t)?ky(t,e):c.IsTuple(t)?Iy(t,e):c.IsPromise(t)?gy(t,e):c.IsUint8Array(t)?xy(t,e):c.IsUndefined(t)?by(t,e):c.IsUnion(t)?Ay(t,e):c.IsUnknown(t)?Ry(t,e):c.IsVoid(t)?My(t,e):zr(`Unknown left type operand '${t[P]}'`)}function rr(t,e){return z(t,e)}var Ta,S,Ea=u(()=>{In();yr();vr();Vr();Hr();qt();Pn();M();At();zs();Ta=class extends we{};(function(t){t[t.Union=0]="Union",t[t.True=1]="True",t[t.False=2]="False"})(S||(S={}))});function Cy(t,e,r,n,o){let i={};for(let s of globalThis.Object.getOwnPropertyNames(t))i[s]=Qr(t[s],e,r,n,ee(o));return i}function _y(t,e,r,n,o){return Cy(t.properties,e,r,n,o)}function Jp(t,e,r,n,o){let i=_y(t,e,r,n,o);return U(i)}var Oa=u(()=>{ve();qo();We()});function $y(t,e,r,n){let o=rr(t,e);return o===S.Union?q([r,n]):o===S.True?r:n}function Qr(t,e,r,n,o){return te(t)?Jp(t,e,r,n,o):ze(t)?h(Yp(t,e,r,n,o)):h($y(t,e,r,n),o)}var qo=u(()=>{T();he();Ea();Da();Oa();B()});function Ey(t,e,r,n,o){return{[t]:Qr(V(t),e,r,n,ee(o))}}function Oy(t,e,r,n,o){return t.reduce((i,s)=>({...i,...Ey(s,e,r,n,o)}),{})}function Dy(t,e,r,n,o){return Oy(t.keys,e,r,n,o)}function Yp(t,e,r,n,o){let i=Dy(t,e,r,n,o);return U(i)}var Da=u(()=>{ve();Ue();qo();We()});var Xp=u(()=>{});var Nn=u(()=>{Ea();Da();Oa();Xp();qo()});function Zp(t,e){return Jr(Pr(t),e)}var Na=u(()=>{jo();qt()});function Ny(t,e){let r=t.filter(n=>rr(n,e)===S.False);return r.length===1?r[0]:q(r)}function Jr(t,e,r={}){return Qe(t)?h(Zp(t,e),r):te(t)?h(ec(t,e),r):h(L(t)?Ny(t.anyOf,e):rr(t,e)!==S.False?W():t,r)}var jo=u(()=>{T();he();Ae();Nn();Fa();Na();B()});function Fy(t,e){let r={};for(let n of globalThis.Object.getOwnPropertyNames(t))r[n]=Jr(t[n],e);return r}function Ly(t,e){return Fy(t.properties,e)}function ec(t,e){let r=Ly(t,e);return U(r)}var Fa=u(()=>{ve();jo()});var La=u(()=>{Fa();Na();jo()});function tc(t,e){return Yr(Pr(t),e)}var Wa=u(()=>{Go();qt()});function Wy(t,e){let r=t.filter(n=>rr(n,e)!==S.False);return r.length===1?r[0]:q(r)}function Yr(t,e,r){return Qe(t)?h(tc(t,e),r):te(t)?h(rc(t,e),r):h(L(t)?Wy(t.anyOf,e):rr(t,e)!==S.False?t:W(),r)}var Go=u(()=>{T();he();Ae();Nn();Ba();Wa();B()});function By(t,e){let r={};for(let n of globalThis.Object.getOwnPropertyNames(t))r[n]=Yr(t[n],e);return r}function Uy(t,e){return By(t.properties,e)}function rc(t,e){let r=Uy(t,e);return U(r)}var Ba=u(()=>{ve();Go()});var Ua=u(()=>{Ba();Wa();Go()});function nc(t,e){return ht(t)?h(t.returns,e):W(e)}var oc=u(()=>{T();Ae();B()});var Ka=u(()=>{oc()});function Ho(t){return Ve(Ce(t))}var ic=u(()=>{wr();Kt()});var zo=u(()=>{ic()});function xr(t,e,r){return h({[P]:"Record",type:"object",patternProperties:{[t]:e}},r)}function Va(t,e,r){let n={};for(let o of t)n[o]=e;return H(n,{...r,[rt]:"Record"})}function Ky(t,e,r){return qu(t)?Va(Ke(t),e,r):xr(t.pattern,e,r)}function Vy(t,e,r){return Va(Ke(q(t)),e,r)}function qy(t,e,r){return Va([t.toString()],e,r)}function jy(t,e,r){return xr(t.source,e,r)}function Gy(t,e,r){let n=ce(t.pattern)?Jt:t.pattern;return xr(n,e,r)}function Hy(t,e,r){return xr(Jt,e,r)}function zy(t,e,r){return xr(ku,e,r)}function Qy(t,e,r){return H({true:e,false:e},r)}function Jy(t,e,r){return xr(Qt,e,r)}function Yy(t,e,r){return xr(Qt,e,r)}function Qo(t,e,r={}){return L(t)?Vy(t.anyOf,e,r):Qe(t)?Ky(t,e,r):He(t)?qy(t.const,e,r):Lt(t)?Qy(t,e,r):yt(t)?Jy(t,e,r):kt(t)?Yy(t,e,r):Vs(t)?jy(t,e,r):Wt(t)?Gy(t,e,r):Us(t)?Hy(t,e,r):Ht(t)?zy(t,e,r):W(r)}function Jo(t){return globalThis.Object.getOwnPropertyNames(t.patternProperties)[0]}function sc(t){let e=Jo(t);return e===Jt?vt():e===Qt?nt():vt({pattern:e})}function Yo(t){return t.patternProperties[Jo(t)]}var ac=u(()=>{T();M();Ae();vr();Xe();Vr();he();qt();Pn();Mt();De();B()});var Fn=u(()=>{ac()});function Xy(t,e){return e.parameters=Ln(t,e.parameters),e.returns=Pt(t,e.returns),e}function Zy(t,e){return e.parameters=Ln(t,e.parameters),e.returns=Pt(t,e.returns),e}function ek(t,e){return e.allOf=Ln(t,e.allOf),e}function tk(t,e){return e.anyOf=Ln(t,e.anyOf),e}function rk(t,e){return ce(e.items)||(e.items=Ln(t,e.items)),e}function nk(t,e){return e.items=Pt(t,e.items),e}function ok(t,e){return e.items=Pt(t,e.items),e}function ik(t,e){return e.items=Pt(t,e.items),e}function sk(t,e){return e.item=Pt(t,e.item),e}function ak(t,e){let r=pk(t,e.properties);return{...e,...H(r)}}function dk(t,e){let r=Pt(t,sc(e)),n=Pt(t,Yo(e)),o=Qo(r,n);return{...e,...o}}function lk(t,e){return e.index in t?t[e.index]:tr()}function uk(t,e){let r=Nr(e),n=Be(e),o=Pt(t,e);return r&&n?Ho(o):r&&!n?Ve(o):!r&&n?Ce(o):o}function pk(t,e){return globalThis.Object.getOwnPropertyNames(e).reduce((r,n)=>({...r,[n]:uk(t,e[n])}),{})}function Ln(t,e){return e.map(r=>Pt(t,r))}function Pt(t,e){return ht(e)?Xy(t,e):St(e)?Zy(t,e):ie(e)?ek(t,e):L(e)?tk(t,e):Je(e)?rk(t,e):ft(e)?nk(t,e):mr(e)?ok(t,e):gr(e)?ik(t,e):hr(e)?sk(t,e):me(e)?ak(t,e):Sr(e)?dk(t,e):Ks(e)?lk(t,e):e}function dc(t,e){return Pt(e,Dr(t))}var lc=u(()=>{go();Hr();zo();wr();Kt();Xe();Fn();De();B()});var qa=u(()=>{lc()});function uc(t){return h({[P]:"Integer",type:"integer"},t)}var pc=u(()=>{T();M()});var ja=u(()=>{pc()});function ck(t,e,r){return{[t]:wt(V(t),e,ee(r))}}function mk(t,e,r){return t.reduce((o,i)=>({...o,...ck(i,e,r)}),{})}function fk(t,e,r){return mk(t.keys,e,r)}function cc(t,e,r){let n=fk(t,e,r);return U(n)}var Ga=u(()=>{ve();br();Ue();We()});function gk(t){let[e,r]=[t.slice(0,1),t.slice(1)];return[e.toLowerCase(),r].join("")}function hk(t){let[e,r]=[t.slice(0,1),t.slice(1)];return[e.toUpperCase(),r].join("")}function Sk(t){return t.toUpperCase()}function yk(t){return t.toLowerCase()}function kk(t,e,r){let n=Ur(t.pattern);if(!kr(n))return{...t,pattern:mc(t.pattern,e)};let s=[...Mn(n)].map(l=>V(l)),a=fc(s,e),d=q(a);return bo([d],r)}function mc(t,e){return typeof t=="string"?e==="Uncapitalize"?gk(t):e==="Capitalize"?hk(t):e==="Uppercase"?Sk(t):e==="Lowercase"?yk(t):t:t.toString()}function fc(t,e){return t.map(r=>wt(r,e))}function wt(t,e,r={}){return ze(t)?cc(t,e,r):Qe(t)?kk(t,e,r):L(t)?q(fc(t.anyOf,e),r):He(t)?V(mc(t.const,e),r):h(t,r)}var br=u(()=>{T();qt();Ga();Ue();he();B()});function gc(t,e={}){return wt(t,"Capitalize",e)}var hc=u(()=>{br()});function Sc(t,e={}){return wt(t,"Lowercase",e)}var yc=u(()=>{br()});function kc(t,e={}){return wt(t,"Uncapitalize",e)}var vc=u(()=>{br()});function Pc(t,e={}){return wt(t,"Uppercase",e)}var wc=u(()=>{br()});var Ha=u(()=>{hc();Ga();br();yc();vc();wc()});function vk(t,e,r){let n={};for(let o of globalThis.Object.getOwnPropertyNames(t))n[o]=nr(t[o],e,ee(r));return n}function Pk(t,e,r){return vk(t.properties,e,r)}function Ic(t,e,r){let n=Pk(t,e,r);return U(n)}var za=u(()=>{ve();Xo();We()});function wk(t,e){return t.map(r=>Qa(r,e))}function Ik(t,e){return t.map(r=>Qa(r,e))}function xk(t,e){let{[e]:r,...n}=t;return n}function bk(t,e){return e.reduce((r,n)=>xk(r,n),t)}function Ak(t,e,r){let n=se(t,[ge,"$id","required","properties"]),o=bk(r,e);return H(o,n)}function Rk(t){let e=t.reduce((r,n)=>So(n)?[...r,V(n)]:r,[]);return q(e)}function Qa(t,e){return ie(t)?_e(wk(t.allOf,e)):L(t)?q(Ik(t.anyOf,e)):me(t)?Ak(t,e,t.properties):H({})}function nr(t,e,r){let n=pe(e)?Rk(e):e,o=Ye(e)?Ke(e):e,i=de(t),s=de(e);return te(t)?Ic(t,o,r):ze(e)?xc(t,e,r):i&&s?Z("Omit",[t,n],r):!i&&s?Z("Omit",[t,n],r):i&&!s?Z("Omit",[t,n],r):h({...Qa(t,o),...r})}var Xo=u(()=>{T();ko();fn();Xt();Ue();Mt();ot();he();Xe();Ja();za();B();De()});function Tk(t,e,r){return{[e]:nr(t,[e],ee(r))}}function Mk(t,e,r){return e.reduce((n,o)=>({...n,...Tk(t,o,r)}),{})}function Ck(t,e,r){return Mk(t,e.keys,r)}function xc(t,e,r){let n=Ck(t,e,r);return U(n)}var Ja=u(()=>{ve();Xo();We()});var Zo=u(()=>{Ja();za();Xo()});function _k(t,e,r){let n={};for(let o of globalThis.Object.getOwnPropertyNames(t))n[o]=or(t[o],e,ee(r));return n}function $k(t,e,r){return _k(t.properties,e,r)}function bc(t,e,r){let n=$k(t,e,r);return U(n)}var Ya=u(()=>{ve();ei();We()});function Ek(t,e){return t.map(r=>Xa(r,e))}function Ok(t,e){return t.map(r=>Xa(r,e))}function Dk(t,e){let r={};for(let n of e)n in t&&(r[n]=t[n]);return r}function Nk(t,e,r){let n=se(t,[ge,"$id","required","properties"]),o=Dk(r,e);return H(o,n)}function Fk(t){let e=t.reduce((r,n)=>So(n)?[...r,V(n)]:r,[]);return q(e)}function Xa(t,e){return ie(t)?_e(Ek(t.allOf,e)):L(t)?q(Ok(t.anyOf,e)):me(t)?Nk(t,e,t.properties):H({})}function or(t,e,r){let n=pe(e)?Fk(e):e,o=Ye(e)?Ke(e):e,i=de(t),s=de(e);return te(t)?bc(t,o,r):ze(e)?Ac(t,e,r):i&&s?Z("Pick",[t,n],r):!i&&s?Z("Pick",[t,n],r):i&&!s?Z("Pick",[t,n],r):h({...Xa(t,o),...r})}var ei=u(()=>{T();ko();Xt();ot();Ue();Xe();he();Mt();fn();B();De();Za();Ya()});function Lk(t,e,r){return{[e]:or(t,[e],ee(r))}}function Wk(t,e,r){return e.reduce((n,o)=>({...n,...Lk(t,o,r)}),{})}function Bk(t,e,r){return Wk(t,e.keys,r)}function Ac(t,e,r){let n=Bk(t,e,r);return U(n)}var Za=u(()=>{ve();ei();We()});var ti=u(()=>{Za();Ya();ei()});function Uk(t,e){return Z("Partial",[Z(t,e)])}function Kk(t){return Z("Partial",[Ct(t)])}function Vk(t){let e={};for(let r of globalThis.Object.getOwnPropertyNames(t))e[r]=Ce(t[r]);return e}function qk(t,e){let r=se(t,[ge,"$id","required","properties"]),n=Vk(e);return H(n,r)}function Rc(t){return t.map(e=>Tc(e))}function Tc(t){return gt(t)?Uk(t.target,t.parameters):de(t)?Kk(t.$ref):ie(t)?_e(Rc(t.allOf)):L(t)?q(Rc(t.anyOf)):me(t)?qk(t,t.properties):fr(t)||Lt(t)||yt(t)||He(t)||gn(t)||kt(t)||Wt(t)||hn(t)||Sn(t)?t:H({})}function Xr(t,e){return te(t)?Mc(t,e):h({...Tc(t),...e})}var ed=u(()=>{T();Xt();Kt();Xe();ot();he();Ir();Ut();M();td();B()});function jk(t,e){let r={};for(let n of globalThis.Object.getOwnPropertyNames(t))r[n]=Xr(t[n],ee(e));return r}function Gk(t,e){return jk(t.properties,e)}function Mc(t,e){let r=Gk(t,e);return U(r)}var td=u(()=>{ve();ed();We()});var ri=u(()=>{td();ed()});function Hk(t,e){return Z("Required",[Z(t,e)])}function zk(t){return Z("Required",[Ct(t)])}function Qk(t){let e={};for(let r of globalThis.Object.getOwnPropertyNames(t))e[r]=se(t[r],[be]);return e}function Jk(t,e){let r=se(t,[ge,"$id","required","properties"]),n=Qk(e);return H(n,r)}function Cc(t){return t.map(e=>_c(e))}function _c(t){return gt(t)?Hk(t.target,t.parameters):de(t)?zk(t.$ref):ie(t)?_e(Cc(t.allOf)):L(t)?q(Cc(t.anyOf)):me(t)?Jk(t,t.properties):fr(t)||Lt(t)||yt(t)||He(t)||gn(t)||kt(t)||Wt(t)||hn(t)||Sn(t)?t:H({})}function Zr(t,e){return te(t)?$c(t,e):h({..._c(t),...e})}var rd=u(()=>{T();Xt();Xe();ot();he();Ir();M();Ut();nd();B()});function Yk(t,e){let r={};for(let n of globalThis.Object.getOwnPropertyNames(t))r[n]=Zr(t[n],e);return r}function Xk(t,e){return Yk(t.properties,e)}function $c(t,e){let r=Xk(t,e);return U(r)}var nd=u(()=>{ve();rd()});var ni=u(()=>{nd();rd()});function Zk(t,e){return e.map(r=>de(r)?od(t,r.$ref):Ze(t,r))}function od(t,e){return e in t?de(t[e])?od(t,t[e].$ref):Ze(t,t[e]):W()}function ev(t){return jr(t[0])}function tv(t){return Zt(t[0],t[1])}function rv(t){return Gr(t[0])}function nv(t){return Xr(t[0])}function ov(t){return nr(t[0],t[1])}function iv(t){return or(t[0],t[1])}function sv(t){return Zr(t[0])}function av(t,e,r){let n=Zk(t,r);return e==="Awaited"?ev(n):e==="Index"?tv(n):e==="KeyOf"?rv(n):e==="Partial"?nv(n):e==="Omit"?ov(n):e==="Pick"?iv(n):e==="Required"?sv(n):W()}function dv(t,e){return Fr(Ze(t,e))}function lv(t,e){return Lr(Ze(t,e))}function uv(t,e,r){return Wr(Wn(t,e),Ze(t,r))}function pv(t,e,r){return Rt(Wn(t,e),Ze(t,r))}function cv(t,e){return _e(Wn(t,e))}function mv(t,e){return qr(Ze(t,e))}function fv(t,e){return H(globalThis.Object.keys(e).reduce((r,n)=>({...r,[n]:Ze(t,e[n])}),{}))}function gv(t,e){let[r,n]=[Ze(t,Yo(e)),Jo(e)],o=Dr(e);return o.patternProperties[n]=r,o}function hv(t,e){return de(e)?{...od(t,e.$ref),[ge]:e[ge]}:e}function Sv(t,e){return it(Wn(t,e))}function yv(t,e){return q(Wn(t,e))}function Wn(t,e){return e.map(r=>Ze(t,r))}function Ze(t,e){return Be(e)?h(Ze(t,se(e,[be])),e):Nr(e)?h(Ze(t,se(e,[mt])),e):zt(e)?h(hv(t,e),e):ft(e)?h(dv(t,e.items),e):mr(e)?h(lv(t,e.items),e):gt(e)?h(av(t,e.target,e.parameters)):ht(e)?h(uv(t,e.parameters,e.returns),e):St(e)?h(pv(t,e.parameters,e.returns),e):ie(e)?h(cv(t,e.allOf),e):gr(e)?h(mv(t,e.items),e):me(e)?h(fv(t,e.properties),e):Sr(e)?h(gv(t,e)):Je(e)?h(Sv(t,e.items||[]),e):L(e)?h(yv(t,e.anyOf),e):e}function kv(t,e){return e in t?Ze(t,t[e]):W()}function Ec(t){return globalThis.Object.getOwnPropertyNames(t).reduce((e,r)=>({...e,[r]:kv(t,r)}),{})}var Oc=u(()=>{Ft();Bs();Ut();xn();Co();bn();An();Mt();yr();ot();_n();Dn();Xe();Zo();ti();Ae();ri();Fn();ni();er();he();M();B()});function Dc(t){return new id(t)}var id,Nc=u(()=>{Ft();M();Oc();id=class{constructor(e){let r=Ec(e),n=this.WithIdentifiers(r);this.$defs=n}Import(e,r){let n={...this.$defs,[e]:h(this.$defs[e],r)};return h({[P]:"Import",$defs:n,$ref:e})}WithIdentifiers(e){return globalThis.Object.getOwnPropertyNames(e).reduce((r,n)=>({...r,[n]:{...e[n],$id:n}}),{})}}});var sd=u(()=>{Nc()});function Fc(t,e){return h({[P]:"Not",not:t},e)}var Lc=u(()=>{T();M()});var ad=u(()=>{Lc()});function Wc(t,e){return St(t)?it(t.parameters,e):W()}var Bc=u(()=>{er();Ae();B()});var dd=u(()=>{Bc()});function Uc(t,e={}){ce(e.$id)&&(e.$id=`T${vv++}`);let r=Dr(t({[P]:"This",$ref:`${e.$id}`}));return r.$id=e.$id,h({[rt]:"Recursive",...r},e)}var vv,Kc=u(()=>{go();T();De();M();vv=0});var ld=u(()=>{Kc()});function Vc(t,e){let r=Q(t)?new globalThis.RegExp(t):t;return h({[P]:"RegExp",type:"RegExp",source:r.source,flags:r.flags},e)}var qc=u(()=>{T();De();M()});var ud=u(()=>{qc()});function Pv(t){return ie(t)?t.allOf:L(t)?t.anyOf:Je(t)?t.items??[]:[]}function jc(t){return Pv(t)}var Gc=u(()=>{B()});var pd=u(()=>{Gc()});function Hc(t,e){return St(t)?h(t.returns,e):W(e)}var zc=u(()=>{T();Ae();B()});var cd=u(()=>{zc()});var Qc=u(()=>{});var Jc=u(()=>{});var Yc=u(()=>{Qc();Jc()});var Xc=u(()=>{});var Zc=u(()=>{Xc()});function em(t){return new md(t)}var md,fd,tm=u(()=>{M();B();md=class{constructor(e){this.schema=e}Decode(e){return new fd(this.schema,e)}},fd=class{constructor(e,r){this.schema=e,this.decode=r}EncodeTransform(e,r){let i={Encode:s=>r[ge].Encode(e(s)),Decode:s=>this.decode(r[ge].Decode(s))};return{...r,[ge]:i}}EncodeSchema(e,r){let n={Decode:this.decode,Encode:e};return{...r,[ge]:n}}Encode(e){return zt(this.schema)?this.EncodeTransform(e,this.schema):this.EncodeSchema(e,this.schema)}}});var gd=u(()=>{tm()});function rm(t={}){return h({[P]:t[P]??"Unsafe"},t)}var nm=u(()=>{T();M()});var hd=u(()=>{nm()});function om(t){return h({[P]:"Void",type:"void"},t)}var im=u(()=>{T();M()});var Sd=u(()=>{im()});var yd={};co(yd,{Any:()=>Yt,Argument:()=>_u,Array:()=>Fr,AsyncIterator:()=>Lr,Awaited:()=>jr,BigInt:()=>Kr,Boolean:()=>Io,Capitalize:()=>gc,Composite:()=>bp,Const:()=>Ep,Constructor:()=>Wr,ConstructorParameters:()=>Dp,Date:()=>_o,Enum:()=>Fp,Exclude:()=>Jr,Extends:()=>Qr,Extract:()=>Yr,Function:()=>Rt,Index:()=>Zt,InstanceType:()=>nc,Instantiate:()=>dc,Integer:()=>uc,Intersect:()=>_e,Iterator:()=>qr,KeyOf:()=>Gr,Literal:()=>V,Lowercase:()=>Sc,Mapped:()=>cp,Module:()=>Dc,Never:()=>W,Not:()=>Fc,Null:()=>Eo,Number:()=>nt,Object:()=>H,Omit:()=>nr,Optional:()=>Ce,Parameters:()=>Wc,Partial:()=>Xr,Pick:()=>or,Promise:()=>To,Readonly:()=>Ve,ReadonlyOptional:()=>Ho,Record:()=>Qo,Recursive:()=>Uc,Ref:()=>Ct,RegExp:()=>Vc,Required:()=>Zr,Rest:()=>jc,ReturnType:()=>Hc,String:()=>vt,Symbol:()=>Do,TemplateLiteral:()=>bo,Transform:()=>em,Tuple:()=>it,Uint8Array:()=>Wo,Uncapitalize:()=>kc,Undefined:()=>Fo,Union:()=>q,Unknown:()=>tr,Unsafe:()=>rm,Uppercase:()=>Pc,Void:()=>om});var sm=u(()=>{In();Ys();xn();bn();Co();Cn();xo();wa();xa();An();ba();$o();Aa();La();Nn();Ua();yr();Mt();Ka();qa();ja();ot();Ha();_n();Dn();Ue();ve();sd();Ae();ad();Oo();vr();Xe();Zo();Kt();dd();ri();ti();Mo();wr();zo();Fn();ld();Ir();ud();ni();pd();cd();Vr();No();qt();gd();er();Bo();Lo();he();Hr();hd();Sd()});var p,am=u(()=>{sm();p=yd});var Ee=u(()=>{Bs();Ft();At();zs();yu();Pn();Iu();wn();M();In();xn();Ys();bn();Co();Cn();xo();wa();xa();An();ba();$o();Aa();La();Nn();Ua();yr();Mt();Ka();qa();ja();ot();_n();Ha();Dn();Ue();sd();ve();Ae();ad();Oo();vr();Xe();Zo();Kt();dd();ri();ti();Mo();wr();zo();Fn();ld();Ir();ud();ni();pd();cd();Yc();Zc();Vr();No();qt();gd();er();Bo();Lo();he();Hr();hd();Sd();am()});function kd(t){v=t}function vd(t){fe=t}var v,fe,Y=u(()=>{v=null,fe=null});function dm(t){let e=t.chatId.trim(),r=t.topicId.trim();return!/^-?\d+$/.test(e)||!/^\d+$/.test(r)?null:`${e}:topic:${r}`}function Av(t){let e=t.conversationId.trim(),r=e.match(/^(-?\d+):topic:(\d+)$/i);if(r?.[1]&&r[2]){let i=dm({chatId:r[1],topicId:r[2]});return i?{chatId:r[1],topicId:r[2],canonicalConversationId:i}:null}if(!/^\d+$/.test(e))return null;let n=t.parentConversationId?.trim();if(!n||!/^-?\d+$/.test(n))return null;let o=dm({chatId:n,topicId:e});return o?{chatId:n,topicId:e,canonicalConversationId:o}:null}function Rv(t){if(!t)return;let e=t.match(/^agent:[^:]+:discord:(direct|dm|channel|group):/i);if(!e?.[1])return;let r=e[1].toLowerCase();return r==="direct"||r==="dm"?"user":"channel"}function Tv(t,e){if(!/^\d+$/.test(t))return t;let r=Rv(e);return r?`${r}:${t}`:`channel:${t}`}function Mv(t){if(!(!t?.provider||!t.target)&&!(t.provider==="system"||t.target==="system"))return t.accountId?`${t.provider}|${t.accountId}|${t.target}`:`${t.provider}|${t.target}`}function Cv(t){let e=t.toLowerCase(),r=[":thread:",":topic:"];for(let n of r){let o=e.lastIndexOf(n);if(o===-1)continue;let i=t.slice(0,o).trim(),s=t.slice(o+n.length).trim()||void 0;return{id:i||t,threadId:s}}return{id:t}}function _v(t){let e=t?.trim();if(!e)return;let r=e.split(":").filter(Boolean);if(r[0]?.trim().toLowerCase()==="agent")for(let n=2;n<=r.length-3;n+=1){let o=r[n]?.trim().toLowerCase();if(!o||!bv.has(o))continue;let i=r[n+1]?.trim().toLowerCase(),s=r.slice(n+2).join(":").trim();if(!(!i||!s))return{provider:o,kind:i,rawId:s}}}function $v(t,e=Av){try{return e({conversationId:t})}catch{return null}}function Pd(t){return{provider:"system",target:"system",sessionKey:t?.trim()||void 0}}function wd(t,e){return{...t,threadId:e??t.threadId}}function Ov(t,e,r){return t==="telegram"&&r?.provider==="telegram"&&!!r.target&&e!==r.target}function Dv(t){let e=t?.trim();if(!e)return;let r=_v(e);if(!r)return;let{provider:n,kind:o,rawId:i}=r,s=Cv(i),a=null;if(n==="telegram")try{a=Ev.safeParseTelegramTopicConversation(i)}catch{a=null}let d=a?.chatId??s.id,l=a?.topicId??s.threadId,m=n==="discord"?o==="direct"||o==="dm"?`user:${d}`:`channel:${d}`:d;return{provider:n,target:m,threadId:l,sessionKey:e}}function Id(t){let e=t?.match(/:topic:(\d+)$/);return e?parseInt(e[1],10):void 0}function Nv(t){return!!(t?.provider&&t.target&&t.provider!=="system"&&t.target!=="system")}function Bn(t,e,r){let n=Dv(r),o=e!=null?String(e):void 0,i=t?.trim();if(!i||i.toLowerCase()==="unknown")return n?wd(n,o):Pd(r);let s=i.split("|").map(k=>k.trim());if(s.length<2)return n?wd(n,o):Pd(r);let[a,d,l]=s,m=s.length>=3?l:d,g=s.length>=3?d:void 0,y=a?.toLowerCase();if(!y||!m)return n?wd(n,o):Pd(r);let f=y==="discord"?Tv(m,r):m;return Ov(y,f,n)?{provider:y,accountId:g,target:n.target,threadId:o??n.threadId,sessionKey:r?.trim()||void 0}:{provider:y,accountId:g,target:f,threadId:o??(n?.provider===y?n.threadId:void 0),sessionKey:r?.trim()||void 0}}function en(t){return Bn(Mv(t.route)??t.originChannel,t.route?.threadId??t.originThreadId,t.route?.sessionKey??t.originSessionKey)??t.route}function ii(t){let e=en(t);return Nv(e)?e:void 0}var bv,Ev,Ar=u(()=>{bv=new Set(["telegram","discord","slack","system","mattermost","feishu","line","whatsapp","signal","matrix","googlechat","bluebubbles","imessage","msteams"]);Ev={safeParseTelegramTopicConversation:$v}});import{readFileSync as Fv}from"fs";import{homedir as Lv}from"os";import{join as Wv}from"path";function um(){if(Un!==void 0)return Un;try{let t=Fv(Wv(Lv(),".claude.json"),"utf-8");Un=JSON.parse(t).mcpServers??{}}catch{Un={}}return Un}function pm(t){let e=t.defaultHarness??lm,r={};for(let[n,o]of Object.entries(si))r[n]={...o,allowedModels:o.allowedModels?[...o.allowedModels]:void 0};for(let[n,o]of Object.entries(t.harnesses??{})){let i=r[n]??{},s={...i,defaultModel:o.defaultModel??i.defaultModel,reasoningEffort:o.reasoningEffort??i.reasoningEffort};o.allowedModels!==void 0?s.allowedModels=o.allowedModels?[...o.allowedModels]:o.allowedModels:o.defaultModel!==void 0&&(s.allowedModels=void 0),r[n]=s}if(t.defaultModel!==void 0){let n=r[e]??{};r[e]={...n,defaultModel:t.harnesses?.[e]?.defaultModel??t.defaultModel,allowedModels:t.harnesses?.[e]?.allowedModels!==void 0?n.allowedModels:t.allowedModels},console.warn(`[openclaw-code-agent] config.defaultModel is deprecated; use harnesses.${e}.defaultModel instead.`)}if(t.model!==void 0){let n=r.codex??{};r.codex={...n,defaultModel:t.harnesses?.codex?.defaultModel??t.model,allowedModels:t.harnesses?.codex?.allowedModels!==void 0?n.allowedModels:t.allowedModels},console.warn("[openclaw-code-agent] config.model is deprecated; use harnesses.codex.defaultModel instead.")}if(t.reasoningEffort!==void 0){let n=r.codex??{};r.codex={...n,reasoningEffort:t.harnesses?.codex?.reasoningEffort??t.reasoningEffort},console.warn("[openclaw-code-agent] config.reasoningEffort is deprecated; use harnesses.codex.reasoningEffort instead.")}if(t.allowedModels!==void 0){console.warn("[openclaw-code-agent] config.allowedModels is deprecated; use harnesses.<name>.allowedModels instead.");for(let[n,o]of Object.entries(r))t.harnesses?.[n]?.allowedModels===void 0&&(r[n]={...o,allowedModels:void 0})}_={maxSessions:t.maxSessions??20,defaultWorkdir:t.defaultWorkdir,idleTimeoutMinutes:t.idleTimeoutMinutes??15,sessionGcAgeMinutes:t.sessionGcAgeMinutes??1440,maxPersistedSessions:t.maxPersistedSessions??1e4,fallbackChannel:t.fallbackChannel,agentChannels:t.agentChannels,maxAutoResponds:t.maxAutoResponds??10,permissionMode:t.permissionMode??"plan",planApproval:t.planApproval??"ask",defaultHarness:e,harnesses:r,allowedModels:t.allowedModels,defaultWorktreeStrategy:t.defaultWorktreeStrategy??"off",worktreeDir:t.worktreeDir}}function Pe(){return _.defaultHarness??lm}function cm(t){let e=si[t],r=_.harnesses[t];return{...e,...r,allowedModels:r?.allowedModels??e?.allowedModels}}function $t(t){return cm(t).defaultModel}function tn(t){return _.harnesses[t]?.allowedModels??_.allowedModels}function lt(t){return cm(t).reasoningEffort}function _t(t){return t==null?void 0:String(t).trim()||void 0}function Ad(t){return{channel:_t(t?.deliveryContext?.channel),to:_t(t?.deliveryContext?.to),accountId:_t(t?.deliveryContext?.accountId),threadId:_t(t?.deliveryContext?.threadId)}}function mm(t,e,r){if(!(!t||!e))return r?`${t}|${r}|${e}`:`${t}|${e}`}function xd(t){return _t(t?.requesterSenderId??t?.senderId)}function bd(t){return(_t(t.deliveryContext?.channel)??t.messageChannel??t.channel)?.toLowerCase()!=="telegram"?!1:!!Id(t.sessionKey)}function ai(t){let e=Ad(t),r=mm(e.channel,e.to,e.accountId);if(r)return r;if(t.messageChannel){let n=t.messageChannel.split("|");if(n.length>=3)return t.messageChannel;if(t.agentAccountId&&n.length>=2)return`${n[0]}|${t.agentAccountId}|${n.slice(1).join("|")}`;let o=_t(t.chatId);if(n.length===1&&o)return`${n[0]}|${o}`;let i=xd(t);if(n.length===1&&i&&!bd(t))return`${n[0]}|${i}`}if(t.workspaceDir){let n=Vn(t.workspaceDir);if(n)return n}if(t.messageChannel&&t.messageChannel.includes("|"))return t.messageChannel}function jt(t,e){if(e&&String(e).includes("|"))return String(e);let r=Ad(t),n=mm(r.channel,r.to,r.accountId);if(n)return n;if(t?.channelId&&String(t.channelId).includes("|"))return String(t.channelId);if(t?.messageChannel){let a=String(t.messageChannel);if(a.includes("|"))return a;let d=_t(t.chatId);if(d)return`${a}|${d}`;let l=xd(t);if(l&&!bd(t))return`${a}|${l}`}let o=_t(t?.channel),i=_t(t?.chatId);if(o&&i)return`${o}|${i}`;let s=xd(t);return o&&s&&!bd(t)?`${o}|${s}`:t?.id&&/^-?\d+$/.test(String(t.id))?`telegram|${t.id}`:_.fallbackChannel??"unknown"}function Kn(t){return Ad(t).threadId??t?.messageThreadId??void 0}function Et(t,e,r){return Bn(jt(t,e),Kn(t),r??t?.sessionKey)}function Vn(t){let e=_.agentChannels;if(!e)return;let r=i=>i.replace(/\/+$/,""),n=r(t),o=Object.entries(e).sort((i,s)=>s[0].length-i[0].length);for(let[i,s]of o)if(n===r(i)||n.startsWith(r(i)+"/"))return s}function fm(t){return Id(t)}var Un,lm,si,_,Re=u(()=>{Ar();lm="claude-code",si={"claude-code":{defaultModel:"sonnet",allowedModels:["sonnet","opus"]},codex:{defaultModel:"gpt-5.4",allowedModels:["gpt-5.4","gpt-5.4-pro"],reasoningEffort:"medium"}};_={maxSessions:20,idleTimeoutMinutes:15,sessionGcAgeMinutes:1440,maxPersistedSessions:1e4,maxAutoResponds:10,permissionMode:"plan",planApproval:"ask",harnesses:{"claude-code":{...si["claude-code"]},codex:{...si.codex}}}});function di(t){return{type:"backend_ref",ref:t}}function li(t){return{type:"run_started",...t?{runId:t}:{}}}function qn(t){return{type:"text_delta",text:t}}function gm(t,e){return{type:"tool_call",name:t,input:e}}function ui(t){return{type:"pending_input",state:t}}function on(t){return t?{type:"pending_input_resolved",requestId:t}:{type:"pending_input_resolved"}}function pi(t,e){return{type:"plan_artifact",artifact:t,finalized:e}}function ci(t){return t?{type:"settings_changed",permissionMode:t}:{type:"settings_changed"}}function Rr(t){return{type:"run_completed",data:t}}var nn,Rd=u(()=>{nn=class{queue=[];resolvePending=null;done=!1;enqueue(e){this.queue.push(e),this.flush()}close(){this.done=!0,this.flush()}flush(){this.resolvePending&&(this.resolvePending(),this.resolvePending=null)}messages(){let e=this;return(async function*(){for(;;){for(;e.queue.length>0;)yield e.queue.shift();if(e.done)return;await new Promise(r=>{e.resolvePending=r})}})()}}});import*as fi from"@anthropic-ai/claude-agent-sdk";import{dirname as hm,join as Sm}from"path";import{fileURLToPath as Bv}from"url";import{createRequire as Uv}from"module";function Kv(t){if(typeof t.result=="string"&&t.result.length>0)return t.result;if(Array.isArray(t.errors)){let e=t.errors.filter(r=>typeof r=="string"&&r.length>0);if(e.length>0)return e.join(`
2
- `)}}function Vv(t,e,r){let o=(Array.isArray(r.questions)?r.questions:[])[0]??{},i=typeof o.question=="string"?o.question:void 0,s=Array.isArray(o.options)?o.options.map(a=>{if(!a||typeof a!="object")return"";let d=a.label;return typeof d=="string"?d:""}).filter(Boolean):[];return{requestId:`${t||"claude"}-ask-${e}`,kind:"question",promptText:i,options:s,allowsFreeText:s.length===0||o.multiSelect===!0}}var mi,ym=u(()=>{Rd();mi=class{constructor(e={}){this.deps=e}deps;name="claude-code";backendKind="claude-code";supportedPermissionModes=["default","plan","bypassPermissions"];capabilities={nativePendingInput:!1,nativePlanArtifacts:!1,worktrees:"plugin-managed"};launch(e){let r=new nn,n=!1,o="",i=!1,s=0,a=e.resumeSessionId??"",d=e.canUseTool,l={cwd:e.cwd,model:e.model,permissionMode:e.permissionMode,allowDangerouslySkipPermissions:!0,pathToClaudeCodeExecutable:(()=>{try{let A=Uv(import.meta.url).resolve("@anthropic-ai/claude-agent-sdk");return Sm(hm(A),"cli.js")}catch{let k=hm(Bv(import.meta.url));return Sm(k,"..","node_modules","@anthropic-ai","claude-agent-sdk","cli.js")}})(),allowedTools:e.allowedTools,systemPrompt:e.systemPrompt,includePartialMessages:!0,abortController:e.abortController,mcpServers:e.mcpServers,...d?{canUseTool:async(k,A)=>{if(k!=="AskUserQuestion")return{behavior:"allow"};let b=Vv(a,++s,A);r.enqueue(ui(b));try{let w=await d(k,A);return r.enqueue(on(b.requestId)),w}catch(w){throw r.enqueue(on(b.requestId)),w}}}:{}};e.resumeSessionId&&(l.resume=e.resumeSessionId,l.forkSession=e.forkSession??!1);let m=e.prompt,g=this.deps.query??fi.query,y=this.deps.startup??fi.startup,f=(async()=>{if(typeof y!="function")return g({prompt:m,options:l});let k=await y({options:l});try{return k.query(m)}catch(A){throw await k.close?.(),A}})();return(async()=>{try{let k=await f;for await(let A of k){let b=A;if(b.type==="system"&&b.subtype==="init"){a=b.session_id??a,r.enqueue(di({kind:"claude-code",conversationId:a}));continue}if(b.type==="system"&&b.subtype==="status"&&b.permissionMode){r.enqueue(ci(b.permissionMode));continue}if(b.type==="assistant"){n||(n=!0,r.enqueue(li()));for(let w of b.message?.content??[]){if(w.type==="text"){o+=o?`
3
- ${w.text}`:w.text,r.enqueue(qn(w.text));continue}w.type==="tool_use"&&((w.name==="ExitPlanMode"||w.name==="set_permission_mode")&&(i=!0),w.name!=="AskUserQuestion"&&r.enqueue(gm(w.name,w.input)))}continue}if(b.type==="result"){let w=o.trim();if(w&&(e.permissionMode==="plan"||i)){let C={explanation:void 0,steps:[],markdown:w};r.enqueue(pi(C,!0))}r.enqueue(Rr({success:b.subtype==="success",duration_ms:b.duration_ms??0,total_cost_usd:b.total_cost_usd??0,num_turns:b.num_turns??0,result:Kv(b),session_id:b.session_id??a})),o="",i=!1,n=!1}}}finally{r.close()}})().catch(k=>{r.enqueue(Rr({success:!1,duration_ms:0,total_cost_usd:0,num_turns:0,result:k instanceof Error?k.message:String(k),session_id:a})),r.close()}),{messages:r.messages(),async setPermissionMode(k){let A=await f;typeof A.setPermissionMode=="function"&&await A.setPermissionMode(k)},async streamInput(k){let A=await f;typeof A.streamInput=="function"&&await A.streamInput(k)},async interrupt(){let k=await f;typeof k.interrupt=="function"&&await k.interrupt()}}}buildUserMessage(e,r){return{type:"user",message:{role:"user",content:e},parent_tool_use_id:null,session_id:r}}}});import{spawn as qv}from"node:child_process";import jv from"node:readline";function Gv(t){return t instanceof Error?t.message:String(t)}function Hv(t){try{let e=JSON.parse(t);return!e||typeof e!="object"||Array.isArray(e)?null:e}catch{return null}}async function zv(t,e){if(t.id!=null&&(Object.hasOwn(t,"result")||Object.hasOwn(t,"error"))){let n=String(t.id),o=e.pending.get(n);if(!o)return;if(clearTimeout(o.timer),e.pending.delete(n),t.error){o.reject(new Error(`codex app server rpc error (${t.error.code??"unknown"}): ${t.error.message??"unknown error"}`));return}o.resolve(t.result);return}let r=t.method?.trim();if(r){if(t.id==null){await e.onNotification(r,t.params);return}try{let n=await e.onRequest(r,t.params);e.respond({jsonrpc:"2.0",id:t.id,result:n??{}})}catch(n){e.respond({jsonrpc:"2.0",id:t.id,error:{code:-32603,message:Gv(n)}})}}}var gi,km=u(()=>{gi=class{constructor(e,r,n){this.command=e;this.args=r;this.requestTimeoutMs=n}command;args;requestTimeoutMs;process=null;pending=new Map;counter=0;onNotification=()=>{};onRequest=async()=>({});setNotificationHandler(e){this.onNotification=e}setRequestHandler(e){this.onRequest=e}async connect(){if(this.process)return;let e=qv(this.command,["app-server",...this.args],{stdio:["pipe","pipe","pipe"],env:process.env});if(!e.stdin||!e.stdout||!e.stderr)throw new Error("codex app server stdio pipes unavailable");this.process=e,jv.createInterface({input:e.stdout}).on("line",n=>{this.handleLine(n)}),e.stderr.on("data",()=>{}),e.on("close",()=>{this.flushPending(new Error("codex app server stdio closed")),this.process=null})}async close(){this.flushPending(new Error("codex app server stdio closed"));let e=this.process;this.process=null,e&&e.kill()}async notify(e,r){this.write({jsonrpc:"2.0",method:e,params:r??{}})}async request(e,r,n){let o=`rpc-${++this.counter}`,i=new Promise((s,a)=>{let d=setTimeout(()=>{this.pending.delete(o),a(new Error(`codex app server timeout: ${e}`))},Math.max(100,n??this.requestTimeoutMs));d.unref?.(),this.pending.set(o,{resolve:s,reject:a,timer:d})});return this.write({jsonrpc:"2.0",id:o,method:e,params:r??{}}),await i}write(e){if(!this.process?.stdin)throw new Error("codex app server stdio not connected");this.process.stdin.write(`${JSON.stringify(e)}
4
- `)}async handleLine(e){let r=Hv(e);r&&await zv(r,{pending:this.pending,onNotification:this.onNotification,onRequest:this.onRequest,respond:n=>this.write(n)})}flushPending(e){for(let[r,n]of this.pending)clearTimeout(n.timer),n.reject(e),this.pending.delete(r)}}});function X(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function le(t,e,r){for(let n of e){let o=t?.[n];if(typeof o!="string")continue;let i=r?.trim===!1?o:o.trim();if(i)return i}}function Qv(t){return t instanceof Error?t.message:String(t)}function vm(t){return t?t.split(",").map(e=>e.trim()).filter(Boolean):[]}function ir(t){if(typeof t=="string")return t;if(Array.isArray(t))return t.map(r=>ir(r)).join("");let e=X(t);if(!e)return"";for(let r of["delta","text","content","message","input","output","parts"]){let n=ir(e[r]);if(n)return n}for(let r of["item","turn","thread","response","result","data"]){let n=ir(e[r]);if(n)return n}return""}function jn(t){let e=X(t);if(!e)return{};let r=X(e.thread)??X(e.session),n=X(e.turn)??X(e.run),o=X(e.item),i=X(e.serverRequest);return{threadId:le(e,["threadId","thread_id","conversationId","conversation_id"])??le(r,["id","threadId","thread_id","conversationId"]),runId:le(e,["turnId","turn_id","runId","run_id"])??le(n,["id","turnId","turn_id","runId","run_id"]),requestId:le(e,["requestId","request_id","serverRequestId"])??le(i,["id","requestId","request_id"]),itemId:le(e,["itemId","item_id"])??le(o,["id","itemId","item_id"])}}function hi(t,e,r=0){if(r>6)return;if(Array.isArray(t)){for(let i of t){let s=hi(i,e,r+1);if(s)return s}return}let n=X(t);if(!n)return;let o=le(n,e);if(o)return o;for(let i of Object.values(n)){let s=hi(i,e,r+1);if(s)return s}}function Gn(t){return{threadId:jn(t).threadId,cwd:hi(t,["cwd","workdir","directory"])}}function Pm(t){let e=t?.trim();return!!(e&&/[/\\]worktrees[/\\][^/\\]+[/\\][^/\\]+/.test(e))}function wm(t){let e=t?.trim();if(!e)return;let r=e.split(/[/\\]+/).filter(Boolean),n=r.lastIndexOf("worktrees");if(!(n<0||n+1>=r.length))return r[n+1]}function Si(t){let e=X(t);if(!e)return;let r=X(e.item)??e;return le(r,["id","itemId","item_id","messageId","message_id"])}function Jv(t,e=!1){let r=X(t);if(!r)return"";let n=X(r.item)??r;return le(n,["type"])?.toLowerCase()!=="agentmessage"?"":e?ir(n):le(n,["text"],{trim:!1})??ir(n)}function Im(t,e){let r=t.trim().toLowerCase();return r==="item/agentmessage/delta"?{mode:"delta",text:ir(e),itemId:Si(e)}:r==="item/completed"?{mode:"snapshot",text:Jv(e),itemId:Si(e)}:{mode:"ignore",text:""}}function xm(t){return{itemId:Si(t),delta:ir(t)}}function bm(t){let e=X(t),r=X(e?.plan),o=(Array.isArray(e?.plan)?e.plan:Array.isArray(r?.steps)?r.steps:[]).map(i=>{let s=X(i),a=le(s,["step","title","text"]);if(!a)return null;let d=le(s,["status"])?.toLowerCase()??"pending";return{step:a,status:d==="inprogress"||d==="in_progress"?"inProgress":d==="completed"?"completed":"pending"}}).filter(Boolean);return{explanation:le(r,["explanation"])??le(e,["explanation"]),steps:o}}function Am(t){let e=X(t);if(!e)return{};let r=X(e.item)??e;return le(r,["type"])?.toLowerCase()!=="plan"?{}:{itemId:Si(r),text:le(r,["text"],{trim:!1})??ir(r)}}function Rm(t,e){let r=t.trim().toLowerCase();if(r==="turn/failed")return"failed";if(r==="turn/cancelled")return"interrupted";let n=X(e)??{},o=X(n.turn)??n,i=le(o,["status"])?.toLowerCase();return i==="failed"?"failed":i==="interrupted"||i==="cancelled"?"interrupted":"completed"}function Tm(t,e){let r=X(e)??{},n=X(r.turn)??r,o=X(n.error)??X(r.error);if(o)return le(o,["message","text","summary","reason"])}function Yv(t,e){let r=Qv(t).toLowerCase();return r.includes("method not found")||r.includes("unknown method")?!0:r.includes("unknown variant")?e?r.includes(`unknown variant \`${e.toLowerCase()}\``):!0:!1}function Zv(t){return Xv.has(t.trim().toLowerCase())}function eP(t){let e=X(t);return e?!!le(e,["threadId","thread_id"]):!1}async function Hn(t){if(t.payloads.length===0)throw new Error(`codex app server request skipped: no payloads for ${t.methods.join(", ")||"<none>"}`);let e;for(let r of t.methods)for(let n of t.payloads){if(Zv(r)&&!eP(n))throw new Error(`codex app server request missing threadId: ${r}`);try{return await t.client.request(r,n,t.timeoutMs)}catch(o){if(e=o,!Yv(o,r))continue}}throw e instanceof Error?e:new Error(String(e))}function Mm(t){let e={cwd:t.cwd};t.model?.trim()&&(e.model=t.model.trim()),t.approvalPolicy?.trim()&&(e.approvalPolicy=t.approvalPolicy.trim()),t.sandbox?.trim()&&(e.sandbox=t.sandbox.trim());let r={cwd:t.cwd};return t.approvalPolicy?.trim()&&(r.approvalPolicy=t.approvalPolicy.trim()),t.sandbox?.trim()&&(r.sandbox=t.sandbox.trim()),[e,r,{}]}function Cm(t){let e={threadId:t.threadId,persistExtendedHistory:!1};return t.model?.trim()&&(e.model=t.model.trim()),t.reasoningEffort?.trim()&&(e.reasoningEffort=t.reasoningEffort.trim()),t.cwd?.trim()&&(e.cwd=t.cwd.trim()),t.approvalPolicy?.trim()&&(e.approvalPolicy=t.approvalPolicy.trim()),t.sandbox?.trim()&&(e.sandbox=t.sandbox.trim()),[e]}function tP(t){return[{type:"text",text:t}]}function rP(t,e,r,n){let o=e?.trim(),i=n?.trim();if(t!=="plan")return o||i?{mode:"default",settings:{...o?{model:o}:{},...r?.trim()?{reasoningEffort:r.trim()}:{},developerInstructions:i??null}}:void 0;if(!(!o&&!i))return{mode:"plan",settings:{...o?{model:o}:{},...r?.trim()?{reasoningEffort:r.trim()}:{},developerInstructions:i??null}}}function _m(t){let e={threadId:t.threadId,input:tP(t.prompt)};t.model?.trim()&&(e.model=t.model.trim()),t.approvalPolicy?.trim()&&(e.approvalPolicy=t.approvalPolicy.trim()),t.sandbox?.trim()&&(e.sandbox=t.sandbox.trim());let r=rP(t.permissionMode??"default",t.model,t.reasoningEffort,t.systemPrompt);return r?[{...e,collaborationMode:r},{...e,collaboration_mode:{mode:r.mode,settings:{...typeof r.settings.model=="string"?{model:r.settings.model}:{},...typeof r.settings.reasoningEffort=="string"?{reasoning_effort:r.settings.reasoningEffort}:{},developer_instructions:r.settings.developerInstructions??null}}},e]:[e]}function $m(t){return[{threadId:t.threadId,turnId:t.turnId}]}function nP(t){let e=X(t);if(!e)return[];let r=e.options??e.choices??e.availableDecisions??e.decisions;return Array.isArray(r)?r.map(n=>typeof n=="string"?n.trim():le(X(n),["label","title","text","value","name","id"])??"").filter(Boolean):[]}function oP(t){let e=t.trim().toLowerCase();return e.includes("session")?"acceptForSession":/cancel|abort|stop/.test(e)?"cancel":/deny|decline|reject|block|no/.test(e)?"decline":/approve|allow|accept|yes/.test(e)?"accept":t.trim()}function Em(t,e,r){let n=t.trim().toLowerCase(),o=nP(r),i=hi(r,["question","prompt","message","text","summary","reason"])??void 0,s=n.includes("requestapproval"),a=s?o.map(d=>({kind:"approval",label:d,decision:oP(d),responseDecision:d})):o.map(d=>({kind:"option",label:d,value:d}));return{requestId:e,kind:s?"approval":"question",promptText:i,options:o,actions:a,allowsFreeText:!0}}function Om(t){let e=t.trim().toLowerCase();return e.includes("requestuserinput")||e.includes("requestapproval")}function Td(t,e){let r=t==="bypassPermissions"?"never":e?.trim()||"never";return{approvalPolicy:r,sandbox:r==="never"?"danger-full-access":void 0}}var Xv,Dm=u(()=>{Xv=new Set(["thread/resume","turn/start","turn/steer","turn/interrupt"])});function Nm(t){return t instanceof Error?t.message:String(t)}function lP(t){if(typeof t=="string")return t;if(!t||typeof t!="object")return String(t);let e=t;return typeof e.message?.content=="string"?e.message.content:typeof e.text=="string"?e.text:String(t)}var iP,Tr,sP,aP,dP,yi,Fm=u(()=>{km();Rd();Dm();iP="1.0",Tr=6e4,sP="OPENCLAW_CODEX_APP_SERVER_COMMAND",aP="OPENCLAW_CODEX_APP_SERVER_ARGS",dP="OPENCLAW_CODEX_APP_SERVER_TIMEOUT_MS";yi=class{constructor(e={}){this.deps=e}deps;name="codex";backendKind="codex-app-server";supportedPermissionModes=["default","plan","bypassPermissions"];capabilities={nativePendingInput:!0,nativePlanArtifacts:!0,worktrees:"native-restore"};launch(e){let r={command:process.env[sP]?.trim()||"codex",args:vm(process.env[aP]),requestTimeoutMs:Number.parseInt(process.env[dP]??String(Tr),10)||Tr},n=this.deps.createClient?.(r)??new gi(r.command,r.args,r.requestTimeoutMs),o=new nn,i=e.resumeSessionId,s,a=e.backendRef?.worktreePath,d=e.backendRef?.worktreeId,l=e.permissionMode??"default",m,g=0,y="",f=[],k,A=new Map,b=new Set,w=D=>{let N=D?.trim();if(!N)return;let K=e.originalWorkdir?.trim()||e.cwd.trim();e.worktreeStrategy&&e.worktreeStrategy!=="off"&&N!==K&&Pm(N)&&(a=N,d=wm(N))},C=()=>{i&&o.enqueue(di({kind:"codex-app-server",conversationId:i,...s?{runId:s}:{},...d?{worktreeId:d}:{},...a?{worktreePath:a}:{}}))};n.setNotificationHandler(async(D,N)=>{let K=D.trim().toLowerCase(),ue=jn(N),ct=Gn(N);if(ue.threadId&&i&&ue.threadId!==i)return;if(ue.threadId&&(i=ue.threadId),ue.runId&&(s=ue.runId),w(ct.cwd),(ue.threadId||ue.runId||ct.cwd)&&C(),K==="serverrequest/resolved"){m&&(o.enqueue(on(m.requestId)),m=void 0);return}if(K==="turn/plan/updated"){let Te=bm(N);y=Te.explanation??y,Te.steps.length>0&&(f=Te.steps);return}if(K==="item/plan/delta"){let Te=xm(N);if(Te.itemId&&Te.delta){let Gt=A.get(Te.itemId)??"";A.set(Te.itemId,`${Gt}${Te.delta}`)}return}if(K==="item/completed"){let Te=Am(N);if(Te.text?.trim()){let Gt={explanation:y||void 0,steps:f,markdown:Te.text.trim()};o.enqueue(pi(Gt,!0));return}}let ae=Im(K,N);if(ae.mode==="delta"&&ae.text){ae.itemId&&b.add(ae.itemId),o.enqueue(qn(ae.text));return}ae.mode==="snapshot"&&ae.text&&(!ae.itemId||!b.has(ae.itemId))&&o.enqueue(qn(ae.text)),(K==="turn/completed"||K==="turn/failed"||K==="turn/cancelled")&&k&&(k.method=D,k.params=N,k.resolve())}),n.setRequestHandler(async(D,N)=>{if(!Om(D))return{};let K=jn(N),ue=Gn(N);if(K.threadId&&i&&K.threadId!==i)return{};K.threadId&&(i=K.threadId),K.runId&&(s=K.runId),w(ue.cwd),(K.threadId||K.runId||ue.cwd)&&C();let ct=K.requestId??`${i??"codex"}-${Date.now().toString(36)}`,ae=Em(D,ct,N),Te=D.trim().toLowerCase(),Gt=ae.options,po=ae.actions??[],Ug=await new Promise(Kg=>{m={requestId:ct,methodLower:Te,state:ae,options:Gt,actions:po,resolveResponse:Kg},o.enqueue(ui(ae))});return m=void 0,o.enqueue(on(ct)),Ug});let I=async()=>{await n.connect(),await n.request("initialize",{protocolVersion:iP,clientInfo:{name:"openclaw-code-agent",version:"3.1.0"},capabilities:{experimentalApi:!0}},Tr),await n.notify("initialized",{})},R=async()=>{let D=Td(l,e.codexApprovalPolicy);if(i){let ue=await Hn({client:n,methods:["thread/resume"],payloads:Cm({threadId:i,model:e.model,reasoningEffort:e.reasoningEffort,approvalPolicy:D.approvalPolicy,sandbox:D.sandbox}),timeoutMs:Tr}),ct=Gn(ue);i=ct.threadId??i,w(ct.cwd),C();return}let N=await Hn({client:n,methods:["thread/start","thread/new"],payloads:Mm({cwd:e.originalWorkdir?.trim()||e.cwd,model:e.model,approvalPolicy:D.approvalPolicy,sandbox:D.sandbox}),timeoutMs:Tr}),K=Gn(N);if(i=K.threadId,!i)throw new Error("Codex App Server did not return a thread id.");w(K.cwd),C()},O=async D=>{await R(),o.enqueue(li()),g+=1,y="",f=[],A.clear(),b.clear();let N="",K,ue,ct=new Promise(ae=>{ue=ae});k={resolve:ue};try{let ae=Td(l,e.codexApprovalPolicy),Te=await Hn({client:n,methods:["turn/start"],payloads:_m({threadId:i,prompt:D,model:e.model,reasoningEffort:e.reasoningEffort,systemPrompt:e.systemPrompt,permissionMode:l,approvalPolicy:ae.approvalPolicy,sandbox:ae.sandbox}),timeoutMs:Tr}),Gt=jn(Te);Gt.runId&&(s=Gt.runId,C()),await ct,N=k?.method??"turn/failed",K=k?.params;let po=Rm(N,K);o.enqueue(Rr({success:po==="completed",outcome:po,duration_ms:0,total_cost_usd:0,num_turns:g,result:Tm(N,K),session_id:i}))}catch(ae){o.enqueue(Rr({success:!1,duration_ms:0,total_cost_usd:0,num_turns:g,result:Nm(ae),session_id:i??""}))}finally{k=void 0}},Le=async D=>m?(m.methodLower.includes("requestapproval")?m.resolveResponse({decision:D.trim()||"decline"}):m.resolveResponse({text:D.trim()}),!0):!1,Sl=async D=>{let N=m;if(!N)return!1;let K=N.actions[D];if(K?.kind==="approval")return N.resolveResponse({decision:K.responseDecision,...K.proposedExecpolicyAmendment?{proposedExecpolicyAmendment:K.proposedExecpolicyAmendment}:{}}),!0;let ue=N.options[D];return ue?(N.methodLower.includes("requestapproval")?N.resolveResponse({decision:ue}):N.resolveResponse({option:ue,index:D}),!0):!1},yl=typeof e.prompt=="string"?(async function*(){yield{type:"user",text:e.prompt,session_id:e.resumeSessionId??""}})():e.prompt;return(async()=>{try{await I();for await(let D of yl){let N=lP(D).trim();!N||await Le(N)||await O(N)}}catch(D){o.enqueue(Rr({success:!1,duration_ms:0,total_cost_usd:0,num_turns:g,result:Nm(D),session_id:i??e.resumeSessionId??""}))}finally{await n.close().catch(()=>{}),o.close()}})(),{messages:o.messages(),async setPermissionMode(D){l=D,o.enqueue(ci(D))},async submitPendingInputOption(D){return Sl(D)},async submitPendingInputText(D){return Le(D)},async interrupt(){!i||!s||await Hn({client:n,methods:["turn/interrupt"],payloads:$m({threadId:i,turnId:s}),timeoutMs:Tr}).catch(()=>{})}}}buildUserMessage(e,r){return{type:"user",text:e,session_id:r}}}});function Lm(t){Md.set(t.name,t)}function zn(t){let e=Md.get(t);if(!e)throw new Error(`Unknown agent harness: "${t}". Available: ${[...Md.keys()].join(", ")}`);return e}function Wm(){return zn(Pe())}var Md,Cd=u(()=>{ym();Fm();Re();Md=new Map;Lm(new mi);Lm(new yi)});function $(t){return t.backendRef?.conversationId??t.harnessSessionId}function re(t){return t.id??t.sessionId??t.name??$(t)??t.harnessSessionId}function uP(t){return t.harnessSessionId}function et(t){let e=[re(t),$(t),uP(t)].filter(r=>!!r);return[...new Set(e)]}function _d(t){return t.harnessName??t.persistedHarness??Pe()}function ki(t){if(t.backendRef?.kind==="codex-app-server")return"native-restore";try{return zn(_d(t)).capabilities.worktrees}catch{return"plugin-managed"}}function $d(t){return t==="native-execution"||t==="native-restore"}function Bm(t){return t==="native-restore"}function pP(t){return!!(t.backendRef?.worktreePath||t.backendRef?.worktreeId)}function Ne(t){return $d(ki(t))&&pP(t)}var ke=u(()=>{Re();Cd()});import{execFileSync as xe}from"child_process";import*as Ri from"fs";import{tmpdir as TP}from"os";import{dirname as tf,join as MP}from"path";function CP(t){try{return xe("git",["rev-parse","--show-toplevel"],{cwd:t,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{return}}function Ti(t){if(process.env.OPENCLAW_WORKTREE_DIR)return process.env.OPENCLAW_WORKTREE_DIR;if(_.worktreeDir)return _.worktreeDir;if(t){let e=CP(t);if(e)return MP(e,".worktrees")}return TP()}function rf(t){return t.replace(/[^a-zA-Z0-9._-]/g,"-").replace(/\.{2,}/g,"-").replace(/^[-.]|[-.]$/g,"").slice(0,100)||"session"}function Mi(t){try{let e=xe("git",["-C",t,"rev-parse","--git-common-dir"],{cwd:t,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return e&&e.endsWith("/.git")?tf(e):void 0}catch{return}}function _P(){if(bi!==void 0)return bi;try{return xe("git",["--version"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),bi=!0,!0}catch{return bi=!1,!1}}function sr(){if(Ai!==void 0)return Ai;try{return xe("gh",["--version"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),Ai=!0,!0}catch{return Ai=!1,!1}}function Dd(t){if(!_P())return!1;try{return xe("git",["rev-parse","--git-dir"],{cwd:t,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function nf(t){try{let e=EP(t);if(!e)return console.warn(`[worktree] Failed to resolve free-space probe path for ${Ti(t)}`),!0;let r=Ri.statfsSync(e),n=r.bavail*r.bsize;return OP(n)}catch(e){return console.warn(`[worktree] Failed to check free space: ${e instanceof Error?e.message:String(e)}`),!0}}function Yn(t,e){try{return xe("git",["-C",t,"rev-parse","--verify",e],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function $P(t){let e=t;for(;;){if(Ri.existsSync(e))return e;let r=tf(e);if(r===e)return;e=r}}function EP(t){return $P(Ti(t))}function OP(t){return t>=104857600}function ar(t){let e=process.env.OPENCLAW_WORKTREE_BASE_BRANCH?.trim();if(e)return e;try{let n=xe("git",["-C",t,"rev-parse","--abbrev-ref","origin/HEAD"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().replace(/^origin\//,"");if(n)return n}catch{}try{return xe("git",["-C",t,"rev-parse","--verify","main"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),"main"}catch{}try{return xe("git",["-C",t,"rev-parse","--verify","master"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),"master"}catch{return"main"}}function Ci(t){try{let r=xe("git",["-C",t,"rev-parse","--abbrev-ref","HEAD"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(r==="HEAD"){console.warn(`[worktree] Worktree ${t} is in detached HEAD state \u2014 cannot determine branch name`);return}return r||void 0}catch{return}}function Nd(t,e,r){try{let n=xe("git",["-C",t,"rev-list","--count",`${r}..${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});return parseInt(n.trim(),10)>0}catch{return!1}}function of(t,e,r){try{let n=xe("git",["-C",t,"rev-list","--left-right","--count",`${e}...${r}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),[o,i]=n.split(/\s+/);return{ahead:parseInt(o??"0",10)||0,behind:parseInt(i??"0",10)||0}}catch{return}}function sf(t,e,r){try{return xe("git",["-C",t,"merge-base","--is-ancestor",e,r],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function af(t,e,r){try{let n=xe("git",["-C",t,"merge-tree","--write-tree",r,e],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),o=xe("git",["-C",t,"rev-parse",`${r}^{tree}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return!!n&&n===o}catch{return!1}}function Ot(t,e){try{return xe("git",["-C",t,"branch","-D",e],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(r){return console.warn(`[worktree] Failed to delete branch ${e}: ${r instanceof Error?r.message:String(r)}`),!1}}function df(t,e){if(e)return e;let r;try{r=xe("git",["-C",t,"remote","get-url","origin"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{}try{let n=xe("git",["-C",t,"remote","get-url","upstream"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(n&&n!==r){let o=n.match(/[:/]([^/]+\/[^/]+?)(?:\.git)?$/);if(o)return o[1]}}catch{}}var bi,Ai,Xn=u(()=>{Re()});import{execFileSync as Zn}from"child_process";import{existsSync as DP,mkdirSync as lf,rmSync as Fd}from"fs";function NP(t,e){return!!(t&&typeof t=="object"&&"code"in t&&t.code===e)}function Ld(t,e,r={}){let n=rf(e),o=Ti(t);lf(o,{recursive:!0});let i=r.allowExistingBranch===!0,s,a,d=10,l=!1;for(let g=0;g<d;g++){let y=g===0?"":`-${Math.random().toString(16).slice(2,6)}`,f=`${o}/openclaw-worktree-${n}${y}`,k=`agent/${n}${y}`;if(!i&&Yn(t,k))continue;let A=!1;do{A=!1;try{lf(f,{recursive:!1}),s=f,a=k;break}catch(b){if(NP(b,"EEXIST")){if(i&&g===0&&!l)try{Fd(f,{recursive:!0,force:!0}),l=!0,A=!0}catch(w){throw new Error(`Failed to recreate existing worktree branch ${k}: could not clear blocked path ${f}: ${w instanceof Error?w.message:String(w)}`)}else if(i&&g===0)throw new Error(`Failed to recreate existing worktree branch ${k}: path ${f} remains blocked after one cleanup attempt`);continue}throw b}}while(A);if(s&&a)break}if(!s||!a)throw new Error(`Failed to create unique worktree directory and branch after ${d} attempts`);let m=Yn(t,a);try{m?Zn("git",["-C",t,"worktree","add",s,a],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}):Zn("git",["-C",t,"worktree","add","-b",a,s],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(g){try{Fd(s,{recursive:!0,force:!0})}catch{}throw g}return s}function FP(t){if(!DP(t))return[];try{let e=Zn("git",["-C",t,"status","--porcelain","--untracked-files=all"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return e?e.split(`
5
- `).map(r=>r.trim()).filter(Boolean):[]}catch{return[]}}function tt(t,e,r={}){let n=r.destructive===!0,o=FP(e);if(o.length>0&&!n)return console.warn(`[worktree] Refusing implicit cleanup for dirty worktree ${e}: ${o[0]}`),!1;try{return Zn("git",["-C",t,"worktree","remove",...n?["--force"]:[],e],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(i){if(console.warn(`[worktree] git worktree remove failed for ${e}: ${i instanceof Error?i.message:String(i)}`),!n)return!1;try{return Fd(e,{recursive:!0,force:!0}),console.info(`[worktree] Fallback rmSync succeeded for ${e}`),!0}catch(s){return console.error(`[worktree] Both git worktree remove and rmSync failed for ${e}: ${s instanceof Error?s.message:String(s)}`),!1}}}function _i(t){try{Zn("git",["-C",t,"worktree","prune"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{}}var uf=u(()=>{Xn()});import{execFileSync as ne}from"child_process";import{existsSync as LP}from"fs";function Cr(t,e,r){try{let n=ne("git",["-C",t,"rev-list","--count",`${r}..${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),o=parseInt(n.trim(),10),s=ne("git",["-C",t,"diff","--shortstat",`${r}...${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),a=0,d=0,l=0,m=s.match(/(\d+)\s+files?\s+changed/);m&&(a=parseInt(m[1],10));let g=s.match(/(\d+)\s+insertions?\(/);g&&(d=parseInt(g[1],10));let y=s.match(/(\d+)\s+deletions?\(/);y&&(l=parseInt(y[1],10));let k=ne("git",["-C",t,"diff","--name-only","--diff-filter=ACMR",`${r}...${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().split(`
1
+ var Vg=Object.defineProperty;var u=(t,e)=>()=>(t&&(e=t(t=0)),e);var co=(t,e)=>{for(var r in e)Vg(t,r,{get:e[r],enumerable:!0})};var Me={};co(Me,{HasPropertyKey:()=>mo,IsArray:()=>pe,IsAsyncIterator:()=>Ds,IsBigInt:()=>pn,IsBoolean:()=>Dt,IsDate:()=>pr,IsFunction:()=>Ns,IsIterator:()=>Fs,IsNull:()=>Ls,IsNumber:()=>Ge,IsObject:()=>j,IsRegExp:()=>cn,IsString:()=>Q,IsSymbol:()=>Ws,IsUint8Array:()=>Nt,IsUndefined:()=>ce});function mo(t,e){return e in t}function Ds(t){return j(t)&&!pe(t)&&!Nt(t)&&Symbol.asyncIterator in t}function pe(t){return Array.isArray(t)}function pn(t){return typeof t=="bigint"}function Dt(t){return typeof t=="boolean"}function pr(t){return t instanceof globalThis.Date}function Ns(t){return typeof t=="function"}function Fs(t){return j(t)&&!pe(t)&&!Nt(t)&&Symbol.iterator in t}function Ls(t){return t===null}function Ge(t){return typeof t=="number"}function j(t){return typeof t=="object"&&t!==null}function cn(t){return t instanceof globalThis.RegExp}function Q(t){return typeof t=="string"}function Ws(t){return typeof t=="symbol"}function Nt(t){return t instanceof globalThis.Uint8Array}function ce(t){return t===void 0}var De=u(()=>{});function qg(t){return t.map(e=>fo(e))}function jg(t){return new Date(t.getTime())}function Gg(t){return new Uint8Array(t)}function Hg(t){return new RegExp(t.source,t.flags)}function zg(t){let e={};for(let r of Object.getOwnPropertyNames(t))e[r]=fo(t[r]);for(let r of Object.getOwnPropertySymbols(t))e[r]=fo(t[r]);return e}function fo(t){return pe(t)?qg(t):pr(t)?jg(t):Nt(t)?Gg(t):cn(t)?Hg(t):j(t)?zg(t):t}function ee(t){return fo(t)}var We=u(()=>{De()});function Or(t,e){return e===void 0?ee(t):ee({...e,...t})}var go=u(()=>{We()});var Bs=u(()=>{go();We()});function kl(t){return t!==null&&typeof t=="object"}function vl(t){return globalThis.Array.isArray(t)&&!globalThis.ArrayBuffer.isView(t)}function Pl(t){return t===void 0}function wl(t){return typeof t=="number"}var Il=u(()=>{});var xl=u(()=>{Il()});var ho,bl=u(()=>{xl();(function(t){t.InstanceMode="default",t.ExactOptionalPropertyTypes=!1,t.AllowArrayObject=!1,t.AllowNaN=!1,t.AllowNullVoid=!1;function e(s,a){return t.ExactOptionalPropertyTypes?a in s:s[a]!==void 0}t.IsExactOptionalProperty=e;function r(s){let a=kl(s);return t.AllowArrayObject?a:a&&!vl(s)}t.IsObjectLike=r;function n(s){return r(s)&&!(s instanceof Date)&&!(s instanceof Uint8Array)}t.IsRecordLike=n;function o(s){return t.AllowNaN?wl(s):Number.isFinite(s)}t.IsNumberLike=o;function i(s){let a=Pl(s);return t.AllowNullVoid?a||s===null:a}t.IsVoidLike=i})(ho||(ho={}))});function Qg(t){return globalThis.Object.freeze(t).map(e=>mn(e))}function Jg(t){let e={};for(let r of Object.getOwnPropertyNames(t))e[r]=mn(t[r]);for(let r of Object.getOwnPropertySymbols(t))e[r]=mn(t[r]);return globalThis.Object.freeze(e)}function mn(t){return pe(t)?Qg(t):pr(t)?t:Nt(t)?t:cn(t)?t:j(t)?Jg(t):t}var Al=u(()=>{De()});function h(t,e){let r=e!==void 0?{...e,...t}:t;switch(ho.InstanceMode){case"freeze":return mn(r);case"clone":return ee(r);default:return r}}var T=u(()=>{bl();Al();We()});var Ft=u(()=>{T()});var we,Rl=u(()=>{we=class extends Error{constructor(e){super(e)}}});var At=u(()=>{Rl()});var ge,mt,be,rt,P,fn=u(()=>{ge=Symbol.for("TypeBox.Transform"),mt=Symbol.for("TypeBox.Readonly"),be=Symbol.for("TypeBox.Optional"),rt=Symbol.for("TypeBox.Hint"),P=Symbol.for("TypeBox.Kind")});var M=u(()=>{fn()});function Dr(t){return j(t)&&t[mt]==="Readonly"}function Be(t){return j(t)&&t[be]==="Optional"}function Us(t){return F(t,"Any")}function Ks(t){return F(t,"Argument")}function ft(t){return F(t,"Array")}function cr(t){return F(t,"AsyncIterator")}function mr(t){return F(t,"BigInt")}function Lt(t){return F(t,"Boolean")}function gt(t){return F(t,"Computed")}function ht(t){return F(t,"Constructor")}function Yg(t){return F(t,"Date")}function St(t){return F(t,"Function")}function yt(t){return F(t,"Integer")}function ie(t){return F(t,"Intersect")}function fr(t){return F(t,"Iterator")}function F(t,e){return j(t)&&P in t&&t[P]===e}function So(t){return Dt(t)||Ge(t)||Q(t)}function He(t){return F(t,"Literal")}function ze(t){return F(t,"MappedKey")}function te(t){return F(t,"MappedResult")}function Ht(t){return F(t,"Never")}function Xg(t){return F(t,"Not")}function gn(t){return F(t,"Null")}function kt(t){return F(t,"Number")}function me(t){return F(t,"Object")}function gr(t){return F(t,"Promise")}function hr(t){return F(t,"Record")}function de(t){return F(t,"Ref")}function Vs(t){return F(t,"RegExp")}function Wt(t){return F(t,"String")}function hn(t){return F(t,"Symbol")}function Qe(t){return F(t,"TemplateLiteral")}function Zg(t){return F(t,"This")}function zt(t){return j(t)&&ge in t}function Je(t){return F(t,"Tuple")}function Sn(t){return F(t,"Undefined")}function L(t){return F(t,"Union")}function eh(t){return F(t,"Uint8Array")}function th(t){return F(t,"Unknown")}function rh(t){return F(t,"Unsafe")}function nh(t){return F(t,"Void")}function oh(t){return j(t)&&P in t&&Q(t[P])}function Ye(t){return Us(t)||Ks(t)||ft(t)||Lt(t)||mr(t)||cr(t)||gt(t)||ht(t)||Yg(t)||St(t)||yt(t)||ie(t)||fr(t)||He(t)||ze(t)||te(t)||Ht(t)||Xg(t)||gn(t)||kt(t)||me(t)||gr(t)||hr(t)||de(t)||Vs(t)||Wt(t)||hn(t)||Qe(t)||Zg(t)||Je(t)||Sn(t)||L(t)||eh(t)||th(t)||rh(t)||nh(t)||oh(t)}var B=u(()=>{De();M()});var c={};co(c,{IsAny:()=>_l,IsArgument:()=>$l,IsArray:()=>El,IsAsyncIterator:()=>Ol,IsBigInt:()=>Dl,IsBoolean:()=>Nl,IsComputed:()=>Fl,IsConstructor:()=>Ll,IsDate:()=>Wl,IsFunction:()=>Bl,IsImport:()=>uh,IsInteger:()=>Ul,IsIntersect:()=>Kl,IsIterator:()=>Vl,IsKind:()=>gu,IsKindOf:()=>E,IsLiteral:()=>kn,IsLiteralBoolean:()=>ph,IsLiteralNumber:()=>jl,IsLiteralString:()=>ql,IsLiteralValue:()=>Gl,IsMappedKey:()=>Hl,IsMappedResult:()=>zl,IsNever:()=>Ql,IsNot:()=>Jl,IsNull:()=>Yl,IsNumber:()=>Xl,IsObject:()=>Zl,IsOptional:()=>lh,IsPromise:()=>eu,IsProperties:()=>yo,IsReadonly:()=>dh,IsRecord:()=>tu,IsRecursive:()=>ch,IsRef:()=>ru,IsRegExp:()=>nu,IsSchema:()=>Ie,IsString:()=>ou,IsSymbol:()=>iu,IsTemplateLiteral:()=>su,IsThis:()=>au,IsTransform:()=>du,IsTuple:()=>lu,IsUint8Array:()=>pu,IsUndefined:()=>uu,IsUnion:()=>Hs,IsUnionLiteral:()=>mh,IsUnknown:()=>cu,IsUnsafe:()=>mu,IsVoid:()=>fu,TypeGuardUnknownTypeError:()=>qs});function Tl(t){try{return new RegExp(t),!0}catch{return!1}}function js(t){if(!Q(t))return!1;for(let e=0;e<t.length;e++){let r=t.charCodeAt(e);if(r>=7&&r<=13||r===27||r===127)return!1}return!0}function Ml(t){return Gs(t)||Ie(t)}function yn(t){return ce(t)||pn(t)}function J(t){return ce(t)||Ge(t)}function Gs(t){return ce(t)||Dt(t)}function G(t){return ce(t)||Q(t)}function sh(t){return ce(t)||Q(t)&&js(t)&&Tl(t)}function ah(t){return ce(t)||Q(t)&&js(t)}function Cl(t){return ce(t)||Ie(t)}function dh(t){return j(t)&&t[mt]==="Readonly"}function lh(t){return j(t)&&t[be]==="Optional"}function _l(t){return E(t,"Any")&&G(t.$id)}function $l(t){return E(t,"Argument")&&Ge(t.index)}function El(t){return E(t,"Array")&&t.type==="array"&&G(t.$id)&&Ie(t.items)&&J(t.minItems)&&J(t.maxItems)&&Gs(t.uniqueItems)&&Cl(t.contains)&&J(t.minContains)&&J(t.maxContains)}function Ol(t){return E(t,"AsyncIterator")&&t.type==="AsyncIterator"&&G(t.$id)&&Ie(t.items)}function Dl(t){return E(t,"BigInt")&&t.type==="bigint"&&G(t.$id)&&yn(t.exclusiveMaximum)&&yn(t.exclusiveMinimum)&&yn(t.maximum)&&yn(t.minimum)&&yn(t.multipleOf)}function Nl(t){return E(t,"Boolean")&&t.type==="boolean"&&G(t.$id)}function Fl(t){return E(t,"Computed")&&Q(t.target)&&pe(t.parameters)&&t.parameters.every(e=>Ie(e))}function Ll(t){return E(t,"Constructor")&&t.type==="Constructor"&&G(t.$id)&&pe(t.parameters)&&t.parameters.every(e=>Ie(e))&&Ie(t.returns)}function Wl(t){return E(t,"Date")&&t.type==="Date"&&G(t.$id)&&J(t.exclusiveMaximumTimestamp)&&J(t.exclusiveMinimumTimestamp)&&J(t.maximumTimestamp)&&J(t.minimumTimestamp)&&J(t.multipleOfTimestamp)}function Bl(t){return E(t,"Function")&&t.type==="Function"&&G(t.$id)&&pe(t.parameters)&&t.parameters.every(e=>Ie(e))&&Ie(t.returns)}function uh(t){return E(t,"Import")&&mo(t,"$defs")&&j(t.$defs)&&yo(t.$defs)&&mo(t,"$ref")&&Q(t.$ref)&&t.$ref in t.$defs}function Ul(t){return E(t,"Integer")&&t.type==="integer"&&G(t.$id)&&J(t.exclusiveMaximum)&&J(t.exclusiveMinimum)&&J(t.maximum)&&J(t.minimum)&&J(t.multipleOf)}function yo(t){return j(t)&&Object.entries(t).every(([e,r])=>js(e)&&Ie(r))}function Kl(t){return E(t,"Intersect")&&!(Q(t.type)&&t.type!=="object")&&pe(t.allOf)&&t.allOf.every(e=>Ie(e)&&!du(e))&&G(t.type)&&(Gs(t.unevaluatedProperties)||Cl(t.unevaluatedProperties))&&G(t.$id)}function Vl(t){return E(t,"Iterator")&&t.type==="Iterator"&&G(t.$id)&&Ie(t.items)}function E(t,e){return j(t)&&P in t&&t[P]===e}function ql(t){return kn(t)&&Q(t.const)}function jl(t){return kn(t)&&Ge(t.const)}function ph(t){return kn(t)&&Dt(t.const)}function kn(t){return E(t,"Literal")&&G(t.$id)&&Gl(t.const)}function Gl(t){return Dt(t)||Ge(t)||Q(t)}function Hl(t){return E(t,"MappedKey")&&pe(t.keys)&&t.keys.every(e=>Ge(e)||Q(e))}function zl(t){return E(t,"MappedResult")&&yo(t.properties)}function Ql(t){return E(t,"Never")&&j(t.not)&&Object.getOwnPropertyNames(t.not).length===0}function Jl(t){return E(t,"Not")&&Ie(t.not)}function Yl(t){return E(t,"Null")&&t.type==="null"&&G(t.$id)}function Xl(t){return E(t,"Number")&&t.type==="number"&&G(t.$id)&&J(t.exclusiveMaximum)&&J(t.exclusiveMinimum)&&J(t.maximum)&&J(t.minimum)&&J(t.multipleOf)}function Zl(t){return E(t,"Object")&&t.type==="object"&&G(t.$id)&&yo(t.properties)&&Ml(t.additionalProperties)&&J(t.minProperties)&&J(t.maxProperties)}function eu(t){return E(t,"Promise")&&t.type==="Promise"&&G(t.$id)&&Ie(t.item)}function tu(t){return E(t,"Record")&&t.type==="object"&&G(t.$id)&&Ml(t.additionalProperties)&&j(t.patternProperties)&&(e=>{let r=Object.getOwnPropertyNames(e.patternProperties);return r.length===1&&Tl(r[0])&&j(e.patternProperties)&&Ie(e.patternProperties[r[0]])})(t)}function ch(t){return j(t)&&rt in t&&t[rt]==="Recursive"}function ru(t){return E(t,"Ref")&&G(t.$id)&&Q(t.$ref)}function nu(t){return E(t,"RegExp")&&G(t.$id)&&Q(t.source)&&Q(t.flags)&&J(t.maxLength)&&J(t.minLength)}function ou(t){return E(t,"String")&&t.type==="string"&&G(t.$id)&&J(t.minLength)&&J(t.maxLength)&&sh(t.pattern)&&ah(t.format)}function iu(t){return E(t,"Symbol")&&t.type==="symbol"&&G(t.$id)}function su(t){return E(t,"TemplateLiteral")&&t.type==="string"&&Q(t.pattern)&&t.pattern[0]==="^"&&t.pattern[t.pattern.length-1]==="$"}function au(t){return E(t,"This")&&G(t.$id)&&Q(t.$ref)}function du(t){return j(t)&&ge in t}function lu(t){return E(t,"Tuple")&&t.type==="array"&&G(t.$id)&&Ge(t.minItems)&&Ge(t.maxItems)&&t.minItems===t.maxItems&&(ce(t.items)&&ce(t.additionalItems)&&t.minItems===0||pe(t.items)&&t.items.every(e=>Ie(e)))}function uu(t){return E(t,"Undefined")&&t.type==="undefined"&&G(t.$id)}function mh(t){return Hs(t)&&t.anyOf.every(e=>ql(e)||jl(e))}function Hs(t){return E(t,"Union")&&G(t.$id)&&j(t)&&pe(t.anyOf)&&t.anyOf.every(e=>Ie(e))}function pu(t){return E(t,"Uint8Array")&&t.type==="Uint8Array"&&G(t.$id)&&J(t.minByteLength)&&J(t.maxByteLength)}function cu(t){return E(t,"Unknown")&&G(t.$id)}function mu(t){return E(t,"Unsafe")}function fu(t){return E(t,"Void")&&t.type==="void"&&G(t.$id)}function gu(t){return j(t)&&P in t&&Q(t[P])&&!ih.includes(t[P])}function Ie(t){return j(t)&&(_l(t)||$l(t)||El(t)||Nl(t)||Dl(t)||Ol(t)||Fl(t)||Ll(t)||Wl(t)||Bl(t)||Ul(t)||Kl(t)||Vl(t)||kn(t)||Hl(t)||zl(t)||Ql(t)||Jl(t)||Yl(t)||Xl(t)||Zl(t)||eu(t)||tu(t)||ru(t)||nu(t)||ou(t)||iu(t)||su(t)||au(t)||lu(t)||uu(t)||Hs(t)||pu(t)||cu(t)||mu(t)||fu(t)||gu(t))}var qs,ih,hu=u(()=>{De();M();At();qs=class extends we{},ih=["Argument","Any","Array","AsyncIterator","BigInt","Boolean","Computed","Constructor","Date","Enum","Function","Integer","Intersect","Iterator","Literal","MappedKey","MappedResult","Not","Null","Number","Object","Promise","Record","Ref","RegExp","String","Symbol","TemplateLiteral","This","Tuple","Undefined","Union","Uint8Array","Unknown","Void"]});var zs=u(()=>{B();hu();De()});var Su=u(()=>{});var yu=u(()=>{Su()});var Qs,vn,Js,fh,gb,Qt,Jt,ku,vu=u(()=>{Qs="(true|false)",vn="(0|[1-9][0-9]*)",Js="(.*)",fh="(?!.*)",gb=`^${Qs}$`,Qt=`^${vn}$`,Jt=`^${Js}$`,ku=`^${fh}$`});var Pn=u(()=>{vu()});var Pu=u(()=>{});var wu=u(()=>{});var Iu=u(()=>{Pu();wu()});function xu(t,e){return t.includes(e)}function bu(t){return[...new Set(t)]}function Sh(t,e){return t.filter(r=>e.includes(r))}function yh(t,e){return t.reduce((r,n)=>Sh(r,n),e)}function Au(t){return t.length===1?t[0]:t.length>1?yh(t.slice(1),t[0]):[]}function Ru(t){let e=[];for(let r of t)e.push(...r);return e}var Tu=u(()=>{});var wn=u(()=>{Tu()});function Yt(t){return h({[P]:"Any"},t)}var Mu=u(()=>{Ft();M()});var In=u(()=>{Mu()});function Nr(t,e){return h({[P]:"Array",type:"array",items:t},e)}var Cu=u(()=>{T();M()});var xn=u(()=>{Cu()});function _u(t){return h({[P]:"Argument",index:t})}var $u=u(()=>{T();M()});var Ys=u(()=>{$u()});function Fr(t,e){return h({[P]:"AsyncIterator",type:"AsyncIterator",items:t},e)}var Eu=u(()=>{M();T()});var bn=u(()=>{Eu()});function Z(t,e,r){return h({[P]:"Computed",target:t,parameters:e},r)}var Ou=u(()=>{Ft();fn()});var Xt=u(()=>{Ou()});function kh(t,e){let{[e]:r,...n}=t;return n}function se(t,e){return e.reduce((r,n)=>kh(r,n),t)}var ko=u(()=>{});var Ut=u(()=>{ko()});function W(t){return h({[P]:"Never",not:{}},t)}var Du=u(()=>{T();M()});var Ae=u(()=>{Du()});var Nu=u(()=>{});function U(t){return h({[P]:"MappedResult",properties:t})}var Xs=u(()=>{T();M()});function Lr(t,e,r){return h({[P]:"Constructor",type:"Constructor",parameters:t,returns:e},r)}var Fu=u(()=>{T();M()});var An=u(()=>{Fu()});function Rt(t,e,r){return h({[P]:"Function",type:"Function",parameters:t,returns:e},r)}var Lu=u(()=>{T();M()});var Sr=u(()=>{Lu()});function Rn(t,e){return h({[P]:"Union",anyOf:t},e)}var Zs=u(()=>{T();M()});function vh(t){return t.some(e=>Be(e))}function Wu(t){return t.map(e=>Be(e)?Ph(e):e)}function Ph(t){return se(t,[be])}function wh(t,e){return vh(t)?Ce(Rn(Wu(t),e)):Rn(Wu(t),e)}function Tt(t,e){return t.length===1?h(t[0],e):t.length===0?W(e):wh(t,e)}var Bu=u(()=>{T();M();Ut();Ae();Kt();Zs();B()});var Uu=u(()=>{});function q(t,e){return t.length===0?W(e):t.length===1?h(t[0],e):Rn(t,e)}var Ku=u(()=>{Ae();T();Zs()});var he=u(()=>{Bu();Uu();Ku()});function Ih(t){return t.replace(/\\\$/g,"$").replace(/\\\*/g,"*").replace(/\\\^/g,"^").replace(/\\\|/g,"|").replace(/\\\(/g,"(").replace(/\\\)/g,")")}function ea(t,e,r){return t[e]===r&&t.charCodeAt(e-1)!==92}function Vt(t,e){return ea(t,e,"(")}function Tn(t,e){return ea(t,e,")")}function Vu(t,e){return ea(t,e,"|")}function xh(t){if(!(Vt(t,0)&&Tn(t,t.length-1)))return!1;let e=0;for(let r=0;r<t.length;r++)if(Vt(t,r)&&(e+=1),Tn(t,r)&&(e-=1),e===0&&r!==t.length-1)return!1;return!0}function bh(t){return t.slice(1,t.length-1)}function Ah(t){let e=0;for(let r=0;r<t.length;r++)if(Vt(t,r)&&(e+=1),Tn(t,r)&&(e-=1),Vu(t,r)&&e===0)return!0;return!1}function Rh(t){for(let e=0;e<t.length;e++)if(Vt(t,e))return!0;return!1}function Th(t){let[e,r]=[0,0],n=[];for(let i=0;i<t.length;i++)if(Vt(t,i)&&(e+=1),Tn(t,i)&&(e-=1),Vu(t,i)&&e===0){let s=t.slice(r,i);s.length>0&&n.push(Wr(s)),r=i+1}let o=t.slice(r);return o.length>0&&n.push(Wr(o)),n.length===0?{type:"const",const:""}:n.length===1?n[0]:{type:"or",expr:n}}function Mh(t){function e(o,i){if(!Vt(o,i))throw new vo("TemplateLiteralParser: Index must point to open parens");let s=0;for(let a=i;a<o.length;a++)if(Vt(o,a)&&(s+=1),Tn(o,a)&&(s-=1),s===0)return[i,a];throw new vo("TemplateLiteralParser: Unclosed group parens in expression")}function r(o,i){for(let s=i;s<o.length;s++)if(Vt(o,s))return[i,s];return[i,o.length]}let n=[];for(let o=0;o<t.length;o++)if(Vt(t,o)){let[i,s]=e(t,o),a=t.slice(i,s+1);n.push(Wr(a)),o=s}else{let[i,s]=r(t,o),a=t.slice(i,s);a.length>0&&n.push(Wr(a)),o=s-1}return n.length===0?{type:"const",const:""}:n.length===1?n[0]:{type:"and",expr:n}}function Wr(t){return xh(t)?Wr(bh(t)):Ah(t)?Th(t):Rh(t)?Mh(t):{type:"const",const:Ih(t)}}function Br(t){return Wr(t.slice(1,t.length-1))}var vo,Po=u(()=>{At();vo=class extends we{}});function Ch(t){return t.type==="or"&&t.expr.length===2&&t.expr[0].type==="const"&&t.expr[0].const==="0"&&t.expr[1].type==="const"&&t.expr[1].const==="[1-9][0-9]*"}function _h(t){return t.type==="or"&&t.expr.length===2&&t.expr[0].type==="const"&&t.expr[0].const==="true"&&t.expr[1].type==="const"&&t.expr[1].const==="false"}function $h(t){return t.type==="const"&&t.const===".*"}function yr(t){return Ch(t)||$h(t)?!1:_h(t)?!0:t.type==="and"?t.expr.every(e=>yr(e)):t.type==="or"?t.expr.every(e=>yr(e)):t.type==="const"?!0:(()=>{throw new ta("Unknown expression type")})()}function qu(t){let e=Br(t.pattern);return yr(e)}var ta,ra=u(()=>{Po();At();ta=class extends we{}});function*ju(t){if(t.length===1)return yield*t[0];for(let e of t[0])for(let r of ju(t.slice(1)))yield`${e}${r}`}function*Eh(t){return yield*ju(t.expr.map(e=>[...Mn(e)]))}function*Oh(t){for(let e of t.expr)yield*Mn(e)}function*Dh(t){return yield t.const}function*Mn(t){return t.type==="and"?yield*Eh(t):t.type==="or"?yield*Oh(t):t.type==="const"?yield*Dh(t):(()=>{throw new na("Unknown expression")})()}function wo(t){let e=Br(t.pattern);return yr(e)?[...Mn(e)]:[]}var na,oa=u(()=>{ra();Po();At();na=class extends we{}});function V(t,e){return h({[P]:"Literal",const:t,type:typeof t},e)}var Gu=u(()=>{T();M()});var Ue=u(()=>{Gu()});function Io(t){return h({[P]:"Boolean",type:"boolean"},t)}var Hu=u(()=>{M();Ft()});var xo=u(()=>{Hu()});function Ur(t){return h({[P]:"BigInt",type:"bigint"},t)}var zu=u(()=>{M();Ft()});var Cn=u(()=>{zu()});function nt(t){return h({[P]:"Number",type:"number"},t)}var Qu=u(()=>{T();M()});var kr=u(()=>{Qu()});function vt(t){return h({[P]:"String",type:"string"},t)}var Ju=u(()=>{T();M()});var Kr=u(()=>{Ju()});function*Nh(t){let e=t.trim().replace(/"|'/g,"");return e==="boolean"?yield Io():e==="number"?yield nt():e==="bigint"?yield Ur():e==="string"?yield vt():yield(()=>{let r=e.split("|").map(n=>V(n.trim()));return r.length===0?W():r.length===1?r[0]:Tt(r)})()}function*Fh(t){if(t[1]!=="{"){let e=V("$"),r=ia(t.slice(1));return yield*[e,...r]}for(let e=2;e<t.length;e++)if(t[e]==="}"){let r=Nh(t.slice(2,e)),n=ia(t.slice(e+1));return yield*[...r,...n]}yield V(t)}function*ia(t){for(let e=0;e<t.length;e++)if(t[e]==="$"){let r=V(t.slice(0,e)),n=Fh(t.slice(e));return yield*[r,...n]}yield V(t)}function Yu(t){return[...ia(t)]}var sa=u(()=>{Ue();xo();Cn();kr();Kr();he();Ae()});function Lh(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Xu(t,e){return Qe(t)?t.pattern.slice(1,t.pattern.length-1):L(t)?`(${t.anyOf.map(r=>Xu(r,e)).join("|")})`:kt(t)?`${e}${vn}`:yt(t)?`${e}${vn}`:mr(t)?`${e}${vn}`:Wt(t)?`${e}${Js}`:He(t)?`${e}${Lh(t.const.toString())}`:Lt(t)?`${e}${Qs}`:(()=>{throw new aa(`Unexpected Kind '${t[P]}'`)})()}function da(t){return`^${t.map(e=>Xu(e,"")).join("")}$`}var aa,la=u(()=>{Pn();M();At();B();aa=class extends we{}});function vr(t){let r=wo(t).map(n=>V(n));return Tt(r)}var Zu=u(()=>{he();Ue();oa()});function bo(t,e){let r=Q(t)?da(Yu(t)):da(t);return h({[P]:"TemplateLiteral",type:"string",pattern:r},e)}var ep=u(()=>{T();sa();la();De();M()});var qt=u(()=>{ra();oa();sa();Po();la();Zu();ep()});function Wh(t){return wo(t).map(r=>r.toString())}function Bh(t){let e=[];for(let r of t)e.push(...Ke(r));return e}function Uh(t){return[t.toString()]}function Ke(t){return[...new Set(Qe(t)?Wh(t):L(t)?Bh(t.anyOf):He(t)?Uh(t.const):kt(t)?["[number]"]:yt(t)?["[number]"]:[])]}var Ao=u(()=>{qt();B()});function Kh(t,e,r){let n={};for(let o of Object.getOwnPropertyNames(e))n[o]=Zt(t,Ke(e[o]),r);return n}function Vh(t,e,r){return Kh(t,e.properties,r)}function tp(t,e,r){let n=Vh(t,e,r);return U(n)}var ua=u(()=>{ve();Ao();Mt()});function np(t,e){return t.map(r=>op(r,e))}function qh(t){return t.filter(e=>!Ht(e))}function jh(t,e){return Ro(qh(np(t,e)))}function Gh(t){return t.some(e=>Ht(e))?[]:t}function Hh(t,e){return Tt(Gh(np(t,e)))}function zh(t,e){return e in t?t[e]:e==="[number]"?Tt(t):W()}function Qh(t,e){return e==="[number]"?t:W()}function Jh(t,e){return e in t?t[e]:W()}function op(t,e){return ie(t)?jh(t.allOf,e):L(t)?Hh(t.anyOf,e):Je(t)?zh(t.items??[],e):ft(t)?Qh(t.items,e):me(t)?Jh(t.properties,e):W()}function pa(t,e){return e.map(r=>op(t,r))}function rp(t,e){return Tt(pa(t,e))}function Zt(t,e,r){if(de(t)||de(e)){let n="Index types using Ref parameters require both Type and Key to be of TSchema";if(!Ye(t)||!Ye(e))throw new we(n);return Z("Index",[t,e])}return te(e)?tp(t,e,r):ze(e)?ip(t,e,r):h(Ye(e)?rp(t,Ke(e)):rp(t,e),r)}var ca=u(()=>{T();At();Xt();Ae();ot();he();Ao();ma();ua();B()});function Yh(t,e,r){return{[e]:Zt(t,[e],ee(r))}}function Xh(t,e,r){return e.reduce((n,o)=>({...n,...Yh(t,o,r)}),{})}function Zh(t,e,r){return Xh(t,e.keys,r)}function ip(t,e,r){let n=Zh(t,e,r);return U(n)}var ma=u(()=>{ca();ve();We()});var Mt=u(()=>{ma();ua();Ao();ca()});function Vr(t,e){return h({[P]:"Iterator",type:"Iterator",items:t},e)}var sp=u(()=>{T();M()});var _n=u(()=>{sp()});function eS(t){return globalThis.Object.keys(t).filter(e=>!Be(t[e]))}function tS(t,e){let r=eS(t),n=r.length>0?{[P]:"Object",type:"object",required:r,properties:t}:{[P]:"Object",type:"object",properties:t};return h(n,e)}var H,ap=u(()=>{T();M();B();H=tS});var Xe=u(()=>{ap()});function To(t,e){return h({[P]:"Promise",type:"Promise",item:t},e)}var dp=u(()=>{T();M()});var Mo=u(()=>{dp()});function rS(t){return h(se(t,[mt]))}function nS(t){return h({...t,[mt]:"Readonly"})}function oS(t,e){return e===!1?rS(t):nS(t)}function Ve(t,e){let r=e??!0;return te(t)?lp(t,r):oS(t,r)}var fa=u(()=>{T();M();Ut();ga();B()});function iS(t,e){let r={};for(let n of globalThis.Object.getOwnPropertyNames(t))r[n]=Ve(t[n],e);return r}function sS(t,e){return iS(t.properties,e)}function lp(t,e){let r=sS(t,e);return U(r)}var ga=u(()=>{ve();fa()});var Pr=u(()=>{ga();fa()});function it(t,e){return h(t.length>0?{[P]:"Tuple",type:"array",items:t,additionalItems:!1,minItems:t.length,maxItems:t.length}:{[P]:"Tuple",type:"array",minItems:t.length,maxItems:t.length},e)}var up=u(()=>{T();M()});var er=u(()=>{up()});function pp(t,e){return t in e?st(t,e[t]):U(e)}function aS(t){return{[t]:V(t)}}function dS(t){let e={};for(let r of t)e[r]=V(r);return e}function lS(t,e){return xu(e,t)?aS(t):dS(e)}function uS(t,e){let r=lS(t,e);return pp(t,r)}function $n(t,e){return e.map(r=>st(t,r))}function pS(t,e){let r={};for(let n of globalThis.Object.getOwnPropertyNames(e))r[n]=st(t,e[n]);return r}function st(t,e){let r={...e};return Be(e)?Ce(st(t,se(e,[be]))):Dr(e)?Ve(st(t,se(e,[mt]))):te(e)?pp(t,e.properties):ze(e)?uS(t,e.keys):ht(e)?Lr($n(t,e.parameters),st(t,e.returns),r):St(e)?Rt($n(t,e.parameters),st(t,e.returns),r):cr(e)?Fr(st(t,e.items),r):fr(e)?Vr(st(t,e.items),r):ie(e)?_e($n(t,e.allOf),r):L(e)?q($n(t,e.anyOf),r):Je(e)?it($n(t,e.items??[]),r):me(e)?H(pS(t,e.properties),r):ft(e)?Nr(st(t,e.items),r):gr(e)?To(st(t,e.item),r):e}function cS(t,e){let r={};for(let n of t)r[n]=st(n,e);return r}function cp(t,e,r){let n=Ye(t)?Ke(t):t,o=e({[P]:"MappedKey",keys:n}),i=cS(n,o);return H(i,r)}var mp=u(()=>{M();Ut();xn();bn();An();Sr();Mt();ot();_n();Ue();Xe();Kt();Mo();Pr();er();he();wn();Xs();B()});var ve=u(()=>{Nu();Xs();mp()});function mS(t){return h(se(t,[be]))}function fS(t){return h({...t,[be]:"Optional"})}function gS(t,e){return e===!1?mS(t):fS(t)}function Ce(t,e){let r=e??!0;return te(t)?fp(t,r):gS(t,r)}var ha=u(()=>{T();M();Ut();Sa();B()});function hS(t,e){let r={};for(let n of globalThis.Object.getOwnPropertyNames(t))r[n]=Ce(t[n],e);return r}function SS(t,e){return hS(t.properties,e)}function fp(t,e){let r=SS(t,e);return U(r)}var Sa=u(()=>{ve();ha()});var Kt=u(()=>{Sa();ha()});function En(t,e={}){let r=t.every(o=>me(o)),n=Ye(e.unevaluatedProperties)?{unevaluatedProperties:e.unevaluatedProperties}:{};return h(e.unevaluatedProperties===!1||Ye(e.unevaluatedProperties)||r?{...n,[P]:"Intersect",type:"object",allOf:t}:{...n,[P]:"Intersect",allOf:t},e)}var ya=u(()=>{T();M();B()});function yS(t){return t.every(e=>Be(e))}function kS(t){return se(t,[be])}function gp(t){return t.map(e=>Be(e)?kS(e):e)}function vS(t,e){return yS(t)?Ce(En(gp(t),e)):En(gp(t),e)}function Ro(t,e={}){if(t.length===1)return h(t[0],e);if(t.length===0)return W(e);if(t.some(r=>zt(r)))throw new Error("Cannot intersect transform types");return vS(t,e)}var hp=u(()=>{M();T();Ut();Ae();Kt();ya();B()});var Sp=u(()=>{});function _e(t,e){if(t.length===1)return h(t[0],e);if(t.length===0)return W(e);if(t.some(r=>zt(r)))throw new Error("Cannot intersect transform types");return En(t,e)}var yp=u(()=>{T();Ae();ya();B()});var ot=u(()=>{hp();Sp();yp()});function Ct(...t){let[e,r]=typeof t[0]=="string"?[t[0],t[1]]:[t[0].$id,t[1]];if(typeof e!="string")throw new we("Ref: $ref must be a string");return h({[P]:"Ref",$ref:e},r)}var kp=u(()=>{At();T();M()});var wr=u(()=>{kp()});function PS(t,e){return Z("Awaited",[Z(t,e)])}function wS(t){return Z("Awaited",[Ct(t)])}function IS(t){return _e(vp(t))}function xS(t){return q(vp(t))}function bS(t){return qr(t)}function vp(t){return t.map(e=>qr(e))}function qr(t,e){return h(gt(t)?PS(t.target,t.parameters):ie(t)?IS(t.allOf):L(t)?xS(t.anyOf):gr(t)?bS(t.item):de(t)?wS(t.$ref):t,e)}var Pp=u(()=>{T();Xt();ot();he();wr();B()});var Co=u(()=>{Pp()});function wp(t){let e=[];for(let r of t)e.push(On(r));return e}function AS(t){let e=wp(t);return Ru(e)}function RS(t){let e=wp(t);return Au(e)}function TS(t){return t.map((e,r)=>r.toString())}function MS(t){return["[number]"]}function CS(t){return globalThis.Object.getOwnPropertyNames(t)}function _S(t){return $S?globalThis.Object.getOwnPropertyNames(t).map(r=>r[0]==="^"&&r[r.length-1]==="$"?r.slice(1,r.length-1):r):[]}function On(t){return ie(t)?AS(t.allOf):L(t)?RS(t.anyOf):Je(t)?TS(t.items??[]):ft(t)?MS(t.items):me(t)?CS(t.properties):hr(t)?_S(t.patternProperties):[]}var $S,ka=u(()=>{wn();B();$S=!1});function ES(t,e){return Z("KeyOf",[Z(t,e)])}function OS(t){return Z("KeyOf",[Ct(t)])}function DS(t,e){let r=On(t),n=NS(r),o=Tt(n);return h(o,e)}function NS(t){return t.map(e=>e==="[number]"?nt():V(e))}function jr(t,e){return gt(t)?ES(t.target,t.parameters):de(t)?OS(t.$ref):te(t)?Ip(t,e):DS(t,e)}var va=u(()=>{T();Ue();kr();Xt();wr();ka();he();Pa();B()});function FS(t,e){let r={};for(let n of globalThis.Object.getOwnPropertyNames(t))r[n]=jr(t[n],ee(e));return r}function LS(t,e){return FS(t.properties,e)}function Ip(t,e){let r=LS(t,e);return U(r)}var Pa=u(()=>{ve();va();We()});var xp=u(()=>{});var Dn=u(()=>{Pa();xp();ka();va()});function WS(t){let e=[];for(let r of t)e.push(...On(r));return bu(e)}function BS(t){return t.filter(e=>!Ht(e))}function US(t,e){let r=[];for(let n of t)r.push(...pa(n,[e]));return BS(r)}function KS(t,e){let r={};for(let n of e)r[n]=Ro(US(t,n));return r}function bp(t,e){let r=WS(t),n=KS(t,r);return H(n,e)}var Ap=u(()=>{ot();Mt();Dn();Xe();wn();B()});var wa=u(()=>{Ap()});function _o(t){return h({[P]:"Date",type:"Date"},t)}var Rp=u(()=>{M();T()});var $o=u(()=>{Rp()});function Eo(t){return h({[P]:"Null",type:"null"},t)}var Tp=u(()=>{T();M()});var Oo=u(()=>{Tp()});function Do(t){return h({[P]:"Symbol",type:"symbol"},t)}var Mp=u(()=>{T();M()});var No=u(()=>{Mp()});function Fo(t){return h({[P]:"Undefined",type:"undefined"},t)}var Cp=u(()=>{T();M()});var Lo=u(()=>{Cp()});function Wo(t){return h({[P]:"Uint8Array",type:"Uint8Array"},t)}var _p=u(()=>{T();M()});var Bo=u(()=>{_p()});function tr(t){return h({[P]:"Unknown"},t)}var $p=u(()=>{T();M()});var Gr=u(()=>{$p()});function VS(t){return t.map(e=>Ia(e,!1))}function qS(t){let e={};for(let r of globalThis.Object.getOwnPropertyNames(t))e[r]=Ve(Ia(t[r],!1));return e}function Uo(t,e){return e===!0?t:Ve(t)}function Ia(t,e){return Ds(t)?Uo(Yt(),e):Fs(t)?Uo(Yt(),e):pe(t)?Ve(it(VS(t))):Nt(t)?Wo():pr(t)?_o():j(t)?Uo(H(qS(t)),e):Ns(t)?Uo(Rt([],tr()),e):ce(t)?Fo():Ls(t)?Eo():Ws(t)?Do():pn(t)?Ur():Ge(t)?V(t):Dt(t)?V(t):Q(t)?V(t):H({})}function Ep(t,e){return h(Ia(t,!0),e)}var Op=u(()=>{In();Cn();$o();Sr();Ue();Oo();Xe();No();er();Pr();Lo();Bo();Gr();Ft();De()});var xa=u(()=>{Op()});function Dp(t,e){return ht(t)?it(t.parameters,e):W(e)}var Np=u(()=>{er();Ae();B()});var ba=u(()=>{Np()});function Fp(t,e){if(ce(t))throw new Error("Enum undefined or empty");let r=globalThis.Object.getOwnPropertyNames(t).filter(i=>isNaN(i)).map(i=>t[i]),o=[...new Set(r)].map(i=>V(i));return q(o,{...e,[rt]:"Enum"})}var Lp=u(()=>{Ue();M();he();De()});var Aa=u(()=>{Lp()});function at(t){return t===S.False?t:S.True}function Hr(t){throw new Ta(t)}function Se(t){return c.IsNever(t)||c.IsIntersect(t)||c.IsUnion(t)||c.IsUnknown(t)||c.IsAny(t)}function ye(t,e){return c.IsNever(e)?jp(t,e):c.IsIntersect(e)?Ko(t,e):c.IsUnion(e)?$a(t,e):c.IsUnknown(e)?Qp(t,e):c.IsAny(e)?_a(t,e):Hr("StructuralRight")}function _a(t,e){return S.True}function jS(t,e){return c.IsIntersect(e)?Ko(t,e):c.IsUnion(e)&&e.anyOf.some(r=>c.IsAny(r)||c.IsUnknown(r))?S.True:c.IsUnion(e)?S.Union:c.IsUnknown(e)||c.IsAny(e)?S.True:S.Union}function GS(t,e){return c.IsUnknown(t)?S.False:c.IsAny(t)?S.Union:c.IsNever(t)?S.True:S.False}function HS(t,e){return c.IsObject(e)&&Vo(e)?S.True:Se(e)?ye(t,e):c.IsArray(e)?at(z(t.items,e.items)):S.False}function zS(t,e){return Se(e)?ye(t,e):c.IsAsyncIterator(e)?at(z(t.items,e.items)):S.False}function QS(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsBigInt(e)?S.True:S.False}function Vp(t,e){return c.IsLiteralBoolean(t)||c.IsBoolean(t)?S.True:S.False}function JS(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsBoolean(e)?S.True:S.False}function YS(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsConstructor(e)?t.parameters.length>e.parameters.length?S.False:t.parameters.every((r,n)=>at(z(e.parameters[n],r))===S.True)?at(z(t.returns,e.returns)):S.False:S.False}function XS(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsDate(e)?S.True:S.False}function ZS(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsFunction(e)?t.parameters.length>e.parameters.length?S.False:t.parameters.every((r,n)=>at(z(e.parameters[n],r))===S.True)?at(z(t.returns,e.returns)):S.False:S.False}function qp(t,e){return c.IsLiteral(t)&&Me.IsNumber(t.const)||c.IsNumber(t)||c.IsInteger(t)?S.True:S.False}function ey(t,e){return c.IsInteger(e)||c.IsNumber(e)?S.True:Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):S.False}function Ko(t,e){return e.allOf.every(r=>z(t,r)===S.True)?S.True:S.False}function ty(t,e){return t.allOf.some(r=>z(r,e)===S.True)?S.True:S.False}function ry(t,e){return Se(e)?ye(t,e):c.IsIterator(e)?at(z(t.items,e.items)):S.False}function ny(t,e){return c.IsLiteral(e)&&e.const===t.const?S.True:Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsString(e)?zp(t,e):c.IsNumber(e)?Gp(t,e):c.IsInteger(e)?qp(t,e):c.IsBoolean(e)?Vp(t,e):S.False}function jp(t,e){return S.False}function oy(t,e){return S.True}function Wp(t){let[e,r]=[t,0];for(;c.IsNot(e);)e=e.not,r+=1;return r%2===0?e:tr()}function iy(t,e){return c.IsNot(t)?z(Wp(t),e):c.IsNot(e)?z(t,Wp(e)):Hr("Invalid fallthrough for Not")}function sy(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsNull(e)?S.True:S.False}function Gp(t,e){return c.IsLiteralNumber(t)||c.IsNumber(t)||c.IsInteger(t)?S.True:S.False}function ay(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsInteger(e)||c.IsNumber(e)?S.True:S.False}function qe(t,e){return Object.getOwnPropertyNames(t.properties).length===e}function Bp(t){return Vo(t)}function Up(t){return qe(t,0)||qe(t,1)&&"description"in t.properties&&c.IsUnion(t.properties.description)&&t.properties.description.anyOf.length===2&&(c.IsString(t.properties.description.anyOf[0])&&c.IsUndefined(t.properties.description.anyOf[1])||c.IsString(t.properties.description.anyOf[1])&&c.IsUndefined(t.properties.description.anyOf[0]))}function Ra(t){return qe(t,0)}function Kp(t){return qe(t,0)}function dy(t){return qe(t,0)}function ly(t){return qe(t,0)}function uy(t){return Vo(t)}function py(t){let e=nt();return qe(t,0)||qe(t,1)&&"length"in t.properties&&at(z(t.properties.length,e))===S.True}function cy(t){return qe(t,0)}function Vo(t){let e=nt();return qe(t,0)||qe(t,1)&&"length"in t.properties&&at(z(t.properties.length,e))===S.True}function my(t){let e=Rt([Yt()],Yt());return qe(t,0)||qe(t,1)&&"then"in t.properties&&at(z(t.properties.then,e))===S.True}function Hp(t,e){return z(t,e)===S.False||c.IsOptional(t)&&!c.IsOptional(e)?S.False:S.True}function $e(t,e){return c.IsUnknown(t)?S.False:c.IsAny(t)?S.Union:c.IsNever(t)||c.IsLiteralString(t)&&Bp(e)||c.IsLiteralNumber(t)&&Ra(e)||c.IsLiteralBoolean(t)&&Kp(e)||c.IsSymbol(t)&&Up(e)||c.IsBigInt(t)&&dy(e)||c.IsString(t)&&Bp(e)||c.IsSymbol(t)&&Up(e)||c.IsNumber(t)&&Ra(e)||c.IsInteger(t)&&Ra(e)||c.IsBoolean(t)&&Kp(e)||c.IsUint8Array(t)&&uy(e)||c.IsDate(t)&&ly(e)||c.IsConstructor(t)&&cy(e)||c.IsFunction(t)&&py(e)?S.True:c.IsRecord(t)&&c.IsString(Ma(t))?e[rt]==="Record"?S.True:S.False:c.IsRecord(t)&&c.IsNumber(Ma(t))&&qe(e,0)?S.True:S.False}function fy(t,e){return Se(e)?ye(t,e):c.IsRecord(e)?dt(t,e):c.IsObject(e)?(()=>{for(let r of Object.getOwnPropertyNames(e.properties)){if(!(r in t.properties)&&!c.IsOptional(e.properties[r]))return S.False;if(c.IsOptional(e.properties[r]))return S.True;if(Hp(t.properties[r],e.properties[r])===S.False)return S.False}return S.True})():S.False}function gy(t,e){return Se(e)?ye(t,e):c.IsObject(e)&&my(e)?S.True:c.IsPromise(e)?at(z(t.item,e.item)):S.False}function Ma(t){return Qt in t.patternProperties?nt():Jt in t.patternProperties?vt():Hr("Unknown record key pattern")}function Ca(t){return Qt in t.patternProperties?t.patternProperties[Qt]:Jt in t.patternProperties?t.patternProperties[Jt]:Hr("Unable to get record value schema")}function dt(t,e){let[r,n]=[Ma(e),Ca(e)];return c.IsLiteralString(t)&&c.IsNumber(r)&&at(z(t,n))===S.True?S.True:c.IsUint8Array(t)&&c.IsNumber(r)||c.IsString(t)&&c.IsNumber(r)||c.IsArray(t)&&c.IsNumber(r)?z(t,n):c.IsObject(t)?(()=>{for(let o of Object.getOwnPropertyNames(t.properties))if(Hp(n,t.properties[o])===S.False)return S.False;return S.True})():S.False}function hy(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?z(Ca(t),Ca(e)):S.False}function Sy(t,e){let r=c.IsRegExp(t)?vt():t,n=c.IsRegExp(e)?vt():e;return z(r,n)}function zp(t,e){return c.IsLiteral(t)&&Me.IsString(t.const)||c.IsString(t)?S.True:S.False}function yy(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsString(e)?S.True:S.False}function ky(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsSymbol(e)?S.True:S.False}function vy(t,e){return c.IsTemplateLiteral(t)?z(vr(t),e):c.IsTemplateLiteral(e)?z(t,vr(e)):Hr("Invalid fallthrough for TemplateLiteral")}function Py(t,e){return c.IsArray(e)&&t.items!==void 0&&t.items.every(r=>z(r,e.items)===S.True)}function wy(t,e){return c.IsNever(t)?S.True:c.IsUnknown(t)?S.False:c.IsAny(t)?S.Union:S.False}function Iy(t,e){return Se(e)?ye(t,e):c.IsObject(e)&&Vo(e)||c.IsArray(e)&&Py(t,e)?S.True:c.IsTuple(e)?Me.IsUndefined(t.items)&&!Me.IsUndefined(e.items)||!Me.IsUndefined(t.items)&&Me.IsUndefined(e.items)?S.False:Me.IsUndefined(t.items)&&!Me.IsUndefined(e.items)||t.items.every((r,n)=>z(r,e.items[n])===S.True)?S.True:S.False:S.False}function xy(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsUint8Array(e)?S.True:S.False}function by(t,e){return Se(e)?ye(t,e):c.IsObject(e)?$e(t,e):c.IsRecord(e)?dt(t,e):c.IsVoid(e)?Ty(t,e):c.IsUndefined(e)?S.True:S.False}function $a(t,e){return e.anyOf.some(r=>z(t,r)===S.True)?S.True:S.False}function Ay(t,e){return t.anyOf.every(r=>z(r,e)===S.True)?S.True:S.False}function Qp(t,e){return S.True}function Ry(t,e){return c.IsNever(e)?jp(t,e):c.IsIntersect(e)?Ko(t,e):c.IsUnion(e)?$a(t,e):c.IsAny(e)?_a(t,e):c.IsString(e)?zp(t,e):c.IsNumber(e)?Gp(t,e):c.IsInteger(e)?qp(t,e):c.IsBoolean(e)?Vp(t,e):c.IsArray(e)?GS(t,e):c.IsTuple(e)?wy(t,e):c.IsObject(e)?$e(t,e):c.IsUnknown(e)?S.True:S.False}function Ty(t,e){return c.IsUndefined(t)||c.IsUndefined(t)?S.True:S.False}function My(t,e){return c.IsIntersect(e)?Ko(t,e):c.IsUnion(e)?$a(t,e):c.IsUnknown(e)?Qp(t,e):c.IsAny(e)?_a(t,e):c.IsObject(e)?$e(t,e):c.IsVoid(e)?S.True:S.False}function z(t,e){return c.IsTemplateLiteral(t)||c.IsTemplateLiteral(e)?vy(t,e):c.IsRegExp(t)||c.IsRegExp(e)?Sy(t,e):c.IsNot(t)||c.IsNot(e)?iy(t,e):c.IsAny(t)?jS(t,e):c.IsArray(t)?HS(t,e):c.IsBigInt(t)?QS(t,e):c.IsBoolean(t)?JS(t,e):c.IsAsyncIterator(t)?zS(t,e):c.IsConstructor(t)?YS(t,e):c.IsDate(t)?XS(t,e):c.IsFunction(t)?ZS(t,e):c.IsInteger(t)?ey(t,e):c.IsIntersect(t)?ty(t,e):c.IsIterator(t)?ry(t,e):c.IsLiteral(t)?ny(t,e):c.IsNever(t)?oy(t,e):c.IsNull(t)?sy(t,e):c.IsNumber(t)?ay(t,e):c.IsObject(t)?fy(t,e):c.IsRecord(t)?hy(t,e):c.IsString(t)?yy(t,e):c.IsSymbol(t)?ky(t,e):c.IsTuple(t)?Iy(t,e):c.IsPromise(t)?gy(t,e):c.IsUint8Array(t)?xy(t,e):c.IsUndefined(t)?by(t,e):c.IsUnion(t)?Ay(t,e):c.IsUnknown(t)?Ry(t,e):c.IsVoid(t)?My(t,e):Hr(`Unknown left type operand '${t[P]}'`)}function rr(t,e){return z(t,e)}var Ta,S,Ea=u(()=>{In();Sr();kr();Kr();Gr();qt();Pn();M();At();zs();Ta=class extends we{};(function(t){t[t.Union=0]="Union",t[t.True=1]="True",t[t.False=2]="False"})(S||(S={}))});function Cy(t,e,r,n,o){let i={};for(let s of globalThis.Object.getOwnPropertyNames(t))i[s]=zr(t[s],e,r,n,ee(o));return i}function _y(t,e,r,n,o){return Cy(t.properties,e,r,n,o)}function Jp(t,e,r,n,o){let i=_y(t,e,r,n,o);return U(i)}var Oa=u(()=>{ve();qo();We()});function $y(t,e,r,n){let o=rr(t,e);return o===S.Union?q([r,n]):o===S.True?r:n}function zr(t,e,r,n,o){return te(t)?Jp(t,e,r,n,o):ze(t)?h(Yp(t,e,r,n,o)):h($y(t,e,r,n),o)}var qo=u(()=>{T();he();Ea();Da();Oa();B()});function Ey(t,e,r,n,o){return{[t]:zr(V(t),e,r,n,ee(o))}}function Oy(t,e,r,n,o){return t.reduce((i,s)=>({...i,...Ey(s,e,r,n,o)}),{})}function Dy(t,e,r,n,o){return Oy(t.keys,e,r,n,o)}function Yp(t,e,r,n,o){let i=Dy(t,e,r,n,o);return U(i)}var Da=u(()=>{ve();Ue();qo();We()});var Xp=u(()=>{});var Nn=u(()=>{Ea();Da();Oa();Xp();qo()});function Zp(t,e){return Qr(vr(t),e)}var Na=u(()=>{jo();qt()});function Ny(t,e){let r=t.filter(n=>rr(n,e)===S.False);return r.length===1?r[0]:q(r)}function Qr(t,e,r={}){return Qe(t)?h(Zp(t,e),r):te(t)?h(ec(t,e),r):h(L(t)?Ny(t.anyOf,e):rr(t,e)!==S.False?W():t,r)}var jo=u(()=>{T();he();Ae();Nn();Fa();Na();B()});function Fy(t,e){let r={};for(let n of globalThis.Object.getOwnPropertyNames(t))r[n]=Qr(t[n],e);return r}function Ly(t,e){return Fy(t.properties,e)}function ec(t,e){let r=Ly(t,e);return U(r)}var Fa=u(()=>{ve();jo()});var La=u(()=>{Fa();Na();jo()});function tc(t,e){return Jr(vr(t),e)}var Wa=u(()=>{Go();qt()});function Wy(t,e){let r=t.filter(n=>rr(n,e)!==S.False);return r.length===1?r[0]:q(r)}function Jr(t,e,r){return Qe(t)?h(tc(t,e),r):te(t)?h(rc(t,e),r):h(L(t)?Wy(t.anyOf,e):rr(t,e)!==S.False?t:W(),r)}var Go=u(()=>{T();he();Ae();Nn();Ba();Wa();B()});function By(t,e){let r={};for(let n of globalThis.Object.getOwnPropertyNames(t))r[n]=Jr(t[n],e);return r}function Uy(t,e){return By(t.properties,e)}function rc(t,e){let r=Uy(t,e);return U(r)}var Ba=u(()=>{ve();Go()});var Ua=u(()=>{Ba();Wa();Go()});function nc(t,e){return ht(t)?h(t.returns,e):W(e)}var oc=u(()=>{T();Ae();B()});var Ka=u(()=>{oc()});function Ho(t){return Ve(Ce(t))}var ic=u(()=>{Pr();Kt()});var zo=u(()=>{ic()});function Ir(t,e,r){return h({[P]:"Record",type:"object",patternProperties:{[t]:e}},r)}function Va(t,e,r){let n={};for(let o of t)n[o]=e;return H(n,{...r,[rt]:"Record"})}function Ky(t,e,r){return qu(t)?Va(Ke(t),e,r):Ir(t.pattern,e,r)}function Vy(t,e,r){return Va(Ke(q(t)),e,r)}function qy(t,e,r){return Va([t.toString()],e,r)}function jy(t,e,r){return Ir(t.source,e,r)}function Gy(t,e,r){let n=ce(t.pattern)?Jt:t.pattern;return Ir(n,e,r)}function Hy(t,e,r){return Ir(Jt,e,r)}function zy(t,e,r){return Ir(ku,e,r)}function Qy(t,e,r){return H({true:e,false:e},r)}function Jy(t,e,r){return Ir(Qt,e,r)}function Yy(t,e,r){return Ir(Qt,e,r)}function Qo(t,e,r={}){return L(t)?Vy(t.anyOf,e,r):Qe(t)?Ky(t,e,r):He(t)?qy(t.const,e,r):Lt(t)?Qy(t,e,r):yt(t)?Jy(t,e,r):kt(t)?Yy(t,e,r):Vs(t)?jy(t,e,r):Wt(t)?Gy(t,e,r):Us(t)?Hy(t,e,r):Ht(t)?zy(t,e,r):W(r)}function Jo(t){return globalThis.Object.getOwnPropertyNames(t.patternProperties)[0]}function sc(t){let e=Jo(t);return e===Jt?vt():e===Qt?nt():vt({pattern:e})}function Yo(t){return t.patternProperties[Jo(t)]}var ac=u(()=>{T();M();Ae();kr();Xe();Kr();he();qt();Pn();Mt();De();B()});var Fn=u(()=>{ac()});function Xy(t,e){return e.parameters=Ln(t,e.parameters),e.returns=Pt(t,e.returns),e}function Zy(t,e){return e.parameters=Ln(t,e.parameters),e.returns=Pt(t,e.returns),e}function ek(t,e){return e.allOf=Ln(t,e.allOf),e}function tk(t,e){return e.anyOf=Ln(t,e.anyOf),e}function rk(t,e){return ce(e.items)||(e.items=Ln(t,e.items)),e}function nk(t,e){return e.items=Pt(t,e.items),e}function ok(t,e){return e.items=Pt(t,e.items),e}function ik(t,e){return e.items=Pt(t,e.items),e}function sk(t,e){return e.item=Pt(t,e.item),e}function ak(t,e){let r=pk(t,e.properties);return{...e,...H(r)}}function dk(t,e){let r=Pt(t,sc(e)),n=Pt(t,Yo(e)),o=Qo(r,n);return{...e,...o}}function lk(t,e){return e.index in t?t[e.index]:tr()}function uk(t,e){let r=Dr(e),n=Be(e),o=Pt(t,e);return r&&n?Ho(o):r&&!n?Ve(o):!r&&n?Ce(o):o}function pk(t,e){return globalThis.Object.getOwnPropertyNames(e).reduce((r,n)=>({...r,[n]:uk(t,e[n])}),{})}function Ln(t,e){return e.map(r=>Pt(t,r))}function Pt(t,e){return ht(e)?Xy(t,e):St(e)?Zy(t,e):ie(e)?ek(t,e):L(e)?tk(t,e):Je(e)?rk(t,e):ft(e)?nk(t,e):cr(e)?ok(t,e):fr(e)?ik(t,e):gr(e)?sk(t,e):me(e)?ak(t,e):hr(e)?dk(t,e):Ks(e)?lk(t,e):e}function dc(t,e){return Pt(e,Or(t))}var lc=u(()=>{go();Gr();zo();Pr();Kt();Xe();Fn();De();B()});var qa=u(()=>{lc()});function uc(t){return h({[P]:"Integer",type:"integer"},t)}var pc=u(()=>{T();M()});var ja=u(()=>{pc()});function ck(t,e,r){return{[t]:wt(V(t),e,ee(r))}}function mk(t,e,r){return t.reduce((o,i)=>({...o,...ck(i,e,r)}),{})}function fk(t,e,r){return mk(t.keys,e,r)}function cc(t,e,r){let n=fk(t,e,r);return U(n)}var Ga=u(()=>{ve();xr();Ue();We()});function gk(t){let[e,r]=[t.slice(0,1),t.slice(1)];return[e.toLowerCase(),r].join("")}function hk(t){let[e,r]=[t.slice(0,1),t.slice(1)];return[e.toUpperCase(),r].join("")}function Sk(t){return t.toUpperCase()}function yk(t){return t.toLowerCase()}function kk(t,e,r){let n=Br(t.pattern);if(!yr(n))return{...t,pattern:mc(t.pattern,e)};let s=[...Mn(n)].map(l=>V(l)),a=fc(s,e),d=q(a);return bo([d],r)}function mc(t,e){return typeof t=="string"?e==="Uncapitalize"?gk(t):e==="Capitalize"?hk(t):e==="Uppercase"?Sk(t):e==="Lowercase"?yk(t):t:t.toString()}function fc(t,e){return t.map(r=>wt(r,e))}function wt(t,e,r={}){return ze(t)?cc(t,e,r):Qe(t)?kk(t,e,r):L(t)?q(fc(t.anyOf,e),r):He(t)?V(mc(t.const,e),r):h(t,r)}var xr=u(()=>{T();qt();Ga();Ue();he();B()});function gc(t,e={}){return wt(t,"Capitalize",e)}var hc=u(()=>{xr()});function Sc(t,e={}){return wt(t,"Lowercase",e)}var yc=u(()=>{xr()});function kc(t,e={}){return wt(t,"Uncapitalize",e)}var vc=u(()=>{xr()});function Pc(t,e={}){return wt(t,"Uppercase",e)}var wc=u(()=>{xr()});var Ha=u(()=>{hc();Ga();xr();yc();vc();wc()});function vk(t,e,r){let n={};for(let o of globalThis.Object.getOwnPropertyNames(t))n[o]=nr(t[o],e,ee(r));return n}function Pk(t,e,r){return vk(t.properties,e,r)}function Ic(t,e,r){let n=Pk(t,e,r);return U(n)}var za=u(()=>{ve();Xo();We()});function wk(t,e){return t.map(r=>Qa(r,e))}function Ik(t,e){return t.map(r=>Qa(r,e))}function xk(t,e){let{[e]:r,...n}=t;return n}function bk(t,e){return e.reduce((r,n)=>xk(r,n),t)}function Ak(t,e,r){let n=se(t,[ge,"$id","required","properties"]),o=bk(r,e);return H(o,n)}function Rk(t){let e=t.reduce((r,n)=>So(n)?[...r,V(n)]:r,[]);return q(e)}function Qa(t,e){return ie(t)?_e(wk(t.allOf,e)):L(t)?q(Ik(t.anyOf,e)):me(t)?Ak(t,e,t.properties):H({})}function nr(t,e,r){let n=pe(e)?Rk(e):e,o=Ye(e)?Ke(e):e,i=de(t),s=de(e);return te(t)?Ic(t,o,r):ze(e)?xc(t,e,r):i&&s?Z("Omit",[t,n],r):!i&&s?Z("Omit",[t,n],r):i&&!s?Z("Omit",[t,n],r):h({...Qa(t,o),...r})}var Xo=u(()=>{T();ko();fn();Xt();Ue();Mt();ot();he();Xe();Ja();za();B();De()});function Tk(t,e,r){return{[e]:nr(t,[e],ee(r))}}function Mk(t,e,r){return e.reduce((n,o)=>({...n,...Tk(t,o,r)}),{})}function Ck(t,e,r){return Mk(t,e.keys,r)}function xc(t,e,r){let n=Ck(t,e,r);return U(n)}var Ja=u(()=>{ve();Xo();We()});var Zo=u(()=>{Ja();za();Xo()});function _k(t,e,r){let n={};for(let o of globalThis.Object.getOwnPropertyNames(t))n[o]=or(t[o],e,ee(r));return n}function $k(t,e,r){return _k(t.properties,e,r)}function bc(t,e,r){let n=$k(t,e,r);return U(n)}var Ya=u(()=>{ve();ei();We()});function Ek(t,e){return t.map(r=>Xa(r,e))}function Ok(t,e){return t.map(r=>Xa(r,e))}function Dk(t,e){let r={};for(let n of e)n in t&&(r[n]=t[n]);return r}function Nk(t,e,r){let n=se(t,[ge,"$id","required","properties"]),o=Dk(r,e);return H(o,n)}function Fk(t){let e=t.reduce((r,n)=>So(n)?[...r,V(n)]:r,[]);return q(e)}function Xa(t,e){return ie(t)?_e(Ek(t.allOf,e)):L(t)?q(Ok(t.anyOf,e)):me(t)?Nk(t,e,t.properties):H({})}function or(t,e,r){let n=pe(e)?Fk(e):e,o=Ye(e)?Ke(e):e,i=de(t),s=de(e);return te(t)?bc(t,o,r):ze(e)?Ac(t,e,r):i&&s?Z("Pick",[t,n],r):!i&&s?Z("Pick",[t,n],r):i&&!s?Z("Pick",[t,n],r):h({...Xa(t,o),...r})}var ei=u(()=>{T();ko();Xt();ot();Ue();Xe();he();Mt();fn();B();De();Za();Ya()});function Lk(t,e,r){return{[e]:or(t,[e],ee(r))}}function Wk(t,e,r){return e.reduce((n,o)=>({...n,...Lk(t,o,r)}),{})}function Bk(t,e,r){return Wk(t,e.keys,r)}function Ac(t,e,r){let n=Bk(t,e,r);return U(n)}var Za=u(()=>{ve();ei();We()});var ti=u(()=>{Za();Ya();ei()});function Uk(t,e){return Z("Partial",[Z(t,e)])}function Kk(t){return Z("Partial",[Ct(t)])}function Vk(t){let e={};for(let r of globalThis.Object.getOwnPropertyNames(t))e[r]=Ce(t[r]);return e}function qk(t,e){let r=se(t,[ge,"$id","required","properties"]),n=Vk(e);return H(n,r)}function Rc(t){return t.map(e=>Tc(e))}function Tc(t){return gt(t)?Uk(t.target,t.parameters):de(t)?Kk(t.$ref):ie(t)?_e(Rc(t.allOf)):L(t)?q(Rc(t.anyOf)):me(t)?qk(t,t.properties):mr(t)||Lt(t)||yt(t)||He(t)||gn(t)||kt(t)||Wt(t)||hn(t)||Sn(t)?t:H({})}function Yr(t,e){return te(t)?Mc(t,e):h({...Tc(t),...e})}var ed=u(()=>{T();Xt();Kt();Xe();ot();he();wr();Ut();M();td();B()});function jk(t,e){let r={};for(let n of globalThis.Object.getOwnPropertyNames(t))r[n]=Yr(t[n],ee(e));return r}function Gk(t,e){return jk(t.properties,e)}function Mc(t,e){let r=Gk(t,e);return U(r)}var td=u(()=>{ve();ed();We()});var ri=u(()=>{td();ed()});function Hk(t,e){return Z("Required",[Z(t,e)])}function zk(t){return Z("Required",[Ct(t)])}function Qk(t){let e={};for(let r of globalThis.Object.getOwnPropertyNames(t))e[r]=se(t[r],[be]);return e}function Jk(t,e){let r=se(t,[ge,"$id","required","properties"]),n=Qk(e);return H(n,r)}function Cc(t){return t.map(e=>_c(e))}function _c(t){return gt(t)?Hk(t.target,t.parameters):de(t)?zk(t.$ref):ie(t)?_e(Cc(t.allOf)):L(t)?q(Cc(t.anyOf)):me(t)?Jk(t,t.properties):mr(t)||Lt(t)||yt(t)||He(t)||gn(t)||kt(t)||Wt(t)||hn(t)||Sn(t)?t:H({})}function Xr(t,e){return te(t)?$c(t,e):h({..._c(t),...e})}var rd=u(()=>{T();Xt();Xe();ot();he();wr();M();Ut();nd();B()});function Yk(t,e){let r={};for(let n of globalThis.Object.getOwnPropertyNames(t))r[n]=Xr(t[n],e);return r}function Xk(t,e){return Yk(t.properties,e)}function $c(t,e){let r=Xk(t,e);return U(r)}var nd=u(()=>{ve();rd()});var ni=u(()=>{nd();rd()});function Zk(t,e){return e.map(r=>de(r)?od(t,r.$ref):Ze(t,r))}function od(t,e){return e in t?de(t[e])?od(t,t[e].$ref):Ze(t,t[e]):W()}function ev(t){return qr(t[0])}function tv(t){return Zt(t[0],t[1])}function rv(t){return jr(t[0])}function nv(t){return Yr(t[0])}function ov(t){return nr(t[0],t[1])}function iv(t){return or(t[0],t[1])}function sv(t){return Xr(t[0])}function av(t,e,r){let n=Zk(t,r);return e==="Awaited"?ev(n):e==="Index"?tv(n):e==="KeyOf"?rv(n):e==="Partial"?nv(n):e==="Omit"?ov(n):e==="Pick"?iv(n):e==="Required"?sv(n):W()}function dv(t,e){return Nr(Ze(t,e))}function lv(t,e){return Fr(Ze(t,e))}function uv(t,e,r){return Lr(Wn(t,e),Ze(t,r))}function pv(t,e,r){return Rt(Wn(t,e),Ze(t,r))}function cv(t,e){return _e(Wn(t,e))}function mv(t,e){return Vr(Ze(t,e))}function fv(t,e){return H(globalThis.Object.keys(e).reduce((r,n)=>({...r,[n]:Ze(t,e[n])}),{}))}function gv(t,e){let[r,n]=[Ze(t,Yo(e)),Jo(e)],o=Or(e);return o.patternProperties[n]=r,o}function hv(t,e){return de(e)?{...od(t,e.$ref),[ge]:e[ge]}:e}function Sv(t,e){return it(Wn(t,e))}function yv(t,e){return q(Wn(t,e))}function Wn(t,e){return e.map(r=>Ze(t,r))}function Ze(t,e){return Be(e)?h(Ze(t,se(e,[be])),e):Dr(e)?h(Ze(t,se(e,[mt])),e):zt(e)?h(hv(t,e),e):ft(e)?h(dv(t,e.items),e):cr(e)?h(lv(t,e.items),e):gt(e)?h(av(t,e.target,e.parameters)):ht(e)?h(uv(t,e.parameters,e.returns),e):St(e)?h(pv(t,e.parameters,e.returns),e):ie(e)?h(cv(t,e.allOf),e):fr(e)?h(mv(t,e.items),e):me(e)?h(fv(t,e.properties),e):hr(e)?h(gv(t,e)):Je(e)?h(Sv(t,e.items||[]),e):L(e)?h(yv(t,e.anyOf),e):e}function kv(t,e){return e in t?Ze(t,t[e]):W()}function Ec(t){return globalThis.Object.getOwnPropertyNames(t).reduce((e,r)=>({...e,[r]:kv(t,r)}),{})}var Oc=u(()=>{Ft();Bs();Ut();xn();Co();bn();An();Mt();Sr();ot();_n();Dn();Xe();Zo();ti();Ae();ri();Fn();ni();er();he();M();B()});function Dc(t){return new id(t)}var id,Nc=u(()=>{Ft();M();Oc();id=class{constructor(e){let r=Ec(e),n=this.WithIdentifiers(r);this.$defs=n}Import(e,r){let n={...this.$defs,[e]:h(this.$defs[e],r)};return h({[P]:"Import",$defs:n,$ref:e})}WithIdentifiers(e){return globalThis.Object.getOwnPropertyNames(e).reduce((r,n)=>({...r,[n]:{...e[n],$id:n}}),{})}}});var sd=u(()=>{Nc()});function Fc(t,e){return h({[P]:"Not",not:t},e)}var Lc=u(()=>{T();M()});var ad=u(()=>{Lc()});function Wc(t,e){return St(t)?it(t.parameters,e):W()}var Bc=u(()=>{er();Ae();B()});var dd=u(()=>{Bc()});function Uc(t,e={}){ce(e.$id)&&(e.$id=`T${vv++}`);let r=Or(t({[P]:"This",$ref:`${e.$id}`}));return r.$id=e.$id,h({[rt]:"Recursive",...r},e)}var vv,Kc=u(()=>{go();T();De();M();vv=0});var ld=u(()=>{Kc()});function Vc(t,e){let r=Q(t)?new globalThis.RegExp(t):t;return h({[P]:"RegExp",type:"RegExp",source:r.source,flags:r.flags},e)}var qc=u(()=>{T();De();M()});var ud=u(()=>{qc()});function Pv(t){return ie(t)?t.allOf:L(t)?t.anyOf:Je(t)?t.items??[]:[]}function jc(t){return Pv(t)}var Gc=u(()=>{B()});var pd=u(()=>{Gc()});function Hc(t,e){return St(t)?h(t.returns,e):W(e)}var zc=u(()=>{T();Ae();B()});var cd=u(()=>{zc()});var Qc=u(()=>{});var Jc=u(()=>{});var Yc=u(()=>{Qc();Jc()});var Xc=u(()=>{});var Zc=u(()=>{Xc()});function em(t){return new md(t)}var md,fd,tm=u(()=>{M();B();md=class{constructor(e){this.schema=e}Decode(e){return new fd(this.schema,e)}},fd=class{constructor(e,r){this.schema=e,this.decode=r}EncodeTransform(e,r){let i={Encode:s=>r[ge].Encode(e(s)),Decode:s=>this.decode(r[ge].Decode(s))};return{...r,[ge]:i}}EncodeSchema(e,r){let n={Decode:this.decode,Encode:e};return{...r,[ge]:n}}Encode(e){return zt(this.schema)?this.EncodeTransform(e,this.schema):this.EncodeSchema(e,this.schema)}}});var gd=u(()=>{tm()});function rm(t={}){return h({[P]:t[P]??"Unsafe"},t)}var nm=u(()=>{T();M()});var hd=u(()=>{nm()});function om(t){return h({[P]:"Void",type:"void"},t)}var im=u(()=>{T();M()});var Sd=u(()=>{im()});var yd={};co(yd,{Any:()=>Yt,Argument:()=>_u,Array:()=>Nr,AsyncIterator:()=>Fr,Awaited:()=>qr,BigInt:()=>Ur,Boolean:()=>Io,Capitalize:()=>gc,Composite:()=>bp,Const:()=>Ep,Constructor:()=>Lr,ConstructorParameters:()=>Dp,Date:()=>_o,Enum:()=>Fp,Exclude:()=>Qr,Extends:()=>zr,Extract:()=>Jr,Function:()=>Rt,Index:()=>Zt,InstanceType:()=>nc,Instantiate:()=>dc,Integer:()=>uc,Intersect:()=>_e,Iterator:()=>Vr,KeyOf:()=>jr,Literal:()=>V,Lowercase:()=>Sc,Mapped:()=>cp,Module:()=>Dc,Never:()=>W,Not:()=>Fc,Null:()=>Eo,Number:()=>nt,Object:()=>H,Omit:()=>nr,Optional:()=>Ce,Parameters:()=>Wc,Partial:()=>Yr,Pick:()=>or,Promise:()=>To,Readonly:()=>Ve,ReadonlyOptional:()=>Ho,Record:()=>Qo,Recursive:()=>Uc,Ref:()=>Ct,RegExp:()=>Vc,Required:()=>Xr,Rest:()=>jc,ReturnType:()=>Hc,String:()=>vt,Symbol:()=>Do,TemplateLiteral:()=>bo,Transform:()=>em,Tuple:()=>it,Uint8Array:()=>Wo,Uncapitalize:()=>kc,Undefined:()=>Fo,Union:()=>q,Unknown:()=>tr,Unsafe:()=>rm,Uppercase:()=>Pc,Void:()=>om});var sm=u(()=>{In();Ys();xn();bn();Co();Cn();xo();wa();xa();An();ba();$o();Aa();La();Nn();Ua();Sr();Mt();Ka();qa();ja();ot();Ha();_n();Dn();Ue();ve();sd();Ae();ad();Oo();kr();Xe();Zo();Kt();dd();ri();ti();Mo();Pr();zo();Fn();ld();wr();ud();ni();pd();cd();Kr();No();qt();gd();er();Bo();Lo();he();Gr();hd();Sd()});var p,am=u(()=>{sm();p=yd});var Ee=u(()=>{Bs();Ft();At();zs();yu();Pn();Iu();wn();M();In();xn();Ys();bn();Co();Cn();xo();wa();xa();An();ba();$o();Aa();La();Nn();Ua();Sr();Mt();Ka();qa();ja();ot();_n();Ha();Dn();Ue();sd();ve();Ae();ad();Oo();kr();Xe();Zo();Kt();dd();ri();ti();Mo();Pr();zo();Fn();ld();wr();ud();ni();pd();cd();Yc();Zc();Kr();No();qt();gd();er();Bo();Lo();he();Gr();hd();Sd();am()});function kd(t){v=t}function vd(t){fe=t}var v,fe,Y=u(()=>{v=null,fe=null});function dm(t){let e=t.chatId.trim(),r=t.topicId.trim();return!/^-?\d+$/.test(e)||!/^\d+$/.test(r)?null:`${e}:topic:${r}`}function Av(t){let e=t.conversationId.trim(),r=e.match(/^(-?\d+):topic:(\d+)$/i);if(r?.[1]&&r[2]){let i=dm({chatId:r[1],topicId:r[2]});return i?{chatId:r[1],topicId:r[2],canonicalConversationId:i}:null}if(!/^\d+$/.test(e))return null;let n=t.parentConversationId?.trim();if(!n||!/^-?\d+$/.test(n))return null;let o=dm({chatId:n,topicId:e});return o?{chatId:n,topicId:e,canonicalConversationId:o}:null}function Rv(t){if(!t)return;let e=t.match(/^agent:[^:]+:discord:(direct|dm|channel|group):/i);if(!e?.[1])return;let r=e[1].toLowerCase();return r==="direct"||r==="dm"?"user":"channel"}function Tv(t,e){if(!/^\d+$/.test(t))return t;let r=Rv(e);return r?`${r}:${t}`:`channel:${t}`}function Mv(t){if(!(!t?.provider||!t.target)&&!(t.provider==="system"||t.target==="system"))return t.accountId?`${t.provider}|${t.accountId}|${t.target}`:`${t.provider}|${t.target}`}function Cv(t){let e=t.toLowerCase(),r=[":thread:",":topic:"];for(let n of r){let o=e.lastIndexOf(n);if(o===-1)continue;let i=t.slice(0,o).trim(),s=t.slice(o+n.length).trim()||void 0;return{id:i||t,threadId:s}}return{id:t}}function _v(t){let e=t?.trim();if(!e)return;let r=e.split(":").filter(Boolean);if(r[0]?.trim().toLowerCase()==="agent")for(let n=2;n<=r.length-3;n+=1){let o=r[n]?.trim().toLowerCase();if(!o||!bv.has(o))continue;let i=r[n+1]?.trim().toLowerCase(),s=r.slice(n+2).join(":").trim();if(!(!i||!s))return{provider:o,kind:i,rawId:s}}}function $v(t,e=Av){try{return e({conversationId:t})}catch{return null}}function Pd(t){return{provider:"system",target:"system",sessionKey:t?.trim()||void 0}}function wd(t,e){return{...t,threadId:e??t.threadId}}function Ov(t,e,r){return t==="telegram"&&r?.provider==="telegram"&&!!r.target&&e!==r.target}function Dv(t){let e=t?.trim();if(!e)return;let r=_v(e);if(!r)return;let{provider:n,kind:o,rawId:i}=r,s=Cv(i),a=null;if(n==="telegram")try{a=Ev.safeParseTelegramTopicConversation(i)}catch{a=null}let d=a?.chatId??s.id,l=a?.topicId??s.threadId,m=n==="discord"?o==="direct"||o==="dm"?`user:${d}`:`channel:${d}`:d;return{provider:n,target:m,threadId:l,sessionKey:e}}function Id(t){let e=t?.match(/:topic:(\d+)$/);return e?parseInt(e[1],10):void 0}function Nv(t){return!!(t?.provider&&t.target&&t.provider!=="system"&&t.target!=="system")}function Bn(t,e,r){let n=Dv(r),o=e!=null?String(e):void 0,i=t?.trim();if(!i||i.toLowerCase()==="unknown")return n?wd(n,o):Pd(r);let s=i.split("|").map(k=>k.trim());if(s.length<2)return n?wd(n,o):Pd(r);let[a,d,l]=s,m=s.length>=3?l:d,g=s.length>=3?d:void 0,y=a?.toLowerCase();if(!y||!m)return n?wd(n,o):Pd(r);let f=y==="discord"?Tv(m,r):m;return Ov(y,f,n)?{provider:y,accountId:g,target:n.target,threadId:o??n.threadId,sessionKey:r?.trim()||void 0}:{provider:y,accountId:g,target:f,threadId:o??(n?.provider===y?n.threadId:void 0),sessionKey:r?.trim()||void 0}}function Zr(t){return Bn(Mv(t.route)??t.originChannel,t.route?.threadId??t.originThreadId,t.route?.sessionKey??t.originSessionKey)??t.route}function ii(t){let e=Zr(t);return Nv(e)?e:void 0}var bv,Ev,br=u(()=>{bv=new Set(["telegram","discord","slack","system","mattermost","feishu","line","whatsapp","signal","matrix","googlechat","bluebubbles","imessage","msteams"]);Ev={safeParseTelegramTopicConversation:$v}});import{readFileSync as Fv}from"fs";import{homedir as Lv}from"os";import{join as Wv}from"path";function um(){if(Un!==void 0)return Un;try{let t=Fv(Wv(Lv(),".claude.json"),"utf-8");Un=JSON.parse(t).mcpServers??{}}catch{Un={}}return Un}function pm(t){let e=t.defaultHarness??lm,r={};for(let[n,o]of Object.entries(si))r[n]={...o,allowedModels:o.allowedModels?[...o.allowedModels]:void 0};for(let[n,o]of Object.entries(t.harnesses??{})){let i=r[n]??{},s={...i,defaultModel:o.defaultModel??i.defaultModel,reasoningEffort:o.reasoningEffort??i.reasoningEffort};o.allowedModels!==void 0?s.allowedModels=o.allowedModels?[...o.allowedModels]:o.allowedModels:o.defaultModel!==void 0&&(s.allowedModels=void 0),r[n]=s}if(t.defaultModel!==void 0){let n=r[e]??{};r[e]={...n,defaultModel:t.harnesses?.[e]?.defaultModel??t.defaultModel,allowedModels:t.harnesses?.[e]?.allowedModels!==void 0?n.allowedModels:t.allowedModels},console.warn(`[openclaw-code-agent] config.defaultModel is deprecated; use harnesses.${e}.defaultModel instead.`)}if(t.model!==void 0){let n=r.codex??{};r.codex={...n,defaultModel:t.harnesses?.codex?.defaultModel??t.model,allowedModels:t.harnesses?.codex?.allowedModels!==void 0?n.allowedModels:t.allowedModels},console.warn("[openclaw-code-agent] config.model is deprecated; use harnesses.codex.defaultModel instead.")}if(t.reasoningEffort!==void 0){let n=r.codex??{};r.codex={...n,reasoningEffort:t.harnesses?.codex?.reasoningEffort??t.reasoningEffort},console.warn("[openclaw-code-agent] config.reasoningEffort is deprecated; use harnesses.codex.reasoningEffort instead.")}if(t.allowedModels!==void 0){console.warn("[openclaw-code-agent] config.allowedModels is deprecated; use harnesses.<name>.allowedModels instead.");for(let[n,o]of Object.entries(r))t.harnesses?.[n]?.allowedModels===void 0&&(r[n]={...o,allowedModels:void 0})}_={maxSessions:t.maxSessions??20,defaultWorkdir:t.defaultWorkdir,idleTimeoutMinutes:t.idleTimeoutMinutes??15,sessionGcAgeMinutes:t.sessionGcAgeMinutes??1440,maxPersistedSessions:t.maxPersistedSessions??1e4,fallbackChannel:t.fallbackChannel,agentChannels:t.agentChannels,maxAutoResponds:t.maxAutoResponds??10,permissionMode:t.permissionMode??"plan",planApproval:t.planApproval??"ask",defaultHarness:e,harnesses:r,allowedModels:t.allowedModels,defaultWorktreeStrategy:t.defaultWorktreeStrategy??"off",worktreeDir:t.worktreeDir}}function Pe(){return _.defaultHarness??lm}function cm(t){let e=si[t],r=_.harnesses[t];return{...e,...r,allowedModels:r?.allowedModels??e?.allowedModels}}function $t(t){return cm(t).defaultModel}function en(t){return _.harnesses[t]?.allowedModels??_.allowedModels}function lt(t){return cm(t).reasoningEffort}function _t(t){return t==null?void 0:String(t).trim()||void 0}function Ad(t){return{channel:_t(t?.deliveryContext?.channel),to:_t(t?.deliveryContext?.to),accountId:_t(t?.deliveryContext?.accountId),threadId:_t(t?.deliveryContext?.threadId)}}function mm(t,e,r){if(!(!t||!e))return r?`${t}|${r}|${e}`:`${t}|${e}`}function xd(t){return _t(t?.requesterSenderId??t?.senderId)}function bd(t){return(_t(t.deliveryContext?.channel)??t.messageChannel??t.channel)?.toLowerCase()!=="telegram"?!1:!!Id(t.sessionKey)}function ai(t){let e=Ad(t),r=mm(e.channel,e.to,e.accountId);if(r)return r;if(t.messageChannel){let n=t.messageChannel.split("|");if(n.length>=3)return t.messageChannel;if(t.agentAccountId&&n.length>=2)return`${n[0]}|${t.agentAccountId}|${n.slice(1).join("|")}`;let o=_t(t.chatId);if(n.length===1&&o)return`${n[0]}|${o}`;let i=xd(t);if(n.length===1&&i&&!bd(t))return`${n[0]}|${i}`}if(t.workspaceDir){let n=Vn(t.workspaceDir);if(n)return n}if(t.messageChannel&&t.messageChannel.includes("|"))return t.messageChannel}function jt(t,e){if(e&&String(e).includes("|"))return String(e);let r=Ad(t),n=mm(r.channel,r.to,r.accountId);if(n)return n;if(t?.channelId&&String(t.channelId).includes("|"))return String(t.channelId);if(t?.messageChannel){let a=String(t.messageChannel);if(a.includes("|"))return a;let d=_t(t.chatId);if(d)return`${a}|${d}`;let l=xd(t);if(l&&!bd(t))return`${a}|${l}`}let o=_t(t?.channel),i=_t(t?.chatId);if(o&&i)return`${o}|${i}`;let s=xd(t);return o&&s&&!bd(t)?`${o}|${s}`:t?.id&&/^-?\d+$/.test(String(t.id))?`telegram|${t.id}`:_.fallbackChannel??"unknown"}function Kn(t){return Ad(t).threadId??t?.messageThreadId??void 0}function Et(t,e,r){return Bn(jt(t,e),Kn(t),r??t?.sessionKey)}function Vn(t){let e=_.agentChannels;if(!e)return;let r=i=>i.replace(/\/+$/,""),n=r(t),o=Object.entries(e).sort((i,s)=>s[0].length-i[0].length);for(let[i,s]of o)if(n===r(i)||n.startsWith(r(i)+"/"))return s}function fm(t){return Id(t)}var Un,lm,si,_,Re=u(()=>{br();lm="claude-code",si={"claude-code":{defaultModel:"anthropic/claude-sonnet-4-7",allowedModels:["sonnet","opus"]},codex:{defaultModel:"gpt-5.5",allowedModels:["gpt-5.5","gpt-5.5-pro"],reasoningEffort:"medium"}};_={maxSessions:20,idleTimeoutMinutes:15,sessionGcAgeMinutes:1440,maxPersistedSessions:1e4,maxAutoResponds:10,permissionMode:"plan",planApproval:"ask",harnesses:{"claude-code":{...si["claude-code"]},codex:{...si.codex}}}});function di(t){return{type:"backend_ref",ref:t}}function li(t){return{type:"run_started",...t?{runId:t}:{}}}function qn(t){return{type:"text_delta",text:t}}function gm(t,e){return{type:"tool_call",name:t,input:e}}function ui(t){return{type:"pending_input",state:t}}function nn(t){return t?{type:"pending_input_resolved",requestId:t}:{type:"pending_input_resolved"}}function pi(t,e){return{type:"plan_artifact",artifact:t,finalized:e}}function ci(t){return t?{type:"settings_changed",permissionMode:t}:{type:"settings_changed"}}function Ar(t){return{type:"run_completed",data:t}}var rn,Rd=u(()=>{rn=class{queue=[];resolvePending=null;done=!1;enqueue(e){this.queue.push(e),this.flush()}close(){this.done=!0,this.flush()}flush(){this.resolvePending&&(this.resolvePending(),this.resolvePending=null)}messages(){let e=this;return(async function*(){for(;;){for(;e.queue.length>0;)yield e.queue.shift();if(e.done)return;await new Promise(r=>{e.resolvePending=r})}})()}}});import*as fi from"@anthropic-ai/claude-agent-sdk";import{dirname as hm,join as Sm}from"path";import{fileURLToPath as Bv}from"url";import{createRequire as Uv}from"module";function Kv(t){if(typeof t.result=="string"&&t.result.length>0)return t.result;if(Array.isArray(t.errors)){let e=t.errors.filter(r=>typeof r=="string"&&r.length>0);if(e.length>0)return e.join(`
2
+ `)}}function Vv(t,e,r){let o=(Array.isArray(r.questions)?r.questions:[])[0]??{},i=typeof o.question=="string"?o.question:void 0,s=Array.isArray(o.options)?o.options.map(a=>{if(!a||typeof a!="object")return"";let d=a.label;return typeof d=="string"?d:""}).filter(Boolean):[];return{requestId:`${t||"claude"}-ask-${e}`,kind:"question",promptText:i,options:s,allowsFreeText:s.length===0||o.multiSelect===!0}}var mi,ym=u(()=>{Rd();mi=class{constructor(e={}){this.deps=e}deps;name="claude-code";backendKind="claude-code";supportedPermissionModes=["default","plan","bypassPermissions"];capabilities={nativePendingInput:!1,nativePlanArtifacts:!1,worktrees:"plugin-managed"};launch(e){let r=new rn,n=!1,o="",i=!1,s=0,a=e.resumeSessionId??"",d=e.canUseTool,l={cwd:e.cwd,model:e.model,permissionMode:e.permissionMode,allowDangerouslySkipPermissions:!0,pathToClaudeCodeExecutable:(()=>{try{let A=Uv(import.meta.url).resolve("@anthropic-ai/claude-agent-sdk");return Sm(hm(A),"cli.js")}catch{let k=hm(Bv(import.meta.url));return Sm(k,"..","node_modules","@anthropic-ai","claude-agent-sdk","cli.js")}})(),allowedTools:e.allowedTools,systemPrompt:e.systemPrompt,includePartialMessages:!0,abortController:e.abortController,mcpServers:e.mcpServers,...d?{canUseTool:async(k,A)=>{if(k!=="AskUserQuestion")return{behavior:"allow"};let b=Vv(a,++s,A);r.enqueue(ui(b));try{let w=await d(k,A);return r.enqueue(nn(b.requestId)),w}catch(w){throw r.enqueue(nn(b.requestId)),w}}}:{}};e.resumeSessionId&&(l.resume=e.resumeSessionId,l.forkSession=e.forkSession??!1);let m=e.prompt,g=this.deps.query??fi.query,y=this.deps.startup??fi.startup,f=(async()=>{if(typeof y!="function")return g({prompt:m,options:l});let k=await y({options:l});try{return k.query(m)}catch(A){throw await k.close?.(),A}})();return(async()=>{try{let k=await f;for await(let A of k){let b=A;if(b.type==="system"&&b.subtype==="init"){a=b.session_id??a,r.enqueue(di({kind:"claude-code",conversationId:a}));continue}if(b.type==="system"&&b.subtype==="status"&&b.permissionMode){r.enqueue(ci(b.permissionMode));continue}if(b.type==="assistant"){n||(n=!0,r.enqueue(li()));for(let w of b.message?.content??[]){if(w.type==="text"){o+=o?`
3
+ ${w.text}`:w.text,r.enqueue(qn(w.text));continue}w.type==="tool_use"&&((w.name==="ExitPlanMode"||w.name==="set_permission_mode")&&(i=!0),w.name!=="AskUserQuestion"&&r.enqueue(gm(w.name,w.input)))}continue}if(b.type==="result"){let w=o.trim();if(w&&(e.permissionMode==="plan"||i)){let C={explanation:void 0,steps:[],markdown:w};r.enqueue(pi(C,!0))}r.enqueue(Ar({success:b.subtype==="success",duration_ms:b.duration_ms??0,total_cost_usd:b.total_cost_usd??0,num_turns:b.num_turns??0,result:Kv(b),session_id:b.session_id??a})),o="",i=!1,n=!1}}}finally{r.close()}})().catch(k=>{r.enqueue(Ar({success:!1,duration_ms:0,total_cost_usd:0,num_turns:0,result:k instanceof Error?k.message:String(k),session_id:a})),r.close()}),{messages:r.messages(),async setPermissionMode(k){let A=await f;typeof A.setPermissionMode=="function"&&await A.setPermissionMode(k)},async streamInput(k){let A=await f;typeof A.streamInput=="function"&&await A.streamInput(k)},async interrupt(){let k=await f;typeof k.interrupt=="function"&&await k.interrupt()}}}buildUserMessage(e,r){return{type:"user",message:{role:"user",content:e},parent_tool_use_id:null,session_id:r}}}});import{spawn as qv}from"node:child_process";import jv from"node:readline";function Gv(t){return t instanceof Error?t.message:String(t)}function Hv(t){try{let e=JSON.parse(t);return!e||typeof e!="object"||Array.isArray(e)?null:e}catch{return null}}async function zv(t,e){if(t.id!=null&&(Object.hasOwn(t,"result")||Object.hasOwn(t,"error"))){let n=String(t.id),o=e.pending.get(n);if(!o)return;if(clearTimeout(o.timer),e.pending.delete(n),t.error){o.reject(new Error(`codex app server rpc error (${t.error.code??"unknown"}): ${t.error.message??"unknown error"}`));return}o.resolve(t.result);return}let r=t.method?.trim();if(r){if(t.id==null){await e.onNotification(r,t.params);return}try{let n=await e.onRequest(r,t.params);e.respond({jsonrpc:"2.0",id:t.id,result:n??{}})}catch(n){e.respond({jsonrpc:"2.0",id:t.id,error:{code:-32603,message:Gv(n)}})}}}var gi,km=u(()=>{gi=class{constructor(e,r,n){this.command=e;this.args=r;this.requestTimeoutMs=n}command;args;requestTimeoutMs;process=null;pending=new Map;counter=0;onNotification=()=>{};onRequest=async()=>({});setNotificationHandler(e){this.onNotification=e}setRequestHandler(e){this.onRequest=e}async connect(){if(this.process)return;let e=qv(this.command,["app-server",...this.args],{stdio:["pipe","pipe","pipe"],env:process.env});if(!e.stdin||!e.stdout||!e.stderr)throw new Error("codex app server stdio pipes unavailable");this.process=e,jv.createInterface({input:e.stdout}).on("line",n=>{this.handleLine(n)}),e.stderr.on("data",()=>{}),e.on("close",()=>{this.flushPending(new Error("codex app server stdio closed")),this.process=null})}async close(){this.flushPending(new Error("codex app server stdio closed"));let e=this.process;this.process=null,e&&e.kill()}async notify(e,r){this.write({jsonrpc:"2.0",method:e,params:r??{}})}async request(e,r,n){let o=`rpc-${++this.counter}`,i=new Promise((s,a)=>{let d=setTimeout(()=>{this.pending.delete(o),a(new Error(`codex app server timeout: ${e}`))},Math.max(100,n??this.requestTimeoutMs));d.unref?.(),this.pending.set(o,{resolve:s,reject:a,timer:d})});return this.write({jsonrpc:"2.0",id:o,method:e,params:r??{}}),await i}write(e){if(!this.process?.stdin)throw new Error("codex app server stdio not connected");this.process.stdin.write(`${JSON.stringify(e)}
4
+ `)}async handleLine(e){let r=Hv(e);r&&await zv(r,{pending:this.pending,onNotification:this.onNotification,onRequest:this.onRequest,respond:n=>this.write(n)})}flushPending(e){for(let[r,n]of this.pending)clearTimeout(n.timer),n.reject(e),this.pending.delete(r)}}});function X(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function le(t,e,r){for(let n of e){let o=t?.[n];if(typeof o!="string")continue;let i=r?.trim===!1?o:o.trim();if(i)return i}}function Qv(t){return t instanceof Error?t.message:String(t)}function vm(t){return t?t.split(",").map(e=>e.trim()).filter(Boolean):[]}function ir(t){if(typeof t=="string")return t;if(Array.isArray(t))return t.map(r=>ir(r)).join("");let e=X(t);if(!e)return"";for(let r of["delta","text","content","message","input","output","parts"]){let n=ir(e[r]);if(n)return n}for(let r of["item","turn","thread","response","result","data"]){let n=ir(e[r]);if(n)return n}return""}function jn(t){let e=X(t);if(!e)return{};let r=X(e.thread)??X(e.session),n=X(e.turn)??X(e.run),o=X(e.item),i=X(e.serverRequest);return{threadId:le(e,["threadId","thread_id","conversationId","conversation_id"])??le(r,["id","threadId","thread_id","conversationId"]),runId:le(e,["turnId","turn_id","runId","run_id"])??le(n,["id","turnId","turn_id","runId","run_id"]),requestId:le(e,["requestId","request_id","serverRequestId"])??le(i,["id","requestId","request_id"]),itemId:le(e,["itemId","item_id"])??le(o,["id","itemId","item_id"])}}function hi(t,e,r=0){if(r>6)return;if(Array.isArray(t)){for(let i of t){let s=hi(i,e,r+1);if(s)return s}return}let n=X(t);if(!n)return;let o=le(n,e);if(o)return o;for(let i of Object.values(n)){let s=hi(i,e,r+1);if(s)return s}}function Gn(t){return{threadId:jn(t).threadId,cwd:hi(t,["cwd","workdir","directory"])}}function Pm(t){let e=t?.trim();return!!(e&&/[/\\]worktrees[/\\][^/\\]+[/\\][^/\\]+/.test(e))}function wm(t){let e=t?.trim();if(!e)return;let r=e.split(/[/\\]+/).filter(Boolean),n=r.lastIndexOf("worktrees");if(!(n<0||n+1>=r.length))return r[n+1]}function Si(t){let e=X(t);if(!e)return;let r=X(e.item)??e;return le(r,["id","itemId","item_id","messageId","message_id"])}function Jv(t,e=!1){let r=X(t);if(!r)return"";let n=X(r.item)??r;return le(n,["type"])?.toLowerCase()!=="agentmessage"?"":e?ir(n):le(n,["text"],{trim:!1})??ir(n)}function Im(t,e){let r=t.trim().toLowerCase();return r==="item/agentmessage/delta"?{mode:"delta",text:ir(e),itemId:Si(e)}:r==="item/completed"?{mode:"snapshot",text:Jv(e),itemId:Si(e)}:{mode:"ignore",text:""}}function xm(t){return{itemId:Si(t),delta:ir(t)}}function bm(t){let e=X(t),r=X(e?.plan),o=(Array.isArray(e?.plan)?e.plan:Array.isArray(r?.steps)?r.steps:[]).map(i=>{let s=X(i),a=le(s,["step","title","text"]);if(!a)return null;let d=le(s,["status"])?.toLowerCase()??"pending";return{step:a,status:d==="inprogress"||d==="in_progress"?"inProgress":d==="completed"?"completed":"pending"}}).filter(Boolean);return{explanation:le(r,["explanation"])??le(e,["explanation"]),steps:o}}function Am(t){let e=X(t);if(!e)return{};let r=X(e.item)??e;return le(r,["type"])?.toLowerCase()!=="plan"?{}:{itemId:Si(r),text:le(r,["text"],{trim:!1})??ir(r)}}function Rm(t,e){let r=t.trim().toLowerCase();if(r==="turn/failed")return"failed";if(r==="turn/cancelled")return"interrupted";let n=X(e)??{},o=X(n.turn)??n,i=le(o,["status"])?.toLowerCase();return i==="failed"?"failed":i==="interrupted"||i==="cancelled"?"interrupted":"completed"}function Tm(t,e){let r=X(e)??{},n=X(r.turn)??r,o=X(n.error)??X(r.error);if(o)return le(o,["message","text","summary","reason"])}function Yv(t,e){let r=Qv(t).toLowerCase();return r.includes("method not found")||r.includes("unknown method")?!0:r.includes("unknown variant")?e?r.includes(`unknown variant \`${e.toLowerCase()}\``):!0:!1}function Zv(t){return Xv.has(t.trim().toLowerCase())}function eP(t){let e=X(t);return e?!!le(e,["threadId","thread_id"]):!1}async function Hn(t){if(t.payloads.length===0)throw new Error(`codex app server request skipped: no payloads for ${t.methods.join(", ")||"<none>"}`);let e;for(let r of t.methods)for(let n of t.payloads){if(Zv(r)&&!eP(n))throw new Error(`codex app server request missing threadId: ${r}`);try{return await t.client.request(r,n,t.timeoutMs)}catch(o){if(e=o,!Yv(o,r))continue}}throw e instanceof Error?e:new Error(String(e))}function Mm(t){let e={cwd:t.cwd};t.model?.trim()&&(e.model=t.model.trim()),t.approvalPolicy?.trim()&&(e.approvalPolicy=t.approvalPolicy.trim()),t.sandbox?.trim()&&(e.sandbox=t.sandbox.trim());let r={cwd:t.cwd};return t.approvalPolicy?.trim()&&(r.approvalPolicy=t.approvalPolicy.trim()),t.sandbox?.trim()&&(r.sandbox=t.sandbox.trim()),[e,r,{}]}function Cm(t){let e={threadId:t.threadId,persistExtendedHistory:!1};return t.model?.trim()&&(e.model=t.model.trim()),t.reasoningEffort?.trim()&&(e.reasoningEffort=t.reasoningEffort.trim()),t.cwd?.trim()&&(e.cwd=t.cwd.trim()),t.approvalPolicy?.trim()&&(e.approvalPolicy=t.approvalPolicy.trim()),t.sandbox?.trim()&&(e.sandbox=t.sandbox.trim()),[e]}function tP(t){return[{type:"text",text:t}]}function rP(t,e,r,n){let o=e?.trim(),i=n?.trim();if(t!=="plan")return o||i?{mode:"default",settings:{...o?{model:o}:{},...r?.trim()?{reasoningEffort:r.trim()}:{},developerInstructions:i??null}}:void 0;if(!(!o&&!i))return{mode:"plan",settings:{...o?{model:o}:{},...r?.trim()?{reasoningEffort:r.trim()}:{},developerInstructions:i??null}}}function _m(t){let e={threadId:t.threadId,input:tP(t.prompt)};t.model?.trim()&&(e.model=t.model.trim()),t.approvalPolicy?.trim()&&(e.approvalPolicy=t.approvalPolicy.trim()),t.sandbox?.trim()&&(e.sandbox=t.sandbox.trim());let r=rP(t.permissionMode??"default",t.model,t.reasoningEffort,t.systemPrompt);return r?[{...e,collaborationMode:r},{...e,collaboration_mode:{mode:r.mode,settings:{...typeof r.settings.model=="string"?{model:r.settings.model}:{},...typeof r.settings.reasoningEffort=="string"?{reasoning_effort:r.settings.reasoningEffort}:{},developer_instructions:r.settings.developerInstructions??null}}},e]:[e]}function $m(t){return[{threadId:t.threadId,turnId:t.turnId}]}function nP(t){let e=X(t);if(!e)return[];let r=e.options??e.choices??e.availableDecisions??e.decisions;return Array.isArray(r)?r.map(n=>typeof n=="string"?n.trim():le(X(n),["label","title","text","value","name","id"])??"").filter(Boolean):[]}function oP(t){let e=t.trim().toLowerCase();return e.includes("session")?"acceptForSession":/cancel|abort|stop/.test(e)?"cancel":/deny|decline|reject|block|no/.test(e)?"decline":/approve|allow|accept|yes/.test(e)?"accept":t.trim()}function Em(t,e,r){let n=t.trim().toLowerCase(),o=nP(r),i=hi(r,["question","prompt","message","text","summary","reason"])??void 0,s=n.includes("requestapproval"),a=s?o.map(d=>({kind:"approval",label:d,decision:oP(d),responseDecision:d})):o.map(d=>({kind:"option",label:d,value:d}));return{requestId:e,kind:s?"approval":"question",promptText:i,options:o,actions:a,allowsFreeText:!0}}function Om(t){let e=t.trim().toLowerCase();return e.includes("requestuserinput")||e.includes("requestapproval")}function Td(t,e){let r=t==="bypassPermissions"?"never":e?.trim()||"never";return{approvalPolicy:r,sandbox:r==="never"?"danger-full-access":void 0}}var Xv,Dm=u(()=>{Xv=new Set(["thread/resume","turn/start","turn/steer","turn/interrupt"])});function Nm(t){return t instanceof Error?t.message:String(t)}function lP(t){if(typeof t=="string")return t;if(!t||typeof t!="object")return String(t);let e=t;return typeof e.message?.content=="string"?e.message.content:typeof e.text=="string"?e.text:String(t)}var iP,Rr,sP,aP,dP,yi,Fm=u(()=>{km();Rd();Dm();iP="1.0",Rr=6e4,sP="OPENCLAW_CODEX_APP_SERVER_COMMAND",aP="OPENCLAW_CODEX_APP_SERVER_ARGS",dP="OPENCLAW_CODEX_APP_SERVER_TIMEOUT_MS";yi=class{constructor(e={}){this.deps=e}deps;name="codex";backendKind="codex-app-server";supportedPermissionModes=["default","plan","bypassPermissions"];capabilities={nativePendingInput:!0,nativePlanArtifacts:!0,worktrees:"native-restore"};launch(e){let r={command:process.env[sP]?.trim()||"codex",args:vm(process.env[aP]),requestTimeoutMs:Number.parseInt(process.env[dP]??String(Rr),10)||Rr},n=this.deps.createClient?.(r)??new gi(r.command,r.args,r.requestTimeoutMs),o=new rn,i=e.resumeSessionId,s,a=e.backendRef?.worktreePath,d=e.backendRef?.worktreeId,l=e.permissionMode??"default",m,g=0,y="",f=[],k,A=new Map,b=new Set,w=D=>{let N=D?.trim();if(!N)return;let K=e.originalWorkdir?.trim()||e.cwd.trim();e.worktreeStrategy&&e.worktreeStrategy!=="off"&&N!==K&&Pm(N)&&(a=N,d=wm(N))},C=()=>{i&&o.enqueue(di({kind:"codex-app-server",conversationId:i,...s?{runId:s}:{},...d?{worktreeId:d}:{},...a?{worktreePath:a}:{}}))};n.setNotificationHandler(async(D,N)=>{let K=D.trim().toLowerCase(),ue=jn(N),ct=Gn(N);if(ue.threadId&&i&&ue.threadId!==i)return;if(ue.threadId&&(i=ue.threadId),ue.runId&&(s=ue.runId),w(ct.cwd),(ue.threadId||ue.runId||ct.cwd)&&C(),K==="serverrequest/resolved"){m&&(o.enqueue(nn(m.requestId)),m=void 0);return}if(K==="turn/plan/updated"){let Te=bm(N);y=Te.explanation??y,Te.steps.length>0&&(f=Te.steps);return}if(K==="item/plan/delta"){let Te=xm(N);if(Te.itemId&&Te.delta){let Gt=A.get(Te.itemId)??"";A.set(Te.itemId,`${Gt}${Te.delta}`)}return}if(K==="item/completed"){let Te=Am(N);if(Te.text?.trim()){let Gt={explanation:y||void 0,steps:f,markdown:Te.text.trim()};o.enqueue(pi(Gt,!0));return}}let ae=Im(K,N);if(ae.mode==="delta"&&ae.text){ae.itemId&&b.add(ae.itemId),o.enqueue(qn(ae.text));return}ae.mode==="snapshot"&&ae.text&&(!ae.itemId||!b.has(ae.itemId))&&o.enqueue(qn(ae.text)),(K==="turn/completed"||K==="turn/failed"||K==="turn/cancelled")&&k&&(k.method=D,k.params=N,k.resolve())}),n.setRequestHandler(async(D,N)=>{if(!Om(D))return{};let K=jn(N),ue=Gn(N);if(K.threadId&&i&&K.threadId!==i)return{};K.threadId&&(i=K.threadId),K.runId&&(s=K.runId),w(ue.cwd),(K.threadId||K.runId||ue.cwd)&&C();let ct=K.requestId??`${i??"codex"}-${Date.now().toString(36)}`,ae=Em(D,ct,N),Te=D.trim().toLowerCase(),Gt=ae.options,po=ae.actions??[],Ug=await new Promise(Kg=>{m={requestId:ct,methodLower:Te,state:ae,options:Gt,actions:po,resolveResponse:Kg},o.enqueue(ui(ae))});return m=void 0,o.enqueue(nn(ct)),Ug});let I=async()=>{await n.connect(),await n.request("initialize",{protocolVersion:iP,clientInfo:{name:"openclaw-code-agent",version:"3.1.0"},capabilities:{experimentalApi:!0}},Rr),await n.notify("initialized",{})},R=async()=>{let D=Td(l,e.codexApprovalPolicy);if(i){let ue=await Hn({client:n,methods:["thread/resume"],payloads:Cm({threadId:i,model:e.model,reasoningEffort:e.reasoningEffort,approvalPolicy:D.approvalPolicy,sandbox:D.sandbox}),timeoutMs:Rr}),ct=Gn(ue);i=ct.threadId??i,w(ct.cwd),C();return}let N=await Hn({client:n,methods:["thread/start","thread/new"],payloads:Mm({cwd:e.originalWorkdir?.trim()||e.cwd,model:e.model,approvalPolicy:D.approvalPolicy,sandbox:D.sandbox}),timeoutMs:Rr}),K=Gn(N);if(i=K.threadId,!i)throw new Error("Codex App Server did not return a thread id.");w(K.cwd),C()},O=async D=>{await R(),o.enqueue(li()),g+=1,y="",f=[],A.clear(),b.clear();let N="",K,ue,ct=new Promise(ae=>{ue=ae});k={resolve:ue};try{let ae=Td(l,e.codexApprovalPolicy),Te=await Hn({client:n,methods:["turn/start"],payloads:_m({threadId:i,prompt:D,model:e.model,reasoningEffort:e.reasoningEffort,systemPrompt:e.systemPrompt,permissionMode:l,approvalPolicy:ae.approvalPolicy,sandbox:ae.sandbox}),timeoutMs:Rr}),Gt=jn(Te);Gt.runId&&(s=Gt.runId,C()),await ct,N=k?.method??"turn/failed",K=k?.params;let po=Rm(N,K);o.enqueue(Ar({success:po==="completed",outcome:po,duration_ms:0,total_cost_usd:0,num_turns:g,result:Tm(N,K),session_id:i}))}catch(ae){o.enqueue(Ar({success:!1,duration_ms:0,total_cost_usd:0,num_turns:g,result:Nm(ae),session_id:i??""}))}finally{k=void 0}},Le=async D=>m?(m.methodLower.includes("requestapproval")?m.resolveResponse({decision:D.trim()||"decline"}):m.resolveResponse({text:D.trim()}),!0):!1,Sl=async D=>{let N=m;if(!N)return!1;let K=N.actions[D];if(K?.kind==="approval")return N.resolveResponse({decision:K.responseDecision,...K.proposedExecpolicyAmendment?{proposedExecpolicyAmendment:K.proposedExecpolicyAmendment}:{}}),!0;let ue=N.options[D];return ue?(N.methodLower.includes("requestapproval")?N.resolveResponse({decision:ue}):N.resolveResponse({option:ue,index:D}),!0):!1},yl=typeof e.prompt=="string"?(async function*(){yield{type:"user",text:e.prompt,session_id:e.resumeSessionId??""}})():e.prompt;return(async()=>{try{await I();for await(let D of yl){let N=lP(D).trim();!N||await Le(N)||await O(N)}}catch(D){o.enqueue(Ar({success:!1,duration_ms:0,total_cost_usd:0,num_turns:g,result:Nm(D),session_id:i??e.resumeSessionId??""}))}finally{await n.close().catch(()=>{}),o.close()}})(),{messages:o.messages(),async setPermissionMode(D){l=D,o.enqueue(ci(D))},async submitPendingInputOption(D){return Sl(D)},async submitPendingInputText(D){return Le(D)},async interrupt(){!i||!s||await Hn({client:n,methods:["turn/interrupt"],payloads:$m({threadId:i,turnId:s}),timeoutMs:Rr}).catch(()=>{})}}}buildUserMessage(e,r){return{type:"user",text:e,session_id:r}}}});function Lm(t){Md.set(t.name,t)}function zn(t){let e=Md.get(t);if(!e)throw new Error(`Unknown agent harness: "${t}". Available: ${[...Md.keys()].join(", ")}`);return e}function Wm(){return zn(Pe())}var Md,Cd=u(()=>{ym();Fm();Re();Md=new Map;Lm(new mi);Lm(new yi)});function $(t){return t.backendRef?.conversationId??t.harnessSessionId}function re(t){return t.id??t.sessionId??t.name??$(t)??t.harnessSessionId}function uP(t){return t.harnessSessionId}function et(t){let e=[re(t),$(t),uP(t)].filter(r=>!!r);return[...new Set(e)]}function _d(t){return t.harnessName??t.persistedHarness??Pe()}function ki(t){if(t.backendRef?.kind==="codex-app-server")return"native-restore";try{return zn(_d(t)).capabilities.worktrees}catch{return"plugin-managed"}}function $d(t){return t==="native-execution"||t==="native-restore"}function Bm(t){return t==="native-restore"}function pP(t){return!!(t.backendRef?.worktreePath||t.backendRef?.worktreeId)}function Ne(t){return $d(ki(t))&&pP(t)}var ke=u(()=>{Re();Cd()});import{execFileSync as xe}from"child_process";import*as Ri from"fs";import{tmpdir as TP}from"os";import{dirname as tf,join as MP}from"path";function CP(t){try{return xe("git",["rev-parse","--show-toplevel"],{cwd:t,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{return}}function Ti(t){if(process.env.OPENCLAW_WORKTREE_DIR)return process.env.OPENCLAW_WORKTREE_DIR;if(_.worktreeDir)return _.worktreeDir;if(t){let e=CP(t);if(e)return MP(e,".worktrees")}return TP()}function rf(t){return t.replace(/[^a-zA-Z0-9._-]/g,"-").replace(/\.{2,}/g,"-").replace(/^[-.]|[-.]$/g,"").slice(0,100)||"session"}function Mi(t){try{let e=xe("git",["-C",t,"rev-parse","--git-common-dir"],{cwd:t,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return e&&e.endsWith("/.git")?tf(e):void 0}catch{return}}function _P(){if(bi!==void 0)return bi;try{return xe("git",["--version"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),bi=!0,!0}catch{return bi=!1,!1}}function sr(){if(Ai!==void 0)return Ai;try{return xe("gh",["--version"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),Ai=!0,!0}catch{return Ai=!1,!1}}function Dd(t){if(!_P())return!1;try{return xe("git",["rev-parse","--git-dir"],{cwd:t,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function nf(t){try{let e=EP(t);if(!e)return console.warn(`[worktree] Failed to resolve free-space probe path for ${Ti(t)}`),!0;let r=Ri.statfsSync(e),n=r.bavail*r.bsize;return OP(n)}catch(e){return console.warn(`[worktree] Failed to check free space: ${e instanceof Error?e.message:String(e)}`),!0}}function Yn(t,e){try{return xe("git",["-C",t,"rev-parse","--verify",e],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function $P(t){let e=t;for(;;){if(Ri.existsSync(e))return e;let r=tf(e);if(r===e)return;e=r}}function EP(t){return $P(Ti(t))}function OP(t){return t>=104857600}function ar(t){let e=process.env.OPENCLAW_WORKTREE_BASE_BRANCH?.trim();if(e)return e;try{let n=xe("git",["-C",t,"rev-parse","--abbrev-ref","origin/HEAD"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().replace(/^origin\//,"");if(n)return n}catch{}try{return xe("git",["-C",t,"rev-parse","--verify","main"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),"main"}catch{}try{return xe("git",["-C",t,"rev-parse","--verify","master"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),"master"}catch{return"main"}}function Ci(t){try{let r=xe("git",["-C",t,"rev-parse","--abbrev-ref","HEAD"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(r==="HEAD"){console.warn(`[worktree] Worktree ${t} is in detached HEAD state \u2014 cannot determine branch name`);return}return r||void 0}catch{return}}function Nd(t,e,r){try{let n=xe("git",["-C",t,"rev-list","--count",`${r}..${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});return parseInt(n.trim(),10)>0}catch{return!1}}function of(t,e,r){try{let n=xe("git",["-C",t,"rev-list","--left-right","--count",`${e}...${r}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),[o,i]=n.split(/\s+/);return{ahead:parseInt(o??"0",10)||0,behind:parseInt(i??"0",10)||0}}catch{return}}function sf(t,e,r){try{return xe("git",["-C",t,"merge-base","--is-ancestor",e,r],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function af(t,e,r){try{let n=xe("git",["-C",t,"merge-tree","--write-tree",r,e],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),o=xe("git",["-C",t,"rev-parse",`${r}^{tree}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return!!n&&n===o}catch{return!1}}function Ot(t,e){try{return xe("git",["-C",t,"branch","-D",e],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(r){return console.warn(`[worktree] Failed to delete branch ${e}: ${r instanceof Error?r.message:String(r)}`),!1}}function df(t,e){if(e)return e;let r;try{r=xe("git",["-C",t,"remote","get-url","origin"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{}try{let n=xe("git",["-C",t,"remote","get-url","upstream"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(n&&n!==r){let o=n.match(/[:/]([^/]+\/[^/]+?)(?:\.git)?$/);if(o)return o[1]}}catch{}}var bi,Ai,Xn=u(()=>{Re()});import{execFileSync as Zn}from"child_process";import{existsSync as DP,mkdirSync as lf,rmSync as Fd}from"fs";function NP(t,e){return!!(t&&typeof t=="object"&&"code"in t&&t.code===e)}function Ld(t,e,r={}){let n=rf(e),o=Ti(t);lf(o,{recursive:!0});let i=r.allowExistingBranch===!0,s,a,d=10,l=!1;for(let g=0;g<d;g++){let y=g===0?"":`-${Math.random().toString(16).slice(2,6)}`,f=`${o}/openclaw-worktree-${n}${y}`,k=`agent/${n}${y}`;if(!i&&Yn(t,k))continue;let A=!1;do{A=!1;try{lf(f,{recursive:!1}),s=f,a=k;break}catch(b){if(NP(b,"EEXIST")){if(i&&g===0&&!l)try{Fd(f,{recursive:!0,force:!0}),l=!0,A=!0}catch(w){throw new Error(`Failed to recreate existing worktree branch ${k}: could not clear blocked path ${f}: ${w instanceof Error?w.message:String(w)}`)}else if(i&&g===0)throw new Error(`Failed to recreate existing worktree branch ${k}: path ${f} remains blocked after one cleanup attempt`);continue}throw b}}while(A);if(s&&a)break}if(!s||!a)throw new Error(`Failed to create unique worktree directory and branch after ${d} attempts`);let m=Yn(t,a);try{m?Zn("git",["-C",t,"worktree","add",s,a],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}):Zn("git",["-C",t,"worktree","add","-b",a,s],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(g){try{Fd(s,{recursive:!0,force:!0})}catch{}throw g}return s}function FP(t){if(!DP(t))return[];try{let e=Zn("git",["-C",t,"status","--porcelain","--untracked-files=all"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return e?e.split(`
5
+ `).map(r=>r.trim()).filter(Boolean):[]}catch{return[]}}function tt(t,e,r={}){let n=r.destructive===!0,o=FP(e);if(o.length>0&&!n)return console.warn(`[worktree] Refusing implicit cleanup for dirty worktree ${e}: ${o[0]}`),!1;try{return Zn("git",["-C",t,"worktree","remove",...n?["--force"]:[],e],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(i){if(console.warn(`[worktree] git worktree remove failed for ${e}: ${i instanceof Error?i.message:String(i)}`),!n)return!1;try{return Fd(e,{recursive:!0,force:!0}),console.info(`[worktree] Fallback rmSync succeeded for ${e}`),!0}catch(s){return console.error(`[worktree] Both git worktree remove and rmSync failed for ${e}: ${s instanceof Error?s.message:String(s)}`),!1}}}function _i(t){try{Zn("git",["-C",t,"worktree","prune"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{}}var uf=u(()=>{Xn()});import{execFileSync as ne}from"child_process";import{existsSync as LP}from"fs";function Mr(t,e,r){try{let n=ne("git",["-C",t,"rev-list","--count",`${r}..${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),o=parseInt(n.trim(),10),s=ne("git",["-C",t,"diff","--shortstat",`${r}...${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),a=0,d=0,l=0,m=s.match(/(\d+)\s+files?\s+changed/);m&&(a=parseInt(m[1],10));let g=s.match(/(\d+)\s+insertions?\(/);g&&(d=parseInt(g[1],10));let y=s.match(/(\d+)\s+deletions?\(/);y&&(l=parseInt(y[1],10));let k=ne("git",["-C",t,"diff","--name-only","--diff-filter=ACMR",`${r}...${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().split(`
6
6
  `).map(w=>w.trim()).filter(Boolean),b=ne("git",["-C",t,"log",`${r}..${e}`,"--format=%h|%s|%an","-n","5"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().split(`
7
- `).filter(Boolean).map(w=>{let[C,I,R]=w.split("|");return{hash:C||"",message:I||"",author:R||""}});return{commits:o,filesChanged:a,insertions:d,deletions:l,changedFiles:k,commitMessages:b}}catch(n){console.warn(`[worktree] Failed to get diff summary: ${n instanceof Error?n.message:String(n)}`);return}}function $i(t,e,r="origin"){try{return ne("git",["-C",t,"push",r,e],{timeout:6e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(n){return console.warn(`[worktree] Failed to push branch ${e}: ${n instanceof Error?n.message:String(n)}`),!1}}function dn(t){try{return ne("git",["-C",t,"status","--porcelain"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).split(`
8
- `).some(r=>r.length>0&&!r.startsWith("??")&&!r.startsWith("!!"))}catch{return!1}}function Ei(t,e,r,n="merge",o){let i=!1,s,a=d=>{if(i)try{ne("git",["-C",d,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{}};try{if(n==="squash"){if(ne("git",["-C",t,"checkout",r],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),dn(t)){let y;try{y=ne("git",["-C",t,"stash","push","-m",`pre-merge stash before ${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(f){return{success:!1,dirtyError:!0,error:`Auto-stash failed: ${f instanceof Error?f.message:String(f)}. Commit or stash changes manually, then retry.`}}if(!y.includes("No local changes to save")){i=!0;try{s=ne("git",["-C",t,"stash","list","--format=%gd","-n","1"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{}}}ne("git",["-C",t,"merge","--squash",e],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),ne("git",["-C",t,"commit","-m",`Squash merge ${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});let g=!1;if(i)try{ne("git",["-C",t,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{g=!0}return{success:!0,stashed:i||void 0,stashRef:s,stashPopConflict:g||void 0}}let d=o&&LP(o),l=d?o:t;if(d||ne("git",["-C",t,"checkout",e],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),dn(t)){let g;try{g=ne("git",["-C",t,"stash","push","-m",`pre-merge stash before ${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(y){try{ne("git",["-C",t,"checkout",r],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{}return{success:!1,dirtyError:!0,error:`Auto-stash failed: ${y instanceof Error?y.message:String(y)}. Commit or stash changes manually, then retry.`}}if(!g.includes("No local changes to save")){i=!0;try{s=ne("git",["-C",t,"stash","list","--format=%gd","-n","1"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{}}}try{ne("git",["-C",l,"rebase",r],{timeout:6e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{try{ne("git",["-C",l,"rebase","--abort"],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{}try{ne("git",["-C",t,"checkout",r],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{}return a(t),{success:!1,rebaseConflict:!0,stashed:i||void 0,stashRef:s,error:[`Rebase of ${e} onto ${r} hit conflicts.`,"To resolve manually:",` cd ${l}`,` git rebase ${r}`," # resolve conflicts in each file, then:"," git add <file>"," git rebase --continue"," # repeat until rebase finishes, then re-run agent_merge."].join(`
9
- `)}}ne("git",["-C",t,"checkout",r],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),ne("git",["-C",t,"merge","--ff-only",e],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});let m=!1;if(i)try{ne("git",["-C",t,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{m=!0}return{success:!0,fastForward:!0,stashed:i||void 0,stashRef:s,stashPopConflict:m||void 0}}catch(d){try{ne("git",["-C",t,"checkout",r],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{}return a(t),{success:!1,error:d instanceof Error?d.message:String(d),stashed:i||void 0,stashRef:s}}}var Wd=u(()=>{});import{execFileSync as Oi}from"child_process";function pf(t,e,r,n,o,i){if(!sr())return{success:!1,error:"GitHub CLI (gh) is not available"};try{let s;if(i)try{let g=Oi("git",["-C",t,"remote","get-url","origin"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().match(/[:/]([^/]+)\/[^/]+(?:\.git)?$/);g&&(s=g[1])}catch{}let a=["pr","create","--base",r];return i&&a.push("--repo",i),s?a.push("--head",`${s}:${e}`):a.push("--head",e),n&&o?a.push("--title",n,"--body",o):a.push("--fill-verbose"),{success:!0,prUrl:Oi("gh",a,{cwd:t,timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}function eo(t,e,r){if(!sr())return{exists:!1,state:"none"};try{let n=["pr","list","--head",e,"--state","all","--json","url,number,title,state","--jq",".[0]"];r&&n.push("--repo",r);let i=Oi("gh",n,{cwd:t,timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(!i)return{exists:!1,state:"none"};let s=JSON.parse(i),a=s.state.toLowerCase();return{exists:!0,state:a==="open"?"open":a==="merged"?"merged":a==="closed"?"closed":"none",url:s.url,number:s.number,title:s.title}}catch(n){return console.warn(`[worktree] Failed to sync PR status for ${e}: ${n instanceof Error?n.message:String(n)}`),{exists:!1,state:"none"}}}function cf(t,e,r,n){if(!sr())return!1;try{let o=["pr","comment",String(e),"--body",r];return n&&o.push("--repo",n),Oi("gh",o,{cwd:t,timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(o){return console.warn(`[worktree] Failed to comment on PR #${e}: ${o instanceof Error?o.message:String(o)}`),!1}}function _r(t){if(t.kind==="merge"){let e=t.filesChanged!==void 0?` (${t.filesChanged} files, +${t.insertions??0}/-${t.deletions??0})`:"";return`\u2705 Merged: ${t.branch} \u2192 ${t.base??"main"}${e}`}return t.kind==="pr-updated"?`\u2705 PR updated: ${t.prUrl??""}`:t.targetRepo?`\u2705 PR opened against ${t.targetRepo}: ${t.prUrl??""}`:`\u2705 PR opened: ${t.prUrl??""}`}var Bd=u(()=>{Xn()});import{existsSync as Ud}from"fs";function mf(){return new Date().toISOString()}function WP(t){return t.worktreeLifecycle??{state:t.worktreePath||t.worktreeBranch?"provisioned":"none",updatedAt:mf(),baseBranch:t.worktreeBaseBranch,targetRepo:t.worktreePrTargetRepo,pushRemote:t.worktreePushRemote}}function BP(t){return t.worktreeLifecycle?.baseBranch??t.worktreeBaseBranch??(Ud(t.workdir)?ar(t.workdir):void 0)}function to(t,e={}){let r=WP(t),n=mf(),o=new Set,i=Ud(t.workdir),s=!!(t.worktreePath&&Ud(t.worktreePath)),a=t.worktreeBranch,d=BP(t),l=!1,m=!1,g=!1,y=!1,f,k,A=t.worktreePrUrl?"open":"none",b=t.worktreePrUrl,w=t.worktreePrNumber;if(i||o.add("repo_missing"),a||o.add("branch_missing"),!s&&t.worktreePath&&o.add("worktree_missing"),e.activeSession&&o.add("active_session"),r.state==="pending_decision"&&o.add("pending_decision"),r.state==="merge_conflict_resolving"&&o.add("merge_conflict_resolving"),i&&a&&(l=Yn(t.workdir,a),l||o.add("branch_missing")),s&&t.worktreePath&&(m=dn(t.worktreePath),m&&o.add("dirty_tracked_changes")),i&&l&&d){let Le=of(t.workdir,a,d);f=Le?.ahead,k=Le?.behind,g=sf(t.workdir,a,d),g?o.add("topology_merged"):(y=af(t.workdir,a,d),y&&o.add("merge_noop_content_already_on_base"),!y&&(f??0)>0&&o.add("unique_content"))}else d||o.add("base_branch_missing");if(e.includePrSync&&i&&a){let Le=eo(t.workdir,a,t.worktreePrTargetRepo??r.targetRepo);A=Le.state,b=Le.url??b,w=Le.number??w}A==="open"&&o.add("pr_open"),A==="merged"&&!g&&!y&&o.add("pr_merged_not_reflected_locally");let C=r.state;g?C="merged":y?C="released":!l&&r.state==="pending_decision"&&(C="cleanup_failed");let I=e.activeSession||m||r.state==="pending_decision"||r.state==="merge_conflict_resolving"||r.state==="pr_open"||A==="open"||o.has("pr_merged_not_reflected_locally"),R=!I&&(C==="merged"||C==="released"||r.state==="dismissed"||r.state==="no_change"),O={checkedAt:n,repoExists:i,branchExists:l,worktreeExists:s,activeSession:e.activeSession===!0,dirtyTracked:m,topologyMerged:g,releaseNoopMerge:y,branchAheadCount:f,baseAheadCount:k,prState:A,prUrl:b,prNumber:w,reasons:[...o]};return{lifecycle:r,evidence:O,derivedState:C,cleanupSafe:R,preserve:I,reasons:[...o]}}var Di=u(()=>{Xn();Bd();Wd()});var ut=u(()=>{Xn();uf();Wd();Bd();Di()});function ln(t,e){let r=t.resolve(e),n=t.getPersistedSession(e),o=r?re(r):n?re(n):void 0;return{activeSession:r,persistedSession:n,persistedRef:o,sessionName:r?.name??n?.name??e,worktreePath:r?.worktreePath??n?.worktreePath,originalWorkdir:r?.originalWorkdir??n?.workdir,branchName:r?.worktreeBranch??n?.worktreeBranch,notificationTarget:r??(n?{id:o??e,harnessSessionId:n.harnessSessionId,backendRef:n.backendRef,route:n.route}:void 0)}}function Cf(t){return t.persistedSession?et(t.persistedSession):[]}function fw(t,e){let r=[e.id,e.backendConversationId,e.harnessSessionId,e.name],n,o;for(let i of r)if(i&&(n??=t.resolve(i),o??=t.getPersistedSession(i),n&&o))break;return{activeSession:n,persistedSession:o}}function ji(t,e,r={}){let{activeSession:n,persistedSession:o}=fw(t,e),i=to({workdir:e.workdir,worktreePath:e.worktreePath,worktreeBranch:e.worktreeBranch,worktreeBaseBranch:r.baseBranch??o?.worktreeBaseBranch,worktreePrTargetRepo:o?.worktreePrTargetRepo,worktreePushRemote:o?.worktreePushRemote,worktreePrUrl:o?.worktreePrUrl,worktreePrNumber:o?.worktreePrNumber,worktreeLifecycle:o?.worktreeLifecycle},{activeSession:!!(n&&(n.status==="starting"||n.status==="running")),includePrSync:!!(o?.worktreeLifecycle?.state==="pr_open"||o?.worktreePrUrl)});return{activeSession:n,persistedSession:o,resolvedLifecycle:i}}function Gi(t){let e=t.list("all").filter(o=>o.worktreePath),r=t.listPersistedSessions().filter(o=>o.worktreePath),n=new Map;for(let o of r){if(!o.worktreePath)continue;let i=$(o),s=o.sessionId??i??o.harnessSessionId;s&&n.set(s,{id:o.sessionId??i??o.harnessSessionId,name:o.name,worktreePath:o.worktreePath,worktreeBranch:o.worktreeBranch,worktreeStrategy:o.worktreeStrategy,workdir:o.workdir,worktreeMerged:o.worktreeMerged,worktreeMergedAt:o.worktreeMergedAt,worktreePrUrl:o.worktreePrUrl,backendConversationId:i,harnessSessionId:o.harnessSessionId})}for(let o of e)o.worktreePath&&n.set(o.id,{id:o.id,name:o.name,worktreePath:o.worktreePath,worktreeBranch:o.worktreeBranch,worktreeStrategy:o.worktreeStrategy,workdir:o.originalWorkdir??o.workdir,worktreeMerged:void 0,worktreeMergedAt:void 0,worktreePrUrl:void 0,backendConversationId:$(o),harnessSessionId:o.harnessSessionId});return Array.from(n.values())}function Hi(t,e){return t.id===e||t.name===e||t.backendConversationId===e||t.harnessSessionId===e}function Er(t){switch(t){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 t}}function zi(t){switch(t){case"active_session":return"active session";case"pending_decision":return"pending decision";case"merge_conflict_resolving":return"conflict resolving";case"dirty_tracked_changes":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"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 t.replaceAll("_"," ")}}var no=u(()=>{ke();Di()});var _f={};co(_f,{makeAgentPrTool:()=>oo});import{existsSync as hw}from"fs";function Sw(t){return!t||typeof t!="object"?!1:typeof t.session=="string"}function oo(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:p.Object({session:p.String({description:"Session name or ID to create/update PR for"}),title:p.Optional(p.String({description:"PR title (default: auto-generated from session name)"})),body:p.Optional(p.String({description:"PR body (default: auto-generated from commit summary)"})),base_branch:p.Optional(p.String({description:"Base branch for the PR (default: detected from repo)"})),force_new:p.Optional(p.Boolean({description:"Force creation of a new PR even if one exists (default: false)"})),target_repo:p.Optional(p.String({description:"Target repository for cross-repo PRs (e.g. 'openai/codex'). Auto-detected from 'upstream' remote if not set."}))}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}],meta:{success:!1,state:"error"}};if(!Sw(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, title?, body?, base_branch?, force_new? }."}],meta:{success:!1,state:"error"}};if(!sr())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 n=ln(v,r.session),o=n.activeSession,i=n.persistedSession;if(!o&&!i)return{content:[{type:"text",text:`Error: Session "${r.session}" not found.`}],meta:{success:!1,state:"error"}};let{worktreePath:s,originalWorkdir:a,sessionName:d,branchName:l}=n;if(!s||!a)return{content:[{type:"text",text:`Error: Session "${r.session}" does not have a worktree.`}],meta:{success:!1,state:"error"}};if(!l)return{content:[{type:"text",text:`Error: Cannot determine branch name for worktree ${s}. The worktree may have been removed and no persisted branch name is available.`}],meta:{success:!1,state:"error"}};hw(s)||console.info(`[agent_pr] Worktree directory ${s} no longer exists; proceeding with branch "${l}" via originalWorkdir (${a})`);let m=r.base_branch??ar(a),g=n.persistedRef,y=df(a,r.target_repo??i?.worktreePrTargetRepo);if(!$i(a,l))return{content:[{type:"text",text:`\u274C Failed to push ${l} \u2014 cannot create/update PR`}],meta:{success:!1,state:"error"}};let f=eo(a,l,y);if(r.force_new&&f.exists)return{content:[{type:"text",text:`\u26A0\uFE0F Cannot create new PR: A PR already exists for ${l} (${f.state}).
7
+ `).filter(Boolean).map(w=>{let[C,I,R]=w.split("|");return{hash:C||"",message:I||"",author:R||""}});return{commits:o,filesChanged:a,insertions:d,deletions:l,changedFiles:k,commitMessages:b}}catch(n){console.warn(`[worktree] Failed to get diff summary: ${n instanceof Error?n.message:String(n)}`);return}}function $i(t,e,r="origin"){try{return ne("git",["-C",t,"push",r,e],{timeout:6e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(n){return console.warn(`[worktree] Failed to push branch ${e}: ${n instanceof Error?n.message:String(n)}`),!1}}function an(t){try{return ne("git",["-C",t,"status","--porcelain"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).split(`
8
+ `).some(r=>r.length>0&&!r.startsWith("??")&&!r.startsWith("!!"))}catch{return!1}}function Ei(t,e,r,n="merge",o){let i=!1,s,a=d=>{if(i)try{ne("git",["-C",d,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{}};try{if(n==="squash"){if(ne("git",["-C",t,"checkout",r],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),an(t)){let y;try{y=ne("git",["-C",t,"stash","push","-m",`pre-merge stash before ${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(f){return{success:!1,dirtyError:!0,error:`Auto-stash failed: ${f instanceof Error?f.message:String(f)}. Commit or stash changes manually, then retry.`}}if(!y.includes("No local changes to save")){i=!0;try{s=ne("git",["-C",t,"stash","list","--format=%gd","-n","1"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{}}}ne("git",["-C",t,"merge","--squash",e],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),ne("git",["-C",t,"commit","-m",`Squash merge ${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});let g=!1;if(i)try{ne("git",["-C",t,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{g=!0}return{success:!0,stashed:i||void 0,stashRef:s,stashPopConflict:g||void 0}}let d=o&&LP(o),l=d?o:t;if(d||ne("git",["-C",t,"checkout",e],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),an(t)){let g;try{g=ne("git",["-C",t,"stash","push","-m",`pre-merge stash before ${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(y){try{ne("git",["-C",t,"checkout",r],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{}return{success:!1,dirtyError:!0,error:`Auto-stash failed: ${y instanceof Error?y.message:String(y)}. Commit or stash changes manually, then retry.`}}if(!g.includes("No local changes to save")){i=!0;try{s=ne("git",["-C",t,"stash","list","--format=%gd","-n","1"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{}}}try{ne("git",["-C",l,"rebase",r],{timeout:6e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{try{ne("git",["-C",l,"rebase","--abort"],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{}try{ne("git",["-C",t,"checkout",r],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{}return a(t),{success:!1,rebaseConflict:!0,stashed:i||void 0,stashRef:s,error:[`Rebase of ${e} onto ${r} hit conflicts.`,"To resolve manually:",` cd ${l}`,` git rebase ${r}`," # resolve conflicts in each file, then:"," git add <file>"," git rebase --continue"," # repeat until rebase finishes, then re-run agent_merge."].join(`
9
+ `)}}ne("git",["-C",t,"checkout",r],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),ne("git",["-C",t,"merge","--ff-only",e],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});let m=!1;if(i)try{ne("git",["-C",t,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{m=!0}return{success:!0,fastForward:!0,stashed:i||void 0,stashRef:s,stashPopConflict:m||void 0}}catch(d){try{ne("git",["-C",t,"checkout",r],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{}return a(t),{success:!1,error:d instanceof Error?d.message:String(d),stashed:i||void 0,stashRef:s}}}var Wd=u(()=>{});import{execFileSync as Oi}from"child_process";function pf(t,e,r,n,o,i){if(!sr())return{success:!1,error:"GitHub CLI (gh) is not available"};try{let s;if(i)try{let g=Oi("git",["-C",t,"remote","get-url","origin"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().match(/[:/]([^/]+)\/[^/]+(?:\.git)?$/);g&&(s=g[1])}catch{}let a=["pr","create","--base",r];return i&&a.push("--repo",i),s?a.push("--head",`${s}:${e}`):a.push("--head",e),n&&o?a.push("--title",n,"--body",o):a.push("--fill-verbose"),{success:!0,prUrl:Oi("gh",a,{cwd:t,timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}function eo(t,e,r){if(!sr())return{exists:!1,state:"none"};try{let n=["pr","list","--head",e,"--state","all","--json","url,number,title,state","--jq",".[0]"];r&&n.push("--repo",r);let i=Oi("gh",n,{cwd:t,timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(!i)return{exists:!1,state:"none"};let s=JSON.parse(i),a=s.state.toLowerCase();return{exists:!0,state:a==="open"?"open":a==="merged"?"merged":a==="closed"?"closed":"none",url:s.url,number:s.number,title:s.title}}catch(n){return console.warn(`[worktree] Failed to sync PR status for ${e}: ${n instanceof Error?n.message:String(n)}`),{exists:!1,state:"none"}}}function cf(t,e,r,n){if(!sr())return!1;try{let o=["pr","comment",String(e),"--body",r];return n&&o.push("--repo",n),Oi("gh",o,{cwd:t,timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(o){return console.warn(`[worktree] Failed to comment on PR #${e}: ${o instanceof Error?o.message:String(o)}`),!1}}function Cr(t){if(t.kind==="merge"){let e=t.filesChanged!==void 0?` (${t.filesChanged} files, +${t.insertions??0}/-${t.deletions??0})`:"";return`\u2705 Merged: ${t.branch} \u2192 ${t.base??"main"}${e}`}return t.kind==="pr-updated"?`\u2705 PR updated: ${t.prUrl??""}`:t.targetRepo?`\u2705 PR opened against ${t.targetRepo}: ${t.prUrl??""}`:`\u2705 PR opened: ${t.prUrl??""}`}var Bd=u(()=>{Xn()});import{existsSync as Ud}from"fs";function mf(){return new Date().toISOString()}function WP(t){return t.worktreeLifecycle??{state:t.worktreePath||t.worktreeBranch?"provisioned":"none",updatedAt:mf(),baseBranch:t.worktreeBaseBranch,targetRepo:t.worktreePrTargetRepo,pushRemote:t.worktreePushRemote}}function BP(t){return t.worktreeLifecycle?.baseBranch??t.worktreeBaseBranch??(Ud(t.workdir)?ar(t.workdir):void 0)}function to(t,e={}){let r=WP(t),n=mf(),o=new Set,i=Ud(t.workdir),s=!!(t.worktreePath&&Ud(t.worktreePath)),a=t.worktreeBranch,d=BP(t),l=!1,m=!1,g=!1,y=!1,f,k,A=t.worktreePrUrl?"open":"none",b=t.worktreePrUrl,w=t.worktreePrNumber;if(i||o.add("repo_missing"),a||o.add("branch_missing"),!s&&t.worktreePath&&o.add("worktree_missing"),e.activeSession&&o.add("active_session"),r.state==="pending_decision"&&o.add("pending_decision"),r.state==="merge_conflict_resolving"&&o.add("merge_conflict_resolving"),i&&a&&(l=Yn(t.workdir,a),l||o.add("branch_missing")),s&&t.worktreePath&&(m=an(t.worktreePath),m&&o.add("dirty_tracked_changes")),i&&l&&d){let Le=of(t.workdir,a,d);f=Le?.ahead,k=Le?.behind,g=sf(t.workdir,a,d),g?o.add("topology_merged"):(y=af(t.workdir,a,d),y&&o.add("merge_noop_content_already_on_base"),!y&&(f??0)>0&&o.add("unique_content"))}else d||o.add("base_branch_missing");if(e.includePrSync&&i&&a){let Le=eo(t.workdir,a,t.worktreePrTargetRepo??r.targetRepo);A=Le.state,b=Le.url??b,w=Le.number??w}A==="open"&&o.add("pr_open"),A==="merged"&&!g&&!y&&o.add("pr_merged_not_reflected_locally");let C=r.state;g?C="merged":y?C="released":!l&&r.state==="pending_decision"&&(C="cleanup_failed");let I=e.activeSession||m||r.state==="pending_decision"||r.state==="merge_conflict_resolving"||r.state==="pr_open"||A==="open"||o.has("pr_merged_not_reflected_locally"),R=!I&&(C==="merged"||C==="released"||r.state==="dismissed"||r.state==="no_change"),O={checkedAt:n,repoExists:i,branchExists:l,worktreeExists:s,activeSession:e.activeSession===!0,dirtyTracked:m,topologyMerged:g,releaseNoopMerge:y,branchAheadCount:f,baseAheadCount:k,prState:A,prUrl:b,prNumber:w,reasons:[...o]};return{lifecycle:r,evidence:O,derivedState:C,cleanupSafe:R,preserve:I,reasons:[...o]}}var Di=u(()=>{Xn();Bd();Wd()});var ut=u(()=>{Xn();uf();Wd();Bd();Di()});function dn(t,e){let r=t.resolve(e),n=t.getPersistedSession(e),o=r?re(r):n?re(n):void 0;return{activeSession:r,persistedSession:n,persistedRef:o,sessionName:r?.name??n?.name??e,worktreePath:r?.worktreePath??n?.worktreePath,originalWorkdir:r?.originalWorkdir??n?.workdir,branchName:r?.worktreeBranch??n?.worktreeBranch,notificationTarget:r??(n?{id:o??e,harnessSessionId:n.harnessSessionId,backendRef:n.backendRef,route:n.route}:void 0)}}function Cf(t){return t.persistedSession?et(t.persistedSession):[]}function fw(t,e){let r=[e.id,e.backendConversationId,e.harnessSessionId,e.name],n,o;for(let i of r)if(i&&(n??=t.resolve(i),o??=t.getPersistedSession(i),n&&o))break;return{activeSession:n,persistedSession:o}}function ji(t,e,r={}){let{activeSession:n,persistedSession:o}=fw(t,e),i=to({workdir:e.workdir,worktreePath:e.worktreePath,worktreeBranch:e.worktreeBranch,worktreeBaseBranch:r.baseBranch??o?.worktreeBaseBranch,worktreePrTargetRepo:o?.worktreePrTargetRepo,worktreePushRemote:o?.worktreePushRemote,worktreePrUrl:o?.worktreePrUrl,worktreePrNumber:o?.worktreePrNumber,worktreeLifecycle:o?.worktreeLifecycle},{activeSession:!!(n&&(n.status==="starting"||n.status==="running")),includePrSync:!!(o?.worktreeLifecycle?.state==="pr_open"||o?.worktreePrUrl)});return{activeSession:n,persistedSession:o,resolvedLifecycle:i}}function Gi(t){let e=t.list("all").filter(o=>o.worktreePath),r=t.listPersistedSessions().filter(o=>o.worktreePath),n=new Map;for(let o of r){if(!o.worktreePath)continue;let i=$(o),s=o.sessionId??i??o.harnessSessionId;s&&n.set(s,{id:o.sessionId??i??o.harnessSessionId,name:o.name,worktreePath:o.worktreePath,worktreeBranch:o.worktreeBranch,worktreeStrategy:o.worktreeStrategy,workdir:o.workdir,worktreeMerged:o.worktreeMerged,worktreeMergedAt:o.worktreeMergedAt,worktreePrUrl:o.worktreePrUrl,backendConversationId:i,harnessSessionId:o.harnessSessionId})}for(let o of e)o.worktreePath&&n.set(o.id,{id:o.id,name:o.name,worktreePath:o.worktreePath,worktreeBranch:o.worktreeBranch,worktreeStrategy:o.worktreeStrategy,workdir:o.originalWorkdir??o.workdir,worktreeMerged:void 0,worktreeMergedAt:void 0,worktreePrUrl:void 0,backendConversationId:$(o),harnessSessionId:o.harnessSessionId});return Array.from(n.values())}function Hi(t,e){return t.id===e||t.name===e||t.backendConversationId===e||t.harnessSessionId===e}function $r(t){switch(t){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 t}}function zi(t){switch(t){case"active_session":return"active session";case"pending_decision":return"pending decision";case"merge_conflict_resolving":return"conflict resolving";case"dirty_tracked_changes":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"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 t.replaceAll("_"," ")}}var no=u(()=>{ke();Di()});var _f={};co(_f,{makeAgentPrTool:()=>oo});import{existsSync as hw}from"fs";function Sw(t){return!t||typeof t!="object"?!1:typeof t.session=="string"}function oo(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:p.Object({session:p.String({description:"Session name or ID to create/update PR for"}),title:p.Optional(p.String({description:"PR title (default: auto-generated from session name)"})),body:p.Optional(p.String({description:"PR body (default: auto-generated from commit summary)"})),base_branch:p.Optional(p.String({description:"Base branch for the PR (default: detected from repo)"})),force_new:p.Optional(p.Boolean({description:"Force creation of a new PR even if one exists (default: false)"})),target_repo:p.Optional(p.String({description:"Target repository for cross-repo PRs (e.g. 'openai/codex'). Auto-detected from 'upstream' remote if not set."}))}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}],meta:{success:!1,state:"error"}};if(!Sw(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, title?, body?, base_branch?, force_new? }."}],meta:{success:!1,state:"error"}};if(!sr())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 n=dn(v,r.session),o=n.activeSession,i=n.persistedSession;if(!o&&!i)return{content:[{type:"text",text:`Error: Session "${r.session}" not found.`}],meta:{success:!1,state:"error"}};let{worktreePath:s,originalWorkdir:a,sessionName:d,branchName:l}=n;if(!s||!a)return{content:[{type:"text",text:`Error: Session "${r.session}" does not have a worktree.`}],meta:{success:!1,state:"error"}};if(!l)return{content:[{type:"text",text:`Error: Cannot determine branch name for worktree ${s}. The worktree may have been removed and no persisted branch name is available.`}],meta:{success:!1,state:"error"}};hw(s)||console.info(`[agent_pr] Worktree directory ${s} no longer exists; proceeding with branch "${l}" via originalWorkdir (${a})`);let m=r.base_branch??ar(a),g=n.persistedRef,y=df(a,r.target_repo??i?.worktreePrTargetRepo);if(!$i(a,l))return{content:[{type:"text",text:`\u274C Failed to push ${l} \u2014 cannot create/update PR`}],meta:{success:!1,state:"error"}};let f=eo(a,l,y);if(r.force_new&&f.exists)return{content:[{type:"text",text:`\u26A0\uFE0F Cannot create new PR: A PR already exists for ${l} (${f.state}).
10
10
 
11
11
  Existing PR: ${f.url}
12
12
 
13
- 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(f.exists&&f.state==="open"){let k=Cr(a,l,m);if(k&&k.commits>0){let A=k.commitMessages.slice(0,5).map(I=>`\u2022 ${I.hash} ${I.message} (${I.author})`).join(`
13
+ 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(f.exists&&f.state==="open"){let k=Mr(a,l,m);if(k&&k.commits>0){let A=k.commitMessages.slice(0,5).map(I=>`\u2022 ${I.hash} ${I.message} (${I.author})`).join(`
14
14
  `),b=k.commits>5?`
15
15
  ...and ${k.commits-5} more commits`:"",w=["\u{1F504} **New commits pushed**","",`${k.commits} new commits (+${k.insertions} / -${k.deletions})`,"","### Latest commits:",A+b,"","---","\u{1F916} [openclaw-code-agent](https://github.com/goldmar/openclaw-code-agent)"].join(`
16
- `);if(cf(a,f.number,w,y)){g&&v.updatePersistedSession(g,{worktreePrUrl:f.url,worktreePrNumber:f.number,lifecycle:"terminal",worktreeState:"pr_open",pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeLifecycle:{state:"pr_open",updatedAt:new Date().toISOString(),baseBranch:m,targetRepo:y,pushRemote:i?.worktreePushRemote}});let I=_r({kind:"pr-updated",branch:l,prUrl:f.url});return v.notifyWorktreeOutcome(n.notificationTarget,I),{content:[{type:"text",text:`${I}
16
+ `);if(cf(a,f.number,w,y)){g&&v.updatePersistedSession(g,{worktreePrUrl:f.url,worktreePrNumber:f.number,lifecycle:"terminal",worktreeState:"pr_open",pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeLifecycle:{state:"pr_open",updatedAt:new Date().toISOString(),baseBranch:m,targetRepo:y,pushRemote:i?.worktreePushRemote}});let I=Cr({kind:"pr-updated",branch:l,prUrl:f.url});return v.notifyWorktreeOutcome(n.notificationTarget,I),{content:[{type:"text",text:`${I}
17
17
 
18
18
  \u{1F4DD} Added comment detailing ${k.commits} new commits (+${k.insertions} / -${k.deletions})`}],meta:{success:!0,state:"pr_updated"}}}else return{content:[{type:"text",text:`\u26A0\uFE0F Pushed to ${f.url} but failed to add comment.
19
19
 
@@ -29,21 +29,21 @@ What would you like to do?
29
29
  2. Close and delete the branch with agent_merge(delete_branch=true), then start a new session/worktree
30
30
  3. Manually delete the closed PR on GitHub, then call agent_pr(force_new=true) to create a fresh PR
31
31
 
32
- (This tool cannot automatically reopen or recreate PRs to avoid unintended actions.)`}],meta:{success:!1,state:"closed"}};{let k=r.title??`[openclaw-code-agent] ${d}`,A=r.body;if(!A){let w=Cr(a,l,m);if(w){let C=w.commitMessages.slice(0,5).map(R=>`\u2022 ${R.hash} ${R.message} (${R.author})`).join(`
32
+ (This tool cannot automatically reopen or recreate PRs to avoid unintended actions.)`}],meta:{success:!1,state:"closed"}};{let k=r.title??`[openclaw-code-agent] ${d}`,A=r.body;if(!A){let w=Mr(a,l,m);if(w){let C=w.commitMessages.slice(0,5).map(R=>`\u2022 ${R.hash} ${R.message} (${R.author})`).join(`
33
33
  `),I=w.commits>5?`
34
34
  ...and ${w.commits-5} more`:"";A=[`Automated changes from OpenClaw Code Agent session: ${d}`,"","## Summary",`${w.commits} commits, ${w.filesChanged} files changed (+${w.insertions} / -${w.deletions})`,"","## Commits",C+I,"","---","\u{1F916} Generated with [openclaw-code-agent](https://github.com/goldmar/openclaw-code-agent)"].join(`
35
- `)}else A=`Automated changes from OpenClaw Code Agent session: ${d}`}let b=pf(a,l,m,k,A,y);if(b.success&&b.prUrl){let w=eo(a,l,y);g&&v.updatePersistedSession(g,{worktreePrUrl:b.prUrl,worktreePrNumber:w.number,lifecycle:"terminal",pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeState:"pr_open",worktreeDisposition:"pr-opened",worktreeLifecycle:{state:"pr_open",updatedAt:new Date().toISOString(),baseBranch:m,targetRepo:y,pushRemote:i?.worktreePushRemote}});let C=_r({kind:"pr-opened",branch:l,targetRepo:y,prUrl:b.prUrl});return v.notifyWorktreeOutcome(n.notificationTarget,C),{content:[{type:"text",text:C}],meta:{success:!0,state:"created"}}}else return{content:[{type:"text",text:`\u274C Failed to create PR: ${b.error??"unknown error"}`}],meta:{success:!1,state:"error"}}}}}}}var Ji=u(()=>{Ee();Y();ut();no()});import{readdirSync as $x,statSync as Ex,rmSync as Ox}from"fs";import{execFileSync as Dx}from"child_process";import{join as Bg}from"path";Ee();Y();function wv(t){return t.length>80?`${t.slice(0,80)}...`:t}function Iv(t){return t.worktreePath?!t.originalWorkdir||t.originalWorkdir===t.worktreePath?`${t.worktreePath} (worktree)`:`${t.worktreePath} (worktree of ${t.originalWorkdir})`:t.workdir}function xv(t){let e=["Session launched successfully.",` Name: ${t.sessionName}`,` ID: ${t.sessionId}`,` Harness: ${t.harness}`,` Permission mode: ${t.permissionMode}`,` Plan approval: ${t.planApproval}`,` Worktree strategy: ${t.worktreeStrategy??"off"}`,` Resolved workdir: ${Iv(t)}`,` Model: ${t.model??"default"}`,` Prompt: "${wv(t.prompt)}"`];return t.reasoningEffort&&e.push(` Reasoning effort: ${t.reasoningEffort}`),t.resumeSessionId?e.push(` Resume: ${t.resumeSessionId}${t.forkSession?" (forked)":""}`):t.forceNewSession&&e.push(" Force new session: true"),t.clearedPersistedCodexResume&&e.push(" Thread state: historical Codex state cleared; starting a fresh thread."),e.push(" Mode: multi-turn (use agent_respond to send follow-up messages)"),e.push("","Use agent_sessions to check status, agent_output to see output."),e.join(`
36
- `)}function oi(t,e){return xv({...t,sessionId:e.id,sessionName:e.name,model:e.model,reasoningEffort:e.reasoningEffort,worktreeStrategy:e.worktreeStrategy??"off",worktreePath:e.worktreePath,originalWorkdir:e.originalWorkdir})}Re();function rn(t){let{requestedResumeSessionId:e,activeSession:r,persistedSession:n}=t;return e?r?{resumeSessionId:e,clearedPersistedCodexResume:!1}:n?.harness==="codex"&&n.backendRef?.kind!=="codex-app-server"?{resumeSessionId:void 0,clearedPersistedCodexResume:!0}:{resumeSessionId:e,clearedPersistedCodexResume:!1}:{resumeSessionId:void 0,clearedPersistedCodexResume:!1}}ke();function Ed(t){return"id"in t?t.id:t.sessionId}function Qn(t){return t.status==="completed"||t.killReason==="done"}function cP(t){return Qn(t)&&t.backendRef?.kind==="codex-app-server"&&!!$(t)}function mP(t){return(t.killReason==="shutdown"||t.killReason==="startup-timeout")&&!$(t)}function Jn(t){if(t.status==="running")return{kind:"direct",reason:"already_running"};let e=Ed(t);if(Qn(t)&&!cP(t))return{kind:"unavailable",reason:"completed",stableSessionId:e};let r=$(t);if(r){let n="harnessName"in t?void 0:t,{resumeSessionId:o,clearedPersistedCodexResume:i}=rn({requestedResumeSessionId:r,activeSession:"harnessName"in t?{harnessSessionId:r}:void 0,persistedSession:n?{harness:n.harness,backendRef:n.backendRef}:void 0});return o?{kind:"resume",resumeSessionId:o,stableSessionId:e,clearedPersistedCodexResume:i}:{kind:"unavailable",reason:"legacy_non_resumable",stableSessionId:e,clearedPersistedCodexResume:i}}return mP(t)?{kind:"relaunch",stableSessionId:e}:{kind:"unavailable",reason:"missing_backend_state",stableSessionId:e}}Re();import{existsSync as qm}from"fs";ke();function Um(t){return t==null?void 0:String(t).trim()||void 0}function fP(t){return t.trim().replace(/^['"`](.*)['"`]$/s,"$1").trim()}function gP(t){let e=t.split(/\n\s*\n/,1)[0]?.split(`
35
+ `)}else A=`Automated changes from OpenClaw Code Agent session: ${d}`}let b=pf(a,l,m,k,A,y);if(b.success&&b.prUrl){let w=eo(a,l,y);g&&v.updatePersistedSession(g,{worktreePrUrl:b.prUrl,worktreePrNumber:w.number,lifecycle:"terminal",pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeState:"pr_open",worktreeDisposition:"pr-opened",worktreeLifecycle:{state:"pr_open",updatedAt:new Date().toISOString(),baseBranch:m,targetRepo:y,pushRemote:i?.worktreePushRemote}});let C=Cr({kind:"pr-opened",branch:l,targetRepo:y,prUrl:b.prUrl});return v.notifyWorktreeOutcome(n.notificationTarget,C),{content:[{type:"text",text:C}],meta:{success:!0,state:"created"}}}else return{content:[{type:"text",text:`\u274C Failed to create PR: ${b.error??"unknown error"}`}],meta:{success:!1,state:"error"}}}}}}}var Ji=u(()=>{Ee();Y();ut();no()});import{readdirSync as _x,statSync as $x,rmSync as Ex}from"fs";import{execFileSync as Ox}from"child_process";import{join as Bg}from"path";Ee();Y();function wv(t){return t.length>80?`${t.slice(0,80)}...`:t}function Iv(t){return t.worktreePath?!t.originalWorkdir||t.originalWorkdir===t.worktreePath?`${t.worktreePath} (worktree)`:`${t.worktreePath} (worktree of ${t.originalWorkdir})`:t.workdir}function xv(t){let e=["Session launched successfully.",` Name: ${t.sessionName}`,` ID: ${t.sessionId}`,` Harness: ${t.harness}`,` Permission mode: ${t.permissionMode}`,` Plan approval: ${t.planApproval}`,` Worktree strategy: ${t.worktreeStrategy??"off"}`,` Resolved workdir: ${Iv(t)}`,` Model: ${t.model??"default"}`,` Prompt: "${wv(t.prompt)}"`];return t.reasoningEffort&&e.push(` Reasoning effort: ${t.reasoningEffort}`),t.resumeSessionId?e.push(` Resume: ${t.resumeSessionId}${t.forkSession?" (forked)":""}`):t.forceNewSession&&e.push(" Force new session: true"),t.clearedPersistedCodexResume&&e.push(" Thread state: historical Codex state cleared; starting a fresh thread."),e.push(" Mode: multi-turn (use agent_respond to send follow-up messages)"),e.push("","Use agent_sessions to check status, agent_output to see output."),e.join(`
36
+ `)}function oi(t,e){return xv({...t,sessionId:e.id,sessionName:e.name,model:e.model,reasoningEffort:e.reasoningEffort,worktreeStrategy:e.worktreeStrategy??"off",worktreePath:e.worktreePath,originalWorkdir:e.originalWorkdir})}Re();function tn(t){let{requestedResumeSessionId:e,activeSession:r,persistedSession:n}=t;return e?r?{resumeSessionId:e,clearedPersistedCodexResume:!1}:n?.harness==="codex"&&n.backendRef?.kind!=="codex-app-server"?{resumeSessionId:void 0,clearedPersistedCodexResume:!0}:{resumeSessionId:e,clearedPersistedCodexResume:!1}:{resumeSessionId:void 0,clearedPersistedCodexResume:!1}}ke();function Ed(t){return"id"in t?t.id:t.sessionId}function Qn(t){return t.status==="completed"||t.killReason==="done"}function cP(t){return Qn(t)&&t.backendRef?.kind==="codex-app-server"&&!!$(t)}function mP(t){return(t.killReason==="shutdown"||t.killReason==="startup-timeout")&&!$(t)}function Jn(t){if(t.status==="running")return{kind:"direct",reason:"already_running"};let e=Ed(t);if(Qn(t)&&!cP(t))return{kind:"unavailable",reason:"completed",stableSessionId:e};let r=$(t);if(r){let n="harnessName"in t?void 0:t,{resumeSessionId:o,clearedPersistedCodexResume:i}=tn({requestedResumeSessionId:r,activeSession:"harnessName"in t?{harnessSessionId:r}:void 0,persistedSession:n?{harness:n.harness,backendRef:n.backendRef}:void 0});return o?{kind:"resume",resumeSessionId:o,stableSessionId:e,clearedPersistedCodexResume:i}:{kind:"unavailable",reason:"legacy_non_resumable",stableSessionId:e,clearedPersistedCodexResume:i}}return mP(t)?{kind:"relaunch",stableSessionId:e}:{kind:"unavailable",reason:"missing_backend_state",stableSessionId:e}}Re();import{existsSync as qm}from"fs";ke();function Um(t){return t==null?void 0:String(t).trim()||void 0}function fP(t){return t.trim().replace(/^['"`](.*)['"`]$/s,"$1").trim()}function gP(t){let e=t.split(/\n\s*\n/,1)[0]?.split(`
37
37
  `).map(r=>r.trim()).filter(Boolean)??[];if(e.length!==0)for(let r of e){let n=r.match(/^(Workdir|Repo):\s*(.+)$/),o=fP(n?.[2]??"");if(o.startsWith("/")&&qm(o))return o}}function Km(t,e){return t.workdir!==e.workdir?!1:e.originSessionKey&&t.originSessionKey?t.originSessionKey===e.originSessionKey:!e.originChannel||!t.originChannel?!1:t.originChannel===e.originChannel&&Um(t.originThreadId)===Um(e.originThreadId)}function Vm(t){return t.slice(0,3).map(e=>` - ${e.name} [${e.ref}] | status=${e.status}${e.lifecycle?` | lifecycle=${e.lifecycle}`:""}`).join(`
38
- `)}function hP(t,e){let r=[],n=[],o=new Set;for(let i of t.list?.("all")??[]){if(!Km(i,e))continue;let s=i.id;if(!o.has(s)){if(o.add(s),i.isExplicitlyResumable){r.push({ref:i.id,name:i.name,status:i.status,lifecycle:i.lifecycle,resumable:!0});continue}(i.status==="starting"||i.status==="running")&&n.push({ref:i.id,name:i.name,status:i.status,lifecycle:i.lifecycle,resumable:!1})}}for(let i of t.listPersistedSessions?.()??[]){if(!i.resumable||!Km(i,e))continue;let s=re(i)??i.harnessSessionId,a=i.sessionId??$(i)??i.harnessSessionId;!s||!a||o.has(a)||(o.add(a),r.push({ref:s,name:i.name,status:i.status,lifecycle:i.lifecycle,resumable:!0}))}return{resumable:r,active:n}}function SP(t,e){if(!e||e.length===0)return!0;if(!t)return!1;let r=t.toLowerCase();return e.some(n=>r.includes(n.toLowerCase()))}function jm(t,e,r){let n=t.workdir||gP(t.prompt)||e.workspaceDir||_.defaultWorkdir||process.cwd();if(!qm(n))return{kind:"error",text:`Error: Working directory does not exist: ${n}`};let o=t.harness??Pe(),i=$t(o),s=t.model??i,a=t.model!==void 0;if(!s)return{kind:"error",text:`Error: No default model configured for harness "${o}". Set plugins.entries["openclaw-code-agent"].config.harnesses.${o}.defaultModel or pass model explicitly.`};let d=tn(o);if(d&&d.length>0&&!SP(s,d))return{kind:"error",text:a?`Error: Model "${s}" is not allowed. Permitted models: ${d.join(", ")}`:`Error: Default model "${s||"undefined"}" is not in allowedModels (${d.join(", ")}). Update your plugin config to set a compatible defaultModel.`};let l=ai(e),m=jt(e,l||Vn(n)),g=e.sessionKey||void 0,y=fm(g)??Kn(e);if(!t.resume_session_id&&!t.force_new_session){let R=hP(r,{workdir:n,originSessionKey:g,originChannel:m,originThreadId:y});if(R.resumable.length>0||R.active.length>0){let O=R.resumable.length>0?["Linked resumable session(s) already exist for this thread/workdir:",Vm(R.resumable),"","Resume the latest one with:",` agent_respond(session='${R.resumable[0].ref}', message='<next instruction>')`,"Fork from it with:",` agent_launch(prompt='<new task>', resume_session_id='${R.resumable[0].ref}', fork_session=true)`].join(`
38
+ `)}function hP(t,e){let r=[],n=[],o=new Set;for(let i of t.list?.("all")??[]){if(!Km(i,e))continue;let s=i.id;if(!o.has(s)){if(o.add(s),i.isExplicitlyResumable){r.push({ref:i.id,name:i.name,status:i.status,lifecycle:i.lifecycle,resumable:!0});continue}(i.status==="starting"||i.status==="running")&&n.push({ref:i.id,name:i.name,status:i.status,lifecycle:i.lifecycle,resumable:!1})}}for(let i of t.listPersistedSessions?.()??[]){if(!i.resumable||!Km(i,e))continue;let s=re(i)??i.harnessSessionId,a=i.sessionId??$(i)??i.harnessSessionId;!s||!a||o.has(a)||(o.add(a),r.push({ref:s,name:i.name,status:i.status,lifecycle:i.lifecycle,resumable:!0}))}return{resumable:r,active:n}}function SP(t,e){if(!e||e.length===0)return!0;if(!t)return!1;let r=t.toLowerCase();return e.some(n=>r.includes(n.toLowerCase()))}function jm(t,e,r){let n=t.workdir||gP(t.prompt)||e.workspaceDir||_.defaultWorkdir||process.cwd();if(!qm(n))return{kind:"error",text:`Error: Working directory does not exist: ${n}`};let o=t.harness??Pe(),i=$t(o),s=t.model??i,a=t.model!==void 0;if(!s)return{kind:"error",text:`Error: No default model configured for harness "${o}". Set plugins.entries["openclaw-code-agent"].config.harnesses.${o}.defaultModel or pass model explicitly.`};let d=en(o);if(d&&d.length>0&&!SP(s,d))return{kind:"error",text:a?`Error: Model "${s}" is not allowed. Permitted models: ${d.join(", ")}`:`Error: Default model "${s||"undefined"}" is not in allowedModels (${d.join(", ")}). Update your plugin config to set a compatible defaultModel.`};let l=ai(e),m=jt(e,l||Vn(n)),g=e.sessionKey||void 0,y=fm(g)??Kn(e);if(!t.resume_session_id&&!t.force_new_session){let R=hP(r,{workdir:n,originSessionKey:g,originChannel:m,originThreadId:y});if(R.resumable.length>0||R.active.length>0){let O=R.resumable.length>0?["Linked resumable session(s) already exist for this thread/workdir:",Vm(R.resumable),"","Resume the latest one with:",` agent_respond(session='${R.resumable[0].ref}', message='<next instruction>')`,"Fork from it with:",` agent_launch(prompt='<new task>', resume_session_id='${R.resumable[0].ref}', fork_session=true)`].join(`
39
39
  `):"",Le=R.active.length>0?[R.resumable.length>0?"Linked active session(s):":"Linked active session(s) already exist for this thread/workdir:",Vm(R.active),"","Send a follow-up instead of launching a duplicate:",` agent_respond(session='${R.active[0].ref}', message='<next instruction>')`].join(`
40
40
  `):"";return{kind:"blocked",text:["Resume-first protection blocked a fresh launch.","",O,Le,["If you intentionally want a brand-new independent session here, call:"," agent_launch(prompt='<new task>', force_new_session=true)"].join(`
41
41
  `)].filter(Boolean).join(`
42
42
 
43
- `)}}}let f=t.resume_session_id,k=f?r.resolve?.(f):void 0,A=f?r.getPersistedSession?.(f):void 0;if(f){let R=r.resolveBackendConversationId?.(f)??r.resolveHarnessSessionId?.(f);if(!R)return{kind:"error",text:`Error: Could not resolve resume_session_id "${f}" to a session ID. Use agent_sessions to list available sessions.`};f=R}let{resumeSessionId:b,clearedPersistedCodexResume:w}=rn({requestedResumeSessionId:f,activeSession:k?{harnessSessionId:k.backendConversationId??k.harnessSessionId}:void 0,persistedSession:A?{harness:A.harness,backendRef:A.backendRef}:void 0}),C=t.permission_mode??_.permissionMode,I=t.plan_approval??_.planApproval;return{kind:"resolved",workdir:n,harness:o,resolvedModel:s,permissionMode:C,planApproval:I,originChannel:m,originThreadId:y,originSessionKey:g,route:Et(e,m,g),resumeSessionId:b,resolvedResumeId:f,clearedPersistedCodexResume:w,reasoningEffort:lt(o)}}function yP(t){return t instanceof Error?t.message:String(t)}function Gm(t,e){return t?("id"in t?t.id:t.sessionId)??e??"unknown-session":e??"unknown-session"}function kP(t){return!t||typeof t!="object"?!1:typeof t.prompt=="string"}function vP(t){return!!t&&typeof t=="object"&&typeof t.formatLaunchResult=="function"}function Hm(t){return{name:"agent_launch",description:"Launch a coding agent session in background to execute a development task. Sessions are multi-turn \u2014 they stay open for follow-up messages via agent_respond. Supports resuming previous sessions. Returns a session ID and name for tracking.",parameters:p.Object({prompt:p.String({description:"The task prompt to execute"}),name:p.Optional(p.String({description:"Short human-readable name for the session (kebab-case, e.g. 'fix-auth'). Auto-generated from prompt if omitted."})),workdir:p.Optional(p.String({description:"Working directory (defaults to cwd)"})),model:p.Optional(p.String({description:"Model name to use"})),system_prompt:p.Optional(p.String({description:"Additional system prompt"})),allowed_tools:p.Optional(p.Array(p.String(),{description:"List of allowed tools"})),resume_session_id:p.Optional(p.String({description:"Session reference to continue or fork from. Prefer the plugin session ID shown by agent_launch or agent_sessions; persisted backend conversation IDs also resolve when available."})),fork_session:p.Optional(p.Boolean({description:"When resuming, fork to a new session instead of continuing the existing one. Use with resume_session_id."})),force_new_session:p.Optional(p.Boolean({description:"Bypass resume-first protection and start a brand-new linked session even when a resumable or active linked session already exists."})),permission_mode:p.Optional(p.Union([p.Literal("default"),p.Literal("plan"),p.Literal("bypassPermissions")],{description:"Permission mode: 'default' (plugin-managed interactive execution), 'plan' (present the plan first and block implementation until approval), 'bypassPermissions' (fully autonomous execution). Defaults to plugin config ('plan' by default)."})),plan_approval:p.Optional(p.Union([p.Literal("ask"),p.Literal("delegate"),p.Literal("approve")],{description:"Plan approval policy for this session: 'ask' (send the full plan to the user with Approve/Revise/Reject buttons), 'delegate' (orchestrator must review the full plan, then either approve directly or escalate back to the user with the same buttons), 'approve' (auto-approve after verification). Overrides the plugin-level planApproval setting."})),harness:p.Optional(p.String({description:"Agent harness to use (e.g. 'claude-code'). Defaults to 'claude-code'."})),worktree_strategy:p.Optional(p.Union([p.Literal("off"),p.Literal("manual"),p.Literal("ask"),p.Literal("delegate"),p.Literal("auto-merge"),p.Literal("auto-pr")],{description:"Worktree strategy: 'off' (no worktree), 'manual' (create worktree but no auto merge-back), 'ask' (prompt user with Merge/PR/Decide later/Dismiss buttons), 'delegate' (orchestrator decides), 'auto-merge' (merge automatically), 'auto-pr' (open/update a PR automatically). Defaults to the plugin config when unset."})),worktree_base_branch:p.Optional(p.String({description:"Base branch for worktree merge/PR operations (default: auto-detected or 'main')"})),worktree_pr_target_repo:p.Optional(p.String({description:"Target repository for cross-repo PRs (e.g. 'openai/codex' for fork-to-upstream workflow). If not set, auto-detected from 'upstream' remote or defaults to 'origin'."}))}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!kP(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected at least { prompt }."}]};r.agentId&&console.warn(`[agent_launch] \u26A0\uFE0F agentId="${r.agentId}" was passed as a parameter \u2014 this is WRONG. agentId is only for sessions_spawn (OpenClaw sub-agents), not agent_launch (CC sessions). The field is being ignored. ctx.agentId="${t.agentId}" will be used for origin routing instead.`);try{let n=jm(r,t,v);if(n.kind!=="resolved")return{content:[{type:"text",text:n.text}]};let{workdir:o,harness:i,resolvedModel:s,permissionMode:a,planApproval:d,originChannel:l,originThreadId:m,originSessionKey:g,route:y,resumeSessionId:f,resolvedResumeId:k,clearedPersistedCodexResume:A,reasoningEffort:b}=n,w=r.resume_session_id?v.resolve(r.resume_session_id)??v.getPersistedSession(r.resume_session_id):void 0,C=!r.fork_session&&w?Jn(w):void 0;if(C?.kind==="direct")return{content:[{type:"text",text:`Session ${w.name} [${Gm(w,r.resume_session_id)}] is already running. Use agent_respond(session='${r.resume_session_id}', message='<next instruction>') instead of agent_launch(resume_session_id=...).`}]};if(C?.kind==="unavailable")return{content:[{type:"text",text:`Resume unavailable for session ${w.name} [${Gm(w,r.resume_session_id)}] (${C.reason}). Use agent_launch(prompt='<new task>') for a fresh session or set fork_session=true to fork from prior context.`}]};let I=v.spawn({prompt:r.prompt,sessionIdOverride:r.fork_session?void 0:C?.kind==="resume"||C?.kind==="relaunch"?C.stableSessionId:void 0,name:r.name,workdir:o,model:s,reasoningEffort:b,systemPrompt:r.system_prompt,allowedTools:r.allowed_tools,resumeSessionId:C?.kind==="resume"?C.resumeSessionId:f,resumeWorktreeFrom:k,forkSession:f?r.fork_session:!1,multiTurn:!0,permissionMode:a,planApproval:d,codexApprovalPolicy:i==="codex"?"never":void 0,originChannel:l,originThreadId:m,originAgentId:t.agentId||void 0,originSessionKey:g,route:y,harness:i,worktreeStrategy:r.worktree_strategy,worktreeBaseBranch:r.worktree_base_branch,worktreePrTargetRepo:r.worktree_pr_target_repo});return{content:[{type:"text",text:vP(v)?v.formatLaunchResult({prompt:r.prompt,workdir:o,harness:i,permissionMode:a??_.permissionMode,planApproval:d,forceNewSession:r.force_new_session,resumeSessionId:r.resume_session_id,forkSession:r.fork_session,clearedPersistedCodexResume:A},I):oi({prompt:r.prompt,workdir:o,harness:i,permissionMode:a??_.permissionMode,planApproval:d,resumeSessionId:r.resume_session_id,forkSession:r.fork_session,forceNewSession:r.force_new_session,clearedPersistedCodexResume:A},{id:I.id,name:I.name,model:I.model,reasoningEffort:I.reasoningEffort??lt(i),worktreeStrategy:I.worktreeStrategy??r.worktree_strategy??_.defaultWorktreeStrategy??"off",worktreePath:I.worktreePath,originalWorkdir:I.originalWorkdir})}]}}catch(n){let o=yP(n),i=o.includes("Max sessions")?"":`
43
+ `)}}}let f=t.resume_session_id,k=f?r.resolve?.(f):void 0,A=f?r.getPersistedSession?.(f):void 0;if(f){let R=r.resolveBackendConversationId?.(f)??r.resolveHarnessSessionId?.(f);if(!R)return{kind:"error",text:`Error: Could not resolve resume_session_id "${f}" to a session ID. Use agent_sessions to list available sessions.`};f=R}let{resumeSessionId:b,clearedPersistedCodexResume:w}=tn({requestedResumeSessionId:f,activeSession:k?{harnessSessionId:k.backendConversationId??k.harnessSessionId}:void 0,persistedSession:A?{harness:A.harness,backendRef:A.backendRef}:void 0}),C=t.permission_mode??_.permissionMode,I=t.plan_approval??_.planApproval;return{kind:"resolved",workdir:n,harness:o,resolvedModel:s,permissionMode:C,planApproval:I,originChannel:m,originThreadId:y,originSessionKey:g,route:Et(e,m,g),resumeSessionId:b,resolvedResumeId:f,clearedPersistedCodexResume:w,reasoningEffort:lt(o)}}function yP(t){return t instanceof Error?t.message:String(t)}function Gm(t,e){return t?("id"in t?t.id:t.sessionId)??e??"unknown-session":e??"unknown-session"}function kP(t){return!t||typeof t!="object"?!1:typeof t.prompt=="string"}function vP(t){return!!t&&typeof t=="object"&&typeof t.formatLaunchResult=="function"}function Hm(t){return{name:"agent_launch",description:"Launch a coding agent session in background to execute a development task. Sessions are multi-turn \u2014 they stay open for follow-up messages via agent_respond. Supports resuming previous sessions. Returns a session ID and name for tracking.",parameters:p.Object({prompt:p.String({description:"The task prompt to execute"}),name:p.Optional(p.String({description:"Short human-readable name for the session (kebab-case, e.g. 'fix-auth'). Auto-generated from prompt if omitted."})),workdir:p.Optional(p.String({description:"Working directory (defaults to cwd)"})),model:p.Optional(p.String({description:"Model name to use"})),system_prompt:p.Optional(p.String({description:"Additional system prompt"})),allowed_tools:p.Optional(p.Array(p.String(),{description:"List of allowed tools"})),resume_session_id:p.Optional(p.String({description:"Session reference to continue or fork from. Prefer the plugin session ID shown by agent_launch or agent_sessions; persisted backend conversation IDs also resolve when available."})),fork_session:p.Optional(p.Boolean({description:"When resuming, fork to a new session instead of continuing the existing one. Use with resume_session_id."})),force_new_session:p.Optional(p.Boolean({description:"Bypass resume-first protection and start a brand-new linked session even when a resumable or active linked session already exists."})),permission_mode:p.Optional(p.Union([p.Literal("default"),p.Literal("plan"),p.Literal("bypassPermissions")],{description:"Permission mode: 'default' (plugin-managed interactive execution), 'plan' (present the plan first and block implementation until approval), 'bypassPermissions' (fully autonomous execution). Defaults to plugin config ('plan' by default)."})),plan_approval:p.Optional(p.Union([p.Literal("ask"),p.Literal("delegate"),p.Literal("approve")],{description:"Plan approval policy for this session: 'ask' (send the full plan to the user with Approve/Revise/Reject buttons), 'delegate' (orchestrator must review the full plan, then either approve directly or escalate back to the user with the same buttons), 'approve' (auto-approve after verification). Overrides the plugin-level planApproval setting."})),harness:p.Optional(p.String({description:"Agent harness to use (e.g. 'claude-code'). Defaults to 'claude-code'."})),worktree_strategy:p.Optional(p.Union([p.Literal("off"),p.Literal("manual"),p.Literal("ask"),p.Literal("delegate"),p.Literal("auto-merge"),p.Literal("auto-pr")],{description:"Worktree strategy: 'off' (no worktree), 'manual' (create worktree but no auto merge-back), 'ask' (prompt user with Merge/PR/Decide later/Dismiss buttons), 'delegate' (orchestrator decides), 'auto-merge' (merge automatically), 'auto-pr' (open/update a PR automatically). Defaults to the plugin config when unset."})),worktree_base_branch:p.Optional(p.String({description:"Base branch for worktree merge/PR operations (default: auto-detected or 'main')"})),worktree_pr_target_repo:p.Optional(p.String({description:"Target repository for cross-repo PRs (e.g. 'openai/codex' for fork-to-upstream workflow). If not set, auto-detected from 'upstream' remote or defaults to 'origin'."}))}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!kP(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected at least { prompt }."}]};r.agentId&&console.warn(`[agent_launch] \u26A0\uFE0F agentId="${r.agentId}" was passed as a parameter \u2014 this is WRONG. agentId is only for sessions_spawn (OpenClaw sub-agents), not agent_launch (CC sessions). The field is being ignored. ctx.agentId="${t.agentId}" will be used for origin routing instead.`);try{let n=jm(r,t,v);if(n.kind!=="resolved")return{content:[{type:"text",text:n.text}]};let{workdir:o,harness:i,resolvedModel:s,permissionMode:a,planApproval:d,originChannel:l,originThreadId:m,originSessionKey:g,route:y,resumeSessionId:f,resolvedResumeId:k,clearedPersistedCodexResume:A,reasoningEffort:b}=n,w=r.resume_session_id?v.resolve(r.resume_session_id)??v.getPersistedSession(r.resume_session_id):void 0,C=!r.fork_session&&w?Jn(w):void 0;if(C?.kind==="direct")return{content:[{type:"text",text:`Session ${w.name} [${Gm(w,r.resume_session_id)}] is already running. Use agent_respond(session='${r.resume_session_id}', message='<next instruction>') instead of agent_launch(resume_session_id=...).`}]};if(C?.kind==="unavailable")return{content:[{type:"text",text:`Resume unavailable for session ${w.name} [${Gm(w,r.resume_session_id)}] (${C.reason}). Use agent_launch(prompt='<new task>') for a fresh session or set fork_session=true to fork from prior context.`}]};let I=v.spawn({prompt:r.prompt,sessionIdOverride:r.fork_session?void 0:C?.kind==="resume"||C?.kind==="relaunch"?C.stableSessionId:void 0,name:r.name,workdir:o,model:s,reasoningEffort:b,systemPrompt:r.system_prompt,allowedTools:r.allowed_tools,resumeSessionId:C?.kind==="resume"?C.resumeSessionId:f,resumeWorktreeFrom:k,forkSession:f?r.fork_session:!1,multiTurn:!0,permissionMode:a,planApproval:d,codexApprovalPolicy:i==="codex"?"never":void 0,originChannel:l,originThreadId:m,originAgentId:t.agentId||void 0,originSessionKey:g,route:y,harness:i,worktreeStrategy:r.worktree_strategy,worktreeBaseBranch:r.worktree_base_branch,worktreePrTargetRepo:r.worktree_pr_target_repo});return{content:[{type:"text",text:vP(v)?v.formatLaunchResult({prompt:r.prompt,workdir:o,harness:i,permissionMode:a??_.permissionMode,planApproval:d,forceNewSession:r.force_new_session,resumeSessionId:r.resume_session_id,forkSession:r.fork_session,clearedPersistedCodexResume:A},I):oi({prompt:r.prompt,workdir:o,harness:i,permissionMode:a??_.permissionMode,planApproval:d,resumeSessionId:r.resume_session_id,forkSession:r.fork_session,forceNewSession:r.force_new_session,clearedPersistedCodexResume:A},{id:I.id,name:I.name,model:I.model,reasoningEffort:I.reasoningEffort??lt(i),worktreeStrategy:I.worktreeStrategy??r.worktree_strategy??_.defaultWorktreeStrategy??"off",worktreePath:I.worktreePath,originalWorkdir:I.originalWorkdir})}]}}catch(n){let o=yP(n),i=o.includes("Max sessions")?"":`
44
44
 
45
- Use agent_sessions to see active sessions and their status.`;return{content:[{type:"text",text:`Error launching session: ${o}${i}`}]}}}}}Ee();Y();Re();import{existsSync as Kd,readFileSync as yf}from"fs";import{EventEmitter as UP}from"events";import{webcrypto as Qm}from"node:crypto";var zm="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var PP=128,Mr,sn;function wP(t){!Mr||Mr.length<t?(Mr=Buffer.allocUnsafe(t*PP),Qm.getRandomValues(Mr),sn=0):sn+t>Mr.length&&(Qm.getRandomValues(Mr),sn=0),sn+=t}function vi(t=21){wP(t|=0);let e="";for(let r=sn-t;r<sn;r++)e+=zm[Mr[r]&63];return e}Cd();Re();ke();var Jm={starting:["running","failed","killed"],running:["completed","failed","killed"],completed:[],failed:[],killed:[]},Ym=new Set(["merged","released","pr_open","dismissed","cleanup_failed"]);function IP(t){return t.requestedPermissionMode!=="plan"?"not_plan_gated":t.pendingPlanApproval?"awaiting_approval":t.planModeApproved?"approved_then_implemented":t.currentPermissionMode!=="plan"?"implemented_without_required_approval":"awaiting_plan_output"}function Oe(t){return{...t,approvalExecutionState:IP(t)}}function Od(t,e){switch(e.type){case"initialize":return Oe({...t,worktreeState:e.hasWorktree&&t.worktreeState==="none"?"provisioned":t.worktreeState,lifecycle:t.status==="starting"?"starting":t.lifecycle,runtimeState:t.status==="starting"?"live":t.runtimeState});case"status.transition":return e.status==="starting"?Oe({...t,status:e.status,lifecycle:"starting",runtimeState:"live"}):e.status==="running"?Oe({...t,status:e.status,lifecycle:t.lifecycle==="starting"||t.lifecycle==="suspended"?"active":t.lifecycle,runtimeState:"live"}):Oe({...t,status:e.status,runtimeState:"stopped",lifecycle:t.lifecycle==="suspended"?"suspended":"terminal"});case"permission.mode_changed":return Oe({...t,currentPermissionMode:e.currentPermissionMode});case"turn.started":return Oe({...t,lifecycle:"active",runtimeState:"live"});case"input.requested":return Oe({...t,lifecycle:t.pendingPlanApproval?"awaiting_plan_decision":"awaiting_user_input"});case"plan.requested":if(t.planModeApproved)return t;{let r=t.pendingPlanApproval&&t.approvalState==="pending"&&t.planApprovalContext===e.context,n=t.pendingPlanApproval&&t.approvalState==="changes_requested"&&t.planApprovalContext===e.context&&t.planDecisionVersion>0,o=!t.pendingPlanApproval&&t.approvalState==="changes_requested"&&t.planApprovalContext===e.context&&t.planDecisionVersion>0,i=r||n||o?t.planDecisionVersion:t.planDecisionVersion+1;return Oe({...t,pendingPlanApproval:!0,planApprovalContext:e.context,approvalState:"pending",planDecisionVersion:i,actionablePlanDecisionVersion:i,canonicalPlanPromptVersion:r?t.canonicalPlanPromptVersion:void 0,approvalPromptRequiredVersion:r?t.approvalPromptRequiredVersion:void 0,approvalPromptVersion:r?t.approvalPromptVersion:void 0,approvalPromptStatus:r?t.approvalPromptStatus:"not_sent",approvalPromptTransport:r?t.approvalPromptTransport:"none",approvalPromptMessageKind:r?t.approvalPromptMessageKind:"none",approvalPromptLastAttemptAt:r?t.approvalPromptLastAttemptAt:void 0,approvalPromptDeliveredAt:r?t.approvalPromptDeliveredAt:void 0,approvalPromptFailedAt:r?t.approvalPromptFailedAt:void 0,lifecycle:"awaiting_plan_decision"})}case"plan.cleared":return Oe({...t,pendingPlanApproval:!1,planApprovalContext:void 0,actionablePlanDecisionVersion:void 0,approvalState:t.approvalState==="pending"?"not_required":t.approvalState});case"plan.approved":return Oe({...t,pendingPlanApproval:!1,planApprovalContext:void 0,actionablePlanDecisionVersion:void 0,planModeApproved:!0,approvalState:"approved",planDecisionVersion:t.planDecisionVersion+1,approvalPromptVersion:void 0,approvalPromptStatus:"not_sent",lifecycle:t.status==="running"?"active":t.lifecycle});case"plan.changes_requested":return Oe({...t,pendingPlanApproval:!0,approvalState:"changes_requested",planDecisionVersion:t.planDecisionVersion+1,actionablePlanDecisionVersion:void 0,canonicalPlanPromptVersion:void 0,approvalPromptRequiredVersion:void 0,approvalPromptVersion:void 0,approvalPromptStatus:"not_sent",approvalPromptTransport:"none",approvalPromptMessageKind:"none",approvalPromptLastAttemptAt:void 0,approvalPromptDeliveredAt:void 0,approvalPromptFailedAt:void 0,lifecycle:"awaiting_plan_decision"});case"terminal.entered":return Oe({...t,lifecycle:e.suspended?"suspended":"terminal",runtimeState:"stopped"});case"worktree.decision_requested":return Oe({...t,lifecycle:"awaiting_worktree_decision",worktreeState:"pending_decision"});case"worktree.state_set":return Oe({...t,worktreeState:e.worktreeState,lifecycle:e.worktreeState==="pending_decision"?"awaiting_worktree_decision":Ym.has(e.worktreeState)?"terminal":t.lifecycle});case"delivery.state_set":return Oe({...t,deliveryState:e.deliveryState})}}function Xm(t,e){let r={...t,...e.lifecycle!==void 0?{lifecycle:e.lifecycle}:{},...e.approvalState!==void 0?{approvalState:e.approvalState}:{},...e.approvalExecutionState!==void 0?{approvalExecutionState:e.approvalExecutionState}:{},...e.worktreeState!==void 0?{worktreeState:e.worktreeState}:{},...e.runtimeState!==void 0?{runtimeState:e.runtimeState}:{},...e.deliveryState!==void 0?{deliveryState:e.deliveryState}:{},...e.requestedPermissionMode!==void 0?{requestedPermissionMode:e.requestedPermissionMode}:{},...e.currentPermissionMode!==void 0?{currentPermissionMode:e.currentPermissionMode}:{},...e.pendingPlanApproval!==void 0?{pendingPlanApproval:e.pendingPlanApproval}:{},...e.planApprovalContext!==void 0?{planApprovalContext:e.planApprovalContext}:{},...e.planDecisionVersion!==void 0?{planDecisionVersion:e.planDecisionVersion}:{},...e.actionablePlanDecisionVersion!==void 0?{actionablePlanDecisionVersion:e.actionablePlanDecisionVersion}:{},...e.canonicalPlanPromptVersion!==void 0?{canonicalPlanPromptVersion:e.canonicalPlanPromptVersion}:{},...e.approvalPromptRequiredVersion!==void 0?{approvalPromptRequiredVersion:e.approvalPromptRequiredVersion}:{},...e.approvalPromptVersion!==void 0?{approvalPromptVersion:e.approvalPromptVersion}:{},...e.approvalPromptStatus!==void 0?{approvalPromptStatus:e.approvalPromptStatus}:{},...e.approvalPromptTransport!==void 0?{approvalPromptTransport:e.approvalPromptTransport}:{},...e.approvalPromptMessageKind!==void 0?{approvalPromptMessageKind:e.approvalPromptMessageKind}:{},...e.approvalPromptLastAttemptAt!==void 0?{approvalPromptLastAttemptAt:e.approvalPromptLastAttemptAt}:{},...e.approvalPromptDeliveredAt!==void 0?{approvalPromptDeliveredAt:e.approvalPromptDeliveredAt}:{},...e.approvalPromptFailedAt!==void 0?{approvalPromptFailedAt:e.approvalPromptFailedAt}:{},...e.planModeApproved!==void 0?{planModeApproved:e.planModeApproved}:{}};return e.approvalState==="changes_requested"&&e.pendingPlanApproval===void 0&&(r={...r,pendingPlanApproval:!1}),r.pendingPlanApproval?r={...r,approvalState:"pending",actionablePlanDecisionVersion:r.actionablePlanDecisionVersion??r.planDecisionVersion,lifecycle:"awaiting_plan_decision"}:r.approvalState==="changes_requested"&&(r={...r,actionablePlanDecisionVersion:void 0,lifecycle:"awaiting_user_input"}),e.pendingWorktreeDecisionSince!==void 0||r.worktreeState==="pending_decision"?r=Od(r,{type:"worktree.decision_requested"}):Ym.has(r.worktreeState)&&(r={...r,lifecycle:"terminal"}),Oe(r)}var Pi=class{queue=[];resolve=null;done=!1;hasPending(){return this.queue.length>0}push(e){this.queue.push(e),this.resolve&&(this.resolve(),this.resolve=null)}end(){this.done=!0,this.resolve&&(this.resolve(),this.resolve=null)}async*[Symbol.asyncIterator](){for(;;){for(;this.queue.length>0;)yield this.queue.shift();if(this.done)return;await new Promise(e=>{this.resolve=e})}}};import{appendFileSync as xP}from"fs";import{tmpdir as bP}from"os";import{join as AP}from"path";var Zm=2e3;function an(t){return AP(bP(),`openclaw-agent-${t}.txt`)}function RP(t,e){if(!e)return;let r=e.split(`
46
- `),[n="",...o]=r;t.length===0?t.push(n):t[t.length-1]+=n;for(let i of o)t.push(i)}function ef(t,e,r){RP(t,r),t.length>Zm&&t.splice(0,t.length-Zm);try{xP(an(e),r,"utf-8")}catch{}return t}var wi=class{timers=new Map;get size(){return this.timers.size}set(e,r,n){this.clear(e);let o=setTimeout(n,r);o.unref?.(),this.timers.set(e,o)}clear(e){let r=this.timers.get(e);r&&(clearTimeout(r),this.timers.delete(e))}clearAll(){for(let e of this.timers.values())clearTimeout(e);this.timers.clear()}};var Ii=class{constructor(e){this.deps=e}deps;waitingForInputFired=!1;lastTurnHadQuestion=!1;turnInProgress=!0;currentTurnText="";currentTurnPlanArtifact;beginUserTurn(){this.waitingForInputFired=!1,this.turnInProgress=!0,this.currentTurnText="",this.currentTurnPlanArtifact=void 0,this.lastTurnHadQuestion=!1}noteTextDelta(e,r){this.waitingForInputFired=!1,r||(this.lastTurnHadQuestion=!1),this.deps.appendOutput(e),this.currentTurnText+=this.currentTurnText?`
45
+ Use agent_sessions to see active sessions and their status.`;return{content:[{type:"text",text:`Error launching session: ${o}${i}`}]}}}}}Ee();Y();Re();import{existsSync as Kd,readFileSync as yf}from"fs";import{EventEmitter as UP}from"events";import{webcrypto as Qm}from"node:crypto";var zm="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var PP=128,Tr,on;function wP(t){!Tr||Tr.length<t?(Tr=Buffer.allocUnsafe(t*PP),Qm.getRandomValues(Tr),on=0):on+t>Tr.length&&(Qm.getRandomValues(Tr),on=0),on+=t}function vi(t=21){wP(t|=0);let e="";for(let r=on-t;r<on;r++)e+=zm[Tr[r]&63];return e}Cd();Re();ke();var Jm={starting:["running","failed","killed"],running:["completed","failed","killed"],completed:[],failed:[],killed:[]},Ym=new Set(["merged","released","pr_open","dismissed","cleanup_failed"]);function IP(t){return t.requestedPermissionMode!=="plan"?"not_plan_gated":t.pendingPlanApproval?"awaiting_approval":t.planModeApproved?"approved_then_implemented":t.currentPermissionMode!=="plan"?"implemented_without_required_approval":"awaiting_plan_output"}function Oe(t){return{...t,approvalExecutionState:IP(t)}}function Od(t,e){switch(e.type){case"initialize":return Oe({...t,worktreeState:e.hasWorktree&&t.worktreeState==="none"?"provisioned":t.worktreeState,lifecycle:t.status==="starting"?"starting":t.lifecycle,runtimeState:t.status==="starting"?"live":t.runtimeState});case"status.transition":return e.status==="starting"?Oe({...t,status:e.status,lifecycle:"starting",runtimeState:"live"}):e.status==="running"?Oe({...t,status:e.status,lifecycle:t.lifecycle==="starting"||t.lifecycle==="suspended"?"active":t.lifecycle,runtimeState:"live"}):Oe({...t,status:e.status,runtimeState:"stopped",lifecycle:t.lifecycle==="suspended"?"suspended":"terminal"});case"permission.mode_changed":return Oe({...t,currentPermissionMode:e.currentPermissionMode});case"turn.started":return Oe({...t,lifecycle:"active",runtimeState:"live"});case"input.requested":return Oe({...t,lifecycle:t.pendingPlanApproval?"awaiting_plan_decision":"awaiting_user_input"});case"plan.requested":if(t.planModeApproved)return t;{let r=t.pendingPlanApproval&&t.approvalState==="pending"&&t.planApprovalContext===e.context,n=t.pendingPlanApproval&&t.approvalState==="changes_requested"&&t.planApprovalContext===e.context&&t.planDecisionVersion>0,o=!t.pendingPlanApproval&&t.approvalState==="changes_requested"&&t.planApprovalContext===e.context&&t.planDecisionVersion>0,i=r||n||o?t.planDecisionVersion:t.planDecisionVersion+1;return Oe({...t,pendingPlanApproval:!0,planApprovalContext:e.context,approvalState:"pending",planDecisionVersion:i,actionablePlanDecisionVersion:i,canonicalPlanPromptVersion:r?t.canonicalPlanPromptVersion:void 0,approvalPromptRequiredVersion:r?t.approvalPromptRequiredVersion:void 0,approvalPromptVersion:r?t.approvalPromptVersion:void 0,approvalPromptStatus:r?t.approvalPromptStatus:"not_sent",approvalPromptTransport:r?t.approvalPromptTransport:"none",approvalPromptMessageKind:r?t.approvalPromptMessageKind:"none",approvalPromptLastAttemptAt:r?t.approvalPromptLastAttemptAt:void 0,approvalPromptDeliveredAt:r?t.approvalPromptDeliveredAt:void 0,approvalPromptFailedAt:r?t.approvalPromptFailedAt:void 0,lifecycle:"awaiting_plan_decision"})}case"plan.cleared":return Oe({...t,pendingPlanApproval:!1,planApprovalContext:void 0,actionablePlanDecisionVersion:void 0,approvalState:t.approvalState==="pending"?"not_required":t.approvalState});case"plan.approved":return Oe({...t,pendingPlanApproval:!1,planApprovalContext:void 0,actionablePlanDecisionVersion:void 0,planModeApproved:!0,approvalState:"approved",planDecisionVersion:t.planDecisionVersion+1,approvalPromptVersion:void 0,approvalPromptStatus:"not_sent",lifecycle:t.status==="running"?"active":t.lifecycle});case"plan.changes_requested":return Oe({...t,pendingPlanApproval:!0,approvalState:"changes_requested",planDecisionVersion:t.planDecisionVersion+1,actionablePlanDecisionVersion:void 0,canonicalPlanPromptVersion:void 0,approvalPromptRequiredVersion:void 0,approvalPromptVersion:void 0,approvalPromptStatus:"not_sent",approvalPromptTransport:"none",approvalPromptMessageKind:"none",approvalPromptLastAttemptAt:void 0,approvalPromptDeliveredAt:void 0,approvalPromptFailedAt:void 0,lifecycle:"awaiting_plan_decision"});case"terminal.entered":return Oe({...t,lifecycle:e.suspended?"suspended":"terminal",runtimeState:"stopped"});case"worktree.decision_requested":return Oe({...t,lifecycle:"awaiting_worktree_decision",worktreeState:"pending_decision"});case"worktree.state_set":return Oe({...t,worktreeState:e.worktreeState,lifecycle:e.worktreeState==="pending_decision"?"awaiting_worktree_decision":Ym.has(e.worktreeState)?"terminal":t.lifecycle});case"delivery.state_set":return Oe({...t,deliveryState:e.deliveryState})}}function Xm(t,e){let r={...t,...e.lifecycle!==void 0?{lifecycle:e.lifecycle}:{},...e.approvalState!==void 0?{approvalState:e.approvalState}:{},...e.approvalExecutionState!==void 0?{approvalExecutionState:e.approvalExecutionState}:{},...e.worktreeState!==void 0?{worktreeState:e.worktreeState}:{},...e.runtimeState!==void 0?{runtimeState:e.runtimeState}:{},...e.deliveryState!==void 0?{deliveryState:e.deliveryState}:{},...e.requestedPermissionMode!==void 0?{requestedPermissionMode:e.requestedPermissionMode}:{},...e.currentPermissionMode!==void 0?{currentPermissionMode:e.currentPermissionMode}:{},...e.pendingPlanApproval!==void 0?{pendingPlanApproval:e.pendingPlanApproval}:{},...e.planApprovalContext!==void 0?{planApprovalContext:e.planApprovalContext}:{},...e.planDecisionVersion!==void 0?{planDecisionVersion:e.planDecisionVersion}:{},...e.actionablePlanDecisionVersion!==void 0?{actionablePlanDecisionVersion:e.actionablePlanDecisionVersion}:{},...e.canonicalPlanPromptVersion!==void 0?{canonicalPlanPromptVersion:e.canonicalPlanPromptVersion}:{},...e.approvalPromptRequiredVersion!==void 0?{approvalPromptRequiredVersion:e.approvalPromptRequiredVersion}:{},...e.approvalPromptVersion!==void 0?{approvalPromptVersion:e.approvalPromptVersion}:{},...e.approvalPromptStatus!==void 0?{approvalPromptStatus:e.approvalPromptStatus}:{},...e.approvalPromptTransport!==void 0?{approvalPromptTransport:e.approvalPromptTransport}:{},...e.approvalPromptMessageKind!==void 0?{approvalPromptMessageKind:e.approvalPromptMessageKind}:{},...e.approvalPromptLastAttemptAt!==void 0?{approvalPromptLastAttemptAt:e.approvalPromptLastAttemptAt}:{},...e.approvalPromptDeliveredAt!==void 0?{approvalPromptDeliveredAt:e.approvalPromptDeliveredAt}:{},...e.approvalPromptFailedAt!==void 0?{approvalPromptFailedAt:e.approvalPromptFailedAt}:{},...e.planModeApproved!==void 0?{planModeApproved:e.planModeApproved}:{}};return e.approvalState==="changes_requested"&&e.pendingPlanApproval===void 0&&(r={...r,pendingPlanApproval:!1}),r.pendingPlanApproval?r={...r,approvalState:"pending",actionablePlanDecisionVersion:r.actionablePlanDecisionVersion??r.planDecisionVersion,lifecycle:"awaiting_plan_decision"}:r.approvalState==="changes_requested"&&(r={...r,actionablePlanDecisionVersion:void 0,lifecycle:"awaiting_user_input"}),e.pendingWorktreeDecisionSince!==void 0||r.worktreeState==="pending_decision"?r=Od(r,{type:"worktree.decision_requested"}):Ym.has(r.worktreeState)&&(r={...r,lifecycle:"terminal"}),Oe(r)}var Pi=class{queue=[];resolve=null;done=!1;hasPending(){return this.queue.length>0}push(e){this.queue.push(e),this.resolve&&(this.resolve(),this.resolve=null)}end(){this.done=!0,this.resolve&&(this.resolve(),this.resolve=null)}async*[Symbol.asyncIterator](){for(;;){for(;this.queue.length>0;)yield this.queue.shift();if(this.done)return;await new Promise(e=>{this.resolve=e})}}};import{appendFileSync as xP}from"fs";import{tmpdir as bP}from"os";import{join as AP}from"path";var Zm=2e3;function sn(t){return AP(bP(),`openclaw-agent-${t}.txt`)}function RP(t,e){if(!e)return;let r=e.split(`
46
+ `),[n="",...o]=r;t.length===0?t.push(n):t[t.length-1]+=n;for(let i of o)t.push(i)}function ef(t,e,r){RP(t,r),t.length>Zm&&t.splice(0,t.length-Zm);try{xP(sn(e),r,"utf-8")}catch{}return t}var wi=class{timers=new Map;get size(){return this.timers.size}set(e,r,n){this.clear(e);let o=setTimeout(n,r);o.unref?.(),this.timers.set(e,o)}clear(e){let r=this.timers.get(e);r&&(clearTimeout(r),this.timers.delete(e))}clearAll(){for(let e of this.timers.values())clearTimeout(e);this.timers.clear()}};var Ii=class{constructor(e){this.deps=e}deps;waitingForInputFired=!1;lastTurnHadQuestion=!1;turnInProgress=!0;currentTurnText="";currentTurnPlanArtifact;beginUserTurn(){this.waitingForInputFired=!1,this.turnInProgress=!0,this.currentTurnText="",this.currentTurnPlanArtifact=void 0,this.lastTurnHadQuestion=!1}noteTextDelta(e,r){this.waitingForInputFired=!1,r||(this.lastTurnHadQuestion=!1),this.deps.appendOutput(e),this.currentTurnText+=this.currentTurnText?`
47
47
  ${e}`:e,this.deps.emitOutput(e)}noteToolCall(e){let{name:r,input:n,currentPermissionMode:o,permissionMode:i,planModeApproved:s}=e;if(r==="Write"){let a=n;typeof a?.file_path=="string"&&a.file_path.includes("/.claude/plans/")&&this.deps.setPlanFilePath(a.file_path)}r==="AskUserQuestion"?(this.lastTurnHadQuestion=!0,this.deps.applyInputRequested(),(o==="plan"||i==="plan")&&!s&&this.deps.markPendingPlanApproval("plan-mode")):(r==="ExitPlanMode"||r==="set_permission_mode")&&!s&&(this.lastTurnHadQuestion=!0,this.deps.markPendingPlanApproval("plan-mode")),this.deps.emitToolUse(r,n)}notePendingInput(){this.lastTurnHadQuestion=!0,this.deps.applyInputRequested(),this.waitingForInputFired||(this.waitingForInputFired=!0,this.deps.emitTurnEnd(!0))}clearResolvedPendingInput(e,r){if(!(!e||r?.requestId===e))return r}notePlanArtifact(e,r){if(this.currentTurnPlanArtifact=e,this.deps.setLatestPlanArtifact(e),!r)return;let n=e.markdown.trim();!n||this.currentTurnText.trim()===n||(this.deps.appendOutput(n),this.currentTurnText=n,this.deps.emitOutput(n))}noteSettingsChanged(e){let{oldMode:r,permissionMode:n,planModeApproved:o}=e;if(n)return n!=="plan"&&r==="plan"&&!o&&(this.deps.markPendingPlanApproval("plan-mode"),this.lastTurnHadQuestion=!0),n}finishSuccessfulTurn(e){let{currentPermissionMode:r,permissionMode:n,pendingPlanApproval:o,planModeApproved:i,pendingInputState:s,hasPendingMessages:a}=e,d=o;(r==="plan"||n==="plan")&&!d&&!i&&(this.deps.markPendingPlanApproval("plan-mode"),d=!0);let l=d||this.lastTurnHadQuestion||!!s;this.turnInProgress=a,l&&!this.waitingForInputFired?(this.waitingForInputFired=!0,d||this.deps.markAwaitingUserInput(),this.deps.emitTurnEnd(!0)):!a&&!l&&(this.deps.completeTurn(),this.deps.emitTurnEnd(!1))}finishTerminalTurn(){this.turnInProgress=!1}finishInterruptedTurn(e){this.turnInProgress=e,this.waitingForInputFired=!1,this.lastTurnHadQuestion=!1,this.currentTurnText="",this.currentTurnPlanArtifact=void 0}resetAfterRun(){this.lastTurnHadQuestion=!1,this.currentTurnText="",this.currentTurnPlanArtifact=void 0}};var xi=class{constructor(e){this.deps=e}deps;applyMessage(e,r){if(e.type==="backend_ref"){this.deps.clearStartupTimer(),this.deps.assignBackendRef({...e.ref}),this.deps.transitionRunning();return}if(e.type==="run_started"){e.runId&&this.deps.noteRunStarted(e.runId);return}if(e.type==="text_delta"){this.deps.noteTextDelta(e.text,r.pendingPlanApproval);return}if(e.type==="tool_call"){this.deps.noteToolCall({name:e.name,input:e.input,currentPermissionMode:r.currentPermissionMode,permissionMode:r.permissionMode,planModeApproved:r.planModeApproved});return}if(e.type==="pending_input"){this.deps.setPendingInputState(e.state),this.deps.notePendingInput();return}if(e.type==="pending_input_resolved"){this.deps.setPendingInputState(this.deps.clearResolvedPendingInput(e.requestId,r.pendingInputState));return}if(e.type==="plan_artifact"){this.deps.notePlanArtifact(e);return}if(e.type==="settings_changed"){let n=this.deps.noteSettingsChanged({oldMode:r.currentPermissionMode,permissionMode:e.permissionMode,planModeApproved:r.planModeApproved});n&&this.deps.setCurrentPermissionMode(n);return}if(e.type==="run_completed"){this.deps.handleRunCompleted(e.data);return}e.type}};ut();var KP=120*1e3;function Ni(t){return t instanceof Error?t.message:String(t)}var Fi=class extends UP{id;name;harnessSessionId;backendRef;harness;harnessHandle;prompt;workdir;model;reasoningEffort;systemPrompt;allowedTools;permissionMode;requestedPermissionMode;planApproval;codexApprovalPolicy;currentPermissionMode;pendingModeSwitch;resumeSessionId;forkSession;worktreePath;originalWorkdir;worktreeBranch;worktreeStrategy;worktreeBaseBranch;worktreePrTargetRepo;autoMergeParentSessionId;autoMergeConflictResolutionAttemptCount;autoMergeResolverSessionId;worktreePushRemote;worktreeDisposition;worktreePrUrl;worktreePrNumber;worktreeMerged;worktreeMergedAt;worktreeLifecycle;worktreeState="none";multiTurn;goalTaskId;messageStream;_status="starting";error;startedAt;completedAt;abortController;outputBuffer=[];result;costUsd=0;originChannel;originThreadId;originAgentId;originSessionKey;route;pendingInputState;pendingPlanApproval=!1;planApprovalContext;planDecisionVersion=0;actionablePlanDecisionVersion;canonicalPlanPromptVersion;approvalPromptRequiredVersion;approvalPromptVersion;approvalPromptStatus="not_sent";approvalPromptTransport="none";approvalPromptMessageKind="none";approvalPromptLastAttemptAt;approvalPromptDeliveredAt;approvalPromptFailedAt;planFilePath;killReason="unknown";planModeApproved=!1;turnRuntime;harnessEvents;lifecycle="starting";approvalState="not_required";approvalExecutionState="not_plan_gated";approvalRationale;latestPlanArtifact;latestPlanArtifactVersion;runtimeState="live";deliveryState="idle";canUseTool;autoRespondCount=0;timers=new wi;constructor(e,r){super(),this.id=e.sessionIdOverride??vi(8),this.name=r,this.harness=e.harness?zn(e.harness):Wm(),this.prompt=e.prompt,this.workdir=e.workdir,this.model=e.model??$t(this.harness.name),this.reasoningEffort=e.reasoningEffort??lt(this.harness.name),this.systemPrompt=e.systemPrompt,this.allowedTools=e.allowedTools,this.permissionMode=e.permissionMode??_.permissionMode,this.requestedPermissionMode=e.requestedPermissionMode??this.permissionMode,this.planApproval=e.planApproval??_.planApproval,this.codexApprovalPolicy=this.harness.name==="codex"?"never":void 0,this.currentPermissionMode=this.permissionMode,this.originChannel=e.originChannel,this.originThreadId=e.originThreadId,this.originAgentId=e.originAgentId,this.originSessionKey=e.originSessionKey,this.route=e.route?{...e.route}:void 0,this.backendRef=e.backendRef?{...e.backendRef}:void 0,this.resumeSessionId=e.resumeSessionId,this.forkSession=e.forkSession,this.multiTurn=e.multiTurn??!0,this.goalTaskId=e.goalTaskId,this.worktreeStrategy=e.worktreeStrategy,this.worktreeBaseBranch=e.worktreeBaseBranch,e.worktreePrTargetRepo&&(this.worktreePrTargetRepo=e.worktreePrTargetRepo),e.autoMergeParentSessionId&&(this.autoMergeParentSessionId=e.autoMergeParentSessionId),e.autoMergeConflictResolutionAttemptCount!==void 0&&(this.autoMergeConflictResolutionAttemptCount=e.autoMergeConflictResolutionAttemptCount),e.autoMergeResolverSessionId&&(this.autoMergeResolverSessionId=e.autoMergeResolverSessionId),this.canUseTool=e.canUseTool,this.startedAt=Date.now(),this.abortController=new AbortController,this.turnRuntime=new Ii({appendOutput:n=>ef(this.outputBuffer,this.id,n),emitOutput:n=>this.emit("output",this,n),emitToolUse:(n,o)=>this.emit("toolUse",this,n,o),emitTurnEnd:n=>this.emit("turnEnd",this,n),markPendingPlanApproval:n=>this.markPendingPlanApproval(n),markAwaitingUserInput:()=>this.markAwaitingUserInput(),applyInputRequested:()=>this.applyControlEvent({type:"input.requested"}),completeTurn:()=>{this.applyControlEvent({type:"terminal.entered"}),this.complete("done")},setPlanFilePath:n=>{this.planFilePath=n},setLatestPlanArtifact:n=>{this.latestPlanArtifact=n;let o=this.pendingPlanApproval?this.actionablePlanDecisionVersion??this.planDecisionVersion:void 0;this.latestPlanArtifactVersion=o&&o>0?o:void 0}}),this.harnessEvents=new xi({clearStartupTimer:()=>this.clearTimer("startup"),assignBackendRef:n=>{this.backendRef=n,this.harnessSessionId=n.conversationId,n.worktreePath&&(this.worktreePath=n.worktreePath,this.originalWorkdir??=this.workdir,this.worktreeBranch??=Ci(n.worktreePath),this.worktreeStrategy&&this.worktreeStrategy!=="off"&&this.applyControlEvent({type:"worktree.state_set",worktreeState:"provisioned"}))},noteRunStarted:n=>{this.backendRef&&(this.backendRef={...this.backendRef,runId:n})},transitionRunning:()=>{this._status==="starting"&&this.transition("running")},noteTextDelta:(n,o)=>this.turnRuntime.noteTextDelta(n,o),noteToolCall:n=>this.turnRuntime.noteToolCall(n),setPendingInputState:n=>{this.pendingInputState=n},notePendingInput:()=>this.turnRuntime.notePendingInput(),clearResolvedPendingInput:(n,o)=>this.turnRuntime.clearResolvedPendingInput(n,o),notePlanArtifact:n=>this.turnRuntime.notePlanArtifact(n.artifact,n.finalized),noteSettingsChanged:n=>this.turnRuntime.noteSettingsChanged(n),setCurrentPermissionMode:n=>{this.currentPermissionMode=n,this.applyControlEvent({type:"permission.mode_changed",currentPermissionMode:n})},handleRunCompleted:n=>{let o=n.outcome??(n.success?"completed":"failed");this.result={subtype:o==="interrupted"?"interrupted":n.success?"success":"error",duration_ms:n.duration_ms,total_cost_usd:n.total_cost_usd,num_turns:n.num_turns,result:n.result,is_error:o==="failed",session_id:n.session_id},this.costUsd=n.total_cost_usd;let i=this.multiTurn&&this.messageStream&&o==="interrupted",s=this.multiTurn&&this.messageStream&&o==="completed";i?(this.resetIdleTimer(),this.turnRuntime.finishInterruptedTurn(this.messageStream?.hasPending()===!0)):s?(this.resetIdleTimer(),this.turnRuntime.finishSuccessfulTurn({currentPermissionMode:this.currentPermissionMode,permissionMode:this.permissionMode,pendingPlanApproval:this.pendingPlanApproval,planModeApproved:this.planModeApproved,pendingInputState:this.pendingInputState,hasPendingMessages:this.messageStream?.hasPending()===!0})):(this.turnRuntime.finishTerminalTurn(),this.transitionToTerminal(o==="completed"?"completed":"failed")),this.turnRuntime.resetAfterRun(),this.pendingInputState=void 0}}),this.applyControlEvent({type:"initialize",hasWorktree:!!(this.worktreeStrategy&&this.worktreeStrategy!=="off")}),(e.planModeApproved!==void 0||e.approvalState!==void 0||e.approvalExecutionState!==void 0||e.approvalRationale!==void 0||e.pendingPlanApproval!==void 0||e.planApprovalContext!==void 0||e.planDecisionVersion!==void 0||e.actionablePlanDecisionVersion!==void 0||e.canonicalPlanPromptVersion!==void 0||e.approvalPromptRequiredVersion!==void 0||e.approvalPromptVersion!==void 0||e.approvalPromptStatus!==void 0||e.approvalPromptTransport!==void 0||e.approvalPromptMessageKind!==void 0||e.approvalPromptLastAttemptAt!==void 0||e.approvalPromptDeliveredAt!==void 0||e.approvalPromptFailedAt!==void 0)&&this.applyControlPatch({...e.planModeApproved!==void 0?{planModeApproved:e.planModeApproved}:{},...e.approvalState!==void 0?{approvalState:e.approvalState}:{},...e.approvalExecutionState!==void 0?{approvalExecutionState:e.approvalExecutionState}:{},...e.pendingPlanApproval!==void 0?{pendingPlanApproval:e.pendingPlanApproval}:{},...e.planApprovalContext!==void 0?{planApprovalContext:e.planApprovalContext}:{},...e.planDecisionVersion!==void 0?{planDecisionVersion:e.planDecisionVersion}:{},...e.actionablePlanDecisionVersion!==void 0?{actionablePlanDecisionVersion:e.actionablePlanDecisionVersion}:{},...e.canonicalPlanPromptVersion!==void 0?{canonicalPlanPromptVersion:e.canonicalPlanPromptVersion}:{},...e.approvalPromptRequiredVersion!==void 0?{approvalPromptRequiredVersion:e.approvalPromptRequiredVersion}:{},...e.approvalPromptVersion!==void 0?{approvalPromptVersion:e.approvalPromptVersion}:{},...e.approvalPromptStatus!==void 0?{approvalPromptStatus:e.approvalPromptStatus}:{},...e.approvalPromptTransport!==void 0?{approvalPromptTransport:e.approvalPromptTransport}:{},...e.approvalPromptMessageKind!==void 0?{approvalPromptMessageKind:e.approvalPromptMessageKind}:{},...e.approvalPromptLastAttemptAt!==void 0?{approvalPromptLastAttemptAt:e.approvalPromptLastAttemptAt}:{},...e.approvalPromptDeliveredAt!==void 0?{approvalPromptDeliveredAt:e.approvalPromptDeliveredAt}:{},...e.approvalPromptFailedAt!==void 0?{approvalPromptFailedAt:e.approvalPromptFailedAt}:{}}),this.approvalRationale=e.approvalRationale}get status(){return this._status}get harnessName(){return this.harness.name}get backendKind(){return this.harness.backendKind}get backendCapabilities(){return this.harness.capabilities}get backendConversationId(){return $(this)}get waitingForInputFired(){return this.turnRuntime.waitingForInputFired}set waitingForInputFired(e){this.turnRuntime.waitingForInputFired=e}get lastTurnHadQuestion(){return this.turnRuntime.lastTurnHadQuestion}set lastTurnHadQuestion(e){this.turnRuntime.lastTurnHadQuestion=e}get turnInProgress(){return this.turnRuntime.turnInProgress}set turnInProgress(e){this.turnRuntime.turnInProgress=e}get currentTurnText(){return this.turnRuntime.currentTurnText}set currentTurnText(e){this.turnRuntime.currentTurnText=e}get currentTurnPlanArtifact(){return this.turnRuntime.currentTurnPlanArtifact}set currentTurnPlanArtifact(e){this.turnRuntime.currentTurnPlanArtifact=e}get duration(){return(this.completedAt??Date.now())-this.startedAt}get phase(){return this.lifecycle}get isExplicitlyResumable(){return this.status!=="running"&&this.status!=="completed"&&this.killReason!=="done"&&!!this.backendConversationId}transition(e){if(!Jm[this._status].includes(e))throw new Error(`Session state error: cannot transition from ${this._status} to ${e}. This is an internal error \u2014 please report it.`);let r=this._status;this._status=e,this.applyControlEvent({type:"status.transition",status:e}),this.emit("statusChange",this,e,r)}setTimer(e,r,n){this.timers.set(e,r,n)}clearTimer(e){this.timers.clear(e)}clearAllTimers(){this.timers.clearAll()}markPendingPlanApproval(e){let r=this.latestPlanArtifactVersion;this.approvalRationale=void 0,this.applyControlEvent({type:"plan.requested",context:e});let n=this.actionablePlanDecisionVersion??this.planDecisionVersion;this.currentTurnPlanArtifact&&n>0?(this.latestPlanArtifact=this.currentTurnPlanArtifact,this.latestPlanArtifactVersion=n):r!==n&&(this.latestPlanArtifact=void 0,this.latestPlanArtifactVersion=void 0)}clearPendingPlanApproval(){this.applyControlEvent({type:"plan.cleared"})}markAwaitingUserInput(){this.applyControlEvent({type:"input.requested"})}async start(){try{let e;this.multiTurn?(this.messageStream=new Pi,this.messageStream.push(this.harness.buildUserMessage(this.prompt,"")),e=this.messageStream):e=this.prompt;let r=this.harness.launch({prompt:e,cwd:this.workdir,model:this.model,reasoningEffort:this.reasoningEffort,permissionMode:this.permissionMode,codexApprovalPolicy:this.codexApprovalPolicy,systemPrompt:this.systemPrompt,allowedTools:this.allowedTools,resumeSessionId:this.resumeSessionId,forkSession:this.forkSession,backendRef:this.backendRef,worktreeStrategy:this.worktreeStrategy,originalWorkdir:this.originalWorkdir??this.workdir,abortController:this.abortController,mcpServers:um(),canUseTool:this.canUseTool});this.harnessHandle=r,this.setTimer("startup",KP,()=>{this._status==="starting"&&this.kill("startup-timeout")})}catch(e){let r=e instanceof Error?e.message:String(e);this.transitionToTerminal("failed",{error:r});return}this.consumeMessages(this.harnessHandle.messages).catch(e=>{let r=e instanceof Error?e.message:String(e),n=e instanceof Error?e.stack:void 0;console.error(`[Session ${this.id}] consumeMessages error: ${r}`,n),this.isActive&&this.transitionToTerminal("failed",{error:r})})}async sendMessage(e){if(this._status!=="running")throw new Error(`Session is not running (status: ${this._status})`);this.resetIdleTimer(),this.turnRuntime.beginUserTurn(),this.applyControlEvent({type:"turn.started"});let r=e;if(this.pendingModeSwitch){let n=this.pendingModeSwitch,o=!1,i=!1;if(this.harnessHandle?.setPermissionMode)try{await this.harnessHandle.setPermissionMode(n),this.currentPermissionMode=n,this.applyControlEvent({type:"permission.mode_changed",currentPermissionMode:n}),this.pendingModeSwitch=void 0,i=!0,o=!0}catch(s){throw console.error(`[Session ${this.id}] setPermissionMode(${n}) FAILED: ${Ni(s)}`),this.markPendingPlanApproval(this.planApprovalContext??"plan-mode"),new Error(`Failed to switch permission mode to ${n}: ${Ni(s)}`)}else this.pendingModeSwitch=void 0,i=!0,o=!0,console.warn(`[Session ${this.id}] Cannot call setPermissionMode \u2014 falling back to text prefix only (currentPermissionMode remains ${this.currentPermissionMode})`);i&&(this.clearPendingPlanApproval(),n!=="plan"&&this.applyControlEvent({type:"plan.approved"})),o&&(r=`[SYSTEM: The user has approved your plan. Exit plan mode immediately and implement the changes with full permissions. Do not ask for further confirmation.]
48
48
 
49
49
  ${e}`)}else if((this.pendingPlanApproval||this.approvalState==="changes_requested")&&!this.planModeApproved&&(this.approvalState!=="changes_requested"&&this.applyControlEvent({type:"plan.changes_requested"}),r=`[SYSTEM: The user wants changes to your plan. Revise the plan based on their feedback below, then re-submit your revised plan for approval. Do NOT start implementing yet.]
@@ -55,7 +55,7 @@ ${e}`,this.harnessHandle?.setPermissionMode))try{await this.harnessHandle.setPer
55
55
  `)}function Sf(t,e){let r=t.split(`
56
56
  `),n=[],o=0;for(let i=0;i<r.length;i++){let s=r[i].length+(n.length>0?1:0);if(o+s>e&&n.length>0)break;n.push(r[i]),o+=s}return n.join(`
57
57
  `)}var qP=50,jP=1,GP=new Set(["starting","running","completed","failed","killed"]),HP=5,zP=1440*60*1e3;function QP(t){let e=Number(t);return!Number.isFinite(e)||e<jP?qP:Math.floor(e)}function JP(t){return typeof t=="string"&&GP.has(t)}function YP(t){let e=t.split(`
58
- `);return e.at(-1)===""&&e.pop(),e}function kf(t){return t.backendRef?.conversationId??t.harnessSessionId}function vf(t,e,r){let n=yf(t,"utf-8"),o=YP(n);return e.full?o:o.slice(-r)}function XP(t,e,r){if(t.status!=="starting"&&t.status!=="running")return null;let n=an(t.id);if(!Kd(n))return null;try{return vf(n,e,r)}catch{return null}}function ZP(t){let e=It(t.duration),r=` | Cost: $${t.costUsd.toFixed(4)}`,n=t.phase?` | Phase: ${t.phase}`:"",o=t.lifecycle&&t.lifecycle!==t.phase?` | Lifecycle: ${t.lifecycle}`:"";return[`Session: ${t.name} [${t.id}] | Status: ${t.status.toUpperCase()}${n}${o}${r} | Duration: ${e}`,`${"\u2500".repeat(60)}`].join(`
58
+ `);return e.at(-1)===""&&e.pop(),e}function kf(t){return t.backendRef?.conversationId??t.harnessSessionId}function vf(t,e,r){let n=yf(t,"utf-8"),o=YP(n);return e.full?o:o.slice(-r)}function XP(t,e,r){if(t.status!=="starting"&&t.status!=="running")return null;let n=sn(t.id);if(!Kd(n))return null;try{return vf(n,e,r)}catch{return null}}function ZP(t){let e=It(t.duration),r=` | Cost: $${t.costUsd.toFixed(4)}`,n=t.phase?` | Phase: ${t.phase}`:"",o=t.lifecycle&&t.lifecycle!==t.phase?` | Lifecycle: ${t.lifecycle}`:"";return[`Session: ${t.name} [${t.id}] | Status: ${t.status.toUpperCase()}${n}${o}${r} | Duration: ${e}`,`${"\u2500".repeat(60)}`].join(`
59
59
  `)}function ew(t){return[`Session: ${t.name||t.sessionId||kf(t)||"unknown"} | Status: ${t.status.toUpperCase()} | Cost: $${t.costUsd.toFixed(4)}`,`(retrieved from ${t.outputPath} \u2014 evicted from runtime cache \u2014 showing persisted output)`,`${"\u2500".repeat(60)}`].join(`
60
60
  `)}function tw(t){let e=[];return t.error&&e.push(`Error: ${t.error}`),t.result?.result&&e.push(`Result: ${t.result.result}`),t.result&&e.push(`Result status: ${t.result.subtype}`),e.length>0?`
61
61
  (no output yet)
@@ -72,145 +72,145 @@ Plan file: ${o.planFilePath}
72
72
  ${m}
73
73
  ${l}`}}catch{}return d}function Ui(t,e="all",r,n={}){let o=t.listPersistedSessions()??[],s=rw(t.list("all"),o);if(e!=="all"&&(s=s.filter(a=>a.status===e)),r&&(s=s.filter(a=>a.originChannel===r)),n.full){let a=Date.now()-zP;s=s.filter(d=>(d.startedAt??0)>=a)}else s=s.slice(0,HP);return s.length===0?"No sessions found.":s.map(a=>hf(a)).join(`
74
74
 
75
- `)}function rw(t,e){let r=new Map;for(let n of e){if(!JP(n.status))continue;let o=n.completedAt??Date.now(),i=n.createdAt??o,s=kf(n),a=n.sessionId??`persisted:${s??n.harnessSessionId}`;r.set(a,{id:n.sessionId??s??n.harnessSessionId,name:n.name||n.sessionId||s||n.harnessSessionId,status:n.status,startedAt:n.createdAt??0,completedAt:n.completedAt,duration:Math.max(0,o-i),prompt:n.prompt??"",workdir:n.workdir??"(unknown)",costUsd:n.costUsd??0,multiTurn:!0,phase:n.lifecycle??n.status,lifecycle:n.lifecycle,resumable:n.resumable,harness:n.harness,backendRef:n.backendRef,harnessSessionId:n.harnessSessionId,requestedPermissionMode:n.requestedPermissionMode,currentPermissionMode:n.currentPermissionMode,approvalExecutionState:n.approvalExecutionState,originChannel:n.originChannel,originThreadId:n.originThreadId,worktreePath:n.worktreePath,worktreeBranch:n.worktreeBranch,worktreeStrategy:n.worktreeStrategy,worktreeMerged:n.worktreeMerged,worktreeMergedAt:n.worktreeMergedAt,worktreePrUrl:n.worktreePrUrl})}for(let n of t)r.set(n.id,{id:n.id,name:n.name,status:n.status,startedAt:n.startedAt,completedAt:n.completedAt,duration:n.duration,prompt:n.prompt,workdir:n.originalWorkdir??n.workdir,costUsd:n.costUsd,multiTurn:n.multiTurn,phase:n.phase,lifecycle:n.lifecycle,resumable:n.isExplicitlyResumable,harness:n.harnessName,backendRef:n.backendRef,harnessSessionId:n.harnessSessionId,requestedPermissionMode:n.requestedPermissionMode,currentPermissionMode:n.currentPermissionMode,approvalExecutionState:n.approvalExecutionState,originChannel:n.originChannel,originThreadId:n.originThreadId,worktreePath:n.worktreePath,worktreeBranch:n.worktreeBranch,worktreeStrategy:n.worktreeStrategy,worktreeMerged:void 0,worktreeMergedAt:void 0,worktreePrUrl:void 0});return[...r.values()].sort((n,o)=>(o.startedAt??0)-(n.startedAt??0))}function nw(t){if(!t||typeof t!="object")return"all";let e=t.status;switch(e){case"running":case"completed":case"failed":case"killed":case"all":return e;default:return"all"}}function Pf(t){return{name:"agent_sessions",description:"List coding agent sessions with their status and progress. By default, shows the 5 most recent sessions; set `full` to show all sessions from the last 24 hours.",parameters:p.Object({status:p.Optional(p.Union([p.Literal("all"),p.Literal("running"),p.Literal("completed"),p.Literal("failed"),p.Literal("killed")],{description:'Filter by status (default "all")'})),full:p.Optional(p.Boolean({description:"Show all sessions from the last 24h instead of just the most recent 5"}))}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};let n=nw(r),o=t?.workspaceDir?Vn(t.workspaceDir):void 0,i=!!(r&&typeof r=="object"&&r.full===!0);return{content:[{type:"text",text:Ui(v,n,o,{full:i})}]}}}}Ee();Y();function Ki(t,e,r){let n=t.resolve(e);return n?n.status==="completed"||n.status==="failed"||n.status==="killed"?`Session ${n.name} [${n.id}] is already ${n.status}. No action needed.`:r==="completed"?(n.complete(),`Session ${n.name} [${n.id}] marked as completed.`):(t.kill(n.id),`Session ${n.name} [${n.id}] has been terminated.`):`Error: Session "${e}" not found.`}function ow(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.session!="string"?!1:e.reason===void 0?!0:e.reason==="completed"||e.reason==="killed"}function wf(t){return{name:"agent_kill",description:"Terminate or complete a running coding agent session by name or ID. Use reason='completed' to mark a session as successfully completed instead of killed.",parameters:p.Object({session:p.String({description:"Session name or ID to terminate"}),reason:p.Optional(p.Union([p.Literal("completed"),p.Literal("killed")],{description:"Reason for closing the session. 'completed' marks it as successfully done (sends \u2705 notification). 'killed' (default) terminates it."}))}),async execute(e,r){return v?ow(r)?{content:[{type:"text",text:Ki(v,r.session,r.reason)}]}:{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, reason? }."}]}:{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]}}}}Ee();Y();function iw(t){return!t||typeof t!="object"?!1:typeof t.session=="string"}function Vi(t){return{name:"agent_output",description:"Show recent output from a coding agent session (by name or ID).",parameters:p.Object({session:p.String({description:"Session name or ID to get output from"}),lines:p.Optional(p.Number({description:"Number of recent lines to show (default 50)"})),full:p.Optional(p.Boolean({description:"Show all available output"}))}),async execute(e,r){return v?iw(r)?{content:[{type:"text",text:Bi(v,r.session,{full:r.full,lines:r.lines})}]}:{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, lines?, full? }."}]}:{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]}}}}Ee();Y();Re();ke();var sw=10;function qd(t){return t instanceof Error?t.message:String(t)}function $r(t){return re(t)??t.harnessSessionId??"unknown-session"}function If(t){return t.status!=="running"&&!!t.pendingPlanApproval&&!!$(t)}function ro(t,e,r){let n=e==="completed"?`This session is closed by default. Launch a fresh session, or fork from prior context with agent_launch(resume_session_id='${$r(t)}', fork_session=true, prompt='<new task>').`:e==="legacy_non_resumable"?`Persisted historical backend state is intentionally non-resumable here. Launch fresh, or fork with agent_launch(resume_session_id='${$r(t)}', fork_session=true, prompt='<new task>').`:e==="missing_backend_state"?`No resumable backend state is available. Launch a fresh session, or fork from prior context with agent_launch(resume_session_id='${$r(t)}', fork_session=true, prompt='<new task>').`:`Use agent_respond(session='${$r(t)}', message='<next instruction>') to continue the running session.`,o=r?` ${r}`:"";return{text:`Resume unavailable for session ${t.name} [${$r(t)}] (${e}).${o} ${n}`,isError:!0}}async function xf(t,e,r){try{let n={prompt:e.prompt,sessionIdOverride:Ed(e),workdir:e.workdir,name:e.name,model:e.model,reasoningEffort:e.reasoningEffort,worktreeStrategy:e.worktreeStrategy,multiTurn:!0,originChannel:e.originChannel,originThreadId:e.originThreadId,originAgentId:e.originAgentId,originSessionKey:e.originSessionKey,route:e.route,permissionMode:e.currentPermissionMode,requestedPermissionMode:e.requestedPermissionMode??e.currentPermissionMode,planApproval:e.planApproval,codexApprovalPolicy:e.codexApprovalPolicy,harness:"harnessName"in e?e.harnessName:e.harness},o=await t.spawnAndAwaitRunning(n,{notifyLaunch:!1});return t.notifySession(o,`\u25B6\uFE0F [${o.name}] Relaunched fresh`),{text:`Session ${e.name} was relaunched fresh \u2014 it was killed during startup before the harness initialized. New session: ${o.name} [${o.id}].`}}catch(n){return{text:`Error relaunching session ${e.name} [${$r(e)}]: ${qd(n)}`,isError:!0}}}var aw=`[SYSTEM: The user has approved your plan. Exit plan mode immediately and implement the changes with full permissions. Do not ask for further confirmation.]
75
+ `)}function rw(t,e){let r=new Map;for(let n of e){if(!JP(n.status))continue;let o=n.completedAt??Date.now(),i=n.createdAt??o,s=kf(n),a=n.sessionId??`persisted:${s??n.harnessSessionId}`;r.set(a,{id:n.sessionId??s??n.harnessSessionId,name:n.name||n.sessionId||s||n.harnessSessionId,status:n.status,startedAt:n.createdAt??0,completedAt:n.completedAt,duration:Math.max(0,o-i),prompt:n.prompt??"",workdir:n.workdir??"(unknown)",costUsd:n.costUsd??0,multiTurn:!0,phase:n.lifecycle??n.status,lifecycle:n.lifecycle,resumable:n.resumable,harness:n.harness,backendRef:n.backendRef,harnessSessionId:n.harnessSessionId,requestedPermissionMode:n.requestedPermissionMode,currentPermissionMode:n.currentPermissionMode,approvalExecutionState:n.approvalExecutionState,originChannel:n.originChannel,originThreadId:n.originThreadId,worktreePath:n.worktreePath,worktreeBranch:n.worktreeBranch,worktreeStrategy:n.worktreeStrategy,worktreeMerged:n.worktreeMerged,worktreeMergedAt:n.worktreeMergedAt,worktreePrUrl:n.worktreePrUrl})}for(let n of t)r.set(n.id,{id:n.id,name:n.name,status:n.status,startedAt:n.startedAt,completedAt:n.completedAt,duration:n.duration,prompt:n.prompt,workdir:n.originalWorkdir??n.workdir,costUsd:n.costUsd,multiTurn:n.multiTurn,phase:n.phase,lifecycle:n.lifecycle,resumable:n.isExplicitlyResumable,harness:n.harnessName,backendRef:n.backendRef,harnessSessionId:n.harnessSessionId,requestedPermissionMode:n.requestedPermissionMode,currentPermissionMode:n.currentPermissionMode,approvalExecutionState:n.approvalExecutionState,originChannel:n.originChannel,originThreadId:n.originThreadId,worktreePath:n.worktreePath,worktreeBranch:n.worktreeBranch,worktreeStrategy:n.worktreeStrategy,worktreeMerged:void 0,worktreeMergedAt:void 0,worktreePrUrl:void 0});return[...r.values()].sort((n,o)=>(o.startedAt??0)-(n.startedAt??0))}function nw(t){if(!t||typeof t!="object")return"all";let e=t.status;switch(e){case"running":case"completed":case"failed":case"killed":case"all":return e;default:return"all"}}function Pf(t){return{name:"agent_sessions",description:"List coding agent sessions with their status and progress. By default, shows the 5 most recent sessions; set `full` to show all sessions from the last 24 hours.",parameters:p.Object({status:p.Optional(p.Union([p.Literal("all"),p.Literal("running"),p.Literal("completed"),p.Literal("failed"),p.Literal("killed")],{description:'Filter by status (default "all")'})),full:p.Optional(p.Boolean({description:"Show all sessions from the last 24h instead of just the most recent 5"}))}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};let n=nw(r),o=t?.workspaceDir?Vn(t.workspaceDir):void 0,i=!!(r&&typeof r=="object"&&r.full===!0);return{content:[{type:"text",text:Ui(v,n,o,{full:i})}]}}}}Ee();Y();function Ki(t,e,r){let n=t.resolve(e);return n?n.status==="completed"||n.status==="failed"||n.status==="killed"?`Session ${n.name} [${n.id}] is already ${n.status}. No action needed.`:r==="completed"?(n.complete(),`Session ${n.name} [${n.id}] marked as completed.`):(t.kill(n.id),`Session ${n.name} [${n.id}] has been terminated.`):`Error: Session "${e}" not found.`}function ow(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.session!="string"?!1:e.reason===void 0?!0:e.reason==="completed"||e.reason==="killed"}function wf(t){return{name:"agent_kill",description:"Terminate or complete a running coding agent session by name or ID. Use reason='completed' to mark a session as successfully completed instead of killed.",parameters:p.Object({session:p.String({description:"Session name or ID to terminate"}),reason:p.Optional(p.Union([p.Literal("completed"),p.Literal("killed")],{description:"Reason for closing the session. 'completed' marks it as successfully done (sends \u2705 notification). 'killed' (default) terminates it."}))}),async execute(e,r){return v?ow(r)?{content:[{type:"text",text:Ki(v,r.session,r.reason)}]}:{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, reason? }."}]}:{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]}}}}Ee();Y();function iw(t){return!t||typeof t!="object"?!1:typeof t.session=="string"}function Vi(t){return{name:"agent_output",description:"Show recent output from a coding agent session (by name or ID).",parameters:p.Object({session:p.String({description:"Session name or ID to get output from"}),lines:p.Optional(p.Number({description:"Number of recent lines to show (default 50)"})),full:p.Optional(p.Boolean({description:"Show all available output"}))}),async execute(e,r){return v?iw(r)?{content:[{type:"text",text:Bi(v,r.session,{full:r.full,lines:r.lines})}]}:{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, lines?, full? }."}]}:{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]}}}}Ee();Y();Re();ke();var sw=10;function qd(t){return t instanceof Error?t.message:String(t)}function _r(t){return re(t)??t.harnessSessionId??"unknown-session"}function If(t){return t.status!=="running"&&!!t.pendingPlanApproval&&!!$(t)}function ro(t,e,r){let n=e==="completed"?`This session is closed by default. Launch a fresh session, or fork from prior context with agent_launch(resume_session_id='${_r(t)}', fork_session=true, prompt='<new task>').`:e==="legacy_non_resumable"?`Persisted historical backend state is intentionally non-resumable here. Launch fresh, or fork with agent_launch(resume_session_id='${_r(t)}', fork_session=true, prompt='<new task>').`:e==="missing_backend_state"?`No resumable backend state is available. Launch a fresh session, or fork from prior context with agent_launch(resume_session_id='${_r(t)}', fork_session=true, prompt='<new task>').`:`Use agent_respond(session='${_r(t)}', message='<next instruction>') to continue the running session.`,o=r?` ${r}`:"";return{text:`Resume unavailable for session ${t.name} [${_r(t)}] (${e}).${o} ${n}`,isError:!0}}async function xf(t,e,r){try{let n={prompt:e.prompt,sessionIdOverride:Ed(e),workdir:e.workdir,name:e.name,model:e.model,reasoningEffort:e.reasoningEffort,worktreeStrategy:e.worktreeStrategy,multiTurn:!0,originChannel:e.originChannel,originThreadId:e.originThreadId,originAgentId:e.originAgentId,originSessionKey:e.originSessionKey,route:e.route,permissionMode:e.currentPermissionMode,requestedPermissionMode:e.requestedPermissionMode??e.currentPermissionMode,planApproval:e.planApproval,codexApprovalPolicy:e.codexApprovalPolicy,harness:"harnessName"in e?e.harnessName:e.harness},o=await t.spawnAndAwaitRunning(n,{notifyLaunch:!1});return t.notifySession(o,`\u25B6\uFE0F [${o.name}] Relaunched fresh`),{text:`Session ${e.name} was relaunched fresh \u2014 it was killed during startup before the harness initialized. New session: ${o.name} [${o.id}].`}}catch(n){return{text:`Error relaunching session ${e.name} [${_r(e)}]: ${qd(n)}`,isError:!0}}}var aw=`[SYSTEM: The user has approved your plan. Exit plan mode immediately and implement the changes with full permissions. Do not ask for further confirmation.]
76
76
 
77
- `;function bf(t){let e=t?.replace(/\s+/g," ").trim();if(e)return Fe(e,240)}function Vd(t){if(t.approvalState==="changes_requested"&&!qi(t))return`Plan changes were already requested for session ${t.name}. Wait for the revised plan before approving.`;if(t.approvalState==="rejected")return`Plan for session ${t.name} was already rejected.`}function qi(t){return t.pendingPlanApproval?(t.approvalState==="changes_requested"?t.actionablePlanDecisionVersion:t.actionablePlanDecisionVersion??t.planDecisionVersion)>0:!1}function dw(t){return Vd(t)?!1:qi(t)||t.currentPermissionMode==="plan"}async function lw(t,e,r,n={}){let o=Jn(e);if(!(o.kind==="resume"||If(e)))return;let s=!!(n.approve&&dw(e)),a=s?bf(n.approvalRationale):void 0;try{if(o.kind!=="resume")return o.kind==="relaunch"?xf(t,e,r):ro(e,o.reason);let d={prompt:s?aw+r:r,sessionIdOverride:o.stableSessionId,workdir:e.workdir,name:e.name,model:e.model,reasoningEffort:e.reasoningEffort,resumeSessionId:o.resumeSessionId,multiTurn:!0,originChannel:e.originChannel,originThreadId:e.originThreadId,originAgentId:e.originAgentId,originSessionKey:e.originSessionKey,route:e.route,permissionMode:s?"bypassPermissions":e.currentPermissionMode,requestedPermissionMode:e.requestedPermissionMode??e.currentPermissionMode,planApproval:e.planApproval,codexApprovalPolicy:e.codexApprovalPolicy,pendingPlanApproval:s?!1:e.pendingPlanApproval,planApprovalContext:e.planApprovalContext,planDecisionVersion:e.planDecisionVersion,actionablePlanDecisionVersion:s?void 0:e.actionablePlanDecisionVersion,canonicalPlanPromptVersion:e.canonicalPlanPromptVersion,approvalPromptRequiredVersion:e.approvalPromptRequiredVersion,approvalPromptVersion:e.approvalPromptVersion,approvalPromptStatus:e.approvalPromptStatus,approvalPromptTransport:e.approvalPromptTransport,approvalPromptMessageKind:e.approvalPromptMessageKind,approvalPromptLastAttemptAt:e.approvalPromptLastAttemptAt,approvalPromptDeliveredAt:e.approvalPromptDeliveredAt,approvalPromptFailedAt:e.approvalPromptFailedAt,...s?{approvalState:"approved",approvalExecutionState:"approved_then_implemented",approvalRationale:a,planModeApproved:!0}:{},harness:"harnessName"in e?e.harnessName:e.harness},l=await t.spawnAndAwaitRunning(d,{notifyLaunch:!1});return s?(t.notifySession(l,`\u{1F44D} [${l.name}] Plan approved (resumed)`,"plan-approved"),{text:`Plan approved for session ${l.name} [${l.id}]. Session resumed in bypassPermissions mode. Use agent_output to see the response.`}):(t.notifySession(l,`\u25B6\uFE0F [${l.name}] Auto-resumed`),{text:`Auto-resumed session ${l.name} [${l.id}]. Use agent_output to see the response.`})}catch(d){return ro(e,"missing_backend_state",`Backend resume failed: ${qd(d)}`)}}async function xt(t,e){let r=t.resolve(e.session),n=r?void 0:t.getPersistedSession(e.session);if(!r&&!n)return{text:`Error: Session "${e.session}" not found.`,isError:!0};let o=r??n,i=o.status==="running"?{kind:"direct"}:Jn(o);if(e.approve){let a=Vd(o);if(a)return{text:a,isError:!0}}if(i.kind==="resume"||If(o)){let a=await lw(t,o,e.message,{approve:e.approve,approvalRationale:e.approvalRationale});if(a)return a}else{if(i.kind==="relaunch")return xf(t,o,e.message);if(i.kind==="unavailable")return ro(o,i.reason)}if(!r)return Qn(n)?ro(n,"completed"):{text:`Error: Session ${n.name} [${$r(n)}] is not running (status: ${n.status}). Cannot send a message to a non-running session.`,isError:!0};if(r.status!=="running")return Qn(r)?ro(r,"completed"):{text:`Error: Session ${r.name} [${r.id}] is not running (status: ${r.status}). Cannot send a message to a non-running session.`,isError:!0};let s=_.maxAutoResponds??sw;if(e.userInitiated)r.resetAutoRespond();else if(r.autoRespondCount>=s)return{text:`\u26A0\uFE0F Auto-respond limit reached (${r.autoRespondCount}/${s}). Ask the user to provide the answer for session ${r.name}. Then call agent_respond with their answer and set userInitiated: true to reset the counter.`};try{if(e.approve){let f=Vd(r);if(f)return{text:f,isError:!0}}if(!e.approve&&r.pendingInputState?.allowsFreeText&&await r.submitPendingInputText?.(e.message)===!0){if(e.userInitiated){let k=Fe(e.message,100);t.notifySession(r,`\u21AA\uFE0F [${r.name}] "${k}"`,"agent-respond")}e.userInitiated||r.incrementAutoRespond();let f=Fe(e.message,80);return{text:[`Pending input answered for session ${r.name} [${r.id}].`,` Message: "${f}"`,"Use agent_output to see the response."].join(`
77
+ `;function bf(t){let e=t?.replace(/\s+/g," ").trim();if(e)return Fe(e,240)}function Vd(t){if(t.approvalState==="changes_requested"&&!qi(t))return`Plan changes were already requested for session ${t.name}. Wait for the revised plan before approving.`;if(t.approvalState==="rejected")return`Plan for session ${t.name} was already rejected.`}function qi(t){return t.pendingPlanApproval?(t.approvalState==="changes_requested"?t.actionablePlanDecisionVersion:t.actionablePlanDecisionVersion??t.planDecisionVersion)>0:!1}function dw(t){return Vd(t)?!1:qi(t)||t.currentPermissionMode==="plan"}async function lw(t,e,r,n={}){let o=Jn(e);if(!(o.kind==="resume"||If(e)))return;let s=!!(n.approve&&dw(e)),a=s?bf(n.approvalRationale):void 0;try{if(o.kind!=="resume")return o.kind==="relaunch"?xf(t,e,r):ro(e,o.reason);let d={prompt:s?aw+r:r,sessionIdOverride:o.stableSessionId,workdir:e.workdir,name:e.name,model:e.model,reasoningEffort:e.reasoningEffort,resumeSessionId:o.resumeSessionId,multiTurn:!0,originChannel:e.originChannel,originThreadId:e.originThreadId,originAgentId:e.originAgentId,originSessionKey:e.originSessionKey,route:e.route,permissionMode:s?"bypassPermissions":e.currentPermissionMode,requestedPermissionMode:e.requestedPermissionMode??e.currentPermissionMode,planApproval:e.planApproval,codexApprovalPolicy:e.codexApprovalPolicy,pendingPlanApproval:s?!1:e.pendingPlanApproval,planApprovalContext:e.planApprovalContext,planDecisionVersion:e.planDecisionVersion,actionablePlanDecisionVersion:s?void 0:e.actionablePlanDecisionVersion,canonicalPlanPromptVersion:e.canonicalPlanPromptVersion,approvalPromptRequiredVersion:e.approvalPromptRequiredVersion,approvalPromptVersion:e.approvalPromptVersion,approvalPromptStatus:e.approvalPromptStatus,approvalPromptTransport:e.approvalPromptTransport,approvalPromptMessageKind:e.approvalPromptMessageKind,approvalPromptLastAttemptAt:e.approvalPromptLastAttemptAt,approvalPromptDeliveredAt:e.approvalPromptDeliveredAt,approvalPromptFailedAt:e.approvalPromptFailedAt,...s?{approvalState:"approved",approvalExecutionState:"approved_then_implemented",approvalRationale:a,planModeApproved:!0}:{},harness:"harnessName"in e?e.harnessName:e.harness},l=await t.spawnAndAwaitRunning(d,{notifyLaunch:!1});return s?(t.notifySession(l,`\u{1F44D} [${l.name}] Plan approved (resumed)`,"plan-approved"),{text:`Plan approved for session ${l.name} [${l.id}]. Session resumed in bypassPermissions mode. Use agent_output to see the response.`}):(t.notifySession(l,`\u25B6\uFE0F [${l.name}] Auto-resumed`),{text:`Auto-resumed session ${l.name} [${l.id}]. Use agent_output to see the response.`})}catch(d){return ro(e,"missing_backend_state",`Backend resume failed: ${qd(d)}`)}}async function xt(t,e){let r=t.resolve(e.session),n=r?void 0:t.getPersistedSession(e.session);if(!r&&!n)return{text:`Error: Session "${e.session}" not found.`,isError:!0};let o=r??n,i=o.status==="running"?{kind:"direct"}:Jn(o);if(e.approve){let a=Vd(o);if(a)return{text:a,isError:!0}}if(i.kind==="resume"||If(o)){let a=await lw(t,o,e.message,{approve:e.approve,approvalRationale:e.approvalRationale});if(a)return a}else{if(i.kind==="relaunch")return xf(t,o,e.message);if(i.kind==="unavailable")return ro(o,i.reason)}if(!r)return Qn(n)?ro(n,"completed"):{text:`Error: Session ${n.name} [${_r(n)}] is not running (status: ${n.status}). Cannot send a message to a non-running session.`,isError:!0};if(r.status!=="running")return Qn(r)?ro(r,"completed"):{text:`Error: Session ${r.name} [${r.id}] is not running (status: ${r.status}). Cannot send a message to a non-running session.`,isError:!0};let s=_.maxAutoResponds??sw;if(e.userInitiated)r.resetAutoRespond();else if(r.autoRespondCount>=s)return{text:`\u26A0\uFE0F Auto-respond limit reached (${r.autoRespondCount}/${s}). Ask the user to provide the answer for session ${r.name}. Then call agent_respond with their answer and set userInitiated: true to reset the counter.`};try{if(e.approve){let f=Vd(r);if(f)return{text:f,isError:!0}}if(!e.approve&&r.pendingInputState?.allowsFreeText&&await r.submitPendingInputText?.(e.message)===!0){if(e.userInitiated){let k=Fe(e.message,100);t.notifySession(r,`\u21AA\uFE0F [${r.name}] "${k}"`,"agent-respond")}e.userInitiated||r.incrementAutoRespond();let f=Fe(e.message,80);return{text:[`Pending input answered for session ${r.name} [${r.id}].`,` Message: "${f}"`,"Use agent_output to see the response."].join(`
78
78
  `)}}let d=!1;e.interrupt&&(d=await r.interrupt());let l=!!(e.approve&&qi(r)),m=l?bf(e.approvalRationale):void 0,g="";if(e.approve&&qi(r)?(r.switchPermissionMode("bypassPermissions"),r.approvalRationale=m):e.approve&&r.currentPermissionMode==="default"?r.switchPermissionMode("bypassPermissions"):e.approve&&r.currentPermissionMode==="bypassPermissions"?g=`
79
79
  \u2139\uFE0F approve=true was set but session is already in bypassPermissions mode.`:e.approve?g=`
80
80
  \u26A0\uFE0F approve=true was set but session has no pending plan approval.`:(r.pendingPlanApproval||r.approvalState==="changes_requested")&&(g=`
81
81
  \u2139\uFE0F Session has a pending plan \u2014 sending as revision feedback. The agent will revise and re-submit. Set approve=true to approve instead.`),await r.sendMessage(e.message),l)t.notifySession(r,`\u{1F44D} [${r.name}] Plan approved`,"plan-approved");else if(e.userInitiated){let f=Fe(e.message,100);t.notifySession(r,`\u21AA\uFE0F [${r.name}] "${f}"`,"agent-respond")}e.userInitiated||r.incrementAutoRespond();let y=Fe(e.message,80);return l?{text:`Plan approved for session ${r.name} [${r.id}]. Use agent_output to see the response.`}:{text:[`Message sent to session ${r.name} [${r.id}].`,d?" (redirected active turn first)":e.interrupt?" (no active turn to interrupt)":"",` Message: "${y}"`,g,"Use agent_output to see the response."].filter(Boolean).join(`
82
- `)}}catch(a){return{text:`Error sending message to session ${r.name} [${r.id}]: ${qd(a)}`,isError:!0}}}function uw(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.session=="string"&&typeof e.message=="string"&&(e.approval_rationale===void 0||typeof e.approval_rationale=="string")}function Af(t){return{name:"agent_respond",description:"Send a follow-up message to a running coding agent session. The session must be running. All sessions are multi-turn.",parameters:p.Object({session:p.String({description:"Session name or ID to respond to"}),message:p.String({description:"The message to send to the session"}),interrupt:p.Optional(p.Boolean({description:"If true, interrupt the current turn before sending the message. Useful to redirect the session mid-response."})),userInitiated:p.Optional(p.Boolean({description:"Set to true when the message comes from the user (not auto-generated). Resets the auto-respond counter and bypasses the auto-respond limit."})),approve:p.Optional(p.Boolean({description:"Set to true to escalate session permissions to bypassPermissions. Works in two scenarios: (1) approve a pending plan in plan mode, or (2) escalate a default-mode session to skip remaining OpenClaw approval checkpoints. No-op if already in bypassPermissions mode. In plan mode without a pending plan, this flag is ignored."})),approval_rationale:p.Optional(p.String({description:"Optional structured rationale for a direct delegated plan approval. Use this instead of embedding the rationale in message text when approve=true for a pending plan."}))}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!uw(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, message, interrupt?, userInitiated?, approve?, approval_rationale? }."}]};let n=await xt(v,{session:r.session,message:r.message,interrupt:r.interrupt,userInitiated:r.userInitiated,approve:r.approve,approvalRationale:r.approval_rationale});return{isError:n.isError??!1,content:[{type:"text",text:n.text}]}}}}Ee();Y();function pw(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.session=="string"&&typeof e.summary=="string"}function Rf(t){return{name:"agent_request_plan_approval",description:"Send a plan-approval decision prompt to the user for a session that is already waiting on plan approval. Reuses the plugin's Approve/Revise/Reject buttons so the user can decide directly from the message.",parameters:p.Object({session:p.String({description:"Session name or ID awaiting plan approval"}),summary:p.String({description:"Concise user-facing summary of scope, risk, and any concerns that should accompany the approval buttons"})}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!pw(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, summary }."}]};let n=v.requestPlanApprovalFromUser(r.session,r.summary);return{isError:n.startsWith("Error:"),content:[{type:"text",text:n}]}}}}Ee();Y();Re();function cw(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.report_id=="string"&&typeof e.report_text=="string"&&typeof e.plan_prompt=="string"&&typeof e.plan_workdir=="string"&&(e.plan_name==null||typeof e.plan_name=="string")&&(e.target_channel==null||typeof e.target_channel=="string")&&(e.target_thread_id==null||typeof e.target_thread_id=="string"||typeof e.target_thread_id=="number")&&(e.target_session_key==null||typeof e.target_session_key=="string")}function mw(t,e){let r=Et(t,e.target_channel,e.target_session_key);if(r)return e.target_thread_id!=null&&(r.threadId=String(e.target_thread_id)),r}function Tf(t){return{name:"agent_send_monitor_report",description:"Post a monitor report to the current or explicit chat route with human-gated inline buttons. Use this for release reports that should offer a Start Plan action directly in Telegram.",parameters:p.Object({report_id:p.String({description:"Stable report identifier, for example 'openclaw-release-v2026.3.31'."}),report_text:p.String({description:"Final user-facing report text to deliver."}),plan_prompt:p.String({description:"Prompt to seed into the plan-only session when the user clicks Start Plan."}),plan_workdir:p.String({description:"Working directory for the planning session."}),plan_name:p.Optional(p.String({description:"Optional explicit session name for the planning session."})),target_channel:p.Optional(p.String({description:"Optional explicit route like 'telegram|-1003863755361'."})),target_thread_id:p.Optional(p.Union([p.String(),p.Number()],{description:"Optional explicit topic/thread id."})),target_session_key:p.Optional(p.String({description:"Optional explicit session key for wake routing."}))}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!cw(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { report_id, report_text, plan_prompt, plan_workdir }."}]};let n=mw(t,r);return!n?.provider||!n.target?{content:[{type:"text",text:"Error: Could not resolve a direct delivery route for the monitor report."}]}:(v.sendMonitorReport({reportId:r.report_id,route:n,text:r.report_text,planName:r.plan_name??r.report_id,planPrompt:r.plan_prompt,planWorkdir:r.plan_workdir}),{content:[{type:"text",text:`Interactive monitor report queued for ${n.provider}|${n.target}${n.threadId?`#${n.threadId}`:""}.`}]})}}}Ee();Y();function Mf(t){return{name:"agent_stats",description:"Show OpenClaw Code Agent usage metrics: session counts by status, average duration, and notable sessions.",parameters:p.Object({}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};let n=v.getMetrics(),o=v.list("running").length;return{content:[{type:"text",text:Li(n,o)}]}}}}Ee();Re();Y();ut();no();import{existsSync as jd}from"fs";function gw(t){return!t||typeof t!="object"?!1:typeof t.session=="string"}function Qi(t){return{name:"agent_merge",description:"Merge a worktree branch back to the base branch. Resolves session (active or persisted), gets worktree path, and performs the merge. On conflict, spawns a conflict-resolver session using the configured default harness.",parameters:p.Object({session:p.String({description:"Session name or ID to merge"}),base_branch:p.Optional(p.String({description:"Base branch to merge into (default: main)"})),strategy:p.Optional(p.Union([p.Literal("merge"),p.Literal("squash")],{description:"Merge strategy: 'merge' (default, fast-forward if possible; merge commit if branches have diverged) or 'squash' (squashes all commits into one)"})),push:p.Optional(p.Boolean({description:"Push the base branch after successful merge (default: false)"})),delete_branch:p.Optional(p.Boolean({description:"Delete the worktree branch after successful merge (default: true)"}))}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!gw(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, base_branch?, strategy?, push?, delete_branch? }."}]};let n=ln(v,r.session),o=n.activeSession,i=n.persistedSession;if(!o&&!i)return{content:[{type:"text",text:`Error: Session "${r.session}" not found.`}]};let{worktreePath:s,originalWorkdir:a,branchName:d}=n;if(!s||!a)return{content:[{type:"text",text:`Error: Session "${r.session}" does not have a worktree.`}]};if(!d)return{content:[{type:"text",text:`Error: Cannot determine branch name for worktree at ${s}. The worktree may have been removed and no persisted branch name is available.`}]};jd(s)||console.info(`[agent_merge] Worktree directory ${s} no longer exists; proceeding with merge via originalWorkdir (${a})`);let l=a;if(!jd(a))return{content:[{type:"text",text:`Error: originalWorkdir "${a}" does not exist.`}]};let m=r.base_branch??ar(l),g=m,y=r.strategy??"merge",f=r.push===!0,k=r.delete_branch!==!1;if(i?.worktreeLifecycle?.state==="merged"||i?.worktreeMerged)return{content:[{type:"text",text:`\u2139\uFE0F Session "${r.session}" is already merged.`}]};let A={content:[{type:"text",text:"\u274C Merge did not run (internal error)"}]},b=n.persistedRef;return await v.enqueueMerge(l,async()=>{let w=v.getPersistedSession(r.session);if(w?.worktreeLifecycle?.state==="merged"||w?.worktreeMerged){A={content:[{type:"text",text:`\u2139\uFE0F Session "${r.session}" was already merged while waiting in queue.`}]};return}let C=Cr(l,d,m),I=Ei(l,d,g,y,s);if(I.success){if(f&&!$i(l,g)){A={content:[{type:"text",text:`\u26A0\uFE0F Merged ${d} \u2192 ${g} locally, but failed to push ${g}`}]};return}k&&Ot(l,d);let R=!1;if(jd(s)&&(R=tt(l,s),_i(l)),w)for(let N of Cf({...n,persistedSession:w}))v.updatePersistedSession(N,{worktreeMerged:!0,worktreeMergedAt:new Date().toISOString(),pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeDisposition:"merged",worktreeLifecycle:{state:"merged",updatedAt:new Date().toISOString(),resolvedAt:new Date().toISOString(),resolutionSource:"agent_merge",baseBranch:m,targetRepo:w.worktreePrTargetRepo,pushRemote:w.worktreePushRemote}});let O=_r({kind:"merge",branch:d,base:m,filesChanged:C?.filesChanged,insertions:C?.insertions,deletions:C?.deletions});v.notifyWorktreeOutcome(n.notificationTarget,O);let D=`\u2705 ${I.fastForward?"\u26A1 Fast-forward":"\u{1F500} Merge commit"}: ${d} \u2192 ${g}.${f?" Pushed.":""}${k?R?" Branch and worktree cleaned up.":" Branch deleted; worktree cleanup skipped.":""}`;I.stashPopConflict?D+=`
82
+ `)}}catch(a){return{text:`Error sending message to session ${r.name} [${r.id}]: ${qd(a)}`,isError:!0}}}function uw(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.session=="string"&&typeof e.message=="string"&&(e.approval_rationale===void 0||typeof e.approval_rationale=="string")}function Af(t){return{name:"agent_respond",description:"Send a follow-up message to a running coding agent session. The session must be running. All sessions are multi-turn.",parameters:p.Object({session:p.String({description:"Session name or ID to respond to"}),message:p.String({description:"The message to send to the session"}),interrupt:p.Optional(p.Boolean({description:"If true, interrupt the current turn before sending the message. Useful to redirect the session mid-response."})),userInitiated:p.Optional(p.Boolean({description:"Set to true when the message comes from the user (not auto-generated). Resets the auto-respond counter and bypasses the auto-respond limit."})),approve:p.Optional(p.Boolean({description:"Set to true to escalate session permissions to bypassPermissions. Works in two scenarios: (1) approve a pending plan in plan mode, or (2) escalate a default-mode session to skip remaining OpenClaw approval checkpoints. No-op if already in bypassPermissions mode. In plan mode without a pending plan, this flag is ignored."})),approval_rationale:p.Optional(p.String({description:"Optional structured rationale for a direct delegated plan approval. Use this instead of embedding the rationale in message text when approve=true for a pending plan."}))}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!uw(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, message, interrupt?, userInitiated?, approve?, approval_rationale? }."}]};let n=await xt(v,{session:r.session,message:r.message,interrupt:r.interrupt,userInitiated:r.userInitiated,approve:r.approve,approvalRationale:r.approval_rationale});return{isError:n.isError??!1,content:[{type:"text",text:n.text}]}}}}Ee();Y();function pw(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.session=="string"&&typeof e.summary=="string"}function Rf(t){return{name:"agent_request_plan_approval",description:"Send a plan-approval decision prompt to the user for a session that is already waiting on plan approval. Reuses the plugin's Approve/Revise/Reject buttons so the user can decide directly from the message.",parameters:p.Object({session:p.String({description:"Session name or ID awaiting plan approval"}),summary:p.String({description:"Concise user-facing summary of scope, risk, and any concerns that should accompany the approval buttons"})}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!pw(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, summary }."}]};let n=v.requestPlanApprovalFromUser(r.session,r.summary);return{isError:n.startsWith("Error:"),content:[{type:"text",text:n}]}}}}Ee();Y();Re();function cw(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.report_id=="string"&&typeof e.report_text=="string"&&typeof e.plan_prompt=="string"&&typeof e.plan_workdir=="string"&&(e.plan_name==null||typeof e.plan_name=="string")&&(e.target_channel==null||typeof e.target_channel=="string")&&(e.target_thread_id==null||typeof e.target_thread_id=="string"||typeof e.target_thread_id=="number")&&(e.target_session_key==null||typeof e.target_session_key=="string")}function mw(t,e){let r=Et(t,e.target_channel,e.target_session_key);if(r)return e.target_thread_id!=null&&(r.threadId=String(e.target_thread_id)),r}function Tf(t){return{name:"agent_send_monitor_report",description:"Post a monitor report to the current or explicit chat route with human-gated inline buttons. Use this for release reports that should offer a Start Plan action directly in Telegram.",parameters:p.Object({report_id:p.String({description:"Stable report identifier, for example 'openclaw-release-v2026.3.31'."}),report_text:p.String({description:"Final user-facing report text to deliver."}),plan_prompt:p.String({description:"Prompt to seed into the plan-only session when the user clicks Start Plan."}),plan_workdir:p.String({description:"Working directory for the planning session."}),plan_name:p.Optional(p.String({description:"Optional explicit session name for the planning session."})),target_channel:p.Optional(p.String({description:"Optional explicit route like 'telegram|-1003863755361'."})),target_thread_id:p.Optional(p.Union([p.String(),p.Number()],{description:"Optional explicit topic/thread id."})),target_session_key:p.Optional(p.String({description:"Optional explicit session key for wake routing."}))}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!cw(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { report_id, report_text, plan_prompt, plan_workdir }."}]};let n=mw(t,r);return!n?.provider||!n.target?{content:[{type:"text",text:"Error: Could not resolve a direct delivery route for the monitor report."}]}:(v.sendMonitorReport({reportId:r.report_id,route:n,text:r.report_text,planName:r.plan_name??r.report_id,planPrompt:r.plan_prompt,planWorkdir:r.plan_workdir}),{content:[{type:"text",text:`Interactive monitor report queued for ${n.provider}|${n.target}${n.threadId?`#${n.threadId}`:""}.`}]})}}}Ee();Y();function Mf(t){return{name:"agent_stats",description:"Show OpenClaw Code Agent usage metrics: session counts by status, average duration, and notable sessions.",parameters:p.Object({}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};let n=v.getMetrics(),o=v.list("running").length;return{content:[{type:"text",text:Li(n,o)}]}}}}Ee();Re();Y();ut();no();import{existsSync as jd}from"fs";function gw(t){return!t||typeof t!="object"?!1:typeof t.session=="string"}function Qi(t){return{name:"agent_merge",description:"Merge a worktree branch back to the base branch. Resolves session (active or persisted), gets worktree path, and performs the merge. On conflict, spawns a conflict-resolver session using the configured default harness.",parameters:p.Object({session:p.String({description:"Session name or ID to merge"}),base_branch:p.Optional(p.String({description:"Base branch to merge into (default: main)"})),strategy:p.Optional(p.Union([p.Literal("merge"),p.Literal("squash")],{description:"Merge strategy: 'merge' (default, fast-forward if possible; merge commit if branches have diverged) or 'squash' (squashes all commits into one)"})),push:p.Optional(p.Boolean({description:"Push the base branch after successful merge (default: false)"})),delete_branch:p.Optional(p.Boolean({description:"Delete the worktree branch after successful merge (default: true)"}))}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!gw(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, base_branch?, strategy?, push?, delete_branch? }."}]};let n=dn(v,r.session),o=n.activeSession,i=n.persistedSession;if(!o&&!i)return{content:[{type:"text",text:`Error: Session "${r.session}" not found.`}]};let{worktreePath:s,originalWorkdir:a,branchName:d}=n;if(!s||!a)return{content:[{type:"text",text:`Error: Session "${r.session}" does not have a worktree.`}]};if(!d)return{content:[{type:"text",text:`Error: Cannot determine branch name for worktree at ${s}. The worktree may have been removed and no persisted branch name is available.`}]};jd(s)||console.info(`[agent_merge] Worktree directory ${s} no longer exists; proceeding with merge via originalWorkdir (${a})`);let l=a;if(!jd(a))return{content:[{type:"text",text:`Error: originalWorkdir "${a}" does not exist.`}]};let m=r.base_branch??ar(l),g=m,y=r.strategy??"merge",f=r.push===!0,k=r.delete_branch!==!1;if(i?.worktreeLifecycle?.state==="merged"||i?.worktreeMerged)return{content:[{type:"text",text:`\u2139\uFE0F Session "${r.session}" is already merged.`}]};let A={content:[{type:"text",text:"\u274C Merge did not run (internal error)"}]},b=n.persistedRef;return await v.enqueueMerge(l,async()=>{let w=v.getPersistedSession(r.session);if(w?.worktreeLifecycle?.state==="merged"||w?.worktreeMerged){A={content:[{type:"text",text:`\u2139\uFE0F Session "${r.session}" was already merged while waiting in queue.`}]};return}let C=Mr(l,d,m),I=Ei(l,d,g,y,s);if(I.success){if(f&&!$i(l,g)){A={content:[{type:"text",text:`\u26A0\uFE0F Merged ${d} \u2192 ${g} locally, but failed to push ${g}`}]};return}k&&Ot(l,d);let R=!1;if(jd(s)&&(R=tt(l,s),_i(l)),w)for(let N of Cf({...n,persistedSession:w}))v.updatePersistedSession(N,{worktreeMerged:!0,worktreeMergedAt:new Date().toISOString(),pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeDisposition:"merged",worktreeLifecycle:{state:"merged",updatedAt:new Date().toISOString(),resolvedAt:new Date().toISOString(),resolutionSource:"agent_merge",baseBranch:m,targetRepo:w.worktreePrTargetRepo,pushRemote:w.worktreePushRemote}});let O=Cr({kind:"merge",branch:d,base:m,filesChanged:C?.filesChanged,insertions:C?.insertions,deletions:C?.deletions});v.notifyWorktreeOutcome(n.notificationTarget,O);let D=`\u2705 ${I.fastForward?"\u26A1 Fast-forward":"\u{1F500} Merge commit"}: ${d} \u2192 ${g}.${f?" Pushed.":""}${k?R?" Branch and worktree cleaned up.":" Branch deleted; worktree cleanup skipped.":""}`;I.stashPopConflict?D+=`
83
83
  \u26A0\uFE0F Pre-merge stash pop conflicted \u2014 run \`git stash show ${I.stashRef??"stash@{0}"}\` in ${l} to review stashed changes.`:I.stashed&&(D+=`
84
84
  (Pre-existing changes on ${g} were auto-stashed and restored.)`),A={content:[{type:"text",text:D}]}}else if(I.rebaseConflict)A={content:[{type:"text",text:`\u26A0\uFE0F Rebase conflicts \u2014 manual resolution required:
85
85
 
86
86
  ${I.error}`}]};else if(I.conflictFiles&&I.conflictFiles.length>0){let R=["Resolve merge conflicts in the following files and commit the resolution:","",...I.conflictFiles.map(O=>`- ${O}`),"",`After resolving, commit with message: "Resolve merge conflicts from ${d}"`].join(`
87
- `);try{let O=v.spawn({prompt:R,workdir:l,name:`${r.session}-conflict-resolver`,harness:Pe(),permissionMode:"bypassPermissions",multiTurn:!0,route:o?.route??i?.route,originChannel:o?.originChannel??i?.originChannel,originThreadId:o?.originThreadId??i?.originThreadId,originAgentId:o?.originAgentId??i?.originAgentId,originSessionKey:o?.originSessionKey??i?.originSessionKey});A={content:[{type:"text",text:`\u26A0\uFE0F Merge conflicts in ${I.conflictFiles.length} file(s) \u2014 spawned conflict resolver session: ${O.name}`}]}}catch(O){A={content:[{type:"text",text:`\u274C Merge conflicts detected, but failed to spawn resolver: ${O instanceof Error?O.message:String(O)}`}]}}}else A={content:[{type:"text",text:I.dirtyError?`\u274C Merge blocked: ${I.error}`:`\u274C Merge failed: ${I.error??"unknown error"}`}]}}),A}}}Ji();Ee();Y();ke();ut();no();function yw(t){return!!t&&typeof t=="object"}function $f(t){return{name:"agent_worktree_cleanup",description:"Manage worktree cleanup with lifecycle-aware safety rules. Use preview_safe to list what Clean all safe would remove, clean_safe to execute it, or preview_all to see both safe and retained sandboxes with kept reasons.",parameters:p.Object({workdir:p.Optional(p.String({description:"Restrict cleanup to sessions rooted in this repository"})),base_branch:p.Optional(p.String({description:"Override base branch for lifecycle resolution"})),mode:p.Optional(p.Union([p.Literal("preview_safe"),p.Literal("clean_safe"),p.Literal("preview_all")],{description:"Cleanup mode. preview_safe shows what Clean all safe would remove, clean_safe performs that cleanup, preview_all shows both safe and retained worktrees. Defaults to preview_safe when dry_run=true, otherwise clean_safe."})),skip_session_check:p.Optional(p.Boolean({description:"Deprecated. Safe cleanup never removes live sessions."})),force:p.Optional(p.Boolean({description:"Deprecated alias for skip_session_check."})),dry_run:p.Optional(p.Boolean({description:"Show what would be cleaned without deleting anything."})),session:p.Optional(p.String({description:"Session name or ID to clean or dismiss."})),dismiss_session:p.Optional(p.Boolean({description:"When true and session is provided, permanently dismiss the worktree."}))}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!yw(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { workdir?, base_branch?, mode?, dry_run?, session?, dismiss_session? }."}]};let n=r.session,o=r.mode??(r.dry_run===!0?"preview_safe":"clean_safe"),i=o!=="clean_safe",s=o==="preview_all"||o==="clean_safe";if(n&&r.dismiss_session===!0)return{content:[{type:"text",text:await v.dismissWorktree(n)}]};let a=Gi(v);if(n&&(a=a.filter(f=>Hi(f,n)),a.length===0)){let f=ln(v,n);if(!f.persistedSession&&!f.activeSession)return{content:[{type:"text",text:`Error: Session "${n}" not found.`}]}}if(r.workdir&&(a=a.filter(f=>f.workdir===r.workdir)),a.length===0)return{content:[{type:"text",text:"No managed worktrees matched the requested scope."}]};let d=[],l=[],m=[],g=[];for(let f of a){let{persistedSession:k,activeSession:A,resolvedLifecycle:b}=ji(v,f,{baseBranch:r.base_branch});if(!b.cleanupSafe){if(s){let w=b.reasons.length>0?b.reasons.map(zi).join(", "):Er(b.derivedState);l.push(`${f.name} [kept: ${w}]`)}continue}if(d.push(`${f.name} (${Er(b.derivedState)})`),!i)try{let w=f.workdir;if(!((k??A)&&Ne(k??A))&&f.worktreePath&&tt(w,f.worktreePath,{destructive:!1}),f.worktreeBranch&&Ot(w,f.worktreeBranch),k){let I=b.derivedState==="merged"||b.derivedState==="released"?b.derivedState:b.lifecycle.state;v.updatePersistedSession(f.id,{worktreePath:void 0,worktreeBranch:void 0,worktreeState:"none",worktreeMerged:I==="merged"?!0:k.worktreeMerged,worktreeMergedAt:I==="merged"?k.worktreeMergedAt??new Date().toISOString():k.worktreeMergedAt,worktreeLifecycle:{...k.worktreeLifecycle??b.lifecycle,state:I,updatedAt:new Date().toISOString(),resolvedAt:k.worktreeLifecycle?.resolvedAt??new Date().toISOString(),resolutionSource:k.worktreeLifecycle?.resolutionSource??"maintenance",baseBranch:r.base_branch??b.lifecycle.baseBranch??k.worktreeBaseBranch,targetRepo:k.worktreePrTargetRepo,pushRemote:k.worktreePushRemote,notes:b.reasons}})}m.push(`${f.name} (${Er(b.derivedState)})`)}catch(w){g.push(`${f.name}: ${w instanceof Error?w.message:String(w)}`)}}let y=[o==="clean_safe"?"Clean all safe:":o==="preview_all"?"Worktree lifecycle review:":"Clean all safe preview:"];return y.push(` SAFE ${i?"NOW":"FOUND"} (${d.length}): ${d.join(", ")||"(none)"}`),s&&y.push(` KEPT (${l.length}): ${l.join(", ")||"(none)"}`),i||(y.push(` CLEANED (${m.length}): ${m.join(", ")||"(none)"}`),y.push(` FAILURES (${g.length}): ${g.join(", ")||"(none)"}`)),{content:[{type:"text",text:y.join(`
88
- `)}]}}}}Ee();Y();no();function kw(t){return!0}function Ef(t){return{name:"agent_worktree_status",description:"Show lifecycle-first worktree status for coding agent sessions. Displays product-facing lifecycle state, released handling, cleanup safety, and retained reasons.",parameters:p.Object({session:p.Optional(p.String({description:"Session name or ID to show status for (optional, shows all if omitted)"}))}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!kw(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session? }."}]};let n=r.session,o=Gi(v);if(n&&(o=o.filter(s=>Hi(s,n)),o.length===0))return{content:[{type:"text",text:`Error: Session "${n}" not found or has no worktree.`}]};if(o.length===0)return{content:[{type:"text",text:"No sessions with worktrees found."}]};let i=[];for(let s of o){let{persistedSession:a,resolvedLifecycle:d}=ji(v,s),l=d.cleanupSafe?"safe now":d.preserve?"preserve":"blocked";i.push(`Session: ${s.name} [${s.id}]`),i.push(` Branch: ${s.worktreeBranch??"(unknown)"} \u2192 ${d.lifecycle.baseBranch??a?.worktreeBaseBranch??"main"}`),i.push(` Repo: ${s.workdir}`),i.push(` Lifecycle:${Er(d.lifecycle.state)}`),d.derivedState!==d.lifecycle.state&&i.push(` Derived: ${Er(d.derivedState)}`),i.push(` Cleanup: ${l}`),d.evidence.prUrl&&i.push(` PR: ${d.evidence.prUrl} (${d.evidence.prState??"unknown"})`),(d.evidence.branchAheadCount!=null||d.evidence.baseAheadCount!=null)&&i.push(` Ahead: ${d.evidence.branchAheadCount??0} ahead / ${d.evidence.baseAheadCount??0} behind`),i.push(` Reasons: ${d.reasons.length>0?d.reasons.map(zi).join(", "):"none"}`),i.push("")}return{content:[{type:"text",text:i.join(`
89
- `).trim()}]}}}}Ee();Y();Re();import{existsSync as vw}from"fs";function Yi(t,e){if(!e||e.length===0)return!0;if(!t)return!1;let r=t.toLowerCase();return e.some(n=>r.includes(n.toLowerCase()))}function Pw(t){return!t||typeof t!="object"?!1:typeof t.goal=="string"}function Of(t){return{name:"goal_launch",description:"Launch an explicit goal loop. Use this only when the user specifically asks for a goal task, Ralph-style autonomous loop, iterative loop, autonomous repair loop, or keep-going-until-checks-pass workflow. This is not the default session path.",parameters:p.Object({goal:p.String({description:"End goal for the autonomous task"}),verifier_commands:p.Optional(p.Array(p.String({description:"Shell command that must pass for the goal to be considered complete"}),{minItems:1,description:"Verifier commands run after each coding turn"})),name:p.Optional(p.String({description:"Short task name (kebab-case preferred)"})),workdir:p.Optional(p.String({description:"Working directory (defaults to cwd / configured workspace)"})),model:p.Optional(p.String({description:"Model name to use"})),system_prompt:p.Optional(p.String({description:"Additional system prompt"})),allowed_tools:p.Optional(p.Array(p.String(),{description:"Allowed tools for the underlying agent session"})),max_iterations:p.Optional(p.Number({description:"Maximum verifier-driven repair iterations",minimum:1})),goal_mode:p.Optional(p.Union([p.Literal("ralph"),p.Literal("verifier")],{description:"Loop strategy. 'ralph' repeats until a completion promise appears. 'verifier' repeats until verifier commands pass. Defaults to 'ralph' when no verifiers are provided, otherwise 'verifier'."})),completion_promise:p.Optional(p.String({description:"Exact completion promise for Ralph-mode loops. Defaults to 'DONE'."})),permission_mode:p.Optional(p.Union([p.Literal("default"),p.Literal("plan"),p.Literal("bypassPermissions")],{description:"Permission mode for the underlying agent session. Defaults to bypassPermissions for autonomous goal loops."})),harness:p.Optional(p.String({description:"Agent harness to use (e.g. 'codex' or 'claude-code')."}))}),async execute(e,r){if(!fe)return{content:[{type:"text",text:"Error: GoalController not initialized. The code-agent service must be running."}]};if(!Pw(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected at least { goal }."}]};let n=r.workdir||t.workspaceDir||_.defaultWorkdir||process.cwd();if(!vw(n))return{content:[{type:"text",text:`Error: Working directory does not exist: ${n}`}]};let o=(r.verifier_commands??[]).map((f,k)=>({label:`check-${k+1}`,command:f.trim()})).filter(f=>f.command.length>0),i=r.goal_mode??(o.length>0?"verifier":"ralph");if(i==="verifier"&&o.length===0)return{content:[{type:"text",text:"Error: verifier_commands must contain at least one non-empty command for verifier goal mode."}]};let s=r.harness??Pe(),a=r.model??$t(s);if(!a)return{content:[{type:"text",text:`Error: No default model configured for harness "${s}". Set plugins.entries["openclaw-code-agent"].config.harnesses.${s}.defaultModel or pass model explicitly.`}]};let d=tn(s);if(!Yi(a,d))return{content:[{type:"text",text:`Error: Model "${a}" is not allowed. Permitted models: ${d?.join(", ")}`}]};let l=t.sessionKey||void 0,m=ai(t),g=jt(t,m),y=Et(t,g,l);try{let f=await fe.launchTask({goal:r.goal,name:r.name,workdir:n,model:a,reasoningEffort:lt(s),systemPrompt:r.system_prompt,allowedTools:r.allowed_tools,maxIterations:r.max_iterations,permissionMode:r.permission_mode??"bypassPermissions",loopMode:i,completionPromise:r.completion_promise,originChannel:g,originThreadId:y?.threadId,originAgentId:t.agentId||void 0,originSessionKey:l,route:y,harness:s,verifierCommands:o});return{content:[{type:"text",text:["Goal task launched successfully.",` Name: ${f.name}`,` ID: ${f.id}`,` Dir: ${f.workdir}`,` Session: ${f.sessionName} [${f.sessionId}]`,` Harness: ${s}`,` Model: ${a}`,` Loop mode: ${f.loopMode}`,` Max iterations: ${f.maxIterations}`,` Goal: "${r.goal.length>100?`${r.goal.slice(0,100)}...`:r.goal}"`,...f.loopMode==="ralph"?[` Completion promise: ${f.completionPromise}`]:[" Verifiers:",...o.map(A=>` - ${A.command}`)],"","Use goal_status to follow progress or goal_stop to terminate the task."].join(`
87
+ `);try{let O=v.spawn({prompt:R,workdir:l,name:`${r.session}-conflict-resolver`,harness:Pe(),permissionMode:"bypassPermissions",multiTurn:!0,route:o?.route??i?.route,originChannel:o?.originChannel??i?.originChannel,originThreadId:o?.originThreadId??i?.originThreadId,originAgentId:o?.originAgentId??i?.originAgentId,originSessionKey:o?.originSessionKey??i?.originSessionKey});A={content:[{type:"text",text:`\u26A0\uFE0F Merge conflicts in ${I.conflictFiles.length} file(s) \u2014 spawned conflict resolver session: ${O.name}`}]}}catch(O){A={content:[{type:"text",text:`\u274C Merge conflicts detected, but failed to spawn resolver: ${O instanceof Error?O.message:String(O)}`}]}}}else A={content:[{type:"text",text:I.dirtyError?`\u274C Merge blocked: ${I.error}`:`\u274C Merge failed: ${I.error??"unknown error"}`}]}}),A}}}Ji();Ee();Y();ke();ut();no();function yw(t){return!!t&&typeof t=="object"}function $f(t){return{name:"agent_worktree_cleanup",description:"Manage worktree cleanup with lifecycle-aware safety rules. Use preview_safe to list what Clean all safe would remove, clean_safe to execute it, or preview_all to see both safe and retained sandboxes with kept reasons.",parameters:p.Object({workdir:p.Optional(p.String({description:"Restrict cleanup to sessions rooted in this repository"})),base_branch:p.Optional(p.String({description:"Override base branch for lifecycle resolution"})),mode:p.Optional(p.Union([p.Literal("preview_safe"),p.Literal("clean_safe"),p.Literal("preview_all")],{description:"Cleanup mode. preview_safe shows what Clean all safe would remove, clean_safe performs that cleanup, preview_all shows both safe and retained worktrees. Defaults to preview_safe when dry_run=true, otherwise clean_safe."})),skip_session_check:p.Optional(p.Boolean({description:"Deprecated. Safe cleanup never removes live sessions."})),force:p.Optional(p.Boolean({description:"Deprecated alias for skip_session_check."})),dry_run:p.Optional(p.Boolean({description:"Show what would be cleaned without deleting anything."})),session:p.Optional(p.String({description:"Session name or ID to clean or dismiss."})),dismiss_session:p.Optional(p.Boolean({description:"When true and session is provided, permanently dismiss the worktree."}))}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!yw(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { workdir?, base_branch?, mode?, dry_run?, session?, dismiss_session? }."}]};let n=r.session,o=r.mode??(r.dry_run===!0?"preview_safe":"clean_safe"),i=o!=="clean_safe",s=o==="preview_all"||o==="clean_safe";if(n&&r.dismiss_session===!0)return{content:[{type:"text",text:await v.dismissWorktree(n)}]};let a=Gi(v);if(n&&(a=a.filter(f=>Hi(f,n)),a.length===0)){let f=dn(v,n);if(!f.persistedSession&&!f.activeSession)return{content:[{type:"text",text:`Error: Session "${n}" not found.`}]}}if(r.workdir&&(a=a.filter(f=>f.workdir===r.workdir)),a.length===0)return{content:[{type:"text",text:"No managed worktrees matched the requested scope."}]};let d=[],l=[],m=[],g=[];for(let f of a){let{persistedSession:k,activeSession:A,resolvedLifecycle:b}=ji(v,f,{baseBranch:r.base_branch});if(!b.cleanupSafe){if(s){let w=b.reasons.length>0?b.reasons.map(zi).join(", "):$r(b.derivedState);l.push(`${f.name} [kept: ${w}]`)}continue}if(d.push(`${f.name} (${$r(b.derivedState)})`),!i)try{let w=f.workdir;if(!((k??A)&&Ne(k??A))&&f.worktreePath&&tt(w,f.worktreePath,{destructive:!1}),f.worktreeBranch&&Ot(w,f.worktreeBranch),k){let I=b.derivedState==="merged"||b.derivedState==="released"?b.derivedState:b.lifecycle.state;v.updatePersistedSession(f.id,{worktreePath:void 0,worktreeBranch:void 0,worktreeState:"none",worktreeMerged:I==="merged"?!0:k.worktreeMerged,worktreeMergedAt:I==="merged"?k.worktreeMergedAt??new Date().toISOString():k.worktreeMergedAt,worktreeLifecycle:{...k.worktreeLifecycle??b.lifecycle,state:I,updatedAt:new Date().toISOString(),resolvedAt:k.worktreeLifecycle?.resolvedAt??new Date().toISOString(),resolutionSource:k.worktreeLifecycle?.resolutionSource??"maintenance",baseBranch:r.base_branch??b.lifecycle.baseBranch??k.worktreeBaseBranch,targetRepo:k.worktreePrTargetRepo,pushRemote:k.worktreePushRemote,notes:b.reasons}})}m.push(`${f.name} (${$r(b.derivedState)})`)}catch(w){g.push(`${f.name}: ${w instanceof Error?w.message:String(w)}`)}}let y=[o==="clean_safe"?"Clean all safe:":o==="preview_all"?"Worktree lifecycle review:":"Clean all safe preview:"];return y.push(` SAFE ${i?"NOW":"FOUND"} (${d.length}): ${d.join(", ")||"(none)"}`),s&&y.push(` KEPT (${l.length}): ${l.join(", ")||"(none)"}`),i||(y.push(` CLEANED (${m.length}): ${m.join(", ")||"(none)"}`),y.push(` FAILURES (${g.length}): ${g.join(", ")||"(none)"}`)),{content:[{type:"text",text:y.join(`
88
+ `)}]}}}}Ee();Y();no();function kw(t){return!0}function Ef(t){return{name:"agent_worktree_status",description:"Show lifecycle-first worktree status for coding agent sessions. Displays product-facing lifecycle state, released handling, cleanup safety, and retained reasons.",parameters:p.Object({session:p.Optional(p.String({description:"Session name or ID to show status for (optional, shows all if omitted)"}))}),async execute(e,r){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!kw(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session? }."}]};let n=r.session,o=Gi(v);if(n&&(o=o.filter(s=>Hi(s,n)),o.length===0))return{content:[{type:"text",text:`Error: Session "${n}" not found or has no worktree.`}]};if(o.length===0)return{content:[{type:"text",text:"No sessions with worktrees found."}]};let i=[];for(let s of o){let{persistedSession:a,resolvedLifecycle:d}=ji(v,s),l=d.cleanupSafe?"safe now":d.preserve?"preserve":"blocked";i.push(`Session: ${s.name} [${s.id}]`),i.push(` Branch: ${s.worktreeBranch??"(unknown)"} \u2192 ${d.lifecycle.baseBranch??a?.worktreeBaseBranch??"main"}`),i.push(` Repo: ${s.workdir}`),i.push(` Lifecycle:${$r(d.lifecycle.state)}`),d.derivedState!==d.lifecycle.state&&i.push(` Derived: ${$r(d.derivedState)}`),i.push(` Cleanup: ${l}`),d.evidence.prUrl&&i.push(` PR: ${d.evidence.prUrl} (${d.evidence.prState??"unknown"})`),(d.evidence.branchAheadCount!=null||d.evidence.baseAheadCount!=null)&&i.push(` Ahead: ${d.evidence.branchAheadCount??0} ahead / ${d.evidence.baseAheadCount??0} behind`),i.push(` Reasons: ${d.reasons.length>0?d.reasons.map(zi).join(", "):"none"}`),i.push("")}return{content:[{type:"text",text:i.join(`
89
+ `).trim()}]}}}}Ee();Y();Re();import{existsSync as vw}from"fs";function Yi(t,e){if(!e||e.length===0)return!0;if(!t)return!1;let r=t.toLowerCase();return e.some(n=>r.includes(n.toLowerCase()))}function Pw(t){return!t||typeof t!="object"?!1:typeof t.goal=="string"}function Of(t){return{name:"goal_launch",description:"Launch an explicit goal loop. Use this only when the user specifically asks for a goal task, Ralph-style autonomous loop, iterative loop, autonomous repair loop, or keep-going-until-checks-pass workflow. This is not the default session path.",parameters:p.Object({goal:p.String({description:"End goal for the autonomous task"}),verifier_commands:p.Optional(p.Array(p.String({description:"Shell command that must pass for the goal to be considered complete"}),{minItems:1,description:"Verifier commands run after each coding turn"})),name:p.Optional(p.String({description:"Short task name (kebab-case preferred)"})),workdir:p.Optional(p.String({description:"Working directory (defaults to cwd / configured workspace)"})),model:p.Optional(p.String({description:"Model name to use"})),system_prompt:p.Optional(p.String({description:"Additional system prompt"})),allowed_tools:p.Optional(p.Array(p.String(),{description:"Allowed tools for the underlying agent session"})),max_iterations:p.Optional(p.Number({description:"Maximum verifier-driven repair iterations",minimum:1})),goal_mode:p.Optional(p.Union([p.Literal("ralph"),p.Literal("verifier")],{description:"Loop strategy. 'ralph' repeats until a completion promise appears. 'verifier' repeats until verifier commands pass. Defaults to 'ralph' when no verifiers are provided, otherwise 'verifier'."})),completion_promise:p.Optional(p.String({description:"Exact completion promise for Ralph-mode loops. Defaults to 'DONE'."})),permission_mode:p.Optional(p.Union([p.Literal("default"),p.Literal("plan"),p.Literal("bypassPermissions")],{description:"Permission mode for the underlying agent session. Defaults to bypassPermissions for autonomous goal loops."})),harness:p.Optional(p.String({description:"Agent harness to use (e.g. 'codex' or 'claude-code')."}))}),async execute(e,r){if(!fe)return{content:[{type:"text",text:"Error: GoalController not initialized. The code-agent service must be running."}]};if(!Pw(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected at least { goal }."}]};let n=r.workdir||t.workspaceDir||_.defaultWorkdir||process.cwd();if(!vw(n))return{content:[{type:"text",text:`Error: Working directory does not exist: ${n}`}]};let o=(r.verifier_commands??[]).map((f,k)=>({label:`check-${k+1}`,command:f.trim()})).filter(f=>f.command.length>0),i=r.goal_mode??(o.length>0?"verifier":"ralph");if(i==="verifier"&&o.length===0)return{content:[{type:"text",text:"Error: verifier_commands must contain at least one non-empty command for verifier goal mode."}]};let s=r.harness??Pe(),a=r.model??$t(s);if(!a)return{content:[{type:"text",text:`Error: No default model configured for harness "${s}". Set plugins.entries["openclaw-code-agent"].config.harnesses.${s}.defaultModel or pass model explicitly.`}]};let d=en(s);if(!Yi(a,d))return{content:[{type:"text",text:`Error: Model "${a}" is not allowed. Permitted models: ${d?.join(", ")}`}]};let l=t.sessionKey||void 0,m=ai(t),g=jt(t,m),y=Et(t,g,l);try{let f=await fe.launchTask({goal:r.goal,name:r.name,workdir:n,model:a,reasoningEffort:lt(s),systemPrompt:r.system_prompt,allowedTools:r.allowed_tools,maxIterations:r.max_iterations,permissionMode:r.permission_mode??"bypassPermissions",loopMode:i,completionPromise:r.completion_promise,originChannel:g,originThreadId:y?.threadId,originAgentId:t.agentId||void 0,originSessionKey:l,route:y,harness:s,verifierCommands:o});return{content:[{type:"text",text:["Goal task launched successfully.",` Name: ${f.name}`,` ID: ${f.id}`,` Dir: ${f.workdir}`,` Session: ${f.sessionName} [${f.sessionId}]`,` Harness: ${s}`,` Model: ${a}`,` Loop mode: ${f.loopMode}`,` Max iterations: ${f.maxIterations}`,` Goal: "${r.goal.length>100?`${r.goal.slice(0,100)}...`:r.goal}"`,...f.loopMode==="ralph"?[` Completion promise: ${f.completionPromise}`]:[" Verifiers:",...o.map(A=>` - ${A.command}`)],"","Use goal_status to follow progress or goal_stop to terminate the task."].join(`
90
90
  `)}]}}catch(f){return{content:[{type:"text",text:`Error launching goal task: ${f instanceof Error?f.message:String(f)}`}]}}}}}Ee();function Df(t,e){return t.split(`
91
91
  `).map(r=>`${e}${r}`)}function ww(t,e=8,r=600){let n=t.map(i=>i.trimEnd()).filter(i=>i.trim().length>0);if(n.length===0)return;let o=n.slice(-e).join(`
92
92
  `);return o.length<=r?o:`...${o.slice(-(r-3))}`}function dr(t){if(t)return{phase:t.phase,awaitingInput:t.isAwaitingInput??!!t.pendingInputState,latestOutput:ww(t.getOutput(20))}}function lr(t,e){let r=t.loopMode??"verifier",n=[`${t.name} [${t.id}]`,` Status: ${t.status}`,...r==="ralph"?[" Loop mode: ralph",` Iteration: ${t.iteration}/${t.maxIterations}`]:[` Repair iteration: ${t.iteration}/${t.maxIterations}`],` Workdir: ${t.workdir}`];return r==="ralph"&&t.completionPromise&&n.push(` Completion promise: ${t.completionPromise}`),t.sessionId&&n.push(` Session: ${t.sessionName??"(unknown)"} [${t.sessionId}]`),e?.phase&&n.push(` Phase: ${e.phase}`),e?.awaitingInput!==void 0&&n.push(` Awaiting input: ${e.awaitingInput?"yes":"no"}`),t.lastVerifierSummary&&(n.push(" Last verifier:"),n.push(...Df(t.lastVerifierSummary," "))),e?.latestOutput&&(n.push(" Latest activity:"),n.push(...Df(e.latestOutput," "))),t.waitingForUserReason&&n.push(` Waiting on user: ${t.waitingForUserReason}`),t.failureReason&&n.push(` Failure: ${t.failureReason}`),n.join(`
93
93
  `)}Y();function Nf(t){return{name:"goal_status",description:"Show status for explicit goal tasks managed by the goal controller. Use this to inspect one goal task or list all goal tasks.",parameters:p.Object({task:p.Optional(p.String({description:"Task name or ID. Omit to list all tasks."}))}),async execute(e,r){if(!fe)return{content:[{type:"text",text:"Error: GoalController not initialized. The code-agent service must be running."}]};let n=r&&typeof r=="object"&&typeof r.task=="string"?r.task:void 0;if(n){let i=fe.getTask(n);if(!i)return{content:[{type:"text",text:`Error: Goal task "${n}" not found.`}]};let s=i.sessionId?v?.resolve(i.sessionId):void 0;return{content:[{type:"text",text:lr(i,dr(s))}]}}let o=fe.listTasks();return o.length===0?{content:[{type:"text",text:"No goal tasks found."}]}:{content:[{type:"text",text:o.map(i=>{let s=i.sessionId?v?.resolve(i.sessionId):void 0;return lr(i,dr(s))}).join(`
94
94
 
95
- `)}]}}}}Ee();Y();function Iw(t){return!!t&&typeof t=="object"&&typeof t.task=="string"}function Ff(t){return{name:"goal_stop",description:"Stop an explicit goal task and kill its underlying agent session.",parameters:p.Object({task:p.String({description:"Goal task name or ID"})}),async execute(e,r){if(!fe)return{content:[{type:"text",text:"Error: GoalController not initialized. The code-agent service must be running."}]};if(!Iw(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { task }."}]};let n=fe.stopTask(r.task);return n?{content:[{type:"text",text:n.action==="already_terminal"?`Task is already ${n.task.status}.`:`Task "${n.task.name}" (${n.task.id}) stopped.`}]}:{content:[{type:"text",text:`Error: Goal task "${r.task}" not found.`}]}}}}Y();Ji();var ur="code-agent";function xw(t){let e=t.trim().replace(new RegExp(`^${ur}:`),"");return e||null}async function Xi(t,e){try{await pt(t,{text:e})}catch(r){let n=r instanceof Error?r.message:String(r);console.warn(`[callback-handler] Failed to resolve worktree prompt: ${n}`)}}function Gd(t){if(t&&typeof t=="object"&&"content"in t&&Array.isArray(t.content)){let e=t.content[0];return typeof e?.text=="string"?e.text:"(done)"}return"(done)"}function bw(t){return t==="plan-approve"||t==="plan-request-changes"||t==="plan-reject"}function Aw(t,e){if(bw(t.kind)){if(!e)return"This plan decision is stale because the session is no longer available.";if(t.planDecisionVersion!=null&&(e.actionablePlanDecisionVersion??e.planDecisionVersion)!=null&&t.planDecisionVersion!==(e.actionablePlanDecisionVersion??e.planDecisionVersion))return"This plan decision is stale because a newer plan review state already exists.";if(!e.pendingPlanApproval)return"This plan is no longer awaiting approval.";if(t.kind==="plan-approve"&&e.approvalState==="changes_requested"&&!e.pendingPlanApproval)return"Changes were already requested for this plan. Wait for the revised plan before approving.";if(t.kind==="plan-request-changes"&&e.approvalState==="changes_requested")return"Changes were already requested for this plan. Send your feedback to the agent instead."}}function Rw(t){let e="callback"in t?t.callback?.payload:void 0,r="interaction"in t?t.interaction?.payload:void 0;return e??r??""}function Hd(t){let e=t instanceof Error?t.message:String(t);return/message is not modified/i.test(e)}function Tw(t){let e=t instanceof Error?t.message:String(t);return/empty message/i.test(e)}async function pt(t,e={}){let r=t.respond,{text:n}=e;if(t.channel==="telegram"){if(typeof n=="string"&&typeof r.editMessage=="function")try{await r.editMessage({text:n,buttons:[]});return}catch(o){if(Hd(o))return;let i=o instanceof Error?o.message:String(o);console.warn(`[callback-handler] Failed to edit Telegram worktree prompt before clearing buttons: ${i}`)}typeof r.clearButtons=="function"&&await r.clearButtons();return}if(typeof r.clearComponents=="function")try{await r.clearComponents(typeof n=="string"?{text:n}:void 0);return}catch(o){if(Hd(o))return;if(Tw(o)){if(typeof n!="string"&&typeof r.acknowledge=="function"){await r.acknowledge();return}typeof n!="string"&&typeof r.acknowledge!="function"&&console.warn("[callback-handler] clearComponents failed with empty-message error and no acknowledge fallback available")}else{if(typeof n!="string")throw o;{let i=o instanceof Error?o.message:String(o);console.warn(`[callback-handler] clearComponents failed before text fallback: ${i}`)}}}if(typeof n=="string"&&typeof r.editMessage=="function")try{await r.editMessage({text:n})}catch(o){if(!Hd(o)){let i=o instanceof Error?o.message:String(o);console.warn(`[callback-handler] Failed to edit worktree prompt before clearing interactive state: ${i}`)}}typeof r.clearButtons=="function"&&await r.clearButtons()}async function oe(t,e){if(t.channel==="telegram"){await t.respond.reply({text:e});return}await t.respond.reply({text:e,ephemeral:!0})}function zd(t="telegram"){return{channel:t,namespace:ur,handler:async e=>{if(!e.auth.isAuthorizedSender)return await oe(e,"\u26D4 Unauthorized."),{handled:!0};let r=Rw(e),n=xw(r);if(!n)return await oe(e,`\u26A0\uFE0F Unrecognized callback payload: "${r}".`),{handled:!0};if(!v)return await oe(e,"\u26A0\uFE0F Code agent service not running."),{handled:!0};let o=v.getActionToken(n);if(!o)return await oe(e,"\u26A0\uFE0F This action is stale or has already been used."),{handled:!0};let i=o.sessionId,s=v.resolve?.(i)??v.getPersistedSession?.(i),a=s?.name??i,d=Aw(o,s);if(d)return await pt(e),await oe(e,`\u26A0\uFE0F ${d}`),{handled:!0};let l=v.consumeActionToken(n);if(!l)return await oe(e,"\u26A0\uFE0F This action is stale or has already been used."),{handled:!0};switch(l.kind){case"worktree-merge":{await Xi(e,`\u2705 Merge selected for [${a}]`);let m=await Qi().execute("callback",{session:i});await oe(e,Gd(m));break}case"worktree-decide-later":{await Xi(e,`\u23ED\uFE0F Deferred for [${a}]`);let m=v.snoozeWorktreeDecision(i);await oe(e,m.startsWith("Error")?m:"\u23ED\uFE0F Snoozed 24h");break}case"worktree-dismiss":{await Xi(e,`\u{1F5D1}\uFE0F Discarded for [${a}]`);let m=await v.dismissWorktree(i);await oe(e,(m.startsWith("Error"),m));break}case"worktree-create-pr":case"worktree-update-pr":{await Xi(e,o.kind==="worktree-update-pr"?`\u{1F4EC} PR update selected for [${a}]`:`\u{1F4EC} PR selected for [${a}]`);let m=await oo().execute("callback",{session:i});await oe(e,Gd(m));break}case"worktree-view-pr":{await pt(e);let m=v.getPersistedSession?.(i),g=o.targetUrl??m?.worktreePrUrl;await oe(e,g?`PR: ${g}`:"\u26A0\uFE0F PR URL is no longer available.");break}case"plan-approve":{await pt(e),v.clearPlanDecisionTokens(i);let m=await xt(v,{session:i,message:"Approved. Go ahead.",approve:!0,userInitiated:!0});m.isError&&await oe(e,`\u26A0\uFE0F ${m.text}`);break}case"plan-reject":{await pt(e),v.clearPlanDecisionTokens(i);let m=v.resolve(i);if(m)m.approvalState="rejected",v.kill(m.id,"user"),await oe(e,`\u274C Plan rejected for [${m.name}]. Session stopped.`);else{let g=v.getPersistedSession?.(i);g?(v.updatePersistedSession?.(i,{approvalState:"rejected",lifecycle:"terminal",pendingPlanApproval:!1,planApprovalContext:void 0,planDecisionVersion:(g.planDecisionVersion??0)+1}),await oe(e,`\u274C Plan rejected for [${g.name??a}]. Session remains stopped.`)):await oe(e,"\u274C Plan rejected.")}break}case"plan-request-changes":{await pt(e);let m=v.resolve?.(i),g=v.getPersistedSession?.(i),y=m?.name??g?.name??i,f=(m?.planDecisionVersion??g?.planDecisionVersion??0)+1;v.clearPlanDecisionTokens(i),v.updatePersistedSession(i,{approvalState:"changes_requested",lifecycle:"awaiting_user_input",pendingPlanApproval:!1,planDecisionVersion:f,actionablePlanDecisionVersion:void 0,canonicalPlanPromptVersion:void 0,approvalPromptRequiredVersion:void 0,approvalPromptVersion:void 0,approvalPromptStatus:"not_sent",approvalPromptTransport:"none",approvalPromptMessageKind:"none",approvalPromptLastAttemptAt:void 0,approvalPromptDeliveredAt:void 0,approvalPromptFailedAt:void 0}),await oe(e,`\u270F\uFE0F Type your revision feedback for [${y}] and I'll forward it to the agent.`);break}case"monitor-start-plan":{if(await pt(e),!l.launchPrompt||!l.launchWorkdir){await oe(e,"\u26A0\uFE0F This release action is missing the plan launch context.");break}let m=v.launchMonitorPlan({route:l.route,prompt:l.launchPrompt,workdir:l.launchWorkdir,name:l.launchName});await oe(e,`\u25B6\uFE0F Planning session started: ${m.name} [${m.id}]`);break}case"monitor-dismiss":{await pt(e),await oe(e,"\u2705 Dismissed.");break}case"session-restart":case"session-resume":{await pt(e);let m=await xt(v,{session:i,message:"Continue where you left off.",userInitiated:!0});await oe(e,m.isError?`\u26A0\uFE0F ${m.text}`:`\u25B6\uFE0F ${m.text}`);break}case"view-output":{await pt(e);let m=await Vi().execute("callback",{session:i,lines:50});await oe(e,Gd(m));break}case"question-answer":{if(await pt(e),o.optionIndex==null){await oe(e,"\u26A0\uFE0F Invalid question-answer action.");break}await v.resolvePendingInputOption(i,o.optionIndex),await oe(e,"\u2705 Answer submitted.");break}default:{await pt(e),await oe(e,"\u26A0\uFE0F Unknown callback action.");break}}return{handled:!0}}}}Y();Re();function Mw(t){return t instanceof Error?t.message:String(t)}function Lf(t){t.registerCommand({name:"agent",description:"Launch a coding agent session. Usage: /agent [--name <name>] <prompt>",acceptsArgs:!0,requireAuth:!0,handler:e=>{if(!v)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let r=(e.args??"").trim();if(!r)return{text:"Usage: /agent [--name <name>] <prompt>"};let n,o=r.match(/^--name\s+(\S+)\s+/);o&&(n=o[1],r=r.slice(o[0].length).trim());let i=r;if(!i)return{text:"Usage: /agent [--name <name>] <prompt>"};try{let s=Pe(),a=$t(s);if(!a)return{text:`Error: No default model configured for harness "${s}". Set plugins.entries["openclaw-code-agent"].config.harnesses.${s}.defaultModel or pass model explicitly via agent_launch.`};let d=v.spawn({prompt:i,name:n,workdir:_.defaultWorkdir||process.cwd(),model:a,reasoningEffort:lt(s),codexApprovalPolicy:s==="codex"?"never":void 0,originChannel:jt(e),originThreadId:Kn(e),route:Et(e),harness:s}),l=i.length>80?i.slice(0,80)+"...":i;return{text:["Session launched.",` Name: ${d.name}`,` ID: ${d.id}`,` Prompt: "${l}"`,` Status: ${d.status}`].join(`
95
+ `)}]}}}}Ee();Y();function Iw(t){return!!t&&typeof t=="object"&&typeof t.task=="string"}function Ff(t){return{name:"goal_stop",description:"Stop an explicit goal task and kill its underlying agent session.",parameters:p.Object({task:p.String({description:"Goal task name or ID"})}),async execute(e,r){if(!fe)return{content:[{type:"text",text:"Error: GoalController not initialized. The code-agent service must be running."}]};if(!Iw(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { task }."}]};let n=fe.stopTask(r.task);return n?{content:[{type:"text",text:n.action==="already_terminal"?`Task is already ${n.task.status}.`:`Task "${n.task.name}" (${n.task.id}) stopped.`}]}:{content:[{type:"text",text:`Error: Goal task "${r.task}" not found.`}]}}}}Y();Ji();var ln="code-agent";function xw(t){let e=t.trim().replace(new RegExp(`^${ln}:`),"");return e||null}async function Xi(t,e){try{await pt(t,{text:e})}catch(r){let n=r instanceof Error?r.message:String(r);console.warn(`[callback-handler] Failed to resolve worktree prompt: ${n}`)}}function Gd(t){if(t&&typeof t=="object"&&"content"in t&&Array.isArray(t.content)){let e=t.content[0];return typeof e?.text=="string"?e.text:"(done)"}return"(done)"}function bw(t){return t==="plan-approve"||t==="plan-request-changes"||t==="plan-reject"}function Aw(t,e){if(bw(t.kind)){if(!e)return"This plan decision is stale because the session is no longer available.";if(t.planDecisionVersion!=null&&(e.actionablePlanDecisionVersion??e.planDecisionVersion)!=null&&t.planDecisionVersion!==(e.actionablePlanDecisionVersion??e.planDecisionVersion))return"This plan decision is stale because a newer plan review state already exists.";if(!e.pendingPlanApproval)return"This plan is no longer awaiting approval.";if(t.kind==="plan-approve"&&e.approvalState==="changes_requested"&&!e.pendingPlanApproval)return"Changes were already requested for this plan. Wait for the revised plan before approving.";if(t.kind==="plan-request-changes"&&e.approvalState==="changes_requested")return"Changes were already requested for this plan. Send your feedback to the agent instead."}}function Rw(t){let e="callback"in t?t.callback?.payload:void 0,r="interaction"in t?t.interaction?.payload:void 0;return e??r??""}function Hd(t){let e=t instanceof Error?t.message:String(t);return/message is not modified/i.test(e)}function Tw(t){let e=t instanceof Error?t.message:String(t);return/empty message/i.test(e)}async function pt(t,e={}){let r=t.respond,{text:n}=e;if(t.channel==="telegram"){if(typeof n=="string"&&typeof r.editMessage=="function")try{await r.editMessage({text:n,buttons:[]});return}catch(o){if(Hd(o))return;let i=o instanceof Error?o.message:String(o);console.warn(`[callback-handler] Failed to edit Telegram worktree prompt before clearing buttons: ${i}`)}typeof r.clearButtons=="function"&&await r.clearButtons();return}if(typeof r.clearComponents=="function")try{await r.clearComponents(typeof n=="string"?{text:n}:void 0);return}catch(o){if(Hd(o))return;if(Tw(o)){if(typeof n!="string"&&typeof r.acknowledge=="function"){await r.acknowledge();return}typeof n!="string"&&typeof r.acknowledge!="function"&&console.warn("[callback-handler] clearComponents failed with empty-message error and no acknowledge fallback available")}else{if(typeof n!="string")throw o;{let i=o instanceof Error?o.message:String(o);console.warn(`[callback-handler] clearComponents failed before text fallback: ${i}`)}}}if(typeof n=="string"&&typeof r.editMessage=="function")try{await r.editMessage({text:n})}catch(o){if(!Hd(o)){let i=o instanceof Error?o.message:String(o);console.warn(`[callback-handler] Failed to edit worktree prompt before clearing interactive state: ${i}`)}}typeof r.clearButtons=="function"&&await r.clearButtons()}async function oe(t,e){if(t.channel==="telegram"){await t.respond.reply({text:e});return}await t.respond.reply({text:e,ephemeral:!0})}function zd(t="telegram"){return{channel:t,namespace:ln,handler:async e=>{if(!e.auth.isAuthorizedSender)return await oe(e,"\u26D4 Unauthorized."),{handled:!0};let r=Rw(e),n=xw(r);if(!n)return await oe(e,`\u26A0\uFE0F Unrecognized callback payload: "${r}".`),{handled:!0};if(!v)return await oe(e,"\u26A0\uFE0F Code agent service not running."),{handled:!0};let o=v.getActionToken(n);if(!o)return await oe(e,"\u26A0\uFE0F This action is stale or has already been used."),{handled:!0};let i=o.sessionId,s=v.resolve?.(i)??v.getPersistedSession?.(i),a=s?.name??i,d=Aw(o,s);if(d)return await pt(e),await oe(e,`\u26A0\uFE0F ${d}`),{handled:!0};let l=v.consumeActionToken(n);if(!l)return await oe(e,"\u26A0\uFE0F This action is stale or has already been used."),{handled:!0};switch(l.kind){case"worktree-merge":{await Xi(e,`\u2705 Merge selected for [${a}]`);let m=await Qi().execute("callback",{session:i});await oe(e,Gd(m));break}case"worktree-decide-later":{await Xi(e,`\u23ED\uFE0F Deferred for [${a}]`);let m=v.snoozeWorktreeDecision(i);await oe(e,m.startsWith("Error")?m:"\u23ED\uFE0F Snoozed 24h");break}case"worktree-dismiss":{await Xi(e,`\u{1F5D1}\uFE0F Discarded for [${a}]`);let m=await v.dismissWorktree(i);await oe(e,(m.startsWith("Error"),m));break}case"worktree-create-pr":case"worktree-update-pr":{await Xi(e,o.kind==="worktree-update-pr"?`\u{1F4EC} PR update selected for [${a}]`:`\u{1F4EC} PR selected for [${a}]`);let m=await oo().execute("callback",{session:i});await oe(e,Gd(m));break}case"worktree-view-pr":{await pt(e);let m=v.getPersistedSession?.(i),g=o.targetUrl??m?.worktreePrUrl;await oe(e,g?`PR: ${g}`:"\u26A0\uFE0F PR URL is no longer available.");break}case"plan-approve":{await pt(e),v.clearPlanDecisionTokens(i);let m=await xt(v,{session:i,message:"Approved. Go ahead.",approve:!0,userInitiated:!0});m.isError&&await oe(e,`\u26A0\uFE0F ${m.text}`);break}case"plan-reject":{await pt(e),v.clearPlanDecisionTokens(i);let m=v.resolve(i);if(m)m.approvalState="rejected",v.kill(m.id,"user"),await oe(e,`\u274C Plan rejected for [${m.name}]. Session stopped.`);else{let g=v.getPersistedSession?.(i);g?(v.updatePersistedSession?.(i,{approvalState:"rejected",lifecycle:"terminal",pendingPlanApproval:!1,planApprovalContext:void 0,planDecisionVersion:(g.planDecisionVersion??0)+1}),await oe(e,`\u274C Plan rejected for [${g.name??a}]. Session remains stopped.`)):await oe(e,"\u274C Plan rejected.")}break}case"plan-request-changes":{await pt(e);let m=v.resolve?.(i),g=v.getPersistedSession?.(i),y=m?.name??g?.name??i,f=(m?.planDecisionVersion??g?.planDecisionVersion??0)+1;v.clearPlanDecisionTokens(i),v.updatePersistedSession(i,{approvalState:"changes_requested",lifecycle:"awaiting_user_input",pendingPlanApproval:!1,planDecisionVersion:f,actionablePlanDecisionVersion:void 0,canonicalPlanPromptVersion:void 0,approvalPromptRequiredVersion:void 0,approvalPromptVersion:void 0,approvalPromptStatus:"not_sent",approvalPromptTransport:"none",approvalPromptMessageKind:"none",approvalPromptLastAttemptAt:void 0,approvalPromptDeliveredAt:void 0,approvalPromptFailedAt:void 0}),await oe(e,`\u270F\uFE0F Type your revision feedback for [${y}] and I'll forward it to the agent.`);break}case"monitor-start-plan":{if(await pt(e),!l.launchPrompt||!l.launchWorkdir){await oe(e,"\u26A0\uFE0F This release action is missing the plan launch context.");break}let m=v.launchMonitorPlan({route:l.route,prompt:l.launchPrompt,workdir:l.launchWorkdir,name:l.launchName});await oe(e,`\u25B6\uFE0F Planning session started: ${m.name} [${m.id}]`);break}case"monitor-dismiss":{await pt(e),await oe(e,"\u2705 Dismissed.");break}case"session-restart":case"session-resume":{await pt(e);let m=await xt(v,{session:i,message:"Continue where you left off.",userInitiated:!0});await oe(e,m.isError?`\u26A0\uFE0F ${m.text}`:`\u25B6\uFE0F ${m.text}`);break}case"view-output":{await pt(e);let m=await Vi().execute("callback",{session:i,lines:50});await oe(e,Gd(m));break}case"question-answer":{if(await pt(e),o.optionIndex==null){await oe(e,"\u26A0\uFE0F Invalid question-answer action.");break}await v.resolvePendingInputOption(i,o.optionIndex),await oe(e,"\u2705 Answer submitted.");break}default:{await pt(e),await oe(e,"\u26A0\uFE0F Unknown callback action.");break}}return{handled:!0}}}}Y();Re();function Mw(t){return t instanceof Error?t.message:String(t)}function Lf(t){t.registerCommand({name:"agent",description:"Launch a coding agent session. Usage: /agent [--name <name>] <prompt>",acceptsArgs:!0,requireAuth:!0,handler:e=>{if(!v)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let r=(e.args??"").trim();if(!r)return{text:"Usage: /agent [--name <name>] <prompt>"};let n,o=r.match(/^--name\s+(\S+)\s+/);o&&(n=o[1],r=r.slice(o[0].length).trim());let i=r;if(!i)return{text:"Usage: /agent [--name <name>] <prompt>"};try{let s=Pe(),a=$t(s);if(!a)return{text:`Error: No default model configured for harness "${s}". Set plugins.entries["openclaw-code-agent"].config.harnesses.${s}.defaultModel or pass model explicitly via agent_launch.`};let d=v.spawn({prompt:i,name:n,workdir:_.defaultWorkdir||process.cwd(),model:a,reasoningEffort:lt(s),codexApprovalPolicy:s==="codex"?"never":void 0,originChannel:jt(e),originThreadId:Kn(e),route:Et(e),harness:s}),l=i.length>80?i.slice(0,80)+"...":i;return{text:["Session launched.",` Name: ${d.name}`,` ID: ${d.id}`,` Prompt: "${l}"`,` Status: ${d.status}`].join(`
96
96
  `)}}catch(s){let a=Mw(s),d=a.includes("Max sessions")?"":`
97
97
 
98
98
  Use /agent_sessions to see active sessions.`;return{text:`Error launching session: ${a}${d}`}}}})}Y();function Wf(t){t.registerCommand({name:"agent_sessions",description:"List coding agent sessions. Usage: /agent_sessions [--full]",acceptsArgs:!0,requireAuth:!0,handler:e=>{if(!v)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let r=(e.args??"").split(/\s+/).includes("--full");return{text:Ui(v,"all",void 0,{full:r})}}})}Y();function Bf(t){t.registerCommand({name:"agent_kill",description:"Kill a coding agent session by name or ID",acceptsArgs:!0,requireAuth:!0,handler:e=>{if(!v)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let r=e.args?.trim();return r?{text:Ki(v,r,"killed")}:{text:"Usage: /agent_kill <name-or-id>"}}})}Y();function Uf(t){t.registerCommand({name:"agent_respond",description:"Send a follow-up message to a running coding agent session. Usage: /agent_respond <id-or-name> <message>",acceptsArgs:!0,requireAuth:!0,handler:async e=>{if(!v)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let r=(e.args??"").trim();if(!r)return{text:`Usage: /agent_respond <id-or-name> <message>
99
- /agent_respond --interrupt <id-or-name> <message>`};let n=!1,o=r;o.startsWith("--interrupt ")&&(n=!0,o=o.slice(12).trim());let i=o.indexOf(" ");if(i===-1)return{text:"Error: Missing message. Usage: /agent_respond <id-or-name> <message>"};let s=o.slice(0,i),a=o.slice(i+1).trim();return a?{text:(await xt(v,{session:s,message:a,interrupt:n,userInitiated:!0})).text}:{text:"Error: Empty message. Usage: /agent_respond <id-or-name> <message>"}}})}Y();function Kf(t){t.registerCommand({name:"agent_stats",description:"Show OpenClaw Code Agent usage metrics",acceptsArgs:!1,requireAuth:!0,handler:()=>{if(!v)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let e=v.getMetrics(),r=v.list("running").length;return{text:Li(e,r)}}})}Y();var Cw=50;function Vf(t){t.registerCommand({name:"agent_output",description:"Show recent output from a coding agent session. Usage: /agent_output <id-or-name> [--full] [--lines N]",acceptsArgs:!0,requireAuth:!0,handler:e=>{if(!v)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let r=(e.args??"").trim();if(!r)return{text:"Usage: /agent_output <id-or-name> [--full] [--lines N]"};let n=r.split(/\s+/),o="",i=!1,s=Cw;for(let d=0;d<n.length;d++)if(n[d]==="--full")i=!0;else if(n[d]==="--lines"&&d+1<n.length){let l=parseInt(n[d+1],10);!isNaN(l)&&l>0&&(s=l),d++}else o||(o=n[d]);return o?{text:Bi(v,o,{full:i,lines:s})}:{text:"Usage: /agent_output <id-or-name> [--full] [--lines N]"}}})}Y();Re();import{existsSync as _w}from"fs";function $w(t){let e=t.match(/"[^"]*"|'[^']*'|\S+/g);return e?e.map(r=>r.startsWith('"')&&r.endsWith('"')||r.startsWith("'")&&r.endsWith("'")?r.slice(1,-1):r):[]}function qf(t){t.registerCommand({name:"goal",description:"Launch an explicit goal task (Ralph-style completion loop or verifier-driven loop)",acceptsArgs:!0,requireAuth:!0,handler:async e=>{if(!fe)return{text:"Error: GoalController not initialized. The code-agent service must be running."};let r=(e.args??"").trim();if(!r)return{text:"Usage: /goal [--name <name>] [--workdir <dir>] [--model <model>] [--harness <name>] [--mode <ralph|verifier>] [--completion-promise <text>] [--max-iterations N] [--verify <cmd> ...] <goal>"};let n=$w(r),o,i=_.defaultWorkdir||process.cwd(),s,a,d="bypassPermissions",l,m,g,y=[],f=[];for(let I=0;I<n.length;I++){let R=n[I];if(R==="--name"&&I+1<n.length)o=n[++I];else if(R==="--workdir"&&I+1<n.length)i=n[++I];else if(R==="--model"&&I+1<n.length)s=n[++I];else if(R==="--max-iterations"&&I+1<n.length){let O=parseInt(n[++I],10);!Number.isNaN(O)&&O>0&&(a=O)}else if(R==="--permission-mode"&&I+1<n.length){let O=n[++I];if(O==="default"||O==="plan"||O==="bypassPermissions")d=O;else return{text:`Error: Invalid permission mode "${O}".`}}else if(R==="--harness"&&I+1<n.length)l=n[++I];else if(R==="--mode"&&I+1<n.length){let O=n[++I];if(O==="ralph"||O==="verifier")m=O;else return{text:`Error: Invalid goal mode "${O}". Use ralph or verifier.`}}else if(R==="--completion-promise"&&I+1<n.length)g=n[++I];else if(R==="--verify"&&I+1<n.length){let O=n[++I].trim();if(!O)return{text:"Error: --verify commands must not be empty."};y.push(O)}else f.push(R)}let k=f.join(" ").trim();if(!k)return{text:"Usage: /goal [--name <name>] [--workdir <dir>] [--model <model>] [--harness <name>] [--mode <ralph|verifier>] [--completion-promise <text>] [--max-iterations N] [--verify <cmd> ...] <goal>"};if(!_w(i))return{text:`Error: Working directory does not exist: ${i}`};let A=m??(y.length>0?"verifier":"ralph");if(A==="verifier"&&y.length===0)return{text:"Error: verifier mode requires at least one --verify command."};let b=l??Pe(),w=s??$t(b);if(!w)return{text:`Error: No default model configured for harness "${b}". Set plugins.entries["openclaw-code-agent"].config.harnesses.${b}.defaultModel or pass model explicitly.`};let C=tn(b);if(!Yi(w,C))return{text:`Error: Model "${w}" is not allowed. Permitted models: ${C?.join(", ")}`};try{let I=Et(e),R=await fe.launchTask({goal:k,name:o,workdir:i,model:w,reasoningEffort:lt(b),maxIterations:a,permissionMode:d,harness:b,loopMode:A,completionPromise:g,originChannel:jt(e),originThreadId:I?.threadId,originSessionKey:e.sessionKey,route:I,verifierCommands:y.map((O,Le)=>({label:`check-${Le+1}`,command:O}))});return{text:["Goal task launched.",` Name: ${R.name}`,` ID: ${R.id}`,` Session: ${R.sessionName} [${R.sessionId}]`,` Harness: ${b}`,` Loop mode: ${R.loopMode}`,...R.loopMode==="ralph"?[` Completion promise: ${R.completionPromise}`]:[],` Max iterations: ${R.maxIterations}`,` Goal: "${k.length>100?`${k.slice(0,100)}...`:k}"`].join(`
99
+ /agent_respond --interrupt <id-or-name> <message>`};let n=!1,o=r;o.startsWith("--interrupt ")&&(n=!0,o=o.slice(12).trim());let i=o.indexOf(" ");if(i===-1)return{text:"Error: Missing message. Usage: /agent_respond <id-or-name> <message>"};let s=o.slice(0,i),a=o.slice(i+1).trim();return a?{text:(await xt(v,{session:s,message:a,interrupt:n,userInitiated:!0})).text}:{text:"Error: Empty message. Usage: /agent_respond <id-or-name> <message>"}}})}Y();function Kf(t){t.registerCommand({name:"agent_stats",description:"Show OpenClaw Code Agent usage metrics",acceptsArgs:!1,requireAuth:!0,handler:()=>{if(!v)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let e=v.getMetrics(),r=v.list("running").length;return{text:Li(e,r)}}})}Y();var Cw=50;function Vf(t){t.registerCommand({name:"agent_output",description:"Show recent output from a coding agent session. Usage: /agent_output <id-or-name> [--full] [--lines N]",acceptsArgs:!0,requireAuth:!0,handler:e=>{if(!v)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let r=(e.args??"").trim();if(!r)return{text:"Usage: /agent_output <id-or-name> [--full] [--lines N]"};let n=r.split(/\s+/),o="",i=!1,s=Cw;for(let d=0;d<n.length;d++)if(n[d]==="--full")i=!0;else if(n[d]==="--lines"&&d+1<n.length){let l=parseInt(n[d+1],10);!isNaN(l)&&l>0&&(s=l),d++}else o||(o=n[d]);return o?{text:Bi(v,o,{full:i,lines:s})}:{text:"Usage: /agent_output <id-or-name> [--full] [--lines N]"}}})}Y();Re();import{existsSync as _w}from"fs";function $w(t){let e=t.match(/"[^"]*"|'[^']*'|\S+/g);return e?e.map(r=>r.startsWith('"')&&r.endsWith('"')||r.startsWith("'")&&r.endsWith("'")?r.slice(1,-1):r):[]}function qf(t){t.registerCommand({name:"goal",description:"Launch an explicit goal task (Ralph-style completion loop or verifier-driven loop)",acceptsArgs:!0,requireAuth:!0,handler:async e=>{if(!fe)return{text:"Error: GoalController not initialized. The code-agent service must be running."};let r=(e.args??"").trim();if(!r)return{text:"Usage: /goal [--name <name>] [--workdir <dir>] [--model <model>] [--harness <name>] [--mode <ralph|verifier>] [--completion-promise <text>] [--max-iterations N] [--verify <cmd> ...] <goal>"};let n=$w(r),o,i=_.defaultWorkdir||process.cwd(),s,a,d="bypassPermissions",l,m,g,y=[],f=[];for(let I=0;I<n.length;I++){let R=n[I];if(R==="--name"&&I+1<n.length)o=n[++I];else if(R==="--workdir"&&I+1<n.length)i=n[++I];else if(R==="--model"&&I+1<n.length)s=n[++I];else if(R==="--max-iterations"&&I+1<n.length){let O=parseInt(n[++I],10);!Number.isNaN(O)&&O>0&&(a=O)}else if(R==="--permission-mode"&&I+1<n.length){let O=n[++I];if(O==="default"||O==="plan"||O==="bypassPermissions")d=O;else return{text:`Error: Invalid permission mode "${O}".`}}else if(R==="--harness"&&I+1<n.length)l=n[++I];else if(R==="--mode"&&I+1<n.length){let O=n[++I];if(O==="ralph"||O==="verifier")m=O;else return{text:`Error: Invalid goal mode "${O}". Use ralph or verifier.`}}else if(R==="--completion-promise"&&I+1<n.length)g=n[++I];else if(R==="--verify"&&I+1<n.length){let O=n[++I].trim();if(!O)return{text:"Error: --verify commands must not be empty."};y.push(O)}else f.push(R)}let k=f.join(" ").trim();if(!k)return{text:"Usage: /goal [--name <name>] [--workdir <dir>] [--model <model>] [--harness <name>] [--mode <ralph|verifier>] [--completion-promise <text>] [--max-iterations N] [--verify <cmd> ...] <goal>"};if(!_w(i))return{text:`Error: Working directory does not exist: ${i}`};let A=m??(y.length>0?"verifier":"ralph");if(A==="verifier"&&y.length===0)return{text:"Error: verifier mode requires at least one --verify command."};let b=l??Pe(),w=s??$t(b);if(!w)return{text:`Error: No default model configured for harness "${b}". Set plugins.entries["openclaw-code-agent"].config.harnesses.${b}.defaultModel or pass model explicitly.`};let C=en(b);if(!Yi(w,C))return{text:`Error: Model "${w}" is not allowed. Permitted models: ${C?.join(", ")}`};try{let I=Et(e),R=await fe.launchTask({goal:k,name:o,workdir:i,model:w,reasoningEffort:lt(b),maxIterations:a,permissionMode:d,harness:b,loopMode:A,completionPromise:g,originChannel:jt(e),originThreadId:I?.threadId,originSessionKey:e.sessionKey,route:I,verifierCommands:y.map((O,Le)=>({label:`check-${Le+1}`,command:O}))});return{text:["Goal task launched.",` Name: ${R.name}`,` ID: ${R.id}`,` Session: ${R.sessionName} [${R.sessionId}]`,` Harness: ${b}`,` Loop mode: ${R.loopMode}`,...R.loopMode==="ralph"?[` Completion promise: ${R.completionPromise}`]:[],` Max iterations: ${R.maxIterations}`,` Goal: "${k.length>100?`${k.slice(0,100)}...`:k}"`].join(`
100
100
  `)}}catch(I){return{text:`Error launching goal task: ${I.message}`}}}})}Y();function jf(t){t.registerCommand({name:"goal_status",description:"Show one goal task or list all explicit goal tasks. Usage: /goal_status [<task-id-or-name>]",acceptsArgs:!0,requireAuth:!0,handler:e=>{if(!fe)return{text:"Error: GoalController not initialized. The code-agent service must be running."};let r=(e.args??"").trim();if(r){let o=fe.getTask(r);if(!o)return{text:`Error: Goal task "${r}" not found.`};let i=o.sessionId?v?.resolve(o.sessionId):void 0;return{text:lr(o,dr(i))}}let n=fe.listTasks();return n.length===0?{text:"No goal tasks found."}:{text:n.map(o=>{let i=o.sessionId?v?.resolve(o.sessionId):void 0;return lr(o,dr(i))}).join(`
101
101
 
102
- `)}}})}Y();function Gf(t){t.registerCommand({name:"goal_stop",description:"Stop a goal task. Usage: /goal_stop <task-id-or-name>",acceptsArgs:!0,requireAuth:!0,handler:e=>{if(!fe)return{text:"Error: GoalController not initialized. The code-agent service must be running."};let r=(e.args??"").trim();if(!r)return{text:"Usage: /goal_stop <task-id-or-name>"};let n=fe.stopTask(r);return n?n.action==="already_terminal"?{text:`Task is already ${n.task.status}.`}:{text:`Task "${n.task.name}" (${n.task.id}) stopped.`}:{text:`Error: Goal task "${r}" not found.`}}})}import{execFile as jw}from"child_process";import{createHash as tg}from"crypto";import{existsSync as Ew,mkdirSync as Ow,readFileSync as Dw,renameSync as Nw,writeFileSync as Fw}from"fs";import{homedir as Lw}from"os";import{dirname as Ww,join as Hf}from"path";function Bw(t){let e=t.OPENCLAW_HOME?.trim();return e||Hf(Lw(),".openclaw")}function Uw(t){let e=t.OPENCLAW_CODE_AGENT_GOAL_TASKS_PATH?.trim();return e||Hf(Bw(t),"code-agent-goal-tasks.json")}function Kw(t){return t instanceof Error?t.message:String(t)}function Vw(t){if(!t||typeof t!="object")return;let e=t;if(!(typeof e.provider!="string"||typeof e.target!="string"))return{provider:e.provider,target:e.target,accountId:typeof e.accountId=="string"?e.accountId:void 0,threadId:typeof e.threadId=="string"?e.threadId:void 0,sessionKey:typeof e.sessionKey=="string"?e.sessionKey:void 0}}function qw(t){if(!t||typeof t!="object")return;let e=t;if(typeof e.id!="string"||typeof e.name!="string"||typeof e.goal!="string"||typeof e.workdir!="string"||typeof e.status!="string")return;let r=e.status,n=r==="running"||r==="waiting_for_session"?"waiting_for_session":r;return{id:e.id,name:e.name,goal:e.goal,workdir:e.workdir,status:n,createdAt:typeof e.createdAt=="number"?e.createdAt:Date.now(),updatedAt:typeof e.updatedAt=="number"?e.updatedAt:Date.now(),iteration:typeof e.iteration=="number"?e.iteration:0,maxIterations:typeof e.maxIterations=="number"?e.maxIterations:8,sessionId:typeof e.sessionId=="string"?e.sessionId:void 0,sessionName:typeof e.sessionName=="string"?e.sessionName:void 0,harnessSessionId:typeof e.harnessSessionId=="string"?e.harnessSessionId:void 0,model:typeof e.model=="string"?e.model:void 0,reasoningEffort:typeof e.reasoningEffort=="string"?e.reasoningEffort:void 0,systemPrompt:typeof e.systemPrompt=="string"?e.systemPrompt:void 0,allowedTools:Array.isArray(e.allowedTools)?e.allowedTools.filter(o=>typeof o=="string"):void 0,originChannel:typeof e.originChannel=="string"?e.originChannel:void 0,originThreadId:typeof e.originThreadId=="string"||typeof e.originThreadId=="number"?e.originThreadId:void 0,originAgentId:typeof e.originAgentId=="string"?e.originAgentId:void 0,originSessionKey:typeof e.originSessionKey=="string"?e.originSessionKey:void 0,route:Vw(e.route),harness:typeof e.harness=="string"?e.harness:void 0,permissionMode:typeof e.permissionMode=="string"?e.permissionMode:void 0,loopMode:e.loopMode==="ralph"?"ralph":"verifier",completionPromise:typeof e.completionPromise=="string"?e.completionPromise:void 0,verifierCommands:Array.isArray(e.verifierCommands)?e.verifierCommands.filter(o=>!!o&&typeof o=="object"&&typeof o.label=="string"&&typeof o.command=="string"):[],lastVerifierSummary:typeof e.lastVerifierSummary=="string"?e.lastVerifierSummary:void 0,lastVerifierFingerprint:typeof e.lastVerifierFingerprint=="string"?e.lastVerifierFingerprint:void 0,repeatedFailureCount:typeof e.repeatedFailureCount=="number"?e.repeatedFailureCount:0,waitingForUserReason:typeof e.waitingForUserReason=="string"?e.waitingForUserReason:void 0,failureReason:typeof e.failureReason=="string"?e.failureReason:void 0}}var Zi=class{path;tasks=new Map;constructor(e=process.env){this.path=Uw(e),this.load()}load(){try{if(!Ew(this.path))return;let e=Dw(this.path,"utf8"),r=JSON.parse(e);if(!Array.isArray(r))return;for(let n of r){let o=qw(n);o&&this.tasks.set(o.id,o)}this.save()}catch{}}save(){try{Ow(Ww(this.path),{recursive:!0});let e=`${this.path}.tmp`;Fw(e,JSON.stringify([...this.tasks.values()],null,2),"utf8"),Nw(e,this.path)}catch(e){console.warn(`[GoalTaskStore] Failed to save ${this.path}: ${Kw(e)}`)}}upsert(e){this.tasks.set(e.id,e),this.save()}get(e){let r=this.tasks.get(e);return r||[...this.tasks.values()].find(n=>n.name===e)}list(){return[...this.tasks.values()].sort((e,r)=>r.createdAt-e.createdAt)}};Ar();var Gw=8,rg=600*1e3,Hw=4e3,Qd=1200,zw="DONE",Qw=["BASH_ENV","ENV"];function Jw(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,48)||"goal-task"}function io(t,e){return t.length<=e?t:`${t.slice(0,e-3)}...`}function pr(t,e=20){let r=t.split(/\r?\n/).map(n=>n.trimEnd()).filter(n=>n.trim().length>0);return r.length<=e?r.join(`
102
+ `)}}})}Y();function Gf(t){t.registerCommand({name:"goal_stop",description:"Stop a goal task. Usage: /goal_stop <task-id-or-name>",acceptsArgs:!0,requireAuth:!0,handler:e=>{if(!fe)return{text:"Error: GoalController not initialized. The code-agent service must be running."};let r=(e.args??"").trim();if(!r)return{text:"Usage: /goal_stop <task-id-or-name>"};let n=fe.stopTask(r);return n?n.action==="already_terminal"?{text:`Task is already ${n.task.status}.`}:{text:`Task "${n.task.name}" (${n.task.id}) stopped.`}:{text:`Error: Goal task "${r}" not found.`}}})}import{execFile as jw}from"child_process";import{createHash as tg}from"crypto";import{existsSync as Ew,mkdirSync as Ow,readFileSync as Dw,renameSync as Nw,writeFileSync as Fw}from"fs";import{homedir as Lw}from"os";import{dirname as Ww,join as Hf}from"path";function Bw(t){let e=t.OPENCLAW_HOME?.trim();return e||Hf(Lw(),".openclaw")}function Uw(t){let e=t.OPENCLAW_CODE_AGENT_GOAL_TASKS_PATH?.trim();return e||Hf(Bw(t),"code-agent-goal-tasks.json")}function Kw(t){return t instanceof Error?t.message:String(t)}function Vw(t){if(!t||typeof t!="object")return;let e=t;if(!(typeof e.provider!="string"||typeof e.target!="string"))return{provider:e.provider,target:e.target,accountId:typeof e.accountId=="string"?e.accountId:void 0,threadId:typeof e.threadId=="string"?e.threadId:void 0,sessionKey:typeof e.sessionKey=="string"?e.sessionKey:void 0}}function qw(t){if(!t||typeof t!="object")return;let e=t;if(typeof e.id!="string"||typeof e.name!="string"||typeof e.goal!="string"||typeof e.workdir!="string"||typeof e.status!="string")return;let r=e.status,n=r==="running"||r==="waiting_for_session"?"waiting_for_session":r;return{id:e.id,name:e.name,goal:e.goal,workdir:e.workdir,status:n,createdAt:typeof e.createdAt=="number"?e.createdAt:Date.now(),updatedAt:typeof e.updatedAt=="number"?e.updatedAt:Date.now(),iteration:typeof e.iteration=="number"?e.iteration:0,maxIterations:typeof e.maxIterations=="number"?e.maxIterations:8,sessionId:typeof e.sessionId=="string"?e.sessionId:void 0,sessionName:typeof e.sessionName=="string"?e.sessionName:void 0,harnessSessionId:typeof e.harnessSessionId=="string"?e.harnessSessionId:void 0,model:typeof e.model=="string"?e.model:void 0,reasoningEffort:typeof e.reasoningEffort=="string"?e.reasoningEffort:void 0,systemPrompt:typeof e.systemPrompt=="string"?e.systemPrompt:void 0,allowedTools:Array.isArray(e.allowedTools)?e.allowedTools.filter(o=>typeof o=="string"):void 0,originChannel:typeof e.originChannel=="string"?e.originChannel:void 0,originThreadId:typeof e.originThreadId=="string"||typeof e.originThreadId=="number"?e.originThreadId:void 0,originAgentId:typeof e.originAgentId=="string"?e.originAgentId:void 0,originSessionKey:typeof e.originSessionKey=="string"?e.originSessionKey:void 0,route:Vw(e.route),harness:typeof e.harness=="string"?e.harness:void 0,permissionMode:typeof e.permissionMode=="string"?e.permissionMode:void 0,loopMode:e.loopMode==="ralph"?"ralph":"verifier",completionPromise:typeof e.completionPromise=="string"?e.completionPromise:void 0,verifierCommands:Array.isArray(e.verifierCommands)?e.verifierCommands.filter(o=>!!o&&typeof o=="object"&&typeof o.label=="string"&&typeof o.command=="string"):[],lastVerifierSummary:typeof e.lastVerifierSummary=="string"?e.lastVerifierSummary:void 0,lastVerifierFingerprint:typeof e.lastVerifierFingerprint=="string"?e.lastVerifierFingerprint:void 0,repeatedFailureCount:typeof e.repeatedFailureCount=="number"?e.repeatedFailureCount:0,waitingForUserReason:typeof e.waitingForUserReason=="string"?e.waitingForUserReason:void 0,failureReason:typeof e.failureReason=="string"?e.failureReason:void 0}}var Zi=class{path;tasks=new Map;constructor(e=process.env){this.path=Uw(e),this.load()}load(){try{if(!Ew(this.path))return;let e=Dw(this.path,"utf8"),r=JSON.parse(e);if(!Array.isArray(r))return;for(let n of r){let o=qw(n);o&&this.tasks.set(o.id,o)}this.save()}catch{}}save(){try{Ow(Ww(this.path),{recursive:!0});let e=`${this.path}.tmp`;Fw(e,JSON.stringify([...this.tasks.values()],null,2),"utf8"),Nw(e,this.path)}catch(e){console.warn(`[GoalTaskStore] Failed to save ${this.path}: ${Kw(e)}`)}}upsert(e){this.tasks.set(e.id,e),this.save()}get(e){let r=this.tasks.get(e);return r||[...this.tasks.values()].find(n=>n.name===e)}list(){return[...this.tasks.values()].sort((e,r)=>r.createdAt-e.createdAt)}};br();var Gw=8,rg=600*1e3,Hw=4e3,Qd=1200,zw="DONE",Qw=["BASH_ENV","ENV"];function Jw(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,48)||"goal-task"}function io(t,e){return t.length<=e?t:`${t.slice(0,e-3)}...`}function ur(t,e=20){let r=t.split(/\r?\n/).map(n=>n.trimEnd()).filter(n=>n.trim().length>0);return r.length<=e?r.join(`
103
103
  `):r.slice(-e).join(`
104
- `)}function zf(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Qf(t){let e=t?.trim();return e&&e.length>0?e:zw}function Yw(t){return t.route??Bn(t.originChannel,t.originThreadId,t.originSessionKey)}function Jd(t){return t.map((e,r)=>({label:e.label.trim()||`check-${r+1}`,command:e.command.trim(),timeoutMs:e.timeoutMs??rg})).filter(e=>e.command.length>0)}function Xw(t){return t.loopMode==="verifier"}function Zw(t){return Jd(t.verifierCommands).length>0}function Jf(t){return Xw(t)&&!Zw(t)}function es(){return"Verifier-mode goal tasks require at least one verifier command."}function Yf(t){let e=t.steps.filter(r=>!r.ok).map(r=>`${r.label}:${r.exitCode}:${pr(r.output,12)}`).join(`
105
- `);return tg("sha1").update(e).digest("hex")}function eI(t){return tg("sha1").update(pr(t,24)).digest("hex")}function Xf(t){let e=t.toLowerCase().replace(/\s+/g," ").trim();if(!e)return;if(/\b(can i|may i|should i|do you want me to|would you like me to)\b/.test(e)&&/\b(read|write|edit|modify|change|inspect|search|run|execute|install|delete|move|rename|open)\b/.test(e))return"Yes, proceed.";if(/\b(should i continue|shall i continue|want me to continue|should i proceed|shall i proceed|can i proceed|go ahead)\b/.test(e))return"Yes, continue."}function tI(t){if(t.loopMode==="ralph")return["You are working inside a Ralph Wiggum-style autonomous loop.","","Goal:",t.goal,"","Loop rules:","- Keep making concrete progress toward the goal in this repository.","- An external controller will continue looping until you emit the completion promise or the iteration budget is exhausted.",`- When the goal is truly complete, output this exact marker on its own line: <promise>${t.completionPromise}</promise>`,"- Do not output that completion marker early, approximately, or with altered spelling.","- If you are not done yet, do not emit the completion marker.","- Do not ask to stop or wait for confirmation unless blocked by a real product, architecture, credential, or approval decision.","- Re-run useful local checks before ending each turn.",t.verifierCommands.length>0?"- External verifier commands will also be run after you claim completion.":"- There may not be external verifiers, so your completion promise is the success gate."].join(`
104
+ `)}function zf(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Qf(t){let e=t?.trim();return e&&e.length>0?e:zw}function Yw(t){return t.route??Bn(t.originChannel,t.originThreadId,t.originSessionKey)}function Jd(t){return t.map((e,r)=>({label:e.label.trim()||`check-${r+1}`,command:e.command.trim(),timeoutMs:e.timeoutMs??rg})).filter(e=>e.command.length>0)}function Xw(t){return t.loopMode==="verifier"}function Zw(t){return Jd(t.verifierCommands).length>0}function Jf(t){return Xw(t)&&!Zw(t)}function es(){return"Verifier-mode goal tasks require at least one verifier command."}function Yf(t){let e=t.steps.filter(r=>!r.ok).map(r=>`${r.label}:${r.exitCode}:${ur(r.output,12)}`).join(`
105
+ `);return tg("sha1").update(e).digest("hex")}function eI(t){return tg("sha1").update(ur(t,24)).digest("hex")}function Xf(t){let e=t.toLowerCase().replace(/\s+/g," ").trim();if(!e)return;if(/\b(can i|may i|should i|do you want me to|would you like me to)\b/.test(e)&&/\b(read|write|edit|modify|change|inspect|search|run|execute|install|delete|move|rename|open)\b/.test(e))return"Yes, proceed.";if(/\b(should i continue|shall i continue|want me to continue|should i proceed|shall i proceed|can i proceed|go ahead)\b/.test(e))return"Yes, continue."}function tI(t){if(t.loopMode==="ralph")return["You are working inside a Ralph Wiggum-style autonomous loop.","","Goal:",t.goal,"","Loop rules:","- Keep making concrete progress toward the goal in this repository.","- An external controller will continue looping until you emit the completion promise or the iteration budget is exhausted.",`- When the goal is truly complete, output this exact marker on its own line: <promise>${t.completionPromise}</promise>`,"- Do not output that completion marker early, approximately, or with altered spelling.","- If you are not done yet, do not emit the completion marker.","- Do not ask to stop or wait for confirmation unless blocked by a real product, architecture, credential, or approval decision.","- Re-run useful local checks before ending each turn.",t.verifierCommands.length>0?"- External verifier commands will also be run after you claim completion.":"- There may not be external verifiers, so your completion promise is the success gate."].join(`
106
106
  `);let e=t.verifierCommands.map(r=>`- ${r.label}: ${r.command}`).join(`
107
107
  `);return["You are working on an autonomous goal-driven task.","","Goal:",t.goal,"","Working rules:","- Make concrete progress toward the goal in this repository.","- An external controller will run these verifier commands after your turn:",e,"- If any verifier fails, you will receive the exact failures and must continue fixing the remaining gaps.","- Do not stop early just because you think the task is probably done.","- Do not ask for confirmation unless you are blocked by a real product, architecture, or credential decision.","- Before ending a turn, run any local checks you think are useful."].join(`
108
108
  `)}function Zf(t){return t.loopMode==="ralph"?["The OpenClaw gateway restarted while this Ralph-style goal task was running.","Resume from the prior session context and continue immediately.","","Goal:",t.goal,"","Instructions:","- Continue from the current repo state and prior session context without restarting from scratch.",`- Only emit <promise>${t.completionPromise}</promise> when the goal is actually complete.`,"- The external controller will keep looping until that marker appears or the iteration budget is exhausted.","- Do not ask for confirmation just because the gateway restarted."].join(`
109
109
  `):["The OpenClaw gateway restarted while this autonomous goal task was running.","Resume from the prior session context and continue toward the same goal immediately.","","Goal:",t.goal,"","Instructions:","- Re-orient yourself from the existing repo state and prior session context.","- Continue the task without restarting from scratch unless the prior approach is clearly invalid.","- The external controller will continue running verifier commands after your turns.","- Do not ask for confirmation just because the gateway restarted."].join(`
110
- `)}function rI(t,e){let r=e.steps.filter(o=>!o.ok).map(o=>[`- ${o.label} failed (exit ${o.exitCode})`,pr(o.output,18)].join(`
110
+ `)}function rI(t,e){let r=e.steps.filter(o=>!o.ok).map(o=>[`- ${o.label} failed (exit ${o.exitCode})`,ur(o.output,18)].join(`
111
111
  `)).join(`
112
112
 
113
113
  `);return["The external verifier did not pass.",t.repeatedFailureCount>=2?"The same verifier fingerprint has repeated. Use a different debugging strategy than your previous attempt.":"Fix only the remaining issues from the verifier output below.","","Goal:",t.goal,"","Verifier failures:",r,"","Instructions:","- Continue from the current code state and prior session context.","- Make the minimum necessary changes to satisfy the remaining verifier failures.","- Re-run relevant checks yourself before ending the turn.","- Do not ask for confirmation unless you are truly blocked on a human decision."].join(`
114
- `)}function nI(t,e){let r=pr(e,18)||"(no meaningful output)",n=t.repeatedFailureCount>=2?"The loop has repeated without converging. Use a different strategy than the previous attempt.":"Continue from the current repo state and prior session context.";return["Continue the same Ralph-style goal task.","","Goal:",t.goal,"","Status:",`- The last turn ended without the completion promise <promise>${t.completionPromise}</promise>.`,`- Current iteration: ${t.iteration}/${t.maxIterations}.`,`- ${n}`,"","Latest output / blockers:",r,"","Instructions:","- Keep working until the goal is actually complete.",`- Only emit <promise>${t.completionPromise}</promise> when all requested work is done.`,"- If you are not done, do not emit the completion promise.",t.verifierCommands.length>0?"- If you believe you are done, make sure the expected verifiers are likely to pass before emitting the completion promise.":"- There may not be external verifiers, so your completion promise is the success signal."].join(`
115
- `)}function oI(t,e){let r=e.steps.filter(n=>!n.ok).map(n=>[`- ${n.label} failed (exit ${n.exitCode})`,pr(n.output,18)].join(`
114
+ `)}function nI(t,e){let r=ur(e,18)||"(no meaningful output)",n=t.repeatedFailureCount>=2?"The loop has repeated without converging. Use a different strategy than the previous attempt.":"Continue from the current repo state and prior session context.";return["Continue the same Ralph-style goal task.","","Goal:",t.goal,"","Status:",`- The last turn ended without the completion promise <promise>${t.completionPromise}</promise>.`,`- Current iteration: ${t.iteration}/${t.maxIterations}.`,`- ${n}`,"","Latest output / blockers:",r,"","Instructions:","- Keep working until the goal is actually complete.",`- Only emit <promise>${t.completionPromise}</promise> when all requested work is done.`,"- If you are not done, do not emit the completion promise.",t.verifierCommands.length>0?"- If you believe you are done, make sure the expected verifiers are likely to pass before emitting the completion promise.":"- There may not be external verifiers, so your completion promise is the success signal."].join(`
115
+ `)}function oI(t,e){let r=e.steps.filter(n=>!n.ok).map(n=>[`- ${n.label} failed (exit ${n.exitCode})`,ur(n.output,18)].join(`
116
116
  `)).join(`
117
117
 
118
118
  `);return["You emitted the completion promise, but the external verifiers did not pass.","","Goal:",t.goal,"","Verifier failures:",r,"","Instructions:","- Continue from the current repo state and fix only the remaining gaps.",`- Do not emit <promise>${t.completionPromise}</promise> again until the goal is fully complete and the failing checks are addressed.`,"- Re-run relevant checks yourself before ending the turn."].join(`
119
119
  `)}function iI(t,e){let r=e.trim();if(!r)return!1;let n=new RegExp(`(^|\\n)\\s*${zf(r)}\\s*(\\n|$)`,"i"),o=new RegExp(`<promise>\\s*${zf(r)}\\s*<\\/promise>`,"i");return n.test(t)||o.test(t)}function eg(t){return t.steps.map(e=>`${e.ok?"PASS":"FAIL"} ${e.label} (exit ${e.exitCode}, ${Math.round(e.durationMs)}ms)`).join(`
120
- `)}function Or(t){return t instanceof Error?t.message:String(t)}function sI(t){return t==="succeeded"||t==="failed"||t==="stopped"}function aI(t){return io(t.error?.trim()||"Underlying session failed.",Qd)}function dI(t=process.env){let e={...t};for(let r of Qw)delete e[r];return e}function lI(t,e){return new Promise(r=>{let n=Date.now();jw("bash",["-lc",e.command],{cwd:t,timeout:e.timeoutMs??rg,maxBuffer:1024*1024,env:dI()},(o,i,s)=>{let a=Date.now()-n,d=typeof o?.code=="number"?o.code:o?1:0,l=`${i??""}${s?`
121
- ${s}`:""}`.trim();r({label:e.label,command:e.command,ok:!o,exitCode:d,durationMs:a,output:io(l||"(no output)",Hw)})})})}var ts=class{store;sessionManager;restorePromise=null;inFlight=new Set;observerDisposers=new Map;scheduledEvaluations=new Map;dirtyEvaluations=new Set;dirtyEvaluationSessionIds=new Map;started=!1;constructor(e){this.sessionManager=e,this.store=new Zi}start(){this.started||(this.started=!0,!this.restorePromise&&(this.restorePromise=this.restoreRecoverableTasks().catch(e=>{console.warn(`[GoalController] Failed to restore recoverable tasks: ${Or(e)}`)}).finally(()=>{this.restorePromise=null})))}stop(){this.started=!1,this.clearScheduledEvaluations(),this.detachSessionObservers(),this.captureRecoverableTasks(),this.store.save()}listTasks(){return this.store.list()}getTask(e){return this.store.get(e)}async launchTask(e){let r=e.loopMode??"verifier",n=Jd(e.verifierCommands);if(r==="verifier"&&n.length===0)throw new Error(es());let i={id:vi(8),name:Jw(e.name??e.goal),goal:e.goal.trim(),workdir:e.workdir,status:"waiting_for_session",createdAt:Date.now(),updatedAt:Date.now(),iteration:0,maxIterations:e.maxIterations??Gw,model:e.model,reasoningEffort:e.reasoningEffort,systemPrompt:e.systemPrompt,allowedTools:e.allowedTools,originChannel:e.originChannel,originThreadId:e.originThreadId,originAgentId:e.originAgentId,originSessionKey:e.originSessionKey,route:e.route,harness:e.harness,permissionMode:e.permissionMode??"bypassPermissions",loopMode:r,completionPromise:Qf(e.completionPromise),verifierCommands:n,repeatedFailureCount:0},s=await this.spawnTaskSession(i,tI(i));return this.attachSessionObservers(i,s),i.sessionId=s.id,i.sessionName=s.name,i.harnessSessionId=s.harnessSessionId,i.status="running",i.updatedAt=Date.now(),this.store.upsert(i),this.scheduleTaskEvaluation(i.id,"launch",s.id),this.notify(i,`\u{1F3AF} [${i.name}] Goal task started
120
+ `)}function Er(t){return t instanceof Error?t.message:String(t)}function sI(t){return t==="succeeded"||t==="failed"||t==="stopped"}function aI(t){return io(t.error?.trim()||"Underlying session failed.",Qd)}function dI(t=process.env){let e={...t};for(let r of Qw)delete e[r];return e}function lI(t,e){return new Promise(r=>{let n=Date.now();jw("bash",["-lc",e.command],{cwd:t,timeout:e.timeoutMs??rg,maxBuffer:1024*1024,env:dI()},(o,i,s)=>{let a=Date.now()-n,d=typeof o?.code=="number"?o.code:o?1:0,l=`${i??""}${s?`
121
+ ${s}`:""}`.trim();r({label:e.label,command:e.command,ok:!o,exitCode:d,durationMs:a,output:io(l||"(no output)",Hw)})})})}var ts=class{store;sessionManager;restorePromise=null;inFlight=new Set;observerDisposers=new Map;scheduledEvaluations=new Map;dirtyEvaluations=new Set;dirtyEvaluationSessionIds=new Map;started=!1;constructor(e){this.sessionManager=e,this.store=new Zi}start(){this.started||(this.started=!0,!this.restorePromise&&(this.restorePromise=this.restoreRecoverableTasks().catch(e=>{console.warn(`[GoalController] Failed to restore recoverable tasks: ${Er(e)}`)}).finally(()=>{this.restorePromise=null})))}stop(){this.started=!1,this.clearScheduledEvaluations(),this.detachSessionObservers(),this.captureRecoverableTasks(),this.store.save()}listTasks(){return this.store.list()}getTask(e){return this.store.get(e)}async launchTask(e){let r=e.loopMode??"verifier",n=Jd(e.verifierCommands);if(r==="verifier"&&n.length===0)throw new Error(es());let i={id:vi(8),name:Jw(e.name??e.goal),goal:e.goal.trim(),workdir:e.workdir,status:"waiting_for_session",createdAt:Date.now(),updatedAt:Date.now(),iteration:0,maxIterations:e.maxIterations??Gw,model:e.model,reasoningEffort:e.reasoningEffort,systemPrompt:e.systemPrompt,allowedTools:e.allowedTools,originChannel:e.originChannel,originThreadId:e.originThreadId,originAgentId:e.originAgentId,originSessionKey:e.originSessionKey,route:e.route,harness:e.harness,permissionMode:e.permissionMode??"bypassPermissions",loopMode:r,completionPromise:Qf(e.completionPromise),verifierCommands:n,repeatedFailureCount:0},s=await this.spawnTaskSession(i,tI(i));return this.attachSessionObservers(i,s),i.sessionId=s.id,i.sessionName=s.name,i.harnessSessionId=s.harnessSessionId,i.status="running",i.updatedAt=Date.now(),this.store.upsert(i),this.scheduleTaskEvaluation(i.id,"launch",s.id),this.notify(i,`\u{1F3AF} [${i.name}] Goal task started
122
122
 
123
123
  Goal:
124
- ${io(i.goal,500)}`,"goal-task-started"),i}stopTask(e){let r=this.store.get(e);if(r)return sI(r.status)?{task:r,action:"already_terminal"}:(r.sessionId&&this.sessionManager.kill(r.sessionId,"user"),this.markTaskStopped(r,"Stopped by user."),{task:r,action:"stopped"})}async spawnTaskSession(e,r){return this.spawnManagedTaskSession(e,r)}async spawnManagedTaskSession(e,r,n){let o=n?this.sessionManager.resolveHarnessSessionId(n)??n:void 0,i=n?this.sessionManager.resolve(n):void 0,s=o?this.sessionManager.getPersistedSession(o)??this.sessionManager.getPersistedSession(n??o):void 0,{resumeSessionId:a}=rn({requestedResumeSessionId:o,activeSession:i?{harnessSessionId:i.harnessSessionId}:void 0,persistedSession:s?{harness:s.harness,backendRef:s.backendRef}:void 0}),d={prompt:r,name:e.name,workdir:e.workdir,model:e.model,reasoningEffort:e.reasoningEffort,systemPrompt:e.systemPrompt,allowedTools:e.allowedTools,originChannel:e.originChannel,originThreadId:e.originThreadId,originAgentId:e.originAgentId,originSessionKey:e.originSessionKey,route:Yw(e),permissionMode:e.permissionMode,multiTurn:!0,goalTaskId:e.id,harness:e.harness,resumeSessionId:a,resumeWorktreeFrom:o,worktreeStrategy:"off"};return this.sessionManager.spawnAndAwaitRunning(d,{notifyLaunch:!1})}async resumeTaskSession(e,r,n){if(!n.harnessSessionId){let i=await this.spawnTaskSession(e,["The previous session ended without a resumable harness session id.","Continue working on the same goal.","",r].join(`
125
- `));return this.attachSessionObservers(e,i),i}let o=await this.spawnManagedTaskSession(e,r,n.harnessSessionId);return this.attachSessionObservers(e,o),o}resolveResumeSessionId(e){if(e.harnessSessionId)return e.harnessSessionId;if(e.sessionId){let n=this.sessionManager.resolveHarnessSessionId(e.sessionId);if(n)return n}let r=this.sessionManager.resolveHarnessSessionId(e.name);if(r)return r}captureRecoverableTasks(){for(let e of this.store.list()){if(e.status!=="running"&&e.status!=="waiting_for_session")continue;let r=e.sessionId?this.sessionManager.resolve(e.sessionId):void 0;r&&(e.sessionId=r.id,e.sessionName=r.name,e.harnessSessionId=r.harnessSessionId??e.harnessSessionId,e.route=r.route??e.route,e.updatedAt=Date.now(),e.status="waiting_for_session",this.store.upsert(e))}}async restoreRecoverableTasks(){for(let e of this.store.list()){if(!this.started)break;if(e.status==="waiting_for_user"){this.markTaskFailed(e,"Goal task was waiting for user input and cannot continue autonomously");continue}if(e.status!=="waiting_for_session"&&e.status!=="running")continue;if(Jf(e)){this.markTaskFailed(e,es());continue}if(e.sessionId){let n=this.sessionManager.resolve(e.sessionId);if(n&&(n.status==="starting"||n.status==="running"))continue}let r=this.resolveResumeSessionId(e);if(!r){this.markTaskFailed(e,"Goal task could not be resumed after gateway restart because no resumable session id was available.");continue}try{let n=await this.spawnManagedTaskSession(e,Zf(e),r);if(!this.started){e.sessionId=n.id,e.sessionName=n.name,e.harnessSessionId=n.harnessSessionId??r,e.route=n.route??e.route,e.status="waiting_for_session",e.updatedAt=Date.now(),this.store.upsert(e),this.sessionManager.kill(n.id,"shutdown");break}this.attachSessionObservers(e,n),e.sessionId=n.id,e.sessionName=n.name,e.harnessSessionId=n.harnessSessionId??r,e.route=n.route??e.route,e.status="running",e.updatedAt=Date.now(),this.store.upsert(e),this.notifyIterationStatus(e,`\u{1F504} [${e.name}] Goal task resumed after gateway restart`,n),this.scheduleTaskEvaluation(e.id,"restore",n.id)}catch(n){this.markTaskFailed(e,`Failed to resume the goal task after gateway restart: ${Or(n)}`)}}}async runVerifiers(e){let r=Jd(e.verifierCommands);if(r.length===0){let s={status:"fail",steps:[{label:"verifier-config",command:"(none configured)",ok:!1,exitCode:1,durationMs:0,output:es()}],summary:"",fingerprint:""};return s.fingerprint=Yf(s),s.summary=eg(s),s}let n=[];for(let s of r)n.push(await lI(e.workdir,s));let i={status:n.every(s=>s.ok)?"pass":"fail",steps:n,summary:"",fingerprint:""};return i.fingerprint=Yf(i),i.summary=eg(i),i}notify(e,r,n){this.sessionManager.emitGoalTaskUpdate(e,r,n)}notifyIterationStatus(e,r,n){let o=dr(n??(e.sessionId?this.sessionManager.resolve(e.sessionId):void 0)),i=`${r}
124
+ ${io(i.goal,500)}`,"goal-task-started"),i}stopTask(e){let r=this.store.get(e);if(r)return sI(r.status)?{task:r,action:"already_terminal"}:(r.sessionId&&this.sessionManager.kill(r.sessionId,"user"),this.markTaskStopped(r,"Stopped by user."),{task:r,action:"stopped"})}async spawnTaskSession(e,r){return this.spawnManagedTaskSession(e,r)}async spawnManagedTaskSession(e,r,n){let o=n?this.sessionManager.resolveHarnessSessionId(n)??n:void 0,i=n?this.sessionManager.resolve(n):void 0,s=o?this.sessionManager.getPersistedSession(o)??this.sessionManager.getPersistedSession(n??o):void 0,{resumeSessionId:a}=tn({requestedResumeSessionId:o,activeSession:i?{harnessSessionId:i.harnessSessionId}:void 0,persistedSession:s?{harness:s.harness,backendRef:s.backendRef}:void 0}),d={prompt:r,name:e.name,workdir:e.workdir,model:e.model,reasoningEffort:e.reasoningEffort,systemPrompt:e.systemPrompt,allowedTools:e.allowedTools,originChannel:e.originChannel,originThreadId:e.originThreadId,originAgentId:e.originAgentId,originSessionKey:e.originSessionKey,route:Yw(e),permissionMode:e.permissionMode,multiTurn:!0,goalTaskId:e.id,harness:e.harness,resumeSessionId:a,resumeWorktreeFrom:o,worktreeStrategy:"off"};return this.sessionManager.spawnAndAwaitRunning(d,{notifyLaunch:!1})}async resumeTaskSession(e,r,n){if(!n.harnessSessionId){let i=await this.spawnTaskSession(e,["The previous session ended without a resumable harness session id.","Continue working on the same goal.","",r].join(`
125
+ `));return this.attachSessionObservers(e,i),i}let o=await this.spawnManagedTaskSession(e,r,n.harnessSessionId);return this.attachSessionObservers(e,o),o}resolveResumeSessionId(e){if(e.harnessSessionId)return e.harnessSessionId;if(e.sessionId){let n=this.sessionManager.resolveHarnessSessionId(e.sessionId);if(n)return n}let r=this.sessionManager.resolveHarnessSessionId(e.name);if(r)return r}captureRecoverableTasks(){for(let e of this.store.list()){if(e.status!=="running"&&e.status!=="waiting_for_session")continue;let r=e.sessionId?this.sessionManager.resolve(e.sessionId):void 0;r&&(e.sessionId=r.id,e.sessionName=r.name,e.harnessSessionId=r.harnessSessionId??e.harnessSessionId,e.route=r.route??e.route,e.updatedAt=Date.now(),e.status="waiting_for_session",this.store.upsert(e))}}async restoreRecoverableTasks(){for(let e of this.store.list()){if(!this.started)break;if(e.status==="waiting_for_user"){this.markTaskFailed(e,"Goal task was waiting for user input and cannot continue autonomously");continue}if(e.status!=="waiting_for_session"&&e.status!=="running")continue;if(Jf(e)){this.markTaskFailed(e,es());continue}if(e.sessionId){let n=this.sessionManager.resolve(e.sessionId);if(n&&(n.status==="starting"||n.status==="running"))continue}let r=this.resolveResumeSessionId(e);if(!r){this.markTaskFailed(e,"Goal task could not be resumed after gateway restart because no resumable session id was available.");continue}try{let n=await this.spawnManagedTaskSession(e,Zf(e),r);if(!this.started){e.sessionId=n.id,e.sessionName=n.name,e.harnessSessionId=n.harnessSessionId??r,e.route=n.route??e.route,e.status="waiting_for_session",e.updatedAt=Date.now(),this.store.upsert(e),this.sessionManager.kill(n.id,"shutdown");break}this.attachSessionObservers(e,n),e.sessionId=n.id,e.sessionName=n.name,e.harnessSessionId=n.harnessSessionId??r,e.route=n.route??e.route,e.status="running",e.updatedAt=Date.now(),this.store.upsert(e),this.notifyIterationStatus(e,`\u{1F504} [${e.name}] Goal task resumed after gateway restart`,n),this.scheduleTaskEvaluation(e.id,"restore",n.id)}catch(n){this.markTaskFailed(e,`Failed to resume the goal task after gateway restart: ${Er(n)}`)}}}async runVerifiers(e){let r=Jd(e.verifierCommands);if(r.length===0){let s={status:"fail",steps:[{label:"verifier-config",command:"(none configured)",ok:!1,exitCode:1,durationMs:0,output:es()}],summary:"",fingerprint:""};return s.fingerprint=Yf(s),s.summary=eg(s),s}let n=[];for(let s of r)n.push(await lI(e.workdir,s));let i={status:n.every(s=>s.ok)?"pass":"fail",steps:n,summary:"",fingerprint:""};return i.fingerprint=Yf(i),i.summary=eg(i),i}notify(e,r,n){this.sessionManager.emitGoalTaskUpdate(e,r,n)}notifyIterationStatus(e,r,n){let o=dr(n??(e.sessionId?this.sessionManager.resolve(e.sessionId):void 0)),i=`${r}
126
126
 
127
- ${lr(e,o)}`;this.notify(e,i,"goal-task-progress")}setTaskRunningWithSession(e,r){e.sessionId=r.id,e.sessionName=r.name,e.harnessSessionId=r.harnessSessionId,e.route=r.route??e.route,e.status="running",e.waitingForUserReason=void 0,e.updatedAt=Date.now(),this.store.upsert(e)}attachSessionObservers(e,r){if(this.observerDisposers.has(r.id))return;let n=(i,s)=>{(s==="completed"||s==="failed"||s==="killed")&&(this.removeSessionObserver(r.id),this.scheduleTaskEvaluation(e.id,`status:${s}`,r.id))},o=()=>{let i=this.store.get(e.id);i&&(i.sessionId=r.id,i.sessionName=r.name,i.harnessSessionId=r.harnessSessionId,i.route=r.route??i.route,i.updatedAt=Date.now(),i.status==="waiting_for_session"&&(i.status="running"),this.store.upsert(i),this.notifyIterationStatus(i,`\u{1F504} [${i.name}] Coding turn complete`,r),this.scheduleTaskEvaluation(e.id,"turnEnd",r.id))};r.on("statusChange",n),r.on("turnEnd",o),this.observerDisposers.set(r.id,()=>{r.off?.("statusChange",n),r.off?.("turnEnd",o),r.removeListener?.("statusChange",n),r.removeListener?.("turnEnd",o)})}scheduleTaskEvaluation(e,r,n){if(!this.started)return;let o=this.scheduledEvaluations.get(e);if(o){!o.sessionId&&n&&(o.sessionId=n);return}let i={timer:setTimeout(()=>{this.scheduledEvaluations.delete(e),this.evaluateTask(e,r,i.sessionId).catch(s=>{console.warn(`[GoalController] evaluateTask error (${r}): ${Or(s)}`)})},0),sessionId:n};i.timer.unref?.(),this.scheduledEvaluations.set(e,i)}clearScheduledEvaluations(){for(let e of this.scheduledEvaluations.values())clearTimeout(e.timer);this.scheduledEvaluations.clear(),this.dirtyEvaluations.clear(),this.dirtyEvaluationSessionIds.clear()}detachSessionObservers(){for(let e of[...this.observerDisposers.keys()])this.removeSessionObserver(e)}removeSessionObserver(e){let r=this.observerDisposers.get(e);r&&(this.observerDisposers.delete(e),r())}markTaskFailed(e,r){e.status="failed",e.failureReason=io(r,Qd),e.updatedAt=Date.now(),this.store.upsert(e),this.notify(e,`\u274C [${e.name}] Goal task failed
127
+ ${lr(e,o)}`;this.notify(e,i,"goal-task-progress")}setTaskRunningWithSession(e,r){e.sessionId=r.id,e.sessionName=r.name,e.harnessSessionId=r.harnessSessionId,e.route=r.route??e.route,e.status="running",e.waitingForUserReason=void 0,e.updatedAt=Date.now(),this.store.upsert(e)}attachSessionObservers(e,r){if(this.observerDisposers.has(r.id))return;let n=(i,s)=>{(s==="completed"||s==="failed"||s==="killed")&&(this.removeSessionObserver(r.id),this.scheduleTaskEvaluation(e.id,`status:${s}`,r.id))},o=()=>{let i=this.store.get(e.id);i&&(i.sessionId=r.id,i.sessionName=r.name,i.harnessSessionId=r.harnessSessionId,i.route=r.route??i.route,i.updatedAt=Date.now(),i.status==="waiting_for_session"&&(i.status="running"),this.store.upsert(i),this.notifyIterationStatus(i,`\u{1F504} [${i.name}] Coding turn complete`,r),this.scheduleTaskEvaluation(e.id,"turnEnd",r.id))};r.on("statusChange",n),r.on("turnEnd",o),this.observerDisposers.set(r.id,()=>{r.off?.("statusChange",n),r.off?.("turnEnd",o),r.removeListener?.("statusChange",n),r.removeListener?.("turnEnd",o)})}scheduleTaskEvaluation(e,r,n){if(!this.started)return;let o=this.scheduledEvaluations.get(e);if(o){!o.sessionId&&n&&(o.sessionId=n);return}let i={timer:setTimeout(()=>{this.scheduledEvaluations.delete(e),this.evaluateTask(e,r,i.sessionId).catch(s=>{console.warn(`[GoalController] evaluateTask error (${r}): ${Er(s)}`)})},0),sessionId:n};i.timer.unref?.(),this.scheduledEvaluations.set(e,i)}clearScheduledEvaluations(){for(let e of this.scheduledEvaluations.values())clearTimeout(e.timer);this.scheduledEvaluations.clear(),this.dirtyEvaluations.clear(),this.dirtyEvaluationSessionIds.clear()}detachSessionObservers(){for(let e of[...this.observerDisposers.keys()])this.removeSessionObserver(e)}removeSessionObserver(e){let r=this.observerDisposers.get(e);r&&(this.observerDisposers.delete(e),r())}markTaskFailed(e,r){e.status="failed",e.failureReason=io(r,Qd),e.updatedAt=Date.now(),this.store.upsert(e),this.notify(e,`\u274C [${e.name}] Goal task failed
128
128
 
129
129
  ${e.failureReason}`,"goal-task-failed")}markTaskFailedWaitingForUser(e,r){this.markTaskFailed(e,`Goal task was waiting for user input and cannot continue autonomously: ${r}`)}markTaskSucceeded(e,r){e.status="succeeded",e.lastVerifierSummary=r,e.updatedAt=Date.now(),this.store.upsert(e),this.notify(e,`\u2705 [${e.name}] Goal task succeeded
130
130
 
131
131
  ${r}`,"goal-task-succeeded")}markTaskStopped(e,r){e.status="stopped",e.failureReason=io(r,Qd),e.updatedAt=Date.now(),this.store.upsert(e),this.notify(e,`\u26D4 [${e.name}] Goal task stopped
132
132
 
133
133
  ${e.failureReason}`,"goal-task-stopped")}async handleRunningSession(e,r){if(r.pendingPlanApproval){let s=await xt(this.sessionManager,{session:r.id,message:"Approved. Implement the plan.",approve:!0,userInitiated:!1});s.isError&&this.markTaskFailed(e,s.text);return}if(!r.pendingInputState){this.setTaskRunningWithSession(e,r);return}let n=r.getOutput(30).join(`
134
- `),o=Xf(n);if(!o){this.markTaskFailedWaitingForUser(e,pr(n,24)||"The session is waiting for user input.");return}let i=await xt(this.sessionManager,{session:r.id,message:o,userInitiated:!1});if(i.isError||i.text.includes("Auto-respond limit reached")){this.markTaskFailedWaitingForUser(e,i.text);return}e.status="running",e.waitingForUserReason=void 0,e.updatedAt=Date.now(),this.store.upsert(e)}async resumeAfterIdleTimeout(e,r,n){try{let o=await this.resumeTaskSession(e,n,r);this.setTaskRunningWithSession(e,o),this.notifyIterationStatus(e,`\u{1F504} [${e.name}] Goal task resumed after idle timeout`,o),this.scheduleTaskEvaluation(e.id,"idle-timeout-resume",o.id)}catch(o){this.markTaskFailed(e,`Failed to resume the goal task after idle timeout: ${Or(o)}`)}}async handleTerminalSession(e,r){if(r.status==="failed"){this.markTaskFailed(e,aI(r));return}if(r.status==="killed"&&r.killReason==="user"){this.markTaskStopped(e,"Stopped by user.");return}if(r.status==="killed"&&r.killReason==="idle-timeout"){let i=r.getOutput(60).join(`
135
- `);if(r.pendingPlanApproval){let s=await xt(this.sessionManager,{session:r.id,message:"Approved. Implement the plan.",approve:!0,userInitiated:!1});if(s.isError){this.markTaskFailed(e,s.text);return}let a=this.sessionManager.resolve(r.id);if(!a){this.markTaskFailed(e,"Failed to resolve the resumed goal task session after idle timeout plan approval.");return}this.attachSessionObservers(e,a),this.setTaskRunningWithSession(e,a),this.notifyIterationStatus(e,`\u{1F504} [${e.name}] Goal task resumed after idle timeout`,a),this.scheduleTaskEvaluation(e.id,"idle-timeout-plan-resume",a.id);return}if(r.pendingInputState){let s=Xf(i);if(!s){this.markTaskFailed(e,`Goal task was waiting for user input and cannot continue autonomously: ${pr(i,24)||"The goal task hit idle timeout while waiting for user input."}`);return}await this.resumeAfterIdleTimeout(e,r,["The previous session hit idle timeout while waiting for a response.",`Use this response and continue the goal: ${s}`].join(`
134
+ `),o=Xf(n);if(!o){this.markTaskFailedWaitingForUser(e,ur(n,24)||"The session is waiting for user input.");return}let i=await xt(this.sessionManager,{session:r.id,message:o,userInitiated:!1});if(i.isError||i.text.includes("Auto-respond limit reached")){this.markTaskFailedWaitingForUser(e,i.text);return}e.status="running",e.waitingForUserReason=void 0,e.updatedAt=Date.now(),this.store.upsert(e)}async resumeAfterIdleTimeout(e,r,n){try{let o=await this.resumeTaskSession(e,n,r);this.setTaskRunningWithSession(e,o),this.notifyIterationStatus(e,`\u{1F504} [${e.name}] Goal task resumed after idle timeout`,o),this.scheduleTaskEvaluation(e.id,"idle-timeout-resume",o.id)}catch(o){this.markTaskFailed(e,`Failed to resume the goal task after idle timeout: ${Er(o)}`)}}async handleTerminalSession(e,r){if(r.status==="failed"){this.markTaskFailed(e,aI(r));return}if(r.status==="killed"&&r.killReason==="user"){this.markTaskStopped(e,"Stopped by user.");return}if(r.status==="killed"&&r.killReason==="idle-timeout"){let i=r.getOutput(60).join(`
135
+ `);if(r.pendingPlanApproval){let s=await xt(this.sessionManager,{session:r.id,message:"Approved. Implement the plan.",approve:!0,userInitiated:!1});if(s.isError){this.markTaskFailed(e,s.text);return}let a=this.sessionManager.resolve(r.id);if(!a){this.markTaskFailed(e,"Failed to resolve the resumed goal task session after idle timeout plan approval.");return}this.attachSessionObservers(e,a),this.setTaskRunningWithSession(e,a),this.notifyIterationStatus(e,`\u{1F504} [${e.name}] Goal task resumed after idle timeout`,a),this.scheduleTaskEvaluation(e.id,"idle-timeout-plan-resume",a.id);return}if(r.pendingInputState){let s=Xf(i);if(!s){this.markTaskFailed(e,`Goal task was waiting for user input and cannot continue autonomously: ${ur(i,24)||"The goal task hit idle timeout while waiting for user input."}`);return}await this.resumeAfterIdleTimeout(e,r,["The previous session hit idle timeout while waiting for a response.",`Use this response and continue the goal: ${s}`].join(`
136
136
 
137
137
  `));return}await this.resumeAfterIdleTimeout(e,r,Zf(e));return}if(r.status==="killed"&&r.killReason!=="done"){this.markTaskFailed(e,`Underlying session was killed (${r.killReason}).`);return}if(e.loopMode==="ralph"){let i=r.getOutput(200).join(`
138
138
  `),s=Qf(e.completionPromise);if(iI(i,s)){if(e.verifierCommands.length===0){this.markTaskSucceeded(e,`Completion promise "${s}" detected in agent output.`);return}let m=await this.runVerifiers(e);if(e.lastVerifierSummary=m.summary,e.updatedAt=Date.now(),m.status==="pass"){this.markTaskSucceeded(e,[`Completion promise "${s}" detected.`,m.summary].join(`
139
139
  `));return}if(e.lastVerifierFingerprint===m.fingerprint?e.repeatedFailureCount+=1:e.repeatedFailureCount=1,e.lastVerifierFingerprint=m.fingerprint,e.iteration+1>=e.maxIterations){this.markTaskFailed(e,[`Goal task emitted completion promise but verifiers still failed before hitting the iteration budget (${e.maxIterations}).`,m.summary].join(`
140
- `));return}e.iteration+=1;let g=oI(e,m);try{let y=await this.resumeTaskSession(e,g,r);this.setTaskRunningWithSession(e,y),this.notifyIterationStatus(e,`\u{1F501} [${e.name}] Completion claimed but verifiers still failed`),this.scheduleTaskEvaluation(e.id,"ralph-verifier-resume",y.id)}catch(y){this.markTaskFailed(e,`Failed to resume the Ralph goal task after verifier failure: ${Or(y)}`)}return}let d=eI(i);if(e.lastVerifierFingerprint===d?e.repeatedFailureCount+=1:e.repeatedFailureCount=1,e.lastVerifierFingerprint=d,e.iteration+1>=e.maxIterations){this.markTaskFailed(e,[`Completion promise "${s}" was not emitted before hitting the iteration budget (${e.maxIterations}).`,"Latest output:",pr(i,20)||"(no output)"].join(`
141
- `));return}e.iteration+=1;let l=nI(e,i);try{let m=await this.resumeTaskSession(e,l,r);this.setTaskRunningWithSession(e,m),this.notifyIterationStatus(e,`\u{1F501} [${e.name}] Ralph iteration continued`),this.scheduleTaskEvaluation(e.id,"ralph-continue",m.id)}catch(m){this.markTaskFailed(e,`Failed to continue the Ralph goal task: ${Or(m)}`)}return}let n=await this.runVerifiers(e);if(e.lastVerifierSummary=n.summary,e.updatedAt=Date.now(),n.status==="pass"){this.markTaskSucceeded(e,n.summary);return}if(e.lastVerifierFingerprint===n.fingerprint?e.repeatedFailureCount+=1:e.repeatedFailureCount=1,e.lastVerifierFingerprint=n.fingerprint,e.iteration+1>=e.maxIterations){this.markTaskFailed(e,[`Verifier did not pass before hitting the iteration budget (${e.maxIterations}).`,n.summary].join(`
142
- `));return}e.iteration+=1;let o=rI(e,n);try{let i=await this.resumeTaskSession(e,o,r);this.setTaskRunningWithSession(e,i),this.notifyIterationStatus(e,`\u{1F501} [${e.name}] Repair iteration started after verifier failure`),this.scheduleTaskEvaluation(e.id,"repair-resume",i.id)}catch(i){this.markTaskFailed(e,`Failed to resume the goal task: ${Or(i)}`)}}async evaluateTask(e,r,n){this.restorePromise&&await this.restorePromise;let o=this.store.get(e);o&&await this.reconcileTask(o,r,n)}async reconcileTask(e,r="manual",n){if(!(e.status==="succeeded"||e.status==="failed"||e.status==="stopped")){if(this.inFlight.has(e.id)){this.dirtyEvaluations.add(e.id),!this.dirtyEvaluationSessionIds.get(e.id)&&n?this.dirtyEvaluationSessionIds.set(e.id,n):this.dirtyEvaluationSessionIds.has(e.id)||this.dirtyEvaluationSessionIds.set(e.id,n);return}this.inFlight.add(e.id);try{if(n&&e.sessionId&&e.sessionId!==n){let i=this.sessionManager.resolve(n);if(i&&(i.status==="completed"||i.status==="failed"||i.status==="killed"))return}let o=n?this.sessionManager.resolve(n)??(e.sessionId?this.sessionManager.resolve(e.sessionId):void 0):e.sessionId?this.sessionManager.resolve(e.sessionId):void 0;if(e.status==="waiting_for_user"){this.markTaskFailed(e,"Goal task was waiting for user input and cannot continue autonomously");return}if(Jf(e)){this.markTaskFailed(e,es());return}if(!o){this.markTaskFailed(e,"Underlying session could not be found.");return}if(e.sessionName=o.name,e.harnessSessionId=o.harnessSessionId,e.route=o.route??e.route,e.updatedAt=Date.now(),this.store.upsert(e),o.status==="starting"||o.status==="running"){await this.handleRunningSession(e,o);return}await this.handleTerminalSession(e,o)}finally{if(this.inFlight.delete(e.id),this.dirtyEvaluations.has(e.id)){this.dirtyEvaluations.delete(e.id);let o=this.dirtyEvaluationSessionIds.get(e.id);this.dirtyEvaluationSessionIds.delete(e.id),this.scheduleTaskEvaluation(e.id,`${r}:dirty`,o)}}}}};Re();import{existsSync as uI,realpathSync as pI}from"fs";import{resolve as cI}from"path";function ng(t){if(!t)return;let e=cI(t);try{if(uI(e))return pI.native(e)}catch{}return e}function rs(t,e){return!t||!e?!1:ng(t)===ng(e)}ke();Re();import{existsSync as mI}from"fs";ke();ut();function og(t){return t instanceof Error?t.message:String(t)}function fI(t){let e=t.worktreeStrategy??_.defaultWorktreeStrategy;return!!e&&e!=="off"&&$d(ki({harnessName:t.harness??Pe(),backendRef:t.backendRef}))}function gI(t,e,r,n){let o=["","You are working in a git worktree.",`Worktree path: ${r}`,`Branch: ${n}`,"",`IMPORTANT: ALL file edits must be made within this worktree at ${r}.`,`Do NOT edit files directly in ${e} (the original workspace).`,`If your task references files by absolute path under ${e}, rewrite those`,"paths relative to your current working directory. For example:",` "${e}/src/file.py" \u2192 use relative path "src/file.py"`,"","Commit all your file changes to this branch before finishing.","Use `git add` and `git commit`. Do NOT run `git checkout`, `git switch`, or `git reset --hard` as these will detach or corrupt the worktree HEAD.","","When making changes, please note:","- Do NOT commit planning documents, investigation notes, or analysis artifacts to this branch","- Only commit actual code, configuration, tests, and documentation changes that were explicitly requested as part of the task"].join(`
143
- `);return(t??"")+o}function hI(t,e){let r=t.resumeSessionId??t.resumeWorktreeFrom;if(!r)return{};let n=e(r);if(!n)return{};let o=(()=>{if(n.workdir&&n.workdir!==n.worktreePath)return n.workdir;if(n.worktreePath){let s=Mi(n.worktreePath);return n.workdir&&s&&rs(n.workdir,s)?n.workdir:s??n.workdir}return n.workdir})();if(!t.worktreeStrategy&&n.worktreeStrategy&&(t.worktreeStrategy=n.worktreeStrategy),!t.planApproval&&n.planApproval&&(t.planApproval=n.planApproval),!n.worktreePath)return{};if(!n.worktreeBranch)throw new Error(`Cannot resume session "${r}": persisted worktree metadata is missing worktreeBranch.`);let i=Bm(ki({persistedHarness:n.harness,backendRef:n.backendRef}))&&!!n.backendRef?.worktreePath;if(mI(n.worktreePath))return console.info(`[SessionManager] Resuming with existing worktree: ${n.worktreePath}`),{actualWorkdir:n.worktreePath,originalWorkdir:o??n.worktreePath,worktreePath:n.worktreePath,worktreeBranchName:n.worktreeBranch};if(!o)return console.warn(`[SessionManager] Worktree ${n.worktreePath} no longer exists and cannot be recreated, using original workdir`),{clearedResumeSessionId:!!t.resumeSessionId,clearedResumeWorktreeFrom:!!t.resumeWorktreeFrom};if(i)return console.info(`[SessionManager] Native Codex worktree ${n.worktreePath} is missing; resuming from original workdir and letting the backend restore thread state.`),{actualWorkdir:o,originalWorkdir:o,worktreeBranchName:n.worktreeBranch,clearedResumeWorktreeFrom:!!t.resumeWorktreeFrom};try{_i(o);let s=Ld(o,n.worktreeBranch.replace(/^agent\//,""),{allowExistingBranch:!0});return console.info(`[SessionManager] Recreated worktree from branch ${n.worktreeBranch}: ${s}`),{actualWorkdir:s,originalWorkdir:o,worktreePath:s,worktreeBranchName:n.worktreeBranch}}catch(s){return console.warn(`[SessionManager] Failed to recreate worktree for resume: ${og(s)}, using original workdir`),{actualWorkdir:o,originalWorkdir:o,clearedResumeSessionId:!!t.resumeSessionId,clearedResumeWorktreeFrom:!!t.resumeWorktreeFrom}}}function ig(t,e,r){let{actualWorkdir:n,originalWorkdir:o,worktreePath:i,worktreeBranchName:s,clearedResumeSessionId:a,clearedResumeWorktreeFrom:d}=hI(t,r);a&&(t.resumeSessionId=void 0),d&&(t.resumeWorktreeFrom=void 0),n??=t.workdir,o??=t.workdir;let l=!!(t.resumeSessionId??t.resumeWorktreeFrom),m=t.worktreeStrategy??_.defaultWorktreeStrategy;m&&(t.worktreeStrategy=m);let g=fI(t),y=!t.resumeSessionId&&!i&&m&&m!=="off"&&!g;if(g&&!Dd(o))throw new Error(`Cannot launch session "${e}": worktree strategy "${m}" requires a git worktree, but "${o}" is not a git repository.`);if(y&&Dd(o)){if(!nf(o))throw new Error(`Cannot launch session "${e}": insufficient space for worktree creation.`);try{if(i=Ld(o,e),n=i,s=Ci(i),!s)throw new Error(`created worktree at ${i} but failed to resolve branch name`);console.log(`[SessionManager] Created worktree at ${i}`)}catch(f){throw new Error(`Cannot launch session "${e}": worktree creation failed: ${og(f)}`)}}else if(y)throw new Error(`Cannot launch session "${e}": worktree strategy "${m}" requires a git worktree, but "${o}" is not a git repository.`);return l&&i&&(n=i),{actualWorkdir:n,originalWorkdir:o,effectiveSystemPrompt:i&&s?gI(t.systemPrompt,o,i,s):t.systemPrompt,worktreePath:i,worktreeBranchName:s,clearedResumeSessionId:a,clearedResumeWorktreeFrom:d}}var ns=class{constructor(e){this.getPersistedSession=e}getPersistedSession;prepareSpawn(e,r){return ig(e,r,this.getPersistedSession)}hydrateSpawnedSession(e,r,n){n.worktreeStrategy&&n.worktreeStrategy!=="off"&&(e.originalWorkdir=r.originalWorkdir),r.worktreePath&&(e.worktreePath=r.worktreePath,e.worktreeBranch=r.worktreeBranchName,e.worktreeState="provisioned"),n.worktreePrTargetRepo&&(e.worktreePrTargetRepo=n.worktreePrTargetRepo)}};ke();var os=class{constructor(e){this.deps=e}deps;applySessionPatch(e,r){let n=this.deps.store.getPersistedSession(e);n&&(Object.assign(n,r),this.deps.store.assertPersistedEntry(n));let o=this.findActiveSessionForRef(e,n);return o&&this.applyPatchToActiveSession(o,r),!n&&!o?!1:(n&&this.deps.store.saveIndex(),!0)}matchesExistingSession(e,r){if(!r)return!1;let n=$(e),o=$(r);return!!(r.sessionId&&e.id===r.sessionId||o&&o===n||r?.harnessSessionId&&e.harnessSessionId===r.harnessSessionId||r?.name&&e.name===r.name)}findActiveSessionForRef(e,r){let n=this.deps.resolveSession(e);if(n)return n;for(let o of this.deps.sessions.values())if(re(o)===e||$(o)===e||o.harnessSessionId===e||this.matchesExistingSession(o,r))return o}applyPatchToActiveSession(e,r){this.applyControlStatePatch(e,r),this.applySessionMetadataPatch(e,r),this.applyWorktreeMetadataPatch(e,r)}applyControlStatePatch(e,r){let n={lifecycle:r.lifecycle,approvalState:r.approvalState,worktreeState:r.worktreeState,runtimeState:r.runtimeState,deliveryState:r.deliveryState,pendingPlanApproval:r.pendingPlanApproval,planApprovalContext:r.planApprovalContext,planDecisionVersion:r.planDecisionVersion,actionablePlanDecisionVersion:r.actionablePlanDecisionVersion,canonicalPlanPromptVersion:r.canonicalPlanPromptVersion,approvalPromptRequiredVersion:r.approvalPromptRequiredVersion,approvalPromptVersion:r.approvalPromptVersion,approvalPromptStatus:r.approvalPromptStatus,approvalPromptTransport:r.approvalPromptTransport,approvalPromptMessageKind:r.approvalPromptMessageKind,approvalPromptLastAttemptAt:r.approvalPromptLastAttemptAt,approvalPromptDeliveredAt:r.approvalPromptDeliveredAt,approvalPromptFailedAt:r.approvalPromptFailedAt,pendingWorktreeDecisionSince:r.pendingWorktreeDecisionSince};if(typeof e.applyControlPatch=="function"){e.applyControlPatch(n);return}this.assignIfDefined(e,"lifecycle",r.lifecycle),this.assignIfDefined(e,"approvalState",r.approvalState),this.assignIfDefined(e,"worktreeState",r.worktreeState),this.assignIfDefined(e,"runtimeState",r.runtimeState),this.assignIfDefined(e,"deliveryState",r.deliveryState),this.assignIfDefined(e,"pendingPlanApproval",r.pendingPlanApproval),this.assignIfDefined(e,"planApprovalContext",r.planApprovalContext),this.assignIfDefined(e,"planDecisionVersion",r.planDecisionVersion),this.assignIfDefined(e,"actionablePlanDecisionVersion",r.actionablePlanDecisionVersion),this.assignIfDefined(e,"canonicalPlanPromptVersion",r.canonicalPlanPromptVersion),this.assignIfDefined(e,"approvalPromptRequiredVersion",r.approvalPromptRequiredVersion),this.assignIfDefined(e,"approvalPromptVersion",r.approvalPromptVersion),this.assignIfDefined(e,"approvalPromptStatus",r.approvalPromptStatus),this.assignIfDefined(e,"approvalPromptTransport",r.approvalPromptTransport),this.assignIfDefined(e,"approvalPromptMessageKind",r.approvalPromptMessageKind),this.assignIfDefined(e,"approvalPromptLastAttemptAt",r.approvalPromptLastAttemptAt),this.assignIfDefined(e,"approvalPromptDeliveredAt",r.approvalPromptDeliveredAt),this.assignIfDefined(e,"approvalPromptFailedAt",r.approvalPromptFailedAt)}applySessionMetadataPatch(e,r){this.assignIfDefined(e,"approvalRationale",r.approvalRationale)}applyWorktreeMetadataPatch(e,r){this.assignIfDefined(e,"worktreePath",r.worktreePath),this.assignIfDefined(e,"worktreeBranch",r.worktreeBranch),this.assignIfDefined(e,"worktreePrUrl",r.worktreePrUrl),this.assignIfDefined(e,"worktreePrNumber",r.worktreePrNumber),this.assignIfDefined(e,"worktreeMerged",r.worktreeMerged),this.assignIfDefined(e,"worktreeMergedAt",r.worktreeMergedAt),this.assignIfDefined(e,"worktreeDisposition",r.worktreeDisposition),this.assignIfDefined(e,"worktreePrTargetRepo",r.worktreePrTargetRepo),this.assignIfDefined(e,"worktreePushRemote",r.worktreePushRemote),this.assignIfDefined(e,"worktreeLifecycle",r.worktreeLifecycle),"autoMergeParentSessionId"in r&&(e.autoMergeParentSessionId=r.autoMergeParentSessionId),"autoMergeConflictResolutionAttemptCount"in r&&(e.autoMergeConflictResolutionAttemptCount=r.autoMergeConflictResolutionAttemptCount),"autoMergeResolverSessionId"in r&&(e.autoMergeResolverSessionId=r.autoMergeResolverSessionId)}assignIfDefined(e,r,n){n!==void 0&&(e[r]=n)}};ke();var SI=new Set(["starting","running"]),is=class{constructor(e,r){this.sessions=e;this.store=r}sessions;store;resolveActive(e){let r=this.sessions.get(e);return r||(this.findPreferredMatch(e,n=>n.name===e)??this.findPreferredMatch(e,n=>$(n)===e)??this.findPreferredMatch(e,n=>n.harnessSessionId===e))}getPersistedSession(e){return this.store.getPersistedSession(e)}resolveBackendConversationId(e){let r=this.resolveActive(e);return this.store.resolveBackendConversationId(e,r?$(r)??r.harnessSessionId:void 0)}findPreferredMatch(e,r){let n,o;for(let i of this.sessions.values())r(i,e)&&((!o||i.startedAt>o.startedAt)&&(o=i),SI.has(i.status)&&(!n||i.startedAt>n.startedAt)&&(n=i));return n??o}};ke();ke();ut();var ss=class{constructor(e){this.deps=e}deps;async plan(e){let r=re(e)??e.harnessSessionId;if(this.deps.isAlreadyMerged(r))return console.info(`[SessionManager] handleWorktreeStrategy: session "${e.name}" already merged \u2014 skipping strategy handling`),{kind:"skip",result:{notificationSent:!0,worktreeRemoved:!1}};if(e.status!=="completed")return{kind:"skip",result:{notificationSent:!1,worktreeRemoved:!1}};if(!this.deps.shouldRunWorktreeStrategy(e))return console.info(`[SessionManager] handleWorktreeStrategy: skipping \u2014 session "${e.name}" is in phase "${e.phase}"`),{kind:"skip",result:{notificationSent:!1,worktreeRemoved:!1}};let n=e.worktreeStrategy;if(!n||n==="off"||n==="manual")return{kind:"skip",result:{notificationSent:!1,worktreeRemoved:!1}};let o=e.worktreePath,i=this.deps.resolveWorktreeRepoDir(e.originalWorkdir,o),s=e.worktreeBranch;if(!i)return{kind:"notify",label:"worktree-missing-repo-dir",message:`\u26A0\uFE0F [${e.name}] Cannot determine the original repo for worktree ${o}. Manual inspection is required.`};if(!s)return{kind:"notify",label:"worktree-no-branch-name",message:`\u26A0\uFE0F [${e.name}] Cannot determine branch name for worktree ${o}. The worktree may have been removed or is in detached HEAD state. Manual cleanup may be needed.`};let a=e.worktreeBaseBranch??ar(i),d=this.deps.getWorktreeCompletionState(i,o,s,a);if(d==="no-change")return{kind:"no-change",repoDir:i,worktreePath:o,nativeBackendWorktree:Ne(e)};if(d==="base-advanced")return{kind:"notify",label:"worktree-no-commits-ahead",message:`\u26A0\uFE0F [${e.name}] Auto-merge: branch '${s}' has no commits ahead of '${a}', but '${a}' has new commits \u2014 commits likely landed outside the worktree branch. Verify that commits were not made directly to '${a}' instead of the worktree branch. Worktree: ${o}`};if(d==="dirty-uncommitted")return{kind:"notify",label:"worktree-dirty-uncommitted",message:`\u26A0\uFE0F [${e.name}] Session completed with uncommitted changes. The branch has no commits ahead of '${a}' but there are modified tracked files in the worktree. Check: ${o}`};let l=Cr(i,s,a);return l?{kind:"decision",strategy:n,repoDir:i,worktreePath:o,branchName:s,baseBranch:a,diffSummary:l,sessionRef:r??void 0}:(console.warn(`[SessionManager] Failed to get diff summary for ${s}, skipping merge-back`),{kind:"skip",result:{notificationSent:!1,worktreeRemoved:!1}})}};function Yd(t,e){return{...e,baseBranch:e.baseBranch??t.worktreeBaseBranch,targetRepo:e.targetRepo??t.worktreePrTargetRepo,pushRemote:e.pushRemote??t.worktreePushRemote}}function as(t,e={}){let r=e.updatedAt??new Date().toISOString(),n={pendingWorktreeDecisionSince:e.pendingSince??r,lastWorktreeReminderAt:void 0,lifecycle:"awaiting_worktree_decision",worktreeState:"pending_decision",worktreeLifecycle:Yd(t,{state:"pending_decision",updatedAt:r,notes:e.notes})};return e.clearResolverSessionId&&(n.autoMergeResolverSessionId=void 0),n}function sg(t,e,r,n={}){let o=n.updatedAt??new Date().toISOString();return{autoMergeConflictResolutionAttemptCount:r,autoMergeResolverSessionId:e,pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,lifecycle:"terminal",worktreeState:"merge_conflict_resolving",worktreeLifecycle:Yd(t,{state:"merge_conflict_resolving",updatedAt:o,notes:n.notes})}}function ag(t,e={}){let r=e.updatedAt??new Date().toISOString(),n=e.resolvedAt??r,o={worktreeMerged:!0,worktreeMergedAt:e.mergedAt??n,lifecycle:"terminal",worktreeState:"merged",pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeLifecycle:Yd(t,{state:"merged",updatedAt:r,resolvedAt:n,resolutionSource:e.resolutionSource??"agent_merge"})};return e.clearResolverSessionId&&(o.autoMergeResolverSessionId=void 0),o}ut();var ds=class{constructor(e){this.deps=e;this.actions=new ss({shouldRunWorktreeStrategy:e.shouldRunWorktreeStrategy,isAlreadyMerged:e.isAlreadyMerged,resolveWorktreeRepoDir:e.resolveWorktreeRepoDir,getWorktreeCompletionState:e.getWorktreeCompletionState})}deps;actions;buildConflictResolverPrompt(e){return["Resolve the git rebase conflict for the auto-merge worktree and finish the rebase cleanly.","",`Original session: ${e.session.name} [${e.session.id}]`,`Repository root: ${e.repoDir}`,`Conflicted worktree: ${e.worktreePath}`,`Branch: ${e.branchName}`,`Base branch: ${e.baseBranch}`,"","Requirements:","- Work only inside the conflicted worktree.","- Inspect the current rebase state and resolve only the necessary conflict hunks.","- Make only minimal follow-up edits needed to keep the rebased branch correct.","- Continue the rebase until it completes successfully.","- Run relevant local verification before you finish.","- Do not broaden scope or start unrelated refactors.",`- Stop only when the branch is cleanly rebased onto ${e.baseBranch}.`,e.mergeError?"":void 0,e.mergeError?"Rebase failure details:":void 0,e.mergeError].filter(r=>typeof r=="string").join(`
140
+ `));return}e.iteration+=1;let g=oI(e,m);try{let y=await this.resumeTaskSession(e,g,r);this.setTaskRunningWithSession(e,y),this.notifyIterationStatus(e,`\u{1F501} [${e.name}] Completion claimed but verifiers still failed`),this.scheduleTaskEvaluation(e.id,"ralph-verifier-resume",y.id)}catch(y){this.markTaskFailed(e,`Failed to resume the Ralph goal task after verifier failure: ${Er(y)}`)}return}let d=eI(i);if(e.lastVerifierFingerprint===d?e.repeatedFailureCount+=1:e.repeatedFailureCount=1,e.lastVerifierFingerprint=d,e.iteration+1>=e.maxIterations){this.markTaskFailed(e,[`Completion promise "${s}" was not emitted before hitting the iteration budget (${e.maxIterations}).`,"Latest output:",ur(i,20)||"(no output)"].join(`
141
+ `));return}e.iteration+=1;let l=nI(e,i);try{let m=await this.resumeTaskSession(e,l,r);this.setTaskRunningWithSession(e,m),this.notifyIterationStatus(e,`\u{1F501} [${e.name}] Ralph iteration continued`),this.scheduleTaskEvaluation(e.id,"ralph-continue",m.id)}catch(m){this.markTaskFailed(e,`Failed to continue the Ralph goal task: ${Er(m)}`)}return}let n=await this.runVerifiers(e);if(e.lastVerifierSummary=n.summary,e.updatedAt=Date.now(),n.status==="pass"){this.markTaskSucceeded(e,n.summary);return}if(e.lastVerifierFingerprint===n.fingerprint?e.repeatedFailureCount+=1:e.repeatedFailureCount=1,e.lastVerifierFingerprint=n.fingerprint,e.iteration+1>=e.maxIterations){this.markTaskFailed(e,[`Verifier did not pass before hitting the iteration budget (${e.maxIterations}).`,n.summary].join(`
142
+ `));return}e.iteration+=1;let o=rI(e,n);try{let i=await this.resumeTaskSession(e,o,r);this.setTaskRunningWithSession(e,i),this.notifyIterationStatus(e,`\u{1F501} [${e.name}] Repair iteration started after verifier failure`),this.scheduleTaskEvaluation(e.id,"repair-resume",i.id)}catch(i){this.markTaskFailed(e,`Failed to resume the goal task: ${Er(i)}`)}}async evaluateTask(e,r,n){this.restorePromise&&await this.restorePromise;let o=this.store.get(e);o&&await this.reconcileTask(o,r,n)}async reconcileTask(e,r="manual",n){if(!(e.status==="succeeded"||e.status==="failed"||e.status==="stopped")){if(this.inFlight.has(e.id)){this.dirtyEvaluations.add(e.id),!this.dirtyEvaluationSessionIds.get(e.id)&&n?this.dirtyEvaluationSessionIds.set(e.id,n):this.dirtyEvaluationSessionIds.has(e.id)||this.dirtyEvaluationSessionIds.set(e.id,n);return}this.inFlight.add(e.id);try{if(n&&e.sessionId&&e.sessionId!==n){let i=this.sessionManager.resolve(n);if(i&&(i.status==="completed"||i.status==="failed"||i.status==="killed"))return}let o=n?this.sessionManager.resolve(n)??(e.sessionId?this.sessionManager.resolve(e.sessionId):void 0):e.sessionId?this.sessionManager.resolve(e.sessionId):void 0;if(e.status==="waiting_for_user"){this.markTaskFailed(e,"Goal task was waiting for user input and cannot continue autonomously");return}if(Jf(e)){this.markTaskFailed(e,es());return}if(!o){this.markTaskFailed(e,"Underlying session could not be found.");return}if(e.sessionName=o.name,e.harnessSessionId=o.harnessSessionId,e.route=o.route??e.route,e.updatedAt=Date.now(),this.store.upsert(e),o.status==="starting"||o.status==="running"){await this.handleRunningSession(e,o);return}await this.handleTerminalSession(e,o)}finally{if(this.inFlight.delete(e.id),this.dirtyEvaluations.has(e.id)){this.dirtyEvaluations.delete(e.id);let o=this.dirtyEvaluationSessionIds.get(e.id);this.dirtyEvaluationSessionIds.delete(e.id),this.scheduleTaskEvaluation(e.id,`${r}:dirty`,o)}}}}};Re();import{existsSync as uI,realpathSync as pI}from"fs";import{resolve as cI}from"path";function ng(t){if(!t)return;let e=cI(t);try{if(uI(e))return pI.native(e)}catch{}return e}function rs(t,e){return!t||!e?!1:ng(t)===ng(e)}ke();Re();import{existsSync as mI}from"fs";ke();ut();function og(t){return t instanceof Error?t.message:String(t)}function fI(t){let e=t.worktreeStrategy??_.defaultWorktreeStrategy;return!!e&&e!=="off"&&$d(ki({harnessName:t.harness??Pe(),backendRef:t.backendRef}))}function gI(t,e,r,n){let o=["","You are working in a git worktree.",`Worktree path: ${r}`,`Branch: ${n}`,"",`IMPORTANT: ALL file edits must be made within this worktree at ${r}.`,`Do NOT edit files directly in ${e} (the original workspace).`,`If your task references files by absolute path under ${e}, rewrite those`,"paths relative to your current working directory. For example:",` "${e}/src/file.py" \u2192 use relative path "src/file.py"`,"","Commit all your file changes to this branch before finishing.","Use `git add` and `git commit`. Do NOT run `git checkout`, `git switch`, or `git reset --hard` as these will detach or corrupt the worktree HEAD.","","When making changes, please note:","- Do NOT commit planning documents, investigation notes, or analysis artifacts to this branch","- Only commit actual code, configuration, tests, and documentation changes that were explicitly requested as part of the task"].join(`
143
+ `);return(t??"")+o}function hI(t,e){let r=t.resumeSessionId??t.resumeWorktreeFrom;if(!r)return{};let n=e(r);if(!n)return{};let o=(()=>{if(n.workdir&&n.workdir!==n.worktreePath)return n.workdir;if(n.worktreePath){let s=Mi(n.worktreePath);return n.workdir&&s&&rs(n.workdir,s)?n.workdir:s??n.workdir}return n.workdir})();if(!t.worktreeStrategy&&n.worktreeStrategy&&(t.worktreeStrategy=n.worktreeStrategy),!t.planApproval&&n.planApproval&&(t.planApproval=n.planApproval),!n.worktreePath)return{};if(!n.worktreeBranch)throw new Error(`Cannot resume session "${r}": persisted worktree metadata is missing worktreeBranch.`);let i=Bm(ki({persistedHarness:n.harness,backendRef:n.backendRef}))&&!!n.backendRef?.worktreePath;if(mI(n.worktreePath))return console.info(`[SessionManager] Resuming with existing worktree: ${n.worktreePath}`),{actualWorkdir:n.worktreePath,originalWorkdir:o??n.worktreePath,worktreePath:n.worktreePath,worktreeBranchName:n.worktreeBranch};if(!o)return console.warn(`[SessionManager] Worktree ${n.worktreePath} no longer exists and cannot be recreated, using original workdir`),{clearedResumeSessionId:!!t.resumeSessionId,clearedResumeWorktreeFrom:!!t.resumeWorktreeFrom};if(i)return console.info(`[SessionManager] Native Codex worktree ${n.worktreePath} is missing; resuming from original workdir and letting the backend restore thread state.`),{actualWorkdir:o,originalWorkdir:o,worktreeBranchName:n.worktreeBranch,clearedResumeWorktreeFrom:!!t.resumeWorktreeFrom};try{_i(o);let s=Ld(o,n.worktreeBranch.replace(/^agent\//,""),{allowExistingBranch:!0});return console.info(`[SessionManager] Recreated worktree from branch ${n.worktreeBranch}: ${s}`),{actualWorkdir:s,originalWorkdir:o,worktreePath:s,worktreeBranchName:n.worktreeBranch}}catch(s){return console.warn(`[SessionManager] Failed to recreate worktree for resume: ${og(s)}, using original workdir`),{actualWorkdir:o,originalWorkdir:o,clearedResumeSessionId:!!t.resumeSessionId,clearedResumeWorktreeFrom:!!t.resumeWorktreeFrom}}}function ig(t,e,r){let{actualWorkdir:n,originalWorkdir:o,worktreePath:i,worktreeBranchName:s,clearedResumeSessionId:a,clearedResumeWorktreeFrom:d}=hI(t,r);a&&(t.resumeSessionId=void 0),d&&(t.resumeWorktreeFrom=void 0),n??=t.workdir,o??=t.workdir;let l=!!(t.resumeSessionId??t.resumeWorktreeFrom),m=t.worktreeStrategy??_.defaultWorktreeStrategy;m&&(t.worktreeStrategy=m);let g=fI(t),y=!t.resumeSessionId&&!i&&m&&m!=="off"&&!g;if(g&&!Dd(o))throw new Error(`Cannot launch session "${e}": worktree strategy "${m}" requires a git worktree, but "${o}" is not a git repository.`);if(y&&Dd(o)){if(!nf(o))throw new Error(`Cannot launch session "${e}": insufficient space for worktree creation.`);try{if(i=Ld(o,e),n=i,s=Ci(i),!s)throw new Error(`created worktree at ${i} but failed to resolve branch name`);console.log(`[SessionManager] Created worktree at ${i}`)}catch(f){throw new Error(`Cannot launch session "${e}": worktree creation failed: ${og(f)}`)}}else if(y)throw new Error(`Cannot launch session "${e}": worktree strategy "${m}" requires a git worktree, but "${o}" is not a git repository.`);return l&&i&&(n=i),{actualWorkdir:n,originalWorkdir:o,effectiveSystemPrompt:i&&s?gI(t.systemPrompt,o,i,s):t.systemPrompt,worktreePath:i,worktreeBranchName:s,clearedResumeSessionId:a,clearedResumeWorktreeFrom:d}}var ns=class{constructor(e){this.getPersistedSession=e}getPersistedSession;prepareSpawn(e,r){return ig(e,r,this.getPersistedSession)}hydrateSpawnedSession(e,r,n){n.worktreeStrategy&&n.worktreeStrategy!=="off"&&(e.originalWorkdir=r.originalWorkdir),r.worktreePath&&(e.worktreePath=r.worktreePath,e.worktreeBranch=r.worktreeBranchName,e.worktreeState="provisioned"),n.worktreePrTargetRepo&&(e.worktreePrTargetRepo=n.worktreePrTargetRepo)}};ke();var os=class{constructor(e){this.deps=e}deps;applySessionPatch(e,r){let n=this.deps.store.getPersistedSession(e);n&&(Object.assign(n,r),this.deps.store.assertPersistedEntry(n));let o=this.findActiveSessionForRef(e,n);return o&&this.applyPatchToActiveSession(o,r),!n&&!o?!1:(n&&this.deps.store.saveIndex(),!0)}matchesExistingSession(e,r){if(!r)return!1;let n=$(e),o=$(r);return!!(r.sessionId&&e.id===r.sessionId||o&&o===n||r?.harnessSessionId&&e.harnessSessionId===r.harnessSessionId||r?.name&&e.name===r.name)}findActiveSessionForRef(e,r){let n=this.deps.resolveSession(e);if(n)return n;for(let o of this.deps.sessions.values())if(re(o)===e||$(o)===e||o.harnessSessionId===e||this.matchesExistingSession(o,r))return o}applyPatchToActiveSession(e,r){this.applyControlStatePatch(e,r),this.applySessionMetadataPatch(e,r),this.applyWorktreeMetadataPatch(e,r)}applyControlStatePatch(e,r){let n={lifecycle:r.lifecycle,approvalState:r.approvalState,worktreeState:r.worktreeState,runtimeState:r.runtimeState,deliveryState:r.deliveryState,pendingPlanApproval:r.pendingPlanApproval,planApprovalContext:r.planApprovalContext,planDecisionVersion:r.planDecisionVersion,actionablePlanDecisionVersion:r.actionablePlanDecisionVersion,canonicalPlanPromptVersion:r.canonicalPlanPromptVersion,approvalPromptRequiredVersion:r.approvalPromptRequiredVersion,approvalPromptVersion:r.approvalPromptVersion,approvalPromptStatus:r.approvalPromptStatus,approvalPromptTransport:r.approvalPromptTransport,approvalPromptMessageKind:r.approvalPromptMessageKind,approvalPromptLastAttemptAt:r.approvalPromptLastAttemptAt,approvalPromptDeliveredAt:r.approvalPromptDeliveredAt,approvalPromptFailedAt:r.approvalPromptFailedAt,pendingWorktreeDecisionSince:r.pendingWorktreeDecisionSince};if(typeof e.applyControlPatch=="function"){e.applyControlPatch(n);return}this.assignIfDefined(e,"lifecycle",r.lifecycle),this.assignIfDefined(e,"approvalState",r.approvalState),this.assignIfDefined(e,"worktreeState",r.worktreeState),this.assignIfDefined(e,"runtimeState",r.runtimeState),this.assignIfDefined(e,"deliveryState",r.deliveryState),this.assignIfDefined(e,"pendingPlanApproval",r.pendingPlanApproval),this.assignIfDefined(e,"planApprovalContext",r.planApprovalContext),this.assignIfDefined(e,"planDecisionVersion",r.planDecisionVersion),this.assignIfDefined(e,"actionablePlanDecisionVersion",r.actionablePlanDecisionVersion),this.assignIfDefined(e,"canonicalPlanPromptVersion",r.canonicalPlanPromptVersion),this.assignIfDefined(e,"approvalPromptRequiredVersion",r.approvalPromptRequiredVersion),this.assignIfDefined(e,"approvalPromptVersion",r.approvalPromptVersion),this.assignIfDefined(e,"approvalPromptStatus",r.approvalPromptStatus),this.assignIfDefined(e,"approvalPromptTransport",r.approvalPromptTransport),this.assignIfDefined(e,"approvalPromptMessageKind",r.approvalPromptMessageKind),this.assignIfDefined(e,"approvalPromptLastAttemptAt",r.approvalPromptLastAttemptAt),this.assignIfDefined(e,"approvalPromptDeliveredAt",r.approvalPromptDeliveredAt),this.assignIfDefined(e,"approvalPromptFailedAt",r.approvalPromptFailedAt)}applySessionMetadataPatch(e,r){this.assignIfDefined(e,"approvalRationale",r.approvalRationale)}applyWorktreeMetadataPatch(e,r){this.assignIfDefined(e,"worktreePath",r.worktreePath),this.assignIfDefined(e,"worktreeBranch",r.worktreeBranch),this.assignIfDefined(e,"worktreePrUrl",r.worktreePrUrl),this.assignIfDefined(e,"worktreePrNumber",r.worktreePrNumber),this.assignIfDefined(e,"worktreeMerged",r.worktreeMerged),this.assignIfDefined(e,"worktreeMergedAt",r.worktreeMergedAt),this.assignIfDefined(e,"worktreeDisposition",r.worktreeDisposition),this.assignIfDefined(e,"worktreePrTargetRepo",r.worktreePrTargetRepo),this.assignIfDefined(e,"worktreePushRemote",r.worktreePushRemote),this.assignIfDefined(e,"worktreeLifecycle",r.worktreeLifecycle),"autoMergeParentSessionId"in r&&(e.autoMergeParentSessionId=r.autoMergeParentSessionId),"autoMergeConflictResolutionAttemptCount"in r&&(e.autoMergeConflictResolutionAttemptCount=r.autoMergeConflictResolutionAttemptCount),"autoMergeResolverSessionId"in r&&(e.autoMergeResolverSessionId=r.autoMergeResolverSessionId)}assignIfDefined(e,r,n){n!==void 0&&(e[r]=n)}};ke();var SI=new Set(["starting","running"]),is=class{constructor(e,r){this.sessions=e;this.store=r}sessions;store;resolveActive(e){let r=this.sessions.get(e);return r||(this.findPreferredMatch(e,n=>n.name===e)??this.findPreferredMatch(e,n=>$(n)===e)??this.findPreferredMatch(e,n=>n.harnessSessionId===e))}getPersistedSession(e){return this.store.getPersistedSession(e)}resolveBackendConversationId(e){let r=this.resolveActive(e);return this.store.resolveBackendConversationId(e,r?$(r)??r.harnessSessionId:void 0)}findPreferredMatch(e,r){let n,o;for(let i of this.sessions.values())r(i,e)&&((!o||i.startedAt>o.startedAt)&&(o=i),SI.has(i.status)&&(!n||i.startedAt>n.startedAt)&&(n=i));return n??o}};ke();ke();ut();var ss=class{constructor(e){this.deps=e}deps;async plan(e){let r=re(e)??e.harnessSessionId;if(this.deps.isAlreadyMerged(r))return console.info(`[SessionManager] handleWorktreeStrategy: session "${e.name}" already merged \u2014 skipping strategy handling`),{kind:"skip",result:{notificationSent:!0,worktreeRemoved:!1}};if(e.status!=="completed")return{kind:"skip",result:{notificationSent:!1,worktreeRemoved:!1}};if(!this.deps.shouldRunWorktreeStrategy(e))return console.info(`[SessionManager] handleWorktreeStrategy: skipping \u2014 session "${e.name}" is in phase "${e.phase}"`),{kind:"skip",result:{notificationSent:!1,worktreeRemoved:!1}};let n=e.worktreeStrategy;if(!n||n==="off"||n==="manual")return{kind:"skip",result:{notificationSent:!1,worktreeRemoved:!1}};let o=e.worktreePath,i=this.deps.resolveWorktreeRepoDir(e.originalWorkdir,o),s=e.worktreeBranch;if(!i)return{kind:"notify",label:"worktree-missing-repo-dir",message:`\u26A0\uFE0F [${e.name}] Cannot determine the original repo for worktree ${o}. Manual inspection is required.`};if(!s)return{kind:"notify",label:"worktree-no-branch-name",message:`\u26A0\uFE0F [${e.name}] Cannot determine branch name for worktree ${o}. The worktree may have been removed or is in detached HEAD state. Manual cleanup may be needed.`};let a=e.worktreeBaseBranch??ar(i),d=this.deps.getWorktreeCompletionState(i,o,s,a);if(d==="no-change")return{kind:"no-change",repoDir:i,worktreePath:o,nativeBackendWorktree:Ne(e)};if(d==="base-advanced")return{kind:"notify",label:"worktree-no-commits-ahead",message:`\u26A0\uFE0F [${e.name}] Auto-merge: branch '${s}' has no commits ahead of '${a}', but '${a}' has new commits \u2014 commits likely landed outside the worktree branch. Verify that commits were not made directly to '${a}' instead of the worktree branch. Worktree: ${o}`};if(d==="dirty-uncommitted")return{kind:"notify",label:"worktree-dirty-uncommitted",message:`\u26A0\uFE0F [${e.name}] Session completed with uncommitted changes. The branch has no commits ahead of '${a}' but there are modified tracked files in the worktree. Check: ${o}`};let l=Mr(i,s,a);return l?{kind:"decision",strategy:n,repoDir:i,worktreePath:o,branchName:s,baseBranch:a,diffSummary:l,sessionRef:r??void 0}:(console.warn(`[SessionManager] Failed to get diff summary for ${s}, skipping merge-back`),{kind:"skip",result:{notificationSent:!1,worktreeRemoved:!1}})}};function Yd(t,e){return{...e,baseBranch:e.baseBranch??t.worktreeBaseBranch,targetRepo:e.targetRepo??t.worktreePrTargetRepo,pushRemote:e.pushRemote??t.worktreePushRemote}}function as(t,e={}){let r=e.updatedAt??new Date().toISOString(),n={pendingWorktreeDecisionSince:e.pendingSince??r,lastWorktreeReminderAt:void 0,lifecycle:"awaiting_worktree_decision",worktreeState:"pending_decision",worktreeLifecycle:Yd(t,{state:"pending_decision",updatedAt:r,notes:e.notes})};return e.clearResolverSessionId&&(n.autoMergeResolverSessionId=void 0),n}function sg(t,e,r,n={}){let o=n.updatedAt??new Date().toISOString();return{autoMergeConflictResolutionAttemptCount:r,autoMergeResolverSessionId:e,pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,lifecycle:"terminal",worktreeState:"merge_conflict_resolving",worktreeLifecycle:Yd(t,{state:"merge_conflict_resolving",updatedAt:o,notes:n.notes})}}function ag(t,e={}){let r=e.updatedAt??new Date().toISOString(),n=e.resolvedAt??r,o={worktreeMerged:!0,worktreeMergedAt:e.mergedAt??n,lifecycle:"terminal",worktreeState:"merged",pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeLifecycle:Yd(t,{state:"merged",updatedAt:r,resolvedAt:n,resolutionSource:e.resolutionSource??"agent_merge"})};return e.clearResolverSessionId&&(o.autoMergeResolverSessionId=void 0),o}ut();var ds=class{constructor(e){this.deps=e;this.actions=new ss({shouldRunWorktreeStrategy:e.shouldRunWorktreeStrategy,isAlreadyMerged:e.isAlreadyMerged,resolveWorktreeRepoDir:e.resolveWorktreeRepoDir,getWorktreeCompletionState:e.getWorktreeCompletionState})}deps;actions;buildConflictResolverPrompt(e){return["Resolve the git rebase conflict for the auto-merge worktree and finish the rebase cleanly.","",`Original session: ${e.session.name} [${e.session.id}]`,`Repository root: ${e.repoDir}`,`Conflicted worktree: ${e.worktreePath}`,`Branch: ${e.branchName}`,`Base branch: ${e.baseBranch}`,"","Requirements:","- Work only inside the conflicted worktree.","- Inspect the current rebase state and resolve only the necessary conflict hunks.","- Make only minimal follow-up edits needed to keep the rebased branch correct.","- Continue the rebase until it completes successfully.","- Run relevant local verification before you finish.","- Do not broaden scope or start unrelated refactors.",`- Stop only when the branch is cleanly rebased onto ${e.baseBranch}.`,e.mergeError?"":void 0,e.mergeError?"Rebase failure details:":void 0,e.mergeError].filter(r=>typeof r=="string").join(`
144
144
  `)}notifyAutoMergeConflictEscalation(e,r,n){this.deps.dispatchSessionNotification(e,{label:"worktree-merge-conflict-escalated",userMessage:[`\u26A0\uFE0F [${e.name}] Auto-merge could not finish after one conflict-resolution attempt.`,`Branch \`${r}\` was preserved for manual follow-up.`,"",n].join(`
145
- `),buttons:[[this.deps.makeOpenPrButton(e.id)]]})}updatePersistedSessionFor(e,r){for(let n of et(e))this.deps.updatePersistedSession(n,r)}markPendingDecision(e,r={}){this.updatePersistedSessionFor(e,as(e,r))}markAutoMergeConflictResolving(e,r,n){this.updatePersistedSessionFor(e,sg(e,r,n,{notes:[`resolver_session:${r}`]}))}markMerged(e){this.updatePersistedSessionFor(e,ag(e,{clearResolverSessionId:!0}))}async handleWorktreeStrategy(e){let r=await this.actions.plan(e);return r.kind==="skip"?r.result:r.kind==="notify"?(this.deps.dispatchSessionNotification(e,{label:r.label,userMessage:r.message}),{notificationSent:!0,worktreeRemoved:!1}):r.kind==="no-change"?this.handleNoChange(e,r.repoDir,r.worktreePath,r.nativeBackendWorktree):r.strategy==="ask"?this.handleAskStrategy(e,r.branchName,r.baseBranch,r.diffSummary):r.strategy==="delegate"?this.handleDelegateStrategy(e,r.branchName,r.baseBranch,r.diffSummary):r.strategy==="auto-merge"?(await this.handleAutoMergeStrategy(e,r.repoDir,r.worktreePath,r.branchName,r.baseBranch,r.diffSummary,r.sessionRef),{notificationSent:!0,worktreeRemoved:!1}):r.strategy==="auto-pr"?this.handleAutoPrStrategy(e,r.baseBranch):{notificationSent:!1,worktreeRemoved:!1}}async handleNoChange(e,r,n,o=Ne(e)){let i=o?!0:tt(r,n);return i?(e.worktreePath=void 0,this.updatePersistedSessionFor(e,{worktreePath:void 0,worktreeDisposition:"no-change-cleaned",worktreeState:"none",worktreeLifecycle:{state:"no_change",updatedAt:new Date().toISOString(),resolvedAt:new Date().toISOString(),resolutionSource:"strategy_no_change",baseBranch:e.worktreeBaseBranch,targetRepo:e.worktreePrTargetRepo,pushRemote:e.worktreePushRemote}}),this.deps.dispatchSessionNotification(e,this.deps.worktreeMessages.buildNoChangeNotification({session:e,nativeBackendWorktree:o,cleanupSucceeded:!0,worktreePath:n,preview:this.deps.getOutputPreview(e),originThreadLine:this.deps.originThreadLine(e)}))):this.deps.dispatchSessionNotification(e,this.deps.worktreeMessages.buildNoChangeNotification({session:e,nativeBackendWorktree:o,cleanupSucceeded:!1,worktreePath:n,preview:this.deps.getOutputPreview(e),originThreadLine:this.deps.originThreadLine(e)})),{notificationSent:!0,worktreeRemoved:i}}handleAskStrategy(e,r,n,o){return this.deps.dispatchSessionNotification(e,this.deps.worktreeMessages.buildAskNotification({session:e,branchName:r,baseBranch:n,diffSummary:o,buttons:this.deps.getWorktreeDecisionButtons(e.id)})),this.markPendingDecision(e),{notificationSent:!0,worktreeRemoved:!1}}handleDelegateStrategy(e,r,n,o){return this.deps.dispatchSessionNotification(e,this.deps.worktreeMessages.buildDelegateNotification({session:e,branchName:r,baseBranch:n,diffSummary:o})),this.markPendingDecision(e),{notificationSent:!0,worktreeRemoved:!1}}handleAutoMergeSuccess(e,r,n,o,i,s){Ot(r,n),this.markMerged(e);let d=_r({kind:"merge",branch:n,base:o,filesChanged:i.filesChanged,insertions:i.insertions,deletions:i.deletions});s.stashPopConflict?d+=`
145
+ `),buttons:[[this.deps.makeOpenPrButton(e.id)]]})}updatePersistedSessionFor(e,r){for(let n of et(e))this.deps.updatePersistedSession(n,r)}markPendingDecision(e,r={}){this.updatePersistedSessionFor(e,as(e,r))}markAutoMergeConflictResolving(e,r,n){this.updatePersistedSessionFor(e,sg(e,r,n,{notes:[`resolver_session:${r}`]}))}markMerged(e){this.updatePersistedSessionFor(e,ag(e,{clearResolverSessionId:!0}))}async handleWorktreeStrategy(e){let r=await this.actions.plan(e);return r.kind==="skip"?r.result:r.kind==="notify"?(this.deps.dispatchSessionNotification(e,{label:r.label,userMessage:r.message}),{notificationSent:!0,worktreeRemoved:!1}):r.kind==="no-change"?this.handleNoChange(e,r.repoDir,r.worktreePath,r.nativeBackendWorktree):r.strategy==="ask"?this.handleAskStrategy(e,r.branchName,r.baseBranch,r.diffSummary):r.strategy==="delegate"?this.handleDelegateStrategy(e,r.branchName,r.baseBranch,r.diffSummary):r.strategy==="auto-merge"?(await this.handleAutoMergeStrategy(e,r.repoDir,r.worktreePath,r.branchName,r.baseBranch,r.diffSummary,r.sessionRef),{notificationSent:!0,worktreeRemoved:!1}):r.strategy==="auto-pr"?this.handleAutoPrStrategy(e,r.baseBranch):{notificationSent:!1,worktreeRemoved:!1}}async handleNoChange(e,r,n,o=Ne(e)){let i=o?!0:tt(r,n);return i?(e.worktreePath=void 0,this.updatePersistedSessionFor(e,{worktreePath:void 0,worktreeDisposition:"no-change-cleaned",worktreeState:"none",worktreeLifecycle:{state:"no_change",updatedAt:new Date().toISOString(),resolvedAt:new Date().toISOString(),resolutionSource:"strategy_no_change",baseBranch:e.worktreeBaseBranch,targetRepo:e.worktreePrTargetRepo,pushRemote:e.worktreePushRemote}}),this.deps.dispatchSessionNotification(e,this.deps.worktreeMessages.buildNoChangeNotification({session:e,nativeBackendWorktree:o,cleanupSucceeded:!0,worktreePath:n,preview:this.deps.getOutputPreview(e),originThreadLine:this.deps.originThreadLine(e)}))):this.deps.dispatchSessionNotification(e,this.deps.worktreeMessages.buildNoChangeNotification({session:e,nativeBackendWorktree:o,cleanupSucceeded:!1,worktreePath:n,preview:this.deps.getOutputPreview(e),originThreadLine:this.deps.originThreadLine(e)})),{notificationSent:!0,worktreeRemoved:i}}handleAskStrategy(e,r,n,o){return this.deps.dispatchSessionNotification(e,this.deps.worktreeMessages.buildAskNotification({session:e,branchName:r,baseBranch:n,diffSummary:o,buttons:this.deps.getWorktreeDecisionButtons(e.id)})),this.markPendingDecision(e),{notificationSent:!0,worktreeRemoved:!1}}handleDelegateStrategy(e,r,n,o){return this.deps.dispatchSessionNotification(e,this.deps.worktreeMessages.buildDelegateNotification({session:e,branchName:r,baseBranch:n,diffSummary:o})),this.markPendingDecision(e),{notificationSent:!0,worktreeRemoved:!1}}handleAutoMergeSuccess(e,r,n,o,i,s){Ot(r,n),this.markMerged(e);let d=Cr({kind:"merge",branch:n,base:o,filesChanged:i.filesChanged,insertions:i.insertions,deletions:i.deletions});s.stashPopConflict?d+=`
146
146
  \u26A0\uFE0F Pre-merge stash pop conflicted \u2014 run \`git stash show ${s.stashRef??"stash@{0}"}\` in ${r} to review stashed changes.`:s.stashed&&(d+=`
147
147
  (Pre-existing changes on ${o} were auto-stashed and restored.)`),this.deps.dispatchSessionNotification(e,{label:"worktree-merge-success",userMessage:d})}async handleInitialAutoMergeConflict(e,r,n,o,i,s){let a=e.autoMergeConflictResolutionAttemptCount??0;if(a>=1){this.markPendingDecision(e,{notes:["auto_merge_conflict_retry_exhausted"],clearResolverSessionId:!0}),this.notifyAutoMergeConflictEscalation(e,o,`The rebased branch still conflicts with \`${i}\`. Open a PR or resolve manually in ${n}.`);return}let d=this.buildConflictResolverPrompt({session:e,repoDir:r,worktreePath:n,branchName:o,baseBranch:i,mergeError:s});try{let l=await this.deps.spawnConflictResolver({session:e,repoDir:r,worktreePath:n,branchName:o,baseBranch:i,prompt:d});this.markAutoMergeConflictResolving(e,l.id,a+1),this.deps.dispatchSessionNotification(e,{label:"worktree-merge-conflict-resolving",userMessage:`\u26A0\uFE0F [${e.name}] Auto-merge hit a rebase conflict. Started resolver session ${l.name} and will retry automatically if it succeeds.`})}catch(l){this.markPendingDecision(e,{notes:["auto_merge_conflict_resolver_spawn_failed"]}),this.deps.dispatchSessionNotification(e,{label:"worktree-merge-conflict-spawn-failed",userMessage:`\u274C [${e.name}] Auto-merge hit a rebase conflict and failed to start the resolver: ${l instanceof Error?l.message:String(l)}`,buttons:[[this.deps.makeOpenPrButton(e.id)]]})}}handleAutoMergeRetryFailure(e,r,n,o){this.markPendingDecision(e,{notes:["auto_merge_conflict_retry_failed"],clearResolverSessionId:!0}),this.deps.dispatchSessionNotification(e,{label:"worktree-merge-error",userMessage:[o,"","Auto-merge retry did not complete after conflict resolution.",`Branch \`${r}\` was preserved for manual follow-up in ${n}.`].join(`
148
- `),buttons:[[this.deps.makeOpenPrButton(e.id)]]})}async handleAutoMergeStrategy(e,r,n,o,i,s,a=re(e)??e.harnessSessionId){this.deps.isAlreadyMerged(a)||e.autoMergeResolverSessionId||await this.deps.enqueueMerge(r,async()=>{if(this.deps.isAlreadyMerged(a))return;let d=this.deps.mergeBranch(r,o,i,"merge",n);if(d.success){this.handleAutoMergeSuccess(e,r,o,i,s,d);return}if(d.rebaseConflict){await this.handleInitialAutoMergeConflict(e,r,n,o,i,d.error);return}let l=d.dirtyError?`\u274C [${e.name}] Merge blocked: ${d.error}`:`\u274C [${e.name}] Merge failed: ${d.error??"unknown error"}`;if(e.worktreeState==="merge_conflict_resolving"||e.worktreeLifecycle?.state==="merge_conflict_resolving"){this.handleAutoMergeRetryFailure(e,o,n,l);return}this.deps.dispatchSessionNotification(e,{label:"worktree-merge-error",userMessage:l})},()=>{this.deps.dispatchSessionNotification(e,{label:"worktree-merge-queued",userMessage:`\u{1F550} [${e.name}] Merge queued \u2014 another merge for this repo is in progress. Will notify when complete.`})})}async handleAutoPrStrategy(e,r){return this.updatePersistedSessionFor(e,{lifecycle:"terminal",worktreeState:"pr_in_progress"}),(await this.deps.runAutoPr(e,r)).success||this.markPendingDecision(e),{notificationSent:!0,worktreeRemoved:!1}}};import{existsSync as HI,writeFileSync as zI}from"fs";Ar();import{randomUUID as yI}from"crypto";function kI(t){return t==="plan-approve"||t==="plan-request-changes"||t==="plan-reject"}var ls=class{constructor(e,r){this.onChange=e;this.retentionMs=r}onChange;retentionMs;tokens=new Map;afterChange;replaceAll(e){this.tokens.clear();for(let r of e)this.tokens.set(r.id,r)}clear(){this.tokens.clear(),this.notifyChanged()}listForPersistence(){return[...this.tokens.values()]}createActionToken(e,r,n={}){let o={id:yI(),sessionId:e,kind:r,createdAt:Date.now(),...n};return this.tokens.set(o.id,o),this.notifyChanged(),o}getActionToken(e){let r=this.tokens.get(e);if(r){if(r.expiresAt!=null&&r.expiresAt<=Date.now()){this.tokens.delete(e),this.notifyChanged();return}return r}}consumeActionToken(e){let r=this.getActionToken(e);if(!(!r||r.consumedAt!=null))return r.consumedAt=Date.now(),this.notifyChanged(),r}deleteActionTokensForSession(e){let r=!1;for(let[n,o]of this.tokens)o.sessionId===e&&(this.tokens.delete(n),r=!0);r&&this.notifyChanged()}deletePlanDecisionTokensForSession(e,r){let n=!1;for(let[o,i]of this.tokens)i.sessionId!==e||!kI(i.kind)||r!=null&&i.planDecisionVersion===r||(this.tokens.delete(o),n=!0);n&&this.notifyChanged()}purgeExpiredActionTokens(e=Date.now()){let r=!1;for(let[n,o]of this.tokens){let i=o.expiresAt!=null&&o.expiresAt<=e,s=o.consumedAt!=null&&e-o.consumedAt>this.retentionMs;(i||s)&&(this.tokens.delete(n),r=!0)}r&&this.notifyChanged()}nextExpiryAt(){let e;for(let r of this.tokens.values()){let n=[r.expiresAt,r.consumedAt!=null?r.consumedAt+this.retentionMs:void 0].filter(o=>o!=null&&Number.isFinite(o));for(let o of n)(e==null||o<e)&&(e=o)}return e}setAfterChangeListener(e){this.afterChange=e}notifyChanged(){this.onChange(),this.afterChange?.()}};ke();ke();var us=class{constructor(e){this.indexes=e}indexes;hasRecordedSession(e){return this.indexes.idIndex.has(e)}getLatestPersistedByName(e){let r,n=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY,i=Number.NEGATIVE_INFINITY,s=0;for(let a of this.indexes.persisted.values()){if(a.name!==e){s++;continue}let d=a.createdAt??Number.NEGATIVE_INFINITY,l=a.completedAt??Number.NEGATIVE_INFINITY;(d>n||d===n&&l>o||d===n&&l===o&&s>i)&&(r=a,n=d,o=l,i=s),s++}return r}resolveBackendConversationId(e,r){if(r)return r;let n=this.indexes.idIndex.get(e);if(n){let s=this.indexes.persisted.get(n);return(s?$(s):void 0)??n}let o=this.getLatestPersistedByName(e);if(o)return $(o)??o.harnessSessionId;let i=this.indexes.backendIdIndex.get(e);if(i){let s=this.indexes.persisted.get(i);return(s?$(s):void 0)??i}if(this.indexes.persisted.has(e)){let s=this.indexes.persisted.get(e);return s?$(s)??e:e}if(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e))return e}resolveHarnessSessionId(e,r){return this.resolveBackendConversationId(e,r)}getPersistedSession(e){let r=this.indexes.idIndex.get(e);if(r)return this.indexes.persisted.get(r);let n=this.getLatestPersistedByName(e);if(n)return n;let o=this.indexes.backendIdIndex.get(e);return o?this.indexes.persisted.get(o):this.indexes.persisted.get(e)}listPersistedSessions(){return[...this.indexes.persisted.values()].sort((e,r)=>(r.completedAt??0)-(e.completedAt??0))}};import{existsSync as KI,mkdirSync as VI,readFileSync as qI,readdirSync as Zd,renameSync as fg,statSync as gg,unlinkSync as hg,writeFileSync as Sg}from"fs";import{tmpdir as el}from"os";import{dirname as jI,join as fs}from"path";import{homedir as vI}from"node:os";import{join as PI}from"node:path";function dg(t){let e=t.OPENCLAW_HOME?.trim();if(e)return e;let r=t.HOME?.trim()||vI();return PI(r,".openclaw")}Ar();var ps=6,wI=new Set(["running","completed","failed","killed"]);function so(t){return!!t&&typeof t=="object"}function un(t,e=""){return typeof t=="string"&&t.trim().length>0?t:e}function x(t){return typeof t=="string"&&t.trim().length>0?t:void 0}function je(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function II(t){return t==="low"||t==="medium"||t==="high"?t:void 0}function lg(t){return t==="default"||t==="plan"||t==="bypassPermissions"?t:void 0}function xI(t){return t==="never"||t==="on-request"?"never":void 0}function bI(t){return t==="approve"||t==="ask"||t==="delegate"?t:void 0}function AI(t){if(t==="plan-mode"||t==="codex-first-turn-plan"||t==="soft-plan")return"plan-mode"}function RI(t){return t==="user"||t==="idle-timeout"||t==="startup-timeout"||t==="shutdown"||t==="done"||t==="unknown"?t:void 0}function ug(t){return t==="starting"||t==="active"||t==="awaiting_plan_decision"||t==="awaiting_user_input"||t==="awaiting_worktree_decision"||t==="suspended"||t==="terminal"?t:void 0}function TI(t){return t==="not_required"||t==="pending"||t==="approved"||t==="changes_requested"||t==="rejected"?t:void 0}function MI(t){return t==="none"||t==="provisioned"||t==="pending_decision"||t==="merge_conflict_resolving"||t==="merge_in_progress"||t==="pr_in_progress"||t==="merged"||t==="released"||t==="pr_open"||t==="dismissed"||t==="cleanup_failed"?t:void 0}function CI(t){return t==="none"||t==="provisioned"||t==="pending_decision"||t==="merge_conflict_resolving"||t==="pr_open"||t==="merged"||t==="released"||t==="dismissed"||t==="no_change"||t==="cleanup_failed"?t:void 0}function _I(t){return t==="live"||t==="stopped"?t:void 0}function $I(t){return t==="not_sent"||t==="sending"||t==="delivered"||t==="fallback_delivered"||t==="failed"?t:void 0}function EI(t){return t==="none"||t==="direct-telegram"||t==="wake-only"?t:void 0}function OI(t){return t==="none"||t==="canonical_buttons"||t==="explicit_fallback_text"?t:void 0}function DI(t){return t==="idle"||t==="notifying"||t==="wake_pending"||t==="failed"?t:void 0}function NI(t){return t==="awaiting_plan_output"||t==="awaiting_approval"||t==="approved_then_implemented"||t==="implemented_without_required_approval"||t==="not_plan_gated"?t:void 0}function FI(t){return t==="plan-approve"||t==="plan-request-changes"||t==="plan-reject"||t==="monitor-start-plan"||t==="monitor-dismiss"||t==="worktree-merge"||t==="worktree-create-pr"||t==="worktree-update-pr"||t==="worktree-view-pr"||t==="worktree-decide-later"||t==="worktree-dismiss"||t==="session-resume"||t==="session-restart"||t==="view-output"||t==="question-answer"?t:void 0}function pg(t){if(!so(t))return;let e=x(t.provider),r=x(t.accountId),n=x(t.target),o=x(t.threadId),i=x(t.sessionKey);if(!(!e||!n))return{provider:e,accountId:r,target:n,threadId:o,sessionKey:i}}function LI(t,e,r){if(so(t)){let n=x(t.kind),o=x(t.conversationId);if(o&&(n==="claude-code"||n==="codex-app-server"))return{kind:n,conversationId:o,runId:x(t.runId),worktreeId:x(t.worktreeId),worktreePath:x(t.worktreePath)}}if(e==="claude-code")return{kind:"claude-code",conversationId:r}}function WI(t){if(!so(t))return;let e=CI(t.state),r=x(t.updatedAt);if(!e||!r)return;let n=x(t.resolutionSource);return{state:e,updatedAt:r,resolvedAt:x(t.resolvedAt),resolutionSource:n==="agent_merge"||n==="agent_pr"||n==="strategy_no_change"||n==="lifecycle_resolver"||n==="dismiss"||n==="maintenance"?n:void 0,baseBranch:x(t.baseBranch),targetRepo:x(t.targetRepo),pushRemote:x(t.pushRemote),notes:Array.isArray(t.notes)?t.notes.filter(o=>typeof o=="string"&&o.length>0):void 0}}function BI(t){let e=new Date(0).toISOString(),r=x(t.worktreeMergedAt)??x(t.worktreeDismissedAt)??x(t.pendingWorktreeDecisionSince)??e;if(t.worktreeMerged===!0)return{state:"merged",updatedAt:r,resolvedAt:x(t.worktreeMergedAt)??r,resolutionSource:"agent_merge",baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(t.worktreeDisposition==="dismissed")return{state:"dismissed",updatedAt:r,resolvedAt:x(t.worktreeDismissedAt)??r,resolutionSource:"dismiss",baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(t.worktreeDisposition==="no-change-cleaned")return{state:"no_change",updatedAt:r,resolvedAt:r,resolutionSource:"strategy_no_change",baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(t.worktreeDisposition==="pr-opened"||t.worktreeState==="pr_open")return{state:"pr_open",updatedAt:r,baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(t.pendingWorktreeDecisionSince||t.worktreeState==="pending_decision")return{state:"pending_decision",updatedAt:r,baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(t.worktreeState==="merge_conflict_resolving")return{state:"merge_conflict_resolving",updatedAt:r,baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(x(t.worktreePath)||x(t.worktreeBranch))return{state:"provisioned",updatedAt:r,baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)}}function UI(t){if(typeof t=="string"&&wI.has(t))return t==="running"?"killed":t}function cg(t){if(!so(t))return;let e=un(t.harnessSessionId);if(!e)return;let r=UI(t.status);if(!r)return;let n=t.status==="running",o=x(t.worktreePath),i=x(t.worktreeBranch),s=x(t.originChannel),a=typeof t.originThreadId=="string"||typeof t.originThreadId=="number"?t.originThreadId:void 0,d=x(t.originSessionKey),l=pg(t.route);if(!l)return;let m=en({route:l,originChannel:s,originThreadId:a,originSessionKey:d});if(!m||o&&!i)return;let g=x(t.harness),y=LI(t.backendRef,g,e),f=WI(t.worktreeLifecycle)??BI(t);return{sessionId:x(t.sessionId),harnessSessionId:e,backendRef:y,name:un(t.name,e),prompt:un(t.prompt),workdir:un(t.workdir,"(unknown)"),model:x(t.model),reasoningEffort:II(t.reasoningEffort),createdAt:je(t.createdAt),completedAt:je(t.completedAt),status:r,lifecycle:n?ug(t.lifecycle)??"suspended":ug(t.lifecycle),approvalState:TI(t.approvalState),worktreeState:MI(t.worktreeState),runtimeState:n?"stopped":_I(t.runtimeState),deliveryState:DI(t.deliveryState),completionWakeIssuedAt:x(t.completionWakeIssuedAt),completionWakeSucceededAt:x(t.completionWakeSucceededAt),completionWakeFailedAt:x(t.completionWakeFailedAt),completionWakeSummaryRequired:t.completionWakeSummaryRequired===!0?!0:void 0,killReason:RI(t.killReason),costUsd:typeof t.costUsd=="number"&&Number.isFinite(t.costUsd)?t.costUsd:0,originAgentId:x(t.originAgentId),originChannel:s,originThreadId:a,originSessionKey:d,route:m,outputPath:x(t.outputPath),harness:g,requestedPermissionMode:lg(t.requestedPermissionMode),currentPermissionMode:lg(t.currentPermissionMode),approvalExecutionState:NI(t.approvalExecutionState),approvalRationale:x(t.approvalRationale),planModeApproved:t.planModeApproved===!0,pendingPlanApproval:t.pendingPlanApproval===!0,planApprovalContext:AI(t.planApprovalContext),planDecisionVersion:je(t.planDecisionVersion),actionablePlanDecisionVersion:je(t.actionablePlanDecisionVersion),canonicalPlanPromptVersion:je(t.canonicalPlanPromptVersion),approvalPromptRequiredVersion:je(t.approvalPromptRequiredVersion),approvalPromptVersion:je(t.approvalPromptVersion),approvalPromptStatus:$I(t.approvalPromptStatus),approvalPromptTransport:EI(t.approvalPromptTransport),approvalPromptMessageKind:OI(t.approvalPromptMessageKind),approvalPromptLastAttemptAt:x(t.approvalPromptLastAttemptAt),approvalPromptDeliveredAt:x(t.approvalPromptDeliveredAt),approvalPromptFailedAt:x(t.approvalPromptFailedAt),planApproval:bI(t.planApproval),codexApprovalPolicy:xI(t.codexApprovalPolicy),worktreePath:o,worktreeBranch:i,worktreeStrategy:t.worktreeStrategy==="off"||t.worktreeStrategy==="manual"||t.worktreeStrategy==="ask"||t.worktreeStrategy==="delegate"||t.worktreeStrategy==="auto-merge"||t.worktreeStrategy==="auto-pr"?t.worktreeStrategy:void 0,worktreeMerged:typeof t.worktreeMerged=="boolean"?t.worktreeMerged:void 0,worktreeMergedAt:x(t.worktreeMergedAt),worktreePrUrl:x(t.worktreePrUrl),worktreePrNumber:je(t.worktreePrNumber),pendingWorktreeDecisionSince:x(t.pendingWorktreeDecisionSince),lastWorktreeReminderAt:x(t.lastWorktreeReminderAt),worktreeBaseBranch:x(t.worktreeBaseBranch),worktreePrTargetRepo:x(t.worktreePrTargetRepo),autoMergeParentSessionId:x(t.autoMergeParentSessionId),autoMergeConflictResolutionAttemptCount:je(t.autoMergeConflictResolutionAttemptCount),autoMergeResolverSessionId:x(t.autoMergeResolverSessionId),worktreePushRemote:x(t.worktreePushRemote),worktreeDecisionSnoozedUntil:x(t.worktreeDecisionSnoozedUntil),worktreeDisposition:t.worktreeDisposition==="active"||t.worktreeDisposition==="pr-opened"||t.worktreeDisposition==="merged"||t.worktreeDisposition==="dismissed"||t.worktreeDisposition==="no-change-cleaned"?t.worktreeDisposition:void 0,worktreeDismissedAt:x(t.worktreeDismissedAt),worktreeLifecycle:f,resumable:n?!0:t.resumable===!0}}function mg(t){if(!so(t))return;let e=FI(t.kind),r=un(t.id),n=un(t.sessionId),o=je(t.createdAt);if(!(!r||!n||!e||o==null))return{id:r,sessionId:n,kind:e,createdAt:o,planDecisionVersion:je(t.planDecisionVersion),expiresAt:je(t.expiresAt),consumedAt:je(t.consumedAt),optionIndex:je(t.optionIndex),label:x(t.label),targetUrl:x(t.targetUrl),route:pg(t.route),launchName:x(t.launchName),launchPrompt:x(t.launchPrompt),launchWorkdir:x(t.launchWorkdir)}}function cs(t){if(!t.backendRef?.kind||!t.backendRef.conversationId)throw new Error(`Persisted session ${t.harnessSessionId} is missing required backend ref metadata.`);if(!t.route?.provider||!t.route.target)throw new Error(`Persisted session ${t.harnessSessionId} is missing required route metadata.`);if(t.worktreePath&&!t.worktreeBranch)throw new Error(`Persisted session ${t.harnessSessionId} is missing required worktreeBranch metadata.`)}function Xd(t){return!!t&&typeof t=="object"}function tl(t){return t instanceof Error?t.message:String(t)}function yg(t){let e=t.OPENCLAW_CODE_AGENT_SESSIONS_PATH?.trim();return e||fs(dg(t),"code-agent-sessions.json")}function kg(t,e,r){try{VI(jI(t),{recursive:!0});let n=t+".tmp";Sg(n,JSON.stringify({schemaVersion:ps,sessions:e,actionTokens:r},null,2),"utf-8"),fg(n,t)}catch(n){console.warn(`[SessionStore] Failed to save session index: ${tl(n)}`)}}function ms(t,e){try{if(!KI(t))return;let r=`${t}.legacy-${Date.now()}.json`;fg(t,r),console.warn(`[SessionStore] Breaking upgrade: archived ${e} session store to ${r}. Legacy sessions are not loaded by this release.`)}catch(r){console.warn(`[SessionStore] Failed to archive legacy session store: ${tl(r)}`)}}function GI(t,e){try{if(e.length===0)return;let r=`${t}.codex-sdk-legacy-${Date.now()}.json`;Sg(r,JSON.stringify(e,null,2),"utf-8"),console.warn(`[SessionStore] Breaking Codex transport upgrade: archived ${e.length} legacy Codex SDK session(s) to ${r}. They are not loaded by the App Server backend.`)}catch(r){console.warn(`[SessionStore] Failed to archive legacy Codex SDK sessions: ${tl(r)}`)}}function vg(t,e){try{let r=el(),n=Zd(r).filter(o=>o.startsWith("openclaw-agent-")&&o.endsWith(".txt"));for(let o of n)try{let i=fs(r,o),s=gg(i).mtimeMs;t-s>e&&hg(i)}catch{}}catch{}}function Pg(t,e){try{let r=el(),n=Zd(r).filter(i=>i.startsWith("openclaw-agent-")&&i.endsWith(".txt")),o;for(let i of n)try{let s=fs(r,i),a=gg(s).mtimeMs+e;if(a<=t)return t;o=o==null?a:Math.min(o,a)}catch{}return o}catch{return}}function wg(t){try{let e=new Set(t),r=el(),n=Zd(r).filter(o=>o.startsWith("openclaw-agent-")&&o.endsWith(".txt"));for(let o of n){let i=fs(r,o);if(!e.has(i))try{hg(i)}catch{}}}catch{}}function Ig(t){let{indexPath:e,clearAll:r,indexPersistedEntry:n,setActionToken:o,purgeExpiredActionTokens:i,saveIndex:s}=t;try{let a=qI(e,"utf-8"),d=JSON.parse(a);if(Array.isArray(d)){ms(e,"legacy array store"),s();return}if(!Xd(d)||d.schemaVersion!==ps&&d.schemaVersion!==4){ms(e,`schema mismatch (expected v${ps})`),s();return}let l=Array.isArray(d.sessions)?d.sessions:[],m=[];for(let y of l){if(Xd(y)&&y.harness==="codex"){let k=Xd(y.backendRef)?y.backendRef:void 0;if((typeof k?.kind=="string"?k.kind:void 0)!=="codex-app-server"){m.push(y);continue}}let f=cg(y);if(!f){r(),ms(e,"invalid v4 session entry"),s();return}n(f)}m.length>0&&(GI(e,m),s());let g=Array.isArray(d.actionTokens)?d.actionTokens:[];for(let y of g){let f=mg(y);if(!f){r(),ms(e,"invalid v4 action token"),s();return}o(f)}i()}catch{}}var QI=new Set(["completed","failed","killed"]),rl=1440*60*1e3;function JI(t){return t instanceof Error?t.message:String(t)}var gs=class{persisted=new Map;idIndex=new Map;nameIndex=new Map;backendIdIndex=new Map;actionTokens;actionTokenStore;indexPath;queries;constructor(e={}){let r=e.env??process.env;this.indexPath=e.indexPath??yg(r),this.actionTokenStore=new ls(()=>this.saveIndex(),rl),this.actionTokens=this.actionTokenStore.tokens,this.queries=new us({persisted:this.persisted,idIndex:this.idIndex,nameIndex:this.nameIndex,backendIdIndex:this.backendIdIndex}),r.OPENCLAW_DEBUG_SESSION_STORE==="1"&&console.warn(`[SessionStore] index path: ${this.indexPath}`),this.loadIndex()}loadIndex(){Ig({indexPath:this.indexPath,clearAll:()=>{this.persisted.clear(),this.idIndex.clear(),this.nameIndex.clear(),this.backendIdIndex.clear(),this.actionTokenStore.clear()},indexPersistedEntry:e=>this.indexPersistedEntry(e),setActionToken:e=>{this.actionTokens.set(e.id,e)},purgeExpiredActionTokens:()=>this.actionTokenStore.purgeExpiredActionTokens(),saveIndex:()=>this.saveIndex()})}saveIndex(){kg(this.indexPath,[...this.persisted.values()],this.actionTokenStore.listForPersistence())}assertPersistedEntry(e){cs(e)}getEntryStorageKey(e){return e.harnessSessionId}buildPersistedBackendRef(e){return e.backendRef??{kind:_d(e)==="codex"?"codex-app-server":"claude-code",conversationId:e.harnessSessionId}}indexPersistedEntry(e){let r=this.getEntryStorageKey(e);this.persisted.set(r,e),e.sessionId&&this.idIndex.set(e.sessionId,r),e.name&&this.nameIndex.set(e.name,r);let n=$(e);n&&this.backendIdIndex.set(n,r)}removePersistedIndexes(e){let r=this.getEntryStorageKey(e);this.persisted.delete(r);for(let[n,o]of this.idIndex)o===r&&this.idIndex.delete(n);for(let[n,o]of this.nameIndex)o===r&&this.nameIndex.delete(n);for(let[n,o]of this.backendIdIndex)o===r&&this.backendIdIndex.delete(n)}markRunning(e){if(!e.harnessSessionId)return;let r=typeof e.controlStateSnapshot=="function"?e.controlStateSnapshot():{planModeApproved:!1},n=en({route:e.route,originChannel:e.originChannel,originThreadId:e.originThreadId,originSessionKey:e.originSessionKey});if(!n)return;let o={sessionId:e.id,harnessSessionId:e.harnessSessionId,backendRef:this.buildPersistedBackendRef(e),name:e.name,prompt:e.prompt,workdir:e.originalWorkdir??e.workdir,model:e.model,reasoningEffort:e.reasoningEffort,createdAt:e.startedAt,status:"running",lifecycle:e.lifecycle,approvalState:e.approvalState,worktreeState:e.worktreeState,runtimeState:e.runtimeState,deliveryState:e.deliveryState,costUsd:0,originAgentId:e.originAgentId,originChannel:e.originChannel,originThreadId:e.originThreadId,originSessionKey:e.originSessionKey,route:n,harness:e.harnessName,requestedPermissionMode:e.requestedPermissionMode,currentPermissionMode:e.currentPermissionMode,approvalExecutionState:e.approvalExecutionState,approvalRationale:e.approvalRationale,planModeApproved:r.planModeApproved,pendingPlanApproval:e.pendingPlanApproval,planApprovalContext:e.planApprovalContext,planDecisionVersion:e.planDecisionVersion,actionablePlanDecisionVersion:e.actionablePlanDecisionVersion,canonicalPlanPromptVersion:e.canonicalPlanPromptVersion,approvalPromptRequiredVersion:e.approvalPromptRequiredVersion,approvalPromptVersion:e.approvalPromptVersion,approvalPromptStatus:e.approvalPromptStatus,approvalPromptTransport:e.approvalPromptTransport,approvalPromptMessageKind:e.approvalPromptMessageKind,approvalPromptLastAttemptAt:e.approvalPromptLastAttemptAt,approvalPromptDeliveredAt:e.approvalPromptDeliveredAt,approvalPromptFailedAt:e.approvalPromptFailedAt,planApproval:e.planApproval,codexApprovalPolicy:e.codexApprovalPolicy,worktreePath:e.worktreePath,worktreeBranch:e.worktreeBranch,worktreeStrategy:e.worktreeStrategy,worktreeBaseBranch:e.worktreeBaseBranch,worktreePrTargetRepo:e.worktreePrTargetRepo,autoMergeParentSessionId:e.autoMergeParentSessionId,autoMergeConflictResolutionAttemptCount:e.autoMergeConflictResolutionAttemptCount,autoMergeResolverSessionId:e.autoMergeResolverSessionId,worktreeLifecycle:e.worktreeLifecycle,resumable:e.isExplicitlyResumable};cs(o),this.indexPersistedEntry(o),this.saveIndex()}hasRecordedSession(e){return this.queries.hasRecordedSession(e)}persistTerminal(e){if(!e.harnessSessionId)return;let r=typeof e.controlStateSnapshot=="function"?e.controlStateSnapshot():{planModeApproved:!1},n=en({route:e.route,originChannel:e.originChannel,originThreadId:e.originThreadId,originSessionKey:e.originSessionKey});if(!n)return;let o;try{let s=an(e.id);if(HI(s))o=s;else{let a=e.getOutput().join(`
149
- `);a.length>0&&(zI(s,a,"utf-8"),o=s)}}catch(s){console.warn(`[SessionStore] Failed to write output file for session ${e.id}: ${JI(s)}`)}let i={sessionId:e.id,harnessSessionId:e.harnessSessionId,backendRef:this.buildPersistedBackendRef(e),name:e.name,prompt:e.prompt,workdir:e.originalWorkdir??e.workdir,model:e.model,reasoningEffort:e.reasoningEffort,createdAt:e.startedAt,completedAt:e.completedAt,status:e.status,lifecycle:e.lifecycle,approvalState:e.approvalState,worktreeState:e.worktreeState,runtimeState:e.runtimeState,deliveryState:e.deliveryState,killReason:e.killReason,costUsd:e.costUsd,originAgentId:e.originAgentId,originChannel:e.originChannel,originThreadId:e.originThreadId,originSessionKey:e.originSessionKey,route:n,outputPath:o,harness:e.harnessName,requestedPermissionMode:e.requestedPermissionMode,currentPermissionMode:e.currentPermissionMode,approvalExecutionState:e.approvalExecutionState,approvalRationale:e.approvalRationale,planModeApproved:r.planModeApproved,pendingPlanApproval:e.pendingPlanApproval,planApprovalContext:e.planApprovalContext,planDecisionVersion:e.planDecisionVersion,actionablePlanDecisionVersion:e.actionablePlanDecisionVersion,canonicalPlanPromptVersion:e.canonicalPlanPromptVersion,approvalPromptRequiredVersion:e.approvalPromptRequiredVersion,approvalPromptVersion:e.approvalPromptVersion,approvalPromptStatus:e.approvalPromptStatus,approvalPromptTransport:e.approvalPromptTransport,approvalPromptMessageKind:e.approvalPromptMessageKind,approvalPromptLastAttemptAt:e.approvalPromptLastAttemptAt,approvalPromptDeliveredAt:e.approvalPromptDeliveredAt,approvalPromptFailedAt:e.approvalPromptFailedAt,planApproval:e.planApproval,codexApprovalPolicy:e.codexApprovalPolicy,worktreePath:e.worktreePath,worktreeBranch:e.worktreeBranch,worktreeStrategy:e.worktreeStrategy,worktreeBaseBranch:e.worktreeBaseBranch,worktreePrTargetRepo:e.worktreePrTargetRepo,autoMergeParentSessionId:e.autoMergeParentSessionId,autoMergeConflictResolutionAttemptCount:e.autoMergeConflictResolutionAttemptCount,autoMergeResolverSessionId:e.autoMergeResolverSessionId,worktreeLifecycle:e.worktreeLifecycle,resumable:e.isExplicitlyResumable};cs(i),this.indexPersistedEntry(i),this.saveIndex()}getLatestPersistedByName(e){return this.queries.getLatestPersistedByName(e)}resolveBackendConversationId(e,r){return this.queries.resolveBackendConversationId(e,r)}resolveHarnessSessionId(e,r){return this.queries.resolveHarnessSessionId(e,r)}getPersistedSession(e){return this.queries.getPersistedSession(e)}listPersistedSessions(){return this.queries.listPersistedSessions()}cleanupTmpOutputFiles(e){this.actionTokenStore.purgeExpiredActionTokens(e),vg(e,rl)}getNextTmpOutputCleanupAt(e){return Pg(e,rl)}evictOldestPersisted(e){let r=this.listPersistedSessions();if(r.length<=e)return[];let n=r.slice(e);for(let o of n)this.removePersistedIndexes(o);return this.saveIndex(),n}shouldGcActiveSession(e,r,n){return!e.completedAt||!QI.has(e.status)?!1:r-e.completedAt>n}getActionToken(e){return this.actionTokenStore.getActionToken(e)}consumeActionToken(e){return this.actionTokenStore.consumeActionToken(e)}deleteActionTokensForSession(e){this.actionTokenStore.deleteActionTokensForSession(e)}purgeExpiredActionTokens(e=Date.now()){this.actionTokenStore.purgeExpiredActionTokens(e)}getNextActionTokenExpiry(){return this.actionTokenStore.nextExpiryAt()}onActionTokensChanged(e){this.actionTokenStore.setAfterChangeListener(e)}hasOutputPathReference(e){for(let r of this.persisted.values())if(r.outputPath===e)return!0;return!1}getReferencedOutputPaths(){return[...new Set([...this.persisted.values()].map(e=>e.outputPath).filter(e=>typeof e=="string"&&e.length>0))]}cleanupOrphanOutputFiles(){wg(this.getReferencedOutputPaths())}};var YI=new Set(["completed","failed","killed"]),hs=class{metrics={totalCostUsd:0,costPerDay:new Map,sessionsByStatus:{completed:0,failed:0,killed:0},totalLaunched:0,totalDurationMs:0,sessionsWithDuration:0,mostExpensive:null};incrementLaunched(){this.metrics.totalLaunched++}recordSession(e){let r=e.costUsd??0,n=e.status;this.metrics.totalCostUsd+=r;let o=new Date(e.completedAt??e.startedAt).toISOString().slice(0,10);if(this.metrics.costPerDay.set(o,(this.metrics.costPerDay.get(o)??0)+r),YI.has(n)&&this.metrics.sessionsByStatus[n]++,e.completedAt){let i=e.completedAt-e.startedAt;this.metrics.totalDurationMs+=i,this.metrics.sessionsWithDuration++}(!this.metrics.mostExpensive||r>this.metrics.mostExpensive.costUsd)&&(this.metrics.mostExpensive={id:e.id,name:e.name,costUsd:r,prompt:Fe(e.prompt,80)})}getMetrics(){return{totalCostUsd:this.metrics.totalCostUsd,costPerDay:new Map(this.metrics.costPerDay),sessionsByStatus:{...this.metrics.sessionsByStatus},totalLaunched:this.metrics.totalLaunched,totalDurationMs:this.metrics.totalDurationMs,sessionsWithDuration:this.metrics.sessionsWithDuration,mostExpensive:this.metrics.mostExpensive?{...this.metrics.mostExpensive}:null}}};import*as xg from"child_process";var nl=3e4,XI=2e3,ZI=2e4,bt=4;function ao(t){return t instanceof Error?t.message:String(t)}function ex(){return new Error(`Dispatch timed out after ${nl}ms`)}function tx(t){if(!(t instanceof Error))return!1;let e=t;return e.killed===!0&&e.signal==="SIGTERM"}var rx={execFile:xg.execFile},Ss=class{pendingRetryTimers=new Map;orderedDispatchTails=new Map;disposed=!1;clearPendingRetries(){for(let e of this.pendingRetryTimers.values())for(let r of e)clearTimeout(r.timer),r.onCleared?.();this.pendingRetryTimers.clear()}clearRetryTimersForSession(e){let r=this.pendingRetryTimers.get(e);if(r){for(let n of r)clearTimeout(n.timer),n.onCleared?.();this.pendingRetryTimers.delete(e)}}dispose(){this.disposed=!0,this.clearPendingRetries(),this.orderedDispatchTails.clear()}execute(e,r,n=1){if(!this.disposed){if(n===1&&r.orderingKey){this.enqueueOrderedDispatch(r.orderingKey,o=>this.executeNow(e,r,o,n));return}this.executeNow(e,r,void 0,n)}}executePromise(e,r,n=1){if(!this.disposed){if(n===1&&r.orderingKey){this.enqueueOrderedDispatch(r.orderingKey,o=>this.executePromiseNow(e,r,o,n));return}this.executePromiseNow(e,r,void 0,n)}}executeNow(e,r,n,o=1){if(this.disposed){n?.();return}let i=Date.now();o===1&&r.onStarted?.(),this.log("info","dispatch_started",{label:r.label,sessionId:r.sessionId,target:r.target,phase:r.phase,messageKind:r.messageKind,route:r.routeSummary,attempt:o,maxAttempts:bt}),rx.execFile("openclaw",e,{timeout:nl},(s,a,d)=>{if(this.disposed){n?.();return}let l=Date.now()-i;if(!s){this.log("info","dispatch_succeeded",{label:r.label,sessionId:r.sessionId,target:r.target,phase:r.phase,messageKind:r.messageKind,route:r.routeSummary,attempt:o,maxAttempts:bt,elapsedMs:l}),r.onSuccess?.(),n?.();return}let m=d?.trim()?` | stderr: ${d.trim()}`:"";if(r.target==="message.send"&&tx(s)){this.log("error","dispatch_failed",{label:r.label,sessionId:r.sessionId,target:r.target,phase:r.phase,messageKind:r.messageKind,route:r.routeSummary,attempt:o,maxAttempts:bt,elapsedMs:l,error:`${ao(s)}${m}`,terminal:!0,ambiguousResult:!0}),r.onAmbiguousResult?.(),n?.();return}if(o>=bt){this.log("error","dispatch_failed",{label:r.label,sessionId:r.sessionId,target:r.target,phase:r.phase,messageKind:r.messageKind,route:r.routeSummary,attempt:o,maxAttempts:bt,elapsedMs:l,error:`${ao(s)}${m}`,terminal:!0}),r.onFinalFailure?.(),n?.();return}let y=this.retryDelayMs(o);this.log("error","dispatch_retry_scheduled",{label:r.label,sessionId:r.sessionId,target:r.target,phase:r.phase,messageKind:r.messageKind,route:r.routeSummary,attempt:o,maxAttempts:bt,elapsedMs:l,retryDelayMs:y,error:`${ao(s)}${m}`});let f={timer:setTimeout(()=>{let k=this.pendingRetryTimers.get(r.sessionId);k&&(k.delete(f),k.size===0&&this.pendingRetryTimers.delete(r.sessionId)),this.executeNow(e,r,n,o+1)},y),onCleared:n};f.timer.unref?.(),this.pendingRetryTimers.has(r.sessionId)||this.pendingRetryTimers.set(r.sessionId,new Set),this.pendingRetryTimers.get(r.sessionId).add(f)})}executePromiseNow(e,r,n,o=1){if(this.disposed){n?.();return}let i=Date.now();o===1&&r.onStarted?.(),this.log("info","dispatch_started",{label:r.label,sessionId:r.sessionId,target:r.target,phase:r.phase,messageKind:r.messageKind,route:r.routeSummary,attempt:o,maxAttempts:bt}),this.executePromiseWithTimeout(e).then(()=>{if(this.disposed){n?.();return}let s=Date.now()-i;this.log("info","dispatch_succeeded",{label:r.label,sessionId:r.sessionId,target:r.target,phase:r.phase,messageKind:r.messageKind,route:r.routeSummary,attempt:o,maxAttempts:bt,elapsedMs:s}),r.onSuccess?.(),n?.()}).catch(s=>{if(this.disposed){n?.();return}let a=Date.now()-i;if(o>=bt){this.log("error","dispatch_failed",{label:r.label,sessionId:r.sessionId,target:r.target,phase:r.phase,messageKind:r.messageKind,route:r.routeSummary,attempt:o,maxAttempts:bt,elapsedMs:a,error:ao(s),terminal:!0}),r.onFinalFailure?.(),n?.();return}let d=this.retryDelayMs(o);this.log("error","dispatch_retry_scheduled",{label:r.label,sessionId:r.sessionId,target:r.target,phase:r.phase,messageKind:r.messageKind,route:r.routeSummary,attempt:o,maxAttempts:bt,elapsedMs:a,retryDelayMs:d,error:ao(s)});let l={timer:setTimeout(()=>{let m=this.pendingRetryTimers.get(r.sessionId);m&&(m.delete(l),m.size===0&&this.pendingRetryTimers.delete(r.sessionId)),this.executePromiseNow(e,r,n,o+1)},d),onCleared:n};l.timer.unref?.(),this.pendingRetryTimers.has(r.sessionId)||this.pendingRetryTimers.set(r.sessionId,new Set),this.pendingRetryTimers.get(r.sessionId).add(l)})}executePromiseWithTimeout(e){return new Promise((r,n)=>{let o=!1,i=setTimeout(()=>{o||(o=!0,n(ex()))},nl);i.unref?.(),Promise.resolve().then(e).then(()=>{o||(o=!0,clearTimeout(i),r())}).catch(s=>{o||(o=!0,clearTimeout(i),n(s))})})}retryDelayMs(e){let r=Math.max(0,e-1),n=XI*2**r;return Math.min(n,ZI)}enqueueOrderedDispatch(e,r){let o=(this.orderedDispatchTails.get(e)??Promise.resolve()).catch(()=>{}).then(()=>{if(!this.disposed)return new Promise(i=>{let s=!1;r(()=>{s||(s=!0,i())})})});this.orderedDispatchTails.set(e,o),o.finally(()=>{this.orderedDispatchTails.get(e)===o&&this.orderedDispatchTails.delete(e)})}log(e,r,n){let o=`[WakeDispatcher] ${JSON.stringify({event:r,...n})}`;if(e==="error"){console.error(o);return}console.info(o)}};Ar();var ys=class{resolve(e){let r=ii(e);if(!(!r?.provider||!r.target))return{channel:r.provider,target:r.target,accountId:r.accountId,threadId:r.threadId,sessionKey:r.sessionKey}}summary(e){if(!e)return"system";let r=e.accountId?`|${e.accountId}`:"",n=e.threadId?`#${e.threadId}`:"";return`${e.channel}${r}|${e.target}${n}`}};import{randomUUID as nx}from"crypto";var ox="openclaw/plugin-sdk/discord",ks=class{constructor(e={}){this.options=e}options;discordComponentSenderPromise=null;buildChatSendArgs(e,r,n){return["gateway","call","chat.send","--expect-final","--timeout","30000","--params",JSON.stringify({sessionKey:e,message:r,deliver:n,idempotencyKey:nx()})]}buildDirectNotificationArgs(e,r,n){let o=["message","send","--channel",e.channel,"--target",e.target,"--message",r];return e.accountId&&o.push("--account",e.accountId),e.threadId&&o.push("--thread-id",e.threadId),n&&e.channel==="telegram"&&o.push("--buttons",JSON.stringify(n.map(i=>i.map(s=>({text:s.label,callback_data:s.callbackData.startsWith(`${ur}:`)?s.callbackData:`${ur}:${s.callbackData}`}))))),o}prefixCallbackData(e){return e.startsWith(`${ur}:`)?e:`${ur}:${e}`}resolveDiscordButtonStyle(e){let r=e.trim().toLowerCase();return r==="approve"||r==="open pr"?"primary":r==="merge"||r==="resume"?"success":r==="reject"||r==="discard"?"danger":"secondary"}buildDiscordComponentSpec(e){let r=[];for(let n of e)if(!(!Array.isArray(n)||n.length===0))for(let o=0;o<n.length;o+=5){let i=n.slice(o,o+5);r.push({type:"actions",buttons:i.map(s=>({label:s.label,callbackData:this.prefixCallbackData(s.callbackData),style:this.resolveDiscordButtonStyle(s.label)}))})}return{blocks:r}}resolveDiscordComponentTarget(e){let r=e.threadId?.trim();return r?`channel:${r}`:e.target}async loadDiscordComponentSender(){if(!this.discordComponentSenderPromise){let e=this.options.resolveDiscordSdkModuleUrl?.()??ox;this.discordComponentSenderPromise=import(e).then(r=>{if(typeof r.sendDiscordComponentMessage!="function")throw new Error("OpenClaw Discord component sender export is unavailable");return r.sendDiscordComponentMessage}).catch(r=>{throw this.discordComponentSenderPromise=null,r})}return this.discordComponentSenderPromise}async sendDiscordComponents(e,r){await(await this.loadDiscordComponentSender())(this.resolveDiscordComponentTarget(e),this.buildDiscordComponentSpec(r),e.accountId?{accountId:e.accountId}:void 0)}buildSystemEventArgs(e){return["system","event","--text",e,"--mode","now"]}};var vs=class{routes=new ys;transport;executor=new Ss;constructor(e={}){this.transport=e.transport??new ks(e.transportOptions)}clearPendingRetries(){this.executor.clearPendingRetries()}clearRetryTimersForSession(e){this.executor.clearRetryTimersForSession(e)}dispose(){this.executor.dispose()}sendWake(e,r,n,o,i,s){let d=this.routes.resolve(e)?.sessionKey?.trim();if(!d){this.executor.execute(this.transport.buildSystemEventArgs(r),{label:`${n}-system`,sessionId:e.id,target:"system.event",phase:o,routeSummary:"system",messageKind:"wake",onSuccess:s,onFinalFailure:i});return}this.executor.execute(this.transport.buildChatSendArgs(d,r,!0),{label:n,sessionId:e.id,target:"chat.send",phase:o,routeSummary:`session:${d}`,messageKind:"wake",onSuccess:s,onFinalFailure:()=>{this.executor.execute(this.transport.buildSystemEventArgs(r),{label:`${n}-fallback`,sessionId:e.id,target:"system.event",phase:o,routeSummary:"system",messageKind:"wake",onSuccess:s,onFinalFailure:i})}})}sendUserNotification(e,r,n,o,i,s){let a=!!(o&&o.length>0),d=this.routes.resolve(e),l=d?`notify:${d.channel}|${d.accountId??""}|${d.target}|${d.threadId??""}`:`notify:system:${e.id}`;if(!d){if(a){console.warn(`[WakeDispatcher] Interactive notification "${n}" for session ${e.id} has no direct route; refusing text-only fallback because buttons would be lost.`),i?.();return}this.executor.execute(this.transport.buildSystemEventArgs(r),{label:`${n}-notify-system`,sessionId:e.id,target:"system.event",phase:"notify",routeSummary:"system",messageKind:"notify",orderingKey:l,onSuccess:s,onFinalFailure:i});return}if(a&&d.channel==="discord"){let m=()=>{this.executor.executePromise(()=>this.transport.sendDiscordComponents(d,o),{label:`${n}-notify-components`,sessionId:e.id,target:"discord.components",phase:"notify",routeSummary:this.routes.summary(d),messageKind:"notify",onSuccess:s,onFinalFailure:()=>{console.warn(`[WakeDispatcher] Interactive notification "${n}" for session ${e.id} failed Discord component delivery.`),i?.()}})};if(r){this.executor.execute(this.transport.buildDirectNotificationArgs(d,r),{label:`${n}-notify-text`,sessionId:e.id,target:"message.send",phase:"notify",routeSummary:this.routes.summary(d),messageKind:"notify",orderingKey:l,onSuccess:m,onFinalFailure:i});return}m();return}this.executor.execute(this.transport.buildDirectNotificationArgs(d,r,o),{label:`${n}-notify`,sessionId:e.id,target:"message.send",phase:"notify",routeSummary:this.routes.summary(d),messageKind:"notify",orderingKey:l,onSuccess:s,onFinalFailure:()=>{if(a){console.warn(`[WakeDispatcher] Interactive notification "${n}" for session ${e.id} failed direct delivery; refusing text-only fallback because buttons would be lost.`),i?.();return}this.executor.execute(this.transport.buildSystemEventArgs(r),{label:`${n}-notify-fallback`,sessionId:e.id,target:"system.event",phase:"notify",routeSummary:"system",messageKind:"notify",orderingKey:l,onSuccess:s,onFinalFailure:i})}})}sendUserNotificationSequence(e,r,n,o,i){let s=r.map(d=>({text:d.text.trim(),buttons:d.buttons})).filter(d=>d.text.length>0);if(s.length===0){o?.();return}let a=d=>{let l=s[d];if(!l){i?.();return}let m=d===0?o:i;this.sendUserNotification(e,l.text,`${n}-part-${d+1}`,l.buttons,m,()=>a(d+1))};a(0)}dispatchSessionNotification(e,r){let n=r.hooks,o=r.wakeMessageOnNotifySuccess!=null||r.wakeMessageOnNotifyFailed!=null,i=r.notifyUser??(r.wakeMessage?"on-wake-fallback":"always"),s=(r.userMessages?.length?r.userMessages:r.userMessage?.trim()?[{text:r.userMessage.trim(),buttons:r.buttons}]:[]).map(l=>({text:l.text.trim(),buttons:l.buttons})).filter(l=>l.text.length>0),a=s[0]?.text,d=r.wakeMessage?.trim();if(o){let l=r.wakeMessageOnNotifySuccess?.trim(),m=r.wakeMessageOnNotifyFailed?.trim(),g=k=>{k&&(n?.onWakeStarted?.(),this.sendWake(e,k,`${r.label}-wake`,"wake",n?.onWakeFailed,n?.onWakeSucceeded))},y=()=>{n?.onNotifySucceeded?.(),l&&g(l)},f=m?()=>{n?.onNotifyFailed?.(),r.onUserNotifyFailed?.(),g(m)}:()=>{n?.onNotifyFailed?.(),r.onUserNotifyFailed?.()};s.length>0?(n?.onNotifyStarted?.(),this.sendUserNotificationSequence(e,s,r.label,f,y)):f();return}i==="always"&&s.length>0&&(n?.onNotifyStarted?.(),this.sendUserNotificationSequence(e,s,r.label,()=>{n?.onNotifyFailed?.(),r.onUserNotifyFailed?.()},()=>n?.onNotifySucceeded?.())),d&&(n?.onWakeStarted?.(),i==="on-wake-fallback"&&s.length>0&&!this.routes.resolve(e)?.sessionKey&&(n?.onNotifyStarted?.(),this.sendUserNotificationSequence(e,s,r.label,()=>{n?.onNotifyFailed?.(),r.onUserNotifyFailed?.()},()=>n?.onNotifySucceeded?.())),this.sendWake(e,d,`${r.label}-wake`,"wake",n?.onWakeFailed,n?.onWakeSucceeded))}};var Ps=class{constructor(e,r){this.actionTokens=e;this.isGitHubCliAvailable=r}actionTokens;isGitHubCliAvailable;createActionToken(e,r,n={}){return this.actionTokens.createActionToken(e,r,{expiresAt:Date.now()+10080*60*1e3,...n})}consumeActionToken(e){return this.actionTokens.consumeActionToken(e)}getActionToken(e){return this.actionTokens.getActionToken(e)}clearPlanDecisionTokens(e,r){this.actionTokens.deletePlanDecisionTokensForSession(e,r)}makeActionButton(e,r,n,o={}){let i=this.createActionToken(e,r,{label:n,...o});return{label:n,callbackData:i.id}}getWorktreeDecisionButtons(e,r){if(!r)return[];let n=[],o=[this.makeActionButton(e,"worktree-merge","Merge")];if(this.isGitHubCliAvailable())r.worktreePrUrl?(o.push(this.makeActionButton(e,"worktree-view-pr","View PR",{targetUrl:r.worktreePrUrl})),n.push(o),n.push([this.makeActionButton(e,"worktree-update-pr","Sync PR"),this.makeActionButton(e,"worktree-decide-later","Later")])):(o.push(this.makeActionButton(e,"worktree-create-pr","Open PR")),n.push(o),n.push([this.makeActionButton(e,"worktree-decide-later","Later"),this.makeActionButton(e,"worktree-dismiss","Discard")]));else return n.push([...o,this.makeActionButton(e,"worktree-decide-later","Later")]),n.push([this.makeActionButton(e,"worktree-dismiss","Discard")]),n;return r.worktreePrUrl&&n.push([this.makeActionButton(e,"worktree-dismiss","Discard")]),n}getPlanApprovalButtons(e,r){return[[this.makeActionButton(e,"plan-approve","Approve",{planDecisionVersion:r?.planDecisionVersion}),this.makeActionButton(e,"plan-request-changes","Revise",{planDecisionVersion:r?.planDecisionVersion}),this.makeActionButton(e,"plan-reject","Reject",{planDecisionVersion:r?.planDecisionVersion})]]}getResumeButtons(e,r){let n=[];return r.isExplicitlyResumable&&n.push(this.makeActionButton(e,"session-resume","Resume")),n.push(this.makeActionButton(e,"view-output","View output")),[n]}getQuestionButtons(e,r){if(r.length!==0)return[r.map((n,o)=>this.makeActionButton(e,"question-answer",n.label,{optionIndex:o}))]}getMonitorReportButtons(e){let{reportId:r,route:n,planName:o,planPrompt:i,planWorkdir:s}=e;return[[this.makeActionButton(r,"monitor-start-plan","Start Plan",{route:n,launchName:o,launchPrompt:i,launchWorkdir:s}),this.makeActionButton(r,"monitor-dismiss","Dismiss",{route:n})]]}};ke();var ws=class{constructor(e,r){this.wakeDispatcher=e;this.applyPersistedPatch=r}wakeDispatcher;applyPersistedPatch;dispatch(e,r){let n=this.getDeliveryRef(e),o=this.buildCompletionWakePatch(r),i=!!(r.wakeMessage?.trim()||r.wakeMessageOnNotifySuccess?.trim()),s=!!(r.wakeMessage?.trim()||r.wakeMessageOnNotifyFailed?.trim()),a={onNotifyStarted:()=>{this.applyDeliveryState(n,"notifying"),r.hooks?.onNotifyStarted?.()},onNotifySucceeded:()=>{this.applyDeliveryState(n,i?"wake_pending":"idle"),r.hooks?.onNotifySucceeded?.()},onNotifyFailed:()=>{this.applyDeliveryState(n,s?"wake_pending":"failed"),r.hooks?.onNotifyFailed?.()},onWakeStarted:()=>{this.applyPersistedPatchWithCompletionWake(n,"wake_pending",o,{completionWakeIssuedAt:new Date().toISOString(),completionWakeSucceededAt:void 0,completionWakeFailedAt:void 0}),r.hooks?.onWakeStarted?.()},onWakeSucceeded:()=>{this.applyPersistedPatchWithCompletionWake(n,"idle",o,{completionWakeSucceededAt:new Date().toISOString(),completionWakeFailedAt:void 0}),r.hooks?.onWakeSucceeded?.()},onWakeFailed:()=>{this.applyPersistedPatchWithCompletionWake(n,"failed",o,{completionWakeFailedAt:new Date().toISOString()}),r.hooks?.onWakeFailed?.()}};this.wakeDispatcher.dispatchSessionNotification(e,{...r,hooks:a})}notifyWorktreeOutcome(e,r){this.dispatch(e,{label:"worktree-outcome",userMessage:r,notifyUser:"always"})}dispose(){this.wakeDispatcher.dispose()}getDeliveryRef(e){return re(e)??$(e)??""}applyDeliveryState(e,r){!e||!r||this.applyPersistedPatch(e,{deliveryState:r})}applyPersistedPatchWithCompletionWake(e,r,n,o){!e||!r||this.applyPersistedPatch(e,n?{deliveryState:r,...n,...o}:{deliveryState:r})}buildCompletionWakePatch(e){if(!(e.label!=="completed"||e.completionWakeSummaryRequired!==!0))return{completionWakeSummaryRequired:!0}}};ut();import{existsSync as ix}from"fs";var Is=class{getCompletionState(e,r,n,o){return Nd(e,n,o)?"has-commits":Nd(e,o,n)?"base-advanced":dn(r)?"dirty-uncommitted":"no-change"}isResolvedWorktreeEligibleForCleanup(e,r,n){if(!e.worktreePath||!e.workdir||!ix(e.worktreePath)||e.pendingWorktreeDecisionSince||e.worktreeState==="pending_decision")return!1;let o=e.worktreeMergedAt??e.worktreeDismissedAt??e.completedAt??e.createdAt,i=typeof o=="string"?new Date(o).getTime():Number(o??0);return!!i&&r-i>=n}};var xs=class{constructor(e,r,n,o){this.pendingQuestions=e;this.dispatchSessionNotification=r;this.clearWaitingTimestamp=n;this.getQuestionButtons=o}pendingQuestions;dispatchSessionNotification;clearWaitingTimestamp;getQuestionButtons;async handleAskUserQuestion(e,r){let i=r?.questions??[];if(i.length===0)throw new Error("AskUserQuestion: no questions in input");let s=i[0],a=s.options??[],d=this.getQuestionButtons(e.id,a),l=`\u2753 [${e.name}] ${s.question}`,m=[`[ASK USER QUESTION] Session "${e.name}" has a question requiring user input.`,"",`Question: ${s.question}`,...a.length>0?["Options:",...a.map((g,y)=>` ${y+1}. ${g.label}`)]:[],"",`Send the question to the user and call agent_respond(session="${e.id}", message="<answer>") with their answer.`].join(`
148
+ `),buttons:[[this.deps.makeOpenPrButton(e.id)]]})}async handleAutoMergeStrategy(e,r,n,o,i,s,a=re(e)??e.harnessSessionId){this.deps.isAlreadyMerged(a)||e.autoMergeResolverSessionId||await this.deps.enqueueMerge(r,async()=>{if(this.deps.isAlreadyMerged(a))return;let d=this.deps.mergeBranch(r,o,i,"merge",n);if(d.success){this.handleAutoMergeSuccess(e,r,o,i,s,d);return}if(d.rebaseConflict){await this.handleInitialAutoMergeConflict(e,r,n,o,i,d.error);return}let l=d.dirtyError?`\u274C [${e.name}] Merge blocked: ${d.error}`:`\u274C [${e.name}] Merge failed: ${d.error??"unknown error"}`;if(e.worktreeState==="merge_conflict_resolving"||e.worktreeLifecycle?.state==="merge_conflict_resolving"){this.handleAutoMergeRetryFailure(e,o,n,l);return}this.deps.dispatchSessionNotification(e,{label:"worktree-merge-error",userMessage:l})},()=>{this.deps.dispatchSessionNotification(e,{label:"worktree-merge-queued",userMessage:`\u{1F550} [${e.name}] Merge queued \u2014 another merge for this repo is in progress. Will notify when complete.`})})}async handleAutoPrStrategy(e,r){return this.updatePersistedSessionFor(e,{lifecycle:"terminal",worktreeState:"pr_in_progress"}),(await this.deps.runAutoPr(e,r)).success||this.markPendingDecision(e),{notificationSent:!0,worktreeRemoved:!1}}};import{existsSync as HI,writeFileSync as zI}from"fs";br();import{randomUUID as yI}from"crypto";function kI(t){return t==="plan-approve"||t==="plan-request-changes"||t==="plan-reject"}var ls=class{constructor(e,r){this.onChange=e;this.retentionMs=r}onChange;retentionMs;tokens=new Map;afterChange;replaceAll(e){this.tokens.clear();for(let r of e)this.tokens.set(r.id,r)}clear(){this.tokens.clear(),this.notifyChanged()}listForPersistence(){return[...this.tokens.values()]}createActionToken(e,r,n={}){let o={id:yI(),sessionId:e,kind:r,createdAt:Date.now(),...n};return this.tokens.set(o.id,o),this.notifyChanged(),o}getActionToken(e){let r=this.tokens.get(e);if(r){if(r.expiresAt!=null&&r.expiresAt<=Date.now()){this.tokens.delete(e),this.notifyChanged();return}return r}}consumeActionToken(e){let r=this.getActionToken(e);if(!(!r||r.consumedAt!=null))return r.consumedAt=Date.now(),this.notifyChanged(),r}deleteActionTokensForSession(e){let r=!1;for(let[n,o]of this.tokens)o.sessionId===e&&(this.tokens.delete(n),r=!0);r&&this.notifyChanged()}deletePlanDecisionTokensForSession(e,r){let n=!1;for(let[o,i]of this.tokens)i.sessionId!==e||!kI(i.kind)||r!=null&&i.planDecisionVersion===r||(this.tokens.delete(o),n=!0);n&&this.notifyChanged()}purgeExpiredActionTokens(e=Date.now()){let r=!1;for(let[n,o]of this.tokens){let i=o.expiresAt!=null&&o.expiresAt<=e,s=o.consumedAt!=null&&e-o.consumedAt>this.retentionMs;(i||s)&&(this.tokens.delete(n),r=!0)}r&&this.notifyChanged()}nextExpiryAt(){let e;for(let r of this.tokens.values()){let n=[r.expiresAt,r.consumedAt!=null?r.consumedAt+this.retentionMs:void 0].filter(o=>o!=null&&Number.isFinite(o));for(let o of n)(e==null||o<e)&&(e=o)}return e}setAfterChangeListener(e){this.afterChange=e}notifyChanged(){this.onChange(),this.afterChange?.()}};ke();ke();var us=class{constructor(e){this.indexes=e}indexes;hasRecordedSession(e){return this.indexes.idIndex.has(e)}getLatestPersistedByName(e){let r,n=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY,i=Number.NEGATIVE_INFINITY,s=0;for(let a of this.indexes.persisted.values()){if(a.name!==e){s++;continue}let d=a.createdAt??Number.NEGATIVE_INFINITY,l=a.completedAt??Number.NEGATIVE_INFINITY;(d>n||d===n&&l>o||d===n&&l===o&&s>i)&&(r=a,n=d,o=l,i=s),s++}return r}resolveBackendConversationId(e,r){if(r)return r;let n=this.indexes.idIndex.get(e);if(n){let s=this.indexes.persisted.get(n);return(s?$(s):void 0)??n}let o=this.getLatestPersistedByName(e);if(o)return $(o)??o.harnessSessionId;let i=this.indexes.backendIdIndex.get(e);if(i){let s=this.indexes.persisted.get(i);return(s?$(s):void 0)??i}if(this.indexes.persisted.has(e)){let s=this.indexes.persisted.get(e);return s?$(s)??e:e}if(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e))return e}resolveHarnessSessionId(e,r){return this.resolveBackendConversationId(e,r)}getPersistedSession(e){let r=this.indexes.idIndex.get(e);if(r)return this.indexes.persisted.get(r);let n=this.getLatestPersistedByName(e);if(n)return n;let o=this.indexes.backendIdIndex.get(e);return o?this.indexes.persisted.get(o):this.indexes.persisted.get(e)}listPersistedSessions(){return[...this.indexes.persisted.values()].sort((e,r)=>(r.completedAt??0)-(e.completedAt??0))}};import{existsSync as KI,mkdirSync as VI,readFileSync as qI,readdirSync as Zd,renameSync as fg,statSync as gg,unlinkSync as hg,writeFileSync as Sg}from"fs";import{tmpdir as el}from"os";import{dirname as jI,join as fs}from"path";import{homedir as vI}from"node:os";import{join as PI}from"node:path";function dg(t){let e=t.OPENCLAW_HOME?.trim();if(e)return e;let r=t.HOME?.trim()||vI();return PI(r,".openclaw")}br();var ps=6,wI=new Set(["running","completed","failed","killed"]);function so(t){return!!t&&typeof t=="object"}function un(t,e=""){return typeof t=="string"&&t.trim().length>0?t:e}function x(t){return typeof t=="string"&&t.trim().length>0?t:void 0}function je(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function II(t){return t==="low"||t==="medium"||t==="high"?t:void 0}function lg(t){return t==="default"||t==="plan"||t==="bypassPermissions"?t:void 0}function xI(t){return t==="never"||t==="on-request"?"never":void 0}function bI(t){return t==="approve"||t==="ask"||t==="delegate"?t:void 0}function AI(t){if(t==="plan-mode"||t==="codex-first-turn-plan"||t==="soft-plan")return"plan-mode"}function RI(t){return t==="user"||t==="idle-timeout"||t==="startup-timeout"||t==="shutdown"||t==="done"||t==="unknown"?t:void 0}function ug(t){return t==="starting"||t==="active"||t==="awaiting_plan_decision"||t==="awaiting_user_input"||t==="awaiting_worktree_decision"||t==="suspended"||t==="terminal"?t:void 0}function TI(t){return t==="not_required"||t==="pending"||t==="approved"||t==="changes_requested"||t==="rejected"?t:void 0}function MI(t){return t==="none"||t==="provisioned"||t==="pending_decision"||t==="merge_conflict_resolving"||t==="merge_in_progress"||t==="pr_in_progress"||t==="merged"||t==="released"||t==="pr_open"||t==="dismissed"||t==="cleanup_failed"?t:void 0}function CI(t){return t==="none"||t==="provisioned"||t==="pending_decision"||t==="merge_conflict_resolving"||t==="pr_open"||t==="merged"||t==="released"||t==="dismissed"||t==="no_change"||t==="cleanup_failed"?t:void 0}function _I(t){return t==="live"||t==="stopped"?t:void 0}function $I(t){return t==="not_sent"||t==="sending"||t==="delivered"||t==="fallback_delivered"||t==="failed"?t:void 0}function EI(t){return t==="direct-telegram"?"direct-message":t==="none"||t==="direct-message"||t==="wake-only"?t:void 0}function OI(t){return t==="none"||t==="canonical_buttons"||t==="explicit_fallback_text"?t:void 0}function DI(t){return t==="idle"||t==="notifying"||t==="wake_pending"||t==="failed"?t:void 0}function NI(t){return t==="awaiting_plan_output"||t==="awaiting_approval"||t==="approved_then_implemented"||t==="implemented_without_required_approval"||t==="not_plan_gated"?t:void 0}function FI(t){return t==="plan-approve"||t==="plan-request-changes"||t==="plan-reject"||t==="monitor-start-plan"||t==="monitor-dismiss"||t==="worktree-merge"||t==="worktree-create-pr"||t==="worktree-update-pr"||t==="worktree-view-pr"||t==="worktree-decide-later"||t==="worktree-dismiss"||t==="session-resume"||t==="session-restart"||t==="view-output"||t==="question-answer"?t:void 0}function pg(t){if(!so(t))return;let e=x(t.provider),r=x(t.accountId),n=x(t.target),o=x(t.threadId),i=x(t.sessionKey);if(!(!e||!n))return{provider:e,accountId:r,target:n,threadId:o,sessionKey:i}}function LI(t,e,r){if(so(t)){let n=x(t.kind),o=x(t.conversationId);if(o&&(n==="claude-code"||n==="codex-app-server"))return{kind:n,conversationId:o,runId:x(t.runId),worktreeId:x(t.worktreeId),worktreePath:x(t.worktreePath)}}if(e==="claude-code")return{kind:"claude-code",conversationId:r}}function WI(t){if(!so(t))return;let e=CI(t.state),r=x(t.updatedAt);if(!e||!r)return;let n=x(t.resolutionSource);return{state:e,updatedAt:r,resolvedAt:x(t.resolvedAt),resolutionSource:n==="agent_merge"||n==="agent_pr"||n==="strategy_no_change"||n==="lifecycle_resolver"||n==="dismiss"||n==="maintenance"?n:void 0,baseBranch:x(t.baseBranch),targetRepo:x(t.targetRepo),pushRemote:x(t.pushRemote),notes:Array.isArray(t.notes)?t.notes.filter(o=>typeof o=="string"&&o.length>0):void 0}}function BI(t){let e=new Date(0).toISOString(),r=x(t.worktreeMergedAt)??x(t.worktreeDismissedAt)??x(t.pendingWorktreeDecisionSince)??e;if(t.worktreeMerged===!0)return{state:"merged",updatedAt:r,resolvedAt:x(t.worktreeMergedAt)??r,resolutionSource:"agent_merge",baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(t.worktreeDisposition==="dismissed")return{state:"dismissed",updatedAt:r,resolvedAt:x(t.worktreeDismissedAt)??r,resolutionSource:"dismiss",baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(t.worktreeDisposition==="no-change-cleaned")return{state:"no_change",updatedAt:r,resolvedAt:r,resolutionSource:"strategy_no_change",baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(t.worktreeDisposition==="pr-opened"||t.worktreeState==="pr_open")return{state:"pr_open",updatedAt:r,baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(t.pendingWorktreeDecisionSince||t.worktreeState==="pending_decision")return{state:"pending_decision",updatedAt:r,baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(t.worktreeState==="merge_conflict_resolving")return{state:"merge_conflict_resolving",updatedAt:r,baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(x(t.worktreePath)||x(t.worktreeBranch))return{state:"provisioned",updatedAt:r,baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)}}function UI(t){if(typeof t=="string"&&wI.has(t))return t==="running"?"killed":t}function cg(t){if(!so(t))return;let e=un(t.harnessSessionId);if(!e)return;let r=UI(t.status);if(!r)return;let n=t.status==="running",o=x(t.worktreePath),i=x(t.worktreeBranch),s=x(t.originChannel),a=typeof t.originThreadId=="string"||typeof t.originThreadId=="number"?t.originThreadId:void 0,d=x(t.originSessionKey),l=pg(t.route);if(!l)return;let m=Zr({route:l,originChannel:s,originThreadId:a,originSessionKey:d});if(!m||o&&!i)return;let g=x(t.harness),y=LI(t.backendRef,g,e),f=WI(t.worktreeLifecycle)??BI(t);return{sessionId:x(t.sessionId),harnessSessionId:e,backendRef:y,name:un(t.name,e),prompt:un(t.prompt),workdir:un(t.workdir,"(unknown)"),model:x(t.model),reasoningEffort:II(t.reasoningEffort),createdAt:je(t.createdAt),completedAt:je(t.completedAt),status:r,lifecycle:n?ug(t.lifecycle)??"suspended":ug(t.lifecycle),approvalState:TI(t.approvalState),worktreeState:MI(t.worktreeState),runtimeState:n?"stopped":_I(t.runtimeState),deliveryState:DI(t.deliveryState),completionWakeIssuedAt:x(t.completionWakeIssuedAt),completionWakeSucceededAt:x(t.completionWakeSucceededAt),completionWakeFailedAt:x(t.completionWakeFailedAt),completionWakeSummaryRequired:t.completionWakeSummaryRequired===!0?!0:void 0,killReason:RI(t.killReason),costUsd:typeof t.costUsd=="number"&&Number.isFinite(t.costUsd)?t.costUsd:0,originAgentId:x(t.originAgentId),originChannel:s,originThreadId:a,originSessionKey:d,route:m,outputPath:x(t.outputPath),harness:g,requestedPermissionMode:lg(t.requestedPermissionMode),currentPermissionMode:lg(t.currentPermissionMode),approvalExecutionState:NI(t.approvalExecutionState),approvalRationale:x(t.approvalRationale),planModeApproved:t.planModeApproved===!0,pendingPlanApproval:t.pendingPlanApproval===!0,planApprovalContext:AI(t.planApprovalContext),planDecisionVersion:je(t.planDecisionVersion),actionablePlanDecisionVersion:je(t.actionablePlanDecisionVersion),canonicalPlanPromptVersion:je(t.canonicalPlanPromptVersion),approvalPromptRequiredVersion:je(t.approvalPromptRequiredVersion),approvalPromptVersion:je(t.approvalPromptVersion),approvalPromptStatus:$I(t.approvalPromptStatus),approvalPromptTransport:EI(t.approvalPromptTransport),approvalPromptMessageKind:OI(t.approvalPromptMessageKind),approvalPromptLastAttemptAt:x(t.approvalPromptLastAttemptAt),approvalPromptDeliveredAt:x(t.approvalPromptDeliveredAt),approvalPromptFailedAt:x(t.approvalPromptFailedAt),planApproval:bI(t.planApproval),codexApprovalPolicy:xI(t.codexApprovalPolicy),worktreePath:o,worktreeBranch:i,worktreeStrategy:t.worktreeStrategy==="off"||t.worktreeStrategy==="manual"||t.worktreeStrategy==="ask"||t.worktreeStrategy==="delegate"||t.worktreeStrategy==="auto-merge"||t.worktreeStrategy==="auto-pr"?t.worktreeStrategy:void 0,worktreeMerged:typeof t.worktreeMerged=="boolean"?t.worktreeMerged:void 0,worktreeMergedAt:x(t.worktreeMergedAt),worktreePrUrl:x(t.worktreePrUrl),worktreePrNumber:je(t.worktreePrNumber),pendingWorktreeDecisionSince:x(t.pendingWorktreeDecisionSince),lastWorktreeReminderAt:x(t.lastWorktreeReminderAt),worktreeBaseBranch:x(t.worktreeBaseBranch),worktreePrTargetRepo:x(t.worktreePrTargetRepo),autoMergeParentSessionId:x(t.autoMergeParentSessionId),autoMergeConflictResolutionAttemptCount:je(t.autoMergeConflictResolutionAttemptCount),autoMergeResolverSessionId:x(t.autoMergeResolverSessionId),worktreePushRemote:x(t.worktreePushRemote),worktreeDecisionSnoozedUntil:x(t.worktreeDecisionSnoozedUntil),worktreeDisposition:t.worktreeDisposition==="active"||t.worktreeDisposition==="pr-opened"||t.worktreeDisposition==="merged"||t.worktreeDisposition==="dismissed"||t.worktreeDisposition==="no-change-cleaned"?t.worktreeDisposition:void 0,worktreeDismissedAt:x(t.worktreeDismissedAt),worktreeLifecycle:f,resumable:n?!0:t.resumable===!0}}function mg(t){if(!so(t))return;let e=FI(t.kind),r=un(t.id),n=un(t.sessionId),o=je(t.createdAt);if(!(!r||!n||!e||o==null))return{id:r,sessionId:n,kind:e,createdAt:o,planDecisionVersion:je(t.planDecisionVersion),expiresAt:je(t.expiresAt),consumedAt:je(t.consumedAt),optionIndex:je(t.optionIndex),label:x(t.label),targetUrl:x(t.targetUrl),route:pg(t.route),launchName:x(t.launchName),launchPrompt:x(t.launchPrompt),launchWorkdir:x(t.launchWorkdir)}}function cs(t){if(!t.backendRef?.kind||!t.backendRef.conversationId)throw new Error(`Persisted session ${t.harnessSessionId} is missing required backend ref metadata.`);if(!t.route?.provider||!t.route.target)throw new Error(`Persisted session ${t.harnessSessionId} is missing required route metadata.`);if(t.worktreePath&&!t.worktreeBranch)throw new Error(`Persisted session ${t.harnessSessionId} is missing required worktreeBranch metadata.`)}function Xd(t){return!!t&&typeof t=="object"}function tl(t){return t instanceof Error?t.message:String(t)}function yg(t){let e=t.OPENCLAW_CODE_AGENT_SESSIONS_PATH?.trim();return e||fs(dg(t),"code-agent-sessions.json")}function kg(t,e,r){try{VI(jI(t),{recursive:!0});let n=t+".tmp";Sg(n,JSON.stringify({schemaVersion:ps,sessions:e,actionTokens:r},null,2),"utf-8"),fg(n,t)}catch(n){console.warn(`[SessionStore] Failed to save session index: ${tl(n)}`)}}function ms(t,e){try{if(!KI(t))return;let r=`${t}.legacy-${Date.now()}.json`;fg(t,r),console.warn(`[SessionStore] Breaking upgrade: archived ${e} session store to ${r}. Legacy sessions are not loaded by this release.`)}catch(r){console.warn(`[SessionStore] Failed to archive legacy session store: ${tl(r)}`)}}function GI(t,e){try{if(e.length===0)return;let r=`${t}.codex-sdk-legacy-${Date.now()}.json`;Sg(r,JSON.stringify(e,null,2),"utf-8"),console.warn(`[SessionStore] Breaking Codex transport upgrade: archived ${e.length} legacy Codex SDK session(s) to ${r}. They are not loaded by the App Server backend.`)}catch(r){console.warn(`[SessionStore] Failed to archive legacy Codex SDK sessions: ${tl(r)}`)}}function vg(t,e){try{let r=el(),n=Zd(r).filter(o=>o.startsWith("openclaw-agent-")&&o.endsWith(".txt"));for(let o of n)try{let i=fs(r,o),s=gg(i).mtimeMs;t-s>e&&hg(i)}catch{}}catch{}}function Pg(t,e){try{let r=el(),n=Zd(r).filter(i=>i.startsWith("openclaw-agent-")&&i.endsWith(".txt")),o;for(let i of n)try{let s=fs(r,i),a=gg(s).mtimeMs+e;if(a<=t)return t;o=o==null?a:Math.min(o,a)}catch{}return o}catch{return}}function wg(t){try{let e=new Set(t),r=el(),n=Zd(r).filter(o=>o.startsWith("openclaw-agent-")&&o.endsWith(".txt"));for(let o of n){let i=fs(r,o);if(!e.has(i))try{hg(i)}catch{}}}catch{}}function Ig(t){let{indexPath:e,clearAll:r,indexPersistedEntry:n,setActionToken:o,purgeExpiredActionTokens:i,saveIndex:s}=t;try{let a=qI(e,"utf-8"),d=JSON.parse(a);if(Array.isArray(d)){ms(e,"legacy array store"),s();return}if(!Xd(d)||d.schemaVersion!==ps&&d.schemaVersion!==4){ms(e,`schema mismatch (expected v${ps})`),s();return}let l=Array.isArray(d.sessions)?d.sessions:[],m=[];for(let y of l){if(Xd(y)&&y.harness==="codex"){let k=Xd(y.backendRef)?y.backendRef:void 0;if((typeof k?.kind=="string"?k.kind:void 0)!=="codex-app-server"){m.push(y);continue}}let f=cg(y);if(!f){r(),ms(e,"invalid v4 session entry"),s();return}n(f)}m.length>0&&(GI(e,m),s());let g=Array.isArray(d.actionTokens)?d.actionTokens:[];for(let y of g){let f=mg(y);if(!f){r(),ms(e,"invalid v4 action token"),s();return}o(f)}i()}catch{}}var QI=new Set(["completed","failed","killed"]),rl=1440*60*1e3;function JI(t){return t instanceof Error?t.message:String(t)}var gs=class{persisted=new Map;idIndex=new Map;nameIndex=new Map;backendIdIndex=new Map;actionTokens;actionTokenStore;indexPath;queries;constructor(e={}){let r=e.env??process.env;this.indexPath=e.indexPath??yg(r),this.actionTokenStore=new ls(()=>this.saveIndex(),rl),this.actionTokens=this.actionTokenStore.tokens,this.queries=new us({persisted:this.persisted,idIndex:this.idIndex,nameIndex:this.nameIndex,backendIdIndex:this.backendIdIndex}),r.OPENCLAW_DEBUG_SESSION_STORE==="1"&&console.warn(`[SessionStore] index path: ${this.indexPath}`),this.loadIndex()}loadIndex(){Ig({indexPath:this.indexPath,clearAll:()=>{this.persisted.clear(),this.idIndex.clear(),this.nameIndex.clear(),this.backendIdIndex.clear(),this.actionTokenStore.clear()},indexPersistedEntry:e=>this.indexPersistedEntry(e),setActionToken:e=>{this.actionTokens.set(e.id,e)},purgeExpiredActionTokens:()=>this.actionTokenStore.purgeExpiredActionTokens(),saveIndex:()=>this.saveIndex()})}saveIndex(){kg(this.indexPath,[...this.persisted.values()],this.actionTokenStore.listForPersistence())}assertPersistedEntry(e){cs(e)}getEntryStorageKey(e){return e.harnessSessionId}buildPersistedBackendRef(e){return e.backendRef??{kind:_d(e)==="codex"?"codex-app-server":"claude-code",conversationId:e.harnessSessionId}}indexPersistedEntry(e){let r=this.getEntryStorageKey(e);this.persisted.set(r,e),e.sessionId&&this.idIndex.set(e.sessionId,r),e.name&&this.nameIndex.set(e.name,r);let n=$(e);n&&this.backendIdIndex.set(n,r)}removePersistedIndexes(e){let r=this.getEntryStorageKey(e);this.persisted.delete(r);for(let[n,o]of this.idIndex)o===r&&this.idIndex.delete(n);for(let[n,o]of this.nameIndex)o===r&&this.nameIndex.delete(n);for(let[n,o]of this.backendIdIndex)o===r&&this.backendIdIndex.delete(n)}markRunning(e){if(!e.harnessSessionId)return;let r=typeof e.controlStateSnapshot=="function"?e.controlStateSnapshot():{planModeApproved:!1},n=Zr({route:e.route,originChannel:e.originChannel,originThreadId:e.originThreadId,originSessionKey:e.originSessionKey});if(!n)return;let o={sessionId:e.id,harnessSessionId:e.harnessSessionId,backendRef:this.buildPersistedBackendRef(e),name:e.name,prompt:e.prompt,workdir:e.originalWorkdir??e.workdir,model:e.model,reasoningEffort:e.reasoningEffort,createdAt:e.startedAt,status:"running",lifecycle:e.lifecycle,approvalState:e.approvalState,worktreeState:e.worktreeState,runtimeState:e.runtimeState,deliveryState:e.deliveryState,costUsd:0,originAgentId:e.originAgentId,originChannel:e.originChannel,originThreadId:e.originThreadId,originSessionKey:e.originSessionKey,route:n,harness:e.harnessName,requestedPermissionMode:e.requestedPermissionMode,currentPermissionMode:e.currentPermissionMode,approvalExecutionState:e.approvalExecutionState,approvalRationale:e.approvalRationale,planModeApproved:r.planModeApproved,pendingPlanApproval:e.pendingPlanApproval,planApprovalContext:e.planApprovalContext,planDecisionVersion:e.planDecisionVersion,actionablePlanDecisionVersion:e.actionablePlanDecisionVersion,canonicalPlanPromptVersion:e.canonicalPlanPromptVersion,approvalPromptRequiredVersion:e.approvalPromptRequiredVersion,approvalPromptVersion:e.approvalPromptVersion,approvalPromptStatus:e.approvalPromptStatus,approvalPromptTransport:e.approvalPromptTransport,approvalPromptMessageKind:e.approvalPromptMessageKind,approvalPromptLastAttemptAt:e.approvalPromptLastAttemptAt,approvalPromptDeliveredAt:e.approvalPromptDeliveredAt,approvalPromptFailedAt:e.approvalPromptFailedAt,planApproval:e.planApproval,codexApprovalPolicy:e.codexApprovalPolicy,worktreePath:e.worktreePath,worktreeBranch:e.worktreeBranch,worktreeStrategy:e.worktreeStrategy,worktreeBaseBranch:e.worktreeBaseBranch,worktreePrTargetRepo:e.worktreePrTargetRepo,autoMergeParentSessionId:e.autoMergeParentSessionId,autoMergeConflictResolutionAttemptCount:e.autoMergeConflictResolutionAttemptCount,autoMergeResolverSessionId:e.autoMergeResolverSessionId,worktreeLifecycle:e.worktreeLifecycle,resumable:e.isExplicitlyResumable};cs(o),this.indexPersistedEntry(o),this.saveIndex()}hasRecordedSession(e){return this.queries.hasRecordedSession(e)}persistTerminal(e){if(!e.harnessSessionId)return;let r=typeof e.controlStateSnapshot=="function"?e.controlStateSnapshot():{planModeApproved:!1},n=Zr({route:e.route,originChannel:e.originChannel,originThreadId:e.originThreadId,originSessionKey:e.originSessionKey});if(!n)return;let o;try{let s=sn(e.id);if(HI(s))o=s;else{let a=e.getOutput().join(`
149
+ `);a.length>0&&(zI(s,a,"utf-8"),o=s)}}catch(s){console.warn(`[SessionStore] Failed to write output file for session ${e.id}: ${JI(s)}`)}let i={sessionId:e.id,harnessSessionId:e.harnessSessionId,backendRef:this.buildPersistedBackendRef(e),name:e.name,prompt:e.prompt,workdir:e.originalWorkdir??e.workdir,model:e.model,reasoningEffort:e.reasoningEffort,createdAt:e.startedAt,completedAt:e.completedAt,status:e.status,lifecycle:e.lifecycle,approvalState:e.approvalState,worktreeState:e.worktreeState,runtimeState:e.runtimeState,deliveryState:e.deliveryState,killReason:e.killReason,costUsd:e.costUsd,originAgentId:e.originAgentId,originChannel:e.originChannel,originThreadId:e.originThreadId,originSessionKey:e.originSessionKey,route:n,outputPath:o,harness:e.harnessName,requestedPermissionMode:e.requestedPermissionMode,currentPermissionMode:e.currentPermissionMode,approvalExecutionState:e.approvalExecutionState,approvalRationale:e.approvalRationale,planModeApproved:r.planModeApproved,pendingPlanApproval:e.pendingPlanApproval,planApprovalContext:e.planApprovalContext,planDecisionVersion:e.planDecisionVersion,actionablePlanDecisionVersion:e.actionablePlanDecisionVersion,canonicalPlanPromptVersion:e.canonicalPlanPromptVersion,approvalPromptRequiredVersion:e.approvalPromptRequiredVersion,approvalPromptVersion:e.approvalPromptVersion,approvalPromptStatus:e.approvalPromptStatus,approvalPromptTransport:e.approvalPromptTransport,approvalPromptMessageKind:e.approvalPromptMessageKind,approvalPromptLastAttemptAt:e.approvalPromptLastAttemptAt,approvalPromptDeliveredAt:e.approvalPromptDeliveredAt,approvalPromptFailedAt:e.approvalPromptFailedAt,planApproval:e.planApproval,codexApprovalPolicy:e.codexApprovalPolicy,worktreePath:e.worktreePath,worktreeBranch:e.worktreeBranch,worktreeStrategy:e.worktreeStrategy,worktreeBaseBranch:e.worktreeBaseBranch,worktreePrTargetRepo:e.worktreePrTargetRepo,autoMergeParentSessionId:e.autoMergeParentSessionId,autoMergeConflictResolutionAttemptCount:e.autoMergeConflictResolutionAttemptCount,autoMergeResolverSessionId:e.autoMergeResolverSessionId,worktreeLifecycle:e.worktreeLifecycle,resumable:e.isExplicitlyResumable};cs(i),this.indexPersistedEntry(i),this.saveIndex()}getLatestPersistedByName(e){return this.queries.getLatestPersistedByName(e)}resolveBackendConversationId(e,r){return this.queries.resolveBackendConversationId(e,r)}resolveHarnessSessionId(e,r){return this.queries.resolveHarnessSessionId(e,r)}getPersistedSession(e){return this.queries.getPersistedSession(e)}listPersistedSessions(){return this.queries.listPersistedSessions()}cleanupTmpOutputFiles(e){this.actionTokenStore.purgeExpiredActionTokens(e),vg(e,rl)}getNextTmpOutputCleanupAt(e){return Pg(e,rl)}evictOldestPersisted(e){let r=this.listPersistedSessions();if(r.length<=e)return[];let n=r.slice(e);for(let o of n)this.removePersistedIndexes(o);return this.saveIndex(),n}shouldGcActiveSession(e,r,n){return!e.completedAt||!QI.has(e.status)?!1:r-e.completedAt>n}getActionToken(e){return this.actionTokenStore.getActionToken(e)}consumeActionToken(e){return this.actionTokenStore.consumeActionToken(e)}deleteActionTokensForSession(e){this.actionTokenStore.deleteActionTokensForSession(e)}purgeExpiredActionTokens(e=Date.now()){this.actionTokenStore.purgeExpiredActionTokens(e)}getNextActionTokenExpiry(){return this.actionTokenStore.nextExpiryAt()}onActionTokensChanged(e){this.actionTokenStore.setAfterChangeListener(e)}hasOutputPathReference(e){for(let r of this.persisted.values())if(r.outputPath===e)return!0;return!1}getReferencedOutputPaths(){return[...new Set([...this.persisted.values()].map(e=>e.outputPath).filter(e=>typeof e=="string"&&e.length>0))]}cleanupOrphanOutputFiles(){wg(this.getReferencedOutputPaths())}};var YI=new Set(["completed","failed","killed"]),hs=class{metrics={totalCostUsd:0,costPerDay:new Map,sessionsByStatus:{completed:0,failed:0,killed:0},totalLaunched:0,totalDurationMs:0,sessionsWithDuration:0,mostExpensive:null};incrementLaunched(){this.metrics.totalLaunched++}recordSession(e){let r=e.costUsd??0,n=e.status;this.metrics.totalCostUsd+=r;let o=new Date(e.completedAt??e.startedAt).toISOString().slice(0,10);if(this.metrics.costPerDay.set(o,(this.metrics.costPerDay.get(o)??0)+r),YI.has(n)&&this.metrics.sessionsByStatus[n]++,e.completedAt){let i=e.completedAt-e.startedAt;this.metrics.totalDurationMs+=i,this.metrics.sessionsWithDuration++}(!this.metrics.mostExpensive||r>this.metrics.mostExpensive.costUsd)&&(this.metrics.mostExpensive={id:e.id,name:e.name,costUsd:r,prompt:Fe(e.prompt,80)})}getMetrics(){return{totalCostUsd:this.metrics.totalCostUsd,costPerDay:new Map(this.metrics.costPerDay),sessionsByStatus:{...this.metrics.sessionsByStatus},totalLaunched:this.metrics.totalLaunched,totalDurationMs:this.metrics.totalDurationMs,sessionsWithDuration:this.metrics.sessionsWithDuration,mostExpensive:this.metrics.mostExpensive?{...this.metrics.mostExpensive}:null}}};import*as xg from"child_process";var nl=3e4,XI=2e3,ZI=2e4,bt=4;function ao(t){return t instanceof Error?t.message:String(t)}function ex(){return new Error(`Dispatch timed out after ${nl}ms`)}function tx(t){if(!(t instanceof Error))return!1;let e=t;return e.killed===!0&&e.signal==="SIGTERM"}var rx={execFile:xg.execFile},Ss=class{pendingRetryTimers=new Map;orderedDispatchTails=new Map;disposed=!1;clearPendingRetries(){for(let e of this.pendingRetryTimers.values())for(let r of e)clearTimeout(r.timer),r.onCleared?.();this.pendingRetryTimers.clear()}clearRetryTimersForSession(e){let r=this.pendingRetryTimers.get(e);if(r){for(let n of r)clearTimeout(n.timer),n.onCleared?.();this.pendingRetryTimers.delete(e)}}dispose(){this.disposed=!0,this.clearPendingRetries(),this.orderedDispatchTails.clear()}execute(e,r,n=1){if(!this.disposed){if(n===1&&r.orderingKey){this.enqueueOrderedDispatch(r.orderingKey,o=>this.executeNow(e,r,o,n));return}this.executeNow(e,r,void 0,n)}}executePromise(e,r,n=1){if(!this.disposed){if(n===1&&r.orderingKey){this.enqueueOrderedDispatch(r.orderingKey,o=>this.executePromiseNow(e,r,o,n));return}this.executePromiseNow(e,r,void 0,n)}}executeNow(e,r,n,o=1){if(this.disposed){n?.();return}let i=Date.now();o===1&&r.onStarted?.(),this.log("info","dispatch_started",{label:r.label,sessionId:r.sessionId,target:r.target,phase:r.phase,messageKind:r.messageKind,route:r.routeSummary,...r.dispatchContext,attempt:o,maxAttempts:bt}),rx.execFile("openclaw",e,{timeout:nl},(s,a,d)=>{if(this.disposed){n?.();return}let l=Date.now()-i;if(!s){this.log("info","dispatch_succeeded",{label:r.label,sessionId:r.sessionId,target:r.target,phase:r.phase,messageKind:r.messageKind,route:r.routeSummary,...r.dispatchContext,attempt:o,maxAttempts:bt,elapsedMs:l}),r.onSuccess?.(),n?.();return}let m=d?.trim()?` | stderr: ${d.trim()}`:"";if(r.target==="message.send"&&tx(s)){this.log("error","dispatch_failed",{label:r.label,sessionId:r.sessionId,target:r.target,phase:r.phase,messageKind:r.messageKind,route:r.routeSummary,...r.dispatchContext,attempt:o,maxAttempts:bt,elapsedMs:l,error:`${ao(s)}${m}`,terminal:!0,ambiguousResult:!0}),r.onAmbiguousResult?.(),n?.();return}if(o>=bt){this.log("error","dispatch_failed",{label:r.label,sessionId:r.sessionId,target:r.target,phase:r.phase,messageKind:r.messageKind,route:r.routeSummary,...r.dispatchContext,attempt:o,maxAttempts:bt,elapsedMs:l,error:`${ao(s)}${m}`,terminal:!0}),r.onFinalFailure?.(),n?.();return}let y=this.retryDelayMs(o);this.log("error","dispatch_retry_scheduled",{label:r.label,sessionId:r.sessionId,target:r.target,phase:r.phase,messageKind:r.messageKind,route:r.routeSummary,...r.dispatchContext,attempt:o,maxAttempts:bt,elapsedMs:l,retryDelayMs:y,error:`${ao(s)}${m}`});let f={timer:setTimeout(()=>{let k=this.pendingRetryTimers.get(r.sessionId);k&&(k.delete(f),k.size===0&&this.pendingRetryTimers.delete(r.sessionId)),this.executeNow(e,r,n,o+1)},y),onCleared:n};f.timer.unref?.(),this.pendingRetryTimers.has(r.sessionId)||this.pendingRetryTimers.set(r.sessionId,new Set),this.pendingRetryTimers.get(r.sessionId).add(f)})}executePromiseNow(e,r,n,o=1){if(this.disposed){n?.();return}let i=Date.now();o===1&&r.onStarted?.(),this.log("info","dispatch_started",{label:r.label,sessionId:r.sessionId,target:r.target,phase:r.phase,messageKind:r.messageKind,route:r.routeSummary,...r.dispatchContext,attempt:o,maxAttempts:bt}),this.executePromiseWithTimeout(e).then(()=>{if(this.disposed){n?.();return}let s=Date.now()-i;this.log("info","dispatch_succeeded",{label:r.label,sessionId:r.sessionId,target:r.target,phase:r.phase,messageKind:r.messageKind,route:r.routeSummary,...r.dispatchContext,attempt:o,maxAttempts:bt,elapsedMs:s}),r.onSuccess?.(),n?.()}).catch(s=>{if(this.disposed){n?.();return}let a=Date.now()-i;if(o>=bt){this.log("error","dispatch_failed",{label:r.label,sessionId:r.sessionId,target:r.target,phase:r.phase,messageKind:r.messageKind,route:r.routeSummary,...r.dispatchContext,attempt:o,maxAttempts:bt,elapsedMs:a,error:ao(s),terminal:!0}),r.onFinalFailure?.(),n?.();return}let d=this.retryDelayMs(o);this.log("error","dispatch_retry_scheduled",{label:r.label,sessionId:r.sessionId,target:r.target,phase:r.phase,messageKind:r.messageKind,route:r.routeSummary,...r.dispatchContext,attempt:o,maxAttempts:bt,elapsedMs:a,retryDelayMs:d,error:ao(s)});let l={timer:setTimeout(()=>{let m=this.pendingRetryTimers.get(r.sessionId);m&&(m.delete(l),m.size===0&&this.pendingRetryTimers.delete(r.sessionId)),this.executePromiseNow(e,r,n,o+1)},d),onCleared:n};l.timer.unref?.(),this.pendingRetryTimers.has(r.sessionId)||this.pendingRetryTimers.set(r.sessionId,new Set),this.pendingRetryTimers.get(r.sessionId).add(l)})}executePromiseWithTimeout(e){return new Promise((r,n)=>{let o=!1,i=setTimeout(()=>{o||(o=!0,n(ex()))},nl);i.unref?.(),Promise.resolve().then(e).then(()=>{o||(o=!0,clearTimeout(i),r())}).catch(s=>{o||(o=!0,clearTimeout(i),n(s))})})}retryDelayMs(e){let r=Math.max(0,e-1),n=XI*2**r;return Math.min(n,ZI)}enqueueOrderedDispatch(e,r){let o=(this.orderedDispatchTails.get(e)??Promise.resolve()).catch(()=>{}).then(()=>{if(!this.disposed)return new Promise(i=>{let s=!1;r(()=>{s||(s=!0,i())})})});this.orderedDispatchTails.set(e,o),o.finally(()=>{this.orderedDispatchTails.get(e)===o&&this.orderedDispatchTails.delete(e)})}log(e,r,n){let o=`[WakeDispatcher] ${JSON.stringify({event:r,...n})}`;if(e==="error"){console.error(o);return}console.info(o)}};br();var ys=class{resolve(e){let r=ii(e);if(!(!r?.provider||!r.target))return{channel:r.provider,target:r.target,accountId:r.accountId,threadId:r.threadId,sessionKey:r.sessionKey}}summary(e){if(!e)return"system";let r=e.accountId?`|${e.accountId}`:"",n=e.threadId?`#${e.threadId}`:"";return`${e.channel}${r}|${e.target}${n}`}};import{randomUUID as nx}from"crypto";var ks=class{constructor(e={}){this.options=e}options;buildChatSendArgs(e,r,n){return["gateway","call","chat.send","--expect-final","--timeout","30000","--params",JSON.stringify({sessionKey:e,message:r,deliver:n,idempotencyKey:nx()})]}buildDirectNotificationArgs(e,r,n){let o=(n??[]).filter(s=>Array.isArray(s)&&s.length>0).map(s=>({type:"buttons",buttons:s.map(a=>({label:a.label,value:this.prefixCallbackData(a.callbackData),...a.style?{style:a.style}:{}}))})),i=["message","send","--channel",e.channel,"--target",e.target,"--message",r];return e.accountId&&i.push("--account",e.accountId),e.threadId&&i.push("--thread-id",e.threadId),o.length>0&&i.push("--presentation",JSON.stringify({blocks:o})),i}prefixCallbackData(e){return e.startsWith(`${ln}:`)?e:`${ln}:${e}`}buildSystemEventArgs(e){return["system","event","--text",e,"--mode","now"]}};var vs=class{routes=new ys;transport;executor=new Ss;constructor(e={}){this.transport=e.transport??new ks(e.transportOptions)}clearPendingRetries(){this.executor.clearPendingRetries()}clearRetryTimersForSession(e){this.executor.clearRetryTimersForSession(e)}dispose(){this.executor.dispose()}buildDispatchContext(e){let r=e.buttons??[],n=r.flat();return{transportRoute:e.routeSummary,transportChannel:e.route?.channel??"system",transportTarget:e.route?.target??"system",transportAccountId:e.route?.accountId,transportThreadId:e.route?.threadId,transportSessionKey:e.route?.sessionKey,messageTextLength:e.text.length,buttonsPresent:n.length>0,buttonRows:r.length||void 0,buttonCount:n.length||void 0,buttonLabels:n.length>0?n.map(o=>o.label):void 0,maxCallbackDataLength:n.length>0?Math.max(...n.map(o=>o.callbackData.length)):void 0}}sendWake(e,r,n,o,i,s){let a=this.routes.resolve(e),d=a?.sessionKey?.trim();if(!d){this.executor.execute(this.transport.buildSystemEventArgs(r),{label:`${n}-system`,sessionId:e.id,target:"system.event",phase:o,routeSummary:"system",messageKind:"wake",dispatchContext:this.buildDispatchContext({routeSummary:"system",text:r}),onSuccess:s,onFinalFailure:i});return}this.executor.execute(this.transport.buildChatSendArgs(d,r,!0),{label:n,sessionId:e.id,target:"chat.send",phase:o,routeSummary:`session:${d}`,messageKind:"wake",dispatchContext:this.buildDispatchContext({routeSummary:`session:${d}`,route:a,text:r}),onSuccess:s,onFinalFailure:()=>{this.executor.execute(this.transport.buildSystemEventArgs(r),{label:`${n}-fallback`,sessionId:e.id,target:"system.event",phase:o,routeSummary:"system",messageKind:"wake",dispatchContext:this.buildDispatchContext({routeSummary:"system",text:r}),onSuccess:s,onFinalFailure:i})}})}sendUserNotification(e,r,n,o,i,s){let a=!!o?.some(m=>Array.isArray(m)&&m.length>0),d=this.routes.resolve(e),l=d?`notify:${d.channel}|${d.accountId??""}|${d.target}|${d.threadId??""}`:`notify:system:${e.id}`;if(!d){if(a){console.warn(`[WakeDispatcher] Interactive notification "${n}" for session ${e.id} has no direct route; refusing text-only fallback because buttons would be lost.`),i?.();return}this.executor.execute(this.transport.buildSystemEventArgs(r),{label:`${n}-notify-system`,sessionId:e.id,target:"system.event",phase:"notify",routeSummary:"system",messageKind:"notify",dispatchContext:this.buildDispatchContext({routeSummary:"system",text:r,buttons:o}),orderingKey:l,onSuccess:s,onFinalFailure:i});return}this.executor.execute(this.transport.buildDirectNotificationArgs(d,r,o),{label:`${n}-notify`,sessionId:e.id,target:"message.send",phase:"notify",routeSummary:this.routes.summary(d),messageKind:"notify",dispatchContext:this.buildDispatchContext({routeSummary:this.routes.summary(d),route:d,text:r,buttons:o}),orderingKey:l,onSuccess:s,onFinalFailure:()=>{if(a){console.warn(`[WakeDispatcher] Interactive notification "${n}" for session ${e.id} failed direct delivery; refusing text-only fallback because buttons would be lost.`),i?.();return}this.executor.execute(this.transport.buildSystemEventArgs(r),{label:`${n}-notify-fallback`,sessionId:e.id,target:"system.event",phase:"notify",routeSummary:"system",messageKind:"notify",dispatchContext:this.buildDispatchContext({routeSummary:"system",text:r}),orderingKey:l,onSuccess:s,onFinalFailure:i})}})}sendUserNotificationSequence(e,r,n,o,i){let s=r.map(d=>({text:d.text.trim(),buttons:d.buttons})).filter(d=>d.text.length>0);if(s.length===0){o?.();return}let a=d=>{let l=s[d];if(!l){i?.();return}let m=d===0?o:i;this.sendUserNotification(e,l.text,`${n}-part-${d+1}`,l.buttons,m,()=>a(d+1))};a(0)}dispatchSessionNotification(e,r){let n=r.hooks,o=r.wakeMessageOnNotifySuccess!=null||r.wakeMessageOnNotifyFailed!=null,i=r.notifyUser??(r.wakeMessage?"on-wake-fallback":"always"),s=(r.userMessages?.length?r.userMessages:r.userMessage?.trim()?[{text:r.userMessage.trim(),buttons:r.buttons}]:[]).map(l=>({text:l.text.trim(),buttons:l.buttons})).filter(l=>l.text.length>0),a=s[0]?.text,d=r.wakeMessage?.trim();if(o){let l=r.wakeMessageOnNotifySuccess?.trim(),m=r.wakeMessageOnNotifyFailed?.trim(),g=k=>{k&&(n?.onWakeStarted?.(),this.sendWake(e,k,`${r.label}-wake`,"wake",n?.onWakeFailed,n?.onWakeSucceeded))},y=()=>{n?.onNotifySucceeded?.(),l&&g(l)},f=m?()=>{n?.onNotifyFailed?.(),r.onUserNotifyFailed?.(),g(m)}:()=>{n?.onNotifyFailed?.(),r.onUserNotifyFailed?.()};s.length>0?(n?.onNotifyStarted?.(),this.sendUserNotificationSequence(e,s,r.label,f,y)):f();return}i==="always"&&s.length>0&&(n?.onNotifyStarted?.(),this.sendUserNotificationSequence(e,s,r.label,()=>{n?.onNotifyFailed?.(),r.onUserNotifyFailed?.()},()=>n?.onNotifySucceeded?.())),d&&(n?.onWakeStarted?.(),i==="on-wake-fallback"&&s.length>0&&!this.routes.resolve(e)?.sessionKey&&(n?.onNotifyStarted?.(),this.sendUserNotificationSequence(e,s,r.label,()=>{n?.onNotifyFailed?.(),r.onUserNotifyFailed?.()},()=>n?.onNotifySucceeded?.())),this.sendWake(e,d,`${r.label}-wake`,"wake",n?.onWakeFailed,n?.onWakeSucceeded))}};var Ps=class{constructor(e,r){this.actionTokens=e;this.isGitHubCliAvailable=r}actionTokens;isGitHubCliAvailable;createActionToken(e,r,n={}){return this.actionTokens.createActionToken(e,r,{expiresAt:Date.now()+10080*60*1e3,...n})}consumeActionToken(e){return this.actionTokens.consumeActionToken(e)}getActionToken(e){return this.actionTokens.getActionToken(e)}clearPlanDecisionTokens(e,r){this.actionTokens.deletePlanDecisionTokensForSession(e,r)}makeActionButton(e,r,n,o={}){let i=this.createActionToken(e,r,{label:n,...o});return{label:n,callbackData:i.id,style:this.resolveButtonStyle(r)}}resolveButtonStyle(e){switch(e){case"plan-approve":case"worktree-create-pr":case"worktree-update-pr":case"monitor-start-plan":return"primary";case"worktree-merge":case"session-resume":case"session-restart":return"success";case"plan-reject":case"worktree-dismiss":return"danger";default:return"secondary"}}getWorktreeDecisionButtons(e,r){if(!r)return[];let n=[],o=[this.makeActionButton(e,"worktree-merge","Merge")];if(this.isGitHubCliAvailable())r.worktreePrUrl?(o.push(this.makeActionButton(e,"worktree-view-pr","View PR",{targetUrl:r.worktreePrUrl})),n.push(o),n.push([this.makeActionButton(e,"worktree-update-pr","Sync PR"),this.makeActionButton(e,"worktree-decide-later","Later")])):(o.push(this.makeActionButton(e,"worktree-create-pr","Open PR")),n.push(o),n.push([this.makeActionButton(e,"worktree-decide-later","Later"),this.makeActionButton(e,"worktree-dismiss","Discard")]));else return n.push([...o,this.makeActionButton(e,"worktree-decide-later","Later")]),n.push([this.makeActionButton(e,"worktree-dismiss","Discard")]),n;return r.worktreePrUrl&&n.push([this.makeActionButton(e,"worktree-dismiss","Discard")]),n}getPlanApprovalButtons(e,r){return[[this.makeActionButton(e,"plan-approve","Approve",{planDecisionVersion:r?.planDecisionVersion}),this.makeActionButton(e,"plan-request-changes","Revise",{planDecisionVersion:r?.planDecisionVersion}),this.makeActionButton(e,"plan-reject","Reject",{planDecisionVersion:r?.planDecisionVersion})]]}getResumeButtons(e,r){let n=[];return r.isExplicitlyResumable&&n.push(this.makeActionButton(e,"session-resume","Resume")),n.push(this.makeActionButton(e,"view-output","View output")),[n]}getQuestionButtons(e,r){if(r.length!==0)return[r.map((n,o)=>this.makeActionButton(e,"question-answer",n.label,{optionIndex:o}))]}getMonitorReportButtons(e){let{reportId:r,route:n,planName:o,planPrompt:i,planWorkdir:s}=e;return[[this.makeActionButton(r,"monitor-start-plan","Start Plan",{route:n,launchName:o,launchPrompt:i,launchWorkdir:s}),this.makeActionButton(r,"monitor-dismiss","Dismiss",{route:n})]]}};ke();var ws=class{constructor(e,r){this.wakeDispatcher=e;this.applyPersistedPatch=r}wakeDispatcher;applyPersistedPatch;dispatch(e,r){let n=this.getDeliveryRef(e),o=this.buildCompletionWakePatch(r),i=!!(r.wakeMessage?.trim()||r.wakeMessageOnNotifySuccess?.trim()),s=!!(r.wakeMessage?.trim()||r.wakeMessageOnNotifyFailed?.trim()),a={onNotifyStarted:()=>{this.applyDeliveryState(n,"notifying"),r.hooks?.onNotifyStarted?.()},onNotifySucceeded:()=>{this.applyDeliveryState(n,i?"wake_pending":"idle"),r.hooks?.onNotifySucceeded?.()},onNotifyFailed:()=>{this.applyDeliveryState(n,s?"wake_pending":"failed"),r.hooks?.onNotifyFailed?.()},onWakeStarted:()=>{this.applyPersistedPatchWithCompletionWake(n,"wake_pending",o,{completionWakeIssuedAt:new Date().toISOString(),completionWakeSucceededAt:void 0,completionWakeFailedAt:void 0}),r.hooks?.onWakeStarted?.()},onWakeSucceeded:()=>{this.applyPersistedPatchWithCompletionWake(n,"idle",o,{completionWakeSucceededAt:new Date().toISOString(),completionWakeFailedAt:void 0}),r.hooks?.onWakeSucceeded?.()},onWakeFailed:()=>{this.applyPersistedPatchWithCompletionWake(n,"failed",o,{completionWakeFailedAt:new Date().toISOString()}),r.hooks?.onWakeFailed?.()}};this.wakeDispatcher.dispatchSessionNotification(e,{...r,hooks:a})}notifyWorktreeOutcome(e,r){this.dispatch(e,{label:"worktree-outcome",userMessage:r,notifyUser:"always"})}dispose(){this.wakeDispatcher.dispose()}getDeliveryRef(e){return re(e)??$(e)??""}applyDeliveryState(e,r){!e||!r||this.applyPersistedPatch(e,{deliveryState:r})}applyPersistedPatchWithCompletionWake(e,r,n,o){!e||!r||this.applyPersistedPatch(e,n?{deliveryState:r,...n,...o}:{deliveryState:r})}buildCompletionWakePatch(e){if(!(e.label!=="completed"||e.completionWakeSummaryRequired!==!0))return{completionWakeSummaryRequired:!0}}};ut();import{existsSync as ox}from"fs";var Is=class{getCompletionState(e,r,n,o){return Nd(e,n,o)?"has-commits":Nd(e,o,n)?"base-advanced":an(r)?"dirty-uncommitted":"no-change"}isResolvedWorktreeEligibleForCleanup(e,r,n){if(!e.worktreePath||!e.workdir||!ox(e.worktreePath)||e.pendingWorktreeDecisionSince||e.worktreeState==="pending_decision")return!1;let o=e.worktreeMergedAt??e.worktreeDismissedAt??e.completedAt??e.createdAt,i=typeof o=="string"?new Date(o).getTime():Number(o??0);return!!i&&r-i>=n}};var xs=class{constructor(e,r,n,o){this.pendingQuestions=e;this.dispatchSessionNotification=r;this.clearWaitingTimestamp=n;this.getQuestionButtons=o}pendingQuestions;dispatchSessionNotification;clearWaitingTimestamp;getQuestionButtons;async handleAskUserQuestion(e,r){let i=r?.questions??[];if(i.length===0)throw new Error("AskUserQuestion: no questions in input");let s=i[0],a=s.options??[],d=this.getQuestionButtons(e.id,a),l=`\u2753 [${e.name}] ${s.question}`,m=[`[ASK USER QUESTION] Session "${e.name}" has a question requiring user input.`,"",`Question: ${s.question}`,...a.length>0?["Options:",...a.map((g,y)=>` ${y+1}. ${g.label}`)]:[],"",`Send the question to the user and call agent_respond(session="${e.id}", message="<answer>") with their answer.`].join(`
150
150
  `);return new Promise((g,y)=>{let f=setTimeout(()=>{this.pendingQuestions.delete(e.id),y(new Error(`AskUserQuestion timed out after 600s for session "${e.name}"`))},6e5);f.unref?.(),this.pendingQuestions.set(e.id,{resolve:g,reject:y,questions:i,timeoutHandle:f}),this.dispatchSessionNotification(e,{label:"ask-user-question",userMessage:l,notifyUser:"always",buttons:d,wakeMessageOnNotifySuccess:["AskUserQuestion delivered to the user.",`Session: ${e.name} | ID: ${e.id}`,`Question: ${s.question}`,"Await their selection \u2014 do NOT answer this question yourself."].join(`
151
- `),wakeMessageOnNotifyFailed:m})})}resolveAskUserQuestion(e,r){let n=this.pendingQuestions.get(e);if(!n){console.warn(`[SessionQuestionService] resolveAskUserQuestion: no pending question for session "${e}"`);return}clearTimeout(n.timeoutHandle),this.pendingQuestions.delete(e);let o=n.questions[0],i=o.options??[],s=i[r];if(!s){n.reject(new Error(`AskUserQuestion: invalid option index ${r} (${i.length} options available)`));return}this.clearWaitingTimestamp(e),n.resolve({behavior:"allow",updatedInput:{questions:n.questions,answers:{[o.question]:s.label}}})}dispose(){for(let e of this.pendingQuestions.values())clearTimeout(e.timeoutHandle),e.reject(new Error("SessionManager disposed before AskUserQuestion resolved."));this.pendingQuestions.clear()}};function sx(t){if(t.requestedPermissionMode==="plan"){if(t.approvalExecutionState==="approved_then_implemented"){if(t.planApproval==="ask"&&t.approvalPromptStatus==="delivered"&&t.approvalPromptMessageKind==="canonical_buttons"&&t.approvalPromptDeliveredAt)return"Approval interpretation: canonical Approve/Revise/Reject buttons were delivered, and implementation after approval was expected.";if(t.approvalState==="approved")return"Approval interpretation: explicit plan approval was recorded before implementation, so leaving plan-only mode was expected."}if(t.approvalExecutionState==="implemented_without_required_approval")return"Approval interpretation: implementation left plan-only mode without a recorded approval."}}function bs(t){let e=sx(t);return[`Requested permission mode: ${t.requestedPermissionMode??"unknown"}`,`Effective permission mode: ${t.currentPermissionMode??"unknown"}`,`Deterministic approval/execution state: ${t.approvalExecutionState??"unknown"}`,...e?[e]:[]]}function lo(t){switch(t){case"user":return"Stopped by user";case"shutdown":return"Stopped by shutdown";case"startup-timeout":return"Stopped by startup timeout";case"unknown":case void 0:return"Stopped unexpectedly";default:return"Stopped"}}function ax(){return{requiresShortFactualSummary:!0,owner:"agent",appliesToOrdinaryTerminalCompletions:!0}}function ol(t){let{sessionId:e,canonicalStatusDetail:r,canonicalStatusDelivered:n=!0}=t;return["[ACTION REQUIRED] Follow your autonomy rules for session completion:",`1. Use agent_output(session='${e}', full=true) to read the full result.`,"2. If this is part of a multi-phase pipeline, launch the next phase NOW \u2014 do not wait for user input.",`3. ${r??(n?"The plugin already sent the canonical completion status to the user.":"The plugin did not confirm delivery of the canonical completion status to the user.")}`,"4. Unless you are silently continuing an internal multi-phase pipeline or there is still no meaningful confirmed outcome to report, you must send the user a short factual completion summary for this completed session.","5. This requirement applies to ordinary terminal/manual completions too, not just delegated worktree decisions.","6. That follow-up belongs to you alone; keep it brief, concrete, and grounded in reliable result data.",...n?["7. Do NOT repeat the plugin's status line, and do NOT rely on the plugin to summarize the completed work for you."]:["7. Because canonical status delivery was not confirmed, account for that gap yourself when you follow up; do NOT assume the plugin already reached the user."]]}function dx(t){let{contract:e,canonicalStatusDelivered:r}=t;return["Completion diagnostics:",`- Canonical completion status delivered to user: ${r?"yes":"no"}`,`- Plugin requested short factual follow-up summary: ${e.requiresShortFactualSummary?"yes":"no"}`,`- Contract applies to ordinary terminal/manual completions: ${e.appliesToOrdinaryTerminalCompletions?"yes":"no"}`]}function il(t){let{session:e,originThreadLine:r,preview:n}=t,o=`$${(e.costUsd??0).toFixed(2)}`,i=It(e.duration),s=ax(),a=d=>["Coding agent session completed.",`Name: ${e.name} | ID: ${e.id}`,`Status: ${e.status}`,r,...bs(e),"","Output preview:",n,"",...dx({contract:s,canonicalStatusDelivered:d}),"",...ol({sessionId:e.id,canonicalStatusDelivered:d})].join(`
151
+ `),wakeMessageOnNotifyFailed:m})})}resolveAskUserQuestion(e,r){let n=this.pendingQuestions.get(e);if(!n){console.warn(`[SessionQuestionService] resolveAskUserQuestion: no pending question for session "${e}"`);return}clearTimeout(n.timeoutHandle),this.pendingQuestions.delete(e);let o=n.questions[0],i=o.options??[],s=i[r];if(!s){n.reject(new Error(`AskUserQuestion: invalid option index ${r} (${i.length} options available)`));return}this.clearWaitingTimestamp(e),n.resolve({behavior:"allow",updatedInput:{questions:n.questions,answers:{[o.question]:s.label}}})}dispose(){for(let e of this.pendingQuestions.values())clearTimeout(e.timeoutHandle),e.reject(new Error("SessionManager disposed before AskUserQuestion resolved."));this.pendingQuestions.clear()}};function ix(t){if(t.requestedPermissionMode==="plan"){if(t.approvalExecutionState==="approved_then_implemented"){if(t.planApproval==="ask"&&t.approvalPromptStatus==="delivered"&&t.approvalPromptMessageKind==="canonical_buttons"&&t.approvalPromptDeliveredAt)return"Approval interpretation: canonical Approve/Revise/Reject buttons were delivered, and implementation after approval was expected.";if(t.approvalState==="approved")return"Approval interpretation: explicit plan approval was recorded before implementation, so leaving plan-only mode was expected."}if(t.approvalExecutionState==="implemented_without_required_approval")return"Approval interpretation: implementation left plan-only mode without a recorded approval."}}function bs(t){let e=ix(t);return[`Requested permission mode: ${t.requestedPermissionMode??"unknown"}`,`Effective permission mode: ${t.currentPermissionMode??"unknown"}`,`Deterministic approval/execution state: ${t.approvalExecutionState??"unknown"}`,...e?[e]:[]]}function lo(t){switch(t){case"user":return"Stopped by user";case"shutdown":return"Stopped by shutdown";case"startup-timeout":return"Stopped by startup timeout";case"unknown":case void 0:return"Stopped unexpectedly";default:return"Stopped"}}function sx(){return{requiresShortFactualSummary:!0,owner:"agent",appliesToOrdinaryTerminalCompletions:!0}}function ol(t){let{sessionId:e,canonicalStatusDetail:r,canonicalStatusDelivered:n=!0}=t;return["[ACTION REQUIRED] Follow your autonomy rules for session completion:",`1. Use agent_output(session='${e}', full=true) to read the full result.`,"2. If this is part of a multi-phase pipeline, launch the next phase NOW \u2014 do not wait for user input.",`3. ${r??(n?"The plugin already sent the canonical completion status to the user.":"The plugin did not confirm delivery of the canonical completion status to the user.")}`,"4. Unless you are silently continuing an internal multi-phase pipeline or there is still no meaningful confirmed outcome to report, you must send the user a short factual completion summary for this completed session.","5. This requirement applies to ordinary terminal/manual completions too, not just delegated worktree decisions.","6. That follow-up belongs to you alone; keep it brief, concrete, and grounded in reliable result data.",...n?["7. Do NOT repeat the plugin's status line, and do NOT rely on the plugin to summarize the completed work for you."]:["7. Because canonical status delivery was not confirmed, account for that gap yourself when you follow up; do NOT assume the plugin already reached the user."]]}function ax(t){let{contract:e,canonicalStatusDelivered:r}=t;return["Completion diagnostics:",`- Canonical completion status delivered to user: ${r?"yes":"no"}`,`- Plugin requested short factual follow-up summary: ${e.requiresShortFactualSummary?"yes":"no"}`,`- Contract applies to ordinary terminal/manual completions: ${e.appliesToOrdinaryTerminalCompletions?"yes":"no"}`]}function il(t){let{session:e,originThreadLine:r,preview:n}=t,o=`$${(e.costUsd??0).toFixed(2)}`,i=It(e.duration),s=sx(),a=d=>["Coding agent session completed.",`Name: ${e.name} | ID: ${e.id}`,`Status: ${e.status}`,r,...bs(e),"","Output preview:",n,"",...ax({contract:s,canonicalStatusDelivered:d}),"",...ol({sessionId:e.id,canonicalStatusDelivered:d})].join(`
152
152
  `);return{userMessage:`\u2705 [${e.name}] Completed | ${o} | ${i}`,wakeMessageOnNotifySuccess:a(!0),wakeMessageOnNotifyFailed:a(!1),followupContract:s}}function sl(t){let{session:e,originThreadLine:r,errorSummary:n,preview:o,worktreeAutoCleaned:i,failedButtons:s}=t,a=o.trim()?["","Output preview:",o]:[],d=i?["","Note: Worktree and branch were auto-removed (zero cost, startup failure)."]:[],l=`$${(e.costUsd??0).toFixed(2)}`,m=It(e.duration);return{userMessage:[`\u274C [${e.name}] Failed | ${l} | ${m}`,` \u26A0\uFE0F ${n}`].join(`
153
153
  `),wakeMessage:["Coding agent session failed.",`Name: ${e.name} | ID: ${e.id}`,`Status: ${e.status}`,r,...bs(e),...e.harnessSessionId?[`Backend conversation ID: ${e.harnessSessionId}`]:[],"","Failure summary:",n,...a,...d,"","[ACTION REQUIRED] Follow your autonomy rules for session failure:",`1. Use agent_output(session='${e.id}', full=true) to inspect the full failure context.`,`2. Continue the same session with agent_respond(session='${e.id}', message='<next instruction>').`,` If you intentionally want to fork or switch harnesses, launch a new session with agent_launch(resume_session_id='${e.id}', fork_session=true, ...)`," If the failure is a launch/config issue, relaunch fresh with agent_launch(prompt=...).","3. Notify the user with the failure cause and the next action you are taking."].join(`
154
154
  `),buttons:s}}function al(t){let{session:e,originThreadLine:r,preview:n}=t,o=`$${(e.costUsd??0).toFixed(2)}`;return{userMessage:`\u23F8\uFE0F [${e.name}] Turn completed | ${o}`,wakeMessage:["Coding agent session turn ended.",`Name: ${e.name}`,`ID: ${e.id}`,`Status: ${e.status}`,`Lifecycle: ${e.lifecycle}`,"","Last output (~20 lines):",n,...r?["",r]:[]].join(`
155
155
  `)}}function dl(t){let{sessionName:e,sessionId:r,branchName:n,baseBranch:o,promptSnippet:i,commitLines:s,moreNote:a,diffSummary:d}=t;return[`[DELEGATED WORKTREE DECISION] Session "${e}" completed with changes.`,"",`Session ID: ${r}`,`Branch: ${n} \u2192 ${o}`,`Commits: ${d.commits} | Files: ${d.filesChanged} | +${d.insertions} / -${d.deletions}`,"",...s,...a?[a]:[],"","Original task prompt (first 500 chars):",i,"","You own the next step for this worktree.",`- Merge immediately with agent_merge(session="${e}", base_branch="${o}") if the changes are clearly in-scope and low-risk.`,"- If a PR is safer, message the user with the summary and ask for confirmation before calling agent_pr().","- If scope or risk is unclear, message the user and ask for guidance.","- Never call agent_pr() autonomously in delegate mode.","- After deciding, notify the user briefly with what you did and why."].join(`
156
156
  `)}function ll(t,e){return[`[DELEGATED WORKTREE DECISION REMINDER] Session "${t.name}" still has an unresolved worktree decision.`,"",`Session ID: ${t.sessionId??t.harnessSessionId}`,`Branch: ${t.worktreeBranch??"unknown"}`,`Pending: ${e}h`,"","Resolve it now:",`- agent_merge(session="${t.name}") if the diff is clearly safe and in scope`,"- If a PR is safer, ask the user before agent_pr()","- If scope or risk is unclear, ask the user for guidance","- Never call agent_pr() autonomously in delegate mode"].join(`
157
157
  `)}function ul(t){let{sessionName:e,sessionId:r,cleanupSummary:n,preview:o,originThreadLine:i,requestedPermissionMode:s,currentPermissionMode:a,approvalExecutionState:d,approvalState:l,planApproval:m,approvalPromptStatus:g,approvalPromptMessageKind:y,approvalPromptDeliveredAt:f}=t,k=o.trim()?["","Output preview:",o]:[];return["Coding agent session completed with no repository changes.",`Name: ${e} | ID: ${r}`,`Worktree outcome: ${n}`,...i?[i]:[],...bs({requestedPermissionMode:s,currentPermissionMode:a,approvalExecutionState:d,approvalState:l,planApproval:m,approvalPromptStatus:g,approvalPromptMessageKind:y,approvalPromptDeliveredAt:f}),...k,"",...ol({sessionId:r,canonicalStatusDetail:"The plugin already sent the canonical completion status to the user, including that no repo changes were kept."})].join(`
158
- `)}function pl(t){let e=[],r=t.changedFiles.slice(0,3).map(o=>`\`${o}\``);if(r.length>0){let o=t.changedFiles.length-r.length;e.push(o>0?`Touches ${r.join(", ")} and ${o} more file${o===1?"":"s"}`:`Touches ${r.join(", ")}`)}let n=[...new Set(t.commitMessages.map(o=>o.message.trim()).filter(Boolean))].slice(0,2);return n.length>0&&e.push(`Recent work: ${n.join("; ")}`),e}var Rg=3200,cl=3e3,lx=2400,ux=120,px=5,cx=280,bg=1400,Ag="- Additional plan details omitted for brevity.";function Tg(t){return t.replace(/^#{1,6}\s+/,"").replace(/^[-*+]\s+/,"").replace(/^\d+[.)]\s+/,"").replace(/^`([^`]+)`$/,"$1").trim()}function mx(t){return t.split(`
159
- `).map(e=>e.trim()).filter(Boolean).map(Tg).map(e=>Fe(e,220)).filter(e=>e.length>0).filter(e=>!/^(plan|proposed plan|implementation plan|review summary|full plan)[:]?$/i.test(e)).filter(e=>!/^(should|can|could|would|will)\b.*\?$/i.test(e)).filter(e=>!/^(thinking|checking|considering|analyzing)\b/i.test(e))}function fx(t){return t.split(`
160
- `).map(e=>e.trim()).filter(Boolean).map(Tg).filter(e=>e.length>0).filter(e=>!/^(plan|proposed plan|implementation plan|review summary|summary|why this was escalated|full plan)[:]?$/i.test(e)).filter(e=>!/^(should|can|could|would|will)\b.*\?$/i.test(e)).filter(e=>!/^(thinking|checking|considering|analyzing)\b/i.test(e))}function ml(t){let e=mx(t);return e.length===0?`Review summary:
158
+ `)}function pl(t){let e=[],r=t.changedFiles.slice(0,3).map(o=>`\`${o}\``);if(r.length>0){let o=t.changedFiles.length-r.length;e.push(o>0?`Touches ${r.join(", ")} and ${o} more file${o===1?"":"s"}`:`Touches ${r.join(", ")}`)}let n=[...new Set(t.commitMessages.map(o=>o.message.trim()).filter(Boolean))].slice(0,2);return n.length>0&&e.push(`Recent work: ${n.join("; ")}`),e}var Rg=3200,cl=3e3,dx=2400,lx=120,ux=5,px=280,bg=1400,Ag="- Additional plan details omitted for brevity.";function Tg(t){return t.replace(/^#{1,6}\s+/,"").replace(/^[-*+]\s+/,"").replace(/^\d+[.)]\s+/,"").replace(/^`([^`]+)`$/,"$1").trim()}function cx(t){return t.split(`
159
+ `).map(e=>e.trim()).filter(Boolean).map(Tg).map(e=>Fe(e,220)).filter(e=>e.length>0).filter(e=>!/^(plan|proposed plan|implementation plan|review summary|full plan)[:]?$/i.test(e)).filter(e=>!/^(should|can|could|would|will)\b.*\?$/i.test(e)).filter(e=>!/^(thinking|checking|considering|analyzing)\b/i.test(e))}function mx(t){return t.split(`
160
+ `).map(e=>e.trim()).filter(Boolean).map(Tg).filter(e=>e.length>0).filter(e=>!/^(plan|proposed plan|implementation plan|review summary|summary|why this was escalated|full plan)[:]?$/i.test(e)).filter(e=>!/^(should|can|could|would|will)\b.*\?$/i.test(e)).filter(e=>!/^(thinking|checking|considering|analyzing)\b/i.test(e))}function ml(t){let e=cx(t);return e.length===0?`Review summary:
161
161
  - Plan details are available in the full session output.`:["Review summary:",...e.slice(0,6).map(r=>`- ${r}`)].join(`
162
- `)}function gx(t){let e=[],r=!1;for(let o of t){let i=o.replace(/\s+/g," ").trim();if(!i)continue;let s=Fe(i,cx);s.length<i.length&&(r=!0);let a=`- ${s}`;if(e.length>=px||[...e,a].join(`
162
+ `)}function fx(t){let e=[],r=!1;for(let o of t){let i=o.replace(/\s+/g," ").trim();if(!i)continue;let s=Fe(i,px);s.length<i.length&&(r=!0);let a=`- ${s}`;if(e.length>=ux||[...e,a].join(`
163
163
  `).length>bg){r=!0;break}e.push(a)}if(e.length===0)return["- Plan details are available in the full session output."];if(!r)return e;let n=[...e];for(;n.length>0&&[...n,Ag].join(`
164
- `).length>bg;)n.pop();return[...n,Ag]}function fl(t){return gx(fx(t)).join(`
165
- `)}function hx(t,e){let r=[],n=t.trim();for(;n.length>e;){let o=n.lastIndexOf(" ",e);o<Math.floor(e*.6)&&(o=e),r.push(n.slice(0,o).trimEnd()),n=n.slice(o).trimStart()}return n.length>0&&r.push(n),r}function Sx(t,e){let r=t.split(`
166
- `),n=[],o="",i=()=>{o.trim().length>0&&(n.push(o.trimEnd()),o="")};for(let s of r){if(s.length>e){i();for(let d of hx(s,e))n.push(d);continue}let a=o.length>0?`${o}
167
- ${s}`:s;if(a.length>e){i(),o=s;continue}o=a}return i(),n}function Mg(t){return Fe(t.trim(),ux)}function Cg(t,e){return e?t?`
164
+ `).length>bg;)n.pop();return[...n,Ag]}function fl(t){return fx(mx(t)).join(`
165
+ `)}function gx(t,e){let r=[],n=t.trim();for(;n.length>e;){let o=n.lastIndexOf(" ",e);o<Math.floor(e*.6)&&(o=e),r.push(n.slice(0,o).trimEnd()),n=n.slice(o).trimStart()}return n.length>0&&r.push(n),r}function hx(t,e){let r=t.split(`
166
+ `),n=[],o="",i=()=>{o.trim().length>0&&(n.push(o.trimEnd()),o="")};for(let s of r){if(s.length>e){i();for(let d of gx(s,e))n.push(d);continue}let a=o.length>0?`${o}
167
+ ${s}`:s;if(a.length>e){i(),o=s;continue}o=a}return i(),n}function Mg(t){return Fe(t.trim(),lx)}function Cg(t,e){return e?t?`
168
168
 
169
169
  Choose Approve, Revise, or Reject below.`:`
170
170
 
171
171
  Approval is still pending for this plan version.`:`
172
172
 
173
- Continued in next message.`}function yx(t){let{sessionName:e,actionableVersion:r,fullPlanText:n,hasButtons:o}=t,i=`\u{1F4CB} [${e}] Plan v${r??"?"} ready for approval:`,s=`
173
+ Continued in next message.`}function Sx(t){let{sessionName:e,actionableVersion:r,fullPlanText:n,hasButtons:o}=t,i=`\u{1F4CB} [${e}] Plan v${r??"?"} ready for approval:`,s=`
174
174
 
175
175
  Full plan (truncated):
176
- `,a=Cg(o,!0),d=Math.max(0,cl-i.length-s.length-a.length);return`${i}${s}${Fe(n,d)}${a}`}function kx(t){let{sessionName:e,actionableVersion:r,fullPlanText:n,hasButtons:o}=t,i=Mg(e),s=lx;for(;s>0;){let a=Sx(n,s),d=a.map((g,y)=>{let f=a.length,k=[`\u{1F4CB} [${i}] Plan v${r??"?"} ready for approval (${y+1}/${f}):`,"",y===0?"Full plan:":""].filter(Boolean).join(`
176
+ `,a=Cg(o,!0),d=Math.max(0,cl-i.length-s.length-a.length);return`${i}${s}${Fe(n,d)}${a}`}function yx(t){let{sessionName:e,actionableVersion:r,fullPlanText:n,hasButtons:o}=t,i=Mg(e),s=dx;for(;s>0;){let a=hx(n,s),d=a.map((g,y)=>{let f=a.length,k=[`\u{1F4CB} [${i}] Plan v${r??"?"} ready for approval (${y+1}/${f}):`,"",y===0?"Full plan:":""].filter(Boolean).join(`
177
177
  `),A=Cg(o,y===f-1);return`${k}
178
- ${g}${A}`}),l=d.reduce((g,y)=>Math.max(g,y.length),0);if(l<=cl)return d;let m=l-cl;s-=Math.max(m,50)}return[yx({sessionName:i,actionableVersion:r,fullPlanText:n,hasButtons:o})]}function gl(t){let{preview:e,artifact:r}=t,n=r?.markdown?.trim();return n&&n.length<=Rg?`Full plan:
178
+ ${g}${A}`}),l=d.reduce((g,y)=>Math.max(g,y.length),0);if(l<=cl)return d;let m=l-cl;s-=Math.max(m,50)}return[Sx({sessionName:i,actionableVersion:r,fullPlanText:n,hasButtons:o})]}function gl(t){let{preview:e,artifact:r}=t,n=r?.markdown?.trim();return n&&n.length<=Rg?`Full plan:
179
179
  ${n}`:ml(n||e)}function _g(t){let{sessionName:e,actionableVersion:r,preview:n,artifact:o,hasButtons:i}=t,s=o?.markdown?.trim(),a=Mg(e);if(s){let l=`\u{1F4CB} [${a}] Plan v${r??"?"} ready for approval:
180
180
 
181
181
  Full plan:
182
182
  ${s}
183
183
 
184
184
  ${i?"Choose Approve, Revise, or Reject below.":"Approval is still pending for this plan version."}`;return l.length<=Rg?{displayMode:"single-full-plan",userMessages:[l],reviewSummary:`Full plan:
185
- ${s}`}:{displayMode:"chunked-full-plan",userMessages:kx({sessionName:e,actionableVersion:r,fullPlanText:s,hasButtons:i}),reviewSummary:ml(s)}}let d=ml(n);return{displayMode:"summary",userMessages:[`\u{1F4CB} [${a}] Plan v${r??"?"} ready for approval:
185
+ ${s}`}:{displayMode:"chunked-full-plan",userMessages:yx({sessionName:e,actionableVersion:r,fullPlanText:s,hasButtons:i}),reviewSummary:ml(s)}}let d=ml(n);return{displayMode:"summary",userMessages:[`\u{1F4CB} [${a}] Plan v${r??"?"} ready for approval:
186
186
 
187
187
  ${d}
188
188
 
189
- ${i?"Choose Approve, Revise, or Reject below.":"Approval is still pending for this plan version."}`],reviewSummary:d}}var $g=700;function vx(t){let e=t?.trim();return e||void 0}function Px(t,e){let r=e?.trim();if(!r)return;if(!t)return r;let n=t.trim(),o=r.split(`
189
+ ${i?"Choose Approve, Revise, or Reject below.":"Approval is still pending for this plan version."}`],reviewSummary:d}}var $g=700;function kx(t){let e=t?.trim();return e||void 0}function vx(t,e){let r=e?.trim();if(!r)return;if(!t)return r;let n=t.trim(),o=r.split(`
190
190
  `).map(a=>a.trimEnd());for(;o.length>0&&!o[o.length-1]?.trim();)o.pop();for(;o.length>0&&o[o.length-1]?.trim()===n;)o.pop();let s=o.filter((a,d,l)=>{let m=a.trim();return!m||m!==n?!0:!l.some((y,f)=>f!==d&&y.trim().length>0&&y.trim()!==n)}).join(`
191
- `).trim();if(!(!s||s===n))return s.length>$g?Wi(s,$g):s}function wx(t){let e=vx(t.questionText)??"The session is waiting for your reply.",r=Px(e,t.contextPreview);return r?[`\u2753 [${t.sessionName}] Question waiting for reply:`,"","Question:",e,"","Recent context:",r].join(`
191
+ `).trim();if(!(!s||s===n))return s.length>$g?Wi(s,$g):s}function Px(t){let e=kx(t.questionText)??"The session is waiting for your reply.",r=vx(e,t.contextPreview);return r?[`\u2753 [${t.sessionName}] Question waiting for reply:`,"","Question:",e,"","Recent context:",r].join(`
192
192
  `):`\u2753 [${t.sessionName}] Question waiting for reply:
193
193
 
194
- ${e}`}function Ix(t,e){return e!=null&&t.approvalPromptRequiredVersion===e&&(t.approvalPromptStatus==="delivered"||t.approvalPromptStatus==="fallback_delivered")}function uo(t){let{session:e,summary:r}=t,n=e.actionablePlanDecisionVersion??e.planDecisionVersion;return[`\u{1F4CB} [${e.name}] Plan v${n??"?"} needs your decision.`,"","Interactive Approve / Revise / Reject buttons could not be delivered, so reply here instead:",'- Reply "approve" to approve and start implementation','- Reply "reject" to reject and stop the session',"- Any other reply will be sent back as revision feedback","","Why this was escalated:","",r].join(`
195
- `)}function hl(t){let{session:e,preview:r,questionText:n,questionContextPreview:o,planArtifact:i,originThreadLine:s,planApprovalMode:a,planApprovalButtons:d,questionButtons:l}=t,m=e.pendingPlanApproval,g=e.actionablePlanDecisionVersion??e.planDecisionVersion,y=Ix(e,g),f=a??"delegate",k=m&&f==="ask"&&!y?_g({sessionName:e.name,actionableVersion:g,preview:r,artifact:i,hasButtons:!!d}):void 0,A=m?k?.reviewSummary??gl({preview:r,artifact:i}):void 0,b=m?k&&k.userMessages.length===1?k.userMessages[0]:void 0:wx({sessionName:e.name,questionText:n??r,contextPreview:o}),w=m&&k&&k.userMessages.length>1?k.userMessages.map((I,R,O)=>({text:I,buttons:R===O.length-1?d:void 0})):void 0;if(m){let I=f,R="Permission mode: plan \u2192 will switch to bypassPermissions on approval";return I==="delegate"?{label:"plan-approval",userMessage:b,userMessages:w,planReviewSummary:A,wakeMessage:["[DELEGATED PLAN APPROVAL] Coding agent session has finished its plan and is requesting approval to implement.",`Name: ${e.name} | ID: ${e.id} | Plan v${g??"?"}`,s,R,"","\u26A0\uFE0F YOU MUST COMPLETE THESE STEPS IN ORDER. Do NOT skip any step.","","\u2501\u2501\u2501 STEP 1 (MANDATORY): Read the full plan \u2501\u2501\u2501",`Call agent_output(session='${e.id}', full=true) to read the FULL plan output.`,"The preview below is truncated \u2014 you MUST read the full output before making any decision.","","Preview (truncated):",r,"","\u2501\u2501\u2501 STEP 2 (MANDATORY): Review privately \u2501\u2501\u2501","You are the delegated decision-maker. Review the plan yourself before involving the user.","If you approve directly, you own the user-facing explanation of what was approved and why.","Keep it short and user-facing: one sentence is usually enough.","","\u2501\u2501\u2501 STEP 3 (ONLY AFTER steps 1 and 2): Decide \u2501\u2501\u2501","Choose ONE:","","APPROVE the plan directly if ALL of the following are true:","- You have read the FULL plan (not just the preview)","- The plan scope matches the original task request","- The changes are low-risk (no destructive operations, no credential handling, no production deployments)","- The plan is clear and well-scoped (no ambiguous requirements or open design questions)","- No architectural decisions that the user should weigh in on","- The working directory and codebase are correct","","ESCALATE to the user and WAIT if ANY of the following are true:","- The plan involves destructive operations (deleting files, dropping tables, force-pushing)","- The plan involves credentials, secrets, or production environments","- The plan requires architectural decisions not covered by the original task","- The scope has expanded beyond the original request","- The requirements are ambiguous or the plan makes assumptions the user should confirm","- You are unsure \u2014 when in doubt, always escalate","",`If approving: call agent_respond(session='${e.id}', message='Approved. Go ahead.', approve=true, approval_rationale='<brief reason>').`,"That rationale should say why approval was safe: for example scope match, low risk, or no meaningful ambiguity.","After approving directly, send the user a short plain-text follow-up explaining what was approved and why.","The plugin's thumbs-up line is only the minimal approval acknowledgment, not the explanation.",`If escalating: call agent_request_plan_approval(session='${e.id}', summary='...') exactly once so the plugin posts the single canonical Approve / Revise / Reject prompt.`,"That summary must concisely explain why this was escalated, plus changed files/components, risk level and why, scope match/expansion, and any concerns or assumptions.","After the canonical prompt exists, WAIT for the user's button click or explicit response and do NOT send a second plain-text recap.",`To request changes without user escalation: call agent_respond(session='${e.id}', message='<your feedback>') and do NOT set approve=true. The agent will revise the plan.`].join(`
194
+ ${e}`}function wx(t,e){return e!=null&&t.approvalPromptRequiredVersion===e&&(t.approvalPromptStatus==="delivered"||t.approvalPromptStatus==="fallback_delivered")}function uo(t){let{session:e,summary:r}=t,n=e.actionablePlanDecisionVersion??e.planDecisionVersion;return[`\u{1F4CB} [${e.name}] Plan v${n??"?"} needs your decision.`,"","Interactive Approve / Revise / Reject buttons could not be delivered, so reply here instead:",'- Reply "approve" to approve and start implementation','- Reply "reject" to reject and stop the session',"- Any other reply will be sent back as revision feedback","","Why this was escalated:","",r].join(`
195
+ `)}function hl(t){let{session:e,preview:r,questionText:n,questionContextPreview:o,planArtifact:i,originThreadLine:s,planApprovalMode:a,planApprovalButtons:d,questionButtons:l}=t,m=e.pendingPlanApproval,g=e.actionablePlanDecisionVersion??e.planDecisionVersion,y=wx(e,g),f=a??"delegate",k=m&&f==="ask"&&!y?_g({sessionName:e.name,actionableVersion:g,preview:r,artifact:i,hasButtons:!!d}):void 0,A=m?k?.reviewSummary??gl({preview:r,artifact:i}):void 0,b=m?k&&k.userMessages.length===1?k.userMessages[0]:void 0:Px({sessionName:e.name,questionText:n??r,contextPreview:o}),w=m&&k&&k.userMessages.length>1?k.userMessages.map((I,R,O)=>({text:I,buttons:R===O.length-1?d:void 0})):void 0;if(m){let I=f,R="Permission mode: plan \u2192 will switch to bypassPermissions on approval";return I==="delegate"?{label:"plan-approval",userMessage:b,userMessages:w,planReviewSummary:A,wakeMessage:["[DELEGATED PLAN APPROVAL] Coding agent session has finished its plan and is requesting approval to implement.",`Name: ${e.name} | ID: ${e.id} | Plan v${g??"?"}`,s,R,"","\u26A0\uFE0F YOU MUST COMPLETE THESE STEPS IN ORDER. Do NOT skip any step.","","\u2501\u2501\u2501 STEP 1 (MANDATORY): Read the full plan \u2501\u2501\u2501",`Call agent_output(session='${e.id}', full=true) to read the FULL plan output.`,"The preview below is truncated \u2014 you MUST read the full output before making any decision.","","Preview (truncated):",r,"","\u2501\u2501\u2501 STEP 2 (MANDATORY): Review privately \u2501\u2501\u2501","You are the delegated decision-maker. Review the plan yourself before involving the user.","If you approve directly, you own the user-facing explanation of what was approved and why.","Keep it short and user-facing: one sentence is usually enough.","","\u2501\u2501\u2501 STEP 3 (ONLY AFTER steps 1 and 2): Decide \u2501\u2501\u2501","Choose ONE:","","APPROVE the plan directly if ALL of the following are true:","- You have read the FULL plan (not just the preview)","- The plan scope matches the original task request","- The changes are low-risk (no destructive operations, no credential handling, no production deployments)","- The plan is clear and well-scoped (no ambiguous requirements or open design questions)","- No architectural decisions that the user should weigh in on","- The working directory and codebase are correct","","ESCALATE to the user and WAIT if ANY of the following are true:","- The plan involves destructive operations (deleting files, dropping tables, force-pushing)","- The plan involves credentials, secrets, or production environments","- The plan requires architectural decisions not covered by the original task","- The scope has expanded beyond the original request","- The requirements are ambiguous or the plan makes assumptions the user should confirm","- You are unsure \u2014 when in doubt, always escalate","",`If approving: call agent_respond(session='${e.id}', message='Approved. Go ahead.', approve=true, approval_rationale='<brief reason>').`,"That rationale should say why approval was safe: for example scope match, low risk, or no meaningful ambiguity.","After approving directly, send the user a short plain-text follow-up explaining what was approved and why.","The plugin's thumbs-up line is only the minimal approval acknowledgment, not the explanation.",`If escalating: call agent_request_plan_approval(session='${e.id}', summary='...') exactly once so the plugin posts the single canonical Approve / Revise / Reject prompt.`,"That summary must concisely explain why this was escalated, plus changed files/components, risk level and why, scope match/expansion, and any concerns or assumptions.","After the canonical prompt exists, WAIT for the user's button click or explicit response and do NOT send a second plain-text recap.",`To request changes without user escalation: call agent_respond(session='${e.id}', message='<your feedback>') and do NOT set approve=true. The agent will revise the plan.`].join(`
196
196
  `)}:I==="ask"?{label:"plan-approval",userMessage:b,userMessages:w,planReviewSummary:A,wakeMessage:["[USER APPROVAL REQUESTED] Coding agent session has finished its plan. The user has been notified via Telegram and must approve directly.",`Name: ${e.name} | ID: ${e.id} | Plan v${g??"?"}`,s,R,"","DO NOT approve this plan yourself. Wait for the user's explicit approval or rejection.","Once the user responds, forward their decision:",` To approve: agent_respond(session='${e.id}', message='Approved. Go ahead.', approve=true)`,` To request changes: agent_respond(session='${e.id}', message='<user feedback>')`,"","Preview (truncated):",r].join(`
197
197
  `),buttons:w?void 0:d}:{label:"plan-approval",userMessage:b,planReviewSummary:A,wakeMessage:["[AUTO-APPROVE] Session has a plan ready. Approve it now:",`agent_respond(session='${e.id}', message='Approved. Go ahead.', approve=true)`].join(`
198
198
  `)}}let C=e.multiTurn?"Multi-turn session":"Session";return{label:"waiting",userMessage:b,wakeMessage:[`[SYSTEM INSTRUCTION: Follow your auto-respond rules strictly. If this is a permission request or "should I continue?" \u2192 auto-respond. For ALL other questions \u2192 forward the agent's EXACT question to the user. Do NOT add your own analysis, commentary, or interpretation. Do NOT "nudge" or "poke" the session.]`,"",`${C} is waiting for a genuine user reply.`,`Name: ${e.name} | ID: ${e.id}`,s,"","Last output:",r,"",`Use agent_respond(session='${e.id}', message='...') to send a reply, or agent_output(session='${e.id}', full: true) to see full context before deciding.`].join(`
199
199
  `),buttons:l}}ke();var As=class t{constructor(e,r,n,o){this.buildRoutingProxy=e;this.dispatchNotification=r;this.updatePersistedSession=n;this.getWorktreeDecisionButtons=o}buildRoutingProxy;dispatchNotification;updatePersistedSession;getWorktreeDecisionButtons;static REMINDER_THRESHOLD_MS=10800*1e3;static REMINDER_INTERVAL_MS=10800*1e3;getNextReminderAt(e){if(!e.pendingWorktreeDecisionSince)return;let r=e.worktreeState==="pending_decision"||e.lifecycle==="awaiting_worktree_decision",n=e.worktreeState==null&&e.lifecycle==null&&!e.worktreeMerged&&!e.worktreePrUrl;if(!r&&!n)return;let o=new Date(e.pendingWorktreeDecisionSince).getTime();if(!Number.isFinite(o))return;let i=[o+t.REMINDER_THRESHOLD_MS];if(e.worktreeDecisionSnoozedUntil){let s=new Date(e.worktreeDecisionSnoozedUntil).getTime();Number.isFinite(s)&&i.push(s)}if(e.lastWorktreeReminderAt){let s=new Date(e.lastWorktreeReminderAt).getTime();Number.isFinite(s)&&i.push(s+t.REMINDER_INTERVAL_MS)}return Math.max(...i)}sendReminderIfDue(e,r=Date.now()){let n=this.getNextReminderAt(e);if(n==null||n>r)return!1;let o=r-new Date(e.pendingWorktreeDecisionSince).getTime(),i=Math.floor(Math.max(0,o)/(3600*1e3));try{this.sendReminderNotification(e,i)}catch(s){return console.warn(`[SessionReminderService] Failed to send stale-decision reminder for session ${e.name}: ${s instanceof Error?s.message:String(s)}`),!1}for(let s of et(e))this.updatePersistedSession(s,{lastWorktreeReminderAt:new Date(r).toISOString()});return!0}sendReminderNotification(e,r){let n=this.buildRoutingProxy({id:e.sessionId??e.name??$(e)??e.harnessSessionId,sessionId:e.sessionId,harnessSessionId:e.harnessSessionId,backendRef:e.backendRef,route:e.route});if(e.worktreeStrategy==="delegate"){this.dispatchNotification(n,{label:`worktree-stale-reminder-${e.name}`,wakeMessage:ll(e,r),notifyUser:"never"});return}let o=[`\u23F0 Reminder: branch \`${e.worktreeBranch??"unknown"}\` is still waiting for a merge decision.`,`Session: ${e.name} | Pending: ${r}h`,"",`agent_merge(session="${e.name}") or agent_pr(session="${e.name}") or agent_worktree_cleanup() to resolve.`].join(`
200
- `);this.dispatchNotification(n,{label:`worktree-stale-reminder-${e.name}`,userMessage:o,notifyUser:"always",buttons:this.getWorktreeDecisionButtons(re(e)??e.harnessSessionId)})}};ut();ke();Ar();import{existsSync as xx,readFileSync as bx}from"fs";function Eg(t,e){return e!=null&&t.approvalPromptRequiredVersion===e&&(t.approvalPromptStatus==="delivered"||t.approvalPromptStatus==="fallback_delivered")}function Ax(t,e){if(t.latestPlanArtifactVersion===e&&t.latestPlanArtifact)return t.latestPlanArtifact;let r=t.planFilePath?.trim();if(!(!r||!xx(r)))try{let n=bx(r,"utf-8").trim();return n?{markdown:n,steps:[]}:void 0}catch{return}}var Rs=class{constructor(e){this.deps=e}deps;buildPlanApprovalWakeText(e,r,n=!1){return[n?"Plan review fallback text delivered to the user because interactive buttons could not be delivered.":"Plan approval buttons delivered to the user.",`Session: ${e.name} | ID: ${e.id} | Plan v${r??"?"}`,`Wait for their ${n?"explicit reply":"button callback"} \u2014 do NOT approve or reject this plan yourself.`].join(`
200
+ `);this.dispatchNotification(n,{label:`worktree-stale-reminder-${e.name}`,userMessage:o,notifyUser:"always",buttons:this.getWorktreeDecisionButtons(re(e)??e.harnessSessionId)})}};ut();ke();br();import{existsSync as Ix,readFileSync as xx}from"fs";function Eg(t,e){return e!=null&&t.approvalPromptRequiredVersion===e&&(t.approvalPromptStatus==="delivered"||t.approvalPromptStatus==="fallback_delivered")}function bx(t,e){if(t.latestPlanArtifactVersion===e&&t.latestPlanArtifact)return t.latestPlanArtifact;let r=t.planFilePath?.trim();if(!(!r||!Ix(r)))try{let n=xx(r,"utf-8").trim();return n?{markdown:n,steps:[]}:void 0}catch{return}}var Rs=class{constructor(e){this.deps=e}deps;buildPlanApprovalWakeText(e,r,n=!1){return[n?"Plan review fallback text delivered to the user because interactive buttons could not be delivered.":"Plan approval buttons delivered to the user.",`Session: ${e.name} | ID: ${e.id} | Plan v${r??"?"}`,`Wait for their ${n?"explicit reply":"button callback"} \u2014 do NOT approve or reject this plan yourself.`].join(`
201
201
  `)}buildPlanApprovalDeliveryFailureWake(e,r){return["[PLAN APPROVAL DELIVERY FAILED] The plugin could not deliver the canonical plan review buttons or the explicit fallback text to the user.",`Name: ${e.name} | ID: ${e.id} | Plan v${r??"?"}`,this.deps.originThreadLine(e),"","No user-visible actionable review prompt is confirmed for this plan version.","Intervene manually before assuming the user saw the plan review request."].join(`
202
- `)}dispatchPlanApprovalFallback(e,r,n){let o=new Date().toISOString();this.deps.dispatchSessionNotification(e,{label:"plan-approval-fallback",userMessage:uo({session:e,summary:n}),notifyUser:"always",hooks:{onNotifyStarted:()=>{this.deps.updatePersistedSession(e.id,{approvalPromptRequiredVersion:r,approvalPromptVersion:r,approvalPromptStatus:"sending",approvalPromptTransport:"direct-telegram",approvalPromptMessageKind:"explicit_fallback_text",approvalPromptLastAttemptAt:o})},onNotifySucceeded:()=>{this.deps.updatePersistedSession(e.id,{approvalPromptRequiredVersion:r,approvalPromptVersion:r,approvalPromptStatus:"fallback_delivered",approvalPromptTransport:"direct-telegram",approvalPromptMessageKind:"explicit_fallback_text",approvalPromptLastAttemptAt:o,approvalPromptDeliveredAt:new Date().toISOString(),approvalPromptFailedAt:void 0})},onNotifyFailed:()=>{this.deps.updatePersistedSession(e.id,{approvalPromptRequiredVersion:r,approvalPromptVersion:r,approvalPromptStatus:"failed",approvalPromptTransport:"direct-telegram",approvalPromptMessageKind:"explicit_fallback_text",approvalPromptLastAttemptAt:o,approvalPromptFailedAt:new Date().toISOString()})}},wakeMessageOnNotifySuccess:this.buildPlanApprovalWakeText(e,r,!0),wakeMessageOnNotifyFailed:this.buildPlanApprovalDeliveryFailureWake(e,r)})}logCompletionWakeDiagnostic(e){console.info(JSON.stringify({event:e.event,sessionId:e.session.id,sessionName:e.session.name,canonicalStatusDelivered:e.canonicalStatusDelivered,requestedShortFactualSummary:e.followupSummaryRequired,completionKind:"terminal"}))}shouldRequestCompletionFollowup(e){return e.originSessionKey?.trim()?.startsWith("agent:main:cron:")?!1:!!ii(e)}handleTurnEnd(e,r){if(e.status!=="running"){console.info(`[SessionManager] Suppressing turn-end wake for session ${e.id} (status=${e.status}) \u2014 terminal notification owns the completion path.`);return}if(!e.goalTaskId){if(r||e.pendingPlanApproval){this.emitWaitingForInput(e);return}if(e.worktreeStrategy==="ask"||e.worktreeStrategy==="delegate"){console.info(`[SessionManager] Suppressing turn-complete wake for session ${e.id} (worktreeStrategy=${e.worktreeStrategy}) \u2014 worktree notification will follow.`);return}this.deps.shouldEmitTurnCompleteWake(e)&&this.emitTurnComplete(e)}}async handleSessionTerminal(e){if(this.deps.persistSession(e),this.deps.clearWaitingTimestamp(e.id),e.goalTaskId){this.deps.clearRetryTimersForSession(e.id);return}let r={notificationSent:!1,worktreeRemoved:!1};e.worktreePath&&e.originalWorkdir&&(r=await this.deps.handleWorktreeStrategy(e));let n=!1;if(e.worktreePath&&e.originalWorkdir&&e.status==="failed"&&e.costUsd===0&&e.duration<3e4){let a=this.deps.resolveWorktreeRepoDir(e.originalWorkdir,e.worktreePath),d=e.worktreeBranch,l=Ne(e);console.info(`[SessionManager] Early startup failure for "${e.name}" \u2014 auto-cleaning worktree (cost=$${e.costUsd.toFixed(2)}, duration=${e.duration}ms)`);let m=!1;if(a&&!l&&(m=tt(a,e.worktreePath)),a&&d&&!l&&m&&Ot(a,d),m){for(let g of et(e))this.deps.updatePersistedSession(g,{worktreePath:void 0,worktreeBranch:void 0});n=!0}}let o=e.worktreeStrategy&&e.worktreeStrategy!=="off"&&e.worktreeStrategy!=="manual";if(!n&&e.worktreePath&&e.originalWorkdir){let a=this.deps.resolveWorktreeRepoDir(e.originalWorkdir,e.worktreePath),d=Ne(e);r.worktreeRemoved?console.info(`[SessionManager] Worktree already removed for "${e.name}" during strategy handling.`):o?console.info(`[SessionManager] Keeping worktree alive for "${e.name}" (strategy=${e.worktreeStrategy}) \u2014 will be cleaned up on explicit resolution.`):a&&!d&&tt(a,e.worktreePath)}if(e.killReason==="done"){if(r.notificationSent||this.deps.hasTurnCompleteWakeMarker(e.id)||!this.deps.shouldEmitTerminalWake(e))return;this.emitCompleted(e);return}if(e.status==="completed"){if(!this.deps.shouldEmitTerminalWake(e))return;this.emitCompleted(e);return}if(e.status==="failed"){if(!this.deps.shouldEmitTerminalWake(e))return;let a=e.error||e.result?.is_error&&e.result.result||e.result?.result||this.deps.extractLastOutputLine(e)||`Session failed with no error details (session=${e.id}, subtype=${e.result?.subtype??"none"}, turns=${e.result?.num_turns??0})`;this.emitFailed(e,Fe(a,200),n);return}let i=`$${(e.costUsd??0).toFixed(2)}`,s=e.duration;if(e.killReason==="idle-timeout"){let a=e.pendingPlanApproval?this.deps.resolvePlanApprovalMode(e):void 0;if(e.pendingPlanApproval){let d=e.actionablePlanDecisionVersion??e.planDecisionVersion,l=Eg(e,d);if(a==="delegate"){this.deps.dispatchSessionNotification(e,{label:"plan-approval-timeout",wakeMessage:["[DELEGATED PLAN APPROVAL REMINDER] Plan review is still pending after the session hit idle timeout.",`Name: ${e.name} | ID: ${e.id}`,this.deps.originThreadLine(e),"The agent already produced a plan and is waiting for a delegated decision.","Review privately first. Approve directly with agent_respond(..., approve=true, approval_rationale='...') if the plan is clearly within scope and low risk.","Escalate only if needed via agent_request_plan_approval(summary='...').","If you approve directly, follow up with a short user-facing explanation; the plugin's thumbs-up line is only the minimal approval acknowledgment.","If a canonical approval prompt was already posted for this plan version, do not restate it in plain text."].join(`
202
+ `)}dispatchPlanApprovalFallback(e,r,n){let o=new Date().toISOString();this.deps.dispatchSessionNotification(e,{label:"plan-approval-fallback",userMessage:uo({session:e,summary:n}),notifyUser:"always",hooks:{onNotifyStarted:()=>{this.deps.updatePersistedSession(e.id,{approvalPromptRequiredVersion:r,approvalPromptVersion:r,approvalPromptStatus:"sending",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"explicit_fallback_text",approvalPromptLastAttemptAt:o})},onNotifySucceeded:()=>{this.deps.updatePersistedSession(e.id,{approvalPromptRequiredVersion:r,approvalPromptVersion:r,approvalPromptStatus:"fallback_delivered",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"explicit_fallback_text",approvalPromptLastAttemptAt:o,approvalPromptDeliveredAt:new Date().toISOString(),approvalPromptFailedAt:void 0})},onNotifyFailed:()=>{this.deps.updatePersistedSession(e.id,{approvalPromptRequiredVersion:r,approvalPromptVersion:r,approvalPromptStatus:"failed",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"explicit_fallback_text",approvalPromptLastAttemptAt:o,approvalPromptFailedAt:new Date().toISOString()})}},wakeMessageOnNotifySuccess:this.buildPlanApprovalWakeText(e,r,!0),wakeMessageOnNotifyFailed:this.buildPlanApprovalDeliveryFailureWake(e,r)})}logCompletionWakeDiagnostic(e){console.info(JSON.stringify({event:e.event,sessionId:e.session.id,sessionName:e.session.name,canonicalStatusDelivered:e.canonicalStatusDelivered,requestedShortFactualSummary:e.followupSummaryRequired,completionKind:"terminal"}))}shouldRequestCompletionFollowup(e){return e.originSessionKey?.trim()?.startsWith("agent:main:cron:")?!1:!!ii(e)}handleTurnEnd(e,r){if(e.status!=="running"){console.info(`[SessionManager] Suppressing turn-end wake for session ${e.id} (status=${e.status}) \u2014 terminal notification owns the completion path.`);return}if(!e.goalTaskId){if(r||e.pendingPlanApproval){this.emitWaitingForInput(e);return}if(e.worktreeStrategy==="ask"||e.worktreeStrategy==="delegate"){console.info(`[SessionManager] Suppressing turn-complete wake for session ${e.id} (worktreeStrategy=${e.worktreeStrategy}) \u2014 worktree notification will follow.`);return}this.deps.shouldEmitTurnCompleteWake(e)&&this.emitTurnComplete(e)}}async handleSessionTerminal(e){if(this.deps.persistSession(e),this.deps.clearWaitingTimestamp(e.id),e.goalTaskId){this.deps.clearRetryTimersForSession(e.id);return}let r={notificationSent:!1,worktreeRemoved:!1};e.worktreePath&&e.originalWorkdir&&(r=await this.deps.handleWorktreeStrategy(e));let n=!1;if(e.worktreePath&&e.originalWorkdir&&e.status==="failed"&&e.costUsd===0&&e.duration<3e4){let a=this.deps.resolveWorktreeRepoDir(e.originalWorkdir,e.worktreePath),d=e.worktreeBranch,l=Ne(e);console.info(`[SessionManager] Early startup failure for "${e.name}" \u2014 auto-cleaning worktree (cost=$${e.costUsd.toFixed(2)}, duration=${e.duration}ms)`);let m=!1;if(a&&!l&&(m=tt(a,e.worktreePath)),a&&d&&!l&&m&&Ot(a,d),m){for(let g of et(e))this.deps.updatePersistedSession(g,{worktreePath:void 0,worktreeBranch:void 0});n=!0}}let o=e.worktreeStrategy&&e.worktreeStrategy!=="off"&&e.worktreeStrategy!=="manual";if(!n&&e.worktreePath&&e.originalWorkdir){let a=this.deps.resolveWorktreeRepoDir(e.originalWorkdir,e.worktreePath),d=Ne(e);r.worktreeRemoved?console.info(`[SessionManager] Worktree already removed for "${e.name}" during strategy handling.`):o?console.info(`[SessionManager] Keeping worktree alive for "${e.name}" (strategy=${e.worktreeStrategy}) \u2014 will be cleaned up on explicit resolution.`):a&&!d&&tt(a,e.worktreePath)}if(e.killReason==="done"){if(r.notificationSent||this.deps.hasTurnCompleteWakeMarker(e.id)||!this.deps.shouldEmitTerminalWake(e))return;this.emitCompleted(e);return}if(e.status==="completed"){if(!this.deps.shouldEmitTerminalWake(e))return;this.emitCompleted(e);return}if(e.status==="failed"){if(!this.deps.shouldEmitTerminalWake(e))return;let a=e.error||e.result?.is_error&&e.result.result||e.result?.result||this.deps.extractLastOutputLine(e)||`Session failed with no error details (session=${e.id}, subtype=${e.result?.subtype??"none"}, turns=${e.result?.num_turns??0})`;this.emitFailed(e,Fe(a,200),n);return}let i=`$${(e.costUsd??0).toFixed(2)}`,s=e.duration;if(e.killReason==="idle-timeout"){let a=e.pendingPlanApproval?this.deps.resolvePlanApprovalMode(e):void 0;if(e.pendingPlanApproval){let d=e.actionablePlanDecisionVersion??e.planDecisionVersion,l=Eg(e,d);if(a==="delegate"){this.deps.dispatchSessionNotification(e,{label:"plan-approval-timeout",wakeMessage:["[DELEGATED PLAN APPROVAL REMINDER] Plan review is still pending after the session hit idle timeout.",`Name: ${e.name} | ID: ${e.id}`,this.deps.originThreadLine(e),"The agent already produced a plan and is waiting for a delegated decision.","Review privately first. Approve directly with agent_respond(..., approve=true, approval_rationale='...') if the plan is clearly within scope and low risk.","Escalate only if needed via agent_request_plan_approval(summary='...').","If you approve directly, follow up with a short user-facing explanation; the plugin's thumbs-up line is only the minimal approval acknowledgment.","If a canonical approval prompt was already posted for this plan version, do not restate it in plain text."].join(`
203
203
  `),notifyUser:"never"}),this.deps.clearRetryTimersForSession(e.id);return}if(a==="ask"&&l){this.deps.dispatchSessionNotification(e,{label:"plan-approval-timeout",notifyUser:"never",wakeMessage:["[PLAN APPROVAL REMINDER] The user already has an actionable plan review prompt for this plan version.",`Name: ${e.name} | ID: ${e.id} | Plan v${d??"?"}`,this.deps.originThreadLine(e),"Do NOT post another approval summary unless canonical delivery is known to be missing."].join(`
204
204
  `)}),this.deps.clearRetryTimersForSession(e.id);return}this.deps.dispatchSessionNotification(e,{label:"plan-approval-timeout",userMessage:[`\u{1F4CB} [${e.name}] Plan v${d??"?"} still awaiting approval after idle timeout | ${i} | ${It(s)}`,"","The agent already produced a plan and is waiting for your decision.","Approve resumes the session and starts implementation.","Revise resumes it in plan mode so it can update the plan first.","Reject keeps the session stopped."].join(`
205
- `),notifyUser:"always",buttons:a==="ask"&&!l?this.deps.getPlanApprovalButtons(e.id,{...e,planDecisionVersion:d}):void 0}),this.deps.clearRetryTimersForSession(e.id);return}this.deps.dispatchSessionNotification(e,{label:"suspended",userMessage:`\u{1F4A4} [${e.name}] Suspended after idle timeout | ${i} | ${It(s)}`,notifyUser:"always",buttons:this.deps.getResumeButtons(e.id,e)}),this.deps.clearRetryTimersForSession(e.id);return}this.deps.notifySession(e,`\u26D4 [${e.name}] ${lo(e.killReason)} | ${i} | ${It(s)}`),this.deps.clearRetryTimersForSession(e.id)}emitWaitingForInput(e){if(!this.deps.debounceWaitingEvent(e.id))return;let r=e.pendingPlanApproval?this.deps.resolvePlanApprovalMode(e):void 0,n=e.actionablePlanDecisionVersion??e.planDecisionVersion,o=e.pendingPlanApproval&&r==="ask"&&Eg(e,n),i=e.pendingPlanApproval?void 0:this.deps.getOutputPreview(e),s=!e.pendingPlanApproval&&e.pendingInputState?.promptText?e.pendingInputState.promptText:!e.pendingPlanApproval&&i!==void 0?i:this.deps.getOutputPreview(e,e.pendingPlanApproval&&r!=="delegate"?Number.POSITIVE_INFINITY:void 0),a=e.pendingPlanApproval&&r==="ask"&&!o?this.deps.getPlanApprovalButtons(e.id,{...e,planDecisionVersion:n}):!e.pendingPlanApproval&&e.pendingInputState?.options.length?this.deps.getQuestionButtons(e.id,e.pendingInputState.options.map(g=>({label:g}))):void 0,d=Ax(e,n),l=hl({session:e,preview:s,questionText:e.pendingPlanApproval?void 0:e.pendingInputState?.promptText,questionContextPreview:i,planArtifact:d,originThreadLine:this.deps.originThreadLine(e),planApprovalMode:r,planApprovalButtons:a,questionButtons:e.pendingPlanApproval?void 0:a}),m=l.planReviewSummary??s;if(l.label==="plan-approval"&&r==="ask"&&o){this.deps.dispatchSessionNotification(e,{label:l.label,userMessage:l.userMessage,userMessages:l.userMessages,notifyUser:"never",buttons:l.buttons,wakeMessage:l.wakeMessage});return}if(l.label==="plan-approval"&&r==="ask"){this.deps.dispatchSessionNotification(e,{label:l.label,userMessage:l.userMessage,userMessages:l.userMessages,notifyUser:"always",buttons:l.buttons,hooks:{onNotifyStarted:()=>{this.deps.updatePersistedSession(e.id,{approvalPromptRequiredVersion:n,approvalPromptVersion:n,approvalPromptStatus:"sending",approvalPromptTransport:"direct-telegram",approvalPromptMessageKind:"canonical_buttons",approvalPromptLastAttemptAt:new Date().toISOString()})},onNotifySucceeded:()=>{this.deps.updatePersistedSession(e.id,{canonicalPlanPromptVersion:n,approvalPromptRequiredVersion:n,approvalPromptVersion:n,approvalPromptStatus:"delivered",approvalPromptTransport:"direct-telegram",approvalPromptMessageKind:"canonical_buttons",approvalPromptDeliveredAt:new Date().toISOString(),approvalPromptFailedAt:void 0})},onNotifyFailed:()=>{this.deps.updatePersistedSession(e.id,{approvalPromptRequiredVersion:n,approvalPromptVersion:n,approvalPromptStatus:"failed",approvalPromptTransport:"direct-telegram",approvalPromptMessageKind:"canonical_buttons",approvalPromptFailedAt:new Date().toISOString()})}},onUserNotifyFailed:()=>this.dispatchPlanApprovalFallback(e,n,m),wakeMessageOnNotifySuccess:this.buildPlanApprovalWakeText(e,n)});return}if(l.label==="plan-approval"){this.deps.dispatchSessionNotification(e,{label:l.label,userMessage:l.userMessage,wakeMessage:l.wakeMessage,notifyUser:"never",buttons:l.buttons});return}this.deps.dispatchSessionNotification(e,{label:l.label,userMessage:l.userMessage,notifyUser:"always",buttons:l.buttons,wakeMessageOnNotifyFailed:l.wakeMessage})}emitTurnComplete(e){console.info(`[SessionManager] turn-complete wake dispatching for session ${e.id} (turns=${e.result?.num_turns??0}, strategy=${e.worktreeStrategy??"none"})`);let r=al({session:e,originThreadLine:this.deps.originThreadLine(e),preview:this.deps.getOutputPreview(e)});this.deps.dispatchSessionNotification(e,{label:"turn-complete",userMessage:r.userMessage,wakeMessage:r.wakeMessage,notifyUser:"always",onUserNotifyFailed:()=>{console.warn(`[SessionManager] turn-complete delivery failed for session ${e.id} \u2014 firing terminal notification as fallback`),this.deps.shouldEmitTerminalWake(e)&&this.emitCompleted(e)}})}emitCompleted(e){let r=this.deps.getOutputPreview(e),n=this.shouldRequestCompletionFollowup(e),o=il({session:e,originThreadLine:this.deps.originThreadLine(e),preview:r}),i;this.deps.dispatchSessionNotification(e,{label:"completed",userMessage:o.userMessage,notifyUser:"always",completionWakeSummaryRequired:n,wakeMessageOnNotifySuccess:n?o.wakeMessageOnNotifySuccess:void 0,wakeMessageOnNotifyFailed:n?o.wakeMessageOnNotifyFailed:void 0,hooks:{onNotifySucceeded:()=>{i=!0,this.logCompletionWakeDiagnostic({session:e,event:"completion_notify_succeeded",canonicalStatusDelivered:i,followupSummaryRequired:n})},onNotifyFailed:()=>{i=!1,this.logCompletionWakeDiagnostic({session:e,event:"completion_notify_failed",canonicalStatusDelivered:i,followupSummaryRequired:n})},onWakeSucceeded:()=>{this.logCompletionWakeDiagnostic({session:e,event:"completion_wake_succeeded",canonicalStatusDelivered:i,followupSummaryRequired:n})}}})}emitFailed(e,r,n){let o=sl({session:e,originThreadLine:this.deps.originThreadLine(e),errorSummary:r,preview:this.deps.getOutputPreview(e),worktreeAutoCleaned:n,failedButtons:this.deps.getResumeButtons(e.id,e)});this.deps.dispatchSessionNotification(e,{label:"failed",userMessage:o.userMessage,wakeMessage:o.wakeMessage,notifyUser:"always",buttons:o.buttons})}};ke();ut();import{existsSync as Rx}from"fs";var Ts=class{constructor(e){this.deps=e}deps;async dismissWorktree(e){let r=this.deps.getPersistedSession(e),n=this.deps.resolveActiveSession(e),o=n??r;if(!o)return`Error: Session "${e}" not found.`;let i=n?.worktreePath??r?.worktreePath,s=this.deps.resolveWorktreeRepoDir(n?.originalWorkdir??r?.workdir,i),a=n?.worktreeBranch??r?.worktreeBranch,d=n?.name??r?.name??e;if(!s)return`Error: No workdir found for session "${e}".`;let l=Ne(o);!l&&i&&Rx(i)&&tt(s,i,{destructive:!0}),a&&Ot(s,a);for(let g of et(n??r))this.deps.updatePersistedSession(g,{worktreeDisposition:"dismissed",worktreeDismissedAt:new Date().toISOString(),pendingWorktreeDecisionSince:void 0,worktreeState:"dismissed",lifecycle:"terminal",worktreePath:void 0,worktreeBranch:void 0,worktreeLifecycle:{state:"dismissed",updatedAt:new Date().toISOString(),resolvedAt:new Date().toISOString(),resolutionSource:"dismiss",baseBranch:r?.worktreeLifecycle?.baseBranch,targetRepo:r?.worktreePrTargetRepo,pushRemote:r?.worktreePushRemote}});let m=l?`\u{1F5D1}\uFE0F [${d}] Branch \`${a??"unknown"}\` dismissed. Native backend worktree released for backend cleanup.`:`\u{1F5D1}\uFE0F [${d}] Branch \`${a??"unknown"}\` dismissed and permanently deleted.`;return this.deps.dispatchNotification(this.deps.buildRoutingProxy({id:re(n??r??{id:e})??e,sessionId:r?.sessionId,harnessSessionId:n?.harnessSessionId??r?.harnessSessionId,backendRef:n?.backendRef??r?.backendRef,route:n?.route??r?.route}),{label:"worktree-dismissed",userMessage:m,notifyUser:"always"}),m}snoozeWorktreeDecision(e){let r=this.deps.getPersistedSession(e);if(!r)return`Error: Session "${e}" not found.`;let n=new Date(Date.now()+1440*60*1e3).toISOString();for(let s of et(r))this.deps.updatePersistedSession(s,{worktreeDecisionSnoozedUntil:n,lastWorktreeReminderAt:new Date().toISOString()});let i=`\u23ED\uFE0F Reminder snoozed 24h for \`${r.worktreeBranch??"unknown"}\` (session: ${r.name})`;return this.deps.dispatchNotification(this.deps.buildRoutingProxy({id:re(r)??$(r)??r.harnessSessionId,sessionId:r.sessionId,harnessSessionId:r.harnessSessionId,backendRef:r.backendRef,route:r.route}),{label:"worktree-snoozed",userMessage:i,notifyUser:"always"}),i}};var Og=new Set(["starting","running"]),Ms=class{sessions=new Map;activeSessionCount(){return[...this.sessions.values()].filter(e=>Og.has(e.status)).length}uniqueName(e){let r=new Set([...this.sessions.values()].filter(o=>Og.has(o.status)).map(o=>o.name));if(!r.has(e))return e;let n=2;for(;r.has(`${e}-${n}`);)n+=1;return`${e}-${n}`}add(e){this.sessions.set(e.id,e)}remove(e){this.sessions.delete(e)}get(e){return this.sessions.get(e)}list(){return[...this.sessions.values()]}};var Cs=class{constructor(e){this.deps=e}deps;initializeSession(e,r,n,o={}){if(this.deps.hydrateSpawnedSession(e,r,n),e.on("statusChange",(i,s)=>{s==="running"&&e.harnessSessionId?this.deps.markRunning(e):(s==="completed"||s==="failed"||s==="killed")&&this.deps.handleTerminal(e).catch(a=>{console.error(`[SessionRuntimeBootstrap] handleTerminal threw for session ${e.id}:`,a)})}),e.on("turnEnd",(i,s)=>{this.deps.handleTurnEnd(e,s)}),e.start(),o.notifyLaunch!==!1){let i=this.deps.formatLaunchWorkdirLabel(e),s=`\u{1F680} [${e.name}] Launched | ${i} | ${e.model??"default"}`;this.deps.notifySession(e,s,"launch")}return e}};var _s=class{buildNoChangeNotification(e){let{session:r,nativeBackendWorktree:n,cleanupSucceeded:o,worktreePath:i,preview:s,originThreadLine:a}=e,d=o?n?"native backend worktree released for backend cleanup":"worktree cleaned up":`cleanup failed; worktree still exists at ${i}`;return{label:o?"worktree-no-changes":"worktree-no-changes-cleanup-failed",userMessage:o?n?`\u2139\uFE0F [${r.name}] Session completed with no changes \u2014 native backend worktree released for backend cleanup`:`\u2139\uFE0F [${r.name}] Session completed with no changes \u2014 worktree cleaned up`:`\u26A0\uFE0F [${r.name}] Session completed with no changes, but worktree cleanup failed. Worktree still exists at ${i}`,wakeMessage:ul({sessionName:r.name,sessionId:r.id,cleanupSummary:d,preview:s,originThreadLine:a,requestedPermissionMode:r.requestedPermissionMode,currentPermissionMode:r.currentPermissionMode,approvalExecutionState:r.approvalExecutionState,approvalState:r.approvalState,planApproval:r.planApproval,approvalPromptStatus:r.approvalPromptStatus,approvalPromptMessageKind:r.approvalPromptMessageKind,approvalPromptDeliveredAt:r.approvalPromptDeliveredAt}),notifyUser:"always"}}buildAskNotification(e){let{session:r,branchName:n,baseBranch:o,diffSummary:i,buttons:s}=e,a=pl(i),d=i.commitMessages.slice(0,5).map(g=>`\u2022 ${g.hash} ${g.message} (${g.author})`),l=i.commits>5?`...and ${i.commits-5} more`:"",m=r.worktreePrTargetRepo?`Branch: \`${n}\` \u2192 \`${o}\` | PR target: ${r.worktreePrTargetRepo}`:`Branch: \`${n}\` \u2192 \`${o}\``;return{label:"worktree-merge-ask",userMessage:[`\u{1F500} Worktree decision required for session \`${r.name}\``,"",m,`Commits: ${i.commits} | Files: ${i.filesChanged} | +${i.insertions} / -${i.deletions}`,"",...a.length>0?["Summary:",...a.map(g=>`- ${g}`),""]:[],"Recent commits:",...d,...l?[l]:[],"",`\u26A0\uFE0F Discard will permanently delete branch \`${n}\` and all local changes. This cannot be undone.`].join(`
205
+ `),notifyUser:"always",buttons:a==="ask"&&!l?this.deps.getPlanApprovalButtons(e.id,{...e,planDecisionVersion:d}):void 0}),this.deps.clearRetryTimersForSession(e.id);return}this.deps.dispatchSessionNotification(e,{label:"suspended",userMessage:`\u{1F4A4} [${e.name}] Suspended after idle timeout | ${i} | ${It(s)}`,notifyUser:"always",buttons:this.deps.getResumeButtons(e.id,e)}),this.deps.clearRetryTimersForSession(e.id);return}this.deps.notifySession(e,`\u26D4 [${e.name}] ${lo(e.killReason)} | ${i} | ${It(s)}`),this.deps.clearRetryTimersForSession(e.id)}emitWaitingForInput(e){if(!this.deps.debounceWaitingEvent(e.id))return;let r=e.pendingPlanApproval?this.deps.resolvePlanApprovalMode(e):void 0,n=e.actionablePlanDecisionVersion??e.planDecisionVersion,o=e.pendingPlanApproval&&r==="ask"&&Eg(e,n),i=e.pendingPlanApproval?void 0:this.deps.getOutputPreview(e),s=!e.pendingPlanApproval&&e.pendingInputState?.promptText?e.pendingInputState.promptText:!e.pendingPlanApproval&&i!==void 0?i:this.deps.getOutputPreview(e,e.pendingPlanApproval&&r!=="delegate"?Number.POSITIVE_INFINITY:void 0),a=e.pendingPlanApproval&&r==="ask"&&!o?this.deps.getPlanApprovalButtons(e.id,{...e,planDecisionVersion:n}):!e.pendingPlanApproval&&e.pendingInputState?.options.length?this.deps.getQuestionButtons(e.id,e.pendingInputState.options.map(g=>({label:g}))):void 0,d=bx(e,n),l=hl({session:e,preview:s,questionText:e.pendingPlanApproval?void 0:e.pendingInputState?.promptText,questionContextPreview:i,planArtifact:d,originThreadLine:this.deps.originThreadLine(e),planApprovalMode:r,planApprovalButtons:a,questionButtons:e.pendingPlanApproval?void 0:a}),m=l.planReviewSummary??s;if(l.label==="plan-approval"&&r==="ask"&&o){this.deps.dispatchSessionNotification(e,{label:l.label,userMessage:l.userMessage,userMessages:l.userMessages,notifyUser:"never",buttons:l.buttons,wakeMessage:l.wakeMessage});return}if(l.label==="plan-approval"&&r==="ask"){this.deps.dispatchSessionNotification(e,{label:l.label,userMessage:l.userMessage,userMessages:l.userMessages,notifyUser:"always",buttons:l.buttons,hooks:{onNotifyStarted:()=>{this.deps.updatePersistedSession(e.id,{approvalPromptRequiredVersion:n,approvalPromptVersion:n,approvalPromptStatus:"sending",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"canonical_buttons",approvalPromptLastAttemptAt:new Date().toISOString()})},onNotifySucceeded:()=>{this.deps.updatePersistedSession(e.id,{canonicalPlanPromptVersion:n,approvalPromptRequiredVersion:n,approvalPromptVersion:n,approvalPromptStatus:"delivered",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"canonical_buttons",approvalPromptDeliveredAt:new Date().toISOString(),approvalPromptFailedAt:void 0})},onNotifyFailed:()=>{this.deps.updatePersistedSession(e.id,{approvalPromptRequiredVersion:n,approvalPromptVersion:n,approvalPromptStatus:"failed",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"canonical_buttons",approvalPromptFailedAt:new Date().toISOString()})}},onUserNotifyFailed:()=>this.dispatchPlanApprovalFallback(e,n,m),wakeMessageOnNotifySuccess:this.buildPlanApprovalWakeText(e,n)});return}if(l.label==="plan-approval"){this.deps.dispatchSessionNotification(e,{label:l.label,userMessage:l.userMessage,wakeMessage:l.wakeMessage,notifyUser:"never",buttons:l.buttons});return}this.deps.dispatchSessionNotification(e,{label:l.label,userMessage:l.userMessage,notifyUser:"always",buttons:l.buttons,wakeMessageOnNotifyFailed:l.wakeMessage})}emitTurnComplete(e){console.info(`[SessionManager] turn-complete wake dispatching for session ${e.id} (turns=${e.result?.num_turns??0}, strategy=${e.worktreeStrategy??"none"})`);let r=al({session:e,originThreadLine:this.deps.originThreadLine(e),preview:this.deps.getOutputPreview(e)});this.deps.dispatchSessionNotification(e,{label:"turn-complete",userMessage:r.userMessage,wakeMessage:r.wakeMessage,notifyUser:"always",onUserNotifyFailed:()=>{console.warn(`[SessionManager] turn-complete delivery failed for session ${e.id} \u2014 firing terminal notification as fallback`),this.deps.shouldEmitTerminalWake(e)&&this.emitCompleted(e)}})}emitCompleted(e){let r=this.deps.getOutputPreview(e),n=this.shouldRequestCompletionFollowup(e),o=il({session:e,originThreadLine:this.deps.originThreadLine(e),preview:r}),i;this.deps.dispatchSessionNotification(e,{label:"completed",userMessage:o.userMessage,notifyUser:"always",completionWakeSummaryRequired:n,wakeMessageOnNotifySuccess:n?o.wakeMessageOnNotifySuccess:void 0,wakeMessageOnNotifyFailed:n?o.wakeMessageOnNotifyFailed:void 0,hooks:{onNotifySucceeded:()=>{i=!0,this.logCompletionWakeDiagnostic({session:e,event:"completion_notify_succeeded",canonicalStatusDelivered:i,followupSummaryRequired:n})},onNotifyFailed:()=>{i=!1,this.logCompletionWakeDiagnostic({session:e,event:"completion_notify_failed",canonicalStatusDelivered:i,followupSummaryRequired:n})},onWakeSucceeded:()=>{this.logCompletionWakeDiagnostic({session:e,event:"completion_wake_succeeded",canonicalStatusDelivered:i,followupSummaryRequired:n})}}})}emitFailed(e,r,n){let o=sl({session:e,originThreadLine:this.deps.originThreadLine(e),errorSummary:r,preview:this.deps.getOutputPreview(e),worktreeAutoCleaned:n,failedButtons:this.deps.getResumeButtons(e.id,e)});this.deps.dispatchSessionNotification(e,{label:"failed",userMessage:o.userMessage,wakeMessage:o.wakeMessage,notifyUser:"always",buttons:o.buttons})}};ke();ut();import{existsSync as Ax}from"fs";var Ts=class{constructor(e){this.deps=e}deps;async dismissWorktree(e){let r=this.deps.getPersistedSession(e),n=this.deps.resolveActiveSession(e),o=n??r;if(!o)return`Error: Session "${e}" not found.`;let i=n?.worktreePath??r?.worktreePath,s=this.deps.resolveWorktreeRepoDir(n?.originalWorkdir??r?.workdir,i),a=n?.worktreeBranch??r?.worktreeBranch,d=n?.name??r?.name??e;if(!s)return`Error: No workdir found for session "${e}".`;let l=Ne(o);!l&&i&&Ax(i)&&tt(s,i,{destructive:!0}),a&&Ot(s,a);for(let g of et(n??r))this.deps.updatePersistedSession(g,{worktreeDisposition:"dismissed",worktreeDismissedAt:new Date().toISOString(),pendingWorktreeDecisionSince:void 0,worktreeState:"dismissed",lifecycle:"terminal",worktreePath:void 0,worktreeBranch:void 0,worktreeLifecycle:{state:"dismissed",updatedAt:new Date().toISOString(),resolvedAt:new Date().toISOString(),resolutionSource:"dismiss",baseBranch:r?.worktreeLifecycle?.baseBranch,targetRepo:r?.worktreePrTargetRepo,pushRemote:r?.worktreePushRemote}});let m=l?`\u{1F5D1}\uFE0F [${d}] Branch \`${a??"unknown"}\` dismissed. Native backend worktree released for backend cleanup.`:`\u{1F5D1}\uFE0F [${d}] Branch \`${a??"unknown"}\` dismissed and permanently deleted.`;return this.deps.dispatchNotification(this.deps.buildRoutingProxy({id:re(n??r??{id:e})??e,sessionId:r?.sessionId,harnessSessionId:n?.harnessSessionId??r?.harnessSessionId,backendRef:n?.backendRef??r?.backendRef,route:n?.route??r?.route}),{label:"worktree-dismissed",userMessage:m,notifyUser:"always"}),m}snoozeWorktreeDecision(e){let r=this.deps.getPersistedSession(e);if(!r)return`Error: Session "${e}" not found.`;let n=new Date(Date.now()+1440*60*1e3).toISOString();for(let s of et(r))this.deps.updatePersistedSession(s,{worktreeDecisionSnoozedUntil:n,lastWorktreeReminderAt:new Date().toISOString()});let i=`\u23ED\uFE0F Reminder snoozed 24h for \`${r.worktreeBranch??"unknown"}\` (session: ${r.name})`;return this.deps.dispatchNotification(this.deps.buildRoutingProxy({id:re(r)??$(r)??r.harnessSessionId,sessionId:r.sessionId,harnessSessionId:r.harnessSessionId,backendRef:r.backendRef,route:r.route}),{label:"worktree-snoozed",userMessage:i,notifyUser:"always"}),i}};var Og=new Set(["starting","running"]),Ms=class{sessions=new Map;activeSessionCount(){return[...this.sessions.values()].filter(e=>Og.has(e.status)).length}uniqueName(e){let r=new Set([...this.sessions.values()].filter(o=>Og.has(o.status)).map(o=>o.name));if(!r.has(e))return e;let n=2;for(;r.has(`${e}-${n}`);)n+=1;return`${e}-${n}`}add(e){this.sessions.set(e.id,e)}remove(e){this.sessions.delete(e)}get(e){return this.sessions.get(e)}list(){return[...this.sessions.values()]}};var Cs=class{constructor(e){this.deps=e}deps;initializeSession(e,r,n,o={}){if(this.deps.hydrateSpawnedSession(e,r,n),e.on("statusChange",(i,s)=>{s==="running"&&e.harnessSessionId?this.deps.markRunning(e):(s==="completed"||s==="failed"||s==="killed")&&this.deps.handleTerminal(e).catch(a=>{console.error(`[SessionRuntimeBootstrap] handleTerminal threw for session ${e.id}:`,a)})}),e.on("turnEnd",(i,s)=>{this.deps.handleTurnEnd(e,s)}),e.start(),o.notifyLaunch!==!1){let i=this.deps.formatLaunchWorkdirLabel(e),s=`\u{1F680} [${e.name}] Launched | ${i} | ${e.model??"default"}`;this.deps.notifySession(e,s,"launch")}return e}};var _s=class{buildNoChangeNotification(e){let{session:r,nativeBackendWorktree:n,cleanupSucceeded:o,worktreePath:i,preview:s,originThreadLine:a}=e,d=o?n?"native backend worktree released for backend cleanup":"worktree cleaned up":`cleanup failed; worktree still exists at ${i}`;return{label:o?"worktree-no-changes":"worktree-no-changes-cleanup-failed",userMessage:o?n?`\u2139\uFE0F [${r.name}] Session completed with no changes \u2014 native backend worktree released for backend cleanup`:`\u2139\uFE0F [${r.name}] Session completed with no changes \u2014 worktree cleaned up`:`\u26A0\uFE0F [${r.name}] Session completed with no changes, but worktree cleanup failed. Worktree still exists at ${i}`,wakeMessage:ul({sessionName:r.name,sessionId:r.id,cleanupSummary:d,preview:s,originThreadLine:a,requestedPermissionMode:r.requestedPermissionMode,currentPermissionMode:r.currentPermissionMode,approvalExecutionState:r.approvalExecutionState,approvalState:r.approvalState,planApproval:r.planApproval,approvalPromptStatus:r.approvalPromptStatus,approvalPromptMessageKind:r.approvalPromptMessageKind,approvalPromptDeliveredAt:r.approvalPromptDeliveredAt}),notifyUser:"always"}}buildAskNotification(e){let{session:r,branchName:n,baseBranch:o,diffSummary:i,buttons:s}=e,a=pl(i),d=i.commitMessages.slice(0,5).map(g=>`\u2022 ${g.hash} ${g.message} (${g.author})`),l=i.commits>5?`...and ${i.commits-5} more`:"",m=r.worktreePrTargetRepo?`Branch: \`${n}\` \u2192 \`${o}\` | PR target: ${r.worktreePrTargetRepo}`:`Branch: \`${n}\` \u2192 \`${o}\``;return{label:"worktree-merge-ask",userMessage:[`\u{1F500} Worktree decision required for session \`${r.name}\``,"",m,`Commits: ${i.commits} | Files: ${i.filesChanged} | +${i.insertions} / -${i.deletions}`,"",...a.length>0?["Summary:",...a.map(g=>`- ${g}`),""]:[],"Recent commits:",...d,...l?[l]:[],"",`\u26A0\uFE0F Discard will permanently delete branch \`${n}\` and all local changes. This cannot be undone.`].join(`
206
206
  `),notifyUser:"always",buttons:s,wakeMessageOnNotifySuccess:["Worktree decision buttons delivered to the user.",`Session: ${r.name} | ID: ${r.id}`,m,"Wait for their button callback \u2014 do NOT act on this worktree yourself."].join(`
207
207
  `),wakeMessageOnNotifyFailed:[`\u{1F500} Worktree decision required for session \`${r.name}\``,"",m,`Commits: ${i.commits} | Files: ${i.filesChanged} | +${i.insertions} / -${i.deletions}`].join(`
208
- `)}}buildDelegateNotification(e){let{session:r,branchName:n,baseBranch:o,diffSummary:i}=e,s=i.commitMessages.slice(0,5).map(l=>`\u2022 ${l.hash} ${l.message} (${l.author})`),a=i.commits>5?`...and ${i.commits-5} more`:void 0,d=r.prompt?r.prompt.slice(0,500):"(no prompt)";return{label:"worktree-delegate",wakeMessage:dl({sessionName:r.name,sessionId:r.id,branchName:n,baseBranch:o,promptSnippet:d,commitLines:s,moreNote:a,diffSummary:i}),notifyUser:"never"}}};Di();ut();var $s=class t{timers=new Map;disposed=!1;static MAX_DELAY_MS=2147483647;schedule(e,r,n){if(this.disposed)return;this.cancel(e);let o=Math.max(0,r-Date.now()),i=setTimeout(()=>{if(this.timers.delete(e),!this.disposed){if(r-Date.now()>0){this.schedule(e,r,n);return}n()}},Math.min(o,t.MAX_DELAY_MS));i.unref?.(),this.timers.set(e,i)}cancel(e){let r=this.timers.get(e);r&&(clearTimeout(r),this.timers.delete(e))}cancelPrefix(e){for(let r of this.timers.keys())r.startsWith(e)&&this.cancel(r)}dispose(){this.disposed=!0;for(let e of this.timers.values())clearTimeout(e);this.timers.clear()}};import{unlinkSync as Tx}from"fs";var Dg=new Set(["completed","failed","killed"]),Mx=new Set(["starting","running"]),Cx=5e3,Ng=10080*60*1e3,_x=300*1e3,Fg="tmp-output:cleanup",Es=class{registry;sessions;maxSessions;maxPersistedSessions;lastWaitingEventTimestamps=new Map;lastTurnCompleteMarkers=new Map;lastTerminalWakeMarkers=new Map;mergeQueues=new Map;pendingAskUserQuestions=new Map;store;metrics;wakeDispatcher;interactions;notifications;worktrees;questions;reminders;lifecycle;restore;stateSync;references;worktreeStrategy;worktreeDecisions;runtimeBootstrap;worktreeMessages;maintenance=new $s;constructor(e=20,r=50,n={}){this.maxSessions=e,this.maxPersistedSessions=r,this.registry=new Ms,this.sessions=this.registry.sessions,this.store=new gs(n.store),this.metrics=new hs,this.wakeDispatcher=new vs,this.interactions=new Ps(this.store.actionTokenStore,sr),this.references=new is(this.sessions,this.store),this.stateSync=new os({store:this.store,sessions:this.sessions,resolveSession:o=>this.references.resolveActive(o)}),this.notifications=new ws(this.wakeDispatcher,(o,i)=>this.stateSync.applySessionPatch(o,i)),this.store.onActionTokensChanged(()=>this.syncActionTokenExpiryDeadline()),this.worktrees=new Is,this.restore=new ns(o=>this.store.getPersistedSession(o)),this.worktreeMessages=new _s,this.worktreeStrategy=new ds({shouldRunWorktreeStrategy:o=>this.shouldRunWorktreeStrategy(o),isAlreadyMerged:o=>this.isAlreadyMerged(o),resolveWorktreeRepoDir:(o,i)=>this.resolveWorktreeRepoDir(o,i),getWorktreeCompletionState:(o,i,s,a)=>this.getWorktreeCompletionState(o,i,s,a),updatePersistedSession:(o,i)=>this.updatePersistedSession(o,i),dispatchSessionNotification:(o,i)=>this.dispatchSessionNotification(o,i),getOutputPreview:(o,i)=>this.getOutputPreview(o,i),originThreadLine:o=>this.originThreadLine(o),getWorktreeDecisionButtons:o=>this.getWorktreeDecisionButtons(o),makeOpenPrButton:o=>this.makeActionButton(o,"worktree-create-pr","Open PR"),worktreeMessages:this.worktreeMessages,enqueueMerge:(o,i,s)=>this.enqueueMerge(o,i,s),mergeBranch:Ei,spawnConflictResolver:async({session:o,worktreePath:i,prompt:s})=>this.spawn({prompt:s,workdir:i,name:`${o.name}-conflict-resolver`,harness:o.harnessName||Pe(),model:o.model,reasoningEffort:o.reasoningEffort,permissionMode:"bypassPermissions",multiTurn:!0,worktreeStrategy:"off",autoMergeParentSessionId:o.id,route:o.route,originChannel:o.originChannel,originThreadId:o.originThreadId,originAgentId:o.originAgentId,originSessionKey:o.originSessionKey},{notifyLaunch:!1}),runAutoPr:async(o,i)=>{let{makeAgentPrTool:s}=await Promise.resolve().then(()=>(Ji(),_f));return{success:(await s().execute("auto-pr",{session:o.id,base_branch:i}))?.meta?.success===!0}}}),this.questions=new xs(this.pendingAskUserQuestions,(o,i)=>this.dispatchSessionNotification(o,i),o=>{this.lastWaitingEventTimestamps.delete(o)},(o,i)=>this.interactions.getQuestionButtons(o,i)),this.reminders=new As(o=>this.buildRoutingProxy(o),(o,i)=>this.notifications.dispatch(o,i),(o,i)=>this.updatePersistedSession(o,i),o=>this.getWorktreeDecisionButtons(o)),this.lifecycle=new Rs({persistSession:o=>this.persistSession(o),clearWaitingTimestamp:o=>{this.lastWaitingEventTimestamps.delete(o)},handleWorktreeStrategy:o=>this.handleWorktreeStrategy(o),resolveWorktreeRepoDir:(o,i)=>this.resolveWorktreeRepoDir(o,i),updatePersistedSession:(o,i)=>this.updatePersistedSession(o,i),dispatchSessionNotification:(o,i)=>this.dispatchSessionNotification(o,i),notifySession:(o,i,s)=>this.notifySession(o,i,s),clearRetryTimersForSession:o=>this.wakeDispatcher.clearRetryTimersForSession(o),hasTurnCompleteWakeMarker:o=>this.lastTurnCompleteMarkers.has(o),shouldEmitTurnCompleteWake:o=>this.shouldEmitTurnCompleteWake(o),shouldEmitTerminalWake:o=>this.shouldEmitTerminalWake(o),resolvePlanApprovalMode:o=>this.resolvePlanApprovalMode(o),getPlanApprovalButtons:(o,i)=>this.interactions.getPlanApprovalButtons(o,i),getResumeButtons:(o,i)=>this.interactions.getResumeButtons(o,i),getQuestionButtons:(o,i)=>this.interactions.getQuestionButtons(o,i),extractLastOutputLine:o=>this.extractLastOutputLine(o),getOutputPreview:(o,i)=>this.getOutputPreview(o,i),originThreadLine:o=>this.originThreadLine(o),debounceWaitingEvent:o=>this.debounceWaitingEvent(o),isAlreadyMerged:o=>this.isAlreadyMerged(o)}),this.worktreeDecisions=new Ts({getPersistedSession:o=>this.store.getPersistedSession(o),resolveActiveSession:o=>this.references.resolveActive(o),resolveWorktreeRepoDir:(o,i)=>this.resolveWorktreeRepoDir(o,i),updatePersistedSession:(o,i)=>this.updatePersistedSession(o,i),dispatchNotification:(o,i)=>this.notifications.dispatch(o,i),buildRoutingProxy:o=>this.buildRoutingProxy(o)}),this.runtimeBootstrap=new Cs({hydrateSpawnedSession:(o,i,s)=>{this.restore.hydrateSpawnedSession(o,i,s)},markRunning:o=>{this.store.markRunning(o),this.onPersistedSessionChanged(this.store.getPersistedSession(o.id))},handleTerminal:async o=>this.onSessionTerminal(o),handleTurnEnd:(o,i)=>this.onTurnEnd(o,i),formatLaunchWorkdirLabel:o=>this.formatLaunchWorkdirLabel(o),notifySession:(o,i,s)=>this.notifySession(o,i,s)})}get persisted(){return this.store.persisted}get idIndex(){return this.store.idIndex}get nameIndex(){return this.store.nameIndex}uniqueName(e){return this.registry.uniqueName(e)}persistedMaintenanceRef(e){return e.sessionId??$(e)??e.harnessSessionId}runtimeGcKey(e){return`runtime-gc:${e}`}persistedMaintenanceKey(e,r){return`persisted:${e}:${r}`}runtimeGcMaxAgeMs(){return(_.sessionGcAgeMinutes??1440)*6e4}syncRuntimeGcDeadline(e){if(!e.completedAt)return;let r=this.runtimeGcKey(e.id);this.maintenance.schedule(r,e.completedAt+this.runtimeGcMaxAgeMs(),()=>{let n=this.sessions.get(e.id);if(!n||!n.completedAt)return;let o=this.runtimeGcMaxAgeMs();if(!this.store.shouldGcActiveSession(n,Date.now(),o)){this.syncRuntimeGcDeadline(n);return}this.registry.remove(e.id),this.persistSession(n,{scheduleRuntimeGc:!1}),this.lastWaitingEventTimestamps.delete(e.id),this.lastTurnCompleteMarkers.delete(e.id),this.lastTerminalWakeMarkers.delete(e.id)})}cancelPersistedMaintenance(e){let r=this.persistedMaintenanceRef(e);r&&this.maintenance.cancelPrefix(`persisted:${r}:`)}onPersistedSessionChanged(e){e&&(this.syncPersistedSessionMaintenance(e),this.enforcePersistedRetention())}isLegacyResolvedWorktree(e){return e.worktreeMerged===!0||e.worktreeDisposition==="dismissed"||e.worktreeDisposition==="no-change-cleaned"||e.worktreeState==="merged"||e.worktreeState==="dismissed"}syncPersistedSessionMaintenance(e){let r=this.persistedMaintenanceRef(e);if(!r)return;this.maintenance.cancel(this.persistedMaintenanceKey(r,"worktree-reminder"));let n=this.reminders.getNextReminderAt(e);n!=null&&this.schedulePersistedWorktreeReminder(r,n),this.maintenance.cancel(this.persistedMaintenanceKey(r,"worktree-retention"));let o=to(e,{activeSession:!1,includePrSync:e.worktreeLifecycle?.state==="pr_open"||!!e.worktreePrUrl}),i=e.worktreeLifecycle?.resolvedAt??e.worktreeMergedAt??e.worktreeDismissedAt??(e.completedAt?new Date(e.completedAt).toISOString():void 0),s=this.isLegacyResolvedWorktree(e);if((o.cleanupSafe||s)&&typeof i=="string"){let a=new Date(i).getTime();Number.isFinite(a)&&this.maintenance.schedule(this.persistedMaintenanceKey(r,"worktree-retention"),a+Ng,()=>{let d=this.store.getPersistedSession(r);d&&this.reconcileResolvedWorktreeRetention(d,Date.now())})}}schedulePersistedWorktreeReminder(e,r){let n=this.persistedMaintenanceKey(e,"worktree-reminder");this.maintenance.schedule(n,r,()=>{let o=this.store.getPersistedSession(e);if(!o||this.reminders.sendReminderIfDue(o,Date.now()))return;let s=this.reminders.getNextReminderAt(o);s!=null&&this.schedulePersistedWorktreeReminder(e,Math.max(s,Date.now()+_x))})}reconcileResolvedWorktreeRetention(e,r){let n=to(e,{activeSession:!1,includePrSync:e.worktreeLifecycle?.state==="pr_open"||!!e.worktreePrUrl}),o=e.worktreeLifecycle?.resolvedAt??e.worktreeMergedAt??e.worktreeDismissedAt??(e.completedAt?new Date(e.completedAt).toISOString():void 0),i=o?new Date(o).getTime():0,s=this.isLegacyResolvedWorktree(e);if(!(!n.cleanupSafe&&!s||!i||r-i<Ng))try{if(!e.worktreePath&&!Ne(e))return;let a=this.resolveWorktreeRepoDir(e.workdir,e.worktreePath);if(!a)return;let d=Ne(e)?!1:tt(a,e.worktreePath);if(!Ne(e)&&!d)return;for(let l of et(e))this.updatePersistedSession(l,{worktreePath:void 0,worktreeBranch:void 0,worktreeState:"none",worktreeLifecycle:{...e.worktreeLifecycle??n.lifecycle,state:n.derivedState,updatedAt:new Date(r).toISOString(),resolvedAt:e.worktreeLifecycle?.resolvedAt??new Date(r).toISOString(),resolutionSource:e.worktreeLifecycle?.resolutionSource??"maintenance",notes:n.reasons}})}catch(a){console.warn(`[SessionManager] Failed maintenance cleanup for worktree ${e.worktreePath}: ${a instanceof Error?a.message:String(a)}`)}}syncActionTokenExpiryDeadline(){let e="tokens:expiry";this.maintenance.cancel(e);let r=this.store.getNextActionTokenExpiry();r!=null&&this.maintenance.schedule(e,r,()=>{this.store.purgeExpiredActionTokens(Date.now())})}syncTmpOutputCleanupDeadline(e=Date.now()){this.maintenance.cancel(Fg);let r=this.store.getNextTmpOutputCleanupAt(e);r!=null&&this.maintenance.schedule(Fg,r,()=>{let n=Date.now();this.store.cleanupTmpOutputFiles(n),this.syncTmpOutputCleanupDeadline(n)})}cleanupOutputPathIfUnreferenced(e){if(!(!e||this.store.hasOutputPathReference(e)))try{Tx(e)}catch{}}enforcePersistedRetention(){let e=this.store.evictOldestPersisted(this.maxPersistedSessions);for(let r of e)this.cancelPersistedMaintenance(r),r.sessionId&&this.maintenance.cancel(this.runtimeGcKey(r.sessionId)),this.cleanupOutputPathIfUnreferenced(r.outputPath)}bootstrapMaintenanceSchedules(){let e=Date.now();this.store.cleanupTmpOutputFiles(e);for(let r of this.store.listPersistedSessions())this.syncPersistedSessionMaintenance(r);this.syncActionTokenExpiryDeadline(),this.store.cleanupOrphanOutputFiles(),this.syncTmpOutputCleanupDeadline(e)}disposeMaintenance(){this.maintenance.dispose()}spawn(e,r={}){if(this.registry.activeSessionCount()>=this.maxSessions)throw new Error(`Max sessions reached (${this.maxSessions}). Use agent_sessions to list active sessions and agent_kill to end one.`);if(e.sessionIdOverride){let y=this.registry.get(e.sessionIdOverride);if(y?.status==="starting"||y?.status==="running")throw new Error(`Cannot reuse session ID ${e.sessionIdOverride}: that session is still ${y.status}.`);y&&this.registry.remove(y.id),this.lastWaitingEventTimestamps.delete(e.sessionIdOverride),this.lastTurnCompleteMarkers.delete(e.sessionIdOverride),this.lastTerminalWakeMarkers.delete(e.sessionIdOverride),this.maintenance.cancel(this.runtimeGcKey(e.sessionIdOverride))}let o=e.name||gf(e.prompt),i=this.uniqueName(o);if(i!==o&&console.warn(`[SessionManager] Name conflict: "${o}" \u2192 "${i}" (active session with same name exists)`),!e.route?.provider||!e.route.target)throw new Error(`Cannot launch session "${i}": missing explicit route metadata.`);let s=this.restore.prepareSpawn(e,i),a=e.harness??"claude-code",d=this,l,m=a==="claude-code"&&!e.canUseTool?async(y,f)=>{if(!l)throw new Error("canUseTool called before session ID was set");return d.handleAskUserQuestion(l,f)}:e.canUseTool,g=new Fi({...e,workdir:s.actualWorkdir,systemPrompt:s.effectiveSystemPrompt,canUseTool:m},i);return l=g.id,this.registry.add(g),this.metrics.incrementLaunched(),this.runtimeBootstrap.initializeSession(g,s,e,r)}async spawnAndAwaitRunning(e,r={}){let n=this.spawn(e,r);return await this.waitForRunningSession(n),n}async waitForRunningSession(e){if(e.status==="running")return;if(Dg.has(e.status))throw new Error(this.describeLaunchFailure(e));let r=e.on?.bind(e),n=e.off?.bind(e)??e.removeListener?.bind(e);if(!r||!n)throw new Error(`Session ${e.name} [${e.id}] did not expose lifecycle events during startup.`);await new Promise((o,i)=>{let s=(d,l)=>{if(l==="running"){a(),o();return}Dg.has(l)&&(a(),i(new Error(this.describeLaunchFailure(e))))},a=()=>{n("statusChange",s)};r("statusChange",s)})}describeLaunchFailure(e){let r=e.killReason?` (reason: ${e.killReason})`:"",n=e.error||e.result?.result||`status=${e.status}${r}`;return`Session ${e.name} [${e.id}] failed to start: ${n}`}formatLaunchResult(e,r){return oi({prompt:e.prompt,workdir:e.workdir,harness:e.harness,permissionMode:e.permissionMode??_.permissionMode,planApproval:e.planApproval,resumeSessionId:e.resumeSessionId,forkSession:e.forkSession,forceNewSession:e.forceNewSession,clearedPersistedCodexResume:e.clearedPersistedCodexResume},r)}shouldRunWorktreeStrategy(e){let r=e.lifecycle;return!(r==="starting"||r==="awaiting_plan_decision"||r==="awaiting_user_input"||e.pendingPlanApproval)}makeActionButton(e,r,n,o={}){return this.interactions.makeActionButton(e,r,n,o)}consumeActionToken(e){return this.interactions.consumeActionToken(e)}getActionToken(e){return this.interactions.getActionToken(e)}clearPlanDecisionTokens(e,r){this.interactions.clearPlanDecisionTokens(e,r)}hasProvablePlanReviewPrompt(e,r){return r!=null&&e.approvalPromptRequiredVersion===r&&(e.approvalPromptStatus==="delivered"||e.approvalPromptStatus==="fallback_delivered")}buildPlanApprovalWakeText(e,r,n=!1){return[n?"Plan review fallback text delivered to the user because interactive buttons could not be delivered.":"Plan approval buttons delivered to the user.",`Session: ${e.name} | ID: ${e.id} | Plan v${r??"?"}`,`Wait for their ${n?"explicit reply":"button callback"} \u2014 do NOT approve or reject this plan yourself.`].join(`
208
+ `)}}buildDelegateNotification(e){let{session:r,branchName:n,baseBranch:o,diffSummary:i}=e,s=i.commitMessages.slice(0,5).map(l=>`\u2022 ${l.hash} ${l.message} (${l.author})`),a=i.commits>5?`...and ${i.commits-5} more`:void 0,d=r.prompt?r.prompt.slice(0,500):"(no prompt)";return{label:"worktree-delegate",wakeMessage:dl({sessionName:r.name,sessionId:r.id,branchName:n,baseBranch:o,promptSnippet:d,commitLines:s,moreNote:a,diffSummary:i}),notifyUser:"never"}}};Di();ut();var $s=class t{timers=new Map;disposed=!1;static MAX_DELAY_MS=2147483647;schedule(e,r,n){if(this.disposed)return;this.cancel(e);let o=Math.max(0,r-Date.now()),i=setTimeout(()=>{if(this.timers.delete(e),!this.disposed){if(r-Date.now()>0){this.schedule(e,r,n);return}n()}},Math.min(o,t.MAX_DELAY_MS));i.unref?.(),this.timers.set(e,i)}cancel(e){let r=this.timers.get(e);r&&(clearTimeout(r),this.timers.delete(e))}cancelPrefix(e){for(let r of this.timers.keys())r.startsWith(e)&&this.cancel(r)}dispose(){this.disposed=!0;for(let e of this.timers.values())clearTimeout(e);this.timers.clear()}};import{unlinkSync as Rx}from"fs";var Dg=new Set(["completed","failed","killed"]),Tx=new Set(["starting","running"]),Mx=5e3,Ng=10080*60*1e3,Cx=300*1e3,Fg="tmp-output:cleanup",Es=class{registry;sessions;maxSessions;maxPersistedSessions;lastWaitingEventTimestamps=new Map;lastTurnCompleteMarkers=new Map;lastTerminalWakeMarkers=new Map;mergeQueues=new Map;pendingAskUserQuestions=new Map;store;metrics;wakeDispatcher;interactions;notifications;worktrees;questions;reminders;lifecycle;restore;stateSync;references;worktreeStrategy;worktreeDecisions;runtimeBootstrap;worktreeMessages;maintenance=new $s;constructor(e=20,r=50,n={}){this.maxSessions=e,this.maxPersistedSessions=r,this.registry=new Ms,this.sessions=this.registry.sessions,this.store=new gs(n.store),this.metrics=new hs,this.wakeDispatcher=new vs,this.interactions=new Ps(this.store.actionTokenStore,sr),this.references=new is(this.sessions,this.store),this.stateSync=new os({store:this.store,sessions:this.sessions,resolveSession:o=>this.references.resolveActive(o)}),this.notifications=new ws(this.wakeDispatcher,(o,i)=>this.stateSync.applySessionPatch(o,i)),this.store.onActionTokensChanged(()=>this.syncActionTokenExpiryDeadline()),this.worktrees=new Is,this.restore=new ns(o=>this.store.getPersistedSession(o)),this.worktreeMessages=new _s,this.worktreeStrategy=new ds({shouldRunWorktreeStrategy:o=>this.shouldRunWorktreeStrategy(o),isAlreadyMerged:o=>this.isAlreadyMerged(o),resolveWorktreeRepoDir:(o,i)=>this.resolveWorktreeRepoDir(o,i),getWorktreeCompletionState:(o,i,s,a)=>this.getWorktreeCompletionState(o,i,s,a),updatePersistedSession:(o,i)=>this.updatePersistedSession(o,i),dispatchSessionNotification:(o,i)=>this.dispatchSessionNotification(o,i),getOutputPreview:(o,i)=>this.getOutputPreview(o,i),originThreadLine:o=>this.originThreadLine(o),getWorktreeDecisionButtons:o=>this.getWorktreeDecisionButtons(o),makeOpenPrButton:o=>this.makeActionButton(o,"worktree-create-pr","Open PR"),worktreeMessages:this.worktreeMessages,enqueueMerge:(o,i,s)=>this.enqueueMerge(o,i,s),mergeBranch:Ei,spawnConflictResolver:async({session:o,worktreePath:i,prompt:s})=>this.spawn({prompt:s,workdir:i,name:`${o.name}-conflict-resolver`,harness:o.harnessName||Pe(),model:o.model,reasoningEffort:o.reasoningEffort,permissionMode:"bypassPermissions",multiTurn:!0,worktreeStrategy:"off",autoMergeParentSessionId:o.id,route:o.route,originChannel:o.originChannel,originThreadId:o.originThreadId,originAgentId:o.originAgentId,originSessionKey:o.originSessionKey},{notifyLaunch:!1}),runAutoPr:async(o,i)=>{let{makeAgentPrTool:s}=await Promise.resolve().then(()=>(Ji(),_f));return{success:(await s().execute("auto-pr",{session:o.id,base_branch:i}))?.meta?.success===!0}}}),this.questions=new xs(this.pendingAskUserQuestions,(o,i)=>this.dispatchSessionNotification(o,i),o=>{this.lastWaitingEventTimestamps.delete(o)},(o,i)=>this.interactions.getQuestionButtons(o,i)),this.reminders=new As(o=>this.buildRoutingProxy(o),(o,i)=>this.notifications.dispatch(o,i),(o,i)=>this.updatePersistedSession(o,i),o=>this.getWorktreeDecisionButtons(o)),this.lifecycle=new Rs({persistSession:o=>this.persistSession(o),clearWaitingTimestamp:o=>{this.lastWaitingEventTimestamps.delete(o)},handleWorktreeStrategy:o=>this.handleWorktreeStrategy(o),resolveWorktreeRepoDir:(o,i)=>this.resolveWorktreeRepoDir(o,i),updatePersistedSession:(o,i)=>this.updatePersistedSession(o,i),dispatchSessionNotification:(o,i)=>this.dispatchSessionNotification(o,i),notifySession:(o,i,s)=>this.notifySession(o,i,s),clearRetryTimersForSession:o=>this.wakeDispatcher.clearRetryTimersForSession(o),hasTurnCompleteWakeMarker:o=>this.lastTurnCompleteMarkers.has(o),shouldEmitTurnCompleteWake:o=>this.shouldEmitTurnCompleteWake(o),shouldEmitTerminalWake:o=>this.shouldEmitTerminalWake(o),resolvePlanApprovalMode:o=>this.resolvePlanApprovalMode(o),getPlanApprovalButtons:(o,i)=>this.interactions.getPlanApprovalButtons(o,i),getResumeButtons:(o,i)=>this.interactions.getResumeButtons(o,i),getQuestionButtons:(o,i)=>this.interactions.getQuestionButtons(o,i),extractLastOutputLine:o=>this.extractLastOutputLine(o),getOutputPreview:(o,i)=>this.getOutputPreview(o,i),originThreadLine:o=>this.originThreadLine(o),debounceWaitingEvent:o=>this.debounceWaitingEvent(o),isAlreadyMerged:o=>this.isAlreadyMerged(o)}),this.worktreeDecisions=new Ts({getPersistedSession:o=>this.store.getPersistedSession(o),resolveActiveSession:o=>this.references.resolveActive(o),resolveWorktreeRepoDir:(o,i)=>this.resolveWorktreeRepoDir(o,i),updatePersistedSession:(o,i)=>this.updatePersistedSession(o,i),dispatchNotification:(o,i)=>this.notifications.dispatch(o,i),buildRoutingProxy:o=>this.buildRoutingProxy(o)}),this.runtimeBootstrap=new Cs({hydrateSpawnedSession:(o,i,s)=>{this.restore.hydrateSpawnedSession(o,i,s)},markRunning:o=>{this.store.markRunning(o),this.onPersistedSessionChanged(this.store.getPersistedSession(o.id))},handleTerminal:async o=>this.onSessionTerminal(o),handleTurnEnd:(o,i)=>this.onTurnEnd(o,i),formatLaunchWorkdirLabel:o=>this.formatLaunchWorkdirLabel(o),notifySession:(o,i,s)=>this.notifySession(o,i,s)})}get persisted(){return this.store.persisted}get idIndex(){return this.store.idIndex}get nameIndex(){return this.store.nameIndex}uniqueName(e){return this.registry.uniqueName(e)}persistedMaintenanceRef(e){return e.sessionId??$(e)??e.harnessSessionId}runtimeGcKey(e){return`runtime-gc:${e}`}persistedMaintenanceKey(e,r){return`persisted:${e}:${r}`}runtimeGcMaxAgeMs(){return(_.sessionGcAgeMinutes??1440)*6e4}syncRuntimeGcDeadline(e){if(!e.completedAt)return;let r=this.runtimeGcKey(e.id);this.maintenance.schedule(r,e.completedAt+this.runtimeGcMaxAgeMs(),()=>{let n=this.sessions.get(e.id);if(!n||!n.completedAt)return;let o=this.runtimeGcMaxAgeMs();if(!this.store.shouldGcActiveSession(n,Date.now(),o)){this.syncRuntimeGcDeadline(n);return}this.registry.remove(e.id),this.persistSession(n,{scheduleRuntimeGc:!1}),this.lastWaitingEventTimestamps.delete(e.id),this.lastTurnCompleteMarkers.delete(e.id),this.lastTerminalWakeMarkers.delete(e.id)})}cancelPersistedMaintenance(e){let r=this.persistedMaintenanceRef(e);r&&this.maintenance.cancelPrefix(`persisted:${r}:`)}onPersistedSessionChanged(e){e&&(this.syncPersistedSessionMaintenance(e),this.enforcePersistedRetention())}isLegacyResolvedWorktree(e){return e.worktreeMerged===!0||e.worktreeDisposition==="dismissed"||e.worktreeDisposition==="no-change-cleaned"||e.worktreeState==="merged"||e.worktreeState==="dismissed"}syncPersistedSessionMaintenance(e){let r=this.persistedMaintenanceRef(e);if(!r)return;this.maintenance.cancel(this.persistedMaintenanceKey(r,"worktree-reminder"));let n=this.reminders.getNextReminderAt(e);n!=null&&this.schedulePersistedWorktreeReminder(r,n),this.maintenance.cancel(this.persistedMaintenanceKey(r,"worktree-retention"));let o=to(e,{activeSession:!1,includePrSync:e.worktreeLifecycle?.state==="pr_open"||!!e.worktreePrUrl}),i=e.worktreeLifecycle?.resolvedAt??e.worktreeMergedAt??e.worktreeDismissedAt??(e.completedAt?new Date(e.completedAt).toISOString():void 0),s=this.isLegacyResolvedWorktree(e);if((o.cleanupSafe||s)&&typeof i=="string"){let a=new Date(i).getTime();Number.isFinite(a)&&this.maintenance.schedule(this.persistedMaintenanceKey(r,"worktree-retention"),a+Ng,()=>{let d=this.store.getPersistedSession(r);d&&this.reconcileResolvedWorktreeRetention(d,Date.now())})}}schedulePersistedWorktreeReminder(e,r){let n=this.persistedMaintenanceKey(e,"worktree-reminder");this.maintenance.schedule(n,r,()=>{let o=this.store.getPersistedSession(e);if(!o||this.reminders.sendReminderIfDue(o,Date.now()))return;let s=this.reminders.getNextReminderAt(o);s!=null&&this.schedulePersistedWorktreeReminder(e,Math.max(s,Date.now()+Cx))})}reconcileResolvedWorktreeRetention(e,r){let n=to(e,{activeSession:!1,includePrSync:e.worktreeLifecycle?.state==="pr_open"||!!e.worktreePrUrl}),o=e.worktreeLifecycle?.resolvedAt??e.worktreeMergedAt??e.worktreeDismissedAt??(e.completedAt?new Date(e.completedAt).toISOString():void 0),i=o?new Date(o).getTime():0,s=this.isLegacyResolvedWorktree(e);if(!(!n.cleanupSafe&&!s||!i||r-i<Ng))try{if(!e.worktreePath&&!Ne(e))return;let a=this.resolveWorktreeRepoDir(e.workdir,e.worktreePath);if(!a)return;let d=Ne(e)?!1:tt(a,e.worktreePath);if(!Ne(e)&&!d)return;for(let l of et(e))this.updatePersistedSession(l,{worktreePath:void 0,worktreeBranch:void 0,worktreeState:"none",worktreeLifecycle:{...e.worktreeLifecycle??n.lifecycle,state:n.derivedState,updatedAt:new Date(r).toISOString(),resolvedAt:e.worktreeLifecycle?.resolvedAt??new Date(r).toISOString(),resolutionSource:e.worktreeLifecycle?.resolutionSource??"maintenance",notes:n.reasons}})}catch(a){console.warn(`[SessionManager] Failed maintenance cleanup for worktree ${e.worktreePath}: ${a instanceof Error?a.message:String(a)}`)}}syncActionTokenExpiryDeadline(){let e="tokens:expiry";this.maintenance.cancel(e);let r=this.store.getNextActionTokenExpiry();r!=null&&this.maintenance.schedule(e,r,()=>{this.store.purgeExpiredActionTokens(Date.now())})}syncTmpOutputCleanupDeadline(e=Date.now()){this.maintenance.cancel(Fg);let r=this.store.getNextTmpOutputCleanupAt(e);r!=null&&this.maintenance.schedule(Fg,r,()=>{let n=Date.now();this.store.cleanupTmpOutputFiles(n),this.syncTmpOutputCleanupDeadline(n)})}cleanupOutputPathIfUnreferenced(e){if(!(!e||this.store.hasOutputPathReference(e)))try{Rx(e)}catch{}}enforcePersistedRetention(){let e=this.store.evictOldestPersisted(this.maxPersistedSessions);for(let r of e)this.cancelPersistedMaintenance(r),r.sessionId&&this.maintenance.cancel(this.runtimeGcKey(r.sessionId)),this.cleanupOutputPathIfUnreferenced(r.outputPath)}bootstrapMaintenanceSchedules(){let e=Date.now();this.store.cleanupTmpOutputFiles(e);for(let r of this.store.listPersistedSessions())this.syncPersistedSessionMaintenance(r);this.syncActionTokenExpiryDeadline(),this.store.cleanupOrphanOutputFiles(),this.syncTmpOutputCleanupDeadline(e)}disposeMaintenance(){this.maintenance.dispose()}spawn(e,r={}){if(this.registry.activeSessionCount()>=this.maxSessions)throw new Error(`Max sessions reached (${this.maxSessions}). Use agent_sessions to list active sessions and agent_kill to end one.`);if(e.sessionIdOverride){let y=this.registry.get(e.sessionIdOverride);if(y?.status==="starting"||y?.status==="running")throw new Error(`Cannot reuse session ID ${e.sessionIdOverride}: that session is still ${y.status}.`);y&&this.registry.remove(y.id),this.lastWaitingEventTimestamps.delete(e.sessionIdOverride),this.lastTurnCompleteMarkers.delete(e.sessionIdOverride),this.lastTerminalWakeMarkers.delete(e.sessionIdOverride),this.maintenance.cancel(this.runtimeGcKey(e.sessionIdOverride))}let o=e.name||gf(e.prompt),i=this.uniqueName(o);if(i!==o&&console.warn(`[SessionManager] Name conflict: "${o}" \u2192 "${i}" (active session with same name exists)`),!e.route?.provider||!e.route.target)throw new Error(`Cannot launch session "${i}": missing explicit route metadata.`);let s=this.restore.prepareSpawn(e,i),a=e.harness??"claude-code",d=this,l,m=a==="claude-code"&&!e.canUseTool?async(y,f)=>{if(!l)throw new Error("canUseTool called before session ID was set");return d.handleAskUserQuestion(l,f)}:e.canUseTool,g=new Fi({...e,workdir:s.actualWorkdir,systemPrompt:s.effectiveSystemPrompt,canUseTool:m},i);return l=g.id,this.registry.add(g),this.metrics.incrementLaunched(),this.runtimeBootstrap.initializeSession(g,s,e,r)}async spawnAndAwaitRunning(e,r={}){let n=this.spawn(e,r);return await this.waitForRunningSession(n),n}async waitForRunningSession(e){if(e.status==="running")return;if(Dg.has(e.status))throw new Error(this.describeLaunchFailure(e));let r=e.on?.bind(e),n=e.off?.bind(e)??e.removeListener?.bind(e);if(!r||!n)throw new Error(`Session ${e.name} [${e.id}] did not expose lifecycle events during startup.`);await new Promise((o,i)=>{let s=(d,l)=>{if(l==="running"){a(),o();return}Dg.has(l)&&(a(),i(new Error(this.describeLaunchFailure(e))))},a=()=>{n("statusChange",s)};r("statusChange",s)})}describeLaunchFailure(e){let r=e.killReason?` (reason: ${e.killReason})`:"",n=e.error||e.result?.result||`status=${e.status}${r}`;return`Session ${e.name} [${e.id}] failed to start: ${n}`}formatLaunchResult(e,r){return oi({prompt:e.prompt,workdir:e.workdir,harness:e.harness,permissionMode:e.permissionMode??_.permissionMode,planApproval:e.planApproval,resumeSessionId:e.resumeSessionId,forkSession:e.forkSession,forceNewSession:e.forceNewSession,clearedPersistedCodexResume:e.clearedPersistedCodexResume},r)}shouldRunWorktreeStrategy(e){let r=e.lifecycle;return!(r==="starting"||r==="awaiting_plan_decision"||r==="awaiting_user_input"||e.pendingPlanApproval)}makeActionButton(e,r,n,o={}){return this.interactions.makeActionButton(e,r,n,o)}consumeActionToken(e){return this.interactions.consumeActionToken(e)}getActionToken(e){return this.interactions.getActionToken(e)}clearPlanDecisionTokens(e,r){this.interactions.clearPlanDecisionTokens(e,r)}hasProvablePlanReviewPrompt(e,r){return r!=null&&e.approvalPromptRequiredVersion===r&&(e.approvalPromptStatus==="delivered"||e.approvalPromptStatus==="fallback_delivered")}buildPlanApprovalWakeText(e,r,n=!1){return[n?"Plan review fallback text delivered to the user because interactive buttons could not be delivered.":"Plan approval buttons delivered to the user.",`Session: ${e.name} | ID: ${e.id} | Plan v${r??"?"}`,`Wait for their ${n?"explicit reply":"button callback"} \u2014 do NOT approve or reject this plan yourself.`].join(`
209
209
  `)}buildPlanApprovalDeliveryFailureWake(e,r){return["[PLAN APPROVAL DELIVERY FAILED] The plugin could not deliver the canonical plan review buttons or the explicit fallback text to the user.",`Name: ${e.name} | ID: ${e.id} | Plan v${r??"?"}`,e.originThreadId!=null?`Origin thread: ${e.originThreadId}`:"","","No user-visible actionable review prompt is confirmed for this plan version.","Intervene manually before assuming the user saw the plan review request."].filter(Boolean).join(`
210
- `)}dispatchPlanApprovalFallback(e,r,n){let o=new Date().toISOString();this.notifications.dispatch(e,{label:"plan-approval-fallback",userMessage:uo({session:e,summary:n}),notifyUser:"always",hooks:{onNotifyStarted:()=>{this.updatePersistedSession(e.id,{approvalPromptRequiredVersion:r,approvalPromptVersion:r,approvalPromptStatus:"sending",approvalPromptTransport:"direct-telegram",approvalPromptMessageKind:"explicit_fallback_text",approvalPromptLastAttemptAt:o})},onNotifySucceeded:()=>{this.updatePersistedSession(e.id,{approvalPromptRequiredVersion:r,approvalPromptVersion:r,approvalPromptStatus:"fallback_delivered",approvalPromptTransport:"direct-telegram",approvalPromptMessageKind:"explicit_fallback_text",approvalPromptLastAttemptAt:o,approvalPromptDeliveredAt:new Date().toISOString(),approvalPromptFailedAt:void 0})},onNotifyFailed:()=>{this.updatePersistedSession(e.id,{approvalPromptRequiredVersion:r,approvalPromptVersion:r,approvalPromptStatus:"failed",approvalPromptTransport:"direct-telegram",approvalPromptMessageKind:"explicit_fallback_text",approvalPromptLastAttemptAt:o,approvalPromptFailedAt:new Date().toISOString()})}},wakeMessageOnNotifySuccess:this.buildPlanApprovalWakeText(e,r,!0),wakeMessageOnNotifyFailed:this.buildPlanApprovalDeliveryFailureWake(e,r)})}getWorktreeDecisionButtons(e){let r=this.resolve(e)??this.getPersistedSession(e);if(!(!r||r.worktreeStrategy==="delegate"))return this.interactions.getWorktreeDecisionButtons(e,r)}getWorktreeCompletionState(e,r,n,o){return this.worktrees.getCompletionState(e,r,n,o)}notifyWorktreeOutcome(e,r){this.notifications.notifyWorktreeOutcome(e,r)}requestPlanApprovalFromUser(e,r){let n=r.trim();if(!n)return"Error: summary must not be empty.";let o=fl(n),i=this.resolve(e),s=i?void 0:this.getPersistedSession(e),a=i??s;if(!a)return`Error: Session "${e}" not found.`;if(!a.pendingPlanApproval)return`Error: Session "${e}" is not awaiting plan approval.`;let d=re(i??s??{id:e})??e;if(this.resolvePlanApprovalMode(a)!=="delegate")return`Error: Session "${e}" already uses direct user plan approval. Do not send a duplicate approval prompt.`;let l=a.actionablePlanDecisionVersion??a.planDecisionVersion;if(this.hasProvablePlanReviewPrompt(a,l))return[`An actionable plan review prompt already exists for session ${a.name} [${d}].`,"Wait for the user's Approve, Revise, or Reject response.","Do not send a separate plain-text approval message."].join(" ");if(a.deliveryState==="notifying")return[`A plan approval prompt is already being delivered for session ${a.name} [${d}].`,"Wait for delivery to finish before retrying."].join(" ");let m=this.interactions.getPlanApprovalButtons(d,{...a,planDecisionVersion:l}),g=[`\u{1F4CB} [${a.name}] Plan v${l??"?"} needs your decision:`,"","Why this was escalated:","",o,"","Choose Approve, Revise, or Reject below."].join(`
211
- `);return this.notifications.dispatch(this.buildRoutingProxy({id:d,name:a.name,sessionId:s?.sessionId,harnessSessionId:i?.harnessSessionId??s?.harnessSessionId,backendRef:i?.backendRef??s?.backendRef,route:i?.route??s?.route}),{label:"plan-approval",userMessage:g,notifyUser:"always",buttons:m,hooks:{onNotifyStarted:()=>{this.updatePersistedSession(d,{approvalPromptRequiredVersion:l,approvalPromptStatus:"sending",approvalPromptVersion:l,approvalPromptTransport:"direct-telegram",approvalPromptMessageKind:"canonical_buttons",approvalPromptLastAttemptAt:new Date().toISOString()})},onNotifySucceeded:()=>{this.updatePersistedSession(d,{canonicalPlanPromptVersion:l,approvalPromptRequiredVersion:l,approvalPromptVersion:l,approvalPromptStatus:"delivered",approvalPromptTransport:"direct-telegram",approvalPromptMessageKind:"canonical_buttons",approvalPromptDeliveredAt:new Date().toISOString(),approvalPromptFailedAt:void 0})},onNotifyFailed:()=>{this.updatePersistedSession(d,{approvalPromptRequiredVersion:l,approvalPromptVersion:l,approvalPromptStatus:"failed",approvalPromptTransport:"direct-telegram",approvalPromptMessageKind:"canonical_buttons",approvalPromptFailedAt:new Date().toISOString()})}},onUserNotifyFailed:()=>this.dispatchPlanApprovalFallback(this.buildRoutingProxy({id:d,name:a.name,sessionId:s?.sessionId,harnessSessionId:i?.harnessSessionId??s?.harnessSessionId,backendRef:i?.backendRef??s?.backendRef,route:i?.route??s?.route}),l,o),wakeMessageOnNotifySuccess:this.buildPlanApprovalWakeText({id:d,name:a.name},l)}),[`Canonical plan approval prompt sent for session ${a.name} [${d}].`,"Wait for the user's Approve, Revise, or Reject response.","Do not send a separate plain-text approval message."].join(" ")}buildRoutingProxy(e){return{id:re(e)??$(e)??e.harnessSessionId??"unknown-session",name:e.name,harnessSessionId:e.harnessSessionId,backendRef:e.backendRef?{...e.backendRef}:void 0,route:e.route}}resolveWorktreeRepoDir(e,r){return e&&(!r||!rs(e,r))||!r?e:Mi(r)??e}formatLaunchWorkdirLabel(e){if(!e.worktreePath)return e.workdir;let r=this.resolveWorktreeRepoDir(e.originalWorkdir,e.worktreePath);return!r||r===e.worktreePath?e.worktreePath:`${e.worktreePath} (worktree of ${r})`}async dismissWorktree(e){return this.worktreeDecisions.dismissWorktree(e)}snoozeWorktreeDecision(e){return this.worktreeDecisions.snoozeWorktreeDecision(e)}async handleWorktreeStrategy(e){return this.worktreeStrategy.handleWorktreeStrategy(e)}async onSessionTerminal(e){if(e.autoMergeParentSessionId){await this.handleAutoMergeResolverTerminal(e);return}return this.lifecycle.handleSessionTerminal(e)}async handleAutoMergeResolverTerminal(e){this.persistSession(e),this.lastWaitingEventTimestamps.delete(e.id),this.wakeDispatcher.clearRetryTimersForSession(e.id);let r=e.autoMergeParentSessionId;if(!r)return;let n=this.resolve(r),o=this.getPersistedSession(r),i=n??(o?this.buildRoutingProxy({id:o.sessionId,name:o.name,sessionId:o.sessionId,harnessSessionId:o.harnessSessionId,backendRef:o.backendRef,route:o.route}):void 0);if(!i){console.warn(`[SessionManager] Auto-merge resolver ${e.id} completed, but original session ${r} could not be found.`);return}if(e.status==="completed"&&n){this.updatePersistedSession(r,{autoMergeResolverSessionId:void 0}),await this.handleWorktreeStrategy(n);return}let s=n?.worktreeBranch??o?.worktreeBranch??"unknown",a=n?.worktreePath??o?.worktreePath??"(unknown worktree)",d=n?.worktreeBaseBranch??o?.worktreeBaseBranch,l=n?.worktreePrTargetRepo??o?.worktreePrTargetRepo,m=n?.worktreePushRemote??o?.worktreePushRemote;this.updatePersistedSession(r,as({worktreeBaseBranch:d,worktreePrTargetRepo:l,worktreePushRemote:m},{clearResolverSessionId:!0,notes:[e.status==="completed"?"auto_merge_conflict_resolver_completed_without_retry_target":"auto_merge_conflict_resolver_failed"]})),this.dispatchSessionNotification(i,{label:"worktree-merge-conflict-resolver-failed",userMessage:[`\u26A0\uFE0F [${i.name}] Auto-merge conflict resolution did not complete successfully.`,`Branch \`${s}\` was preserved for manual follow-up in ${a}.`,e.status==="completed"?"The resolver finished, but the original session could not be resumed for the merge retry.":`Resolver session ${e.name} ended with status=${e.status}.`].join(`
212
- `),buttons:[[this.makeActionButton(r,"worktree-create-pr","Open PR")]]})}getStoppedStatusLabel(e){return lo(e)}persistSession(e,r={}){let n=r.scheduleRuntimeGc??!0;this.store.hasRecordedSession(e.id)||this.metrics.recordSession(e),this.store.persistTerminal(e),n&&this.syncRuntimeGcDeadline(e),this.onPersistedSessionChanged(this.store.getPersistedSession(e.id)),this.syncTmpOutputCleanupDeadline()}getMetrics(){return this.metrics.getMetrics()}recordSessionMetrics(e){this.metrics.recordSession(e)}notifySession(e,r,n="notification"){this.dispatchSessionNotification(e,{label:n,userMessage:r,notifyUser:"always"})}sendMonitorReport(e){let r=this.interactions.getMonitorReportButtons({reportId:e.reportId,route:e.route,planName:e.planName,planPrompt:e.planPrompt,planWorkdir:e.planWorkdir});this.dispatchSessionNotification(this.buildRoutingProxy({id:e.reportId,route:e.route}),{label:"monitor-report",userMessage:e.text,notifyUser:"always",buttons:r})}emitGoalTaskUpdate(e,r,n="goal-task"){let o=this.buildRoutingProxy({id:e.sessionId??e.id,route:e.route});o.originChannel=e.originChannel,o.originThreadId=e.originThreadId,o.originSessionKey=e.originSessionKey,this.dispatchSessionNotification(o,{label:n,userMessage:r,notifyUser:"always"})}launchMonitorPlan(e){let r=e.route??{provider:"system",target:"system"};return this.spawn({prompt:e.prompt,workdir:e.workdir,name:e.name,harness:Pe(),permissionMode:"plan",planApproval:"ask",worktreeStrategy:"off",multiTurn:!0,route:r,originChannel:this.originChannelFromRoute(r),originThreadId:r.threadId,originSessionKey:r.sessionKey})}dispatchSessionNotification(e,r){this.notifications.dispatch(e,r)}originChannelFromRoute(e){return e.accountId?`${e.provider}|${e.accountId}|${e.target}`:`${e.provider}|${e.target}`}debounceWaitingEvent(e){let r=Date.now(),n=this.lastWaitingEventTimestamps.get(e);return n&&r-n<Cx?!1:(this.lastWaitingEventTimestamps.set(e,r),!0)}originThreadLine(e){return e.originThreadId!=null?`Session origin thread: ${e.originThreadId}`:""}extractLastOutputLine(e){return e.getOutput(3).filter(o=>o.trim()).pop()?.trim()||void 0}getOutputPreview(e,r=1e3){let n=!Number.isFinite(r),o=typeof e.getOutput=="function"?e.getOutput():[],i=n?o.join(`
210
+ `)}dispatchPlanApprovalFallback(e,r,n){let o=new Date().toISOString();this.notifications.dispatch(e,{label:"plan-approval-fallback",userMessage:uo({session:e,summary:n}),notifyUser:"always",hooks:{onNotifyStarted:()=>{this.updatePersistedSession(e.id,{approvalPromptRequiredVersion:r,approvalPromptVersion:r,approvalPromptStatus:"sending",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"explicit_fallback_text",approvalPromptLastAttemptAt:o})},onNotifySucceeded:()=>{this.updatePersistedSession(e.id,{approvalPromptRequiredVersion:r,approvalPromptVersion:r,approvalPromptStatus:"fallback_delivered",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"explicit_fallback_text",approvalPromptLastAttemptAt:o,approvalPromptDeliveredAt:new Date().toISOString(),approvalPromptFailedAt:void 0})},onNotifyFailed:()=>{this.updatePersistedSession(e.id,{approvalPromptRequiredVersion:r,approvalPromptVersion:r,approvalPromptStatus:"failed",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"explicit_fallback_text",approvalPromptLastAttemptAt:o,approvalPromptFailedAt:new Date().toISOString()})}},wakeMessageOnNotifySuccess:this.buildPlanApprovalWakeText(e,r,!0),wakeMessageOnNotifyFailed:this.buildPlanApprovalDeliveryFailureWake(e,r)})}getWorktreeDecisionButtons(e){let r=this.resolve(e)??this.getPersistedSession(e);if(!(!r||r.worktreeStrategy==="delegate"))return this.interactions.getWorktreeDecisionButtons(e,r)}getWorktreeCompletionState(e,r,n,o){return this.worktrees.getCompletionState(e,r,n,o)}notifyWorktreeOutcome(e,r){this.notifications.notifyWorktreeOutcome(e,r)}requestPlanApprovalFromUser(e,r){let n=r.trim();if(!n)return"Error: summary must not be empty.";let o=fl(n),i=this.resolve(e),s=i?void 0:this.getPersistedSession(e),a=i??s;if(!a)return`Error: Session "${e}" not found.`;if(!a.pendingPlanApproval)return`Error: Session "${e}" is not awaiting plan approval.`;let d=re(i??s??{id:e})??e;if(this.resolvePlanApprovalMode(a)!=="delegate")return`Error: Session "${e}" already uses direct user plan approval. Do not send a duplicate approval prompt.`;let l=a.actionablePlanDecisionVersion??a.planDecisionVersion;if(this.hasProvablePlanReviewPrompt(a,l))return[`An actionable plan review prompt already exists for session ${a.name} [${d}].`,"Wait for the user's Approve, Revise, or Reject response.","Do not send a separate plain-text approval message."].join(" ");if(a.deliveryState==="notifying")return[`A plan approval prompt is already being delivered for session ${a.name} [${d}].`,"Wait for delivery to finish before retrying."].join(" ");let m=this.interactions.getPlanApprovalButtons(d,{...a,planDecisionVersion:l}),g=[`\u{1F4CB} [${a.name}] Plan v${l??"?"} needs your decision:`,"","Why this was escalated:","",o,"","Choose Approve, Revise, or Reject below."].join(`
211
+ `);return this.notifications.dispatch(this.buildRoutingProxy({id:d,name:a.name,sessionId:s?.sessionId,harnessSessionId:i?.harnessSessionId??s?.harnessSessionId,backendRef:i?.backendRef??s?.backendRef,route:i?.route??s?.route}),{label:"plan-approval",userMessage:g,notifyUser:"always",buttons:m,hooks:{onNotifyStarted:()=>{this.updatePersistedSession(d,{approvalPromptRequiredVersion:l,approvalPromptStatus:"sending",approvalPromptVersion:l,approvalPromptTransport:"direct-message",approvalPromptMessageKind:"canonical_buttons",approvalPromptLastAttemptAt:new Date().toISOString()})},onNotifySucceeded:()=>{this.updatePersistedSession(d,{canonicalPlanPromptVersion:l,approvalPromptRequiredVersion:l,approvalPromptVersion:l,approvalPromptStatus:"delivered",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"canonical_buttons",approvalPromptDeliveredAt:new Date().toISOString(),approvalPromptFailedAt:void 0})},onNotifyFailed:()=>{this.updatePersistedSession(d,{approvalPromptRequiredVersion:l,approvalPromptVersion:l,approvalPromptStatus:"failed",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"canonical_buttons",approvalPromptFailedAt:new Date().toISOString()})}},onUserNotifyFailed:()=>this.dispatchPlanApprovalFallback(this.buildRoutingProxy({id:d,name:a.name,sessionId:s?.sessionId,harnessSessionId:i?.harnessSessionId??s?.harnessSessionId,backendRef:i?.backendRef??s?.backendRef,route:i?.route??s?.route}),l,o),wakeMessageOnNotifySuccess:this.buildPlanApprovalWakeText({id:d,name:a.name},l)}),[`Canonical plan approval prompt sent for session ${a.name} [${d}].`,"Wait for the user's Approve, Revise, or Reject response.","Do not send a separate plain-text approval message."].join(" ")}buildRoutingProxy(e){return{id:re(e)??$(e)??e.harnessSessionId??"unknown-session",name:e.name,harnessSessionId:e.harnessSessionId,backendRef:e.backendRef?{...e.backendRef}:void 0,route:e.route}}resolveWorktreeRepoDir(e,r){return e&&(!r||!rs(e,r))||!r?e:Mi(r)??e}formatLaunchWorkdirLabel(e){if(!e.worktreePath)return e.workdir;let r=this.resolveWorktreeRepoDir(e.originalWorkdir,e.worktreePath);return!r||r===e.worktreePath?e.worktreePath:`${e.worktreePath} (worktree of ${r})`}async dismissWorktree(e){return this.worktreeDecisions.dismissWorktree(e)}snoozeWorktreeDecision(e){return this.worktreeDecisions.snoozeWorktreeDecision(e)}async handleWorktreeStrategy(e){return this.worktreeStrategy.handleWorktreeStrategy(e)}async onSessionTerminal(e){if(e.autoMergeParentSessionId){await this.handleAutoMergeResolverTerminal(e);return}return this.lifecycle.handleSessionTerminal(e)}async handleAutoMergeResolverTerminal(e){this.persistSession(e),this.lastWaitingEventTimestamps.delete(e.id),this.wakeDispatcher.clearRetryTimersForSession(e.id);let r=e.autoMergeParentSessionId;if(!r)return;let n=this.resolve(r),o=this.getPersistedSession(r),i=n??(o?this.buildRoutingProxy({id:o.sessionId,name:o.name,sessionId:o.sessionId,harnessSessionId:o.harnessSessionId,backendRef:o.backendRef,route:o.route}):void 0);if(!i){console.warn(`[SessionManager] Auto-merge resolver ${e.id} completed, but original session ${r} could not be found.`);return}if(e.status==="completed"&&n){this.updatePersistedSession(r,{autoMergeResolverSessionId:void 0}),await this.handleWorktreeStrategy(n);return}let s=n?.worktreeBranch??o?.worktreeBranch??"unknown",a=n?.worktreePath??o?.worktreePath??"(unknown worktree)",d=n?.worktreeBaseBranch??o?.worktreeBaseBranch,l=n?.worktreePrTargetRepo??o?.worktreePrTargetRepo,m=n?.worktreePushRemote??o?.worktreePushRemote;this.updatePersistedSession(r,as({worktreeBaseBranch:d,worktreePrTargetRepo:l,worktreePushRemote:m},{clearResolverSessionId:!0,notes:[e.status==="completed"?"auto_merge_conflict_resolver_completed_without_retry_target":"auto_merge_conflict_resolver_failed"]})),this.dispatchSessionNotification(i,{label:"worktree-merge-conflict-resolver-failed",userMessage:[`\u26A0\uFE0F [${i.name}] Auto-merge conflict resolution did not complete successfully.`,`Branch \`${s}\` was preserved for manual follow-up in ${a}.`,e.status==="completed"?"The resolver finished, but the original session could not be resumed for the merge retry.":`Resolver session ${e.name} ended with status=${e.status}.`].join(`
212
+ `),buttons:[[this.makeActionButton(r,"worktree-create-pr","Open PR")]]})}getStoppedStatusLabel(e){return lo(e)}persistSession(e,r={}){let n=r.scheduleRuntimeGc??!0;this.store.hasRecordedSession(e.id)||this.metrics.recordSession(e),this.store.persistTerminal(e),n&&this.syncRuntimeGcDeadline(e),this.onPersistedSessionChanged(this.store.getPersistedSession(e.id)),this.syncTmpOutputCleanupDeadline()}getMetrics(){return this.metrics.getMetrics()}recordSessionMetrics(e){this.metrics.recordSession(e)}notifySession(e,r,n="notification"){this.dispatchSessionNotification(e,{label:n,userMessage:r,notifyUser:"always"})}sendMonitorReport(e){let r=this.interactions.getMonitorReportButtons({reportId:e.reportId,route:e.route,planName:e.planName,planPrompt:e.planPrompt,planWorkdir:e.planWorkdir});this.dispatchSessionNotification(this.buildRoutingProxy({id:e.reportId,route:e.route}),{label:"monitor-report",userMessage:e.text,notifyUser:"always",buttons:r})}emitGoalTaskUpdate(e,r,n="goal-task"){let o=this.buildRoutingProxy({id:e.sessionId??e.id,route:e.route});o.originChannel=e.originChannel,o.originThreadId=e.originThreadId,o.originSessionKey=e.originSessionKey,this.dispatchSessionNotification(o,{label:n,userMessage:r,notifyUser:"always"})}launchMonitorPlan(e){let r=e.route??{provider:"system",target:"system"};return this.spawn({prompt:e.prompt,workdir:e.workdir,name:e.name,harness:Pe(),permissionMode:"plan",planApproval:"ask",worktreeStrategy:"off",multiTurn:!0,route:r,originChannel:this.originChannelFromRoute(r),originThreadId:r.threadId,originSessionKey:r.sessionKey})}dispatchSessionNotification(e,r){this.notifications.dispatch(e,r)}originChannelFromRoute(e){return e.accountId?`${e.provider}|${e.accountId}|${e.target}`:`${e.provider}|${e.target}`}debounceWaitingEvent(e){let r=Date.now(),n=this.lastWaitingEventTimestamps.get(e);return n&&r-n<Mx?!1:(this.lastWaitingEventTimestamps.set(e,r),!0)}originThreadLine(e){return e.originThreadId!=null?`Session origin thread: ${e.originThreadId}`:""}extractLastOutputLine(e){return e.getOutput(3).filter(o=>o.trim()).pop()?.trim()||void 0}getOutputPreview(e,r=1e3){let n=!Number.isFinite(r),o=typeof e.getOutput=="function"?e.getOutput():[],i=n?o.join(`
213
213
  `):this.selectCompletionPreviewSource(e);return n?i:i.length>r?this.shouldPreferTailPreview(e)?Wi(i,r):Sf(i,r):i}selectCompletionPreviewSource(e){let r=typeof e.getOutput=="function"?e.getOutput():[],n=r.join(`
214
214
  `).trim();return n?this.shouldPreferTailPreview(e)?this.extractLastSubstantiveBlock(n)??n:r.slice(-20).join(`
215
215
  `):""}shouldPreferTailPreview(e){if(e.status==="completed"||e.killReason==="done")return!0;let r=e;return r.approvalState==="approved"||r.planModeApproved===!0||(r.planDecisionVersion??0)>0}extractLastSubstantiveBlock(e){let n=e.split(/\n\s*\n+/).map(o=>o.trim()).filter(o=>/[A-Za-z0-9]/.test(o)).at(-1);if(n)return n.length>=120||n.includes(`
216
- `)?n:void 0}triggerAgentEvent(e){this.lifecycle.emitCompleted(e)}triggerFailedEvent(e,r,n=!1){this.lifecycle.emitFailed(e,r,n)}triggerWaitingForInputEvent(e){this.lifecycle.emitWaitingForInput(e)}resolvePlanApprovalMode(e){return e.planApproval??_.planApproval??"delegate"}onTurnEnd(e,r){this.lifecycle.handleTurnEnd(e,r)}shouldEmitTurnCompleteWake(e){let r=`${e.result?.session_id??""}|${e.result?.num_turns??0}|${e.result?.duration_ms??0}`;return this.lastTurnCompleteMarkers.get(e.id)===r?(console.info(`[SessionManager] shouldEmitTurnCompleteWake: debounced for session ${e.id} (marker unchanged: ${r})`),!1):(this.lastTurnCompleteMarkers.set(e.id,r),!0)}shouldEmitTerminalWake(e){let r=`${e.status}|${e.completedAt??0}|${e.result?.session_id??""}|${e.result?.num_turns??0}|${e.killReason}`;return this.lastTerminalWakeMarkers.get(e.id)===r?!1:(this.lastTerminalWakeMarkers.set(e.id,r),!0)}triggerTurnCompleteEventWithSignal(e){this.lifecycle.emitTurnComplete(e)}resolve(e){return this.references.resolveActive(e)}get(e){return this.registry.get(e)}list(e){let r=this.registry.list();return e&&e!=="all"&&(r=r.filter(n=>n.status===e)),r.sort((n,o)=>o.startedAt-n.startedAt)}kill(e,r){let n=this.registry.get(e);return n?(n.kill(r??"user"),!0):!1}killAll(e="user"){for(let r of this.sessions.values())Mx.has(r.status)&&this.kill(r.id,e)}resolveBackendConversationId(e){return this.references.resolveBackendConversationId(e)}resolveHarnessSessionId(e){return this.resolveBackendConversationId(e)}getPersistedSession(e){return this.references.getPersistedSession(e)}isAlreadyMerged(e){if(!e)return!1;let r=this.store.getPersistedSession(e);return r?.worktreeMerged===!0||r?.worktreeLifecycle?.state==="merged"||r?.worktreeLifecycle?.state==="released"}async enqueueMerge(e,r,n){let o=this.mergeQueues.get(e);o!==void 0&&n&&n();let i=(o??Promise.resolve()).catch(()=>{}).then(()=>r()),s=i.catch(()=>{});return this.mergeQueues.set(e,s),s.finally(()=>{this.mergeQueues.get(e)===s&&this.mergeQueues.delete(e)}),i}updatePersistedSession(e,r){let n=this.stateSync.applySessionPatch(e,r);return n&&this.onPersistedSessionChanged(this.store.getPersistedSession(e)),n}listPersistedSessions(){return this.store.listPersistedSessions()}async handleAskUserQuestion(e,r){let n=this.sessions.get(e);if(!n)throw new Error(`Session "${e}" not found for AskUserQuestion intercept`);return this.questions.handleAskUserQuestion(n,r)}resolveAskUserQuestion(e,r){this.questions.resolveAskUserQuestion(e,r)}async resolvePendingInputOption(e,r){let n=this.sessions.get(e);return n&&await n.submitPendingInputOption(r)?(this.lastWaitingEventTimestamps.delete(e),!0):(this.questions.resolveAskUserQuestion(e,r),!0)}dispose(){this.disposeMaintenance(),this.questions.dispose(),this.notifications.dispose()}};Y();var Lg;function Os(t){if(t&&typeof t=="object"){Lg=t;return}Lg=void 0}Re();import{definePluginEntry as Wg}from"openclaw/plugin-sdk/core";function Nx(t){let e=parseInt(process.env.OPENCLAW_WORKTREE_CLEANUP_AGE_HOURS??"168",10)||168,r=e*60*60*1e3,n=Date.now()-r,o=new Set(t.listPersistedSessions().map(d=>d.worktreePath).filter(d=>typeof d=="string"&&d.length>0)),i=new Set,s=process.env.OPENCLAW_WORKTREE_DIR??_.worktreeDir;if(s)i.add(s);else for(let d of t.listPersistedSessions())if(d.workdir)try{let l=Dx("git",["rev-parse","--show-toplevel"],{cwd:d.workdir,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();l&&i.add(Bg(l,".worktrees"))}catch{}if(i.size===0)return;let a=0;for(let d of i)try{let l=$x(d);for(let m of l){if(!m.startsWith("openclaw-worktree-"))continue;let g=Bg(d,m);try{let y=Ex(g);if(!y.isDirectory()||y.mtimeMs>n||o.has(g))continue;Ox(g,{recursive:!0,force:!0}),a++}catch(y){console.warn(`[index] Failed to clean up orphaned worktree ${g}: ${y instanceof Error?y.message:String(y)}`)}}}catch{}a>0&&console.info(`[index] Cleaned up ${a} orphaned worktree(s) at startup (age > ${e}h)`)}function Fx(t){let e=null,r=null,n=t.registerTool;Os(t.runtime),n(o=>Hm(o),{optional:!1}),n(o=>Pf(o),{optional:!1}),n(o=>wf(o),{optional:!1}),n(o=>Vi(o),{optional:!1}),n(o=>Af(o),{optional:!1}),n(o=>Rf(o),{optional:!1}),n(o=>Tf(o),{optional:!1}),n(o=>Mf(o),{optional:!1}),n(o=>Qi(o),{optional:!1}),n(o=>oo(o),{optional:!1}),n(o=>$f(o),{optional:!1}),n(o=>Ef(o),{optional:!1}),n(o=>Of(o),{optional:!1}),n(o=>Nf(o),{optional:!1}),n(o=>Ff(o),{optional:!1}),t.registerInteractiveHandler(zd("telegram")),t.registerInteractiveHandler(zd("discord")),Lf(t),Wf(t),Bf(t),Uf(t),Kf(t),Vf(t),qf(t),jf(t),Gf(t),t.registerService({id:"openclaw-code-agent",start:o=>{let i=t.pluginConfig??{};pm(i),Os(t.runtime),e=new Es(_.maxSessions,_.maxPersistedSessions),r=new ts(e),kd(e),vd(r),r.start(),Nx(e),e.bootstrapMaintenanceSchedules()},stop:()=>{r&&r.stop(),e&&e.killAll("shutdown"),e&&e.dispose(),r=null,e=null,Os(void 0),vd(null),kd(null)}})}var $G=Wg({id:"openclaw-code-agent",name:"OpenClaw Code Agent",description:"Multi-session coding-agent orchestration from OpenClaw chat",register:Fx});export{$G as default,Fx as register};
216
+ `)?n:void 0}triggerAgentEvent(e){this.lifecycle.emitCompleted(e)}triggerFailedEvent(e,r,n=!1){this.lifecycle.emitFailed(e,r,n)}triggerWaitingForInputEvent(e){this.lifecycle.emitWaitingForInput(e)}resolvePlanApprovalMode(e){return e.planApproval??_.planApproval??"delegate"}onTurnEnd(e,r){this.lifecycle.handleTurnEnd(e,r)}shouldEmitTurnCompleteWake(e){let r=`${e.result?.session_id??""}|${e.result?.num_turns??0}|${e.result?.duration_ms??0}`;return this.lastTurnCompleteMarkers.get(e.id)===r?(console.info(`[SessionManager] shouldEmitTurnCompleteWake: debounced for session ${e.id} (marker unchanged: ${r})`),!1):(this.lastTurnCompleteMarkers.set(e.id,r),!0)}shouldEmitTerminalWake(e){let r=`${e.status}|${e.completedAt??0}|${e.result?.session_id??""}|${e.result?.num_turns??0}|${e.killReason}`;return this.lastTerminalWakeMarkers.get(e.id)===r?!1:(this.lastTerminalWakeMarkers.set(e.id,r),!0)}triggerTurnCompleteEventWithSignal(e){this.lifecycle.emitTurnComplete(e)}resolve(e){return this.references.resolveActive(e)}get(e){return this.registry.get(e)}list(e){let r=this.registry.list();return e&&e!=="all"&&(r=r.filter(n=>n.status===e)),r.sort((n,o)=>o.startedAt-n.startedAt)}kill(e,r){let n=this.registry.get(e);return n?(n.kill(r??"user"),!0):!1}killAll(e="user"){for(let r of this.sessions.values())Tx.has(r.status)&&this.kill(r.id,e)}resolveBackendConversationId(e){return this.references.resolveBackendConversationId(e)}resolveHarnessSessionId(e){return this.resolveBackendConversationId(e)}getPersistedSession(e){return this.references.getPersistedSession(e)}isAlreadyMerged(e){if(!e)return!1;let r=this.store.getPersistedSession(e);return r?.worktreeMerged===!0||r?.worktreeLifecycle?.state==="merged"||r?.worktreeLifecycle?.state==="released"}async enqueueMerge(e,r,n){let o=this.mergeQueues.get(e);o!==void 0&&n&&n();let i=(o??Promise.resolve()).catch(()=>{}).then(()=>r()),s=i.catch(()=>{});return this.mergeQueues.set(e,s),s.finally(()=>{this.mergeQueues.get(e)===s&&this.mergeQueues.delete(e)}),i}updatePersistedSession(e,r){let n=this.stateSync.applySessionPatch(e,r);return n&&this.onPersistedSessionChanged(this.store.getPersistedSession(e)),n}listPersistedSessions(){return this.store.listPersistedSessions()}async handleAskUserQuestion(e,r){let n=this.sessions.get(e);if(!n)throw new Error(`Session "${e}" not found for AskUserQuestion intercept`);return this.questions.handleAskUserQuestion(n,r)}resolveAskUserQuestion(e,r){this.questions.resolveAskUserQuestion(e,r)}async resolvePendingInputOption(e,r){let n=this.sessions.get(e);return n&&await n.submitPendingInputOption(r)?(this.lastWaitingEventTimestamps.delete(e),!0):(this.questions.resolveAskUserQuestion(e,r),!0)}dispose(){this.disposeMaintenance(),this.questions.dispose(),this.notifications.dispose()}};Y();var Lg;function Os(t){if(t&&typeof t=="object"){Lg=t;return}Lg=void 0}Re();import{definePluginEntry as Wg}from"openclaw/plugin-sdk/core";function Dx(t){let e=parseInt(process.env.OPENCLAW_WORKTREE_CLEANUP_AGE_HOURS??"168",10)||168,r=e*60*60*1e3,n=Date.now()-r,o=new Set(t.listPersistedSessions().map(d=>d.worktreePath).filter(d=>typeof d=="string"&&d.length>0)),i=new Set,s=process.env.OPENCLAW_WORKTREE_DIR??_.worktreeDir;if(s)i.add(s);else for(let d of t.listPersistedSessions())if(d.workdir)try{let l=Ox("git",["rev-parse","--show-toplevel"],{cwd:d.workdir,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();l&&i.add(Bg(l,".worktrees"))}catch{}if(i.size===0)return;let a=0;for(let d of i)try{let l=_x(d);for(let m of l){if(!m.startsWith("openclaw-worktree-"))continue;let g=Bg(d,m);try{let y=$x(g);if(!y.isDirectory()||y.mtimeMs>n||o.has(g))continue;Ex(g,{recursive:!0,force:!0}),a++}catch(y){console.warn(`[index] Failed to clean up orphaned worktree ${g}: ${y instanceof Error?y.message:String(y)}`)}}}catch{}a>0&&console.info(`[index] Cleaned up ${a} orphaned worktree(s) at startup (age > ${e}h)`)}function Nx(t){let e=null,r=null,n=t.registerTool;Os(t.runtime),n(o=>Hm(o),{optional:!1}),n(o=>Pf(o),{optional:!1}),n(o=>wf(o),{optional:!1}),n(o=>Vi(o),{optional:!1}),n(o=>Af(o),{optional:!1}),n(o=>Rf(o),{optional:!1}),n(o=>Tf(o),{optional:!1}),n(o=>Mf(o),{optional:!1}),n(o=>Qi(o),{optional:!1}),n(o=>oo(o),{optional:!1}),n(o=>$f(o),{optional:!1}),n(o=>Ef(o),{optional:!1}),n(o=>Of(o),{optional:!1}),n(o=>Nf(o),{optional:!1}),n(o=>Ff(o),{optional:!1}),t.registerInteractiveHandler(zd("telegram")),t.registerInteractiveHandler(zd("discord")),Lf(t),Wf(t),Bf(t),Uf(t),Kf(t),Vf(t),qf(t),jf(t),Gf(t),t.registerService({id:"openclaw-code-agent",start:o=>{let i=t.pluginConfig??{};pm(i),Os(t.runtime),e=new Es(_.maxSessions,_.maxPersistedSessions),r=new ts(e),kd(e),vd(r),r.start(),Dx(e),e.bootstrapMaintenanceSchedules()},stop:()=>{r&&r.stop(),e&&e.killAll("shutdown"),e&&e.dispose(),r=null,e=null,Os(void 0),vd(null),kd(null)}})}var _G=Wg({id:"openclaw-code-agent",name:"OpenClaw Code Agent",description:"Multi-session coding-agent orchestration from OpenClaw chat",register:Nx});export{_G as default,Nx as register};