openclaw-code-agent 4.2.3 → 4.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.js +130 -125
- package/openclaw.plugin.json +1 -1
- package/package.json +13 -9
package/dist/index.js
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
var Qh=Object.defineProperty;var p=(t,e)=>()=>(t&&(e=t(t=0)),e);var Ao=(t,e)=>{for(var n in e)Qh(t,n,{get:e[n],enumerable:!0})};var _e={};Ao(_e,{HasPropertyKey:()=>Ro,IsArray:()=>ce,IsAsyncIterator:()=>da,IsBigInt:()=>Pr,IsBoolean:()=>Nt,IsDate:()=>hn,IsFunction:()=>la,IsIterator:()=>ua,IsNull:()=>pa,IsNumber:()=>He,IsObject:()=>G,IsRegExp:()=>wr,IsString:()=>Q,IsSymbol:()=>ca,IsUint8Array:()=>Ft,IsUndefined:()=>me});function Ro(t,e){return e in t}function da(t){return G(t)&&!ce(t)&&!Ft(t)&&Symbol.asyncIterator in t}function ce(t){return Array.isArray(t)}function Pr(t){return typeof t=="bigint"}function Nt(t){return typeof t=="boolean"}function hn(t){return t instanceof globalThis.Date}function la(t){return typeof t=="function"}function ua(t){return G(t)&&!ce(t)&&!Ft(t)&&Symbol.iterator in t}function pa(t){return t===null}function He(t){return typeof t=="number"}function G(t){return typeof t=="object"&&t!==null}function wr(t){return t instanceof globalThis.RegExp}function Q(t){return typeof t=="string"}function ca(t){return typeof t=="symbol"}function Ft(t){return t instanceof globalThis.Uint8Array}function me(t){return t===void 0}var Fe=p(()=>{});function Jh(t){return t.map(e=>To(e))}function Yh(t){return new Date(t.getTime())}function Xh(t){return new Uint8Array(t)}function Zh(t){return new RegExp(t.source,t.flags)}function eS(t){let e={};for(let n of Object.getOwnPropertyNames(t))e[n]=To(t[n]);for(let n of Object.getOwnPropertySymbols(t))e[n]=To(t[n]);return e}function To(t){return ce(t)?Jh(t):hn(t)?Yh(t):Ft(t)?Xh(t):wr(t)?Zh(t):G(t)?eS(t):t}function ee(t){return To(t)}var Be=p(()=>{Fe()});function Wn(t,e){return e===void 0?ee(t):ee({...e,...t})}var Co=p(()=>{Be()});var ma=p(()=>{Co();Be()});function su(t){return t!==null&&typeof t=="object"}function au(t){return globalThis.Array.isArray(t)&&!globalThis.ArrayBuffer.isView(t)}function du(t){return t===void 0}function lu(t){return typeof t=="number"}var uu=p(()=>{});var pu=p(()=>{uu()});var Mo,cu=p(()=>{pu();(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 n(s){let a=su(s);return t.AllowArrayObject?a:a&&!au(s)}t.IsObjectLike=n;function r(s){return n(s)&&!(s instanceof Date)&&!(s instanceof Uint8Array)}t.IsRecordLike=r;function o(s){return t.AllowNaN?lu(s):Number.isFinite(s)}t.IsNumberLike=o;function i(s){let a=du(s);return t.AllowNullVoid?a||s===null:a}t.IsVoidLike=i})(Mo||(Mo={}))});function tS(t){return globalThis.Object.freeze(t).map(e=>Ir(e))}function nS(t){let e={};for(let n of Object.getOwnPropertyNames(t))e[n]=Ir(t[n]);for(let n of Object.getOwnPropertySymbols(t))e[n]=Ir(t[n]);return globalThis.Object.freeze(e)}function Ir(t){return ce(t)?tS(t):hn(t)?t:Ft(t)?t:wr(t)?t:G(t)?nS(t):t}var mu=p(()=>{Fe()});function h(t,e){let n=e!==void 0?{...e,...t}:t;switch(Mo.InstanceMode){case"freeze":return Ir(n);case"clone":return ee(n);default:return n}}var R=p(()=>{cu();mu();Be()});var Lt=p(()=>{R()});var we,fu=p(()=>{we=class extends Error{constructor(e){super(e)}}});var Ct=p(()=>{fu()});var Se,yt,Ae,st,w,br=p(()=>{Se=Symbol.for("TypeBox.Transform"),yt=Symbol.for("TypeBox.Readonly"),Ae=Symbol.for("TypeBox.Optional"),st=Symbol.for("TypeBox.Hint"),w=Symbol.for("TypeBox.Kind")});var T=p(()=>{br()});function Bn(t){return G(t)&&t[yt]==="Readonly"}function Ue(t){return G(t)&&t[Ae]==="Optional"}function fa(t){return D(t,"Any")}function ga(t){return D(t,"Argument")}function kt(t){return D(t,"Array")}function Sn(t){return D(t,"AsyncIterator")}function yn(t){return D(t,"BigInt")}function Wt(t){return D(t,"Boolean")}function vt(t){return D(t,"Computed")}function Pt(t){return D(t,"Constructor")}function rS(t){return D(t,"Date")}function wt(t){return D(t,"Function")}function It(t){return D(t,"Integer")}function oe(t){return D(t,"Intersect")}function kn(t){return D(t,"Iterator")}function D(t,e){return G(t)&&w in t&&t[w]===e}function _o(t){return Nt(t)||He(t)||Q(t)}function ze(t){return D(t,"Literal")}function Qe(t){return D(t,"MappedKey")}function te(t){return D(t,"MappedResult")}function Ht(t){return D(t,"Never")}function oS(t){return D(t,"Not")}function xr(t){return D(t,"Null")}function bt(t){return D(t,"Number")}function fe(t){return D(t,"Object")}function vn(t){return D(t,"Promise")}function Pn(t){return D(t,"Record")}function de(t){return D(t,"Ref")}function ha(t){return D(t,"RegExp")}function Bt(t){return D(t,"String")}function Ar(t){return D(t,"Symbol")}function Je(t){return D(t,"TemplateLiteral")}function iS(t){return D(t,"This")}function zt(t){return G(t)&&Se in t}function Ye(t){return D(t,"Tuple")}function Rr(t){return D(t,"Undefined")}function F(t){return D(t,"Union")}function sS(t){return D(t,"Uint8Array")}function aS(t){return D(t,"Unknown")}function dS(t){return D(t,"Unsafe")}function lS(t){return D(t,"Void")}function uS(t){return G(t)&&w in t&&Q(t[w])}function Xe(t){return fa(t)||ga(t)||kt(t)||Wt(t)||yn(t)||Sn(t)||vt(t)||Pt(t)||rS(t)||wt(t)||It(t)||oe(t)||kn(t)||ze(t)||Qe(t)||te(t)||Ht(t)||oS(t)||xr(t)||bt(t)||fe(t)||vn(t)||Pn(t)||de(t)||ha(t)||Bt(t)||Ar(t)||Je(t)||iS(t)||Ye(t)||Rr(t)||F(t)||sS(t)||aS(t)||dS(t)||lS(t)||uS(t)}var W=p(()=>{Fe();T()});var m={};Ao(m,{IsAny:()=>yu,IsArgument:()=>ku,IsArray:()=>vu,IsAsyncIterator:()=>Pu,IsBigInt:()=>wu,IsBoolean:()=>Iu,IsComputed:()=>bu,IsConstructor:()=>xu,IsDate:()=>Au,IsFunction:()=>Ru,IsImport:()=>hS,IsInteger:()=>Tu,IsIntersect:()=>Cu,IsIterator:()=>Mu,IsKind:()=>np,IsKindOf:()=>E,IsLiteral:()=>Cr,IsLiteralBoolean:()=>SS,IsLiteralNumber:()=>Eu,IsLiteralString:()=>_u,IsLiteralValue:()=>Ou,IsMappedKey:()=>$u,IsMappedResult:()=>Du,IsNever:()=>Nu,IsNot:()=>Fu,IsNull:()=>Lu,IsNumber:()=>Wu,IsObject:()=>Bu,IsOptional:()=>gS,IsPromise:()=>Uu,IsProperties:()=>Eo,IsReadonly:()=>fS,IsRecord:()=>Ku,IsRecursive:()=>yS,IsRef:()=>Vu,IsRegExp:()=>qu,IsSchema:()=>Ie,IsString:()=>Gu,IsSymbol:()=>ju,IsTemplateLiteral:()=>Hu,IsThis:()=>zu,IsTransform:()=>Qu,IsTuple:()=>Ju,IsUint8Array:()=>Xu,IsUndefined:()=>Yu,IsUnion:()=>va,IsUnionLiteral:()=>kS,IsUnknown:()=>Zu,IsUnsafe:()=>ep,IsVoid:()=>tp,TypeGuardUnknownTypeError:()=>Sa});function gu(t){try{return new RegExp(t),!0}catch{return!1}}function ya(t){if(!Q(t))return!1;for(let e=0;e<t.length;e++){let n=t.charCodeAt(e);if(n>=7&&n<=13||n===27||n===127)return!1}return!0}function hu(t){return ka(t)||Ie(t)}function Tr(t){return me(t)||Pr(t)}function J(t){return me(t)||He(t)}function ka(t){return me(t)||Nt(t)}function j(t){return me(t)||Q(t)}function cS(t){return me(t)||Q(t)&&ya(t)&&gu(t)}function mS(t){return me(t)||Q(t)&&ya(t)}function Su(t){return me(t)||Ie(t)}function fS(t){return G(t)&&t[yt]==="Readonly"}function gS(t){return G(t)&&t[Ae]==="Optional"}function yu(t){return E(t,"Any")&&j(t.$id)}function ku(t){return E(t,"Argument")&&He(t.index)}function vu(t){return E(t,"Array")&&t.type==="array"&&j(t.$id)&&Ie(t.items)&&J(t.minItems)&&J(t.maxItems)&&ka(t.uniqueItems)&&Su(t.contains)&&J(t.minContains)&&J(t.maxContains)}function Pu(t){return E(t,"AsyncIterator")&&t.type==="AsyncIterator"&&j(t.$id)&&Ie(t.items)}function wu(t){return E(t,"BigInt")&&t.type==="bigint"&&j(t.$id)&&Tr(t.exclusiveMaximum)&&Tr(t.exclusiveMinimum)&&Tr(t.maximum)&&Tr(t.minimum)&&Tr(t.multipleOf)}function Iu(t){return E(t,"Boolean")&&t.type==="boolean"&&j(t.$id)}function bu(t){return E(t,"Computed")&&Q(t.target)&&ce(t.parameters)&&t.parameters.every(e=>Ie(e))}function xu(t){return E(t,"Constructor")&&t.type==="Constructor"&&j(t.$id)&&ce(t.parameters)&&t.parameters.every(e=>Ie(e))&&Ie(t.returns)}function Au(t){return E(t,"Date")&&t.type==="Date"&&j(t.$id)&&J(t.exclusiveMaximumTimestamp)&&J(t.exclusiveMinimumTimestamp)&&J(t.maximumTimestamp)&&J(t.minimumTimestamp)&&J(t.multipleOfTimestamp)}function Ru(t){return E(t,"Function")&&t.type==="Function"&&j(t.$id)&&ce(t.parameters)&&t.parameters.every(e=>Ie(e))&&Ie(t.returns)}function hS(t){return E(t,"Import")&&Ro(t,"$defs")&&G(t.$defs)&&Eo(t.$defs)&&Ro(t,"$ref")&&Q(t.$ref)&&t.$ref in t.$defs}function Tu(t){return E(t,"Integer")&&t.type==="integer"&&j(t.$id)&&J(t.exclusiveMaximum)&&J(t.exclusiveMinimum)&&J(t.maximum)&&J(t.minimum)&&J(t.multipleOf)}function Eo(t){return G(t)&&Object.entries(t).every(([e,n])=>ya(e)&&Ie(n))}function Cu(t){return E(t,"Intersect")&&!(Q(t.type)&&t.type!=="object")&&ce(t.allOf)&&t.allOf.every(e=>Ie(e)&&!Qu(e))&&j(t.type)&&(ka(t.unevaluatedProperties)||Su(t.unevaluatedProperties))&&j(t.$id)}function Mu(t){return E(t,"Iterator")&&t.type==="Iterator"&&j(t.$id)&&Ie(t.items)}function E(t,e){return G(t)&&w in t&&t[w]===e}function _u(t){return Cr(t)&&Q(t.const)}function Eu(t){return Cr(t)&&He(t.const)}function SS(t){return Cr(t)&&Nt(t.const)}function Cr(t){return E(t,"Literal")&&j(t.$id)&&Ou(t.const)}function Ou(t){return Nt(t)||He(t)||Q(t)}function $u(t){return E(t,"MappedKey")&&ce(t.keys)&&t.keys.every(e=>He(e)||Q(e))}function Du(t){return E(t,"MappedResult")&&Eo(t.properties)}function Nu(t){return E(t,"Never")&&G(t.not)&&Object.getOwnPropertyNames(t.not).length===0}function Fu(t){return E(t,"Not")&&Ie(t.not)}function Lu(t){return E(t,"Null")&&t.type==="null"&&j(t.$id)}function Wu(t){return E(t,"Number")&&t.type==="number"&&j(t.$id)&&J(t.exclusiveMaximum)&&J(t.exclusiveMinimum)&&J(t.maximum)&&J(t.minimum)&&J(t.multipleOf)}function Bu(t){return E(t,"Object")&&t.type==="object"&&j(t.$id)&&Eo(t.properties)&&hu(t.additionalProperties)&&J(t.minProperties)&&J(t.maxProperties)}function Uu(t){return E(t,"Promise")&&t.type==="Promise"&&j(t.$id)&&Ie(t.item)}function Ku(t){return E(t,"Record")&&t.type==="object"&&j(t.$id)&&hu(t.additionalProperties)&&G(t.patternProperties)&&(e=>{let n=Object.getOwnPropertyNames(e.patternProperties);return n.length===1&&gu(n[0])&&G(e.patternProperties)&&Ie(e.patternProperties[n[0]])})(t)}function yS(t){return G(t)&&st in t&&t[st]==="Recursive"}function Vu(t){return E(t,"Ref")&&j(t.$id)&&Q(t.$ref)}function qu(t){return E(t,"RegExp")&&j(t.$id)&&Q(t.source)&&Q(t.flags)&&J(t.maxLength)&&J(t.minLength)}function Gu(t){return E(t,"String")&&t.type==="string"&&j(t.$id)&&J(t.minLength)&&J(t.maxLength)&&cS(t.pattern)&&mS(t.format)}function ju(t){return E(t,"Symbol")&&t.type==="symbol"&&j(t.$id)}function Hu(t){return E(t,"TemplateLiteral")&&t.type==="string"&&Q(t.pattern)&&t.pattern[0]==="^"&&t.pattern[t.pattern.length-1]==="$"}function zu(t){return E(t,"This")&&j(t.$id)&&Q(t.$ref)}function Qu(t){return G(t)&&Se in t}function Ju(t){return E(t,"Tuple")&&t.type==="array"&&j(t.$id)&&He(t.minItems)&&He(t.maxItems)&&t.minItems===t.maxItems&&(me(t.items)&&me(t.additionalItems)&&t.minItems===0||ce(t.items)&&t.items.every(e=>Ie(e)))}function Yu(t){return E(t,"Undefined")&&t.type==="undefined"&&j(t.$id)}function kS(t){return va(t)&&t.anyOf.every(e=>_u(e)||Eu(e))}function va(t){return E(t,"Union")&&j(t.$id)&&G(t)&&ce(t.anyOf)&&t.anyOf.every(e=>Ie(e))}function Xu(t){return E(t,"Uint8Array")&&t.type==="Uint8Array"&&j(t.$id)&&J(t.minByteLength)&&J(t.maxByteLength)}function Zu(t){return E(t,"Unknown")&&j(t.$id)}function ep(t){return E(t,"Unsafe")}function tp(t){return E(t,"Void")&&t.type==="void"&&j(t.$id)}function np(t){return G(t)&&w in t&&Q(t[w])&&!pS.includes(t[w])}function Ie(t){return G(t)&&(yu(t)||ku(t)||vu(t)||Iu(t)||wu(t)||Pu(t)||bu(t)||xu(t)||Au(t)||Ru(t)||Tu(t)||Cu(t)||Mu(t)||Cr(t)||$u(t)||Du(t)||Nu(t)||Fu(t)||Lu(t)||Wu(t)||Bu(t)||Uu(t)||Ku(t)||Vu(t)||qu(t)||Gu(t)||ju(t)||Hu(t)||zu(t)||Ju(t)||Yu(t)||va(t)||Xu(t)||Zu(t)||ep(t)||tp(t)||np(t))}var Sa,pS,rp=p(()=>{Fe();T();Ct();Sa=class extends we{},pS=["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 Pa=p(()=>{W();rp();Fe()});var op=p(()=>{});var ip=p(()=>{op()});var wa,Mr,Ia,vS,rR,Qt,Jt,sp,ap=p(()=>{wa="(true|false)",Mr="(0|[1-9][0-9]*)",Ia="(.*)",vS="(?!.*)",rR=`^${wa}$`,Qt=`^${Mr}$`,Jt=`^${Ia}$`,sp=`^${vS}$`});var _r=p(()=>{ap()});var dp=p(()=>{});var lp=p(()=>{});var up=p(()=>{dp();lp()});function pp(t,e){return t.includes(e)}function cp(t){return[...new Set(t)]}function IS(t,e){return t.filter(n=>e.includes(n))}function bS(t,e){return t.reduce((n,r)=>IS(n,r),e)}function mp(t){return t.length===1?t[0]:t.length>1?bS(t.slice(1),t[0]):[]}function fp(t){let e=[];for(let n of t)e.push(...n);return e}var gp=p(()=>{});var Er=p(()=>{gp()});function Yt(t){return h({[w]:"Any"},t)}var hp=p(()=>{Lt();T()});var Or=p(()=>{hp()});function Un(t,e){return h({[w]:"Array",type:"array",items:t},e)}var Sp=p(()=>{R();T()});var $r=p(()=>{Sp()});function yp(t){return h({[w]:"Argument",index:t})}var kp=p(()=>{R();T()});var ba=p(()=>{kp()});function Kn(t,e){return h({[w]:"AsyncIterator",type:"AsyncIterator",items:t},e)}var vp=p(()=>{T();R()});var Dr=p(()=>{vp()});function Z(t,e,n){return h({[w]:"Computed",target:t,parameters:e},n)}var Pp=p(()=>{Lt();br()});var Xt=p(()=>{Pp()});function xS(t,e){let{[e]:n,...r}=t;return r}function ie(t,e){return e.reduce((n,r)=>xS(n,r),t)}var Oo=p(()=>{});var Kt=p(()=>{Oo()});function L(t){return h({[w]:"Never",not:{}},t)}var wp=p(()=>{R();T()});var Re=p(()=>{wp()});var Ip=p(()=>{});function B(t){return h({[w]:"MappedResult",properties:t})}var xa=p(()=>{R();T()});function Vn(t,e,n){return h({[w]:"Constructor",type:"Constructor",parameters:t,returns:e},n)}var bp=p(()=>{R();T()});var Nr=p(()=>{bp()});function Mt(t,e,n){return h({[w]:"Function",type:"Function",parameters:t,returns:e},n)}var xp=p(()=>{R();T()});var wn=p(()=>{xp()});function Fr(t,e){return h({[w]:"Union",anyOf:t},e)}var Aa=p(()=>{R();T()});function AS(t){return t.some(e=>Ue(e))}function Ap(t){return t.map(e=>Ue(e)?RS(e):e)}function RS(t){return ie(t,[Ae])}function TS(t,e){return AS(t)?Ee(Fr(Ap(t),e)):Fr(Ap(t),e)}function _t(t,e){return t.length===1?h(t[0],e):t.length===0?L(e):TS(t,e)}var Rp=p(()=>{R();T();Kt();Re();Vt();Aa();W()});var Tp=p(()=>{});function V(t,e){return t.length===0?L(e):t.length===1?h(t[0],e):Fr(t,e)}var Cp=p(()=>{Re();R();Aa()});var ye=p(()=>{Rp();Tp();Cp()});function CS(t){return t.replace(/\\\$/g,"$").replace(/\\\*/g,"*").replace(/\\\^/g,"^").replace(/\\\|/g,"|").replace(/\\\(/g,"(").replace(/\\\)/g,")")}function Ra(t,e,n){return t[e]===n&&t.charCodeAt(e-1)!==92}function qt(t,e){return Ra(t,e,"(")}function Lr(t,e){return Ra(t,e,")")}function Mp(t,e){return Ra(t,e,"|")}function MS(t){if(!(qt(t,0)&&Lr(t,t.length-1)))return!1;let e=0;for(let n=0;n<t.length;n++)if(qt(t,n)&&(e+=1),Lr(t,n)&&(e-=1),e===0&&n!==t.length-1)return!1;return!0}function _S(t){return t.slice(1,t.length-1)}function ES(t){let e=0;for(let n=0;n<t.length;n++)if(qt(t,n)&&(e+=1),Lr(t,n)&&(e-=1),Mp(t,n)&&e===0)return!0;return!1}function OS(t){for(let e=0;e<t.length;e++)if(qt(t,e))return!0;return!1}function $S(t){let[e,n]=[0,0],r=[];for(let i=0;i<t.length;i++)if(qt(t,i)&&(e+=1),Lr(t,i)&&(e-=1),Mp(t,i)&&e===0){let s=t.slice(n,i);s.length>0&&r.push(qn(s)),n=i+1}let o=t.slice(n);return o.length>0&&r.push(qn(o)),r.length===0?{type:"const",const:""}:r.length===1?r[0]:{type:"or",expr:r}}function DS(t){function e(o,i){if(!qt(o,i))throw new $o("TemplateLiteralParser: Index must point to open parens");let s=0;for(let a=i;a<o.length;a++)if(qt(o,a)&&(s+=1),Lr(o,a)&&(s-=1),s===0)return[i,a];throw new $o("TemplateLiteralParser: Unclosed group parens in expression")}function n(o,i){for(let s=i;s<o.length;s++)if(qt(o,s))return[i,s];return[i,o.length]}let r=[];for(let o=0;o<t.length;o++)if(qt(t,o)){let[i,s]=e(t,o),a=t.slice(i,s+1);r.push(qn(a)),o=s}else{let[i,s]=n(t,o),a=t.slice(i,s);a.length>0&&r.push(qn(a)),o=s-1}return r.length===0?{type:"const",const:""}:r.length===1?r[0]:{type:"and",expr:r}}function qn(t){return MS(t)?qn(_S(t)):ES(t)?$S(t):OS(t)?DS(t):{type:"const",const:CS(t)}}function Gn(t){return qn(t.slice(1,t.length-1))}var $o,Do=p(()=>{Ct();$o=class extends we{}});function NS(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 FS(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 LS(t){return t.type==="const"&&t.const===".*"}function In(t){return NS(t)||LS(t)?!1:FS(t)?!0:t.type==="and"?t.expr.every(e=>In(e)):t.type==="or"?t.expr.every(e=>In(e)):t.type==="const"?!0:(()=>{throw new Ta("Unknown expression type")})()}function _p(t){let e=Gn(t.pattern);return In(e)}var Ta,Ca=p(()=>{Do();Ct();Ta=class extends we{}});function*Ep(t){if(t.length===1)return yield*t[0];for(let e of t[0])for(let n of Ep(t.slice(1)))yield`${e}${n}`}function*WS(t){return yield*Ep(t.expr.map(e=>[...Wr(e)]))}function*BS(t){for(let e of t.expr)yield*Wr(e)}function*US(t){return yield t.const}function*Wr(t){return t.type==="and"?yield*WS(t):t.type==="or"?yield*BS(t):t.type==="const"?yield*US(t):(()=>{throw new Ma("Unknown expression")})()}function No(t){let e=Gn(t.pattern);return In(e)?[...Wr(e)]:[]}var Ma,_a=p(()=>{Ca();Do();Ct();Ma=class extends we{}});function K(t,e){return h({[w]:"Literal",const:t,type:typeof t},e)}var Op=p(()=>{R();T()});var Ke=p(()=>{Op()});function Fo(t){return h({[w]:"Boolean",type:"boolean"},t)}var $p=p(()=>{T();Lt()});var Lo=p(()=>{$p()});function jn(t){return h({[w]:"BigInt",type:"bigint"},t)}var Dp=p(()=>{T();Lt()});var Br=p(()=>{Dp()});function at(t){return h({[w]:"Number",type:"number"},t)}var Np=p(()=>{R();T()});var bn=p(()=>{Np()});function xt(t){return h({[w]:"String",type:"string"},t)}var Fp=p(()=>{R();T()});var Hn=p(()=>{Fp()});function*KS(t){let e=t.trim().replace(/"|'/g,"");return e==="boolean"?yield Fo():e==="number"?yield at():e==="bigint"?yield jn():e==="string"?yield xt():yield(()=>{let n=e.split("|").map(r=>K(r.trim()));return n.length===0?L():n.length===1?n[0]:_t(n)})()}function*VS(t){if(t[1]!=="{"){let e=K("$"),n=Ea(t.slice(1));return yield*[e,...n]}for(let e=2;e<t.length;e++)if(t[e]==="}"){let n=KS(t.slice(2,e)),r=Ea(t.slice(e+1));return yield*[...n,...r]}yield K(t)}function*Ea(t){for(let e=0;e<t.length;e++)if(t[e]==="$"){let n=K(t.slice(0,e)),r=VS(t.slice(e));return yield*[n,...r]}yield K(t)}function Lp(t){return[...Ea(t)]}var Oa=p(()=>{Ke();Lo();Br();bn();Hn();ye();Re()});function qS(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Wp(t,e){return Je(t)?t.pattern.slice(1,t.pattern.length-1):F(t)?`(${t.anyOf.map(n=>Wp(n,e)).join("|")})`:bt(t)?`${e}${Mr}`:It(t)?`${e}${Mr}`:yn(t)?`${e}${Mr}`:Bt(t)?`${e}${Ia}`:ze(t)?`${e}${qS(t.const.toString())}`:Wt(t)?`${e}${wa}`:(()=>{throw new $a(`Unexpected Kind '${t[w]}'`)})()}function Da(t){return`^${t.map(e=>Wp(e,"")).join("")}$`}var $a,Na=p(()=>{_r();T();Ct();W();$a=class extends we{}});function xn(t){let n=No(t).map(r=>K(r));return _t(n)}var Bp=p(()=>{ye();Ke();_a()});function Wo(t,e){let n=Q(t)?Da(Lp(t)):Da(t);return h({[w]:"TemplateLiteral",type:"string",pattern:n},e)}var Up=p(()=>{R();Oa();Na();Fe();T()});var Gt=p(()=>{Ca();_a();Oa();Do();Na();Bp();Up()});function GS(t){return No(t).map(n=>n.toString())}function jS(t){let e=[];for(let n of t)e.push(...Ve(n));return e}function HS(t){return[t.toString()]}function Ve(t){return[...new Set(Je(t)?GS(t):F(t)?jS(t.anyOf):ze(t)?HS(t.const):bt(t)?["[number]"]:It(t)?["[number]"]:[])]}var Bo=p(()=>{Gt();W()});function zS(t,e,n){let r={};for(let o of Object.getOwnPropertyNames(e))r[o]=Zt(t,Ve(e[o]),n);return r}function QS(t,e,n){return zS(t,e.properties,n)}function Kp(t,e,n){let r=QS(t,e,n);return B(r)}var Fa=p(()=>{Pe();Bo();Et()});function qp(t,e){return t.map(n=>Gp(n,e))}function JS(t){return t.filter(e=>!Ht(e))}function YS(t,e){return Uo(JS(qp(t,e)))}function XS(t){return t.some(e=>Ht(e))?[]:t}function ZS(t,e){return _t(XS(qp(t,e)))}function ey(t,e){return e in t?t[e]:e==="[number]"?_t(t):L()}function ty(t,e){return e==="[number]"?t:L()}function ny(t,e){return e in t?t[e]:L()}function Gp(t,e){return oe(t)?YS(t.allOf,e):F(t)?ZS(t.anyOf,e):Ye(t)?ey(t.items??[],e):kt(t)?ty(t.items,e):fe(t)?ny(t.properties,e):L()}function La(t,e){return e.map(n=>Gp(t,n))}function Vp(t,e){return _t(La(t,e))}function Zt(t,e,n){if(de(t)||de(e)){let r="Index types using Ref parameters require both Type and Key to be of TSchema";if(!Xe(t)||!Xe(e))throw new we(r);return Z("Index",[t,e])}return te(e)?Kp(t,e,n):Qe(e)?jp(t,e,n):h(Xe(e)?Vp(t,Ve(e)):Vp(t,e),n)}var Wa=p(()=>{R();Ct();Xt();Re();dt();ye();Bo();Ba();Fa();W()});function ry(t,e,n){return{[e]:Zt(t,[e],ee(n))}}function oy(t,e,n){return e.reduce((r,o)=>({...r,...ry(t,o,n)}),{})}function iy(t,e,n){return oy(t,e.keys,n)}function jp(t,e,n){let r=iy(t,e,n);return B(r)}var Ba=p(()=>{Wa();Pe();Be()});var Et=p(()=>{Ba();Fa();Bo();Wa()});function zn(t,e){return h({[w]:"Iterator",type:"Iterator",items:t},e)}var Hp=p(()=>{R();T()});var Ur=p(()=>{Hp()});function sy(t){return globalThis.Object.keys(t).filter(e=>!Ue(t[e]))}function ay(t,e){let n=sy(t),r=n.length>0?{[w]:"Object",type:"object",required:n,properties:t}:{[w]:"Object",type:"object",properties:t};return h(r,e)}var H,zp=p(()=>{R();T();W();H=ay});var Ze=p(()=>{zp()});function Ko(t,e){return h({[w]:"Promise",type:"Promise",item:t},e)}var Qp=p(()=>{R();T()});var Vo=p(()=>{Qp()});function dy(t){return h(ie(t,[yt]))}function ly(t){return h({...t,[yt]:"Readonly"})}function uy(t,e){return e===!1?dy(t):ly(t)}function qe(t,e){let n=e??!0;return te(t)?Jp(t,n):uy(t,n)}var Ua=p(()=>{R();T();Kt();Ka();W()});function py(t,e){let n={};for(let r of globalThis.Object.getOwnPropertyNames(t))n[r]=qe(t[r],e);return n}function cy(t,e){return py(t.properties,e)}function Jp(t,e){let n=cy(t,e);return B(n)}var Ka=p(()=>{Pe();Ua()});var An=p(()=>{Ka();Ua()});function lt(t,e){return h(t.length>0?{[w]:"Tuple",type:"array",items:t,additionalItems:!1,minItems:t.length,maxItems:t.length}:{[w]:"Tuple",type:"array",minItems:t.length,maxItems:t.length},e)}var Yp=p(()=>{R();T()});var en=p(()=>{Yp()});function Xp(t,e){return t in e?ut(t,e[t]):B(e)}function my(t){return{[t]:K(t)}}function fy(t){let e={};for(let n of t)e[n]=K(n);return e}function gy(t,e){return pp(e,t)?my(t):fy(e)}function hy(t,e){let n=gy(t,e);return Xp(t,n)}function Kr(t,e){return e.map(n=>ut(t,n))}function Sy(t,e){let n={};for(let r of globalThis.Object.getOwnPropertyNames(e))n[r]=ut(t,e[r]);return n}function ut(t,e){let n={...e};return Ue(e)?Ee(ut(t,ie(e,[Ae]))):Bn(e)?qe(ut(t,ie(e,[yt]))):te(e)?Xp(t,e.properties):Qe(e)?hy(t,e.keys):Pt(e)?Vn(Kr(t,e.parameters),ut(t,e.returns),n):wt(e)?Mt(Kr(t,e.parameters),ut(t,e.returns),n):Sn(e)?Kn(ut(t,e.items),n):kn(e)?zn(ut(t,e.items),n):oe(e)?Oe(Kr(t,e.allOf),n):F(e)?V(Kr(t,e.anyOf),n):Ye(e)?lt(Kr(t,e.items??[]),n):fe(e)?H(Sy(t,e.properties),n):kt(e)?Un(ut(t,e.items),n):vn(e)?Ko(ut(t,e.item),n):e}function yy(t,e){let n={};for(let r of t)n[r]=ut(r,e);return n}function Zp(t,e,n){let r=Xe(t)?Ve(t):t,o=e({[w]:"MappedKey",keys:r}),i=yy(r,o);return H(i,n)}var ec=p(()=>{T();Kt();$r();Dr();Nr();wn();Et();dt();Ur();Ke();Ze();Vt();Vo();An();en();ye();Er();xa();W()});var Pe=p(()=>{Ip();xa();ec()});function ky(t){return h(ie(t,[Ae]))}function vy(t){return h({...t,[Ae]:"Optional"})}function Py(t,e){return e===!1?ky(t):vy(t)}function Ee(t,e){let n=e??!0;return te(t)?tc(t,n):Py(t,n)}var Va=p(()=>{R();T();Kt();qa();W()});function wy(t,e){let n={};for(let r of globalThis.Object.getOwnPropertyNames(t))n[r]=Ee(t[r],e);return n}function Iy(t,e){return wy(t.properties,e)}function tc(t,e){let n=Iy(t,e);return B(n)}var qa=p(()=>{Pe();Va()});var Vt=p(()=>{qa();Va()});function Vr(t,e={}){let n=t.every(o=>fe(o)),r=Xe(e.unevaluatedProperties)?{unevaluatedProperties:e.unevaluatedProperties}:{};return h(e.unevaluatedProperties===!1||Xe(e.unevaluatedProperties)||n?{...r,[w]:"Intersect",type:"object",allOf:t}:{...r,[w]:"Intersect",allOf:t},e)}var Ga=p(()=>{R();T();W()});function by(t){return t.every(e=>Ue(e))}function xy(t){return ie(t,[Ae])}function nc(t){return t.map(e=>Ue(e)?xy(e):e)}function Ay(t,e){return by(t)?Ee(Vr(nc(t),e)):Vr(nc(t),e)}function Uo(t,e={}){if(t.length===1)return h(t[0],e);if(t.length===0)return L(e);if(t.some(n=>zt(n)))throw new Error("Cannot intersect transform types");return Ay(t,e)}var rc=p(()=>{T();R();Kt();Re();Vt();Ga();W()});var oc=p(()=>{});function Oe(t,e){if(t.length===1)return h(t[0],e);if(t.length===0)return L(e);if(t.some(n=>zt(n)))throw new Error("Cannot intersect transform types");return Vr(t,e)}var ic=p(()=>{R();Re();Ga();W()});var dt=p(()=>{rc();oc();ic()});function Ot(...t){let[e,n]=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({[w]:"Ref",$ref:e},n)}var sc=p(()=>{Ct();R();T()});var Rn=p(()=>{sc()});function Ry(t,e){return Z("Awaited",[Z(t,e)])}function Ty(t){return Z("Awaited",[Ot(t)])}function Cy(t){return Oe(ac(t))}function My(t){return V(ac(t))}function _y(t){return Qn(t)}function ac(t){return t.map(e=>Qn(e))}function Qn(t,e){return h(vt(t)?Ry(t.target,t.parameters):oe(t)?Cy(t.allOf):F(t)?My(t.anyOf):vn(t)?_y(t.item):de(t)?Ty(t.$ref):t,e)}var dc=p(()=>{R();Xt();dt();ye();Rn();W()});var qo=p(()=>{dc()});function lc(t){let e=[];for(let n of t)e.push(qr(n));return e}function Ey(t){let e=lc(t);return fp(e)}function Oy(t){let e=lc(t);return mp(e)}function $y(t){return t.map((e,n)=>n.toString())}function Dy(t){return["[number]"]}function Ny(t){return globalThis.Object.getOwnPropertyNames(t)}function Fy(t){return Ly?globalThis.Object.getOwnPropertyNames(t).map(n=>n[0]==="^"&&n[n.length-1]==="$"?n.slice(1,n.length-1):n):[]}function qr(t){return oe(t)?Ey(t.allOf):F(t)?Oy(t.anyOf):Ye(t)?$y(t.items??[]):kt(t)?Dy(t.items):fe(t)?Ny(t.properties):Pn(t)?Fy(t.patternProperties):[]}var Ly,ja=p(()=>{Er();W();Ly=!1});function Wy(t,e){return Z("KeyOf",[Z(t,e)])}function By(t){return Z("KeyOf",[Ot(t)])}function Uy(t,e){let n=qr(t),r=Ky(n),o=_t(r);return h(o,e)}function Ky(t){return t.map(e=>e==="[number]"?at():K(e))}function Jn(t,e){return vt(t)?Wy(t.target,t.parameters):de(t)?By(t.$ref):te(t)?uc(t,e):Uy(t,e)}var Ha=p(()=>{R();Ke();bn();Xt();Rn();ja();ye();za();W()});function Vy(t,e){let n={};for(let r of globalThis.Object.getOwnPropertyNames(t))n[r]=Jn(t[r],ee(e));return n}function qy(t,e){return Vy(t.properties,e)}function uc(t,e){let n=qy(t,e);return B(n)}var za=p(()=>{Pe();Ha();Be()});var pc=p(()=>{});var Gr=p(()=>{za();pc();ja();Ha()});function Gy(t){let e=[];for(let n of t)e.push(...qr(n));return cp(e)}function jy(t){return t.filter(e=>!Ht(e))}function Hy(t,e){let n=[];for(let r of t)n.push(...La(r,[e]));return jy(n)}function zy(t,e){let n={};for(let r of e)n[r]=Uo(Hy(t,r));return n}function cc(t,e){let n=Gy(t),r=zy(t,n);return H(r,e)}var mc=p(()=>{dt();Et();Gr();Ze();Er();W()});var Qa=p(()=>{mc()});function Go(t){return h({[w]:"Date",type:"Date"},t)}var fc=p(()=>{T();R()});var jo=p(()=>{fc()});function Ho(t){return h({[w]:"Null",type:"null"},t)}var gc=p(()=>{R();T()});var zo=p(()=>{gc()});function Qo(t){return h({[w]:"Symbol",type:"symbol"},t)}var hc=p(()=>{R();T()});var Jo=p(()=>{hc()});function Yo(t){return h({[w]:"Undefined",type:"undefined"},t)}var Sc=p(()=>{R();T()});var Xo=p(()=>{Sc()});function Zo(t){return h({[w]:"Uint8Array",type:"Uint8Array"},t)}var yc=p(()=>{R();T()});var ei=p(()=>{yc()});function tn(t){return h({[w]:"Unknown"},t)}var kc=p(()=>{R();T()});var Yn=p(()=>{kc()});function Qy(t){return t.map(e=>Ja(e,!1))}function Jy(t){let e={};for(let n of globalThis.Object.getOwnPropertyNames(t))e[n]=qe(Ja(t[n],!1));return e}function ti(t,e){return e===!0?t:qe(t)}function Ja(t,e){return da(t)?ti(Yt(),e):ua(t)?ti(Yt(),e):ce(t)?qe(lt(Qy(t))):Ft(t)?Zo():hn(t)?Go():G(t)?ti(H(Jy(t)),e):la(t)?ti(Mt([],tn()),e):me(t)?Yo():pa(t)?Ho():ca(t)?Qo():Pr(t)?jn():He(t)?K(t):Nt(t)?K(t):Q(t)?K(t):H({})}function vc(t,e){return h(Ja(t,!0),e)}var Pc=p(()=>{Or();Br();jo();wn();Ke();zo();Ze();Jo();en();An();Xo();ei();Yn();Lt();Fe()});var Ya=p(()=>{Pc()});function wc(t,e){return Pt(t)?lt(t.parameters,e):L(e)}var Ic=p(()=>{en();Re();W()});var Xa=p(()=>{Ic()});function bc(t,e){if(me(t))throw new Error("Enum undefined or empty");let n=globalThis.Object.getOwnPropertyNames(t).filter(i=>isNaN(i)).map(i=>t[i]),o=[...new Set(n)].map(i=>K(i));return V(o,{...e,[st]:"Enum"})}var xc=p(()=>{Ke();T();ye();Fe()});var Za=p(()=>{xc()});function pt(t){return t===S.False?t:S.True}function Xn(t){throw new td(t)}function ke(t){return m.IsNever(t)||m.IsIntersect(t)||m.IsUnion(t)||m.IsUnknown(t)||m.IsAny(t)}function ve(t,e){return m.IsNever(e)?Ec(t,e):m.IsIntersect(e)?ni(t,e):m.IsUnion(e)?id(t,e):m.IsUnknown(e)?Nc(t,e):m.IsAny(e)?od(t,e):Xn("StructuralRight")}function od(t,e){return S.True}function Yy(t,e){return m.IsIntersect(e)?ni(t,e):m.IsUnion(e)&&e.anyOf.some(n=>m.IsAny(n)||m.IsUnknown(n))?S.True:m.IsUnion(e)?S.Union:m.IsUnknown(e)||m.IsAny(e)?S.True:S.Union}function Xy(t,e){return m.IsUnknown(t)?S.False:m.IsAny(t)?S.Union:m.IsNever(t)?S.True:S.False}function Zy(t,e){return m.IsObject(e)&&ri(e)?S.True:ke(e)?ve(t,e):m.IsArray(e)?pt(z(t.items,e.items)):S.False}function ek(t,e){return ke(e)?ve(t,e):m.IsAsyncIterator(e)?pt(z(t.items,e.items)):S.False}function tk(t,e){return ke(e)?ve(t,e):m.IsObject(e)?$e(t,e):m.IsRecord(e)?ct(t,e):m.IsBigInt(e)?S.True:S.False}function Mc(t,e){return m.IsLiteralBoolean(t)||m.IsBoolean(t)?S.True:S.False}function nk(t,e){return ke(e)?ve(t,e):m.IsObject(e)?$e(t,e):m.IsRecord(e)?ct(t,e):m.IsBoolean(e)?S.True:S.False}function rk(t,e){return ke(e)?ve(t,e):m.IsObject(e)?$e(t,e):m.IsConstructor(e)?t.parameters.length>e.parameters.length?S.False:t.parameters.every((n,r)=>pt(z(e.parameters[r],n))===S.True)?pt(z(t.returns,e.returns)):S.False:S.False}function ok(t,e){return ke(e)?ve(t,e):m.IsObject(e)?$e(t,e):m.IsRecord(e)?ct(t,e):m.IsDate(e)?S.True:S.False}function ik(t,e){return ke(e)?ve(t,e):m.IsObject(e)?$e(t,e):m.IsFunction(e)?t.parameters.length>e.parameters.length?S.False:t.parameters.every((n,r)=>pt(z(e.parameters[r],n))===S.True)?pt(z(t.returns,e.returns)):S.False:S.False}function _c(t,e){return m.IsLiteral(t)&&_e.IsNumber(t.const)||m.IsNumber(t)||m.IsInteger(t)?S.True:S.False}function sk(t,e){return m.IsInteger(e)||m.IsNumber(e)?S.True:ke(e)?ve(t,e):m.IsObject(e)?$e(t,e):m.IsRecord(e)?ct(t,e):S.False}function ni(t,e){return e.allOf.every(n=>z(t,n)===S.True)?S.True:S.False}function ak(t,e){return t.allOf.some(n=>z(n,e)===S.True)?S.True:S.False}function dk(t,e){return ke(e)?ve(t,e):m.IsIterator(e)?pt(z(t.items,e.items)):S.False}function lk(t,e){return m.IsLiteral(e)&&e.const===t.const?S.True:ke(e)?ve(t,e):m.IsObject(e)?$e(t,e):m.IsRecord(e)?ct(t,e):m.IsString(e)?Dc(t,e):m.IsNumber(e)?Oc(t,e):m.IsInteger(e)?_c(t,e):m.IsBoolean(e)?Mc(t,e):S.False}function Ec(t,e){return S.False}function uk(t,e){return S.True}function Ac(t){let[e,n]=[t,0];for(;m.IsNot(e);)e=e.not,n+=1;return n%2===0?e:tn()}function pk(t,e){return m.IsNot(t)?z(Ac(t),e):m.IsNot(e)?z(t,Ac(e)):Xn("Invalid fallthrough for Not")}function ck(t,e){return ke(e)?ve(t,e):m.IsObject(e)?$e(t,e):m.IsRecord(e)?ct(t,e):m.IsNull(e)?S.True:S.False}function Oc(t,e){return m.IsLiteralNumber(t)||m.IsNumber(t)||m.IsInteger(t)?S.True:S.False}function mk(t,e){return ke(e)?ve(t,e):m.IsObject(e)?$e(t,e):m.IsRecord(e)?ct(t,e):m.IsInteger(e)||m.IsNumber(e)?S.True:S.False}function Ge(t,e){return Object.getOwnPropertyNames(t.properties).length===e}function Rc(t){return ri(t)}function Tc(t){return Ge(t,0)||Ge(t,1)&&"description"in t.properties&&m.IsUnion(t.properties.description)&&t.properties.description.anyOf.length===2&&(m.IsString(t.properties.description.anyOf[0])&&m.IsUndefined(t.properties.description.anyOf[1])||m.IsString(t.properties.description.anyOf[1])&&m.IsUndefined(t.properties.description.anyOf[0]))}function ed(t){return Ge(t,0)}function Cc(t){return Ge(t,0)}function fk(t){return Ge(t,0)}function gk(t){return Ge(t,0)}function hk(t){return ri(t)}function Sk(t){let e=at();return Ge(t,0)||Ge(t,1)&&"length"in t.properties&&pt(z(t.properties.length,e))===S.True}function yk(t){return Ge(t,0)}function ri(t){let e=at();return Ge(t,0)||Ge(t,1)&&"length"in t.properties&&pt(z(t.properties.length,e))===S.True}function kk(t){let e=Mt([Yt()],Yt());return Ge(t,0)||Ge(t,1)&&"then"in t.properties&&pt(z(t.properties.then,e))===S.True}function $c(t,e){return z(t,e)===S.False||m.IsOptional(t)&&!m.IsOptional(e)?S.False:S.True}function $e(t,e){return m.IsUnknown(t)?S.False:m.IsAny(t)?S.Union:m.IsNever(t)||m.IsLiteralString(t)&&Rc(e)||m.IsLiteralNumber(t)&&ed(e)||m.IsLiteralBoolean(t)&&Cc(e)||m.IsSymbol(t)&&Tc(e)||m.IsBigInt(t)&&fk(e)||m.IsString(t)&&Rc(e)||m.IsSymbol(t)&&Tc(e)||m.IsNumber(t)&&ed(e)||m.IsInteger(t)&&ed(e)||m.IsBoolean(t)&&Cc(e)||m.IsUint8Array(t)&&hk(e)||m.IsDate(t)&&gk(e)||m.IsConstructor(t)&&yk(e)||m.IsFunction(t)&&Sk(e)?S.True:m.IsRecord(t)&&m.IsString(nd(t))?e[st]==="Record"?S.True:S.False:m.IsRecord(t)&&m.IsNumber(nd(t))&&Ge(e,0)?S.True:S.False}function vk(t,e){return ke(e)?ve(t,e):m.IsRecord(e)?ct(t,e):m.IsObject(e)?(()=>{for(let n of Object.getOwnPropertyNames(e.properties)){if(!(n in t.properties)&&!m.IsOptional(e.properties[n]))return S.False;if(m.IsOptional(e.properties[n]))return S.True;if($c(t.properties[n],e.properties[n])===S.False)return S.False}return S.True})():S.False}function Pk(t,e){return ke(e)?ve(t,e):m.IsObject(e)&&kk(e)?S.True:m.IsPromise(e)?pt(z(t.item,e.item)):S.False}function nd(t){return Qt in t.patternProperties?at():Jt in t.patternProperties?xt():Xn("Unknown record key pattern")}function rd(t){return Qt in t.patternProperties?t.patternProperties[Qt]:Jt in t.patternProperties?t.patternProperties[Jt]:Xn("Unable to get record value schema")}function ct(t,e){let[n,r]=[nd(e),rd(e)];return m.IsLiteralString(t)&&m.IsNumber(n)&&pt(z(t,r))===S.True?S.True:m.IsUint8Array(t)&&m.IsNumber(n)||m.IsString(t)&&m.IsNumber(n)||m.IsArray(t)&&m.IsNumber(n)?z(t,r):m.IsObject(t)?(()=>{for(let o of Object.getOwnPropertyNames(t.properties))if($c(r,t.properties[o])===S.False)return S.False;return S.True})():S.False}function wk(t,e){return ke(e)?ve(t,e):m.IsObject(e)?$e(t,e):m.IsRecord(e)?z(rd(t),rd(e)):S.False}function Ik(t,e){let n=m.IsRegExp(t)?xt():t,r=m.IsRegExp(e)?xt():e;return z(n,r)}function Dc(t,e){return m.IsLiteral(t)&&_e.IsString(t.const)||m.IsString(t)?S.True:S.False}function bk(t,e){return ke(e)?ve(t,e):m.IsObject(e)?$e(t,e):m.IsRecord(e)?ct(t,e):m.IsString(e)?S.True:S.False}function xk(t,e){return ke(e)?ve(t,e):m.IsObject(e)?$e(t,e):m.IsRecord(e)?ct(t,e):m.IsSymbol(e)?S.True:S.False}function Ak(t,e){return m.IsTemplateLiteral(t)?z(xn(t),e):m.IsTemplateLiteral(e)?z(t,xn(e)):Xn("Invalid fallthrough for TemplateLiteral")}function Rk(t,e){return m.IsArray(e)&&t.items!==void 0&&t.items.every(n=>z(n,e.items)===S.True)}function Tk(t,e){return m.IsNever(t)?S.True:m.IsUnknown(t)?S.False:m.IsAny(t)?S.Union:S.False}function Ck(t,e){return ke(e)?ve(t,e):m.IsObject(e)&&ri(e)||m.IsArray(e)&&Rk(t,e)?S.True:m.IsTuple(e)?_e.IsUndefined(t.items)&&!_e.IsUndefined(e.items)||!_e.IsUndefined(t.items)&&_e.IsUndefined(e.items)?S.False:_e.IsUndefined(t.items)&&!_e.IsUndefined(e.items)||t.items.every((n,r)=>z(n,e.items[r])===S.True)?S.True:S.False:S.False}function Mk(t,e){return ke(e)?ve(t,e):m.IsObject(e)?$e(t,e):m.IsRecord(e)?ct(t,e):m.IsUint8Array(e)?S.True:S.False}function _k(t,e){return ke(e)?ve(t,e):m.IsObject(e)?$e(t,e):m.IsRecord(e)?ct(t,e):m.IsVoid(e)?$k(t,e):m.IsUndefined(e)?S.True:S.False}function id(t,e){return e.anyOf.some(n=>z(t,n)===S.True)?S.True:S.False}function Ek(t,e){return t.anyOf.every(n=>z(n,e)===S.True)?S.True:S.False}function Nc(t,e){return S.True}function Ok(t,e){return m.IsNever(e)?Ec(t,e):m.IsIntersect(e)?ni(t,e):m.IsUnion(e)?id(t,e):m.IsAny(e)?od(t,e):m.IsString(e)?Dc(t,e):m.IsNumber(e)?Oc(t,e):m.IsInteger(e)?_c(t,e):m.IsBoolean(e)?Mc(t,e):m.IsArray(e)?Xy(t,e):m.IsTuple(e)?Tk(t,e):m.IsObject(e)?$e(t,e):m.IsUnknown(e)?S.True:S.False}function $k(t,e){return m.IsUndefined(t)||m.IsUndefined(t)?S.True:S.False}function Dk(t,e){return m.IsIntersect(e)?ni(t,e):m.IsUnion(e)?id(t,e):m.IsUnknown(e)?Nc(t,e):m.IsAny(e)?od(t,e):m.IsObject(e)?$e(t,e):m.IsVoid(e)?S.True:S.False}function z(t,e){return m.IsTemplateLiteral(t)||m.IsTemplateLiteral(e)?Ak(t,e):m.IsRegExp(t)||m.IsRegExp(e)?Ik(t,e):m.IsNot(t)||m.IsNot(e)?pk(t,e):m.IsAny(t)?Yy(t,e):m.IsArray(t)?Zy(t,e):m.IsBigInt(t)?tk(t,e):m.IsBoolean(t)?nk(t,e):m.IsAsyncIterator(t)?ek(t,e):m.IsConstructor(t)?rk(t,e):m.IsDate(t)?ok(t,e):m.IsFunction(t)?ik(t,e):m.IsInteger(t)?sk(t,e):m.IsIntersect(t)?ak(t,e):m.IsIterator(t)?dk(t,e):m.IsLiteral(t)?lk(t,e):m.IsNever(t)?uk(t,e):m.IsNull(t)?ck(t,e):m.IsNumber(t)?mk(t,e):m.IsObject(t)?vk(t,e):m.IsRecord(t)?wk(t,e):m.IsString(t)?bk(t,e):m.IsSymbol(t)?xk(t,e):m.IsTuple(t)?Ck(t,e):m.IsPromise(t)?Pk(t,e):m.IsUint8Array(t)?Mk(t,e):m.IsUndefined(t)?_k(t,e):m.IsUnion(t)?Ek(t,e):m.IsUnknown(t)?Ok(t,e):m.IsVoid(t)?Dk(t,e):Xn(`Unknown left type operand '${t[w]}'`)}function nn(t,e){return z(t,e)}var td,S,sd=p(()=>{Or();wn();bn();Hn();Yn();Gt();_r();T();Ct();Pa();td=class extends we{};(function(t){t[t.Union=0]="Union",t[t.True=1]="True",t[t.False=2]="False"})(S||(S={}))});function Nk(t,e,n,r,o){let i={};for(let s of globalThis.Object.getOwnPropertyNames(t))i[s]=Zn(t[s],e,n,r,ee(o));return i}function Fk(t,e,n,r,o){return Nk(t.properties,e,n,r,o)}function Fc(t,e,n,r,o){let i=Fk(t,e,n,r,o);return B(i)}var ad=p(()=>{Pe();oi();Be()});function Lk(t,e,n,r){let o=nn(t,e);return o===S.Union?V([n,r]):o===S.True?n:r}function Zn(t,e,n,r,o){return te(t)?Fc(t,e,n,r,o):Qe(t)?h(Lc(t,e,n,r,o)):h(Lk(t,e,n,r),o)}var oi=p(()=>{R();ye();sd();dd();ad();W()});function Wk(t,e,n,r,o){return{[t]:Zn(K(t),e,n,r,ee(o))}}function Bk(t,e,n,r,o){return t.reduce((i,s)=>({...i,...Wk(s,e,n,r,o)}),{})}function Uk(t,e,n,r,o){return Bk(t.keys,e,n,r,o)}function Lc(t,e,n,r,o){let i=Uk(t,e,n,r,o);return B(i)}var dd=p(()=>{Pe();Ke();oi();Be()});var Wc=p(()=>{});var jr=p(()=>{sd();dd();ad();Wc();oi()});function Bc(t,e){return er(xn(t),e)}var ld=p(()=>{ii();Gt()});function Kk(t,e){let n=t.filter(r=>nn(r,e)===S.False);return n.length===1?n[0]:V(n)}function er(t,e,n={}){return Je(t)?h(Bc(t,e),n):te(t)?h(Uc(t,e),n):h(F(t)?Kk(t.anyOf,e):nn(t,e)!==S.False?L():t,n)}var ii=p(()=>{R();ye();Re();jr();ud();ld();W()});function Vk(t,e){let n={};for(let r of globalThis.Object.getOwnPropertyNames(t))n[r]=er(t[r],e);return n}function qk(t,e){return Vk(t.properties,e)}function Uc(t,e){let n=qk(t,e);return B(n)}var ud=p(()=>{Pe();ii()});var pd=p(()=>{ud();ld();ii()});function Kc(t,e){return tr(xn(t),e)}var cd=p(()=>{si();Gt()});function Gk(t,e){let n=t.filter(r=>nn(r,e)!==S.False);return n.length===1?n[0]:V(n)}function tr(t,e,n){return Je(t)?h(Kc(t,e),n):te(t)?h(Vc(t,e),n):h(F(t)?Gk(t.anyOf,e):nn(t,e)!==S.False?t:L(),n)}var si=p(()=>{R();ye();Re();jr();md();cd();W()});function jk(t,e){let n={};for(let r of globalThis.Object.getOwnPropertyNames(t))n[r]=tr(t[r],e);return n}function Hk(t,e){return jk(t.properties,e)}function Vc(t,e){let n=Hk(t,e);return B(n)}var md=p(()=>{Pe();si()});var fd=p(()=>{md();cd();si()});function qc(t,e){return Pt(t)?h(t.returns,e):L(e)}var Gc=p(()=>{R();Re();W()});var gd=p(()=>{Gc()});function ai(t){return qe(Ee(t))}var jc=p(()=>{An();Vt()});var di=p(()=>{jc()});function Tn(t,e,n){return h({[w]:"Record",type:"object",patternProperties:{[t]:e}},n)}function hd(t,e,n){let r={};for(let o of t)r[o]=e;return H(r,{...n,[st]:"Record"})}function zk(t,e,n){return _p(t)?hd(Ve(t),e,n):Tn(t.pattern,e,n)}function Qk(t,e,n){return hd(Ve(V(t)),e,n)}function Jk(t,e,n){return hd([t.toString()],e,n)}function Yk(t,e,n){return Tn(t.source,e,n)}function Xk(t,e,n){let r=me(t.pattern)?Jt:t.pattern;return Tn(r,e,n)}function Zk(t,e,n){return Tn(Jt,e,n)}function ev(t,e,n){return Tn(sp,e,n)}function tv(t,e,n){return H({true:e,false:e},n)}function nv(t,e,n){return Tn(Qt,e,n)}function rv(t,e,n){return Tn(Qt,e,n)}function li(t,e,n={}){return F(t)?Qk(t.anyOf,e,n):Je(t)?zk(t,e,n):ze(t)?Jk(t.const,e,n):Wt(t)?tv(t,e,n):It(t)?nv(t,e,n):bt(t)?rv(t,e,n):ha(t)?Yk(t,e,n):Bt(t)?Xk(t,e,n):fa(t)?Zk(t,e,n):Ht(t)?ev(t,e,n):L(n)}function ui(t){return globalThis.Object.getOwnPropertyNames(t.patternProperties)[0]}function Hc(t){let e=ui(t);return e===Jt?xt():e===Qt?at():xt({pattern:e})}function pi(t){return t.patternProperties[ui(t)]}var zc=p(()=>{R();T();Re();bn();Ze();Hn();ye();Gt();_r();Et();Fe();W()});var Hr=p(()=>{zc()});function ov(t,e){return e.parameters=zr(t,e.parameters),e.returns=At(t,e.returns),e}function iv(t,e){return e.parameters=zr(t,e.parameters),e.returns=At(t,e.returns),e}function sv(t,e){return e.allOf=zr(t,e.allOf),e}function av(t,e){return e.anyOf=zr(t,e.anyOf),e}function dv(t,e){return me(e.items)||(e.items=zr(t,e.items)),e}function lv(t,e){return e.items=At(t,e.items),e}function uv(t,e){return e.items=At(t,e.items),e}function pv(t,e){return e.items=At(t,e.items),e}function cv(t,e){return e.item=At(t,e.item),e}function mv(t,e){let n=Sv(t,e.properties);return{...e,...H(n)}}function fv(t,e){let n=At(t,Hc(e)),r=At(t,pi(e)),o=li(n,r);return{...e,...o}}function gv(t,e){return e.index in t?t[e.index]:tn()}function hv(t,e){let n=Bn(e),r=Ue(e),o=At(t,e);return n&&r?ai(o):n&&!r?qe(o):!n&&r?Ee(o):o}function Sv(t,e){return globalThis.Object.getOwnPropertyNames(e).reduce((n,r)=>({...n,[r]:hv(t,e[r])}),{})}function zr(t,e){return e.map(n=>At(t,n))}function At(t,e){return Pt(e)?ov(t,e):wt(e)?iv(t,e):oe(e)?sv(t,e):F(e)?av(t,e):Ye(e)?dv(t,e):kt(e)?lv(t,e):Sn(e)?uv(t,e):kn(e)?pv(t,e):vn(e)?cv(t,e):fe(e)?mv(t,e):Pn(e)?fv(t,e):ga(e)?gv(t,e):e}function Qc(t,e){return At(e,Wn(t))}var Jc=p(()=>{Co();Yn();di();An();Vt();Ze();Hr();Fe();W()});var Sd=p(()=>{Jc()});function Yc(t){return h({[w]:"Integer",type:"integer"},t)}var Xc=p(()=>{R();T()});var yd=p(()=>{Xc()});function yv(t,e,n){return{[t]:Rt(K(t),e,ee(n))}}function kv(t,e,n){return t.reduce((o,i)=>({...o,...yv(i,e,n)}),{})}function vv(t,e,n){return kv(t.keys,e,n)}function Zc(t,e,n){let r=vv(t,e,n);return B(r)}var kd=p(()=>{Pe();Cn();Ke();Be()});function Pv(t){let[e,n]=[t.slice(0,1),t.slice(1)];return[e.toLowerCase(),n].join("")}function wv(t){let[e,n]=[t.slice(0,1),t.slice(1)];return[e.toUpperCase(),n].join("")}function Iv(t){return t.toUpperCase()}function bv(t){return t.toLowerCase()}function xv(t,e,n){let r=Gn(t.pattern);if(!In(r))return{...t,pattern:em(t.pattern,e)};let s=[...Wr(r)].map(l=>K(l)),a=tm(s,e),d=V(a);return Wo([d],n)}function em(t,e){return typeof t=="string"?e==="Uncapitalize"?Pv(t):e==="Capitalize"?wv(t):e==="Uppercase"?Iv(t):e==="Lowercase"?bv(t):t:t.toString()}function tm(t,e){return t.map(n=>Rt(n,e))}function Rt(t,e,n={}){return Qe(t)?Zc(t,e,n):Je(t)?xv(t,e,n):F(t)?V(tm(t.anyOf,e),n):ze(t)?K(em(t.const,e),n):h(t,n)}var Cn=p(()=>{R();Gt();kd();Ke();ye();W()});function nm(t,e={}){return Rt(t,"Capitalize",e)}var rm=p(()=>{Cn()});function om(t,e={}){return Rt(t,"Lowercase",e)}var im=p(()=>{Cn()});function sm(t,e={}){return Rt(t,"Uncapitalize",e)}var am=p(()=>{Cn()});function dm(t,e={}){return Rt(t,"Uppercase",e)}var lm=p(()=>{Cn()});var vd=p(()=>{rm();kd();Cn();im();am();lm()});function Av(t,e,n){let r={};for(let o of globalThis.Object.getOwnPropertyNames(t))r[o]=rn(t[o],e,ee(n));return r}function Rv(t,e,n){return Av(t.properties,e,n)}function um(t,e,n){let r=Rv(t,e,n);return B(r)}var Pd=p(()=>{Pe();ci();Be()});function Tv(t,e){return t.map(n=>wd(n,e))}function Cv(t,e){return t.map(n=>wd(n,e))}function Mv(t,e){let{[e]:n,...r}=t;return r}function _v(t,e){return e.reduce((n,r)=>Mv(n,r),t)}function Ev(t,e,n){let r=ie(t,[Se,"$id","required","properties"]),o=_v(n,e);return H(o,r)}function Ov(t){let e=t.reduce((n,r)=>_o(r)?[...n,K(r)]:n,[]);return V(e)}function wd(t,e){return oe(t)?Oe(Tv(t.allOf,e)):F(t)?V(Cv(t.anyOf,e)):fe(t)?Ev(t,e,t.properties):H({})}function rn(t,e,n){let r=ce(e)?Ov(e):e,o=Xe(e)?Ve(e):e,i=de(t),s=de(e);return te(t)?um(t,o,n):Qe(e)?pm(t,e,n):i&&s?Z("Omit",[t,r],n):!i&&s?Z("Omit",[t,r],n):i&&!s?Z("Omit",[t,r],n):h({...wd(t,o),...n})}var ci=p(()=>{R();Oo();br();Xt();Ke();Et();dt();ye();Ze();Id();Pd();W();Fe()});function $v(t,e,n){return{[e]:rn(t,[e],ee(n))}}function Dv(t,e,n){return e.reduce((r,o)=>({...r,...$v(t,o,n)}),{})}function Nv(t,e,n){return Dv(t,e.keys,n)}function pm(t,e,n){let r=Nv(t,e,n);return B(r)}var Id=p(()=>{Pe();ci();Be()});var mi=p(()=>{Id();Pd();ci()});function Fv(t,e,n){let r={};for(let o of globalThis.Object.getOwnPropertyNames(t))r[o]=on(t[o],e,ee(n));return r}function Lv(t,e,n){return Fv(t.properties,e,n)}function cm(t,e,n){let r=Lv(t,e,n);return B(r)}var bd=p(()=>{Pe();fi();Be()});function Wv(t,e){return t.map(n=>xd(n,e))}function Bv(t,e){return t.map(n=>xd(n,e))}function Uv(t,e){let n={};for(let r of e)r in t&&(n[r]=t[r]);return n}function Kv(t,e,n){let r=ie(t,[Se,"$id","required","properties"]),o=Uv(n,e);return H(o,r)}function Vv(t){let e=t.reduce((n,r)=>_o(r)?[...n,K(r)]:n,[]);return V(e)}function xd(t,e){return oe(t)?Oe(Wv(t.allOf,e)):F(t)?V(Bv(t.anyOf,e)):fe(t)?Kv(t,e,t.properties):H({})}function on(t,e,n){let r=ce(e)?Vv(e):e,o=Xe(e)?Ve(e):e,i=de(t),s=de(e);return te(t)?cm(t,o,n):Qe(e)?mm(t,e,n):i&&s?Z("Pick",[t,r],n):!i&&s?Z("Pick",[t,r],n):i&&!s?Z("Pick",[t,r],n):h({...xd(t,o),...n})}var fi=p(()=>{R();Oo();Xt();dt();Ke();Ze();ye();Et();br();W();Fe();Ad();bd()});function qv(t,e,n){return{[e]:on(t,[e],ee(n))}}function Gv(t,e,n){return e.reduce((r,o)=>({...r,...qv(t,o,n)}),{})}function jv(t,e,n){return Gv(t,e.keys,n)}function mm(t,e,n){let r=jv(t,e,n);return B(r)}var Ad=p(()=>{Pe();fi();Be()});var gi=p(()=>{Ad();bd();fi()});function Hv(t,e){return Z("Partial",[Z(t,e)])}function zv(t){return Z("Partial",[Ot(t)])}function Qv(t){let e={};for(let n of globalThis.Object.getOwnPropertyNames(t))e[n]=Ee(t[n]);return e}function Jv(t,e){let n=ie(t,[Se,"$id","required","properties"]),r=Qv(e);return H(r,n)}function fm(t){return t.map(e=>gm(e))}function gm(t){return vt(t)?Hv(t.target,t.parameters):de(t)?zv(t.$ref):oe(t)?Oe(fm(t.allOf)):F(t)?V(fm(t.anyOf)):fe(t)?Jv(t,t.properties):yn(t)||Wt(t)||It(t)||ze(t)||xr(t)||bt(t)||Bt(t)||Ar(t)||Rr(t)?t:H({})}function nr(t,e){return te(t)?hm(t,e):h({...gm(t),...e})}var Rd=p(()=>{R();Xt();Vt();Ze();dt();ye();Rn();Kt();T();Td();W()});function Yv(t,e){let n={};for(let r of globalThis.Object.getOwnPropertyNames(t))n[r]=nr(t[r],ee(e));return n}function Xv(t,e){return Yv(t.properties,e)}function hm(t,e){let n=Xv(t,e);return B(n)}var Td=p(()=>{Pe();Rd();Be()});var hi=p(()=>{Td();Rd()});function Zv(t,e){return Z("Required",[Z(t,e)])}function eP(t){return Z("Required",[Ot(t)])}function tP(t){let e={};for(let n of globalThis.Object.getOwnPropertyNames(t))e[n]=ie(t[n],[Ae]);return e}function nP(t,e){let n=ie(t,[Se,"$id","required","properties"]),r=tP(e);return H(r,n)}function Sm(t){return t.map(e=>ym(e))}function ym(t){return vt(t)?Zv(t.target,t.parameters):de(t)?eP(t.$ref):oe(t)?Oe(Sm(t.allOf)):F(t)?V(Sm(t.anyOf)):fe(t)?nP(t,t.properties):yn(t)||Wt(t)||It(t)||ze(t)||xr(t)||bt(t)||Bt(t)||Ar(t)||Rr(t)?t:H({})}function rr(t,e){return te(t)?km(t,e):h({...ym(t),...e})}var Cd=p(()=>{R();Xt();Ze();dt();ye();Rn();T();Kt();Md();W()});function rP(t,e){let n={};for(let r of globalThis.Object.getOwnPropertyNames(t))n[r]=rr(t[r],e);return n}function oP(t,e){return rP(t.properties,e)}function km(t,e){let n=oP(t,e);return B(n)}var Md=p(()=>{Pe();Cd()});var Si=p(()=>{Md();Cd()});function iP(t,e){return e.map(n=>de(n)?_d(t,n.$ref):et(t,n))}function _d(t,e){return e in t?de(t[e])?_d(t,t[e].$ref):et(t,t[e]):L()}function sP(t){return Qn(t[0])}function aP(t){return Zt(t[0],t[1])}function dP(t){return Jn(t[0])}function lP(t){return nr(t[0])}function uP(t){return rn(t[0],t[1])}function pP(t){return on(t[0],t[1])}function cP(t){return rr(t[0])}function mP(t,e,n){let r=iP(t,n);return e==="Awaited"?sP(r):e==="Index"?aP(r):e==="KeyOf"?dP(r):e==="Partial"?lP(r):e==="Omit"?uP(r):e==="Pick"?pP(r):e==="Required"?cP(r):L()}function fP(t,e){return Un(et(t,e))}function gP(t,e){return Kn(et(t,e))}function hP(t,e,n){return Vn(Qr(t,e),et(t,n))}function SP(t,e,n){return Mt(Qr(t,e),et(t,n))}function yP(t,e){return Oe(Qr(t,e))}function kP(t,e){return zn(et(t,e))}function vP(t,e){return H(globalThis.Object.keys(e).reduce((n,r)=>({...n,[r]:et(t,e[r])}),{}))}function PP(t,e){let[n,r]=[et(t,pi(e)),ui(e)],o=Wn(e);return o.patternProperties[r]=n,o}function wP(t,e){return de(e)?{..._d(t,e.$ref),[Se]:e[Se]}:e}function IP(t,e){return lt(Qr(t,e))}function bP(t,e){return V(Qr(t,e))}function Qr(t,e){return e.map(n=>et(t,n))}function et(t,e){return Ue(e)?h(et(t,ie(e,[Ae])),e):Bn(e)?h(et(t,ie(e,[yt])),e):zt(e)?h(wP(t,e),e):kt(e)?h(fP(t,e.items),e):Sn(e)?h(gP(t,e.items),e):vt(e)?h(mP(t,e.target,e.parameters)):Pt(e)?h(hP(t,e.parameters,e.returns),e):wt(e)?h(SP(t,e.parameters,e.returns),e):oe(e)?h(yP(t,e.allOf),e):kn(e)?h(kP(t,e.items),e):fe(e)?h(vP(t,e.properties),e):Pn(e)?h(PP(t,e)):Ye(e)?h(IP(t,e.items||[]),e):F(e)?h(bP(t,e.anyOf),e):e}function xP(t,e){return e in t?et(t,t[e]):L()}function vm(t){return globalThis.Object.getOwnPropertyNames(t).reduce((e,n)=>({...e,[n]:xP(t,n)}),{})}var Pm=p(()=>{Lt();ma();Kt();$r();qo();Dr();Nr();Et();wn();dt();Ur();Gr();Ze();mi();gi();Re();hi();Hr();Si();en();ye();T();W()});function wm(t){return new Ed(t)}var Ed,Im=p(()=>{Lt();T();Pm();Ed=class{constructor(e){let n=vm(e),r=this.WithIdentifiers(n);this.$defs=r}Import(e,n){let r={...this.$defs,[e]:h(this.$defs[e],n)};return h({[w]:"Import",$defs:r,$ref:e})}WithIdentifiers(e){return globalThis.Object.getOwnPropertyNames(e).reduce((n,r)=>({...n,[r]:{...e[r],$id:r}}),{})}}});var Od=p(()=>{Im()});function bm(t,e){return h({[w]:"Not",not:t},e)}var xm=p(()=>{R();T()});var $d=p(()=>{xm()});function Am(t,e){return wt(t)?lt(t.parameters,e):L()}var Rm=p(()=>{en();Re();W()});var Dd=p(()=>{Rm()});function Tm(t,e={}){me(e.$id)&&(e.$id=`T${AP++}`);let n=Wn(t({[w]:"This",$ref:`${e.$id}`}));return n.$id=e.$id,h({[st]:"Recursive",...n},e)}var AP,Cm=p(()=>{Co();R();Fe();T();AP=0});var Nd=p(()=>{Cm()});function Mm(t,e){let n=Q(t)?new globalThis.RegExp(t):t;return h({[w]:"RegExp",type:"RegExp",source:n.source,flags:n.flags},e)}var _m=p(()=>{R();Fe();T()});var Fd=p(()=>{_m()});function RP(t){return oe(t)?t.allOf:F(t)?t.anyOf:Ye(t)?t.items??[]:[]}function Em(t){return RP(t)}var Om=p(()=>{W()});var Ld=p(()=>{Om()});function $m(t,e){return wt(t)?h(t.returns,e):L(e)}var Dm=p(()=>{R();Re();W()});var Wd=p(()=>{Dm()});var Nm=p(()=>{});var Fm=p(()=>{});var Lm=p(()=>{Nm();Fm()});var Wm=p(()=>{});var Bm=p(()=>{Wm()});function Um(t){return new Bd(t)}var Bd,Ud,Km=p(()=>{T();W();Bd=class{constructor(e){this.schema=e}Decode(e){return new Ud(this.schema,e)}},Ud=class{constructor(e,n){this.schema=e,this.decode=n}EncodeTransform(e,n){let i={Encode:s=>n[Se].Encode(e(s)),Decode:s=>this.decode(n[Se].Decode(s))};return{...n,[Se]:i}}EncodeSchema(e,n){let r={Decode:this.decode,Encode:e};return{...n,[Se]:r}}Encode(e){return zt(this.schema)?this.EncodeTransform(e,this.schema):this.EncodeSchema(e,this.schema)}}});var Kd=p(()=>{Km()});function Vm(t={}){return h({[w]:t[w]??"Unsafe"},t)}var qm=p(()=>{R();T()});var Vd=p(()=>{qm()});function Gm(t){return h({[w]:"Void",type:"void"},t)}var jm=p(()=>{R();T()});var qd=p(()=>{jm()});var Gd={};Ao(Gd,{Any:()=>Yt,Argument:()=>yp,Array:()=>Un,AsyncIterator:()=>Kn,Awaited:()=>Qn,BigInt:()=>jn,Boolean:()=>Fo,Capitalize:()=>nm,Composite:()=>cc,Const:()=>vc,Constructor:()=>Vn,ConstructorParameters:()=>wc,Date:()=>Go,Enum:()=>bc,Exclude:()=>er,Extends:()=>Zn,Extract:()=>tr,Function:()=>Mt,Index:()=>Zt,InstanceType:()=>qc,Instantiate:()=>Qc,Integer:()=>Yc,Intersect:()=>Oe,Iterator:()=>zn,KeyOf:()=>Jn,Literal:()=>K,Lowercase:()=>om,Mapped:()=>Zp,Module:()=>wm,Never:()=>L,Not:()=>bm,Null:()=>Ho,Number:()=>at,Object:()=>H,Omit:()=>rn,Optional:()=>Ee,Parameters:()=>Am,Partial:()=>nr,Pick:()=>on,Promise:()=>Ko,Readonly:()=>qe,ReadonlyOptional:()=>ai,Record:()=>li,Recursive:()=>Tm,Ref:()=>Ot,RegExp:()=>Mm,Required:()=>rr,Rest:()=>Em,ReturnType:()=>$m,String:()=>xt,Symbol:()=>Qo,TemplateLiteral:()=>Wo,Transform:()=>Um,Tuple:()=>lt,Uint8Array:()=>Zo,Uncapitalize:()=>sm,Undefined:()=>Yo,Union:()=>V,Unknown:()=>tn,Unsafe:()=>Vm,Uppercase:()=>dm,Void:()=>Gm});var Hm=p(()=>{Or();ba();$r();Dr();qo();Br();Lo();Qa();Ya();Nr();Xa();jo();Za();pd();jr();fd();wn();Et();gd();Sd();yd();dt();vd();Ur();Gr();Ke();Pe();Od();Re();$d();zo();bn();Ze();mi();Vt();Dd();hi();gi();Vo();An();di();Hr();Nd();Rn();Fd();Si();Ld();Wd();Hn();Jo();Gt();Kd();en();ei();Xo();ye();Yn();Vd();qd()});var c,zm=p(()=>{Hm();c=Gd});var De=p(()=>{ma();Lt();Ct();Pa();ip();_r();up();Er();T();Or();$r();ba();Dr();qo();Br();Lo();Qa();Ya();Nr();Xa();jo();Za();pd();jr();fd();wn();Et();gd();Sd();yd();dt();Ur();vd();Gr();Ke();Od();Pe();Re();$d();zo();bn();Ze();mi();Vt();Dd();hi();gi();Vo();An();di();Hr();Nd();Rn();Fd();Si();Ld();Wd();Lm();Bm();Hn();Jo();Gt();Kd();en();ei();Xo();ye();Yn();Vd();qd();zm()});function jd(t){v=t}function Hd(t){ge=t}var v,ge,Y=p(()=>{v=null,ge=null});function Qm(t){let e=t.chatId.trim(),n=t.topicId.trim();return!/^-?\d+$/.test(e)||!/^\d+$/.test(n)?null:`${e}:topic:${n}`}function EP(t){let e=t.conversationId.trim(),n=e.match(/^(-?\d+):topic:(\d+)$/i);if(n?.[1]&&n[2]){let i=Qm({chatId:n[1],topicId:n[2]});return i?{chatId:n[1],topicId:n[2],canonicalConversationId:i}:null}if(!/^\d+$/.test(e))return null;let r=t.parentConversationId?.trim();if(!r||!/^-?\d+$/.test(r))return null;let o=Qm({chatId:r,topicId:e});return o?{chatId:r,topicId:e,canonicalConversationId:o}:null}function OP(t){if(!t)return;let e=t.match(/^agent:[^:]+:discord:(direct|dm|channel|group):/i);if(!e?.[1])return;let n=e[1].toLowerCase();return n==="direct"||n==="dm"?"user":"channel"}function $P(t,e){if(!/^\d+$/.test(t))return t;let n=OP(e);return n?`${n}:${t}`:`channel:${t}`}function DP(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 NP(t){let e=t.toLowerCase(),n=[":thread:",":topic:"];for(let r of n){let o=e.lastIndexOf(r);if(o===-1)continue;let i=t.slice(0,o).trim(),s=t.slice(o+r.length).trim()||void 0;return{id:i||t,threadId:s}}return{id:t}}function FP(t){let e=t?.trim();if(!e)return;let n=e.split(":").filter(Boolean);if(n[0]?.trim().toLowerCase()==="agent")for(let r=2;r<=n.length-3;r+=1){let o=n[r]?.trim().toLowerCase();if(!o||!_P.has(o))continue;let i=n[r+1]?.trim().toLowerCase(),s=n.slice(r+2).join(":").trim();if(!(!i||!s))return{provider:o,kind:i,rawId:s}}}function LP(t,e=EP){try{return e({conversationId:t})}catch{return null}}function zd(t){return{provider:"system",target:"system",sessionKey:t?.trim()||void 0}}function Qd(t,e){return{...t,threadId:e??t.threadId}}function BP(t,e,n){return t==="telegram"&&n?.provider==="telegram"&&!!n.target&&e!==n.target}function UP(t){let e=t?.trim();if(!e)return;let n=FP(e);if(!n)return;let{provider:r,kind:o,rawId:i}=n,s=NP(i),a=null;if(r==="telegram")try{a=WP.safeParseTelegramTopicConversation(i)}catch{a=null}let d=a?.chatId??s.id,l=a?.topicId??s.threadId,u=r==="discord"?o==="direct"||o==="dm"?`user:${d}`:`channel:${d}`:d;return{provider:r,target:u,threadId:l,sessionKey:e}}function Jd(t){let e=t?.match(/:topic:(\d+)$/);return e?parseInt(e[1],10):void 0}function Jm(t){return!!(t?.provider&&t.target&&t.provider!=="system"&&t.target!=="system")}function Jr(t,e,n){let r=UP(n),o=e!=null?String(e):void 0,i=t?.trim();if(!i||i.toLowerCase()==="unknown")return r?Qd(r,o):zd(n);let s=i.split("|").map(k=>k.trim());if(s.length<2)return r?Qd(r,o):zd(n);let[a,d,l]=s,u=s.length>=3?l:d,f=s.length>=3?d:void 0,g=a?.toLowerCase();if(!g||!u)return r?Qd(r,o):zd(n);let y=g==="discord"?$P(u,n):u;return BP(g,y,r)?{provider:g,accountId:f,target:r.target,threadId:o??r.threadId,sessionKey:n?.trim()||void 0}:{provider:g,accountId:f,target:y,threadId:o??(r?.provider===g?r.threadId:void 0),sessionKey:n?.trim()||void 0}}function Mn(t){return Jr(DP(t.route)??t.originChannel,t.route?.threadId??t.originThreadId,t.route?.sessionKey??t.originSessionKey)??t.route}function ki(t){let e=Mn(t);return Jm(e)?e:void 0}function KP(t){return Object.fromEntries(Object.entries(t).filter(e=>!!e[1]))}function Ym(t){let e=Mn(t);if(!Jm(e))return"";let n=KP({provider:e?.provider,accountId:e?.accountId,target:e?.target,threadId:e?.threadId??(t.originThreadId!=null?String(t.originThreadId):void 0),sessionKey:e?.sessionKey??t.originSessionKey});return Object.keys(n).length===0?"":["Session origin route (authoritative for human follow-ups):",`originRoute: ${JSON.stringify(n)}`,"Routing rule: Send any human follow-up for this wake to originRoute. If originRoute differs from the current chat, do not use a plain final assistant reply; use a routed send path that preserves provider/target/threadId."].join(`
|
|
2
|
-
`)}var
|
|
3
|
-
`)}}function
|
|
4
|
-
${b.text}`:b.text,n.enqueue(
|
|
5
|
-
`)}async handleLine(e){let n=YP(e);n&&await XP(n,{pending:this.pending,onNotification:this.onNotification,onRequest:this.onRequest,respond:r=>this.write(r)})}flushPending(e){for(let[n,r]of this.pending)clearTimeout(r.timer),r.reject(e),this.pending.delete(n)}}});function X(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function le(t,e,n){for(let r of e){let o=t?.[r];if(typeof o!="string")continue;let i=n?.trim===!1?o:o.trim();if(i)return i}}function ZP(t){return t instanceof Error?t.message:String(t)}function df(t){return t?t.split(",").map(e=>e.trim()).filter(Boolean):[]}function dn(t){if(typeof t=="string")return t;if(Array.isArray(t))return t.map(n=>dn(n)).join("");let e=X(t);if(!e)return"";for(let n of["delta","text","content","message","input","output","parts"]){let r=dn(e[n]);if(r)return r}for(let n of["item","turn","thread","response","result","data"]){let r=dn(e[n]);if(r)return r}return""}function to(t){let e=X(t);if(!e)return{};let n=X(e.thread)??X(e.session),r=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(n,["id","threadId","thread_id","conversationId"]),runId:le(e,["turnId","turn_id","runId","run_id"])??le(r,["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 _i(t,e,n=0){if(n>6)return;if(Array.isArray(t)){for(let i of t){let s=_i(i,e,n+1);if(s)return s}return}let r=X(t);if(!r)return;let o=le(r,e);if(o)return o;for(let i of Object.values(r)){let s=_i(i,e,n+1);if(s)return s}}function no(t){return{threadId:to(t).threadId,cwd:_i(t,["cwd","workdir","directory"])}}function lf(t){let e=t?.trim();return!!(e&&/[/\\]worktrees[/\\][^/\\]+[/\\][^/\\]+/.test(e))}function uf(t){let e=t?.trim();if(!e)return;let n=e.split(/[/\\]+/).filter(Boolean),r=n.lastIndexOf("worktrees");if(!(r<0||r+1>=n.length))return n[r+1]}function Ei(t){let e=X(t);if(!e)return;let n=X(e.item)??e;return le(n,["id","itemId","item_id","messageId","message_id"])}function ew(t,e=!1){let n=X(t);if(!n)return"";let r=X(n.item)??n;return le(r,["type"])?.toLowerCase()!=="agentmessage"?"":e?dn(r):le(r,["text"],{trim:!1})??dn(r)}function pf(t,e){let n=t.trim().toLowerCase();return n==="item/agentmessage/delta"?{mode:"delta",text:dn(e),itemId:Ei(e)}:n==="item/completed"?{mode:"snapshot",text:ew(e),itemId:Ei(e)}:{mode:"ignore",text:""}}function cf(t){return{itemId:Ei(t),delta:dn(t)}}function mf(t){let e=X(t),n=X(e?.plan),o=(Array.isArray(e?.plan)?e.plan:Array.isArray(n?.steps)?n.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(n,["explanation"])??le(e,["explanation"]),steps:o}}function ff(t){let e=X(t);if(!e)return{};let n=X(e.item)??e;return le(n,["type"])?.toLowerCase()!=="plan"?{}:{itemId:Ei(n),text:le(n,["text"],{trim:!1})??dn(n)}}function gf(t,e){let n=t.trim().toLowerCase();if(n==="turn/failed")return"failed";if(n==="turn/cancelled")return"interrupted";let r=X(e)??{},o=X(r.turn)??r,i=le(o,["status"])?.toLowerCase();return i==="failed"?"failed":i==="interrupted"||i==="cancelled"?"interrupted":"completed"}function hf(t,e){let n=X(e)??{},r=X(n.turn)??n,o=X(r.error)??X(n.error);if(o)return le(o,["message","text","summary","reason"])}function tw(t,e){let n=ZP(t).toLowerCase();return n.includes("method not found")||n.includes("unknown method")?!0:n.includes("unknown variant")?e?n.includes(`unknown variant \`${e.toLowerCase()}\``):!0:!1}function rw(t){return nw.has(t.trim().toLowerCase())}function ow(t){let e=X(t);return e?!!le(e,["threadId","thread_id"]):!1}async function ro(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 n of t.methods)for(let r of t.payloads){if(rw(n)&&!ow(r))throw new Error(`codex app server request missing threadId: ${n}`);try{return await t.client.request(n,r,t.timeoutMs)}catch(o){if(e=o,!tw(o,n))continue}}throw e instanceof Error?e:new Error(String(e))}function Sf(t){let e={cwd:t.cwd};t.model?.trim()&&(e.model=t.model.trim()),t.reasoningEffort?.trim()&&(e.reasoningEffort=t.reasoningEffort.trim()),t.approvalPolicy?.trim()&&(e.approvalPolicy=t.approvalPolicy.trim()),t.sandbox?.trim()&&(e.sandbox=t.sandbox.trim());let n={cwd:t.cwd};return t.reasoningEffort?.trim()&&(n.reasoning_effort=t.reasoningEffort.trim()),t.approvalPolicy?.trim()&&(n.approvalPolicy=t.approvalPolicy.trim()),t.sandbox?.trim()&&(n.sandbox=t.sandbox.trim()),[e,n,{}]}function yf(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 iw(t){return[{type:"text",text:t}]}function sw(t,e,n,r){let o=e?.trim(),i=n?.trim(),s=r?.trim();if(t!=="plan")return o||i||s?{mode:"default",settings:{...o?{model:o}:{},...i?{reasoningEffort:i}:{},developerInstructions:s??null}}:void 0;if(!(!o&&!i&&!s))return{mode:"plan",settings:{...o?{model:o}:{},...i?{reasoningEffort:i}:{},developerInstructions:s??null}}}function kf(t){let e={threadId:t.threadId,input:iw(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 n=sw(t.permissionMode??"default",t.model,t.reasoningEffort,t.systemPrompt);return n?[{...e,collaborationMode:n},{...e,collaboration_mode:{mode:n.mode,settings:{...typeof n.settings.model=="string"?{model:n.settings.model}:{},...typeof n.settings.reasoningEffort=="string"?{reasoning_effort:n.settings.reasoningEffort}:{},developer_instructions:n.settings.developerInstructions??null}}},e]:[e]}function vf(t){return[{threadId:t.threadId,turnId:t.turnId}]}function aw(t){let e=X(t);if(!e)return[];let n=e.options??e.choices??e.availableDecisions??e.decisions;return Array.isArray(n)?n.map(r=>typeof r=="string"?r.trim():le(X(r),["label","title","text","value","name","id"])??"").filter(Boolean):[]}function dw(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 Pf(t,e,n){let r=t.trim().toLowerCase(),o=aw(n),i=_i(n,["question","prompt","message","text","summary","reason"])??void 0,s=r.includes("requestapproval"),a=s?o.map(d=>({kind:"approval",label:d,decision:dw(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 wf(t){let e=t.trim().toLowerCase();return e.includes("requestuserinput")||e.includes("requestapproval")}function nl(t,e){let n=t==="bypassPermissions"?"never":e?.trim()||"never";return{approvalPolicy:n,sandbox:n==="never"?"danger-full-access":void 0}}var nw,If=p(()=>{nw=new Set(["thread/resume","turn/start","turn/steer","turn/interrupt"])});function bf(t){return t instanceof Error?t.message:String(t)}function mw(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 lw,En,uw,pw,cw,Oi,xf=p(()=>{af();tl();If();lw="1.0",En=6e4,uw="OPENCLAW_CODEX_APP_SERVER_COMMAND",pw="OPENCLAW_CODEX_APP_SERVER_ARGS",cw="OPENCLAW_CODEX_APP_SERVER_TIMEOUT_MS";Oi=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 n={command:process.env[uw]?.trim()||"codex",args:df(process.env[pw]),requestTimeoutMs:Number.parseInt(process.env[cw]??String(En),10)||En},r=this.deps.createClient?.(n)??new Mi(n.command,n.args,n.requestTimeoutMs),o=new ar,i=e.resumeSessionId,s,a=e.backendRef?.worktreePath,d=e.backendRef?.worktreeId,l=e.permissionMode??"default",u,f=0,g="",y=[],k,I=new Map,P=new Set,b=O=>{let $=O?.trim();if(!$)return;let U=e.originalWorkdir?.trim()||e.cwd.trim();e.worktreeStrategy&&e.worktreeStrategy!=="off"&&$!==U&&lf($)&&(a=$,d=uf($))},A=()=>{i&&o.enqueue(Ii({kind:"codex-app-server",conversationId:i,...s?{runId:s}:{},...d?{worktreeId:d}:{},...a?{worktreePath:a}:{}}))};r.setNotificationHandler(async(O,$)=>{let U=O.trim().toLowerCase(),pe=to($),St=no($);if(pe.threadId&&i&&pe.threadId!==i)return;if(pe.threadId&&(i=pe.threadId),pe.runId&&(s=pe.runId),b(St.cwd),(pe.threadId||pe.runId||St.cwd)&&A(),U==="serverrequest/resolved"){u&&(o.enqueue(dr(u.requestId)),u=void 0);return}if(U==="turn/plan/updated"){let Me=mf($);g=Me.explanation??g,Me.steps.length>0&&(y=Me.steps);return}if(U==="item/plan/delta"){let Me=cf($);if(Me.itemId&&Me.delta){let jt=I.get(Me.itemId)??"";I.set(Me.itemId,`${jt}${Me.delta}`)}return}if(U==="item/completed"){let Me=ff($);if(Me.text?.trim()){let jt={explanation:g||void 0,steps:y,markdown:Me.text.trim()};o.enqueue(Ai(jt,!0));return}}let ae=pf(U,$);if(ae.mode==="delta"&&ae.text){ae.itemId&&P.add(ae.itemId),o.enqueue(eo(ae.text));return}ae.mode==="snapshot"&&ae.text&&(!ae.itemId||!P.has(ae.itemId))&&o.enqueue(eo(ae.text)),(U==="turn/completed"||U==="turn/failed"||U==="turn/cancelled")&&k&&(k.method=O,k.params=$,k.resolve())}),r.setRequestHandler(async(O,$)=>{if(!wf(O))return{};let U=to($),pe=no($);if(U.threadId&&i&&U.threadId!==i)return{};U.threadId&&(i=U.threadId),U.runId&&(s=U.runId),b(pe.cwd),(U.threadId||U.runId||pe.cwd)&&A();let St=U.requestId??`${i??"codex"}-${Date.now().toString(36)}`,ae=Pf(O,St,$),Me=O.trim().toLowerCase(),jt=ae.options,xo=ae.actions??[],Hh=await new Promise(zh=>{u={requestId:St,methodLower:Me,state:ae,options:jt,actions:xo,resolveResponse:zh},o.enqueue(xi(ae))});return u=void 0,o.enqueue(dr(St)),Hh});let C=async()=>{await r.connect(),await r.request("initialize",{protocolVersion:lw,clientInfo:{name:"openclaw-code-agent",version:"3.1.0"},capabilities:{experimentalApi:!0}},En),await r.notify("initialized",{})},N=async()=>{let O=nl(l,e.codexApprovalPolicy);if(i){let pe=await ro({client:r,methods:["thread/resume"],payloads:yf({threadId:i,model:e.model,reasoningEffort:e.reasoningEffort,approvalPolicy:O.approvalPolicy,sandbox:O.sandbox}),timeoutMs:En}),St=no(pe);i=St.threadId??i,b(St.cwd),A();return}let $=await ro({client:r,methods:["thread/start","thread/new"],payloads:Sf({cwd:e.cwd,model:e.model,reasoningEffort:e.reasoningEffort,approvalPolicy:O.approvalPolicy,sandbox:O.sandbox}),timeoutMs:En}),U=no($);if(i=U.threadId,!i)throw new Error("Codex App Server did not return a thread id.");b(U.cwd),A()},xe=async O=>{await N(),o.enqueue(bi()),f+=1,g="",y=[],I.clear(),P.clear();let $="",U,pe,St=new Promise(ae=>{pe=ae});k={resolve:pe};try{let ae=nl(l,e.codexApprovalPolicy),Me=await ro({client:r,methods:["turn/start"],payloads:kf({threadId:i,prompt:O,model:e.model,reasoningEffort:e.reasoningEffort,systemPrompt:e.systemPrompt,permissionMode:l,approvalPolicy:ae.approvalPolicy,sandbox:ae.sandbox}),timeoutMs:En}),jt=to(Me);jt.runId&&(s=jt.runId,A()),await St,$=k?.method??"turn/failed",U=k?.params;let xo=gf($,U);o.enqueue(_n({success:xo==="completed",outcome:xo,duration_ms:0,total_cost_usd:0,num_turns:f,result:hf($,U),session_id:i}))}catch(ae){o.enqueue(_n({success:!1,duration_ms:0,total_cost_usd:0,num_turns:f,result:bf(ae),session_id:i??""}))}finally{k=void 0}},it=async O=>u?(u.methodLower.includes("requestapproval")?u.resolveResponse({decision:O.trim()||"decline"}):u.resolveResponse({text:O.trim()}),!0):!1,ou=async O=>{let $=u;if(!$)return!1;let U=$.actions[O];if(U?.kind==="approval")return $.resolveResponse({decision:U.responseDecision,...U.proposedExecpolicyAmendment?{proposedExecpolicyAmendment:U.proposedExecpolicyAmendment}:{}}),!0;let pe=$.options[O];return pe?($.methodLower.includes("requestapproval")?$.resolveResponse({decision:pe}):$.resolveResponse({option:pe,index:O}),!0):!1},iu=typeof e.prompt=="string"?(async function*(){yield{type:"user",text:e.prompt,session_id:e.resumeSessionId??""}})():e.prompt;return(async()=>{try{await C();for await(let O of iu){let $=mw(O).trim();!$||await it($)||await xe($)}}catch(O){o.enqueue(_n({success:!1,duration_ms:0,total_cost_usd:0,num_turns:f,result:bf(O),session_id:i??e.resumeSessionId??""}))}finally{await r.close().catch(()=>{}),o.close()}})(),{messages:o.messages(),async setPermissionMode(O){l=O,o.enqueue(Ri(O))},async submitPendingInputOption(O){return ou(O)},async submitPendingInputText(O){return it(O)},async interrupt(){!i||!s||await ro({client:r,methods:["turn/interrupt"],payloads:vf({threadId:i,turnId:s}),timeoutMs:En}).catch(()=>{})}}}buildUserMessage(e,n){return{type:"user",text:e,session_id:n}}}});function Af(t){rl.set(t.name,t)}function oo(t){let e=rl.get(t);if(!e)throw new Error(`Unknown agent harness: "${t}". Available: ${[...rl.keys()].join(", ")}`);return e}function Rf(){return oo(Le())}var rl,ol=p(()=>{sf();xf();Te();rl=new Map;Af(new Ti);Af(new Oi)});function M(t){return t.backendRef?.conversationId??t.harnessSessionId}function ne(t){return t.id??t.sessionId??t.name??M(t)??t.harnessSessionId}function fw(t){return t.harnessSessionId}function tt(t){let e=[ne(t),M(t),fw(t)].filter(n=>!!n);return[...new Set(e)]}function il(t){return t.harnessName??t.persistedHarness??Le()}function io(t){if(t.backendRef?.kind==="codex-app-server")return"native-restore";try{return oo(il(t)).capabilities.worktrees}catch{return"plugin-managed"}}function sl(t){return t==="native-execution"}function $i(t){return t==="native-restore"}function gw(t){return!!(t.backendRef?.worktreePath||t.backendRef?.worktreeId)}function We(t){let e=io(t);return(sl(e)||$i(e))&&gw(t)}var he=p(()=>{Te();ol()});import{execFileSync as be}from"child_process";import*as Ji from"fs";import{tmpdir as Bw}from"os";import{dirname as zf,join as Uw}from"path";function Kw(t){try{return be("git",["rev-parse","--show-toplevel"],{cwd:t,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{return}}function Yi(t){if(process.env.OPENCLAW_WORKTREE_DIR)return process.env.OPENCLAW_WORKTREE_DIR;if(_.worktreeDir)return _.worktreeDir;if(t){let e=Kw(t);if(e)return Uw(e,".worktrees")}return Bw()}function Qf(t){return t.replace(/[^a-zA-Z0-9._-]/g,"-").replace(/\.{2,}/g,"-").replace(/^[-.]|[-.]$/g,"").slice(0,100)||"session"}function Xi(t){try{let e=be("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")?zf(e):void 0}catch{return}}function Vw(){if(zi!==void 0)return zi;try{return be("git",["--version"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),zi=!0,!0}catch{return zi=!1,!1}}function ln(){if(Qi!==void 0)return Qi;try{return be("gh",["--version"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),Qi=!0,!0}catch{return Qi=!1,!1}}function cl(t){if(!Vw())return!1;try{return be("git",["rev-parse","--git-dir"],{cwd:t,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function Jf(t){try{let e=Gw(t);if(!e)return console.warn(`[worktree] Failed to resolve free-space probe path for ${Yi(t)}`),!0;let n=Ji.statfsSync(e),r=n.bavail*n.bsize;return jw(r)}catch(e){return console.warn(`[worktree] Failed to check free space: ${e instanceof Error?e.message:String(e)}`),!0}}function po(t,e){try{return be("git",["-C",t,"rev-parse","--verify",e],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function qw(t){let e=t;for(;;){if(Ji.existsSync(e))return e;let n=zf(e);if(n===e)return;e=n}}function Gw(t){return qw(Yi(t))}function jw(t){return t>=104857600}function un(t){let e=process.env.OPENCLAW_WORKTREE_BASE_BRANCH?.trim();if(e)return e;try{let r=be("git",["-C",t,"rev-parse","--abbrev-ref","origin/HEAD"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().replace(/^origin\//,"");if(r)return r}catch{}try{return be("git",["-C",t,"rev-parse","--verify","main"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),"main"}catch{}try{return be("git",["-C",t,"rev-parse","--verify","master"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),"master"}catch{return"main"}}function Zi(t){try{let n=be("git",["-C",t,"rev-parse","--abbrev-ref","HEAD"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(n==="HEAD"){console.warn(`[worktree] Worktree ${t} is in detached HEAD state \u2014 cannot determine branch name`);return}return n||void 0}catch{return}}function ml(t,e,n){try{let r=be("git",["-C",t,"rev-list","--count",`${n}..${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});return parseInt(r.trim(),10)>0}catch{return!1}}function Yf(t,e,n){try{let r=be("git",["-C",t,"rev-list","--left-right","--count",`${e}...${n}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),[o,i]=r.split(/\s+/);return{ahead:parseInt(o??"0",10)||0,behind:parseInt(i??"0",10)||0}}catch{return}}function Xf(t,e,n){try{return be("git",["-C",t,"merge-base","--is-ancestor",e,n],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function Zf(t,e,n){try{let r=be("git",["-C",t,"merge-tree","--write-tree",n,e],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),o=be("git",["-C",t,"rev-parse",`${n}^{tree}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return!!r&&r===o}catch{return!1}}function Dt(t,e){try{return be("git",["-C",t,"branch","-D",e],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(n){return console.warn(`[worktree] Failed to delete branch ${e}: ${n instanceof Error?n.message:String(n)}`),!1}}function eg(t,e){if(e)return e;let n;try{n=be("git",["-C",t,"remote","get-url","origin"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{}try{let r=be("git",["-C",t,"remote","get-url","upstream"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(r&&r!==n){let o=r.match(/[:/]([^/]+\/[^/]+?)(?:\.git)?$/);if(o)return o[1]}}catch{}}var zi,Qi,co=p(()=>{Te()});import{execFileSync as mr}from"child_process";import{appendFileSync as Hw,existsSync as rg,mkdirSync as tg,readFileSync as zw,rmSync as fl}from"fs";import{relative as Qw,sep as ng}from"path";function Jw(t,e){return!!(t&&typeof t=="object"&&"code"in t&&t.code===e)}function Yw(t){try{return mr("git",["-C",t,"rev-parse","--show-toplevel"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{return}}function Xw(t,e){let n=Yw(t);if(!n)return;let r=Qw(n,e);if(!r||r.startsWith("..")||r.includes(`..${ng}`))return;let o=`${n}/.git/info/exclude`,i=`${r.split(ng).join("/").replace(/\/$/,"")}/`;try{let s=rg(o)?zw(o,"utf-8"):"";s.split(/\r?\n/).map(d=>d.trim()).some(d=>d===i||d===`/${i}`)||Hw(o,`${s.endsWith(`
|
|
1
|
+
var Xh=Object.defineProperty;var p=(t,e)=>()=>(t&&(e=t(t=0)),e);var Mo=(t,e)=>{for(var n in e)Xh(t,n,{get:e[n],enumerable:!0})};var _e={};Mo(_e,{HasPropertyKey:()=>_o,IsArray:()=>ce,IsAsyncIterator:()=>pa,IsBigInt:()=>xr,IsBoolean:()=>Nt,IsDate:()=>Sn,IsFunction:()=>ca,IsIterator:()=>ma,IsNull:()=>fa,IsNumber:()=>ze,IsObject:()=>j,IsRegExp:()=>Ar,IsString:()=>Q,IsSymbol:()=>ga,IsUint8Array:()=>Ft,IsUndefined:()=>me});function _o(t,e){return e in t}function pa(t){return j(t)&&!ce(t)&&!Ft(t)&&Symbol.asyncIterator in t}function ce(t){return Array.isArray(t)}function xr(t){return typeof t=="bigint"}function Nt(t){return typeof t=="boolean"}function Sn(t){return t instanceof globalThis.Date}function ca(t){return typeof t=="function"}function ma(t){return j(t)&&!ce(t)&&!Ft(t)&&Symbol.iterator in t}function fa(t){return t===null}function ze(t){return typeof t=="number"}function j(t){return typeof t=="object"&&t!==null}function Ar(t){return t instanceof globalThis.RegExp}function Q(t){return typeof t=="string"}function ga(t){return typeof t=="symbol"}function Ft(t){return t instanceof globalThis.Uint8Array}function me(t){return t===void 0}var Fe=p(()=>{});function Zh(t){return t.map(e=>Eo(e))}function eS(t){return new Date(t.getTime())}function tS(t){return new Uint8Array(t)}function nS(t){return new RegExp(t.source,t.flags)}function rS(t){let e={};for(let n of Object.getOwnPropertyNames(t))e[n]=Eo(t[n]);for(let n of Object.getOwnPropertySymbols(t))e[n]=Eo(t[n]);return e}function Eo(t){return ce(t)?Zh(t):Sn(t)?eS(t):Ft(t)?tS(t):Ar(t)?nS(t):j(t)?rS(t):t}function ee(t){return Eo(t)}var Be=p(()=>{Fe()});function Kn(t,e){return e===void 0?ee(t):ee({...e,...t})}var $o=p(()=>{Be()});var ha=p(()=>{$o();Be()});function su(t){return t!==null&&typeof t=="object"}function au(t){return globalThis.Array.isArray(t)&&!globalThis.ArrayBuffer.isView(t)}function du(t){return t===void 0}function lu(t){return typeof t=="number"}var uu=p(()=>{});var pu=p(()=>{uu()});var Oo,cu=p(()=>{pu();(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 n(s){let a=su(s);return t.AllowArrayObject?a:a&&!au(s)}t.IsObjectLike=n;function r(s){return n(s)&&!(s instanceof Date)&&!(s instanceof Uint8Array)}t.IsRecordLike=r;function o(s){return t.AllowNaN?lu(s):Number.isFinite(s)}t.IsNumberLike=o;function i(s){let a=du(s);return t.AllowNullVoid?a||s===null:a}t.IsVoidLike=i})(Oo||(Oo={}))});function oS(t){return globalThis.Object.freeze(t).map(e=>Rr(e))}function iS(t){let e={};for(let n of Object.getOwnPropertyNames(t))e[n]=Rr(t[n]);for(let n of Object.getOwnPropertySymbols(t))e[n]=Rr(t[n]);return globalThis.Object.freeze(e)}function Rr(t){return ce(t)?oS(t):Sn(t)?t:Ft(t)?t:Ar(t)?t:j(t)?iS(t):t}var mu=p(()=>{Fe()});function h(t,e){let n=e!==void 0?{...e,...t}:t;switch(Oo.InstanceMode){case"freeze":return Rr(n);case"clone":return ee(n);default:return n}}var R=p(()=>{cu();mu();Be()});var Lt=p(()=>{R()});var we,fu=p(()=>{we=class extends Error{constructor(e){super(e)}}});var Tt=p(()=>{fu()});var Se,St,Ae,it,w,Tr=p(()=>{Se=Symbol.for("TypeBox.Transform"),St=Symbol.for("TypeBox.Readonly"),Ae=Symbol.for("TypeBox.Optional"),it=Symbol.for("TypeBox.Hint"),w=Symbol.for("TypeBox.Kind")});var T=p(()=>{Tr()});function Vn(t){return j(t)&&t[St]==="Readonly"}function Ue(t){return j(t)&&t[Ae]==="Optional"}function Sa(t){return N(t,"Any")}function ya(t){return N(t,"Argument")}function yt(t){return N(t,"Array")}function yn(t){return N(t,"AsyncIterator")}function kn(t){return N(t,"BigInt")}function Wt(t){return N(t,"Boolean")}function kt(t){return N(t,"Computed")}function vt(t){return N(t,"Constructor")}function sS(t){return N(t,"Date")}function Pt(t){return N(t,"Function")}function wt(t){return N(t,"Integer")}function oe(t){return N(t,"Intersect")}function vn(t){return N(t,"Iterator")}function N(t,e){return j(t)&&w in t&&t[w]===e}function Do(t){return Nt(t)||ze(t)||Q(t)}function Qe(t){return N(t,"Literal")}function Je(t){return N(t,"MappedKey")}function te(t){return N(t,"MappedResult")}function Ht(t){return N(t,"Never")}function aS(t){return N(t,"Not")}function Cr(t){return N(t,"Null")}function It(t){return N(t,"Number")}function fe(t){return N(t,"Object")}function Pn(t){return N(t,"Promise")}function wn(t){return N(t,"Record")}function de(t){return N(t,"Ref")}function ka(t){return N(t,"RegExp")}function Bt(t){return N(t,"String")}function Mr(t){return N(t,"Symbol")}function Ye(t){return N(t,"TemplateLiteral")}function dS(t){return N(t,"This")}function zt(t){return j(t)&&Se in t}function Xe(t){return N(t,"Tuple")}function _r(t){return N(t,"Undefined")}function F(t){return N(t,"Union")}function lS(t){return N(t,"Uint8Array")}function uS(t){return N(t,"Unknown")}function pS(t){return N(t,"Unsafe")}function cS(t){return N(t,"Void")}function mS(t){return j(t)&&w in t&&Q(t[w])}function Ze(t){return Sa(t)||ya(t)||yt(t)||Wt(t)||kn(t)||yn(t)||kt(t)||vt(t)||sS(t)||Pt(t)||wt(t)||oe(t)||vn(t)||Qe(t)||Je(t)||te(t)||Ht(t)||aS(t)||Cr(t)||It(t)||fe(t)||Pn(t)||wn(t)||de(t)||ka(t)||Bt(t)||Mr(t)||Ye(t)||dS(t)||Xe(t)||_r(t)||F(t)||lS(t)||uS(t)||pS(t)||cS(t)||mS(t)}var W=p(()=>{Fe();T()});var m={};Mo(m,{IsAny:()=>yu,IsArgument:()=>ku,IsArray:()=>vu,IsAsyncIterator:()=>Pu,IsBigInt:()=>wu,IsBoolean:()=>Iu,IsComputed:()=>bu,IsConstructor:()=>xu,IsDate:()=>Au,IsFunction:()=>Ru,IsImport:()=>kS,IsInteger:()=>Tu,IsIntersect:()=>Cu,IsIterator:()=>Mu,IsKind:()=>np,IsKindOf:()=>E,IsLiteral:()=>$r,IsLiteralBoolean:()=>vS,IsLiteralNumber:()=>Eu,IsLiteralString:()=>_u,IsLiteralValue:()=>$u,IsMappedKey:()=>Ou,IsMappedResult:()=>Du,IsNever:()=>Nu,IsNot:()=>Fu,IsNull:()=>Lu,IsNumber:()=>Wu,IsObject:()=>Bu,IsOptional:()=>yS,IsPromise:()=>Uu,IsProperties:()=>No,IsReadonly:()=>SS,IsRecord:()=>Ku,IsRecursive:()=>PS,IsRef:()=>Vu,IsRegExp:()=>qu,IsSchema:()=>Ie,IsString:()=>ju,IsSymbol:()=>Gu,IsTemplateLiteral:()=>Hu,IsThis:()=>zu,IsTransform:()=>Qu,IsTuple:()=>Ju,IsUint8Array:()=>Xu,IsUndefined:()=>Yu,IsUnion:()=>Ia,IsUnionLiteral:()=>wS,IsUnknown:()=>Zu,IsUnsafe:()=>ep,IsVoid:()=>tp,TypeGuardUnknownTypeError:()=>va});function gu(t){try{return new RegExp(t),!0}catch{return!1}}function Pa(t){if(!Q(t))return!1;for(let e=0;e<t.length;e++){let n=t.charCodeAt(e);if(n>=7&&n<=13||n===27||n===127)return!1}return!0}function hu(t){return wa(t)||Ie(t)}function Er(t){return me(t)||xr(t)}function J(t){return me(t)||ze(t)}function wa(t){return me(t)||Nt(t)}function G(t){return me(t)||Q(t)}function gS(t){return me(t)||Q(t)&&Pa(t)&&gu(t)}function hS(t){return me(t)||Q(t)&&Pa(t)}function Su(t){return me(t)||Ie(t)}function SS(t){return j(t)&&t[St]==="Readonly"}function yS(t){return j(t)&&t[Ae]==="Optional"}function yu(t){return E(t,"Any")&&G(t.$id)}function ku(t){return E(t,"Argument")&&ze(t.index)}function vu(t){return E(t,"Array")&&t.type==="array"&&G(t.$id)&&Ie(t.items)&&J(t.minItems)&&J(t.maxItems)&&wa(t.uniqueItems)&&Su(t.contains)&&J(t.minContains)&&J(t.maxContains)}function Pu(t){return E(t,"AsyncIterator")&&t.type==="AsyncIterator"&&G(t.$id)&&Ie(t.items)}function wu(t){return E(t,"BigInt")&&t.type==="bigint"&&G(t.$id)&&Er(t.exclusiveMaximum)&&Er(t.exclusiveMinimum)&&Er(t.maximum)&&Er(t.minimum)&&Er(t.multipleOf)}function Iu(t){return E(t,"Boolean")&&t.type==="boolean"&&G(t.$id)}function bu(t){return E(t,"Computed")&&Q(t.target)&&ce(t.parameters)&&t.parameters.every(e=>Ie(e))}function xu(t){return E(t,"Constructor")&&t.type==="Constructor"&&G(t.$id)&&ce(t.parameters)&&t.parameters.every(e=>Ie(e))&&Ie(t.returns)}function Au(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 Ru(t){return E(t,"Function")&&t.type==="Function"&&G(t.$id)&&ce(t.parameters)&&t.parameters.every(e=>Ie(e))&&Ie(t.returns)}function kS(t){return E(t,"Import")&&_o(t,"$defs")&&j(t.$defs)&&No(t.$defs)&&_o(t,"$ref")&&Q(t.$ref)&&t.$ref in t.$defs}function Tu(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 No(t){return j(t)&&Object.entries(t).every(([e,n])=>Pa(e)&&Ie(n))}function Cu(t){return E(t,"Intersect")&&!(Q(t.type)&&t.type!=="object")&&ce(t.allOf)&&t.allOf.every(e=>Ie(e)&&!Qu(e))&&G(t.type)&&(wa(t.unevaluatedProperties)||Su(t.unevaluatedProperties))&&G(t.$id)}function Mu(t){return E(t,"Iterator")&&t.type==="Iterator"&&G(t.$id)&&Ie(t.items)}function E(t,e){return j(t)&&w in t&&t[w]===e}function _u(t){return $r(t)&&Q(t.const)}function Eu(t){return $r(t)&&ze(t.const)}function vS(t){return $r(t)&&Nt(t.const)}function $r(t){return E(t,"Literal")&&G(t.$id)&&$u(t.const)}function $u(t){return Nt(t)||ze(t)||Q(t)}function Ou(t){return E(t,"MappedKey")&&ce(t.keys)&&t.keys.every(e=>ze(e)||Q(e))}function Du(t){return E(t,"MappedResult")&&No(t.properties)}function Nu(t){return E(t,"Never")&&j(t.not)&&Object.getOwnPropertyNames(t.not).length===0}function Fu(t){return E(t,"Not")&&Ie(t.not)}function Lu(t){return E(t,"Null")&&t.type==="null"&&G(t.$id)}function Wu(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 Bu(t){return E(t,"Object")&&t.type==="object"&&G(t.$id)&&No(t.properties)&&hu(t.additionalProperties)&&J(t.minProperties)&&J(t.maxProperties)}function Uu(t){return E(t,"Promise")&&t.type==="Promise"&&G(t.$id)&&Ie(t.item)}function Ku(t){return E(t,"Record")&&t.type==="object"&&G(t.$id)&&hu(t.additionalProperties)&&j(t.patternProperties)&&(e=>{let n=Object.getOwnPropertyNames(e.patternProperties);return n.length===1&&gu(n[0])&&j(e.patternProperties)&&Ie(e.patternProperties[n[0]])})(t)}function PS(t){return j(t)&&it in t&&t[it]==="Recursive"}function Vu(t){return E(t,"Ref")&&G(t.$id)&&Q(t.$ref)}function qu(t){return E(t,"RegExp")&&G(t.$id)&&Q(t.source)&&Q(t.flags)&&J(t.maxLength)&&J(t.minLength)}function ju(t){return E(t,"String")&&t.type==="string"&&G(t.$id)&&J(t.minLength)&&J(t.maxLength)&&gS(t.pattern)&&hS(t.format)}function Gu(t){return E(t,"Symbol")&&t.type==="symbol"&&G(t.$id)}function Hu(t){return E(t,"TemplateLiteral")&&t.type==="string"&&Q(t.pattern)&&t.pattern[0]==="^"&&t.pattern[t.pattern.length-1]==="$"}function zu(t){return E(t,"This")&&G(t.$id)&&Q(t.$ref)}function Qu(t){return j(t)&&Se in t}function Ju(t){return E(t,"Tuple")&&t.type==="array"&&G(t.$id)&&ze(t.minItems)&&ze(t.maxItems)&&t.minItems===t.maxItems&&(me(t.items)&&me(t.additionalItems)&&t.minItems===0||ce(t.items)&&t.items.every(e=>Ie(e)))}function Yu(t){return E(t,"Undefined")&&t.type==="undefined"&&G(t.$id)}function wS(t){return Ia(t)&&t.anyOf.every(e=>_u(e)||Eu(e))}function Ia(t){return E(t,"Union")&&G(t.$id)&&j(t)&&ce(t.anyOf)&&t.anyOf.every(e=>Ie(e))}function Xu(t){return E(t,"Uint8Array")&&t.type==="Uint8Array"&&G(t.$id)&&J(t.minByteLength)&&J(t.maxByteLength)}function Zu(t){return E(t,"Unknown")&&G(t.$id)}function ep(t){return E(t,"Unsafe")}function tp(t){return E(t,"Void")&&t.type==="void"&&G(t.$id)}function np(t){return j(t)&&w in t&&Q(t[w])&&!fS.includes(t[w])}function Ie(t){return j(t)&&(yu(t)||ku(t)||vu(t)||Iu(t)||wu(t)||Pu(t)||bu(t)||xu(t)||Au(t)||Ru(t)||Tu(t)||Cu(t)||Mu(t)||$r(t)||Ou(t)||Du(t)||Nu(t)||Fu(t)||Lu(t)||Wu(t)||Bu(t)||Uu(t)||Ku(t)||Vu(t)||qu(t)||ju(t)||Gu(t)||Hu(t)||zu(t)||Ju(t)||Yu(t)||Ia(t)||Xu(t)||Zu(t)||ep(t)||tp(t)||np(t))}var va,fS,rp=p(()=>{Fe();T();Tt();va=class extends we{},fS=["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 ba=p(()=>{W();rp();Fe()});var op=p(()=>{});var ip=p(()=>{op()});var xa,Or,Aa,IS,iR,Qt,Jt,sp,ap=p(()=>{xa="(true|false)",Or="(0|[1-9][0-9]*)",Aa="(.*)",IS="(?!.*)",iR=`^${xa}$`,Qt=`^${Or}$`,Jt=`^${Aa}$`,sp=`^${IS}$`});var Dr=p(()=>{ap()});var dp=p(()=>{});var lp=p(()=>{});var up=p(()=>{dp();lp()});function pp(t,e){return t.includes(e)}function cp(t){return[...new Set(t)]}function AS(t,e){return t.filter(n=>e.includes(n))}function RS(t,e){return t.reduce((n,r)=>AS(n,r),e)}function mp(t){return t.length===1?t[0]:t.length>1?RS(t.slice(1),t[0]):[]}function fp(t){let e=[];for(let n of t)e.push(...n);return e}var gp=p(()=>{});var Nr=p(()=>{gp()});function Yt(t){return h({[w]:"Any"},t)}var hp=p(()=>{Lt();T()});var Fr=p(()=>{hp()});function qn(t,e){return h({[w]:"Array",type:"array",items:t},e)}var Sp=p(()=>{R();T()});var Lr=p(()=>{Sp()});function yp(t){return h({[w]:"Argument",index:t})}var kp=p(()=>{R();T()});var Ra=p(()=>{kp()});function jn(t,e){return h({[w]:"AsyncIterator",type:"AsyncIterator",items:t},e)}var vp=p(()=>{T();R()});var Wr=p(()=>{vp()});function Z(t,e,n){return h({[w]:"Computed",target:t,parameters:e},n)}var Pp=p(()=>{Lt();Tr()});var Xt=p(()=>{Pp()});function TS(t,e){let{[e]:n,...r}=t;return r}function ie(t,e){return e.reduce((n,r)=>TS(n,r),t)}var Fo=p(()=>{});var Kt=p(()=>{Fo()});function L(t){return h({[w]:"Never",not:{}},t)}var wp=p(()=>{R();T()});var Re=p(()=>{wp()});var Ip=p(()=>{});function B(t){return h({[w]:"MappedResult",properties:t})}var Ta=p(()=>{R();T()});function Gn(t,e,n){return h({[w]:"Constructor",type:"Constructor",parameters:t,returns:e},n)}var bp=p(()=>{R();T()});var Br=p(()=>{bp()});function Ct(t,e,n){return h({[w]:"Function",type:"Function",parameters:t,returns:e},n)}var xp=p(()=>{R();T()});var In=p(()=>{xp()});function Ur(t,e){return h({[w]:"Union",anyOf:t},e)}var Ca=p(()=>{R();T()});function CS(t){return t.some(e=>Ue(e))}function Ap(t){return t.map(e=>Ue(e)?MS(e):e)}function MS(t){return ie(t,[Ae])}function _S(t,e){return CS(t)?Ee(Ur(Ap(t),e)):Ur(Ap(t),e)}function Mt(t,e){return t.length===1?h(t[0],e):t.length===0?L(e):_S(t,e)}var Rp=p(()=>{R();T();Kt();Re();Vt();Ca();W()});var Tp=p(()=>{});function V(t,e){return t.length===0?L(e):t.length===1?h(t[0],e):Ur(t,e)}var Cp=p(()=>{Re();R();Ca()});var ye=p(()=>{Rp();Tp();Cp()});function ES(t){return t.replace(/\\\$/g,"$").replace(/\\\*/g,"*").replace(/\\\^/g,"^").replace(/\\\|/g,"|").replace(/\\\(/g,"(").replace(/\\\)/g,")")}function Ma(t,e,n){return t[e]===n&&t.charCodeAt(e-1)!==92}function qt(t,e){return Ma(t,e,"(")}function Kr(t,e){return Ma(t,e,")")}function Mp(t,e){return Ma(t,e,"|")}function $S(t){if(!(qt(t,0)&&Kr(t,t.length-1)))return!1;let e=0;for(let n=0;n<t.length;n++)if(qt(t,n)&&(e+=1),Kr(t,n)&&(e-=1),e===0&&n!==t.length-1)return!1;return!0}function OS(t){return t.slice(1,t.length-1)}function DS(t){let e=0;for(let n=0;n<t.length;n++)if(qt(t,n)&&(e+=1),Kr(t,n)&&(e-=1),Mp(t,n)&&e===0)return!0;return!1}function NS(t){for(let e=0;e<t.length;e++)if(qt(t,e))return!0;return!1}function FS(t){let[e,n]=[0,0],r=[];for(let i=0;i<t.length;i++)if(qt(t,i)&&(e+=1),Kr(t,i)&&(e-=1),Mp(t,i)&&e===0){let s=t.slice(n,i);s.length>0&&r.push(Hn(s)),n=i+1}let o=t.slice(n);return o.length>0&&r.push(Hn(o)),r.length===0?{type:"const",const:""}:r.length===1?r[0]:{type:"or",expr:r}}function LS(t){function e(o,i){if(!qt(o,i))throw new Lo("TemplateLiteralParser: Index must point to open parens");let s=0;for(let a=i;a<o.length;a++)if(qt(o,a)&&(s+=1),Kr(o,a)&&(s-=1),s===0)return[i,a];throw new Lo("TemplateLiteralParser: Unclosed group parens in expression")}function n(o,i){for(let s=i;s<o.length;s++)if(qt(o,s))return[i,s];return[i,o.length]}let r=[];for(let o=0;o<t.length;o++)if(qt(t,o)){let[i,s]=e(t,o),a=t.slice(i,s+1);r.push(Hn(a)),o=s}else{let[i,s]=n(t,o),a=t.slice(i,s);a.length>0&&r.push(Hn(a)),o=s-1}return r.length===0?{type:"const",const:""}:r.length===1?r[0]:{type:"and",expr:r}}function Hn(t){return $S(t)?Hn(OS(t)):DS(t)?FS(t):NS(t)?LS(t):{type:"const",const:ES(t)}}function zn(t){return Hn(t.slice(1,t.length-1))}var Lo,Wo=p(()=>{Tt();Lo=class extends we{}});function WS(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 BS(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 US(t){return t.type==="const"&&t.const===".*"}function bn(t){return WS(t)||US(t)?!1:BS(t)?!0:t.type==="and"?t.expr.every(e=>bn(e)):t.type==="or"?t.expr.every(e=>bn(e)):t.type==="const"?!0:(()=>{throw new _a("Unknown expression type")})()}function _p(t){let e=zn(t.pattern);return bn(e)}var _a,Ea=p(()=>{Wo();Tt();_a=class extends we{}});function*Ep(t){if(t.length===1)return yield*t[0];for(let e of t[0])for(let n of Ep(t.slice(1)))yield`${e}${n}`}function*KS(t){return yield*Ep(t.expr.map(e=>[...Vr(e)]))}function*VS(t){for(let e of t.expr)yield*Vr(e)}function*qS(t){return yield t.const}function*Vr(t){return t.type==="and"?yield*KS(t):t.type==="or"?yield*VS(t):t.type==="const"?yield*qS(t):(()=>{throw new $a("Unknown expression")})()}function Bo(t){let e=zn(t.pattern);return bn(e)?[...Vr(e)]:[]}var $a,Oa=p(()=>{Ea();Wo();Tt();$a=class extends we{}});function K(t,e){return h({[w]:"Literal",const:t,type:typeof t},e)}var $p=p(()=>{R();T()});var Ke=p(()=>{$p()});function Uo(t){return h({[w]:"Boolean",type:"boolean"},t)}var Op=p(()=>{T();Lt()});var Ko=p(()=>{Op()});function Qn(t){return h({[w]:"BigInt",type:"bigint"},t)}var Dp=p(()=>{T();Lt()});var qr=p(()=>{Dp()});function st(t){return h({[w]:"Number",type:"number"},t)}var Np=p(()=>{R();T()});var xn=p(()=>{Np()});function bt(t){return h({[w]:"String",type:"string"},t)}var Fp=p(()=>{R();T()});var Jn=p(()=>{Fp()});function*jS(t){let e=t.trim().replace(/"|'/g,"");return e==="boolean"?yield Uo():e==="number"?yield st():e==="bigint"?yield Qn():e==="string"?yield bt():yield(()=>{let n=e.split("|").map(r=>K(r.trim()));return n.length===0?L():n.length===1?n[0]:Mt(n)})()}function*GS(t){if(t[1]!=="{"){let e=K("$"),n=Da(t.slice(1));return yield*[e,...n]}for(let e=2;e<t.length;e++)if(t[e]==="}"){let n=jS(t.slice(2,e)),r=Da(t.slice(e+1));return yield*[...n,...r]}yield K(t)}function*Da(t){for(let e=0;e<t.length;e++)if(t[e]==="$"){let n=K(t.slice(0,e)),r=GS(t.slice(e));return yield*[n,...r]}yield K(t)}function Lp(t){return[...Da(t)]}var Na=p(()=>{Ke();Ko();qr();xn();Jn();ye();Re()});function HS(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Wp(t,e){return Ye(t)?t.pattern.slice(1,t.pattern.length-1):F(t)?`(${t.anyOf.map(n=>Wp(n,e)).join("|")})`:It(t)?`${e}${Or}`:wt(t)?`${e}${Or}`:kn(t)?`${e}${Or}`:Bt(t)?`${e}${Aa}`:Qe(t)?`${e}${HS(t.const.toString())}`:Wt(t)?`${e}${xa}`:(()=>{throw new Fa(`Unexpected Kind '${t[w]}'`)})()}function La(t){return`^${t.map(e=>Wp(e,"")).join("")}$`}var Fa,Wa=p(()=>{Dr();T();Tt();W();Fa=class extends we{}});function An(t){let n=Bo(t).map(r=>K(r));return Mt(n)}var Bp=p(()=>{ye();Ke();Oa()});function Vo(t,e){let n=Q(t)?La(Lp(t)):La(t);return h({[w]:"TemplateLiteral",type:"string",pattern:n},e)}var Up=p(()=>{R();Na();Wa();Fe();T()});var jt=p(()=>{Ea();Oa();Na();Wo();Wa();Bp();Up()});function zS(t){return Bo(t).map(n=>n.toString())}function QS(t){let e=[];for(let n of t)e.push(...Ve(n));return e}function JS(t){return[t.toString()]}function Ve(t){return[...new Set(Ye(t)?zS(t):F(t)?QS(t.anyOf):Qe(t)?JS(t.const):It(t)?["[number]"]:wt(t)?["[number]"]:[])]}var qo=p(()=>{jt();W()});function YS(t,e,n){let r={};for(let o of Object.getOwnPropertyNames(e))r[o]=Zt(t,Ve(e[o]),n);return r}function XS(t,e,n){return YS(t,e.properties,n)}function Kp(t,e,n){let r=XS(t,e,n);return B(r)}var Ba=p(()=>{Pe();qo();_t()});function qp(t,e){return t.map(n=>jp(n,e))}function ZS(t){return t.filter(e=>!Ht(e))}function ey(t,e){return jo(ZS(qp(t,e)))}function ty(t){return t.some(e=>Ht(e))?[]:t}function ny(t,e){return Mt(ty(qp(t,e)))}function ry(t,e){return e in t?t[e]:e==="[number]"?Mt(t):L()}function oy(t,e){return e==="[number]"?t:L()}function iy(t,e){return e in t?t[e]:L()}function jp(t,e){return oe(t)?ey(t.allOf,e):F(t)?ny(t.anyOf,e):Xe(t)?ry(t.items??[],e):yt(t)?oy(t.items,e):fe(t)?iy(t.properties,e):L()}function Ua(t,e){return e.map(n=>jp(t,n))}function Vp(t,e){return Mt(Ua(t,e))}function Zt(t,e,n){if(de(t)||de(e)){let r="Index types using Ref parameters require both Type and Key to be of TSchema";if(!Ze(t)||!Ze(e))throw new we(r);return Z("Index",[t,e])}return te(e)?Kp(t,e,n):Je(e)?Gp(t,e,n):h(Ze(e)?Vp(t,Ve(e)):Vp(t,e),n)}var Ka=p(()=>{R();Tt();Xt();Re();at();ye();qo();Va();Ba();W()});function sy(t,e,n){return{[e]:Zt(t,[e],ee(n))}}function ay(t,e,n){return e.reduce((r,o)=>({...r,...sy(t,o,n)}),{})}function dy(t,e,n){return ay(t,e.keys,n)}function Gp(t,e,n){let r=dy(t,e,n);return B(r)}var Va=p(()=>{Ka();Pe();Be()});var _t=p(()=>{Va();Ba();qo();Ka()});function Yn(t,e){return h({[w]:"Iterator",type:"Iterator",items:t},e)}var Hp=p(()=>{R();T()});var jr=p(()=>{Hp()});function ly(t){return globalThis.Object.keys(t).filter(e=>!Ue(t[e]))}function uy(t,e){let n=ly(t),r=n.length>0?{[w]:"Object",type:"object",required:n,properties:t}:{[w]:"Object",type:"object",properties:t};return h(r,e)}var H,zp=p(()=>{R();T();W();H=uy});var et=p(()=>{zp()});function Go(t,e){return h({[w]:"Promise",type:"Promise",item:t},e)}var Qp=p(()=>{R();T()});var Ho=p(()=>{Qp()});function py(t){return h(ie(t,[St]))}function cy(t){return h({...t,[St]:"Readonly"})}function my(t,e){return e===!1?py(t):cy(t)}function qe(t,e){let n=e??!0;return te(t)?Jp(t,n):my(t,n)}var qa=p(()=>{R();T();Kt();ja();W()});function fy(t,e){let n={};for(let r of globalThis.Object.getOwnPropertyNames(t))n[r]=qe(t[r],e);return n}function gy(t,e){return fy(t.properties,e)}function Jp(t,e){let n=gy(t,e);return B(n)}var ja=p(()=>{Pe();qa()});var Rn=p(()=>{ja();qa()});function dt(t,e){return h(t.length>0?{[w]:"Tuple",type:"array",items:t,additionalItems:!1,minItems:t.length,maxItems:t.length}:{[w]:"Tuple",type:"array",minItems:t.length,maxItems:t.length},e)}var Yp=p(()=>{R();T()});var en=p(()=>{Yp()});function Xp(t,e){return t in e?lt(t,e[t]):B(e)}function hy(t){return{[t]:K(t)}}function Sy(t){let e={};for(let n of t)e[n]=K(n);return e}function yy(t,e){return pp(e,t)?hy(t):Sy(e)}function ky(t,e){let n=yy(t,e);return Xp(t,n)}function Gr(t,e){return e.map(n=>lt(t,n))}function vy(t,e){let n={};for(let r of globalThis.Object.getOwnPropertyNames(e))n[r]=lt(t,e[r]);return n}function lt(t,e){let n={...e};return Ue(e)?Ee(lt(t,ie(e,[Ae]))):Vn(e)?qe(lt(t,ie(e,[St]))):te(e)?Xp(t,e.properties):Je(e)?ky(t,e.keys):vt(e)?Gn(Gr(t,e.parameters),lt(t,e.returns),n):Pt(e)?Ct(Gr(t,e.parameters),lt(t,e.returns),n):yn(e)?jn(lt(t,e.items),n):vn(e)?Yn(lt(t,e.items),n):oe(e)?$e(Gr(t,e.allOf),n):F(e)?V(Gr(t,e.anyOf),n):Xe(e)?dt(Gr(t,e.items??[]),n):fe(e)?H(vy(t,e.properties),n):yt(e)?qn(lt(t,e.items),n):Pn(e)?Go(lt(t,e.item),n):e}function Py(t,e){let n={};for(let r of t)n[r]=lt(r,e);return n}function Zp(t,e,n){let r=Ze(t)?Ve(t):t,o=e({[w]:"MappedKey",keys:r}),i=Py(r,o);return H(i,n)}var ec=p(()=>{T();Kt();Lr();Wr();Br();In();_t();at();jr();Ke();et();Vt();Ho();Rn();en();ye();Nr();Ta();W()});var Pe=p(()=>{Ip();Ta();ec()});function wy(t){return h(ie(t,[Ae]))}function Iy(t){return h({...t,[Ae]:"Optional"})}function by(t,e){return e===!1?wy(t):Iy(t)}function Ee(t,e){let n=e??!0;return te(t)?tc(t,n):by(t,n)}var Ga=p(()=>{R();T();Kt();Ha();W()});function xy(t,e){let n={};for(let r of globalThis.Object.getOwnPropertyNames(t))n[r]=Ee(t[r],e);return n}function Ay(t,e){return xy(t.properties,e)}function tc(t,e){let n=Ay(t,e);return B(n)}var Ha=p(()=>{Pe();Ga()});var Vt=p(()=>{Ha();Ga()});function Hr(t,e={}){let n=t.every(o=>fe(o)),r=Ze(e.unevaluatedProperties)?{unevaluatedProperties:e.unevaluatedProperties}:{};return h(e.unevaluatedProperties===!1||Ze(e.unevaluatedProperties)||n?{...r,[w]:"Intersect",type:"object",allOf:t}:{...r,[w]:"Intersect",allOf:t},e)}var za=p(()=>{R();T();W()});function Ry(t){return t.every(e=>Ue(e))}function Ty(t){return ie(t,[Ae])}function nc(t){return t.map(e=>Ue(e)?Ty(e):e)}function Cy(t,e){return Ry(t)?Ee(Hr(nc(t),e)):Hr(nc(t),e)}function jo(t,e={}){if(t.length===1)return h(t[0],e);if(t.length===0)return L(e);if(t.some(n=>zt(n)))throw new Error("Cannot intersect transform types");return Cy(t,e)}var rc=p(()=>{T();R();Kt();Re();Vt();za();W()});var oc=p(()=>{});function $e(t,e){if(t.length===1)return h(t[0],e);if(t.length===0)return L(e);if(t.some(n=>zt(n)))throw new Error("Cannot intersect transform types");return Hr(t,e)}var ic=p(()=>{R();Re();za();W()});var at=p(()=>{rc();oc();ic()});function Et(...t){let[e,n]=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({[w]:"Ref",$ref:e},n)}var sc=p(()=>{Tt();R();T()});var Tn=p(()=>{sc()});function My(t,e){return Z("Awaited",[Z(t,e)])}function _y(t){return Z("Awaited",[Et(t)])}function Ey(t){return $e(ac(t))}function $y(t){return V(ac(t))}function Oy(t){return Xn(t)}function ac(t){return t.map(e=>Xn(e))}function Xn(t,e){return h(kt(t)?My(t.target,t.parameters):oe(t)?Ey(t.allOf):F(t)?$y(t.anyOf):Pn(t)?Oy(t.item):de(t)?_y(t.$ref):t,e)}var dc=p(()=>{R();Xt();at();ye();Tn();W()});var zo=p(()=>{dc()});function lc(t){let e=[];for(let n of t)e.push(zr(n));return e}function Dy(t){let e=lc(t);return fp(e)}function Ny(t){let e=lc(t);return mp(e)}function Fy(t){return t.map((e,n)=>n.toString())}function Ly(t){return["[number]"]}function Wy(t){return globalThis.Object.getOwnPropertyNames(t)}function By(t){return Uy?globalThis.Object.getOwnPropertyNames(t).map(n=>n[0]==="^"&&n[n.length-1]==="$"?n.slice(1,n.length-1):n):[]}function zr(t){return oe(t)?Dy(t.allOf):F(t)?Ny(t.anyOf):Xe(t)?Fy(t.items??[]):yt(t)?Ly(t.items):fe(t)?Wy(t.properties):wn(t)?By(t.patternProperties):[]}var Uy,Qa=p(()=>{Nr();W();Uy=!1});function Ky(t,e){return Z("KeyOf",[Z(t,e)])}function Vy(t){return Z("KeyOf",[Et(t)])}function qy(t,e){let n=zr(t),r=jy(n),o=Mt(r);return h(o,e)}function jy(t){return t.map(e=>e==="[number]"?st():K(e))}function Zn(t,e){return kt(t)?Ky(t.target,t.parameters):de(t)?Vy(t.$ref):te(t)?uc(t,e):qy(t,e)}var Ja=p(()=>{R();Ke();xn();Xt();Tn();Qa();ye();Ya();W()});function Gy(t,e){let n={};for(let r of globalThis.Object.getOwnPropertyNames(t))n[r]=Zn(t[r],ee(e));return n}function Hy(t,e){return Gy(t.properties,e)}function uc(t,e){let n=Hy(t,e);return B(n)}var Ya=p(()=>{Pe();Ja();Be()});var pc=p(()=>{});var Qr=p(()=>{Ya();pc();Qa();Ja()});function zy(t){let e=[];for(let n of t)e.push(...zr(n));return cp(e)}function Qy(t){return t.filter(e=>!Ht(e))}function Jy(t,e){let n=[];for(let r of t)n.push(...Ua(r,[e]));return Qy(n)}function Yy(t,e){let n={};for(let r of e)n[r]=jo(Jy(t,r));return n}function cc(t,e){let n=zy(t),r=Yy(t,n);return H(r,e)}var mc=p(()=>{at();_t();Qr();et();Nr();W()});var Xa=p(()=>{mc()});function Qo(t){return h({[w]:"Date",type:"Date"},t)}var fc=p(()=>{T();R()});var Jo=p(()=>{fc()});function Yo(t){return h({[w]:"Null",type:"null"},t)}var gc=p(()=>{R();T()});var Xo=p(()=>{gc()});function Zo(t){return h({[w]:"Symbol",type:"symbol"},t)}var hc=p(()=>{R();T()});var ei=p(()=>{hc()});function ti(t){return h({[w]:"Undefined",type:"undefined"},t)}var Sc=p(()=>{R();T()});var ni=p(()=>{Sc()});function ri(t){return h({[w]:"Uint8Array",type:"Uint8Array"},t)}var yc=p(()=>{R();T()});var oi=p(()=>{yc()});function tn(t){return h({[w]:"Unknown"},t)}var kc=p(()=>{R();T()});var er=p(()=>{kc()});function Xy(t){return t.map(e=>Za(e,!1))}function Zy(t){let e={};for(let n of globalThis.Object.getOwnPropertyNames(t))e[n]=qe(Za(t[n],!1));return e}function ii(t,e){return e===!0?t:qe(t)}function Za(t,e){return pa(t)?ii(Yt(),e):ma(t)?ii(Yt(),e):ce(t)?qe(dt(Xy(t))):Ft(t)?ri():Sn(t)?Qo():j(t)?ii(H(Zy(t)),e):ca(t)?ii(Ct([],tn()),e):me(t)?ti():fa(t)?Yo():ga(t)?Zo():xr(t)?Qn():ze(t)?K(t):Nt(t)?K(t):Q(t)?K(t):H({})}function vc(t,e){return h(Za(t,!0),e)}var Pc=p(()=>{Fr();qr();Jo();In();Ke();Xo();et();ei();en();Rn();ni();oi();er();Lt();Fe()});var ed=p(()=>{Pc()});function wc(t,e){return vt(t)?dt(t.parameters,e):L(e)}var Ic=p(()=>{en();Re();W()});var td=p(()=>{Ic()});function bc(t,e){if(me(t))throw new Error("Enum undefined or empty");let n=globalThis.Object.getOwnPropertyNames(t).filter(i=>isNaN(i)).map(i=>t[i]),o=[...new Set(n)].map(i=>K(i));return V(o,{...e,[it]:"Enum"})}var xc=p(()=>{Ke();T();ye();Fe()});var nd=p(()=>{xc()});function ut(t){return t===S.False?t:S.True}function tr(t){throw new od(t)}function ke(t){return m.IsNever(t)||m.IsIntersect(t)||m.IsUnion(t)||m.IsUnknown(t)||m.IsAny(t)}function ve(t,e){return m.IsNever(e)?Ec(t,e):m.IsIntersect(e)?si(t,e):m.IsUnion(e)?dd(t,e):m.IsUnknown(e)?Nc(t,e):m.IsAny(e)?ad(t,e):tr("StructuralRight")}function ad(t,e){return S.True}function ek(t,e){return m.IsIntersect(e)?si(t,e):m.IsUnion(e)&&e.anyOf.some(n=>m.IsAny(n)||m.IsUnknown(n))?S.True:m.IsUnion(e)?S.Union:m.IsUnknown(e)||m.IsAny(e)?S.True:S.Union}function tk(t,e){return m.IsUnknown(t)?S.False:m.IsAny(t)?S.Union:m.IsNever(t)?S.True:S.False}function nk(t,e){return m.IsObject(e)&&ai(e)?S.True:ke(e)?ve(t,e):m.IsArray(e)?ut(z(t.items,e.items)):S.False}function rk(t,e){return ke(e)?ve(t,e):m.IsAsyncIterator(e)?ut(z(t.items,e.items)):S.False}function ok(t,e){return ke(e)?ve(t,e):m.IsObject(e)?Oe(t,e):m.IsRecord(e)?pt(t,e):m.IsBigInt(e)?S.True:S.False}function Mc(t,e){return m.IsLiteralBoolean(t)||m.IsBoolean(t)?S.True:S.False}function ik(t,e){return ke(e)?ve(t,e):m.IsObject(e)?Oe(t,e):m.IsRecord(e)?pt(t,e):m.IsBoolean(e)?S.True:S.False}function sk(t,e){return ke(e)?ve(t,e):m.IsObject(e)?Oe(t,e):m.IsConstructor(e)?t.parameters.length>e.parameters.length?S.False:t.parameters.every((n,r)=>ut(z(e.parameters[r],n))===S.True)?ut(z(t.returns,e.returns)):S.False:S.False}function ak(t,e){return ke(e)?ve(t,e):m.IsObject(e)?Oe(t,e):m.IsRecord(e)?pt(t,e):m.IsDate(e)?S.True:S.False}function dk(t,e){return ke(e)?ve(t,e):m.IsObject(e)?Oe(t,e):m.IsFunction(e)?t.parameters.length>e.parameters.length?S.False:t.parameters.every((n,r)=>ut(z(e.parameters[r],n))===S.True)?ut(z(t.returns,e.returns)):S.False:S.False}function _c(t,e){return m.IsLiteral(t)&&_e.IsNumber(t.const)||m.IsNumber(t)||m.IsInteger(t)?S.True:S.False}function lk(t,e){return m.IsInteger(e)||m.IsNumber(e)?S.True:ke(e)?ve(t,e):m.IsObject(e)?Oe(t,e):m.IsRecord(e)?pt(t,e):S.False}function si(t,e){return e.allOf.every(n=>z(t,n)===S.True)?S.True:S.False}function uk(t,e){return t.allOf.some(n=>z(n,e)===S.True)?S.True:S.False}function pk(t,e){return ke(e)?ve(t,e):m.IsIterator(e)?ut(z(t.items,e.items)):S.False}function ck(t,e){return m.IsLiteral(e)&&e.const===t.const?S.True:ke(e)?ve(t,e):m.IsObject(e)?Oe(t,e):m.IsRecord(e)?pt(t,e):m.IsString(e)?Dc(t,e):m.IsNumber(e)?$c(t,e):m.IsInteger(e)?_c(t,e):m.IsBoolean(e)?Mc(t,e):S.False}function Ec(t,e){return S.False}function mk(t,e){return S.True}function Ac(t){let[e,n]=[t,0];for(;m.IsNot(e);)e=e.not,n+=1;return n%2===0?e:tn()}function fk(t,e){return m.IsNot(t)?z(Ac(t),e):m.IsNot(e)?z(t,Ac(e)):tr("Invalid fallthrough for Not")}function gk(t,e){return ke(e)?ve(t,e):m.IsObject(e)?Oe(t,e):m.IsRecord(e)?pt(t,e):m.IsNull(e)?S.True:S.False}function $c(t,e){return m.IsLiteralNumber(t)||m.IsNumber(t)||m.IsInteger(t)?S.True:S.False}function hk(t,e){return ke(e)?ve(t,e):m.IsObject(e)?Oe(t,e):m.IsRecord(e)?pt(t,e):m.IsInteger(e)||m.IsNumber(e)?S.True:S.False}function je(t,e){return Object.getOwnPropertyNames(t.properties).length===e}function Rc(t){return ai(t)}function Tc(t){return je(t,0)||je(t,1)&&"description"in t.properties&&m.IsUnion(t.properties.description)&&t.properties.description.anyOf.length===2&&(m.IsString(t.properties.description.anyOf[0])&&m.IsUndefined(t.properties.description.anyOf[1])||m.IsString(t.properties.description.anyOf[1])&&m.IsUndefined(t.properties.description.anyOf[0]))}function rd(t){return je(t,0)}function Cc(t){return je(t,0)}function Sk(t){return je(t,0)}function yk(t){return je(t,0)}function kk(t){return ai(t)}function vk(t){let e=st();return je(t,0)||je(t,1)&&"length"in t.properties&&ut(z(t.properties.length,e))===S.True}function Pk(t){return je(t,0)}function ai(t){let e=st();return je(t,0)||je(t,1)&&"length"in t.properties&&ut(z(t.properties.length,e))===S.True}function wk(t){let e=Ct([Yt()],Yt());return je(t,0)||je(t,1)&&"then"in t.properties&&ut(z(t.properties.then,e))===S.True}function Oc(t,e){return z(t,e)===S.False||m.IsOptional(t)&&!m.IsOptional(e)?S.False:S.True}function Oe(t,e){return m.IsUnknown(t)?S.False:m.IsAny(t)?S.Union:m.IsNever(t)||m.IsLiteralString(t)&&Rc(e)||m.IsLiteralNumber(t)&&rd(e)||m.IsLiteralBoolean(t)&&Cc(e)||m.IsSymbol(t)&&Tc(e)||m.IsBigInt(t)&&Sk(e)||m.IsString(t)&&Rc(e)||m.IsSymbol(t)&&Tc(e)||m.IsNumber(t)&&rd(e)||m.IsInteger(t)&&rd(e)||m.IsBoolean(t)&&Cc(e)||m.IsUint8Array(t)&&kk(e)||m.IsDate(t)&&yk(e)||m.IsConstructor(t)&&Pk(e)||m.IsFunction(t)&&vk(e)?S.True:m.IsRecord(t)&&m.IsString(id(t))?e[it]==="Record"?S.True:S.False:m.IsRecord(t)&&m.IsNumber(id(t))&&je(e,0)?S.True:S.False}function Ik(t,e){return ke(e)?ve(t,e):m.IsRecord(e)?pt(t,e):m.IsObject(e)?(()=>{for(let n of Object.getOwnPropertyNames(e.properties)){if(!(n in t.properties)&&!m.IsOptional(e.properties[n]))return S.False;if(m.IsOptional(e.properties[n]))return S.True;if(Oc(t.properties[n],e.properties[n])===S.False)return S.False}return S.True})():S.False}function bk(t,e){return ke(e)?ve(t,e):m.IsObject(e)&&wk(e)?S.True:m.IsPromise(e)?ut(z(t.item,e.item)):S.False}function id(t){return Qt in t.patternProperties?st():Jt in t.patternProperties?bt():tr("Unknown record key pattern")}function sd(t){return Qt in t.patternProperties?t.patternProperties[Qt]:Jt in t.patternProperties?t.patternProperties[Jt]:tr("Unable to get record value schema")}function pt(t,e){let[n,r]=[id(e),sd(e)];return m.IsLiteralString(t)&&m.IsNumber(n)&&ut(z(t,r))===S.True?S.True:m.IsUint8Array(t)&&m.IsNumber(n)||m.IsString(t)&&m.IsNumber(n)||m.IsArray(t)&&m.IsNumber(n)?z(t,r):m.IsObject(t)?(()=>{for(let o of Object.getOwnPropertyNames(t.properties))if(Oc(r,t.properties[o])===S.False)return S.False;return S.True})():S.False}function xk(t,e){return ke(e)?ve(t,e):m.IsObject(e)?Oe(t,e):m.IsRecord(e)?z(sd(t),sd(e)):S.False}function Ak(t,e){let n=m.IsRegExp(t)?bt():t,r=m.IsRegExp(e)?bt():e;return z(n,r)}function Dc(t,e){return m.IsLiteral(t)&&_e.IsString(t.const)||m.IsString(t)?S.True:S.False}function Rk(t,e){return ke(e)?ve(t,e):m.IsObject(e)?Oe(t,e):m.IsRecord(e)?pt(t,e):m.IsString(e)?S.True:S.False}function Tk(t,e){return ke(e)?ve(t,e):m.IsObject(e)?Oe(t,e):m.IsRecord(e)?pt(t,e):m.IsSymbol(e)?S.True:S.False}function Ck(t,e){return m.IsTemplateLiteral(t)?z(An(t),e):m.IsTemplateLiteral(e)?z(t,An(e)):tr("Invalid fallthrough for TemplateLiteral")}function Mk(t,e){return m.IsArray(e)&&t.items!==void 0&&t.items.every(n=>z(n,e.items)===S.True)}function _k(t,e){return m.IsNever(t)?S.True:m.IsUnknown(t)?S.False:m.IsAny(t)?S.Union:S.False}function Ek(t,e){return ke(e)?ve(t,e):m.IsObject(e)&&ai(e)||m.IsArray(e)&&Mk(t,e)?S.True:m.IsTuple(e)?_e.IsUndefined(t.items)&&!_e.IsUndefined(e.items)||!_e.IsUndefined(t.items)&&_e.IsUndefined(e.items)?S.False:_e.IsUndefined(t.items)&&!_e.IsUndefined(e.items)||t.items.every((n,r)=>z(n,e.items[r])===S.True)?S.True:S.False:S.False}function $k(t,e){return ke(e)?ve(t,e):m.IsObject(e)?Oe(t,e):m.IsRecord(e)?pt(t,e):m.IsUint8Array(e)?S.True:S.False}function Ok(t,e){return ke(e)?ve(t,e):m.IsObject(e)?Oe(t,e):m.IsRecord(e)?pt(t,e):m.IsVoid(e)?Fk(t,e):m.IsUndefined(e)?S.True:S.False}function dd(t,e){return e.anyOf.some(n=>z(t,n)===S.True)?S.True:S.False}function Dk(t,e){return t.anyOf.every(n=>z(n,e)===S.True)?S.True:S.False}function Nc(t,e){return S.True}function Nk(t,e){return m.IsNever(e)?Ec(t,e):m.IsIntersect(e)?si(t,e):m.IsUnion(e)?dd(t,e):m.IsAny(e)?ad(t,e):m.IsString(e)?Dc(t,e):m.IsNumber(e)?$c(t,e):m.IsInteger(e)?_c(t,e):m.IsBoolean(e)?Mc(t,e):m.IsArray(e)?tk(t,e):m.IsTuple(e)?_k(t,e):m.IsObject(e)?Oe(t,e):m.IsUnknown(e)?S.True:S.False}function Fk(t,e){return m.IsUndefined(t)||m.IsUndefined(t)?S.True:S.False}function Lk(t,e){return m.IsIntersect(e)?si(t,e):m.IsUnion(e)?dd(t,e):m.IsUnknown(e)?Nc(t,e):m.IsAny(e)?ad(t,e):m.IsObject(e)?Oe(t,e):m.IsVoid(e)?S.True:S.False}function z(t,e){return m.IsTemplateLiteral(t)||m.IsTemplateLiteral(e)?Ck(t,e):m.IsRegExp(t)||m.IsRegExp(e)?Ak(t,e):m.IsNot(t)||m.IsNot(e)?fk(t,e):m.IsAny(t)?ek(t,e):m.IsArray(t)?nk(t,e):m.IsBigInt(t)?ok(t,e):m.IsBoolean(t)?ik(t,e):m.IsAsyncIterator(t)?rk(t,e):m.IsConstructor(t)?sk(t,e):m.IsDate(t)?ak(t,e):m.IsFunction(t)?dk(t,e):m.IsInteger(t)?lk(t,e):m.IsIntersect(t)?uk(t,e):m.IsIterator(t)?pk(t,e):m.IsLiteral(t)?ck(t,e):m.IsNever(t)?mk(t,e):m.IsNull(t)?gk(t,e):m.IsNumber(t)?hk(t,e):m.IsObject(t)?Ik(t,e):m.IsRecord(t)?xk(t,e):m.IsString(t)?Rk(t,e):m.IsSymbol(t)?Tk(t,e):m.IsTuple(t)?Ek(t,e):m.IsPromise(t)?bk(t,e):m.IsUint8Array(t)?$k(t,e):m.IsUndefined(t)?Ok(t,e):m.IsUnion(t)?Dk(t,e):m.IsUnknown(t)?Nk(t,e):m.IsVoid(t)?Lk(t,e):tr(`Unknown left type operand '${t[w]}'`)}function nn(t,e){return z(t,e)}var od,S,ld=p(()=>{Fr();In();xn();Jn();er();jt();Dr();T();Tt();ba();od=class extends we{};(function(t){t[t.Union=0]="Union",t[t.True=1]="True",t[t.False=2]="False"})(S||(S={}))});function Wk(t,e,n,r,o){let i={};for(let s of globalThis.Object.getOwnPropertyNames(t))i[s]=nr(t[s],e,n,r,ee(o));return i}function Bk(t,e,n,r,o){return Wk(t.properties,e,n,r,o)}function Fc(t,e,n,r,o){let i=Bk(t,e,n,r,o);return B(i)}var ud=p(()=>{Pe();di();Be()});function Uk(t,e,n,r){let o=nn(t,e);return o===S.Union?V([n,r]):o===S.True?n:r}function nr(t,e,n,r,o){return te(t)?Fc(t,e,n,r,o):Je(t)?h(Lc(t,e,n,r,o)):h(Uk(t,e,n,r),o)}var di=p(()=>{R();ye();ld();pd();ud();W()});function Kk(t,e,n,r,o){return{[t]:nr(K(t),e,n,r,ee(o))}}function Vk(t,e,n,r,o){return t.reduce((i,s)=>({...i,...Kk(s,e,n,r,o)}),{})}function qk(t,e,n,r,o){return Vk(t.keys,e,n,r,o)}function Lc(t,e,n,r,o){let i=qk(t,e,n,r,o);return B(i)}var pd=p(()=>{Pe();Ke();di();Be()});var Wc=p(()=>{});var Jr=p(()=>{ld();pd();ud();Wc();di()});function Bc(t,e){return rr(An(t),e)}var cd=p(()=>{li();jt()});function jk(t,e){let n=t.filter(r=>nn(r,e)===S.False);return n.length===1?n[0]:V(n)}function rr(t,e,n={}){return Ye(t)?h(Bc(t,e),n):te(t)?h(Uc(t,e),n):h(F(t)?jk(t.anyOf,e):nn(t,e)!==S.False?L():t,n)}var li=p(()=>{R();ye();Re();Jr();md();cd();W()});function Gk(t,e){let n={};for(let r of globalThis.Object.getOwnPropertyNames(t))n[r]=rr(t[r],e);return n}function Hk(t,e){return Gk(t.properties,e)}function Uc(t,e){let n=Hk(t,e);return B(n)}var md=p(()=>{Pe();li()});var fd=p(()=>{md();cd();li()});function Kc(t,e){return or(An(t),e)}var gd=p(()=>{ui();jt()});function zk(t,e){let n=t.filter(r=>nn(r,e)!==S.False);return n.length===1?n[0]:V(n)}function or(t,e,n){return Ye(t)?h(Kc(t,e),n):te(t)?h(Vc(t,e),n):h(F(t)?zk(t.anyOf,e):nn(t,e)!==S.False?t:L(),n)}var ui=p(()=>{R();ye();Re();Jr();hd();gd();W()});function Qk(t,e){let n={};for(let r of globalThis.Object.getOwnPropertyNames(t))n[r]=or(t[r],e);return n}function Jk(t,e){return Qk(t.properties,e)}function Vc(t,e){let n=Jk(t,e);return B(n)}var hd=p(()=>{Pe();ui()});var Sd=p(()=>{hd();gd();ui()});function qc(t,e){return vt(t)?h(t.returns,e):L(e)}var jc=p(()=>{R();Re();W()});var yd=p(()=>{jc()});function pi(t){return qe(Ee(t))}var Gc=p(()=>{Rn();Vt()});var ci=p(()=>{Gc()});function Cn(t,e,n){return h({[w]:"Record",type:"object",patternProperties:{[t]:e}},n)}function kd(t,e,n){let r={};for(let o of t)r[o]=e;return H(r,{...n,[it]:"Record"})}function Yk(t,e,n){return _p(t)?kd(Ve(t),e,n):Cn(t.pattern,e,n)}function Xk(t,e,n){return kd(Ve(V(t)),e,n)}function Zk(t,e,n){return kd([t.toString()],e,n)}function ev(t,e,n){return Cn(t.source,e,n)}function tv(t,e,n){let r=me(t.pattern)?Jt:t.pattern;return Cn(r,e,n)}function nv(t,e,n){return Cn(Jt,e,n)}function rv(t,e,n){return Cn(sp,e,n)}function ov(t,e,n){return H({true:e,false:e},n)}function iv(t,e,n){return Cn(Qt,e,n)}function sv(t,e,n){return Cn(Qt,e,n)}function mi(t,e,n={}){return F(t)?Xk(t.anyOf,e,n):Ye(t)?Yk(t,e,n):Qe(t)?Zk(t.const,e,n):Wt(t)?ov(t,e,n):wt(t)?iv(t,e,n):It(t)?sv(t,e,n):ka(t)?ev(t,e,n):Bt(t)?tv(t,e,n):Sa(t)?nv(t,e,n):Ht(t)?rv(t,e,n):L(n)}function fi(t){return globalThis.Object.getOwnPropertyNames(t.patternProperties)[0]}function Hc(t){let e=fi(t);return e===Jt?bt():e===Qt?st():bt({pattern:e})}function gi(t){return t.patternProperties[fi(t)]}var zc=p(()=>{R();T();Re();xn();et();Jn();ye();jt();Dr();_t();Fe();W()});var Yr=p(()=>{zc()});function av(t,e){return e.parameters=Xr(t,e.parameters),e.returns=xt(t,e.returns),e}function dv(t,e){return e.parameters=Xr(t,e.parameters),e.returns=xt(t,e.returns),e}function lv(t,e){return e.allOf=Xr(t,e.allOf),e}function uv(t,e){return e.anyOf=Xr(t,e.anyOf),e}function pv(t,e){return me(e.items)||(e.items=Xr(t,e.items)),e}function cv(t,e){return e.items=xt(t,e.items),e}function mv(t,e){return e.items=xt(t,e.items),e}function fv(t,e){return e.items=xt(t,e.items),e}function gv(t,e){return e.item=xt(t,e.item),e}function hv(t,e){let n=vv(t,e.properties);return{...e,...H(n)}}function Sv(t,e){let n=xt(t,Hc(e)),r=xt(t,gi(e)),o=mi(n,r);return{...e,...o}}function yv(t,e){return e.index in t?t[e.index]:tn()}function kv(t,e){let n=Vn(e),r=Ue(e),o=xt(t,e);return n&&r?pi(o):n&&!r?qe(o):!n&&r?Ee(o):o}function vv(t,e){return globalThis.Object.getOwnPropertyNames(e).reduce((n,r)=>({...n,[r]:kv(t,e[r])}),{})}function Xr(t,e){return e.map(n=>xt(t,n))}function xt(t,e){return vt(e)?av(t,e):Pt(e)?dv(t,e):oe(e)?lv(t,e):F(e)?uv(t,e):Xe(e)?pv(t,e):yt(e)?cv(t,e):yn(e)?mv(t,e):vn(e)?fv(t,e):Pn(e)?gv(t,e):fe(e)?hv(t,e):wn(e)?Sv(t,e):ya(e)?yv(t,e):e}function Qc(t,e){return xt(e,Kn(t))}var Jc=p(()=>{$o();er();ci();Rn();Vt();et();Yr();Fe();W()});var vd=p(()=>{Jc()});function Yc(t){return h({[w]:"Integer",type:"integer"},t)}var Xc=p(()=>{R();T()});var Pd=p(()=>{Xc()});function Pv(t,e,n){return{[t]:At(K(t),e,ee(n))}}function wv(t,e,n){return t.reduce((o,i)=>({...o,...Pv(i,e,n)}),{})}function Iv(t,e,n){return wv(t.keys,e,n)}function Zc(t,e,n){let r=Iv(t,e,n);return B(r)}var wd=p(()=>{Pe();Mn();Ke();Be()});function bv(t){let[e,n]=[t.slice(0,1),t.slice(1)];return[e.toLowerCase(),n].join("")}function xv(t){let[e,n]=[t.slice(0,1),t.slice(1)];return[e.toUpperCase(),n].join("")}function Av(t){return t.toUpperCase()}function Rv(t){return t.toLowerCase()}function Tv(t,e,n){let r=zn(t.pattern);if(!bn(r))return{...t,pattern:em(t.pattern,e)};let s=[...Vr(r)].map(l=>K(l)),a=tm(s,e),d=V(a);return Vo([d],n)}function em(t,e){return typeof t=="string"?e==="Uncapitalize"?bv(t):e==="Capitalize"?xv(t):e==="Uppercase"?Av(t):e==="Lowercase"?Rv(t):t:t.toString()}function tm(t,e){return t.map(n=>At(n,e))}function At(t,e,n={}){return Je(t)?Zc(t,e,n):Ye(t)?Tv(t,e,n):F(t)?V(tm(t.anyOf,e),n):Qe(t)?K(em(t.const,e),n):h(t,n)}var Mn=p(()=>{R();jt();wd();Ke();ye();W()});function nm(t,e={}){return At(t,"Capitalize",e)}var rm=p(()=>{Mn()});function om(t,e={}){return At(t,"Lowercase",e)}var im=p(()=>{Mn()});function sm(t,e={}){return At(t,"Uncapitalize",e)}var am=p(()=>{Mn()});function dm(t,e={}){return At(t,"Uppercase",e)}var lm=p(()=>{Mn()});var Id=p(()=>{rm();wd();Mn();im();am();lm()});function Cv(t,e,n){let r={};for(let o of globalThis.Object.getOwnPropertyNames(t))r[o]=rn(t[o],e,ee(n));return r}function Mv(t,e,n){return Cv(t.properties,e,n)}function um(t,e,n){let r=Mv(t,e,n);return B(r)}var bd=p(()=>{Pe();hi();Be()});function _v(t,e){return t.map(n=>xd(n,e))}function Ev(t,e){return t.map(n=>xd(n,e))}function $v(t,e){let{[e]:n,...r}=t;return r}function Ov(t,e){return e.reduce((n,r)=>$v(n,r),t)}function Dv(t,e,n){let r=ie(t,[Se,"$id","required","properties"]),o=Ov(n,e);return H(o,r)}function Nv(t){let e=t.reduce((n,r)=>Do(r)?[...n,K(r)]:n,[]);return V(e)}function xd(t,e){return oe(t)?$e(_v(t.allOf,e)):F(t)?V(Ev(t.anyOf,e)):fe(t)?Dv(t,e,t.properties):H({})}function rn(t,e,n){let r=ce(e)?Nv(e):e,o=Ze(e)?Ve(e):e,i=de(t),s=de(e);return te(t)?um(t,o,n):Je(e)?pm(t,e,n):i&&s?Z("Omit",[t,r],n):!i&&s?Z("Omit",[t,r],n):i&&!s?Z("Omit",[t,r],n):h({...xd(t,o),...n})}var hi=p(()=>{R();Fo();Tr();Xt();Ke();_t();at();ye();et();Ad();bd();W();Fe()});function Fv(t,e,n){return{[e]:rn(t,[e],ee(n))}}function Lv(t,e,n){return e.reduce((r,o)=>({...r,...Fv(t,o,n)}),{})}function Wv(t,e,n){return Lv(t,e.keys,n)}function pm(t,e,n){let r=Wv(t,e,n);return B(r)}var Ad=p(()=>{Pe();hi();Be()});var Si=p(()=>{Ad();bd();hi()});function Bv(t,e,n){let r={};for(let o of globalThis.Object.getOwnPropertyNames(t))r[o]=on(t[o],e,ee(n));return r}function Uv(t,e,n){return Bv(t.properties,e,n)}function cm(t,e,n){let r=Uv(t,e,n);return B(r)}var Rd=p(()=>{Pe();yi();Be()});function Kv(t,e){return t.map(n=>Td(n,e))}function Vv(t,e){return t.map(n=>Td(n,e))}function qv(t,e){let n={};for(let r of e)r in t&&(n[r]=t[r]);return n}function jv(t,e,n){let r=ie(t,[Se,"$id","required","properties"]),o=qv(n,e);return H(o,r)}function Gv(t){let e=t.reduce((n,r)=>Do(r)?[...n,K(r)]:n,[]);return V(e)}function Td(t,e){return oe(t)?$e(Kv(t.allOf,e)):F(t)?V(Vv(t.anyOf,e)):fe(t)?jv(t,e,t.properties):H({})}function on(t,e,n){let r=ce(e)?Gv(e):e,o=Ze(e)?Ve(e):e,i=de(t),s=de(e);return te(t)?cm(t,o,n):Je(e)?mm(t,e,n):i&&s?Z("Pick",[t,r],n):!i&&s?Z("Pick",[t,r],n):i&&!s?Z("Pick",[t,r],n):h({...Td(t,o),...n})}var yi=p(()=>{R();Fo();Xt();at();Ke();et();ye();_t();Tr();W();Fe();Cd();Rd()});function Hv(t,e,n){return{[e]:on(t,[e],ee(n))}}function zv(t,e,n){return e.reduce((r,o)=>({...r,...Hv(t,o,n)}),{})}function Qv(t,e,n){return zv(t,e.keys,n)}function mm(t,e,n){let r=Qv(t,e,n);return B(r)}var Cd=p(()=>{Pe();yi();Be()});var ki=p(()=>{Cd();Rd();yi()});function Jv(t,e){return Z("Partial",[Z(t,e)])}function Yv(t){return Z("Partial",[Et(t)])}function Xv(t){let e={};for(let n of globalThis.Object.getOwnPropertyNames(t))e[n]=Ee(t[n]);return e}function Zv(t,e){let n=ie(t,[Se,"$id","required","properties"]),r=Xv(e);return H(r,n)}function fm(t){return t.map(e=>gm(e))}function gm(t){return kt(t)?Jv(t.target,t.parameters):de(t)?Yv(t.$ref):oe(t)?$e(fm(t.allOf)):F(t)?V(fm(t.anyOf)):fe(t)?Zv(t,t.properties):kn(t)||Wt(t)||wt(t)||Qe(t)||Cr(t)||It(t)||Bt(t)||Mr(t)||_r(t)?t:H({})}function ir(t,e){return te(t)?hm(t,e):h({...gm(t),...e})}var Md=p(()=>{R();Xt();Vt();et();at();ye();Tn();Kt();T();_d();W()});function eP(t,e){let n={};for(let r of globalThis.Object.getOwnPropertyNames(t))n[r]=ir(t[r],ee(e));return n}function tP(t,e){return eP(t.properties,e)}function hm(t,e){let n=tP(t,e);return B(n)}var _d=p(()=>{Pe();Md();Be()});var vi=p(()=>{_d();Md()});function nP(t,e){return Z("Required",[Z(t,e)])}function rP(t){return Z("Required",[Et(t)])}function oP(t){let e={};for(let n of globalThis.Object.getOwnPropertyNames(t))e[n]=ie(t[n],[Ae]);return e}function iP(t,e){let n=ie(t,[Se,"$id","required","properties"]),r=oP(e);return H(r,n)}function Sm(t){return t.map(e=>ym(e))}function ym(t){return kt(t)?nP(t.target,t.parameters):de(t)?rP(t.$ref):oe(t)?$e(Sm(t.allOf)):F(t)?V(Sm(t.anyOf)):fe(t)?iP(t,t.properties):kn(t)||Wt(t)||wt(t)||Qe(t)||Cr(t)||It(t)||Bt(t)||Mr(t)||_r(t)?t:H({})}function sr(t,e){return te(t)?km(t,e):h({...ym(t),...e})}var Ed=p(()=>{R();Xt();et();at();ye();Tn();T();Kt();$d();W()});function sP(t,e){let n={};for(let r of globalThis.Object.getOwnPropertyNames(t))n[r]=sr(t[r],e);return n}function aP(t,e){return sP(t.properties,e)}function km(t,e){let n=aP(t,e);return B(n)}var $d=p(()=>{Pe();Ed()});var Pi=p(()=>{$d();Ed()});function dP(t,e){return e.map(n=>de(n)?Od(t,n.$ref):tt(t,n))}function Od(t,e){return e in t?de(t[e])?Od(t,t[e].$ref):tt(t,t[e]):L()}function lP(t){return Xn(t[0])}function uP(t){return Zt(t[0],t[1])}function pP(t){return Zn(t[0])}function cP(t){return ir(t[0])}function mP(t){return rn(t[0],t[1])}function fP(t){return on(t[0],t[1])}function gP(t){return sr(t[0])}function hP(t,e,n){let r=dP(t,n);return e==="Awaited"?lP(r):e==="Index"?uP(r):e==="KeyOf"?pP(r):e==="Partial"?cP(r):e==="Omit"?mP(r):e==="Pick"?fP(r):e==="Required"?gP(r):L()}function SP(t,e){return qn(tt(t,e))}function yP(t,e){return jn(tt(t,e))}function kP(t,e,n){return Gn(Zr(t,e),tt(t,n))}function vP(t,e,n){return Ct(Zr(t,e),tt(t,n))}function PP(t,e){return $e(Zr(t,e))}function wP(t,e){return Yn(tt(t,e))}function IP(t,e){return H(globalThis.Object.keys(e).reduce((n,r)=>({...n,[r]:tt(t,e[r])}),{}))}function bP(t,e){let[n,r]=[tt(t,gi(e)),fi(e)],o=Kn(e);return o.patternProperties[r]=n,o}function xP(t,e){return de(e)?{...Od(t,e.$ref),[Se]:e[Se]}:e}function AP(t,e){return dt(Zr(t,e))}function RP(t,e){return V(Zr(t,e))}function Zr(t,e){return e.map(n=>tt(t,n))}function tt(t,e){return Ue(e)?h(tt(t,ie(e,[Ae])),e):Vn(e)?h(tt(t,ie(e,[St])),e):zt(e)?h(xP(t,e),e):yt(e)?h(SP(t,e.items),e):yn(e)?h(yP(t,e.items),e):kt(e)?h(hP(t,e.target,e.parameters)):vt(e)?h(kP(t,e.parameters,e.returns),e):Pt(e)?h(vP(t,e.parameters,e.returns),e):oe(e)?h(PP(t,e.allOf),e):vn(e)?h(wP(t,e.items),e):fe(e)?h(IP(t,e.properties),e):wn(e)?h(bP(t,e)):Xe(e)?h(AP(t,e.items||[]),e):F(e)?h(RP(t,e.anyOf),e):e}function TP(t,e){return e in t?tt(t,t[e]):L()}function vm(t){return globalThis.Object.getOwnPropertyNames(t).reduce((e,n)=>({...e,[n]:TP(t,n)}),{})}var Pm=p(()=>{Lt();ha();Kt();Lr();zo();Wr();Br();_t();In();at();jr();Qr();et();Si();ki();Re();vi();Yr();Pi();en();ye();T();W()});function wm(t){return new Dd(t)}var Dd,Im=p(()=>{Lt();T();Pm();Dd=class{constructor(e){let n=vm(e),r=this.WithIdentifiers(n);this.$defs=r}Import(e,n){let r={...this.$defs,[e]:h(this.$defs[e],n)};return h({[w]:"Import",$defs:r,$ref:e})}WithIdentifiers(e){return globalThis.Object.getOwnPropertyNames(e).reduce((n,r)=>({...n,[r]:{...e[r],$id:r}}),{})}}});var Nd=p(()=>{Im()});function bm(t,e){return h({[w]:"Not",not:t},e)}var xm=p(()=>{R();T()});var Fd=p(()=>{xm()});function Am(t,e){return Pt(t)?dt(t.parameters,e):L()}var Rm=p(()=>{en();Re();W()});var Ld=p(()=>{Rm()});function Tm(t,e={}){me(e.$id)&&(e.$id=`T${CP++}`);let n=Kn(t({[w]:"This",$ref:`${e.$id}`}));return n.$id=e.$id,h({[it]:"Recursive",...n},e)}var CP,Cm=p(()=>{$o();R();Fe();T();CP=0});var Wd=p(()=>{Cm()});function Mm(t,e){let n=Q(t)?new globalThis.RegExp(t):t;return h({[w]:"RegExp",type:"RegExp",source:n.source,flags:n.flags},e)}var _m=p(()=>{R();Fe();T()});var Bd=p(()=>{_m()});function MP(t){return oe(t)?t.allOf:F(t)?t.anyOf:Xe(t)?t.items??[]:[]}function Em(t){return MP(t)}var $m=p(()=>{W()});var Ud=p(()=>{$m()});function Om(t,e){return Pt(t)?h(t.returns,e):L(e)}var Dm=p(()=>{R();Re();W()});var Kd=p(()=>{Dm()});var Nm=p(()=>{});var Fm=p(()=>{});var Lm=p(()=>{Nm();Fm()});var Wm=p(()=>{});var Bm=p(()=>{Wm()});function Um(t){return new Vd(t)}var Vd,qd,Km=p(()=>{T();W();Vd=class{constructor(e){this.schema=e}Decode(e){return new qd(this.schema,e)}},qd=class{constructor(e,n){this.schema=e,this.decode=n}EncodeTransform(e,n){let i={Encode:s=>n[Se].Encode(e(s)),Decode:s=>this.decode(n[Se].Decode(s))};return{...n,[Se]:i}}EncodeSchema(e,n){let r={Decode:this.decode,Encode:e};return{...n,[Se]:r}}Encode(e){return zt(this.schema)?this.EncodeTransform(e,this.schema):this.EncodeSchema(e,this.schema)}}});var jd=p(()=>{Km()});function Vm(t={}){return h({[w]:t[w]??"Unsafe"},t)}var qm=p(()=>{R();T()});var Gd=p(()=>{qm()});function jm(t){return h({[w]:"Void",type:"void"},t)}var Gm=p(()=>{R();T()});var Hd=p(()=>{Gm()});var zd={};Mo(zd,{Any:()=>Yt,Argument:()=>yp,Array:()=>qn,AsyncIterator:()=>jn,Awaited:()=>Xn,BigInt:()=>Qn,Boolean:()=>Uo,Capitalize:()=>nm,Composite:()=>cc,Const:()=>vc,Constructor:()=>Gn,ConstructorParameters:()=>wc,Date:()=>Qo,Enum:()=>bc,Exclude:()=>rr,Extends:()=>nr,Extract:()=>or,Function:()=>Ct,Index:()=>Zt,InstanceType:()=>qc,Instantiate:()=>Qc,Integer:()=>Yc,Intersect:()=>$e,Iterator:()=>Yn,KeyOf:()=>Zn,Literal:()=>K,Lowercase:()=>om,Mapped:()=>Zp,Module:()=>wm,Never:()=>L,Not:()=>bm,Null:()=>Yo,Number:()=>st,Object:()=>H,Omit:()=>rn,Optional:()=>Ee,Parameters:()=>Am,Partial:()=>ir,Pick:()=>on,Promise:()=>Go,Readonly:()=>qe,ReadonlyOptional:()=>pi,Record:()=>mi,Recursive:()=>Tm,Ref:()=>Et,RegExp:()=>Mm,Required:()=>sr,Rest:()=>Em,ReturnType:()=>Om,String:()=>bt,Symbol:()=>Zo,TemplateLiteral:()=>Vo,Transform:()=>Um,Tuple:()=>dt,Uint8Array:()=>ri,Uncapitalize:()=>sm,Undefined:()=>ti,Union:()=>V,Unknown:()=>tn,Unsafe:()=>Vm,Uppercase:()=>dm,Void:()=>jm});var Hm=p(()=>{Fr();Ra();Lr();Wr();zo();qr();Ko();Xa();ed();Br();td();Jo();nd();fd();Jr();Sd();In();_t();yd();vd();Pd();at();Id();jr();Qr();Ke();Pe();Nd();Re();Fd();Xo();xn();et();Si();Vt();Ld();vi();ki();Ho();Rn();ci();Yr();Wd();Tn();Bd();Pi();Ud();Kd();Jn();ei();jt();jd();en();oi();ni();ye();er();Gd();Hd()});var c,zm=p(()=>{Hm();c=zd});var De=p(()=>{ha();Lt();Tt();ba();ip();Dr();up();Nr();T();Fr();Lr();Ra();Wr();zo();qr();Ko();Xa();ed();Br();td();Jo();nd();fd();Jr();Sd();In();_t();yd();vd();Pd();at();jr();Id();Qr();Ke();Nd();Pe();Re();Fd();Xo();xn();et();Si();Vt();Ld();vi();ki();Ho();Rn();ci();Yr();Wd();Tn();Bd();Pi();Ud();Kd();Lm();Bm();Jn();ei();jt();jd();en();oi();ni();ye();er();Gd();Hd();zm()});function Qd(t){v=t}function Jd(t){ge=t}var v,ge,Y=p(()=>{v=null,ge=null});function Qm(t){let e=t.chatId.trim(),n=t.topicId.trim();return!/^-?\d+$/.test(e)||!/^\d+$/.test(n)?null:`${e}:topic:${n}`}function DP(t){let e=t.conversationId.trim(),n=e.match(/^(-?\d+):topic:(\d+)$/i);if(n?.[1]&&n[2]){let i=Qm({chatId:n[1],topicId:n[2]});return i?{chatId:n[1],topicId:n[2],canonicalConversationId:i}:null}if(!/^\d+$/.test(e))return null;let r=t.parentConversationId?.trim();if(!r||!/^-?\d+$/.test(r))return null;let o=Qm({chatId:r,topicId:e});return o?{chatId:r,topicId:e,canonicalConversationId:o}:null}function NP(t){if(!t)return;let e=t.match(/^agent:[^:]+:discord:(direct|dm|channel|group):/i);if(!e?.[1])return;let n=e[1].toLowerCase();return n==="direct"||n==="dm"?"user":"channel"}function FP(t,e){if(!/^\d+$/.test(t))return t;let n=NP(e);return n?`${n}:${t}`:`channel:${t}`}function LP(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 WP(t){let e=t.toLowerCase(),n=[":thread:",":topic:"];for(let r of n){let o=e.lastIndexOf(r);if(o===-1)continue;let i=t.slice(0,o).trim(),s=t.slice(o+r.length).trim()||void 0;return{id:i||t,threadId:s}}return{id:t}}function BP(t){let e=t?.trim();if(!e)return;let n=e.split(":").filter(Boolean);if(n[0]?.trim().toLowerCase()==="agent")for(let r=2;r<=n.length-3;r+=1){let o=n[r]?.trim().toLowerCase();if(!o||!OP.has(o))continue;let i=n[r+1]?.trim().toLowerCase(),s=n.slice(r+2).join(":").trim();if(!(!i||!s))return{provider:o,kind:i,rawId:s}}}function UP(t,e=DP){try{return e({conversationId:t})}catch{return null}}function Yd(t){return{provider:"system",target:"system",sessionKey:t?.trim()||void 0}}function Xd(t,e){return{...t,threadId:e??t.threadId}}function VP(t,e,n){return t==="telegram"&&n?.provider==="telegram"&&!!n.target&&e!==n.target}function qP(t){let e=t?.trim();if(!e)return;let n=BP(e);if(!n)return;let{provider:r,kind:o,rawId:i}=n,s=WP(i),a=null;if(r==="telegram")try{a=KP.safeParseTelegramTopicConversation(i)}catch{a=null}let d=a?.chatId??s.id,l=a?.topicId??s.threadId,u=r==="discord"?o==="direct"||o==="dm"?`user:${d}`:`channel:${d}`:d;return{provider:r,target:u,threadId:l,sessionKey:e}}function Zd(t){let e=t?.match(/:topic:(\d+)$/);return e?parseInt(e[1],10):void 0}function Jm(t){return!!(t?.provider&&t.target&&t.provider!=="system"&&t.target!=="system")}function eo(t,e,n){let r=qP(n),o=e!=null?String(e):void 0,i=t?.trim();if(!i||i.toLowerCase()==="unknown")return r?Xd(r,o):Yd(n);let s=i.split("|").map(k=>k.trim());if(s.length<2)return r?Xd(r,o):Yd(n);let[a,d,l]=s,u=s.length>=3?l:d,f=s.length>=3?d:void 0,g=a?.toLowerCase();if(!g||!u)return r?Xd(r,o):Yd(n);let y=g==="discord"?FP(u,n):u;return VP(g,y,r)?{provider:g,accountId:f,target:r.target,threadId:o??r.threadId,sessionKey:n?.trim()||void 0}:{provider:g,accountId:f,target:y,threadId:o??(r?.provider===g?r.threadId:void 0),sessionKey:n?.trim()||void 0}}function _n(t){return eo(LP(t.route)??t.originChannel,t.route?.threadId??t.originThreadId,t.route?.sessionKey??t.originSessionKey)??t.route}function Ii(t){let e=_n(t);return Jm(e)?e:void 0}function jP(t){return Object.fromEntries(Object.entries(t).filter(e=>!!e[1]))}function Ym(t){let e=_n(t);if(!Jm(e))return"";let n=jP({provider:e?.provider,accountId:e?.accountId,target:e?.target,threadId:e?.threadId??(t.originThreadId!=null?String(t.originThreadId):void 0),sessionKey:e?.sessionKey??t.originSessionKey});return Object.keys(n).length===0?"":["Session origin route (authoritative for human follow-ups):",`originRoute: ${JSON.stringify(n)}`,"Routing rule: Send any human follow-up for this wake to originRoute. If originRoute differs from the current chat, do not use a plain final assistant reply; use a routed send path that preserves provider/target/threadId."].join(`
|
|
2
|
+
`)}var OP,KP,sn=p(()=>{OP=new Set(["telegram","discord","slack","system","mattermost","feishu","line","whatsapp","signal","matrix","googlechat","bluebubbles","imessage","msteams"]);KP={safeParseTelegramTopicConversation:UP}});import{readFileSync as GP}from"fs";import{homedir as HP}from"os";import{join as zP}from"path";function Zm(){if(to!==void 0)return to;try{let t=GP(zP(HP(),".claude.json"),"utf-8");to=JSON.parse(t).mcpServers??{}}catch{to={}}return to}function ef(t){let e=t.defaultHarness??Xm,n={};for(let[r,o]of Object.entries(bi))n[r]={...o,allowedModels:o.allowedModels?[...o.allowedModels]:void 0};for(let[r,o]of Object.entries(t.harnesses??{})){let i=n[r]??{},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),n[r]=s}if(t.defaultModel!==void 0){let r=n[e]??{};n[e]={...r,defaultModel:t.harnesses?.[e]?.defaultModel??t.defaultModel,allowedModels:t.harnesses?.[e]?.allowedModels!==void 0?r.allowedModels:t.allowedModels},console.warn(`[openclaw-code-agent] config.defaultModel is deprecated; use harnesses.${e}.defaultModel instead.`)}if(t.model!==void 0){let r=n.codex??{};n.codex={...r,defaultModel:t.harnesses?.codex?.defaultModel??t.model,allowedModels:t.harnesses?.codex?.allowedModels!==void 0?r.allowedModels:t.allowedModels},console.warn("[openclaw-code-agent] config.model is deprecated; use harnesses.codex.defaultModel instead.")}if(t.reasoningEffort!==void 0){let r=n.codex??{};n.codex={...r,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[r,o]of Object.entries(n))t.harnesses?.[r]?.allowedModels===void 0&&(n[r]={...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??"delegate",defaultHarness:e,harnesses:n,allowedModels:t.allowedModels,defaultWorktreeStrategy:t.defaultWorktreeStrategy??"delegate",worktreeDir:t.worktreeDir}}function Le(){return _.defaultHarness??Xm}function tf(t){let e=bi[t],n=_.harnesses[t];return{...e,...n,allowedModels:n?.allowedModels??e?.allowedModels}}function ar(t){return tf(t).defaultModel}function xi(t){return _.harnesses[t]?.allowedModels??_.allowedModels}function an(t){return tf(t).reasoningEffort}function $t(t){return t==null?void 0:String(t).trim()||void 0}function nl(t){return{channel:$t(t?.deliveryContext?.channel),to:$t(t?.deliveryContext?.to),accountId:$t(t?.deliveryContext?.accountId),threadId:$t(t?.deliveryContext?.threadId)}}function nf(t,e,n){if(!(!t||!e))return n?`${t}|${n}|${e}`:`${t}|${e}`}function el(t){return $t(t?.requesterSenderId??t?.senderId)}function tl(t){return($t(t.deliveryContext?.channel)??t.messageChannel??t.channel)?.toLowerCase()!=="telegram"?!1:!!Zd(t.sessionKey)}function Ai(t){let e=nl(t),n=nf(e.channel,e.to,e.accountId);if(n)return n;if(t.messageChannel){let r=t.messageChannel.split("|");if(r.length>=3)return t.messageChannel;if(t.agentAccountId&&r.length>=2)return`${r[0]}|${t.agentAccountId}|${r.slice(1).join("|")}`;let o=$t(t.chatId);if(r.length===1&&o)return`${r[0]}|${o}`;let i=el(t);if(r.length===1&&i&&!tl(t))return`${r[0]}|${i}`}if(t.workspaceDir){let r=ro(t.workspaceDir);if(r)return r}if(t.messageChannel&&t.messageChannel.includes("|"))return t.messageChannel}function no(t,e){if(e&&String(e).includes("|"))return String(e);let n=nl(t),r=nf(n.channel,n.to,n.accountId);if(r)return r;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=el(t);if(l&&!tl(t))return`${a}|${l}`}let o=$t(t?.channel),i=$t(t?.chatId);if(o&&i)return`${o}|${i}`;let s=el(t);return o&&s&&!tl(t)?`${o}|${s}`:t?.id&&/^-?\d+$/.test(String(t.id))?`telegram|${t.id}`:_.fallbackChannel??"unknown"}function rl(t){return nl(t).threadId??t?.messageThreadId??void 0}function dr(t,e,n){return eo(no(t,e),rl(t),n??t?.sessionKey)}function ro(t){let e=_.agentChannels;if(!e)return;let n=i=>i.replace(/\/+$/,""),r=n(t),o=Object.entries(e).sort((i,s)=>s[0].length-i[0].length);for(let[i,s]of o)if(r===n(i)||r.startsWith(n(i)+"/"))return s}function rf(t){return Zd(t)}var to,Xm,bi,_,Te=p(()=>{sn();Xm="claude-code",bi={"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:"delegate",defaultWorktreeStrategy:"delegate",harnesses:{"claude-code":{...bi["claude-code"]},codex:{...bi.codex}}}});function Ri(t){return{type:"backend_ref",ref:t}}function Ti(t){return{type:"run_started",...t?{runId:t}:{}}}function oo(t){return{type:"text_delta",text:t}}function of(t,e){return{type:"tool_call",name:t,input:e}}function Ci(t){return{type:"pending_input",state:t}}function pr(t){return t?{type:"pending_input_resolved",requestId:t}:{type:"pending_input_resolved"}}function Mi(t,e){return{type:"plan_artifact",artifact:t,finalized:e}}function _i(t){return t?{type:"settings_changed",permissionMode:t}:{type:"settings_changed"}}function En(t){return{type:"run_completed",data:t}}var ur,ol=p(()=>{ur=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(n=>{e.resolvePending=n})}})()}}});import*as $i from"@anthropic-ai/claude-agent-sdk";function QP(t){if(typeof t.result=="string"&&t.result.length>0)return t.result;if(Array.isArray(t.errors)){let e=t.errors.filter(n=>typeof n=="string"&&n.length>0);if(e.length>0)return e.join(`
|
|
3
|
+
`)}}function JP(t,e,n){let o=(Array.isArray(n.questions)?n.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 Ei,sf=p(()=>{ol();Ei=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 n=new ur,r=!1,o="",i=!1,s=0,a=e.resumeSessionId??"",d=e.canUseTool,l={cwd:e.cwd,model:e.model,...e.reasoningEffort?{effort:e.reasoningEffort}:{},permissionMode:e.permissionMode,allowDangerouslySkipPermissions:!0,allowedTools:e.allowedTools,systemPrompt:e.systemPrompt,includePartialMessages:!0,abortController:e.abortController,mcpServers:e.mcpServers,...d?{canUseTool:async(k,I)=>{if(k!=="AskUserQuestion")return{behavior:"allow"};let P=JP(a,++s,I);n.enqueue(Ci(P));try{let b=await d(k,I);return n.enqueue(pr(P.requestId)),b}catch(b){throw n.enqueue(pr(P.requestId)),b}}}:{}};e.resumeSessionId&&(l.resume=e.resumeSessionId,l.forkSession=e.forkSession??!1);let u=e.prompt,f=this.deps.query??$i.query,g=this.deps.startup??$i.startup,y=(async()=>{if(typeof g!="function")return f({prompt:u,options:l});let k=await g({options:l});try{return k.query(u)}catch(I){throw await k.close?.(),I}})();return(async()=>{try{let k=await y;for await(let I of k){let P=I;if(P.type==="system"&&P.subtype==="init"){a=P.session_id??a,n.enqueue(Ri({kind:"claude-code",conversationId:a}));continue}if(P.type==="system"&&P.subtype==="status"&&P.permissionMode){n.enqueue(_i(P.permissionMode));continue}if(P.type==="assistant"){r||(r=!0,n.enqueue(Ti()));for(let b of P.message?.content??[]){if(b.type==="text"){o+=o?`
|
|
4
|
+
${b.text}`:b.text,n.enqueue(oo(b.text));continue}b.type==="tool_use"&&((b.name==="ExitPlanMode"||b.name==="set_permission_mode")&&(i=!0),b.name!=="AskUserQuestion"&&n.enqueue(of(b.name,b.input)))}continue}if(P.type==="result"){let b=o.trim();if(b&&(e.permissionMode==="plan"||i)){let A={explanation:void 0,steps:[],markdown:b};n.enqueue(Mi(A,!0))}n.enqueue(En({success:P.subtype==="success",duration_ms:P.duration_ms??0,total_cost_usd:P.total_cost_usd??0,num_turns:P.num_turns??0,result:QP(P),session_id:P.session_id??a})),o="",i=!1,r=!1}}}finally{n.close()}})().catch(k=>{n.enqueue(En({success:!1,duration_ms:0,total_cost_usd:0,num_turns:0,result:k instanceof Error?k.message:String(k),session_id:a})),n.close()}),{messages:n.messages(),async setPermissionMode(k){let I=await y;typeof I.setPermissionMode=="function"&&await I.setPermissionMode(k)},async streamInput(k){let I=await y;typeof I.streamInput=="function"&&await I.streamInput(k)},async interrupt(){let k=await y;typeof k.interrupt=="function"&&await k.interrupt()}}}buildUserMessage(e,n){return{type:"user",message:{role:"user",content:e},parent_tool_use_id:null,session_id:n}}}});import{spawn as YP}from"node:child_process";import XP from"node:readline";function ZP(t){return t instanceof Error?t.message:String(t)}function ew(t){try{let e=JSON.parse(t);return!e||typeof e!="object"||Array.isArray(e)?null:e}catch{return null}}async function tw(t,e){if(t.id!=null&&(Object.hasOwn(t,"result")||Object.hasOwn(t,"error"))){let r=String(t.id),o=e.pending.get(r);if(!o)return;if(clearTimeout(o.timer),e.pending.delete(r),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 n=t.method?.trim();if(n){if(t.id==null){await e.onNotification(n,t.params);return}try{let r=await e.onRequest(n,t.params);e.respond({jsonrpc:"2.0",id:t.id,result:r??{}})}catch(r){e.respond({jsonrpc:"2.0",id:t.id,error:{code:-32603,message:ZP(r)}})}}}var Oi,af=p(()=>{Oi=class{constructor(e,n,r){this.command=e;this.args=n;this.requestTimeoutMs=r}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=YP(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,XP.createInterface({input:e.stdout}).on("line",r=>{this.handleLine(r)}),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,n){this.write({jsonrpc:"2.0",method:e,params:n??{}})}async request(e,n,r){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,r??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:n??{}}),await i}write(e){if(!this.process?.stdin)throw new Error("codex app server stdio not connected");this.process.stdin.write(`${JSON.stringify(e)}
|
|
5
|
+
`)}async handleLine(e){let n=ew(e);n&&await tw(n,{pending:this.pending,onNotification:this.onNotification,onRequest:this.onRequest,respond:r=>this.write(r)})}flushPending(e){for(let[n,r]of this.pending)clearTimeout(r.timer),r.reject(e),this.pending.delete(n)}}});function X(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function le(t,e,n){for(let r of e){let o=t?.[r];if(typeof o!="string")continue;let i=n?.trim===!1?o:o.trim();if(i)return i}}function nw(t){return t instanceof Error?t.message:String(t)}function df(t){return t?t.split(",").map(e=>e.trim()).filter(Boolean):[]}function dn(t){if(typeof t=="string")return t;if(Array.isArray(t))return t.map(n=>dn(n)).join("");let e=X(t);if(!e)return"";for(let n of["delta","text","content","message","input","output","parts"]){let r=dn(e[n]);if(r)return r}for(let n of["item","turn","thread","response","result","data"]){let r=dn(e[n]);if(r)return r}return""}function io(t){let e=X(t);if(!e)return{};let n=X(e.thread)??X(e.session),r=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(n,["id","threadId","thread_id","conversationId"]),runId:le(e,["turnId","turn_id","runId","run_id"])??le(r,["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 Di(t,e,n=0){if(n>6)return;if(Array.isArray(t)){for(let i of t){let s=Di(i,e,n+1);if(s)return s}return}let r=X(t);if(!r)return;let o=le(r,e);if(o)return o;for(let i of Object.values(r)){let s=Di(i,e,n+1);if(s)return s}}function so(t){return{threadId:io(t).threadId,cwd:Di(t,["cwd","workdir","directory"])}}function lf(t){let e=t?.trim();return!!(e&&/[/\\]worktrees[/\\][^/\\]+[/\\][^/\\]+/.test(e))}function uf(t){let e=t?.trim();if(!e)return;let n=e.split(/[/\\]+/).filter(Boolean),r=n.lastIndexOf("worktrees");if(!(r<0||r+1>=n.length))return n[r+1]}function Ni(t){let e=X(t);if(!e)return;let n=X(e.item)??e;return le(n,["id","itemId","item_id","messageId","message_id"])}function rw(t,e=!1){let n=X(t);if(!n)return"";let r=X(n.item)??n;return le(r,["type"])?.toLowerCase()!=="agentmessage"?"":e?dn(r):le(r,["text"],{trim:!1})??dn(r)}function pf(t,e){let n=t.trim().toLowerCase();return n==="item/agentmessage/delta"?{mode:"delta",text:dn(e),itemId:Ni(e)}:n==="item/completed"?{mode:"snapshot",text:rw(e),itemId:Ni(e)}:{mode:"ignore",text:""}}function cf(t){return{itemId:Ni(t),delta:dn(t)}}function mf(t){let e=X(t),n=X(e?.plan),o=(Array.isArray(e?.plan)?e.plan:Array.isArray(n?.steps)?n.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(n,["explanation"])??le(e,["explanation"]),steps:o}}function ff(t){let e=X(t);if(!e)return{};let n=X(e.item)??e;return le(n,["type"])?.toLowerCase()!=="plan"?{}:{itemId:Ni(n),text:le(n,["text"],{trim:!1})??dn(n)}}function gf(t,e){let n=t.trim().toLowerCase();if(n==="turn/failed")return"failed";if(n==="turn/cancelled")return"interrupted";let r=X(e)??{},o=X(r.turn)??r,i=le(o,["status"])?.toLowerCase();return i==="failed"?"failed":i==="interrupted"||i==="cancelled"?"interrupted":"completed"}function hf(t,e){let n=X(e)??{},r=X(n.turn)??n,o=X(r.error)??X(n.error);if(o)return le(o,["message","text","summary","reason"])}function ow(t,e){let n=nw(t).toLowerCase();return n.includes("method not found")||n.includes("unknown method")?!0:n.includes("unknown variant")?e?n.includes(`unknown variant \`${e.toLowerCase()}\``):!0:!1}function sw(t){return iw.has(t.trim().toLowerCase())}function aw(t){let e=X(t);return e?!!le(e,["threadId","thread_id"]):!1}async function ao(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 n of t.methods)for(let r of t.payloads){if(sw(n)&&!aw(r))throw new Error(`codex app server request missing threadId: ${n}`);try{return await t.client.request(n,r,t.timeoutMs)}catch(o){if(e=o,!ow(o,n))continue}}throw e instanceof Error?e:new Error(String(e))}function Sf(t){let e={cwd:t.cwd};t.model?.trim()&&(e.model=t.model.trim()),t.reasoningEffort?.trim()&&(e.reasoningEffort=t.reasoningEffort.trim()),t.approvalPolicy?.trim()&&(e.approvalPolicy=t.approvalPolicy.trim()),t.sandbox?.trim()&&(e.sandbox=t.sandbox.trim());let n={cwd:t.cwd};return t.reasoningEffort?.trim()&&(n.reasoning_effort=t.reasoningEffort.trim()),t.approvalPolicy?.trim()&&(n.approvalPolicy=t.approvalPolicy.trim()),t.sandbox?.trim()&&(n.sandbox=t.sandbox.trim()),[e,n,{}]}function yf(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 dw(t){return[{type:"text",text:t}]}function lw(t,e,n,r){let o=e?.trim(),i=n?.trim(),s=r?.trim();if(t!=="plan")return o||i||s?{mode:"default",settings:{...o?{model:o}:{},...i?{reasoningEffort:i}:{},developerInstructions:s??null}}:void 0;if(!(!o&&!i&&!s))return{mode:"plan",settings:{...o?{model:o}:{},...i?{reasoningEffort:i}:{},developerInstructions:s??null}}}function kf(t){let e={threadId:t.threadId,input:dw(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 n=lw(t.permissionMode??"default",t.model,t.reasoningEffort,t.systemPrompt);return n?[{...e,collaborationMode:n},{...e,collaboration_mode:{mode:n.mode,settings:{...typeof n.settings.model=="string"?{model:n.settings.model}:{},...typeof n.settings.reasoningEffort=="string"?{reasoning_effort:n.settings.reasoningEffort}:{},developer_instructions:n.settings.developerInstructions??null}}},e]:[e]}function vf(t){return[{threadId:t.threadId,turnId:t.turnId}]}function uw(t){let e=X(t);if(!e)return[];let n=e.options??e.choices??e.availableDecisions??e.decisions;return Array.isArray(n)?n.map(r=>typeof r=="string"?r.trim():le(X(r),["label","title","text","value","name","id"])??"").filter(Boolean):[]}function pw(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 Pf(t,e,n){let r=t.trim().toLowerCase(),o=uw(n),i=Di(n,["question","prompt","message","text","summary","reason"])??void 0,s=r.includes("requestapproval"),a=s?o.map(d=>({kind:"approval",label:d,decision:pw(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 wf(t){let e=t.trim().toLowerCase();return e.includes("requestuserinput")||e.includes("requestapproval")}function il(t,e){let n=t==="bypassPermissions"?"never":e?.trim()||"never";return{approvalPolicy:n,sandbox:n==="never"?"danger-full-access":void 0}}var iw,If=p(()=>{iw=new Set(["thread/resume","turn/start","turn/steer","turn/interrupt"])});function bf(t){return t instanceof Error?t.message:String(t)}function hw(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 cw,$n,mw,fw,gw,Fi,xf=p(()=>{af();ol();If();cw="1.0",$n=6e4,mw="OPENCLAW_CODEX_APP_SERVER_COMMAND",fw="OPENCLAW_CODEX_APP_SERVER_ARGS",gw="OPENCLAW_CODEX_APP_SERVER_TIMEOUT_MS";Fi=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 n={command:process.env[mw]?.trim()||"codex",args:df(process.env[fw]),requestTimeoutMs:Number.parseInt(process.env[gw]??String($n),10)||$n},r=this.deps.createClient?.(n)??new Oi(n.command,n.args,n.requestTimeoutMs),o=new ur,i=e.resumeSessionId,s,a=e.backendRef?.worktreePath,d=e.backendRef?.worktreeId,l=e.permissionMode??"default",u,f=0,g="",y=[],k,I=new Map,P=new Set,b=$=>{let O=$?.trim();if(!O)return;let U=e.originalWorkdir?.trim()||e.cwd.trim();e.worktreeStrategy&&e.worktreeStrategy!=="off"&&O!==U&&lf(O)&&(a=O,d=uf(O))},A=()=>{i&&o.enqueue(Ri({kind:"codex-app-server",conversationId:i,...s?{runId:s}:{},...d?{worktreeId:d}:{},...a?{worktreePath:a}:{}}))};r.setNotificationHandler(async($,O)=>{let U=$.trim().toLowerCase(),pe=io(O),ht=so(O);if(pe.threadId&&i&&pe.threadId!==i)return;if(pe.threadId&&(i=pe.threadId),pe.runId&&(s=pe.runId),b(ht.cwd),(pe.threadId||pe.runId||ht.cwd)&&A(),U==="serverrequest/resolved"){u&&(o.enqueue(pr(u.requestId)),u=void 0);return}if(U==="turn/plan/updated"){let Me=mf(O);g=Me.explanation??g,Me.steps.length>0&&(y=Me.steps);return}if(U==="item/plan/delta"){let Me=cf(O);if(Me.itemId&&Me.delta){let Gt=I.get(Me.itemId)??"";I.set(Me.itemId,`${Gt}${Me.delta}`)}return}if(U==="item/completed"){let Me=ff(O);if(Me.text?.trim()){let Gt={explanation:g||void 0,steps:y,markdown:Me.text.trim()};o.enqueue(Mi(Gt,!0));return}}let ae=pf(U,O);if(ae.mode==="delta"&&ae.text){ae.itemId&&P.add(ae.itemId),o.enqueue(oo(ae.text));return}ae.mode==="snapshot"&&ae.text&&(!ae.itemId||!P.has(ae.itemId))&&o.enqueue(oo(ae.text)),(U==="turn/completed"||U==="turn/failed"||U==="turn/cancelled")&&k&&(k.method=$,k.params=O,k.resolve())}),r.setRequestHandler(async($,O)=>{if(!wf($))return{};let U=io(O),pe=so(O);if(U.threadId&&i&&U.threadId!==i)return{};U.threadId&&(i=U.threadId),U.runId&&(s=U.runId),b(pe.cwd),(U.threadId||U.runId||pe.cwd)&&A();let ht=U.requestId??`${i??"codex"}-${Date.now().toString(36)}`,ae=Pf($,ht,O),Me=$.trim().toLowerCase(),Gt=ae.options,Co=ae.actions??[],Jh=await new Promise(Yh=>{u={requestId:ht,methodLower:Me,state:ae,options:Gt,actions:Co,resolveResponse:Yh},o.enqueue(Ci(ae))});return u=void 0,o.enqueue(pr(ht)),Jh});let C=async()=>{await r.connect(),await r.request("initialize",{protocolVersion:cw,clientInfo:{name:"openclaw-code-agent",version:"3.1.0"},capabilities:{experimentalApi:!0}},$n),await r.notify("initialized",{})},D=async()=>{let $=il(l,e.codexApprovalPolicy);if(i){let pe=await ao({client:r,methods:["thread/resume"],payloads:yf({threadId:i,model:e.model,reasoningEffort:e.reasoningEffort,approvalPolicy:$.approvalPolicy,sandbox:$.sandbox}),timeoutMs:$n}),ht=so(pe);i=ht.threadId??i,b(ht.cwd),A();return}let O=await ao({client:r,methods:["thread/start","thread/new"],payloads:Sf({cwd:e.cwd,model:e.model,reasoningEffort:e.reasoningEffort,approvalPolicy:$.approvalPolicy,sandbox:$.sandbox}),timeoutMs:$n}),U=so(O);if(i=U.threadId,!i)throw new Error("Codex App Server did not return a thread id.");b(U.cwd),A()},xe=async $=>{await D(),o.enqueue(Ti()),f+=1,g="",y=[],I.clear(),P.clear();let O="",U,pe,ht=new Promise(ae=>{pe=ae});k={resolve:pe};try{let ae=il(l,e.codexApprovalPolicy),Me=await ao({client:r,methods:["turn/start"],payloads:kf({threadId:i,prompt:$,model:e.model,reasoningEffort:e.reasoningEffort,systemPrompt:e.systemPrompt,permissionMode:l,approvalPolicy:ae.approvalPolicy,sandbox:ae.sandbox}),timeoutMs:$n}),Gt=io(Me);Gt.runId&&(s=Gt.runId,A()),await ht,O=k?.method??"turn/failed",U=k?.params;let Co=gf(O,U);o.enqueue(En({success:Co==="completed",outcome:Co,duration_ms:0,total_cost_usd:0,num_turns:f,result:hf(O,U),session_id:i}))}catch(ae){o.enqueue(En({success:!1,duration_ms:0,total_cost_usd:0,num_turns:f,result:bf(ae),session_id:i??""}))}finally{k=void 0}},hn=async $=>u?(u.methodLower.includes("requestapproval")?u.resolveResponse({decision:$.trim()||"decline"}):u.resolveResponse({text:$.trim()}),!0):!1,Dt=async $=>{let O=u;if(!O)return!1;let U=O.actions[$];if(U?.kind==="approval")return O.resolveResponse({decision:U.responseDecision,...U.proposedExecpolicyAmendment?{proposedExecpolicyAmendment:U.proposedExecpolicyAmendment}:{}}),!0;let pe=O.options[$];return pe?(O.methodLower.includes("requestapproval")?O.resolveResponse({decision:pe}):O.resolveResponse({option:pe,index:$}),!0):!1},iu=typeof e.prompt=="string"?(async function*(){yield{type:"user",text:e.prompt,session_id:e.resumeSessionId??""}})():e.prompt;return(async()=>{try{await C();for await(let $ of iu){let O=hw($).trim();!O||await hn(O)||await xe(O)}}catch($){o.enqueue(En({success:!1,duration_ms:0,total_cost_usd:0,num_turns:f,result:bf($),session_id:i??e.resumeSessionId??""}))}finally{await r.close().catch(()=>{}),o.close()}})(),{messages:o.messages(),async setPermissionMode($){l=$,o.enqueue(_i($))},async submitPendingInputOption($){return Dt($)},async submitPendingInputText($){return hn($)},async interrupt(){!i||!s||await ao({client:r,methods:["turn/interrupt"],payloads:vf({threadId:i,turnId:s}),timeoutMs:$n}).catch(()=>{})}}}buildUserMessage(e,n){return{type:"user",text:e,session_id:n}}}});function Af(t){sl.set(t.name,t)}function lo(t){let e=sl.get(t);if(!e)throw new Error(`Unknown agent harness: "${t}". Available: ${[...sl.keys()].join(", ")}`);return e}function Rf(){return lo(Le())}var sl,al=p(()=>{sf();xf();Te();sl=new Map;Af(new Ei);Af(new Fi)});function M(t){return t.backendRef?.conversationId??t.harnessSessionId}function ne(t){return t.id??t.sessionId??t.name??M(t)??t.harnessSessionId}function Sw(t){return t.harnessSessionId}function Ge(t){let e=[ne(t),M(t),Sw(t)].filter(n=>!!n);return[...new Set(e)]}function dl(t){return t.harnessName??t.persistedHarness??Le()}function uo(t){if(t.backendRef?.kind==="codex-app-server")return"native-restore";try{return lo(dl(t)).capabilities.worktrees}catch{return"plugin-managed"}}function ll(t){return t==="native-execution"}function Li(t){return t==="native-restore"}function yw(t){return!!(t.backendRef?.worktreePath||t.backendRef?.worktreeId)}function We(t){let e=uo(t);return(ll(e)||Li(e))&&yw(t)}var he=p(()=>{Te();al()});import{execFileSync as be}from"child_process";import*as Zi from"fs";import{tmpdir as Vw}from"os";import{dirname as Jf,join as qw}from"path";function jw(t){try{return be("git",["rev-parse","--show-toplevel"],{cwd:t,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{return}}function es(t){if(process.env.OPENCLAW_WORKTREE_DIR)return process.env.OPENCLAW_WORKTREE_DIR;if(_.worktreeDir)return _.worktreeDir;if(t){let e=jw(t);if(e)return qw(e,".worktrees")}return Vw()}function Yf(t){return t.replace(/[^a-zA-Z0-9._-]/g,"-").replace(/\.{2,}/g,"-").replace(/^[-.]|[-.]$/g,"").slice(0,100)||"session"}function ts(t){try{let e=be("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")?Jf(e):void 0}catch{return}}function Gw(){if(Yi!==void 0)return Yi;try{return be("git",["--version"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),Yi=!0,!0}catch{return Yi=!1,!1}}function ln(){if(Xi!==void 0)return Xi;try{return be("gh",["--version"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),Xi=!0,!0}catch{return Xi=!1,!1}}function gl(t){if(!Gw())return!1;try{return be("git",["rev-parse","--git-dir"],{cwd:t,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function Xf(t){try{let e=zw(t);if(!e)return console.warn(`[worktree] Failed to resolve free-space probe path for ${es(t)}`),!0;let n=Zi.statfsSync(e),r=n.bavail*n.bsize;return Qw(r)}catch(e){return console.warn(`[worktree] Failed to check free space: ${e instanceof Error?e.message:String(e)}`),!0}}function fo(t,e){try{return be("git",["-C",t,"rev-parse","--verify",e],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function Hw(t){let e=t;for(;;){if(Zi.existsSync(e))return e;let n=Jf(e);if(n===e)return;e=n}}function zw(t){return Hw(es(t))}function Qw(t){return t>=104857600}function un(t){let e=process.env.OPENCLAW_WORKTREE_BASE_BRANCH?.trim();if(e)return e;try{let r=be("git",["-C",t,"rev-parse","--abbrev-ref","origin/HEAD"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().replace(/^origin\//,"");if(r)return r}catch{}try{return be("git",["-C",t,"rev-parse","--verify","main"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),"main"}catch{}try{return be("git",["-C",t,"rev-parse","--verify","master"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),"master"}catch{return"main"}}function ns(t){try{let n=be("git",["-C",t,"rev-parse","--abbrev-ref","HEAD"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(n==="HEAD"){console.warn(`[worktree] Worktree ${t} is in detached HEAD state \u2014 cannot determine branch name`);return}return n||void 0}catch{return}}function go(t,e,n){try{let r=be("git",["-C",t,"rev-list","--count",`${n}..${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});return parseInt(r.trim(),10)>0}catch{return!1}}function Zf(t,e,n){try{let r=be("git",["-C",t,"rev-list","--left-right","--count",`${e}...${n}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),[o,i]=r.split(/\s+/);return{ahead:parseInt(o??"0",10)||0,behind:parseInt(i??"0",10)||0}}catch{return}}function eg(t,e,n){try{return be("git",["-C",t,"merge-base","--is-ancestor",e,n],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function tg(t,e,n){try{let r=be("git",["-C",t,"merge-tree","--write-tree",n,e],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),o=be("git",["-C",t,"rev-parse",`${n}^{tree}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return!!r&&r===o}catch{return!1}}function Ot(t,e){try{return be("git",["-C",t,"branch","-D",e],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(n){return console.warn(`[worktree] Failed to delete branch ${e}: ${n instanceof Error?n.message:String(n)}`),!1}}function ng(t,e){if(e)return e;let n;try{n=be("git",["-C",t,"remote","get-url","origin"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{}try{let r=be("git",["-C",t,"remote","get-url","upstream"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(r&&r!==n){let o=r.match(/[:/]([^/]+\/[^/]+?)(?:\.git)?$/);if(o)return o[1]}}catch{}}var Yi,Xi,ho=p(()=>{Te()});import{execFileSync as hr}from"child_process";import{appendFileSync as Jw,existsSync as ig,mkdirSync as rg,readFileSync as Yw,rmSync as hl}from"fs";import{relative as Xw,sep as og}from"path";function Zw(t,e){return!!(t&&typeof t=="object"&&"code"in t&&t.code===e)}function eI(t){try{return hr("git",["-C",t,"rev-parse","--show-toplevel"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{return}}function tI(t,e){let n=eI(t);if(!n)return;let r=Xw(n,e);if(!r||r.startsWith("..")||r.includes(`..${og}`))return;let o=`${n}/.git/info/exclude`,i=`${r.split(og).join("/").replace(/\/$/,"")}/`;try{let s=ig(o)?Yw(o,"utf-8"):"";s.split(/\r?\n/).map(d=>d.trim()).some(d=>d===i||d===`/${i}`)||Jw(o,`${s.endsWith(`
|
|
6
6
|
`)||s.length===0?"":`
|
|
7
7
|
`}${i}
|
|
8
|
-
`,"utf-8")}catch(s){console.warn(`[worktree] Failed to add ${i} to ${o}: ${s instanceof Error?s.message:String(s)}`)}}function
|
|
9
|
-
`).map(n=>n.trim()).filter(Boolean):[]}catch{return[]}}function nt(t,e,n={}){let r=n.destructive===!0,o=
|
|
8
|
+
`,"utf-8")}catch(s){console.warn(`[worktree] Failed to add ${i} to ${o}: ${s instanceof Error?s.message:String(s)}`)}}function Sl(t,e,n={}){let r=Yf(e),o=es(t);tI(t,o),rg(o,{recursive:!0});let i=n.allowExistingBranch===!0,s,a,d=10,l=!1;for(let f=0;f<d;f++){let g=f===0?"":`-${Math.random().toString(16).slice(2,6)}`,y=`${o}/openclaw-worktree-${r}${g}`,k=`agent/${r}${g}`;if(!i&&fo(t,k))continue;let I=!1;do{I=!1;try{rg(y,{recursive:!1}),s=y,a=k;break}catch(P){if(Zw(P,"EEXIST")){if(i&&f===0&&!l)try{hl(y,{recursive:!0,force:!0}),l=!0,I=!0}catch(b){throw new Error(`Failed to recreate existing worktree branch ${k}: could not clear blocked path ${y}: ${b instanceof Error?b.message:String(b)}`)}else if(i&&f===0)throw new Error(`Failed to recreate existing worktree branch ${k}: path ${y} remains blocked after one cleanup attempt`);continue}throw P}}while(I);if(s&&a)break}if(!s||!a)throw new Error(`Failed to create unique worktree directory and branch after ${d} attempts`);let u=fo(t,a);try{u?hr("git",["-C",t,"worktree","add",s,a],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}):hr("git",["-C",t,"worktree","add","-b",a,s],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(f){try{hl(s,{recursive:!0,force:!0})}catch{}throw f}return s}function Sr(t){if(!ig(t))return[];try{let e=hr("git",["-C",t,"status","--porcelain","--untracked-files=all"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return e?e.split(`
|
|
9
|
+
`).map(n=>n.trim()).filter(Boolean):[]}catch{return[]}}function yr(t){return Sr(t).length>0}function nt(t,e,n={}){let r=n.destructive===!0,o=Sr(e);if(o.length>0&&!r)return console.warn(`[worktree] Refusing implicit cleanup for dirty worktree ${e}: ${o[0]}`),!1;try{return hr("git",["-C",t,"worktree","remove",...r?["--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)}`),!r)return!1;try{return hl(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 rs(t){try{hr("git",["-C",t,"worktree","prune"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{}}var yl=p(()=>{ho()});import{execFileSync as re}from"child_process";import{existsSync as nI}from"fs";function Nn(t,e,n){try{let r=re("git",["-C",t,"rev-list","--count",`${n}..${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),o=parseInt(r.trim(),10),s=re("git",["-C",t,"diff","--shortstat",`${n}...${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),a=0,d=0,l=0,u=s.match(/(\d+)\s+files?\s+changed/);u&&(a=parseInt(u[1],10));let f=s.match(/(\d+)\s+insertions?\(/);f&&(d=parseInt(f[1],10));let g=s.match(/(\d+)\s+deletions?\(/);g&&(l=parseInt(g[1],10));let k=re("git",["-C",t,"diff","--name-only","--diff-filter=ACMR",`${n}...${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().split(`
|
|
10
10
|
`).map(b=>b.trim()).filter(Boolean),P=re("git",["-C",t,"log",`${n}..${e}`,"--format=%h|%s|%an","-n","5"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().split(`
|
|
11
|
-
`).filter(Boolean).map(b=>{let[A,C,
|
|
12
|
-
`).some(n=>n.length>0&&!n.startsWith("??")&&!n.startsWith("!!"))}catch{return!1}}function
|
|
13
|
-
`)}}re("git",["-C",t,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),re("git",["-C",t,"merge","--ff-only",e],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});let u=!1;if(i)try{re("git",["-C",t,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{u=!0}return{success:!0,fastForward:!0,stashed:i||void 0,stashRef:s,stashPopConflict:u||void 0}}catch(d){try{re("git",["-C",t,"checkout",n],{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 hl=p(()=>{});import{execFileSync as rs}from"child_process";function ig(t,e,n,r,o,i){if(!ln())return{success:!1,error:"GitHub CLI (gh) is not available"};try{let s;if(i)try{let f=rs("git",["-C",t,"remote","get-url","origin"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().match(/[:/]([^/]+)\/[^/]+(?:\.git)?$/);f&&(s=f[1])}catch{}let a=["pr","create","--base",n];return i&&a.push("--repo",i),s?a.push("--head",`${s}:${e}`):a.push("--head",e),r&&o?a.push("--title",r,"--body",o):a.push("--fill-verbose"),{success:!0,prUrl:rs("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 mo(t,e,n){if(!ln())return{exists:!1,state:"none"};try{let r=["pr","list","--head",e,"--state","all","--json","url,number,title,state","--jq",".[0]"];n&&r.push("--repo",n);let i=rs("gh",r,{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(r){return console.warn(`[worktree] Failed to sync PR status for ${e}: ${r instanceof Error?r.message:String(r)}`),{exists:!1,state:"none"}}}function sg(t,e,n,r){if(!ln())return!1;try{let o=["pr","comment",String(e),"--body",n];return r&&o.push("--repo",r),rs("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 Dn(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 Sl=p(()=>{co()});import{existsSync as yl}from"fs";function ag(){return new Date().toISOString()}function tI(t){return t.worktreeLifecycle??{state:t.worktreePath||t.worktreeBranch?"provisioned":"none",updatedAt:ag(),baseBranch:t.worktreeBaseBranch,targetRepo:t.worktreePrTargetRepo,pushRemote:t.worktreePushRemote}}function nI(t){return t.worktreeLifecycle?.baseBranch??t.worktreeBaseBranch??(yl(t.workdir)?un(t.workdir):void 0)}function fo(t,e={}){let n=tI(t),r=ag(),o=new Set,i=yl(t.workdir),s=!!(t.worktreePath&&yl(t.worktreePath)),a=t.worktreeBranch,d=nI(t),l=!1,u=!1,f=!1,g=!1,y,k,I=t.worktreePrUrl?"open":"none",P=t.worktreePrUrl,b=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"),n.state==="pending_decision"&&o.add("pending_decision"),n.state==="merge_conflict_resolving"&&o.add("merge_conflict_resolving"),i&&a&&(l=po(t.workdir,a),l||o.add("branch_missing")),s&&t.worktreePath&&(u=fr(t.worktreePath),u&&o.add("dirty_tracked_changes")),i&&l&&d){let it=Yf(t.workdir,a,d);y=it?.ahead,k=it?.behind,f=Xf(t.workdir,a,d),f?o.add("topology_merged"):(g=Zf(t.workdir,a,d),g&&o.add("merge_noop_content_already_on_base"),!g&&(y??0)>0&&o.add("unique_content"))}else d||o.add("base_branch_missing");if(e.includePrSync&&i&&a){let it=mo(t.workdir,a,t.worktreePrTargetRepo??n.targetRepo);I=it.state,P=it.url??P,b=it.number??b}I==="open"&&o.add("pr_open"),I==="merged"&&!f&&!g&&o.add("pr_merged_not_reflected_locally");let A=n.state;f?A="merged":g?A="released":!l&&n.state==="pending_decision"&&(A="cleanup_failed");let C=e.activeSession||u||n.state==="pending_decision"||n.state==="merge_conflict_resolving"||n.state==="pr_open"||I==="open"||o.has("pr_merged_not_reflected_locally"),N=!C&&(A==="merged"||A==="released"||n.state==="dismissed"||n.state==="no_change"),xe={checkedAt:r,repoExists:i,branchExists:l,worktreeExists:s,activeSession:e.activeSession===!0,dirtyTracked:u,topologyMerged:f,releaseNoopMerge:g,branchAheadCount:y,baseAheadCount:k,prState:I,prUrl:P,prNumber:b,reasons:[...o]};return{lifecycle:n,evidence:xe,derivedState:A,cleanupSafe:N,preserve:C,reasons:[...o]}}var os=p(()=>{co();Sl();hl()});var rt=p(()=>{co();og();hl();Sl();os()});function gr(t,e){let n=t.resolve(e),r=t.getPersistedSession(e),o=n?ne(n):r?ne(r):void 0;return{activeSession:n,persistedSession:r,persistedRef:o,sessionName:n?.name??r?.name??e,worktreePath:n?.worktreePath??r?.worktreePath,originalWorkdir:n?.originalWorkdir??r?.workdir,branchName:n?.worktreeBranch??r?.worktreeBranch,notificationTarget:n??(r?{id:o??e,harnessSessionId:r.harnessSessionId,backendRef:r.backendRef,route:r.route}:void 0)}}function bg(t){return t.persistedSession?tt(t.persistedSession):[]}function FI(t,e){let n=[e.id,e.backendConversationId,e.harnessSessionId,e.name],r,o;for(let i of n)if(i&&(r??=t.resolve(i),o??=t.getPersistedSession(i),r&&o))break;return{activeSession:r,persistedSession:o}}function ms(t,e,n={}){let{activeSession:r,persistedSession:o}=FI(t,e),i=fo({workdir:e.workdir,worktreePath:e.worktreePath,worktreeBranch:e.worktreeBranch,worktreeBaseBranch:n.baseBranch??o?.worktreeBaseBranch,worktreePrTargetRepo:o?.worktreePrTargetRepo,worktreePushRemote:o?.worktreePushRemote,worktreePrUrl:o?.worktreePrUrl,worktreePrNumber:o?.worktreePrNumber,worktreeLifecycle:o?.worktreeLifecycle},{activeSession:!!(r&&(r.status==="starting"||r.status==="running")),includePrSync:!!(o?.worktreeLifecycle?.state==="pr_open"||o?.worktreePrUrl)});return{activeSession:r,persistedSession:o,resolvedLifecycle:i}}function fs(t){let e=t.list("all").filter(o=>o.worktreePath),n=t.listPersistedSessions().filter(o=>o.worktreePath),r=new Map;for(let o of n){if(!o.worktreePath)continue;let i=M(o),s=o.sessionId??i??o.harnessSessionId;s&&r.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&&r.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:M(o),harnessSessionId:o.harnessSessionId});return Array.from(r.values())}function gs(t,e){return t.id===e||t.name===e||t.backendConversationId===e||t.harnessSessionId===e}function Fn(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 hs(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 ho=p(()=>{he();os()});var xg={};Ao(xg,{makeAgentPrTool:()=>So});import{existsSync as WI}from"fs";function BI(t){return!t||typeof t!="object"?!1:typeof t.session=="string"}function So(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:c.Object({session:c.String({description:"Session name or ID to create/update PR for"}),title:c.Optional(c.String({description:"PR title (default: auto-generated from session name)"})),body:c.Optional(c.String({description:"PR body (default: auto-generated from commit summary)"})),base_branch:c.Optional(c.String({description:"Base branch for the PR (default: detected from repo)"})),force_new:c.Optional(c.Boolean({description:"Force creation of a new PR even if one exists (default: false)"})),target_repo:c.Optional(c.String({description:"Target repository for cross-repo PRs (e.g. 'openai/codex'). Auto-detected from 'upstream' remote if not set."}))}),async execute(e,n){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}],meta:{success:!1,state:"error"}};if(!BI(n))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, title?, body?, base_branch?, force_new? }."}],meta:{success:!1,state:"error"}};if(!ln())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 r=gr(v,n.session),o=r.activeSession,i=r.persistedSession;if(!o&&!i)return{content:[{type:"text",text:`Error: Session "${n.session}" not found.`}],meta:{success:!1,state:"error"}};let{worktreePath:s,originalWorkdir:a,sessionName:d,branchName:l}=r;if(!s||!a)return{content:[{type:"text",text:`Error: Session "${n.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"}};WI(s)||console.info(`[agent_pr] Worktree directory ${s} no longer exists; proceeding with branch "${l}" via originalWorkdir (${a})`);let u=n.base_branch??un(a),f=r.persistedRef,g=eg(a,n.target_repo??i?.worktreePrTargetRepo);if(!ts(a,l))return{content:[{type:"text",text:`\u274C Failed to push ${l} \u2014 cannot create/update PR`}],meta:{success:!1,state:"error"}};let y=mo(a,l,g);if(n.force_new&&y.exists)return{content:[{type:"text",text:`\u26A0\uFE0F Cannot create new PR: A PR already exists for ${l} (${y.state}).
|
|
11
|
+
`).filter(Boolean).map(b=>{let[A,C,D]=b.split("|");return{hash:A||"",message:C||"",author:D||""}});return{commits:o,filesChanged:a,insertions:d,deletions:l,changedFiles:k,commitMessages:P}}catch(r){console.warn(`[worktree] Failed to get diff summary: ${r instanceof Error?r.message:String(r)}`);return}}function os(t,e,n="origin"){try{return re("git",["-C",t,"push",n,e],{timeout:6e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(r){return console.warn(`[worktree] Failed to push branch ${e}: ${r instanceof Error?r.message:String(r)}`),!1}}function sg(t){try{return re("git",["-C",t,"status","--porcelain"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).split(`
|
|
12
|
+
`).some(n=>n.length>0&&!n.startsWith("??")&&!n.startsWith("!!"))}catch{return!1}}function is(t,e,n,r="merge",o){let i=!1,s,a=d=>{if(i)try{re("git",["-C",d,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{}};try{if(r==="squash"){if(re("git",["-C",t,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),sg(t)){let g;try{g=re("git",["-C",t,"stash","push","-m",`pre-merge stash before ${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(y){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=re("git",["-C",t,"stash","list","--format=%gd","-n","1"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{}}}re("git",["-C",t,"merge","--squash",e],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),re("git",["-C",t,"commit","-m",`Squash merge ${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});let f=!1;if(i)try{re("git",["-C",t,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{f=!0}return{success:!0,stashed:i||void 0,stashRef:s,stashPopConflict:f||void 0}}let d=o&&nI(o),l=d?o:t;if(d||re("git",["-C",t,"checkout",e],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),sg(t)){let f;try{f=re("git",["-C",t,"stash","push","-m",`pre-merge stash before ${e}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(g){try{re("git",["-C",t,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{}return{success:!1,dirtyError:!0,error:`Auto-stash failed: ${g instanceof Error?g.message:String(g)}. Commit or stash changes manually, then retry.`}}if(!f.includes("No local changes to save")){i=!0;try{s=re("git",["-C",t,"stash","list","--format=%gd","-n","1"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{}}}try{re("git",["-C",l,"rebase",n],{timeout:6e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{try{re("git",["-C",l,"rebase","--abort"],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{}try{re("git",["-C",t,"checkout",n],{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 ${n} hit conflicts.`,"To resolve manually:",` cd ${l}`,` git rebase ${n}`," # resolve conflicts in each file, then:"," git add <file>"," git rebase --continue"," # repeat until rebase finishes, then re-run agent_merge."].join(`
|
|
13
|
+
`)}}re("git",["-C",t,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),re("git",["-C",t,"merge","--ff-only",e],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});let u=!1;if(i)try{re("git",["-C",t,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{u=!0}return{success:!0,fastForward:!0,stashed:i||void 0,stashRef:s,stashPopConflict:u||void 0}}catch(d){try{re("git",["-C",t,"checkout",n],{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 ag=p(()=>{});import{execFileSync as ss}from"child_process";function dg(t,e,n,r,o,i){if(!ln())return{success:!1,error:"GitHub CLI (gh) is not available"};try{let s;if(i)try{let f=ss("git",["-C",t,"remote","get-url","origin"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().match(/[:/]([^/]+)\/[^/]+(?:\.git)?$/);f&&(s=f[1])}catch{}let a=["pr","create","--base",n];return i&&a.push("--repo",i),s?a.push("--head",`${s}:${e}`):a.push("--head",e),r&&o?a.push("--title",r,"--body",o):a.push("--fill-verbose"),{success:!0,prUrl:ss("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 So(t,e,n){if(!ln())return{exists:!1,state:"none"};try{let r=["pr","list","--head",e,"--state","all","--json","url,number,title,state","--jq",".[0]"];n&&r.push("--repo",n);let i=ss("gh",r,{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(r){return console.warn(`[worktree] Failed to sync PR status for ${e}: ${r instanceof Error?r.message:String(r)}`),{exists:!1,state:"none"}}}function lg(t,e,n,r){if(!ln())return!1;try{let o=["pr","comment",String(e),"--body",n];return r&&o.push("--repo",r),ss("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 Fn(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 kl=p(()=>{ho()});import{existsSync as vl}from"fs";function ug(){return new Date().toISOString()}function rI(t){return t.worktreeLifecycle??{state:t.worktreePath||t.worktreeBranch?"provisioned":"none",updatedAt:ug(),baseBranch:t.worktreeBaseBranch,targetRepo:t.worktreePrTargetRepo,pushRemote:t.worktreePushRemote}}function oI(t){return t.worktreeLifecycle?.baseBranch??t.worktreeBaseBranch??(vl(t.workdir)?un(t.workdir):void 0)}function Ln(t,e={}){let n=rI(t),r=ug(),o=new Set,i=vl(t.workdir),s=!!(t.worktreePath&&vl(t.worktreePath)),a=t.worktreeBranch,d=oI(t),l=!1,u=!1,f=!1,g=!1,y,k,I=t.worktreePrUrl?"open":"none",P=t.worktreePrUrl,b=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"),n.state==="pending_decision"&&o.add("pending_decision"),n.state==="merge_conflict_resolving"&&o.add("merge_conflict_resolving"),i&&a&&(l=fo(t.workdir,a),l||o.add("branch_missing")),s&&t.worktreePath&&(u=yr(t.worktreePath),u&&o.add("dirty_worktree_entries")),i&&l&&d){let Dt=Zf(t.workdir,a,d);y=Dt?.ahead,k=Dt?.behind,f=eg(t.workdir,a,d),f?o.add("topology_merged"):(g=tg(t.workdir,a,d),g&&o.add("merge_noop_content_already_on_base"),!g&&(y??0)>0&&o.add("unique_content"))}else d||o.add("base_branch_missing");if(e.includePrSync&&i&&a){let Dt=So(t.workdir,a,t.worktreePrTargetRepo??n.targetRepo);I=Dt.state,P=Dt.url??P,b=Dt.number??b}I==="open"&&o.add("pr_open"),I==="merged"&&!f&&!g&&o.add("pr_merged_not_reflected_locally");let A=n.state;f?A="merged":g?A="released":!l&&n.state==="pending_decision"&&(A="cleanup_failed");let C=A==="merged"||A==="released",D=e.activeSession||u||!C&&n.state==="pending_decision"||n.state==="merge_conflict_resolving"||n.state==="pr_open"||I==="open"||o.has("pr_merged_not_reflected_locally"),xe=!D&&(A==="merged"||A==="released"||n.state==="dismissed"||n.state==="no_change"),hn={checkedAt:r,repoExists:i,branchExists:l,worktreeExists:s,activeSession:e.activeSession===!0,dirtyTracked:u,topologyMerged:f,releaseNoopMerge:g,branchAheadCount:y,baseAheadCount:k,prState:I,prUrl:P,prNumber:b,reasons:[...o]};return{lifecycle:n,evidence:hn,derivedState:A,cleanupSafe:xe,preserve:D,reasons:[...o]}}var yo=p(()=>{ho();kl();yl()});var rt=p(()=>{ho();yl();ag();kl();yo()});function kr(t,e){let n=t.resolve(e),r=t.getPersistedSession(e),o=n?ne(n):r?ne(r):void 0;return{activeSession:n,persistedSession:r,persistedRef:o,sessionName:n?.name??r?.name??e,worktreePath:n?.worktreePath??r?.worktreePath,originalWorkdir:n?.originalWorkdir??r?.workdir,branchName:n?.worktreeBranch??r?.worktreeBranch,notificationTarget:n??(r?{id:o??e,harnessSessionId:r.harnessSessionId,backendRef:r.backendRef,route:r.route}:void 0)}}function Rg(t){return t.persistedSession?Ge(t.persistedSession):[]}function WI(t,e){let n=[e.id,e.backendConversationId,e.harnessSessionId,e.name],r,o;for(let i of n)if(i&&(r??=t.resolve(i),o??=t.getPersistedSession(i),r&&o))break;return{activeSession:r,persistedSession:o}}function gs(t,e,n={}){let{activeSession:r,persistedSession:o}=WI(t,e),i=Ln({workdir:e.workdir,worktreePath:e.worktreePath,worktreeBranch:e.worktreeBranch,worktreeBaseBranch:n.baseBranch??o?.worktreeBaseBranch,worktreePrTargetRepo:o?.worktreePrTargetRepo,worktreePushRemote:o?.worktreePushRemote,worktreePrUrl:o?.worktreePrUrl,worktreePrNumber:o?.worktreePrNumber,worktreeLifecycle:o?.worktreeLifecycle},{activeSession:!!(r&&(r.status==="starting"||r.status==="running")),includePrSync:!!(o?.worktreeLifecycle?.state==="pr_open"||o?.worktreePrUrl)});return{activeSession:r,persistedSession:o,resolvedLifecycle:i}}function hs(t){let e=t.list("all").filter(o=>o.worktreePath),n=t.listPersistedSessions().filter(o=>o.worktreePath),r=new Map;for(let o of n){if(!o.worktreePath)continue;let i=M(o),s=o.sessionId??i??o.harnessSessionId;s&&r.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&&r.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:M(o),harnessSessionId:o.harnessSessionId});return Array.from(r.values())}function Ss(t,e){return t.id===e||t.name===e||t.backendConversationId===e||t.harnessSessionId===e}function Bn(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 ys(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":case"dirty_worktree_entries":return"dirty worktree";case"unique_content":return"still has unique content";case"topology_merged":return"merged by ancestry";case"merge_noop_content_already_on_base":return"content already on base";case"pr_open":return"PR open";case"pr_merged_not_reflected_locally":return"merged PR not reflected locally";case"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 vo=p(()=>{he();yo()});var Tg={};Mo(Tg,{makeAgentPrTool:()=>Po});import{existsSync as UI}from"fs";function KI(t){return!t||typeof t!="object"?!1:typeof t.session=="string"}function Po(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:c.Object({session:c.String({description:"Session name or ID to create/update PR for"}),title:c.Optional(c.String({description:"PR title (default: auto-generated from session name)"})),body:c.Optional(c.String({description:"PR body (default: auto-generated from commit summary)"})),base_branch:c.Optional(c.String({description:"Base branch for the PR (default: detected from repo)"})),force_new:c.Optional(c.Boolean({description:"Force creation of a new PR even if one exists (default: false)"})),target_repo:c.Optional(c.String({description:"Target repository for cross-repo PRs (e.g. 'openai/codex'). Auto-detected from 'upstream' remote if not set."}))}),async execute(e,n){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}],meta:{success:!1,state:"error"}};if(!KI(n))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, title?, body?, base_branch?, force_new? }."}],meta:{success:!1,state:"error"}};if(!ln())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 r=kr(v,n.session),o=r.activeSession,i=r.persistedSession;if(!o&&!i)return{content:[{type:"text",text:`Error: Session "${n.session}" not found.`}],meta:{success:!1,state:"error"}};let{worktreePath:s,originalWorkdir:a,sessionName:d,branchName:l}=r;if(!s||!a)return{content:[{type:"text",text:`Error: Session "${n.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"}};UI(s)||console.info(`[agent_pr] Worktree directory ${s} no longer exists; proceeding with branch "${l}" via originalWorkdir (${a})`);let u=n.base_branch??un(a),f=r.persistedRef,g=ng(a,n.target_repo??i?.worktreePrTargetRepo);if(!os(a,l))return{content:[{type:"text",text:`\u274C Failed to push ${l} \u2014 cannot create/update PR`}],meta:{success:!1,state:"error"}};let y=So(a,l,g);if(n.force_new&&y.exists)return{content:[{type:"text",text:`\u26A0\uFE0F Cannot create new PR: A PR already exists for ${l} (${y.state}).
|
|
14
14
|
|
|
15
15
|
Existing PR: ${y.url}
|
|
16
16
|
|
|
17
|
-
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(y.exists&&y.state==="open"){let k
|
|
17
|
+
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(y.exists&&y.state==="open"){let k=Nn(a,l,u);if(k&&k.commits>0){let I=k.commitMessages.slice(0,5).map(C=>`\u2022 ${C.hash} ${C.message} (${C.author})`).join(`
|
|
18
18
|
`),P=k.commits>5?`
|
|
19
19
|
...and ${k.commits-5} more commits`:"",b=["\u{1F504} **New commits pushed**","",`${k.commits} new commits (+${k.insertions} / -${k.deletions})`,"","### Latest commits:",I+P,"","---","\u{1F916} [openclaw-code-agent](https://github.com/goldmar/openclaw-code-agent)"].join(`
|
|
20
|
-
`);if(
|
|
20
|
+
`);if(lg(a,y.number,b,g)){f&&v.updatePersistedSession(f,{worktreePrUrl:y.url,worktreePrNumber:y.number,lifecycle:"terminal",worktreeState:"pr_open",pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeLifecycle:{state:"pr_open",updatedAt:new Date().toISOString(),baseBranch:u,targetRepo:g,pushRemote:i?.worktreePushRemote}});let C=Fn({kind:"pr-updated",branch:l,prUrl:y.url});return v.notifyWorktreeOutcome(r.notificationTarget,C),{content:[{type:"text",text:`${C}
|
|
21
21
|
|
|
22
22
|
\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 ${y.url} but failed to add comment.
|
|
23
23
|
|
|
@@ -33,186 +33,191 @@ What would you like to do?
|
|
|
33
33
|
2. Close and delete the branch with agent_merge(delete_branch=true), then start a new session/worktree
|
|
34
34
|
3. Manually delete the closed PR on GitHub, then call agent_pr(force_new=true) to create a fresh PR
|
|
35
35
|
|
|
36
|
-
(This tool cannot automatically reopen or recreate PRs to avoid unintended actions.)`}],meta:{success:!1,state:"closed"}};{let k=n.title??`[openclaw-code-agent] ${d}`,I=n.body;if(!I){let b
|
|
36
|
+
(This tool cannot automatically reopen or recreate PRs to avoid unintended actions.)`}],meta:{success:!1,state:"closed"}};{let k=n.title??`[openclaw-code-agent] ${d}`,I=n.body;if(!I){let b=Nn(a,l,u);if(b){let A=b.commitMessages.slice(0,5).map(D=>`\u2022 ${D.hash} ${D.message} (${D.author})`).join(`
|
|
37
37
|
`),C=b.commits>5?`
|
|
38
38
|
...and ${b.commits-5} more`:"";I=[`Automated changes from OpenClaw Code Agent session: ${d}`,"","## Summary",`${b.commits} commits, ${b.filesChanged} files changed (+${b.insertions} / -${b.deletions})`,"","## Commits",A+C,"","---","\u{1F916} Generated with [openclaw-code-agent](https://github.com/goldmar/openclaw-code-agent)"].join(`
|
|
39
|
-
`)}else I=`Automated changes from OpenClaw Code Agent session: ${d}`}let P=
|
|
40
|
-
`)}function
|
|
41
|
-
`).map(n=>n.trim()).filter(Boolean)??[];if(e.length!==0)for(let n of e){let r=n.match(/^(Workdir|Repo):\s*(.+)$/),o=
|
|
42
|
-
`)}function
|
|
43
|
-
`):"",
|
|
44
|
-
`):"";return{kind:"blocked",text:["Resume-first protection blocked a fresh launch.","",xe,
|
|
39
|
+
`)}else I=`Automated changes from OpenClaw Code Agent session: ${d}`}let P=dg(a,l,u,k,I,g);if(P.success&&P.prUrl){let b=So(a,l,g);f&&v.updatePersistedSession(f,{worktreePrUrl:P.prUrl,worktreePrNumber:b.number,lifecycle:"terminal",pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeState:"pr_open",worktreeDisposition:"pr-opened",worktreeLifecycle:{state:"pr_open",updatedAt:new Date().toISOString(),baseBranch:u,targetRepo:g,pushRemote:i?.worktreePushRemote}});let A=Fn({kind:"pr-opened",branch:l,targetRepo:g,prUrl:P.prUrl});return v.notifyWorktreeOutcome(r.notificationTarget,A),{content:[{type:"text",text:A}],meta:{success:!0,state:"created"}}}else return{content:[{type:"text",text:`\u274C Failed to create PR: ${P.error??"unknown error"}`}],meta:{success:!1,state:"error"}}}}}}}var Ps=p(()=>{De();Y();rt();vo()});import{readdirSync as PA,statSync as wA,rmSync as IA}from"fs";import{execFileSync as bA}from"child_process";import{join as Qh}from"path";De();Y();function _P(t){return t.length>80?`${t.slice(0,80)}...`:t}function EP(t){return t.worktreePath?!t.originalWorkdir||t.originalWorkdir===t.worktreePath?`${t.worktreePath} (worktree)`:`${t.worktreePath} (worktree of ${t.originalWorkdir})`:t.workdir}function $P(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: ${EP(t)}`,` Model: ${t.model??"default"}`,` Prompt: "${_P(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(`
|
|
40
|
+
`)}function wi(t,e){return $P({...t,sessionId:e.id,sessionName:e.name,model:e.model,reasoningEffort:e.reasoningEffort,worktreeStrategy:e.worktreeStrategy??"off",worktreePath:e.worktreePath,originalWorkdir:e.originalWorkdir})}Te();function lr(t){let{requestedResumeSessionId:e,activeSession:n,persistedSession:r}=t;return e?n?{resumeSessionId:e,clearedPersistedCodexResume:!1}:r?.harness==="codex"&&r.backendRef?.kind!=="codex-app-server"?{resumeSessionId:void 0,clearedPersistedCodexResume:!0}:{resumeSessionId:e,clearedPersistedCodexResume:!1}:{resumeSessionId:void 0,clearedPersistedCodexResume:!1}}he();function ul(t){return"id"in t?t.id:t.sessionId}function po(t){return t.status==="completed"||t.killReason==="done"}function kw(t){return po(t)&&t.backendRef?.kind==="codex-app-server"&&!!M(t)}function vw(t){return(t.killReason==="shutdown"||t.killReason==="startup-timeout")&&!M(t)}function co(t){if(t.status==="running")return{kind:"direct",reason:"already_running"};let e=ul(t);if(po(t)&&!kw(t))return{kind:"unavailable",reason:"completed",stableSessionId:e};let n=M(t);if(n){let r="harnessName"in t?void 0:t,{resumeSessionId:o,clearedPersistedCodexResume:i}=lr({requestedResumeSessionId:n,activeSession:"harnessName"in t?{harnessSessionId:n}:void 0,persistedSession:r?{harness:r.harness,backendRef:r.backendRef}:void 0});return o?{kind:"resume",resumeSessionId:o,stableSessionId:e,clearedPersistedCodexResume:i}:{kind:"unavailable",reason:"legacy_non_resumable",stableSessionId:e,clearedPersistedCodexResume:i}}return vw(t)?{kind:"relaunch",stableSessionId:e}:{kind:"unavailable",reason:"missing_backend_state",stableSessionId:e}}Te();import{existsSync as _f}from"fs";function Wi(t,e){if(!e||e.length===0)return!0;if(!t)return!1;let n=t.toLowerCase();return e.some(r=>n.includes(r.toLowerCase()))}he();function Tf(t){return t==null?void 0:String(t).trim()||void 0}function Pw(t){return t.trim().replace(/^['"`](.*)['"`]$/s,"$1").trim()}function ww(t){let e=t.split(/\n\s*\n/,1)[0]?.split(`
|
|
41
|
+
`).map(n=>n.trim()).filter(Boolean)??[];if(e.length!==0)for(let n of e){let r=n.match(/^(Workdir|Repo):\s*(.+)$/),o=Pw(r?.[2]??"");if(o.startsWith("/")&&_f(o))return o}}function Cf(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&&Tf(t.originThreadId)===Tf(e.originThreadId)}function Mf(t){return t.slice(0,3).map(e=>` - ${e.name} [${e.ref}] | status=${e.status}${e.lifecycle?` | lifecycle=${e.lifecycle}`:""}`).join(`
|
|
42
|
+
`)}function Iw(t,e){let n=[],r=[],o=new Set;for(let i of t.list?.("all")??[]){if(!Cf(i,e))continue;let s=i.id;if(!o.has(s)){if(o.add(s),i.isExplicitlyResumable){n.push({ref:i.id,name:i.name,status:i.status,lifecycle:i.lifecycle,resumable:!0});continue}(i.status==="starting"||i.status==="running")&&r.push({ref:i.id,name:i.name,status:i.status,lifecycle:i.lifecycle,resumable:!1})}}for(let i of t.listPersistedSessions?.()??[]){if(!i.resumable||!Cf(i,e))continue;let s=ne(i)??i.harnessSessionId,a=i.sessionId??M(i)??i.harnessSessionId;!s||!a||o.has(a)||(o.add(a),n.push({ref:s,name:i.name,status:i.status,lifecycle:i.lifecycle,resumable:!0}))}return{resumable:n,active:r}}function Bi(t,e,n){let r=t.workdir||ww(t.prompt)||e.workspaceDir||_.defaultWorkdir||process.cwd();if(!_f(r))return{kind:"error",text:`Error: Working directory does not exist: ${r}`};let o=t.harness??Le(),i=ar(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=xi(o);if(d&&d.length>0&&!Wi(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),u=no(e,l||ro(r)),f=e.sessionKey||void 0,g=rf(f)??rl(e);if(!t.resume_session_id&&!t.force_new_session){let D=Iw(n,{workdir:r,originSessionKey:f,originChannel:u,originThreadId:g});if(D.resumable.length>0||D.active.length>0){let xe=D.resumable.length>0?["Linked resumable session(s) already exist for this thread/workdir:",Mf(D.resumable),"","Resume the latest one with:",` agent_respond(session='${D.resumable[0].ref}', message='<next instruction>')`,"Fork from it with:",` agent_launch(prompt='<new task>', resume_session_id='${D.resumable[0].ref}', fork_session=true)`].join(`
|
|
43
|
+
`):"",hn=D.active.length>0?[D.resumable.length>0?"Linked active session(s):":"Linked active session(s) already exist for this thread/workdir:",Mf(D.active),"","Send a follow-up instead of launching a duplicate:",` agent_respond(session='${D.active[0].ref}', message='<next instruction>')`].join(`
|
|
44
|
+
`):"";return{kind:"blocked",text:["Resume-first protection blocked a fresh launch.","",xe,hn,["If you intentionally want a brand-new independent session here, call:"," agent_launch(prompt='<new task>', force_new_session=true)"].join(`
|
|
45
45
|
`)].filter(Boolean).join(`
|
|
46
46
|
|
|
47
|
-
`)}}}let y=t.resume_session_id,k=y?n.resolve?.(y):void 0,I=y?n.getPersistedSession?.(y):void 0;if(y){let
|
|
48
|
-
`)}function
|
|
49
|
-
`)}function Ce(t,e){return e<=0?"":t.length<=e?t:e<=3?".".repeat(e):t.slice(0,e-3)+"..."}function
|
|
47
|
+
`)}}}let y=t.resume_session_id,k=y?n.resolve?.(y):void 0,I=y?n.getPersistedSession?.(y):void 0;if(y){let D=n.resolveBackendConversationId?.(y)??n.resolveHarnessSessionId?.(y);if(!D)return{kind:"error",text:`Error: Could not resolve resume_session_id "${y}" to a session ID. Use agent_sessions to list available sessions.`};y=D}let{resumeSessionId:P,clearedPersistedCodexResume:b}=lr({requestedResumeSessionId:y,activeSession:k?{harnessSessionId:k.backendConversationId??k.harnessSessionId}:void 0,persistedSession:I?{harness:I.harness,backendRef:I.backendRef}:void 0}),A=t.permission_mode??_.permissionMode,C=t.plan_approval??_.planApproval;return{kind:"resolved",workdir:r,harness:o,resolvedModel:s,permissionMode:A,planApproval:C,originChannel:u,originThreadId:g,originSessionKey:f,route:dr(e,u,f),resumeSessionId:P,resolvedResumeId:y,clearedPersistedCodexResume:b,reasoningEffort:an(o)}}he();function Rt(t){let e=Math.floor(t/1e3),n=Math.floor(e/60),r=e%60;return n>0?`${n}m${r}s`:`${r}s`}var bw=new Set(["a","an","the","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","need","must","i","me","my","we","our","you","your","it","its","he","she","to","of","in","for","on","with","at","by","from","as","into","through","about","that","this","these","those","and","or","but","if","then","so","not","no","please","just","also","very","all","some","any","each","make","write","create","build","implement","add","update"]);function $f(t){let n=t.toLowerCase().replace(/[^a-z0-9\s-]/g," ").split(/\s+/).filter(r=>r.length>1&&!bw.has(r)).slice(0,3);return n.length===0?"session":n.join("-")}var Ef={starting:"\u{1F7E1}",running:"\u{1F7E2}",completed:"\u2705",failed:"\u274C",killed:"\u26D4",awaiting_plan_decision:"\u{1F4CB}",awaiting_user_input:"\u2753",awaiting_worktree_decision:"\u{1F33F}",suspended:"\u23F8\uFE0F",terminal:"\u{1F3C1}"};function Of(t){let e=Ef[t.phase]??Ef[t.status]??"\u2753",n=Rt(t.duration),r=t.multiTurn?"multi-turn":"single",o=t.prompt.length>80?t.prompt.slice(0,80)+"...":t.prompt,i=t.costUsd>0?` | $${t.costUsd.toFixed(2)}`:"",s=[`${e} ${t.name} [${t.id}] (${n}${i}) \u2014 ${r}`,` \u{1F4C1} ${t.workdir}`,` \u{1F4DD} "${o}"`];if(t.worktreePath&&t.worktreeBranch){let d=` \u{1F33F} Worktree: ${t.worktreeBranch}`;t.worktreeMerged?d+=" [merged \u2713]":t.worktreePrUrl?d+=` [PR: ${t.worktreePrUrl}]`:d+=" [not merged]",s.push(d)}t.phase!==t.status&&s.push(` \u2699\uFE0F Phase: ${t.phase}`),t.lifecycle&&t.lifecycle!==t.phase&&s.push(` \u{1F504} Lifecycle: ${t.lifecycle}`),(t.requestedPermissionMode||t.currentPermissionMode||t.approvalExecutionState)&&s.push(` \u{1F510} Approval: ${t.approvalExecutionState??"unknown"} (requested=${t.requestedPermissionMode??"unknown"}, effective=${t.currentPermissionMode??"unknown"})`),t.resumable&&s.push(" \u21A9\uFE0F Resumable: yes"),t.harness&&s.push(` \u{1F9F0} Harness: ${t.harness}`);let a=M(t);return a&&s.push(` \u{1F517} Backend ID: ${a}`),t.resumeSessionId&&s.push(` \u21A9\uFE0F Resumed from: ${t.resumeSessionId}${t.forkSession?" (forked)":""}`),s.join(`
|
|
48
|
+
`)}function Ui(t,e){let n=t.sessionsWithDuration>0?t.totalDurationMs/t.sessionsWithDuration:0,{completed:r,failed:o,killed:i}=t.sessionsByStatus,s=["\u{1F4CA} OpenClaw Code Agent Stats","","\u{1F4CB} Sessions",` Launched: ${t.totalLaunched}`,` Running: ${e}`,` Completed: ${r}`,` Failed: ${o}`,` Killed: ${i}`,"",`\u23F1\uFE0F Average duration: ${n>0?Rt(n):"n/a"}`];if(t.mostExpensive){let a=t.mostExpensive;s.push("","\u{1F3C6} Notable session",` ${a.name} [${a.id}]`,` \u{1F4DD} "${a.prompt}"`)}return s.join(`
|
|
49
|
+
`)}function Ce(t,e){return e<=0?"":t.length<=e?t:e<=3?".".repeat(e):t.slice(0,e-3)+"..."}function Ki(t,e){let n=t.split(`
|
|
50
50
|
`),r=[],o=0;for(let i=n.length-1;i>=0;i--){let s=n[i].length+(r.length>0?1:0);if(o+s>e&&r.length>0)break;r.unshift(n[i]),o+=s}return r.join(`
|
|
51
51
|
`)}function Df(t,e){let n=t.split(`
|
|
52
52
|
`),r=[],o=0;for(let i=0;i<n.length;i++){let s=n[i].length+(r.length>0?1:0);if(o+s>e&&r.length>0)break;r.push(n[i]),o+=s}return r.join(`
|
|
53
|
-
`)}var lo,uo,lr=!1;function Nf(t){try{return t?.config?.current?.()}catch{return}}function ur(t,e){if(t&&typeof t=="object"){lo=t,arguments.length>=2?(uo=e,lr=!0):lr||(uo=Nf(lo),lr=!0);return}lo=void 0,uo=void 0,lr=!1}function Wi(){return lo}function Ff(){return lr||(uo=Nf(lo),lr=!0),uo}var ww="openclaw-code-agent",Iw=160,Bi={create(){},progress(){},finalize(){}};function Ui(t,e){let n=e instanceof Error?e.message:String(e);console.warn(`[SessionTaskLifecycle] ${t} failed: ${n}`)}function bw(t,e){if(e.applied===!1){let n=e.code?` (${e.code})`:"";console.warn(`[SessionTaskLifecycle] ${t} mutation was not applied${n}`)}}function xw(t){let e=t.prompt.trim().replace(/\s+/g," ");return Ce(e||t.name,Iw)}function Aw(t){if(t.status==="starting"||t.lifecycle==="starting")return"Starting";if(t.lifecycle==="active")return"Running";if(t.lifecycle==="awaiting_plan_decision")return"Waiting for plan approval";if(t.lifecycle==="awaiting_user_input")return"Waiting for input";if(t.lifecycle==="awaiting_worktree_decision")return"Waiting for worktree decision";if(t.lifecycle==="suspended")return"Suspended after idle timeout"}function Rw(t){if(t.status==="completed")return"succeeded";if(t.status==="failed")return"failed";if(t.status==="killed")return t.killReason==="idle-timeout"||t.killReason==="startup-timeout"?"timed_out":"cancelled"}function dl(t,e){return t==="completed"?"Completed":t==="failed"?"Failed":e==="idle-timeout"?"Timed out after idle timeout":e==="startup-timeout"?"Timed out during startup":e==="shutdown"?"Cancelled during shutdown":e==="user"?"Cancelled by user":"Cancelled"}function Tw(t){return t.lifecycle==="awaiting_plan_decision"||t.lifecycle==="awaiting_user_input"||t.lifecycle==="awaiting_worktree_decision"||t.lifecycle==="suspended"}function ll(t,e,n){return{phase:e,integration:"phase-1-managed-task-flow",sessionId:t.id,sessionName:t.name,sessionStatus:t.status,sessionLifecycle:t.lifecycle,summary:n}}function Cw(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.createManaged=="function"&&typeof e.resume=="function"&&typeof e.setWaiting=="function"&&typeof e.finish=="function"&&typeof e.fail=="function"}function Lf(t,e){if(e.applied)return e.flow;let n=e.current;return n?.flowId&&typeof n.revision=="number"?n:t}var ul=class{constructor(e){this.taskFlow=e}taskFlow;flow;finalized=!1;lastProgressKey;create(e){if(this.flow||this.finalized)return;let n="Starting",r=Date.now();try{this.flow=this.taskFlow.createManaged({controllerId:ww,goal:xw(e),status:"running",notifyPolicy:"silent",currentStep:n,stateJson:ll(e,"created",n),createdAt:e.startedAt,updatedAt:r}),this.lastProgressKey=this.progressKey(e,n)}catch(o){Ui("create",o)}}progress(e){if(!this.flow||this.finalized)return;let n=Aw(e);if(!n)return;let r=this.progressKey(e,n);if(r!==this.lastProgressKey)try{let o=ll(e,"progress",n),i=Date.now(),s=Tw(e)?this.taskFlow.setWaiting({flowId:this.flow.flowId,expectedRevision:this.flow.revision,currentStep:n,stateJson:o,waitJson:{reason:n,sessionId:e.id},blockedSummary:n,updatedAt:i}):this.taskFlow.resume({flowId:this.flow.flowId,expectedRevision:this.flow.revision,status:"running",currentStep:n,stateJson:o,updatedAt:i});this.flow=Lf(this.flow,s),this.lastProgressKey=r}catch(o){Ui("progress",o)}}finalize(e){if(!this.flow||this.finalized)return;let n=Rw(e);if(!n)return;let r=n==="succeeded"?"Completed":n==="failed"?"Failed":dl(e.status,e.killReason);try{let o=e.completedAt??Date.now(),i={...ll(e,"terminal",r),terminalStatus:n,terminalSummary:dl(e.status,e.killReason),...e.status==="failed"&&e.error?{error:e.error}:{}},s=n==="succeeded"?this.taskFlow.finish({flowId:this.flow.flowId,expectedRevision:this.flow.revision,stateJson:i,updatedAt:o,endedAt:o}):this.taskFlow.fail({flowId:this.flow.flowId,expectedRevision:this.flow.revision,stateJson:i,blockedSummary:dl(e.status,e.killReason),updatedAt:o,endedAt:o});bw("finalize",s),this.flow=Lf(this.flow,s),this.finalized=!0}catch(o){Ui("finalize",o)}}progressKey(e,n){return`${e.status}:${e.lifecycle}:${n}`}};function Ki(t){if(!t.sessionKey?.trim())return Bi;try{let e=Wi()?.taskFlow?.fromToolContext;if(typeof e!="function")return Bi;let n=e(t);return Cw(n)?new ul(n):Bi}catch(e){return Ui("resolve",e),Bi}}function Mw(t){return t instanceof Error?t.message:String(t)}function Wf(t,e){return t?("id"in t?t.id:t.sessionId)??e??"unknown-session":e??"unknown-session"}function _w(t){return!t||typeof t!="object"?!1:typeof t.prompt=="string"}function Ew(t){return!!t&&typeof t=="object"&&typeof t.formatLaunchResult=="function"}function Bf(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:c.Object({prompt:c.String({description:"The task prompt to execute"}),name:c.Optional(c.String({description:"Short human-readable name for the session (kebab-case, e.g. 'fix-auth'). Auto-generated from prompt if omitted."})),workdir:c.Optional(c.String({description:"Working directory (defaults to cwd)"})),model:c.Optional(c.String({description:"Model name to use"})),system_prompt:c.Optional(c.String({description:"Additional system prompt"})),allowed_tools:c.Optional(c.Array(c.String(),{description:"List of allowed tools"})),resume_session_id:c.Optional(c.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:c.Optional(c.Boolean({description:"When resuming, fork to a new session instead of continuing the existing one. Use with resume_session_id."})),force_new_session:c.Optional(c.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:c.Optional(c.Union([c.Literal("default"),c.Literal("plan"),c.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:c.Optional(c.Union([c.Literal("ask"),c.Literal("delegate"),c.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:c.Optional(c.String({description:"Agent harness to use (e.g. 'claude-code'). Defaults to 'claude-code'."})),worktree_strategy:c.Optional(c.Union([c.Literal("off"),c.Literal("manual"),c.Literal("ask"),c.Literal("delegate"),c.Literal("auto-merge"),c.Literal("auto-pr")],{description:"Worktree strategy: 'off' (no worktree), 'manual' (create worktree but no auto merge-back), 'ask' (prompt user with Merge/Open PR/Later/Discard 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:c.Optional(c.String({description:"Base branch for worktree merge/PR operations (default: auto-detected or 'main')"})),worktree_pr_target_repo:c.Optional(c.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,n){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!_w(n))return{content:[{type:"text",text:"Error: Invalid parameters. Expected at least { prompt }."}]};n.agentId&&console.warn(`[agent_launch] \u26A0\uFE0F agentId="${n.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 r=Ni(n,t,v);if(r.kind!=="resolved")return{content:[{type:"text",text:r.text}]};let{workdir:o,harness:i,resolvedModel:s,permissionMode:a,planApproval:d,originChannel:l,originThreadId:u,originSessionKey:f,route:g,resumeSessionId:y,resolvedResumeId:k,clearedPersistedCodexResume:I,reasoningEffort:P}=r,b=n.resume_session_id?v.resolve(n.resume_session_id)??v.getPersistedSession(n.resume_session_id):void 0,A=!n.fork_session&&b?ao(b):void 0;if(A?.kind==="direct")return{content:[{type:"text",text:`Session ${b.name} [${Wf(b,n.resume_session_id)}] is already running. Use agent_respond(session='${n.resume_session_id}', message='<next instruction>') instead of agent_launch(resume_session_id=...).`}]};if(A?.kind==="unavailable")return{content:[{type:"text",text:`Resume unavailable for session ${b.name} [${Wf(b,n.resume_session_id)}] (${A.reason}). Use agent_launch(prompt='<new task>') for a fresh session or set fork_session=true to fork from prior context.`}]};let C=v.spawn({prompt:n.prompt,sessionIdOverride:n.fork_session?void 0:A?.kind==="resume"||A?.kind==="relaunch"?A.stableSessionId:void 0,name:n.name,workdir:o,model:s,reasoningEffort:P,systemPrompt:n.system_prompt,allowedTools:n.allowed_tools,resumeSessionId:A?.kind==="resume"?A.resumeSessionId:y,resumeWorktreeFrom:k,forkSession:y?n.fork_session:!1,multiTurn:!0,permissionMode:a,planApproval:d,codexApprovalPolicy:i==="codex"?"never":void 0,originChannel:l,originThreadId:u,originAgentId:t.agentId||void 0,originSessionKey:f,route:g,harness:i,taskLifecycle:Ki(t),worktreeStrategy:n.worktree_strategy,worktreeBaseBranch:n.worktree_base_branch,worktreePrTargetRepo:n.worktree_pr_target_repo});return{content:[{type:"text",text:Ew(v)?v.formatLaunchResult({prompt:n.prompt,workdir:o,harness:i,permissionMode:a??_.permissionMode,planApproval:d,forceNewSession:n.force_new_session,resumeSessionId:n.resume_session_id,forkSession:n.fork_session,clearedPersistedCodexResume:I},C):yi({prompt:n.prompt,workdir:o,harness:i,permissionMode:a??_.permissionMode,planApproval:d,resumeSessionId:n.resume_session_id,forkSession:n.fork_session,forceNewSession:n.force_new_session,clearedPersistedCodexResume:I},{id:C.id,name:C.name,model:C.model,reasoningEffort:C.reasoningEffort??an(i),worktreeStrategy:C.worktreeStrategy??n.worktree_strategy??_.defaultWorktreeStrategy??"off",worktreePath:C.worktreePath,originalWorkdir:C.originalWorkdir})}]}}catch(r){let o=Mw(r),i=o.includes("Max sessions")?"":`
|
|
53
|
+
`)}var On,mo,cr=!1;function Nf(t){try{return t?.config?.current?.()}catch{return}}function mr(t,e){if(t&&typeof t=="object"){On=t,arguments.length>=2?(mo=e,cr=!0):cr||(mo=Nf(On),cr=!0);return}On=void 0,mo=void 0,cr=!1}function Ff(){return On}function Lf(){return On?.tasks?.managedFlows??On?.taskFlow}function Wf(){return cr||(mo=Nf(On),cr=!0),mo}var xw="openclaw-code-agent",Aw=160,Vi={create(){},progress(){},finalize(){}};function qi(t,e){let n=e instanceof Error?e.message:String(e);console.warn(`[SessionTaskLifecycle] ${t} failed: ${n}`)}function Rw(t,e){if(e.applied===!1){let n=e.code?` (${e.code})`:"";console.warn(`[SessionTaskLifecycle] ${t} mutation was not applied${n}`)}}function Tw(t){let e=t.prompt.trim().replace(/\s+/g," ");return Ce(e||t.name,Aw)}function Cw(t){if(t.status==="starting"||t.lifecycle==="starting")return"Starting";if(t.lifecycle==="active")return"Running";if(t.lifecycle==="awaiting_plan_decision")return"Waiting for plan approval";if(t.lifecycle==="awaiting_user_input")return"Waiting for input";if(t.lifecycle==="awaiting_worktree_decision")return"Waiting for worktree decision";if(t.lifecycle==="suspended")return"Suspended after idle timeout"}function Mw(t){if(t.status==="completed")return"succeeded";if(t.status==="failed")return"failed";if(t.status==="killed")return t.killReason==="idle-timeout"||t.killReason==="startup-timeout"?"timed_out":"cancelled"}function pl(t,e){return t==="completed"?"Completed":t==="failed"?"Failed":e==="idle-timeout"?"Timed out after idle timeout":e==="startup-timeout"?"Timed out during startup":e==="shutdown"?"Cancelled during shutdown":e==="user"?"Cancelled by user":"Cancelled"}function _w(t){return t.lifecycle==="awaiting_plan_decision"||t.lifecycle==="awaiting_user_input"||t.lifecycle==="awaiting_worktree_decision"||t.lifecycle==="suspended"}function cl(t,e,n){return{phase:e,integration:"phase-1-managed-task-flow",sessionId:t.id,sessionName:t.name,sessionStatus:t.status,sessionLifecycle:t.lifecycle,summary:n}}function Ew(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.createManaged=="function"&&typeof e.resume=="function"&&typeof e.setWaiting=="function"&&typeof e.finish=="function"&&typeof e.fail=="function"}function Bf(t,e){if(e.applied)return e.flow;let n=e.current;return n?.flowId&&typeof n.revision=="number"?n:t}var ml=class{constructor(e){this.taskFlow=e}taskFlow;flow;finalized=!1;lastProgressKey;create(e){if(this.flow||this.finalized)return;let n="Starting",r=Date.now();try{this.flow=this.taskFlow.createManaged({controllerId:xw,goal:Tw(e),status:"running",notifyPolicy:"silent",currentStep:n,stateJson:cl(e,"created",n),createdAt:e.startedAt,updatedAt:r}),this.lastProgressKey=this.progressKey(e,n)}catch(o){qi("create",o)}}progress(e){if(!this.flow||this.finalized)return;let n=Cw(e);if(!n)return;let r=this.progressKey(e,n);if(r!==this.lastProgressKey)try{let o=cl(e,"progress",n),i=Date.now(),s=_w(e)?this.taskFlow.setWaiting({flowId:this.flow.flowId,expectedRevision:this.flow.revision,currentStep:n,stateJson:o,waitJson:{reason:n,sessionId:e.id},blockedSummary:n,updatedAt:i}):this.taskFlow.resume({flowId:this.flow.flowId,expectedRevision:this.flow.revision,status:"running",currentStep:n,stateJson:o,updatedAt:i});this.flow=Bf(this.flow,s),this.lastProgressKey=r}catch(o){qi("progress",o)}}finalize(e){if(!this.flow||this.finalized)return;let n=Mw(e);if(!n)return;let r=n==="succeeded"?"Completed":n==="failed"?"Failed":pl(e.status,e.killReason);try{let o=e.completedAt??Date.now(),i={...cl(e,"terminal",r),terminalStatus:n,terminalSummary:pl(e.status,e.killReason),...e.status==="failed"&&e.error?{error:e.error}:{}},s=n==="succeeded"?this.taskFlow.finish({flowId:this.flow.flowId,expectedRevision:this.flow.revision,stateJson:i,updatedAt:o,endedAt:o}):this.taskFlow.fail({flowId:this.flow.flowId,expectedRevision:this.flow.revision,stateJson:i,blockedSummary:pl(e.status,e.killReason),updatedAt:o,endedAt:o});Rw("finalize",s),this.flow=Bf(this.flow,s),this.finalized=!0}catch(o){qi("finalize",o)}}progressKey(e,n){return`${e.status}:${e.lifecycle}:${n}`}};function ji(t){if(!t.sessionKey?.trim())return Vi;try{let e=Lf()?.fromToolContext;if(typeof e!="function")return Vi;let n=e(t);return Ew(n)?new ml(n):Vi}catch(e){return qi("resolve",e),Vi}}function $w(t){return t instanceof Error?t.message:String(t)}function Uf(t,e){return t?("id"in t?t.id:t.sessionId)??e??"unknown-session":e??"unknown-session"}function Ow(t){return!t||typeof t!="object"?!1:typeof t.prompt=="string"}function Dw(t){return!!t&&typeof t=="object"&&typeof t.formatLaunchResult=="function"}function Kf(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:c.Object({prompt:c.String({description:"The task prompt to execute"}),name:c.Optional(c.String({description:"Short human-readable name for the session (kebab-case, e.g. 'fix-auth'). Auto-generated from prompt if omitted."})),workdir:c.Optional(c.String({description:"Working directory (defaults to cwd)"})),model:c.Optional(c.String({description:"Model name to use"})),system_prompt:c.Optional(c.String({description:"Additional system prompt"})),allowed_tools:c.Optional(c.Array(c.String(),{description:"List of allowed tools"})),resume_session_id:c.Optional(c.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:c.Optional(c.Boolean({description:"When resuming, fork to a new session instead of continuing the existing one. Use with resume_session_id."})),force_new_session:c.Optional(c.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:c.Optional(c.Union([c.Literal("default"),c.Literal("plan"),c.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:c.Optional(c.Union([c.Literal("ask"),c.Literal("delegate"),c.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:c.Optional(c.String({description:"Agent harness to use (e.g. 'claude-code'). Defaults to 'claude-code'."})),worktree_strategy:c.Optional(c.Union([c.Literal("off"),c.Literal("manual"),c.Literal("ask"),c.Literal("delegate"),c.Literal("auto-merge"),c.Literal("auto-pr")],{description:"Worktree strategy: 'off' (no worktree), 'manual' (create worktree but no auto merge-back), 'ask' (prompt user with Merge/Open PR/Later/Discard 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:c.Optional(c.String({description:"Base branch for worktree merge/PR operations (default: auto-detected or 'main')"})),worktree_pr_target_repo:c.Optional(c.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,n){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!Ow(n))return{content:[{type:"text",text:"Error: Invalid parameters. Expected at least { prompt }."}]};n.agentId&&console.warn(`[agent_launch] \u26A0\uFE0F agentId="${n.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 r=Bi(n,t,v);if(r.kind!=="resolved")return{content:[{type:"text",text:r.text}]};let{workdir:o,harness:i,resolvedModel:s,permissionMode:a,planApproval:d,originChannel:l,originThreadId:u,originSessionKey:f,route:g,resumeSessionId:y,resolvedResumeId:k,clearedPersistedCodexResume:I,reasoningEffort:P}=r,b=n.resume_session_id?v.resolve(n.resume_session_id)??v.getPersistedSession(n.resume_session_id):void 0,A=!n.fork_session&&b?co(b):void 0;if(A?.kind==="direct")return{content:[{type:"text",text:`Session ${b.name} [${Uf(b,n.resume_session_id)}] is already running. Use agent_respond(session='${n.resume_session_id}', message='<next instruction>') instead of agent_launch(resume_session_id=...).`}]};if(A?.kind==="unavailable")return{content:[{type:"text",text:`Resume unavailable for session ${b.name} [${Uf(b,n.resume_session_id)}] (${A.reason}). Use agent_launch(prompt='<new task>') for a fresh session or set fork_session=true to fork from prior context.`}]};let C=v.spawn({prompt:n.prompt,sessionIdOverride:n.fork_session?void 0:A?.kind==="resume"||A?.kind==="relaunch"?A.stableSessionId:void 0,name:n.name,workdir:o,model:s,reasoningEffort:P,systemPrompt:n.system_prompt,allowedTools:n.allowed_tools,resumeSessionId:A?.kind==="resume"?A.resumeSessionId:y,resumeWorktreeFrom:k,forkSession:y?n.fork_session:!1,multiTurn:!0,permissionMode:a,planApproval:d,codexApprovalPolicy:i==="codex"?"never":void 0,originChannel:l,originThreadId:u,originAgentId:t.agentId||void 0,originSessionKey:f,route:g,harness:i,taskLifecycle:ji(t),worktreeStrategy:n.worktree_strategy,worktreeBaseBranch:n.worktree_base_branch,worktreePrTargetRepo:n.worktree_pr_target_repo});return{content:[{type:"text",text:Dw(v)?v.formatLaunchResult({prompt:n.prompt,workdir:o,harness:i,permissionMode:a??_.permissionMode,planApproval:d,forceNewSession:n.force_new_session,resumeSessionId:n.resume_session_id,forkSession:n.fork_session,clearedPersistedCodexResume:I},C):wi({prompt:n.prompt,workdir:o,harness:i,permissionMode:a??_.permissionMode,planApproval:d,resumeSessionId:n.resume_session_id,forkSession:n.fork_session,forceNewSession:n.force_new_session,clearedPersistedCodexResume:I},{id:C.id,name:C.name,model:C.model,reasoningEffort:C.reasoningEffort??an(i),worktreeStrategy:C.worktreeStrategy??n.worktree_strategy??_.defaultWorktreeStrategy??"off",worktreePath:C.worktreePath,originalWorkdir:C.originalWorkdir})}]}}catch(r){let o=$w(r),i=o.includes("Max sessions")?"":`
|
|
54
54
|
|
|
55
|
-
Use agent_sessions to see active sessions and their status.`;return{content:[{type:"text",text:`Error launching session: ${o}${i}`}]}}}}}De();Y();Te();import{existsSync as
|
|
56
|
-
`),[r="",...o]=n;t.length===0?t.push(r):t[t.length-1]+=r;for(let i of o)t.push(i)}function
|
|
57
|
-
${e}`:e,this.deps.emitOutput(e)}noteToolCall(e){let{name:n,input:r,currentPermissionMode:o,permissionMode:i,planModeApproved:s}=e;if(n==="Write"){let a=r;typeof a?.file_path=="string"&&a.file_path.includes("/.claude/plans/")&&this.deps.setPlanFilePath(a.file_path)}n==="AskUserQuestion"?(this.lastTurnHadQuestion=!0,this.deps.applyInputRequested(),(o==="plan"||i==="plan")&&!s&&this.deps.markPendingPlanApproval("plan-mode")):(n==="ExitPlanMode"||n==="set_permission_mode")&&!s&&(this.lastTurnHadQuestion=!0,this.deps.markPendingPlanApproval("plan-mode")),this.deps.emitToolUse(n,r)}notePendingInput(){this.lastTurnHadQuestion=!0,this.deps.applyInputRequested(),this.waitingForInputFired||(this.waitingForInputFired=!0,this.deps.emitTurnEnd(!0))}clearResolvedPendingInput(e,n){if(!(!e||n?.requestId===e))return n}notePlanArtifact(e,n){if(this.currentTurnPlanArtifact=e,this.deps.setLatestPlanArtifact(e),!n)return;let r=e.markdown.trim();!r||this.currentTurnText.trim()===r||(this.deps.appendOutput(r),this.currentTurnText=r,this.deps.emitOutput(r))}noteSettingsChanged(e){let{oldMode:n,permissionMode:r,planModeApproved:o}=e;if(r)return r!=="plan"&&n==="plan"&&!o&&(this.deps.markPendingPlanApproval("plan-mode"),this.lastTurnHadQuestion=!0),r}finishSuccessfulTurn(e){let{currentPermissionMode:n,permissionMode:r,pendingPlanApproval:o,planModeApproved:i,pendingInputState:s,hasPendingMessages:a}=e,d=o;(n==="plan"||r==="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 Hi=class{constructor(e){this.deps=e}deps;applyMessage(e,n){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,n.pendingPlanApproval);return}if(e.type==="tool_call"){this.deps.noteToolCall({name:e.name,input:e.input,currentPermissionMode:n.currentPermissionMode,permissionMode:n.permissionMode,planModeApproved:n.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,n.pendingInputState));return}if(e.type==="plan_artifact"){this.deps.notePlanArtifact(e);return}if(e.type==="settings_changed"){let r=this.deps.noteSettingsChanged({oldMode:n.currentPermissionMode,permissionMode:e.permissionMode,planModeApproved:n.planModeApproved});r&&this.deps.setCurrentPermissionMode(r);return}if(e.type==="run_completed"){this.deps.handleRunCompleted(e.data);return}e.type}};rt();var oI=120*1e3;function is(t){return t instanceof Error?t.message:String(t)}var ss=class extends rI{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 Gi;constructor(e,n){super(),this.id=e.sessionIdOverride??Vi(8),this.name=n,this.harness=e.harness?oo(e.harness):Rf(),this.prompt=e.prompt,this.workdir=e.workdir,this.model=e.model??or(this.harness.name),this.reasoningEffort=e.reasoningEffort??an(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 ji({appendOutput:r=>Hf(this.outputBuffer,this.id,r),emitOutput:r=>this.emit("output",this,r),emitToolUse:(r,o)=>this.emit("toolUse",this,r,o),emitTurnEnd:r=>this.emit("turnEnd",this,r),markPendingPlanApproval:r=>this.markPendingPlanApproval(r),markAwaitingUserInput:()=>this.markAwaitingUserInput(),applyInputRequested:()=>this.applyControlEvent({type:"input.requested"}),completeTurn:()=>{this.applyControlEvent({type:"terminal.entered"}),this.complete("done")},setPlanFilePath:r=>{this.planFilePath=r},setLatestPlanArtifact:r=>{this.latestPlanArtifact=r;let o=this.pendingPlanApproval?this.actionablePlanDecisionVersion??this.planDecisionVersion:void 0;this.latestPlanArtifactVersion=o&&o>0?o:void 0}}),this.harnessEvents=new Hi({clearStartupTimer:()=>this.clearTimer("startup"),assignBackendRef:r=>{this.backendRef=r,this.harnessSessionId=r.conversationId,r.worktreePath&&(this.worktreePath=r.worktreePath,this.originalWorkdir??=this.workdir,this.worktreeBranch??=Zi(r.worktreePath),this.worktreeStrategy&&this.worktreeStrategy!=="off"&&this.applyControlEvent({type:"worktree.state_set",worktreeState:"provisioned"}))},noteRunStarted:r=>{this.backendRef&&(this.backendRef={...this.backendRef,runId:r})},transitionRunning:()=>{this._status==="starting"&&this.transition("running")},noteTextDelta:(r,o)=>this.turnRuntime.noteTextDelta(r,o),noteToolCall:r=>this.turnRuntime.noteToolCall(r),setPendingInputState:r=>{this.pendingInputState=r},notePendingInput:()=>this.turnRuntime.notePendingInput(),clearResolvedPendingInput:(r,o)=>this.turnRuntime.clearResolvedPendingInput(r,o),notePlanArtifact:r=>this.turnRuntime.notePlanArtifact(r.artifact,r.finalized),noteSettingsChanged:r=>this.turnRuntime.noteSettingsChanged(r),setCurrentPermissionMode:r=>{this.currentPermissionMode=r,this.applyControlEvent({type:"permission.mode_changed",currentPermissionMode:r})},handleRunCompleted:r=>{let o=r.outcome??(r.success?"completed":"failed");this.result={subtype:o==="interrupted"?"interrupted":r.success?"success":"error",duration_ms:r.duration_ms,total_cost_usd:r.total_cost_usd,num_turns:r.num_turns,result:r.result,is_error:o==="failed",session_id:r.session_id},this.costUsd=r.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 M(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(!Vf[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 n=this._status;this._status=e,this.applyControlEvent({type:"status.transition",status:e}),this.emit("statusChange",this,e,n)}setTimer(e,n,r){this.timers.set(e,n,r)}clearTimer(e){this.timers.clear(e)}clearAllTimers(){this.timers.clearAll()}markPendingPlanApproval(e){let n=this.latestPlanArtifactVersion;this.approvalRationale=void 0,this.applyControlEvent({type:"plan.requested",context:e});let r=this.actionablePlanDecisionVersion??this.planDecisionVersion;this.currentTurnPlanArtifact&&r>0?(this.latestPlanArtifact=this.currentTurnPlanArtifact,this.latestPlanArtifactVersion=r):n!==r&&(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 qi,this.messageStream.push(this.harness.buildUserMessage(this.prompt,"")),e=this.messageStream):e=this.prompt;let n=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:Zm(),canUseTool:this.canUseTool});this.harnessHandle=n,this.setTimer("startup",oI,()=>{this._status==="starting"&&this.kill("startup-timeout")})}catch(e){let n=e instanceof Error?e.message:String(e);this.transitionToTerminal("failed",{error:n});return}this.consumeMessages(this.harnessHandle.messages).catch(e=>{let n=e instanceof Error?e.message:String(e),r=e instanceof Error?e.stack:void 0;console.error(`[Session ${this.id}] consumeMessages error: ${n}`,r),this.isActive&&this.transitionToTerminal("failed",{error:n})})}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 n=e;if(this.pendingModeSwitch){let r=this.pendingModeSwitch,o=!1,i=!1;if(this.harnessHandle?.setPermissionMode)try{await this.harnessHandle.setPermissionMode(r),this.currentPermissionMode=r,this.applyControlEvent({type:"permission.mode_changed",currentPermissionMode:r}),this.pendingModeSwitch=void 0,i=!0,o=!0}catch(s){throw console.error(`[Session ${this.id}] setPermissionMode(${r}) FAILED: ${is(s)}`),this.markPendingPlanApproval(this.planApprovalContext??"plan-mode"),new Error(`Failed to switch permission mode to ${r}: ${is(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(),r!=="plan"&&this.applyControlEvent({type:"plan.approved"})),o&&(n=`[SYSTEM: The user has approved your plan. Exit plan mode immediately and implement the changes with full permissions. Do not ask for further confirmation.]
|
|
55
|
+
Use agent_sessions to see active sessions and their status.`;return{content:[{type:"text",text:`Error launching session: ${o}${i}`}]}}}}}De();Y();Te();import{existsSync as Pl,readFileSync as cg}from"fs";import{EventEmitter as iI}from"events";import{webcrypto as qf}from"node:crypto";var Vf="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var Nw=128,Dn,fr;function Fw(t){if(t<0||t>1024)throw new RangeError("Wrong ID size");!Dn||Dn.length<t?(Dn=Buffer.allocUnsafe(t*Nw),qf.getRandomValues(Dn),fr=0):fr+t>Dn.length&&(qf.getRandomValues(Dn),fr=0),fr+=t}function Gi(t=21){Fw(t|=0);let e="";for(let n=fr-t;n<fr;n++)e+=Vf[Dn[n]&63];return e}al();Te();he();var jf={starting:["running","failed","killed"],running:["completed","failed","killed"],completed:[],failed:[],killed:[]},Gf=new Set(["merged","released","pr_open","dismissed","cleanup_failed"]);function Lw(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 Ne(t){return{...t,approvalExecutionState:Lw(t)}}function fl(t,e){switch(e.type){case"initialize":return Ne({...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"?Ne({...t,status:e.status,lifecycle:"starting",runtimeState:"live"}):e.status==="running"?Ne({...t,status:e.status,lifecycle:t.lifecycle==="starting"||t.lifecycle==="suspended"?"active":t.lifecycle,runtimeState:"live"}):Ne({...t,status:e.status,runtimeState:"stopped",lifecycle:t.lifecycle==="suspended"?"suspended":"terminal"});case"permission.mode_changed":return Ne({...t,currentPermissionMode:e.currentPermissionMode});case"turn.started":return Ne({...t,lifecycle:"active",runtimeState:"live"});case"input.requested":return Ne({...t,lifecycle:t.pendingPlanApproval?"awaiting_plan_decision":"awaiting_user_input"});case"plan.requested":if(t.planModeApproved)return t;{let n=t.pendingPlanApproval&&t.approvalState==="pending"&&t.planApprovalContext===e.context,r=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=n||r||o?t.planDecisionVersion:t.planDecisionVersion+1;return Ne({...t,pendingPlanApproval:!0,planApprovalContext:e.context,approvalState:"pending",planDecisionVersion:i,actionablePlanDecisionVersion:i,canonicalPlanPromptVersion:n?t.canonicalPlanPromptVersion:void 0,approvalPromptRequiredVersion:n?t.approvalPromptRequiredVersion:void 0,approvalPromptVersion:n?t.approvalPromptVersion:void 0,approvalPromptStatus:n?t.approvalPromptStatus:"not_sent",approvalPromptTransport:n?t.approvalPromptTransport:"none",approvalPromptMessageKind:n?t.approvalPromptMessageKind:"none",approvalPromptLastAttemptAt:n?t.approvalPromptLastAttemptAt:void 0,approvalPromptDeliveredAt:n?t.approvalPromptDeliveredAt:void 0,approvalPromptFailedAt:n?t.approvalPromptFailedAt:void 0,lifecycle:"awaiting_plan_decision"})}case"plan.cleared":return Ne({...t,pendingPlanApproval:!1,planApprovalContext:void 0,actionablePlanDecisionVersion:void 0,approvalState:t.approvalState==="pending"?"not_required":t.approvalState});case"plan.approved":return Ne({...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 Ne({...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 Ne({...t,lifecycle:e.suspended?"suspended":"terminal",runtimeState:"stopped"});case"worktree.decision_requested":return Ne({...t,lifecycle:"awaiting_worktree_decision",worktreeState:"pending_decision"});case"worktree.state_set":return Ne({...t,worktreeState:e.worktreeState,lifecycle:e.worktreeState==="pending_decision"?"awaiting_worktree_decision":Gf.has(e.worktreeState)?"terminal":t.lifecycle});case"delivery.state_set":return Ne({...t,deliveryState:e.deliveryState})}}function Hf(t,e){let n={...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&&(n={...n,pendingPlanApproval:!1}),n.pendingPlanApproval?n={...n,approvalState:"pending",actionablePlanDecisionVersion:n.actionablePlanDecisionVersion??n.planDecisionVersion,lifecycle:"awaiting_plan_decision"}:n.approvalState==="changes_requested"&&(n={...n,actionablePlanDecisionVersion:void 0,lifecycle:"awaiting_user_input"}),e.pendingWorktreeDecisionSince!==void 0||n.worktreeState==="pending_decision"?n=fl(n,{type:"worktree.decision_requested"}):Gf.has(n.worktreeState)&&(n={...n,lifecycle:"terminal"}),Ne(n)}var Hi=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 Ww}from"fs";import{tmpdir as Bw}from"os";import{join as Uw}from"path";var zf=2e3;function gr(t){return Uw(Bw(),`openclaw-agent-${t}.txt`)}function Kw(t,e){if(!e)return;let n=e.split(`
|
|
56
|
+
`),[r="",...o]=n;t.length===0?t.push(r):t[t.length-1]+=r;for(let i of o)t.push(i)}function Qf(t,e,n){Kw(t,n),t.length>zf&&t.splice(0,t.length-zf);try{Ww(gr(e),n,"utf-8")}catch{}return t}var zi=class{timers=new Map;get size(){return this.timers.size}set(e,n,r){this.clear(e);let o=setTimeout(r,n);o.unref?.(),this.timers.set(e,o)}clear(e){let n=this.timers.get(e);n&&(clearTimeout(n),this.timers.delete(e))}clearAll(){for(let e of this.timers.values())clearTimeout(e);this.timers.clear()}};var Qi=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,n){this.waitingForInputFired=!1,n||(this.lastTurnHadQuestion=!1),this.deps.appendOutput(e),this.currentTurnText+=this.currentTurnText?`
|
|
57
|
+
${e}`:e,this.deps.emitOutput(e)}noteToolCall(e){let{name:n,input:r,currentPermissionMode:o,permissionMode:i,planModeApproved:s}=e;if(n==="Write"){let a=r;typeof a?.file_path=="string"&&a.file_path.includes("/.claude/plans/")&&this.deps.setPlanFilePath(a.file_path)}n==="AskUserQuestion"?(this.lastTurnHadQuestion=!0,this.deps.applyInputRequested(),(o==="plan"||i==="plan")&&!s&&this.deps.markPendingPlanApproval("plan-mode")):(n==="ExitPlanMode"||n==="set_permission_mode")&&!s&&(this.lastTurnHadQuestion=!0,this.deps.markPendingPlanApproval("plan-mode")),this.deps.emitToolUse(n,r)}notePendingInput(){this.lastTurnHadQuestion=!0,this.deps.applyInputRequested(),this.waitingForInputFired||(this.waitingForInputFired=!0,this.deps.emitTurnEnd(!0))}clearResolvedPendingInput(e,n){if(!(!e||n?.requestId===e))return n}notePlanArtifact(e,n){if(this.currentTurnPlanArtifact=e,this.deps.setLatestPlanArtifact(e),!n)return;let r=e.markdown.trim();!r||this.currentTurnText.trim()===r||(this.deps.appendOutput(r),this.currentTurnText=r,this.deps.emitOutput(r))}noteSettingsChanged(e){let{oldMode:n,permissionMode:r,planModeApproved:o}=e;if(r)return r!=="plan"&&n==="plan"&&!o&&(this.deps.markPendingPlanApproval("plan-mode"),this.lastTurnHadQuestion=!0),r}finishSuccessfulTurn(e){let{currentPermissionMode:n,permissionMode:r,pendingPlanApproval:o,planModeApproved:i,pendingInputState:s,hasPendingMessages:a}=e,d=o;(n==="plan"||r==="plan")&&!d&&!i&&(this.deps.markPendingPlanApproval("plan-mode"),d=!0);let l=d||this.lastTurnHadQuestion||!!s;if(this.turnInProgress=a,l&&!this.waitingForInputFired)this.waitingForInputFired=!0,d||this.deps.markAwaitingUserInput(),this.deps.emitTurnEnd(!0);else if(!a&&!l){if(this.deps.queueWorktreeFinalizationPrompt?.()){this.turnInProgress=!0;return}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 Ji=class{constructor(e){this.deps=e}deps;applyMessage(e,n){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,n.pendingPlanApproval);return}if(e.type==="tool_call"){this.deps.noteToolCall({name:e.name,input:e.input,currentPermissionMode:n.currentPermissionMode,permissionMode:n.permissionMode,planModeApproved:n.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,n.pendingInputState));return}if(e.type==="plan_artifact"){this.deps.notePlanArtifact(e);return}if(e.type==="settings_changed"){let r=this.deps.noteSettingsChanged({oldMode:n.currentPermissionMode,permissionMode:e.permissionMode,planModeApproved:n.planModeApproved});r&&this.deps.setCurrentPermissionMode(r);return}if(e.type==="run_completed"){this.deps.handleRunCompleted(e.data);return}e.type}};rt();var sI=120*1e3;function as(t){return t instanceof Error?t.message:String(t)}var ds=class extends iI{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;worktreeFinalizationPromptIssued=!1;lifecycle="starting";approvalState="not_required";approvalExecutionState="not_plan_gated";approvalRationale;latestPlanArtifact;latestPlanArtifactVersion;runtimeState="live";deliveryState="idle";canUseTool;autoRespondCount=0;timers=new zi;constructor(e,n){super(),this.id=e.sessionIdOverride??Gi(8),this.name=n,this.harness=e.harness?lo(e.harness):Rf(),this.prompt=e.prompt,this.workdir=e.workdir,this.model=e.model??ar(this.harness.name),this.reasoningEffort=e.reasoningEffort??an(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 Qi({appendOutput:r=>Qf(this.outputBuffer,this.id,r),emitOutput:r=>this.emit("output",this,r),emitToolUse:(r,o)=>this.emit("toolUse",this,r,o),emitTurnEnd:r=>this.emit("turnEnd",this,r),markPendingPlanApproval:r=>this.markPendingPlanApproval(r),markAwaitingUserInput:()=>this.markAwaitingUserInput(),applyInputRequested:()=>this.applyControlEvent({type:"input.requested"}),completeTurn:()=>{this.applyControlEvent({type:"terminal.entered"}),this.complete("done")},queueWorktreeFinalizationPrompt:()=>this.queueWorktreeFinalizationPrompt(),setPlanFilePath:r=>{this.planFilePath=r},setLatestPlanArtifact:r=>{this.latestPlanArtifact=r;let o=this.pendingPlanApproval?this.actionablePlanDecisionVersion??this.planDecisionVersion:void 0;this.latestPlanArtifactVersion=o&&o>0?o:void 0}}),this.harnessEvents=new Ji({clearStartupTimer:()=>this.clearTimer("startup"),assignBackendRef:r=>{this.backendRef=r,this.harnessSessionId=r.conversationId,r.worktreePath&&(this.worktreePath=r.worktreePath,this.originalWorkdir??=this.workdir,this.worktreeBranch??=ns(r.worktreePath),this.worktreeStrategy&&this.worktreeStrategy!=="off"&&this.applyControlEvent({type:"worktree.state_set",worktreeState:"provisioned"}))},noteRunStarted:r=>{this.backendRef&&(this.backendRef={...this.backendRef,runId:r})},transitionRunning:()=>{this._status==="starting"&&this.transition("running")},noteTextDelta:(r,o)=>this.turnRuntime.noteTextDelta(r,o),noteToolCall:r=>this.turnRuntime.noteToolCall(r),setPendingInputState:r=>{this.pendingInputState=r},notePendingInput:()=>this.turnRuntime.notePendingInput(),clearResolvedPendingInput:(r,o)=>this.turnRuntime.clearResolvedPendingInput(r,o),notePlanArtifact:r=>this.turnRuntime.notePlanArtifact(r.artifact,r.finalized),noteSettingsChanged:r=>this.turnRuntime.noteSettingsChanged(r),setCurrentPermissionMode:r=>{this.currentPermissionMode=r,this.applyControlEvent({type:"permission.mode_changed",currentPermissionMode:r})},handleRunCompleted:r=>{let o=r.outcome??(r.success?"completed":"failed");this.result={subtype:o==="interrupted"?"interrupted":r.success?"success":"error",duration_ms:r.duration_ms,total_cost_usd:r.total_cost_usd,num_turns:r.num_turns,result:r.result,is_error:o==="failed",session_id:r.session_id},this.costUsd=r.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 M(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(!jf[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 n=this._status;this._status=e,this.applyControlEvent({type:"status.transition",status:e}),this.emit("statusChange",this,e,n)}setTimer(e,n,r){this.timers.set(e,n,r)}clearTimer(e){this.timers.clear(e)}clearAllTimers(){this.timers.clearAll()}markPendingPlanApproval(e){let n=this.latestPlanArtifactVersion;this.approvalRationale=void 0,this.applyControlEvent({type:"plan.requested",context:e});let r=this.actionablePlanDecisionVersion??this.planDecisionVersion;this.currentTurnPlanArtifact&&r>0?(this.latestPlanArtifact=this.currentTurnPlanArtifact,this.latestPlanArtifactVersion=r):n!==r&&(this.latestPlanArtifact=void 0,this.latestPlanArtifactVersion=void 0)}clearPendingPlanApproval(){this.applyControlEvent({type:"plan.cleared"})}markAwaitingUserInput(){this.applyControlEvent({type:"input.requested"})}queueWorktreeFinalizationPrompt(){if(!this.multiTurn||!this.messageStream||!this.worktreePath||!this.worktreeStrategy||this.worktreeStrategy==="off"||this.worktreeFinalizationPromptIssued)return!1;let e=Sr(this.worktreePath);if(e.length===0)return!1;this.worktreeFinalizationPromptIssued=!0;let n=e.slice(0,20).map(i=>`- ${i}`).join(`
|
|
58
|
+
`),r=e.length>20?`
|
|
59
|
+
- ...and ${e.length-20} more`:"",o=["Your worktree still has uncommitted changes, so this session cannot finish yet.","",`Worktree: ${this.worktreePath}`,`Branch: ${this.worktreeBranch??"(unknown)"}`,"","Dirty entries:",`${n}${r}`,"","Before finishing, run `git status --short` in the worktree and do exactly one of these:","1. If these are real task changes, commit them on the worktree branch with `git add` and `git commit`.","2. If these are temporary or unrelated artifacts, remove or restore them so the worktree is clean.","3. If no repository changes were intended, leave the worktree clean and say that no changes were needed.","","Do not finish again until `git status --short` is clean or all real task changes are committed."].join(`
|
|
60
|
+
`);return this.messageStream.push(this.harness.buildUserMessage(o,this.backendConversationId??"")),!0}async start(){try{let e;this.multiTurn?(this.messageStream=new Hi,this.messageStream.push(this.harness.buildUserMessage(this.prompt,"")),e=this.messageStream):e=this.prompt;let n=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:Zm(),canUseTool:this.canUseTool});this.harnessHandle=n,this.setTimer("startup",sI,()=>{this._status==="starting"&&this.kill("startup-timeout")})}catch(e){let n=e instanceof Error?e.message:String(e);this.transitionToTerminal("failed",{error:n});return}this.consumeMessages(this.harnessHandle.messages).catch(e=>{let n=e instanceof Error?e.message:String(e),r=e instanceof Error?e.stack:void 0;console.error(`[Session ${this.id}] consumeMessages error: ${n}`,r),this.isActive&&this.transitionToTerminal("failed",{error:n})})}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 n=e;if(this.pendingModeSwitch){let r=this.pendingModeSwitch,o=!1,i=!1;if(this.harnessHandle?.setPermissionMode)try{await this.harnessHandle.setPermissionMode(r),this.currentPermissionMode=r,this.applyControlEvent({type:"permission.mode_changed",currentPermissionMode:r}),this.pendingModeSwitch=void 0,i=!0,o=!0}catch(s){throw console.error(`[Session ${this.id}] setPermissionMode(${r}) FAILED: ${as(s)}`),this.markPendingPlanApproval(this.planApprovalContext??"plan-mode"),new Error(`Failed to switch permission mode to ${r}: ${as(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(),r!=="plan"&&this.applyControlEvent({type:"plan.approved"})),o&&(n=`[SYSTEM: The user has approved your plan. Exit plan mode immediately and implement the changes with full permissions. Do not ask for further confirmation.]
|
|
58
61
|
|
|
59
62
|
${e}`)}else if((this.pendingPlanApproval||this.approvalState==="changes_requested")&&!this.planModeApproved&&(this.approvalState!=="changes_requested"&&this.applyControlEvent({type:"plan.changes_requested"}),n=`[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.]
|
|
60
63
|
|
|
61
|
-
${e}`,this.harnessHandle?.setPermissionMode))try{await this.harnessHandle.setPermissionMode("plan"),this.currentPermissionMode="plan",this.applyControlEvent({type:"permission.mode_changed",currentPermissionMode:"plan"})}catch(r){console.warn(`[Session ${this.id}] Failed to re-assert plan mode: ${
|
|
62
|
-
`);return e.at(-1)===""&&e.pop(),e}function
|
|
63
|
-
`)}function
|
|
64
|
-
`)}function
|
|
64
|
+
${e}`,this.harnessHandle?.setPermissionMode))try{await this.harnessHandle.setPermissionMode("plan"),this.currentPermissionMode="plan",this.applyControlEvent({type:"permission.mode_changed",currentPermissionMode:"plan"})}catch(r){console.warn(`[Session ${this.id}] Failed to re-assert plan mode: ${as(r)}`)}if(this.multiTurn&&this.messageStream)this.messageStream.push(this.harness.buildUserMessage(n,this.backendConversationId??""));else if(this.harnessHandle?.streamInput){let r=this.harness.buildUserMessage(n,this.backendConversationId??"");async function*o(){yield r}await this.harnessHandle.streamInput(o())}else throw new Error("Session does not support follow-up messages (launched in single-turn mode).")}async interrupt(){return!this.turnInProgress||!this.harnessHandle?.interrupt?!1:(await this.harnessHandle.interrupt(),!0)}async submitPendingInputOption(e){if(!this.pendingInputState||!this.harnessHandle?.submitPendingInputOption)return!1;let n=await this.harnessHandle.submitPendingInputOption(e);return n&&(this.waitingForInputFired=!1),n}async submitPendingInputText(e){if(!this.pendingInputState||!this.harnessHandle?.submitPendingInputText)return!1;let n=await this.harnessHandle.submitPendingInputText(e);return n&&(this.waitingForInputFired=!1),n}switchPermissionMode(e){this.pendingModeSwitch=e}get isActive(){return this._status==="starting"||this._status==="running"}kill(e){this.transitionToTerminal("killed",{reason:e})}complete(e="done"){this.transitionToTerminal("completed",{reason:e})}incrementAutoRespond(){this.autoRespondCount++}resetAutoRespond(){this.autoRespondCount=0}getOutput(e){return e===void 0?this.outputBuffer.slice():this.outputBuffer.slice(-e)}resetIdleTimer(){if(!this.multiTurn)return;let e=(_.idleTimeoutMinutes??15)*60*1e3;this.setTimer("idle",e,()=>{this._status==="running"&&(this.applyControlEvent({type:"terminal.entered",suspended:!0}),this.kill("idle-timeout"))})}teardown(){this.clearAllTimers(),this.completedAt||(this.completedAt=Date.now()),this.messageStream&&this.messageStream.end(),this.harnessHandle?.interrupt&&this.harnessHandle.interrupt().catch(e=>{console.warn(`[Session ${this.id}] interrupt during teardown failed: ${as(e)}`)}),this.abortController.abort(),this.applyControlEvent({type:"terminal.entered",suspended:this.lifecycle==="suspended"})}transitionToTerminal(e,n={}){this.isActive&&(this.turnInProgress=!1,n.reason&&(this.killReason=n.reason),n.error!==void 0&&(this.error=n.error),this.completedAt=Date.now(),this.applyControlEvent({type:"terminal.entered",suspended:e==="killed"&&n.reason==="idle-timeout"}),this.transition(e),this.teardown())}async consumeMessages(e){for await(let n of e){if(!this.isActive)break;this.resetIdleTimer(),this.harnessEvents.applyMessage(n,{pendingPlanApproval:this.pendingPlanApproval,currentPermissionMode:this.currentPermissionMode,permissionMode:this.permissionMode,planModeApproved:this.planModeApproved,pendingInputState:this.pendingInputState})}}controlStateSnapshot(){return{status:this._status,lifecycle:this.lifecycle,approvalState:this.approvalState,approvalExecutionState:this.approvalExecutionState,worktreeState:this.worktreeState,runtimeState:this.runtimeState,deliveryState:this.deliveryState,requestedPermissionMode:this.requestedPermissionMode,currentPermissionMode:this.currentPermissionMode,pendingPlanApproval:this.pendingPlanApproval,planApprovalContext:this.planApprovalContext,planDecisionVersion:this.planDecisionVersion,actionablePlanDecisionVersion:this.actionablePlanDecisionVersion,canonicalPlanPromptVersion:this.canonicalPlanPromptVersion,approvalPromptRequiredVersion:this.approvalPromptRequiredVersion,approvalPromptVersion:this.approvalPromptVersion,approvalPromptStatus:this.approvalPromptStatus,approvalPromptTransport:this.approvalPromptTransport,approvalPromptMessageKind:this.approvalPromptMessageKind,approvalPromptLastAttemptAt:this.approvalPromptLastAttemptAt,approvalPromptDeliveredAt:this.approvalPromptDeliveredAt,approvalPromptFailedAt:this.approvalPromptFailedAt,planModeApproved:this.planModeApproved}}applyControlEvent(e){let n=fl(this.controlStateSnapshot(),e);this.applyControlState(n)}applyControlPatch(e){let n=Hf(this.controlStateSnapshot(),e);this.applyControlState(n)}setControlField(e,n){this.applyControlPatch({[e]:n})}applyControlState(e){let n=this.lifecycle;this.lifecycle=e.lifecycle,this.approvalState=e.approvalState,this.approvalExecutionState=e.approvalExecutionState,this.worktreeState=e.worktreeState,this.runtimeState=e.runtimeState,this.deliveryState=e.deliveryState,this.pendingPlanApproval=e.pendingPlanApproval,this.planApprovalContext=e.planApprovalContext,this.planDecisionVersion=e.planDecisionVersion,this.actionablePlanDecisionVersion=e.actionablePlanDecisionVersion,this.canonicalPlanPromptVersion=e.canonicalPlanPromptVersion,this.approvalPromptRequiredVersion=e.approvalPromptRequiredVersion,this.approvalPromptVersion=e.approvalPromptVersion,this.approvalPromptStatus=e.approvalPromptStatus,this.approvalPromptTransport=e.approvalPromptTransport,this.approvalPromptMessageKind=e.approvalPromptMessageKind,this.approvalPromptLastAttemptAt=e.approvalPromptLastAttemptAt,this.approvalPromptDeliveredAt=e.approvalPromptDeliveredAt,this.approvalPromptFailedAt=e.approvalPromptFailedAt,this.planModeApproved=e.planModeApproved,n!==this.lifecycle&&this.emit("lifecycleChange",this,this.lifecycle,n)}};var aI=50,dI=1,lI=new Set(["starting","running","completed","failed","killed"]),uI=5,pI=1440*60*1e3;function cI(t){let e=Number(t);return!Number.isFinite(e)||e<dI?aI:Math.floor(e)}function mI(t){return typeof t=="string"&&lI.has(t)}function fI(t){let e=t.split(`
|
|
65
|
+
`);return e.at(-1)===""&&e.pop(),e}function wl(t){return t.backendRef?.conversationId??t.harnessSessionId}function mg(t,e,n){let r=cg(t,"utf-8"),o=fI(r);return e.full?o:o.slice(-n)}function gI(t,e,n){if(t.status!=="starting"&&t.status!=="running")return null;let r=gr(t.id);if(!Pl(r))return null;try{return mg(r,e,n)}catch{return null}}function hI(t){let e=Rt(t.duration),n=` | Cost: $${t.costUsd.toFixed(4)}`,r=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()}${r}${o}${n} | Duration: ${e}`,`${"\u2500".repeat(60)}`].join(`
|
|
66
|
+
`)}function fg(t,e){let n=t.name||t.sessionId||wl(t)||"unknown",r=t.lifecycle?` | Phase: ${t.lifecycle}`:"";return[`Session: ${n} | Status: ${t.status.toUpperCase()}${r} | Cost: $${t.costUsd.toFixed(4)}`,e,`${"\u2500".repeat(60)}`].join(`
|
|
67
|
+
`)}function SI(t){return`(retrieved from ${t.outputPath} \u2014 evicted from runtime cache \u2014 showing persisted output)`}function yI(t){return t.outputPath?`(persisted session metadata recovered; output file is unavailable at ${t.outputPath})`:"(persisted session metadata recovered; no output file was recorded)"}function pg(t,e){let n=fg(t,yI(t)),r=wl(t),o=r?`
|
|
65
68
|
Backend session: ${r}`:"";return`${n}
|
|
66
|
-
(no persisted output available: ${e})${o}`}function
|
|
69
|
+
(no persisted output available: ${e})${o}`}function kI(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?`
|
|
67
70
|
(no output yet)
|
|
68
71
|
${e.join(`
|
|
69
72
|
`)}`:`
|
|
70
|
-
(no output yet)`}function
|
|
71
|
-
`),f=
|
|
73
|
+
(no output yet)`}function ls(t,e,n={}){let r=cI(n.lines),o=t.resolve(e);if(!o){let l=t.getPersistedSession(e);if(l?.outputPath&&Pl(l.outputPath))try{let u=mg(l.outputPath,n,r).join(`
|
|
74
|
+
`),f=fg(l,SI(l));return u?`${f}
|
|
72
75
|
${u}`:`${f}
|
|
73
|
-
(output file was empty)`}catch(u){let f=u instanceof Error?u.message:String(u);return`Error: Session "${e}" was cleaned up (expired) and output file could not be read: ${f}`}return l?.outputPath?
|
|
76
|
+
(output file was empty)`}catch(u){let f=u instanceof Error?u.message:String(u);return`Error: Session "${e}" was cleaned up (expired) and output file could not be read: ${f}`}return l?.outputPath?pg(l,`output file is missing at ${l.outputPath}`):l?pg(l,"no outputPath is stored for this recovered session"):`Error: Session "${e}" not found.`}let i=gI(o,n,r),s=i&&i.length>0?i:n.full?o.getOutput():o.getOutput(r),a=hI(o),d=s.length===0?`${a}${kI(o)}`:`${a}
|
|
74
77
|
${s.join(`
|
|
75
|
-
`)}`;if(o.pendingPlanApproval&&o.planFilePath)try{if(
|
|
78
|
+
`)}`;if(o.pendingPlanApproval&&o.planFilePath)try{if(Pl(o.planFilePath)){let l=cg(o.planFilePath,"utf-8"),u="\u2500".repeat(60);return`${d}
|
|
76
79
|
${u}
|
|
77
80
|
Plan file: ${o.planFilePath}
|
|
78
81
|
${u}
|
|
79
|
-
${l}`}}catch{}return d}function
|
|
82
|
+
${l}`}}catch{}return d}function us(t,e="all",n,r={}){let o=t.listPersistedSessions()??[],s=vI(t.list("all"),o);if(e!=="all"&&(s=s.filter(a=>a.status===e)),n&&(s=s.filter(a=>a.originChannel===n)),r.full){let a=Date.now()-pI;s=s.filter(d=>(d.startedAt??0)>=a)}else s=s.slice(0,uI);return s.length===0?"No sessions found.":s.map(a=>Of(a)).join(`
|
|
80
83
|
|
|
81
|
-
`)}function
|
|
84
|
+
`)}function vI(t,e){let n=new Map;for(let r of e){if(!mI(r.status))continue;let o=r.completedAt??Date.now(),i=r.createdAt??o,s=wl(r),a=r.sessionId??`persisted:${s??r.harnessSessionId}`;n.set(a,{id:r.sessionId??s??r.harnessSessionId,name:r.name||r.sessionId||s||r.harnessSessionId,status:r.status,startedAt:r.createdAt??0,completedAt:r.completedAt,duration:Math.max(0,o-i),prompt:r.prompt??"",workdir:r.workdir??"(unknown)",costUsd:r.costUsd??0,multiTurn:!0,phase:r.lifecycle??r.status,lifecycle:r.lifecycle,resumable:r.resumable,harness:r.harness,backendRef:r.backendRef,harnessSessionId:r.harnessSessionId,requestedPermissionMode:r.requestedPermissionMode,currentPermissionMode:r.currentPermissionMode,approvalExecutionState:r.approvalExecutionState,originChannel:r.originChannel,originThreadId:r.originThreadId,worktreePath:r.worktreePath,worktreeBranch:r.worktreeBranch,worktreeStrategy:r.worktreeStrategy,worktreeMerged:r.worktreeMerged,worktreeMergedAt:r.worktreeMergedAt,worktreePrUrl:r.worktreePrUrl})}for(let r of t)n.set(r.id,{id:r.id,name:r.name,status:r.status,startedAt:r.startedAt,completedAt:r.completedAt,duration:r.duration,prompt:r.prompt,workdir:r.originalWorkdir??r.workdir,costUsd:r.costUsd,multiTurn:r.multiTurn,phase:r.phase,lifecycle:r.lifecycle,resumable:r.isExplicitlyResumable,harness:r.harnessName,backendRef:r.backendRef,harnessSessionId:r.harnessSessionId,requestedPermissionMode:r.requestedPermissionMode,currentPermissionMode:r.currentPermissionMode,approvalExecutionState:r.approvalExecutionState,originChannel:r.originChannel,originThreadId:r.originThreadId,worktreePath:r.worktreePath,worktreeBranch:r.worktreeBranch,worktreeStrategy:r.worktreeStrategy,worktreeMerged:void 0,worktreeMergedAt:void 0,worktreePrUrl:void 0});return[...n.values()].sort((r,o)=>(o.startedAt??0)-(r.startedAt??0))}function PI(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 gg(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:c.Object({status:c.Optional(c.Union([c.Literal("all"),c.Literal("running"),c.Literal("completed"),c.Literal("failed"),c.Literal("killed")],{description:'Filter by status (default "all")'})),full:c.Optional(c.Boolean({description:"Show all sessions from the last 24h instead of just the most recent 5"}))}),async execute(e,n){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};let r=PI(n),o=t?.workspaceDir?ro(t.workspaceDir):void 0,i=!!(n&&typeof n=="object"&&n.full===!0);return{content:[{type:"text",text:us(v,r,o,{full:i})}]}}}}De();Y();function ps(t,e,n){let r=t.resolve(e);return r?r.status==="completed"||r.status==="failed"||r.status==="killed"?`Session ${r.name} [${r.id}] is already ${r.status}. No action needed.`:n==="completed"?(r.complete(),`Session ${r.name} [${r.id}] marked as completed.`):(t.kill(r.id),`Session ${r.name} [${r.id}] has been terminated.`):`Error: Session "${e}" not found.`}function wI(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 hg(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:c.Object({session:c.String({description:"Session name or ID to terminate"}),reason:c.Optional(c.Union([c.Literal("completed"),c.Literal("killed")],{description:"Reason for closing the session. 'completed' marks it as successfully done (sends \u2705 notification). 'killed' (default) terminates it."}))}),async execute(e,n){return v?wI(n)?{content:[{type:"text",text:ps(v,n.session,n.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."}]}}}}De();Y();function II(t){return!t||typeof t!="object"?!1:typeof t.session=="string"}function cs(t){return{name:"agent_output",description:"Show recent output from a coding agent session (by name or ID).",parameters:c.Object({session:c.String({description:"Session name or ID to get output from"}),lines:c.Optional(c.Number({description:"Number of recent lines to show (default 50)"})),full:c.Optional(c.Boolean({description:"Show all available output"}))}),async execute(e,n){return v?II(n)?{content:[{type:"text",text:ls(v,n.session,{full:n.full,lines:n.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."}]}}}}De();Y();Te();he();var bI=10;function bl(t){return t instanceof Error?t.message:String(t)}function Wn(t){return ne(t)??t.harnessSessionId??"unknown-session"}function Sg(t){return t.status!=="running"&&!!t.pendingPlanApproval&&!!M(t)}function xI(t){let e=t.trim().toLowerCase().replace(/[.!?]+$/g,"").trim();if(e==="approve"||e==="approved")return"approve";if(e==="revise"||e==="request changes"||e==="changes requested")return"revise";if(e==="reject"||e==="rejected")return"reject"}function ko(t,e,n){let r=e==="completed"?`This session is closed by default. Launch a fresh session, or fork from prior context with agent_launch(resume_session_id='${Wn(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='${Wn(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='${Wn(t)}', fork_session=true, prompt='<new task>').`:`Use agent_respond(session='${Wn(t)}', message='<next instruction>') to continue the running session.`,o=n?` ${n}`:"";return{text:`Resume unavailable for session ${t.name} [${Wn(t)}] (${e}).${o} ${r}`,isError:!0}}async function yg(t,e,n){try{let r={prompt:e.prompt,sessionIdOverride:ul(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(r,{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(r){return{text:`Error relaunching session ${e.name} [${Wn(e)}]: ${bl(r)}`,isError:!0}}}var AI=`[SYSTEM: The user has approved your plan. Exit plan mode immediately and implement the changes with full permissions. Do not ask for further confirmation.]
|
|
82
85
|
|
|
83
|
-
`;function
|
|
84
|
-
`)}}let l=!1;e.interrupt&&(l=await n.interrupt());let u=!!(e.approve&&
|
|
86
|
+
`;function kg(t){let e=t?.replace(/\s+/g," ").trim();if(e)return Ce(e,240)}function Il(t){if(t.approvalState==="changes_requested"&&!ms(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 ms(t){return t.pendingPlanApproval?(t.approvalState==="changes_requested"?t.actionablePlanDecisionVersion:t.actionablePlanDecisionVersion??t.planDecisionVersion)>0:!1}function RI(t){return Il(t)?!1:ms(t)||t.currentPermissionMode==="plan"}function TI(t,e){let n=t.updatePersistedSession;if(typeof n!="function")return;let r=e.controlStateSnapshot();n.call(t,e.id,{lifecycle:r.lifecycle,approvalState:r.approvalState,approvalExecutionState:r.approvalExecutionState,runtimeState:r.runtimeState,requestedPermissionMode:r.requestedPermissionMode,currentPermissionMode:r.currentPermissionMode,pendingPlanApproval:r.pendingPlanApproval,planApprovalContext:r.planApprovalContext,planDecisionVersion:r.planDecisionVersion,actionablePlanDecisionVersion:r.actionablePlanDecisionVersion,planModeApproved:r.planModeApproved,approvalRationale:e.approvalRationale})}function CI(t){return(t.planDecisionVersion??0)+1}function vg(t,e){let n={approvalState:e,lifecycle:e==="rejected"?"terminal":"awaiting_user_input",pendingPlanApproval:!1,planApprovalContext:void 0,planDecisionVersion:CI(t),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};return e==="rejected"&&(n.runtimeState="stopped"),n}function Pg(t,e){let n=t;typeof n.applyControlPatch=="function"&&n.applyControlPatch(e),Object.assign(t,e)}function xl(t,e){let n=t.resolve(e),r=n?void 0:t.getPersistedSession(e),o=n??r,i=o?.name??e;if(t.clearPlanDecisionTokens?.(e),!o)return{text:`Plan rejected for [${i}].`,isError:!1};let s=vg(o,"rejected");return n?(Pg(n,s),t.updatePersistedSession?.(e,s),t.kill(n.id,"user"),{text:`Plan rejected for [${n.name}]. Session stopped.`}):(t.updatePersistedSession?.(e,s),{text:`Plan rejected for [${i}]. Session remains stopped.`})}function Al(t,e){let n=t.resolve(e),r=n?void 0:t.getPersistedSession(e),o=n??r,i=o?.name??e;if(t.clearPlanDecisionTokens?.(e),o){let s=vg(o,"changes_requested");n&&Pg(n,s),t.updatePersistedSession?.(e,s)}return{text:`Type your revision feedback for [${i}] and I'll forward it to the agent.`}}async function MI(t,e,n,r={}){let o=co(e);if(!(o.kind==="resume"||Sg(e)))return;let s=!!(r.approve&&RI(e)),a=s?kg(r.approvalRationale):void 0;try{if(o.kind!=="resume")return o.kind==="relaunch"?yg(t,e,n):ko(e,o.reason);let d={prompt:s?AI+n:n,sessionIdOverride:o.stableSessionId,workdir:e.workdir,name:e.name,model:e.model,reasoningEffort:e.reasoningEffort,resumeSessionId:o.resumeSessionId,worktreeStrategy:e.worktreeStrategy,worktreeBaseBranch:e.worktreeBaseBranch,worktreePrTargetRepo:e.worktreePrTargetRepo,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 ko(e,"missing_backend_state",`Backend resume failed: ${bl(d)}`)}}async function ct(t,e){let n=t.resolve(e.session),r=n?void 0:t.getPersistedSession(e.session);if(!n&&!r)return{text:`Error: Session "${e.session}" not found.`,isError:!0};let o=n??r,i=o.status==="running"?{kind:"direct"}:co(o),s=!e.approve&&o.lifecycle==="awaiting_plan_decision"&&o.pendingPlanApproval&&e.userInitiated?xI(e.message):void 0;if(s==="approve")return ct(t,{...e,message:"Approved. Go ahead.",approve:!0});if(s==="revise")return Al(t,n?.id??r?.sessionId??e.session);if(s==="reject")return xl(t,n?.id??r?.sessionId??e.session);if(e.approve){let d=Il(o);if(d)return{text:d,isError:!0}}if(i.kind==="resume"||Sg(o)){let d=await MI(t,o,e.message,{approve:e.approve,approvalRationale:e.approvalRationale});if(d)return d}else{if(i.kind==="relaunch")return yg(t,o,e.message);if(i.kind==="unavailable")return ko(o,i.reason)}if(!n)return po(r)?ko(r,"completed"):{text:`Error: Session ${r.name} [${Wn(r)}] is not running (status: ${r.status}). Cannot send a message to a non-running session.`,isError:!0};if(n.status!=="running")return po(n)?ko(n,"completed"):{text:`Error: Session ${n.name} [${n.id}] is not running (status: ${n.status}). Cannot send a message to a non-running session.`,isError:!0};let a=_.maxAutoResponds??bI;if(e.userInitiated)n.resetAutoRespond();else if(n.autoRespondCount>=a)return{text:`\u26A0\uFE0F Auto-respond limit reached (${n.autoRespondCount}/${a}). Ask the user to provide the answer for session ${n.name}. Then call agent_respond with their answer and set userInitiated: true to reset the counter.`};try{if(e.approve){let k=Il(n);if(k)return{text:k,isError:!0}}if(!e.approve&&n.pendingInputState?.allowsFreeText&&await n.submitPendingInputText?.(e.message)===!0){if(e.userInitiated){let I=Ce(e.message,100);t.notifySession(n,`\u21AA\uFE0F [${n.name}] "${I}"`,"agent-respond")}e.userInitiated||n.incrementAutoRespond();let k=Ce(e.message,80);return{text:[`Pending input answered for session ${n.name} [${n.id}].`,` Message: "${k}"`,"Use agent_output to see the response."].join(`
|
|
87
|
+
`)}}let l=!1;e.interrupt&&(l=await n.interrupt());let u=!!(e.approve&&ms(n)),f=u?kg(e.approvalRationale):void 0,g="";if(e.approve&&ms(n)?(n.switchPermissionMode("bypassPermissions"),n.approvalRationale=f):e.approve&&n.currentPermissionMode==="default"?n.switchPermissionMode("bypassPermissions"):e.approve&&n.currentPermissionMode==="bypassPermissions"?g=`
|
|
85
88
|
\u2139\uFE0F approve=true was set but session is already in bypassPermissions mode.`:e.approve?g=`
|
|
86
89
|
\u26A0\uFE0F approve=true was set but session has no pending plan approval.`:(n.pendingPlanApproval||n.approvalState==="changes_requested")&&(g=`
|
|
87
|
-
\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 n.sendMessage(e.message),u&&
|
|
88
|
-
`)}}catch(d){return{text:`Error sending message to session ${n.name} [${n.id}]: ${wl(d)}`,isError:!0}}}function CI(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 kg(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:c.Object({session:c.String({description:"Session name or ID to respond to"}),message:c.String({description:"The message to send to the session"}),interrupt:c.Optional(c.Boolean({description:"If true, interrupt the current turn before sending the message. Useful to redirect the session mid-response."})),userInitiated:c.Optional(c.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:c.Optional(c.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:c.Optional(c.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,n){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!CI(n))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, message, interrupt?, userInitiated?, approve?, approval_rationale? }."}]};let r=await mt(v,{session:n.session,message:n.message,interrupt:n.interrupt,userInitiated:n.userInitiated,approve:n.approve,approvalRationale:n.approval_rationale});return{isError:r.isError??!1,content:[{type:"text",text:r.text}]}}}}De();Y();function MI(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.session=="string"&&typeof e.summary=="string"}function vg(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:c.Object({session:c.String({description:"Session name or ID awaiting plan approval"}),summary:c.String({description:"Concise user-facing summary of scope, risk, and any concerns that should accompany the approval buttons"})}),async execute(e,n){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!MI(n))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, summary }."}]};let r=v.requestPlanApprovalFromUser(n.session,n.summary);return{isError:r.startsWith("Error:"),content:[{type:"text",text:r}]}}}}De();Y();Te();var xl=["off","manual","ask","delegate","auto-merge","auto-pr"],cs=new Set(xl),_I=["low","medium","high","xhigh","max"],Pg=new Set(_I);function EI(t){return typeof t=="string"&&cs.has(t)}var OI=c.Union(xl.map(t=>c.Literal(t)),{description:"Optional worktree strategy for the planning session. Use auto-pr when the follow-up should branch and open/update a PR after approved implementation."});function $I(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.offer_id=="string"&&typeof e.offer_text=="string"&&typeof e.plan_prompt=="string"&&typeof e.plan_workdir=="string"&&(e.plan_worktree_strategy==null||EI(e.plan_worktree_strategy))&&(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 DI(t,e){let n=ir(t,e.target_channel,e.target_session_key);if(n)return e.target_thread_id!=null&&(n.threadId=String(e.target_thread_id)),n}async function NI(t,e){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};let n=DI(t,e);return!n?.provider||!n.target?{content:[{type:"text",text:"Error: Could not resolve a direct delivery route for the plan offer."}]}:(v.sendPlanOffer({offerId:e.offer_id,route:n,text:e.offer_text,planName:e.plan_name??e.offer_id,planPrompt:e.plan_prompt,planWorkdir:e.plan_workdir,planWorktreeStrategy:e.plan_worktree_strategy}),{content:[{type:"text",text:`Interactive plan offer queued for ${n.provider}|${n.target}${n.threadId?`#${n.threadId}`:""}.`}]})}function wg(t){return{name:"agent_send_plan_offer",description:"Post a user-facing message to the current or explicit chat route with human-gated Start Plan and Dismiss inline buttons. Use this when an external workflow wants the user to open a plan-only code-agent session from the message.",parameters:c.Object({offer_id:c.String({description:"Stable offer identifier, for example 'plugin-readiness-v2026.5.5'."}),offer_text:c.String({description:"Final user-facing text to deliver."}),plan_prompt:c.String({description:"Prompt to seed into the plan-only session when the user clicks Start Plan."}),plan_workdir:c.String({description:"Working directory for the planning session."}),plan_worktree_strategy:c.Optional(OI),plan_name:c.Optional(c.String({description:"Optional explicit session name for the planning session."})),target_channel:c.Optional(c.String({description:"Optional explicit route like 'telegram|-1003863755361'."})),target_thread_id:c.Optional(c.Union([c.String(),c.Number()],{description:"Optional explicit topic/thread id."})),target_session_key:c.Optional(c.String({description:"Optional explicit session key for wake routing."}))}),async execute(e,n){return $I(n)?NI(t,n):{content:[{type:"text",text:"Error: Invalid parameters. Expected { offer_id, offer_text, plan_prompt, plan_workdir }."}]}}}}De();Y();function Ig(t){return{name:"agent_stats",description:"Show OpenClaw Code Agent usage metrics: session counts by status, average duration, and notable sessions.",parameters:c.Object({}),async execute(e,n){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};let r=v.getMetrics(),o=v.list("running").length;return{content:[{type:"text",text:Fi(r,o)}]}}}}De();Te();Y();rt();ho();import{existsSync as Al}from"fs";function LI(t){return!t||typeof t!="object"?!1:typeof t.session=="string"}function Ss(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:c.Object({session:c.String({description:"Session name or ID to merge"}),base_branch:c.Optional(c.String({description:"Base branch to merge into (default: main)"})),strategy:c.Optional(c.Union([c.Literal("merge"),c.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:c.Optional(c.Boolean({description:"Push the base branch after successful merge (default: false)"})),delete_branch:c.Optional(c.Boolean({description:"Delete the worktree branch after successful merge (default: true)"}))}),async execute(e,n){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!LI(n))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, base_branch?, strategy?, push?, delete_branch? }."}]};let r=gr(v,n.session),o=r.activeSession,i=r.persistedSession;if(!o&&!i)return{content:[{type:"text",text:`Error: Session "${n.session}" not found.`}]};let{worktreePath:s,originalWorkdir:a,branchName:d}=r;if(!s||!a)return{content:[{type:"text",text:`Error: Session "${n.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.`}]};Al(s)||console.info(`[agent_merge] Worktree directory ${s} no longer exists; proceeding with merge via originalWorkdir (${a})`);let l=a;if(!Al(a))return{content:[{type:"text",text:`Error: originalWorkdir "${a}" does not exist.`}]};let u=n.base_branch??un(l),f=u,g=n.strategy??"merge",y=n.push===!0,k=n.delete_branch!==!1;if(i?.worktreeLifecycle?.state==="merged"||i?.worktreeMerged)return{content:[{type:"text",text:`\u2139\uFE0F Session "${n.session}" is already merged.`}]};let I={content:[{type:"text",text:"\u274C Merge did not run (internal error)"}]},P=r.persistedRef;return await v.enqueueMerge(l,async()=>{let b=v.getPersistedSession(n.session);if(b?.worktreeLifecycle?.state==="merged"||b?.worktreeMerged){I={content:[{type:"text",text:`\u2139\uFE0F Session "${n.session}" was already merged while waiting in queue.`}]};return}let A=$n(l,d,u),C=ns(l,d,f,g,s);if(C.success){if(y&&!ts(l,f)){I={content:[{type:"text",text:`\u26A0\uFE0F Merged ${d} \u2192 ${f} locally, but failed to push ${f}`}]};return}k&&Dt(l,d);let N=!1;if(Al(s)&&(N=nt(l,s),es(l)),b)for(let $ of bg({...r,persistedSession:b}))v.updatePersistedSession($,{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:u,targetRepo:b.worktreePrTargetRepo,pushRemote:b.worktreePushRemote}});let xe=Dn({kind:"merge",branch:d,base:u,filesChanged:A?.filesChanged,insertions:A?.insertions,deletions:A?.deletions});v.notifyWorktreeOutcome(r.notificationTarget,xe);let O=`\u2705 ${C.fastForward?"\u26A1 Fast-forward":"\u{1F500} Merge commit"}: ${d} \u2192 ${f}.${y?" Pushed.":""}${k?N?" Branch and worktree cleaned up.":" Branch deleted; worktree cleanup skipped.":""}`;C.stashPopConflict?O+=`
|
|
89
|
-
\
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
`)}]}}}}De();Y();
|
|
95
|
-
`)
|
|
96
|
-
`)}
|
|
97
|
-
`).
|
|
98
|
-
`)
|
|
99
|
-
`)
|
|
100
|
-
|
|
101
|
-
`)}]}}}}De();Y();function HI(t){return!!t&&typeof t=="object"&&typeof t.task=="string"}function _g(t){return{name:"goal_stop",description:"Stop an explicit goal task and kill its underlying agent session.",parameters:c.Object({task:c.String({description:"Goal task name or ID"})}),async execute(e,n){if(!ge)return{content:[{type:"text",text:"Error: GoalController not initialized. The code-agent service must be running."}]};if(!HI(n))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { task }."}]};let r=ge.stopTask(n.task);return r?{content:[{type:"text",text:r.action==="already_terminal"?`Task is already ${r.task.status}.`:`Task "${r.task.name}" (${r.task.id}) stopped.`}]}:{content:[{type:"text",text:`Error: Goal task "${n.task}" not found.`}]}}}}Y();ys();import{createHash as zI}from"crypto";var ot="code-agent";var QI=new Set(["1","true","yes","on"]);function JI(){let t=process.env.OPENCLAW_CODE_AGENT_BUTTON_DIAGNOSTICS?.trim().toLowerCase();return!!(t&&QI.has(t))}function hr(t){if(!(typeof t!="string"||t.length===0))return zI("sha256").update(t).digest("hex").slice(0,12)}function Eg(t){return typeof t.callbackData=="string"?t.callbackData:typeof t.value=="string"?t.value:void 0}function se(t){let e=(t??[]).filter(r=>Array.isArray(r)&&r.length>0),n=e.flat();return{buttonRows:e.length||void 0,buttonCount:n.length||void 0,buttonLabels:n.length>0?n.map(r=>typeof r.label=="string"?r.label:void 0):void 0,callbackByteLengths:n.length>0?n.map(r=>{let o=Eg(r);return o?Buffer.byteLength(o,"utf8"):void 0}):void 0,callbackHashes:n.length>0?n.map(r=>hr(Eg(r))):void 0,buttonStyles:n.length>0?n.map(r=>typeof r.style=="string"?r.style:void 0):void 0}}function mn(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function $g(t){let e=mn(t),n=Array.isArray(e?.blocks)?e.blocks:void 0;if(n)return n.map(r=>mn(r)?.type).filter(r=>typeof r=="string"&&r.length>0)}function Dg(t){let e=mn(t),n=Array.isArray(e?.blocks)?e.blocks:void 0;if(!n)return;let r=n.map(o=>{let i=mn(o);return i?.type!=="buttons"||!Array.isArray(i.buttons)?[]:i.buttons}).filter(o=>o.length>0);return r.length>0?r:void 0}function Tl(t){let e=Dg(t);return{presentationBlockTypes:$g(t),...se(e)}}function Cl(t){let e=mn(t),n=e?.interactive,r=mn(e?.channelData),o=mn(r?.telegram),i=Array.isArray(o?.buttons)?o.buttons:void 0;return{renderedPayloadKeys:e?Object.keys(e).sort():void 0,interactiveBlockTypes:$g(n),...Og("interactive",se(Dg(n))),...Og("telegramChannelData",se(i)),hasPresentation:!!e?.presentation,hasInteractive:!!n,hasTelegramChannelDataButtons:!!i?.some(s=>s.length>0)}}function Ng(t){let e=mn(t);return e?{sendResultKeys:Object.keys(e).sort(),messageId:Rl(e.messageId),chatId:Rl(e.chatId),telegramThreadId:Rl(e.messageThreadId??e.threadId),channel:typeof e.channel=="string"?e.channel:void 0}:{sendResultType:typeof t}}function Rl(t){return typeof t=="string"||typeof t=="number"?t:void 0}function Og(t,e){let n={};for(let[r,o]of Object.entries(e))o!==void 0&&(n[`${t}${r.charAt(0).toUpperCase()}${r.slice(1)}`]=o);return n}function q(t,e){if(!JI())return;let n=Object.fromEntries(Object.entries(e).filter(([,r])=>r!==void 0));console.info(`[CodeAgentButtonDiagnostics] ${JSON.stringify({event:t,callbackNamespace:ot,...n})}`)}function YI(t){let e=t.trim().replace(new RegExp(`^${ot}:`),"");return e||null}async function Ps(t,e){try{await ft(t,{text:e})}catch(n){let r=n instanceof Error?n.message:String(n);console.warn(`[callback-handler] Failed to resolve worktree prompt: ${r}`)}}function Ml(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 XI(t){return t==="plan-approve"||t==="plan-request-changes"||t==="plan-reject"}function ZI(t,e){if(XI(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 eb(t){let e="callback"in t?t.callback?.payload:void 0,n="interaction"in t?t.interaction?.payload:void 0;return e??n??""}function _l(t){let e=t instanceof Error?t.message:String(t);return/message is not modified/i.test(e)}function tb(t){let e=t instanceof Error?t.message:String(t);return/empty message/i.test(e)}async function ft(t,e={}){let n=t.respond,{text:r}=e;if(t.channel==="telegram"){if(typeof r=="string"&&typeof n.editMessage=="function")try{await n.editMessage({text:r,buttons:[]});return}catch(o){if(_l(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 n.clearButtons=="function"&&await n.clearButtons();return}if(typeof n.clearComponents=="function")try{await n.clearComponents(typeof r=="string"?{text:r}:void 0);return}catch(o){if(_l(o))return;if(tb(o)){if(typeof r!="string"&&typeof n.acknowledge=="function"){await n.acknowledge();return}typeof r!="string"&&typeof n.acknowledge!="function"&&console.warn("[callback-handler] clearComponents failed with empty-message error and no acknowledge fallback available")}else{if(typeof r!="string")throw o;{let i=o instanceof Error?o.message:String(o);console.warn(`[callback-handler] clearComponents failed before text fallback: ${i}`)}}}if(typeof r=="string"&&typeof n.editMessage=="function")try{await n.editMessage({text:r})}catch(o){if(!_l(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 n.clearButtons=="function"&&await n.clearButtons()}async function ue(t,e){if(t.channel==="telegram"){await t.respond.reply({text:e});return}await t.respond.reply({text:e,ephemeral:!0})}function Fg(t="telegram"){return q("callback_handler_registered",{channel:t,namespace:ot}),{channel:t,namespace:ot,handler:async e=>{if(!e.auth.isAuthorizedSender)return await ue(e,"\u26D4 Unauthorized."),{handled:!0};let n=eb(e),r=YI(n);if(q("callback_received",{channel:e.channel,namespace:ot,payloadByteLength:Buffer.byteLength(n,"utf8"),tokenHash:hr(r),isAuthorizedSender:e.auth.isAuthorizedSender}),!r)return await ue(e,`\u26A0\uFE0F Unrecognized callback payload: "${n}".`),{handled:!0};if(!v)return await ue(e,"\u26A0\uFE0F Code agent service not running."),{handled:!0};let o=v.getActionToken(r);if(q("callback_token_lookup_completed",{channel:e.channel,namespace:ot,tokenHash:hr(r),tokenFound:!!o,actionKind:o?.kind,sessionId:o?.sessionId,planDecisionVersion:o?.planDecisionVersion}),!o)return await ue(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=ZI(o,s);if(q("callback_plan_validation_completed",{channel:e.channel,namespace:ot,tokenHash:hr(r),actionKind:o.kind,sessionId:i,sessionName:a,planDecisionVersion:o.planDecisionVersion,valid:!d}),d)return await ft(e),await ue(e,`\u26A0\uFE0F ${d}`),{handled:!0};let l=v.consumeActionToken(r);if(q("callback_token_consume_completed",{channel:e.channel,namespace:ot,tokenHash:hr(r),consumed:!!l,actionKind:l?.kind,sessionId:l?.sessionId,planDecisionVersion:l?.planDecisionVersion}),!l)return await ue(e,"\u26A0\uFE0F This action is stale or has already been used."),{handled:!0};switch(l.kind){case"worktree-merge":{await Ps(e,`\u2705 Merge selected for [${a}]`);let u=await Ss().execute("callback",{session:i});await ue(e,Ml(u));break}case"worktree-decide-later":{await Ps(e,`\u23ED\uFE0F Deferred for [${a}]`);let u=v.snoozeWorktreeDecision(i);await ue(e,u.startsWith("Error")?u:"\u23ED\uFE0F Snoozed 24h");break}case"worktree-dismiss":{await Ps(e,`\u{1F5D1}\uFE0F Discarded for [${a}]`);let u=await v.dismissWorktree(i);await ue(e,(u.startsWith("Error"),u));break}case"worktree-create-pr":case"worktree-update-pr":{await Ps(e,o.kind==="worktree-update-pr"?`\u{1F4EC} PR update selected for [${a}]`:`\u{1F4EC} PR selected for [${a}]`);let u=await So().execute("callback",{session:i});await ue(e,Ml(u));break}case"worktree-view-pr":{await ft(e);let u=v.getPersistedSession?.(i),f=o.targetUrl??u?.worktreePrUrl;await ue(e,f?`PR: ${f}`:"\u26A0\uFE0F PR URL is no longer available.");break}case"plan-approve":{await ft(e),v.clearPlanDecisionTokens(i);let u=await mt(v,{session:i,message:"Approved. Go ahead.",approve:!0,userInitiated:!0});u.isError&&await ue(e,`\u26A0\uFE0F ${u.text}`);break}case"plan-reject":{await ft(e);let u=Il(v,i);await ue(e,`\u274C ${u.text}`);break}case"plan-request-changes":{await ft(e);let u=bl(v,i);await ue(e,`\u270F\uFE0F ${u.text}`);break}case"plan-offer-start":{if(await ft(e),!l.launchPrompt||!l.launchWorkdir){await ue(e,"\u26A0\uFE0F This action is missing the plan launch context.");break}let u=v.launchPlanOffer({route:l.route,prompt:l.launchPrompt,workdir:l.launchWorkdir,name:l.launchName,worktreeStrategy:l.launchWorktreeStrategy});await ue(e,`\u25B6\uFE0F Planning session started: ${u.name} [${u.id}]`);break}case"plan-offer-dismiss":{await ft(e),await ue(e,"\u2705 Dismissed.");break}case"session-restart":case"session-resume":{await ft(e);let u=await mt(v,{session:i,message:"Continue where you left off.",userInitiated:!0});await ue(e,u.isError?`\u26A0\uFE0F ${u.text}`:`\u25B6\uFE0F ${u.text}`);break}case"view-output":{await ft(e);let u=await us().execute("callback",{session:i,lines:50});await ue(e,Ml(u));break}case"question-answer":{if(await ft(e),o.optionIndex==null){await ue(e,"\u26A0\uFE0F Invalid question-answer action.");break}await v.resolvePendingInputOption(i,o.optionIndex),await ue(e,"\u2705 Answer submitted.");break}default:{await ft(e),await ue(e,"\u26A0\uFE0F Unknown callback action.");break}}return{handled:!0}}}}Y();Te();function Sr(t){return Lg(t).map(e=>e.value)}function Lg(t){return Array.from(t.matchAll(/"[^"]*"|'[^']*'|\S+/g),e=>{let n=e[0],r=e.index??0;return{value:nb(n),raw:n,start:r,end:r+n.length}})}function El(t){let[e]=Lg(t);if(e)return{value:e.value,rest:t.slice(e.end).trimStart()}}function nb(t){return t.length>1&&(t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'"))?t.slice(1,-1):t}function rb(t){return t instanceof Error?t.message:String(t)}function ob(t){let e=Sr(t),n,r=e;return e[0]==="--name"&&e[1]&&(n=e[1],r=e.slice(2)),{name:n,prompt:r.join(" ").trim()}}function Wg(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 n=(e.args??"").trim();if(!n)return{text:"Usage: /agent [--name <name>] <prompt>"};let{name:r,prompt:o}=ob(n);if(!o)return{text:"Usage: /agent [--name <name>] <prompt>"};try{let i=Ni({prompt:o,name:r},e,v);if(i.kind!=="resolved")return{text:i.text};let s=v.spawn({prompt:o,name:r,workdir:i.workdir,model:i.resolvedModel,reasoningEffort:i.reasoningEffort,codexApprovalPolicy:i.harness==="codex"?"never":void 0,originChannel:i.originChannel,originThreadId:i.originThreadId,originAgentId:e.agentId||void 0,originSessionKey:i.originSessionKey,route:i.route,harness:i.harness,permissionMode:i.permissionMode,planApproval:i.planApproval,taskLifecycle:Ki(e)});return{text:v.formatLaunchResult({prompt:o,workdir:i.workdir,harness:i.harness,permissionMode:i.permissionMode??_.permissionMode,planApproval:i.planApproval},s)}}catch(i){let s=rb(i),a=s.includes("Max sessions")?"":`
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
90
|
+
\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 n.sendMessage(e.message),u&&TI(t,n),u)t.notifySession(n,`\u{1F44D} [${n.name}] Plan approved`,"plan-approved");else if(e.userInitiated){let k=Ce(e.message,100);t.notifySession(n,`\u21AA\uFE0F [${n.name}] "${k}"`,"agent-respond")}e.userInitiated||n.incrementAutoRespond();let y=Ce(e.message,80);return u?{text:`Plan approved for session ${n.name} [${n.id}]. Use agent_output to see the response.`}:{text:[`Message sent to session ${n.name} [${n.id}].`,l?" (redirected active turn first)":e.interrupt?" (no active turn to interrupt)":"",` Message: "${y}"`,g,"Use agent_output to see the response."].filter(Boolean).join(`
|
|
91
|
+
`)}}catch(d){return{text:`Error sending message to session ${n.name} [${n.id}]: ${bl(d)}`,isError:!0}}}function _I(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 wg(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:c.Object({session:c.String({description:"Session name or ID to respond to"}),message:c.String({description:"The message to send to the session"}),interrupt:c.Optional(c.Boolean({description:"If true, interrupt the current turn before sending the message. Useful to redirect the session mid-response."})),userInitiated:c.Optional(c.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:c.Optional(c.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:c.Optional(c.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,n){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!_I(n))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, message, interrupt?, userInitiated?, approve?, approval_rationale? }."}]};let r=await ct(v,{session:n.session,message:n.message,interrupt:n.interrupt,userInitiated:n.userInitiated,approve:n.approve,approvalRationale:n.approval_rationale});return{isError:r.isError??!1,content:[{type:"text",text:r.text}]}}}}De();Y();function EI(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.session=="string"&&typeof e.summary=="string"}function Ig(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:c.Object({session:c.String({description:"Session name or ID awaiting plan approval"}),summary:c.String({description:"Concise user-facing summary of scope, risk, and any concerns that should accompany the approval buttons"})}),async execute(e,n){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!EI(n))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, summary }."}]};let r=v.requestPlanApprovalFromUser(n.session,n.summary);return{isError:r.startsWith("Error:"),content:[{type:"text",text:r}]}}}}De();Y();Te();var Rl=["off","manual","ask","delegate","auto-merge","auto-pr"],fs=new Set(Rl),$I=["low","medium","high","xhigh","max"],bg=new Set($I);function OI(t){return typeof t=="string"&&fs.has(t)}var DI=c.Union(Rl.map(t=>c.Literal(t)),{description:"Optional worktree strategy for the planning session. Use auto-pr when the follow-up should branch and open/update a PR after approved implementation."});function NI(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.offer_id=="string"&&typeof e.offer_text=="string"&&typeof e.plan_prompt=="string"&&typeof e.plan_workdir=="string"&&(e.plan_worktree_strategy==null||OI(e.plan_worktree_strategy))&&(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 FI(t,e){let n=dr(t,e.target_channel,e.target_session_key);if(n)return e.target_thread_id!=null&&(n.threadId=String(e.target_thread_id)),n}async function LI(t,e){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};let n=FI(t,e);return!n?.provider||!n.target?{content:[{type:"text",text:"Error: Could not resolve a direct delivery route for the plan offer."}]}:(v.sendPlanOffer({offerId:e.offer_id,route:n,text:e.offer_text,planName:e.plan_name??e.offer_id,planPrompt:e.plan_prompt,planWorkdir:e.plan_workdir,planWorktreeStrategy:e.plan_worktree_strategy}),{content:[{type:"text",text:`Interactive plan offer queued for ${n.provider}|${n.target}${n.threadId?`#${n.threadId}`:""}.`}]})}function xg(t){return{name:"agent_send_plan_offer",description:"Post a user-facing message to the current or explicit chat route with human-gated Start Plan and Dismiss inline buttons. Use this when an external workflow wants the user to open a plan-only code-agent session from the message.",parameters:c.Object({offer_id:c.String({description:"Stable offer identifier, for example 'plugin-readiness-v2026.5.5'."}),offer_text:c.String({description:"Final user-facing text to deliver."}),plan_prompt:c.String({description:"Prompt to seed into the plan-only session when the user clicks Start Plan."}),plan_workdir:c.String({description:"Working directory for the planning session."}),plan_worktree_strategy:c.Optional(DI),plan_name:c.Optional(c.String({description:"Optional explicit session name for the planning session."})),target_channel:c.Optional(c.String({description:"Optional explicit route like 'telegram|-1003863755361'."})),target_thread_id:c.Optional(c.Union([c.String(),c.Number()],{description:"Optional explicit topic/thread id."})),target_session_key:c.Optional(c.String({description:"Optional explicit session key for wake routing."}))}),async execute(e,n){return NI(n)?LI(t,n):{content:[{type:"text",text:"Error: Invalid parameters. Expected { offer_id, offer_text, plan_prompt, plan_workdir }."}]}}}}De();Y();function Ag(t){return{name:"agent_stats",description:"Show OpenClaw Code Agent usage metrics: session counts by status, average duration, and notable sessions.",parameters:c.Object({}),async execute(e,n){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};let r=v.getMetrics(),o=v.list("running").length;return{content:[{type:"text",text:Ui(r,o)}]}}}}De();Te();Y();rt();vo();import{existsSync as ks}from"fs";function BI(t){return!t||typeof t!="object"?!1:typeof t.session=="string"}function vs(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:c.Object({session:c.String({description:"Session name or ID to merge"}),base_branch:c.Optional(c.String({description:"Base branch to merge into (default: main)"})),strategy:c.Optional(c.Union([c.Literal("merge"),c.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:c.Optional(c.Boolean({description:"Push the base branch after successful merge (default: false)"})),delete_branch:c.Optional(c.Boolean({description:"Delete the worktree branch after successful merge (default: true)"}))}),async execute(e,n){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!BI(n))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, base_branch?, strategy?, push?, delete_branch? }."}]};let r=kr(v,n.session),o=r.activeSession,i=r.persistedSession;if(!o&&!i)return{content:[{type:"text",text:`Error: Session "${n.session}" not found.`}]};let{worktreePath:s,originalWorkdir:a,branchName:d}=r;if(!s||!a)return{content:[{type:"text",text:`Error: Session "${n.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.`}]};ks(s)||console.info(`[agent_merge] Worktree directory ${s} no longer exists; proceeding with merge via originalWorkdir (${a})`);let l=a;if(!ks(a))return{content:[{type:"text",text:`Error: originalWorkdir "${a}" does not exist.`}]};let u=n.base_branch??un(l),f=u,g=n.strategy??"merge",y=n.push===!0,k=n.delete_branch!==!1;if(i?.worktreeLifecycle?.state==="merged"||i?.worktreeMerged)return{content:[{type:"text",text:`\u2139\uFE0F Session "${n.session}" is already merged.`}]};if(ks(s)&&!go(l,d,f)&&yr(s))return{content:[{type:"text",text:[`\u274C Merge blocked: session "${n.session}" has uncommitted worktree changes but branch ${d} has no commits ahead of ${f}.`,`Worktree: ${s}`,"Resume or inspect the session, then commit real task changes or clean temporary files before retrying agent_merge."].join(`
|
|
92
|
+
`)}]};let I={content:[{type:"text",text:"\u274C Merge did not run (internal error)"}]},P=r.persistedRef;return await v.enqueueMerge(l,async()=>{let b=v.getPersistedSession(n.session);if(b?.worktreeLifecycle?.state==="merged"||b?.worktreeMerged){I={content:[{type:"text",text:`\u2139\uFE0F Session "${n.session}" was already merged while waiting in queue.`}]};return}let A=Nn(l,d,u),C=is(l,d,f,g,s);if(C.success){if(y&&!os(l,f)){I={content:[{type:"text",text:`\u26A0\uFE0F Merged ${d} \u2192 ${f} locally, but failed to push ${f}`}]};return}k&&Ot(l,d);let D=!1;if(ks(s)&&(D=nt(l,s),rs(l)),b)for(let O of Rg({...r,persistedSession:b}))v.updatePersistedSession(O,{worktreeMerged:!0,worktreeMergedAt:new Date().toISOString(),pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,lifecycle:"terminal",worktreeState:"merged",worktreeDisposition:"merged",worktreeLifecycle:{state:"merged",updatedAt:new Date().toISOString(),resolvedAt:new Date().toISOString(),resolutionSource:"agent_merge",baseBranch:u,targetRepo:b.worktreePrTargetRepo,pushRemote:b.worktreePushRemote}});let xe=Fn({kind:"merge",branch:d,base:u,filesChanged:A?.filesChanged,insertions:A?.insertions,deletions:A?.deletions});v.notifyWorktreeOutcome(r.notificationTarget,xe);let $=`\u2705 ${C.fastForward?"\u26A1 Fast-forward":"\u{1F500} Merge commit"}: ${d} \u2192 ${f}.${y?" Pushed.":""}${k?D?" Branch and worktree cleaned up.":" Branch deleted; worktree cleanup skipped.":""}`;C.stashPopConflict?$+=`
|
|
93
|
+
\u26A0\uFE0F Pre-merge stash pop conflicted \u2014 run \`git stash show ${C.stashRef??"stash@{0}"}\` in ${l} to review stashed changes.`:C.stashed&&($+=`
|
|
94
|
+
(Pre-existing changes on ${f} were auto-stashed and restored.)`),I={content:[{type:"text",text:$}]}}else if(C.rebaseConflict)I={content:[{type:"text",text:`\u26A0\uFE0F Rebase conflicts \u2014 manual resolution required:
|
|
95
|
+
|
|
96
|
+
${C.error}`}]};else if(C.conflictFiles&&C.conflictFiles.length>0){let D=["Resolve merge conflicts in the following files and commit the resolution:","",...C.conflictFiles.map(xe=>`- ${xe}`),"",`After resolving, commit with message: "Resolve merge conflicts from ${d}"`].join(`
|
|
97
|
+
`);try{let xe=v.spawn({prompt:D,workdir:l,name:`${n.session}-conflict-resolver`,harness:Le(),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});I={content:[{type:"text",text:`\u26A0\uFE0F Merge conflicts in ${C.conflictFiles.length} file(s) \u2014 spawned conflict resolver session: ${xe.name}`}]}}catch(xe){I={content:[{type:"text",text:`\u274C Merge conflicts detected, but failed to spawn resolver: ${xe instanceof Error?xe.message:String(xe)}`}]}}}else I={content:[{type:"text",text:C.dirtyError?`\u274C Merge blocked: ${C.error}`:`\u274C Merge failed: ${C.error??"unknown error"}`}]}}),I}}}Ps();De();Y();he();rt();vo();function VI(t){return!!t&&typeof t=="object"}function Cg(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:c.Object({workdir:c.Optional(c.String({description:"Restrict cleanup to sessions rooted in this repository"})),base_branch:c.Optional(c.String({description:"Override base branch for lifecycle resolution"})),mode:c.Optional(c.Union([c.Literal("preview_safe"),c.Literal("clean_safe"),c.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:c.Optional(c.Boolean({description:"Deprecated. Safe cleanup never removes live sessions."})),force:c.Optional(c.Boolean({description:"Deprecated alias for skip_session_check."})),dry_run:c.Optional(c.Boolean({description:"Show what would be cleaned without deleting anything."})),session:c.Optional(c.String({description:"Session name or ID to clean or dismiss."})),dismiss_session:c.Optional(c.Boolean({description:"When true and session is provided, permanently dismiss the worktree."}))}),async execute(e,n){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!VI(n))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { workdir?, base_branch?, mode?, dry_run?, session?, dismiss_session? }."}]};let r=n.session,o=n.mode??(n.dry_run===!0?"preview_safe":"clean_safe"),i=o!=="clean_safe",s=o==="preview_all"||o==="clean_safe";if(r&&n.dismiss_session===!0)return{content:[{type:"text",text:await v.dismissWorktree(r)}]};let a=hs(v);if(r&&(a=a.filter(y=>Ss(y,r)),a.length===0)){let y=kr(v,r);if(!y.persistedSession&&!y.activeSession)return{content:[{type:"text",text:`Error: Session "${r}" not found.`}]}}if(n.workdir&&(a=a.filter(y=>y.workdir===n.workdir)),a.length===0)return{content:[{type:"text",text:"No managed worktrees matched the requested scope."}]};let d=[],l=[],u=[],f=[];for(let y of a){let{persistedSession:k,activeSession:I,resolvedLifecycle:P}=gs(v,y,{baseBranch:n.base_branch});if(!P.cleanupSafe){if(s){let b=P.reasons.length>0?P.reasons.map(ys).join(", "):Bn(P.derivedState);l.push(`${y.name} [kept: ${b}]`)}continue}if(d.push(`${y.name} (${Bn(P.derivedState)})`),!i)try{let b=y.workdir;if(!((k??I)&&We(k??I))&&y.worktreePath&&nt(b,y.worktreePath,{destructive:!1}),y.worktreeBranch&&Ot(b,y.worktreeBranch),k){let C=P.derivedState==="merged"||P.derivedState==="released"?P.derivedState:P.lifecycle.state;v.updatePersistedSession(y.id,{worktreePath:void 0,worktreeBranch:void 0,lifecycle:"terminal",worktreeState:"none",pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeMerged:C==="merged"?!0:k.worktreeMerged,worktreeMergedAt:C==="merged"?k.worktreeMergedAt??new Date().toISOString():k.worktreeMergedAt,worktreeLifecycle:{...k.worktreeLifecycle??P.lifecycle,state:C,updatedAt:new Date().toISOString(),resolvedAt:k.worktreeLifecycle?.resolvedAt??new Date().toISOString(),resolutionSource:k.worktreeLifecycle?.resolutionSource??"maintenance",baseBranch:n.base_branch??P.lifecycle.baseBranch??k.worktreeBaseBranch,targetRepo:k.worktreePrTargetRepo,pushRemote:k.worktreePushRemote,notes:P.reasons}})}u.push(`${y.name} (${Bn(P.derivedState)})`)}catch(b){f.push(`${y.name}: ${b instanceof Error?b.message:String(b)}`)}}let g=[o==="clean_safe"?"Clean all safe:":o==="preview_all"?"Worktree lifecycle review:":"Clean all safe preview:"];return g.push(` SAFE ${i?"NOW":"FOUND"} (${d.length}): ${d.join(", ")||"(none)"}`),s&&g.push(` KEPT (${l.length}): ${l.join(", ")||"(none)"}`),i||(g.push(` CLEANED (${u.length}): ${u.join(", ")||"(none)"}`),g.push(` FAILURES (${f.length}): ${f.join(", ")||"(none)"}`)),{content:[{type:"text",text:g.join(`
|
|
98
|
+
`)}]}}}}De();Y();vo();function qI(t){return!0}function Mg(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:c.Object({session:c.Optional(c.String({description:"Session name or ID to show status for (optional, shows all if omitted)"}))}),async execute(e,n){if(!v)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!qI(n))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session? }."}]};let r=n.session,o=hs(v);if(r&&(o=o.filter(s=>Ss(s,r)),o.length===0))return{content:[{type:"text",text:`Error: Session "${r}" not found or has no worktree.`}]};if(o.length===0)return{content:[{type:"text",text:"No sessions with worktrees found."}]};let i=[];for(let s of o){let{persistedSession:a,resolvedLifecycle:d}=gs(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:${Bn(d.lifecycle.state)}`),d.derivedState!==d.lifecycle.state&&i.push(` Derived: ${Bn(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(ys).join(", "):"none"}`),i.push("")}return{content:[{type:"text",text:i.join(`
|
|
99
|
+
`).trim()}]}}}}De();Y();Te();import{existsSync as jI}from"fs";function GI(t=[]){return t.map((e,n)=>({label:`check-${n+1}`,command:e.trim()})).filter(e=>e.command.length>0)}function ws(t,e){let n=t.goal.trim();if(!n)return{kind:"error",text:"Error: goal must not be empty."};let r=t.workdir||e.workspaceDir||_.defaultWorkdir||process.cwd();if(!jI(r))return{kind:"error",text:`Error: Working directory does not exist: ${r}`};let o=GI(t.verifierCommands),i=t.goalMode??(o.length>0?"verifier":"ralph");if(i==="verifier"&&o.length===0)return{kind:"error",text:"Error: verifier mode requires at least one non-empty verifier command."};let s=t.harness??Le(),a=t.model??ar(s);if(!a)return{kind:"error",text:`Error: No default model configured for harness "${s}". Set plugins.entries["openclaw-code-agent"].config.harnesses.${s}.defaultModel or pass model explicitly.`};let d=xi(s);if(!Wi(a,d))return{kind:"error",text:`Error: Model "${a}" is not allowed. Permitted models: ${d?.join(", ")}`};let l=e.sessionKey||void 0,u=Ai(e),f=no(e,u),g=dr(e,f,l);return{kind:"resolved",goal:n,name:t.name,workdir:r,model:a,reasoningEffort:an(s),systemPrompt:t.systemPrompt,allowedTools:t.allowedTools,maxIterations:t.maxIterations,permissionMode:t.permissionMode??"bypassPermissions",harness:s,loopMode:i,completionPromise:t.completionPromise,originChannel:f,originThreadId:g?.threadId,originAgentId:e.agentId||void 0,originSessionKey:l,route:g,verifierCommands:o}}function Is(t,e){return["Goal task launched.",` Name: ${t.name}`,` ID: ${t.id}`,` Dir: ${t.workdir}`,` Session: ${t.sessionName} [${t.sessionId}]`,` Harness: ${e.harness}`,` Model: ${e.model}`,` Loop mode: ${t.loopMode}`,` Max iterations: ${t.maxIterations}`,` Goal: "${e.goal.length>100?`${e.goal.slice(0,100)}...`:e.goal}"`,...t.loopMode==="ralph"?[` Completion promise: ${t.completionPromise}`]:[" Verifiers:",...e.verifierCommands.map(r=>` - ${r.command}`)],"","Use goal_status to follow progress or goal_stop to terminate the task."].join(`
|
|
100
|
+
`)}function HI(t){return!t||typeof t!="object"?!1:typeof t.goal=="string"}function _g(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:c.Object({goal:c.String({description:"End goal for the autonomous task"}),verifier_commands:c.Optional(c.Array(c.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:c.Optional(c.String({description:"Short task name (kebab-case preferred)"})),workdir:c.Optional(c.String({description:"Working directory (defaults to cwd / configured workspace)"})),model:c.Optional(c.String({description:"Model name to use"})),system_prompt:c.Optional(c.String({description:"Additional system prompt"})),allowed_tools:c.Optional(c.Array(c.String(),{description:"Allowed tools for the underlying agent session"})),max_iterations:c.Optional(c.Number({description:"Maximum verifier-driven repair iterations",minimum:1})),goal_mode:c.Optional(c.Union([c.Literal("ralph"),c.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:c.Optional(c.String({description:"Exact completion promise for Ralph-mode loops. Defaults to 'DONE'."})),permission_mode:c.Optional(c.Union([c.Literal("default"),c.Literal("plan"),c.Literal("bypassPermissions")],{description:"Permission mode for the underlying agent session. Defaults to bypassPermissions for autonomous goal loops."})),harness:c.Optional(c.String({description:"Agent harness to use (e.g. 'codex' or 'claude-code')."}))}),async execute(e,n){if(!ge)return{content:[{type:"text",text:"Error: GoalController not initialized. The code-agent service must be running."}]};if(!HI(n))return{content:[{type:"text",text:"Error: Invalid parameters. Expected at least { goal }."}]};let r=ws({goal:n.goal,verifierCommands:n.verifier_commands,name:n.name,workdir:n.workdir,model:n.model,systemPrompt:n.system_prompt,allowedTools:n.allowed_tools,maxIterations:n.max_iterations,permissionMode:n.permission_mode,harness:n.harness,goalMode:n.goal_mode,completionPromise:n.completion_promise},t);if(r.kind!=="resolved")return{content:[{type:"text",text:r.text}]};try{let o=await ge.launchTask({goal:r.goal,name:r.name,workdir:r.workdir,model:r.model,reasoningEffort:r.reasoningEffort,systemPrompt:r.systemPrompt,allowedTools:r.allowedTools,maxIterations:r.maxIterations,permissionMode:r.permissionMode,loopMode:r.loopMode,completionPromise:r.completionPromise,originChannel:r.originChannel,originThreadId:r.originThreadId,originAgentId:r.originAgentId,originSessionKey:r.originSessionKey,route:r.route,harness:r.harness,verifierCommands:r.verifierCommands});return{content:[{type:"text",text:Is(o,r)}]}}catch(o){return{content:[{type:"text",text:`Error launching goal task: ${o instanceof Error?o.message:String(o)}`}]}}}}}De();function Eg(t,e){return t.split(`
|
|
101
|
+
`).map(n=>`${e}${n}`)}function zI(t,e=8,n=600){let r=t.map(i=>i.trimEnd()).filter(i=>i.trim().length>0);if(r.length===0)return;let o=r.slice(-e).join(`
|
|
102
|
+
`);return o.length<=n?o:`...${o.slice(-(n-3))}`}function pn(t){if(t)return{phase:t.phase,awaitingInput:t.isAwaitingInput??!!t.pendingInputState,latestOutput:zI(t.getOutput(20))}}function cn(t,e){let n=t.loopMode??"verifier",r=[`${t.name} [${t.id}]`,` Status: ${t.status}`,...n==="ralph"?[" Loop mode: ralph",` Iteration: ${t.iteration}/${t.maxIterations}`]:[` Repair iteration: ${t.iteration}/${t.maxIterations}`],` Workdir: ${t.workdir}`];return n==="ralph"&&t.completionPromise&&r.push(` Completion promise: ${t.completionPromise}`),t.sessionId&&r.push(` Session: ${t.sessionName??"(unknown)"} [${t.sessionId}]`),e?.phase&&r.push(` Phase: ${e.phase}`),e?.awaitingInput!==void 0&&r.push(` Awaiting input: ${e.awaitingInput?"yes":"no"}`),t.lastVerifierSummary&&(r.push(" Last verifier:"),r.push(...Eg(t.lastVerifierSummary," "))),e?.latestOutput&&(r.push(" Latest activity:"),r.push(...Eg(e.latestOutput," "))),t.waitingForUserReason&&r.push(` Waiting on user: ${t.waitingForUserReason}`),t.failureReason&&r.push(` Failure: ${t.failureReason}`),r.join(`
|
|
103
|
+
`)}Y();function $g(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:c.Object({task:c.Optional(c.String({description:"Task name or ID. Omit to list all tasks."}))}),async execute(e,n){if(!ge)return{content:[{type:"text",text:"Error: GoalController not initialized. The code-agent service must be running."}]};let r=n&&typeof n=="object"&&typeof n.task=="string"?n.task:void 0;if(r){let i=ge.getTask(r);if(!i)return{content:[{type:"text",text:`Error: Goal task "${r}" not found.`}]};let s=i.sessionId?v?.resolve(i.sessionId):void 0;return{content:[{type:"text",text:cn(i,pn(s))}]}}let o=ge.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 cn(i,pn(s))}).join(`
|
|
104
|
+
|
|
105
|
+
`)}]}}}}De();Y();function QI(t){return!!t&&typeof t=="object"&&typeof t.task=="string"}function Og(t){return{name:"goal_stop",description:"Stop an explicit goal task and kill its underlying agent session.",parameters:c.Object({task:c.String({description:"Goal task name or ID"})}),async execute(e,n){if(!ge)return{content:[{type:"text",text:"Error: GoalController not initialized. The code-agent service must be running."}]};if(!QI(n))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { task }."}]};let r=ge.stopTask(n.task);return r?{content:[{type:"text",text:r.action==="already_terminal"?`Task is already ${r.task.status}.`:`Task "${r.task.name}" (${r.task.id}) stopped.`}]}:{content:[{type:"text",text:`Error: Goal task "${n.task}" not found.`}]}}}}Y();Ps();import{createHash as JI}from"crypto";var ot="code-agent";var YI=new Set(["1","true","yes","on"]);function XI(){let t=process.env.OPENCLAW_CODE_AGENT_BUTTON_DIAGNOSTICS?.trim().toLowerCase();return!!(t&&YI.has(t))}function vr(t){if(!(typeof t!="string"||t.length===0))return JI("sha256").update(t).digest("hex").slice(0,12)}function Dg(t){return typeof t.callbackData=="string"?t.callbackData:typeof t.value=="string"?t.value:void 0}function se(t){let e=(t??[]).filter(r=>Array.isArray(r)&&r.length>0),n=e.flat();return{buttonRows:e.length||void 0,buttonCount:n.length||void 0,buttonLabels:n.length>0?n.map(r=>typeof r.label=="string"?r.label:void 0):void 0,callbackByteLengths:n.length>0?n.map(r=>{let o=Dg(r);return o?Buffer.byteLength(o,"utf8"):void 0}):void 0,callbackHashes:n.length>0?n.map(r=>vr(Dg(r))):void 0,buttonStyles:n.length>0?n.map(r=>typeof r.style=="string"?r.style:void 0):void 0}}function mn(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function Fg(t){let e=mn(t),n=Array.isArray(e?.blocks)?e.blocks:void 0;if(n)return n.map(r=>mn(r)?.type).filter(r=>typeof r=="string"&&r.length>0)}function Lg(t){let e=mn(t),n=Array.isArray(e?.blocks)?e.blocks:void 0;if(!n)return;let r=n.map(o=>{let i=mn(o);return i?.type!=="buttons"||!Array.isArray(i.buttons)?[]:i.buttons}).filter(o=>o.length>0);return r.length>0?r:void 0}function Cl(t){let e=Lg(t);return{presentationBlockTypes:Fg(t),...se(e)}}function Ml(t){let e=mn(t),n=e?.interactive,r=mn(e?.channelData),o=mn(r?.telegram),i=Array.isArray(o?.buttons)?o.buttons:void 0;return{renderedPayloadKeys:e?Object.keys(e).sort():void 0,interactiveBlockTypes:Fg(n),...Ng("interactive",se(Lg(n))),...Ng("telegramChannelData",se(i)),hasPresentation:!!e?.presentation,hasInteractive:!!n,hasTelegramChannelDataButtons:!!i?.some(s=>s.length>0)}}function Wg(t){let e=mn(t);return e?{sendResultKeys:Object.keys(e).sort(),messageId:Tl(e.messageId),chatId:Tl(e.chatId),telegramThreadId:Tl(e.messageThreadId??e.threadId),channel:typeof e.channel=="string"?e.channel:void 0}:{sendResultType:typeof t}}function Tl(t){return typeof t=="string"||typeof t=="number"?t:void 0}function Ng(t,e){let n={};for(let[r,o]of Object.entries(e))o!==void 0&&(n[`${t}${r.charAt(0).toUpperCase()}${r.slice(1)}`]=o);return n}function q(t,e){if(!XI())return;let n=Object.fromEntries(Object.entries(e).filter(([,r])=>r!==void 0));console.info(`[CodeAgentButtonDiagnostics] ${JSON.stringify({event:t,callbackNamespace:ot,...n})}`)}function ZI(t){let e=t.trim().replace(new RegExp(`^${ot}:`),"");return e||null}async function bs(t,e){try{await mt(t,{text:e})}catch(n){let r=n instanceof Error?n.message:String(n);console.warn(`[callback-handler] Failed to resolve worktree prompt: ${r}`)}}function _l(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 eb(t){return t==="plan-approve"||t==="plan-request-changes"||t==="plan-reject"}function tb(t,e){if(eb(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 nb(t){let e="callback"in t?t.callback?.payload:void 0,n="interaction"in t?t.interaction?.payload:void 0;return e??n??""}function El(t){let e=t instanceof Error?t.message:String(t);return/message is not modified/i.test(e)}function rb(t){let e=t instanceof Error?t.message:String(t);return/empty message/i.test(e)}async function mt(t,e={}){let n=t.respond,{text:r}=e;if(t.channel==="telegram"){if(typeof r=="string"&&typeof n.editMessage=="function")try{await n.editMessage({text:r,buttons:[]});return}catch(o){if(El(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 n.clearButtons=="function"&&await n.clearButtons();return}if(typeof n.clearComponents=="function")try{await n.clearComponents(typeof r=="string"?{text:r}:void 0);return}catch(o){if(El(o))return;if(rb(o)){if(typeof r!="string"&&typeof n.acknowledge=="function"){await n.acknowledge();return}typeof r!="string"&&typeof n.acknowledge!="function"&&console.warn("[callback-handler] clearComponents failed with empty-message error and no acknowledge fallback available")}else{if(typeof r!="string")throw o;{let i=o instanceof Error?o.message:String(o);console.warn(`[callback-handler] clearComponents failed before text fallback: ${i}`)}}}if(typeof r=="string"&&typeof n.editMessage=="function")try{await n.editMessage({text:r})}catch(o){if(!El(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 n.clearButtons=="function"&&await n.clearButtons()}async function ue(t,e){if(t.channel==="telegram"){await t.respond.reply({text:e});return}await t.respond.reply({text:e,ephemeral:!0})}function Bg(t="telegram"){return q("callback_handler_registered",{channel:t,namespace:ot}),{channel:t,namespace:ot,handler:async e=>{if(!e.auth.isAuthorizedSender)return await ue(e,"\u26D4 Unauthorized."),{handled:!0};let n=nb(e),r=ZI(n);if(q("callback_received",{channel:e.channel,namespace:ot,payloadByteLength:Buffer.byteLength(n,"utf8"),tokenHash:vr(r),isAuthorizedSender:e.auth.isAuthorizedSender}),!r)return await ue(e,`\u26A0\uFE0F Unrecognized callback payload: "${n}".`),{handled:!0};if(!v)return await ue(e,"\u26A0\uFE0F Code agent service not running."),{handled:!0};let o=v.getActionToken(r);if(q("callback_token_lookup_completed",{channel:e.channel,namespace:ot,tokenHash:vr(r),tokenFound:!!o,actionKind:o?.kind,sessionId:o?.sessionId,planDecisionVersion:o?.planDecisionVersion}),!o)return await ue(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=tb(o,s);if(q("callback_plan_validation_completed",{channel:e.channel,namespace:ot,tokenHash:vr(r),actionKind:o.kind,sessionId:i,sessionName:a,planDecisionVersion:o.planDecisionVersion,valid:!d}),d)return await mt(e),await ue(e,`\u26A0\uFE0F ${d}`),{handled:!0};let l=v.consumeActionToken(r);if(q("callback_token_consume_completed",{channel:e.channel,namespace:ot,tokenHash:vr(r),consumed:!!l,actionKind:l?.kind,sessionId:l?.sessionId,planDecisionVersion:l?.planDecisionVersion}),!l)return await ue(e,"\u26A0\uFE0F This action is stale or has already been used."),{handled:!0};switch(l.kind){case"worktree-merge":{await bs(e,`\u2705 Merge selected for [${a}]`);let u=await vs().execute("callback",{session:i});await ue(e,_l(u));break}case"worktree-decide-later":{await bs(e,`\u23ED\uFE0F Deferred for [${a}]`);let u=v.snoozeWorktreeDecision(i);await ue(e,u.startsWith("Error")?u:"\u23ED\uFE0F Snoozed 24h");break}case"worktree-dismiss":{await bs(e,`\u{1F5D1}\uFE0F Discarded for [${a}]`);let u=await v.dismissWorktree(i);await ue(e,(u.startsWith("Error"),u));break}case"worktree-create-pr":case"worktree-update-pr":{await bs(e,o.kind==="worktree-update-pr"?`\u{1F4EC} PR update selected for [${a}]`:`\u{1F4EC} PR selected for [${a}]`);let u=await Po().execute("callback",{session:i});await ue(e,_l(u));break}case"worktree-view-pr":{await mt(e);let u=v.getPersistedSession?.(i),f=o.targetUrl??u?.worktreePrUrl;await ue(e,f?`PR: ${f}`:"\u26A0\uFE0F PR URL is no longer available.");break}case"plan-approve":{await mt(e),v.clearPlanDecisionTokens(i);let u=await ct(v,{session:i,message:"Approved. Go ahead.",approve:!0,userInitiated:!0});u.isError&&await ue(e,`\u26A0\uFE0F ${u.text}`);break}case"plan-reject":{await mt(e);let u=xl(v,i);await ue(e,`\u274C ${u.text}`);break}case"plan-request-changes":{await mt(e);let u=Al(v,i);await ue(e,`\u270F\uFE0F ${u.text}`);break}case"plan-offer-start":{if(await mt(e),!l.launchPrompt||!l.launchWorkdir){await ue(e,"\u26A0\uFE0F This action is missing the plan launch context.");break}let u=v.launchPlanOffer({route:l.route,prompt:l.launchPrompt,workdir:l.launchWorkdir,name:l.launchName,worktreeStrategy:l.launchWorktreeStrategy});await ue(e,`\u25B6\uFE0F Planning session started: ${u.name} [${u.id}]`);break}case"plan-offer-dismiss":{await mt(e),await ue(e,"\u2705 Dismissed.");break}case"session-restart":case"session-resume":{await mt(e);let u=await ct(v,{session:i,message:"Continue where you left off.",userInitiated:!0});await ue(e,u.isError?`\u26A0\uFE0F ${u.text}`:`\u25B6\uFE0F ${u.text}`);break}case"view-output":{await mt(e);let u=await cs().execute("callback",{session:i,lines:50});await ue(e,_l(u));break}case"question-answer":{if(await mt(e),o.optionIndex==null){await ue(e,"\u26A0\uFE0F Invalid question-answer action.");break}await v.resolvePendingInputOption(i,o.optionIndex),await ue(e,"\u2705 Answer submitted.");break}default:{await mt(e),await ue(e,"\u26A0\uFE0F Unknown callback action.");break}}return{handled:!0}}}}Y();Te();function Pr(t){return Ug(t).map(e=>e.value)}function Ug(t){return Array.from(t.matchAll(/"[^"]*"|'[^']*'|\S+/g),e=>{let n=e[0],r=e.index??0;return{value:ob(n),raw:n,start:r,end:r+n.length}})}function $l(t){let[e]=Ug(t);if(e)return{value:e.value,rest:t.slice(e.end).trimStart()}}function ob(t){return t.length>1&&(t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'"))?t.slice(1,-1):t}function ib(t){return t instanceof Error?t.message:String(t)}function sb(t){let e=Pr(t),n,r=e;return e[0]==="--name"&&e[1]&&(n=e[1],r=e.slice(2)),{name:n,prompt:r.join(" ").trim()}}function Kg(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 n=(e.args??"").trim();if(!n)return{text:"Usage: /agent [--name <name>] <prompt>"};let{name:r,prompt:o}=sb(n);if(!o)return{text:"Usage: /agent [--name <name>] <prompt>"};try{let i=Bi({prompt:o,name:r},e,v);if(i.kind!=="resolved")return{text:i.text};let s=v.spawn({prompt:o,name:r,workdir:i.workdir,model:i.resolvedModel,reasoningEffort:i.reasoningEffort,codexApprovalPolicy:i.harness==="codex"?"never":void 0,originChannel:i.originChannel,originThreadId:i.originThreadId,originAgentId:e.agentId||void 0,originSessionKey:i.originSessionKey,route:i.route,harness:i.harness,permissionMode:i.permissionMode,planApproval:i.planApproval,taskLifecycle:ji(e)});return{text:v.formatLaunchResult({prompt:o,workdir:i.workdir,harness:i.harness,permissionMode:i.permissionMode??_.permissionMode,planApproval:i.planApproval},s)}}catch(i){let s=ib(i),a=s.includes("Max sessions")?"":`
|
|
106
|
+
|
|
107
|
+
Use /agent_sessions to see active sessions.`;return{text:`Error launching session: ${s}${a}`}}}})}Y();function Vg(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 n=(e.args??"").split(/\s+/).includes("--full");return{text:us(v,"all",void 0,{full:n})}}})}Y();function qg(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 n=e.args?.trim();return n?{text:ps(v,n,"killed")}:{text:"Usage: /agent_kill <name-or-id>"}}})}Y();function jg(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 n=(e.args??"").trim();if(!n)return{text:`Usage: /agent_respond <id-or-name> <message>
|
|
108
|
+
/agent_respond --interrupt <id-or-name> <message>`};let r=!1,o=n,i=$l(o);i?.value==="--interrupt"&&(r=!0,o=i.rest);let s=$l(o);if(!s)return{text:"Error: Missing message. Usage: /agent_respond <id-or-name> <message>"};let a=s.value,d=s.rest;return d.trim()?{text:(await ct(v,{session:a,message:d,interrupt:r,userInitiated:!0})).text}:{text:"Error: Empty message. Usage: /agent_respond <id-or-name> <message>"}}})}Y();function Gg(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(),n=v.list("running").length;return{text:Ui(e,n)}}})}Y();var ab=50;function Hg(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 n=(e.args??"").trim();if(!n)return{text:"Usage: /agent_output <id-or-name> [--full] [--lines N]"};let r=Pr(n),o="",i=!1,s=ab;for(let d=0;d<r.length;d++)if(r[d]==="--full")i=!0;else if(r[d]==="--lines"&&d+1<r.length){let l=parseInt(r[d+1],10);!isNaN(l)&&l>0&&(s=l),d++}else o||(o=r[d]);return o?{text:ls(v,o,{full:i,lines:s})}:{text:"Usage: /agent_output <id-or-name> [--full] [--lines N]"}}})}Y();var zg="Usage: /goal [--name <name>] [--workdir <dir>] [--model <model>] [--harness <name>] [--mode <ralph|verifier>] [--completion-promise <text>] [--max-iterations N] [--verify <cmd> ...] <goal>";function Qg(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(!ge)return{text:"Error: GoalController not initialized. The code-agent service must be running."};let n=(e.args??"").trim();if(!n)return{text:zg};let r=Pr(n),o,i,s,a,d="bypassPermissions",l,u,f,g=[],y=[];for(let P=0;P<r.length;P++){let b=r[P];if(b==="--name"&&P+1<r.length)o=r[++P];else if(b==="--workdir"&&P+1<r.length)i=r[++P];else if(b==="--model"&&P+1<r.length)s=r[++P];else if(b==="--max-iterations"&&P+1<r.length){let A=parseInt(r[++P],10);!Number.isNaN(A)&&A>0&&(a=A)}else if(b==="--permission-mode"&&P+1<r.length){let A=r[++P];if(A==="default"||A==="plan"||A==="bypassPermissions")d=A;else return{text:`Error: Invalid permission mode "${A}".`}}else if(b==="--harness"&&P+1<r.length)l=r[++P];else if(b==="--mode"&&P+1<r.length){let A=r[++P];if(A==="ralph"||A==="verifier")u=A;else return{text:`Error: Invalid goal mode "${A}". Use ralph or verifier.`}}else if(b==="--completion-promise"&&P+1<r.length)f=r[++P];else if(b==="--verify"&&P+1<r.length){let A=r[++P].trim();if(!A)return{text:"Error: --verify commands must not be empty."};g.push(A)}else y.push(b)}let k=y.join(" ").trim();if(!k)return{text:zg};let I=ws({goal:k,verifierCommands:g,name:o,workdir:i,model:s,maxIterations:a,permissionMode:d,harness:l,goalMode:u,completionPromise:f},e);if(I.kind!=="resolved")return{text:I.text};try{let P=await ge.launchTask({goal:I.goal,name:I.name,workdir:I.workdir,model:I.model,reasoningEffort:I.reasoningEffort,maxIterations:I.maxIterations,permissionMode:I.permissionMode,harness:I.harness,loopMode:I.loopMode,completionPromise:I.completionPromise,originChannel:I.originChannel,originThreadId:I.originThreadId,originAgentId:I.originAgentId,originSessionKey:I.originSessionKey,route:I.route,verifierCommands:I.verifierCommands});return{text:Is(P,I)}}catch(P){return{text:`Error launching goal task: ${P instanceof Error?P.message:String(P)}`}}}})}Y();function Jg(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(!ge)return{text:"Error: GoalController not initialized. The code-agent service must be running."};let n=(e.args??"").trim();if(n){let o=ge.getTask(n);if(!o)return{text:`Error: Goal task "${n}" not found.`};let i=o.sessionId?v?.resolve(o.sessionId):void 0;return{text:cn(o,pn(i))}}let r=ge.listTasks();return r.length===0?{text:"No goal tasks found."}:{text:r.map(o=>{let i=o.sessionId?v?.resolve(o.sessionId):void 0;return cn(o,pn(i))}).join(`
|
|
109
|
+
|
|
110
|
+
`)}}})}Y();function Yg(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(!ge)return{text:"Error: GoalController not initialized. The code-agent service must be running."};let n=(e.args??"").trim();if(!n)return{text:"Usage: /goal_stop <task-id-or-name>"};let r=ge.stopTask(n);return r?r.action==="already_terminal"?{text:`Task is already ${r.task.status}.`}:{text:`Task "${r.task.name}" (${r.task.id}) stopped.`}:{text:`Error: Goal task "${n}" not found.`}}})}import{execFile as vb}from"child_process";import{createHash as sh}from"crypto";import{existsSync as db,mkdirSync as lb,readFileSync as ub,renameSync as pb,writeFileSync as cb}from"fs";import{homedir as mb}from"os";import{dirname as fb,join as Xg}from"path";function gb(t){let e=t.OPENCLAW_HOME?.trim();return e||Xg(mb(),".openclaw")}function hb(t){let e=t.OPENCLAW_CODE_AGENT_GOAL_TASKS_PATH?.trim();return e||Xg(gb(t),"code-agent-goal-tasks.json")}function Sb(t){return t instanceof Error?t.message:String(t)}function yb(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 kb(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 n=e.status,r=n==="running"||n==="waiting_for_session"?"waiting_for_session":n;return{id:e.id,name:e.name,goal:e.goal,workdir:e.workdir,status:r,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:yb(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 xs=class{path;tasks=new Map;constructor(e=process.env){this.path=hb(e),this.load()}load(){try{if(!db(this.path))return;let e=ub(this.path,"utf8"),n=JSON.parse(e);if(!Array.isArray(n))return;for(let r of n){let o=kb(r);o&&this.tasks.set(o.id,o)}this.save()}catch{}}save(){try{lb(fb(this.path),{recursive:!0});let e=`${this.path}.tmp`;cb(e,JSON.stringify([...this.tasks.values()],null,2),"utf8"),pb(e,this.path)}catch(e){console.warn(`[GoalTaskStore] Failed to save ${this.path}: ${Sb(e)}`)}}upsert(e){this.tasks.set(e.id,e),this.save()}get(e){let n=this.tasks.get(e);return n||[...this.tasks.values()].find(r=>r.name===e)}list(){return[...this.tasks.values()].sort((e,n)=>n.createdAt-e.createdAt)}};sn();var Pb=8,ah=600*1e3,wb=4e3,Ol=1200,Ib="DONE",bb=["BASH_ENV","ENV"];function xb(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,48)||"goal-task"}function wo(t,e){return t.length<=e?t:`${t.slice(0,e-3)}...`}function fn(t,e=20){let n=t.split(/\r?\n/).map(r=>r.trimEnd()).filter(r=>r.trim().length>0);return n.length<=e?n.join(`
|
|
107
111
|
`):n.slice(-e).join(`
|
|
108
|
-
`)}function
|
|
109
|
-
`);return
|
|
112
|
+
`)}function Zg(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function eh(t){let e=t?.trim();return e&&e.length>0?e:Ib}function Ab(t){return t.route??eo(t.originChannel,t.originThreadId,t.originSessionKey)}function Dl(t){return t.map((e,n)=>({label:e.label.trim()||`check-${n+1}`,command:e.command.trim(),timeoutMs:e.timeoutMs??ah})).filter(e=>e.command.length>0)}function Rb(t){return t.loopMode==="verifier"}function Tb(t){return Dl(t.verifierCommands).length>0}function th(t){return Rb(t)&&!Tb(t)}function As(){return"Verifier-mode goal tasks require at least one verifier command."}function nh(t){let e=t.steps.filter(n=>!n.ok).map(n=>`${n.label}:${n.exitCode}:${fn(n.output,12)}`).join(`
|
|
113
|
+
`);return sh("sha1").update(e).digest("hex")}function Cb(t){return sh("sha1").update(fn(t,24)).digest("hex")}function rh(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 Mb(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(`
|
|
110
114
|
`);let e=t.verifierCommands.map(n=>`- ${n.label}: ${n.command}`).join(`
|
|
111
115
|
`);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(`
|
|
112
|
-
`)}function
|
|
116
|
+
`)}function oh(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(`
|
|
113
117
|
`):["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(`
|
|
114
|
-
`)}function
|
|
118
|
+
`)}function _b(t,e){let n=e.steps.filter(o=>!o.ok).map(o=>[`- ${o.label} failed (exit ${o.exitCode})`,fn(o.output,18)].join(`
|
|
115
119
|
`)).join(`
|
|
116
120
|
|
|
117
121
|
`);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:",n,"","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(`
|
|
118
|
-
`)}function
|
|
119
|
-
`)}function
|
|
122
|
+
`)}function Eb(t,e){let n=fn(e,18)||"(no meaningful output)",r=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}.`,`- ${r}`,"","Latest output / blockers:",n,"","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(`
|
|
123
|
+
`)}function $b(t,e){let n=e.steps.filter(r=>!r.ok).map(r=>[`- ${r.label} failed (exit ${r.exitCode})`,fn(r.output,18)].join(`
|
|
120
124
|
`)).join(`
|
|
121
125
|
|
|
122
126
|
`);return["You emitted the completion promise, but the external verifiers did not pass.","","Goal:",t.goal,"","Verifier failures:",n,"","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(`
|
|
123
|
-
`)}function
|
|
124
|
-
`)}function
|
|
125
|
-
${s}`:""}`.trim();n({label:e.label,command:e.command,ok:!o,exitCode:d,durationMs:a,output:
|
|
127
|
+
`)}function Ob(t,e){let n=e.trim();if(!n)return!1;let r=new RegExp(`(^|\\n)\\s*${Zg(n)}\\s*(\\n|$)`,"i"),o=new RegExp(`<promise>\\s*${Zg(n)}\\s*<\\/promise>`,"i");return r.test(t)||o.test(t)}function ih(t){return t.steps.map(e=>`${e.ok?"PASS":"FAIL"} ${e.label} (exit ${e.exitCode}, ${Math.round(e.durationMs)}ms)`).join(`
|
|
128
|
+
`)}function Un(t){return t instanceof Error?t.message:String(t)}function Db(t){return t==="succeeded"||t==="failed"||t==="stopped"}function Nb(t){return wo(t.error?.trim()||"Underlying session failed.",Ol)}function Fb(t=process.env){let e={...t};for(let n of bb)delete e[n];return e}function Lb(t,e){return new Promise(n=>{let r=Date.now();vb("bash",["-lc",e.command],{cwd:t,timeout:e.timeoutMs??ah,maxBuffer:1024*1024,env:Fb()},(o,i,s)=>{let a=Date.now()-r,d=typeof o?.code=="number"?o.code:o?1:0,l=`${i??""}${s?`
|
|
129
|
+
${s}`:""}`.trim();n({label:e.label,command:e.command,ok:!o,exitCode:d,durationMs:a,output:wo(l||"(no output)",wb)})})})}var Rs=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 xs}start(){this.started||(this.started=!0,!this.restorePromise&&(this.restorePromise=this.restoreRecoverableTasks().catch(e=>{console.warn(`[GoalController] Failed to restore recoverable tasks: ${Un(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 n=e.loopMode??"verifier",r=Dl(e.verifierCommands);if(n==="verifier"&&r.length===0)throw new Error(As());let i={id:Gi(8),name:xb(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??Pb,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:n,completionPromise:eh(e.completionPromise),verifierCommands:r,repeatedFailureCount:0},s=await this.spawnTaskSession(i,Mb(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
|
|
126
130
|
|
|
127
131
|
Goal:
|
|
128
|
-
${
|
|
129
|
-
`));return this.attachSessionObservers(e,i),i}let o=await this.spawnManagedTaskSession(e,n,r.harnessSessionId);return this.attachSessionObservers(e,o),o}resolveResumeSessionId(e){if(e.harnessSessionId)return e.harnessSessionId;if(e.sessionId){let r=this.sessionManager.resolveHarnessSessionId(e.sessionId);if(r)return r}let n=this.sessionManager.resolveHarnessSessionId(e.name);if(n)return n}captureRecoverableTasks(){for(let e of this.store.list()){if(e.status!=="running"&&e.status!=="waiting_for_session")continue;let n=e.sessionId?this.sessionManager.resolve(e.sessionId):void 0;n&&(e.sessionId=n.id,e.sessionName=n.name,e.harnessSessionId=n.harnessSessionId??e.harnessSessionId,e.route=n.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(
|
|
132
|
+
${wo(i.goal,500)}`,"goal-task-started"),i}stopTask(e){let n=this.store.get(e);if(n)return Db(n.status)?{task:n,action:"already_terminal"}:(n.sessionId&&this.sessionManager.kill(n.sessionId,"user"),this.markTaskStopped(n,"Stopped by user."),{task:n,action:"stopped"})}async spawnTaskSession(e,n){return this.spawnManagedTaskSession(e,n)}async spawnManagedTaskSession(e,n,r){let o=r?this.sessionManager.resolveHarnessSessionId(r)??r:void 0,i=r?this.sessionManager.resolve(r):void 0,s=o?this.sessionManager.getPersistedSession(o)??this.sessionManager.getPersistedSession(r??o):void 0,{resumeSessionId:a}=lr({requestedResumeSessionId:o,activeSession:i?{harnessSessionId:i.harnessSessionId}:void 0,persistedSession:s?{harness:s.harness,backendRef:s.backendRef}:void 0}),d={prompt:n,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:Ab(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,n,r){if(!r.harnessSessionId){let i=await this.spawnTaskSession(e,["The previous session ended without a resumable harness session id.","Continue working on the same goal.","",n].join(`
|
|
133
|
+
`));return this.attachSessionObservers(e,i),i}let o=await this.spawnManagedTaskSession(e,n,r.harnessSessionId);return this.attachSessionObservers(e,o),o}resolveResumeSessionId(e){if(e.harnessSessionId)return e.harnessSessionId;if(e.sessionId){let r=this.sessionManager.resolveHarnessSessionId(e.sessionId);if(r)return r}let n=this.sessionManager.resolveHarnessSessionId(e.name);if(n)return n}captureRecoverableTasks(){for(let e of this.store.list()){if(e.status!=="running"&&e.status!=="waiting_for_session")continue;let n=e.sessionId?this.sessionManager.resolve(e.sessionId):void 0;n&&(e.sessionId=n.id,e.sessionName=n.name,e.harnessSessionId=n.harnessSessionId??e.harnessSessionId,e.route=n.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(th(e)){this.markTaskFailed(e,As());continue}if(e.sessionId){let r=this.sessionManager.resolve(e.sessionId);if(r&&(r.status==="starting"||r.status==="running"))continue}let n=this.resolveResumeSessionId(e);if(!n){this.markTaskFailed(e,"Goal task could not be resumed after gateway restart because no resumable session id was available.");continue}try{let r=await this.spawnManagedTaskSession(e,oh(e),n);if(!this.started){e.sessionId=r.id,e.sessionName=r.name,e.harnessSessionId=r.harnessSessionId??n,e.route=r.route??e.route,e.status="waiting_for_session",e.updatedAt=Date.now(),this.store.upsert(e),this.sessionManager.kill(r.id,"shutdown");break}this.attachSessionObservers(e,r),e.sessionId=r.id,e.sessionName=r.name,e.harnessSessionId=r.harnessSessionId??n,e.route=r.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`,r),this.scheduleTaskEvaluation(e.id,"restore",r.id)}catch(r){this.markTaskFailed(e,`Failed to resume the goal task after gateway restart: ${Un(r)}`)}}}async runVerifiers(e){let n=Dl(e.verifierCommands);if(n.length===0){let s={status:"fail",steps:[{label:"verifier-config",command:"(none configured)",ok:!1,exitCode:1,durationMs:0,output:As()}],summary:"",fingerprint:""};return s.fingerprint=nh(s),s.summary=ih(s),s}let r=[];for(let s of n)r.push(await Lb(e.workdir,s));let i={status:r.every(s=>s.ok)?"pass":"fail",steps:r,summary:"",fingerprint:""};return i.fingerprint=nh(i),i.summary=ih(i),i}notify(e,n,r){this.sessionManager.emitGoalTaskUpdate(e,n,r)}notifyIterationStatus(e,n,r){let o=pn(r??(e.sessionId?this.sessionManager.resolve(e.sessionId):void 0)),i=`${n}
|
|
130
134
|
|
|
131
|
-
${cn(e,o)}`;this.notify(e,i,"goal-task-progress")}setTaskRunningWithSession(e,n){e.sessionId=n.id,e.sessionName=n.name,e.harnessSessionId=n.harnessSessionId,e.route=n.route??e.route,e.status="running",e.waitingForUserReason=void 0,e.updatedAt=Date.now(),this.store.upsert(e)}attachSessionObservers(e,n){if(this.observerDisposers.has(n.id))return;let r=(i,s)=>{(s==="completed"||s==="failed"||s==="killed")&&(this.removeSessionObserver(n.id),this.scheduleTaskEvaluation(e.id,`status:${s}`,n.id))},o=()=>{let i=this.store.get(e.id);i&&(i.sessionId=n.id,i.sessionName=n.name,i.harnessSessionId=n.harnessSessionId,i.route=n.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`,n),this.scheduleTaskEvaluation(e.id,"turnEnd",n.id))};n.on("statusChange",r),n.on("turnEnd",o),this.observerDisposers.set(n.id,()=>{n.off?.("statusChange",r),n.off?.("turnEnd",o),n.removeListener?.("statusChange",r),n.removeListener?.("turnEnd",o)})}scheduleTaskEvaluation(e,n,r){if(!this.started)return;let o=this.scheduledEvaluations.get(e);if(o){!o.sessionId&&r&&(o.sessionId=r);return}let i={timer:setTimeout(()=>{this.scheduledEvaluations.delete(e),this.evaluateTask(e,n,i.sessionId).catch(s=>{console.warn(`[GoalController] evaluateTask error (${n}): ${
|
|
135
|
+
${cn(e,o)}`;this.notify(e,i,"goal-task-progress")}setTaskRunningWithSession(e,n){e.sessionId=n.id,e.sessionName=n.name,e.harnessSessionId=n.harnessSessionId,e.route=n.route??e.route,e.status="running",e.waitingForUserReason=void 0,e.updatedAt=Date.now(),this.store.upsert(e)}attachSessionObservers(e,n){if(this.observerDisposers.has(n.id))return;let r=(i,s)=>{(s==="completed"||s==="failed"||s==="killed")&&(this.removeSessionObserver(n.id),this.scheduleTaskEvaluation(e.id,`status:${s}`,n.id))},o=()=>{let i=this.store.get(e.id);i&&(i.sessionId=n.id,i.sessionName=n.name,i.harnessSessionId=n.harnessSessionId,i.route=n.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`,n),this.scheduleTaskEvaluation(e.id,"turnEnd",n.id))};n.on("statusChange",r),n.on("turnEnd",o),this.observerDisposers.set(n.id,()=>{n.off?.("statusChange",r),n.off?.("turnEnd",o),n.removeListener?.("statusChange",r),n.removeListener?.("turnEnd",o)})}scheduleTaskEvaluation(e,n,r){if(!this.started)return;let o=this.scheduledEvaluations.get(e);if(o){!o.sessionId&&r&&(o.sessionId=r);return}let i={timer:setTimeout(()=>{this.scheduledEvaluations.delete(e),this.evaluateTask(e,n,i.sessionId).catch(s=>{console.warn(`[GoalController] evaluateTask error (${n}): ${Un(s)}`)})},0),sessionId:r};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 n=this.observerDisposers.get(e);n&&(this.observerDisposers.delete(e),n())}markTaskFailed(e,n){e.status="failed",e.failureReason=wo(n,Ol),e.updatedAt=Date.now(),this.store.upsert(e),this.notify(e,`\u274C [${e.name}] Goal task failed
|
|
132
136
|
|
|
133
137
|
${e.failureReason}`,"goal-task-failed")}markTaskFailedWaitingForUser(e,n){this.markTaskFailed(e,`Goal task was waiting for user input and cannot continue autonomously: ${n}`)}markTaskSucceeded(e,n){e.status="succeeded",e.lastVerifierSummary=n,e.updatedAt=Date.now(),this.store.upsert(e),this.notify(e,`\u2705 [${e.name}] Goal task succeeded
|
|
134
138
|
|
|
135
|
-
${n}`,"goal-task-succeeded")}markTaskStopped(e,n){e.status="stopped",e.failureReason=
|
|
139
|
+
${n}`,"goal-task-succeeded")}markTaskStopped(e,n){e.status="stopped",e.failureReason=wo(n,Ol),e.updatedAt=Date.now(),this.store.upsert(e),this.notify(e,`\u26D4 [${e.name}] Goal task stopped
|
|
136
140
|
|
|
137
|
-
${e.failureReason}`,"goal-task-stopped")}async handleRunningSession(e,n){if(n.pendingPlanApproval){let s=await
|
|
138
|
-
`),o=
|
|
139
|
-
`);if(n.pendingPlanApproval){let s=await
|
|
141
|
+
${e.failureReason}`,"goal-task-stopped")}async handleRunningSession(e,n){if(n.pendingPlanApproval){let s=await ct(this.sessionManager,{session:n.id,message:"Approved. Implement the plan.",approve:!0,userInitiated:!1});s.isError&&this.markTaskFailed(e,s.text);return}if(!n.pendingInputState){this.setTaskRunningWithSession(e,n);return}let r=n.getOutput(30).join(`
|
|
142
|
+
`),o=rh(r);if(!o){this.markTaskFailedWaitingForUser(e,fn(r,24)||"The session is waiting for user input.");return}let i=await ct(this.sessionManager,{session:n.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,n,r){try{let o=await this.resumeTaskSession(e,r,n);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: ${Un(o)}`)}}async handleTerminalSession(e,n){if(n.status==="failed"){this.markTaskFailed(e,Nb(n));return}if(n.status==="killed"&&n.killReason==="user"){this.markTaskStopped(e,"Stopped by user.");return}if(n.status==="killed"&&n.killReason==="idle-timeout"){let i=n.getOutput(60).join(`
|
|
143
|
+
`);if(n.pendingPlanApproval){let s=await ct(this.sessionManager,{session:n.id,message:"Approved. Implement the plan.",approve:!0,userInitiated:!1});if(s.isError){this.markTaskFailed(e,s.text);return}let a=this.sessionManager.resolve(n.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(n.pendingInputState){let s=rh(i);if(!s){this.markTaskFailed(e,`Goal task was waiting for user input and cannot continue autonomously: ${fn(i,24)||"The goal task hit idle timeout while waiting for user input."}`);return}await this.resumeAfterIdleTimeout(e,n,["The previous session hit idle timeout while waiting for a response.",`Use this response and continue the goal: ${s}`].join(`
|
|
140
144
|
|
|
141
|
-
`));return}await this.resumeAfterIdleTimeout(e,n,
|
|
142
|
-
`),s=
|
|
145
|
+
`));return}await this.resumeAfterIdleTimeout(e,n,oh(e));return}if(n.status==="killed"&&n.killReason!=="done"){this.markTaskFailed(e,`Underlying session was killed (${n.killReason}).`);return}if(e.loopMode==="ralph"){let i=n.getOutput(200).join(`
|
|
146
|
+
`),s=eh(e.completionPromise);if(Ob(i,s)){if(e.verifierCommands.length===0){this.markTaskSucceeded(e,`Completion promise "${s}" detected in agent output.`);return}let u=await this.runVerifiers(e);if(e.lastVerifierSummary=u.summary,e.updatedAt=Date.now(),u.status==="pass"){this.markTaskSucceeded(e,[`Completion promise "${s}" detected.`,u.summary].join(`
|
|
143
147
|
`));return}if(e.lastVerifierFingerprint===u.fingerprint?e.repeatedFailureCount+=1:e.repeatedFailureCount=1,e.lastVerifierFingerprint=u.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}).`,u.summary].join(`
|
|
144
|
-
`));return}e.iteration+=1;let f
|
|
145
|
-
`));return}e.iteration+=1;let l=
|
|
146
|
-
`));return}e.iteration+=1;let o=
|
|
147
|
-
`);return(t??"")+o}function Vb(t,e){let n=t.resumeSessionId??t.resumeWorktreeFrom;if(!n)return{};let r=e(n);if(!r)return{};let o=!!r.harness||!!r.backendRef,i=(()=>{if(r.workdir&&r.workdir!==r.worktreePath)return r.workdir;if(r.worktreePath){let a=Xi(r.worktreePath);return r.workdir&&a&&xs(r.workdir,a)?r.workdir:a??r.workdir}return r.workdir})();if(!t.worktreeStrategy&&r.worktreeStrategy&&(t.worktreeStrategy=r.worktreeStrategy),!t.planApproval&&r.planApproval&&(t.planApproval=r.planApproval),!r.worktreePath){let a=o&&$i(io({persistedHarness:r.harness,backendRef:r.backendRef}));return{originalWorkdir:i,canCreateManagedWorktreeForResumeWithoutPersistedPath:a}}if(!r.worktreeBranch)throw new Error(`Cannot resume session "${n}": persisted worktree metadata is missing worktreeBranch.`);let s=$i(io({persistedHarness:r.harness,backendRef:r.backendRef}))&&!!r.backendRef?.worktreePath;if(Bb(r.worktreePath))return console.info(`[SessionManager] Resuming with existing worktree: ${r.worktreePath}`),{actualWorkdir:r.worktreePath,originalWorkdir:i??r.worktreePath,worktreePath:r.worktreePath,worktreeBranchName:r.worktreeBranch};if(!i)return console.warn(`[SessionManager] Worktree ${r.worktreePath} no longer exists and cannot be recreated, using original workdir`),{clearedResumeSessionId:!!t.resumeSessionId,clearedResumeWorktreeFrom:!!t.resumeWorktreeFrom};if(s)return console.info(`[SessionManager] Native Codex worktree ${r.worktreePath} is missing; resuming from original workdir and letting the backend restore thread state.`),{actualWorkdir:i,originalWorkdir:i,worktreeBranchName:r.worktreeBranch,clearedResumeWorktreeFrom:!!t.resumeWorktreeFrom,restoredMissingNativeBackendWorktree:!0};try{es(i);let a=gl(i,r.worktreeBranch.replace(/^agent\//,""),{allowExistingBranch:!0});return console.info(`[SessionManager] Recreated worktree from branch ${r.worktreeBranch}: ${a}`),{actualWorkdir:a,originalWorkdir:i,worktreePath:a,worktreeBranchName:r.worktreeBranch}}catch(a){return console.warn(`[SessionManager] Failed to recreate worktree for resume: ${sh(a)}, using original workdir`),{actualWorkdir:i,originalWorkdir:i,clearedResumeSessionId:!!t.resumeSessionId,clearedResumeWorktreeFrom:!!t.resumeWorktreeFrom}}}function ah(t,e,n){let{actualWorkdir:r,originalWorkdir:o,worktreePath:i,worktreeBranchName:s,clearedResumeSessionId:a,clearedResumeWorktreeFrom:d,restoredMissingNativeBackendWorktree:l,canCreateManagedWorktreeForResumeWithoutPersistedPath:u}=Vb(t,n);a&&(t.resumeSessionId=void 0),d&&(t.resumeWorktreeFrom=void 0),r??=t.workdir,o??=t.workdir;let f=!!(t.resumeSessionId??t.resumeWorktreeFrom),g=t.worktreeStrategy??_.defaultWorktreeStrategy;g&&(t.worktreeStrategy=g);let y=Ub(t),I=(!f||!!u)&&!l&&!i&&g&&g!=="off"&&!y;if(y&&!cl(o))throw new Error(`Cannot launch session "${e}": worktree strategy "${g}" requires a git worktree, but "${o}" is not a git repository.`);if(I&&cl(o)){if(!Jf(o))throw new Error(`Cannot launch session "${e}": insufficient space for worktree creation.`);try{if(i=gl(o,e),r=i,s=Zi(i),!s)throw new Error(`created worktree at ${i} but failed to resolve branch name`);console.log(`[SessionManager] Created worktree at ${i}`)}catch(P){throw new Error(`Cannot launch session "${e}": worktree creation failed: ${sh(P)}`)}}else if(I)throw new Error(`Cannot launch session "${e}": worktree strategy "${g}" requires a git worktree, but "${o}" is not a git repository.`);return f&&i&&(r=i),{actualWorkdir:r,originalWorkdir:o,effectiveSystemPrompt:i&&s?Kb(t.systemPrompt,o,i,s):t.systemPrompt,worktreePath:i,worktreeBranchName:s,clearedResumeSessionId:a,clearedResumeWorktreeFrom:d,restoredMissingNativeBackendWorktree:l}}var As=class{constructor(e){this.getPersistedSession=e}getPersistedSession;prepareSpawn(e,n){return ah(e,n,this.getPersistedSession)}hydrateSpawnedSession(e,n,r){r.worktreeStrategy&&r.worktreeStrategy!=="off"&&(e.originalWorkdir=n.originalWorkdir),n.worktreePath&&(e.worktreePath=n.worktreePath,e.worktreeBranch=n.worktreeBranchName,e.worktreeState="provisioned"),r.worktreePrTargetRepo&&(e.worktreePrTargetRepo=r.worktreePrTargetRepo)}};he();var Rs=class{constructor(e){this.deps=e}deps;applySessionPatch(e,n){let r=this.deps.store.getPersistedSession(e);r&&(Object.assign(r,n),this.deps.store.assertPersistedEntry(r));let o=this.findActiveSessionForRef(e,r);return o&&this.applyPatchToActiveSession(o,n),!r&&!o?!1:(r&&this.deps.store.saveIndex(),!0)}matchesExistingSession(e,n){if(!n)return!1;let r=M(e),o=M(n);return!!(n.sessionId&&e.id===n.sessionId||o&&o===r||n?.harnessSessionId&&e.harnessSessionId===n.harnessSessionId||n?.name&&e.name===n.name)}findActiveSessionForRef(e,n){let r=this.deps.resolveSession(e);if(r)return r;for(let o of this.deps.sessions.values())if(ne(o)===e||M(o)===e||o.harnessSessionId===e||this.matchesExistingSession(o,n))return o}applyPatchToActiveSession(e,n){this.applyControlStatePatch(e,n),this.applySessionMetadataPatch(e,n),this.applyWorktreeMetadataPatch(e,n)}applyControlStatePatch(e,n){let r={lifecycle:n.lifecycle,approvalState:n.approvalState,approvalExecutionState:n.approvalExecutionState,worktreeState:n.worktreeState,runtimeState:n.runtimeState,deliveryState:n.deliveryState,requestedPermissionMode:n.requestedPermissionMode,currentPermissionMode:n.currentPermissionMode,pendingPlanApproval:n.pendingPlanApproval,planApprovalContext:n.planApprovalContext,planDecisionVersion:n.planDecisionVersion,actionablePlanDecisionVersion:n.actionablePlanDecisionVersion,canonicalPlanPromptVersion:n.canonicalPlanPromptVersion,approvalPromptRequiredVersion:n.approvalPromptRequiredVersion,approvalPromptVersion:n.approvalPromptVersion,approvalPromptStatus:n.approvalPromptStatus,approvalPromptTransport:n.approvalPromptTransport,approvalPromptMessageKind:n.approvalPromptMessageKind,approvalPromptLastAttemptAt:n.approvalPromptLastAttemptAt,approvalPromptDeliveredAt:n.approvalPromptDeliveredAt,approvalPromptFailedAt:n.approvalPromptFailedAt,planModeApproved:n.planModeApproved,pendingWorktreeDecisionSince:n.pendingWorktreeDecisionSince};if(typeof e.applyControlPatch=="function"){e.applyControlPatch(r);return}this.assignIfDefined(e,"lifecycle",n.lifecycle),this.assignIfDefined(e,"approvalState",n.approvalState),this.assignIfDefined(e,"approvalExecutionState",n.approvalExecutionState),this.assignIfDefined(e,"worktreeState",n.worktreeState),this.assignIfDefined(e,"runtimeState",n.runtimeState),this.assignIfDefined(e,"deliveryState",n.deliveryState),this.assignIfDefined(e,"requestedPermissionMode",n.requestedPermissionMode),this.assignIfDefined(e,"currentPermissionMode",n.currentPermissionMode),this.assignIfDefined(e,"pendingPlanApproval",n.pendingPlanApproval),this.assignIfDefined(e,"planApprovalContext",n.planApprovalContext),this.assignIfDefined(e,"planDecisionVersion",n.planDecisionVersion),this.assignIfDefined(e,"actionablePlanDecisionVersion",n.actionablePlanDecisionVersion),this.assignIfDefined(e,"canonicalPlanPromptVersion",n.canonicalPlanPromptVersion),this.assignIfDefined(e,"approvalPromptRequiredVersion",n.approvalPromptRequiredVersion),this.assignIfDefined(e,"approvalPromptVersion",n.approvalPromptVersion),this.assignIfDefined(e,"approvalPromptStatus",n.approvalPromptStatus),this.assignIfDefined(e,"approvalPromptTransport",n.approvalPromptTransport),this.assignIfDefined(e,"approvalPromptMessageKind",n.approvalPromptMessageKind),this.assignIfDefined(e,"approvalPromptLastAttemptAt",n.approvalPromptLastAttemptAt),this.assignIfDefined(e,"approvalPromptDeliveredAt",n.approvalPromptDeliveredAt),this.assignIfDefined(e,"approvalPromptFailedAt",n.approvalPromptFailedAt),this.setControlFieldIfDefined(e,"planModeApproved",n.planModeApproved)}applySessionMetadataPatch(e,n){this.assignIfDefined(e,"approvalRationale",n.approvalRationale)}applyWorktreeMetadataPatch(e,n){this.assignIfDefined(e,"worktreePath",n.worktreePath),this.assignIfDefined(e,"worktreeBranch",n.worktreeBranch),this.assignIfDefined(e,"worktreePrUrl",n.worktreePrUrl),this.assignIfDefined(e,"worktreePrNumber",n.worktreePrNumber),this.assignIfDefined(e,"worktreeMerged",n.worktreeMerged),this.assignIfDefined(e,"worktreeMergedAt",n.worktreeMergedAt),this.assignIfDefined(e,"worktreeDisposition",n.worktreeDisposition),this.assignIfDefined(e,"worktreePrTargetRepo",n.worktreePrTargetRepo),this.assignIfDefined(e,"worktreePushRemote",n.worktreePushRemote),this.assignIfDefined(e,"worktreeLifecycle",n.worktreeLifecycle),"autoMergeParentSessionId"in n&&(e.autoMergeParentSessionId=n.autoMergeParentSessionId),"autoMergeConflictResolutionAttemptCount"in n&&(e.autoMergeConflictResolutionAttemptCount=n.autoMergeConflictResolutionAttemptCount),"autoMergeResolverSessionId"in n&&(e.autoMergeResolverSessionId=n.autoMergeResolverSessionId)}assignIfDefined(e,n,r){r!==void 0&&(e[n]=r)}setControlFieldIfDefined(e,n,r){r!==void 0&&e.setControlField?.(n,r)}};he();var qb=new Set(["starting","running"]),Ts=class{constructor(e,n){this.sessions=e;this.store=n}sessions;store;resolveActive(e){let n=this.sessions.get(e);return n||(this.findPreferredMatch(e,r=>r.name===e)??this.findPreferredMatch(e,r=>M(r)===e)??this.findPreferredMatch(e,r=>r.harnessSessionId===e))}getPersistedSession(e){return this.store.getPersistedSession(e)}resolveBackendConversationId(e){let n=this.resolveActive(e);return this.store.resolveBackendConversationId(e,n?M(n)??n.harnessSessionId:void 0)}findPreferredMatch(e,n){let r,o;for(let i of this.sessions.values())n(i,e)&&((!o||i.startedAt>o.startedAt)&&(o=i),qb.has(i.status)&&(!r||i.startedAt>r.startedAt)&&(r=i));return r??o}};he();he();rt();var Cs=class{constructor(e){this.deps=e}deps;async plan(e){let n=ne(e)??e.harnessSessionId;if(this.deps.isAlreadyMerged(n))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 r=e.worktreeStrategy;if(!r||r==="off"||r==="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??un(i),d=this.deps.getWorktreeCompletionState(i,o,s,a);if(d==="no-change")return{kind:"no-change",repoDir:i,worktreePath:o,nativeBackendWorktree:We(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=$n(i,s,a);return l?{kind:"decision",strategy:r,repoDir:i,worktreePath:o,branchName:s,baseBranch:a,diffSummary:l,sessionRef:n??void 0}:(console.warn(`[SessionManager] Failed to get diff summary for ${s}, skipping merge-back`),{kind:"skip",result:{notificationSent:!1,worktreeRemoved:!1}})}};function Dl(t,e){return{...e,baseBranch:e.baseBranch??t.worktreeBaseBranch,targetRepo:e.targetRepo??t.worktreePrTargetRepo,pushRemote:e.pushRemote??t.worktreePushRemote}}function Ms(t,e={}){let n=e.updatedAt??new Date().toISOString(),r={pendingWorktreeDecisionSince:e.pendingSince??n,lastWorktreeReminderAt:void 0,lifecycle:"awaiting_worktree_decision",worktreeState:"pending_decision",worktreeLifecycle:Dl(t,{state:"pending_decision",updatedAt:n,notes:e.notes})};return e.clearResolverSessionId&&(r.autoMergeResolverSessionId=void 0),r}function dh(t,e,n,r={}){let o=r.updatedAt??new Date().toISOString();return{autoMergeConflictResolutionAttemptCount:n,autoMergeResolverSessionId:e,pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,lifecycle:"terminal",worktreeState:"merge_conflict_resolving",worktreeLifecycle:Dl(t,{state:"merge_conflict_resolving",updatedAt:o,notes:r.notes})}}function lh(t,e={}){let n=e.updatedAt??new Date().toISOString(),r=e.resolvedAt??n,o={worktreeMerged:!0,worktreeMergedAt:e.mergedAt??r,lifecycle:"terminal",worktreeState:"merged",pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeLifecycle:Dl(t,{state:"merged",updatedAt:n,resolvedAt:r,resolutionSource:e.resolutionSource??"agent_merge"})};return e.clearResolverSessionId&&(o.autoMergeResolverSessionId=void 0),o}rt();var _s=class{constructor(e){this.deps=e;this.actions=new Cs({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(n=>typeof n=="string").join(`
|
|
148
|
+
`));return}e.iteration+=1;let f=$b(e,u);try{let g=await this.resumeTaskSession(e,f,n);this.setTaskRunningWithSession(e,g),this.notifyIterationStatus(e,`\u{1F501} [${e.name}] Completion claimed but verifiers still failed`),this.scheduleTaskEvaluation(e.id,"ralph-verifier-resume",g.id)}catch(g){this.markTaskFailed(e,`Failed to resume the Ralph goal task after verifier failure: ${Un(g)}`)}return}let d=Cb(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:",fn(i,20)||"(no output)"].join(`
|
|
149
|
+
`));return}e.iteration+=1;let l=Eb(e,i);try{let u=await this.resumeTaskSession(e,l,n);this.setTaskRunningWithSession(e,u),this.notifyIterationStatus(e,`\u{1F501} [${e.name}] Ralph iteration continued`),this.scheduleTaskEvaluation(e.id,"ralph-continue",u.id)}catch(u){this.markTaskFailed(e,`Failed to continue the Ralph goal task: ${Un(u)}`)}return}let r=await this.runVerifiers(e);if(e.lastVerifierSummary=r.summary,e.updatedAt=Date.now(),r.status==="pass"){this.markTaskSucceeded(e,r.summary);return}if(e.lastVerifierFingerprint===r.fingerprint?e.repeatedFailureCount+=1:e.repeatedFailureCount=1,e.lastVerifierFingerprint=r.fingerprint,e.iteration+1>=e.maxIterations){this.markTaskFailed(e,[`Verifier did not pass before hitting the iteration budget (${e.maxIterations}).`,r.summary].join(`
|
|
150
|
+
`));return}e.iteration+=1;let o=_b(e,r);try{let i=await this.resumeTaskSession(e,o,n);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: ${Un(i)}`)}}async evaluateTask(e,n,r){this.restorePromise&&await this.restorePromise;let o=this.store.get(e);o&&await this.reconcileTask(o,n,r)}async reconcileTask(e,n="manual",r){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)&&r?this.dirtyEvaluationSessionIds.set(e.id,r):this.dirtyEvaluationSessionIds.has(e.id)||this.dirtyEvaluationSessionIds.set(e.id,r);return}this.inFlight.add(e.id);try{if(r&&e.sessionId&&e.sessionId!==r){let i=this.sessionManager.resolve(r);if(i&&(i.status==="completed"||i.status==="failed"||i.status==="killed"))return}let o=r?this.sessionManager.resolve(r)??(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(th(e)){this.markTaskFailed(e,As());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,`${n}:dirty`,o)}}}}};Te();import{existsSync as Wb,realpathSync as Bb}from"fs";import{resolve as Ub}from"path";function dh(t){if(!t)return;let e=Ub(t);try{if(Wb(e))return Bb.native(e)}catch{}return e}function Ts(t,e){return!t||!e?!1:dh(t)===dh(e)}he();Te();import{existsSync as Kb}from"fs";he();rt();function lh(t){return t instanceof Error?t.message:String(t)}function Vb(t){let e=t.worktreeStrategy??_.defaultWorktreeStrategy;return!!e&&e!=="off"&&ll(uo({harnessName:t.harness??Le(),backendRef:t.backendRef}))}function qb(t,e,n,r){let o=["","You are working in a git worktree.",`Worktree path: ${n}`,`Branch: ${r}`,"",`IMPORTANT: ALL file edits must be made within this worktree at ${n}.`,`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"`,"","Before finishing, run `git status --short` in this worktree.","If you made actual task changes, commit all of them to this branch before finishing.","Use `git add` and `git commit`. If no repository changes are needed, leave the worktree clean before finishing.","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(`
|
|
151
|
+
`);return(t??"")+o}function jb(t,e){let n=t.resumeSessionId??t.resumeWorktreeFrom;if(!n)return{};let r=e(n);if(!r)return{};let o=!!r.harness||!!r.backendRef,i=(()=>{if(r.workdir&&r.workdir!==r.worktreePath)return r.workdir;if(r.worktreePath){let a=ts(r.worktreePath);return r.workdir&&a&&Ts(r.workdir,a)?r.workdir:a??r.workdir}return r.workdir})();if(!t.worktreeStrategy&&r.worktreeStrategy&&(t.worktreeStrategy=r.worktreeStrategy),!t.planApproval&&r.planApproval&&(t.planApproval=r.planApproval),!r.worktreePath){let a=o&&Li(uo({persistedHarness:r.harness,backendRef:r.backendRef}));return{originalWorkdir:i,canCreateManagedWorktreeForResumeWithoutPersistedPath:a}}if(!r.worktreeBranch)throw new Error(`Cannot resume session "${n}": persisted worktree metadata is missing worktreeBranch.`);let s=Li(uo({persistedHarness:r.harness,backendRef:r.backendRef}))&&!!r.backendRef?.worktreePath;if(Kb(r.worktreePath))return console.info(`[SessionManager] Resuming with existing worktree: ${r.worktreePath}`),{actualWorkdir:r.worktreePath,originalWorkdir:i??r.worktreePath,worktreePath:r.worktreePath,worktreeBranchName:r.worktreeBranch};if(!i)return console.warn(`[SessionManager] Worktree ${r.worktreePath} no longer exists and cannot be recreated, using original workdir`),{clearedResumeSessionId:!!t.resumeSessionId,clearedResumeWorktreeFrom:!!t.resumeWorktreeFrom};if(s)return console.info(`[SessionManager] Native Codex worktree ${r.worktreePath} is missing; resuming from original workdir and letting the backend restore thread state.`),{actualWorkdir:i,originalWorkdir:i,worktreeBranchName:r.worktreeBranch,clearedResumeWorktreeFrom:!!t.resumeWorktreeFrom,restoredMissingNativeBackendWorktree:!0};try{rs(i);let a=Sl(i,r.worktreeBranch.replace(/^agent\//,""),{allowExistingBranch:!0});return console.info(`[SessionManager] Recreated worktree from branch ${r.worktreeBranch}: ${a}`),{actualWorkdir:a,originalWorkdir:i,worktreePath:a,worktreeBranchName:r.worktreeBranch}}catch(a){return console.warn(`[SessionManager] Failed to recreate worktree for resume: ${lh(a)}, using original workdir`),{actualWorkdir:i,originalWorkdir:i,clearedResumeSessionId:!!t.resumeSessionId,clearedResumeWorktreeFrom:!!t.resumeWorktreeFrom}}}function uh(t,e,n){let{actualWorkdir:r,originalWorkdir:o,worktreePath:i,worktreeBranchName:s,clearedResumeSessionId:a,clearedResumeWorktreeFrom:d,restoredMissingNativeBackendWorktree:l,canCreateManagedWorktreeForResumeWithoutPersistedPath:u}=jb(t,n);a&&(t.resumeSessionId=void 0),d&&(t.resumeWorktreeFrom=void 0),r??=t.workdir,o??=t.workdir;let f=!!(t.resumeSessionId??t.resumeWorktreeFrom),g=t.worktreeStrategy??_.defaultWorktreeStrategy;g&&(t.worktreeStrategy=g);let y=Vb(t),I=(!f||!!u)&&!l&&!i&&g&&g!=="off"&&!y;if(y&&!gl(o))throw new Error(`Cannot launch session "${e}": worktree strategy "${g}" requires a git worktree, but "${o}" is not a git repository.`);if(I&&gl(o)){if(!Xf(o))throw new Error(`Cannot launch session "${e}": insufficient space for worktree creation.`);try{if(i=Sl(o,e),r=i,s=ns(i),!s)throw new Error(`created worktree at ${i} but failed to resolve branch name`);console.log(`[SessionManager] Created worktree at ${i}`)}catch(P){throw new Error(`Cannot launch session "${e}": worktree creation failed: ${lh(P)}`)}}else if(I)throw new Error(`Cannot launch session "${e}": worktree strategy "${g}" requires a git worktree, but "${o}" is not a git repository.`);return f&&i&&(r=i),{actualWorkdir:r,originalWorkdir:o,effectiveSystemPrompt:i&&s?qb(t.systemPrompt,o,i,s):t.systemPrompt,worktreePath:i,worktreeBranchName:s,clearedResumeSessionId:a,clearedResumeWorktreeFrom:d,restoredMissingNativeBackendWorktree:l}}var Cs=class{constructor(e){this.getPersistedSession=e}getPersistedSession;prepareSpawn(e,n){return uh(e,n,this.getPersistedSession)}hydrateSpawnedSession(e,n,r){r.worktreeStrategy&&r.worktreeStrategy!=="off"&&(e.originalWorkdir=n.originalWorkdir),n.worktreePath&&(e.worktreePath=n.worktreePath,e.worktreeBranch=n.worktreeBranchName,e.worktreeState="provisioned"),r.worktreePrTargetRepo&&(e.worktreePrTargetRepo=r.worktreePrTargetRepo)}};he();var Ms=class{constructor(e){this.deps=e}deps;applySessionPatch(e,n){let r=this.deps.store.getPersistedSession(e);r&&(Object.assign(r,n),this.deps.store.assertPersistedEntry(r));let o=this.findActiveSessionForRef(e,r);return o&&this.applyPatchToActiveSession(o,n),!r&&!o?!1:(r&&this.deps.store.saveIndex(),!0)}matchesExistingSession(e,n){if(!n)return!1;let r=M(e),o=M(n);return!!(n.sessionId&&e.id===n.sessionId||o&&o===r||n?.harnessSessionId&&e.harnessSessionId===n.harnessSessionId||n?.name&&e.name===n.name)}findActiveSessionForRef(e,n){let r=this.deps.resolveSession(e);if(r)return r;for(let o of this.deps.sessions.values())if(ne(o)===e||M(o)===e||o.harnessSessionId===e||this.matchesExistingSession(o,n))return o}applyPatchToActiveSession(e,n){this.applyControlStatePatch(e,n),this.applySessionMetadataPatch(e,n),this.applyWorktreeMetadataPatch(e,n)}applyControlStatePatch(e,n){let r={lifecycle:n.lifecycle,approvalState:n.approvalState,approvalExecutionState:n.approvalExecutionState,worktreeState:n.worktreeState,runtimeState:n.runtimeState,deliveryState:n.deliveryState,requestedPermissionMode:n.requestedPermissionMode,currentPermissionMode:n.currentPermissionMode,pendingPlanApproval:n.pendingPlanApproval,planApprovalContext:n.planApprovalContext,planDecisionVersion:n.planDecisionVersion,actionablePlanDecisionVersion:n.actionablePlanDecisionVersion,canonicalPlanPromptVersion:n.canonicalPlanPromptVersion,approvalPromptRequiredVersion:n.approvalPromptRequiredVersion,approvalPromptVersion:n.approvalPromptVersion,approvalPromptStatus:n.approvalPromptStatus,approvalPromptTransport:n.approvalPromptTransport,approvalPromptMessageKind:n.approvalPromptMessageKind,approvalPromptLastAttemptAt:n.approvalPromptLastAttemptAt,approvalPromptDeliveredAt:n.approvalPromptDeliveredAt,approvalPromptFailedAt:n.approvalPromptFailedAt,planModeApproved:n.planModeApproved,pendingWorktreeDecisionSince:n.pendingWorktreeDecisionSince};if(typeof e.applyControlPatch=="function"){e.applyControlPatch(r);return}this.assignIfDefined(e,"lifecycle",n.lifecycle),this.assignIfDefined(e,"approvalState",n.approvalState),this.assignIfDefined(e,"approvalExecutionState",n.approvalExecutionState),this.assignIfDefined(e,"worktreeState",n.worktreeState),this.assignIfDefined(e,"runtimeState",n.runtimeState),this.assignIfDefined(e,"deliveryState",n.deliveryState),this.assignIfDefined(e,"requestedPermissionMode",n.requestedPermissionMode),this.assignIfDefined(e,"currentPermissionMode",n.currentPermissionMode),this.assignIfDefined(e,"pendingPlanApproval",n.pendingPlanApproval),this.assignIfDefined(e,"planApprovalContext",n.planApprovalContext),this.assignIfDefined(e,"planDecisionVersion",n.planDecisionVersion),this.assignIfDefined(e,"actionablePlanDecisionVersion",n.actionablePlanDecisionVersion),this.assignIfDefined(e,"canonicalPlanPromptVersion",n.canonicalPlanPromptVersion),this.assignIfDefined(e,"approvalPromptRequiredVersion",n.approvalPromptRequiredVersion),this.assignIfDefined(e,"approvalPromptVersion",n.approvalPromptVersion),this.assignIfDefined(e,"approvalPromptStatus",n.approvalPromptStatus),this.assignIfDefined(e,"approvalPromptTransport",n.approvalPromptTransport),this.assignIfDefined(e,"approvalPromptMessageKind",n.approvalPromptMessageKind),this.assignIfDefined(e,"approvalPromptLastAttemptAt",n.approvalPromptLastAttemptAt),this.assignIfDefined(e,"approvalPromptDeliveredAt",n.approvalPromptDeliveredAt),this.assignIfDefined(e,"approvalPromptFailedAt",n.approvalPromptFailedAt),this.setControlFieldIfDefined(e,"planModeApproved",n.planModeApproved)}applySessionMetadataPatch(e,n){this.assignIfDefined(e,"approvalRationale",n.approvalRationale)}applyWorktreeMetadataPatch(e,n){this.assignIfDefined(e,"worktreePath",n.worktreePath),this.assignIfDefined(e,"worktreeBranch",n.worktreeBranch),this.assignIfDefined(e,"worktreePrUrl",n.worktreePrUrl),this.assignIfDefined(e,"worktreePrNumber",n.worktreePrNumber),this.assignIfDefined(e,"worktreeMerged",n.worktreeMerged),this.assignIfDefined(e,"worktreeMergedAt",n.worktreeMergedAt),this.assignIfDefined(e,"worktreeDisposition",n.worktreeDisposition),this.assignIfDefined(e,"worktreePrTargetRepo",n.worktreePrTargetRepo),this.assignIfDefined(e,"worktreePushRemote",n.worktreePushRemote),this.assignIfDefined(e,"worktreeLifecycle",n.worktreeLifecycle),"autoMergeParentSessionId"in n&&(e.autoMergeParentSessionId=n.autoMergeParentSessionId),"autoMergeConflictResolutionAttemptCount"in n&&(e.autoMergeConflictResolutionAttemptCount=n.autoMergeConflictResolutionAttemptCount),"autoMergeResolverSessionId"in n&&(e.autoMergeResolverSessionId=n.autoMergeResolverSessionId)}assignIfDefined(e,n,r){r!==void 0&&(e[n]=r)}setControlFieldIfDefined(e,n,r){r!==void 0&&e.setControlField?.(n,r)}};he();var Gb=new Set(["starting","running"]),_s=class{constructor(e,n){this.sessions=e;this.store=n}sessions;store;resolveActive(e){let n=this.sessions.get(e);return n||(this.findPreferredMatch(e,r=>r.name===e)??this.findPreferredMatch(e,r=>M(r)===e)??this.findPreferredMatch(e,r=>r.harnessSessionId===e))}getPersistedSession(e){return this.store.getPersistedSession(e)}resolveBackendConversationId(e){let n=this.resolveActive(e);return this.store.resolveBackendConversationId(e,n?M(n)??n.harnessSessionId:void 0)}findPreferredMatch(e,n){let r,o;for(let i of this.sessions.values())n(i,e)&&((!o||i.startedAt>o.startedAt)&&(o=i),Gb.has(i.status)&&(!r||i.startedAt>r.startedAt)&&(r=i));return r??o}};he();he();rt();var Es=class{constructor(e){this.deps=e}deps;async plan(e){let n=ne(e)??e.harnessSessionId;if(this.deps.isAlreadyMerged(n))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 r=e.worktreeStrategy;if(!r||r==="off"||r==="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??un(i),d=this.deps.getWorktreeCompletionState(i,o,s,a);if(d==="no-change")return{kind:"no-change",repoDir:i,worktreePath:o,nativeBackendWorktree:We(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:"dirty-uncommitted",worktreePath:o,branchName:s,baseBranch:a};let l=Nn(i,s,a);return l?{kind:"decision",strategy:r,repoDir:i,worktreePath:o,branchName:s,baseBranch:a,diffSummary:l,sessionRef:n??void 0}:(console.warn(`[SessionManager] Failed to get diff summary for ${s}, skipping merge-back`),{kind:"skip",result:{notificationSent:!1,worktreeRemoved:!1}})}};function Nl(t,e){return{...e,baseBranch:e.baseBranch??t.worktreeBaseBranch,targetRepo:e.targetRepo??t.worktreePrTargetRepo,pushRemote:e.pushRemote??t.worktreePushRemote}}function $s(t,e={}){let n=e.updatedAt??new Date().toISOString(),r={pendingWorktreeDecisionSince:e.pendingSince??n,lastWorktreeReminderAt:void 0,lifecycle:"awaiting_worktree_decision",worktreeState:"pending_decision",worktreeLifecycle:Nl(t,{state:"pending_decision",updatedAt:n,notes:e.notes})};return e.clearResolverSessionId&&(r.autoMergeResolverSessionId=void 0),r}function ph(t,e,n,r={}){let o=r.updatedAt??new Date().toISOString();return{autoMergeConflictResolutionAttemptCount:n,autoMergeResolverSessionId:e,pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,lifecycle:"terminal",worktreeState:"merge_conflict_resolving",worktreeLifecycle:Nl(t,{state:"merge_conflict_resolving",updatedAt:o,notes:r.notes})}}function ch(t,e={}){let n=e.updatedAt??new Date().toISOString(),r=e.resolvedAt??n,o={worktreeMerged:!0,worktreeMergedAt:e.mergedAt??r,lifecycle:"terminal",worktreeState:"merged",pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeLifecycle:Nl(t,{state:"merged",updatedAt:n,resolvedAt:r,resolutionSource:e.resolutionSource??"agent_merge"})};return e.clearResolverSessionId&&(o.autoMergeResolverSessionId=void 0),o}rt();var Os=class{constructor(e){this.deps=e;this.actions=new Es({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(n=>typeof n=="string").join(`
|
|
148
152
|
`)}notifyAutoMergeConflictEscalation(e,n,r){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 \`${n}\` was preserved for manual follow-up.`,"",r].join(`
|
|
149
|
-
`),buttons:[[this.deps.makeOpenPrButton(e.id)]]})}updatePersistedSessionFor(e,n){for(let r of
|
|
153
|
+
`),buttons:[[this.deps.makeOpenPrButton(e.id)]]})}updatePersistedSessionFor(e,n){for(let r of Ge(e))this.deps.updatePersistedSession(r,n)}markPendingDecision(e,n={}){this.updatePersistedSessionFor(e,$s(e,n))}markAutoMergeConflictResolving(e,n,r){this.updatePersistedSessionFor(e,ph(e,n,r,{notes:[`resolver_session:${n}`]}))}markMerged(e){this.updatePersistedSessionFor(e,ch(e,{clearResolverSessionId:!0}))}async handleWorktreeStrategy(e){let n=await this.actions.plan(e);return n.kind==="skip"?n.result:n.kind==="notify"?(this.deps.dispatchSessionNotification(e,{label:n.label,userMessage:n.message}),{notificationSent:!0,worktreeRemoved:!1}):n.kind==="dirty-uncommitted"?this.handleDirtyUncommittedCompletion(e,n.worktreePath,n.branchName,n.baseBranch):n.kind==="no-change"?this.handleNoChange(e,n.repoDir,n.worktreePath,n.nativeBackendWorktree):n.strategy==="ask"?this.handleAskStrategy(e,n.branchName,n.baseBranch,n.diffSummary):n.strategy==="delegate"?this.handleDelegateStrategy(e,n.branchName,n.baseBranch,n.diffSummary):n.strategy==="auto-merge"?(await this.handleAutoMergeStrategy(e,n.repoDir,n.worktreePath,n.branchName,n.baseBranch,n.diffSummary,n.sessionRef),{notificationSent:!0,worktreeRemoved:!1}):n.strategy==="auto-pr"?this.handleAutoPrStrategy(e,n.baseBranch):{notificationSent:!1,worktreeRemoved:!1}}async handleNoChange(e,n,r,o=We(e)){let i=o?!0:nt(n,r);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:r,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:r,preview:this.deps.getOutputPreview(e),originThreadLine:this.deps.originThreadLine(e)})),{notificationSent:!0,worktreeRemoved:i}}handleAskStrategy(e,n,r,o){return this.deps.dispatchSessionNotification(e,this.deps.worktreeMessages.buildAskNotification({session:e,branchName:n,baseBranch:r,diffSummary:o,buttons:this.deps.getWorktreeDecisionButtons(e.id)})),this.markPendingDecision(e),{notificationSent:!0,worktreeRemoved:!1}}handleDelegateStrategy(e,n,r,o){return this.deps.dispatchSessionNotification(e,this.deps.worktreeMessages.buildDelegateNotification({session:e,branchName:n,baseBranch:r,diffSummary:o,originThreadLine:this.deps.originThreadLine(e)})),this.markPendingDecision(e),{notificationSent:!0,worktreeRemoved:!1}}handleDirtyUncommittedCompletion(e,n,r,o){this.markPendingDecision(e,{notes:["dirty_uncommitted_completion"]});let i=Sr(n),s=i.slice(0,20).map(d=>`- ${d}`),a=i.length>20?[`- ...and ${i.length-20} more`]:[];return this.deps.dispatchSessionNotification(e,{label:"worktree-dirty-uncommitted",userMessage:[`\u26A0\uFE0F [${e.name}] Session completed with uncommitted worktree changes.`,"",`Branch \`${r}\` has no commits ahead of \`${o}\`, so merge/PR follow-through is blocked until the worktree is fixed.`,`Worktree: ${n}`,"",...s.length>0?["Dirty entries:",...s,...a,""]:[],"Resume the session or inspect the worktree, then commit real task changes or clean temporary files. Discard only if these local changes should be permanently removed."].join(`
|
|
154
|
+
`)}),{notificationSent:!0,worktreeRemoved:!1}}handleAutoMergeSuccess(e,n,r,o,i,s){Ot(n,r),this.markMerged(e);let d=Fn({kind:"merge",branch:r,base:o,filesChanged:i.filesChanged,insertions:i.insertions,deletions:i.deletions});s.stashPopConflict?d+=`
|
|
150
155
|
\u26A0\uFE0F Pre-merge stash pop conflicted \u2014 run \`git stash show ${s.stashRef??"stash@{0}"}\` in ${n} to review stashed changes.`:s.stashed&&(d+=`
|
|
151
156
|
(Pre-existing changes on ${o} were auto-stashed and restored.)`),this.deps.dispatchSessionNotification(e,{label:"worktree-merge-success",userMessage:d})}async handleInitialAutoMergeConflict(e,n,r,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 ${r}.`);return}let d=this.buildConflictResolverPrompt({session:e,repoDir:n,worktreePath:r,branchName:o,baseBranch:i,mergeError:s});try{let l=await this.deps.spawnConflictResolver({session:e,repoDir:n,worktreePath:r,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,n,r,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 \`${n}\` was preserved for manual follow-up in ${r}.`].join(`
|
|
152
|
-
`),buttons:[[this.deps.makeOpenPrButton(e.id)]]})}async handleAutoMergeStrategy(e,n,r,o,i,s,a=ne(e)??e.harnessSessionId){this.deps.isAlreadyMerged(a)||e.autoMergeResolverSessionId||await this.deps.enqueueMerge(n,async()=>{if(this.deps.isAlreadyMerged(a))return;let d=this.deps.mergeBranch(n,o,i,"merge",r);if(d.success){this.handleAutoMergeSuccess(e,n,o,i,s,d);return}if(d.rebaseConflict){await this.handleInitialAutoMergeConflict(e,n,r,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,r,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,n){return this.updatePersistedSessionFor(e,{lifecycle:"terminal",worktreeState:"pr_in_progress"}),(await this.deps.runAutoPr(e,n)).success||(this.markPendingDecision(e),this.deps.dispatchSessionNotification(e,{label:"worktree-auto-pr-failed",userMessage:`\u26A0\uFE0F [${e.name}] Auto-PR did not complete. The worktree is preserved for an explicit merge or PR decision.`,buttons:this.deps.getWorktreeDecisionButtons(e.id)})),{notificationSent:!0,worktreeRemoved:!1}}};import{existsSync as Px,writeFileSync as wx}from"fs";sn();import{randomUUID as Gb}from"crypto";function jb(t){return t==="plan-approve"||t==="plan-request-changes"||t==="plan-reject"}var Es=class{constructor(e,n){this.onChange=e;this.retentionMs=n}onChange;retentionMs;tokens=new Map;afterChange;replaceAll(e){this.tokens.clear();for(let n of e)this.tokens.set(n.id,n)}clear(){this.tokens.clear(),this.notifyChanged()}listForPersistence(){return[...this.tokens.values()]}createActionToken(e,n,r={}){let o={id:Gb(),sessionId:e,kind:n,createdAt:Date.now(),...r};return this.tokens.set(o.id,o),this.notifyChanged(),o}getActionToken(e){let n=this.tokens.get(e);if(n){if(n.expiresAt!=null&&n.expiresAt<=Date.now()){this.tokens.delete(e),this.notifyChanged();return}return n}}consumeActionToken(e){let n=this.getActionToken(e);if(!(!n||n.consumedAt!=null))return n.consumedAt=Date.now(),this.notifyChanged(),n}deleteActionTokensForSession(e){let n=!1;for(let[r,o]of this.tokens)o.sessionId===e&&(this.tokens.delete(r),n=!0);n&&this.notifyChanged()}deletePlanDecisionTokensForSession(e,n){let r=!1;for(let[o,i]of this.tokens)i.sessionId!==e||!jb(i.kind)||n!=null&&i.planDecisionVersion===n||(this.tokens.delete(o),r=!0);r&&this.notifyChanged()}purgeExpiredActionTokens(e=Date.now()){let n=!1;for(let[r,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(r),n=!0)}n&&this.notifyChanged()}nextExpiryAt(){let e;for(let n of this.tokens.values()){let r=[n.expiresAt,n.consumedAt!=null?n.consumedAt+this.retentionMs:void 0].filter(o=>o!=null&&Number.isFinite(o));for(let o of r)(e==null||o<e)&&(e=o)}return e}setAfterChangeListener(e){this.afterChange=e}notifyChanged(){this.onChange(),this.afterChange?.()}};he();he();var Os=class{constructor(e){this.indexes=e}indexes;hasRecordedSession(e){return this.indexes.idIndex.has(e)}getLatestPersistedByName(e){let n,r=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>r||d===r&&l>o||d===r&&l===o&&s>i)&&(n=a,r=d,o=l,i=s),s++}return n}resolveBackendConversationId(e,n){if(n)return n;let r=this.indexes.idIndex.get(e);if(r){let s=this.indexes.persisted.get(r);return(s?M(s):void 0)??r}let o=this.getLatestPersistedByName(e);if(o)return M(o)??o.harnessSessionId;let i=this.indexes.backendIdIndex.get(e);if(i){let s=this.indexes.persisted.get(i);return(s?M(s):void 0)??i}if(this.indexes.persisted.has(e)){let s=this.indexes.persisted.get(e);return s?M(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,n){return this.resolveBackendConversationId(e,n)}getPersistedSession(e){let n=this.indexes.idIndex.get(e);if(n)return this.indexes.persisted.get(n);let r=this.getLatestPersistedByName(e);if(r)return r;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,n)=>(n.completedAt??0)-(e.completedAt??0))}};import{existsSync as hx,mkdirSync as Sx,readFileSync as yx,readdirSync as Fl,renameSync as hh,statSync as Sh,unlinkSync as yh,writeFileSync as kh}from"fs";import{tmpdir as Ll}from"os";import{dirname as kx,join as Fs}from"path";import{homedir as Hb}from"node:os";import{join as zb}from"node:path";function uh(t){let e=t.OPENCLAW_HOME?.trim();if(e)return e;let n=t.HOME?.trim()||Hb();return zb(n,".openclaw")}sn();var $s=6,Qb=new Set(["running","completed","failed","killed"]);function ko(t){return!!t&&typeof t=="object"}function yr(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 Jb(t){return typeof t=="string"&&Pg.has(t)?t:void 0}function ph(t){return t==="default"||t==="plan"||t==="bypassPermissions"?t:void 0}function Yb(t){return t==="never"||t==="on-request"?"never":void 0}function Xb(t){return t==="approve"||t==="ask"||t==="delegate"?t:void 0}function Zb(t){if(t==="plan-mode"||t==="codex-first-turn-plan"||t==="soft-plan")return"plan-mode"}function ch(t){return typeof t=="string"&&cs.has(t)?t:void 0}function ex(t){return t==="user"||t==="idle-timeout"||t==="startup-timeout"||t==="shutdown"||t==="done"||t==="unknown"?t:void 0}function tx(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 nx(t){return t==="not_required"||t==="pending"||t==="approved"||t==="changes_requested"||t==="rejected"?t:void 0}function rx(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 ox(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 ix(t){return t==="live"||t==="stopped"?t:void 0}function sx(t){return t==="not_sent"||t==="sending"||t==="delivered"||t==="fallback_delivered"||t==="failed"?t:void 0}function ax(t){return t==="direct-telegram"?"direct-message":t==="none"||t==="direct-message"||t==="wake-only"?t:void 0}function dx(t){return t==="none"||t==="canonical_buttons"||t==="explicit_fallback_text"?t:void 0}function lx(t){return t==="idle"||t==="notifying"||t==="wake_pending"||t==="failed"?t:void 0}function ux(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 px(t){return t==="plan-approve"||t==="plan-request-changes"||t==="plan-reject"||t==="plan-offer-start"||t==="plan-offer-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 mh(t){if(!ko(t))return;let e=x(t.provider),n=x(t.accountId),r=x(t.target),o=x(t.threadId),i=x(t.sessionKey);if(!(!e||!r))return{provider:e,accountId:n,target:r,threadId:o,sessionKey:i}}function cx(t,e,n){if(ko(t)){let r=x(t.kind),o=x(t.conversationId);if(o&&(r==="claude-code"||r==="codex-app-server"))return{kind:r,conversationId:o,runId:x(t.runId),worktreeId:x(t.worktreeId),worktreePath:x(t.worktreePath)}}if(e==="claude-code")return{kind:"claude-code",conversationId:n}}function mx(t){if(!ko(t))return;let e=ox(t.state),n=x(t.updatedAt);if(!e||!n)return;let r=x(t.resolutionSource);return{state:e,updatedAt:n,resolvedAt:x(t.resolvedAt),resolutionSource:r==="agent_merge"||r==="agent_pr"||r==="strategy_no_change"||r==="lifecycle_resolver"||r==="dismiss"||r==="maintenance"?r: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 fx(t){let e=new Date(0).toISOString(),n=x(t.worktreeMergedAt)??x(t.worktreeDismissedAt)??x(t.pendingWorktreeDecisionSince)??e;if(t.worktreeMerged===!0)return{state:"merged",updatedAt:n,resolvedAt:x(t.worktreeMergedAt)??n,resolutionSource:"agent_merge",baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(t.worktreeDisposition==="dismissed")return{state:"dismissed",updatedAt:n,resolvedAt:x(t.worktreeDismissedAt)??n,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:n,resolvedAt:n,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:n,baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(t.pendingWorktreeDecisionSince||t.worktreeState==="pending_decision")return{state:"pending_decision",updatedAt:n,baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(t.worktreeState==="merge_conflict_resolving")return{state:"merge_conflict_resolving",updatedAt:n,baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(x(t.worktreePath)||x(t.worktreeBranch))return{state:"provisioned",updatedAt:n,baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)}}function gx(t){if(typeof t=="string"&&Qb.has(t))return t==="running"?"killed":t}function fh(t){if(!ko(t))return;let e=yr(t.harnessSessionId);if(!e)return;let n=gx(t.status);if(!n)return;let r=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=mh(t.route);if(!l)return;let u=Mn({route:l,originChannel:s,originThreadId:a,originSessionKey:d});if(!u||o&&!i)return;let f=x(t.harness),g=cx(t.backendRef,f,e),y=mx(t.worktreeLifecycle)??fx(t);return{sessionId:x(t.sessionId),harnessSessionId:e,backendRef:g,name:yr(t.name,e),prompt:yr(t.prompt),workdir:yr(t.workdir,"(unknown)"),model:x(t.model),reasoningEffort:Jb(t.reasoningEffort),createdAt:je(t.createdAt),completedAt:je(t.completedAt),status:n,lifecycle:r?"suspended":tx(t.lifecycle),approvalState:nx(t.approvalState),worktreeState:rx(t.worktreeState),runtimeState:r?"stopped":ix(t.runtimeState),deliveryState:lx(t.deliveryState),completionWakeIssuedAt:x(t.completionWakeIssuedAt),completionWakeSucceededAt:x(t.completionWakeSucceededAt),completionWakeFailedAt:x(t.completionWakeFailedAt),completionWakeSummaryRequired:t.completionWakeSummaryRequired===!0?!0:void 0,killReason:ex(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:u,outputPath:x(t.outputPath),harness:f,requestedPermissionMode:ph(t.requestedPermissionMode),currentPermissionMode:ph(t.currentPermissionMode),approvalExecutionState:ux(t.approvalExecutionState),approvalRationale:x(t.approvalRationale),planModeApproved:t.planModeApproved===!0,pendingPlanApproval:t.pendingPlanApproval===!0,planApprovalContext:Zb(t.planApprovalContext),planDecisionVersion:je(t.planDecisionVersion),actionablePlanDecisionVersion:je(t.actionablePlanDecisionVersion),canonicalPlanPromptVersion:je(t.canonicalPlanPromptVersion),approvalPromptRequiredVersion:je(t.approvalPromptRequiredVersion),approvalPromptVersion:je(t.approvalPromptVersion),approvalPromptStatus:sx(t.approvalPromptStatus),approvalPromptTransport:ax(t.approvalPromptTransport),approvalPromptMessageKind:dx(t.approvalPromptMessageKind),approvalPromptLastAttemptAt:x(t.approvalPromptLastAttemptAt),approvalPromptDeliveredAt:x(t.approvalPromptDeliveredAt),approvalPromptFailedAt:x(t.approvalPromptFailedAt),planApproval:Xb(t.planApproval),codexApprovalPolicy:Yb(t.codexApprovalPolicy),worktreePath:o,worktreeBranch:i,worktreeStrategy:ch(t.worktreeStrategy),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:y,resumable:r?!0:t.resumable===!0}}function gh(t){if(!ko(t))return;let e=px(t.kind),n=yr(t.id),r=yr(t.sessionId),o=je(t.createdAt);if(!(!n||!r||!e||o==null))return{id:n,sessionId:r,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:mh(t.route),launchName:x(t.launchName),launchPrompt:x(t.launchPrompt),launchWorkdir:x(t.launchWorkdir),launchWorktreeStrategy:ch(t.launchWorktreeStrategy)}}function Ds(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 Nl(t){return!!t&&typeof t=="object"}function Wl(t){return t instanceof Error?t.message:String(t)}function vh(t){let e=t.OPENCLAW_CODE_AGENT_SESSIONS_PATH?.trim();return e||Fs(uh(t),"code-agent-sessions.json")}function Ph(t,e,n){try{Sx(kx(t),{recursive:!0});let r=t+".tmp";kh(r,JSON.stringify({schemaVersion:$s,sessions:e,actionTokens:n},null,2),"utf-8"),hh(r,t)}catch(r){console.warn(`[SessionStore] Failed to save session index: ${Wl(r)}`)}}function Ns(t,e){try{if(!hx(t))return;let n=`${t}.legacy-${Date.now()}.json`;hh(t,n),console.warn(`[SessionStore] Breaking upgrade: archived ${e} session store to ${n}. Legacy sessions are not loaded by this release.`)}catch(n){console.warn(`[SessionStore] Failed to archive legacy session store: ${Wl(n)}`)}}function vx(t,e){try{if(e.length===0)return;let n=`${t}.codex-sdk-legacy-${Date.now()}.json`;kh(n,JSON.stringify(e,null,2),"utf-8"),console.warn(`[SessionStore] Breaking Codex transport upgrade: archived ${e.length} legacy Codex SDK session(s) to ${n}. They are not loaded by the App Server backend.`)}catch(n){console.warn(`[SessionStore] Failed to archive legacy Codex SDK sessions: ${Wl(n)}`)}}function wh(t,e){try{let n=Ll(),r=Fl(n).filter(o=>o.startsWith("openclaw-agent-")&&o.endsWith(".txt"));for(let o of r)try{let i=Fs(n,o),s=Sh(i).mtimeMs;t-s>e&&yh(i)}catch{}}catch{}}function Ih(t,e){try{let n=Ll(),r=Fl(n).filter(i=>i.startsWith("openclaw-agent-")&&i.endsWith(".txt")),o;for(let i of r)try{let s=Fs(n,i),a=Sh(s).mtimeMs+e;if(a<=t)return t;o=o==null?a:Math.min(o,a)}catch{}return o}catch{return}}function bh(t){try{let e=new Set(t),n=Ll(),r=Fl(n).filter(o=>o.startsWith("openclaw-agent-")&&o.endsWith(".txt"));for(let o of r){let i=Fs(n,o);if(!e.has(i))try{yh(i)}catch{}}}catch{}}function xh(t){let{indexPath:e,clearAll:n,indexPersistedEntry:r,setActionToken:o,purgeExpiredActionTokens:i,saveIndex:s}=t;try{let a=yx(e,"utf-8"),d=JSON.parse(a);if(Array.isArray(d)){Ns(e,"legacy array store"),s();return}if(!Nl(d)||d.schemaVersion!==$s&&d.schemaVersion!==4){Ns(e,`schema mismatch (expected v${$s})`),s();return}let l=Array.isArray(d.sessions)?d.sessions:[],u=[];for(let g of l){if(Nl(g)&&g.harness==="codex"){let k=Nl(g.backendRef)?g.backendRef:void 0;if((typeof k?.kind=="string"?k.kind:void 0)!=="codex-app-server"){u.push(g);continue}}let y=fh(g);if(!y){n(),Ns(e,"invalid v4 session entry"),s();return}r(y)}u.length>0&&(vx(e,u),s());let f=Array.isArray(d.actionTokens)?d.actionTokens:[];for(let g of f){let y=gh(g);if(!y){n(),Ns(e,"invalid v4 action token"),s();return}o(y)}i()}catch{}}var Ix=new Set(["completed","failed","killed"]),Bl=1440*60*1e3;function bx(t){return t instanceof Error?t.message:String(t)}var Ls=class{persisted=new Map;idIndex=new Map;nameIndex=new Map;backendIdIndex=new Map;actionTokens;actionTokenStore;indexPath;queries;constructor(e={}){let n=e.env??process.env;this.indexPath=e.indexPath??vh(n),this.actionTokenStore=new Es(()=>this.saveIndex(),Bl),this.actionTokens=this.actionTokenStore.tokens,this.queries=new Os({persisted:this.persisted,idIndex:this.idIndex,nameIndex:this.nameIndex,backendIdIndex:this.backendIdIndex}),n.OPENCLAW_DEBUG_SESSION_STORE==="1"&&console.warn(`[SessionStore] index path: ${this.indexPath}`),this.loadIndex()}loadIndex(){xh({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(){Ph(this.indexPath,[...this.persisted.values()],this.actionTokenStore.listForPersistence())}assertPersistedEntry(e){Ds(e)}getEntryStorageKey(e){return e.harnessSessionId}buildPersistedBackendRef(e){return e.backendRef??{kind:il(e)==="codex"?"codex-app-server":"claude-code",conversationId:e.harnessSessionId}}indexPersistedEntry(e){let n=this.getEntryStorageKey(e);this.persisted.set(n,e),e.sessionId&&this.idIndex.set(e.sessionId,n),e.name&&this.nameIndex.set(e.name,n);let r=M(e);r&&this.backendIdIndex.set(r,n)}removePersistedIndexes(e){let n=this.getEntryStorageKey(e);this.persisted.delete(n);for(let[r,o]of this.idIndex)o===n&&this.idIndex.delete(r);for(let[r,o]of this.nameIndex)o===n&&this.nameIndex.delete(r);for(let[r,o]of this.backendIdIndex)o===n&&this.backendIdIndex.delete(r)}markRunning(e){if(!e.harnessSessionId)return;let n=typeof e.controlStateSnapshot=="function"?e.controlStateSnapshot():{planModeApproved:!1},r=Mn({route:e.route,originChannel:e.originChannel,originThreadId:e.originThreadId,originSessionKey:e.originSessionKey});if(!r)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:r,harness:e.harnessName,requestedPermissionMode:e.requestedPermissionMode,currentPermissionMode:e.currentPermissionMode,approvalExecutionState:e.approvalExecutionState,approvalRationale:e.approvalRationale,planModeApproved:n.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};Ds(o),this.indexPersistedEntry(o),this.saveIndex()}hasRecordedSession(e){return this.queries.hasRecordedSession(e)}persistTerminal(e){if(!e.harnessSessionId)return;let n=typeof e.controlStateSnapshot=="function"?e.controlStateSnapshot():{planModeApproved:!1},r=Mn({route:e.route,originChannel:e.originChannel,originThreadId:e.originThreadId,originSessionKey:e.originSessionKey});if(!r)return;let o;try{let s=cr(e.id);if(Px(s))o=s;else{let a=e.getOutput().join(`
|
|
153
|
-
`);a.length>0&&(wx(s,a,"utf-8"),o=s)}}catch(s){console.warn(`[SessionStore] Failed to write output file for session ${e.id}: ${bx(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:r,outputPath:o,harness:e.harnessName,requestedPermissionMode:e.requestedPermissionMode,currentPermissionMode:e.currentPermissionMode,approvalExecutionState:e.approvalExecutionState,approvalRationale:e.approvalRationale,planModeApproved:n.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};Ds(i),this.indexPersistedEntry(i),this.saveIndex()}getLatestPersistedByName(e){return this.queries.getLatestPersistedByName(e)}resolveBackendConversationId(e,n){return this.queries.resolveBackendConversationId(e,n)}resolveHarnessSessionId(e,n){return this.queries.resolveHarnessSessionId(e,n)}getPersistedSession(e){return this.queries.getPersistedSession(e)}listPersistedSessions(){return this.queries.listPersistedSessions()}cleanupTmpOutputFiles(e){this.actionTokenStore.purgeExpiredActionTokens(e),wh(e,Bl)}getNextTmpOutputCleanupAt(e){return Ih(e,Bl)}evictOldestPersisted(e){let n=this.listPersistedSessions();if(n.length<=e)return[];let r=n.slice(e);for(let o of r)this.removePersistedIndexes(o);return this.saveIndex(),r}shouldGcActiveSession(e,n,r){return!e.completedAt||!Ix.has(e.status)?!1:n-e.completedAt>r}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 n of this.persisted.values())if(n.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(){bh(this.getReferencedOutputPaths())}};var xx=new Set(["completed","failed","killed"]),Ws=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 n=e.costUsd??0,r=e.status;this.metrics.totalCostUsd+=n;let o=new Date(e.completedAt??e.startedAt).toISOString().slice(0,10);if(this.metrics.costPerDay.set(o,(this.metrics.costPerDay.get(o)??0)+n),xx.has(r)&&this.metrics.sessionsByStatus[r]++,e.completedAt){let i=e.completedAt-e.startedAt;this.metrics.totalDurationMs+=i,this.metrics.sessionsWithDuration++}(!this.metrics.mostExpensive||n>this.metrics.mostExpensive.costUsd)&&(this.metrics.mostExpensive={id:e.id,name:e.name,costUsd:n,prompt:Ce(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 Rh from"child_process";var Ah=5e3,Ax={execFile:Rh.execFile},gn=class extends Error{constructor(e){super(e),this.name="MissingRuntimeDirectNotificationCapabilityError"}},Bs=class{constructor(e=Ax.execFile){this.execFile=e}execFile;async send(e,n,r){q("direct_send_started",{...gt(e),messageTextLength:n.length,...se(r)});try{await this.sendViaRuntime(e,n,r),q("direct_send_succeeded",{...gt(e),deliveryPath:"runtime",...se(r)});return}catch(o){if(!(o instanceof gn))throw q("direct_send_failed",{...gt(e),deliveryPath:"runtime",...se(r),error:Ul(o)}),o;q("direct_send_runtime_capability_missing",{...gt(e),deliveryPath:"runtime",...se(r),reason:o.message}),await this.sendViaBoundedCliFallback(e,n,r,o.message),q("direct_send_succeeded",{...gt(e),deliveryPath:"cli-fallback",...se(r)})}}async sendViaRuntime(e,n,r){let o=Wi(),i=Ff(),s=o?.channel?.outbound?.loadAdapter;if(!o)throw new gn("OpenClaw plugin runtime is unavailable for direct notification delivery");if(i==null)throw new gn("OpenClaw runtime config snapshot is unavailable for direct notification delivery");if(!o.channel)throw new gn(`OpenClaw plugin runtime channel surface is unavailable for direct notification delivery (runtimeVersion=${Kl(o)})`);if(!o.channel.outbound)throw new gn(`OpenClaw plugin runtime channel outbound surface is unavailable for direct notification delivery (runtimeVersion=${Kl(o)})`);if(!s)throw new gn(`OpenClaw plugin runtime channel outbound loadAdapter is unavailable for direct notification delivery (runtimeVersion=${Kl(o)})`);let a=await s(e.channel);if(!a)throw new Error(`OpenClaw outbound adapter for channel "${e.channel}" is unavailable`);let d=Us(r);if(q("runtime_adapter_loaded",{...gt(e),adapterHasRenderPresentation:typeof a.renderPresentation=="function",adapterHasSendPayload:typeof a.sendPayload=="function",adapterHasSendText:typeof a.sendText=="function",...se(r),...d?Tl(d):{}}),d){await this.sendPresentation(a,i,e,n,d);return}if(!a.sendText)throw new Error(`OpenClaw outbound adapter for channel "${e.channel}" cannot send text`);await a.sendText({cfg:i,to:e.target,text:n,accountId:e.accountId,threadId:e.threadId})}async sendPresentation(e,n,r,o,i){let s=Tx(i),a={text:o,presentation:i,interactive:s};q("presentation_render_started",{...gt(r),messageTextLength:o.length,adapterHasRenderPresentation:typeof e.renderPresentation=="function",adapterHasSendPayload:typeof e.sendPayload=="function",...Tl(i)});let d={cfg:n,to:r.target,text:o,payload:a,accountId:r.accountId,threadId:r.threadId},l=e.renderPresentation?await e.renderPresentation({payload:a,presentation:i,ctx:d}):a,u=Mx(l,s);if(q("presentation_render_completed",{...gt(r),adapterHasRenderPresentation:typeof e.renderPresentation=="function",adapterHasSendPayload:typeof e.sendPayload=="function",...Cl(u)}),!u||typeof u!="object"||!e.sendPayload)throw new Error(`OpenClaw outbound adapter for channel "${r.channel}" cannot preserve interactive presentation`);let f=await e.sendPayload({...d,payload:u});q("presentation_send_payload_completed",{...gt(r),...Cl(u),...Ng(f)})}sendViaBoundedCliFallback(e,n,r,o){return new Promise((i,s)=>{let a=Rx(e,n,r);q("direct_send_cli_fallback_started",{...gt(e),deliveryPath:"cli-fallback",reason:o,messageTextLength:n.length,...se(r)}),this.execFile("openclaw",a,{timeout:Ah,killSignal:"SIGKILL"},(d,l,u)=>{if(!d){q("direct_send_cli_fallback_completed",{...gt(e),deliveryPath:"cli-fallback",...se(r)}),i();return}let f=u?.trim()?` | stderr: ${u.trim()}`:"";q("direct_send_cli_fallback_failed",{...gt(e),deliveryPath:"cli-fallback",...se(r),error:Ul(d),stderrLength:u?.length}),s(new Error(`${o}; bounded openclaw message send fallback failed within ${Ah}ms timeout: ${Ul(d)}${f}`))})})}};function gt(t){return{channel:t.channel,target:t.target,accountId:t.accountId,threadId:t.threadId,sessionKey:t.sessionKey}}function Rx(t,e,n){let r=Us(n),o=["message","send","--channel",t.channel,"--target",t.target,"--message",e];return t.accountId&&o.push("--account",t.accountId),t.threadId&&o.push("--thread-id",t.threadId),r&&o.push("--presentation",JSON.stringify(r)),o}function Ul(t){return t instanceof Error?t.message:String(t)}function Kl(t){if(!t||typeof t!="object")return"unknown";let e=t.version;return typeof e=="string"&&e.trim()?e:"unknown"}function Us(t){let e=(t??[]).filter(n=>Array.isArray(n)&&n.length>0).map(n=>({type:"buttons",buttons:n.map(r=>({label:r.label,value:_x(r.callbackData),...r.style?{style:r.style}:{}}))}));return e.length>0?{blocks:e}:void 0}function Tx(t){let e=t.blocks.filter(n=>n.type==="buttons"&&n.buttons.length>0).map(n=>({type:"buttons",buttons:n.buttons.map(r=>({label:r.label,value:r.value,...r.style?{style:r.style}:{}}))}));return e.length>0?{blocks:e}:void 0}function Cx(t){if(!t||typeof t!="object"||Array.isArray(t))return!1;let e=t.interactive;if(!e||typeof e!="object"||Array.isArray(e))return!1;let n=e.blocks;return Array.isArray(n)&&n.some(r=>{if(!r||typeof r!="object"||Array.isArray(r))return!1;let o=r;return o.type==="buttons"&&Array.isArray(o.buttons)&&o.buttons.length>0})}function Mx(t,e){return!e||Cx(t)||!t||typeof t!="object"||Array.isArray(t)?t:{...t,interactive:e}}function _x(t){return t.startsWith(`${ot}:`)?t:`${ot}:${t}`}import*as Th from"child_process";var kr=class{tails=new Map;enqueue(e,n,r){let o=this.tails.get(e);o!==void 0&&r?.();let s=(o?.catch(()=>{})??Promise.resolve()).then(()=>n()),a=s.catch(()=>{});return this.tails.set(e,a),a.finally(()=>{this.tails.get(e)===a&&this.tails.delete(e)}),s}clear(){this.tails.clear()}};var Vl=3e4,Ex=2e3,Ox=2e4,ht=4;function vo(t){return t instanceof Error?t.message:String(t)}function $x(){return new Error(`Dispatch timed out after ${Vl}ms`)}function Dx(t){if(!(t instanceof Error))return!1;let e=t;return e.killed===!0&&e.signal==="SIGKILL"}var Nx={execFile:Th.execFile},Ks=class{pendingRetryTimers=new Map;orderedDispatches=new kr;disposed=!1;clearPendingRetries(){for(let e of this.pendingRetryTimers.values())for(let n of e)clearTimeout(n.timer),n.onCleared?.();this.pendingRetryTimers.clear()}clearRetryTimersForSession(e){let n=this.pendingRetryTimers.get(e);if(n){for(let r of n)clearTimeout(r.timer),r.onCleared?.();this.pendingRetryTimers.delete(e)}}dispose(){this.disposed=!0,this.clearPendingRetries(),this.orderedDispatches.clear()}execute(e,n,r=1){if(!this.disposed){if(r===1&&n.orderingKey){this.enqueueOrderedDispatch(n.orderingKey,o=>this.executeNow(e,n,o,r));return}this.executeNow(e,n,void 0,r)}}executePromise(e,n,r=1){if(!this.disposed){if(r===1&&n.orderingKey){this.enqueueOrderedDispatch(n.orderingKey,o=>this.executePromiseNow(e,n,o,r));return}this.executePromiseNow(e,n,void 0,r)}}executeNow(e,n,r,o=1){if(this.disposed||n.shouldContinue?.()===!1){r?.();return}let i=Date.now();o===1&&n.onStarted?.(),this.log("info","dispatch_started",{label:n.label,sessionId:n.sessionId,target:n.target,phase:n.phase,messageKind:n.messageKind,route:n.routeSummary,...n.dispatchContext,attempt:o,maxAttempts:ht}),Nx.execFile("openclaw",e,{timeout:Vl,killSignal:"SIGKILL"},(s,a,d)=>{if(this.disposed){r?.();return}let l=Date.now()-i;if(!s){this.log("info","dispatch_succeeded",{label:n.label,sessionId:n.sessionId,target:n.target,phase:n.phase,messageKind:n.messageKind,route:n.routeSummary,...n.dispatchContext,attempt:o,maxAttempts:ht,elapsedMs:l}),n.shouldContinue?.()!==!1&&n.onSuccess?.(),r?.();return}let u=d?.trim()?` | stderr: ${d.trim()}`:"";if(n.target==="message.send"&&Dx(s)){this.log("error","dispatch_failed",{label:n.label,sessionId:n.sessionId,target:n.target,phase:n.phase,messageKind:n.messageKind,route:n.routeSummary,...n.dispatchContext,attempt:o,maxAttempts:ht,elapsedMs:l,error:`${vo(s)}${u}`,terminal:!0,ambiguousResult:!0}),n.onAmbiguousResult?.(),r?.();return}if(o>=ht||n.terminalOnFailure===!0){this.log("error","dispatch_failed",{label:n.label,sessionId:n.sessionId,target:n.target,phase:n.phase,messageKind:n.messageKind,route:n.routeSummary,...n.dispatchContext,attempt:o,maxAttempts:ht,elapsedMs:l,error:`${vo(s)}${u}`,terminal:!0}),n.onFinalFailure?.(),r?.();return}let g=this.retryDelayMs(o);this.log("error","dispatch_retry_scheduled",{label:n.label,sessionId:n.sessionId,target:n.target,phase:n.phase,messageKind:n.messageKind,route:n.routeSummary,...n.dispatchContext,attempt:o,maxAttempts:ht,elapsedMs:l,retryDelayMs:g,error:`${vo(s)}${u}`});let y={timer:setTimeout(()=>{let k=this.pendingRetryTimers.get(n.sessionId);if(k&&(k.delete(y),k.size===0&&this.pendingRetryTimers.delete(n.sessionId)),n.shouldContinue?.()===!1){r?.();return}this.executeNow(e,n,r,o+1)},g),onCleared:r};y.timer.unref?.(),this.pendingRetryTimers.has(n.sessionId)||this.pendingRetryTimers.set(n.sessionId,new Set),this.pendingRetryTimers.get(n.sessionId).add(y)})}executePromiseNow(e,n,r,o=1){if(this.disposed||n.shouldContinue?.()===!1){r?.();return}let i=Date.now();o===1&&n.onStarted?.(),this.log("info","dispatch_started",{label:n.label,sessionId:n.sessionId,target:n.target,phase:n.phase,messageKind:n.messageKind,route:n.routeSummary,...n.dispatchContext,attempt:o,maxAttempts:ht}),this.executePromiseWithTimeout(e).then(()=>{if(this.disposed){r?.();return}let s=Date.now()-i;this.log("info","dispatch_succeeded",{label:n.label,sessionId:n.sessionId,target:n.target,phase:n.phase,messageKind:n.messageKind,route:n.routeSummary,...n.dispatchContext,attempt:o,maxAttempts:ht,elapsedMs:s}),n.shouldContinue?.()!==!1&&n.onSuccess?.(),r?.()}).catch(s=>{if(this.disposed){r?.();return}let a=Date.now()-i;if(o>=ht||n.terminalOnFailure===!0){this.log("error","dispatch_failed",{label:n.label,sessionId:n.sessionId,target:n.target,phase:n.phase,messageKind:n.messageKind,route:n.routeSummary,...n.dispatchContext,attempt:o,maxAttempts:ht,elapsedMs:a,error:vo(s),terminal:!0,...n.terminalOnFailure===!0&&o<ht?{terminalReason:"non_retryable"}:{}}),n.onFinalFailure?.(),r?.();return}let d=this.retryDelayMs(o);this.log("error","dispatch_retry_scheduled",{label:n.label,sessionId:n.sessionId,target:n.target,phase:n.phase,messageKind:n.messageKind,route:n.routeSummary,...n.dispatchContext,attempt:o,maxAttempts:ht,elapsedMs:a,retryDelayMs:d,error:vo(s)});let l={timer:setTimeout(()=>{let u=this.pendingRetryTimers.get(n.sessionId);if(u&&(u.delete(l),u.size===0&&this.pendingRetryTimers.delete(n.sessionId)),n.shouldContinue?.()===!1){r?.();return}this.executePromiseNow(e,n,r,o+1)},d),onCleared:r};l.timer.unref?.(),this.pendingRetryTimers.has(n.sessionId)||this.pendingRetryTimers.set(n.sessionId,new Set),this.pendingRetryTimers.get(n.sessionId).add(l)})}executePromiseWithTimeout(e){return new Promise((n,r)=>{let o=!1,i=setTimeout(()=>{o||(o=!0,r($x()))},Vl);i.unref?.(),Promise.resolve().then(e).then(()=>{o||(o=!0,clearTimeout(i),n())}).catch(s=>{o||(o=!0,clearTimeout(i),r(s))})})}retryDelayMs(e){let n=Math.max(0,e-1),r=Ex*2**n;return Math.min(r,Ox)}enqueueOrderedDispatch(e,n){this.orderedDispatches.enqueue(e,async()=>{this.disposed||await new Promise(r=>{let o=!1;n(()=>{o||(o=!0,r())})})})}log(e,n,r){let o=`[WakeDispatcher] ${JSON.stringify({event:n,...r})}`;if(e==="error"){console.error(o);return}console.info(o)}};sn();var Vs=class{resolve(e){let n=ki(e);if(!(!n?.provider||!n.target))return{channel:n.provider,target:n.target,accountId:n.accountId,threadId:n.threadId,sessionKey:n.sessionKey}}summary(e){if(!e)return"system";let n=e.accountId?`|${e.accountId}`:"",r=e.threadId?`#${e.threadId}`:"";return`${e.channel}${n}|${e.target}${r}`}};import{randomUUID as Fx}from"crypto";var qs=class{constructor(e={}){this.options=e}options;buildChatSendArgs(e,n,r){return["gateway","call","chat.send","--expect-final","--timeout","30000","--params",JSON.stringify({sessionKey:e,message:n,deliver:r,idempotencyKey:Fx()})]}buildDirectNotificationArgs(e,n,r){let o=Us(r),i=["message","send","--channel",e.channel,"--target",e.target,"--message",n];return e.accountId&&i.push("--account",e.accountId),e.threadId&&i.push("--thread-id",e.threadId),o&&i.push("--presentation",JSON.stringify(o)),i}buildSystemEventArgs(e){return["system","event","--text",e,"--mode","now"]}};var Gs=class{routes=new Vs;transport;directNotifications;executor=new Ks;constructor(e={}){this.transport=e.transport??new qs(e.transportOptions),this.directNotifications=e.directNotifications===void 0?new Bs:e.directNotifications}clearPendingRetries(){this.executor.clearPendingRetries()}clearRetryTimersForSession(e){this.executor.clearRetryTimersForSession(e)}dispose(){this.executor.dispose()}buildDispatchContext(e){let n=e.buttons??[],r=n.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:r.length>0,buttonRows:n.length||void 0,buttonCount:r.length||void 0,buttonLabels:r.length>0?r.map(o=>o.label):void 0,maxCallbackDataLength:r.length>0?Math.max(...r.map(o=>o.callbackData.length)):void 0}}sendWake(e,n,r,o,i,s,a){let d=this.routes.resolve(e),l=a;if(l?.()===!1)return;let u=d?.sessionKey?.trim();if(!u){this.executor.execute(this.transport.buildSystemEventArgs(n),{label:`${r}-system`,sessionId:e.id,target:"system.event",phase:o,routeSummary:"system",messageKind:"wake",dispatchContext:this.buildDispatchContext({routeSummary:"system",text:n}),onSuccess:s,onFinalFailure:i,shouldContinue:l});return}this.executor.execute(this.transport.buildChatSendArgs(u,n,!0),{label:r,sessionId:e.id,target:"chat.send",phase:o,routeSummary:`session:${u}`,messageKind:"wake",dispatchContext:this.buildDispatchContext({routeSummary:`session:${u}`,route:d,text:n}),onSuccess:s,shouldContinue:l,onFinalFailure:()=>{l?.()!==!1&&this.executor.execute(this.transport.buildSystemEventArgs(n),{label:`${r}-fallback`,sessionId:e.id,target:"system.event",phase:o,routeSummary:"system",messageKind:"wake",dispatchContext:this.buildDispatchContext({routeSummary:"system",text:n}),onSuccess:s,onFinalFailure:i,shouldContinue:l})}})}sendUserNotification(e,n,r,o,i,s,a=!1,d){if(d?.()===!1)return;let l=!!o?.some(k=>Array.isArray(k)&&k.length>0),u=this.routes.resolve(e);q("wake_notify_selected",{sessionId:e.id,sessionName:e.name,label:r,messageTextLength:n.length,requireDirectDelivery:a,hasDirectNotificationTransport:!!this.directNotifications,routeSummary:u?this.routes.summary(u):"system",channel:u?.channel,target:u?.target,accountId:u?.accountId,threadId:u?.threadId,sessionKey:u?.sessionKey,...se(o)});let f=u?`notify:${u.channel}|${u.accountId??""}|${u.target}|${u.threadId??""}`:`notify:system:${e.id}`;if(!u){if(q("wake_notify_no_direct_route",{sessionId:e.id,sessionName:e.name,label:r,requireDirectDelivery:a,hasInteractiveButtons:l,...se(o)}),a){console.warn(`[WakeDispatcher] Direct notification "${r}" for session ${e.id} has no direct route; reporting delivery failure instead of using system fallback.`),i?.();return}if(l){console.warn(`[WakeDispatcher] Interactive notification "${r}" 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(n),{label:`${r}-notify-system`,sessionId:e.id,target:"system.event",phase:"notify",routeSummary:"system",messageKind:"notify",dispatchContext:this.buildDispatchContext({routeSummary:"system",text:n,buttons:o}),orderingKey:f,onSuccess:s,onFinalFailure:i,shouldContinue:d});return}let g=()=>{if(q("wake_notify_direct_failed",{sessionId:e.id,sessionName:e.name,label:r,requireDirectDelivery:a,hasInteractiveButtons:l,channel:u.channel,target:u.target,accountId:u.accountId,threadId:u.threadId,sessionKey:u.sessionKey,...se(o)}),a){console.warn(`[WakeDispatcher] Direct notification "${r}" for session ${e.id} failed direct delivery; reporting delivery failure instead of using system fallback.`),i?.();return}if(l){console.warn(`[WakeDispatcher] Interactive notification "${r}" for session ${e.id} failed direct delivery; refusing text-only fallback because buttons would be lost.`),i?.();return}this.executor.execute(this.transport.buildSystemEventArgs(n),{label:`${r}-notify-fallback`,sessionId:e.id,target:"system.event",phase:"notify",routeSummary:"system",messageKind:"notify",dispatchContext:this.buildDispatchContext({routeSummary:"system",text:n}),orderingKey:f,onSuccess:s,onFinalFailure:i,shouldContinue:d})},y={label:`${r}-notify`,sessionId:e.id,target:"message.send",phase:"notify",routeSummary:this.routes.summary(u),messageKind:"notify",dispatchContext:this.buildDispatchContext({routeSummary:this.routes.summary(u),route:u,text:n,buttons:o}),orderingKey:f,onSuccess:s,onAmbiguousResult:g,onFinalFailure:g,terminalOnFailure:this.directNotifications?!0:void 0,shouldContinue:d};if(this.directNotifications){q("wake_notify_dispatching_direct_runtime",{sessionId:e.id,sessionName:e.name,label:r,channel:u.channel,target:u.target,accountId:u.accountId,threadId:u.threadId,sessionKey:u.sessionKey,...se(o)}),this.executor.executePromise(()=>this.directNotifications.send(u,n,o),y);return}q("wake_notify_dispatching_cli_message_send",{sessionId:e.id,sessionName:e.name,label:r,channel:u.channel,target:u.target,accountId:u.accountId,threadId:u.threadId,sessionKey:u.sessionKey,...se(o)}),this.executor.execute(this.transport.buildDirectNotificationArgs(u,n,o),y)}sendUserNotificationSequence(e,n,r,o,i,s=!1,a){let d=n.map(u=>({text:u.text.trim(),buttons:u.buttons})).filter(u=>u.text.length>0);if(d.length===0){o?.();return}q("wake_notify_sequence_started",{sessionId:e.id,sessionName:e.name,label:r,chunkCount:d.length,buttonChunkIndexes:d.map((u,f)=>u.buttons?.some(g=>Array.isArray(g)&&g.length>0)?f+1:void 0).filter(u=>typeof u=="number"),requireDirectDelivery:s});let l=u=>{if(a?.()===!1)return;let f=d[u];if(!f){q("wake_notify_sequence_succeeded",{sessionId:e.id,sessionName:e.name,label:r,chunkCount:d.length}),i?.();return}let g=u===0?o:i;q("wake_notify_sequence_chunk_selected",{sessionId:e.id,sessionName:e.name,label:r,chunkIndex:u+1,chunkCount:d.length,messageTextLength:f.text.length,failureHandler:u===0?"all-failed":"sequence-success",...se(f.buttons)}),this.sendUserNotification(e,f.text,`${r}-part-${u+1}`,f.buttons,g,()=>l(u+1),s,a)};l(0)}dispatchSessionNotification(e,n){let r=n.hooks,o=n.wakeMessageOnNotifySuccess!=null||n.wakeMessageOnNotifyFailed!=null,i=n.notifyUser??(n.wakeMessage?"on-wake-fallback":"always"),s=(n.userMessages?.length?n.userMessages:n.userMessage?.trim()?[{text:n.userMessage.trim(),buttons:n.buttons}]:[]).map(u=>({text:u.text.trim(),buttons:u.buttons})).filter(u=>u.text.length>0),a=s[0]?.text,d=n.wakeMessage?.trim(),l=n.shouldDispatch;if(o){let u=n.wakeMessageOnNotifySuccess?.trim(),f=n.wakeMessageOnNotifyFailed?.trim(),g=I=>{I&&l?.()!==!1&&(r?.onWakeStarted?.(),this.sendWake(e,I,`${n.label}-wake`,"wake",r?.onWakeFailed,r?.onWakeSucceeded,l))},y=()=>{l?.()!==!1&&(r?.onNotifySucceeded?.(),u&&g(u))},k=f?()=>{l?.()!==!1&&(r?.onNotifyFailed?.(),n.onUserNotifyFailed?.(),g(f))}:()=>{l?.()!==!1&&(r?.onNotifyFailed?.(),n.onUserNotifyFailed?.())};if(s.length>0){if(l?.()===!1)return;r?.onNotifyStarted?.(),this.sendUserNotificationSequence(e,s,n.label,k,y,n.requireDirectUserNotification===!0,l)}else k();return}if(i==="always"&&s.length>0){if(l?.()===!1)return;r?.onNotifyStarted?.(),this.sendUserNotificationSequence(e,s,n.label,()=>{l?.()!==!1&&(r?.onNotifyFailed?.(),n.onUserNotifyFailed?.())},()=>{l?.()!==!1&&r?.onNotifySucceeded?.()},n.requireDirectUserNotification===!0,l)}if(d&&l?.()!==!1){if(r?.onWakeStarted?.(),i==="on-wake-fallback"&&s.length>0&&!this.routes.resolve(e)?.sessionKey){if(l?.()===!1)return;r?.onNotifyStarted?.(),this.sendUserNotificationSequence(e,s,n.label,()=>{l?.()!==!1&&(r?.onNotifyFailed?.(),n.onUserNotifyFailed?.())},()=>{l?.()!==!1&&r?.onNotifySucceeded?.()},!1,l)}this.sendWake(e,d,`${n.label}-wake`,"wake",r?.onWakeFailed,r?.onWakeSucceeded,l)}}};var js=class{constructor(e,n){this.actionTokens=e;this.isGitHubCliAvailable=n}actionTokens;isGitHubCliAvailable;createActionToken(e,n,r={}){return this.actionTokens.createActionToken(e,n,{expiresAt:Date.now()+10080*60*1e3,...r})}consumeActionToken(e){return this.actionTokens.consumeActionToken(e)}getActionToken(e){return this.actionTokens.getActionToken(e)}clearPlanDecisionTokens(e,n){this.actionTokens.deletePlanDecisionTokensForSession(e,n)}makeActionButton(e,n,r,o={}){let i=this.createActionToken(e,n,{label:r,...o});return{label:r,callbackData:i.id,style:this.resolveButtonStyle(n)}}resolveButtonStyle(e){switch(e){case"plan-approve":case"worktree-create-pr":case"worktree-update-pr":case"plan-offer-start":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,n){if(!n)return[];let r=[],o=[this.makeActionButton(e,"worktree-merge","Merge")];if(this.isGitHubCliAvailable())n.worktreePrUrl?(o.push(this.makeActionButton(e,"worktree-view-pr","View PR",{targetUrl:n.worktreePrUrl})),r.push(o),r.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")),r.push(o),r.push([this.makeActionButton(e,"worktree-decide-later","Later"),this.makeActionButton(e,"worktree-dismiss","Discard")]));else return r.push([...o,this.makeActionButton(e,"worktree-decide-later","Later")]),r.push([this.makeActionButton(e,"worktree-dismiss","Discard")]),r;return n.worktreePrUrl&&r.push([this.makeActionButton(e,"worktree-dismiss","Discard")]),r}getPlanApprovalButtons(e,n){let r=[[this.makeActionButton(e,"plan-approve","Approve",{planDecisionVersion:n?.planDecisionVersion}),this.makeActionButton(e,"plan-request-changes","Revise",{planDecisionVersion:n?.planDecisionVersion}),this.makeActionButton(e,"plan-reject","Reject",{planDecisionVersion:n?.planDecisionVersion})]];return q("plan_approval_buttons_created",{sessionId:e,planDecisionVersion:n?.planDecisionVersion,...se(r)}),r}getResumeButtons(e,n){let r=[];return n.isExplicitlyResumable&&r.push(this.makeActionButton(e,"session-resume","Resume")),r.push(this.makeActionButton(e,"view-output","View output")),[r]}getQuestionButtons(e,n){if(n.length!==0)return[n.map((r,o)=>this.makeActionButton(e,"question-answer",r.label,{optionIndex:o}))]}getPlanOfferButtons(e){let{offerId:n,route:r,planName:o,planPrompt:i,planWorkdir:s,planWorktreeStrategy:a}=e,d=[[this.makeActionButton(n,"plan-offer-start","Start Plan",{route:r,launchName:o,launchPrompt:i,launchWorkdir:s,launchWorktreeStrategy:a}),this.makeActionButton(n,"plan-offer-dismiss","Dismiss",{route:r})]];return q("plan_offer_buttons_created",{offerId:n,planName:o,channel:r.provider,target:r.target,accountId:r.accountId,threadId:r.threadId,sessionKey:r.sessionKey,planPromptLength:i.length,planWorkdirLength:s.length,planWorktreeStrategy:a,...se(d)}),d}};he();var Hs=class{constructor(e,n){this.wakeDispatcher=e;this.applyPersistedPatch=n}wakeDispatcher;applyPersistedPatch;dispatch(e,n){let r=this.getDeliveryRef(e),o=this.buildCompletionWakePatch(n),i=!!(n.wakeMessage?.trim()||n.wakeMessageOnNotifySuccess?.trim()),s=!!(n.wakeMessage?.trim()||n.wakeMessageOnNotifyFailed?.trim()),a={onNotifyStarted:()=>{this.applyDeliveryState(r,"notifying"),n.hooks?.onNotifyStarted?.()},onNotifySucceeded:()=>{this.applyDeliveryState(r,i?"wake_pending":"idle"),n.hooks?.onNotifySucceeded?.()},onNotifyFailed:()=>{this.applyDeliveryState(r,s?"wake_pending":"failed"),n.hooks?.onNotifyFailed?.()},onWakeStarted:()=>{this.applyPersistedPatchWithCompletionWake(r,"wake_pending",o,{completionWakeIssuedAt:new Date().toISOString(),completionWakeSucceededAt:void 0,completionWakeFailedAt:void 0}),n.hooks?.onWakeStarted?.()},onWakeSucceeded:()=>{this.applyPersistedPatchWithCompletionWake(r,"idle",o,{completionWakeSucceededAt:new Date().toISOString(),completionWakeFailedAt:void 0}),n.hooks?.onWakeSucceeded?.()},onWakeFailed:()=>{this.applyPersistedPatchWithCompletionWake(r,"failed",o,{completionWakeFailedAt:new Date().toISOString()}),n.hooks?.onWakeFailed?.()}};this.wakeDispatcher.dispatchSessionNotification(e,{...n,hooks:a})}notifyWorktreeOutcome(e,n){this.dispatch(e,{label:"worktree-outcome",userMessage:n,notifyUser:"always"})}dispose(){this.wakeDispatcher.dispose()}getDeliveryRef(e){return ne(e)??M(e)??""}applyDeliveryState(e,n){!e||!n||this.applyPersistedPatch(e,{deliveryState:n})}applyPersistedPatchWithCompletionWake(e,n,r,o){!e||!n||this.applyPersistedPatch(e,r?{deliveryState:n,...r,...o}:{deliveryState:n})}buildCompletionWakePatch(e){if(!(e.label!=="completed"||e.completionWakeSummaryRequired!==!0))return{completionWakeSummaryRequired:!0}}};rt();import{existsSync as Lx}from"fs";var zs=class{getCompletionState(e,n,r,o){return ml(e,r,o)?"has-commits":ml(e,o,r)?"base-advanced":fr(n)?"dirty-uncommitted":"no-change"}isResolvedWorktreeEligibleForCleanup(e,n,r){if(!e.worktreePath||!e.workdir||!Lx(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&&n-i>=r}};var Qs=class{constructor(e,n,r,o){this.pendingQuestions=e;this.dispatchSessionNotification=n;this.clearWaitingTimestamp=r;this.getQuestionButtons=o}pendingQuestions;dispatchSessionNotification;clearWaitingTimestamp;getQuestionButtons;async handleAskUserQuestion(e,n){let i=n?.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}`,u=[`[ASK USER QUESTION] Session "${e.name}" has a question requiring user input.`,"",`Question: ${s.question}`,...a.length>0?["Options:",...a.map((f,g)=>` ${g+1}. ${f.label}`)]:[],"",`Send the question to the user and call agent_respond(session="${e.id}", message="<answer>") with their answer.`].join(`
|
|
157
|
+
`),buttons:[[this.deps.makeOpenPrButton(e.id)]]})}async handleAutoMergeStrategy(e,n,r,o,i,s,a=ne(e)??e.harnessSessionId){this.deps.isAlreadyMerged(a)||e.autoMergeResolverSessionId||await this.deps.enqueueMerge(n,async()=>{if(this.deps.isAlreadyMerged(a))return;let d=this.deps.mergeBranch(n,o,i,"merge",r);if(d.success){this.handleAutoMergeSuccess(e,n,o,i,s,d);return}if(d.rebaseConflict){await this.handleInitialAutoMergeConflict(e,n,r,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,r,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,n){return this.updatePersistedSessionFor(e,{lifecycle:"terminal",worktreeState:"pr_in_progress"}),(await this.deps.runAutoPr(e,n)).success||(this.markPendingDecision(e),this.deps.dispatchSessionNotification(e,{label:"worktree-auto-pr-failed",userMessage:`\u26A0\uFE0F [${e.name}] Auto-PR did not complete. The worktree is preserved for an explicit merge or PR decision.`,buttons:this.deps.getWorktreeDecisionButtons(e.id)})),{notificationSent:!0,worktreeRemoved:!1}}};import{existsSync as Ix,writeFileSync as bx}from"fs";sn();import{randomUUID as Hb}from"crypto";function zb(t){return t==="plan-approve"||t==="plan-request-changes"||t==="plan-reject"}var Ds=class{constructor(e,n){this.onChange=e;this.retentionMs=n}onChange;retentionMs;tokens=new Map;afterChange;replaceAll(e){this.tokens.clear();for(let n of e)this.tokens.set(n.id,n)}clear(){this.tokens.clear(),this.notifyChanged()}listForPersistence(){return[...this.tokens.values()]}createActionToken(e,n,r={}){let o={id:Hb(),sessionId:e,kind:n,createdAt:Date.now(),...r};return this.tokens.set(o.id,o),this.notifyChanged(),o}getActionToken(e){let n=this.tokens.get(e);if(n){if(n.expiresAt!=null&&n.expiresAt<=Date.now()){this.tokens.delete(e),this.notifyChanged();return}return n}}consumeActionToken(e){let n=this.getActionToken(e);if(!(!n||n.consumedAt!=null))return n.consumedAt=Date.now(),this.notifyChanged(),n}deleteActionTokensForSession(e){let n=!1;for(let[r,o]of this.tokens)o.sessionId===e&&(this.tokens.delete(r),n=!0);n&&this.notifyChanged()}deletePlanDecisionTokensForSession(e,n){let r=!1;for(let[o,i]of this.tokens)i.sessionId!==e||!zb(i.kind)||n!=null&&i.planDecisionVersion===n||(this.tokens.delete(o),r=!0);r&&this.notifyChanged()}purgeExpiredActionTokens(e=Date.now()){let n=!1;for(let[r,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(r),n=!0)}n&&this.notifyChanged()}nextExpiryAt(){let e;for(let n of this.tokens.values()){let r=[n.expiresAt,n.consumedAt!=null?n.consumedAt+this.retentionMs:void 0].filter(o=>o!=null&&Number.isFinite(o));for(let o of r)(e==null||o<e)&&(e=o)}return e}setAfterChangeListener(e){this.afterChange=e}notifyChanged(){this.onChange(),this.afterChange?.()}};he();he();var Ns=class{constructor(e){this.indexes=e}indexes;hasRecordedSession(e){return this.indexes.idIndex.has(e)}getLatestPersistedByName(e){let n,r=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>r||d===r&&l>o||d===r&&l===o&&s>i)&&(n=a,r=d,o=l,i=s),s++}return n}resolveBackendConversationId(e,n){if(n)return n;let r=this.indexes.idIndex.get(e);if(r){let s=this.indexes.persisted.get(r);return(s?M(s):void 0)??r}let o=this.getLatestPersistedByName(e);if(o)return M(o)??o.harnessSessionId;let i=this.indexes.backendIdIndex.get(e);if(i){let s=this.indexes.persisted.get(i);return(s?M(s):void 0)??i}if(this.indexes.persisted.has(e)){let s=this.indexes.persisted.get(e);return s?M(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,n){return this.resolveBackendConversationId(e,n)}getPersistedSession(e){let n=this.indexes.idIndex.get(e);if(n)return this.indexes.persisted.get(n);let r=this.getLatestPersistedByName(e);if(r)return r;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,n)=>(n.completedAt??0)-(e.completedAt??0))}};import{existsSync as yx,mkdirSync as kx,readFileSync as vx,readdirSync as Ll,renameSync as kh,statSync as vh,unlinkSync as Ph,writeFileSync as wh}from"fs";import{tmpdir as Wl}from"os";import{dirname as Px,join as Bs}from"path";import{homedir as Qb}from"node:os";import{join as Jb}from"node:path";function mh(t){let e=t.OPENCLAW_HOME?.trim();if(e)return e;let n=t.HOME?.trim()||Qb();return Jb(n,".openclaw")}sn();var Fs=6,Yb=new Set(["running","completed","failed","killed"]);function Io(t){return!!t&&typeof t=="object"}function wr(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 He(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function Xb(t){return typeof t=="string"&&bg.has(t)?t:void 0}function fh(t){return t==="default"||t==="plan"||t==="bypassPermissions"?t:void 0}function Zb(t){return t==="never"||t==="on-request"?"never":void 0}function ex(t){return t==="approve"||t==="ask"||t==="delegate"?t:void 0}function tx(t){if(t==="plan-mode"||t==="codex-first-turn-plan"||t==="soft-plan")return"plan-mode"}function gh(t){return typeof t=="string"&&fs.has(t)?t:void 0}function nx(t){return t==="user"||t==="idle-timeout"||t==="startup-timeout"||t==="shutdown"||t==="done"||t==="unknown"?t:void 0}function rx(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 ox(t){return t==="not_required"||t==="pending"||t==="approved"||t==="changes_requested"||t==="rejected"?t:void 0}function ix(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 sx(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 ax(t){return t==="live"||t==="stopped"?t:void 0}function dx(t){return t==="not_sent"||t==="sending"||t==="delivered"||t==="fallback_delivered"||t==="failed"?t:void 0}function lx(t){return t==="direct-telegram"?"direct-message":t==="none"||t==="direct-message"||t==="wake-only"?t:void 0}function ux(t){return t==="none"||t==="canonical_buttons"||t==="explicit_fallback_text"?t:void 0}function px(t){return t==="idle"||t==="notifying"||t==="wake_pending"||t==="failed"?t:void 0}function cx(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 mx(t){return t==="plan-approve"||t==="plan-request-changes"||t==="plan-reject"||t==="plan-offer-start"||t==="plan-offer-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 hh(t){if(!Io(t))return;let e=x(t.provider),n=x(t.accountId),r=x(t.target),o=x(t.threadId),i=x(t.sessionKey);if(!(!e||!r))return{provider:e,accountId:n,target:r,threadId:o,sessionKey:i}}function fx(t,e,n){if(Io(t)){let r=x(t.kind),o=x(t.conversationId);if(o&&(r==="claude-code"||r==="codex-app-server"))return{kind:r,conversationId:o,runId:x(t.runId),worktreeId:x(t.worktreeId),worktreePath:x(t.worktreePath)}}if(e==="claude-code")return{kind:"claude-code",conversationId:n}}function gx(t){if(!Io(t))return;let e=sx(t.state),n=x(t.updatedAt);if(!e||!n)return;let r=x(t.resolutionSource);return{state:e,updatedAt:n,resolvedAt:x(t.resolvedAt),resolutionSource:r==="agent_merge"||r==="agent_pr"||r==="strategy_no_change"||r==="lifecycle_resolver"||r==="dismiss"||r==="maintenance"?r: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 hx(t){let e=new Date(0).toISOString(),n=x(t.worktreeMergedAt)??x(t.worktreeDismissedAt)??x(t.pendingWorktreeDecisionSince)??e;if(t.worktreeMerged===!0)return{state:"merged",updatedAt:n,resolvedAt:x(t.worktreeMergedAt)??n,resolutionSource:"agent_merge",baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(t.worktreeDisposition==="dismissed")return{state:"dismissed",updatedAt:n,resolvedAt:x(t.worktreeDismissedAt)??n,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:n,resolvedAt:n,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:n,baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(t.pendingWorktreeDecisionSince||t.worktreeState==="pending_decision")return{state:"pending_decision",updatedAt:n,baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(t.worktreeState==="merge_conflict_resolving")return{state:"merge_conflict_resolving",updatedAt:n,baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)};if(x(t.worktreePath)||x(t.worktreeBranch))return{state:"provisioned",updatedAt:n,baseBranch:x(t.worktreeBaseBranch),targetRepo:x(t.worktreePrTargetRepo),pushRemote:x(t.worktreePushRemote)}}function Sx(t){if(typeof t=="string"&&Yb.has(t))return t==="running"?"killed":t}function Sh(t){if(!Io(t))return;let e=wr(t.harnessSessionId);if(!e)return;let n=Sx(t.status);if(!n)return;let r=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=hh(t.route);if(!l)return;let u=_n({route:l,originChannel:s,originThreadId:a,originSessionKey:d});if(!u||o&&!i)return;let f=x(t.harness),g=fx(t.backendRef,f,e),y=gx(t.worktreeLifecycle)??hx(t);return{sessionId:x(t.sessionId),harnessSessionId:e,backendRef:g,name:wr(t.name,e),prompt:wr(t.prompt),workdir:wr(t.workdir,"(unknown)"),model:x(t.model),reasoningEffort:Xb(t.reasoningEffort),createdAt:He(t.createdAt),completedAt:He(t.completedAt),status:n,lifecycle:r?"suspended":rx(t.lifecycle),approvalState:ox(t.approvalState),worktreeState:ix(t.worktreeState),runtimeState:r?"stopped":ax(t.runtimeState),deliveryState:px(t.deliveryState),completionWakeIssuedAt:x(t.completionWakeIssuedAt),completionWakeSucceededAt:x(t.completionWakeSucceededAt),completionWakeFailedAt:x(t.completionWakeFailedAt),completionWakeSummaryRequired:t.completionWakeSummaryRequired===!0?!0:void 0,killReason:nx(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:u,outputPath:x(t.outputPath),harness:f,requestedPermissionMode:fh(t.requestedPermissionMode),currentPermissionMode:fh(t.currentPermissionMode),approvalExecutionState:cx(t.approvalExecutionState),approvalRationale:x(t.approvalRationale),planModeApproved:t.planModeApproved===!0,pendingPlanApproval:t.pendingPlanApproval===!0,planApprovalContext:tx(t.planApprovalContext),planDecisionVersion:He(t.planDecisionVersion),actionablePlanDecisionVersion:He(t.actionablePlanDecisionVersion),canonicalPlanPromptVersion:He(t.canonicalPlanPromptVersion),approvalPromptRequiredVersion:He(t.approvalPromptRequiredVersion),approvalPromptVersion:He(t.approvalPromptVersion),approvalPromptStatus:dx(t.approvalPromptStatus),approvalPromptTransport:lx(t.approvalPromptTransport),approvalPromptMessageKind:ux(t.approvalPromptMessageKind),approvalPromptLastAttemptAt:x(t.approvalPromptLastAttemptAt),approvalPromptDeliveredAt:x(t.approvalPromptDeliveredAt),approvalPromptFailedAt:x(t.approvalPromptFailedAt),planApproval:ex(t.planApproval),codexApprovalPolicy:Zb(t.codexApprovalPolicy),worktreePath:o,worktreeBranch:i,worktreeStrategy:gh(t.worktreeStrategy),worktreeMerged:typeof t.worktreeMerged=="boolean"?t.worktreeMerged:void 0,worktreeMergedAt:x(t.worktreeMergedAt),worktreePrUrl:x(t.worktreePrUrl),worktreePrNumber:He(t.worktreePrNumber),pendingWorktreeDecisionSince:x(t.pendingWorktreeDecisionSince),lastWorktreeReminderAt:x(t.lastWorktreeReminderAt),worktreeBaseBranch:x(t.worktreeBaseBranch),worktreePrTargetRepo:x(t.worktreePrTargetRepo),autoMergeParentSessionId:x(t.autoMergeParentSessionId),autoMergeConflictResolutionAttemptCount:He(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:y,resumable:r?!0:t.resumable===!0}}function yh(t){if(!Io(t))return;let e=mx(t.kind),n=wr(t.id),r=wr(t.sessionId),o=He(t.createdAt);if(!(!n||!r||!e||o==null))return{id:n,sessionId:r,kind:e,createdAt:o,planDecisionVersion:He(t.planDecisionVersion),expiresAt:He(t.expiresAt),consumedAt:He(t.consumedAt),optionIndex:He(t.optionIndex),label:x(t.label),targetUrl:x(t.targetUrl),route:hh(t.route),launchName:x(t.launchName),launchPrompt:x(t.launchPrompt),launchWorkdir:x(t.launchWorkdir),launchWorktreeStrategy:gh(t.launchWorktreeStrategy)}}function Ls(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 Fl(t){return!!t&&typeof t=="object"}function Bl(t){return t instanceof Error?t.message:String(t)}function Ih(t){let e=t.OPENCLAW_CODE_AGENT_SESSIONS_PATH?.trim();return e||Bs(mh(t),"code-agent-sessions.json")}function bh(t,e,n){try{kx(Px(t),{recursive:!0});let r=t+".tmp";wh(r,JSON.stringify({schemaVersion:Fs,sessions:e,actionTokens:n},null,2),"utf-8"),kh(r,t)}catch(r){console.warn(`[SessionStore] Failed to save session index: ${Bl(r)}`)}}function Ws(t,e){try{if(!yx(t))return;let n=`${t}.legacy-${Date.now()}.json`;kh(t,n),console.warn(`[SessionStore] Breaking upgrade: archived ${e} session store to ${n}. Legacy sessions are not loaded by this release.`)}catch(n){console.warn(`[SessionStore] Failed to archive legacy session store: ${Bl(n)}`)}}function wx(t,e){try{if(e.length===0)return;let n=`${t}.codex-sdk-legacy-${Date.now()}.json`;wh(n,JSON.stringify(e,null,2),"utf-8"),console.warn(`[SessionStore] Breaking Codex transport upgrade: archived ${e.length} legacy Codex SDK session(s) to ${n}. They are not loaded by the App Server backend.`)}catch(n){console.warn(`[SessionStore] Failed to archive legacy Codex SDK sessions: ${Bl(n)}`)}}function xh(t,e){try{let n=Wl(),r=Ll(n).filter(o=>o.startsWith("openclaw-agent-")&&o.endsWith(".txt"));for(let o of r)try{let i=Bs(n,o),s=vh(i).mtimeMs;t-s>e&&Ph(i)}catch{}}catch{}}function Ah(t,e){try{let n=Wl(),r=Ll(n).filter(i=>i.startsWith("openclaw-agent-")&&i.endsWith(".txt")),o;for(let i of r)try{let s=Bs(n,i),a=vh(s).mtimeMs+e;if(a<=t)return t;o=o==null?a:Math.min(o,a)}catch{}return o}catch{return}}function Rh(t){try{let e=new Set(t),n=Wl(),r=Ll(n).filter(o=>o.startsWith("openclaw-agent-")&&o.endsWith(".txt"));for(let o of r){let i=Bs(n,o);if(!e.has(i))try{Ph(i)}catch{}}}catch{}}function Th(t){let{indexPath:e,clearAll:n,indexPersistedEntry:r,setActionToken:o,purgeExpiredActionTokens:i,saveIndex:s}=t;try{let a=vx(e,"utf-8"),d=JSON.parse(a);if(Array.isArray(d)){Ws(e,"legacy array store"),s();return}if(!Fl(d)||d.schemaVersion!==Fs&&d.schemaVersion!==4){Ws(e,`schema mismatch (expected v${Fs})`),s();return}let l=Array.isArray(d.sessions)?d.sessions:[],u=[];for(let g of l){if(Fl(g)&&g.harness==="codex"){let k=Fl(g.backendRef)?g.backendRef:void 0;if((typeof k?.kind=="string"?k.kind:void 0)!=="codex-app-server"){u.push(g);continue}}let y=Sh(g);if(!y){n(),Ws(e,"invalid v4 session entry"),s();return}r(y)}u.length>0&&(wx(e,u),s());let f=Array.isArray(d.actionTokens)?d.actionTokens:[];for(let g of f){let y=yh(g);if(!y){n(),Ws(e,"invalid v4 action token"),s();return}o(y)}i()}catch{}}var xx=new Set(["completed","failed","killed"]),Ul=1440*60*1e3;function Ax(t){return t instanceof Error?t.message:String(t)}var Us=class{persisted=new Map;idIndex=new Map;nameIndex=new Map;backendIdIndex=new Map;actionTokens;actionTokenStore;indexPath;queries;constructor(e={}){let n=e.env??process.env;this.indexPath=e.indexPath??Ih(n),this.actionTokenStore=new Ds(()=>this.saveIndex(),Ul),this.actionTokens=this.actionTokenStore.tokens,this.queries=new Ns({persisted:this.persisted,idIndex:this.idIndex,nameIndex:this.nameIndex,backendIdIndex:this.backendIdIndex}),n.OPENCLAW_DEBUG_SESSION_STORE==="1"&&console.warn(`[SessionStore] index path: ${this.indexPath}`),this.loadIndex()}loadIndex(){Th({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(){bh(this.indexPath,[...this.persisted.values()],this.actionTokenStore.listForPersistence())}assertPersistedEntry(e){Ls(e)}getEntryStorageKey(e){return e.harnessSessionId}buildPersistedBackendRef(e){return e.backendRef??{kind:dl(e)==="codex"?"codex-app-server":"claude-code",conversationId:e.harnessSessionId}}indexPersistedEntry(e){let n=this.getEntryStorageKey(e);this.persisted.set(n,e),e.sessionId&&this.idIndex.set(e.sessionId,n),e.name&&this.nameIndex.set(e.name,n);let r=M(e);r&&this.backendIdIndex.set(r,n)}removePersistedIndexes(e){let n=this.getEntryStorageKey(e);this.persisted.delete(n);for(let[r,o]of this.idIndex)o===n&&this.idIndex.delete(r);for(let[r,o]of this.nameIndex)o===n&&this.nameIndex.delete(r);for(let[r,o]of this.backendIdIndex)o===n&&this.backendIdIndex.delete(r)}markRunning(e){if(!e.harnessSessionId)return;let n=typeof e.controlStateSnapshot=="function"?e.controlStateSnapshot():{planModeApproved:!1},r=_n({route:e.route,originChannel:e.originChannel,originThreadId:e.originThreadId,originSessionKey:e.originSessionKey});if(!r)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:r,harness:e.harnessName,requestedPermissionMode:e.requestedPermissionMode,currentPermissionMode:e.currentPermissionMode,approvalExecutionState:e.approvalExecutionState,approvalRationale:e.approvalRationale,planModeApproved:n.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};Ls(o),this.indexPersistedEntry(o),this.saveIndex()}hasRecordedSession(e){return this.queries.hasRecordedSession(e)}persistTerminal(e){if(!e.harnessSessionId)return;let n=typeof e.controlStateSnapshot=="function"?e.controlStateSnapshot():{planModeApproved:!1},r=_n({route:e.route,originChannel:e.originChannel,originThreadId:e.originThreadId,originSessionKey:e.originSessionKey});if(!r)return;let o;try{let s=gr(e.id);if(Ix(s))o=s;else{let a=e.getOutput().join(`
|
|
158
|
+
`);a.length>0&&(bx(s,a,"utf-8"),o=s)}}catch(s){console.warn(`[SessionStore] Failed to write output file for session ${e.id}: ${Ax(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:r,outputPath:o,harness:e.harnessName,requestedPermissionMode:e.requestedPermissionMode,currentPermissionMode:e.currentPermissionMode,approvalExecutionState:e.approvalExecutionState,approvalRationale:e.approvalRationale,planModeApproved:n.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};Ls(i),this.indexPersistedEntry(i),this.saveIndex()}getLatestPersistedByName(e){return this.queries.getLatestPersistedByName(e)}resolveBackendConversationId(e,n){return this.queries.resolveBackendConversationId(e,n)}resolveHarnessSessionId(e,n){return this.queries.resolveHarnessSessionId(e,n)}getPersistedSession(e){return this.queries.getPersistedSession(e)}listPersistedSessions(){return this.queries.listPersistedSessions()}cleanupTmpOutputFiles(e){this.actionTokenStore.purgeExpiredActionTokens(e),xh(e,Ul)}getNextTmpOutputCleanupAt(e){return Ah(e,Ul)}evictOldestPersisted(e){let n=this.listPersistedSessions();if(n.length<=e)return[];let r=n.slice(e);for(let o of r)this.removePersistedIndexes(o);return this.saveIndex(),r}shouldGcActiveSession(e,n,r){return!e.completedAt||!xx.has(e.status)?!1:n-e.completedAt>r}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 n of this.persisted.values())if(n.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(){Rh(this.getReferencedOutputPaths())}};var Rx=new Set(["completed","failed","killed"]),Ks=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 n=e.costUsd??0,r=e.status;this.metrics.totalCostUsd+=n;let o=new Date(e.completedAt??e.startedAt).toISOString().slice(0,10);if(this.metrics.costPerDay.set(o,(this.metrics.costPerDay.get(o)??0)+n),Rx.has(r)&&this.metrics.sessionsByStatus[r]++,e.completedAt){let i=e.completedAt-e.startedAt;this.metrics.totalDurationMs+=i,this.metrics.sessionsWithDuration++}(!this.metrics.mostExpensive||n>this.metrics.mostExpensive.costUsd)&&(this.metrics.mostExpensive={id:e.id,name:e.name,costUsd:n,prompt:Ce(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 Mh from"child_process";var Ch=5e3,Tx={execFile:Mh.execFile},gn=class extends Error{constructor(e){super(e),this.name="MissingRuntimeDirectNotificationCapabilityError"}},Vs=class{constructor(e=Tx.execFile){this.execFile=e}execFile;async send(e,n,r){q("direct_send_started",{...ft(e),messageTextLength:n.length,...se(r)});try{await this.sendViaRuntime(e,n,r),q("direct_send_succeeded",{...ft(e),deliveryPath:"runtime",...se(r)});return}catch(o){if(!(o instanceof gn))throw q("direct_send_failed",{...ft(e),deliveryPath:"runtime",...se(r),error:Kl(o)}),o;q("direct_send_runtime_capability_missing",{...ft(e),deliveryPath:"runtime",...se(r),reason:o.message}),await this.sendViaBoundedCliFallback(e,n,r,o.message),q("direct_send_succeeded",{...ft(e),deliveryPath:"cli-fallback",...se(r)})}}async sendViaRuntime(e,n,r){let o=Ff(),i=Wf(),s=o?.channel?.outbound?.loadAdapter;if(!o)throw new gn("OpenClaw plugin runtime is unavailable for direct notification delivery");if(i==null)throw new gn("OpenClaw runtime config snapshot is unavailable for direct notification delivery");if(!o.channel)throw new gn(`OpenClaw plugin runtime channel surface is unavailable for direct notification delivery (runtimeVersion=${Vl(o)})`);if(!o.channel.outbound)throw new gn(`OpenClaw plugin runtime channel outbound surface is unavailable for direct notification delivery (runtimeVersion=${Vl(o)})`);if(!s)throw new gn(`OpenClaw plugin runtime channel outbound loadAdapter is unavailable for direct notification delivery (runtimeVersion=${Vl(o)})`);let a=await s(e.channel);if(!a)throw new Error(`OpenClaw outbound adapter for channel "${e.channel}" is unavailable`);let d=qs(r);if(q("runtime_adapter_loaded",{...ft(e),adapterHasRenderPresentation:typeof a.renderPresentation=="function",adapterHasSendPayload:typeof a.sendPayload=="function",adapterHasSendText:typeof a.sendText=="function",...se(r),...d?Cl(d):{}}),d){await this.sendPresentation(a,i,e,n,d);return}if(!a.sendText)throw new Error(`OpenClaw outbound adapter for channel "${e.channel}" cannot send text`);await a.sendText({cfg:i,to:e.target,text:n,accountId:e.accountId,threadId:e.threadId})}async sendPresentation(e,n,r,o,i){let s=Mx(i),a={text:o,presentation:i,interactive:s};q("presentation_render_started",{...ft(r),messageTextLength:o.length,adapterHasRenderPresentation:typeof e.renderPresentation=="function",adapterHasSendPayload:typeof e.sendPayload=="function",...Cl(i)});let d={cfg:n,to:r.target,text:o,payload:a,accountId:r.accountId,threadId:r.threadId},l=e.renderPresentation?await e.renderPresentation({payload:a,presentation:i,ctx:d}):a,u=Ex(l,s);if(q("presentation_render_completed",{...ft(r),adapterHasRenderPresentation:typeof e.renderPresentation=="function",adapterHasSendPayload:typeof e.sendPayload=="function",...Ml(u)}),!u||typeof u!="object"||!e.sendPayload)throw new Error(`OpenClaw outbound adapter for channel "${r.channel}" cannot preserve interactive presentation`);let f=await e.sendPayload({...d,payload:u});q("presentation_send_payload_completed",{...ft(r),...Ml(u),...Wg(f)})}sendViaBoundedCliFallback(e,n,r,o){return new Promise((i,s)=>{let a=Cx(e,n,r);q("direct_send_cli_fallback_started",{...ft(e),deliveryPath:"cli-fallback",reason:o,messageTextLength:n.length,...se(r)}),this.execFile("openclaw",a,{timeout:Ch,killSignal:"SIGKILL"},(d,l,u)=>{if(!d){q("direct_send_cli_fallback_completed",{...ft(e),deliveryPath:"cli-fallback",...se(r)}),i();return}let f=u?.trim()?` | stderr: ${u.trim()}`:"";q("direct_send_cli_fallback_failed",{...ft(e),deliveryPath:"cli-fallback",...se(r),error:Kl(d),stderrLength:u?.length}),s(new Error(`${o}; bounded openclaw message send fallback failed within ${Ch}ms timeout: ${Kl(d)}${f}`))})})}};function ft(t){return{channel:t.channel,target:t.target,accountId:t.accountId,threadId:t.threadId,sessionKey:t.sessionKey}}function Cx(t,e,n){let r=qs(n),o=["message","send","--channel",t.channel,"--target",t.target,"--message",e];return t.accountId&&o.push("--account",t.accountId),t.threadId&&o.push("--thread-id",t.threadId),r&&o.push("--presentation",JSON.stringify(r)),o}function Kl(t){return t instanceof Error?t.message:String(t)}function Vl(t){if(!t||typeof t!="object")return"unknown";let e=t.version;return typeof e=="string"&&e.trim()?e:"unknown"}function qs(t){let e=(t??[]).filter(n=>Array.isArray(n)&&n.length>0).map(n=>({type:"buttons",buttons:n.map(r=>({label:r.label,value:$x(r.callbackData),...r.style?{style:r.style}:{}}))}));return e.length>0?{blocks:e}:void 0}function Mx(t){let e=t.blocks.filter(n=>n.type==="buttons"&&n.buttons.length>0).map(n=>({type:"buttons",buttons:n.buttons.map(r=>({label:r.label,value:r.value,...r.style?{style:r.style}:{}}))}));return e.length>0?{blocks:e}:void 0}function _x(t){if(!t||typeof t!="object"||Array.isArray(t))return!1;let e=t.interactive;if(!e||typeof e!="object"||Array.isArray(e))return!1;let n=e.blocks;return Array.isArray(n)&&n.some(r=>{if(!r||typeof r!="object"||Array.isArray(r))return!1;let o=r;return o.type==="buttons"&&Array.isArray(o.buttons)&&o.buttons.length>0})}function Ex(t,e){return!e||_x(t)||!t||typeof t!="object"||Array.isArray(t)?t:{...t,interactive:e}}function $x(t){return t.startsWith(`${ot}:`)?t:`${ot}:${t}`}import*as _h from"child_process";var Ir=class{tails=new Map;enqueue(e,n,r){let o=this.tails.get(e);o!==void 0&&r?.();let s=(o?.catch(()=>{})??Promise.resolve()).then(()=>n()),a=s.catch(()=>{});return this.tails.set(e,a),a.finally(()=>{this.tails.get(e)===a&&this.tails.delete(e)}),s}clear(){this.tails.clear()}};var ql=3e4,Ox=2e3,Dx=2e4,gt=4;function bo(t){return t instanceof Error?t.message:String(t)}function Nx(){return new Error(`Dispatch timed out after ${ql}ms`)}function Fx(t){if(!(t instanceof Error))return!1;let e=t;return e.killed===!0&&e.signal==="SIGKILL"}var Lx={execFile:_h.execFile},js=class{pendingRetryTimers=new Map;orderedDispatches=new Ir;disposed=!1;clearPendingRetries(){for(let e of this.pendingRetryTimers.values())for(let n of e)clearTimeout(n.timer),n.onCleared?.();this.pendingRetryTimers.clear()}clearRetryTimersForSession(e){let n=this.pendingRetryTimers.get(e);if(n){for(let r of n)clearTimeout(r.timer),r.onCleared?.();this.pendingRetryTimers.delete(e)}}dispose(){this.disposed=!0,this.clearPendingRetries(),this.orderedDispatches.clear()}execute(e,n,r=1){if(!this.disposed){if(r===1&&n.orderingKey){this.enqueueOrderedDispatch(n.orderingKey,o=>this.executeNow(e,n,o,r));return}this.executeNow(e,n,void 0,r)}}executePromise(e,n,r=1){if(!this.disposed){if(r===1&&n.orderingKey){this.enqueueOrderedDispatch(n.orderingKey,o=>this.executePromiseNow(e,n,o,r));return}this.executePromiseNow(e,n,void 0,r)}}executeNow(e,n,r,o=1){if(this.disposed||n.shouldContinue?.()===!1){r?.();return}let i=Date.now();o===1&&n.onStarted?.(),this.log("info","dispatch_started",{label:n.label,sessionId:n.sessionId,target:n.target,phase:n.phase,messageKind:n.messageKind,route:n.routeSummary,...n.dispatchContext,attempt:o,maxAttempts:gt}),Lx.execFile("openclaw",e,{timeout:ql,killSignal:"SIGKILL"},(s,a,d)=>{if(this.disposed){r?.();return}let l=Date.now()-i;if(!s){this.log("info","dispatch_succeeded",{label:n.label,sessionId:n.sessionId,target:n.target,phase:n.phase,messageKind:n.messageKind,route:n.routeSummary,...n.dispatchContext,attempt:o,maxAttempts:gt,elapsedMs:l}),n.shouldContinue?.()!==!1&&n.onSuccess?.(),r?.();return}let u=d?.trim()?` | stderr: ${d.trim()}`:"";if(n.target==="message.send"&&Fx(s)){this.log("error","dispatch_failed",{label:n.label,sessionId:n.sessionId,target:n.target,phase:n.phase,messageKind:n.messageKind,route:n.routeSummary,...n.dispatchContext,attempt:o,maxAttempts:gt,elapsedMs:l,error:`${bo(s)}${u}`,terminal:!0,ambiguousResult:!0}),n.onAmbiguousResult?.(),r?.();return}if(o>=gt||n.terminalOnFailure===!0){this.log("error","dispatch_failed",{label:n.label,sessionId:n.sessionId,target:n.target,phase:n.phase,messageKind:n.messageKind,route:n.routeSummary,...n.dispatchContext,attempt:o,maxAttempts:gt,elapsedMs:l,error:`${bo(s)}${u}`,terminal:!0}),n.onFinalFailure?.(),r?.();return}let g=this.retryDelayMs(o);this.log("error","dispatch_retry_scheduled",{label:n.label,sessionId:n.sessionId,target:n.target,phase:n.phase,messageKind:n.messageKind,route:n.routeSummary,...n.dispatchContext,attempt:o,maxAttempts:gt,elapsedMs:l,retryDelayMs:g,error:`${bo(s)}${u}`});let y={timer:setTimeout(()=>{let k=this.pendingRetryTimers.get(n.sessionId);if(k&&(k.delete(y),k.size===0&&this.pendingRetryTimers.delete(n.sessionId)),n.shouldContinue?.()===!1){r?.();return}this.executeNow(e,n,r,o+1)},g),onCleared:r};y.timer.unref?.(),this.pendingRetryTimers.has(n.sessionId)||this.pendingRetryTimers.set(n.sessionId,new Set),this.pendingRetryTimers.get(n.sessionId).add(y)})}executePromiseNow(e,n,r,o=1){if(this.disposed||n.shouldContinue?.()===!1){r?.();return}let i=Date.now();o===1&&n.onStarted?.(),this.log("info","dispatch_started",{label:n.label,sessionId:n.sessionId,target:n.target,phase:n.phase,messageKind:n.messageKind,route:n.routeSummary,...n.dispatchContext,attempt:o,maxAttempts:gt}),this.executePromiseWithTimeout(e).then(()=>{if(this.disposed){r?.();return}let s=Date.now()-i;this.log("info","dispatch_succeeded",{label:n.label,sessionId:n.sessionId,target:n.target,phase:n.phase,messageKind:n.messageKind,route:n.routeSummary,...n.dispatchContext,attempt:o,maxAttempts:gt,elapsedMs:s}),n.shouldContinue?.()!==!1&&n.onSuccess?.(),r?.()}).catch(s=>{if(this.disposed){r?.();return}let a=Date.now()-i;if(o>=gt||n.terminalOnFailure===!0){this.log("error","dispatch_failed",{label:n.label,sessionId:n.sessionId,target:n.target,phase:n.phase,messageKind:n.messageKind,route:n.routeSummary,...n.dispatchContext,attempt:o,maxAttempts:gt,elapsedMs:a,error:bo(s),terminal:!0,...n.terminalOnFailure===!0&&o<gt?{terminalReason:"non_retryable"}:{}}),n.onFinalFailure?.(),r?.();return}let d=this.retryDelayMs(o);this.log("error","dispatch_retry_scheduled",{label:n.label,sessionId:n.sessionId,target:n.target,phase:n.phase,messageKind:n.messageKind,route:n.routeSummary,...n.dispatchContext,attempt:o,maxAttempts:gt,elapsedMs:a,retryDelayMs:d,error:bo(s)});let l={timer:setTimeout(()=>{let u=this.pendingRetryTimers.get(n.sessionId);if(u&&(u.delete(l),u.size===0&&this.pendingRetryTimers.delete(n.sessionId)),n.shouldContinue?.()===!1){r?.();return}this.executePromiseNow(e,n,r,o+1)},d),onCleared:r};l.timer.unref?.(),this.pendingRetryTimers.has(n.sessionId)||this.pendingRetryTimers.set(n.sessionId,new Set),this.pendingRetryTimers.get(n.sessionId).add(l)})}executePromiseWithTimeout(e){return new Promise((n,r)=>{let o=!1,i=setTimeout(()=>{o||(o=!0,r(Nx()))},ql);i.unref?.(),Promise.resolve().then(e).then(()=>{o||(o=!0,clearTimeout(i),n())}).catch(s=>{o||(o=!0,clearTimeout(i),r(s))})})}retryDelayMs(e){let n=Math.max(0,e-1),r=Ox*2**n;return Math.min(r,Dx)}enqueueOrderedDispatch(e,n){this.orderedDispatches.enqueue(e,async()=>{this.disposed||await new Promise(r=>{let o=!1;n(()=>{o||(o=!0,r())})})})}log(e,n,r){let o=`[WakeDispatcher] ${JSON.stringify({event:n,...r})}`;if(e==="error"){console.error(o);return}console.info(o)}};sn();var Gs=class{resolve(e){let n=Ii(e);if(!(!n?.provider||!n.target))return{channel:n.provider,target:n.target,accountId:n.accountId,threadId:n.threadId,sessionKey:n.sessionKey}}summary(e){if(!e)return"system";let n=e.accountId?`|${e.accountId}`:"",r=e.threadId?`#${e.threadId}`:"";return`${e.channel}${n}|${e.target}${r}`}};import{randomUUID as Wx}from"crypto";var Hs=class{constructor(e={}){this.options=e}options;buildChatSendArgs(e,n,r){return["gateway","call","chat.send","--expect-final","--timeout","30000","--params",JSON.stringify({sessionKey:e,message:n,deliver:r,idempotencyKey:Wx()})]}buildDirectNotificationArgs(e,n,r){let o=qs(r),i=["message","send","--channel",e.channel,"--target",e.target,"--message",n];return e.accountId&&i.push("--account",e.accountId),e.threadId&&i.push("--thread-id",e.threadId),o&&i.push("--presentation",JSON.stringify(o)),i}buildSystemEventArgs(e){return["system","event","--text",e,"--mode","now"]}};var zs=class{routes=new Gs;transport;directNotifications;executor=new js;constructor(e={}){this.transport=e.transport??new Hs(e.transportOptions),this.directNotifications=e.directNotifications===void 0?new Vs:e.directNotifications}clearPendingRetries(){this.executor.clearPendingRetries()}clearRetryTimersForSession(e){this.executor.clearRetryTimersForSession(e)}dispose(){this.executor.dispose()}buildDispatchContext(e){let n=e.buttons??[],r=n.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:r.length>0,buttonRows:n.length||void 0,buttonCount:r.length||void 0,buttonLabels:r.length>0?r.map(o=>o.label):void 0,maxCallbackDataLength:r.length>0?Math.max(...r.map(o=>o.callbackData.length)):void 0}}sendWake(e,n,r,o,i,s,a){let d=this.routes.resolve(e),l=a;if(l?.()===!1)return;let u=d?.sessionKey?.trim();if(!u){this.executor.execute(this.transport.buildSystemEventArgs(n),{label:`${r}-system`,sessionId:e.id,target:"system.event",phase:o,routeSummary:"system",messageKind:"wake",dispatchContext:this.buildDispatchContext({routeSummary:"system",text:n}),onSuccess:s,onFinalFailure:i,shouldContinue:l});return}this.executor.execute(this.transport.buildChatSendArgs(u,n,!0),{label:r,sessionId:e.id,target:"chat.send",phase:o,routeSummary:`session:${u}`,messageKind:"wake",dispatchContext:this.buildDispatchContext({routeSummary:`session:${u}`,route:d,text:n}),onSuccess:s,shouldContinue:l,onFinalFailure:()=>{l?.()!==!1&&this.executor.execute(this.transport.buildSystemEventArgs(n),{label:`${r}-fallback`,sessionId:e.id,target:"system.event",phase:o,routeSummary:"system",messageKind:"wake",dispatchContext:this.buildDispatchContext({routeSummary:"system",text:n}),onSuccess:s,onFinalFailure:i,shouldContinue:l})}})}sendUserNotification(e,n,r,o,i,s,a=!1,d){if(d?.()===!1)return;let l=!!o?.some(k=>Array.isArray(k)&&k.length>0),u=this.routes.resolve(e);q("wake_notify_selected",{sessionId:e.id,sessionName:e.name,label:r,messageTextLength:n.length,requireDirectDelivery:a,hasDirectNotificationTransport:!!this.directNotifications,routeSummary:u?this.routes.summary(u):"system",channel:u?.channel,target:u?.target,accountId:u?.accountId,threadId:u?.threadId,sessionKey:u?.sessionKey,...se(o)});let f=u?`notify:${u.channel}|${u.accountId??""}|${u.target}|${u.threadId??""}`:`notify:system:${e.id}`;if(!u){if(q("wake_notify_no_direct_route",{sessionId:e.id,sessionName:e.name,label:r,requireDirectDelivery:a,hasInteractiveButtons:l,...se(o)}),a){console.warn(`[WakeDispatcher] Direct notification "${r}" for session ${e.id} has no direct route; reporting delivery failure instead of using system fallback.`),i?.();return}if(l){console.warn(`[WakeDispatcher] Interactive notification "${r}" 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(n),{label:`${r}-notify-system`,sessionId:e.id,target:"system.event",phase:"notify",routeSummary:"system",messageKind:"notify",dispatchContext:this.buildDispatchContext({routeSummary:"system",text:n,buttons:o}),orderingKey:f,onSuccess:s,onFinalFailure:i,shouldContinue:d});return}let g=()=>{if(q("wake_notify_direct_failed",{sessionId:e.id,sessionName:e.name,label:r,requireDirectDelivery:a,hasInteractiveButtons:l,channel:u.channel,target:u.target,accountId:u.accountId,threadId:u.threadId,sessionKey:u.sessionKey,...se(o)}),a){console.warn(`[WakeDispatcher] Direct notification "${r}" for session ${e.id} failed direct delivery; reporting delivery failure instead of using system fallback.`),i?.();return}if(l){console.warn(`[WakeDispatcher] Interactive notification "${r}" for session ${e.id} failed direct delivery; refusing text-only fallback because buttons would be lost.`),i?.();return}this.executor.execute(this.transport.buildSystemEventArgs(n),{label:`${r}-notify-fallback`,sessionId:e.id,target:"system.event",phase:"notify",routeSummary:"system",messageKind:"notify",dispatchContext:this.buildDispatchContext({routeSummary:"system",text:n}),orderingKey:f,onSuccess:s,onFinalFailure:i,shouldContinue:d})},y={label:`${r}-notify`,sessionId:e.id,target:"message.send",phase:"notify",routeSummary:this.routes.summary(u),messageKind:"notify",dispatchContext:this.buildDispatchContext({routeSummary:this.routes.summary(u),route:u,text:n,buttons:o}),orderingKey:f,onSuccess:s,onAmbiguousResult:g,onFinalFailure:g,terminalOnFailure:this.directNotifications?!0:void 0,shouldContinue:d};if(this.directNotifications){q("wake_notify_dispatching_direct_runtime",{sessionId:e.id,sessionName:e.name,label:r,channel:u.channel,target:u.target,accountId:u.accountId,threadId:u.threadId,sessionKey:u.sessionKey,...se(o)}),this.executor.executePromise(()=>this.directNotifications.send(u,n,o),y);return}q("wake_notify_dispatching_cli_message_send",{sessionId:e.id,sessionName:e.name,label:r,channel:u.channel,target:u.target,accountId:u.accountId,threadId:u.threadId,sessionKey:u.sessionKey,...se(o)}),this.executor.execute(this.transport.buildDirectNotificationArgs(u,n,o),y)}sendUserNotificationSequence(e,n,r,o,i,s=!1,a){let d=n.map(u=>({text:u.text.trim(),buttons:u.buttons})).filter(u=>u.text.length>0);if(d.length===0){o?.();return}q("wake_notify_sequence_started",{sessionId:e.id,sessionName:e.name,label:r,chunkCount:d.length,buttonChunkIndexes:d.map((u,f)=>u.buttons?.some(g=>Array.isArray(g)&&g.length>0)?f+1:void 0).filter(u=>typeof u=="number"),requireDirectDelivery:s});let l=u=>{if(a?.()===!1)return;let f=d[u];if(!f){q("wake_notify_sequence_succeeded",{sessionId:e.id,sessionName:e.name,label:r,chunkCount:d.length}),i?.();return}let g=u===0?o:i;q("wake_notify_sequence_chunk_selected",{sessionId:e.id,sessionName:e.name,label:r,chunkIndex:u+1,chunkCount:d.length,messageTextLength:f.text.length,failureHandler:u===0?"all-failed":"sequence-success",...se(f.buttons)}),this.sendUserNotification(e,f.text,`${r}-part-${u+1}`,f.buttons,g,()=>l(u+1),s,a)};l(0)}dispatchSessionNotification(e,n){let r=n.hooks,o=n.wakeMessageOnNotifySuccess!=null||n.wakeMessageOnNotifyFailed!=null,i=n.notifyUser??(n.wakeMessage?"on-wake-fallback":"always"),s=(n.userMessages?.length?n.userMessages:n.userMessage?.trim()?[{text:n.userMessage.trim(),buttons:n.buttons}]:[]).map(u=>({text:u.text.trim(),buttons:u.buttons})).filter(u=>u.text.length>0),a=s[0]?.text,d=n.wakeMessage?.trim(),l=n.shouldDispatch;if(o){let u=n.wakeMessageOnNotifySuccess?.trim(),f=n.wakeMessageOnNotifyFailed?.trim(),g=I=>{I&&l?.()!==!1&&(r?.onWakeStarted?.(),this.sendWake(e,I,`${n.label}-wake`,"wake",r?.onWakeFailed,r?.onWakeSucceeded,l))},y=()=>{l?.()!==!1&&(r?.onNotifySucceeded?.(),u&&g(u))},k=f?()=>{l?.()!==!1&&(r?.onNotifyFailed?.(),n.onUserNotifyFailed?.(),g(f))}:()=>{l?.()!==!1&&(r?.onNotifyFailed?.(),n.onUserNotifyFailed?.())};if(s.length>0){if(l?.()===!1)return;r?.onNotifyStarted?.(),this.sendUserNotificationSequence(e,s,n.label,k,y,n.requireDirectUserNotification===!0,l)}else k();return}if(i==="always"&&s.length>0){if(l?.()===!1)return;r?.onNotifyStarted?.(),this.sendUserNotificationSequence(e,s,n.label,()=>{l?.()!==!1&&(r?.onNotifyFailed?.(),n.onUserNotifyFailed?.())},()=>{l?.()!==!1&&r?.onNotifySucceeded?.()},n.requireDirectUserNotification===!0,l)}if(d&&l?.()!==!1){if(r?.onWakeStarted?.(),i==="on-wake-fallback"&&s.length>0&&!this.routes.resolve(e)?.sessionKey){if(l?.()===!1)return;r?.onNotifyStarted?.(),this.sendUserNotificationSequence(e,s,n.label,()=>{l?.()!==!1&&(r?.onNotifyFailed?.(),n.onUserNotifyFailed?.())},()=>{l?.()!==!1&&r?.onNotifySucceeded?.()},!1,l)}this.sendWake(e,d,`${n.label}-wake`,"wake",r?.onWakeFailed,r?.onWakeSucceeded,l)}}};var Qs=class{constructor(e,n){this.actionTokens=e;this.isGitHubCliAvailable=n}actionTokens;isGitHubCliAvailable;createActionToken(e,n,r={}){return this.actionTokens.createActionToken(e,n,{expiresAt:Date.now()+10080*60*1e3,...r})}consumeActionToken(e){return this.actionTokens.consumeActionToken(e)}getActionToken(e){return this.actionTokens.getActionToken(e)}clearPlanDecisionTokens(e,n){this.actionTokens.deletePlanDecisionTokensForSession(e,n)}makeActionButton(e,n,r,o={}){let i=this.createActionToken(e,n,{label:r,...o});return{label:r,callbackData:i.id,style:this.resolveButtonStyle(n)}}resolveButtonStyle(e){switch(e){case"plan-approve":case"worktree-create-pr":case"worktree-update-pr":case"plan-offer-start":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,n){if(!n)return[];let r=[],o=[this.makeActionButton(e,"worktree-merge","Merge")];if(this.isGitHubCliAvailable())n.worktreePrUrl?(o.push(this.makeActionButton(e,"worktree-view-pr","View PR",{targetUrl:n.worktreePrUrl})),r.push(o),r.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")),r.push(o),r.push([this.makeActionButton(e,"worktree-decide-later","Later"),this.makeActionButton(e,"worktree-dismiss","Discard")]));else return r.push([...o,this.makeActionButton(e,"worktree-decide-later","Later")]),r.push([this.makeActionButton(e,"worktree-dismiss","Discard")]),r;return n.worktreePrUrl&&r.push([this.makeActionButton(e,"worktree-dismiss","Discard")]),r}getPlanApprovalButtons(e,n){let r=[[this.makeActionButton(e,"plan-approve","Approve",{planDecisionVersion:n?.planDecisionVersion}),this.makeActionButton(e,"plan-request-changes","Revise",{planDecisionVersion:n?.planDecisionVersion}),this.makeActionButton(e,"plan-reject","Reject",{planDecisionVersion:n?.planDecisionVersion})]];return q("plan_approval_buttons_created",{sessionId:e,planDecisionVersion:n?.planDecisionVersion,...se(r)}),r}getResumeButtons(e,n){let r=[];return n.isExplicitlyResumable&&r.push(this.makeActionButton(e,"session-resume","Resume")),r.push(this.makeActionButton(e,"view-output","View output")),[r]}getQuestionButtons(e,n){if(n.length!==0)return[n.map((r,o)=>this.makeActionButton(e,"question-answer",r.label,{optionIndex:o}))]}getPlanOfferButtons(e){let{offerId:n,route:r,planName:o,planPrompt:i,planWorkdir:s,planWorktreeStrategy:a}=e,d=[[this.makeActionButton(n,"plan-offer-start","Start Plan",{route:r,launchName:o,launchPrompt:i,launchWorkdir:s,launchWorktreeStrategy:a}),this.makeActionButton(n,"plan-offer-dismiss","Dismiss",{route:r})]];return q("plan_offer_buttons_created",{offerId:n,planName:o,channel:r.provider,target:r.target,accountId:r.accountId,threadId:r.threadId,sessionKey:r.sessionKey,planPromptLength:i.length,planWorkdirLength:s.length,planWorktreeStrategy:a,...se(d)}),d}};he();var Js=class{constructor(e,n){this.wakeDispatcher=e;this.applyPersistedPatch=n}wakeDispatcher;applyPersistedPatch;dispatch(e,n){let r=this.getDeliveryRef(e),o=this.buildCompletionWakePatch(n),i=!!(n.wakeMessage?.trim()||n.wakeMessageOnNotifySuccess?.trim()),s=!!(n.wakeMessage?.trim()||n.wakeMessageOnNotifyFailed?.trim()),a={onNotifyStarted:()=>{this.applyDeliveryState(r,"notifying"),n.hooks?.onNotifyStarted?.()},onNotifySucceeded:()=>{this.applyDeliveryState(r,i?"wake_pending":"idle"),n.hooks?.onNotifySucceeded?.()},onNotifyFailed:()=>{this.applyDeliveryState(r,s?"wake_pending":"failed"),n.hooks?.onNotifyFailed?.()},onWakeStarted:()=>{this.applyPersistedPatchWithCompletionWake(r,"wake_pending",o,{completionWakeIssuedAt:new Date().toISOString(),completionWakeSucceededAt:void 0,completionWakeFailedAt:void 0}),n.hooks?.onWakeStarted?.()},onWakeSucceeded:()=>{this.applyPersistedPatchWithCompletionWake(r,"idle",o,{completionWakeSucceededAt:new Date().toISOString(),completionWakeFailedAt:void 0}),n.hooks?.onWakeSucceeded?.()},onWakeFailed:()=>{this.applyPersistedPatchWithCompletionWake(r,"failed",o,{completionWakeFailedAt:new Date().toISOString()}),n.hooks?.onWakeFailed?.()}};this.wakeDispatcher.dispatchSessionNotification(e,{...n,hooks:a})}notifyWorktreeOutcome(e,n){this.dispatch(e,{label:"worktree-outcome",userMessage:n,notifyUser:"always"})}dispose(){this.wakeDispatcher.dispose()}getDeliveryRef(e){return ne(e)??M(e)??""}applyDeliveryState(e,n){!e||!n||this.applyPersistedPatch(e,{deliveryState:n})}applyPersistedPatchWithCompletionWake(e,n,r,o){!e||!n||this.applyPersistedPatch(e,r?{deliveryState:n,...r,...o}:{deliveryState:n})}buildCompletionWakePatch(e){if(!(e.label!=="completed"||e.completionWakeSummaryRequired!==!0))return{completionWakeSummaryRequired:!0}}};rt();import{existsSync as Bx}from"fs";var Ys=class{getCompletionState(e,n,r,o){return go(e,r,o)?"has-commits":go(e,o,r)?"base-advanced":yr(n)?"dirty-uncommitted":"no-change"}isResolvedWorktreeEligibleForCleanup(e,n,r){if(!e.worktreePath||!e.workdir||!Bx(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&&n-i>=r}};var Xs=class{constructor(e,n,r,o){this.pendingQuestions=e;this.dispatchSessionNotification=n;this.clearWaitingTimestamp=r;this.getQuestionButtons=o}pendingQuestions;dispatchSessionNotification;clearWaitingTimestamp;getQuestionButtons;async handleAskUserQuestion(e,n){let i=n?.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}`,u=[`[ASK USER QUESTION] Session "${e.name}" has a question requiring user input.`,"",`Question: ${s.question}`,...a.length>0?["Options:",...a.map((f,g)=>` ${g+1}. ${f.label}`)]:[],"",`Send the question to the user and call agent_respond(session="${e.id}", message="<answer>") with their answer.`].join(`
|
|
154
159
|
`);return new Promise((f,g)=>{let y=setTimeout(()=>{this.pendingQuestions.delete(e.id),g(new Error(`AskUserQuestion timed out after 600s for session "${e.name}"`))},6e5);y.unref?.(),this.pendingQuestions.set(e.id,{resolve:f,reject:g,questions:i,timeoutHandle:y}),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(`
|
|
155
|
-
`),wakeMessageOnNotifyFailed:u})})}resolveAskUserQuestion(e,n){let r=this.pendingQuestions.get(e);if(!r){console.warn(`[SessionQuestionService] resolveAskUserQuestion: no pending question for session "${e}"`);return}clearTimeout(r.timeoutHandle),this.pendingQuestions.delete(e);let o=r.questions[0],i=o.options??[],s=i[n];if(!s){r.reject(new Error(`AskUserQuestion: invalid option index ${n} (${i.length} options available)`));return}this.clearWaitingTimestamp(e),r.resolve({behavior:"allow",updatedInput:{questions:r.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
|
|
156
|
-
`);return{userMessage:`\u2705 [${e.name}] Completed | ${i} | ${s}`,wakeMessageOnNotifySuccess:d(!0),wakeMessageOnNotifyFailed:d(!1),followupContract:a}}function
|
|
157
|
-
`),wakeMessage:["Coding agent session failed.",`Name: ${e.name} | ID: ${e.id}`,`Status: ${e.status}`,n,...
|
|
158
|
-
`),buttons:s}}function
|
|
159
|
-
`)}}function
|
|
160
|
-
`)}function
|
|
161
|
-
`)}function
|
|
162
|
-
`)}function
|
|
163
|
-
`).map(e=>e.trim()).filter(Boolean).map(
|
|
164
|
-
`).map(e=>e.trim()).filter(Boolean).map(
|
|
160
|
+
`),wakeMessageOnNotifyFailed:u})})}resolveAskUserQuestion(e,n){let r=this.pendingQuestions.get(e);if(!r){console.warn(`[SessionQuestionService] resolveAskUserQuestion: no pending question for session "${e}"`);return}clearTimeout(r.timeoutHandle),this.pendingQuestions.delete(e);let o=r.questions[0],i=o.options??[],s=i[n];if(!s){r.reject(new Error(`AskUserQuestion: invalid option index ${n} (${i.length} options available)`));return}this.clearWaitingTimestamp(e),r.resolve({behavior:"allow",updatedInput:{questions:r.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 Ux(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 Zs(t){let e=Ux(t);return[`Requested permission mode: ${t.requestedPermissionMode??"unknown"}`,`Effective permission mode: ${t.currentPermissionMode??"unknown"}`,`Deterministic approval/execution state: ${t.approvalExecutionState??"unknown"}`,...e?[e]:[]]}function xo(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 Kx(){return{requiresShortFactualSummary:!0,owner:"agent",appliesToOrdinaryTerminalCompletions:!0}}function jl(t){let{sessionId:e,canonicalStatusDetail:n,canonicalStatusDelivered:r=!0,hasOriginRouteBlock:o=!1}=t,i=o?["6. Before sending that follow-up, honor the Session origin route block above. If originRoute differs from the current chat, do NOT use a plain final assistant reply; use a routed send path that preserves provider/target/threadId."]:[],s=o?7:6,a=o?8:7;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. ${n??(r?"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.",...i,`${s}. That follow-up belongs to you alone; keep it brief, concrete, and grounded in reliable result data.`,...r?[`${a}. Do NOT repeat the plugin's status line, and do NOT rely on the plugin to summarize the completed work for you.`]:[`${a}. 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 Vx(t){let{contract:e,canonicalStatusDelivered:n}=t;return["Completion diagnostics:",`- Canonical completion status delivered to user: ${n?"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 Gl(t){let{session:e,originThreadLine:n,preview:r}=t,o=!!n.trim(),i=`$${(e.costUsd??0).toFixed(2)}`,s=Rt(e.duration),a=Kx(),d=l=>["Coding agent session completed.",`Name: ${e.name} | ID: ${e.id}`,`Status: ${e.status}`,...o?[n]:[],...Zs(e),"","Output preview:",r,"",...Vx({contract:a,canonicalStatusDelivered:l}),"",...jl({sessionId:e.id,canonicalStatusDelivered:l,hasOriginRouteBlock:o})].join(`
|
|
161
|
+
`);return{userMessage:`\u2705 [${e.name}] Completed | ${i} | ${s}`,wakeMessageOnNotifySuccess:d(!0),wakeMessageOnNotifyFailed:d(!1),followupContract:a}}function Hl(t){let{session:e,originThreadLine:n,errorSummary:r,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)}`,u=Rt(e.duration);return{userMessage:[`\u274C [${e.name}] Failed | ${l} | ${u}`,` \u26A0\uFE0F ${r}`].join(`
|
|
162
|
+
`),wakeMessage:["Coding agent session failed.",`Name: ${e.name} | ID: ${e.id}`,`Status: ${e.status}`,n,...Zs(e),...e.harnessSessionId?[`Backend conversation ID: ${e.harnessSessionId}`]:[],"","Failure summary:",r,...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(`
|
|
163
|
+
`),buttons:s}}function zl(t){let{session:e,originThreadLine:n,preview:r}=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):",r,...n?["",n]:[]].join(`
|
|
164
|
+
`)}}function Ql(t){let{sessionName:e,sessionId:n,branchName:r,baseBranch:o,promptSnippet:i,commitLines:s,moreNote:a,originThreadLine:d,diffSummary:l}=t,u=!!d?.trim();return[`[DELEGATED WORKTREE DECISION] Session "${e}" completed with changes.`,"",`Session ID: ${n}`,`Branch: ${r} \u2192 ${o}`,`Commits: ${l.commits} | Files: ${l.filesChanged} | +${l.insertions} / -${l.deletions}`,...u?[d]:[],"",...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.",...u?["- Send any human follow-up to the Session origin route above; if it differs from the current chat, do not use a plain final assistant reply."]:[]].join(`
|
|
165
|
+
`)}function Jl(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(`
|
|
166
|
+
`)}function Yl(t){let{sessionName:e,sessionId:n,cleanupSummary:r,preview:o,originThreadLine:i,requestedPermissionMode:s,currentPermissionMode:a,approvalExecutionState:d,approvalState:l,planApproval:u,approvalPromptStatus:f,approvalPromptMessageKind:g,approvalPromptDeliveredAt:y}=t,k=o.trim()?["","Output preview:",o]:[],I=!!i?.trim();return["Coding agent session completed with no repository changes.",`Name: ${e} | ID: ${n}`,`Worktree outcome: ${r}`,...I?[i]:[],...Zs({requestedPermissionMode:s,currentPermissionMode:a,approvalExecutionState:d,approvalState:l,planApproval:u,approvalPromptStatus:f,approvalPromptMessageKind:g,approvalPromptDeliveredAt:y}),...k,"",...jl({sessionId:n,canonicalStatusDetail:"The plugin already sent the canonical completion status to the user, including that no repo changes were kept.",hasOriginRouteBlock:I})].join(`
|
|
167
|
+
`)}function Xl(t){let e=[],n=t.changedFiles.slice(0,3).map(o=>`\`${o}\``);if(n.length>0){let o=t.changedFiles.length-n.length;e.push(o>0?`Touches ${n.join(", ")} and ${o} more file${o===1?"":"s"}`:`Touches ${n.join(", ")}`)}let r=[...new Set(t.commitMessages.map(o=>o.message.trim()).filter(Boolean))].slice(0,2);return r.length>0&&e.push(`Recent work: ${r.join("; ")}`),e}var Oh=3200,Zl=3e3,qx=2400,jx=120,Gx=5,Hx=280,Eh=1400,$h="- Additional plan details omitted for brevity.";function Dh(t){return t.replace(/^#{1,6}\s+/,"").replace(/^[-*+]\s+/,"").replace(/^\d+[.)]\s+/,"").replace(/^`([^`]+)`$/,"$1").trim()}function zx(t){return t.split(`
|
|
168
|
+
`).map(e=>e.trim()).filter(Boolean).map(Dh).map(e=>Ce(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 Qx(t){return t.split(`
|
|
169
|
+
`).map(e=>e.trim()).filter(Boolean).map(Dh).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 eu(t){let e=zx(t);return e.length===0?`Review summary:
|
|
165
170
|
- Plan details are available in the full session output.`:["Review summary:",...e.slice(0,6).map(n=>`- ${n}`)].join(`
|
|
166
|
-
`)}function
|
|
167
|
-
`).length>
|
|
168
|
-
`).length>
|
|
169
|
-
`)}function
|
|
170
|
-
`),r=[],o="",i=()=>{o.trim().length>0&&(r.push(o.trimEnd()),o="")};for(let s of n){if(s.length>e){i();for(let d of
|
|
171
|
-
${s}`:s;if(a.length>e){i(),o=s;continue}o=a}return i(),r}function
|
|
171
|
+
`)}function Jx(t){let e=[],n=!1;for(let o of t){let i=o.replace(/\s+/g," ").trim();if(!i)continue;let s=Ce(i,Hx);s.length<i.length&&(n=!0);let a=`- ${s}`;if(e.length>=Gx||[...e,a].join(`
|
|
172
|
+
`).length>Eh){n=!0;break}e.push(a)}if(e.length===0)return["- Plan details are available in the full session output."];if(!n)return e;let r=[...e];for(;r.length>0&&[...r,$h].join(`
|
|
173
|
+
`).length>Eh;)r.pop();return[...r,$h]}function tu(t){return Jx(Qx(t)).join(`
|
|
174
|
+
`)}function Yx(t,e){let n=[],r=t.trim();for(;r.length>e;){let o=r.lastIndexOf(" ",e);o<Math.floor(e*.6)&&(o=e),n.push(r.slice(0,o).trimEnd()),r=r.slice(o).trimStart()}return r.length>0&&n.push(r),n}function Xx(t,e){let n=t.split(`
|
|
175
|
+
`),r=[],o="",i=()=>{o.trim().length>0&&(r.push(o.trimEnd()),o="")};for(let s of n){if(s.length>e){i();for(let d of Yx(s,e))r.push(d);continue}let a=o.length>0?`${o}
|
|
176
|
+
${s}`:s;if(a.length>e){i(),o=s;continue}o=a}return i(),r}function Nh(t){return Ce(t.trim(),jx)}function Fh(t,e){return e?t?`
|
|
172
177
|
|
|
173
178
|
Choose Approve, Revise, or Reject below.`:`
|
|
174
179
|
|
|
175
180
|
Approval is still pending for this plan version.`:`
|
|
176
181
|
|
|
177
|
-
Continued in next message.`}function
|
|
182
|
+
Continued in next message.`}function Zx(t){let{sessionName:e,actionableVersion:n,fullPlanText:r,hasButtons:o}=t,i=`\u{1F4CB} [${e}] Plan v${n??"?"} ready for approval:`,s=`
|
|
178
183
|
|
|
179
184
|
Full plan (truncated):
|
|
180
|
-
`,a
|
|
181
|
-
`),I
|
|
182
|
-
${f}${I}`}),l=d.reduce((f,g)=>Math.max(f,g.length),0);if(l<=
|
|
183
|
-
${r}`:
|
|
185
|
+
`,a=Fh(o,!0),d=Math.max(0,Zl-i.length-s.length-a.length);return`${i}${s}${Ce(r,d)}${a}`}function eA(t){let{sessionName:e,actionableVersion:n,fullPlanText:r,hasButtons:o}=t,i=Nh(e),s=qx;for(;s>0;){let a=Xx(r,s),d=a.map((f,g)=>{let y=a.length,k=[`\u{1F4CB} [${i}] Plan v${n??"?"} ready for approval (${g+1}/${y}):`,"",g===0?"Full plan:":""].filter(Boolean).join(`
|
|
186
|
+
`),I=Fh(o,g===y-1);return`${k}
|
|
187
|
+
${f}${I}`}),l=d.reduce((f,g)=>Math.max(f,g.length),0);if(l<=Zl)return d;let u=l-Zl;s-=Math.max(u,50)}return[Zx({sessionName:i,actionableVersion:n,fullPlanText:r,hasButtons:o})]}function nu(t){let{preview:e,artifact:n}=t,r=n?.markdown?.trim();return r&&r.length<=Oh?`Full plan:
|
|
188
|
+
${r}`:eu(r||e)}function Lh(t){let{sessionName:e,actionableVersion:n,preview:r,artifact:o,hasButtons:i}=t,s=o?.markdown?.trim(),a=Nh(e);if(s){let l=`\u{1F4CB} [${a}] Plan v${n??"?"} ready for approval:
|
|
184
189
|
|
|
185
190
|
Full plan:
|
|
186
191
|
${s}
|
|
187
192
|
|
|
188
|
-
${i?"Choose Approve, Revise, or Reject below.":"Approval is still pending for this plan version."}`;return l.length<=
|
|
189
|
-
${s}`}:{displayMode:"chunked-full-plan",userMessages:
|
|
193
|
+
${i?"Choose Approve, Revise, or Reject below.":"Approval is still pending for this plan version."}`;return l.length<=Oh?{displayMode:"single-full-plan",userMessages:[l],reviewSummary:`Full plan:
|
|
194
|
+
${s}`}:{displayMode:"chunked-full-plan",userMessages:eA({sessionName:e,actionableVersion:n,fullPlanText:s,hasButtons:i}),reviewSummary:eu(s)}}let d=eu(r);return{displayMode:"summary",userMessages:[`\u{1F4CB} [${a}] Plan v${n??"?"} ready for approval:
|
|
190
195
|
|
|
191
196
|
${d}
|
|
192
197
|
|
|
193
|
-
${i?"Choose Approve, Revise, or Reject below.":"Approval is still pending for this plan version."}`],reviewSummary:d}}var
|
|
198
|
+
${i?"Choose Approve, Revise, or Reject below.":"Approval is still pending for this plan version."}`],reviewSummary:d}}var Wh=700;function tA(t){let e=t?.trim();return e||void 0}function nA(t,e){let n=e?.trim();if(!n)return;if(!t)return n;let r=t.trim(),o=n.split(`
|
|
194
199
|
`).map(a=>a.trimEnd());for(;o.length>0&&!o[o.length-1]?.trim();)o.pop();for(;o.length>0&&o[o.length-1]?.trim()===r;)o.pop();let s=o.filter((a,d,l)=>{let u=a.trim();return!u||u!==r?!0:!l.some((g,y)=>y!==d&&g.trim().length>0&&g.trim()!==r)}).join(`
|
|
195
|
-
`).trim();if(!(!s||s===r))return s.length>
|
|
200
|
+
`).trim();if(!(!s||s===r))return s.length>Wh?Ki(s,Wh):s}function rA(t){let e=tA(t.questionText)??"The session is waiting for your reply.",n=nA(e,t.contextPreview);return n?[`\u2753 [${t.sessionName}] Question waiting for reply:`,"","Question:",e,"","Recent context:",n].join(`
|
|
196
201
|
`):`\u2753 [${t.sessionName}] Question waiting for reply:
|
|
197
202
|
|
|
198
|
-
${e}`}function
|
|
199
|
-
`)}function
|
|
200
|
-
`)}:C==="ask"?{label:"plan-approval",userMessage:P,userMessages:b,planReviewSummary:I,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${f??"?"}`,s,
|
|
203
|
+
${e}`}function oA(t,e){return e!=null&&t.approvalPromptRequiredVersion===e&&(t.approvalPromptStatus==="delivered"||t.approvalPromptStatus==="fallback_delivered")}function Ao(t){let{session:e,summary:n}=t,r=e.actionablePlanDecisionVersion??e.planDecisionVersion;return[`\u{1F4CB} [${e.name}] Plan v${r??"?"} 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:","",n].join(`
|
|
204
|
+
`)}function ru(t){let{session:e,preview:n,questionText:r,questionContextPreview:o,planArtifact:i,originThreadLine:s,planApprovalMode:a,planApprovalButtons:d,questionButtons:l}=t,u=e.pendingPlanApproval,f=e.actionablePlanDecisionVersion??e.planDecisionVersion,g=oA(e,f),y=a??"delegate",k=u&&y==="ask"&&!g?Lh({sessionName:e.name,actionableVersion:f,preview:n,artifact:i,hasButtons:!!d}):void 0,I=u?k?.reviewSummary??nu({preview:n,artifact:i}):void 0,P=u?k&&k.userMessages.length===1?k.userMessages[0]:void 0:rA({sessionName:e.name,questionText:r??n,contextPreview:o}),b=u&&k&&k.userMessages.length>1?k.userMessages.map((C,D,xe)=>({text:C,buttons:D===xe.length-1?d:void 0})):void 0;if(u){let C=y,D="Permission mode: plan \u2192 will switch to bypassPermissions on approval";return C==="delegate"?{label:"plan-approval",userMessage:P,userMessages:b,planReviewSummary:I,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${f??"?"}`,s,D,"","\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):",n,"","\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(`
|
|
205
|
+
`)}:C==="ask"?{label:"plan-approval",userMessage:P,userMessages:b,planReviewSummary:I,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${f??"?"}`,s,D,"","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):",n].join(`
|
|
201
206
|
`),buttons:b?void 0:d}:{label:"plan-approval",userMessage:P,planReviewSummary:I,wakeMessage:["[AUTO-APPROVE] Session has a plan ready. Approve it now:",`agent_respond(session='${e.id}', message='Approved. Go ahead.', approve=true)`].join(`
|
|
202
207
|
`)}}let A=e.multiTurn?"Multi-turn session":"Session";return{label:"waiting",userMessage:P,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.]`,"",`${A} is waiting for a genuine user reply.`,`Name: ${e.name} | ID: ${e.id}`,s,"","Last output:",n,"",`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(`
|
|
203
|
-
`),buttons:l}}he();var
|
|
204
|
-
`);this.dispatchNotification(r,{label:`worktree-stale-reminder-${e.name}`,userMessage:o,notifyUser:"always",buttons:this.getWorktreeDecisionButtons(ne(e)??e.harnessSessionId)})}};rt();he();sn();function
|
|
205
|
-
`)}function
|
|
206
|
-
`)}import{existsSync as
|
|
208
|
+
`),buttons:l}}he();yo();var ea=class t{constructor(e,n,r,o){this.buildRoutingProxy=e;this.dispatchNotification=n;this.updatePersistedSession=r;this.getWorktreeDecisionButtons=o}buildRoutingProxy;dispatchNotification;updatePersistedSession;getWorktreeDecisionButtons;static REMINDER_THRESHOLD_MS=10800*1e3;static REMINDER_INTERVAL_MS=10800*1e3;getNextReminderAt(e){let n=new Date(e.pendingWorktreeDecisionSince).getTime();if(this.getWorktreeDecisionReminderStatus(e,n)!=="pending")return;let r=[n+t.REMINDER_THRESHOLD_MS];if(e.worktreeDecisionSnoozedUntil){let o=new Date(e.worktreeDecisionSnoozedUntil).getTime();Number.isFinite(o)&&r.push(o)}if(e.lastWorktreeReminderAt){let o=new Date(e.lastWorktreeReminderAt).getTime();Number.isFinite(o)&&r.push(o+t.REMINDER_INTERVAL_MS)}return Math.max(...r)}sendReminderIfDue(e,n=Date.now()){this.clearResolvedReminderState(e);let r=this.getNextReminderAt(e);if(r==null||r>n)return!1;let o=n-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 Ge(e))this.updatePersistedSession(s,{lastWorktreeReminderAt:new Date(n).toISOString()});return!0}sendReminderNotification(e,n){let r=this.buildRoutingProxy({id:e.sessionId??e.name??M(e)??e.harnessSessionId,sessionId:e.sessionId,harnessSessionId:e.harnessSessionId,backendRef:e.backendRef,route:e.route});if(e.worktreeStrategy==="delegate"){this.dispatchNotification(r,{label:`worktree-stale-reminder-${e.name}`,wakeMessage:Jl(e,n),notifyUser:"never"});return}let o=[`\u23F0 Reminder: branch \`${e.worktreeBranch??"unknown"}\` is still waiting for a merge decision.`,`Session: ${e.name} | Pending: ${n}h`,"",`agent_merge(session="${e.name}") or agent_pr(session="${e.name}") or agent_worktree_cleanup() to resolve.`].join(`
|
|
209
|
+
`);this.dispatchNotification(r,{label:`worktree-stale-reminder-${e.name}`,userMessage:o,notifyUser:"always",buttons:this.getWorktreeDecisionButtons(ne(e)??e.harnessSessionId)})}clearResolvedReminderState(e){if(!e.pendingWorktreeDecisionSince&&!e.lastWorktreeReminderAt&&!e.worktreeDecisionSnoozedUntil||this.getWorktreeDecisionReminderStatus(e)!=="resolved")return!1;let n=!1;for(let r of Ge(e))n=this.updatePersistedSession(r,{pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeDecisionSnoozedUntil:void 0})||n;return n}getWorktreeDecisionReminderStatus(e,n){if(!e.pendingWorktreeDecisionSince)return"inactive";let r=n??new Date(e.pendingWorktreeDecisionSince).getTime();if(!Number.isFinite(r))return"inactive";if(e.worktreeMerged||e.worktreePrUrl||e.lifecycle==="terminal")return"resolved";let o=new Set(["merged","released","dismissed","none","cleanup_failed"]);if(e.worktreeState&&o.has(e.worktreeState))return"resolved";let i=new Set(["merged","released","dismissed","no_change","none","cleanup_failed"]);if(e.worktreeLifecycle?.state&&i.has(e.worktreeLifecycle.state))return"resolved";let s=e.worktreeState==="pending_decision"||e.lifecycle==="awaiting_worktree_decision"||e.worktreeLifecycle?.state==="pending_decision",a=e.worktreeState==null&&e.lifecycle==null&&e.worktreeLifecycle?.state==null&&!e.worktreeMerged&&!e.worktreePrUrl;if(!s&&!a)return"inactive";let d=Ln(e,{activeSession:!1,includePrSync:!1});return d.derivedState==="merged"||d.derivedState==="released"||d.derivedState==="cleanup_failed"?"resolved":"pending"}};rt();he();sn();function Ro(t,e){return e!=null&&t.approvalPromptRequiredVersion===e&&iA(t.approvalPromptStatus)}function iA(t){return t==="delivered"||t==="fallback_delivered"}function To(t,e){return!t||e==null?!1:!!(t.pendingPlanApproval&&t.approvalState==="pending"&&t.lifecycle==="awaiting_plan_decision"&&(t.actionablePlanDecisionVersion??t.planDecisionVersion)===e)}function br(t,e,n=!1){let r="id"in t?t.id:t.sessionId??"unknown-session";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: ${t.name??"unknown"} | ID: ${r} | Plan v${e??"?"}`,`Wait for their ${n?"explicit reply":"button callback"} \u2014 do NOT approve or reject this plan yourself.`].join(`
|
|
210
|
+
`)}function ta(t){let e="id"in t.session?t.session.id:t.session.sessionId??"unknown-session",n=t.originThreadLine??(t.session.originThreadId!=null?`Origin thread: ${t.session.originThreadId}`:"");return["[PLAN APPROVAL DELIVERY FAILED] The plugin could not deliver the canonical plan review buttons or the explicit fallback text to the user.",`Name: ${t.session.name??"unknown"} | ID: ${e} | Plan v${t.planDecisionVersion??"?"}`,n,"","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(`
|
|
211
|
+
`)}import{existsSync as sA,readFileSync as aA}from"fs";function dA(t,e){if(t.latestPlanArtifactVersion===e&&t.latestPlanArtifact)return t.latestPlanArtifact;let n=t.planFilePath?.trim();if(!(!n||!sA(n)))try{let r=aA(n,"utf-8").trim();return r?{markdown:r,steps:[]}:void 0}catch{return}}var na=class{constructor(e){this.deps=e}deps;dispatchPlanApprovalFallback(e,n,r){let o=new Date().toISOString();this.deps.dispatchSessionNotification(e,{label:"plan-approval-fallback",userMessage:Ao({session:e,summary:r}),notifyUser:"always",shouldDispatch:()=>To(e,n),hooks:{onNotifyStarted:()=>{this.deps.updatePersistedSession(e.id,{approvalPromptRequiredVersion:n,approvalPromptVersion:n,approvalPromptStatus:"sending",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"explicit_fallback_text",approvalPromptLastAttemptAt:o})},onNotifySucceeded:()=>{this.deps.updatePersistedSession(e.id,{approvalPromptRequiredVersion:n,approvalPromptVersion:n,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:n,approvalPromptVersion:n,approvalPromptStatus:"failed",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"explicit_fallback_text",approvalPromptLastAttemptAt:o,approvalPromptFailedAt:new Date().toISOString()})}},wakeMessageOnNotifySuccess:br(e,n,!0),wakeMessageOnNotifyFailed:ta({session:e,planDecisionVersion:n,originThreadLine:this.deps.originThreadLine(e)})})}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,n){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(n||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 n={notificationSent:!1,worktreeRemoved:!1};e.worktreePath&&e.originalWorkdir&&(n=await this.deps.handleWorktreeStrategy(e));let r=!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=We(e);console.info(`[SessionManager] Early startup failure for "${e.name}" \u2014 auto-cleaning worktree (cost=$${e.costUsd.toFixed(2)}, duration=${e.duration}ms)`);let u=!1;if(a&&!l&&(u=nt(a,e.worktreePath)),a&&d&&!l&&u&&Ot(a,d),u){for(let f of Ge(e))this.deps.updatePersistedSession(f,{worktreePath:void 0,worktreeBranch:void 0});r=!0}}let o=e.worktreeStrategy&&e.worktreeStrategy!=="off"&&e.worktreeStrategy!=="manual";if(!r&&e.worktreePath&&e.originalWorkdir){let a=this.deps.resolveWorktreeRepoDir(e.originalWorkdir,e.worktreePath),d=We(e);n.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&&nt(a,e.worktreePath)}if(e.killReason==="done"){if(n.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,Ce(a,200),r);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=Ro(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(`
|
|
207
212
|
`),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(`
|
|
208
|
-
`)}),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} | ${
|
|
209
|
-
`),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} | ${Tt(s)}`,notifyUser:"always",buttons:this.deps.getResumeButtons(e.id,e)}),this.deps.clearRetryTimersForSession(e.id);return}this.deps.notifySession(e,`\u26D4 [${e.name}] ${Po(e.killReason)} | ${i} | ${Tt(s)}`),this.deps.clearRetryTimersForSession(e.id)}emitWaitingForInput(e){if(!this.deps.debounceWaitingEvent(e.id))return;let n=e.pendingPlanApproval?this.deps.resolvePlanApprovalMode(e):void 0,r=e.actionablePlanDecisionVersion??e.planDecisionVersion,o=e.pendingPlanApproval&&n==="ask"&&Io(e,r),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&&n!=="delegate"?Number.POSITIVE_INFINITY:void 0),a=e.pendingPlanApproval&&n==="ask"&&!o?this.deps.getPlanApprovalButtons(e.id,{...e,planDecisionVersion:r}):!e.pendingPlanApproval&&e.pendingInputState?.options.length?this.deps.getQuestionButtons(e.id,e.pendingInputState.options.map(f=>({label:f}))):void 0,d=sA(e,r),l=nu({session:e,preview:s,questionText:e.pendingPlanApproval?void 0:e.pendingInputState?.promptText,questionContextPreview:i,planArtifact:d,originThreadLine:this.deps.originThreadLine(e),planApprovalMode:n,planApprovalButtons:a,questionButtons:e.pendingPlanApproval?void 0:a}),u=l.planReviewSummary??s;if(l.label==="plan-approval"&&n==="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"&&n==="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:r,approvalPromptVersion:r,approvalPromptStatus:"sending",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"canonical_buttons",approvalPromptLastAttemptAt:new Date().toISOString()})},onNotifySucceeded:()=>{this.deps.updatePersistedSession(e.id,{canonicalPlanPromptVersion:r,approvalPromptRequiredVersion:r,approvalPromptVersion:r,approvalPromptStatus:"delivered",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"canonical_buttons",approvalPromptDeliveredAt:new Date().toISOString(),approvalPromptFailedAt:void 0})},onNotifyFailed:()=>{this.deps.updatePersistedSession(e.id,{approvalPromptRequiredVersion:r,approvalPromptVersion:r,approvalPromptStatus:"failed",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"canonical_buttons",approvalPromptFailedAt:new Date().toISOString()})}},shouldDispatch:()=>bo(e,r),onUserNotifyFailed:()=>this.dispatchPlanApprovalFallback(e,r,u),wakeMessageOnNotifySuccess:vr(e,r)});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 n=Hl({session:e,originThreadLine:this.deps.originThreadLine(e),preview:this.deps.getOutputPreview(e)});this.deps.dispatchSessionNotification(e,{label:"turn-complete",userMessage:n.userMessage,wakeMessage:n.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 n=this.deps.getOutputPreview(e),r=this.shouldRequestCompletionFollowup(e),o=Gl({session:e,originThreadLine:this.deps.originThreadLine(e),preview:n}),i;this.deps.dispatchSessionNotification(e,{label:"completed",userMessage:o.userMessage,notifyUser:"always",completionWakeSummaryRequired:r,requireDirectUserNotification:!0,wakeMessageOnNotifySuccess:r?o.wakeMessageOnNotifySuccess:void 0,wakeMessageOnNotifyFailed:r?o.wakeMessageOnNotifyFailed:void 0,hooks:{onNotifySucceeded:()=>{i=!0,this.logCompletionWakeDiagnostic({session:e,event:"completion_notify_succeeded",canonicalStatusDelivered:i,followupSummaryRequired:r})},onNotifyFailed:()=>{i=!1,this.logCompletionWakeDiagnostic({session:e,event:"completion_notify_failed",canonicalStatusDelivered:i,followupSummaryRequired:r})},onWakeSucceeded:()=>{this.logCompletionWakeDiagnostic({session:e,event:"completion_wake_succeeded",canonicalStatusDelivered:i,followupSummaryRequired:r})}}})}emitFailed(e,n,r){let o=jl({session:e,originThreadLine:this.deps.originThreadLine(e),errorSummary:n,preview:this.deps.getOutputPreview(e),worktreeAutoCleaned:r,failedButtons:this.deps.getResumeButtons(e.id,e)});this.deps.dispatchSessionNotification(e,{label:"failed",userMessage:o.userMessage,wakeMessage:o.wakeMessage,notifyUser:"always",buttons:o.buttons})}};he();rt();import{existsSync as aA}from"fs";var ea=class{constructor(e){this.deps=e}deps;async dismissWorktree(e){let n=this.deps.getPersistedSession(e),r=this.deps.resolveActiveSession(e),o=r??n;if(!o)return`Error: Session "${e}" not found.`;let i=r?.worktreePath??n?.worktreePath,s=this.deps.resolveWorktreeRepoDir(r?.originalWorkdir??n?.workdir,i),a=r?.worktreeBranch??n?.worktreeBranch,d=r?.name??n?.name??e;if(!s)return`Error: No workdir found for session "${e}".`;let l=We(o);!l&&i&&aA(i)&&nt(s,i,{destructive:!0}),a&&Dt(s,a);for(let f of tt(r??n))this.deps.updatePersistedSession(f,{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:n?.worktreeLifecycle?.baseBranch,targetRepo:n?.worktreePrTargetRepo,pushRemote:n?.worktreePushRemote}});let u=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:ne(r??n??{id:e})??e,sessionId:n?.sessionId,harnessSessionId:r?.harnessSessionId??n?.harnessSessionId,backendRef:r?.backendRef??n?.backendRef,route:r?.route??n?.route}),{label:"worktree-dismissed",userMessage:u,notifyUser:"always"}),u}snoozeWorktreeDecision(e){let n=this.deps.getPersistedSession(e);if(!n)return`Error: Session "${e}" not found.`;let r=new Date(Date.now()+1440*60*1e3).toISOString();for(let s of tt(n))this.deps.updatePersistedSession(s,{worktreeDecisionSnoozedUntil:r,lastWorktreeReminderAt:new Date().toISOString()});let i=`\u23ED\uFE0F Reminder snoozed 24h for \`${n.worktreeBranch??"unknown"}\` (session: ${n.name})`;return this.deps.dispatchNotification(this.deps.buildRoutingProxy({id:ne(n)??M(n)??n.harnessSessionId,sessionId:n.sessionId,harnessSessionId:n.harnessSessionId,backendRef:n.backendRef,route:n.route}),{label:"worktree-snoozed",userMessage:i,notifyUser:"always"}),i}};var Fh=new Set(["starting","running"]),ta=class{sessions=new Map;activeSessionCount(){return[...this.sessions.values()].filter(e=>Fh.has(e.status)).length}uniqueName(e){let n=new Set([...this.sessions.values()].filter(o=>Fh.has(o.status)).map(o=>o.name));if(!n.has(e))return e;let r=2;for(;n.has(`${e}-${r}`);)r+=1;return`${e}-${r}`}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 na=class{constructor(e){this.deps=e}deps;initializeSession(e,n,r,o={}){if(this.deps.hydrateSpawnedSession(e,n,r),r.taskLifecycle?.create(e),e.on("statusChange",(i,s)=>{s==="running"?(e.harnessSessionId&&this.deps.markRunning(e),r.taskLifecycle?.progress(e)):(s==="completed"||s==="failed"||s==="killed")&&(r.taskLifecycle?.finalize(e),this.deps.handleTerminal(e).catch(a=>{console.error(`[SessionRuntimeBootstrap] handleTerminal threw for session ${e.id}:`,a)}))}),e.on("lifecycleChange",(i,s)=>{r.taskLifecycle?.progress(e)}),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 ra=class{buildNoChangeNotification(e){let{session:n,nativeBackendWorktree:r,cleanupSucceeded:o,worktreePath:i,preview:s,originThreadLine:a}=e,d=o?r?"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?r?`\u2139\uFE0F [${n.name}] Session completed with no changes \u2014 native backend worktree released for backend cleanup`:`\u2139\uFE0F [${n.name}] Session completed with no changes \u2014 worktree cleaned up`:`\u26A0\uFE0F [${n.name}] Session completed with no changes, but worktree cleanup failed. Worktree still exists at ${i}`,wakeMessage:Jl({sessionName:n.name,sessionId:n.id,cleanupSummary:d,preview:s,originThreadLine:a,requestedPermissionMode:n.requestedPermissionMode,currentPermissionMode:n.currentPermissionMode,approvalExecutionState:n.approvalExecutionState,approvalState:n.approvalState,planApproval:n.planApproval,approvalPromptStatus:n.approvalPromptStatus,approvalPromptMessageKind:n.approvalPromptMessageKind,approvalPromptDeliveredAt:n.approvalPromptDeliveredAt}),notifyUser:"always"}}buildAskNotification(e){let{session:n,branchName:r,baseBranch:o,diffSummary:i,buttons:s}=e,a=Yl(i),d=i.commitMessages.slice(0,5).map(f=>`\u2022 ${f.hash} ${f.message} (${f.author})`),l=i.commits>5?`...and ${i.commits-5} more`:"",u=n.worktreePrTargetRepo?`Branch: \`${r}\` \u2192 \`${o}\` | PR target: ${n.worktreePrTargetRepo}`:`Branch: \`${r}\` \u2192 \`${o}\``;return{label:"worktree-merge-ask",userMessage:[`\u{1F500} Worktree decision required for session \`${n.name}\``,"",u,`Commits: ${i.commits} | Files: ${i.filesChanged} | +${i.insertions} / -${i.deletions}`,"",...a.length>0?["Summary:",...a.map(f=>`- ${f}`),""]:[],"Recent commits:",...d,...l?[l]:[],"",`\u26A0\uFE0F Discard will permanently delete branch \`${r}\` and all local changes. This cannot be undone.`].join(`
|
|
213
|
+
`)}),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} | ${Rt(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(`
|
|
214
|
+
`),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} | ${Rt(s)}`,notifyUser:"always",buttons:this.deps.getResumeButtons(e.id,e)}),this.deps.clearRetryTimersForSession(e.id);return}this.deps.notifySession(e,`\u26D4 [${e.name}] ${xo(e.killReason)} | ${i} | ${Rt(s)}`),this.deps.clearRetryTimersForSession(e.id)}emitWaitingForInput(e){if(!this.deps.debounceWaitingEvent(e.id))return;let n=e.pendingPlanApproval?this.deps.resolvePlanApprovalMode(e):void 0,r=e.actionablePlanDecisionVersion??e.planDecisionVersion,o=e.pendingPlanApproval&&n==="ask"&&Ro(e,r),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&&n!=="delegate"?Number.POSITIVE_INFINITY:void 0),a=e.pendingPlanApproval&&n==="ask"&&!o?this.deps.getPlanApprovalButtons(e.id,{...e,planDecisionVersion:r}):!e.pendingPlanApproval&&e.pendingInputState?.options.length?this.deps.getQuestionButtons(e.id,e.pendingInputState.options.map(f=>({label:f}))):void 0,d=dA(e,r),l=ru({session:e,preview:s,questionText:e.pendingPlanApproval?void 0:e.pendingInputState?.promptText,questionContextPreview:i,planArtifact:d,originThreadLine:this.deps.originThreadLine(e),planApprovalMode:n,planApprovalButtons:a,questionButtons:e.pendingPlanApproval?void 0:a}),u=l.planReviewSummary??s;if(l.label==="plan-approval"&&n==="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"&&n==="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:r,approvalPromptVersion:r,approvalPromptStatus:"sending",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"canonical_buttons",approvalPromptLastAttemptAt:new Date().toISOString()})},onNotifySucceeded:()=>{this.deps.updatePersistedSession(e.id,{canonicalPlanPromptVersion:r,approvalPromptRequiredVersion:r,approvalPromptVersion:r,approvalPromptStatus:"delivered",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"canonical_buttons",approvalPromptDeliveredAt:new Date().toISOString(),approvalPromptFailedAt:void 0})},onNotifyFailed:()=>{this.deps.updatePersistedSession(e.id,{approvalPromptRequiredVersion:r,approvalPromptVersion:r,approvalPromptStatus:"failed",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"canonical_buttons",approvalPromptFailedAt:new Date().toISOString()})}},shouldDispatch:()=>To(e,r),onUserNotifyFailed:()=>this.dispatchPlanApprovalFallback(e,r,u),wakeMessageOnNotifySuccess:br(e,r)});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 n=zl({session:e,originThreadLine:this.deps.originThreadLine(e),preview:this.deps.getOutputPreview(e)});this.deps.dispatchSessionNotification(e,{label:"turn-complete",userMessage:n.userMessage,wakeMessage:n.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 n=this.deps.getOutputPreview(e),r=this.shouldRequestCompletionFollowup(e),o=Gl({session:e,originThreadLine:this.deps.originThreadLine(e),preview:n}),i;this.deps.dispatchSessionNotification(e,{label:"completed",userMessage:o.userMessage,notifyUser:"always",completionWakeSummaryRequired:r,requireDirectUserNotification:!0,wakeMessageOnNotifySuccess:r?o.wakeMessageOnNotifySuccess:void 0,wakeMessageOnNotifyFailed:r?o.wakeMessageOnNotifyFailed:void 0,hooks:{onNotifySucceeded:()=>{i=!0,this.logCompletionWakeDiagnostic({session:e,event:"completion_notify_succeeded",canonicalStatusDelivered:i,followupSummaryRequired:r})},onNotifyFailed:()=>{i=!1,this.logCompletionWakeDiagnostic({session:e,event:"completion_notify_failed",canonicalStatusDelivered:i,followupSummaryRequired:r})},onWakeSucceeded:()=>{this.logCompletionWakeDiagnostic({session:e,event:"completion_wake_succeeded",canonicalStatusDelivered:i,followupSummaryRequired:r})}}})}emitFailed(e,n,r){let o=Hl({session:e,originThreadLine:this.deps.originThreadLine(e),errorSummary:n,preview:this.deps.getOutputPreview(e),worktreeAutoCleaned:r,failedButtons:this.deps.getResumeButtons(e.id,e)});this.deps.dispatchSessionNotification(e,{label:"failed",userMessage:o.userMessage,wakeMessage:o.wakeMessage,notifyUser:"always",buttons:o.buttons})}};he();rt();import{existsSync as lA}from"fs";var ra=class{constructor(e){this.deps=e}deps;async dismissWorktree(e){let n=this.deps.getPersistedSession(e),r=this.deps.resolveActiveSession(e),o=r??n;if(!o)return`Error: Session "${e}" not found.`;let i=r?.worktreePath??n?.worktreePath,s=this.deps.resolveWorktreeRepoDir(r?.originalWorkdir??n?.workdir,i),a=r?.worktreeBranch??n?.worktreeBranch,d=r?.name??n?.name??e;if(!s)return`Error: No workdir found for session "${e}".`;let l=We(o);!l&&i&&lA(i)&&nt(s,i,{destructive:!0}),a&&Ot(s,a);for(let f of Ge(r??n))this.deps.updatePersistedSession(f,{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:n?.worktreeLifecycle?.baseBranch,targetRepo:n?.worktreePrTargetRepo,pushRemote:n?.worktreePushRemote}});let u=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:ne(r??n??{id:e})??e,sessionId:n?.sessionId,harnessSessionId:r?.harnessSessionId??n?.harnessSessionId,backendRef:r?.backendRef??n?.backendRef,route:r?.route??n?.route}),{label:"worktree-dismissed",userMessage:u,notifyUser:"always"}),u}snoozeWorktreeDecision(e){let n=this.deps.getPersistedSession(e);if(!n)return`Error: Session "${e}" not found.`;let r=new Date(Date.now()+1440*60*1e3).toISOString();for(let s of Ge(n))this.deps.updatePersistedSession(s,{worktreeDecisionSnoozedUntil:r,lastWorktreeReminderAt:new Date().toISOString()});let i=`\u23ED\uFE0F Reminder snoozed 24h for \`${n.worktreeBranch??"unknown"}\` (session: ${n.name})`;return this.deps.dispatchNotification(this.deps.buildRoutingProxy({id:ne(n)??M(n)??n.harnessSessionId,sessionId:n.sessionId,harnessSessionId:n.harnessSessionId,backendRef:n.backendRef,route:n.route}),{label:"worktree-snoozed",userMessage:i,notifyUser:"always"}),i}};var Bh=new Set(["starting","running"]),oa=class{sessions=new Map;activeSessionCount(){return[...this.sessions.values()].filter(e=>Bh.has(e.status)).length}uniqueName(e){let n=new Set([...this.sessions.values()].filter(o=>Bh.has(o.status)).map(o=>o.name));if(!n.has(e))return e;let r=2;for(;n.has(`${e}-${r}`);)r+=1;return`${e}-${r}`}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 ia=class{constructor(e){this.deps=e}deps;initializeSession(e,n,r,o={}){if(this.deps.hydrateSpawnedSession(e,n,r),r.taskLifecycle?.create(e),e.on("statusChange",(i,s)=>{s==="running"?(e.harnessSessionId&&this.deps.markRunning(e),r.taskLifecycle?.progress(e)):(s==="completed"||s==="failed"||s==="killed")&&(r.taskLifecycle?.finalize(e),this.deps.handleTerminal(e).catch(a=>{console.error(`[SessionRuntimeBootstrap] handleTerminal threw for session ${e.id}:`,a)}))}),e.on("lifecycleChange",(i,s)=>{r.taskLifecycle?.progress(e)}),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 sa=class{buildNoChangeNotification(e){let{session:n,nativeBackendWorktree:r,cleanupSucceeded:o,worktreePath:i,preview:s,originThreadLine:a}=e,d=o?r?"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?r?`\u2139\uFE0F [${n.name}] Session completed with no changes \u2014 native backend worktree released for backend cleanup`:`\u2139\uFE0F [${n.name}] Session completed with no changes \u2014 worktree cleaned up`:`\u26A0\uFE0F [${n.name}] Session completed with no changes, but worktree cleanup failed. Worktree still exists at ${i}`,wakeMessage:Yl({sessionName:n.name,sessionId:n.id,cleanupSummary:d,preview:s,originThreadLine:a,requestedPermissionMode:n.requestedPermissionMode,currentPermissionMode:n.currentPermissionMode,approvalExecutionState:n.approvalExecutionState,approvalState:n.approvalState,planApproval:n.planApproval,approvalPromptStatus:n.approvalPromptStatus,approvalPromptMessageKind:n.approvalPromptMessageKind,approvalPromptDeliveredAt:n.approvalPromptDeliveredAt}),notifyUser:"always"}}buildAskNotification(e){let{session:n,branchName:r,baseBranch:o,diffSummary:i,buttons:s}=e,a=Xl(i),d=i.commitMessages.slice(0,5).map(f=>`\u2022 ${f.hash} ${f.message} (${f.author})`),l=i.commits>5?`...and ${i.commits-5} more`:"",u=n.worktreePrTargetRepo?`Branch: \`${r}\` \u2192 \`${o}\` | PR target: ${n.worktreePrTargetRepo}`:`Branch: \`${r}\` \u2192 \`${o}\``;return{label:"worktree-merge-ask",userMessage:[`\u{1F500} Worktree decision required for session \`${n.name}\``,"",u,`Commits: ${i.commits} | Files: ${i.filesChanged} | +${i.insertions} / -${i.deletions}`,"",...a.length>0?["Summary:",...a.map(f=>`- ${f}`),""]:[],"Recent commits:",...d,...l?[l]:[],"",`\u26A0\uFE0F Discard will permanently delete branch \`${r}\` and all local changes. This cannot be undone.`].join(`
|
|
210
215
|
`),notifyUser:"always",buttons:s,wakeMessageOnNotifySuccess:["Worktree decision buttons delivered to the user.",`Session: ${n.name} | ID: ${n.id}`,u,"Wait for their button callback \u2014 do NOT act on this worktree yourself."].join(`
|
|
211
216
|
`),wakeMessageOnNotifyFailed:[`\u{1F500} Worktree decision required for session \`${n.name}\``,"",u,`Commits: ${i.commits} | Files: ${i.filesChanged} | +${i.insertions} / -${i.deletions}`].join(`
|
|
212
|
-
`)}}buildDelegateNotification(e){let{session:n,branchName:r,baseBranch:o,diffSummary:i,originThreadLine:s}=e,a=i.commitMessages.slice(0,5).map(u=>`\u2022 ${u.hash} ${u.message} (${u.author})`),d=i.commits>5?`...and ${i.commits-5} more`:void 0,l=n.prompt?n.prompt.slice(0,500):"(no prompt)";return{label:"worktree-delegate",wakeMessage:
|
|
213
|
-
`):
|
|
214
|
-
`).trim();return n?
|
|
215
|
-
`):""}function
|
|
216
|
-
`)?n:void 0}sn();rt();Te();import{unlinkSync as uA}from"fs";var oa=class t{timers=new Map;disposed=!1;static MAX_DELAY_MS=2147483647;schedule(e,n,r){if(this.disposed)return;this.cancel(e);let o=Math.max(0,n-Date.now()),i=setTimeout(()=>{if(this.timers.delete(e),!this.disposed){if(n-Date.now()>0){this.schedule(e,n,r);return}r()}},Math.min(o,t.MAX_DELAY_MS));i.unref?.(),this.timers.set(e,i)}cancel(e){let n=this.timers.get(e);n&&(clearTimeout(n),this.timers.delete(e))}cancelPrefix(e){for(let n of this.timers.keys())n.startsWith(e)&&this.cancel(n)}dispose(){this.disposed=!0;for(let e of this.timers.values())clearTimeout(e);this.timers.clear()}};he();os();rt();var Bh=10080*60*1e3,pA=300*1e3,Uh="tmp-output:cleanup";function cA(t){return t instanceof Error?t.message:String(t)}var ia=class{constructor(e){this.deps=e}deps;scheduler=new oa;schedule(e,n,r){this.scheduler.schedule(e,n,r)}cancel(e){this.scheduler.cancel(e)}cancelPrefix(e){this.scheduler.cancelPrefix(e)}bootstrapMaintenanceSchedules(){let e=Date.now();this.deps.store.cleanupTmpOutputFiles(e);for(let n of this.deps.store.listPersistedSessions())this.syncPersistedSessionMaintenance(n);this.syncActionTokenExpiryDeadline(),this.deps.store.cleanupOrphanOutputFiles(),this.syncTmpOutputCleanupDeadline(e)}syncRuntimeGcDeadline(e){if(!e.completedAt)return;let n=this.runtimeGcKey(e.id);this.schedule(n,e.completedAt+this.runtimeGcMaxAgeMs(),()=>{let r=this.deps.sessions.get(e.id);if(!r||!r.completedAt)return;let o=this.runtimeGcMaxAgeMs();if(!this.deps.store.shouldGcActiveSession(r,Date.now(),o)){this.syncRuntimeGcDeadline(r);return}this.deps.removeRuntimeSession(e.id),this.deps.persistSession(r,{scheduleRuntimeGc:!1}),this.deps.clearRuntimeSessionState(e.id)})}cancelRuntimeGc(e){this.cancel(this.runtimeGcKey(e))}cancelPersistedMaintenance(e){let n=this.persistedMaintenanceRef(e);n&&this.cancelPrefix(`persisted:${n}:`)}syncPersistedSessionMaintenance(e){let n=this.persistedMaintenanceRef(e);if(!n)return;this.cancel(this.persistedMaintenanceKey(n,"worktree-reminder"));let r=this.deps.reminders.getNextReminderAt(e);r!=null&&this.schedulePersistedWorktreeReminder(n,r),this.cancel(this.persistedMaintenanceKey(n,"worktree-retention"));let o=fo(e,{activeSession:!1,includePrSync:e.worktreeLifecycle?.state==="pr_open"||!!e.worktreePrUrl}),i=this.resolvedAtIso(e),s=this.isLegacyResolvedWorktree(e);if((o.cleanupSafe||s)&&typeof i=="string"){let a=new Date(i).getTime();Number.isFinite(a)&&this.schedule(this.persistedMaintenanceKey(n,"worktree-retention"),a+Bh,()=>{let d=this.deps.store.getPersistedSession(n);d&&this.reconcileResolvedWorktreeRetention(d,Date.now())})}}reconcileResolvedWorktreeRetention(e,n){let r=fo(e,{activeSession:!1,includePrSync:e.worktreeLifecycle?.state==="pr_open"||!!e.worktreePrUrl}),o=this.resolvedAtIso(e),i=o?new Date(o).getTime():0,s=this.isLegacyResolvedWorktree(e);if(!(!r.cleanupSafe&&!s||!i||n-i<Bh))try{if(!e.worktreePath&&!We(e))return;let a=this.deps.resolveWorktreeRepoDir(e.workdir,e.worktreePath);if(!a)return;let d=We(e)?!1:nt(a,e.worktreePath);if(!We(e)&&!d)return;for(let l of tt(e))this.deps.updatePersistedSession(l,{worktreePath:void 0,worktreeBranch:void 0,worktreeState:"none",worktreeLifecycle:{...e.worktreeLifecycle??r.lifecycle,state:r.derivedState,updatedAt:new Date(n).toISOString(),resolvedAt:e.worktreeLifecycle?.resolvedAt??new Date(n).toISOString(),resolutionSource:e.worktreeLifecycle?.resolutionSource??"maintenance",notes:r.reasons}})}catch(a){console.warn(`[SessionManager] Failed maintenance cleanup for worktree ${e.worktreePath}: ${cA(a)}`)}}syncActionTokenExpiryDeadline(){let e="tokens:expiry";this.cancel(e);let n=this.deps.store.getNextActionTokenExpiry();n!=null&&this.schedule(e,n,()=>{this.deps.store.purgeExpiredActionTokens(Date.now())})}syncTmpOutputCleanupDeadline(e=Date.now()){this.cancel(Uh);let n=this.deps.store.getNextTmpOutputCleanupAt(e);n!=null&&this.schedule(Uh,n,()=>{let r=Date.now();this.deps.store.cleanupTmpOutputFiles(r),this.syncTmpOutputCleanupDeadline(r)})}enforcePersistedRetention(){let e=this.deps.store.evictOldestPersisted(this.deps.getMaxPersistedSessions());for(let n of e)this.cancelPersistedMaintenance(n),n.sessionId&&this.cancelRuntimeGc(n.sessionId),this.cleanupOutputPathIfUnreferenced(n.outputPath)}dispose(){this.scheduler.dispose()}persistedMaintenanceRef(e){return e.sessionId??M(e)??e.harnessSessionId}runtimeGcKey(e){return`runtime-gc:${e}`}persistedMaintenanceKey(e,n){return`persisted:${e}:${n}`}runtimeGcMaxAgeMs(){return(_.sessionGcAgeMinutes??1440)*6e4}schedulePersistedWorktreeReminder(e,n){let r=this.persistedMaintenanceKey(e,"worktree-reminder");this.schedule(r,n,()=>{let o=this.deps.store.getPersistedSession(e);if(!o||this.deps.reminders.sendReminderIfDue(o,Date.now()))return;let s=this.deps.reminders.getNextReminderAt(o);s!=null&&this.schedulePersistedWorktreeReminder(e,Math.max(s,Date.now()+pA))})}cleanupOutputPathIfUnreferenced(e){if(!(!e||this.deps.store.hasOutputPathReference(e)))try{uA(e)}catch{}}resolvedAtIso(e){return e.worktreeLifecycle?.resolvedAt??e.worktreeMergedAt??e.worktreeDismissedAt??(e.completedAt?new Date(e.completedAt).toISOString():void 0)}isLegacyResolvedWorktree(e){return e.worktreeMerged===!0||e.worktreeDisposition==="dismissed"||e.worktreeDisposition==="no-change-cleaned"||e.worktreeState==="merged"||e.worktreeState==="dismissed"}};var Kh=new Set(["completed","failed","killed"]),mA=new Set(["starting","running"]),fA=5e3,sa=class{registry;sessions;maxSessions;maxPersistedSessions;lastWaitingEventTimestamps=new Map;lastTurnCompleteMarkers=new Map;lastTerminalWakeMarkers=new Map;mergeQueue=new kr;pendingAskUserQuestions=new Map;store;metrics;wakeDispatcher;interactions;notifications;worktrees;questions;reminders;lifecycle;restore;stateSync;references;worktreeStrategy;worktreeDecisions;runtimeBootstrap;worktreeMessages;maintenance;constructor(e=20,n=50,r={}){this.maxSessions=e,this.maxPersistedSessions=n,this.registry=new ta,this.sessions=this.registry.sessions,this.store=new Ls(r.store),this.metrics=new Ws,this.wakeDispatcher=new Gs,this.interactions=new js(this.store.actionTokenStore,ln),this.references=new Ts(this.sessions,this.store),this.stateSync=new Rs({store:this.store,sessions:this.sessions,resolveSession:o=>this.references.resolveActive(o)}),this.notifications=new Hs(this.wakeDispatcher,(o,i)=>this.stateSync.applySessionPatch(o,i)),this.worktrees=new zs,this.restore=new As(o=>this.store.getPersistedSession(o)),this.worktreeMessages=new ra,this.worktreeStrategy=new _s({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:ns,spawnConflictResolver:async({session:o,worktreePath:i,prompt:s})=>this.spawn({prompt:s,workdir:i,name:`${o.name}-conflict-resolver`,harness:o.harnessName||Le(),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(()=>(ys(),xg));return{success:(await s().execute("auto-pr",{session:o.id,base_branch:i}))?.meta?.success===!0}}}),this.questions=new Qs(this.pendingAskUserQuestions,(o,i)=>this.dispatchSessionNotification(o,i),o=>{this.lastWaitingEventTimestamps.delete(o)},(o,i)=>this.interactions.getQuestionButtons(o,i)),this.reminders=new Ys(o=>this.buildRoutingProxy(o),(o,i)=>this.notifications.dispatch(o,i),(o,i)=>this.updatePersistedSession(o,i),o=>this.getWorktreeDecisionButtons(o)),this.maintenance=new ia({store:this.store,sessions:this.sessions,reminders:this.reminders,removeRuntimeSession:o=>this.registry.remove(o),persistSession:(o,i)=>this.persistSession(o,i),clearRuntimeSessionState:o=>{this.lastWaitingEventTimestamps.delete(o),this.lastTurnCompleteMarkers.delete(o),this.lastTerminalWakeMarkers.delete(o)},resolveWorktreeRepoDir:(o,i)=>this.resolveWorktreeRepoDir(o,i),updatePersistedSession:(o,i)=>this.updatePersistedSession(o,i),getMaxPersistedSessions:()=>this.maxPersistedSessions}),this.store.onActionTokensChanged(()=>this.syncActionTokenExpiryDeadline()),this.lifecycle=new Zs({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 ea({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 na({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)}syncRuntimeGcDeadline(e){this.maintenance.syncRuntimeGcDeadline(e)}cancelPersistedMaintenance(e){this.maintenance.cancelPersistedMaintenance(e)}onPersistedSessionChanged(e){e&&(this.syncPersistedSessionMaintenance(e),this.enforcePersistedRetention())}syncPersistedSessionMaintenance(e){this.maintenance.syncPersistedSessionMaintenance(e)}reconcileResolvedWorktreeRetention(e,n){this.maintenance.reconcileResolvedWorktreeRetention(e,n)}syncActionTokenExpiryDeadline(){this.maintenance.syncActionTokenExpiryDeadline()}syncTmpOutputCleanupDeadline(e=Date.now()){this.maintenance.syncTmpOutputCleanupDeadline(e)}enforcePersistedRetention(){this.maintenance.enforcePersistedRetention()}bootstrapMaintenanceSchedules(){this.maintenance.bootstrapMaintenanceSchedules()}disposeMaintenance(){this.maintenance.dispose()}spawn(e,n={}){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 g=this.registry.get(e.sessionIdOverride);if(g?.status==="starting"||g?.status==="running")throw new Error(`Cannot reuse session ID ${e.sessionIdOverride}: that session is still ${g.status}.`);g&&this.registry.remove(g.id),this.lastWaitingEventTimestamps.delete(e.sessionIdOverride),this.lastTurnCompleteMarkers.delete(e.sessionIdOverride),this.lastTerminalWakeMarkers.delete(e.sessionIdOverride),this.maintenance.cancelRuntimeGc(e.sessionIdOverride)}let o=e.name||Of(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,u=a==="claude-code"&&!e.canUseTool?async(g,y)=>{if(!l)throw new Error("canUseTool called before session ID was set");return d.handleAskUserQuestion(l,y)}:e.canUseTool,f=new ss({...e,workdir:s.actualWorkdir,systemPrompt:s.effectiveSystemPrompt,canUseTool:u},i);return l=f.id,this.registry.add(f),this.metrics.incrementLaunched(),this.runtimeBootstrap.initializeSession(f,s,e,n)}async spawnAndAwaitRunning(e,n={}){let r=this.spawn(e,n);return await this.waitForRunningSession(r),r}async waitForRunningSession(e){if(e.status==="running")return;if(Kh.has(e.status))throw new Error(this.describeLaunchFailure(e));let n=e.on?.bind(e),r=e.off?.bind(e)??e.removeListener?.bind(e);if(!n||!r)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}Kh.has(l)&&(a(),i(new Error(this.describeLaunchFailure(e))))},a=()=>{r("statusChange",s)};n("statusChange",s)})}describeLaunchFailure(e){let n=e.killReason?` (reason: ${e.killReason})`:"",r=e.error||e.result?.result||`status=${e.status}${n}`;return`Session ${e.name} [${e.id}] failed to start: ${r}`}formatLaunchResult(e,n){return yi({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},n)}shouldRunWorktreeStrategy(e){let n=e.lifecycle;return!(n==="starting"||n==="awaiting_plan_decision"||n==="awaiting_user_input"||e.pendingPlanApproval)}makeActionButton(e,n,r,o={}){return this.interactions.makeActionButton(e,n,r,o)}consumeActionToken(e){return this.interactions.consumeActionToken(e)}getActionToken(e){return this.interactions.getActionToken(e)}clearPlanDecisionTokens(e,n){this.interactions.clearPlanDecisionTokens(e,n)}isCurrentPendingPlanDecision(e,n){let r=this.resolve(e)??this.getPersistedSession(e);return bo(r,n)}dispatchPlanApprovalFallback(e,n,r){let o=new Date().toISOString();this.notifications.dispatch(e,{label:"plan-approval-fallback",userMessage:wo({session:e,summary:r}),notifyUser:"always",shouldDispatch:()=>this.isCurrentPendingPlanDecision(e.id,n),hooks:{onNotifyStarted:()=>{this.updatePersistedSession(e.id,{approvalPromptRequiredVersion:n,approvalPromptVersion:n,approvalPromptStatus:"sending",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"explicit_fallback_text",approvalPromptLastAttemptAt:o})},onNotifySucceeded:()=>{this.updatePersistedSession(e.id,{approvalPromptRequiredVersion:n,approvalPromptVersion:n,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:n,approvalPromptVersion:n,approvalPromptStatus:"failed",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"explicit_fallback_text",approvalPromptLastAttemptAt:o,approvalPromptFailedAt:new Date().toISOString()})}},wakeMessageOnNotifySuccess:vr(e,n,!0),wakeMessageOnNotifyFailed:Xs({session:e,planDecisionVersion:n})})}getWorktreeDecisionButtons(e){let n=this.resolve(e)??this.getPersistedSession(e);if(!(!n||n.worktreeStrategy==="delegate"))return this.interactions.getWorktreeDecisionButtons(e,n)}getWorktreeCompletionState(e,n,r,o){return this.worktrees.getCompletionState(e,n,r,o)}notifyWorktreeOutcome(e,n){this.notifications.notifyWorktreeOutcome(e,n)}requestPlanApprovalFromUser(e,n){let r=n.trim();if(!r)return"Error: summary must not be empty.";let o=eu(r),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=ne(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(Io(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 u=this.interactions.getPlanApprovalButtons(d,{...a,planDecisionVersion:l}),f=[`\u{1F4CB} [${a.name}] Plan v${l??"?"} needs your decision:`,"","Why this was escalated:","",o,"","Choose Approve, Revise, or Reject below."].join(`
|
|
217
|
-
`);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:f,notifyUser:"always",buttons:u,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()})}},shouldDispatch:()=>this.isCurrentPendingPlanDecision(d,l),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:
|
|
218
|
-
`),buttons:[[this.makeActionButton(n,"worktree-create-pr","Open PR")]]})}getStoppedStatusLabel(e){return
|
|
217
|
+
`)}}buildDelegateNotification(e){let{session:n,branchName:r,baseBranch:o,diffSummary:i,originThreadLine:s}=e,a=i.commitMessages.slice(0,5).map(u=>`\u2022 ${u.hash} ${u.message} (${u.author})`),d=i.commits>5?`...and ${i.commits-5} more`:void 0,l=n.prompt?n.prompt.slice(0,500):"(no prompt)";return{label:"worktree-delegate",wakeMessage:Ql({sessionName:n.name,sessionId:n.id,branchName:r,baseBranch:o,promptSnippet:l,commitLines:a,moreNote:d,originThreadLine:s,diffSummary:i}),notifyUser:"never"}}};function Uh(t,e=1e3){let n=!Number.isFinite(e),r=typeof t.getOutput=="function"?t.getOutput():[],o=n?r.join(`
|
|
218
|
+
`):uA(t);return n?o:o.length>e?Kh(t)?Ki(o,e):Df(o,e):o}function uA(t){let e=typeof t.getOutput=="function"?t.getOutput():[],n=e.join(`
|
|
219
|
+
`).trim();return n?Kh(t)?pA(n)??n:e.slice(-20).join(`
|
|
220
|
+
`):""}function Kh(t){if(t.status==="completed"||t.killReason==="done")return!0;let e=t;return e.approvalState==="approved"||e.planModeApproved===!0||(e.planDecisionVersion??0)>0}function pA(t){let n=t.split(/\n\s*\n+/).map(r=>r.trim()).filter(r=>/[A-Za-z0-9]/.test(r)).at(-1);if(n)return n.length>=120||n.includes(`
|
|
221
|
+
`)?n:void 0}sn();rt();Te();import{unlinkSync as cA}from"fs";var aa=class t{timers=new Map;disposed=!1;static MAX_DELAY_MS=2147483647;schedule(e,n,r){if(this.disposed)return;this.cancel(e);let o=Math.max(0,n-Date.now()),i=setTimeout(()=>{if(this.timers.delete(e),!this.disposed){if(n-Date.now()>0){this.schedule(e,n,r);return}r()}},Math.min(o,t.MAX_DELAY_MS));i.unref?.(),this.timers.set(e,i)}cancel(e){let n=this.timers.get(e);n&&(clearTimeout(n),this.timers.delete(e))}cancelPrefix(e){for(let n of this.timers.keys())n.startsWith(e)&&this.cancel(n)}dispose(){this.disposed=!0;for(let e of this.timers.values())clearTimeout(e);this.timers.clear()}};he();yo();rt();var Vh=10080*60*1e3,mA=300*1e3,qh="tmp-output:cleanup";function fA(t){return t instanceof Error?t.message:String(t)}var da=class{constructor(e){this.deps=e}deps;scheduler=new aa;schedule(e,n,r){this.scheduler.schedule(e,n,r)}cancel(e){this.scheduler.cancel(e)}cancelPrefix(e){this.scheduler.cancelPrefix(e)}bootstrapMaintenanceSchedules(){let e=Date.now();this.deps.store.cleanupTmpOutputFiles(e);for(let n of this.deps.store.listPersistedSessions())this.syncPersistedSessionMaintenance(n);this.syncActionTokenExpiryDeadline(),this.deps.store.cleanupOrphanOutputFiles(),this.syncTmpOutputCleanupDeadline(e)}syncRuntimeGcDeadline(e){if(!e.completedAt)return;let n=this.runtimeGcKey(e.id);this.schedule(n,e.completedAt+this.runtimeGcMaxAgeMs(),()=>{let r=this.deps.sessions.get(e.id);if(!r||!r.completedAt)return;let o=this.runtimeGcMaxAgeMs();if(!this.deps.store.shouldGcActiveSession(r,Date.now(),o)){this.syncRuntimeGcDeadline(r);return}this.deps.removeRuntimeSession(e.id),this.deps.persistSession(r,{scheduleRuntimeGc:!1}),this.deps.clearRuntimeSessionState(e.id)})}cancelRuntimeGc(e){this.cancel(this.runtimeGcKey(e))}cancelPersistedMaintenance(e){let n=this.persistedMaintenanceRef(e);n&&this.cancelPrefix(`persisted:${n}:`)}syncPersistedSessionMaintenance(e){let n=this.persistedMaintenanceRef(e);if(!n)return;this.cancel(this.persistedMaintenanceKey(n,"worktree-reminder"));let r=this.deps.reminders.getNextReminderAt(e);r!=null?this.schedulePersistedWorktreeReminder(n,r):this.deps.reminders.clearResolvedReminderState(e),this.cancel(this.persistedMaintenanceKey(n,"worktree-retention"));let o=Ln(e,{activeSession:!1,includePrSync:e.worktreeLifecycle?.state==="pr_open"||!!e.worktreePrUrl}),i=this.resolvedAtIso(e),s=this.isLegacyResolvedWorktree(e);if((o.cleanupSafe||s)&&typeof i=="string"){let a=new Date(i).getTime();Number.isFinite(a)&&this.schedule(this.persistedMaintenanceKey(n,"worktree-retention"),a+Vh,()=>{let d=this.deps.store.getPersistedSession(n);d&&this.reconcileResolvedWorktreeRetention(d,Date.now())})}}reconcileResolvedWorktreeRetention(e,n){let r=Ln(e,{activeSession:!1,includePrSync:e.worktreeLifecycle?.state==="pr_open"||!!e.worktreePrUrl}),o=this.resolvedAtIso(e),i=o?new Date(o).getTime():0,s=this.isLegacyResolvedWorktree(e);if(!(!r.cleanupSafe&&!s||!i||n-i<Vh))try{if(!e.worktreePath&&!We(e))return;let a=this.deps.resolveWorktreeRepoDir(e.workdir,e.worktreePath);if(!a)return;let d=We(e)?!1:nt(a,e.worktreePath);if(!We(e)&&!d)return;for(let l of Ge(e))this.deps.updatePersistedSession(l,{worktreePath:void 0,worktreeBranch:void 0,worktreeState:"none",worktreeLifecycle:{...e.worktreeLifecycle??r.lifecycle,state:r.derivedState,updatedAt:new Date(n).toISOString(),resolvedAt:e.worktreeLifecycle?.resolvedAt??new Date(n).toISOString(),resolutionSource:e.worktreeLifecycle?.resolutionSource??"maintenance",notes:r.reasons}})}catch(a){console.warn(`[SessionManager] Failed maintenance cleanup for worktree ${e.worktreePath}: ${fA(a)}`)}}syncActionTokenExpiryDeadline(){let e="tokens:expiry";this.cancel(e);let n=this.deps.store.getNextActionTokenExpiry();n!=null&&this.schedule(e,n,()=>{this.deps.store.purgeExpiredActionTokens(Date.now())})}syncTmpOutputCleanupDeadline(e=Date.now()){this.cancel(qh);let n=this.deps.store.getNextTmpOutputCleanupAt(e);n!=null&&this.schedule(qh,n,()=>{let r=Date.now();this.deps.store.cleanupTmpOutputFiles(r),this.syncTmpOutputCleanupDeadline(r)})}enforcePersistedRetention(){let e=this.deps.store.evictOldestPersisted(this.deps.getMaxPersistedSessions());for(let n of e)this.cancelPersistedMaintenance(n),n.sessionId&&this.cancelRuntimeGc(n.sessionId),this.cleanupOutputPathIfUnreferenced(n.outputPath)}dispose(){this.scheduler.dispose()}persistedMaintenanceRef(e){return e.sessionId??M(e)??e.harnessSessionId}runtimeGcKey(e){return`runtime-gc:${e}`}persistedMaintenanceKey(e,n){return`persisted:${e}:${n}`}runtimeGcMaxAgeMs(){return(_.sessionGcAgeMinutes??1440)*6e4}schedulePersistedWorktreeReminder(e,n){let r=this.persistedMaintenanceKey(e,"worktree-reminder");this.schedule(r,n,()=>{let o=this.deps.store.getPersistedSession(e);if(!o||this.deps.reminders.sendReminderIfDue(o,Date.now()))return;let s=this.deps.reminders.getNextReminderAt(o);s!=null&&this.schedulePersistedWorktreeReminder(e,Math.max(s,Date.now()+mA))})}cleanupOutputPathIfUnreferenced(e){if(!(!e||this.deps.store.hasOutputPathReference(e)))try{cA(e)}catch{}}resolvedAtIso(e){return e.worktreeLifecycle?.resolvedAt??e.worktreeMergedAt??e.worktreeDismissedAt??(e.completedAt?new Date(e.completedAt).toISOString():void 0)}isLegacyResolvedWorktree(e){return e.worktreeMerged===!0||e.worktreeDisposition==="dismissed"||e.worktreeDisposition==="no-change-cleaned"||e.worktreeState==="merged"||e.worktreeState==="dismissed"}};var jh=new Set(["completed","failed","killed"]),gA=new Set(["starting","running"]),hA=5e3,la=class{registry;sessions;maxSessions;maxPersistedSessions;lastWaitingEventTimestamps=new Map;lastTurnCompleteMarkers=new Map;lastTerminalWakeMarkers=new Map;mergeQueue=new Ir;pendingAskUserQuestions=new Map;store;metrics;wakeDispatcher;interactions;notifications;worktrees;questions;reminders;lifecycle;restore;stateSync;references;worktreeStrategy;worktreeDecisions;runtimeBootstrap;worktreeMessages;maintenance;constructor(e=20,n=50,r={}){this.maxSessions=e,this.maxPersistedSessions=n,this.registry=new oa,this.sessions=this.registry.sessions,this.store=new Us(r.store),this.metrics=new Ks,this.wakeDispatcher=new zs,this.interactions=new Qs(this.store.actionTokenStore,ln),this.references=new _s(this.sessions,this.store),this.stateSync=new Ms({store:this.store,sessions:this.sessions,resolveSession:o=>this.references.resolveActive(o)}),this.notifications=new Js(this.wakeDispatcher,(o,i)=>this.stateSync.applySessionPatch(o,i)),this.worktrees=new Ys,this.restore=new Cs(o=>this.store.getPersistedSession(o)),this.worktreeMessages=new sa,this.worktreeStrategy=new Os({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:is,spawnConflictResolver:async({session:o,worktreePath:i,prompt:s})=>this.spawn({prompt:s,workdir:i,name:`${o.name}-conflict-resolver`,harness:o.harnessName||Le(),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(()=>(Ps(),Tg));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 ea(o=>this.buildRoutingProxy(o),(o,i)=>this.notifications.dispatch(o,i),(o,i)=>this.updatePersistedSession(o,i),o=>this.getWorktreeDecisionButtons(o)),this.maintenance=new da({store:this.store,sessions:this.sessions,reminders:this.reminders,removeRuntimeSession:o=>this.registry.remove(o),persistSession:(o,i)=>this.persistSession(o,i),clearRuntimeSessionState:o=>{this.lastWaitingEventTimestamps.delete(o),this.lastTurnCompleteMarkers.delete(o),this.lastTerminalWakeMarkers.delete(o)},resolveWorktreeRepoDir:(o,i)=>this.resolveWorktreeRepoDir(o,i),updatePersistedSession:(o,i)=>this.updatePersistedSession(o,i),getMaxPersistedSessions:()=>this.maxPersistedSessions}),this.store.onActionTokensChanged(()=>this.syncActionTokenExpiryDeadline()),this.lifecycle=new na({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 ra({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 ia({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)}syncRuntimeGcDeadline(e){this.maintenance.syncRuntimeGcDeadline(e)}cancelPersistedMaintenance(e){this.maintenance.cancelPersistedMaintenance(e)}onPersistedSessionChanged(e){e&&(this.syncPersistedSessionMaintenance(e),this.enforcePersistedRetention())}syncPersistedSessionMaintenance(e){this.maintenance.syncPersistedSessionMaintenance(e)}reconcileResolvedWorktreeRetention(e,n){this.maintenance.reconcileResolvedWorktreeRetention(e,n)}syncActionTokenExpiryDeadline(){this.maintenance.syncActionTokenExpiryDeadline()}syncTmpOutputCleanupDeadline(e=Date.now()){this.maintenance.syncTmpOutputCleanupDeadline(e)}enforcePersistedRetention(){this.maintenance.enforcePersistedRetention()}bootstrapMaintenanceSchedules(){this.maintenance.bootstrapMaintenanceSchedules()}disposeMaintenance(){this.maintenance.dispose()}spawn(e,n={}){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 g=this.registry.get(e.sessionIdOverride);if(g?.status==="starting"||g?.status==="running")throw new Error(`Cannot reuse session ID ${e.sessionIdOverride}: that session is still ${g.status}.`);g&&this.registry.remove(g.id),this.lastWaitingEventTimestamps.delete(e.sessionIdOverride),this.lastTurnCompleteMarkers.delete(e.sessionIdOverride),this.lastTerminalWakeMarkers.delete(e.sessionIdOverride),this.maintenance.cancelRuntimeGc(e.sessionIdOverride)}let o=e.name||$f(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,u=a==="claude-code"&&!e.canUseTool?async(g,y)=>{if(!l)throw new Error("canUseTool called before session ID was set");return d.handleAskUserQuestion(l,y)}:e.canUseTool,f=new ds({...e,workdir:s.actualWorkdir,systemPrompt:s.effectiveSystemPrompt,canUseTool:u},i);return l=f.id,this.registry.add(f),this.metrics.incrementLaunched(),this.runtimeBootstrap.initializeSession(f,s,e,n)}async spawnAndAwaitRunning(e,n={}){let r=this.spawn(e,n);return await this.waitForRunningSession(r),r}async waitForRunningSession(e){if(e.status==="running")return;if(jh.has(e.status))throw new Error(this.describeLaunchFailure(e));let n=e.on?.bind(e),r=e.off?.bind(e)??e.removeListener?.bind(e);if(!n||!r)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}jh.has(l)&&(a(),i(new Error(this.describeLaunchFailure(e))))},a=()=>{r("statusChange",s)};n("statusChange",s)})}describeLaunchFailure(e){let n=e.killReason?` (reason: ${e.killReason})`:"",r=e.error||e.result?.result||`status=${e.status}${n}`;return`Session ${e.name} [${e.id}] failed to start: ${r}`}formatLaunchResult(e,n){return wi({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},n)}shouldRunWorktreeStrategy(e){let n=e.lifecycle;return!(n==="starting"||n==="awaiting_plan_decision"||n==="awaiting_user_input"||e.pendingPlanApproval)}makeActionButton(e,n,r,o={}){return this.interactions.makeActionButton(e,n,r,o)}consumeActionToken(e){return this.interactions.consumeActionToken(e)}getActionToken(e){return this.interactions.getActionToken(e)}clearPlanDecisionTokens(e,n){this.interactions.clearPlanDecisionTokens(e,n)}isCurrentPendingPlanDecision(e,n){let r=this.resolve(e)??this.getPersistedSession(e);return To(r,n)}dispatchPlanApprovalFallback(e,n,r){let o=new Date().toISOString();this.notifications.dispatch(e,{label:"plan-approval-fallback",userMessage:Ao({session:e,summary:r}),notifyUser:"always",shouldDispatch:()=>this.isCurrentPendingPlanDecision(e.id,n),hooks:{onNotifyStarted:()=>{this.updatePersistedSession(e.id,{approvalPromptRequiredVersion:n,approvalPromptVersion:n,approvalPromptStatus:"sending",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"explicit_fallback_text",approvalPromptLastAttemptAt:o})},onNotifySucceeded:()=>{this.updatePersistedSession(e.id,{approvalPromptRequiredVersion:n,approvalPromptVersion:n,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:n,approvalPromptVersion:n,approvalPromptStatus:"failed",approvalPromptTransport:"direct-message",approvalPromptMessageKind:"explicit_fallback_text",approvalPromptLastAttemptAt:o,approvalPromptFailedAt:new Date().toISOString()})}},wakeMessageOnNotifySuccess:br(e,n,!0),wakeMessageOnNotifyFailed:ta({session:e,planDecisionVersion:n})})}getWorktreeDecisionButtons(e){let n=this.resolve(e)??this.getPersistedSession(e);if(!(!n||n.worktreeStrategy==="delegate"))return this.interactions.getWorktreeDecisionButtons(e,n)}getWorktreeCompletionState(e,n,r,o){return this.worktrees.getCompletionState(e,n,r,o)}notifyWorktreeOutcome(e,n){this.notifications.notifyWorktreeOutcome(e,n)}requestPlanApprovalFromUser(e,n){let r=n.trim();if(!r)return"Error: summary must not be empty.";let o=tu(r),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=ne(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(Ro(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 u=this.interactions.getPlanApprovalButtons(d,{...a,planDecisionVersion:l}),f=[`\u{1F4CB} [${a.name}] Plan v${l??"?"} needs your decision:`,"","Why this was escalated:","",o,"","Choose Approve, Revise, or Reject below."].join(`
|
|
222
|
+
`);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:f,notifyUser:"always",buttons:u,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()})}},shouldDispatch:()=>this.isCurrentPendingPlanDecision(d,l),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:br({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:ne(e)??M(e)??e.harnessSessionId??"unknown-session",name:e.name,harnessSessionId:e.harnessSessionId,backendRef:e.backendRef?{...e.backendRef}:void 0,route:e.route}}resolveWorktreeRepoDir(e,n){return e&&(!n||!Ts(e,n))||!n?e:ts(n)??e}formatLaunchWorkdirLabel(e){if(!e.worktreePath)return e.workdir;let n=this.resolveWorktreeRepoDir(e.originalWorkdir,e.worktreePath);return!n||n===e.worktreePath?e.worktreePath:`${e.worktreePath} (worktree of ${n})`}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 n=e.autoMergeParentSessionId;if(!n)return;let r=this.resolve(n),o=this.getPersistedSession(n),i=r??(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 ${n} could not be found.`);return}if(e.status==="completed"&&r){this.updatePersistedSession(n,{autoMergeResolverSessionId:void 0}),await this.handleWorktreeStrategy(r);return}let s=r?.worktreeBranch??o?.worktreeBranch??"unknown",a=r?.worktreePath??o?.worktreePath??"(unknown worktree)",d=r?.worktreeBaseBranch??o?.worktreeBaseBranch,l=r?.worktreePrTargetRepo??o?.worktreePrTargetRepo,u=r?.worktreePushRemote??o?.worktreePushRemote;this.updatePersistedSession(n,$s({worktreeBaseBranch:d,worktreePrTargetRepo:l,worktreePushRemote:u},{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(`
|
|
223
|
+
`),buttons:[[this.makeActionButton(n,"worktree-create-pr","Open PR")]]})}getStoppedStatusLabel(e){return xo(e)}persistSession(e,n={}){let r=n.scheduleRuntimeGc??!0;this.store.hasRecordedSession(e.id)||this.metrics.recordSession(e),this.store.persistTerminal(e),r&&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,n,r="notification"){this.dispatchSessionNotification(e,{label:r,userMessage:n,notifyUser:"always"})}sendPlanOffer(e){let n=this.interactions.getPlanOfferButtons({offerId:e.offerId,route:e.route,planName:e.planName,planPrompt:e.planPrompt,planWorkdir:e.planWorkdir,planWorktreeStrategy:e.planWorktreeStrategy});this.dispatchSessionNotification(this.buildRoutingProxy({id:e.offerId,route:e.route}),{label:"plan-offer",userMessage:e.text,notifyUser:"always",buttons:n})}emitGoalTaskUpdate(e,n,r="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:r,userMessage:n,notifyUser:"always"})}launchPlanOffer(e){let n=e.route??{provider:"system",target:"system"};return this.spawn({prompt:e.prompt,workdir:e.workdir,name:e.name,harness:Le(),permissionMode:"plan",planApproval:"ask",worktreeStrategy:e.worktreeStrategy??"off",multiTurn:!0,route:n,originChannel:this.originChannelFromRoute(n),originThreadId:n.threadId,originSessionKey:n.sessionKey})}dispatchSessionNotification(e,n){this.notifications.dispatch(e,n)}originChannelFromRoute(e){return e.accountId?`${e.provider}|${e.accountId}|${e.target}`:`${e.provider}|${e.target}`}debounceWaitingEvent(e){let n=Date.now(),r=this.lastWaitingEventTimestamps.get(e);return r&&n-r<hA?!1:(this.lastWaitingEventTimestamps.set(e,n),!0)}originThreadLine(e){return Ym(e)}extractLastOutputLine(e){return e.getOutput(3).filter(o=>o.trim()).pop()?.trim()||void 0}getOutputPreview(e,n=1e3){return Uh(e,n)}triggerAgentEvent(e){this.lifecycle.emitCompleted(e)}triggerFailedEvent(e,n,r=!1){this.lifecycle.emitFailed(e,n,r)}triggerWaitingForInputEvent(e){this.lifecycle.emitWaitingForInput(e)}resolvePlanApprovalMode(e){return e.planApproval??_.planApproval??"delegate"}onTurnEnd(e,n){this.lifecycle.handleTurnEnd(e,n)}shouldEmitTurnCompleteWake(e){let n=`${e.result?.session_id??""}|${e.result?.num_turns??0}|${e.result?.duration_ms??0}`;return this.lastTurnCompleteMarkers.get(e.id)===n?(console.info(`[SessionManager] shouldEmitTurnCompleteWake: debounced for session ${e.id} (marker unchanged: ${n})`),!1):(this.lastTurnCompleteMarkers.set(e.id,n),!0)}shouldEmitTerminalWake(e){let n=`${e.status}|${e.completedAt??0}|${e.result?.session_id??""}|${e.result?.num_turns??0}|${e.killReason}`;return this.lastTerminalWakeMarkers.get(e.id)===n?!1:(this.lastTerminalWakeMarkers.set(e.id,n),!0)}triggerTurnCompleteEventWithSignal(e){this.lifecycle.emitTurnComplete(e)}resolve(e){return this.references.resolveActive(e)}get(e){return this.registry.get(e)}list(e){let n=this.registry.list();return e&&e!=="all"&&(n=n.filter(r=>r.status===e)),n.sort((r,o)=>o.startedAt-r.startedAt)}kill(e,n){let r=this.registry.get(e);if(!r)return!1;if(r.pendingPlanApproval){this.clearPlanDecisionTokens(r.id);let o={lifecycle:"terminal",runtimeState:"stopped",pendingPlanApproval:!1,planApprovalContext:void 0,approvalState:r.approvalState==="pending"?"rejected":r.approvalState,planDecisionVersion:(r.planDecisionVersion??0)+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};r.applyControlPatch(o),Object.assign(r,o),this.updatePersistedSession(r.id,o)}return r.kill(n??"user"),!0}killAll(e="user"){for(let n of this.sessions.values())gA.has(n.status)&&this.kill(n.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 n=this.store.getPersistedSession(e);return n?.worktreeMerged===!0||n?.worktreeLifecycle?.state==="merged"||n?.worktreeLifecycle?.state==="released"}async enqueueMerge(e,n,r){return this.mergeQueue.enqueue(e,n,r)}updatePersistedSession(e,n){let r=this.stateSync.applySessionPatch(e,n);return r&&this.onPersistedSessionChanged(this.store.getPersistedSession(e)),r}listPersistedSessions(){return this.store.listPersistedSessions()}async handleAskUserQuestion(e,n){let r=this.sessions.get(e);if(!r)throw new Error(`Session "${e}" not found for AskUserQuestion intercept`);return this.questions.handleAskUserQuestion(r,n)}resolveAskUserQuestion(e,n){this.questions.resolveAskUserQuestion(e,n)}async resolvePendingInputOption(e,n){let r=this.sessions.get(e);return r&&await r.submitPendingInputOption(n)?(this.lastWaitingEventTimestamps.delete(e),!0):(this.questions.resolveAskUserQuestion(e,n),!0)}dispose(){this.disposeMaintenance(),this.questions.dispose(),this.notifications.dispose()}};Y();Te();var Hh=class{#t;#n;#e=new Map;constructor(t){this.#t=Gh(t,1),this.#n=this.#t}get maxEntries(){return this.#n}get size(){return this.#e.size}setMaxEntriesForTest(t){this.#n=typeof t=="number"?Gh(t,this.#t):this.#t,this.#r()}clear(){this.#e.clear()}get(t){let e=this.getResult(t);return e.hit?e.value:void 0}getResult(t){if(!this.#e.has(t))return{hit:!1};let e=this.#e.get(t);return this.#e.delete(t),this.#e.set(t,e),{hit:!0,value:e}}set(t,e){this.#e.has(t)&&this.#e.delete(t),this.#e.set(t,e),this.#r()}#r(){for(;this.#e.size>this.#n;){let t=this.#e.keys().next();if(t.done)break;this.#e.delete(t.value)}}};function Gh(t,e){return!Number.isFinite(t)||t<=0?e:Math.max(1,Math.floor(t))}var SA="\\x1b\\[[\\x20-\\x3f]*[\\x40-\\x7e]",yA="\\x1b\\][^\\x07\\x1b]*(?:\\x1b\\\\|\\x07)",IH=new RegExp(SA,"g"),bH=new RegExp(yA,"g"),xH=typeof Intl<"u"&&"Segmenter"in Intl?new Intl.Segmenter(void 0,{granularity:"grapheme"}):null;import{createRequire as kA}from"node:module";var NH=kA(import.meta.url);var FH=new Hh(512);function zh(t){return{success:!1,error:{issues:[{path:[],message:t}]}}}function ou(){return{safeParse(t){return t===void 0?{success:!0,data:void 0}:!t||typeof t!="object"||Array.isArray(t)?zh("expected config object"):Object.keys(t).length>0?zh("config must be empty"):{success:!0,data:t}},jsonSchema:{type:"object",additionalProperties:!1,properties:{}}}}function vA(t,e){let n=!1,r;return()=>(n||(r=(typeof t=="function"?t():t)??e,n=!0),r)}function ua({id:t,name:e,description:n,kind:r,configSchema:o=ou,reload:i,nodeHostCommands:s,securityAuditCollectors:a,register:d}){let l=vA(o);return{id:t,name:e,description:n,...r?{kind:r}:{},...i?{reload:i}:{},...s?{nodeHostCommands:s}:{},...a?{securityAuditCollectors:a}:{},get configSchema(){return l()},register:d}}function xA(t){let e=parseInt(process.env.OPENCLAW_WORKTREE_CLEANUP_AGE_HOURS??"168",10)||168,n=e*60*60*1e3,r=Date.now()-n,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=bA("git",["rev-parse","--show-toplevel"],{cwd:d.workdir,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();l&&i.add(Qh(l,".worktrees"))}catch{}if(i.size===0)return;let a=0;for(let d of i)try{let l=PA(d);for(let u of l){if(!u.startsWith("openclaw-worktree-"))continue;let f=Qh(d,u);try{let g=wA(f);if(!g.isDirectory()||g.mtimeMs>r||o.has(f))continue;IA(f,{recursive:!0,force:!0}),a++}catch(g){console.warn(`[index] Failed to clean up orphaned worktree ${f}: ${g instanceof Error?g.message:String(g)}`)}}}catch{}a>0&&console.info(`[index] Cleaned up ${a} orphaned worktree(s) at startup (age > ${e}h)`)}function AA(t){let e=null,n=null,r=!1,o=!1,i=t.registerTool;mr(t.runtime);let s=f=>{if(r){f&&!o&&(mr(t.runtime,f.config),o=!0);return}let g=t.pluginConfig??{};ef(g),f?(mr(t.runtime,f.config),o=!0):(mr(t.runtime),o=!1),e=new la(_.maxSessions,_.maxPersistedSessions),n=new Rs(e),Qd(e),Jd(n),n.start(),xA(e),e.bootstrapMaintenanceSchedules(),r=!0},a=()=>{n&&n.stop(),e&&e.killAll("shutdown"),e&&e.dispose(),n=null,e=null,r=!1,o=!1,mr(void 0),Jd(null),Qd(null)},d=(f,g)=>{i(y=>(s(),f(y)),g)},l={...t,registerCommand(f){t.registerCommand({...f,handler:g=>(s(),f.handler(g))})}},u=f=>{let g=Bg(f);t.registerInteractiveHandler({...g,handler:async y=>(s(),g.handler(y))})};d(f=>Kf(f),{optional:!1,name:"agent_launch"}),d(f=>gg(f),{optional:!1,name:"agent_sessions"}),d(f=>hg(f),{optional:!1,name:"agent_kill"}),d(f=>cs(f),{optional:!1,name:"agent_output"}),d(f=>wg(f),{optional:!1,name:"agent_respond"}),d(f=>Ig(f),{optional:!1,name:"agent_request_plan_approval"}),d(f=>xg(f),{optional:!1,name:"agent_send_plan_offer"}),d(f=>Ag(f),{optional:!1,name:"agent_stats"}),d(f=>vs(f),{optional:!1,name:"agent_merge"}),d(f=>Po(f),{optional:!1,name:"agent_pr"}),d(f=>Cg(f),{optional:!1,name:"agent_worktree_cleanup"}),d(f=>Mg(f),{optional:!1,name:"agent_worktree_status"}),d(f=>_g(f),{optional:!1,name:"goal_launch"}),d(f=>$g(f),{optional:!1,name:"goal_status"}),d(f=>Og(f),{optional:!1,name:"goal_stop"}),u("telegram"),u("discord"),Kg(l),Vg(l),qg(l),jg(l),Gg(l),Hg(l),Qg(l),Jg(l),Yg(l),t.registerService({id:"openclaw-code-agent",start:s,stop:a})}var _z=ua({id:"openclaw-code-agent",name:"OpenClaw Code Agent",description:"Multi-session coding-agent orchestration from OpenClaw chat",register:AA});export{_z as default,AA as register};
|