oh-my-pr 2.8.0 → 2.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/tui.mjs CHANGED
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env node
2
- var Mi=Object.defineProperty;var $i=(r,e)=>{for(var t in e)Mi(r,t,{get:e[t],enumerable:!0})};import dc from"react";import{render as lc}from"ink";import ye,{useEffect as Ua,useMemo as Yi,useState as an}from"react";import{Box as pr,Text as mr,useApp as Zi,useInput as eo,useStdout as to}from"ink";import{useEffect as Ui,useState as Be}from"react";function pa(r,e,t=1500){let[n,a]=Be([]),[s,i]=Be(null),[o,c]=Be([]),[p,m]=Be([]),[u,g]=Be([]),[P,A]=Be(null),[w,k]=Be(null),[X,M]=Be(!0),[E,N]=Be(null);return Ui(()=>{let H=!1,d=async()=>{try{let[S,_,v,b]=await Promise.all([r.listPRs("active"),r.listRepos(),r.getConfig(),r.getRuntimeSnapshot()]),B=e?await r.getPR(e):S[0]??null,[G,Z]=B?await Promise.all([r.listLogs(B.id),r.listPRQuestions(B.id)]):[[],[]];if(H)return;a(S),g(_),A(v),k(b),i(B),c(G),m(Z),N(null)}catch(S){if(H)return;N(S instanceof Error?S.message:String(S))}finally{H||M(!1)}};d();let y=r.subscribe(()=>{d()}),h=t>0?setInterval(()=>{d()},t):null;return()=>{H=!0,y(),h&&clearInterval(h)}},[r,e,t]),{prs:n,selectedPr:s,logs:o,questions:p,repos:u,config:P,runtime:w,loading:X,error:E,refresh:async()=>{let H=await r.listPRs("active"),d=await r.listRepos(),y=await r.getConfig(),h=await r.getRuntimeSnapshot(),S=e?await r.getPR(e):H[0]??null,[_,v]=S?await Promise.all([r.listLogs(S.id),r.listPRQuestions(S.id)]):[[],[]];a(H),g(d),A(y),k(h),i(S),c(_),m(v),M(!1),N(null)}}}import{useEffect as zr,useState as je}from"react";function _e(r,e){return e<=0?0:Math.max(0,Math.min(r,e-1))}function ma(r){let[e,t]=je("prs"),[n,a]=je("logs"),[s,i]=je(0),[o,c]=je(0),[p,m]=je(0),[u,g]=je(0),[P,A]=je(new Set),[w,k]=je("none"),[X,M]=je("");return zr(()=>{i(E=>_e(E,r.prCount))},[r.prCount]),zr(()=>{c(E=>_e(E,r.feedbackCount))},[r.feedbackCount]),zr(()=>{m(E=>_e(E,r.contextItemCount))},[r.contextItemCount]),{activePane:e,contextMode:n,selectedPrIndex:s,selectedFeedbackIndex:o,selectedContextIndex:p,feedbackActionIndex:u,setFeedbackActionIndex(E){g(Math.max(0,E))},expandedFeedbackIds:P,inputMode:w,inputValue:X,cyclePane(){t(E=>E==="prs"?"feedback":E==="feedback"?"context":"prs")},setContextMode(E){a(E),t("context"),m(0),k("none"),M("")},setSelectedPrIndex(E){i(_e(E,r.prCount))},setSelectedFeedbackIndex(E){c(_e(E,r.feedbackCount)),g(0)},moveUp(){if(e==="prs"){i(E=>_e(E-1,r.prCount));return}if(e==="feedback"){c(E=>_e(E-1,r.feedbackCount)),g(0);return}m(E=>_e(E-1,r.contextItemCount))},moveDown(){if(e==="prs"){i(E=>_e(E+1,r.prCount));return}if(e==="feedback"){c(E=>_e(E+1,r.feedbackCount)),g(0);return}m(E=>_e(E+1,r.contextItemCount))},toggleExpandedFeedback(E){A(N=>{let H=new Set(N);return H.has(E)?H.delete(E):H.add(E),H}),g(0)},beginInput(E){k(E),M("")},updateInput(E){M(E)},resetInput(){k("none"),M("")},setSelectedContextIndex(E){m(_e(E,r.contextItemCount))}}}function Vr(r){return r==="processing"?"running":r==="done"?"done":r==="error"?"needs attention":r==="archived"?"archived":"watching"}function ha(r){return r.replace("_"," ").toUpperCase()}function Bi(r){return r.reduce((e,t)=>(t.status==="queued"?e.queued+=1:t.status==="in_progress"?e.inProgress+=1:t.status==="failed"?e.failed+=1:t.status==="warning"&&(e.warning+=1),e),{queued:0,inProgress:0,failed:0,warning:0})}function ji(r){return r==="resolved"||r==="rejected"}function Ji(r){return r.length===0?!1:r.every(e=>ji(e.status))}function fa(r){return r>=150?"full":r>=110?"stacked":"compact-warning"}function ya(r){let e=[`#${r.number}`,r.title,Vr(r.status)];r.watchEnabled||e.push("watch paused");let t=Bi(r.feedbackItems);return t.queued>0&&e.push(`${t.queued}q`),t.inProgress>0&&e.push(`${t.inProgress} active`),t.failed>0&&e.push(`${t.failed} failed`),t.warning>0&&e.push(`${t.warning} warn`),Ji(r.feedbackItems)&&r.status!=="processing"&&e.push("ready"),e.join(" \xB7 ")}function Gt(r){let e=["Accept","Reject","Flag"];return(r.status==="failed"||r.status==="warning")&&e.push("Retry"),e}function cr(r,e){if(e<=4)return[r];let t=r.replace(/\s+/g," ").trim().split(" ");if(t.length===1&&t[0]==="")return[""];let n=[],a="";for(let s of t){let i=a?`${a} ${s}`:s;i.length>e&&a?(n.push(a),a=s):a=i}return a&&n.push(a),n}function ba(r){return`Tab pane \u2022 arrows move \u2022 Enter select \u2022 r run \u2022 w watch \u2022 l logs \u2022 a ask \u2022 o repos \u2022 s settings \u2022 q quit \u2022 pane=${r}`}import Qr from"react";import{Box as Xi,Text as _a}from"ink";function Ra(r){return Qr.createElement(Xi,{justifyContent:"space-between",borderStyle:"single",paddingX:1},Qr.createElement(_a,{bold:!0},"oh-my-pr tui"),Qr.createElement(_a,null,"agent=",r.config?.codingAgent??"claude"," repos=",r.repoCount," prs=",r.prCount," activeRuns=",r.runtime?.activeRuns??0," pane=",r.activePane," context=",r.contextMode))}import gr from"react";import{Box as Gi,Text as Yr}from"ink";function wa(r){return gr.createElement(Gi,{flexDirection:"column",borderStyle:"single",paddingX:1,width:r.width},gr.createElement(Yr,{bold:!0,color:r.active?"cyan":void 0},"Pull Requests"),r.prs.length===0?gr.createElement(Yr,{dimColor:!0},"No tracked PRs."):r.prs.map((e,t)=>{let n=t===r.selectedPrIndex;return gr.createElement(Yr,{key:e.id,color:n?"cyan":void 0},n?"\u203A ":" ",ya(e))}))}import He from"react";import{Box as Ta,Text as qt}from"ink";import rt from"react";import{Box as Zr,Text as en}from"ink";import Sa from"react";import{Box as qi,Text as Wi}from"ink";function ka(r){return Sa.createElement(qi,{marginTop:1},r.actions.map((e,t)=>Sa.createElement(Wi,{key:e,color:t===r.selectedActionIndex?"green":void 0},t===r.selectedActionIndex?"[*] ":"[ ] ",e,t<r.actions.length-1?" ":"")))}function va(r){return r.items.length===0?rt.createElement(en,{dimColor:!0},"No feedback items yet."):rt.createElement(Zr,{flexDirection:"column"},r.items.map((e,t)=>{let n=t===r.selectedFeedbackIndex,a=r.expandedFeedbackIds.has(e.id),s=n&&a?r.selectedActions:Gt(e),i=cr(e.body,Math.max(20,r.width-8));return rt.createElement(Zr,{key:e.id,flexDirection:"column",marginBottom:1},rt.createElement(en,{color:n?"cyan":void 0},n?"\u203A ":" ","[",ha(e.status),"] ",e.author," ",e.file?`\xB7 ${e.file}${e.line?`:${e.line}`:""}`:""),a&&rt.createElement(Zr,{flexDirection:"column",marginLeft:2},i.map((o,c)=>rt.createElement(en,{key:`${e.id}-${c}`},o)),n&&r.active&&rt.createElement(ka,{actions:s,selectedActionIndex:Math.min(r.selectedActionIndex,s.length-1)})))}))}function Pa(r){return He.createElement(Ta,{flexDirection:"column",borderStyle:"single",paddingX:1,width:r.width,flexGrow:1},He.createElement(qt,{bold:!0,color:r.active?"cyan":void 0},"PR Detail"),r.pr?He.createElement(He.Fragment,null,He.createElement(qt,null,r.pr.repo," #",r.pr.number),He.createElement(qt,{bold:!0},r.pr.title),He.createElement(qt,{dimColor:!0},"status=",Vr(r.pr.status)," watch=",r.pr.watchEnabled?"on":"paused"," feedback=",r.pr.feedbackItems.length),He.createElement(Ta,{marginTop:1},He.createElement(va,{items:r.pr.feedbackItems,selectedFeedbackIndex:r.selectedFeedbackIndex,active:r.active,expandedFeedbackIds:r.expandedFeedbackIds,selectedActionIndex:r.selectedActionIndex,selectedActions:r.selectedActions,width:r.width??80}))):He.createElement(qt,{dimColor:!0},"Select a PR."))}import Ke from"react";import{Box as Ha,Text as La}from"ink";import tn from"react";import{Box as Ki,Text as Ea}from"ink";function xa(r){let e=r.logs.slice(-10);return e.length===0?tn.createElement(Ea,{dimColor:!0},"No log entries."):tn.createElement(Ki,{flexDirection:"column"},e.map(t=>tn.createElement(Ea,{key:t.id},new Date(t.timestamp).toLocaleTimeString("en-US",{hour12:!1})," [",t.level,"] ",t.phase?`${t.phase} `:"",t.message)))}import We from"react";import{Box as Aa,Text as Tt}from"ink";function Ca(r){return We.createElement(Aa,{flexDirection:"column"},r.questions.length===0?We.createElement(Tt,{dimColor:!0},"Press Enter to ask about the selected PR."):r.questions.slice(-6).map(e=>We.createElement(Aa,{key:e.id,flexDirection:"column",marginBottom:1},We.createElement(Tt,{color:"cyan"},"Q: ",e.question),e.status==="answered"&&e.answer?cr(e.answer,Math.max(20,r.width-4)).map((t,n)=>We.createElement(Tt,{key:`${e.id}-${n}`},t)):e.status==="error"?We.createElement(Tt,{color:"red"},"Error: ",e.error??"Unknown error"):We.createElement(Tt,{dimColor:!0},"Agent is thinking..."))),We.createElement(Tt,{color:r.inputMode?"green":void 0},r.inputMode?`Ask: ${r.inputValue||"\u2026"}`:"Enter to compose a question"))}import nt from"react";import{Box as Ia,Text as Wt}from"ink";var zi=["Sync repositories","Add repository","Add PR URL"];function Na(r){return nt.createElement(Ia,{flexDirection:"column"},zi.map((e,t)=>nt.createElement(Wt,{key:e,color:t===r.selectedActionIndex?"cyan":void 0},t===r.selectedActionIndex?"\u203A ":" ",e)),nt.createElement(Ia,{flexDirection:"column",marginTop:1},nt.createElement(Wt,{dimColor:!0},"Tracked repositories"),r.repos.length===0?nt.createElement(Wt,{dimColor:!0},"None yet."):r.repos.map(e=>nt.createElement(Wt,{key:e},e))),r.inputMode!=="none"&&nt.createElement(Wt,{color:"green"},r.inputMode==="addRepo"?"Repo":"PR URL",": ",r.inputValue||"\u2026"))}import rn from"react";import{Box as Vi,Text as Da}from"ink";function Fa(r){let e=[`Coding agent: ${r.config?.codingAgent??"claude"}`,`Auto-resolve conflicts: ${r.config?.autoResolveMergeConflicts?"on":"off"}`,`Auto-update docs: ${r.config?.autoUpdateDocs?"on":"off"}`];return rn.createElement(Vi,{flexDirection:"column"},e.map((t,n)=>rn.createElement(Da,{key:t,color:n===r.selectedIndex?"cyan":void 0},n===r.selectedIndex?"\u203A ":" ",t)),rn.createElement(Da,{dimColor:!0},"Enter toggles the selected setting."))}function Oa(r){return Ke.createElement(Ha,{flexDirection:"column",borderStyle:"single",paddingX:1,width:r.width},Ke.createElement(La,{bold:!0,color:r.active?"cyan":void 0},"Context"),Ke.createElement(La,{dimColor:!0},"logs | ask | repos | settings"),Ke.createElement(Ha,{marginTop:1,flexDirection:"column"},r.mode==="logs"&&Ke.createElement(xa,{logs:r.logs}),r.mode==="ask"&&Ke.createElement(Ca,{questions:r.questions,inputMode:r.inputMode==="ask",inputValue:r.inputValue,width:r.width??40}),r.mode==="repos"&&Ke.createElement(Na,{repos:r.repos,selectedActionIndex:r.selectedContextIndex,inputMode:r.inputMode,inputValue:r.inputValue}),r.mode==="settings"&&Ke.createElement(Fa,{config:r.config,selectedIndex:r.selectedContextIndex})))}import nn from"react";import{Box as Qi,Text as Ma}from"ink";function $a(r){return nn.createElement(Qi,{justifyContent:"space-between",borderStyle:"single",paddingX:1},nn.createElement(Ma,{color:r.errorMessage?"red":"green"},r.errorMessage??r.statusMessage??"Ready"),nn.createElement(Ma,{dimColor:!0},ba(r.contextMode)))}function ro(r){return r==="repos"||r==="settings"?3:0}function no(r){return r instanceof Error?r.message:String(r)}function sn(r){let{exit:e}=Zi(),{stdout:t}=to(),[n,a]=an(null),[s,i]=an(null),o=r.screenWidth??t.columns??160,c=fa(o),[p,m]=an(null),u=pa(r.runtime,p,r.refreshMs??1500),g=ma({prCount:u.prs.length,feedbackCount:u.selectedPr?.feedbackItems.length??0,contextItemCount:3}),P=ro(g.contextMode);Ua(()=>{if(u.prs.length===0){m(null);return}let _=u.prs[g.selectedPrIndex]??u.prs[0];m(_?.id??null)},[u.prs,g.selectedPrIndex]),Ua(()=>{g.selectedContextIndex>=P&&g.setSelectedContextIndex(Math.max(0,P-1))},[P,g]);let A=u.selectedPr??u.prs[g.selectedPrIndex]??null,w=A?.feedbackItems[g.selectedFeedbackIndex]??null,k=w?g.expandedFeedbackIds.has(w.id):!1,X=w?k?["Collapse",...Gt(w)]:Gt(w):[],M=Math.min(g.feedbackActionIndex,Math.max(0,X.length-1)),E=_=>{a(_),i(null)},N=_=>{i(no(_))},H=async _=>{let v=X[M];if(!(!A||!v))try{if(v==="Collapse"){g.toggleExpandedFeedback(_.id);return}if(v==="Retry"){await r.runtime.retryFeedback(A.id,_.id),E("Queued feedback retry");return}let b=v.toLowerCase();await r.runtime.setFeedbackDecision(A.id,_.id,b),E(`Marked feedback as ${b}`)}catch(b){N(b)}},d=async()=>{if(!A&&g.inputMode==="ask"){i("Select a PR first");return}let _=g.inputValue.trim();if(!_){g.resetInput();return}try{g.inputMode==="ask"&&A?(await r.runtime.askQuestion(A.id,_),E("Queued agent question")):g.inputMode==="addRepo"?(await r.runtime.addRepo(_),E("Repository added")):g.inputMode==="addPr"&&(await r.runtime.addPR(_),E("PR added"))}catch(v){N(v)}finally{g.resetInput()}},y=async()=>{if(!u.config)return;let _=u.config,v=null;if(g.selectedContextIndex===0?v={codingAgent:_.codingAgent==="claude"?"codex":"claude"}:g.selectedContextIndex===1?v={autoResolveMergeConflicts:!_.autoResolveMergeConflicts}:g.selectedContextIndex===2&&(v={autoUpdateDocs:!_.autoUpdateDocs}),!!v)try{await r.runtime.updateConfig(v),E("Settings updated")}catch(b){N(b)}},h=async()=>{if(g.contextMode==="ask"){g.beginInput("ask");return}if(g.contextMode==="repos"){if(g.selectedContextIndex===0){try{await r.runtime.syncRepos(),E("Repository sync queued")}catch(_){N(_)}return}if(g.selectedContextIndex===1){g.beginInput("addRepo");return}g.selectedContextIndex===2&&g.beginInput("addPr");return}g.contextMode==="settings"&&await y()};eo((_,v)=>{if(g.inputMode!=="none"){if(v.escape){g.resetInput();return}if(v.return){d();return}if(v.backspace||v.delete){g.updateInput(g.inputValue.slice(0,-1));return}!v.ctrl&&!v.meta&&_&&g.updateInput(`${g.inputValue}${_}`);return}if(v.tab){g.cyclePane();return}if(_==="q"){e();return}if(_==="l"){g.setContextMode("logs");return}if(_==="a"){g.setContextMode("ask");return}if(_==="o"){g.setContextMode("repos");return}if(_==="s"){g.setContextMode("settings");return}if(_==="r"&&A){r.runtime.queueBabysit(A.id).then(()=>{E("Queued babysitter run")}).catch(N);return}if(_==="w"&&A){r.runtime.setWatchEnabled(A.id,!A.watchEnabled).then(()=>{E(A.watchEnabled?"Watch paused":"Watch resumed")}).catch(N);return}if(v.upArrow){g.moveUp();return}if(v.downArrow){g.moveDown();return}if(v.leftArrow&&w){g.setFeedbackActionIndex(Math.max(0,M-1));return}if(v.rightArrow&&w){g.setFeedbackActionIndex(Math.min(X.length-1,M+1));return}if(v.return){if(g.activePane==="feedback"&&w){if(!g.expandedFeedbackIds.has(w.id)){g.toggleExpandedFeedback(w.id);return}H(w);return}g.activePane==="context"&&h()}},{isActive:!0});let S=Yi(()=>c==="full"?{list:40,context:48}:{list:void 0,context:void 0},[c]);return c==="compact-warning"?ye.createElement(pr,{flexDirection:"column",borderStyle:"single",paddingX:1},ye.createElement(mr,{bold:!0},"oh-my-pr tui"),ye.createElement(mr,null,"Window too narrow for the terminal UI."),ye.createElement(mr,{dimColor:!0},"Resize to at least 110 columns.")):ye.createElement(pr,{flexDirection:"column"},ye.createElement(Ra,{runtime:u.runtime,config:u.config,repoCount:u.repos.length,prCount:u.prs.length,activePane:g.activePane,contextMode:g.contextMode}),u.loading?ye.createElement(pr,{borderStyle:"single",paddingX:1},ye.createElement(mr,null,"Loading TUI\u2026")):ye.createElement(pr,{flexDirection:c==="stacked"?"column":"row"},ye.createElement(wa,{prs:u.prs,selectedPrIndex:g.selectedPrIndex,active:g.activePane==="prs",width:S.list}),ye.createElement(Pa,{pr:A,selectedFeedbackIndex:g.selectedFeedbackIndex,active:g.activePane==="feedback",expandedFeedbackIds:g.expandedFeedbackIds,selectedActionIndex:M,selectedActions:X,width:c==="full"?o-S.list-S.context:void 0}),ye.createElement(Oa,{mode:g.contextMode,active:g.activePane==="context",width:S.context,logs:u.logs,questions:u.questions,repos:u.repos,config:u.config,selectedContextIndex:g.selectedContextIndex,inputMode:g.inputMode,inputValue:g.inputValue})),ye.createElement($a,{contextMode:g.contextMode,statusMessage:n,errorMessage:s??u.error}))}import{EventEmitter as oc}from"node:events";var l={};$i(l,{BRAND:()=>Co,DIRTY:()=>at,EMPTY_PATH:()=>oo,INVALID:()=>D,NEVER:()=>md,OK:()=>ie,ParseStatus:()=>te,Schema:()=>$,ZodAny:()=>Qe,ZodArray:()=>qe,ZodBigInt:()=>it,ZodBoolean:()=>ot,ZodBranded:()=>zt,ZodCatch:()=>bt,ZodDate:()=>dt,ZodDefault:()=>yt,ZodDiscriminatedUnion:()=>yr,ZodEffects:()=>Se,ZodEnum:()=>ht,ZodError:()=>me,ZodFirstPartyTypeKind:()=>F,ZodFunction:()=>_r,ZodIntersection:()=>gt,ZodIssueCode:()=>R,ZodLazy:()=>pt,ZodLiteral:()=>mt,ZodMap:()=>It,ZodNaN:()=>Dt,ZodNativeEnum:()=>ft,ZodNever:()=>Ee,ZodNull:()=>ut,ZodNullable:()=>Me,ZodNumber:()=>st,ZodObject:()=>he,ZodOptional:()=>Re,ZodParsedType:()=>x,ZodPipeline:()=>Vt,ZodPromise:()=>Ye,ZodReadonly:()=>_t,ZodRecord:()=>br,ZodSchema:()=>$,ZodSet:()=>Nt,ZodString:()=>Ve,ZodSymbol:()=>At,ZodTransformer:()=>Se,ZodTuple:()=>Oe,ZodType:()=>$,ZodUndefined:()=>lt,ZodUnion:()=>ct,ZodUnknown:()=>Ge,ZodVoid:()=>Ct,addIssueToContext:()=>T,any:()=>$o,array:()=>Jo,bigint:()=>Fo,boolean:()=>Qa,coerce:()=>pd,custom:()=>Ka,date:()=>Ho,datetimeRegex:()=>qa,defaultErrorMap:()=>Je,discriminatedUnion:()=>Wo,effect:()=>sd,enum:()=>rd,function:()=>Zo,getErrorMap:()=>Pt,getParsedType:()=>Le,instanceof:()=>No,intersection:()=>Ko,isAborted:()=>hr,isAsync:()=>Et,isDirty:()=>fr,isValid:()=>ze,late:()=>Io,lazy:()=>ed,literal:()=>td,makeIssue:()=>Kt,map:()=>Qo,nan:()=>Do,nativeEnum:()=>nd,never:()=>Bo,null:()=>Mo,nullable:()=>od,number:()=>Va,object:()=>Xo,objectUtil:()=>on,oboolean:()=>gd,onumber:()=>cd,optional:()=>id,ostring:()=>ud,pipeline:()=>ld,preprocess:()=>dd,promise:()=>ad,quotelessJson:()=>ao,record:()=>Vo,set:()=>Yo,setErrorMap:()=>io,strictObject:()=>Go,string:()=>za,symbol:()=>Lo,transformer:()=>sd,tuple:()=>zo,undefined:()=>Oo,union:()=>qo,unknown:()=>Uo,util:()=>U,void:()=>jo});var U;(function(r){r.assertEqual=a=>{};function e(a){}r.assertIs=e;function t(a){throw new Error}r.assertNever=t,r.arrayToEnum=a=>{let s={};for(let i of a)s[i]=i;return s},r.getValidEnumValues=a=>{let s=r.objectKeys(a).filter(o=>typeof a[a[o]]!="number"),i={};for(let o of s)i[o]=a[o];return r.objectValues(i)},r.objectValues=a=>r.objectKeys(a).map(function(s){return a[s]}),r.objectKeys=typeof Object.keys=="function"?a=>Object.keys(a):a=>{let s=[];for(let i in a)Object.prototype.hasOwnProperty.call(a,i)&&s.push(i);return s},r.find=(a,s)=>{for(let i of a)if(s(i))return i},r.isInteger=typeof Number.isInteger=="function"?a=>Number.isInteger(a):a=>typeof a=="number"&&Number.isFinite(a)&&Math.floor(a)===a;function n(a,s=" | "){return a.map(i=>typeof i=="string"?`'${i}'`:i).join(s)}r.joinValues=n,r.jsonStringifyReplacer=(a,s)=>typeof s=="bigint"?s.toString():s})(U||(U={}));var on;(function(r){r.mergeShapes=(e,t)=>({...e,...t})})(on||(on={}));var x=U.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),Le=r=>{switch(typeof r){case"undefined":return x.undefined;case"string":return x.string;case"number":return Number.isNaN(r)?x.nan:x.number;case"boolean":return x.boolean;case"function":return x.function;case"bigint":return x.bigint;case"symbol":return x.symbol;case"object":return Array.isArray(r)?x.array:r===null?x.null:r.then&&typeof r.then=="function"&&r.catch&&typeof r.catch=="function"?x.promise:typeof Map<"u"&&r instanceof Map?x.map:typeof Set<"u"&&r instanceof Set?x.set:typeof Date<"u"&&r instanceof Date?x.date:x.object;default:return x.unknown}};var R=U.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]),ao=r=>JSON.stringify(r,null,2).replace(/"([^"]+)":/g,"$1:"),me=class r extends Error{get errors(){return this.issues}constructor(e){super(),this.issues=[],this.addIssue=n=>{this.issues=[...this.issues,n]},this.addIssues=(n=[])=>{this.issues=[...this.issues,...n]};let t=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,t):this.__proto__=t,this.name="ZodError",this.issues=e}format(e){let t=e||function(s){return s.message},n={_errors:[]},a=s=>{for(let i of s.issues)if(i.code==="invalid_union")i.unionErrors.map(a);else if(i.code==="invalid_return_type")a(i.returnTypeError);else if(i.code==="invalid_arguments")a(i.argumentsError);else if(i.path.length===0)n._errors.push(t(i));else{let o=n,c=0;for(;c<i.path.length;){let p=i.path[c];c===i.path.length-1?(o[p]=o[p]||{_errors:[]},o[p]._errors.push(t(i))):o[p]=o[p]||{_errors:[]},o=o[p],c++}}};return a(this),n}static assert(e){if(!(e instanceof r))throw new Error(`Not a ZodError: ${e}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,U.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(e=t=>t.message){let t={},n=[];for(let a of this.issues)if(a.path.length>0){let s=a.path[0];t[s]=t[s]||[],t[s].push(e(a))}else n.push(e(a));return{formErrors:n,fieldErrors:t}}get formErrors(){return this.flatten()}};me.create=r=>new me(r);var so=(r,e)=>{let t;switch(r.code){case R.invalid_type:r.received===x.undefined?t="Required":t=`Expected ${r.expected}, received ${r.received}`;break;case R.invalid_literal:t=`Invalid literal value, expected ${JSON.stringify(r.expected,U.jsonStringifyReplacer)}`;break;case R.unrecognized_keys:t=`Unrecognized key(s) in object: ${U.joinValues(r.keys,", ")}`;break;case R.invalid_union:t="Invalid input";break;case R.invalid_union_discriminator:t=`Invalid discriminator value. Expected ${U.joinValues(r.options)}`;break;case R.invalid_enum_value:t=`Invalid enum value. Expected ${U.joinValues(r.options)}, received '${r.received}'`;break;case R.invalid_arguments:t="Invalid function arguments";break;case R.invalid_return_type:t="Invalid function return type";break;case R.invalid_date:t="Invalid date";break;case R.invalid_string:typeof r.validation=="object"?"includes"in r.validation?(t=`Invalid input: must include "${r.validation.includes}"`,typeof r.validation.position=="number"&&(t=`${t} at one or more positions greater than or equal to ${r.validation.position}`)):"startsWith"in r.validation?t=`Invalid input: must start with "${r.validation.startsWith}"`:"endsWith"in r.validation?t=`Invalid input: must end with "${r.validation.endsWith}"`:U.assertNever(r.validation):r.validation!=="regex"?t=`Invalid ${r.validation}`:t="Invalid";break;case R.too_small:r.type==="array"?t=`Array must contain ${r.exact?"exactly":r.inclusive?"at least":"more than"} ${r.minimum} element(s)`:r.type==="string"?t=`String must contain ${r.exact?"exactly":r.inclusive?"at least":"over"} ${r.minimum} character(s)`:r.type==="number"?t=`Number must be ${r.exact?"exactly equal to ":r.inclusive?"greater than or equal to ":"greater than "}${r.minimum}`:r.type==="bigint"?t=`Number must be ${r.exact?"exactly equal to ":r.inclusive?"greater than or equal to ":"greater than "}${r.minimum}`:r.type==="date"?t=`Date must be ${r.exact?"exactly equal to ":r.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(r.minimum))}`:t="Invalid input";break;case R.too_big:r.type==="array"?t=`Array must contain ${r.exact?"exactly":r.inclusive?"at most":"less than"} ${r.maximum} element(s)`:r.type==="string"?t=`String must contain ${r.exact?"exactly":r.inclusive?"at most":"under"} ${r.maximum} character(s)`:r.type==="number"?t=`Number must be ${r.exact?"exactly":r.inclusive?"less than or equal to":"less than"} ${r.maximum}`:r.type==="bigint"?t=`BigInt must be ${r.exact?"exactly":r.inclusive?"less than or equal to":"less than"} ${r.maximum}`:r.type==="date"?t=`Date must be ${r.exact?"exactly":r.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(r.maximum))}`:t="Invalid input";break;case R.custom:t="Invalid input";break;case R.invalid_intersection_types:t="Intersection results could not be merged";break;case R.not_multiple_of:t=`Number must be a multiple of ${r.multipleOf}`;break;case R.not_finite:t="Number must be finite";break;default:t=e.defaultError,U.assertNever(r)}return{message:t}},Je=so;var Ba=Je;function io(r){Ba=r}function Pt(){return Ba}var Kt=r=>{let{data:e,path:t,errorMaps:n,issueData:a}=r,s=[...t,...a.path||[]],i={...a,path:s};if(a.message!==void 0)return{...a,path:s,message:a.message};let o="",c=n.filter(p=>!!p).slice().reverse();for(let p of c)o=p(i,{data:e,defaultError:o}).message;return{...a,path:s,message:o}},oo=[];function T(r,e){let t=Pt(),n=Kt({issueData:e,data:r.data,path:r.path,errorMaps:[r.common.contextualErrorMap,r.schemaErrorMap,t,t===Je?void 0:Je].filter(a=>!!a)});r.common.issues.push(n)}var te=class r{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(e,t){let n=[];for(let a of t){if(a.status==="aborted")return D;a.status==="dirty"&&e.dirty(),n.push(a.value)}return{status:e.value,value:n}}static async mergeObjectAsync(e,t){let n=[];for(let a of t){let s=await a.key,i=await a.value;n.push({key:s,value:i})}return r.mergeObjectSync(e,n)}static mergeObjectSync(e,t){let n={};for(let a of t){let{key:s,value:i}=a;if(s.status==="aborted"||i.status==="aborted")return D;s.status==="dirty"&&e.dirty(),i.status==="dirty"&&e.dirty(),s.value!=="__proto__"&&(typeof i.value<"u"||a.alwaysSet)&&(n[s.value]=i.value)}return{status:e.value,value:n}}},D=Object.freeze({status:"aborted"}),at=r=>({status:"dirty",value:r}),ie=r=>({status:"valid",value:r}),hr=r=>r.status==="aborted",fr=r=>r.status==="dirty",ze=r=>r.status==="valid",Et=r=>typeof Promise<"u"&&r instanceof Promise;var C;(function(r){r.errToObj=e=>typeof e=="string"?{message:e}:e||{},r.toString=e=>typeof e=="string"?e:e?.message})(C||(C={}));var we=class{constructor(e,t,n,a){this._cachedPath=[],this.parent=e,this.data=t,this._path=n,this._key=a}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}},ja=(r,e)=>{if(ze(e))return{success:!0,data:e.value};if(!r.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;let t=new me(r.common.issues);return this._error=t,this._error}}};function O(r){if(!r)return{};let{errorMap:e,invalid_type_error:t,required_error:n,description:a}=r;if(e&&(t||n))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return e?{errorMap:e,description:a}:{errorMap:(i,o)=>{let{message:c}=r;return i.code==="invalid_enum_value"?{message:c??o.defaultError}:typeof o.data>"u"?{message:c??n??o.defaultError}:i.code!=="invalid_type"?{message:o.defaultError}:{message:c??t??o.defaultError}},description:a}}var $=class{get description(){return this._def.description}_getType(e){return Le(e.data)}_getOrReturnCtx(e,t){return t||{common:e.parent.common,data:e.data,parsedType:Le(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new te,ctx:{common:e.parent.common,data:e.data,parsedType:Le(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){let t=this._parse(e);if(Et(t))throw new Error("Synchronous parse encountered promise.");return t}_parseAsync(e){let t=this._parse(e);return Promise.resolve(t)}parse(e,t){let n=this.safeParse(e,t);if(n.success)return n.data;throw n.error}safeParse(e,t){let n={common:{issues:[],async:t?.async??!1,contextualErrorMap:t?.errorMap},path:t?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:Le(e)},a=this._parseSync({data:e,path:n.path,parent:n});return ja(n,a)}"~validate"(e){let t={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:Le(e)};if(!this["~standard"].async)try{let n=this._parseSync({data:e,path:[],parent:t});return ze(n)?{value:n.value}:{issues:t.common.issues}}catch(n){n?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),t.common={issues:[],async:!0}}return this._parseAsync({data:e,path:[],parent:t}).then(n=>ze(n)?{value:n.value}:{issues:t.common.issues})}async parseAsync(e,t){let n=await this.safeParseAsync(e,t);if(n.success)return n.data;throw n.error}async safeParseAsync(e,t){let n={common:{issues:[],contextualErrorMap:t?.errorMap,async:!0},path:t?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:Le(e)},a=this._parse({data:e,path:n.path,parent:n}),s=await(Et(a)?a:Promise.resolve(a));return ja(n,s)}refine(e,t){let n=a=>typeof t=="string"||typeof t>"u"?{message:t}:typeof t=="function"?t(a):t;return this._refinement((a,s)=>{let i=e(a),o=()=>s.addIssue({code:R.custom,...n(a)});return typeof Promise<"u"&&i instanceof Promise?i.then(c=>c?!0:(o(),!1)):i?!0:(o(),!1)})}refinement(e,t){return this._refinement((n,a)=>e(n)?!0:(a.addIssue(typeof t=="function"?t(n,a):t),!1))}_refinement(e){return new Se({schema:this,typeName:F.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:t=>this["~validate"](t)}}optional(){return Re.create(this,this._def)}nullable(){return Me.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return qe.create(this)}promise(){return Ye.create(this,this._def)}or(e){return ct.create([this,e],this._def)}and(e){return gt.create(this,e,this._def)}transform(e){return new Se({...O(this._def),schema:this,typeName:F.ZodEffects,effect:{type:"transform",transform:e}})}default(e){let t=typeof e=="function"?e:()=>e;return new yt({...O(this._def),innerType:this,defaultValue:t,typeName:F.ZodDefault})}brand(){return new zt({typeName:F.ZodBranded,type:this,...O(this._def)})}catch(e){let t=typeof e=="function"?e:()=>e;return new bt({...O(this._def),innerType:this,catchValue:t,typeName:F.ZodCatch})}describe(e){let t=this.constructor;return new t({...this._def,description:e})}pipe(e){return Vt.create(this,e)}readonly(){return _t.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}},lo=/^c[^\s-]{8,}$/i,uo=/^[0-9a-z]+$/,co=/^[0-9A-HJKMNP-TV-Z]{26}$/i,go=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,po=/^[a-z0-9_-]{21}$/i,mo=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,ho=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,fo=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,yo="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",dn,bo=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,_o=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,Ro=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,wo=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,So=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,ko=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,Xa="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",vo=new RegExp(`^${Xa}$`);function Ga(r){let e="[0-5]\\d";r.precision?e=`${e}\\.\\d{${r.precision}}`:r.precision==null&&(e=`${e}(\\.\\d+)?`);let t=r.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${e})${t}`}function To(r){return new RegExp(`^${Ga(r)}$`)}function qa(r){let e=`${Xa}T${Ga(r)}`,t=[];return t.push(r.local?"Z?":"Z"),r.offset&&t.push("([+-]\\d{2}:?\\d{2})"),e=`${e}(${t.join("|")})`,new RegExp(`^${e}$`)}function Po(r,e){return!!((e==="v4"||!e)&&bo.test(r)||(e==="v6"||!e)&&Ro.test(r))}function Eo(r,e){if(!mo.test(r))return!1;try{let[t]=r.split(".");if(!t)return!1;let n=t.replace(/-/g,"+").replace(/_/g,"/").padEnd(t.length+(4-t.length%4)%4,"="),a=JSON.parse(atob(n));return!(typeof a!="object"||a===null||"typ"in a&&a?.typ!=="JWT"||!a.alg||e&&a.alg!==e)}catch{return!1}}function xo(r,e){return!!((e==="v4"||!e)&&_o.test(r)||(e==="v6"||!e)&&wo.test(r))}var Ve=class r extends ${_parse(e){if(this._def.coerce&&(e.data=String(e.data)),this._getType(e)!==x.string){let s=this._getOrReturnCtx(e);return T(s,{code:R.invalid_type,expected:x.string,received:s.parsedType}),D}let n=new te,a;for(let s of this._def.checks)if(s.kind==="min")e.data.length<s.value&&(a=this._getOrReturnCtx(e,a),T(a,{code:R.too_small,minimum:s.value,type:"string",inclusive:!0,exact:!1,message:s.message}),n.dirty());else if(s.kind==="max")e.data.length>s.value&&(a=this._getOrReturnCtx(e,a),T(a,{code:R.too_big,maximum:s.value,type:"string",inclusive:!0,exact:!1,message:s.message}),n.dirty());else if(s.kind==="length"){let i=e.data.length>s.value,o=e.data.length<s.value;(i||o)&&(a=this._getOrReturnCtx(e,a),i?T(a,{code:R.too_big,maximum:s.value,type:"string",inclusive:!0,exact:!0,message:s.message}):o&&T(a,{code:R.too_small,minimum:s.value,type:"string",inclusive:!0,exact:!0,message:s.message}),n.dirty())}else if(s.kind==="email")fo.test(e.data)||(a=this._getOrReturnCtx(e,a),T(a,{validation:"email",code:R.invalid_string,message:s.message}),n.dirty());else if(s.kind==="emoji")dn||(dn=new RegExp(yo,"u")),dn.test(e.data)||(a=this._getOrReturnCtx(e,a),T(a,{validation:"emoji",code:R.invalid_string,message:s.message}),n.dirty());else if(s.kind==="uuid")go.test(e.data)||(a=this._getOrReturnCtx(e,a),T(a,{validation:"uuid",code:R.invalid_string,message:s.message}),n.dirty());else if(s.kind==="nanoid")po.test(e.data)||(a=this._getOrReturnCtx(e,a),T(a,{validation:"nanoid",code:R.invalid_string,message:s.message}),n.dirty());else if(s.kind==="cuid")lo.test(e.data)||(a=this._getOrReturnCtx(e,a),T(a,{validation:"cuid",code:R.invalid_string,message:s.message}),n.dirty());else if(s.kind==="cuid2")uo.test(e.data)||(a=this._getOrReturnCtx(e,a),T(a,{validation:"cuid2",code:R.invalid_string,message:s.message}),n.dirty());else if(s.kind==="ulid")co.test(e.data)||(a=this._getOrReturnCtx(e,a),T(a,{validation:"ulid",code:R.invalid_string,message:s.message}),n.dirty());else if(s.kind==="url")try{new URL(e.data)}catch{a=this._getOrReturnCtx(e,a),T(a,{validation:"url",code:R.invalid_string,message:s.message}),n.dirty()}else s.kind==="regex"?(s.regex.lastIndex=0,s.regex.test(e.data)||(a=this._getOrReturnCtx(e,a),T(a,{validation:"regex",code:R.invalid_string,message:s.message}),n.dirty())):s.kind==="trim"?e.data=e.data.trim():s.kind==="includes"?e.data.includes(s.value,s.position)||(a=this._getOrReturnCtx(e,a),T(a,{code:R.invalid_string,validation:{includes:s.value,position:s.position},message:s.message}),n.dirty()):s.kind==="toLowerCase"?e.data=e.data.toLowerCase():s.kind==="toUpperCase"?e.data=e.data.toUpperCase():s.kind==="startsWith"?e.data.startsWith(s.value)||(a=this._getOrReturnCtx(e,a),T(a,{code:R.invalid_string,validation:{startsWith:s.value},message:s.message}),n.dirty()):s.kind==="endsWith"?e.data.endsWith(s.value)||(a=this._getOrReturnCtx(e,a),T(a,{code:R.invalid_string,validation:{endsWith:s.value},message:s.message}),n.dirty()):s.kind==="datetime"?qa(s).test(e.data)||(a=this._getOrReturnCtx(e,a),T(a,{code:R.invalid_string,validation:"datetime",message:s.message}),n.dirty()):s.kind==="date"?vo.test(e.data)||(a=this._getOrReturnCtx(e,a),T(a,{code:R.invalid_string,validation:"date",message:s.message}),n.dirty()):s.kind==="time"?To(s).test(e.data)||(a=this._getOrReturnCtx(e,a),T(a,{code:R.invalid_string,validation:"time",message:s.message}),n.dirty()):s.kind==="duration"?ho.test(e.data)||(a=this._getOrReturnCtx(e,a),T(a,{validation:"duration",code:R.invalid_string,message:s.message}),n.dirty()):s.kind==="ip"?Po(e.data,s.version)||(a=this._getOrReturnCtx(e,a),T(a,{validation:"ip",code:R.invalid_string,message:s.message}),n.dirty()):s.kind==="jwt"?Eo(e.data,s.alg)||(a=this._getOrReturnCtx(e,a),T(a,{validation:"jwt",code:R.invalid_string,message:s.message}),n.dirty()):s.kind==="cidr"?xo(e.data,s.version)||(a=this._getOrReturnCtx(e,a),T(a,{validation:"cidr",code:R.invalid_string,message:s.message}),n.dirty()):s.kind==="base64"?So.test(e.data)||(a=this._getOrReturnCtx(e,a),T(a,{validation:"base64",code:R.invalid_string,message:s.message}),n.dirty()):s.kind==="base64url"?ko.test(e.data)||(a=this._getOrReturnCtx(e,a),T(a,{validation:"base64url",code:R.invalid_string,message:s.message}),n.dirty()):U.assertNever(s);return{status:n.value,value:e.data}}_regex(e,t,n){return this.refinement(a=>e.test(a),{validation:t,code:R.invalid_string,...C.errToObj(n)})}_addCheck(e){return new r({...this._def,checks:[...this._def.checks,e]})}email(e){return this._addCheck({kind:"email",...C.errToObj(e)})}url(e){return this._addCheck({kind:"url",...C.errToObj(e)})}emoji(e){return this._addCheck({kind:"emoji",...C.errToObj(e)})}uuid(e){return this._addCheck({kind:"uuid",...C.errToObj(e)})}nanoid(e){return this._addCheck({kind:"nanoid",...C.errToObj(e)})}cuid(e){return this._addCheck({kind:"cuid",...C.errToObj(e)})}cuid2(e){return this._addCheck({kind:"cuid2",...C.errToObj(e)})}ulid(e){return this._addCheck({kind:"ulid",...C.errToObj(e)})}base64(e){return this._addCheck({kind:"base64",...C.errToObj(e)})}base64url(e){return this._addCheck({kind:"base64url",...C.errToObj(e)})}jwt(e){return this._addCheck({kind:"jwt",...C.errToObj(e)})}ip(e){return this._addCheck({kind:"ip",...C.errToObj(e)})}cidr(e){return this._addCheck({kind:"cidr",...C.errToObj(e)})}datetime(e){return typeof e=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:e}):this._addCheck({kind:"datetime",precision:typeof e?.precision>"u"?null:e?.precision,offset:e?.offset??!1,local:e?.local??!1,...C.errToObj(e?.message)})}date(e){return this._addCheck({kind:"date",message:e})}time(e){return typeof e=="string"?this._addCheck({kind:"time",precision:null,message:e}):this._addCheck({kind:"time",precision:typeof e?.precision>"u"?null:e?.precision,...C.errToObj(e?.message)})}duration(e){return this._addCheck({kind:"duration",...C.errToObj(e)})}regex(e,t){return this._addCheck({kind:"regex",regex:e,...C.errToObj(t)})}includes(e,t){return this._addCheck({kind:"includes",value:e,position:t?.position,...C.errToObj(t?.message)})}startsWith(e,t){return this._addCheck({kind:"startsWith",value:e,...C.errToObj(t)})}endsWith(e,t){return this._addCheck({kind:"endsWith",value:e,...C.errToObj(t)})}min(e,t){return this._addCheck({kind:"min",value:e,...C.errToObj(t)})}max(e,t){return this._addCheck({kind:"max",value:e,...C.errToObj(t)})}length(e,t){return this._addCheck({kind:"length",value:e,...C.errToObj(t)})}nonempty(e){return this.min(1,C.errToObj(e))}trim(){return new r({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new r({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new r({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(e=>e.kind==="datetime")}get isDate(){return!!this._def.checks.find(e=>e.kind==="date")}get isTime(){return!!this._def.checks.find(e=>e.kind==="time")}get isDuration(){return!!this._def.checks.find(e=>e.kind==="duration")}get isEmail(){return!!this._def.checks.find(e=>e.kind==="email")}get isURL(){return!!this._def.checks.find(e=>e.kind==="url")}get isEmoji(){return!!this._def.checks.find(e=>e.kind==="emoji")}get isUUID(){return!!this._def.checks.find(e=>e.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(e=>e.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(e=>e.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(e=>e.kind==="cuid2")}get isULID(){return!!this._def.checks.find(e=>e.kind==="ulid")}get isIP(){return!!this._def.checks.find(e=>e.kind==="ip")}get isCIDR(){return!!this._def.checks.find(e=>e.kind==="cidr")}get isBase64(){return!!this._def.checks.find(e=>e.kind==="base64")}get isBase64url(){return!!this._def.checks.find(e=>e.kind==="base64url")}get minLength(){let e=null;for(let t of this._def.checks)t.kind==="min"&&(e===null||t.value>e)&&(e=t.value);return e}get maxLength(){let e=null;for(let t of this._def.checks)t.kind==="max"&&(e===null||t.value<e)&&(e=t.value);return e}};Ve.create=r=>new Ve({checks:[],typeName:F.ZodString,coerce:r?.coerce??!1,...O(r)});function Ao(r,e){let t=(r.toString().split(".")[1]||"").length,n=(e.toString().split(".")[1]||"").length,a=t>n?t:n,s=Number.parseInt(r.toFixed(a).replace(".","")),i=Number.parseInt(e.toFixed(a).replace(".",""));return s%i/10**a}var st=class r extends ${constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(e){if(this._def.coerce&&(e.data=Number(e.data)),this._getType(e)!==x.number){let s=this._getOrReturnCtx(e);return T(s,{code:R.invalid_type,expected:x.number,received:s.parsedType}),D}let n,a=new te;for(let s of this._def.checks)s.kind==="int"?U.isInteger(e.data)||(n=this._getOrReturnCtx(e,n),T(n,{code:R.invalid_type,expected:"integer",received:"float",message:s.message}),a.dirty()):s.kind==="min"?(s.inclusive?e.data<s.value:e.data<=s.value)&&(n=this._getOrReturnCtx(e,n),T(n,{code:R.too_small,minimum:s.value,type:"number",inclusive:s.inclusive,exact:!1,message:s.message}),a.dirty()):s.kind==="max"?(s.inclusive?e.data>s.value:e.data>=s.value)&&(n=this._getOrReturnCtx(e,n),T(n,{code:R.too_big,maximum:s.value,type:"number",inclusive:s.inclusive,exact:!1,message:s.message}),a.dirty()):s.kind==="multipleOf"?Ao(e.data,s.value)!==0&&(n=this._getOrReturnCtx(e,n),T(n,{code:R.not_multiple_of,multipleOf:s.value,message:s.message}),a.dirty()):s.kind==="finite"?Number.isFinite(e.data)||(n=this._getOrReturnCtx(e,n),T(n,{code:R.not_finite,message:s.message}),a.dirty()):U.assertNever(s);return{status:a.value,value:e.data}}gte(e,t){return this.setLimit("min",e,!0,C.toString(t))}gt(e,t){return this.setLimit("min",e,!1,C.toString(t))}lte(e,t){return this.setLimit("max",e,!0,C.toString(t))}lt(e,t){return this.setLimit("max",e,!1,C.toString(t))}setLimit(e,t,n,a){return new r({...this._def,checks:[...this._def.checks,{kind:e,value:t,inclusive:n,message:C.toString(a)}]})}_addCheck(e){return new r({...this._def,checks:[...this._def.checks,e]})}int(e){return this._addCheck({kind:"int",message:C.toString(e)})}positive(e){return this._addCheck({kind:"min",value:0,inclusive:!1,message:C.toString(e)})}negative(e){return this._addCheck({kind:"max",value:0,inclusive:!1,message:C.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:0,inclusive:!0,message:C.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:0,inclusive:!0,message:C.toString(e)})}multipleOf(e,t){return this._addCheck({kind:"multipleOf",value:e,message:C.toString(t)})}finite(e){return this._addCheck({kind:"finite",message:C.toString(e)})}safe(e){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:C.toString(e)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:C.toString(e)})}get minValue(){let e=null;for(let t of this._def.checks)t.kind==="min"&&(e===null||t.value>e)&&(e=t.value);return e}get maxValue(){let e=null;for(let t of this._def.checks)t.kind==="max"&&(e===null||t.value<e)&&(e=t.value);return e}get isInt(){return!!this._def.checks.find(e=>e.kind==="int"||e.kind==="multipleOf"&&U.isInteger(e.value))}get isFinite(){let e=null,t=null;for(let n of this._def.checks){if(n.kind==="finite"||n.kind==="int"||n.kind==="multipleOf")return!0;n.kind==="min"?(t===null||n.value>t)&&(t=n.value):n.kind==="max"&&(e===null||n.value<e)&&(e=n.value)}return Number.isFinite(t)&&Number.isFinite(e)}};st.create=r=>new st({checks:[],typeName:F.ZodNumber,coerce:r?.coerce||!1,...O(r)});var it=class r extends ${constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(e){if(this._def.coerce)try{e.data=BigInt(e.data)}catch{return this._getInvalidInput(e)}if(this._getType(e)!==x.bigint)return this._getInvalidInput(e);let n,a=new te;for(let s of this._def.checks)s.kind==="min"?(s.inclusive?e.data<s.value:e.data<=s.value)&&(n=this._getOrReturnCtx(e,n),T(n,{code:R.too_small,type:"bigint",minimum:s.value,inclusive:s.inclusive,message:s.message}),a.dirty()):s.kind==="max"?(s.inclusive?e.data>s.value:e.data>=s.value)&&(n=this._getOrReturnCtx(e,n),T(n,{code:R.too_big,type:"bigint",maximum:s.value,inclusive:s.inclusive,message:s.message}),a.dirty()):s.kind==="multipleOf"?e.data%s.value!==BigInt(0)&&(n=this._getOrReturnCtx(e,n),T(n,{code:R.not_multiple_of,multipleOf:s.value,message:s.message}),a.dirty()):U.assertNever(s);return{status:a.value,value:e.data}}_getInvalidInput(e){let t=this._getOrReturnCtx(e);return T(t,{code:R.invalid_type,expected:x.bigint,received:t.parsedType}),D}gte(e,t){return this.setLimit("min",e,!0,C.toString(t))}gt(e,t){return this.setLimit("min",e,!1,C.toString(t))}lte(e,t){return this.setLimit("max",e,!0,C.toString(t))}lt(e,t){return this.setLimit("max",e,!1,C.toString(t))}setLimit(e,t,n,a){return new r({...this._def,checks:[...this._def.checks,{kind:e,value:t,inclusive:n,message:C.toString(a)}]})}_addCheck(e){return new r({...this._def,checks:[...this._def.checks,e]})}positive(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:C.toString(e)})}negative(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:C.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:C.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:C.toString(e)})}multipleOf(e,t){return this._addCheck({kind:"multipleOf",value:e,message:C.toString(t)})}get minValue(){let e=null;for(let t of this._def.checks)t.kind==="min"&&(e===null||t.value>e)&&(e=t.value);return e}get maxValue(){let e=null;for(let t of this._def.checks)t.kind==="max"&&(e===null||t.value<e)&&(e=t.value);return e}};it.create=r=>new it({checks:[],typeName:F.ZodBigInt,coerce:r?.coerce??!1,...O(r)});var ot=class extends ${_parse(e){if(this._def.coerce&&(e.data=!!e.data),this._getType(e)!==x.boolean){let n=this._getOrReturnCtx(e);return T(n,{code:R.invalid_type,expected:x.boolean,received:n.parsedType}),D}return ie(e.data)}};ot.create=r=>new ot({typeName:F.ZodBoolean,coerce:r?.coerce||!1,...O(r)});var dt=class r extends ${_parse(e){if(this._def.coerce&&(e.data=new Date(e.data)),this._getType(e)!==x.date){let s=this._getOrReturnCtx(e);return T(s,{code:R.invalid_type,expected:x.date,received:s.parsedType}),D}if(Number.isNaN(e.data.getTime())){let s=this._getOrReturnCtx(e);return T(s,{code:R.invalid_date}),D}let n=new te,a;for(let s of this._def.checks)s.kind==="min"?e.data.getTime()<s.value&&(a=this._getOrReturnCtx(e,a),T(a,{code:R.too_small,message:s.message,inclusive:!0,exact:!1,minimum:s.value,type:"date"}),n.dirty()):s.kind==="max"?e.data.getTime()>s.value&&(a=this._getOrReturnCtx(e,a),T(a,{code:R.too_big,message:s.message,inclusive:!0,exact:!1,maximum:s.value,type:"date"}),n.dirty()):U.assertNever(s);return{status:n.value,value:new Date(e.data.getTime())}}_addCheck(e){return new r({...this._def,checks:[...this._def.checks,e]})}min(e,t){return this._addCheck({kind:"min",value:e.getTime(),message:C.toString(t)})}max(e,t){return this._addCheck({kind:"max",value:e.getTime(),message:C.toString(t)})}get minDate(){let e=null;for(let t of this._def.checks)t.kind==="min"&&(e===null||t.value>e)&&(e=t.value);return e!=null?new Date(e):null}get maxDate(){let e=null;for(let t of this._def.checks)t.kind==="max"&&(e===null||t.value<e)&&(e=t.value);return e!=null?new Date(e):null}};dt.create=r=>new dt({checks:[],coerce:r?.coerce||!1,typeName:F.ZodDate,...O(r)});var At=class extends ${_parse(e){if(this._getType(e)!==x.symbol){let n=this._getOrReturnCtx(e);return T(n,{code:R.invalid_type,expected:x.symbol,received:n.parsedType}),D}return ie(e.data)}};At.create=r=>new At({typeName:F.ZodSymbol,...O(r)});var lt=class extends ${_parse(e){if(this._getType(e)!==x.undefined){let n=this._getOrReturnCtx(e);return T(n,{code:R.invalid_type,expected:x.undefined,received:n.parsedType}),D}return ie(e.data)}};lt.create=r=>new lt({typeName:F.ZodUndefined,...O(r)});var ut=class extends ${_parse(e){if(this._getType(e)!==x.null){let n=this._getOrReturnCtx(e);return T(n,{code:R.invalid_type,expected:x.null,received:n.parsedType}),D}return ie(e.data)}};ut.create=r=>new ut({typeName:F.ZodNull,...O(r)});var Qe=class extends ${constructor(){super(...arguments),this._any=!0}_parse(e){return ie(e.data)}};Qe.create=r=>new Qe({typeName:F.ZodAny,...O(r)});var Ge=class extends ${constructor(){super(...arguments),this._unknown=!0}_parse(e){return ie(e.data)}};Ge.create=r=>new Ge({typeName:F.ZodUnknown,...O(r)});var Ee=class extends ${_parse(e){let t=this._getOrReturnCtx(e);return T(t,{code:R.invalid_type,expected:x.never,received:t.parsedType}),D}};Ee.create=r=>new Ee({typeName:F.ZodNever,...O(r)});var Ct=class extends ${_parse(e){if(this._getType(e)!==x.undefined){let n=this._getOrReturnCtx(e);return T(n,{code:R.invalid_type,expected:x.void,received:n.parsedType}),D}return ie(e.data)}};Ct.create=r=>new Ct({typeName:F.ZodVoid,...O(r)});var qe=class r extends ${_parse(e){let{ctx:t,status:n}=this._processInputParams(e),a=this._def;if(t.parsedType!==x.array)return T(t,{code:R.invalid_type,expected:x.array,received:t.parsedType}),D;if(a.exactLength!==null){let i=t.data.length>a.exactLength.value,o=t.data.length<a.exactLength.value;(i||o)&&(T(t,{code:i?R.too_big:R.too_small,minimum:o?a.exactLength.value:void 0,maximum:i?a.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:a.exactLength.message}),n.dirty())}if(a.minLength!==null&&t.data.length<a.minLength.value&&(T(t,{code:R.too_small,minimum:a.minLength.value,type:"array",inclusive:!0,exact:!1,message:a.minLength.message}),n.dirty()),a.maxLength!==null&&t.data.length>a.maxLength.value&&(T(t,{code:R.too_big,maximum:a.maxLength.value,type:"array",inclusive:!0,exact:!1,message:a.maxLength.message}),n.dirty()),t.common.async)return Promise.all([...t.data].map((i,o)=>a.type._parseAsync(new we(t,i,t.path,o)))).then(i=>te.mergeArray(n,i));let s=[...t.data].map((i,o)=>a.type._parseSync(new we(t,i,t.path,o)));return te.mergeArray(n,s)}get element(){return this._def.type}min(e,t){return new r({...this._def,minLength:{value:e,message:C.toString(t)}})}max(e,t){return new r({...this._def,maxLength:{value:e,message:C.toString(t)}})}length(e,t){return new r({...this._def,exactLength:{value:e,message:C.toString(t)}})}nonempty(e){return this.min(1,e)}};qe.create=(r,e)=>new qe({type:r,minLength:null,maxLength:null,exactLength:null,typeName:F.ZodArray,...O(e)});function xt(r){if(r instanceof he){let e={};for(let t in r.shape){let n=r.shape[t];e[t]=Re.create(xt(n))}return new he({...r._def,shape:()=>e})}else return r instanceof qe?new qe({...r._def,type:xt(r.element)}):r instanceof Re?Re.create(xt(r.unwrap())):r instanceof Me?Me.create(xt(r.unwrap())):r instanceof Oe?Oe.create(r.items.map(e=>xt(e))):r}var he=class r extends ${constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;let e=this._def.shape(),t=U.objectKeys(e);return this._cached={shape:e,keys:t},this._cached}_parse(e){if(this._getType(e)!==x.object){let p=this._getOrReturnCtx(e);return T(p,{code:R.invalid_type,expected:x.object,received:p.parsedType}),D}let{status:n,ctx:a}=this._processInputParams(e),{shape:s,keys:i}=this._getCached(),o=[];if(!(this._def.catchall instanceof Ee&&this._def.unknownKeys==="strip"))for(let p in a.data)i.includes(p)||o.push(p);let c=[];for(let p of i){let m=s[p],u=a.data[p];c.push({key:{status:"valid",value:p},value:m._parse(new we(a,u,a.path,p)),alwaysSet:p in a.data})}if(this._def.catchall instanceof Ee){let p=this._def.unknownKeys;if(p==="passthrough")for(let m of o)c.push({key:{status:"valid",value:m},value:{status:"valid",value:a.data[m]}});else if(p==="strict")o.length>0&&(T(a,{code:R.unrecognized_keys,keys:o}),n.dirty());else if(p!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{let p=this._def.catchall;for(let m of o){let u=a.data[m];c.push({key:{status:"valid",value:m},value:p._parse(new we(a,u,a.path,m)),alwaysSet:m in a.data})}}return a.common.async?Promise.resolve().then(async()=>{let p=[];for(let m of c){let u=await m.key,g=await m.value;p.push({key:u,value:g,alwaysSet:m.alwaysSet})}return p}).then(p=>te.mergeObjectSync(n,p)):te.mergeObjectSync(n,c)}get shape(){return this._def.shape()}strict(e){return C.errToObj,new r({...this._def,unknownKeys:"strict",...e!==void 0?{errorMap:(t,n)=>{let a=this._def.errorMap?.(t,n).message??n.defaultError;return t.code==="unrecognized_keys"?{message:C.errToObj(e).message??a}:{message:a}}}:{}})}strip(){return new r({...this._def,unknownKeys:"strip"})}passthrough(){return new r({...this._def,unknownKeys:"passthrough"})}extend(e){return new r({...this._def,shape:()=>({...this._def.shape(),...e})})}merge(e){return new r({unknownKeys:e._def.unknownKeys,catchall:e._def.catchall,shape:()=>({...this._def.shape(),...e._def.shape()}),typeName:F.ZodObject})}setKey(e,t){return this.augment({[e]:t})}catchall(e){return new r({...this._def,catchall:e})}pick(e){let t={};for(let n of U.objectKeys(e))e[n]&&this.shape[n]&&(t[n]=this.shape[n]);return new r({...this._def,shape:()=>t})}omit(e){let t={};for(let n of U.objectKeys(this.shape))e[n]||(t[n]=this.shape[n]);return new r({...this._def,shape:()=>t})}deepPartial(){return xt(this)}partial(e){let t={};for(let n of U.objectKeys(this.shape)){let a=this.shape[n];e&&!e[n]?t[n]=a:t[n]=a.optional()}return new r({...this._def,shape:()=>t})}required(e){let t={};for(let n of U.objectKeys(this.shape))if(e&&!e[n])t[n]=this.shape[n];else{let s=this.shape[n];for(;s instanceof Re;)s=s._def.innerType;t[n]=s}return new r({...this._def,shape:()=>t})}keyof(){return Wa(U.objectKeys(this.shape))}};he.create=(r,e)=>new he({shape:()=>r,unknownKeys:"strip",catchall:Ee.create(),typeName:F.ZodObject,...O(e)});he.strictCreate=(r,e)=>new he({shape:()=>r,unknownKeys:"strict",catchall:Ee.create(),typeName:F.ZodObject,...O(e)});he.lazycreate=(r,e)=>new he({shape:r,unknownKeys:"strip",catchall:Ee.create(),typeName:F.ZodObject,...O(e)});var ct=class extends ${_parse(e){let{ctx:t}=this._processInputParams(e),n=this._def.options;function a(s){for(let o of s)if(o.result.status==="valid")return o.result;for(let o of s)if(o.result.status==="dirty")return t.common.issues.push(...o.ctx.common.issues),o.result;let i=s.map(o=>new me(o.ctx.common.issues));return T(t,{code:R.invalid_union,unionErrors:i}),D}if(t.common.async)return Promise.all(n.map(async s=>{let i={...t,common:{...t.common,issues:[]},parent:null};return{result:await s._parseAsync({data:t.data,path:t.path,parent:i}),ctx:i}})).then(a);{let s,i=[];for(let c of n){let p={...t,common:{...t.common,issues:[]},parent:null},m=c._parseSync({data:t.data,path:t.path,parent:p});if(m.status==="valid")return m;m.status==="dirty"&&!s&&(s={result:m,ctx:p}),p.common.issues.length&&i.push(p.common.issues)}if(s)return t.common.issues.push(...s.ctx.common.issues),s.result;let o=i.map(c=>new me(c));return T(t,{code:R.invalid_union,unionErrors:o}),D}}get options(){return this._def.options}};ct.create=(r,e)=>new ct({options:r,typeName:F.ZodUnion,...O(e)});var Xe=r=>r instanceof pt?Xe(r.schema):r instanceof Se?Xe(r.innerType()):r instanceof mt?[r.value]:r instanceof ht?r.options:r instanceof ft?U.objectValues(r.enum):r instanceof yt?Xe(r._def.innerType):r instanceof lt?[void 0]:r instanceof ut?[null]:r instanceof Re?[void 0,...Xe(r.unwrap())]:r instanceof Me?[null,...Xe(r.unwrap())]:r instanceof zt||r instanceof _t?Xe(r.unwrap()):r instanceof bt?Xe(r._def.innerType):[],yr=class r extends ${_parse(e){let{ctx:t}=this._processInputParams(e);if(t.parsedType!==x.object)return T(t,{code:R.invalid_type,expected:x.object,received:t.parsedType}),D;let n=this.discriminator,a=t.data[n],s=this.optionsMap.get(a);return s?t.common.async?s._parseAsync({data:t.data,path:t.path,parent:t}):s._parseSync({data:t.data,path:t.path,parent:t}):(T(t,{code:R.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[n]}),D)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(e,t,n){let a=new Map;for(let s of t){let i=Xe(s.shape[e]);if(!i.length)throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);for(let o of i){if(a.has(o))throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(o)}`);a.set(o,s)}}return new r({typeName:F.ZodDiscriminatedUnion,discriminator:e,options:t,optionsMap:a,...O(n)})}};function ln(r,e){let t=Le(r),n=Le(e);if(r===e)return{valid:!0,data:r};if(t===x.object&&n===x.object){let a=U.objectKeys(e),s=U.objectKeys(r).filter(o=>a.indexOf(o)!==-1),i={...r,...e};for(let o of s){let c=ln(r[o],e[o]);if(!c.valid)return{valid:!1};i[o]=c.data}return{valid:!0,data:i}}else if(t===x.array&&n===x.array){if(r.length!==e.length)return{valid:!1};let a=[];for(let s=0;s<r.length;s++){let i=r[s],o=e[s],c=ln(i,o);if(!c.valid)return{valid:!1};a.push(c.data)}return{valid:!0,data:a}}else return t===x.date&&n===x.date&&+r==+e?{valid:!0,data:r}:{valid:!1}}var gt=class extends ${_parse(e){let{status:t,ctx:n}=this._processInputParams(e),a=(s,i)=>{if(hr(s)||hr(i))return D;let o=ln(s.value,i.value);return o.valid?((fr(s)||fr(i))&&t.dirty(),{status:t.value,value:o.data}):(T(n,{code:R.invalid_intersection_types}),D)};return n.common.async?Promise.all([this._def.left._parseAsync({data:n.data,path:n.path,parent:n}),this._def.right._parseAsync({data:n.data,path:n.path,parent:n})]).then(([s,i])=>a(s,i)):a(this._def.left._parseSync({data:n.data,path:n.path,parent:n}),this._def.right._parseSync({data:n.data,path:n.path,parent:n}))}};gt.create=(r,e,t)=>new gt({left:r,right:e,typeName:F.ZodIntersection,...O(t)});var Oe=class r extends ${_parse(e){let{status:t,ctx:n}=this._processInputParams(e);if(n.parsedType!==x.array)return T(n,{code:R.invalid_type,expected:x.array,received:n.parsedType}),D;if(n.data.length<this._def.items.length)return T(n,{code:R.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),D;!this._def.rest&&n.data.length>this._def.items.length&&(T(n,{code:R.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),t.dirty());let s=[...n.data].map((i,o)=>{let c=this._def.items[o]||this._def.rest;return c?c._parse(new we(n,i,n.path,o)):null}).filter(i=>!!i);return n.common.async?Promise.all(s).then(i=>te.mergeArray(t,i)):te.mergeArray(t,s)}get items(){return this._def.items}rest(e){return new r({...this._def,rest:e})}};Oe.create=(r,e)=>{if(!Array.isArray(r))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new Oe({items:r,typeName:F.ZodTuple,rest:null,...O(e)})};var br=class r extends ${get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){let{status:t,ctx:n}=this._processInputParams(e);if(n.parsedType!==x.object)return T(n,{code:R.invalid_type,expected:x.object,received:n.parsedType}),D;let a=[],s=this._def.keyType,i=this._def.valueType;for(let o in n.data)a.push({key:s._parse(new we(n,o,n.path,o)),value:i._parse(new we(n,n.data[o],n.path,o)),alwaysSet:o in n.data});return n.common.async?te.mergeObjectAsync(t,a):te.mergeObjectSync(t,a)}get element(){return this._def.valueType}static create(e,t,n){return t instanceof $?new r({keyType:e,valueType:t,typeName:F.ZodRecord,...O(n)}):new r({keyType:Ve.create(),valueType:e,typeName:F.ZodRecord,...O(t)})}},It=class extends ${get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){let{status:t,ctx:n}=this._processInputParams(e);if(n.parsedType!==x.map)return T(n,{code:R.invalid_type,expected:x.map,received:n.parsedType}),D;let a=this._def.keyType,s=this._def.valueType,i=[...n.data.entries()].map(([o,c],p)=>({key:a._parse(new we(n,o,n.path,[p,"key"])),value:s._parse(new we(n,c,n.path,[p,"value"]))}));if(n.common.async){let o=new Map;return Promise.resolve().then(async()=>{for(let c of i){let p=await c.key,m=await c.value;if(p.status==="aborted"||m.status==="aborted")return D;(p.status==="dirty"||m.status==="dirty")&&t.dirty(),o.set(p.value,m.value)}return{status:t.value,value:o}})}else{let o=new Map;for(let c of i){let p=c.key,m=c.value;if(p.status==="aborted"||m.status==="aborted")return D;(p.status==="dirty"||m.status==="dirty")&&t.dirty(),o.set(p.value,m.value)}return{status:t.value,value:o}}}};It.create=(r,e,t)=>new It({valueType:e,keyType:r,typeName:F.ZodMap,...O(t)});var Nt=class r extends ${_parse(e){let{status:t,ctx:n}=this._processInputParams(e);if(n.parsedType!==x.set)return T(n,{code:R.invalid_type,expected:x.set,received:n.parsedType}),D;let a=this._def;a.minSize!==null&&n.data.size<a.minSize.value&&(T(n,{code:R.too_small,minimum:a.minSize.value,type:"set",inclusive:!0,exact:!1,message:a.minSize.message}),t.dirty()),a.maxSize!==null&&n.data.size>a.maxSize.value&&(T(n,{code:R.too_big,maximum:a.maxSize.value,type:"set",inclusive:!0,exact:!1,message:a.maxSize.message}),t.dirty());let s=this._def.valueType;function i(c){let p=new Set;for(let m of c){if(m.status==="aborted")return D;m.status==="dirty"&&t.dirty(),p.add(m.value)}return{status:t.value,value:p}}let o=[...n.data.values()].map((c,p)=>s._parse(new we(n,c,n.path,p)));return n.common.async?Promise.all(o).then(c=>i(c)):i(o)}min(e,t){return new r({...this._def,minSize:{value:e,message:C.toString(t)}})}max(e,t){return new r({...this._def,maxSize:{value:e,message:C.toString(t)}})}size(e,t){return this.min(e,t).max(e,t)}nonempty(e){return this.min(1,e)}};Nt.create=(r,e)=>new Nt({valueType:r,minSize:null,maxSize:null,typeName:F.ZodSet,...O(e)});var _r=class r extends ${constructor(){super(...arguments),this.validate=this.implement}_parse(e){let{ctx:t}=this._processInputParams(e);if(t.parsedType!==x.function)return T(t,{code:R.invalid_type,expected:x.function,received:t.parsedType}),D;function n(o,c){return Kt({data:o,path:t.path,errorMaps:[t.common.contextualErrorMap,t.schemaErrorMap,Pt(),Je].filter(p=>!!p),issueData:{code:R.invalid_arguments,argumentsError:c}})}function a(o,c){return Kt({data:o,path:t.path,errorMaps:[t.common.contextualErrorMap,t.schemaErrorMap,Pt(),Je].filter(p=>!!p),issueData:{code:R.invalid_return_type,returnTypeError:c}})}let s={errorMap:t.common.contextualErrorMap},i=t.data;if(this._def.returns instanceof Ye){let o=this;return ie(async function(...c){let p=new me([]),m=await o._def.args.parseAsync(c,s).catch(P=>{throw p.addIssue(n(c,P)),p}),u=await Reflect.apply(i,this,m);return await o._def.returns._def.type.parseAsync(u,s).catch(P=>{throw p.addIssue(a(u,P)),p})})}else{let o=this;return ie(function(...c){let p=o._def.args.safeParse(c,s);if(!p.success)throw new me([n(c,p.error)]);let m=Reflect.apply(i,this,p.data),u=o._def.returns.safeParse(m,s);if(!u.success)throw new me([a(m,u.error)]);return u.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...e){return new r({...this._def,args:Oe.create(e).rest(Ge.create())})}returns(e){return new r({...this._def,returns:e})}implement(e){return this.parse(e)}strictImplement(e){return this.parse(e)}static create(e,t,n){return new r({args:e||Oe.create([]).rest(Ge.create()),returns:t||Ge.create(),typeName:F.ZodFunction,...O(n)})}},pt=class extends ${get schema(){return this._def.getter()}_parse(e){let{ctx:t}=this._processInputParams(e);return this._def.getter()._parse({data:t.data,path:t.path,parent:t})}};pt.create=(r,e)=>new pt({getter:r,typeName:F.ZodLazy,...O(e)});var mt=class extends ${_parse(e){if(e.data!==this._def.value){let t=this._getOrReturnCtx(e);return T(t,{received:t.data,code:R.invalid_literal,expected:this._def.value}),D}return{status:"valid",value:e.data}}get value(){return this._def.value}};mt.create=(r,e)=>new mt({value:r,typeName:F.ZodLiteral,...O(e)});function Wa(r,e){return new ht({values:r,typeName:F.ZodEnum,...O(e)})}var ht=class r extends ${_parse(e){if(typeof e.data!="string"){let t=this._getOrReturnCtx(e),n=this._def.values;return T(t,{expected:U.joinValues(n),received:t.parsedType,code:R.invalid_type}),D}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(e.data)){let t=this._getOrReturnCtx(e),n=this._def.values;return T(t,{received:t.data,code:R.invalid_enum_value,options:n}),D}return ie(e.data)}get options(){return this._def.values}get enum(){let e={};for(let t of this._def.values)e[t]=t;return e}get Values(){let e={};for(let t of this._def.values)e[t]=t;return e}get Enum(){let e={};for(let t of this._def.values)e[t]=t;return e}extract(e,t=this._def){return r.create(e,{...this._def,...t})}exclude(e,t=this._def){return r.create(this.options.filter(n=>!e.includes(n)),{...this._def,...t})}};ht.create=Wa;var ft=class extends ${_parse(e){let t=U.getValidEnumValues(this._def.values),n=this._getOrReturnCtx(e);if(n.parsedType!==x.string&&n.parsedType!==x.number){let a=U.objectValues(t);return T(n,{expected:U.joinValues(a),received:n.parsedType,code:R.invalid_type}),D}if(this._cache||(this._cache=new Set(U.getValidEnumValues(this._def.values))),!this._cache.has(e.data)){let a=U.objectValues(t);return T(n,{received:n.data,code:R.invalid_enum_value,options:a}),D}return ie(e.data)}get enum(){return this._def.values}};ft.create=(r,e)=>new ft({values:r,typeName:F.ZodNativeEnum,...O(e)});var Ye=class extends ${unwrap(){return this._def.type}_parse(e){let{ctx:t}=this._processInputParams(e);if(t.parsedType!==x.promise&&t.common.async===!1)return T(t,{code:R.invalid_type,expected:x.promise,received:t.parsedType}),D;let n=t.parsedType===x.promise?t.data:Promise.resolve(t.data);return ie(n.then(a=>this._def.type.parseAsync(a,{path:t.path,errorMap:t.common.contextualErrorMap})))}};Ye.create=(r,e)=>new Ye({type:r,typeName:F.ZodPromise,...O(e)});var Se=class extends ${innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===F.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){let{status:t,ctx:n}=this._processInputParams(e),a=this._def.effect||null,s={addIssue:i=>{T(n,i),i.fatal?t.abort():t.dirty()},get path(){return n.path}};if(s.addIssue=s.addIssue.bind(s),a.type==="preprocess"){let i=a.transform(n.data,s);if(n.common.async)return Promise.resolve(i).then(async o=>{if(t.value==="aborted")return D;let c=await this._def.schema._parseAsync({data:o,path:n.path,parent:n});return c.status==="aborted"?D:c.status==="dirty"?at(c.value):t.value==="dirty"?at(c.value):c});{if(t.value==="aborted")return D;let o=this._def.schema._parseSync({data:i,path:n.path,parent:n});return o.status==="aborted"?D:o.status==="dirty"?at(o.value):t.value==="dirty"?at(o.value):o}}if(a.type==="refinement"){let i=o=>{let c=a.refinement(o,s);if(n.common.async)return Promise.resolve(c);if(c instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return o};if(n.common.async===!1){let o=this._def.schema._parseSync({data:n.data,path:n.path,parent:n});return o.status==="aborted"?D:(o.status==="dirty"&&t.dirty(),i(o.value),{status:t.value,value:o.value})}else return this._def.schema._parseAsync({data:n.data,path:n.path,parent:n}).then(o=>o.status==="aborted"?D:(o.status==="dirty"&&t.dirty(),i(o.value).then(()=>({status:t.value,value:o.value}))))}if(a.type==="transform")if(n.common.async===!1){let i=this._def.schema._parseSync({data:n.data,path:n.path,parent:n});if(!ze(i))return D;let o=a.transform(i.value,s);if(o instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:t.value,value:o}}else return this._def.schema._parseAsync({data:n.data,path:n.path,parent:n}).then(i=>ze(i)?Promise.resolve(a.transform(i.value,s)).then(o=>({status:t.value,value:o})):D);U.assertNever(a)}};Se.create=(r,e,t)=>new Se({schema:r,typeName:F.ZodEffects,effect:e,...O(t)});Se.createWithPreprocess=(r,e,t)=>new Se({schema:e,effect:{type:"preprocess",transform:r},typeName:F.ZodEffects,...O(t)});var Re=class extends ${_parse(e){return this._getType(e)===x.undefined?ie(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}};Re.create=(r,e)=>new Re({innerType:r,typeName:F.ZodOptional,...O(e)});var Me=class extends ${_parse(e){return this._getType(e)===x.null?ie(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}};Me.create=(r,e)=>new Me({innerType:r,typeName:F.ZodNullable,...O(e)});var yt=class extends ${_parse(e){let{ctx:t}=this._processInputParams(e),n=t.data;return t.parsedType===x.undefined&&(n=this._def.defaultValue()),this._def.innerType._parse({data:n,path:t.path,parent:t})}removeDefault(){return this._def.innerType}};yt.create=(r,e)=>new yt({innerType:r,typeName:F.ZodDefault,defaultValue:typeof e.default=="function"?e.default:()=>e.default,...O(e)});var bt=class extends ${_parse(e){let{ctx:t}=this._processInputParams(e),n={...t,common:{...t.common,issues:[]}},a=this._def.innerType._parse({data:n.data,path:n.path,parent:{...n}});return Et(a)?a.then(s=>({status:"valid",value:s.status==="valid"?s.value:this._def.catchValue({get error(){return new me(n.common.issues)},input:n.data})})):{status:"valid",value:a.status==="valid"?a.value:this._def.catchValue({get error(){return new me(n.common.issues)},input:n.data})}}removeCatch(){return this._def.innerType}};bt.create=(r,e)=>new bt({innerType:r,typeName:F.ZodCatch,catchValue:typeof e.catch=="function"?e.catch:()=>e.catch,...O(e)});var Dt=class extends ${_parse(e){if(this._getType(e)!==x.nan){let n=this._getOrReturnCtx(e);return T(n,{code:R.invalid_type,expected:x.nan,received:n.parsedType}),D}return{status:"valid",value:e.data}}};Dt.create=r=>new Dt({typeName:F.ZodNaN,...O(r)});var Co=Symbol("zod_brand"),zt=class extends ${_parse(e){let{ctx:t}=this._processInputParams(e),n=t.data;return this._def.type._parse({data:n,path:t.path,parent:t})}unwrap(){return this._def.type}},Vt=class r extends ${_parse(e){let{status:t,ctx:n}=this._processInputParams(e);if(n.common.async)return(async()=>{let s=await this._def.in._parseAsync({data:n.data,path:n.path,parent:n});return s.status==="aborted"?D:s.status==="dirty"?(t.dirty(),at(s.value)):this._def.out._parseAsync({data:s.value,path:n.path,parent:n})})();{let a=this._def.in._parseSync({data:n.data,path:n.path,parent:n});return a.status==="aborted"?D:a.status==="dirty"?(t.dirty(),{status:"dirty",value:a.value}):this._def.out._parseSync({data:a.value,path:n.path,parent:n})}}static create(e,t){return new r({in:e,out:t,typeName:F.ZodPipeline})}},_t=class extends ${_parse(e){let t=this._def.innerType._parse(e),n=a=>(ze(a)&&(a.value=Object.freeze(a.value)),a);return Et(t)?t.then(a=>n(a)):n(t)}unwrap(){return this._def.innerType}};_t.create=(r,e)=>new _t({innerType:r,typeName:F.ZodReadonly,...O(e)});function Ja(r,e){let t=typeof r=="function"?r(e):typeof r=="string"?{message:r}:r;return typeof t=="string"?{message:t}:t}function Ka(r,e={},t){return r?Qe.create().superRefine((n,a)=>{let s=r(n);if(s instanceof Promise)return s.then(i=>{if(!i){let o=Ja(e,n),c=o.fatal??t??!0;a.addIssue({code:"custom",...o,fatal:c})}});if(!s){let i=Ja(e,n),o=i.fatal??t??!0;a.addIssue({code:"custom",...i,fatal:o})}}):Qe.create()}var Io={object:he.lazycreate},F;(function(r){r.ZodString="ZodString",r.ZodNumber="ZodNumber",r.ZodNaN="ZodNaN",r.ZodBigInt="ZodBigInt",r.ZodBoolean="ZodBoolean",r.ZodDate="ZodDate",r.ZodSymbol="ZodSymbol",r.ZodUndefined="ZodUndefined",r.ZodNull="ZodNull",r.ZodAny="ZodAny",r.ZodUnknown="ZodUnknown",r.ZodNever="ZodNever",r.ZodVoid="ZodVoid",r.ZodArray="ZodArray",r.ZodObject="ZodObject",r.ZodUnion="ZodUnion",r.ZodDiscriminatedUnion="ZodDiscriminatedUnion",r.ZodIntersection="ZodIntersection",r.ZodTuple="ZodTuple",r.ZodRecord="ZodRecord",r.ZodMap="ZodMap",r.ZodSet="ZodSet",r.ZodFunction="ZodFunction",r.ZodLazy="ZodLazy",r.ZodLiteral="ZodLiteral",r.ZodEnum="ZodEnum",r.ZodEffects="ZodEffects",r.ZodNativeEnum="ZodNativeEnum",r.ZodOptional="ZodOptional",r.ZodNullable="ZodNullable",r.ZodDefault="ZodDefault",r.ZodCatch="ZodCatch",r.ZodPromise="ZodPromise",r.ZodBranded="ZodBranded",r.ZodPipeline="ZodPipeline",r.ZodReadonly="ZodReadonly"})(F||(F={}));var No=(r,e={message:`Input not instance of ${r.name}`})=>Ka(t=>t instanceof r,e),za=Ve.create,Va=st.create,Do=Dt.create,Fo=it.create,Qa=ot.create,Ho=dt.create,Lo=At.create,Oo=lt.create,Mo=ut.create,$o=Qe.create,Uo=Ge.create,Bo=Ee.create,jo=Ct.create,Jo=qe.create,Xo=he.create,Go=he.strictCreate,qo=ct.create,Wo=yr.create,Ko=gt.create,zo=Oe.create,Vo=br.create,Qo=It.create,Yo=Nt.create,Zo=_r.create,ed=pt.create,td=mt.create,rd=ht.create,nd=ft.create,ad=Ye.create,sd=Se.create,id=Re.create,od=Me.create,dd=Se.createWithPreprocess,ld=Vt.create,ud=()=>za().optional(),cd=()=>Va().optional(),gd=()=>Qa().optional(),pd={string:(r=>Ve.create({...r,coerce:!0})),number:(r=>st.create({...r,coerce:!0})),boolean:(r=>ot.create({...r,coerce:!0})),bigint:(r=>it.create({...r,coerce:!0})),date:(r=>dt.create({...r,coerce:!0}))};var md=D;var hd=l.enum(["watching","processing","done","error","archived"]),fd=l.enum(["accept","reject","flag"]),un=l.enum(["pending","queued","in_progress","resolved","failed","warning","rejected","flagged"]),Ya=l.object({id:l.string(),author:l.string(),body:l.string(),bodyHtml:l.string(),replyKind:l.enum(["review_thread","review","general_comment"]),sourceId:l.string(),sourceNodeId:l.string().nullable(),sourceUrl:l.string().nullable(),threadId:l.string().nullable(),threadResolved:l.boolean().nullable(),auditToken:l.string(),file:l.string().nullable(),line:l.number().nullable(),type:l.enum(["review_comment","review","general_comment"]),createdAt:l.string(),decision:fd.nullable(),decisionReason:l.string().nullable(),action:l.string().nullable(),status:un,statusReason:l.string().nullable()}),yd=l.enum(["needed","not_needed","failed"]),cn=l.object({headSha:l.string(),status:yd,summary:l.string(),assessedAt:l.string()}),Rr=l.object({id:l.string(),number:l.number(),title:l.string(),repo:l.string(),branch:l.string(),author:l.string(),url:l.string(),status:hd,feedbackItems:l.array(Ya),accepted:l.number(),rejected:l.number(),flagged:l.number(),testsPassed:l.boolean().nullable(),lintPassed:l.boolean().nullable(),lastChecked:l.string().nullable(),watchEnabled:l.boolean().default(!0),docsAssessment:cn.nullable().optional(),addedAt:l.string()}),Gg=Rr.omit({id:!0,addedAt:!0}),Za=l.object({url:l.string().url()}),es=l.object({id:l.string(),prId:l.string(),runId:l.string().nullable(),timestamp:l.string(),level:l.enum(["info","warn","error"]),phase:l.string().nullable(),message:l.string(),metadata:l.record(l.string(),l.unknown()).nullable()}),bd=l.enum(["running","completed","failed"]),_d=l.object({id:l.string(),prId:l.string(),preferredAgent:l.enum(["codex","claude"]),resolvedAgent:l.enum(["codex","claude"]).nullable(),status:bd,phase:l.string(),prompt:l.string().nullable(),initialHeadSha:l.string().nullable(),metadata:l.record(l.string(),l.unknown()).nullable(),lastError:l.string().nullable(),createdAt:l.string(),updatedAt:l.string()}),qg=l.object({drainMode:l.boolean(),drainRequestedAt:l.string().nullable(),drainReason:l.string().nullable()}),Rd=l.enum(["sync_watched_repos","babysit_pr","process_release_run","answer_pr_question","generate_social_changelog","heal_deployment"]),gn=l.enum(["queued","leased","completed","failed","canceled"]),pn=l.object({id:l.string(),kind:Rd,targetId:l.string(),dedupeKey:l.string(),status:gn,priority:l.number().int(),availableAt:l.string(),leaseOwner:l.string().nullable(),leaseToken:l.string().nullable(),leaseExpiresAt:l.string().nullable(),heartbeatAt:l.string().nullable(),attemptCount:l.number().int().nonnegative(),lastError:l.string().nullable(),payload:l.record(l.string(),l.unknown()),createdAt:l.string(),updatedAt:l.string(),completedAt:l.string().nullable()}),wd=l.enum(["pending","answering","answered","error"]),mn=l.object({id:l.string(),prId:l.string(),question:l.string(),answer:l.string().nullable(),status:wd,error:l.string().nullable(),createdAt:l.string(),answeredAt:l.string().nullable()}),ts=l.object({question:l.string().min(1).max(2e3)}),Sd=l.enum(["generating","done","error"]),kd=l.object({number:l.number(),title:l.string(),url:l.string(),author:l.string(),repo:l.string()}),hn=l.object({id:l.string(),date:l.string(),triggerCount:l.number(),prSummaries:l.array(kd),content:l.string().nullable(),status:Sd,error:l.string().nullable(),createdAt:l.string(),completedAt:l.string().nullable()}),vd=l.enum(["idle","triaging","awaiting_repair_slot","repairing","awaiting_ci","verifying","healed","cooldown","blocked","escalated","superseded"]),Td=l.enum(["healable_in_branch","blocked_external","flaky_or_ambiguous","unknown"]),Pd=l.enum(["queued","running","awaiting_ci","verified","failed","canceled"]),rs=l.object({id:l.string(),prId:l.string(),sha:l.string(),provider:l.string(),context:l.string(),status:l.string(),conclusion:l.string().nullable(),description:l.string(),targetUrl:l.string().nullable(),observedAt:l.string()}),ns=l.object({id:l.string(),sessionId:l.string(),sha:l.string(),fingerprint:l.string(),category:l.string(),classification:Td,summary:l.string(),selectedEvidence:l.array(l.string()),createdAt:l.string()}),fn=l.object({id:l.string(),prId:l.string(),repo:l.string(),prNumber:l.number(),initialHeadSha:l.string(),currentHeadSha:l.string(),state:vd,startedAt:l.string(),updatedAt:l.string(),endedAt:l.string().nullable(),blockedReason:l.string().nullable(),escalationReason:l.string().nullable(),latestFingerprint:l.string().nullable(),attemptCount:l.number(),lastImprovementScore:l.number().nullable()}),yn=l.object({id:l.string(),sessionId:l.string(),attemptNumber:l.number(),inputSha:l.string(),outputSha:l.string().nullable(),status:Pd,startedAt:l.string(),endedAt:l.string().nullable(),agent:l.enum(["codex","claude"]),promptDigest:l.string(),targetFingerprints:l.array(l.string()),summary:l.string().nullable(),improvementScore:l.number().nullable(),error:l.string().nullable()}),Ed=l.enum(["detected","evaluating","skipped","proposed","publishing","published","error"]),xd=l.enum(["patch","minor","major"]),Ad=l.object({number:l.number(),title:l.string(),url:l.string(),author:l.string(),mergedAt:l.string(),mergeSha:l.string()}),bn=l.object({id:l.string(),repo:l.string(),baseBranch:l.string(),triggerPrNumber:l.number(),triggerPrTitle:l.string(),triggerPrUrl:l.string(),triggerMergeSha:l.string(),triggerMergedAt:l.string(),status:Ed,decisionReason:l.string().nullable(),recommendedBump:xd.nullable(),proposedVersion:l.string().nullable(),releaseTitle:l.string().nullable(),releaseNotes:l.string().nullable(),includedPrs:l.array(Ad),targetSha:l.string().nullable(),githubReleaseId:l.number().nullable(),githubReleaseUrl:l.string().nullable(),error:l.string().nullable(),createdAt:l.string(),updatedAt:l.string(),completedAt:l.string().nullable()}),Cd=l.enum(["vercel","railway"]),Id=l.enum(["monitoring","failed","fixing","fix_submitted","escalated"]),_n=l.object({id:l.string(),repo:l.string(),platform:Cd,triggerPrNumber:l.number(),triggerPrTitle:l.string(),triggerPrUrl:l.string(),mergeSha:l.string(),deploymentId:l.string().nullable(),deploymentLog:l.string().nullable(),fixBranch:l.string().nullable(),fixPrNumber:l.number().nullable(),fixPrUrl:l.string().nullable(),state:Id,error:l.string().nullable(),createdAt:l.string(),updatedAt:l.string(),completedAt:l.string().nullable()}),as=l.object({githubToken:l.string(),codingAgent:l.enum(["codex","claude"]),maxTurns:l.number(),batchWindowMs:l.number(),pollIntervalMs:l.number(),maxChangesPerRun:l.number(),autoResolveMergeConflicts:l.boolean(),autoCreateReleases:l.boolean(),autoUpdateDocs:l.boolean(),autoHealCI:l.boolean(),maxHealingAttemptsPerSession:l.number(),maxHealingAttemptsPerFingerprint:l.number(),maxConcurrentHealingRuns:l.number(),healingCooldownMs:l.number(),autoHealDeployments:l.boolean(),deploymentCheckDelayMs:l.number(),deploymentCheckTimeoutMs:l.number(),deploymentCheckPollIntervalMs:l.number(),watchedRepos:l.array(l.string()),trustedReviewers:l.array(l.string()),ignoredBots:l.array(l.string())});import{randomUUID as xe}from"crypto";function Rn(r){return Rr.parse({...r,id:xe(),addedAt:new Date().toISOString()})}function wn(r,e){return Rr.parse({...r,...e,id:r.id,addedAt:r.addedAt})}function Sn(r,e,t,n){return es.parse({id:xe(),prId:r,runId:n?.runId??null,timestamp:new Date().toISOString(),level:e,phase:n?.phase??null,message:t,metadata:n?.metadata??null})}function kn(r,e){return mn.parse({id:xe(),prId:r,question:e,answer:null,status:"pending",error:null,createdAt:new Date().toISOString(),answeredAt:null})}function vn(r,e){return mn.parse({...r,...e,id:r.id,prId:r.prId,createdAt:r.createdAt})}function Tn(r){let e=new Date().toISOString();return pn.parse({...r,id:xe(),status:"queued",priority:r.priority??100,leaseOwner:null,leaseToken:null,leaseExpiresAt:null,heartbeatAt:null,attemptCount:0,lastError:null,createdAt:e,updatedAt:e,completedAt:null})}function Qt(r,e){return pn.parse({...r,...e,id:r.id,createdAt:r.createdAt,updatedAt:new Date().toISOString()})}function Pn(r){return hn.parse({...r,id:xe(),createdAt:new Date().toISOString()})}function En(r,e){return hn.parse({...r,...e,id:r.id,createdAt:r.createdAt})}function xn(r){let e=new Date().toISOString();return bn.parse({...r,id:xe(),createdAt:e,updatedAt:e})}function An(r,e){return bn.parse({...r,...e,id:r.id,createdAt:r.createdAt,updatedAt:new Date().toISOString()})}function Ft(r){return rs.parse({...r,id:xe()})}function Cn(r){return ns.parse({...r,id:xe(),createdAt:new Date().toISOString()})}function In(r){let e=new Date().toISOString();return fn.parse({...r,id:xe(),startedAt:e,updatedAt:e})}function Nn(r,e){return fn.parse({...r,...e,id:r.id,startedAt:r.startedAt,updatedAt:new Date().toISOString()})}function Dn(r){return yn.parse({...r,id:xe(),startedAt:new Date().toISOString()})}function Fn(r,e){return yn.parse({...r,...e,id:r.id,sessionId:r.sessionId,attemptNumber:r.attemptNumber,startedAt:r.startedAt})}function Hn(r){let e=new Date().toISOString();return _n.parse({...r,id:xe(),createdAt:e,updatedAt:e})}function Ln(r,e){return _n.parse({...r,...e,id:r.id,createdAt:r.createdAt,updatedAt:new Date().toISOString()})}function On(r,e){return as.parse({...r,...e,watchedRepos:e.watchedRepos??r.watchedRepos,trustedReviewers:e.trustedReviewers??r.trustedReviewers,ignoredBots:e.ignoredBots??r.ignoredBots})}var be={githubToken:"",codingAgent:"claude",maxTurns:15,batchWindowMs:3e5,pollIntervalMs:12e4,maxChangesPerRun:20,autoResolveMergeConflicts:!0,autoCreateReleases:!0,autoUpdateDocs:!0,autoHealCI:!1,maxHealingAttemptsPerSession:3,maxHealingAttemptsPerFingerprint:2,maxConcurrentHealingRuns:1,healingCooldownMs:3e5,autoHealDeployments:!1,deploymentCheckDelayMs:6e4,deploymentCheckTimeoutMs:6e5,deploymentCheckPollIntervalMs:15e3,watchedRepos:[],trustedReviewers:[],ignoredBots:["dependabot[bot]","codecov[bot]","github-actions[bot]"]};import{mkdirSync as os}from"fs";import{DatabaseSync as Od}from"node:sqlite";import Nd from"os";import Yt from"path";function Ae(r){let e=r||process.env.OH_MY_PR_HOME||process.env.CODEFACTORY_HOME||Yt.join(Nd.homedir(),".oh-my-pr");return{rootDir:e,stateDbPath:Yt.join(e,"state.sqlite"),logRootDir:Yt.join(e,"log"),repoRootDir:Yt.join(e,"repos"),worktreeRootDir:Yt.join(e,"worktrees")}}import{appendFileSync as Dd,mkdirSync as Fd}from"fs";import ss from"path";function Hd(r){return r.replace(/[^a-zA-Z0-9_.-]+/g,"__")}function Ld(r){let e=[r.timestamp,r.level.toUpperCase()];return r.phase&&e.push(`[${r.phase}]`),r.runId&&e.push(`run=${r.runId}`),e.push(r.message),r.metadata&&Object.keys(r.metadata).length>0&&e.push(JSON.stringify(r.metadata)),`${e.join(" ")}
3
- `}function is(r,e,t){let n=t.timestamp.slice(0,10),a=ss.join(r,n);Fd(a,{recursive:!0});let i=`${Hd(e.repo)}__${e.number}.log`,o=ss.join(a,i);Dd(o,Ld(t),"utf8")}var Md="cli-managed",$d=1e3,ds=1,Ud=new Set([5,6]),Bd={drainMode:!1,drainRequestedAt:null,drainReason:null},wr=class{db;rootDir;logRootDir;stateDbPath;constructor(e){let t=Ae(e);os(t.rootDir,{recursive:!0}),os(t.logRootDir,{recursive:!0}),this.rootDir=t.rootDir,this.logRootDir=t.logRootDir,this.stateDbPath=t.stateDbPath,this.db=this.createDatabaseConnection(),this.bootstrap()}createDatabaseConnection(){let e=new Od(this.stateDbPath,{timeout:$d,enableForeignKeyConstraints:!0});return e.exec("PRAGMA journal_mode = WAL"),e.exec("PRAGMA foreign_keys = ON"),e}isRetryableLockError(e){if(!(e instanceof Error))return!1;let t=e;return t.code==="ERR_SQLITE_ERROR"&&(typeof t.errcode=="number"&&Ud.has(t.errcode)||typeof t.errstr=="string"&&t.errstr.toLowerCase().includes("locked"))}reopenDatabase(){let e=this.db;this.db=this.createDatabaseConnection();try{e.close()}catch{}}throwPersistentLockError(e){let t=new Error(`SQLite database remained locked after recovery attempts at ${this.stateDbPath}. Stop the competing Code Factory process or use a different OH_MY_PR_HOME.`,{cause:e});throw t.name="SqliteDatabaseLockedError",t.code=e.code,t.errcode=e.errcode,t.errstr=e.errstr,t.statusCode=503,t}withLockRecovery(e){let t;for(let n=0;n<=ds;n+=1)try{return e()}catch(a){if(!this.isRetryableLockError(a))throw a;if(t=a,this.db.isTransaction||n===ds)break;this.reopenDatabase()}this.throwPersistentLockError(t??new Error("SQLite database lock recovery failed."))}exec(e){this.withLockRecovery(()=>{this.db.exec(e)})}get(e,...t){return this.withLockRecovery(()=>this.db.prepare(e).get(...t))}all(e,...t){return this.withLockRecovery(()=>this.db.prepare(e).all(...t))}run(e,...t){return this.withLockRecovery(()=>this.db.prepare(e).run(...t))}withWriteTransaction(e){if(this.db.isTransaction)return e();this.exec("BEGIN IMMEDIATE");try{let t=e();return this.exec("COMMIT"),t}catch(t){if(this.db.isTransaction)try{this.db.exec("ROLLBACK")}catch{}throw t}}bootstrap(){this.exec(`
2
+ var ao=Object.defineProperty;var so=(t,e)=>{for(var r in e)ao(t,r,{get:e[r],enumerable:!0})};import Ec from"react";import{render as Ac}from"ink";import ge,{useEffect as is,useMemo as _o,useState as En}from"react";import{Box as Lr,Text as wt,useApp as wo,useInput as Ro,useStdout as So}from"ink";import{useEffect as io,useState as Ze}from"react";function La(t,e,r=1500){let[n,a]=Ze([]),[s,i]=Ze(null),[o,c]=Ze([]),[u,m]=Ze([]),[g,p]=Ze([]),[h,I]=Ze(null),[R,k]=Ze(null),[V,B]=Ze(!0),[A,F]=Ze(null);return io(()=>{let D=!1,l=async()=>{try{let[T,x,v,b]=await Promise.all([t.listPRs("active"),t.listRepos(),t.getConfig(),t.getRuntimeSnapshot()]),O=e?await t.getPR(e):T[0]??null,[G,ae]=O?await Promise.all([t.listLogs(O.id),t.listPRQuestions(O.id)]):[[],[]];if(D)return;a(T),p(x),I(v),k(b),i(O),c(G),m(ae),F(null)}catch(T){if(D)return;F(T instanceof Error?T.message:String(T))}finally{D||B(!1)}};l();let w=t.subscribe(()=>{l()}),y=r>0?setInterval(()=>{l()},r):null;return()=>{D=!0,w(),y&&clearInterval(y)}},[t,e,r]),{prs:n,selectedPr:s,logs:o,questions:u,repos:g,config:h,runtime:R,loading:V,error:A,refresh:async()=>{let D=await t.listPRs("active"),l=await t.listRepos(),w=await t.getConfig(),y=await t.getRuntimeSnapshot(),T=e?await t.getPR(e):D[0]??null,[x,v]=T?await Promise.all([t.listLogs(T.id),t.listPRQuestions(T.id)]):[[],[]];a(D),p(l),I(w),k(y),i(T),c(x),m(v),B(!1),F(null)}}}import{useEffect as yn,useState as et}from"react";function Ee(t,e){return e<=0?0:Math.max(0,Math.min(t,e-1))}function Oa(t){let[e,r]=et("prs"),[n,a]=et("logs"),[s,i]=et(0),[o,c]=et(0),[u,m]=et(0),[g,p]=et(0),[h,I]=et(new Set),[R,k]=et("none"),[V,B]=et("");return yn(()=>{i(A=>Ee(A,t.prCount))},[t.prCount]),yn(()=>{c(A=>Ee(A,t.feedbackCount))},[t.feedbackCount]),yn(()=>{m(A=>Ee(A,t.contextItemCount))},[t.contextItemCount]),{activePane:e,contextMode:n,selectedPrIndex:s,selectedFeedbackIndex:o,selectedContextIndex:u,feedbackActionIndex:g,setFeedbackActionIndex(A){p(Math.max(0,A))},expandedFeedbackIds:h,inputMode:R,inputValue:V,cyclePane(){r(A=>A==="prs"?"feedback":A==="feedback"?"context":"prs")},setContextMode(A){a(A),r("context"),m(0),k("none"),B("")},setSelectedPrIndex(A){i(Ee(A,t.prCount))},setSelectedFeedbackIndex(A){c(Ee(A,t.feedbackCount)),p(0)},moveUp(){if(e==="prs"){i(A=>Ee(A-1,t.prCount));return}if(e==="feedback"){c(A=>Ee(A-1,t.feedbackCount)),p(0);return}m(A=>Ee(A-1,t.contextItemCount))},moveDown(){if(e==="prs"){i(A=>Ee(A+1,t.prCount));return}if(e==="feedback"){c(A=>Ee(A+1,t.feedbackCount)),p(0);return}m(A=>Ee(A+1,t.contextItemCount))},toggleExpandedFeedback(A){I(F=>{let D=new Set(F);return D.has(A)?D.delete(A):D.add(A),D}),p(0)},beginInput(A){k(A),B("")},updateInput(A){B(A)},resetInput(){k("none"),B("")},setSelectedContextIndex(A){m(Ee(A,t.contextItemCount))}}}function Ma(t){return t==="processing"?"running":t==="done"?"done":t==="error"?"needs attention":t==="archived"?"archived":"watching"}function _n(t){return t.replace("_"," ").toUpperCase()}function $a(t){return t.reduce((e,r)=>(r.status==="queued"?e.queued+=1:r.status==="in_progress"?e.inProgress+=1:r.status==="failed"?e.failed+=1:r.status==="warning"&&(e.warning+=1),e),{queued:0,inProgress:0,failed:0,warning:0})}function oo(t){return t==="resolved"||t==="rejected"}function Ua(t){return t.length===0?!1:t.every(e=>oo(e.status))}function Ba(t){return t>=150?"full":t>=110?"stacked":"compact-warning"}function wn(t){let e=["Accept","Reject","Flag"];return(t.status==="failed"||t.status==="warning")&&e.push("Retry"),e}function Le(t,e){return e<=0?"":e===1?t.slice(0,1):t.length<=e?t:`${t.slice(0,Math.max(1,e-1))}\u2026`}function bt(t,e){if(e<=0)return"";if(e===1)return"\u2026";if(t.length<=e)return t;let r=Math.ceil((e-1)/2),n=Math.floor((e-1)/2);return`${t.slice(0,r)}\u2026${t.slice(t.length-n)}`}function Ir(t,e,r){if(t<=0||r<=0)return{start:0,end:0,hiddenAbove:0,hiddenBelow:0};let n=Math.min(t,r),a=Math.max(0,Math.min(e,t-1)),s=Math.floor(n/2),i=Math.max(0,a-s),o=Math.max(0,t-n);i>o&&(i=o);let c=Math.min(t,i+n);return{start:i,end:c,hiddenAbove:i,hiddenBelow:Math.max(0,t-c)}}function Nr(t,e){if(e<1)return t?[t]:[""];let n=t.replace(/\r\n/g,`
3
+ `).split(`
4
+ `),a=[];for(let s of n){let i=s.replace(/\s+/g," ").trim();if(!i){a.push("");continue}let o=i;for(;o.length>e;){let u=o.slice(0,e+1).lastIndexOf(" ");u<=0&&(u=e);let m=o.slice(0,u).trimEnd();a.push(m),o=o.slice(u).trimStart()}o&&a.push(o)}return a.length===0?[""]:a}function ja(){return[{key:"Tab",label:"pane"},{key:"\u2191\u2193",label:"move"},{key:"\u23CE",label:"select"},{key:"r",label:"run"},{key:"w",label:"watch"},{key:"l",label:"logs"},{key:"a",label:"ask"},{key:"o",label:"repos"},{key:"s",label:"settings"},{key:"q",label:"quit"}]}import ne from"react";import{Box as kn,Text as Oe}from"ink";var f={accent:"cyan",ok:"green",warn:"yellow",err:"red",info:"magenta",muted:"gray"},$={focus:"\u276F",bullet:"\u2022",dot:"\u25CF",ring:"\u25CB",running:"\u25D0",check:"\u2713",cross:"\u2717",warn:"!",pause:"\u23F8",caret:"\u203A",sep:"\u2502",collapsed:"\u25B8",expanded:"\u25BE"};function Fr(t){return t==="processing"?f.info:t==="done"?f.ok:t==="error"?f.err:t==="archived"?f.muted:f.accent}function Dr(t){return t==="processing"?$.running:t==="done"?$.check:t==="error"?$.cross:t==="archived"?$.ring:$.dot}function Rn(t){return t==="resolved"?f.ok:t==="rejected"?f.muted:t==="failed"?f.err:t==="warning"?f.warn:t==="in_progress"?f.info:t==="queued"?f.accent:f.muted}function Sn(t){return t==="resolved"?$.check:t==="rejected"||t==="failed"?$.cross:t==="warning"?$.warn:t==="in_progress"?$.running:t==="queued"?$.ring:$.bullet}function Ja(){return ne.createElement(Oe,{color:f.muted},` ${$.sep} `)}function vn(t){return ne.createElement(Oe,null,ne.createElement(Oe,{color:t.tone},t.glyph),ne.createElement(Oe,null," "),ne.createElement(Oe,{bold:!0,color:t.tone},t.value),ne.createElement(Oe,{color:f.muted}," ",t.label))}function Ga(t){let e=t.config?.codingAgent??"claude",r=t.runtime?.activeRuns??0;return ne.createElement(kn,{justifyContent:"space-between",borderStyle:"round",borderColor:f.accent,paddingX:1},ne.createElement(kn,null,ne.createElement(Oe,{color:f.accent,bold:!0},$.focus," "),ne.createElement(Oe,{bold:!0},"oh-my-pr"),ne.createElement(Oe,{color:f.muted},` ${$.sep} `),ne.createElement(Oe,{color:f.muted},"agent "),ne.createElement(Oe,{color:f.accent},e)),ne.createElement(kn,null,ne.createElement(vn,{glyph:$.dot,label:"repos",value:t.repoCount,tone:f.accent}),ne.createElement(Ja,null),ne.createElement(vn,{glyph:$.dot,label:"prs",value:t.prCount,tone:f.accent}),ne.createElement(Ja,null),ne.createElement(vn,{glyph:r>0?$.running:$.ring,label:"active",value:r,tone:r>0?f.info:f.muted})))}import lt from"react";import{Box as Xa,Text as cr}from"ink";function lo(t,e){let r=`#${t}`;return r.length>=e?r:`${" ".repeat(e-r.length)}${r}`}function uo(t){let e=[],r=$a(t.feedbackItems);return r.failed>0&&e.push({label:`${r.failed}!`,tone:f.err}),r.warning>0&&e.push({label:`${r.warning}\u26A0`,tone:f.warn}),r.inProgress>0&&e.push({label:`${r.inProgress}\u25D0`,tone:f.info}),r.queued>0&&e.push({label:`${r.queued}\u25CB`,tone:f.accent}),t.watchEnabled||e.push({label:"paused",tone:f.muted}),Ua(t.feedbackItems)&&t.status!=="processing"&&e.push({label:"ready",tone:f.ok}),e}function co(t){let{pr:e,selected:r,width:n}=t,a=uo(e),s=lo(e.number,5),i=a.map(c=>c.label).join(" "),o=Le([`${Dr(e.status)} ${s}`,e.title,i].filter(Boolean).join(" "),n-2);return lt.createElement(cr,{color:r?f.accent:Fr(e.status),bold:r},r?`${$.focus} `:" ",o)}function qa(t){let e=t.active?f.accent:f.muted,r=(t.width??40)-4,n=Math.max(3,(t.height??16)-4),a=Ir(t.prs.length,t.selectedPrIndex,n),s=t.prs.slice(a.start,a.end);return lt.createElement(Xa,{flexDirection:"column",borderStyle:t.active?"round":"single",borderColor:e,paddingX:1,width:t.width,height:t.height},lt.createElement(Xa,null,lt.createElement(cr,{bold:!0,color:t.active?f.accent:void 0},"Pull Requests"),lt.createElement(cr,{color:f.muted},` ${t.prs.length}`),(a.hiddenAbove>0||a.hiddenBelow>0)&&lt.createElement(cr,{color:f.muted},` \u2191${a.hiddenAbove} \u2193${a.hiddenBelow}`)),t.prs.length===0?lt.createElement(cr,{color:f.muted},"No tracked PRs."):s.map((i,o)=>lt.createElement(co,{key:i.id,pr:i,selected:a.start+o===t.selectedPrIndex,width:r})))}import K from"react";import{Box as rt,Text as fe}from"ink";import tt from"react";import{Box as Va,Text as Jt}from"ink";import jt from"react";import{Box as go,Text as Tn}from"ink";var mo={Accept:f.ok,Reject:f.err,Flag:f.warn,Retry:f.info,Collapse:f.muted};function Wa(t){return jt.createElement(go,{marginTop:1},t.actions.map((e,r)=>{let n=mo[e]??f.accent,a=r===t.selectedActionIndex;return jt.createElement(jt.Fragment,{key:e},a?jt.createElement(Tn,{inverse:!0,bold:!0,color:n},` ${e} `):jt.createElement(Tn,{color:n},` ${e} `),r<t.actions.length-1&&jt.createElement(Tn,null," "))}))}function po(t){return t.replace(/\s+/g," ").trim()}function Ka(t){return t.items.length===0?tt.createElement(Jt,{color:f.muted},"No feedback items yet."):tt.createElement(Va,{flexDirection:"column"},t.items.map((e,r)=>{let n=r===t.selectedFeedbackIndex,a=Rn(e.status),s=_n(e.status),i=Math.max(12,t.width-2),o=Math.max(8,Math.min(18,Math.floor(i*.24))),c=Le(e.author,o),u=e.file?`${e.file}${e.line?`:${e.line}`:""}`:"",m=u?bt(u,Math.max(10,Math.min(24,Math.floor(i*.34)))):"",g=Le([`${Sn(e.status)} ${s}`,m,c,po(e.body)].filter(Boolean).join(" \u2502 "),t.width-2);return tt.createElement(Jt,{key:e.id,color:n?f.accent:a},n?`${$.focus} `:" ",g)}))}function za(t){if(!t.item)return tt.createElement(Jt,{color:f.muted},"Select a feedback item.");let e=t.item,r=Rn(e.status),n=_n(e.status),a=Le(e.author,Math.max(10,Math.floor(t.width*.22))),s=e.file?`${e.file}${e.line?`:${e.line}`:""}`:"",i=s?bt(s,Math.max(16,Math.floor(t.width*.45))):"",o=Le([`${Sn(e.status)} ${n}`,i,a].filter(Boolean).join(` ${$.sep} `),t.width),c=t.expanded&&t.active?1:0,u=Nr(e.body,Math.max(16,t.width)),m=Math.max(1,t.height-1-c),g=u.slice(0,m),p=u.length-g.length;return p>0&&t.height-2-c>=1&&(m=Math.max(1,t.height-2-c),g=u.slice(0,m),p=u.length-g.length),tt.createElement(Va,{flexDirection:"column"},tt.createElement(Jt,{color:r},o),g.map((h,I)=>tt.createElement(Jt,{key:`${e.id}-${I}`,color:f.muted},h)),p>0&&tt.createElement(Jt,{color:f.muted},`\u2193 ${p} more line${p===1?"":"s"}`),t.expanded&&t.active&&tt.createElement(Wa,{actions:t.selectedActions,selectedActionIndex:Math.min(t.selectedActionIndex,t.selectedActions.length-1)}))}function Qa(t){let e=t.active?f.accent:f.muted,r=Math.max(24,(t.width??80)-4),n=Math.max(4,t.height-4);if(!t.pr)return K.createElement(rt,{flexDirection:"column",borderStyle:t.active?"round":"single",borderColor:e,paddingX:1,width:t.width,height:t.height,flexGrow:1},K.createElement(rt,null,K.createElement(fe,{bold:!0,color:t.active?f.accent:void 0},"PR Detail")),K.createElement(fe,{color:f.muted},"Select a PR."));let a=t.pr.feedbackItems[t.selectedFeedbackIndex]??null,s=a?t.expandedFeedbackIds.has(a.id):!1,i=s&&t.active?1:0,o=Math.max(6,n-6-i),c=Math.max(3,Math.min(8,Math.floor(o*.45))),u=Math.max(3,o-c+i),m=Ir(t.pr.feedbackItems.length,t.selectedFeedbackIndex,c),g=t.pr.feedbackItems.slice(m.start,m.end),p=t.selectedFeedbackIndex-m.start,h=bt(t.pr.repo,Math.max(18,Math.floor(r*.55))),I=Le(t.pr.title,r);return K.createElement(rt,{flexDirection:"column",borderStyle:t.active?"round":"single",borderColor:e,paddingX:1,width:t.width,height:t.height,flexGrow:1},K.createElement(rt,null,K.createElement(fe,{bold:!0,color:t.active?f.accent:void 0},"PR Detail")),K.createElement(rt,null,K.createElement(fe,{color:f.muted},h),K.createElement(fe,{color:f.muted}," "),K.createElement(fe,{bold:!0,color:f.accent},"#",t.pr.number)),K.createElement(rt,null,K.createElement(fe,{bold:!0},I)),K.createElement(rt,null,K.createElement(fe,{color:Fr(t.pr.status)},Dr(t.pr.status)," ",Ma(t.pr.status)),K.createElement(fe,{color:f.muted},` ${$.sep} `),K.createElement(fe,{color:t.pr.watchEnabled?f.ok:f.warn},t.pr.watchEnabled?$.dot:$.pause," ",t.pr.watchEnabled?"watching":"paused"),K.createElement(fe,{color:f.muted},` ${$.sep} `),K.createElement(fe,{color:f.muted},"feedback "),K.createElement(fe,{bold:!0},t.pr.feedbackItems.length)),K.createElement(rt,null,K.createElement(fe,{color:f.muted},"Feedback",` ${g.length}/${t.pr.feedbackItems.length}`,m.hiddenAbove>0||m.hiddenBelow>0?` \u2191${m.hiddenAbove} \u2193${m.hiddenBelow}`:"")),K.createElement(Ka,{items:g,selectedFeedbackIndex:Math.max(0,p),width:r}),K.createElement(rt,null,K.createElement(fe,{color:f.muted},"Selected feedback")),K.createElement(za,{item:a,active:t.active,expanded:s,selectedActionIndex:t.selectedActionIndex,selectedActions:t.selectedActions,width:r,height:u}))}import ce from"react";import{Box as Hr,Text as mr}from"ink";import dt from"react";import{Box as ho,Text as yt}from"ink";var fo={error:f.err,warn:f.warn,warning:f.warn,info:f.accent,debug:f.muted};function Ya(t){return new Date(t).toLocaleTimeString("en-US",{hour12:!1})}function Za(t){let e=Math.max(3,t.height-2),r=t.logs.slice(-e),n=Math.max(0,t.logs.length-r.length);return r.length===0?dt.createElement(yt,{color:f.muted},"No log entries."):dt.createElement(ho,{flexDirection:"column"},n>0&&dt.createElement(yt,{color:f.muted},`\u2191 ${n} earlier log${n===1?"":"s"}`),r.map(a=>{let s=fo[a.level.toLowerCase()]??f.muted,i=a.phase?bt(a.phase,Math.max(8,Math.floor(t.width*.2))):"",o=`${Ya(a.timestamp)} ${a.level.toUpperCase()}${i?` ${i}`:""} `,c=Le(a.message,Math.max(12,t.width-o.length));return dt.createElement(yt,{key:a.id},dt.createElement(yt,{color:f.muted},Ya(a.timestamp)," "),dt.createElement(yt,{color:s,bold:!0},a.level.toUpperCase()),i&&dt.createElement(yt,{color:f.muted}," ",i),dt.createElement(yt,null," ",c))}))}import z from"react";import{Box as _t,Text as be}from"ink";function es(t){return z.createElement(_t,{flexDirection:"column"},t.questions.length===0?z.createElement(be,{color:f.muted},"Press Enter to ask about the selected PR."):t.questions.slice(-6).map(e=>z.createElement(_t,{key:e.id,flexDirection:"column",marginBottom:1},z.createElement(_t,null,z.createElement(be,{color:f.accent,bold:!0},"Q "),z.createElement(be,null,e.question)),e.status==="answered"&&e.answer?Nr(e.answer,Math.max(20,t.width-4)).map((r,n)=>z.createElement(_t,{key:`${e.id}-${n}`},n===0&&z.createElement(be,{color:f.ok,bold:!0},"A "),n!==0&&z.createElement(be,null," "),z.createElement(be,null,r))):e.status==="error"?z.createElement(_t,null,z.createElement(be,{color:f.err,bold:!0},$.cross," "),z.createElement(be,{color:f.err},e.error??"Unknown error")):z.createElement(_t,null,z.createElement(be,{color:f.info},$.running," "),z.createElement(be,{color:f.muted},"Agent is thinking\u2026")))),z.createElement(_t,{marginTop:1},t.inputMode?z.createElement(z.Fragment,null,z.createElement(be,{color:f.ok,bold:!0},"Ask"),z.createElement(be,{color:f.muted},": "),z.createElement(be,null,t.inputValue||"\u2026"),z.createElement(be,{color:f.accent},"\u258C")):z.createElement(be,{color:f.muted},"Press Enter to compose a question")))}import ye from"react";import{Box as gr,Text as We}from"ink";var bo=["Sync repositories","Add repository","Add PR URL"];function ts(t){return ye.createElement(gr,{flexDirection:"column"},bo.map((e,r)=>{let n=r===t.selectedActionIndex;return ye.createElement(gr,{key:e},ye.createElement(We,{color:n?f.accent:f.muted},n?`${$.focus} `:" "),ye.createElement(We,{color:n?f.accent:void 0,bold:n},e))}),ye.createElement(gr,{flexDirection:"column",marginTop:1},ye.createElement(We,{color:f.muted},"Tracked repositories"),t.repos.length===0?ye.createElement(We,{color:f.muted}," None yet."):t.repos.map(e=>ye.createElement(gr,{key:e},ye.createElement(We,{color:f.muted}," ",$.dot," "),ye.createElement(We,null,e)))),t.inputMode!=="none"&&ye.createElement(gr,{marginTop:1},ye.createElement(We,{color:f.ok,bold:!0},t.inputMode==="addRepo"?"Repo":"PR URL"),ye.createElement(We,{color:f.muted},": "),ye.createElement(We,null,t.inputValue||"\u2026"),ye.createElement(We,{color:f.accent},"\u258C")))}import nt from"react";import{Box as xn,Text as Gt}from"ink";function rs(t){let e=[{label:"Coding agent",value:t.config?.codingAgent??"claude"},{label:"Auto-resolve conflicts",value:!!t.config?.autoResolveMergeConflicts},{label:"Auto-update docs",value:!!t.config?.autoUpdateDocs}];return nt.createElement(xn,{flexDirection:"column"},e.map((r,n)=>{let a=n===t.selectedIndex,s=typeof r.value=="boolean",i=s?r.value?f.ok:f.muted:f.accent;return nt.createElement(xn,{key:r.label},nt.createElement(Gt,{color:a?f.accent:f.muted},a?`${$.focus} `:" "),nt.createElement(Gt,{color:a?f.accent:void 0},r.label),nt.createElement(Gt,{color:f.muted}," "),s?nt.createElement(Gt,{color:i,bold:!0},r.value?`${$.dot} on`:`${$.ring} off`):nt.createElement(Gt,{color:i,bold:!0},String(r.value)))}),nt.createElement(xn,{marginTop:1},nt.createElement(Gt,{color:f.muted},"Enter toggles the selected setting.")))}var ns=[{key:"logs",label:"logs",hint:"l"},{key:"ask",label:"ask",hint:"a"},{key:"repos",label:"repos",hint:"o"},{key:"settings",label:"settings",hint:"s"}];function yo(t){return ce.createElement(Hr,null,ns.map((e,r)=>{let n=e.key===t.mode;return ce.createElement(ce.Fragment,{key:e.key},n?ce.createElement(mr,{color:t.active?f.accent:f.muted,inverse:!0,bold:!0},` ${e.label} `):ce.createElement(mr,{color:f.muted},` ${e.label} `,ce.createElement(mr,{dimColor:!0},"[",e.hint,"]")),r<ns.length-1&&ce.createElement(mr,{color:f.muted}," "))}))}function as(t){let e=t.active?f.accent:f.muted,r=Math.max(2,t.height-5);return ce.createElement(Hr,{flexDirection:"column",borderStyle:t.active?"round":"single",borderColor:e,paddingX:1,width:t.width,height:t.height},ce.createElement(Hr,{justifyContent:"space-between"},ce.createElement(mr,{bold:!0,color:t.active?f.accent:void 0},"Context")),ce.createElement(yo,{mode:t.mode,active:t.active}),ce.createElement(Hr,{marginTop:1,flexDirection:"column"},t.mode==="logs"&&ce.createElement(Za,{logs:t.logs,width:Math.max(20,(t.width??40)-4),height:r}),t.mode==="ask"&&ce.createElement(es,{questions:t.questions,inputMode:t.inputMode==="ask",inputValue:t.inputValue,width:t.width??40}),t.mode==="repos"&&ce.createElement(ts,{repos:t.repos,selectedActionIndex:t.selectedContextIndex,inputMode:t.inputMode,inputValue:t.inputValue}),t.mode==="settings"&&ce.createElement(rs,{config:t.config,selectedIndex:t.selectedContextIndex})))}import Me from"react";import{Box as Pn,Text as Xt}from"ink";function ss(t){let e=!!t.errorMessage,r=e?f.err:t.statusMessage?f.ok:f.muted,n=t.errorMessage??t.statusMessage??"Ready",a=ja();return Me.createElement(Pn,{justifyContent:"space-between",borderStyle:"round",borderColor:f.muted,paddingX:1},Me.createElement(Pn,null,Me.createElement(Xt,{color:r},$.dot),Me.createElement(Xt,null," "),Me.createElement(Xt,{color:r,bold:e},n)),Me.createElement(Pn,null,a.map((s,i)=>Me.createElement(Me.Fragment,{key:s.key},Me.createElement(Xt,{color:f.accent,inverse:!0,bold:!0},` ${s.key} `),Me.createElement(Xt,{color:f.muted},` ${s.label}`),i<a.length-1&&Me.createElement(Xt,{color:f.muted}," ")))))}function ko(t){return t==="repos"||t==="settings"?3:0}function vo(t){return t instanceof Error?t.message:String(t)}function An(t){let{exit:e}=wo(),{stdout:r}=So(),[n,a]=En(null),[s,i]=En(null),o=t.screenWidth??r.columns??160,c=t.screenHeight??r.rows??40,u=Ba(o),[m,g]=En(null),p=La(t.runtime,m,t.refreshMs??1500),h=Oa({prCount:p.prs.length,feedbackCount:p.selectedPr?.feedbackItems.length??0,contextItemCount:3}),I=ko(h.contextMode);is(()=>{if(p.prs.length===0){g(null);return}let v=p.prs[h.selectedPrIndex]??p.prs[0];g(v?.id??null)},[p.prs,h.selectedPrIndex]),is(()=>{h.selectedContextIndex>=I&&h.setSelectedContextIndex(Math.max(0,I-1))},[I,h]);let R=p.selectedPr??p.prs[h.selectedPrIndex]??null,k=R?.feedbackItems[h.selectedFeedbackIndex]??null,V=k?h.expandedFeedbackIds.has(k.id):!1,B=k?V?["Collapse",...wn(k)]:wn(k):[],A=Math.min(h.feedbackActionIndex,Math.max(0,B.length-1)),F=v=>{a(v),i(null)},D=v=>{i(vo(v))},l=async v=>{let b=B[A];if(!(!R||!b))try{if(b==="Collapse"){h.toggleExpandedFeedback(v.id);return}if(b==="Retry"){await t.runtime.retryFeedback(R.id,v.id),F("Queued feedback retry");return}let O=b.toLowerCase();await t.runtime.setFeedbackDecision(R.id,v.id,O),F(`Marked feedback as ${O}`)}catch(O){D(O)}},w=async()=>{if(!R&&h.inputMode==="ask"){i("Select a PR first");return}let v=h.inputValue.trim();if(!v){h.resetInput();return}try{h.inputMode==="ask"&&R?(await t.runtime.askQuestion(R.id,v),F("Queued agent question")):h.inputMode==="addRepo"?(await t.runtime.addRepo(v),F("Repository added")):h.inputMode==="addPr"&&(await t.runtime.addPR(v),F("PR added"))}catch(b){D(b)}finally{h.resetInput()}},y=async()=>{if(!p.config)return;let v=p.config,b=null;if(h.selectedContextIndex===0?b={codingAgent:v.codingAgent==="claude"?"codex":"claude"}:h.selectedContextIndex===1?b={autoResolveMergeConflicts:!v.autoResolveMergeConflicts}:h.selectedContextIndex===2&&(b={autoUpdateDocs:!v.autoUpdateDocs}),!!b)try{await t.runtime.updateConfig(b),F("Settings updated")}catch(O){D(O)}},T=async()=>{if(h.contextMode==="ask"){h.beginInput("ask");return}if(h.contextMode==="repos"){if(h.selectedContextIndex===0){try{await t.runtime.syncRepos(),F("Repository sync queued")}catch(v){D(v)}return}if(h.selectedContextIndex===1){h.beginInput("addRepo");return}h.selectedContextIndex===2&&h.beginInput("addPr");return}h.contextMode==="settings"&&await y()};Ro((v,b)=>{if(h.inputMode!=="none"){if(b.escape){h.resetInput();return}if(b.return){w();return}if(b.backspace||b.delete){h.updateInput(h.inputValue.slice(0,-1));return}!b.ctrl&&!b.meta&&v&&h.updateInput(`${h.inputValue}${v}`);return}if(b.tab){h.cyclePane();return}if(v==="q"){e();return}if(v==="l"){h.setContextMode("logs");return}if(v==="a"){h.setContextMode("ask");return}if(v==="o"){h.setContextMode("repos");return}if(v==="s"){h.setContextMode("settings");return}if(v==="r"&&R){t.runtime.queueBabysit(R.id).then(()=>{F("Queued babysitter run")}).catch(D);return}if(v==="w"&&R){t.runtime.setWatchEnabled(R.id,!R.watchEnabled).then(()=>{F(R.watchEnabled?"Watch paused":"Watch resumed")}).catch(D);return}if(b.upArrow){h.moveUp();return}if(b.downArrow){h.moveDown();return}if(b.leftArrow&&k){h.setFeedbackActionIndex(Math.max(0,A-1));return}if(b.rightArrow&&k){h.setFeedbackActionIndex(Math.min(B.length-1,A+1));return}if(b.return){if(h.activePane==="feedback"&&k){if(!h.expandedFeedbackIds.has(k.id)){h.toggleExpandedFeedback(k.id);return}l(k);return}h.activePane==="context"&&T()}},{isActive:!0});let x=_o(()=>{let v=Math.max(u==="stacked"?22:12,c-6);if(u==="full")return{widths:{list:40,context:48},heights:{list:v,detail:v,context:v}};let b=Math.max(7,Math.floor(v*.25)),O=Math.max(7,Math.floor(v*.3)),G=Math.max(8,v-b-O);return{widths:{list:o,context:void 0},heights:{list:b,detail:G,context:O}}},[c,u,o]);return u==="compact-warning"?ge.createElement(Lr,{flexDirection:"column",borderStyle:"round",borderColor:f.warn,paddingX:1},ge.createElement(wt,null,ge.createElement(wt,{color:f.accent,bold:!0},$.focus," "),ge.createElement(wt,{bold:!0},"oh-my-pr")),ge.createElement(wt,{color:f.warn},"Window too narrow for the terminal UI."),ge.createElement(wt,{color:f.muted},"Resize to at least 110 columns.")):ge.createElement(Lr,{flexDirection:"column"},ge.createElement(Ga,{runtime:p.runtime,config:p.config,repoCount:p.repos.length,prCount:p.prs.length,activePane:h.activePane,contextMode:h.contextMode}),p.loading?ge.createElement(Lr,{borderStyle:"round",borderColor:f.muted,paddingX:1},ge.createElement(wt,{color:f.info},$.running," "),ge.createElement(wt,null,"Loading TUI\u2026")):ge.createElement(Lr,{flexDirection:u==="stacked"?"column":"row"},ge.createElement(qa,{prs:p.prs,selectedPrIndex:h.selectedPrIndex,active:h.activePane==="prs",width:x.widths.list,height:x.heights.list}),ge.createElement(Qa,{pr:R,selectedFeedbackIndex:h.selectedFeedbackIndex,active:h.activePane==="feedback",expandedFeedbackIds:h.expandedFeedbackIds,selectedActionIndex:A,selectedActions:B,width:u==="full"?o-x.widths.list-x.widths.context:void 0,height:x.heights.detail}),ge.createElement(as,{mode:h.contextMode,active:h.activePane==="context",width:x.widths.context,height:x.heights.context,logs:p.logs,questions:p.questions,repos:p.repos,config:p.config,selectedContextIndex:h.selectedContextIndex,inputMode:h.inputMode,inputValue:h.inputValue})),ge.createElement(ss,{contextMode:h.contextMode,statusMessage:n,errorMessage:s??p.error}))}import{EventEmitter as Pc}from"node:events";var d={};so(d,{BRAND:()=>zo,DIRTY:()=>Rt,EMPTY_PATH:()=>Eo,INVALID:()=>H,NEVER:()=>Dl,OK:()=>me,ParseStatus:()=>ie,Schema:()=>j,ZodAny:()=>gt,ZodArray:()=>ot,ZodBigInt:()=>kt,ZodBoolean:()=>vt,ZodBranded:()=>hr,ZodCatch:()=>Ht,ZodDate:()=>Tt,ZodDefault:()=>Dt,ZodDiscriminatedUnion:()=>$r,ZodEffects:()=>Ie,ZodEnum:()=>Nt,ZodError:()=>ve,ZodFirstPartyTypeKind:()=>L,ZodFunction:()=>Br,ZodIntersection:()=>At,ZodIssueCode:()=>S,ZodLazy:()=>Ct,ZodLiteral:()=>It,ZodMap:()=>Qt,ZodNaN:()=>Zt,ZodNativeEnum:()=>Ft,ZodNever:()=>$e,ZodNull:()=>Pt,ZodNullable:()=>ze,ZodNumber:()=>St,ZodObject:()=>Te,ZodOptional:()=>Ae,ZodParsedType:()=>E,ZodPipeline:()=>fr,ZodPromise:()=>mt,ZodReadonly:()=>Lt,ZodRecord:()=>Ur,ZodSchema:()=>j,ZodSet:()=>Yt,ZodString:()=>ct,ZodSymbol:()=>Kt,ZodTransformer:()=>Ie,ZodTuple:()=>Ke,ZodType:()=>j,ZodUndefined:()=>xt,ZodUnion:()=>Et,ZodUnknown:()=>it,ZodVoid:()=>zt,addIssueToContext:()=>P,any:()=>sl,array:()=>dl,bigint:()=>el,boolean:()=>bs,coerce:()=>Fl,custom:()=>ps,date:()=>tl,datetimeRegex:()=>gs,defaultErrorMap:()=>at,discriminatedUnion:()=>ml,effect:()=>Tl,enum:()=>Sl,function:()=>_l,getErrorMap:()=>qt,getParsedType:()=>Ve,instanceof:()=>Yo,intersection:()=>pl,isAborted:()=>Or,isAsync:()=>Wt,isDirty:()=>Mr,isValid:()=>ut,late:()=>Qo,lazy:()=>wl,literal:()=>Rl,makeIssue:()=>pr,map:()=>bl,nan:()=>Zo,nativeEnum:()=>kl,never:()=>ol,null:()=>al,nullable:()=>Pl,number:()=>fs,object:()=>ul,objectUtil:()=>Cn,oboolean:()=>Nl,onumber:()=>Il,optional:()=>xl,ostring:()=>Cl,pipeline:()=>Al,preprocess:()=>El,promise:()=>vl,quotelessJson:()=>To,record:()=>fl,set:()=>yl,setErrorMap:()=>Po,strictObject:()=>cl,string:()=>hs,symbol:()=>rl,transformer:()=>Tl,tuple:()=>hl,undefined:()=>nl,union:()=>gl,unknown:()=>il,util:()=>J,void:()=>ll});var J;(function(t){t.assertEqual=a=>{};function e(a){}t.assertIs=e;function r(a){throw new Error}t.assertNever=r,t.arrayToEnum=a=>{let s={};for(let i of a)s[i]=i;return s},t.getValidEnumValues=a=>{let s=t.objectKeys(a).filter(o=>typeof a[a[o]]!="number"),i={};for(let o of s)i[o]=a[o];return t.objectValues(i)},t.objectValues=a=>t.objectKeys(a).map(function(s){return a[s]}),t.objectKeys=typeof Object.keys=="function"?a=>Object.keys(a):a=>{let s=[];for(let i in a)Object.prototype.hasOwnProperty.call(a,i)&&s.push(i);return s},t.find=(a,s)=>{for(let i of a)if(s(i))return i},t.isInteger=typeof Number.isInteger=="function"?a=>Number.isInteger(a):a=>typeof a=="number"&&Number.isFinite(a)&&Math.floor(a)===a;function n(a,s=" | "){return a.map(i=>typeof i=="string"?`'${i}'`:i).join(s)}t.joinValues=n,t.jsonStringifyReplacer=(a,s)=>typeof s=="bigint"?s.toString():s})(J||(J={}));var Cn;(function(t){t.mergeShapes=(e,r)=>({...e,...r})})(Cn||(Cn={}));var E=J.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),Ve=t=>{switch(typeof t){case"undefined":return E.undefined;case"string":return E.string;case"number":return Number.isNaN(t)?E.nan:E.number;case"boolean":return E.boolean;case"function":return E.function;case"bigint":return E.bigint;case"symbol":return E.symbol;case"object":return Array.isArray(t)?E.array:t===null?E.null:t.then&&typeof t.then=="function"&&t.catch&&typeof t.catch=="function"?E.promise:typeof Map<"u"&&t instanceof Map?E.map:typeof Set<"u"&&t instanceof Set?E.set:typeof Date<"u"&&t instanceof Date?E.date:E.object;default:return E.unknown}};var S=J.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]),To=t=>JSON.stringify(t,null,2).replace(/"([^"]+)":/g,"$1:"),ve=class t extends Error{get errors(){return this.issues}constructor(e){super(),this.issues=[],this.addIssue=n=>{this.issues=[...this.issues,n]},this.addIssues=(n=[])=>{this.issues=[...this.issues,...n]};let r=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,r):this.__proto__=r,this.name="ZodError",this.issues=e}format(e){let r=e||function(s){return s.message},n={_errors:[]},a=s=>{for(let i of s.issues)if(i.code==="invalid_union")i.unionErrors.map(a);else if(i.code==="invalid_return_type")a(i.returnTypeError);else if(i.code==="invalid_arguments")a(i.argumentsError);else if(i.path.length===0)n._errors.push(r(i));else{let o=n,c=0;for(;c<i.path.length;){let u=i.path[c];c===i.path.length-1?(o[u]=o[u]||{_errors:[]},o[u]._errors.push(r(i))):o[u]=o[u]||{_errors:[]},o=o[u],c++}}};return a(this),n}static assert(e){if(!(e instanceof t))throw new Error(`Not a ZodError: ${e}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,J.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(e=r=>r.message){let r={},n=[];for(let a of this.issues)if(a.path.length>0){let s=a.path[0];r[s]=r[s]||[],r[s].push(e(a))}else n.push(e(a));return{formErrors:n,fieldErrors:r}}get formErrors(){return this.flatten()}};ve.create=t=>new ve(t);var xo=(t,e)=>{let r;switch(t.code){case S.invalid_type:t.received===E.undefined?r="Required":r=`Expected ${t.expected}, received ${t.received}`;break;case S.invalid_literal:r=`Invalid literal value, expected ${JSON.stringify(t.expected,J.jsonStringifyReplacer)}`;break;case S.unrecognized_keys:r=`Unrecognized key(s) in object: ${J.joinValues(t.keys,", ")}`;break;case S.invalid_union:r="Invalid input";break;case S.invalid_union_discriminator:r=`Invalid discriminator value. Expected ${J.joinValues(t.options)}`;break;case S.invalid_enum_value:r=`Invalid enum value. Expected ${J.joinValues(t.options)}, received '${t.received}'`;break;case S.invalid_arguments:r="Invalid function arguments";break;case S.invalid_return_type:r="Invalid function return type";break;case S.invalid_date:r="Invalid date";break;case S.invalid_string:typeof t.validation=="object"?"includes"in t.validation?(r=`Invalid input: must include "${t.validation.includes}"`,typeof t.validation.position=="number"&&(r=`${r} at one or more positions greater than or equal to ${t.validation.position}`)):"startsWith"in t.validation?r=`Invalid input: must start with "${t.validation.startsWith}"`:"endsWith"in t.validation?r=`Invalid input: must end with "${t.validation.endsWith}"`:J.assertNever(t.validation):t.validation!=="regex"?r=`Invalid ${t.validation}`:r="Invalid";break;case S.too_small:t.type==="array"?r=`Array must contain ${t.exact?"exactly":t.inclusive?"at least":"more than"} ${t.minimum} element(s)`:t.type==="string"?r=`String must contain ${t.exact?"exactly":t.inclusive?"at least":"over"} ${t.minimum} character(s)`:t.type==="number"?r=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="bigint"?r=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="date"?r=`Date must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(t.minimum))}`:r="Invalid input";break;case S.too_big:t.type==="array"?r=`Array must contain ${t.exact?"exactly":t.inclusive?"at most":"less than"} ${t.maximum} element(s)`:t.type==="string"?r=`String must contain ${t.exact?"exactly":t.inclusive?"at most":"under"} ${t.maximum} character(s)`:t.type==="number"?r=`Number must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="bigint"?r=`BigInt must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="date"?r=`Date must be ${t.exact?"exactly":t.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(t.maximum))}`:r="Invalid input";break;case S.custom:r="Invalid input";break;case S.invalid_intersection_types:r="Intersection results could not be merged";break;case S.not_multiple_of:r=`Number must be a multiple of ${t.multipleOf}`;break;case S.not_finite:r="Number must be finite";break;default:r=e.defaultError,J.assertNever(t)}return{message:r}},at=xo;var os=at;function Po(t){os=t}function qt(){return os}var pr=t=>{let{data:e,path:r,errorMaps:n,issueData:a}=t,s=[...r,...a.path||[]],i={...a,path:s};if(a.message!==void 0)return{...a,path:s,message:a.message};let o="",c=n.filter(u=>!!u).slice().reverse();for(let u of c)o=u(i,{data:e,defaultError:o}).message;return{...a,path:s,message:o}},Eo=[];function P(t,e){let r=qt(),n=pr({issueData:e,data:t.data,path:t.path,errorMaps:[t.common.contextualErrorMap,t.schemaErrorMap,r,r===at?void 0:at].filter(a=>!!a)});t.common.issues.push(n)}var ie=class t{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(e,r){let n=[];for(let a of r){if(a.status==="aborted")return H;a.status==="dirty"&&e.dirty(),n.push(a.value)}return{status:e.value,value:n}}static async mergeObjectAsync(e,r){let n=[];for(let a of r){let s=await a.key,i=await a.value;n.push({key:s,value:i})}return t.mergeObjectSync(e,n)}static mergeObjectSync(e,r){let n={};for(let a of r){let{key:s,value:i}=a;if(s.status==="aborted"||i.status==="aborted")return H;s.status==="dirty"&&e.dirty(),i.status==="dirty"&&e.dirty(),s.value!=="__proto__"&&(typeof i.value<"u"||a.alwaysSet)&&(n[s.value]=i.value)}return{status:e.value,value:n}}},H=Object.freeze({status:"aborted"}),Rt=t=>({status:"dirty",value:t}),me=t=>({status:"valid",value:t}),Or=t=>t.status==="aborted",Mr=t=>t.status==="dirty",ut=t=>t.status==="valid",Wt=t=>typeof Promise<"u"&&t instanceof Promise;var C;(function(t){t.errToObj=e=>typeof e=="string"?{message:e}:e||{},t.toString=e=>typeof e=="string"?e:e?.message})(C||(C={}));var Ce=class{constructor(e,r,n,a){this._cachedPath=[],this.parent=e,this.data=r,this._path=n,this._key=a}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}},ls=(t,e)=>{if(ut(e))return{success:!0,data:e.value};if(!t.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;let r=new ve(t.common.issues);return this._error=r,this._error}}};function U(t){if(!t)return{};let{errorMap:e,invalid_type_error:r,required_error:n,description:a}=t;if(e&&(r||n))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return e?{errorMap:e,description:a}:{errorMap:(i,o)=>{let{message:c}=t;return i.code==="invalid_enum_value"?{message:c??o.defaultError}:typeof o.data>"u"?{message:c??n??o.defaultError}:i.code!=="invalid_type"?{message:o.defaultError}:{message:c??r??o.defaultError}},description:a}}var j=class{get description(){return this._def.description}_getType(e){return Ve(e.data)}_getOrReturnCtx(e,r){return r||{common:e.parent.common,data:e.data,parsedType:Ve(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new ie,ctx:{common:e.parent.common,data:e.data,parsedType:Ve(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){let r=this._parse(e);if(Wt(r))throw new Error("Synchronous parse encountered promise.");return r}_parseAsync(e){let r=this._parse(e);return Promise.resolve(r)}parse(e,r){let n=this.safeParse(e,r);if(n.success)return n.data;throw n.error}safeParse(e,r){let n={common:{issues:[],async:r?.async??!1,contextualErrorMap:r?.errorMap},path:r?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:Ve(e)},a=this._parseSync({data:e,path:n.path,parent:n});return ls(n,a)}"~validate"(e){let r={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:Ve(e)};if(!this["~standard"].async)try{let n=this._parseSync({data:e,path:[],parent:r});return ut(n)?{value:n.value}:{issues:r.common.issues}}catch(n){n?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),r.common={issues:[],async:!0}}return this._parseAsync({data:e,path:[],parent:r}).then(n=>ut(n)?{value:n.value}:{issues:r.common.issues})}async parseAsync(e,r){let n=await this.safeParseAsync(e,r);if(n.success)return n.data;throw n.error}async safeParseAsync(e,r){let n={common:{issues:[],contextualErrorMap:r?.errorMap,async:!0},path:r?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:Ve(e)},a=this._parse({data:e,path:n.path,parent:n}),s=await(Wt(a)?a:Promise.resolve(a));return ls(n,s)}refine(e,r){let n=a=>typeof r=="string"||typeof r>"u"?{message:r}:typeof r=="function"?r(a):r;return this._refinement((a,s)=>{let i=e(a),o=()=>s.addIssue({code:S.custom,...n(a)});return typeof Promise<"u"&&i instanceof Promise?i.then(c=>c?!0:(o(),!1)):i?!0:(o(),!1)})}refinement(e,r){return this._refinement((n,a)=>e(n)?!0:(a.addIssue(typeof r=="function"?r(n,a):r),!1))}_refinement(e){return new Ie({schema:this,typeName:L.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:r=>this["~validate"](r)}}optional(){return Ae.create(this,this._def)}nullable(){return ze.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return ot.create(this)}promise(){return mt.create(this,this._def)}or(e){return Et.create([this,e],this._def)}and(e){return At.create(this,e,this._def)}transform(e){return new Ie({...U(this._def),schema:this,typeName:L.ZodEffects,effect:{type:"transform",transform:e}})}default(e){let r=typeof e=="function"?e:()=>e;return new Dt({...U(this._def),innerType:this,defaultValue:r,typeName:L.ZodDefault})}brand(){return new hr({typeName:L.ZodBranded,type:this,...U(this._def)})}catch(e){let r=typeof e=="function"?e:()=>e;return new Ht({...U(this._def),innerType:this,catchValue:r,typeName:L.ZodCatch})}describe(e){let r=this.constructor;return new r({...this._def,description:e})}pipe(e){return fr.create(this,e)}readonly(){return Lt.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}},Ao=/^c[^\s-]{8,}$/i,Co=/^[0-9a-z]+$/,Io=/^[0-9A-HJKMNP-TV-Z]{26}$/i,No=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,Fo=/^[a-z0-9_-]{21}$/i,Do=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,Ho=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,Lo=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,Oo="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",In,Mo=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,$o=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,Uo=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,Bo=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,jo=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,Jo=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,us="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",Go=new RegExp(`^${us}$`);function cs(t){let e="[0-5]\\d";t.precision?e=`${e}\\.\\d{${t.precision}}`:t.precision==null&&(e=`${e}(\\.\\d+)?`);let r=t.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${e})${r}`}function Xo(t){return new RegExp(`^${cs(t)}$`)}function gs(t){let e=`${us}T${cs(t)}`,r=[];return r.push(t.local?"Z?":"Z"),t.offset&&r.push("([+-]\\d{2}:?\\d{2})"),e=`${e}(${r.join("|")})`,new RegExp(`^${e}$`)}function qo(t,e){return!!((e==="v4"||!e)&&Mo.test(t)||(e==="v6"||!e)&&Uo.test(t))}function Wo(t,e){if(!Do.test(t))return!1;try{let[r]=t.split(".");if(!r)return!1;let n=r.replace(/-/g,"+").replace(/_/g,"/").padEnd(r.length+(4-r.length%4)%4,"="),a=JSON.parse(atob(n));return!(typeof a!="object"||a===null||"typ"in a&&a?.typ!=="JWT"||!a.alg||e&&a.alg!==e)}catch{return!1}}function Vo(t,e){return!!((e==="v4"||!e)&&$o.test(t)||(e==="v6"||!e)&&Bo.test(t))}var ct=class t extends j{_parse(e){if(this._def.coerce&&(e.data=String(e.data)),this._getType(e)!==E.string){let s=this._getOrReturnCtx(e);return P(s,{code:S.invalid_type,expected:E.string,received:s.parsedType}),H}let n=new ie,a;for(let s of this._def.checks)if(s.kind==="min")e.data.length<s.value&&(a=this._getOrReturnCtx(e,a),P(a,{code:S.too_small,minimum:s.value,type:"string",inclusive:!0,exact:!1,message:s.message}),n.dirty());else if(s.kind==="max")e.data.length>s.value&&(a=this._getOrReturnCtx(e,a),P(a,{code:S.too_big,maximum:s.value,type:"string",inclusive:!0,exact:!1,message:s.message}),n.dirty());else if(s.kind==="length"){let i=e.data.length>s.value,o=e.data.length<s.value;(i||o)&&(a=this._getOrReturnCtx(e,a),i?P(a,{code:S.too_big,maximum:s.value,type:"string",inclusive:!0,exact:!0,message:s.message}):o&&P(a,{code:S.too_small,minimum:s.value,type:"string",inclusive:!0,exact:!0,message:s.message}),n.dirty())}else if(s.kind==="email")Lo.test(e.data)||(a=this._getOrReturnCtx(e,a),P(a,{validation:"email",code:S.invalid_string,message:s.message}),n.dirty());else if(s.kind==="emoji")In||(In=new RegExp(Oo,"u")),In.test(e.data)||(a=this._getOrReturnCtx(e,a),P(a,{validation:"emoji",code:S.invalid_string,message:s.message}),n.dirty());else if(s.kind==="uuid")No.test(e.data)||(a=this._getOrReturnCtx(e,a),P(a,{validation:"uuid",code:S.invalid_string,message:s.message}),n.dirty());else if(s.kind==="nanoid")Fo.test(e.data)||(a=this._getOrReturnCtx(e,a),P(a,{validation:"nanoid",code:S.invalid_string,message:s.message}),n.dirty());else if(s.kind==="cuid")Ao.test(e.data)||(a=this._getOrReturnCtx(e,a),P(a,{validation:"cuid",code:S.invalid_string,message:s.message}),n.dirty());else if(s.kind==="cuid2")Co.test(e.data)||(a=this._getOrReturnCtx(e,a),P(a,{validation:"cuid2",code:S.invalid_string,message:s.message}),n.dirty());else if(s.kind==="ulid")Io.test(e.data)||(a=this._getOrReturnCtx(e,a),P(a,{validation:"ulid",code:S.invalid_string,message:s.message}),n.dirty());else if(s.kind==="url")try{new URL(e.data)}catch{a=this._getOrReturnCtx(e,a),P(a,{validation:"url",code:S.invalid_string,message:s.message}),n.dirty()}else s.kind==="regex"?(s.regex.lastIndex=0,s.regex.test(e.data)||(a=this._getOrReturnCtx(e,a),P(a,{validation:"regex",code:S.invalid_string,message:s.message}),n.dirty())):s.kind==="trim"?e.data=e.data.trim():s.kind==="includes"?e.data.includes(s.value,s.position)||(a=this._getOrReturnCtx(e,a),P(a,{code:S.invalid_string,validation:{includes:s.value,position:s.position},message:s.message}),n.dirty()):s.kind==="toLowerCase"?e.data=e.data.toLowerCase():s.kind==="toUpperCase"?e.data=e.data.toUpperCase():s.kind==="startsWith"?e.data.startsWith(s.value)||(a=this._getOrReturnCtx(e,a),P(a,{code:S.invalid_string,validation:{startsWith:s.value},message:s.message}),n.dirty()):s.kind==="endsWith"?e.data.endsWith(s.value)||(a=this._getOrReturnCtx(e,a),P(a,{code:S.invalid_string,validation:{endsWith:s.value},message:s.message}),n.dirty()):s.kind==="datetime"?gs(s).test(e.data)||(a=this._getOrReturnCtx(e,a),P(a,{code:S.invalid_string,validation:"datetime",message:s.message}),n.dirty()):s.kind==="date"?Go.test(e.data)||(a=this._getOrReturnCtx(e,a),P(a,{code:S.invalid_string,validation:"date",message:s.message}),n.dirty()):s.kind==="time"?Xo(s).test(e.data)||(a=this._getOrReturnCtx(e,a),P(a,{code:S.invalid_string,validation:"time",message:s.message}),n.dirty()):s.kind==="duration"?Ho.test(e.data)||(a=this._getOrReturnCtx(e,a),P(a,{validation:"duration",code:S.invalid_string,message:s.message}),n.dirty()):s.kind==="ip"?qo(e.data,s.version)||(a=this._getOrReturnCtx(e,a),P(a,{validation:"ip",code:S.invalid_string,message:s.message}),n.dirty()):s.kind==="jwt"?Wo(e.data,s.alg)||(a=this._getOrReturnCtx(e,a),P(a,{validation:"jwt",code:S.invalid_string,message:s.message}),n.dirty()):s.kind==="cidr"?Vo(e.data,s.version)||(a=this._getOrReturnCtx(e,a),P(a,{validation:"cidr",code:S.invalid_string,message:s.message}),n.dirty()):s.kind==="base64"?jo.test(e.data)||(a=this._getOrReturnCtx(e,a),P(a,{validation:"base64",code:S.invalid_string,message:s.message}),n.dirty()):s.kind==="base64url"?Jo.test(e.data)||(a=this._getOrReturnCtx(e,a),P(a,{validation:"base64url",code:S.invalid_string,message:s.message}),n.dirty()):J.assertNever(s);return{status:n.value,value:e.data}}_regex(e,r,n){return this.refinement(a=>e.test(a),{validation:r,code:S.invalid_string,...C.errToObj(n)})}_addCheck(e){return new t({...this._def,checks:[...this._def.checks,e]})}email(e){return this._addCheck({kind:"email",...C.errToObj(e)})}url(e){return this._addCheck({kind:"url",...C.errToObj(e)})}emoji(e){return this._addCheck({kind:"emoji",...C.errToObj(e)})}uuid(e){return this._addCheck({kind:"uuid",...C.errToObj(e)})}nanoid(e){return this._addCheck({kind:"nanoid",...C.errToObj(e)})}cuid(e){return this._addCheck({kind:"cuid",...C.errToObj(e)})}cuid2(e){return this._addCheck({kind:"cuid2",...C.errToObj(e)})}ulid(e){return this._addCheck({kind:"ulid",...C.errToObj(e)})}base64(e){return this._addCheck({kind:"base64",...C.errToObj(e)})}base64url(e){return this._addCheck({kind:"base64url",...C.errToObj(e)})}jwt(e){return this._addCheck({kind:"jwt",...C.errToObj(e)})}ip(e){return this._addCheck({kind:"ip",...C.errToObj(e)})}cidr(e){return this._addCheck({kind:"cidr",...C.errToObj(e)})}datetime(e){return typeof e=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:e}):this._addCheck({kind:"datetime",precision:typeof e?.precision>"u"?null:e?.precision,offset:e?.offset??!1,local:e?.local??!1,...C.errToObj(e?.message)})}date(e){return this._addCheck({kind:"date",message:e})}time(e){return typeof e=="string"?this._addCheck({kind:"time",precision:null,message:e}):this._addCheck({kind:"time",precision:typeof e?.precision>"u"?null:e?.precision,...C.errToObj(e?.message)})}duration(e){return this._addCheck({kind:"duration",...C.errToObj(e)})}regex(e,r){return this._addCheck({kind:"regex",regex:e,...C.errToObj(r)})}includes(e,r){return this._addCheck({kind:"includes",value:e,position:r?.position,...C.errToObj(r?.message)})}startsWith(e,r){return this._addCheck({kind:"startsWith",value:e,...C.errToObj(r)})}endsWith(e,r){return this._addCheck({kind:"endsWith",value:e,...C.errToObj(r)})}min(e,r){return this._addCheck({kind:"min",value:e,...C.errToObj(r)})}max(e,r){return this._addCheck({kind:"max",value:e,...C.errToObj(r)})}length(e,r){return this._addCheck({kind:"length",value:e,...C.errToObj(r)})}nonempty(e){return this.min(1,C.errToObj(e))}trim(){return new t({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new t({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new t({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(e=>e.kind==="datetime")}get isDate(){return!!this._def.checks.find(e=>e.kind==="date")}get isTime(){return!!this._def.checks.find(e=>e.kind==="time")}get isDuration(){return!!this._def.checks.find(e=>e.kind==="duration")}get isEmail(){return!!this._def.checks.find(e=>e.kind==="email")}get isURL(){return!!this._def.checks.find(e=>e.kind==="url")}get isEmoji(){return!!this._def.checks.find(e=>e.kind==="emoji")}get isUUID(){return!!this._def.checks.find(e=>e.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(e=>e.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(e=>e.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(e=>e.kind==="cuid2")}get isULID(){return!!this._def.checks.find(e=>e.kind==="ulid")}get isIP(){return!!this._def.checks.find(e=>e.kind==="ip")}get isCIDR(){return!!this._def.checks.find(e=>e.kind==="cidr")}get isBase64(){return!!this._def.checks.find(e=>e.kind==="base64")}get isBase64url(){return!!this._def.checks.find(e=>e.kind==="base64url")}get minLength(){let e=null;for(let r of this._def.checks)r.kind==="min"&&(e===null||r.value>e)&&(e=r.value);return e}get maxLength(){let e=null;for(let r of this._def.checks)r.kind==="max"&&(e===null||r.value<e)&&(e=r.value);return e}};ct.create=t=>new ct({checks:[],typeName:L.ZodString,coerce:t?.coerce??!1,...U(t)});function Ko(t,e){let r=(t.toString().split(".")[1]||"").length,n=(e.toString().split(".")[1]||"").length,a=r>n?r:n,s=Number.parseInt(t.toFixed(a).replace(".","")),i=Number.parseInt(e.toFixed(a).replace(".",""));return s%i/10**a}var St=class t extends j{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(e){if(this._def.coerce&&(e.data=Number(e.data)),this._getType(e)!==E.number){let s=this._getOrReturnCtx(e);return P(s,{code:S.invalid_type,expected:E.number,received:s.parsedType}),H}let n,a=new ie;for(let s of this._def.checks)s.kind==="int"?J.isInteger(e.data)||(n=this._getOrReturnCtx(e,n),P(n,{code:S.invalid_type,expected:"integer",received:"float",message:s.message}),a.dirty()):s.kind==="min"?(s.inclusive?e.data<s.value:e.data<=s.value)&&(n=this._getOrReturnCtx(e,n),P(n,{code:S.too_small,minimum:s.value,type:"number",inclusive:s.inclusive,exact:!1,message:s.message}),a.dirty()):s.kind==="max"?(s.inclusive?e.data>s.value:e.data>=s.value)&&(n=this._getOrReturnCtx(e,n),P(n,{code:S.too_big,maximum:s.value,type:"number",inclusive:s.inclusive,exact:!1,message:s.message}),a.dirty()):s.kind==="multipleOf"?Ko(e.data,s.value)!==0&&(n=this._getOrReturnCtx(e,n),P(n,{code:S.not_multiple_of,multipleOf:s.value,message:s.message}),a.dirty()):s.kind==="finite"?Number.isFinite(e.data)||(n=this._getOrReturnCtx(e,n),P(n,{code:S.not_finite,message:s.message}),a.dirty()):J.assertNever(s);return{status:a.value,value:e.data}}gte(e,r){return this.setLimit("min",e,!0,C.toString(r))}gt(e,r){return this.setLimit("min",e,!1,C.toString(r))}lte(e,r){return this.setLimit("max",e,!0,C.toString(r))}lt(e,r){return this.setLimit("max",e,!1,C.toString(r))}setLimit(e,r,n,a){return new t({...this._def,checks:[...this._def.checks,{kind:e,value:r,inclusive:n,message:C.toString(a)}]})}_addCheck(e){return new t({...this._def,checks:[...this._def.checks,e]})}int(e){return this._addCheck({kind:"int",message:C.toString(e)})}positive(e){return this._addCheck({kind:"min",value:0,inclusive:!1,message:C.toString(e)})}negative(e){return this._addCheck({kind:"max",value:0,inclusive:!1,message:C.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:0,inclusive:!0,message:C.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:0,inclusive:!0,message:C.toString(e)})}multipleOf(e,r){return this._addCheck({kind:"multipleOf",value:e,message:C.toString(r)})}finite(e){return this._addCheck({kind:"finite",message:C.toString(e)})}safe(e){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:C.toString(e)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:C.toString(e)})}get minValue(){let e=null;for(let r of this._def.checks)r.kind==="min"&&(e===null||r.value>e)&&(e=r.value);return e}get maxValue(){let e=null;for(let r of this._def.checks)r.kind==="max"&&(e===null||r.value<e)&&(e=r.value);return e}get isInt(){return!!this._def.checks.find(e=>e.kind==="int"||e.kind==="multipleOf"&&J.isInteger(e.value))}get isFinite(){let e=null,r=null;for(let n of this._def.checks){if(n.kind==="finite"||n.kind==="int"||n.kind==="multipleOf")return!0;n.kind==="min"?(r===null||n.value>r)&&(r=n.value):n.kind==="max"&&(e===null||n.value<e)&&(e=n.value)}return Number.isFinite(r)&&Number.isFinite(e)}};St.create=t=>new St({checks:[],typeName:L.ZodNumber,coerce:t?.coerce||!1,...U(t)});var kt=class t extends j{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(e){if(this._def.coerce)try{e.data=BigInt(e.data)}catch{return this._getInvalidInput(e)}if(this._getType(e)!==E.bigint)return this._getInvalidInput(e);let n,a=new ie;for(let s of this._def.checks)s.kind==="min"?(s.inclusive?e.data<s.value:e.data<=s.value)&&(n=this._getOrReturnCtx(e,n),P(n,{code:S.too_small,type:"bigint",minimum:s.value,inclusive:s.inclusive,message:s.message}),a.dirty()):s.kind==="max"?(s.inclusive?e.data>s.value:e.data>=s.value)&&(n=this._getOrReturnCtx(e,n),P(n,{code:S.too_big,type:"bigint",maximum:s.value,inclusive:s.inclusive,message:s.message}),a.dirty()):s.kind==="multipleOf"?e.data%s.value!==BigInt(0)&&(n=this._getOrReturnCtx(e,n),P(n,{code:S.not_multiple_of,multipleOf:s.value,message:s.message}),a.dirty()):J.assertNever(s);return{status:a.value,value:e.data}}_getInvalidInput(e){let r=this._getOrReturnCtx(e);return P(r,{code:S.invalid_type,expected:E.bigint,received:r.parsedType}),H}gte(e,r){return this.setLimit("min",e,!0,C.toString(r))}gt(e,r){return this.setLimit("min",e,!1,C.toString(r))}lte(e,r){return this.setLimit("max",e,!0,C.toString(r))}lt(e,r){return this.setLimit("max",e,!1,C.toString(r))}setLimit(e,r,n,a){return new t({...this._def,checks:[...this._def.checks,{kind:e,value:r,inclusive:n,message:C.toString(a)}]})}_addCheck(e){return new t({...this._def,checks:[...this._def.checks,e]})}positive(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:C.toString(e)})}negative(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:C.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:C.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:C.toString(e)})}multipleOf(e,r){return this._addCheck({kind:"multipleOf",value:e,message:C.toString(r)})}get minValue(){let e=null;for(let r of this._def.checks)r.kind==="min"&&(e===null||r.value>e)&&(e=r.value);return e}get maxValue(){let e=null;for(let r of this._def.checks)r.kind==="max"&&(e===null||r.value<e)&&(e=r.value);return e}};kt.create=t=>new kt({checks:[],typeName:L.ZodBigInt,coerce:t?.coerce??!1,...U(t)});var vt=class extends j{_parse(e){if(this._def.coerce&&(e.data=!!e.data),this._getType(e)!==E.boolean){let n=this._getOrReturnCtx(e);return P(n,{code:S.invalid_type,expected:E.boolean,received:n.parsedType}),H}return me(e.data)}};vt.create=t=>new vt({typeName:L.ZodBoolean,coerce:t?.coerce||!1,...U(t)});var Tt=class t extends j{_parse(e){if(this._def.coerce&&(e.data=new Date(e.data)),this._getType(e)!==E.date){let s=this._getOrReturnCtx(e);return P(s,{code:S.invalid_type,expected:E.date,received:s.parsedType}),H}if(Number.isNaN(e.data.getTime())){let s=this._getOrReturnCtx(e);return P(s,{code:S.invalid_date}),H}let n=new ie,a;for(let s of this._def.checks)s.kind==="min"?e.data.getTime()<s.value&&(a=this._getOrReturnCtx(e,a),P(a,{code:S.too_small,message:s.message,inclusive:!0,exact:!1,minimum:s.value,type:"date"}),n.dirty()):s.kind==="max"?e.data.getTime()>s.value&&(a=this._getOrReturnCtx(e,a),P(a,{code:S.too_big,message:s.message,inclusive:!0,exact:!1,maximum:s.value,type:"date"}),n.dirty()):J.assertNever(s);return{status:n.value,value:new Date(e.data.getTime())}}_addCheck(e){return new t({...this._def,checks:[...this._def.checks,e]})}min(e,r){return this._addCheck({kind:"min",value:e.getTime(),message:C.toString(r)})}max(e,r){return this._addCheck({kind:"max",value:e.getTime(),message:C.toString(r)})}get minDate(){let e=null;for(let r of this._def.checks)r.kind==="min"&&(e===null||r.value>e)&&(e=r.value);return e!=null?new Date(e):null}get maxDate(){let e=null;for(let r of this._def.checks)r.kind==="max"&&(e===null||r.value<e)&&(e=r.value);return e!=null?new Date(e):null}};Tt.create=t=>new Tt({checks:[],coerce:t?.coerce||!1,typeName:L.ZodDate,...U(t)});var Kt=class extends j{_parse(e){if(this._getType(e)!==E.symbol){let n=this._getOrReturnCtx(e);return P(n,{code:S.invalid_type,expected:E.symbol,received:n.parsedType}),H}return me(e.data)}};Kt.create=t=>new Kt({typeName:L.ZodSymbol,...U(t)});var xt=class extends j{_parse(e){if(this._getType(e)!==E.undefined){let n=this._getOrReturnCtx(e);return P(n,{code:S.invalid_type,expected:E.undefined,received:n.parsedType}),H}return me(e.data)}};xt.create=t=>new xt({typeName:L.ZodUndefined,...U(t)});var Pt=class extends j{_parse(e){if(this._getType(e)!==E.null){let n=this._getOrReturnCtx(e);return P(n,{code:S.invalid_type,expected:E.null,received:n.parsedType}),H}return me(e.data)}};Pt.create=t=>new Pt({typeName:L.ZodNull,...U(t)});var gt=class extends j{constructor(){super(...arguments),this._any=!0}_parse(e){return me(e.data)}};gt.create=t=>new gt({typeName:L.ZodAny,...U(t)});var it=class extends j{constructor(){super(...arguments),this._unknown=!0}_parse(e){return me(e.data)}};it.create=t=>new it({typeName:L.ZodUnknown,...U(t)});var $e=class extends j{_parse(e){let r=this._getOrReturnCtx(e);return P(r,{code:S.invalid_type,expected:E.never,received:r.parsedType}),H}};$e.create=t=>new $e({typeName:L.ZodNever,...U(t)});var zt=class extends j{_parse(e){if(this._getType(e)!==E.undefined){let n=this._getOrReturnCtx(e);return P(n,{code:S.invalid_type,expected:E.void,received:n.parsedType}),H}return me(e.data)}};zt.create=t=>new zt({typeName:L.ZodVoid,...U(t)});var ot=class t extends j{_parse(e){let{ctx:r,status:n}=this._processInputParams(e),a=this._def;if(r.parsedType!==E.array)return P(r,{code:S.invalid_type,expected:E.array,received:r.parsedType}),H;if(a.exactLength!==null){let i=r.data.length>a.exactLength.value,o=r.data.length<a.exactLength.value;(i||o)&&(P(r,{code:i?S.too_big:S.too_small,minimum:o?a.exactLength.value:void 0,maximum:i?a.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:a.exactLength.message}),n.dirty())}if(a.minLength!==null&&r.data.length<a.minLength.value&&(P(r,{code:S.too_small,minimum:a.minLength.value,type:"array",inclusive:!0,exact:!1,message:a.minLength.message}),n.dirty()),a.maxLength!==null&&r.data.length>a.maxLength.value&&(P(r,{code:S.too_big,maximum:a.maxLength.value,type:"array",inclusive:!0,exact:!1,message:a.maxLength.message}),n.dirty()),r.common.async)return Promise.all([...r.data].map((i,o)=>a.type._parseAsync(new Ce(r,i,r.path,o)))).then(i=>ie.mergeArray(n,i));let s=[...r.data].map((i,o)=>a.type._parseSync(new Ce(r,i,r.path,o)));return ie.mergeArray(n,s)}get element(){return this._def.type}min(e,r){return new t({...this._def,minLength:{value:e,message:C.toString(r)}})}max(e,r){return new t({...this._def,maxLength:{value:e,message:C.toString(r)}})}length(e,r){return new t({...this._def,exactLength:{value:e,message:C.toString(r)}})}nonempty(e){return this.min(1,e)}};ot.create=(t,e)=>new ot({type:t,minLength:null,maxLength:null,exactLength:null,typeName:L.ZodArray,...U(e)});function Vt(t){if(t instanceof Te){let e={};for(let r in t.shape){let n=t.shape[r];e[r]=Ae.create(Vt(n))}return new Te({...t._def,shape:()=>e})}else return t instanceof ot?new ot({...t._def,type:Vt(t.element)}):t instanceof Ae?Ae.create(Vt(t.unwrap())):t instanceof ze?ze.create(Vt(t.unwrap())):t instanceof Ke?Ke.create(t.items.map(e=>Vt(e))):t}var Te=class t extends j{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;let e=this._def.shape(),r=J.objectKeys(e);return this._cached={shape:e,keys:r},this._cached}_parse(e){if(this._getType(e)!==E.object){let u=this._getOrReturnCtx(e);return P(u,{code:S.invalid_type,expected:E.object,received:u.parsedType}),H}let{status:n,ctx:a}=this._processInputParams(e),{shape:s,keys:i}=this._getCached(),o=[];if(!(this._def.catchall instanceof $e&&this._def.unknownKeys==="strip"))for(let u in a.data)i.includes(u)||o.push(u);let c=[];for(let u of i){let m=s[u],g=a.data[u];c.push({key:{status:"valid",value:u},value:m._parse(new Ce(a,g,a.path,u)),alwaysSet:u in a.data})}if(this._def.catchall instanceof $e){let u=this._def.unknownKeys;if(u==="passthrough")for(let m of o)c.push({key:{status:"valid",value:m},value:{status:"valid",value:a.data[m]}});else if(u==="strict")o.length>0&&(P(a,{code:S.unrecognized_keys,keys:o}),n.dirty());else if(u!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{let u=this._def.catchall;for(let m of o){let g=a.data[m];c.push({key:{status:"valid",value:m},value:u._parse(new Ce(a,g,a.path,m)),alwaysSet:m in a.data})}}return a.common.async?Promise.resolve().then(async()=>{let u=[];for(let m of c){let g=await m.key,p=await m.value;u.push({key:g,value:p,alwaysSet:m.alwaysSet})}return u}).then(u=>ie.mergeObjectSync(n,u)):ie.mergeObjectSync(n,c)}get shape(){return this._def.shape()}strict(e){return C.errToObj,new t({...this._def,unknownKeys:"strict",...e!==void 0?{errorMap:(r,n)=>{let a=this._def.errorMap?.(r,n).message??n.defaultError;return r.code==="unrecognized_keys"?{message:C.errToObj(e).message??a}:{message:a}}}:{}})}strip(){return new t({...this._def,unknownKeys:"strip"})}passthrough(){return new t({...this._def,unknownKeys:"passthrough"})}extend(e){return new t({...this._def,shape:()=>({...this._def.shape(),...e})})}merge(e){return new t({unknownKeys:e._def.unknownKeys,catchall:e._def.catchall,shape:()=>({...this._def.shape(),...e._def.shape()}),typeName:L.ZodObject})}setKey(e,r){return this.augment({[e]:r})}catchall(e){return new t({...this._def,catchall:e})}pick(e){let r={};for(let n of J.objectKeys(e))e[n]&&this.shape[n]&&(r[n]=this.shape[n]);return new t({...this._def,shape:()=>r})}omit(e){let r={};for(let n of J.objectKeys(this.shape))e[n]||(r[n]=this.shape[n]);return new t({...this._def,shape:()=>r})}deepPartial(){return Vt(this)}partial(e){let r={};for(let n of J.objectKeys(this.shape)){let a=this.shape[n];e&&!e[n]?r[n]=a:r[n]=a.optional()}return new t({...this._def,shape:()=>r})}required(e){let r={};for(let n of J.objectKeys(this.shape))if(e&&!e[n])r[n]=this.shape[n];else{let s=this.shape[n];for(;s instanceof Ae;)s=s._def.innerType;r[n]=s}return new t({...this._def,shape:()=>r})}keyof(){return ms(J.objectKeys(this.shape))}};Te.create=(t,e)=>new Te({shape:()=>t,unknownKeys:"strip",catchall:$e.create(),typeName:L.ZodObject,...U(e)});Te.strictCreate=(t,e)=>new Te({shape:()=>t,unknownKeys:"strict",catchall:$e.create(),typeName:L.ZodObject,...U(e)});Te.lazycreate=(t,e)=>new Te({shape:t,unknownKeys:"strip",catchall:$e.create(),typeName:L.ZodObject,...U(e)});var Et=class extends j{_parse(e){let{ctx:r}=this._processInputParams(e),n=this._def.options;function a(s){for(let o of s)if(o.result.status==="valid")return o.result;for(let o of s)if(o.result.status==="dirty")return r.common.issues.push(...o.ctx.common.issues),o.result;let i=s.map(o=>new ve(o.ctx.common.issues));return P(r,{code:S.invalid_union,unionErrors:i}),H}if(r.common.async)return Promise.all(n.map(async s=>{let i={...r,common:{...r.common,issues:[]},parent:null};return{result:await s._parseAsync({data:r.data,path:r.path,parent:i}),ctx:i}})).then(a);{let s,i=[];for(let c of n){let u={...r,common:{...r.common,issues:[]},parent:null},m=c._parseSync({data:r.data,path:r.path,parent:u});if(m.status==="valid")return m;m.status==="dirty"&&!s&&(s={result:m,ctx:u}),u.common.issues.length&&i.push(u.common.issues)}if(s)return r.common.issues.push(...s.ctx.common.issues),s.result;let o=i.map(c=>new ve(c));return P(r,{code:S.invalid_union,unionErrors:o}),H}}get options(){return this._def.options}};Et.create=(t,e)=>new Et({options:t,typeName:L.ZodUnion,...U(e)});var st=t=>t instanceof Ct?st(t.schema):t instanceof Ie?st(t.innerType()):t instanceof It?[t.value]:t instanceof Nt?t.options:t instanceof Ft?J.objectValues(t.enum):t instanceof Dt?st(t._def.innerType):t instanceof xt?[void 0]:t instanceof Pt?[null]:t instanceof Ae?[void 0,...st(t.unwrap())]:t instanceof ze?[null,...st(t.unwrap())]:t instanceof hr||t instanceof Lt?st(t.unwrap()):t instanceof Ht?st(t._def.innerType):[],$r=class t extends j{_parse(e){let{ctx:r}=this._processInputParams(e);if(r.parsedType!==E.object)return P(r,{code:S.invalid_type,expected:E.object,received:r.parsedType}),H;let n=this.discriminator,a=r.data[n],s=this.optionsMap.get(a);return s?r.common.async?s._parseAsync({data:r.data,path:r.path,parent:r}):s._parseSync({data:r.data,path:r.path,parent:r}):(P(r,{code:S.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[n]}),H)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(e,r,n){let a=new Map;for(let s of r){let i=st(s.shape[e]);if(!i.length)throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);for(let o of i){if(a.has(o))throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(o)}`);a.set(o,s)}}return new t({typeName:L.ZodDiscriminatedUnion,discriminator:e,options:r,optionsMap:a,...U(n)})}};function Nn(t,e){let r=Ve(t),n=Ve(e);if(t===e)return{valid:!0,data:t};if(r===E.object&&n===E.object){let a=J.objectKeys(e),s=J.objectKeys(t).filter(o=>a.indexOf(o)!==-1),i={...t,...e};for(let o of s){let c=Nn(t[o],e[o]);if(!c.valid)return{valid:!1};i[o]=c.data}return{valid:!0,data:i}}else if(r===E.array&&n===E.array){if(t.length!==e.length)return{valid:!1};let a=[];for(let s=0;s<t.length;s++){let i=t[s],o=e[s],c=Nn(i,o);if(!c.valid)return{valid:!1};a.push(c.data)}return{valid:!0,data:a}}else return r===E.date&&n===E.date&&+t==+e?{valid:!0,data:t}:{valid:!1}}var At=class extends j{_parse(e){let{status:r,ctx:n}=this._processInputParams(e),a=(s,i)=>{if(Or(s)||Or(i))return H;let o=Nn(s.value,i.value);return o.valid?((Mr(s)||Mr(i))&&r.dirty(),{status:r.value,value:o.data}):(P(n,{code:S.invalid_intersection_types}),H)};return n.common.async?Promise.all([this._def.left._parseAsync({data:n.data,path:n.path,parent:n}),this._def.right._parseAsync({data:n.data,path:n.path,parent:n})]).then(([s,i])=>a(s,i)):a(this._def.left._parseSync({data:n.data,path:n.path,parent:n}),this._def.right._parseSync({data:n.data,path:n.path,parent:n}))}};At.create=(t,e,r)=>new At({left:t,right:e,typeName:L.ZodIntersection,...U(r)});var Ke=class t extends j{_parse(e){let{status:r,ctx:n}=this._processInputParams(e);if(n.parsedType!==E.array)return P(n,{code:S.invalid_type,expected:E.array,received:n.parsedType}),H;if(n.data.length<this._def.items.length)return P(n,{code:S.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),H;!this._def.rest&&n.data.length>this._def.items.length&&(P(n,{code:S.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),r.dirty());let s=[...n.data].map((i,o)=>{let c=this._def.items[o]||this._def.rest;return c?c._parse(new Ce(n,i,n.path,o)):null}).filter(i=>!!i);return n.common.async?Promise.all(s).then(i=>ie.mergeArray(r,i)):ie.mergeArray(r,s)}get items(){return this._def.items}rest(e){return new t({...this._def,rest:e})}};Ke.create=(t,e)=>{if(!Array.isArray(t))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new Ke({items:t,typeName:L.ZodTuple,rest:null,...U(e)})};var Ur=class t extends j{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){let{status:r,ctx:n}=this._processInputParams(e);if(n.parsedType!==E.object)return P(n,{code:S.invalid_type,expected:E.object,received:n.parsedType}),H;let a=[],s=this._def.keyType,i=this._def.valueType;for(let o in n.data)a.push({key:s._parse(new Ce(n,o,n.path,o)),value:i._parse(new Ce(n,n.data[o],n.path,o)),alwaysSet:o in n.data});return n.common.async?ie.mergeObjectAsync(r,a):ie.mergeObjectSync(r,a)}get element(){return this._def.valueType}static create(e,r,n){return r instanceof j?new t({keyType:e,valueType:r,typeName:L.ZodRecord,...U(n)}):new t({keyType:ct.create(),valueType:e,typeName:L.ZodRecord,...U(r)})}},Qt=class extends j{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){let{status:r,ctx:n}=this._processInputParams(e);if(n.parsedType!==E.map)return P(n,{code:S.invalid_type,expected:E.map,received:n.parsedType}),H;let a=this._def.keyType,s=this._def.valueType,i=[...n.data.entries()].map(([o,c],u)=>({key:a._parse(new Ce(n,o,n.path,[u,"key"])),value:s._parse(new Ce(n,c,n.path,[u,"value"]))}));if(n.common.async){let o=new Map;return Promise.resolve().then(async()=>{for(let c of i){let u=await c.key,m=await c.value;if(u.status==="aborted"||m.status==="aborted")return H;(u.status==="dirty"||m.status==="dirty")&&r.dirty(),o.set(u.value,m.value)}return{status:r.value,value:o}})}else{let o=new Map;for(let c of i){let u=c.key,m=c.value;if(u.status==="aborted"||m.status==="aborted")return H;(u.status==="dirty"||m.status==="dirty")&&r.dirty(),o.set(u.value,m.value)}return{status:r.value,value:o}}}};Qt.create=(t,e,r)=>new Qt({valueType:e,keyType:t,typeName:L.ZodMap,...U(r)});var Yt=class t extends j{_parse(e){let{status:r,ctx:n}=this._processInputParams(e);if(n.parsedType!==E.set)return P(n,{code:S.invalid_type,expected:E.set,received:n.parsedType}),H;let a=this._def;a.minSize!==null&&n.data.size<a.minSize.value&&(P(n,{code:S.too_small,minimum:a.minSize.value,type:"set",inclusive:!0,exact:!1,message:a.minSize.message}),r.dirty()),a.maxSize!==null&&n.data.size>a.maxSize.value&&(P(n,{code:S.too_big,maximum:a.maxSize.value,type:"set",inclusive:!0,exact:!1,message:a.maxSize.message}),r.dirty());let s=this._def.valueType;function i(c){let u=new Set;for(let m of c){if(m.status==="aborted")return H;m.status==="dirty"&&r.dirty(),u.add(m.value)}return{status:r.value,value:u}}let o=[...n.data.values()].map((c,u)=>s._parse(new Ce(n,c,n.path,u)));return n.common.async?Promise.all(o).then(c=>i(c)):i(o)}min(e,r){return new t({...this._def,minSize:{value:e,message:C.toString(r)}})}max(e,r){return new t({...this._def,maxSize:{value:e,message:C.toString(r)}})}size(e,r){return this.min(e,r).max(e,r)}nonempty(e){return this.min(1,e)}};Yt.create=(t,e)=>new Yt({valueType:t,minSize:null,maxSize:null,typeName:L.ZodSet,...U(e)});var Br=class t extends j{constructor(){super(...arguments),this.validate=this.implement}_parse(e){let{ctx:r}=this._processInputParams(e);if(r.parsedType!==E.function)return P(r,{code:S.invalid_type,expected:E.function,received:r.parsedType}),H;function n(o,c){return pr({data:o,path:r.path,errorMaps:[r.common.contextualErrorMap,r.schemaErrorMap,qt(),at].filter(u=>!!u),issueData:{code:S.invalid_arguments,argumentsError:c}})}function a(o,c){return pr({data:o,path:r.path,errorMaps:[r.common.contextualErrorMap,r.schemaErrorMap,qt(),at].filter(u=>!!u),issueData:{code:S.invalid_return_type,returnTypeError:c}})}let s={errorMap:r.common.contextualErrorMap},i=r.data;if(this._def.returns instanceof mt){let o=this;return me(async function(...c){let u=new ve([]),m=await o._def.args.parseAsync(c,s).catch(h=>{throw u.addIssue(n(c,h)),u}),g=await Reflect.apply(i,this,m);return await o._def.returns._def.type.parseAsync(g,s).catch(h=>{throw u.addIssue(a(g,h)),u})})}else{let o=this;return me(function(...c){let u=o._def.args.safeParse(c,s);if(!u.success)throw new ve([n(c,u.error)]);let m=Reflect.apply(i,this,u.data),g=o._def.returns.safeParse(m,s);if(!g.success)throw new ve([a(m,g.error)]);return g.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...e){return new t({...this._def,args:Ke.create(e).rest(it.create())})}returns(e){return new t({...this._def,returns:e})}implement(e){return this.parse(e)}strictImplement(e){return this.parse(e)}static create(e,r,n){return new t({args:e||Ke.create([]).rest(it.create()),returns:r||it.create(),typeName:L.ZodFunction,...U(n)})}},Ct=class extends j{get schema(){return this._def.getter()}_parse(e){let{ctx:r}=this._processInputParams(e);return this._def.getter()._parse({data:r.data,path:r.path,parent:r})}};Ct.create=(t,e)=>new Ct({getter:t,typeName:L.ZodLazy,...U(e)});var It=class extends j{_parse(e){if(e.data!==this._def.value){let r=this._getOrReturnCtx(e);return P(r,{received:r.data,code:S.invalid_literal,expected:this._def.value}),H}return{status:"valid",value:e.data}}get value(){return this._def.value}};It.create=(t,e)=>new It({value:t,typeName:L.ZodLiteral,...U(e)});function ms(t,e){return new Nt({values:t,typeName:L.ZodEnum,...U(e)})}var Nt=class t extends j{_parse(e){if(typeof e.data!="string"){let r=this._getOrReturnCtx(e),n=this._def.values;return P(r,{expected:J.joinValues(n),received:r.parsedType,code:S.invalid_type}),H}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(e.data)){let r=this._getOrReturnCtx(e),n=this._def.values;return P(r,{received:r.data,code:S.invalid_enum_value,options:n}),H}return me(e.data)}get options(){return this._def.values}get enum(){let e={};for(let r of this._def.values)e[r]=r;return e}get Values(){let e={};for(let r of this._def.values)e[r]=r;return e}get Enum(){let e={};for(let r of this._def.values)e[r]=r;return e}extract(e,r=this._def){return t.create(e,{...this._def,...r})}exclude(e,r=this._def){return t.create(this.options.filter(n=>!e.includes(n)),{...this._def,...r})}};Nt.create=ms;var Ft=class extends j{_parse(e){let r=J.getValidEnumValues(this._def.values),n=this._getOrReturnCtx(e);if(n.parsedType!==E.string&&n.parsedType!==E.number){let a=J.objectValues(r);return P(n,{expected:J.joinValues(a),received:n.parsedType,code:S.invalid_type}),H}if(this._cache||(this._cache=new Set(J.getValidEnumValues(this._def.values))),!this._cache.has(e.data)){let a=J.objectValues(r);return P(n,{received:n.data,code:S.invalid_enum_value,options:a}),H}return me(e.data)}get enum(){return this._def.values}};Ft.create=(t,e)=>new Ft({values:t,typeName:L.ZodNativeEnum,...U(e)});var mt=class extends j{unwrap(){return this._def.type}_parse(e){let{ctx:r}=this._processInputParams(e);if(r.parsedType!==E.promise&&r.common.async===!1)return P(r,{code:S.invalid_type,expected:E.promise,received:r.parsedType}),H;let n=r.parsedType===E.promise?r.data:Promise.resolve(r.data);return me(n.then(a=>this._def.type.parseAsync(a,{path:r.path,errorMap:r.common.contextualErrorMap})))}};mt.create=(t,e)=>new mt({type:t,typeName:L.ZodPromise,...U(e)});var Ie=class extends j{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===L.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){let{status:r,ctx:n}=this._processInputParams(e),a=this._def.effect||null,s={addIssue:i=>{P(n,i),i.fatal?r.abort():r.dirty()},get path(){return n.path}};if(s.addIssue=s.addIssue.bind(s),a.type==="preprocess"){let i=a.transform(n.data,s);if(n.common.async)return Promise.resolve(i).then(async o=>{if(r.value==="aborted")return H;let c=await this._def.schema._parseAsync({data:o,path:n.path,parent:n});return c.status==="aborted"?H:c.status==="dirty"?Rt(c.value):r.value==="dirty"?Rt(c.value):c});{if(r.value==="aborted")return H;let o=this._def.schema._parseSync({data:i,path:n.path,parent:n});return o.status==="aborted"?H:o.status==="dirty"?Rt(o.value):r.value==="dirty"?Rt(o.value):o}}if(a.type==="refinement"){let i=o=>{let c=a.refinement(o,s);if(n.common.async)return Promise.resolve(c);if(c instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return o};if(n.common.async===!1){let o=this._def.schema._parseSync({data:n.data,path:n.path,parent:n});return o.status==="aborted"?H:(o.status==="dirty"&&r.dirty(),i(o.value),{status:r.value,value:o.value})}else return this._def.schema._parseAsync({data:n.data,path:n.path,parent:n}).then(o=>o.status==="aborted"?H:(o.status==="dirty"&&r.dirty(),i(o.value).then(()=>({status:r.value,value:o.value}))))}if(a.type==="transform")if(n.common.async===!1){let i=this._def.schema._parseSync({data:n.data,path:n.path,parent:n});if(!ut(i))return H;let o=a.transform(i.value,s);if(o instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:r.value,value:o}}else return this._def.schema._parseAsync({data:n.data,path:n.path,parent:n}).then(i=>ut(i)?Promise.resolve(a.transform(i.value,s)).then(o=>({status:r.value,value:o})):H);J.assertNever(a)}};Ie.create=(t,e,r)=>new Ie({schema:t,typeName:L.ZodEffects,effect:e,...U(r)});Ie.createWithPreprocess=(t,e,r)=>new Ie({schema:e,effect:{type:"preprocess",transform:t},typeName:L.ZodEffects,...U(r)});var Ae=class extends j{_parse(e){return this._getType(e)===E.undefined?me(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}};Ae.create=(t,e)=>new Ae({innerType:t,typeName:L.ZodOptional,...U(e)});var ze=class extends j{_parse(e){return this._getType(e)===E.null?me(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}};ze.create=(t,e)=>new ze({innerType:t,typeName:L.ZodNullable,...U(e)});var Dt=class extends j{_parse(e){let{ctx:r}=this._processInputParams(e),n=r.data;return r.parsedType===E.undefined&&(n=this._def.defaultValue()),this._def.innerType._parse({data:n,path:r.path,parent:r})}removeDefault(){return this._def.innerType}};Dt.create=(t,e)=>new Dt({innerType:t,typeName:L.ZodDefault,defaultValue:typeof e.default=="function"?e.default:()=>e.default,...U(e)});var Ht=class extends j{_parse(e){let{ctx:r}=this._processInputParams(e),n={...r,common:{...r.common,issues:[]}},a=this._def.innerType._parse({data:n.data,path:n.path,parent:{...n}});return Wt(a)?a.then(s=>({status:"valid",value:s.status==="valid"?s.value:this._def.catchValue({get error(){return new ve(n.common.issues)},input:n.data})})):{status:"valid",value:a.status==="valid"?a.value:this._def.catchValue({get error(){return new ve(n.common.issues)},input:n.data})}}removeCatch(){return this._def.innerType}};Ht.create=(t,e)=>new Ht({innerType:t,typeName:L.ZodCatch,catchValue:typeof e.catch=="function"?e.catch:()=>e.catch,...U(e)});var Zt=class extends j{_parse(e){if(this._getType(e)!==E.nan){let n=this._getOrReturnCtx(e);return P(n,{code:S.invalid_type,expected:E.nan,received:n.parsedType}),H}return{status:"valid",value:e.data}}};Zt.create=t=>new Zt({typeName:L.ZodNaN,...U(t)});var zo=Symbol("zod_brand"),hr=class extends j{_parse(e){let{ctx:r}=this._processInputParams(e),n=r.data;return this._def.type._parse({data:n,path:r.path,parent:r})}unwrap(){return this._def.type}},fr=class t extends j{_parse(e){let{status:r,ctx:n}=this._processInputParams(e);if(n.common.async)return(async()=>{let s=await this._def.in._parseAsync({data:n.data,path:n.path,parent:n});return s.status==="aborted"?H:s.status==="dirty"?(r.dirty(),Rt(s.value)):this._def.out._parseAsync({data:s.value,path:n.path,parent:n})})();{let a=this._def.in._parseSync({data:n.data,path:n.path,parent:n});return a.status==="aborted"?H:a.status==="dirty"?(r.dirty(),{status:"dirty",value:a.value}):this._def.out._parseSync({data:a.value,path:n.path,parent:n})}}static create(e,r){return new t({in:e,out:r,typeName:L.ZodPipeline})}},Lt=class extends j{_parse(e){let r=this._def.innerType._parse(e),n=a=>(ut(a)&&(a.value=Object.freeze(a.value)),a);return Wt(r)?r.then(a=>n(a)):n(r)}unwrap(){return this._def.innerType}};Lt.create=(t,e)=>new Lt({innerType:t,typeName:L.ZodReadonly,...U(e)});function ds(t,e){let r=typeof t=="function"?t(e):typeof t=="string"?{message:t}:t;return typeof r=="string"?{message:r}:r}function ps(t,e={},r){return t?gt.create().superRefine((n,a)=>{let s=t(n);if(s instanceof Promise)return s.then(i=>{if(!i){let o=ds(e,n),c=o.fatal??r??!0;a.addIssue({code:"custom",...o,fatal:c})}});if(!s){let i=ds(e,n),o=i.fatal??r??!0;a.addIssue({code:"custom",...i,fatal:o})}}):gt.create()}var Qo={object:Te.lazycreate},L;(function(t){t.ZodString="ZodString",t.ZodNumber="ZodNumber",t.ZodNaN="ZodNaN",t.ZodBigInt="ZodBigInt",t.ZodBoolean="ZodBoolean",t.ZodDate="ZodDate",t.ZodSymbol="ZodSymbol",t.ZodUndefined="ZodUndefined",t.ZodNull="ZodNull",t.ZodAny="ZodAny",t.ZodUnknown="ZodUnknown",t.ZodNever="ZodNever",t.ZodVoid="ZodVoid",t.ZodArray="ZodArray",t.ZodObject="ZodObject",t.ZodUnion="ZodUnion",t.ZodDiscriminatedUnion="ZodDiscriminatedUnion",t.ZodIntersection="ZodIntersection",t.ZodTuple="ZodTuple",t.ZodRecord="ZodRecord",t.ZodMap="ZodMap",t.ZodSet="ZodSet",t.ZodFunction="ZodFunction",t.ZodLazy="ZodLazy",t.ZodLiteral="ZodLiteral",t.ZodEnum="ZodEnum",t.ZodEffects="ZodEffects",t.ZodNativeEnum="ZodNativeEnum",t.ZodOptional="ZodOptional",t.ZodNullable="ZodNullable",t.ZodDefault="ZodDefault",t.ZodCatch="ZodCatch",t.ZodPromise="ZodPromise",t.ZodBranded="ZodBranded",t.ZodPipeline="ZodPipeline",t.ZodReadonly="ZodReadonly"})(L||(L={}));var Yo=(t,e={message:`Input not instance of ${t.name}`})=>ps(r=>r instanceof t,e),hs=ct.create,fs=St.create,Zo=Zt.create,el=kt.create,bs=vt.create,tl=Tt.create,rl=Kt.create,nl=xt.create,al=Pt.create,sl=gt.create,il=it.create,ol=$e.create,ll=zt.create,dl=ot.create,ul=Te.create,cl=Te.strictCreate,gl=Et.create,ml=$r.create,pl=At.create,hl=Ke.create,fl=Ur.create,bl=Qt.create,yl=Yt.create,_l=Br.create,wl=Ct.create,Rl=It.create,Sl=Nt.create,kl=Ft.create,vl=mt.create,Tl=Ie.create,xl=Ae.create,Pl=ze.create,El=Ie.createWithPreprocess,Al=fr.create,Cl=()=>hs().optional(),Il=()=>fs().optional(),Nl=()=>bs().optional(),Fl={string:(t=>ct.create({...t,coerce:!0})),number:(t=>St.create({...t,coerce:!0})),boolean:(t=>vt.create({...t,coerce:!0})),bigint:(t=>kt.create({...t,coerce:!0})),date:(t=>Tt.create({...t,coerce:!0}))};var Dl=H;var Hl=d.enum(["watching","processing","done","error","archived"]),Ll=d.enum(["accept","reject","flag"]),Fn=d.enum(["pending","queued","in_progress","resolved","failed","warning","rejected","flagged"]),ys=d.object({id:d.string(),author:d.string(),body:d.string(),bodyHtml:d.string(),replyKind:d.enum(["review_thread","review","general_comment"]),sourceId:d.string(),sourceNodeId:d.string().nullable(),sourceUrl:d.string().nullable(),threadId:d.string().nullable(),threadResolved:d.boolean().nullable(),auditToken:d.string(),file:d.string().nullable(),line:d.number().nullable(),type:d.enum(["review_comment","review","general_comment"]),createdAt:d.string(),decision:Ll.nullable(),decisionReason:d.string().nullable(),action:d.string().nullable(),status:Fn,statusReason:d.string().nullable()}),Ol=d.enum(["needed","not_needed","failed"]),Dn=d.object({headSha:d.string(),status:Ol,summary:d.string(),assessedAt:d.string()}),jr=d.object({id:d.string(),number:d.number(),title:d.string(),repo:d.string(),branch:d.string(),author:d.string(),url:d.string(),status:Hl,feedbackItems:d.array(ys),accepted:d.number(),rejected:d.number(),flagged:d.number(),testsPassed:d.boolean().nullable(),lintPassed:d.boolean().nullable(),lastChecked:d.string().nullable(),watchEnabled:d.boolean().default(!0),docsAssessment:Dn.nullable().optional(),addedAt:d.string()}),Tm=jr.omit({id:!0,addedAt:!0}),_s=d.object({url:d.string().url()}),ws=d.object({id:d.string(),prId:d.string(),runId:d.string().nullable(),timestamp:d.string(),level:d.enum(["info","warn","error"]),phase:d.string().nullable(),message:d.string(),metadata:d.record(d.string(),d.unknown()).nullable()}),Ml=d.enum(["running","completed","failed"]),$l=d.object({id:d.string(),prId:d.string(),preferredAgent:d.enum(["codex","claude"]),resolvedAgent:d.enum(["codex","claude"]).nullable(),status:Ml,phase:d.string(),prompt:d.string().nullable(),initialHeadSha:d.string().nullable(),metadata:d.record(d.string(),d.unknown()).nullable(),lastError:d.string().nullable(),createdAt:d.string(),updatedAt:d.string()}),xm=d.object({drainMode:d.boolean(),drainRequestedAt:d.string().nullable(),drainReason:d.string().nullable()}),Ul=d.enum(["sync_watched_repos","babysit_pr","process_release_run","answer_pr_question","generate_social_changelog","heal_deployment"]),Hn=d.enum(["queued","leased","completed","failed","canceled"]),Ln=d.object({id:d.string(),kind:Ul,targetId:d.string(),dedupeKey:d.string(),status:Hn,priority:d.number().int(),availableAt:d.string(),leaseOwner:d.string().nullable(),leaseToken:d.string().nullable(),leaseExpiresAt:d.string().nullable(),heartbeatAt:d.string().nullable(),attemptCount:d.number().int().nonnegative(),lastError:d.string().nullable(),payload:d.record(d.string(),d.unknown()),createdAt:d.string(),updatedAt:d.string(),completedAt:d.string().nullable()}),Bl=d.enum(["pending","answering","answered","error"]),On=d.object({id:d.string(),prId:d.string(),question:d.string(),answer:d.string().nullable(),status:Bl,error:d.string().nullable(),createdAt:d.string(),answeredAt:d.string().nullable()}),Rs=d.object({question:d.string().min(1).max(2e3)}),jl=d.enum(["generating","done","error"]),Jl=d.object({number:d.number(),title:d.string(),url:d.string(),author:d.string(),repo:d.string()}),Mn=d.object({id:d.string(),date:d.string(),triggerCount:d.number(),prSummaries:d.array(Jl),content:d.string().nullable(),status:jl,error:d.string().nullable(),createdAt:d.string(),completedAt:d.string().nullable()}),Gl=d.enum(["idle","triaging","awaiting_repair_slot","repairing","awaiting_ci","verifying","healed","cooldown","blocked","escalated","superseded"]),Xl=d.enum(["healable_in_branch","blocked_external","flaky_or_ambiguous","unknown"]),ql=d.enum(["queued","running","awaiting_ci","verified","failed","canceled"]),Ss=d.object({id:d.string(),prId:d.string(),sha:d.string(),provider:d.string(),context:d.string(),status:d.string(),conclusion:d.string().nullable(),description:d.string(),targetUrl:d.string().nullable(),observedAt:d.string()}),ks=d.object({id:d.string(),sessionId:d.string(),sha:d.string(),fingerprint:d.string(),category:d.string(),classification:Xl,summary:d.string(),selectedEvidence:d.array(d.string()),createdAt:d.string()}),$n=d.object({id:d.string(),prId:d.string(),repo:d.string(),prNumber:d.number(),initialHeadSha:d.string(),currentHeadSha:d.string(),state:Gl,startedAt:d.string(),updatedAt:d.string(),endedAt:d.string().nullable(),blockedReason:d.string().nullable(),escalationReason:d.string().nullable(),latestFingerprint:d.string().nullable(),attemptCount:d.number(),lastImprovementScore:d.number().nullable()}),Un=d.object({id:d.string(),sessionId:d.string(),attemptNumber:d.number(),inputSha:d.string(),outputSha:d.string().nullable(),status:ql,startedAt:d.string(),endedAt:d.string().nullable(),agent:d.enum(["codex","claude"]),promptDigest:d.string(),targetFingerprints:d.array(d.string()),summary:d.string().nullable(),improvementScore:d.number().nullable(),error:d.string().nullable()}),Wl=d.enum(["detected","evaluating","skipped","proposed","publishing","published","error"]),Vl=d.enum(["patch","minor","major"]),Kl=d.object({number:d.number(),title:d.string(),url:d.string(),author:d.string(),mergedAt:d.string(),mergeSha:d.string()}),Bn=d.object({id:d.string(),repo:d.string(),baseBranch:d.string(),triggerPrNumber:d.number(),triggerPrTitle:d.string(),triggerPrUrl:d.string(),triggerMergeSha:d.string(),triggerMergedAt:d.string(),status:Wl,decisionReason:d.string().nullable(),recommendedBump:Vl.nullable(),proposedVersion:d.string().nullable(),releaseTitle:d.string().nullable(),releaseNotes:d.string().nullable(),includedPrs:d.array(Kl),targetSha:d.string().nullable(),githubReleaseId:d.number().nullable(),githubReleaseUrl:d.string().nullable(),error:d.string().nullable(),createdAt:d.string(),updatedAt:d.string(),completedAt:d.string().nullable()}),zl=d.enum(["vercel","railway"]),Ql=d.enum(["monitoring","failed","fixing","fix_submitted","escalated"]),jn=d.object({id:d.string(),repo:d.string(),platform:zl,triggerPrNumber:d.number(),triggerPrTitle:d.string(),triggerPrUrl:d.string(),mergeSha:d.string(),deploymentId:d.string().nullable(),deploymentLog:d.string().nullable(),fixBranch:d.string().nullable(),fixPrNumber:d.number().nullable(),fixPrUrl:d.string().nullable(),state:Ql,error:d.string().nullable(),createdAt:d.string(),updatedAt:d.string(),completedAt:d.string().nullable()}),vs=d.object({githubToken:d.string(),codingAgent:d.enum(["codex","claude"]),maxTurns:d.number(),batchWindowMs:d.number(),pollIntervalMs:d.number(),maxChangesPerRun:d.number(),autoResolveMergeConflicts:d.boolean(),autoCreateReleases:d.boolean(),autoUpdateDocs:d.boolean(),autoHealCI:d.boolean(),maxHealingAttemptsPerSession:d.number(),maxHealingAttemptsPerFingerprint:d.number(),maxConcurrentHealingRuns:d.number(),healingCooldownMs:d.number(),autoHealDeployments:d.boolean(),deploymentCheckDelayMs:d.number(),deploymentCheckTimeoutMs:d.number(),deploymentCheckPollIntervalMs:d.number(),watchedRepos:d.array(d.string()),trustedReviewers:d.array(d.string()),ignoredBots:d.array(d.string())});import{randomUUID as Ue}from"crypto";function Jn(t){return jr.parse({...t,id:Ue(),addedAt:new Date().toISOString()})}function Gn(t,e){return jr.parse({...t,...e,id:t.id,addedAt:t.addedAt})}function Xn(t,e,r,n){return ws.parse({id:Ue(),prId:t,runId:n?.runId??null,timestamp:new Date().toISOString(),level:e,phase:n?.phase??null,message:r,metadata:n?.metadata??null})}function qn(t,e){return On.parse({id:Ue(),prId:t,question:e,answer:null,status:"pending",error:null,createdAt:new Date().toISOString(),answeredAt:null})}function Wn(t,e){return On.parse({...t,...e,id:t.id,prId:t.prId,createdAt:t.createdAt})}function Vn(t){let e=new Date().toISOString();return Ln.parse({...t,id:Ue(),status:"queued",priority:t.priority??100,leaseOwner:null,leaseToken:null,leaseExpiresAt:null,heartbeatAt:null,attemptCount:0,lastError:null,createdAt:e,updatedAt:e,completedAt:null})}function br(t,e){return Ln.parse({...t,...e,id:t.id,createdAt:t.createdAt,updatedAt:new Date().toISOString()})}function Kn(t){return Mn.parse({...t,id:Ue(),createdAt:new Date().toISOString()})}function zn(t,e){return Mn.parse({...t,...e,id:t.id,createdAt:t.createdAt})}function Qn(t){let e=new Date().toISOString();return Bn.parse({...t,id:Ue(),createdAt:e,updatedAt:e})}function Yn(t,e){return Bn.parse({...t,...e,id:t.id,createdAt:t.createdAt,updatedAt:new Date().toISOString()})}function er(t){return Ss.parse({...t,id:Ue()})}function Zn(t){return ks.parse({...t,id:Ue(),createdAt:new Date().toISOString()})}function ea(t){let e=new Date().toISOString();return $n.parse({...t,id:Ue(),startedAt:e,updatedAt:e})}function ta(t,e){return $n.parse({...t,...e,id:t.id,startedAt:t.startedAt,updatedAt:new Date().toISOString()})}function ra(t){return Un.parse({...t,id:Ue(),startedAt:new Date().toISOString()})}function na(t,e){return Un.parse({...t,...e,id:t.id,sessionId:t.sessionId,attemptNumber:t.attemptNumber,startedAt:t.startedAt})}function aa(t){let e=new Date().toISOString();return jn.parse({...t,id:Ue(),createdAt:e,updatedAt:e})}function sa(t,e){return jn.parse({...t,...e,id:t.id,createdAt:t.createdAt,updatedAt:new Date().toISOString()})}function ia(t,e){return vs.parse({...t,...e,watchedRepos:e.watchedRepos??t.watchedRepos,trustedReviewers:e.trustedReviewers??t.trustedReviewers,ignoredBots:e.ignoredBots??t.ignoredBots})}var Pe={githubToken:"",codingAgent:"claude",maxTurns:15,batchWindowMs:3e5,pollIntervalMs:12e4,maxChangesPerRun:20,autoResolveMergeConflicts:!0,autoCreateReleases:!0,autoUpdateDocs:!0,autoHealCI:!1,maxHealingAttemptsPerSession:3,maxHealingAttemptsPerFingerprint:2,maxConcurrentHealingRuns:1,healingCooldownMs:3e5,autoHealDeployments:!1,deploymentCheckDelayMs:6e4,deploymentCheckTimeoutMs:6e5,deploymentCheckPollIntervalMs:15e3,watchedRepos:[],trustedReviewers:[],ignoredBots:["dependabot[bot]","codecov[bot]","github-actions[bot]"]};import{mkdirSync as Ps}from"fs";import{DatabaseSync as nd}from"node:sqlite";import Yl from"os";import yr from"path";function Be(t){let e=t||process.env.OH_MY_PR_HOME||process.env.CODEFACTORY_HOME||yr.join(Yl.homedir(),".oh-my-pr");return{rootDir:e,stateDbPath:yr.join(e,"state.sqlite"),logRootDir:yr.join(e,"log"),repoRootDir:yr.join(e,"repos"),worktreeRootDir:yr.join(e,"worktrees")}}import{appendFileSync as Zl,mkdirSync as ed}from"fs";import Ts from"path";function td(t){return t.replace(/[^a-zA-Z0-9_.-]+/g,"__")}function rd(t){let e=[t.timestamp,t.level.toUpperCase()];return t.phase&&e.push(`[${t.phase}]`),t.runId&&e.push(`run=${t.runId}`),e.push(t.message),t.metadata&&Object.keys(t.metadata).length>0&&e.push(JSON.stringify(t.metadata)),`${e.join(" ")}
5
+ `}function xs(t,e,r){let n=r.timestamp.slice(0,10),a=Ts.join(t,n);ed(a,{recursive:!0});let i=`${td(e.repo)}__${e.number}.log`,o=Ts.join(a,i);Zl(o,rd(r),"utf8")}var ad="cli-managed",sd=1e3,Es=1,id=new Set([5,6]),od={drainMode:!1,drainRequestedAt:null,drainReason:null},Jr=class{db;rootDir;logRootDir;stateDbPath;constructor(e){let r=Be(e);Ps(r.rootDir,{recursive:!0}),Ps(r.logRootDir,{recursive:!0}),this.rootDir=r.rootDir,this.logRootDir=r.logRootDir,this.stateDbPath=r.stateDbPath,this.db=this.createDatabaseConnection(),this.bootstrap()}createDatabaseConnection(){let e=new nd(this.stateDbPath,{timeout:sd,enableForeignKeyConstraints:!0});return e.exec("PRAGMA journal_mode = WAL"),e.exec("PRAGMA foreign_keys = ON"),e}isRetryableLockError(e){if(!(e instanceof Error))return!1;let r=e;return r.code==="ERR_SQLITE_ERROR"&&(typeof r.errcode=="number"&&id.has(r.errcode)||typeof r.errstr=="string"&&r.errstr.toLowerCase().includes("locked"))}reopenDatabase(){let e=this.db;this.db=this.createDatabaseConnection();try{e.close()}catch{}}throwPersistentLockError(e){let r=new Error(`SQLite database remained locked after recovery attempts at ${this.stateDbPath}. Stop the competing Code Factory process or use a different OH_MY_PR_HOME.`,{cause:e});throw r.name="SqliteDatabaseLockedError",r.code=e.code,r.errcode=e.errcode,r.errstr=e.errstr,r.statusCode=503,r}withLockRecovery(e){let r;for(let n=0;n<=Es;n+=1)try{return e()}catch(a){if(!this.isRetryableLockError(a))throw a;if(r=a,this.db.isTransaction||n===Es)break;this.reopenDatabase()}this.throwPersistentLockError(r??new Error("SQLite database lock recovery failed."))}exec(e){this.withLockRecovery(()=>{this.db.exec(e)})}get(e,...r){return this.withLockRecovery(()=>this.db.prepare(e).get(...r))}all(e,...r){return this.withLockRecovery(()=>this.db.prepare(e).all(...r))}run(e,...r){return this.withLockRecovery(()=>this.db.prepare(e).run(...r))}withWriteTransaction(e){if(this.db.isTransaction)return e();this.exec("BEGIN IMMEDIATE");try{let r=e();return this.exec("COMMIT"),r}catch(r){if(this.db.isTransaction)try{this.db.exec("ROLLBACK")}catch{}throw r}}bootstrap(){this.exec(`
4
6
  CREATE TABLE IF NOT EXISTS config (
5
7
  id INTEGER PRIMARY KEY CHECK (id = 1),
6
8
  github_token TEXT NOT NULL,
@@ -284,10 +286,10 @@ var Mi=Object.defineProperty;var $i=(r,e)=>{for(var t in e)Mi(r,t,{get:e[t],enum
284
286
  CREATE INDEX IF NOT EXISTS idx_release_runs_created_at ON release_runs(created_at);
285
287
  CREATE INDEX IF NOT EXISTS idx_release_runs_status_created_at ON release_runs(status, created_at);
286
288
  CREATE INDEX IF NOT EXISTS idx_release_runs_repo_trigger_merge_sha ON release_runs(repo, trigger_merge_sha);
287
- `),this.ensureColumn("feedback_items","reply_kind","TEXT NOT NULL DEFAULT 'general_comment'"),this.ensureColumn("feedback_items","source_id","TEXT NOT NULL DEFAULT ''"),this.ensureColumn("feedback_items","source_node_id","TEXT"),this.ensureColumn("feedback_items","source_url","TEXT"),this.ensureColumn("feedback_items","thread_id","TEXT"),this.ensureColumn("feedback_items","thread_resolved","INTEGER"),this.ensureColumn("feedback_items","audit_token","TEXT NOT NULL DEFAULT ''"),this.ensureColumn("feedback_items","status","TEXT NOT NULL DEFAULT 'pending'"),this.ensureColumn("feedback_items","status_reason","TEXT"),this.ensureColumn("config","auto_resolve_merge_conflicts","INTEGER NOT NULL DEFAULT 1"),this.ensureColumn("config","auto_create_releases","INTEGER NOT NULL DEFAULT 1"),this.ensureColumn("config","auto_update_docs","INTEGER NOT NULL DEFAULT 1"),this.ensureColumn("config","auto_heal_ci","INTEGER NOT NULL DEFAULT 0"),this.ensureColumn("config","max_healing_attempts_per_session","INTEGER NOT NULL DEFAULT 3"),this.ensureColumn("config","max_healing_attempts_per_fingerprint","INTEGER NOT NULL DEFAULT 2"),this.ensureColumn("config","max_concurrent_healing_runs","INTEGER NOT NULL DEFAULT 1"),this.ensureColumn("config","healing_cooldown_ms","INTEGER NOT NULL DEFAULT 300000"),this.ensureColumn("config","auto_heal_deployments","INTEGER NOT NULL DEFAULT 0"),this.ensureColumn("config","deployment_check_delay_ms","INTEGER NOT NULL DEFAULT 60000"),this.ensureColumn("config","deployment_check_timeout_ms","INTEGER NOT NULL DEFAULT 600000"),this.ensureColumn("config","deployment_check_poll_interval_ms","INTEGER NOT NULL DEFAULT 15000"),this.ensureColumn("prs","watch_enabled","INTEGER NOT NULL DEFAULT 1"),this.ensureColumn("prs","docs_assessment_json","TEXT"),this.get("SELECT 1 AS present FROM config WHERE id = 1")||this.writeConfig(be),this.get("SELECT 1 AS present FROM runtime_state WHERE id = 1")||this.run(`
289
+ `),this.ensureColumn("feedback_items","reply_kind","TEXT NOT NULL DEFAULT 'general_comment'"),this.ensureColumn("feedback_items","source_id","TEXT NOT NULL DEFAULT ''"),this.ensureColumn("feedback_items","source_node_id","TEXT"),this.ensureColumn("feedback_items","source_url","TEXT"),this.ensureColumn("feedback_items","thread_id","TEXT"),this.ensureColumn("feedback_items","thread_resolved","INTEGER"),this.ensureColumn("feedback_items","audit_token","TEXT NOT NULL DEFAULT ''"),this.ensureColumn("feedback_items","status","TEXT NOT NULL DEFAULT 'pending'"),this.ensureColumn("feedback_items","status_reason","TEXT"),this.ensureColumn("config","auto_resolve_merge_conflicts","INTEGER NOT NULL DEFAULT 1"),this.ensureColumn("config","auto_create_releases","INTEGER NOT NULL DEFAULT 1"),this.ensureColumn("config","auto_update_docs","INTEGER NOT NULL DEFAULT 1"),this.ensureColumn("config","auto_heal_ci","INTEGER NOT NULL DEFAULT 0"),this.ensureColumn("config","max_healing_attempts_per_session","INTEGER NOT NULL DEFAULT 3"),this.ensureColumn("config","max_healing_attempts_per_fingerprint","INTEGER NOT NULL DEFAULT 2"),this.ensureColumn("config","max_concurrent_healing_runs","INTEGER NOT NULL DEFAULT 1"),this.ensureColumn("config","healing_cooldown_ms","INTEGER NOT NULL DEFAULT 300000"),this.ensureColumn("config","auto_heal_deployments","INTEGER NOT NULL DEFAULT 0"),this.ensureColumn("config","deployment_check_delay_ms","INTEGER NOT NULL DEFAULT 60000"),this.ensureColumn("config","deployment_check_timeout_ms","INTEGER NOT NULL DEFAULT 600000"),this.ensureColumn("config","deployment_check_poll_interval_ms","INTEGER NOT NULL DEFAULT 15000"),this.ensureColumn("prs","watch_enabled","INTEGER NOT NULL DEFAULT 1"),this.ensureColumn("prs","docs_assessment_json","TEXT"),this.get("SELECT 1 AS present FROM config WHERE id = 1")||this.writeConfig(Pe),this.get("SELECT 1 AS present FROM runtime_state WHERE id = 1")||this.run(`
288
290
  INSERT INTO runtime_state (id, drain_mode, drain_requested_at, drain_reason)
289
291
  VALUES (1, 0, NULL, NULL)
290
- `)}ensureColumn(e,t,n){this.all(`PRAGMA table_info(${e})`).some(s=>s.name===t)||this.exec(`ALTER TABLE ${e} ADD COLUMN ${t} ${n}`)}parseConfigRow(e,t){return e?{githubToken:e.github_token,codingAgent:e.coding_agent,maxTurns:e.max_turns,batchWindowMs:e.batch_window_ms,pollIntervalMs:e.poll_interval_ms,maxChangesPerRun:e.max_changes_per_run,autoResolveMergeConflicts:!!e.auto_resolve_merge_conflicts,autoCreateReleases:!!(e.auto_create_releases??1),autoUpdateDocs:!!(e.auto_update_docs??1),autoHealCI:!!(e.auto_heal_ci??Number(be.autoHealCI)),maxHealingAttemptsPerSession:e.max_healing_attempts_per_session??be.maxHealingAttemptsPerSession,maxHealingAttemptsPerFingerprint:e.max_healing_attempts_per_fingerprint??be.maxHealingAttemptsPerFingerprint,maxConcurrentHealingRuns:e.max_concurrent_healing_runs??be.maxConcurrentHealingRuns,healingCooldownMs:e.healing_cooldown_ms??be.healingCooldownMs,autoHealDeployments:!!(e.auto_heal_deployments??be.autoHealDeployments),deploymentCheckDelayMs:e.deployment_check_delay_ms??be.deploymentCheckDelayMs,deploymentCheckTimeoutMs:e.deployment_check_timeout_ms??be.deploymentCheckTimeoutMs,deploymentCheckPollIntervalMs:e.deployment_check_poll_interval_ms??be.deploymentCheckPollIntervalMs,watchedRepos:t,trustedReviewers:JSON.parse(e.trusted_reviewers_json),ignoredBots:JSON.parse(e.ignored_bots_json)}:{...be,watchedRepos:t}}writeConfig(e){this.withWriteTransaction(()=>{let t=this.get("SELECT model FROM config WHERE id = 1")?.model??Md;this.run(`
292
+ `)}ensureColumn(e,r,n){this.all(`PRAGMA table_info(${e})`).some(s=>s.name===r)||this.exec(`ALTER TABLE ${e} ADD COLUMN ${r} ${n}`)}parseConfigRow(e,r){return e?{githubToken:e.github_token,codingAgent:e.coding_agent,maxTurns:e.max_turns,batchWindowMs:e.batch_window_ms,pollIntervalMs:e.poll_interval_ms,maxChangesPerRun:e.max_changes_per_run,autoResolveMergeConflicts:!!e.auto_resolve_merge_conflicts,autoCreateReleases:!!(e.auto_create_releases??1),autoUpdateDocs:!!(e.auto_update_docs??1),autoHealCI:!!(e.auto_heal_ci??Number(Pe.autoHealCI)),maxHealingAttemptsPerSession:e.max_healing_attempts_per_session??Pe.maxHealingAttemptsPerSession,maxHealingAttemptsPerFingerprint:e.max_healing_attempts_per_fingerprint??Pe.maxHealingAttemptsPerFingerprint,maxConcurrentHealingRuns:e.max_concurrent_healing_runs??Pe.maxConcurrentHealingRuns,healingCooldownMs:e.healing_cooldown_ms??Pe.healingCooldownMs,autoHealDeployments:!!(e.auto_heal_deployments??Pe.autoHealDeployments),deploymentCheckDelayMs:e.deployment_check_delay_ms??Pe.deploymentCheckDelayMs,deploymentCheckTimeoutMs:e.deployment_check_timeout_ms??Pe.deploymentCheckTimeoutMs,deploymentCheckPollIntervalMs:e.deployment_check_poll_interval_ms??Pe.deploymentCheckPollIntervalMs,watchedRepos:r,trustedReviewers:JSON.parse(e.trusted_reviewers_json),ignoredBots:JSON.parse(e.ignored_bots_json)}:{...Pe,watchedRepos:r}}writeConfig(e){this.withWriteTransaction(()=>{let r=this.get("SELECT model FROM config WHERE id = 1")?.model??ad;this.run(`
291
293
  INSERT INTO config (
292
294
  id,
293
295
  github_token,
@@ -334,25 +336,25 @@ var Mi=Object.defineProperty;var $i=(r,e)=>{for(var t in e)Mi(r,t,{get:e[t],enum
334
336
  deployment_check_poll_interval_ms = excluded.deployment_check_poll_interval_ms,
335
337
  trusted_reviewers_json = excluded.trusted_reviewers_json,
336
338
  ignored_bots_json = excluded.ignored_bots_json
337
- `,1,e.githubToken,e.codingAgent,t,e.maxTurns,e.batchWindowMs,e.pollIntervalMs,e.maxChangesPerRun,Number(e.autoResolveMergeConflicts),Number(e.autoCreateReleases),Number(e.autoUpdateDocs),Number(e.autoHealCI),e.maxHealingAttemptsPerSession,e.maxHealingAttemptsPerFingerprint,e.maxConcurrentHealingRuns,e.healingCooldownMs,Number(e.autoHealDeployments),e.deploymentCheckDelayMs,e.deploymentCheckTimeoutMs,e.deploymentCheckPollIntervalMs,JSON.stringify(e.trustedReviewers),JSON.stringify(e.ignoredBots)),this.exec("DELETE FROM watched_repos");for(let n of e.watchedRepos)this.run("INSERT INTO watched_repos (repo) VALUES (?)",n)})}getWatchedRepos(){return this.all("SELECT repo FROM watched_repos ORDER BY repo ASC").map(t=>t.repo)}parsePRRow(e,t){return{id:e.id,number:e.number,title:e.title,repo:e.repo,branch:e.branch,author:e.author,url:e.url,status:e.status,feedbackItems:t,accepted:e.accepted,rejected:e.rejected,flagged:e.flagged,testsPassed:e.tests_passed===null?null:!!e.tests_passed,lintPassed:e.lint_passed===null?null:!!e.lint_passed,lastChecked:e.last_checked,watchEnabled:!!e.watch_enabled,docsAssessment:this.parseDocsAssessment(e.docs_assessment_json),addedAt:e.added_at}}parseDocsAssessment(e){if(!e)return null;try{return cn.parse(JSON.parse(e))}catch{return null}}parseRuntimeStateRow(e){return e?{drainMode:!!e.drain_mode,drainRequestedAt:e.drain_requested_at,drainReason:e.drain_reason}:{...Bd}}parseAgentRunRow(e){return{id:e.id,prId:e.pr_id,preferredAgent:e.preferred_agent,resolvedAgent:e.resolved_agent,status:e.status,phase:e.phase,prompt:e.prompt,initialHeadSha:e.initial_head_sha,metadata:e.metadata_json?JSON.parse(e.metadata_json):null,lastError:e.last_error,createdAt:e.created_at,updatedAt:e.updated_at}}parseBackgroundJobRow(e){return{id:e.id,kind:e.kind,targetId:e.target_id,dedupeKey:e.dedupe_key,status:gn.parse(e.status),priority:e.priority,availableAt:e.available_at,leaseOwner:e.lease_owner,leaseToken:e.lease_token,leaseExpiresAt:e.lease_expires_at,heartbeatAt:e.heartbeat_at,attemptCount:e.attempt_count,lastError:e.last_error,payload:JSON.parse(e.payload_json),createdAt:e.created_at,updatedAt:e.updated_at,completedAt:e.completed_at}}finalizeBackgroundJob(e,t,n,a,s){return this.withWriteTransaction(()=>{let i=this.get(`
339
+ `,1,e.githubToken,e.codingAgent,r,e.maxTurns,e.batchWindowMs,e.pollIntervalMs,e.maxChangesPerRun,Number(e.autoResolveMergeConflicts),Number(e.autoCreateReleases),Number(e.autoUpdateDocs),Number(e.autoHealCI),e.maxHealingAttemptsPerSession,e.maxHealingAttemptsPerFingerprint,e.maxConcurrentHealingRuns,e.healingCooldownMs,Number(e.autoHealDeployments),e.deploymentCheckDelayMs,e.deploymentCheckTimeoutMs,e.deploymentCheckPollIntervalMs,JSON.stringify(e.trustedReviewers),JSON.stringify(e.ignoredBots)),this.exec("DELETE FROM watched_repos");for(let n of e.watchedRepos)this.run("INSERT INTO watched_repos (repo) VALUES (?)",n)})}getWatchedRepos(){return this.all("SELECT repo FROM watched_repos ORDER BY repo ASC").map(r=>r.repo)}parsePRRow(e,r){return{id:e.id,number:e.number,title:e.title,repo:e.repo,branch:e.branch,author:e.author,url:e.url,status:e.status,feedbackItems:r,accepted:e.accepted,rejected:e.rejected,flagged:e.flagged,testsPassed:e.tests_passed===null?null:!!e.tests_passed,lintPassed:e.lint_passed===null?null:!!e.lint_passed,lastChecked:e.last_checked,watchEnabled:!!e.watch_enabled,docsAssessment:this.parseDocsAssessment(e.docs_assessment_json),addedAt:e.added_at}}parseDocsAssessment(e){if(!e)return null;try{return Dn.parse(JSON.parse(e))}catch{return null}}parseRuntimeStateRow(e){return e?{drainMode:!!e.drain_mode,drainRequestedAt:e.drain_requested_at,drainReason:e.drain_reason}:{...od}}parseAgentRunRow(e){return{id:e.id,prId:e.pr_id,preferredAgent:e.preferred_agent,resolvedAgent:e.resolved_agent,status:e.status,phase:e.phase,prompt:e.prompt,initialHeadSha:e.initial_head_sha,metadata:e.metadata_json?JSON.parse(e.metadata_json):null,lastError:e.last_error,createdAt:e.created_at,updatedAt:e.updated_at}}parseBackgroundJobRow(e){return{id:e.id,kind:e.kind,targetId:e.target_id,dedupeKey:e.dedupe_key,status:Hn.parse(e.status),priority:e.priority,availableAt:e.available_at,leaseOwner:e.lease_owner,leaseToken:e.lease_token,leaseExpiresAt:e.lease_expires_at,heartbeatAt:e.heartbeat_at,attemptCount:e.attempt_count,lastError:e.last_error,payload:JSON.parse(e.payload_json),createdAt:e.created_at,updatedAt:e.updated_at,completedAt:e.completed_at}}finalizeBackgroundJob(e,r,n,a,s){return this.withWriteTransaction(()=>{let i=this.get(`
338
340
  SELECT id, kind, target_id, dedupe_key, status, priority, available_at,
339
341
  lease_owner, lease_token, lease_expires_at, heartbeat_at, attempt_count,
340
342
  last_error, payload_json, created_at, updated_at, completed_at
341
343
  FROM background_jobs
342
344
  WHERE id = ? AND status = 'leased' AND lease_token = ?
343
- `,e,t);if(!i)return;let o=Qt(this.parseBackgroundJobRow(i),{status:n,leaseOwner:null,leaseToken:null,leaseExpiresAt:null,heartbeatAt:null,lastError:a,completedAt:s});return this.run(`
345
+ `,e,r);if(!i)return;let o=br(this.parseBackgroundJobRow(i),{status:n,leaseOwner:null,leaseToken:null,leaseExpiresAt:null,heartbeatAt:null,lastError:a,completedAt:s});return this.run(`
344
346
  UPDATE background_jobs
345
347
  SET status = ?, lease_owner = NULL, lease_token = NULL, lease_expires_at = NULL,
346
348
  heartbeat_at = NULL, last_error = ?, completed_at = ?, updated_at = ?
347
349
  WHERE id = ? AND status = 'leased' AND lease_token = ?
348
- `,o.status,o.lastError,o.completedAt,o.updatedAt,e,t),o})}parseHealingSessionRow(e){return{id:e.id,prId:e.pr_id,repo:e.repo,prNumber:e.pr_number,initialHeadSha:e.initial_head_sha,currentHeadSha:e.current_head_sha,state:e.state,startedAt:e.started_at,updatedAt:e.updated_at,endedAt:e.ended_at,blockedReason:e.blocked_reason,escalationReason:e.escalation_reason,latestFingerprint:e.latest_fingerprint,attemptCount:e.attempt_count,lastImprovementScore:e.last_improvement_score}}parseHealingAttemptRow(e){return{id:e.id,sessionId:e.session_id,attemptNumber:e.attempt_number,inputSha:e.input_sha,outputSha:e.output_sha,status:e.status,startedAt:e.started_at,endedAt:e.ended_at,agent:e.agent,promptDigest:e.prompt_digest,targetFingerprints:JSON.parse(e.target_fingerprints_json),summary:e.summary,improvementScore:e.improvement_score,error:e.error}}parseCheckSnapshotRow(e){return{id:e.id,prId:e.pr_id,sha:e.sha,provider:e.provider,context:e.context,status:e.status,conclusion:e.conclusion,description:e.description,targetUrl:e.target_url,observedAt:e.observed_at}}parseFailureFingerprintRow(e){return{id:e.id,sessionId:e.session_id,sha:e.sha,fingerprint:e.fingerprint,category:e.category,classification:e.classification,summary:e.summary,selectedEvidence:JSON.parse(e.selected_evidence_json),createdAt:e.created_at}}getFeedbackItemsForPRIds(e){let t=new Map;if(e.length===0)return t;let n=e.map(()=>"?").join(", "),a=this.all(`
350
+ `,o.status,o.lastError,o.completedAt,o.updatedAt,e,r),o})}parseHealingSessionRow(e){return{id:e.id,prId:e.pr_id,repo:e.repo,prNumber:e.pr_number,initialHeadSha:e.initial_head_sha,currentHeadSha:e.current_head_sha,state:e.state,startedAt:e.started_at,updatedAt:e.updated_at,endedAt:e.ended_at,blockedReason:e.blocked_reason,escalationReason:e.escalation_reason,latestFingerprint:e.latest_fingerprint,attemptCount:e.attempt_count,lastImprovementScore:e.last_improvement_score}}parseHealingAttemptRow(e){return{id:e.id,sessionId:e.session_id,attemptNumber:e.attempt_number,inputSha:e.input_sha,outputSha:e.output_sha,status:e.status,startedAt:e.started_at,endedAt:e.ended_at,agent:e.agent,promptDigest:e.prompt_digest,targetFingerprints:JSON.parse(e.target_fingerprints_json),summary:e.summary,improvementScore:e.improvement_score,error:e.error}}parseCheckSnapshotRow(e){return{id:e.id,prId:e.pr_id,sha:e.sha,provider:e.provider,context:e.context,status:e.status,conclusion:e.conclusion,description:e.description,targetUrl:e.target_url,observedAt:e.observed_at}}parseFailureFingerprintRow(e){return{id:e.id,sessionId:e.session_id,sha:e.sha,fingerprint:e.fingerprint,category:e.category,classification:e.classification,summary:e.summary,selectedEvidence:JSON.parse(e.selected_evidence_json),createdAt:e.created_at}}getFeedbackItemsForPRIds(e){let r=new Map;if(e.length===0)return r;let n=e.map(()=>"?").join(", "),a=this.all(`
349
351
  SELECT id, pr_id, author, body, body_html, reply_kind, source_id, source_node_id, source_url,
350
352
  thread_id, thread_resolved, audit_token, file, line, type, created_at, decision,
351
353
  decision_reason, action, status, status_reason
352
354
  FROM feedback_items
353
355
  WHERE pr_id IN (${n})
354
356
  ORDER BY created_at ASC
355
- `,...e);for(let s of a){let i={id:s.id,author:s.author,body:s.body,bodyHtml:s.body_html,replyKind:s.reply_kind,sourceId:s.source_id||s.id,sourceNodeId:s.source_node_id,sourceUrl:s.source_url,threadId:s.thread_id,threadResolved:s.thread_resolved===null?null:!!s.thread_resolved,auditToken:s.audit_token||`codefactory-feedback:${s.id}`,file:s.file,line:s.line,type:s.type,createdAt:s.created_at,decision:s.decision,decisionReason:s.decision_reason,action:s.action,status:un.catch("pending").parse(s.status??"pending"),statusReason:s.status_reason??null},o=t.get(s.pr_id)||[];o.push(i),t.set(s.pr_id,o)}return t}replaceFeedbackItems(e,t){this.run("DELETE FROM feedback_items WHERE pr_id = ?",e);for(let n of t)this.run(`
357
+ `,...e);for(let s of a){let i={id:s.id,author:s.author,body:s.body,bodyHtml:s.body_html,replyKind:s.reply_kind,sourceId:s.source_id||s.id,sourceNodeId:s.source_node_id,sourceUrl:s.source_url,threadId:s.thread_id,threadResolved:s.thread_resolved===null?null:!!s.thread_resolved,auditToken:s.audit_token||`codefactory-feedback:${s.id}`,file:s.file,line:s.line,type:s.type,createdAt:s.created_at,decision:s.decision,decisionReason:s.decision_reason,action:s.action,status:Fn.catch("pending").parse(s.status??"pending"),statusReason:s.status_reason??null},o=r.get(s.pr_id)||[];o.push(i),r.set(s.pr_id,o)}return r}replaceFeedbackItems(e,r){this.run("DELETE FROM feedback_items WHERE pr_id = ?",e);for(let n of r)this.run(`
356
358
  INSERT INTO feedback_items (
357
359
  id, pr_id, author, body, body_html, reply_kind, source_id, source_node_id, source_url,
358
360
  thread_id, thread_resolved, audit_token, file, line, type, created_at, decision, decision_reason, action,
@@ -364,28 +366,28 @@ var Mi=Object.defineProperty;var $i=(r,e)=>{for(var t in e)Mi(r,t,{get:e[t],enum
364
366
  FROM prs
365
367
  WHERE status != 'archived'
366
368
  ORDER BY datetime(added_at) DESC
367
- `),t=this.getFeedbackItemsForPRIds(e.map(n=>n.id));return e.map(n=>this.parsePRRow(n,t.get(n.id)||[]))}async getArchivedPRs(){let e=this.all(`
369
+ `),r=this.getFeedbackItemsForPRIds(e.map(n=>n.id));return e.map(n=>this.parsePRRow(n,r.get(n.id)||[]))}async getArchivedPRs(){let e=this.all(`
368
370
  SELECT id, number, title, repo, branch, author, url, status, accepted, rejected, flagged,
369
371
  tests_passed, lint_passed, last_checked, watch_enabled, docs_assessment_json, added_at
370
372
  FROM prs
371
373
  WHERE status = 'archived'
372
374
  ORDER BY datetime(added_at) DESC
373
- `),t=this.getFeedbackItemsForPRIds(e.map(n=>n.id));return e.map(n=>this.parsePRRow(n,t.get(n.id)||[]))}async getPR(e){let t=this.get(`
375
+ `),r=this.getFeedbackItemsForPRIds(e.map(n=>n.id));return e.map(n=>this.parsePRRow(n,r.get(n.id)||[]))}async getPR(e){let r=this.get(`
374
376
  SELECT id, number, title, repo, branch, author, url, status, accepted, rejected, flagged,
375
377
  tests_passed, lint_passed, last_checked, watch_enabled, docs_assessment_json, added_at
376
378
  FROM prs
377
379
  WHERE id = ?
378
- `,e);if(!t)return;let n=this.getFeedbackItemsForPRIds([e]);return this.parsePRRow(t,n.get(e)||[])}async getPRByRepoAndNumber(e,t){let n=this.get(`
380
+ `,e);if(!r)return;let n=this.getFeedbackItemsForPRIds([e]);return this.parsePRRow(r,n.get(e)||[])}async getPRByRepoAndNumber(e,r){let n=this.get(`
379
381
  SELECT id, number, title, repo, branch, author, url, status, accepted, rejected, flagged,
380
382
  tests_passed, lint_passed, last_checked, watch_enabled, docs_assessment_json, added_at
381
383
  FROM prs
382
384
  WHERE repo = ? AND number = ?
383
- `,e,t);if(!n)return;let a=this.getFeedbackItemsForPRIds([n.id]);return this.parsePRRow(n,a.get(n.id)||[])}async addPR(e){let t=Rn(e);return this.withWriteTransaction(()=>{this.run(`
385
+ `,e,r);if(!n)return;let a=this.getFeedbackItemsForPRIds([n.id]);return this.parsePRRow(n,a.get(n.id)||[])}async addPR(e){let r=Jn(e);return this.withWriteTransaction(()=>{this.run(`
384
386
  INSERT INTO prs (
385
387
  id, number, title, repo, branch, author, url, status, accepted, rejected, flagged,
386
388
  tests_passed, lint_passed, last_checked, watch_enabled, docs_assessment_json, added_at
387
389
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
388
- `,t.id,t.number,t.title,t.repo,t.branch,t.author,t.url,t.status,t.accepted,t.rejected,t.flagged,t.testsPassed===null?null:Number(t.testsPassed),t.lintPassed===null?null:Number(t.lintPassed),t.lastChecked,Number(t.watchEnabled),t.docsAssessment?JSON.stringify(t.docsAssessment):null,t.addedAt),this.replaceFeedbackItems(t.id,t.feedbackItems)}),t}async updatePR(e,t){let n=await this.getPR(e);if(!n)return;let a=wn(n,t);return this.withWriteTransaction(()=>{this.run(`
390
+ `,r.id,r.number,r.title,r.repo,r.branch,r.author,r.url,r.status,r.accepted,r.rejected,r.flagged,r.testsPassed===null?null:Number(r.testsPassed),r.lintPassed===null?null:Number(r.lintPassed),r.lastChecked,Number(r.watchEnabled),r.docsAssessment?JSON.stringify(r.docsAssessment):null,r.addedAt),this.replaceFeedbackItems(r.id,r.feedbackItems)}),r}async updatePR(e,r){let n=await this.getPR(e);if(!n)return;let a=Gn(n,r);return this.withWriteTransaction(()=>{this.run(`
389
391
  UPDATE prs
390
392
  SET number = ?, title = ?, repo = ?, branch = ?, author = ?, url = ?, status = ?,
391
393
  accepted = ?, rejected = ?, flagged = ?, tests_passed = ?, lint_passed = ?, last_checked = ?, watch_enabled = ?, docs_assessment_json = ?
@@ -395,13 +397,13 @@ var Mi=Object.defineProperty;var $i=(r,e)=>{for(var t in e)Mi(r,t,{get:e[t],enum
395
397
  FROM pr_questions
396
398
  WHERE pr_id = ?
397
399
  ORDER BY datetime(created_at) ASC
398
- `,e).map(n=>({id:n.id,prId:n.pr_id,question:n.question,answer:n.answer,status:n.status,error:n.error,createdAt:n.created_at,answeredAt:n.answered_at}))}async addQuestion(e,t){let n=kn(e,t);return this.run(`
400
+ `,e).map(n=>({id:n.id,prId:n.pr_id,question:n.question,answer:n.answer,status:n.status,error:n.error,createdAt:n.created_at,answeredAt:n.answered_at}))}async addQuestion(e,r){let n=qn(e,r);return this.run(`
399
401
  INSERT INTO pr_questions (id, pr_id, question, answer, status, error, created_at, answered_at)
400
402
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
401
- `,n.id,n.prId,n.question,n.answer,n.status,n.error,n.createdAt,n.answeredAt),n}async updateQuestion(e,t){let n=this.get(`
403
+ `,n.id,n.prId,n.question,n.answer,n.status,n.error,n.createdAt,n.answeredAt),n}async updateQuestion(e,r){let n=this.get(`
402
404
  SELECT id, pr_id, question, answer, status, error, created_at, answered_at
403
405
  FROM pr_questions WHERE id = ?
404
- `,e);if(!n)return;let a={id:n.id,prId:n.pr_id,question:n.question,answer:n.answer,status:n.status,error:n.error,createdAt:n.created_at,answeredAt:n.answered_at},s=vn(a,t);return this.run(`
406
+ `,e);if(!n)return;let a={id:n.id,prId:n.pr_id,question:n.question,answer:n.answer,status:n.status,error:n.error,createdAt:n.created_at,answeredAt:n.answered_at},s=Wn(a,r);return this.run(`
405
407
  UPDATE pr_questions SET answer = ?, status = ?, error = ?, answered_at = ? WHERE id = ?
406
408
  `,s.answer,s.status,s.error,s.answeredAt,s.id),s}async getLogs(e){return(e?this.all(`
407
409
  SELECT id, pr_id, run_id, timestamp, level, phase, message, metadata_json
@@ -414,10 +416,10 @@ var Mi=Object.defineProperty;var $i=(r,e)=>{for(var t in e)Mi(r,t,{get:e[t],enum
414
416
  FROM logs
415
417
  ORDER BY datetime(timestamp) ASC
416
418
  LIMIT 500
417
- `)).map(n=>({id:n.id,prId:n.pr_id,runId:n.run_id,timestamp:n.timestamp,level:n.level,phase:n.phase,message:n.message,metadata:n.metadata_json?JSON.parse(n.metadata_json):null}))}async addLog(e,t,n,a){let s=Sn(e,t,n,a);this.run(`
419
+ `)).map(n=>({id:n.id,prId:n.pr_id,runId:n.run_id,timestamp:n.timestamp,level:n.level,phase:n.phase,message:n.message,metadata:n.metadata_json?JSON.parse(n.metadata_json):null}))}async addLog(e,r,n,a){let s=Xn(e,r,n,a);this.run(`
418
420
  INSERT INTO logs (id, pr_id, run_id, timestamp, level, phase, message, metadata_json)
419
421
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
420
- `,s.id,s.prId,s.runId,s.timestamp,s.level,s.phase,s.message,s.metadata?JSON.stringify(s.metadata):null);let i=this.get("SELECT repo, number FROM prs WHERE id = ?",e);return i&&is(this.logRootDir,i,s),s}async clearLogs(e){if(e){this.run("DELETE FROM logs WHERE pr_id = ?",e);return}this.exec("DELETE FROM logs")}async getConfig(){let e=this.get(`
422
+ `,s.id,s.prId,s.runId,s.timestamp,s.level,s.phase,s.message,s.metadata?JSON.stringify(s.metadata):null);let i=this.get("SELECT repo, number FROM prs WHERE id = ?",e);return i&&xs(this.logRootDir,i,s),s}async clearLogs(e){if(e){this.run("DELETE FROM logs WHERE pr_id = ?",e);return}this.exec("DELETE FROM logs")}async getConfig(){let e=this.get(`
421
423
  SELECT github_token, coding_agent, model, max_turns, batch_window_ms,
422
424
  poll_interval_ms, max_changes_per_run, auto_resolve_merge_conflicts, auto_create_releases,
423
425
  auto_update_docs, auto_heal_ci, max_healing_attempts_per_session,
@@ -426,82 +428,82 @@ var Mi=Object.defineProperty;var $i=(r,e)=>{for(var t in e)Mi(r,t,{get:e[t],enum
426
428
  deployment_check_poll_interval_ms, trusted_reviewers_json, ignored_bots_json
427
429
  FROM config
428
430
  WHERE id = 1
429
- `);return this.parseConfigRow(e,this.getWatchedRepos())}async updateConfig(e){let t=await this.getConfig(),n=On(t,e);return this.writeConfig(n),n}async getHealingSession(e){let t=this.get(`
431
+ `);return this.parseConfigRow(e,this.getWatchedRepos())}async updateConfig(e){let r=await this.getConfig(),n=ia(r,e);return this.writeConfig(n),n}async getHealingSession(e){let r=this.get(`
430
432
  SELECT id, pr_id, repo, pr_number, initial_head_sha, current_head_sha, state,
431
433
  started_at, updated_at, ended_at, blocked_reason, escalation_reason,
432
434
  latest_fingerprint, attempt_count, last_improvement_score
433
435
  FROM healing_sessions
434
436
  WHERE id = ?
435
- `,e);return t?this.parseHealingSessionRow(t):void 0}async getHealingSessionByPrAndHead(e,t){let n=this.get(`
437
+ `,e);return r?this.parseHealingSessionRow(r):void 0}async getHealingSessionByPrAndHead(e,r){let n=this.get(`
436
438
  SELECT id, pr_id, repo, pr_number, initial_head_sha, current_head_sha, state,
437
439
  started_at, updated_at, ended_at, blocked_reason, escalation_reason,
438
440
  latest_fingerprint, attempt_count, last_improvement_score
439
441
  FROM healing_sessions
440
442
  WHERE pr_id = ? AND initial_head_sha = ?
441
- `,e,t);return n?this.parseHealingSessionRow(n):void 0}async listHealingSessions(e){let t=[],n=[];e?.status&&(t.push("state = ?"),n.push(e.status)),e?.prId&&(t.push("pr_id = ?"),n.push(e.prId)),e?.repo&&(t.push("repo = ?"),n.push(e.repo));let a=t.length>0?`WHERE ${t.join(" AND ")}`:"";return this.all(`
443
+ `,e,r);return n?this.parseHealingSessionRow(n):void 0}async listHealingSessions(e){let r=[],n=[];e?.status&&(r.push("state = ?"),n.push(e.status)),e?.prId&&(r.push("pr_id = ?"),n.push(e.prId)),e?.repo&&(r.push("repo = ?"),n.push(e.repo));let a=r.length>0?`WHERE ${r.join(" AND ")}`:"";return this.all(`
442
444
  SELECT id, pr_id, repo, pr_number, initial_head_sha, current_head_sha, state,
443
445
  started_at, updated_at, ended_at, blocked_reason, escalation_reason,
444
446
  latest_fingerprint, attempt_count, last_improvement_score
445
447
  FROM healing_sessions
446
448
  ${a}
447
449
  ORDER BY datetime(updated_at) DESC
448
- `,...n).map(i=>this.parseHealingSessionRow(i))}async createHealingSession(e){let t=In(e);return this.run(`
450
+ `,...n).map(i=>this.parseHealingSessionRow(i))}async createHealingSession(e){let r=ea(e);return this.run(`
449
451
  INSERT INTO healing_sessions (
450
452
  id, pr_id, repo, pr_number, initial_head_sha, current_head_sha, state,
451
453
  started_at, updated_at, ended_at, blocked_reason, escalation_reason,
452
454
  latest_fingerprint, attempt_count, last_improvement_score
453
455
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
454
- `,t.id,t.prId,t.repo,t.prNumber,t.initialHeadSha,t.currentHeadSha,t.state,t.startedAt,t.updatedAt,t.endedAt,t.blockedReason,t.escalationReason,t.latestFingerprint,t.attemptCount,t.lastImprovementScore),t}async updateHealingSession(e,t){let n=await this.getHealingSession(e);if(!n)return;let a=Nn(n,t);return this.run(`
456
+ `,r.id,r.prId,r.repo,r.prNumber,r.initialHeadSha,r.currentHeadSha,r.state,r.startedAt,r.updatedAt,r.endedAt,r.blockedReason,r.escalationReason,r.latestFingerprint,r.attemptCount,r.lastImprovementScore),r}async updateHealingSession(e,r){let n=await this.getHealingSession(e);if(!n)return;let a=ta(n,r);return this.run(`
455
457
  UPDATE healing_sessions
456
458
  SET pr_id = ?, repo = ?, pr_number = ?, initial_head_sha = ?, current_head_sha = ?, state = ?,
457
459
  updated_at = ?, ended_at = ?, blocked_reason = ?, escalation_reason = ?,
458
460
  latest_fingerprint = ?, attempt_count = ?, last_improvement_score = ?
459
461
  WHERE id = ?
460
- `,a.prId,a.repo,a.prNumber,a.initialHeadSha,a.currentHeadSha,a.state,a.updatedAt,a.endedAt,a.blockedReason,a.escalationReason,a.latestFingerprint,a.attemptCount,a.lastImprovementScore,a.id),a}async getHealingAttempt(e){let t=this.get(`
462
+ `,a.prId,a.repo,a.prNumber,a.initialHeadSha,a.currentHeadSha,a.state,a.updatedAt,a.endedAt,a.blockedReason,a.escalationReason,a.latestFingerprint,a.attemptCount,a.lastImprovementScore,a.id),a}async getHealingAttempt(e){let r=this.get(`
461
463
  SELECT id, session_id, attempt_number, input_sha, output_sha, status,
462
464
  started_at, ended_at, agent, prompt_digest, target_fingerprints_json,
463
465
  summary, improvement_score, error
464
466
  FROM healing_attempts
465
467
  WHERE id = ?
466
- `,e);return t?this.parseHealingAttemptRow(t):void 0}async listHealingAttempts(e){let t=[],n=[];e?.sessionId&&(t.push("session_id = ?"),n.push(e.sessionId)),e?.status&&(t.push("status = ?"),n.push(e.status));let a=t.length>0?`WHERE ${t.join(" AND ")}`:"";return this.all(`
468
+ `,e);return r?this.parseHealingAttemptRow(r):void 0}async listHealingAttempts(e){let r=[],n=[];e?.sessionId&&(r.push("session_id = ?"),n.push(e.sessionId)),e?.status&&(r.push("status = ?"),n.push(e.status));let a=r.length>0?`WHERE ${r.join(" AND ")}`:"";return this.all(`
467
469
  SELECT id, session_id, attempt_number, input_sha, output_sha, status,
468
470
  started_at, ended_at, agent, prompt_digest, target_fingerprints_json,
469
471
  summary, improvement_score, error
470
472
  FROM healing_attempts
471
473
  ${a}
472
474
  ORDER BY attempt_number ASC, datetime(started_at) ASC
473
- `,...n).map(i=>this.parseHealingAttemptRow(i))}async createHealingAttempt(e){let t=Dn(e);return this.run(`
475
+ `,...n).map(i=>this.parseHealingAttemptRow(i))}async createHealingAttempt(e){let r=ra(e);return this.run(`
474
476
  INSERT INTO healing_attempts (
475
477
  id, session_id, attempt_number, input_sha, output_sha, status, started_at,
476
478
  ended_at, agent, prompt_digest, target_fingerprints_json, summary,
477
479
  improvement_score, error
478
480
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
479
- `,t.id,t.sessionId,t.attemptNumber,t.inputSha,t.outputSha,t.status,t.startedAt,t.endedAt,t.agent,t.promptDigest,JSON.stringify(t.targetFingerprints),t.summary,t.improvementScore,t.error),t}async updateHealingAttempt(e,t){let n=await this.getHealingAttempt(e);if(!n)return;let a=Fn(n,t);return this.run(`
481
+ `,r.id,r.sessionId,r.attemptNumber,r.inputSha,r.outputSha,r.status,r.startedAt,r.endedAt,r.agent,r.promptDigest,JSON.stringify(r.targetFingerprints),r.summary,r.improvementScore,r.error),r}async updateHealingAttempt(e,r){let n=await this.getHealingAttempt(e);if(!n)return;let a=na(n,r);return this.run(`
480
482
  UPDATE healing_attempts
481
483
  SET session_id = ?, input_sha = ?, output_sha = ?, status = ?, ended_at = ?, agent = ?,
482
484
  prompt_digest = ?, target_fingerprints_json = ?, summary = ?, improvement_score = ?, error = ?
483
485
  WHERE id = ?
484
- `,a.sessionId,a.inputSha,a.outputSha,a.status,a.endedAt,a.agent,a.promptDigest,JSON.stringify(a.targetFingerprints),a.summary,a.improvementScore,a.error,a.id),a}async listCheckSnapshots(e){let t=[],n=[];e?.prId&&(t.push("pr_id = ?"),n.push(e.prId)),e?.sha&&(t.push("sha = ?"),n.push(e.sha));let a=t.length>0?`WHERE ${t.join(" AND ")}`:"";return this.all(`
486
+ `,a.sessionId,a.inputSha,a.outputSha,a.status,a.endedAt,a.agent,a.promptDigest,JSON.stringify(a.targetFingerprints),a.summary,a.improvementScore,a.error,a.id),a}async listCheckSnapshots(e){let r=[],n=[];e?.prId&&(r.push("pr_id = ?"),n.push(e.prId)),e?.sha&&(r.push("sha = ?"),n.push(e.sha));let a=r.length>0?`WHERE ${r.join(" AND ")}`:"";return this.all(`
485
487
  SELECT id, pr_id, sha, provider, context, status, conclusion, description, target_url, observed_at
486
488
  FROM check_snapshots
487
489
  ${a}
488
490
  ORDER BY datetime(observed_at) ASC
489
- `,...n).map(i=>this.parseCheckSnapshotRow(i))}async createCheckSnapshot(e){let t=Ft(e);return this.run(`
491
+ `,...n).map(i=>this.parseCheckSnapshotRow(i))}async createCheckSnapshot(e){let r=er(e);return this.run(`
490
492
  INSERT INTO check_snapshots (
491
493
  id, pr_id, sha, provider, context, status, conclusion, description, target_url, observed_at
492
494
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
493
- `,t.id,t.prId,t.sha,t.provider,t.context,t.status,t.conclusion,t.description,t.targetUrl,t.observedAt),t}async listFailureFingerprints(e){let t=[],n=[];e?.sessionId&&(t.push("session_id = ?"),n.push(e.sessionId)),e?.sha&&(t.push("sha = ?"),n.push(e.sha));let a=t.length>0?`WHERE ${t.join(" AND ")}`:"";return this.all(`
495
+ `,r.id,r.prId,r.sha,r.provider,r.context,r.status,r.conclusion,r.description,r.targetUrl,r.observedAt),r}async listFailureFingerprints(e){let r=[],n=[];e?.sessionId&&(r.push("session_id = ?"),n.push(e.sessionId)),e?.sha&&(r.push("sha = ?"),n.push(e.sha));let a=r.length>0?`WHERE ${r.join(" AND ")}`:"";return this.all(`
494
496
  SELECT id, session_id, sha, fingerprint, category, classification, summary,
495
497
  selected_evidence_json, created_at
496
498
  FROM failure_fingerprints
497
499
  ${a}
498
500
  ORDER BY datetime(created_at) ASC
499
- `,...n).map(i=>this.parseFailureFingerprintRow(i))}async createFailureFingerprint(e){let t=Cn(e);return this.run(`
501
+ `,...n).map(i=>this.parseFailureFingerprintRow(i))}async createFailureFingerprint(e){let r=Zn(e);return this.run(`
500
502
  INSERT INTO failure_fingerprints (
501
503
  id, session_id, sha, fingerprint, category, classification, summary,
502
504
  selected_evidence_json, created_at
503
505
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
504
- `,t.id,t.sessionId,t.sha,t.fingerprint,t.category,t.classification,t.summary,JSON.stringify(t.selectedEvidence),t.createdAt),t}async getRuntimeState(){let e=this.get(`
506
+ `,r.id,r.sessionId,r.sha,r.fingerprint,r.category,r.classification,r.summary,JSON.stringify(r.selectedEvidence),r.createdAt),r}async getRuntimeState(){let e=this.get(`
505
507
  SELECT drain_mode, drain_requested_at, drain_reason
506
508
  FROM runtime_state
507
509
  WHERE id = 1
@@ -512,20 +514,20 @@ var Mi=Object.defineProperty;var $i=(r,e)=>{for(var t in e)Mi(r,t,{get:e[t],enum
512
514
  drain_mode = excluded.drain_mode,
513
515
  drain_requested_at = excluded.drain_requested_at,
514
516
  drain_reason = excluded.drain_reason
515
- `,Number(n.drainMode),n.drainRequestedAt,n.drainReason),n}async getBackgroundJob(e){let t=this.get(`
517
+ `,Number(n.drainMode),n.drainRequestedAt,n.drainReason),n}async getBackgroundJob(e){let r=this.get(`
516
518
  SELECT id, kind, target_id, dedupe_key, status, priority, available_at,
517
519
  lease_owner, lease_token, lease_expires_at, heartbeat_at, attempt_count,
518
520
  last_error, payload_json, created_at, updated_at, completed_at
519
521
  FROM background_jobs
520
522
  WHERE id = ?
521
- `,e);return t?this.parseBackgroundJobRow(t):void 0}async listBackgroundJobs(e){let t=[],n=[];e?.kind&&(t.push("kind = ?"),n.push(e.kind)),e?.status&&(t.push("status = ?"),n.push(e.status)),e?.dedupeKey&&(t.push("dedupe_key = ?"),n.push(e.dedupeKey)),e?.targetId&&(t.push("target_id = ?"),n.push(e.targetId));let a=t.length>0?`WHERE ${t.join(" AND ")}`:"";return this.all(`
523
+ `,e);return r?this.parseBackgroundJobRow(r):void 0}async listBackgroundJobs(e){let r=[],n=[];e?.kind&&(r.push("kind = ?"),n.push(e.kind)),e?.status&&(r.push("status = ?"),n.push(e.status)),e?.dedupeKey&&(r.push("dedupe_key = ?"),n.push(e.dedupeKey)),e?.targetId&&(r.push("target_id = ?"),n.push(e.targetId));let a=r.length>0?`WHERE ${r.join(" AND ")}`:"";return this.all(`
522
524
  SELECT id, kind, target_id, dedupe_key, status, priority, available_at,
523
525
  lease_owner, lease_token, lease_expires_at, heartbeat_at, attempt_count,
524
526
  last_error, payload_json, created_at, updated_at, completed_at
525
527
  FROM background_jobs
526
528
  ${a}
527
529
  ORDER BY priority ASC, datetime(available_at) ASC, datetime(created_at) ASC
528
- `,...n).map(i=>this.parseBackgroundJobRow(i))}async enqueueBackgroundJob(e){let t=this.get(`
530
+ `,...n).map(i=>this.parseBackgroundJobRow(i))}async enqueueBackgroundJob(e){let r=this.get(`
529
531
  SELECT id, kind, target_id, dedupe_key, status, priority, available_at,
530
532
  lease_owner, lease_token, lease_expires_at, heartbeat_at, attempt_count,
531
533
  last_error, payload_json, created_at, updated_at, completed_at
@@ -533,7 +535,7 @@ var Mi=Object.defineProperty;var $i=(r,e)=>{for(var t in e)Mi(r,t,{get:e[t],enum
533
535
  WHERE dedupe_key = ? AND status IN ('queued', 'leased')
534
536
  ORDER BY datetime(created_at) ASC
535
537
  LIMIT 1
536
- `,e.dedupeKey);if(t)return this.parseBackgroundJobRow(t);let n=Tn({kind:e.kind,targetId:e.targetId,dedupeKey:e.dedupeKey,payload:e.payload??{},priority:e.priority,availableAt:e.availableAt??new Date().toISOString()});try{this.run(`
538
+ `,e.dedupeKey);if(r)return this.parseBackgroundJobRow(r);let n=Vn({kind:e.kind,targetId:e.targetId,dedupeKey:e.dedupeKey,payload:e.payload??{},priority:e.priority,availableAt:e.availableAt??new Date().toISOString()});try{this.run(`
537
539
  INSERT INTO background_jobs (
538
540
  id, kind, target_id, dedupe_key, status, priority, available_at,
539
541
  lease_owner, lease_token, lease_expires_at, heartbeat_at, attempt_count,
@@ -547,30 +549,30 @@ var Mi=Object.defineProperty;var $i=(r,e)=>{for(var t in e)Mi(r,t,{get:e[t],enum
547
549
  WHERE dedupe_key = ? AND status IN ('queued', 'leased')
548
550
  ORDER BY datetime(created_at) ASC
549
551
  LIMIT 1
550
- `,e.dedupeKey);if(!a)throw new Error(`Failed to enqueue background job for dedupe key ${e.dedupeKey}`);return this.parseBackgroundJobRow(a)}return n}async claimNextBackgroundJob(e){return this.withWriteTransaction(()=>{let t=["status = 'queued'","datetime(available_at) <= datetime(?)"],n=[e.now];e.kinds&&e.kinds.length>0&&(t.push(`kind IN (${e.kinds.map(()=>"?").join(", ")})`),n.push(...e.kinds));let a=this.get(`
552
+ `,e.dedupeKey);if(!a)throw new Error(`Failed to enqueue background job for dedupe key ${e.dedupeKey}`);return this.parseBackgroundJobRow(a)}return n}async claimNextBackgroundJob(e){return this.withWriteTransaction(()=>{let r=["status = 'queued'","datetime(available_at) <= datetime(?)"],n=[e.now];e.kinds&&e.kinds.length>0&&(r.push(`kind IN (${e.kinds.map(()=>"?").join(", ")})`),n.push(...e.kinds));let a=this.get(`
551
553
  SELECT id, kind, target_id, dedupe_key, status, priority, available_at,
552
554
  lease_owner, lease_token, lease_expires_at, heartbeat_at, attempt_count,
553
555
  last_error, payload_json, created_at, updated_at, completed_at
554
556
  FROM background_jobs
555
- WHERE ${t.join(" AND ")}
557
+ WHERE ${r.join(" AND ")}
556
558
  ORDER BY priority ASC, datetime(available_at) ASC, datetime(created_at) ASC
557
559
  LIMIT 1
558
- `,...n);if(!a)return;let s=Qt(this.parseBackgroundJobRow(a),{status:"leased",leaseOwner:e.workerId,leaseToken:e.leaseToken,leaseExpiresAt:e.leaseExpiresAt,heartbeatAt:e.now,attemptCount:a.attempt_count+1,completedAt:null});if(this.run(`
560
+ `,...n);if(!a)return;let s=br(this.parseBackgroundJobRow(a),{status:"leased",leaseOwner:e.workerId,leaseToken:e.leaseToken,leaseExpiresAt:e.leaseExpiresAt,heartbeatAt:e.now,attemptCount:a.attempt_count+1,completedAt:null});if(this.run(`
559
561
  UPDATE background_jobs
560
562
  SET status = ?, lease_owner = ?, lease_token = ?, lease_expires_at = ?, heartbeat_at = ?,
561
563
  attempt_count = ?, updated_at = ?, completed_at = ?
562
564
  WHERE id = ? AND status = 'queued'
563
- `,s.status,s.leaseOwner,s.leaseToken,s.leaseExpiresAt,s.heartbeatAt,s.attemptCount,s.updatedAt,s.completedAt,s.id).changes!==0)return s})}async heartbeatBackgroundJob(e,t,n,a){return this.withWriteTransaction(()=>{let s=this.get(`
565
+ `,s.status,s.leaseOwner,s.leaseToken,s.leaseExpiresAt,s.heartbeatAt,s.attemptCount,s.updatedAt,s.completedAt,s.id).changes!==0)return s})}async heartbeatBackgroundJob(e,r,n,a){return this.withWriteTransaction(()=>{let s=this.get(`
564
566
  SELECT id, kind, target_id, dedupe_key, status, priority, available_at,
565
567
  lease_owner, lease_token, lease_expires_at, heartbeat_at, attempt_count,
566
568
  last_error, payload_json, created_at, updated_at, completed_at
567
569
  FROM background_jobs
568
570
  WHERE id = ? AND status = 'leased' AND lease_token = ?
569
- `,e,t);if(!s)return;let i=Qt(this.parseBackgroundJobRow(s),{heartbeatAt:n,leaseExpiresAt:a});return this.run(`
571
+ `,e,r);if(!s)return;let i=br(this.parseBackgroundJobRow(s),{heartbeatAt:n,leaseExpiresAt:a});return this.run(`
570
572
  UPDATE background_jobs
571
573
  SET lease_expires_at = ?, heartbeat_at = ?, updated_at = ?
572
574
  WHERE id = ? AND status = 'leased' AND lease_token = ?
573
- `,i.leaseExpiresAt,i.heartbeatAt,i.updatedAt,e,t),i})}async completeBackgroundJob(e,t,n){return this.finalizeBackgroundJob(e,t,"completed",null,n)}async failBackgroundJob(e,t,n,a){return this.finalizeBackgroundJob(e,t,"failed",n,a)}async cancelBackgroundJob(e,t,n,a){return this.finalizeBackgroundJob(e,t,"canceled",n,a)}async requeueExpiredBackgroundJobs(e){let t=this.run(`
575
+ `,i.leaseExpiresAt,i.heartbeatAt,i.updatedAt,e,r),i})}async completeBackgroundJob(e,r,n){return this.finalizeBackgroundJob(e,r,"completed",null,n)}async failBackgroundJob(e,r,n,a){return this.finalizeBackgroundJob(e,r,"failed",n,a)}async cancelBackgroundJob(e,r,n,a){return this.finalizeBackgroundJob(e,r,"canceled",n,a)}async requeueExpiredBackgroundJobs(e){let r=this.run(`
574
576
  UPDATE background_jobs
575
577
  SET status = 'queued',
576
578
  lease_owner = NULL,
@@ -580,18 +582,18 @@ var Mi=Object.defineProperty;var $i=(r,e)=>{for(var t in e)Mi(r,t,{get:e[t],enum
580
582
  updated_at = ?,
581
583
  completed_at = NULL
582
584
  WHERE status = 'leased' AND lease_expires_at IS NOT NULL AND datetime(lease_expires_at) <= datetime(?)
583
- `,e,e);return Number(t.changes)}async getAgentRun(e){let t=this.get(`
585
+ `,e,e);return Number(r.changes)}async getAgentRun(e){let r=this.get(`
584
586
  SELECT id, pr_id, preferred_agent, resolved_agent, status, phase, prompt, initial_head_sha,
585
587
  metadata_json, last_error, created_at, updated_at
586
588
  FROM agent_runs
587
589
  WHERE id = ?
588
- `,e);if(t)return this.parseAgentRunRow(t)}async listAgentRuns(e){let t=[],n=[];e?.status&&(t.push("status = ?"),n.push(e.status)),e?.prId&&(t.push("pr_id = ?"),n.push(e.prId));let a=t.length>0?`WHERE ${t.join(" AND ")}`:"";return this.all(`
590
+ `,e);if(r)return this.parseAgentRunRow(r)}async listAgentRuns(e){let r=[],n=[];e?.status&&(r.push("status = ?"),n.push(e.status)),e?.prId&&(r.push("pr_id = ?"),n.push(e.prId));let a=r.length>0?`WHERE ${r.join(" AND ")}`:"";return this.all(`
589
591
  SELECT id, pr_id, preferred_agent, resolved_agent, status, phase, prompt, initial_head_sha,
590
592
  metadata_json, last_error, created_at, updated_at
591
593
  FROM agent_runs
592
594
  ${a}
593
595
  ORDER BY datetime(created_at) ASC
594
- `,...n).map(i=>this.parseAgentRunRow(i))}async upsertAgentRun(e){let t=await this.getAgentRun(e.id),n=t?{...e,createdAt:t.createdAt}:e;return this.run(`
596
+ `,...n).map(i=>this.parseAgentRunRow(i))}async upsertAgentRun(e){let r=await this.getAgentRun(e.id),n=r?{...e,createdAt:r.createdAt}:e;return this.run(`
595
597
  INSERT INTO agent_runs (
596
598
  id, pr_id, preferred_agent, resolved_agent, status, phase, prompt, initial_head_sha,
597
599
  metadata_json, last_error, created_at, updated_at
@@ -611,29 +613,29 @@ var Mi=Object.defineProperty;var $i=(r,e)=>{for(var t in e)Mi(r,t,{get:e[t],enum
611
613
  SELECT id, date, trigger_count, pr_summaries_json, content, status, error, created_at, completed_at
612
614
  FROM social_changelogs
613
615
  ORDER BY datetime(created_at) DESC
614
- `).map(t=>this.parseSocialChangelogRow(t))}async getSocialChangelog(e){let t=this.get(`
616
+ `).map(r=>this.parseSocialChangelogRow(r))}async getSocialChangelog(e){let r=this.get(`
615
617
  SELECT id, date, trigger_count, pr_summaries_json, content, status, error, created_at, completed_at
616
618
  FROM social_changelogs
617
619
  WHERE id = ?
618
- `,e);return t?this.parseSocialChangelogRow(t):void 0}async getSocialChangelogForDateAndCount(e,t){let n=this.get(`
620
+ `,e);return r?this.parseSocialChangelogRow(r):void 0}async getSocialChangelogForDateAndCount(e,r){let n=this.get(`
619
621
  SELECT id, date, trigger_count, pr_summaries_json, content, status, error, created_at, completed_at
620
622
  FROM social_changelogs
621
623
  WHERE date = ? AND trigger_count = ?
622
- `,e,t);return n?this.parseSocialChangelogRow(n):void 0}async createSocialChangelog(e){let t=Pn(e);return this.run(`
624
+ `,e,r);return n?this.parseSocialChangelogRow(n):void 0}async createSocialChangelog(e){let r=Kn(e);return this.run(`
623
625
  INSERT INTO social_changelogs (id, date, trigger_count, pr_summaries_json, content, status, error, created_at, completed_at)
624
626
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
625
- `,t.id,t.date,t.triggerCount,JSON.stringify(t.prSummaries),t.content,t.status,t.error,t.createdAt,t.completedAt),t}async updateSocialChangelog(e,t){let n=await this.getSocialChangelog(e);if(!n)return;let a=En(n,t);return this.run(`
627
+ `,r.id,r.date,r.triggerCount,JSON.stringify(r.prSummaries),r.content,r.status,r.error,r.createdAt,r.completedAt),r}async updateSocialChangelog(e,r){let n=await this.getSocialChangelog(e);if(!n)return;let a=zn(n,r);return this.run(`
626
628
  UPDATE social_changelogs
627
629
  SET date = ?, trigger_count = ?, pr_summaries_json = ?, content = ?, status = ?, error = ?, created_at = ?, completed_at = ?
628
630
  WHERE id = ?
629
- `,a.date,a.triggerCount,JSON.stringify(a.prSummaries),a.content,a.status,a.error,a.createdAt,a.completedAt,e),a}parseSocialChangelogRow(e){return{id:e.id,date:e.date,triggerCount:e.trigger_count,prSummaries:JSON.parse(e.pr_summaries_json),content:e.content,status:e.status,error:e.error,createdAt:e.created_at,completedAt:e.completed_at}}parseReleaseRunRow(e){return{id:e.id,repo:e.repo,baseBranch:e.base_branch,triggerPrNumber:e.trigger_pr_number,triggerPrTitle:e.trigger_pr_title,triggerPrUrl:e.trigger_pr_url,triggerMergeSha:e.trigger_merge_sha,triggerMergedAt:e.trigger_merged_at,status:e.status,decisionReason:e.decision_reason,recommendedBump:e.recommended_bump,proposedVersion:e.proposed_version,releaseTitle:e.release_title,releaseNotes:e.release_notes,includedPrs:JSON.parse(e.included_prs_json),targetSha:e.target_sha,githubReleaseId:e.github_release_id,githubReleaseUrl:e.github_release_url,error:e.error,createdAt:e.created_at,updatedAt:e.updated_at,completedAt:e.completed_at}}async getReleaseRun(e){let t=this.get(`
631
+ `,a.date,a.triggerCount,JSON.stringify(a.prSummaries),a.content,a.status,a.error,a.createdAt,a.completedAt,e),a}parseSocialChangelogRow(e){return{id:e.id,date:e.date,triggerCount:e.trigger_count,prSummaries:JSON.parse(e.pr_summaries_json),content:e.content,status:e.status,error:e.error,createdAt:e.created_at,completedAt:e.completed_at}}parseReleaseRunRow(e){return{id:e.id,repo:e.repo,baseBranch:e.base_branch,triggerPrNumber:e.trigger_pr_number,triggerPrTitle:e.trigger_pr_title,triggerPrUrl:e.trigger_pr_url,triggerMergeSha:e.trigger_merge_sha,triggerMergedAt:e.trigger_merged_at,status:e.status,decisionReason:e.decision_reason,recommendedBump:e.recommended_bump,proposedVersion:e.proposed_version,releaseTitle:e.release_title,releaseNotes:e.release_notes,includedPrs:JSON.parse(e.included_prs_json),targetSha:e.target_sha,githubReleaseId:e.github_release_id,githubReleaseUrl:e.github_release_url,error:e.error,createdAt:e.created_at,updatedAt:e.updated_at,completedAt:e.completed_at}}async getReleaseRun(e){let r=this.get(`
630
632
  SELECT id, repo, base_branch, trigger_pr_number, trigger_pr_title, trigger_pr_url,
631
633
  trigger_merge_sha, trigger_merged_at, status, decision_reason, recommended_bump,
632
634
  proposed_version, release_title, release_notes, included_prs_json, target_sha,
633
635
  github_release_id, github_release_url, error, created_at, updated_at, completed_at
634
636
  FROM release_runs
635
637
  WHERE id = ?
636
- `,e);return t?this.parseReleaseRunRow(t):void 0}async getReleaseRunByRepoAndMergeSha(e,t){let n=this.get(`
638
+ `,e);return r?this.parseReleaseRunRow(r):void 0}async getReleaseRunByRepoAndMergeSha(e,r){let n=this.get(`
637
639
  SELECT id, repo, base_branch, trigger_pr_number, trigger_pr_title, trigger_pr_url,
638
640
  trigger_merge_sha, trigger_merged_at, status, decision_reason, recommended_bump,
639
641
  proposed_version, release_title, release_notes, included_prs_json, target_sha,
@@ -642,7 +644,7 @@ var Mi=Object.defineProperty;var $i=(r,e)=>{for(var t in e)Mi(r,t,{get:e[t],enum
642
644
  WHERE repo = ? AND trigger_merge_sha = ?
643
645
  ORDER BY datetime(created_at) DESC, rowid DESC
644
646
  LIMIT 1
645
- `,e,t);return n?this.parseReleaseRunRow(n):void 0}async getReleaseRunByTrigger(e,t,n){let a=this.get(`
647
+ `,e,r);return n?this.parseReleaseRunRow(n):void 0}async getReleaseRunByTrigger(e,r,n){let a=this.get(`
646
648
  SELECT id, repo, base_branch, trigger_pr_number, trigger_pr_title, trigger_pr_url,
647
649
  trigger_merge_sha, trigger_merged_at, status, decision_reason, recommended_bump,
648
650
  proposed_version, release_title, release_notes, included_prs_json, target_sha,
@@ -651,7 +653,7 @@ var Mi=Object.defineProperty;var $i=(r,e)=>{for(var t in e)Mi(r,t,{get:e[t],enum
651
653
  WHERE repo = ? AND trigger_pr_number = ? AND trigger_merge_sha = ?
652
654
  ORDER BY datetime(created_at) DESC, rowid DESC
653
655
  LIMIT 1
654
- `,e,t,n);return a?this.parseReleaseRunRow(a):void 0}async listReleaseRuns(e){let t=[],n=[];e?.status&&(t.push("status = ?"),n.push(e.status)),e?.repo&&(t.push("repo = ?"),n.push(e.repo));let a=t.length>0?`WHERE ${t.join(" AND ")}`:"";return this.all(`
656
+ `,e,r,n);return a?this.parseReleaseRunRow(a):void 0}async listReleaseRuns(e){let r=[],n=[];e?.status&&(r.push("status = ?"),n.push(e.status)),e?.repo&&(r.push("repo = ?"),n.push(e.repo));let a=r.length>0?`WHERE ${r.join(" AND ")}`:"";return this.all(`
655
657
  SELECT id, repo, base_branch, trigger_pr_number, trigger_pr_title, trigger_pr_url,
656
658
  trigger_merge_sha, trigger_merged_at, status, decision_reason, recommended_bump,
657
659
  proposed_version, release_title, release_notes, included_prs_json, target_sha,
@@ -659,14 +661,14 @@ var Mi=Object.defineProperty;var $i=(r,e)=>{for(var t in e)Mi(r,t,{get:e[t],enum
659
661
  FROM release_runs
660
662
  ${a}
661
663
  ORDER BY datetime(created_at) DESC, rowid DESC
662
- `,...n).map(i=>this.parseReleaseRunRow(i))}async createReleaseRun(e){let t=xn(e);return this.run(`
664
+ `,...n).map(i=>this.parseReleaseRunRow(i))}async createReleaseRun(e){let r=Qn(e);return this.run(`
663
665
  INSERT INTO release_runs (
664
666
  id, repo, base_branch, trigger_pr_number, trigger_pr_title, trigger_pr_url,
665
667
  trigger_merge_sha, trigger_merged_at, status, decision_reason, recommended_bump,
666
668
  proposed_version, release_title, release_notes, included_prs_json, target_sha,
667
669
  github_release_id, github_release_url, error, created_at, updated_at, completed_at
668
670
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
669
- `,t.id,t.repo,t.baseBranch,t.triggerPrNumber,t.triggerPrTitle,t.triggerPrUrl,t.triggerMergeSha,t.triggerMergedAt,t.status,t.decisionReason,t.recommendedBump,t.proposedVersion,t.releaseTitle,t.releaseNotes,JSON.stringify(t.includedPrs),t.targetSha,t.githubReleaseId,t.githubReleaseUrl,t.error,t.createdAt,t.updatedAt,t.completedAt),t}async updateReleaseRun(e,t){let n=await this.getReleaseRun(e);if(!n)return;let a=An(n,t);return this.run(`
671
+ `,r.id,r.repo,r.baseBranch,r.triggerPrNumber,r.triggerPrTitle,r.triggerPrUrl,r.triggerMergeSha,r.triggerMergedAt,r.status,r.decisionReason,r.recommendedBump,r.proposedVersion,r.releaseTitle,r.releaseNotes,JSON.stringify(r.includedPrs),r.targetSha,r.githubReleaseId,r.githubReleaseUrl,r.error,r.createdAt,r.updatedAt,r.completedAt),r}async updateReleaseRun(e,r){let n=await this.getReleaseRun(e);if(!n)return;let a=Yn(n,r);return this.run(`
670
672
  UPDATE release_runs
671
673
  SET repo = ?, base_branch = ?, trigger_pr_number = ?, trigger_pr_title = ?, trigger_pr_url = ?,
672
674
  trigger_merge_sha = ?, trigger_merged_at = ?, status = ?, decision_reason = ?,
@@ -674,42 +676,42 @@ var Mi=Object.defineProperty;var $i=(r,e)=>{for(var t in e)Mi(r,t,{get:e[t],enum
674
676
  included_prs_json = ?, target_sha = ?, github_release_id = ?, github_release_url = ?,
675
677
  error = ?, created_at = ?, updated_at = ?, completed_at = ?
676
678
  WHERE id = ?
677
- `,a.repo,a.baseBranch,a.triggerPrNumber,a.triggerPrTitle,a.triggerPrUrl,a.triggerMergeSha,a.triggerMergedAt,a.status,a.decisionReason,a.recommendedBump,a.proposedVersion,a.releaseTitle,a.releaseNotes,JSON.stringify(a.includedPrs),a.targetSha,a.githubReleaseId,a.githubReleaseUrl,a.error,a.createdAt,a.updatedAt,a.completedAt,e),a}parseDeploymentHealingSessionRow(e){return{id:e.id,repo:e.repo,platform:e.platform,triggerPrNumber:e.trigger_pr_number,triggerPrTitle:e.trigger_pr_title,triggerPrUrl:e.trigger_pr_url,mergeSha:e.merge_sha,deploymentId:e.deployment_id,deploymentLog:e.deployment_log,fixBranch:e.fix_branch,fixPrNumber:e.fix_pr_number,fixPrUrl:e.fix_pr_url,state:e.state,error:e.error,createdAt:e.created_at,updatedAt:e.updated_at,completedAt:e.completed_at}}async getDeploymentHealingSession(e){let t=this.get(`
679
+ `,a.repo,a.baseBranch,a.triggerPrNumber,a.triggerPrTitle,a.triggerPrUrl,a.triggerMergeSha,a.triggerMergedAt,a.status,a.decisionReason,a.recommendedBump,a.proposedVersion,a.releaseTitle,a.releaseNotes,JSON.stringify(a.includedPrs),a.targetSha,a.githubReleaseId,a.githubReleaseUrl,a.error,a.createdAt,a.updatedAt,a.completedAt,e),a}parseDeploymentHealingSessionRow(e){return{id:e.id,repo:e.repo,platform:e.platform,triggerPrNumber:e.trigger_pr_number,triggerPrTitle:e.trigger_pr_title,triggerPrUrl:e.trigger_pr_url,mergeSha:e.merge_sha,deploymentId:e.deployment_id,deploymentLog:e.deployment_log,fixBranch:e.fix_branch,fixPrNumber:e.fix_pr_number,fixPrUrl:e.fix_pr_url,state:e.state,error:e.error,createdAt:e.created_at,updatedAt:e.updated_at,completedAt:e.completed_at}}async getDeploymentHealingSession(e){let r=this.get(`
678
680
  SELECT id, repo, platform, trigger_pr_number, trigger_pr_title, trigger_pr_url,
679
681
  merge_sha, deployment_id, deployment_log, fix_branch, fix_pr_number, fix_pr_url,
680
682
  state, error, created_at, updated_at, completed_at
681
683
  FROM deployment_healing_sessions
682
684
  WHERE id = ?
683
- `,e);return t?this.parseDeploymentHealingSessionRow(t):void 0}async getDeploymentHealingSessionByRepoAndMergeSha(e,t){let n=this.get(`
685
+ `,e);return r?this.parseDeploymentHealingSessionRow(r):void 0}async getDeploymentHealingSessionByRepoAndMergeSha(e,r){let n=this.get(`
684
686
  SELECT id, repo, platform, trigger_pr_number, trigger_pr_title, trigger_pr_url,
685
687
  merge_sha, deployment_id, deployment_log, fix_branch, fix_pr_number, fix_pr_url,
686
688
  state, error, created_at, updated_at, completed_at
687
689
  FROM deployment_healing_sessions
688
690
  WHERE repo = ? AND merge_sha = ?
689
- `,e,t);return n?this.parseDeploymentHealingSessionRow(n):void 0}async listDeploymentHealingSessions(e){let t=[],n=[];e?.repo&&(t.push("repo = ?"),n.push(e.repo)),e?.state&&(t.push("state = ?"),n.push(e.state));let a=t.length>0?`WHERE ${t.join(" AND ")}`:"";return this.all(`
691
+ `,e,r);return n?this.parseDeploymentHealingSessionRow(n):void 0}async listDeploymentHealingSessions(e){let r=[],n=[];e?.repo&&(r.push("repo = ?"),n.push(e.repo)),e?.state&&(r.push("state = ?"),n.push(e.state));let a=r.length>0?`WHERE ${r.join(" AND ")}`:"";return this.all(`
690
692
  SELECT id, repo, platform, trigger_pr_number, trigger_pr_title, trigger_pr_url,
691
693
  merge_sha, deployment_id, deployment_log, fix_branch, fix_pr_number, fix_pr_url,
692
694
  state, error, created_at, updated_at, completed_at
693
695
  FROM deployment_healing_sessions
694
696
  ${a}
695
697
  ORDER BY datetime(updated_at) DESC
696
- `,...n).map(i=>this.parseDeploymentHealingSessionRow(i))}async createDeploymentHealingSession(e){let t=Hn(e);return this.run(`
698
+ `,...n).map(i=>this.parseDeploymentHealingSessionRow(i))}async createDeploymentHealingSession(e){let r=aa(e);return this.run(`
697
699
  INSERT INTO deployment_healing_sessions (
698
700
  id, repo, platform, trigger_pr_number, trigger_pr_title, trigger_pr_url,
699
701
  merge_sha, deployment_id, deployment_log, fix_branch, fix_pr_number, fix_pr_url,
700
702
  state, error, created_at, updated_at, completed_at
701
703
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
702
- `,t.id,t.repo,t.platform,t.triggerPrNumber,t.triggerPrTitle,t.triggerPrUrl,t.mergeSha,t.deploymentId,t.deploymentLog,t.fixBranch,t.fixPrNumber,t.fixPrUrl,t.state,t.error,t.createdAt,t.updatedAt,t.completedAt),t}async updateDeploymentHealingSession(e,t){let n=await this.getDeploymentHealingSession(e);if(!n)return;let a=Ln(n,t);return this.run(`
704
+ `,r.id,r.repo,r.platform,r.triggerPrNumber,r.triggerPrTitle,r.triggerPrUrl,r.mergeSha,r.deploymentId,r.deploymentLog,r.fixBranch,r.fixPrNumber,r.fixPrUrl,r.state,r.error,r.createdAt,r.updatedAt,r.completedAt),r}async updateDeploymentHealingSession(e,r){let n=await this.getDeploymentHealingSession(e);if(!n)return;let a=sa(n,r);return this.run(`
703
705
  UPDATE deployment_healing_sessions
704
706
  SET repo = ?, platform = ?, trigger_pr_number = ?, trigger_pr_title = ?, trigger_pr_url = ?,
705
707
  merge_sha = ?, deployment_id = ?, deployment_log = ?, fix_branch = ?, fix_pr_number = ?,
706
708
  fix_pr_url = ?, state = ?, error = ?, created_at = ?, updated_at = ?, completed_at = ?
707
709
  WHERE id = ?
708
- `,a.repo,a.platform,a.triggerPrNumber,a.triggerPrTitle,a.triggerPrUrl,a.mergeSha,a.deploymentId,a.deploymentLog,a.fixBranch,a.fixPrNumber,a.fixPrUrl,a.state,a.error,a.createdAt,a.updatedAt,a.completedAt,e),a}close(){this.db.close()}getRootDir(){return this.rootDir}};var Mn;function ls(){return Mn||(Mn=new wr),Mn}import{randomUUID as ru}from"crypto";import{mkdtemp as jd,readFile as Jd,rm as Xd}from"fs/promises";import{tmpdir as Gd}from"os";import us from"path";import{spawn as qd}from"child_process";var Wd=["codex","claude"];async function cs(r){return(await z("which",[r],{timeoutMs:4e3})).code===0}async function Ze(r){if(Wd.includes(r)||(r="codex"),await cs(r))return r;let e=r==="codex"?"claude":"codex";if(await cs(e))return e;throw new Error("Neither codex nor claude CLI is installed")}async function ps(r){let{agent:e,cwd:t,prompt:n}=r,a=["Respond with ONLY valid JSON and nothing else.",'Schema: {"needsFix": boolean, "reason": string}',n].join(`
710
+ `,a.repo,a.platform,a.triggerPrNumber,a.triggerPrTitle,a.triggerPrUrl,a.mergeSha,a.deploymentId,a.deploymentLog,a.fixBranch,a.fixPrNumber,a.fixPrUrl,a.state,a.error,a.createdAt,a.updatedAt,a.completedAt,e),a}close(){this.db.close()}getRootDir(){return this.rootDir}};var oa;function As(){return oa||(oa=new Jr),oa}import{randomUUID as Su}from"crypto";import{mkdtemp as ld,readFile as dd,rm as ud}from"fs/promises";import{tmpdir as cd}from"os";import Cs from"path";import{spawn as gd}from"child_process";var md=["codex","claude"];async function Is(t){return(await Z("which",[t],{timeoutMs:4e3})).code===0}async function pt(t){if(md.includes(t)||(t="codex"),await Is(t))return t;let e=t==="codex"?"claude":"codex";if(await Is(e))return e;throw new Error("Neither codex nor claude CLI is installed")}async function Fs(t){let{agent:e,cwd:r,prompt:n}=t,a=["Respond with ONLY valid JSON and nothing else.",'Schema: {"needsFix": boolean, "reason": string}',n].join(`
709
711
 
710
- `);if(e==="codex"){let o=await jd(us.join(Gd(),"codex-eval-")),c=us.join(o,"output.txt");try{let p=await z("codex",["exec","--skip-git-repo-check","--sandbox","read-only","-o",c,a],{cwd:t,timeoutMs:18e4});if(p.code!==0)throw new Error(`codex evaluation failed (${p.code}): ${p.stderr||p.stdout}`);let m;try{m=await Jd(c,"utf8")}catch(u){if(zd(u)){let g=p.stderr?`: ${p.stderr}`:"";throw new Error(`codex evaluation completed without writing expected output file ${c}${g}`,{cause:u})}throw u}return gs(m)}finally{await Xd(o,{recursive:!0,force:!0})}}let i=await z("claude",["-p","--output-format","text",a],{cwd:t,timeoutMs:18e4});if(i.code!==0)throw new Error(`claude evaluation failed (${i.code}): ${i.stderr||i.stdout}`);return gs(i.stdout)}async function Ht(r){let{agent:e,cwd:t,prompt:n,env:a,onStdoutChunk:s,onStderrChunk:i}=r;return e==="codex"?await z("codex",["exec","--skip-git-repo-check","--full-auto","--sandbox","workspace-write",n],{cwd:t,env:a,timeoutMs:9e5,onStdoutChunk:s,onStderrChunk:i}):z("claude",["-p","--dangerously-skip-permissions",n],{cwd:t,env:a,timeoutMs:9e5,onStdoutChunk:s,onStderrChunk:i})}function gs(r){let e=r.trim();if(!e)throw new Error("Agent returned empty output for evaluation");let t=Kd(e);if(!t||typeof t!="object")throw new Error(`Could not parse evaluation JSON from output: ${e.slice(0,500)}`);let n=t;if(typeof n.needsFix!="boolean")throw new Error("Evaluation output missing boolean 'needsFix'");return{needsFix:n.needsFix,reason:typeof n.reason=="string"?n.reason:"No reason provided"}}function Kd(r){try{return JSON.parse(r)}catch{}let e=r.indexOf("{"),t=r.lastIndexOf("}");if(e===-1||t===-1||t<=e)return null;let n=r.slice(e,t+1);try{return JSON.parse(n)}catch{return null}}function zd(r){return r instanceof Error&&"code"in r&&r.code==="ENOENT"}async function z(r,e,t){let n=t?.timeoutMs??12e4;return new Promise(a=>{let s=qd(r,e,{cwd:t?.cwd,env:t?.env,stdio:["ignore","pipe","pipe"]}),i="",o="",c=!1,p=setTimeout(()=>{c=!0,s.kill("SIGTERM")},n);s.stdout.on("data",m=>{let u=m.toString("utf8");i+=u,t?.onStdoutChunk?.(u)}),s.stderr.on("data",m=>{let u=m.toString("utf8");o+=u,t?.onStderrChunk?.(u)}),s.on("close",(m,u)=>{clearTimeout(p);let g=[o.trim()];c?g.push(`Command timed out after ${n}ms`):u&&g.push(`Command terminated by signal ${u}`),a({stdout:i,stderr:g.filter(Boolean).join(`
711
- `),code:c?124:m??1,signal:u,timedOut:c})}),s.on("error",m=>{clearTimeout(p),a({stdout:i,stderr:`${o}
712
- ${m.message}`.trim(),code:1})})})}import{Octokit as Yd}from"@octokit/rest";function ms(...r){for(let e of r)if(e&&e.trim())return e;return new Date().toISOString()}function hs(r,e){return r?.trim()||e}function Vd(r){let{prId:e,sha:t,status:n}=r;return Ft({prId:e,sha:t,provider:"github.commit_status",context:n.context?.trim()||"status-check",status:n.state?.trim()||"unknown",conclusion:null,description:hs(n.description,"Commit status"),targetUrl:n.target_url?.trim()||null,observedAt:ms(n.updated_at)})}function Qd(r){let{prId:e,sha:t,run:n}=r,a=n.conclusion?.trim()||null,s=n.status?.trim()||"unknown";return Ft({prId:e,sha:t,provider:"github.check_run",context:n.name?.trim()||"check-run",status:s,conclusion:a,description:hs(n.output?.summary??n.output?.title,a?`Check run ${a}`:"Check run"),targetUrl:n.html_url?.trim()||null,observedAt:ms(n.updated_at,n.completed_at,n.started_at)})}function fs(r){let{prId:e,sha:t,statuses:n,checkRuns:a}=r;return[...n.map(s=>Vd({prId:e,sha:t,status:s})),...a.map(s=>Qd({prId:e,sha:t,run:s}))]}function $n(r){return r.provider==="github.commit_status"?r.status==="failure"||r.status==="error":r.provider==="github.check_run"?r.status==="completed"&&(r.conclusion==="failure"||r.conclusion==="timed_out"||r.conclusion==="cancelled"):!1}import{marked as ys}from"marked";import Sr from"sanitize-html";ys.setOptions({gfm:!0,breaks:!0});function kr(r){if(!r.trim())return"";let e=ys.parse(r,{async:!1});return Sr(e,{allowedTags:Sr.defaults.allowedTags.concat(["img","h1","h2","h3","h4","h5","h6","pre","code"]),allowedAttributes:{...Sr.defaults.allowedAttributes,a:["href","name","target","rel"],code:["class"],img:["src","alt","title"]},allowedSchemes:["http","https","mailto"],transformTags:{a:Sr.simpleTransform("a",{target:"_blank",rel:"noopener noreferrer"})}})}var Zd=/^v?(\d+)\.(\d+)\.(\d+)$/,el="2022-11-28",bs=15e3,tl=`
712
+ `);if(e==="codex"){let o=await ld(Cs.join(cd(),"codex-eval-")),c=Cs.join(o,"output.txt");try{let u=await Z("codex",["exec","--skip-git-repo-check","--sandbox","read-only","-o",c,a],{cwd:r,timeoutMs:18e4});if(u.code!==0)throw new Error(`codex evaluation failed (${u.code}): ${u.stderr||u.stdout}`);let m;try{m=await dd(c,"utf8")}catch(g){if(hd(g)){let p=u.stderr?`: ${u.stderr}`:"";throw new Error(`codex evaluation completed without writing expected output file ${c}${p}`,{cause:g})}throw g}return Ns(m)}finally{await ud(o,{recursive:!0,force:!0})}}let i=await Z("claude",["-p","--output-format","text",a],{cwd:r,timeoutMs:18e4});if(i.code!==0)throw new Error(`claude evaluation failed (${i.code}): ${i.stderr||i.stdout}`);return Ns(i.stdout)}async function tr(t){let{agent:e,cwd:r,prompt:n,env:a,onStdoutChunk:s,onStderrChunk:i}=t;return e==="codex"?await Z("codex",["exec","--skip-git-repo-check","--full-auto","--sandbox","workspace-write",n],{cwd:r,env:a,timeoutMs:9e5,onStdoutChunk:s,onStderrChunk:i}):Z("claude",["-p","--dangerously-skip-permissions",n],{cwd:r,env:a,timeoutMs:9e5,onStdoutChunk:s,onStderrChunk:i})}function Ns(t){let e=t.trim();if(!e)throw new Error("Agent returned empty output for evaluation");let r=pd(e);if(!r||typeof r!="object")throw new Error(`Could not parse evaluation JSON from output: ${e.slice(0,500)}`);let n=r;if(typeof n.needsFix!="boolean")throw new Error("Evaluation output missing boolean 'needsFix'");return{needsFix:n.needsFix,reason:typeof n.reason=="string"?n.reason:"No reason provided"}}function pd(t){try{return JSON.parse(t)}catch{}let e=t.indexOf("{"),r=t.lastIndexOf("}");if(e===-1||r===-1||r<=e)return null;let n=t.slice(e,r+1);try{return JSON.parse(n)}catch{return null}}function hd(t){return t instanceof Error&&"code"in t&&t.code==="ENOENT"}async function Z(t,e,r){let n=r?.timeoutMs??12e4;return new Promise(a=>{let s=gd(t,e,{cwd:r?.cwd,env:r?.env,stdio:["ignore","pipe","pipe"]}),i="",o="",c=!1,u=setTimeout(()=>{c=!0,s.kill("SIGTERM")},n);s.stdout.on("data",m=>{let g=m.toString("utf8");i+=g,r?.onStdoutChunk?.(g)}),s.stderr.on("data",m=>{let g=m.toString("utf8");o+=g,r?.onStderrChunk?.(g)}),s.on("close",(m,g)=>{clearTimeout(u);let p=[o.trim()];c?p.push(`Command timed out after ${n}ms`):g&&p.push(`Command terminated by signal ${g}`),a({stdout:i,stderr:p.filter(Boolean).join(`
713
+ `),code:c?124:m??1,signal:g,timedOut:c})}),s.on("error",m=>{clearTimeout(u),a({stdout:i,stderr:`${o}
714
+ ${m.message}`.trim(),code:1})})})}import{Octokit as yd}from"@octokit/rest";function Ds(...t){for(let e of t)if(e&&e.trim())return e;return new Date().toISOString()}function Hs(t,e){return t?.trim()||e}function fd(t){let{prId:e,sha:r,status:n}=t;return er({prId:e,sha:r,provider:"github.commit_status",context:n.context?.trim()||"status-check",status:n.state?.trim()||"unknown",conclusion:null,description:Hs(n.description,"Commit status"),targetUrl:n.target_url?.trim()||null,observedAt:Ds(n.updated_at)})}function bd(t){let{prId:e,sha:r,run:n}=t,a=n.conclusion?.trim()||null,s=n.status?.trim()||"unknown";return er({prId:e,sha:r,provider:"github.check_run",context:n.name?.trim()||"check-run",status:s,conclusion:a,description:Hs(n.output?.summary??n.output?.title,a?`Check run ${a}`:"Check run"),targetUrl:n.html_url?.trim()||null,observedAt:Ds(n.updated_at,n.completed_at,n.started_at)})}function Ls(t){let{prId:e,sha:r,statuses:n,checkRuns:a}=t;return[...n.map(s=>fd({prId:e,sha:r,status:s})),...a.map(s=>bd({prId:e,sha:r,run:s}))]}function la(t){return t.provider==="github.commit_status"?t.status==="failure"||t.status==="error":t.provider==="github.check_run"?t.status==="completed"&&(t.conclusion==="failure"||t.conclusion==="timed_out"||t.conclusion==="cancelled"):!1}import{marked as Os}from"marked";import Gr from"sanitize-html";Os.setOptions({gfm:!0,breaks:!0});function Xr(t){if(!t.trim())return"";let e=Os.parse(t,{async:!1});return Gr(e,{allowedTags:Gr.defaults.allowedTags.concat(["img","h1","h2","h3","h4","h5","h6","pre","code"]),allowedAttributes:{...Gr.defaults.allowedAttributes,a:["href","name","target","rel"],code:["class"],img:["src","alt","title"]},allowedSchemes:["http","https","mailto"],transformTags:{a:Gr.simpleTransform("a",{target:"_blank",rel:"noopener noreferrer"})}})}var _d=/^v?(\d+)\.(\d+)\.(\d+)$/,wd="2022-11-28",Ms=15e3,Rd=`
713
715
  query CodeFactoryReviewThreads($owner: String!, $repo: String!, $number: Int!, $cursor: String) {
714
716
  repository(owner: $owner, name: $repo) {
715
717
  pullRequest(number: $number) {
@@ -735,7 +737,7 @@ ${m.message}`.trim(),code:1})})})}import{Octokit as Yd}from"@octokit/rest";funct
735
737
  }
736
738
  }
737
739
  }
738
- `,rl=`
740
+ `,Sd=`
739
741
  query CodeFactoryReviewThreadComments($threadId: ID!, $cursor: String) {
740
742
  node(id: $threadId) {
741
743
  ... on PullRequestReviewThread {
@@ -753,7 +755,7 @@ ${m.message}`.trim(),code:1})})})}import{Octokit as Yd}from"@octokit/rest";funct
753
755
  }
754
756
  }
755
757
  }
756
- `,Rs=`
758
+ `,Us=`
757
759
  mutation CodeFactoryReplyToReviewThread($threadId: ID!, $body: String!) {
758
760
  addPullRequestReviewThreadReply(input: { pullRequestReviewThreadId: $threadId, body: $body }) {
759
761
  comment {
@@ -762,7 +764,7 @@ ${m.message}`.trim(),code:1})})})}import{Octokit as Yd}from"@octokit/rest";funct
762
764
  }
763
765
  }
764
766
  }
765
- `,nl=`
767
+ `,kd=`
766
768
  mutation CodeFactoryResolveReviewThread($threadId: ID!) {
767
769
  resolveReviewThread(input: { threadId: $threadId }) {
768
770
  thread {
@@ -771,8 +773,8 @@ ${m.message}`.trim(),code:1})})})}import{Octokit as Yd}from"@octokit/rest";funct
771
773
  }
772
774
  }
773
775
  }
774
- `,al=l.object({addPullRequestReviewThreadReply:l.object({comment:l.object({databaseId:l.number().nullable().optional()}).nullable().optional()}).nullable().optional()}),Zt=null,Un=0,ee=class extends Error{statusCode;constructor(e,t=502){super(e),this.name="GitHubIntegrationError",this.statusCode=t}};function vr(r){let e=r.trim().match(/https?:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/(\d+)(?:[/?#].*)?$/i);return e?{owner:e[1],repo:e[2],number:Number.parseInt(e[3],10)}:null}function ke(r){let e=r.trim(),t=e.match(/https?:\/\/github\.com\/([^/]+)\/([^/]+)(?:[/?#].*)?$/i);if(t)return{owner:t[1],repo:t[2]};let n=e.match(/^([^/]+)\/([^/]+)$/);return n?{owner:n[1],repo:n[2]}:null}function Rt(r){return`${r.owner}/${r.repo}`}function Tr(r,e){let t=e?.trim();return t?`https://x-access-token:${t}@github.com/${r}.git`:`https://github.com/${r}.git`}function Bn(r){return`codefactory-feedback:${r}`}async function ws(r,e,t,n){if(!n)return[];let[a,s]=await Promise.all([q("commit statuses",e,()=>r.repos.getCombinedStatusForRef({owner:e.owner,repo:e.repo,ref:n})),q("check runs",e,()=>r.checks.listForRef({owner:e.owner,repo:e.repo,ref:n}))]);return fs({prId:t,sha:n,statuses:a.data.statuses??[],checkRuns:s.data.check_runs??[]})}async function Lt(r){let e=process.env.GITHUB_TOKEN?.trim();if(e)return e;let t=r.githubToken?.trim();if(t)return t;let n=Date.now();if(Zt&&Zt.expiresAt>n)return Zt.token;if(Un>n)return;let a=await z("gh",["auth","token"],{timeoutMs:4e3}),s=a.stdout.trim();if(a.code===0&&s)return Zt={token:s,expiresAt:n+bs},Un=0,s;Zt=null,Un=n+bs}function Ss(r){return"number"in r?`${r.owner}/${r.repo}#${r.number}`:`${r.owner}/${r.repo}`}function ks(r,e,t){if(r instanceof ee)return r;let n=Ss(t),a=typeof r?.status=="number"?r.status:502,s="Run `gh auth login` on this machine or set `GITHUB_TOKEN` if the repository is private.";if(a===401)return new ee(`GitHub authentication failed while loading ${e} for ${n}. ${s}`,a);if(a===403){let c=r?.response?.headers?.["x-ratelimit-remaining"],p=r instanceof Error?r.message.toLowerCase():"";return c==="0"||p.includes("rate limit")?new ee(`GitHub rate limit reached while loading ${e} for ${n}. Authenticate with \`gh auth login\` or set \`GITHUB_TOKEN\` to raise the limit.`,a):new ee(`GitHub denied access while loading ${e} for ${n}. ${s}`,a)}if(a===404)return new ee(`GitHub could not access ${n} while loading ${e}. Confirm the repository and PR exist. ${s}`,a);let i=r instanceof Error?r.message:String(r);return new ee(`GitHub request failed while loading ${e} for ${n}: ${i}`,a)}async function q(r,e,t){try{return await t()}catch(n){throw ks(n,r,e)}}async function Ce(r){let e=await Lt(r);return new Yd({auth:e,request:{headers:{"X-GitHub-Api-Version":el}}})}async function vs(r,e,t={}){let n=t.buildOctokitFn??Ce,a=t.resolveGitHubAuthTokenFn??Lt,s,i=!1,o,c;try{if(s=await n(r),!await a(r))o="No GitHub token found. Run `gh auth login` or set GITHUB_TOKEN, or enter a Personal Access Token in settings.";else{let{data:u}=await s.rest.users.getAuthenticated();i=!0,c=u.login}}catch(m){return o=m instanceof Error?m.message:String(m),{githubConnected:!1,githubError:o,repos:[]}}let p=await Promise.all(e.map(async m=>{let u=ke(m);if(!u)return{repo:m,accessible:!1,error:"Invalid repo slug",codeReviews:{claude:!1,codex:!1,gemini:!1}};try{let{data:g}=await s.rest.repos.getContent({owner:u.owner,repo:u.repo,path:".github/workflows"}),P=Array.isArray(g)?g:[],A=P.map(N=>"name"in N?N.name.toLowerCase():""),k=(await Promise.all(P.filter(N=>"name"in N&&"path"in N&&N.path&&(N.name.endsWith(".yml")||N.name.endsWith(".yaml"))).map(async N=>{try{let{data:H}=await s.rest.repos.getContent({owner:u.owner,repo:u.repo,path:N.path});if(!Array.isArray(H)&&"content"in H&&H.content)return Buffer.from(H.content,"base64").toString("utf-8")}catch{return""}return""}))).join(`
775
- `).toLowerCase(),X=A.some(N=>N.includes("claude"))||k.includes("claude-code-action")||k.includes("anthropics/claude"),M=A.some(N=>N.includes("codex"))||k.includes("openai/codex-action")||k.includes("codex-action"),E=A.some(N=>N.includes("gemini"))||k.includes("gemini-code-assist")||k.includes("run-gemini-cli")||k.includes("google-github-actions/run-gemini");return{repo:m,accessible:!0,codeReviews:{claude:X,codex:M,gemini:E}}}catch(g){let P=typeof g?.status=="number"?g.status:0,A=g instanceof Error?g.message:String(g);return P===404?{repo:m,accessible:!0,codeReviews:{claude:!1,codex:!1,gemini:!1}}:{repo:m,accessible:!1,error:A,codeReviews:{claude:!1,codex:!1,gemini:!1}}}}));return{githubConnected:i,githubUser:c,repos:p}}var sl={claude:{filename:"claude-code-review.yml",content:`name: Claude Code Review
776
+ `,vd=d.object({addPullRequestReviewThreadReply:d.object({comment:d.object({databaseId:d.number().nullable().optional()}).nullable().optional()}).nullable().optional()}),_r=null,da=0,se=class extends Error{statusCode;constructor(e,r=502){super(e),this.name="GitHubIntegrationError",this.statusCode=r}};function qr(t){let e=t.trim().match(/https?:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/(\d+)(?:[/?#].*)?$/i);return e?{owner:e[1],repo:e[2],number:Number.parseInt(e[3],10)}:null}function Ne(t){let e=t.trim(),r=e.match(/https?:\/\/github\.com\/([^/]+)\/([^/]+)(?:[/?#].*)?$/i);if(r)return{owner:r[1],repo:r[2]};let n=e.match(/^([^/]+)\/([^/]+)$/);return n?{owner:n[1],repo:n[2]}:null}function Ot(t){return`${t.owner}/${t.repo}`}function Wr(t,e){let r=e?.trim();return r?`https://x-access-token:${r}@github.com/${t}.git`:`https://github.com/${t}.git`}function ua(t){return`codefactory-feedback:${t}`}async function Bs(t,e,r,n){if(!n)return[];let[a,s]=await Promise.all([W("commit statuses",e,()=>t.repos.getCombinedStatusForRef({owner:e.owner,repo:e.repo,ref:n})),W("check runs",e,()=>t.checks.listForRef({owner:e.owner,repo:e.repo,ref:n}))]);return Ls({prId:r,sha:n,statuses:a.data.statuses??[],checkRuns:s.data.check_runs??[]})}async function rr(t){let e=process.env.GITHUB_TOKEN?.trim();if(e)return e;let r=t.githubToken?.trim();if(r)return r;let n=Date.now();if(_r&&_r.expiresAt>n)return _r.token;if(da>n)return;let a=await Z("gh",["auth","token"],{timeoutMs:4e3}),s=a.stdout.trim();if(a.code===0&&s)return _r={token:s,expiresAt:n+Ms},da=0,s;_r=null,da=n+Ms}function js(t){return"number"in t?`${t.owner}/${t.repo}#${t.number}`:`${t.owner}/${t.repo}`}function Js(t,e,r){if(t instanceof se)return t;let n=js(r),a=typeof t?.status=="number"?t.status:502,s="Run `gh auth login` on this machine or set `GITHUB_TOKEN` if the repository is private.";if(a===401)return new se(`GitHub authentication failed while loading ${e} for ${n}. ${s}`,a);if(a===403){let c=t?.response?.headers?.["x-ratelimit-remaining"],u=t instanceof Error?t.message.toLowerCase():"";return c==="0"||u.includes("rate limit")?new se(`GitHub rate limit reached while loading ${e} for ${n}. Authenticate with \`gh auth login\` or set \`GITHUB_TOKEN\` to raise the limit.`,a):new se(`GitHub denied access while loading ${e} for ${n}. ${s}`,a)}if(a===404)return new se(`GitHub could not access ${n} while loading ${e}. Confirm the repository and PR exist. ${s}`,a);let i=t instanceof Error?t.message:String(t);return new se(`GitHub request failed while loading ${e} for ${n}: ${i}`,a)}async function W(t,e,r){try{return await r()}catch(n){throw Js(n,t,e)}}async function je(t){let e=await rr(t);return new yd({auth:e,request:{headers:{"X-GitHub-Api-Version":wd}}})}async function Gs(t,e,r={}){let n=r.buildOctokitFn??je,a=r.resolveGitHubAuthTokenFn??rr,s,i=!1,o,c;try{if(s=await n(t),!await a(t))o="No GitHub token found. Run `gh auth login` or set GITHUB_TOKEN, or enter a Personal Access Token in settings.";else{let{data:g}=await s.rest.users.getAuthenticated();i=!0,c=g.login}}catch(m){return o=m instanceof Error?m.message:String(m),{githubConnected:!1,githubError:o,repos:[]}}let u=await Promise.all(e.map(async m=>{let g=Ne(m);if(!g)return{repo:m,accessible:!1,error:"Invalid repo slug",codeReviews:{claude:!1,codex:!1,gemini:!1}};try{let{data:p}=await s.rest.repos.getContent({owner:g.owner,repo:g.repo,path:".github/workflows"}),h=Array.isArray(p)?p:[],I=h.map(F=>"name"in F?F.name.toLowerCase():""),k=(await Promise.all(h.filter(F=>"name"in F&&"path"in F&&F.path&&(F.name.endsWith(".yml")||F.name.endsWith(".yaml"))).map(async F=>{try{let{data:D}=await s.rest.repos.getContent({owner:g.owner,repo:g.repo,path:F.path});if(!Array.isArray(D)&&"content"in D&&D.content)return Buffer.from(D.content,"base64").toString("utf-8")}catch{return""}return""}))).join(`
777
+ `).toLowerCase(),V=I.some(F=>F.includes("claude"))||k.includes("claude-code-action")||k.includes("anthropics/claude"),B=I.some(F=>F.includes("codex"))||k.includes("openai/codex-action")||k.includes("codex-action"),A=I.some(F=>F.includes("gemini"))||k.includes("gemini-code-assist")||k.includes("run-gemini-cli")||k.includes("google-github-actions/run-gemini");return{repo:m,accessible:!0,codeReviews:{claude:V,codex:B,gemini:A}}}catch(p){let h=typeof p?.status=="number"?p.status:0,I=p instanceof Error?p.message:String(p);return h===404?{repo:m,accessible:!0,codeReviews:{claude:!1,codex:!1,gemini:!1}}:{repo:m,accessible:!1,error:I,codeReviews:{claude:!1,codex:!1,gemini:!1}}}}));return{githubConnected:i,githubUser:c,repos:u}}var Td={claude:{filename:"claude-code-review.yml",content:`name: Claude Code Review
776
778
 
777
779
  on:
778
780
  pull_request:
@@ -822,37 +824,37 @@ jobs:
822
824
  - Performance concerns
823
825
  - Code style and readability
824
826
  Post your review as GitHub PR review comments.
825
- `}};async function Ts(r,e,t){let n=ke(e);if(!n)throw new ee(`Invalid repository: ${e}`,400);let a=await Ce(r),s=sl[t],i=`.github/workflows/${s.filename}`,o=Buffer.from(s.content).toString("base64"),c;try{let{data:u}=await a.rest.repos.getContent({owner:n.owner,repo:n.repo,path:i});!Array.isArray(u)&&"sha"in u&&(c=u.sha)}catch(u){if((typeof u?.status=="number"?u.status:0)!==404)throw ks(u,"workflow file check",n)}let p=c?`ci: update ${t} code review workflow`:`ci: add ${t} code review workflow`,m=await q("workflow file creation",n,()=>a.rest.repos.createOrUpdateFileContents({owner:n.owner,repo:n.repo,path:i,message:p,content:o,...c?{sha:c}:{}}));return{path:i,url:m.data.content?.html_url??`https://github.com/${e}/blob/HEAD/${i}`}}async function Pr(r,e){let n=(await q("PR metadata",e,()=>r.pulls.get({owner:e.owner,repo:e.repo,pull_number:e.number}))).data,a=n.base?.ref||n.base?.repo?.default_branch||"";return{number:n.number,title:n.title||`PR #${n.number}`,branch:n.head?.ref||"unknown",author:n.user?.login||"",url:n.html_url||`https://github.com/${e.owner}/${e.repo}/pull/${n.number}`,repoFullName:n.base?.repo?.full_name||`${e.owner}/${e.repo}`,repoCloneUrl:n.base?.repo?.clone_url||`https://github.com/${e.owner}/${e.repo}.git`,headSha:n.head?.sha||"",headRef:n.head?.ref||"",headRepoFullName:n.head?.repo?.full_name||`${e.owner}/${e.repo}`,headRepoCloneUrl:n.head?.repo?.clone_url||`https://github.com/${e.owner}/${e.repo}.git`,baseRef:a,mergeable:typeof n.mergeable=="boolean"?n.mergeable:null}}async function Ps(r,e){let n=(await q("PR close state",e,()=>r.pulls.get({owner:e.owner,repo:e.repo,pull_number:e.number}))).data,a=n.base?.ref||n.base?.repo?.default_branch||"";return{number:n.number,title:n.title||`PR #${n.number}`,url:n.html_url||`https://github.com/${e.owner}/${e.repo}/pull/${n.number}`,author:n.user?.login||"unknown",baseRef:a,headRef:n.head?.ref||"",headSha:n.head?.sha||"",merged:!!n.merged_at,mergedAt:n.merged_at||null,closedAt:n.closed_at||null,mergeCommitSha:n.merge_commit_sha||null}}function Es(r){let e=r.trim().match(Zd);return e?{major:Number.parseInt(e[1],10),minor:Number.parseInt(e[2],10),patch:Number.parseInt(e[3],10)}:null}function il(r,e){return r.major!==e.major?r.major-e.major:r.minor!==e.minor?r.minor-e.minor:r.patch-e.patch}function ol(r){return`v${r.major}.${r.minor}.${r.patch}`}function dl(r){let e=null;for(let t of r){let n=Es(t);n&&(!e||il(n,e.version)>0)&&(e={tag:t,version:n})}return e?.tag??null}function xs(r,e){let t=r?Es(r):{major:0,minor:0,patch:0};if(!t)throw new ee(`Cannot calculate next semver tag from invalid tag: ${r}`,400);let n={major:t.major,minor:t.minor,patch:t.patch};return e==="major"?(n.major+=1,n.minor=0,n.patch=0):e==="minor"?(n.minor+=1,n.patch=0):n.patch+=1,ol(n)}function ll(r){if(!r)return null;let e=Date.parse(r);return Number.isFinite(e)?e:null}async function ul(r,e){let n=(await q("repository metadata",e,()=>r.repos.get({owner:e.owner,repo:e.repo}))).data.default_branch?.trim();if(!n)throw new ee(`GitHub did not return a default branch for ${Rt(e)}`,502);return n}async function Er(r,e){return(await q("repository releases",e,()=>r.paginate(r.repos.listReleases,{owner:e.owner,repo:e.repo,per_page:100}))).map(n=>({id:n.id,tagName:n.tag_name||"",name:n.name||n.tag_name||`Release ${n.id}`,body:n.body||null,htmlUrl:n.html_url||"",apiUrl:n.url||"",draft:!!n.draft,prerelease:!!n.prerelease,targetCommitish:n.target_commitish||null,publishedAt:n.published_at||null}))}async function cl(r,e){return(await q("repository tags",e,()=>r.paginate(r.repos.listTags,{owner:e.owner,repo:e.repo,per_page:100}))).map(n=>({name:n.name,commitSha:n.commit?.sha||null}))}async function As(r,e){let[t,n]=await Promise.all([Er(r,e),cl(r,e)]),a=[...t.filter(s=>!s.draft).map(s=>s.tagName),...n.map(s=>s.name)];return dl(a)}async function Cs(r,e,t){let a=(await q("release creation",e,()=>r.repos.createRelease({owner:e.owner,repo:e.repo,tag_name:t.tagName,name:t.name,body:t.body,target_commitish:t.targetCommitish??void 0,draft:t.draft??!1,prerelease:t.prerelease??!1,generate_release_notes:t.generateReleaseNotes??!1}))).data;return{id:a.id,tagName:a.tag_name||t.tagName,name:a.name||t.name,body:a.body||null,htmlUrl:a.html_url||"",apiUrl:a.url||"",draft:!!a.draft,prerelease:!!a.prerelease,targetCommitish:a.target_commitish||null,publishedAt:a.published_at||null}}function jn(r,e){if(!r)return!0;let t=r.toLowerCase();return!!e.has(t)}function Is(r,e,t,n){for(let a of n?.nodes||[])typeof a?.databaseId=="number"&&r.set(a.databaseId,{threadId:e,threadResolved:t})}async function gl(r,e,t,n){if(!n.id)return;let a=n.comments?.pageInfo?.hasNextPage&&n.comments.pageInfo.endCursor?n.comments.pageInfo.endCursor:null,s=!!n.isResolved;for(;a;){let o=(await q("review thread comments",e,()=>r.graphql(rl,{threadId:n.id,cursor:a}))).node;if(!o?.id)break;typeof o.isResolved=="boolean"&&(s=o.isResolved),Is(t,o.id,s,o.comments);let c=o.comments?.pageInfo;a=c?.hasNextPage&&c.endCursor?c.endCursor:null}}async function pl(r,e){let t=new Map,n=null;for(;;){let s=(await q("review threads",e,()=>r.graphql(tl,{owner:e.owner,repo:e.repo,number:e.number,cursor:n}))).repository?.pullRequest?.reviewThreads;for(let o of s?.nodes||[])o?.id&&(Is(t,o.id,!!o.isResolved,o.comments),await gl(r,e,t,o));let i=s?.pageInfo;if(!i?.hasNextPage||!i.endCursor)break;n=i.endCursor}return t}async function ml(r,e,t,n){await q("review thread reply",e,()=>r.graphql(Rs,{threadId:t,body:n}))}async function er(r,e,t){await q("review thread resolution",e,()=>r.graphql(nl,{threadId:t}))}async function hl(r,e,t){await q("review follow-up",e,()=>r.issues.createComment({owner:e.owner,repo:e.repo,issue_number:e.number,body:t}))}async function _s(r,e,t){await q("issue comment follow-up",e,()=>r.issues.createComment({owner:e.owner,repo:e.repo,issue_number:e.number,body:t}))}async function Ns(r,e,t){await q("PR comment",e,()=>r.issues.createComment({owner:e.owner,repo:e.repo,issue_number:e.number,body:t}))}async function Ds(r,e,t,n,a){if(t.replyKind==="review_thread"){if(!t.threadId){let s=t.sourceUrl?`> _Could not reply in the review thread directly ([original comment](${t.sourceUrl}))._
827
+ `}};async function Xs(t,e,r){let n=Ne(e);if(!n)throw new se(`Invalid repository: ${e}`,400);let a=await je(t),s=Td[r],i=`.github/workflows/${s.filename}`,o=Buffer.from(s.content).toString("base64"),c;try{let{data:g}=await a.rest.repos.getContent({owner:n.owner,repo:n.repo,path:i});!Array.isArray(g)&&"sha"in g&&(c=g.sha)}catch(g){if((typeof g?.status=="number"?g.status:0)!==404)throw Js(g,"workflow file check",n)}let u=c?`ci: update ${r} code review workflow`:`ci: add ${r} code review workflow`,m=await W("workflow file creation",n,()=>a.rest.repos.createOrUpdateFileContents({owner:n.owner,repo:n.repo,path:i,message:u,content:o,...c?{sha:c}:{}}));return{path:i,url:m.data.content?.html_url??`https://github.com/${e}/blob/HEAD/${i}`}}async function Vr(t,e){let n=(await W("PR metadata",e,()=>t.pulls.get({owner:e.owner,repo:e.repo,pull_number:e.number}))).data,a=n.base?.ref||n.base?.repo?.default_branch||"";return{number:n.number,title:n.title||`PR #${n.number}`,branch:n.head?.ref||"unknown",author:n.user?.login||"",url:n.html_url||`https://github.com/${e.owner}/${e.repo}/pull/${n.number}`,repoFullName:n.base?.repo?.full_name||`${e.owner}/${e.repo}`,repoCloneUrl:n.base?.repo?.clone_url||`https://github.com/${e.owner}/${e.repo}.git`,headSha:n.head?.sha||"",headRef:n.head?.ref||"",headRepoFullName:n.head?.repo?.full_name||`${e.owner}/${e.repo}`,headRepoCloneUrl:n.head?.repo?.clone_url||`https://github.com/${e.owner}/${e.repo}.git`,baseRef:a,mergeable:typeof n.mergeable=="boolean"?n.mergeable:null}}async function qs(t,e){let n=(await W("PR close state",e,()=>t.pulls.get({owner:e.owner,repo:e.repo,pull_number:e.number}))).data,a=n.base?.ref||n.base?.repo?.default_branch||"";return{number:n.number,title:n.title||`PR #${n.number}`,url:n.html_url||`https://github.com/${e.owner}/${e.repo}/pull/${n.number}`,author:n.user?.login||"unknown",baseRef:a,headRef:n.head?.ref||"",headSha:n.head?.sha||"",merged:!!n.merged_at,mergedAt:n.merged_at||null,closedAt:n.closed_at||null,mergeCommitSha:n.merge_commit_sha||null}}function Ws(t){let e=t.trim().match(_d);return e?{major:Number.parseInt(e[1],10),minor:Number.parseInt(e[2],10),patch:Number.parseInt(e[3],10)}:null}function xd(t,e){return t.major!==e.major?t.major-e.major:t.minor!==e.minor?t.minor-e.minor:t.patch-e.patch}function Pd(t){return`v${t.major}.${t.minor}.${t.patch}`}function Ed(t){let e=null;for(let r of t){let n=Ws(r);n&&(!e||xd(n,e.version)>0)&&(e={tag:r,version:n})}return e?.tag??null}function Vs(t,e){let r=t?Ws(t):{major:0,minor:0,patch:0};if(!r)throw new se(`Cannot calculate next semver tag from invalid tag: ${t}`,400);let n={major:r.major,minor:r.minor,patch:r.patch};return e==="major"?(n.major+=1,n.minor=0,n.patch=0):e==="minor"?(n.minor+=1,n.patch=0):n.patch+=1,Pd(n)}function Ad(t){if(!t)return null;let e=Date.parse(t);return Number.isFinite(e)?e:null}async function Cd(t,e){let n=(await W("repository metadata",e,()=>t.repos.get({owner:e.owner,repo:e.repo}))).data.default_branch?.trim();if(!n)throw new se(`GitHub did not return a default branch for ${Ot(e)}`,502);return n}async function Kr(t,e){return(await W("repository releases",e,()=>t.paginate(t.repos.listReleases,{owner:e.owner,repo:e.repo,per_page:100}))).map(n=>({id:n.id,tagName:n.tag_name||"",name:n.name||n.tag_name||`Release ${n.id}`,body:n.body||null,htmlUrl:n.html_url||"",apiUrl:n.url||"",draft:!!n.draft,prerelease:!!n.prerelease,targetCommitish:n.target_commitish||null,publishedAt:n.published_at||null}))}async function Id(t,e){return(await W("repository tags",e,()=>t.paginate(t.repos.listTags,{owner:e.owner,repo:e.repo,per_page:100}))).map(n=>({name:n.name,commitSha:n.commit?.sha||null}))}async function Ks(t,e){let[r,n]=await Promise.all([Kr(t,e),Id(t,e)]),a=[...r.filter(s=>!s.draft).map(s=>s.tagName),...n.map(s=>s.name)];return Ed(a)}async function zs(t,e,r){let a=(await W("release creation",e,()=>t.repos.createRelease({owner:e.owner,repo:e.repo,tag_name:r.tagName,name:r.name,body:r.body,target_commitish:r.targetCommitish??void 0,draft:r.draft??!1,prerelease:r.prerelease??!1,generate_release_notes:r.generateReleaseNotes??!1}))).data;return{id:a.id,tagName:a.tag_name||r.tagName,name:a.name||r.name,body:a.body||null,htmlUrl:a.html_url||"",apiUrl:a.url||"",draft:!!a.draft,prerelease:!!a.prerelease,targetCommitish:a.target_commitish||null,publishedAt:a.published_at||null}}function ca(t,e){if(!t)return!0;let r=t.toLowerCase();return!!e.has(r)}function Qs(t,e,r,n){for(let a of n?.nodes||[])typeof a?.databaseId=="number"&&t.set(a.databaseId,{threadId:e,threadResolved:r})}async function Nd(t,e,r,n){if(!n.id)return;let a=n.comments?.pageInfo?.hasNextPage&&n.comments.pageInfo.endCursor?n.comments.pageInfo.endCursor:null,s=!!n.isResolved;for(;a;){let o=(await W("review thread comments",e,()=>t.graphql(Sd,{threadId:n.id,cursor:a}))).node;if(!o?.id)break;typeof o.isResolved=="boolean"&&(s=o.isResolved),Qs(r,o.id,s,o.comments);let c=o.comments?.pageInfo;a=c?.hasNextPage&&c.endCursor?c.endCursor:null}}async function Fd(t,e){let r=new Map,n=null;for(;;){let s=(await W("review threads",e,()=>t.graphql(Rd,{owner:e.owner,repo:e.repo,number:e.number,cursor:n}))).repository?.pullRequest?.reviewThreads;for(let o of s?.nodes||[])o?.id&&(Qs(r,o.id,!!o.isResolved,o.comments),await Nd(t,e,r,o));let i=s?.pageInfo;if(!i?.hasNextPage||!i.endCursor)break;n=i.endCursor}return r}async function Dd(t,e,r,n){await W("review thread reply",e,()=>t.graphql(Us,{threadId:r,body:n}))}async function wr(t,e,r){await W("review thread resolution",e,()=>t.graphql(kd,{threadId:r}))}async function Hd(t,e,r){await W("review follow-up",e,()=>t.issues.createComment({owner:e.owner,repo:e.repo,issue_number:e.number,body:r}))}async function $s(t,e,r){await W("issue comment follow-up",e,()=>t.issues.createComment({owner:e.owner,repo:e.repo,issue_number:e.number,body:r}))}async function Ys(t,e,r){await W("PR comment",e,()=>t.issues.createComment({owner:e.owner,repo:e.repo,issue_number:e.number,body:r}))}async function Zs(t,e,r,n,a){if(r.replyKind==="review_thread"){if(!r.threadId){let s=r.sourceUrl?`> _Could not reply in the review thread directly ([original comment](${r.sourceUrl}))._
826
828
 
827
- ${n}`:n;await _s(r,e,s);return}await ml(r,e,t.threadId,n),a?.resolve&&await er(r,e,t.threadId);return}if(t.replyKind==="review"){await hl(r,e,n);return}await _s(r,e,n)}async function Fs(r,e,t){let n=new Set(t.ignoredBots.map(g=>g.toLowerCase())),[a,s,i,o]=await Promise.all([q("review comments",e,()=>r.paginate(r.pulls.listReviewComments,{owner:e.owner,repo:e.repo,pull_number:e.number,per_page:100})),q("reviews",e,()=>r.paginate(r.pulls.listReviews,{owner:e.owner,repo:e.repo,pull_number:e.number,per_page:100})),q("issue comments",e,()=>r.paginate(r.issues.listComments,{owner:e.owner,repo:e.repo,issue_number:e.number,per_page:100})),pl(r,e)]),c=a.filter(g=>!jn(g.user?.login,n)).map(g=>{let P=`gh-review-comment-${g.id}`,A=o.get(g.id);return{id:P,author:g.user?.login||"unknown",body:g.body||"",bodyHtml:kr(g.body||""),replyKind:"review_thread",sourceId:String(g.id),sourceNodeId:g.node_id||null,sourceUrl:g.html_url||null,threadId:A?.threadId||null,threadResolved:typeof A?.threadResolved=="boolean"?A.threadResolved:null,auditToken:Bn(P),file:g.path||null,line:g.line??g.original_line??null,type:"review_comment",createdAt:g.created_at||new Date().toISOString(),decision:null,decisionReason:null,action:null,status:"pending",statusReason:null}}).filter(g=>g.body.trim().length>0),p=s.filter(g=>!jn(g.user?.login,n)).map(g=>{let P=`gh-review-${g.id}`;return{id:P,author:g.user?.login||"unknown",body:g.body||"",bodyHtml:kr(g.body||""),replyKind:"review",sourceId:String(g.id),sourceNodeId:g.node_id||null,sourceUrl:g.html_url||null,threadId:null,threadResolved:null,auditToken:Bn(P),file:null,line:null,type:"review",createdAt:g.submitted_at||new Date().toISOString(),decision:null,decisionReason:null,action:null,status:"pending",statusReason:null}}).filter(g=>g.body.trim().length>0),m=i.filter(g=>!jn(g.user?.login,n)).map(g=>{let P=`gh-issue-comment-${g.id}`;return{id:P,author:g.user?.login||"unknown",body:g.body||"",bodyHtml:kr(g.body||""),replyKind:"general_comment",sourceId:String(g.id),sourceNodeId:g.node_id||null,sourceUrl:g.html_url||null,threadId:null,threadResolved:null,auditToken:Bn(P),file:null,line:null,type:"general_comment",createdAt:g.created_at||new Date().toISOString(),decision:null,decisionReason:null,action:null,status:"pending",statusReason:null}}).filter(g=>g.body.trim().length>0),u=[...c,...p,...m];return u.sort((g,P)=>new Date(g.createdAt).getTime()-new Date(P.createdAt).getTime()),u}async function Hs(r,e){return(await q("open pull requests",e,()=>r.paginate(r.pulls.list,{owner:e.owner,repo:e.repo,state:"open",sort:"updated",direction:"desc",per_page:100}))).map(n=>({number:n.number,title:n.title||`PR #${n.number}`,branch:n.head?.ref||"unknown",author:n.user?.login||"",url:n.html_url||`https://github.com/${e.owner}/${e.repo}/pull/${n.number}`,repoFullName:n.base?.repo?.full_name||`${e.owner}/${e.repo}`,repoCloneUrl:n.base?.repo?.clone_url||`https://github.com/${e.owner}/${e.repo}.git`,headSha:n.head?.sha||"",headRef:n.head?.ref||"",headRepoFullName:n.head?.repo?.full_name||`${e.owner}/${e.repo}`,headRepoCloneUrl:n.head?.repo?.clone_url||`https://github.com/${e.owner}/${e.repo}.git`,baseRef:n.base?.ref||n.base?.repo?.default_branch||"",mergeable:null}))}async function Ls(r,e,t,n){let a=Number(t.sourceId);Number.isFinite(a)&&(t.type==="review_comment"?await q("reaction on review comment",e,()=>r.reactions.createForPullRequestReviewComment({owner:e.owner,repo:e.repo,comment_id:a,content:n})):t.type==="general_comment"&&await q("reaction on issue comment",e,()=>r.reactions.createForIssueComment({owner:e.owner,repo:e.repo,comment_id:a,content:n})))}async function Os(r,e,t,n){if(t.replyKind==="review_thread"){if(!t.threadId){let c=t.sourceUrl?`> _Could not post this status update in the review thread directly ([original comment](${t.sourceUrl}))._
829
+ ${n}`:n;await $s(t,e,s);return}await Dd(t,e,r.threadId,n),a?.resolve&&await wr(t,e,r.threadId);return}if(r.replyKind==="review"){await Hd(t,e,n);return}await $s(t,e,n)}async function ei(t,e,r){let n=new Set(r.ignoredBots.map(p=>p.toLowerCase())),[a,s,i,o]=await Promise.all([W("review comments",e,()=>t.paginate(t.pulls.listReviewComments,{owner:e.owner,repo:e.repo,pull_number:e.number,per_page:100})),W("reviews",e,()=>t.paginate(t.pulls.listReviews,{owner:e.owner,repo:e.repo,pull_number:e.number,per_page:100})),W("issue comments",e,()=>t.paginate(t.issues.listComments,{owner:e.owner,repo:e.repo,issue_number:e.number,per_page:100})),Fd(t,e)]),c=a.filter(p=>!ca(p.user?.login,n)).map(p=>{let h=`gh-review-comment-${p.id}`,I=o.get(p.id);return{id:h,author:p.user?.login||"unknown",body:p.body||"",bodyHtml:Xr(p.body||""),replyKind:"review_thread",sourceId:String(p.id),sourceNodeId:p.node_id||null,sourceUrl:p.html_url||null,threadId:I?.threadId||null,threadResolved:typeof I?.threadResolved=="boolean"?I.threadResolved:null,auditToken:ua(h),file:p.path||null,line:p.line??p.original_line??null,type:"review_comment",createdAt:p.created_at||new Date().toISOString(),decision:null,decisionReason:null,action:null,status:"pending",statusReason:null}}).filter(p=>p.body.trim().length>0),u=s.filter(p=>!ca(p.user?.login,n)).map(p=>{let h=`gh-review-${p.id}`;return{id:h,author:p.user?.login||"unknown",body:p.body||"",bodyHtml:Xr(p.body||""),replyKind:"review",sourceId:String(p.id),sourceNodeId:p.node_id||null,sourceUrl:p.html_url||null,threadId:null,threadResolved:null,auditToken:ua(h),file:null,line:null,type:"review",createdAt:p.submitted_at||new Date().toISOString(),decision:null,decisionReason:null,action:null,status:"pending",statusReason:null}}).filter(p=>p.body.trim().length>0),m=i.filter(p=>!ca(p.user?.login,n)).map(p=>{let h=`gh-issue-comment-${p.id}`;return{id:h,author:p.user?.login||"unknown",body:p.body||"",bodyHtml:Xr(p.body||""),replyKind:"general_comment",sourceId:String(p.id),sourceNodeId:p.node_id||null,sourceUrl:p.html_url||null,threadId:null,threadResolved:null,auditToken:ua(h),file:null,line:null,type:"general_comment",createdAt:p.created_at||new Date().toISOString(),decision:null,decisionReason:null,action:null,status:"pending",statusReason:null}}).filter(p=>p.body.trim().length>0),g=[...c,...u,...m];return g.sort((p,h)=>new Date(p.createdAt).getTime()-new Date(h.createdAt).getTime()),g}async function ti(t,e){return(await W("open pull requests",e,()=>t.paginate(t.pulls.list,{owner:e.owner,repo:e.repo,state:"open",sort:"updated",direction:"desc",per_page:100}))).map(n=>({number:n.number,title:n.title||`PR #${n.number}`,branch:n.head?.ref||"unknown",author:n.user?.login||"",url:n.html_url||`https://github.com/${e.owner}/${e.repo}/pull/${n.number}`,repoFullName:n.base?.repo?.full_name||`${e.owner}/${e.repo}`,repoCloneUrl:n.base?.repo?.clone_url||`https://github.com/${e.owner}/${e.repo}.git`,headSha:n.head?.sha||"",headRef:n.head?.ref||"",headRepoFullName:n.head?.repo?.full_name||`${e.owner}/${e.repo}`,headRepoCloneUrl:n.head?.repo?.clone_url||`https://github.com/${e.owner}/${e.repo}.git`,baseRef:n.base?.ref||n.base?.repo?.default_branch||"",mergeable:null}))}async function ri(t,e,r,n){let a=Number(r.sourceId);Number.isFinite(a)&&(r.type==="review_comment"?await W("reaction on review comment",e,()=>t.reactions.createForPullRequestReviewComment({owner:e.owner,repo:e.repo,comment_id:a,content:n})):r.type==="general_comment"&&await W("reaction on issue comment",e,()=>t.reactions.createForIssueComment({owner:e.owner,repo:e.repo,comment_id:a,content:n})))}async function ni(t,e,r,n){if(r.replyKind==="review_thread"){if(!r.threadId){let c=r.sourceUrl?`> _Could not post this status update in the review thread directly ([original comment](${r.sourceUrl}))._
828
830
 
829
- ${n}`:n;return{commentDatabaseId:(await q("status reply fallback",e,()=>r.issues.createComment({owner:e.owner,repo:e.repo,issue_number:e.number,body:c}))).data.id,replyKind:"general_comment",body:c}}let s=await q("status reply in review thread",e,()=>r.graphql(Rs,{threadId:t.threadId,body:n})),i=al.safeParse(s);if(!i.success)throw new ee(`GitHub returned an unexpected payload while creating a status reply for feedback item ${t.id} on ${Ss(e)}.`,502);let o=i.data.addPullRequestReviewThreadReply?.comment?.databaseId;return typeof o!="number"?null:{commentDatabaseId:o,replyKind:t.replyKind,body:n}}return{commentDatabaseId:(await q("status reply",e,()=>r.issues.createComment({owner:e.owner,repo:e.repo,issue_number:e.number,body:n}))).data.id,replyKind:t.replyKind,body:n}}async function Ms(r,e,t,n){t.replyKind==="review_thread"?await q("update review comment",e,()=>r.pulls.updateReviewComment({owner:e.owner,repo:e.repo,comment_id:t.commentDatabaseId,body:n})):await q("update issue comment",e,()=>r.issues.updateComment({owner:e.owner,repo:e.repo,comment_id:t.commentDatabaseId,body:n})),t.body=n}async function $s(r,e,t){if(!t)return[];let[n,a]=await Promise.all([q("commit statuses",e,()=>r.repos.getCombinedStatusForRef({owner:e.owner,repo:e.repo,ref:t})),q("check runs",e,()=>r.checks.listForRef({owner:e.owner,repo:e.repo,ref:t}))]),s=n.data.statuses.filter(o=>o.state==="failure"||o.state==="error").map(o=>({context:o.context||"status-check",description:o.description||"Failed status check",targetUrl:o.target_url||null})),i=a.data.check_runs.filter(o=>o.conclusion==="failure"||o.conclusion==="timed_out"||o.conclusion==="cancelled").map(o=>({context:o.name,description:o.output?.summary||o.output?.title||`Check run ${o.conclusion}`,targetUrl:o.html_url||null}));return[...s,...i]}async function Us(r,e,t){if(!t)return!1;try{let[n,a]=await Promise.all([q("commit statuses (settled check)",e,()=>r.repos.getCombinedStatusForRef({owner:e.owner,repo:e.repo,ref:t})),q("check runs (settled check)",e,()=>r.checks.listForRef({owner:e.owner,repo:e.repo,ref:t}))]),s=n.data.statuses.some(c=>c.state==="pending"),i=a.data.check_runs.some(c=>c.status!=="completed");return(n.data.statuses.length>0||a.data.check_runs.length>0)&&!s&&!i}catch{return!1}}function fl(r,e){return r.merged_at?{number:r.number,title:r.title||`PR #${r.number}`,url:r.html_url||`https://github.com/${e.owner}/${e.repo}/pull/${r.number}`,author:r.user?.login??"unknown",repo:Rt(e),mergedAt:r.merged_at,mergeCommitSha:r.merge_commit_sha||null}:null}async function Bs(r,e,t){let n=t?.baseRef?.trim()||await ul(r,e),a=ll(t?.sinceMergedAt),s=t?.sinceMergeCommitSha?.trim()||null,o=(await q("merged pull requests",e,()=>r.paginate(r.pulls.list,{owner:e.owner,repo:e.repo,state:"closed",base:n,sort:"updated",direction:"desc",per_page:100}))).map(p=>fl(p,e)).filter(p=>!!p).filter(p=>a===null?!0:Date.parse(p.mergedAt)>a),c=o;if(s){let p=o.findIndex(m=>m.mergeCommitSha===s);p>=0&&(c=o.slice(0,p))}return c.sort((p,m)=>Date.parse(p.mergedAt)-Date.parse(m.mergedAt))}async function js(r,e,t){let n=t?.sinceMergedAt??null,a=t?.sinceMergeCommitSha??null;return!n&&!a&&(n=(await Er(r,e)).filter(o=>!o.draft&&o.publishedAt).sort((o,c)=>Date.parse(c.publishedAt||"")-Date.parse(o.publishedAt||""))[0]?.publishedAt??null),Bs(r,e,{baseRef:t?.baseRef,sinceMergedAt:n,sinceMergeCommitSha:a})}async function Js(r,e,t){let n=new Date().toISOString().slice(0,10);return(await Bs(r,e,t?{baseRef:t}:void 0)).filter(s=>s.mergedAt.startsWith(n))}var yl=["healed","blocked","escalated","superseded"],bl={idle:["triaging"],triaging:["awaiting_repair_slot","cooldown","blocked","escalated","superseded"],awaiting_repair_slot:["repairing","cooldown","blocked","escalated","superseded"],repairing:["awaiting_ci","cooldown","blocked","escalated","superseded"],awaiting_ci:["verifying","cooldown","blocked","escalated","superseded","healed"],verifying:["healed","awaiting_repair_slot","cooldown","blocked","escalated","superseded"],cooldown:["awaiting_repair_slot","blocked","escalated","superseded"],healed:[],blocked:[],escalated:[],superseded:[]};function Jn(r){return r.toISOString()}function Xn(r){return yl.includes(r)}function _l(r,e){return r===e?!0:bl[r].includes(e)}var xr=class{constructor(e,t=()=>new Date){this.storage=e;this.clock=t}now(){return this.clock()}async getConfig(){return this.storage.getConfig()}async getSessionByPrAndHead(e,t){return this.storage.getHealingSessionByPrAndHead(e,t)}async getActiveSessionsForPr(e){return(await this.storage.listHealingSessions({prId:e})).filter(n=>!Xn(n.state))}async ensureSessionForHead(e){let{prId:t,repo:n,prNumber:a,headSha:s}=e,i=await this.getSessionByPrAndHead(t,s);if(i)return i;let o=await this.getActiveSessionsForPr(t),c=`PR head moved to ${s}`;for(let p of o)p.initialHeadSha!==s&&await this.storage.updateHealingSession(p.id,{state:"superseded",endedAt:Jn(this.now()),escalationReason:c});return this.storage.createHealingSession({prId:t,repo:n,prNumber:a,initialHeadSha:s,currentHeadSha:s,state:"triaging",endedAt:null,blockedReason:null,escalationReason:null,latestFingerprint:null,attemptCount:0,lastImprovementScore:null})}async transitionSession(e,t,n={}){let a=await this.storage.getHealingSession(e);if(!a)throw new Error(`Healing session not found: ${e}`);if(!_l(a.state,t))throw new Error(`Illegal healing session transition: ${a.state} -> ${t}`);if(a.state===t){let o=await this.storage.updateHealingSession(e,n);if(!o)throw new Error(`Healing session not found: ${e}`);return o}let s={...n,state:t};t==="repairing"&&(s.attemptCount=a.attemptCount+1),Xn(t)&&(s.endedAt=n.endedAt??Jn(this.now()));let i=await this.storage.updateHealingSession(e,s);if(!i)throw new Error(`Healing session not found: ${e}`);return i}async markTriaging(e,t={}){return this.transitionSession(e,"triaging",t)}async markAwaitingRepairSlot(e,t={}){return this.transitionSession(e,"awaiting_repair_slot",t)}async markRepairing(e,t={}){return this.transitionSession(e,"repairing",t)}async markAwaitingCi(e,t={}){return this.transitionSession(e,"awaiting_ci",t)}async markVerifying(e,t={}){return this.transitionSession(e,"verifying",t)}async markCooldown(e,t={}){return this.transitionSession(e,"cooldown",t)}async markHealed(e,t={}){return this.transitionSession(e,"healed",t)}async markBlocked(e,t,n={}){return this.transitionSession(e,"blocked",{...n,blockedReason:t,escalationReason:null})}async markEscalated(e,t,n={}){return this.transitionSession(e,"escalated",{...n,escalationReason:t,blockedReason:null})}async supersedeSessionsForPr(e,t,n){let a=await this.getActiveSessionsForPr(e),s=Jn(this.now()),i=[];for(let o of a){if(o.initialHeadSha===t)continue;let c=await this.storage.updateHealingSession(o.id,{state:"superseded",endedAt:s,escalationReason:n??`PR head moved to ${t}`});c&&i.push(c)}return i}async canRetry(e,t){let n=await this.getConfig(),a=await this.storage.getHealingSession(e);if(!a)throw new Error(`Healing session not found: ${e}`);let s=await this.storage.listHealingAttempts({sessionId:e}),i=t?s.filter(m=>m.targetFingerprints.includes(t)).length:0,o=this.getCooldownRemainingMs(a,n.healingCooldownMs),c=null,p=!0;return Xn(a.state)?(p=!1,c=`session is ${a.state}`):a.state==="cooldown"&&o>0?(p=!1,c=`cooldown active for ${o}ms`):a.attemptCount>=n.maxHealingAttemptsPerSession?(p=!1,c="session retry budget exhausted"):t&&i>=n.maxHealingAttemptsPerFingerprint?(p=!1,c=`retry budget exhausted for fingerprint ${t}`):(a.state==="idle"||a.state==="triaging")&&(p=!1,c=`session is ${a.state}`),{session:a,sessionAttempts:a.attemptCount,fingerprintAttempts:i,maxSessionAttempts:n.maxHealingAttemptsPerSession,maxFingerprintAttempts:n.maxHealingAttemptsPerFingerprint,cooldownRemainingMs:o,canRetry:p,reason:c}}async resumeRetry(e,t){let n=await this.canRetry(e,t);if(!n.canRetry)throw new Error(n.reason??"retry not allowed");return n.session.state!=="cooldown"?n.session:this.markAwaitingRepairSlot(e)}getCooldownRemainingMs(e,t){if(e.state!=="cooldown")return 0;let n=this.now().getTime()-new Date(e.updatedAt).getTime();return Math.max(0,t-n)}};var Gs=[{category:"typescript",fingerprint:"typescript",pattern:/\b(tsc|typescript|type[- ]?check|typecheck)\b/i},{category:"lint",fingerprint:"lint",pattern:/\b(eslint|lint|prettier|format(?:ting)?)\b/i},{category:"tests",fingerprint:"tests",pattern:/\b(test(?:s)?|jest|vitest|mocha|ava|pytest|unit[- ]?tests?|integration[- ]?tests?)\b/i},{category:"build",fingerprint:"build",pattern:/\b(build|bundle|bundling|vite|webpack|rollup|esbuild)\b/i},{category:"npm-ci",fingerprint:"npm-ci",pattern:/\b(npm ci|package[- ]?lock|lockfile|yarn\.lock|pnpm-lock)\b/i},{category:"generated-artifacts",fingerprint:"generated-artifacts",pattern:/\b(generate(?:d|ion)?|codegen|artifact(?:s)?)\b/i}],qs=[{category:"missing-secret",fingerprint:"missing-secret",pattern:/\b(secret|token|credential|auth|authorization|unauthorized|forbidden|permission|access denied)\b/i},{category:"external-outage",fingerprint:"external-outage",pattern:/\b(outage|unavailable|service unavailable|502|503|504|network error|dns|connection refused|rate limit|quota|api error)\b/i}],Rl=[{category:"timeout",fingerprint:"timeout",pattern:/\b(timeout|timed[- ]?out|deadline[- ]?exceeded)\b/i},{category:"cancelled",fingerprint:"cancelled",pattern:/\b(cancelled|canceled|aborted)\b/i},{category:"flaky",fingerprint:"flaky",pattern:/\b(flaky|intermittent|transient|rerun|retry)\b/i}];function Ws(r){return r.toLowerCase().replace(/[`"'’]/g,"").replace(/[^a-z0-9]+/g," ").replace(/\s+/g," ").trim().replace(/ /g,"-")}function Xs(r){return r.map(e=>Ws(e)).filter(e=>e.length>0).join(":")}function wl(r){let e=[r.context,r.description];return r.targetUrl&&e.push(r.targetUrl),e.filter((t,n,a)=>t.trim().length>0&&a.indexOf(t)===n)}function Sl(r){for(let e of qs)if(e.pattern.test(r))return{category:e.category,fingerprint:e.fingerprint};for(let e of Rl)if(e.pattern.test(r))return{category:e.category,fingerprint:e.fingerprint};for(let e of Gs)if(e.pattern.test(r))return{category:e.category,fingerprint:e.fingerprint};return null}function kl(r,e){let t=`${r.context}: ${r.description}`.trim();return e==="blocked_external"?`External CI failure likely not fixable in-branch: ${t}`:e==="flaky_or_ambiguous"?`Flaky or ambiguous CI failure: ${t}`:e==="healable_in_branch"?`In-branch fix likely available: ${t}`:`Unclassified CI failure: ${t}`}function vl(r){let e=Ws([r.provider,r.context,r.status,r.conclusion||"",r.description,r.targetUrl||""].join(" ")),t=Sl(e),n=t?Gs.some(i=>i.fingerprint===t.fingerprint)?"healable_in_branch":qs.some(i=>i.fingerprint===t.fingerprint)?"blocked_external":"flaky_or_ambiguous":"unknown",a=Xs(t?[r.provider,t.fingerprint,r.context]:[r.provider,"unknown",r.context,r.conclusion||r.status]),s=t?.category||"unknown";return{fingerprint:a,category:s,classification:n,summary:kl(r,n),selectedEvidence:wl(r)}}function Gn(r){let e=new Map;for(let t of r){let n=vl(t),a=e.get(n.fingerprint);if(!a){e.set(n.fingerprint,{...n,selectedEvidence:[...n.selectedEvidence]});continue}let s=new Set([...a.selectedEvidence,...n.selectedEvidence]),i=c=>c==="healable_in_branch"?3:c==="blocked_external"?2:c==="flaky_or_ambiguous"?1:0,o=i(n.classification)>i(a.classification)?n:a;e.set(n.fingerprint,{...o,selectedEvidence:Array.from(s)})}return Array.from(e.values())}import{createHash as Fl}from"crypto";import{mkdir as Tl,readdir as Pl,rm as qn}from"fs/promises";import tr from"path";var Ar=new Map,Cr=new Map;function wt(r){return r.stderr.trim()||r.stdout.trim()||"no output"}function Ks(r){let e=r.trim();if(!e)return"";try{let t=new URL(e),n=t.pathname.replace(/\/+$/,""),a=t.port?`:${t.port}`:"";return`${t.protocol.toLowerCase()}//${t.hostname.toLowerCase()}${a}${n}`}catch{return e.replace(/\/+$/,"")}}function Zs(r,e){return Ks(r)===Ks(e)}async function Wn(r){await Tl(r,{recursive:!0})}async function le(r,e,t){return r("git",e,{timeoutMs:t})}function Kn(r,e){let t=Ae(r);return tr.join(t.repoRootDir,Ir(e))}function El(r,e,t,n){let a=Ae(r),s=Ir(e);return tr.join(a.worktreeRootDir,s,`pr-${t}-${n}`)}function xl(r){return`fork-${(r.split("/")[0]||"fork").replace(/[^a-zA-Z0-9_.-]+/g,"-")}`}async function zn(r,e){let t=Ar.get(r)??Promise.resolve(),n,a=new Promise(i=>{n=()=>i()}),s=t.then(()=>a);Ar.set(r,s),await t;try{return await e()}finally{n?.(),Ar.get(r)===s&&Ar.delete(r)}}function ei(r,e){let t=Math.max(0,(Cr.get(r)??0)+e);if(t===0){Cr.delete(r);return}Cr.set(r,t)}async function Al(r,e){let t=await le(e,["-C",r,"worktree","prune"],15e3);if(t.code!==0&&(await le(e,["-C",r,"rev-parse","--is-inside-work-tree"],4e3)).code===0)throw new Error(`git worktree prune failed: ${wt(t)}`)}async function Cl(r){try{return(await Pl(tr.join(r,".git","worktrees"),{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch(e){if(e instanceof Error&&"code"in e&&e.code==="ENOENT")return 0;throw e}}async function zs(r,e){let t=Cr.get(r)??0;if(t>0)throw new Error(`Refusing to reclone repo cache while ${t} active workspace(s) still depend on it`);await Al(r,e);let n=await Cl(r);if(n>0)throw new Error(`Refusing to reclone repo cache while ${n} registered worktree(s) still exist`)}async function Il(r,e,t){if((await le(t,["-C",r,"rev-parse","--is-inside-work-tree"],4e3)).code!==0)return!1;let a=await le(t,["-C",r,"config","--get","remote.origin.url"],4e3);if(a.code!==0||!Zs(a.stdout,e))return!1;let s=await le(t,["-C",r,"status","--porcelain"],4e3);return!(s.code!==0||s.stdout.trim().length>0)}async function Vs(r,e,t){await Wn(tr.dirname(r)),await qn(r,{recursive:!0,force:!0});let n=await le(t,["clone",e,r],18e4);if(n.code!==0)throw new Error(`git clone failed: ${wt(n)}`)}async function Qs(r,e){return le(e,["-C",r,"fetch","origin","--prune"],12e4)}async function Ys(r,e,t,n){let a=await le(n,["-C",r,"config","--get",`remote.${e}.url`],4e3);if(a.code!==0||!a.stdout.trim()){let s=await le(n,["-C",r,"remote","add",e,t],8e3);if(s.code!==0)throw new Error(`git remote add ${e} failed: ${wt(s)}`);return}if(!Zs(a.stdout,t)){let s=await le(n,["-C",r,"remote","set-url",e,t],8e3);if(s.code!==0)throw new Error(`git remote set-url ${e} failed: ${wt(s)}`)}}async function Nl(r){let{repoCacheDir:e,repoFullName:t,headRepoFullName:n,headRepoCloneUrl:a,headRef:s,runCommand:i}=r,o=n===t?"origin":xl(n);o!=="origin"&&await Ys(e,o,a,i);let c=await le(i,["-C",e,"fetch",o,s],12e4);if(c.code===0||o!=="origin"&&(await le(i,["-C",e,"remote","remove",o],8e3),await Ys(e,o,a,i),c=await le(i,["-C",e,"fetch",o,s],12e4),c.code===0))return o;throw new Error(`git fetch ${o} ${s} failed: ${wt(c)}`)}async function Dl(r,e,t){await Wn(tr.dirname(e)),await qn(e,{recursive:!0,force:!0});let n=await le(t,["-C",r,"worktree","add","--detach",e,"FETCH_HEAD"],6e4);if(n.code!==0)throw new Error(`git worktree add failed: ${wt(n)}`)}function Ir(r){return r.replace(/[^a-zA-Z0-9_.-]+/g,"__")}async function ti(r){let{rootDir:e,repoFullName:t,repoCloneUrl:n,runCommand:a,forceReclone:s=!1}=r,i=Ae(e),o=Kn(e,t);await Wn(i.repoRootDir);let c=s;if((s||!await Il(o,n,a))&&(await zs(o,a),await Vs(o,n,a),c=!0),(await Qs(o,a)).code!==0){await zs(o,a),await Vs(o,n,a),c=!0;let m=await Qs(o,a);if(m.code!==0)throw new Error(`git fetch origin failed: ${wt(m)}`)}return{repoCacheDir:o,healed:c}}async function Nr(r){let e=Kn(r.rootDir,r.repoFullName);return zn(e,async()=>ti(r))}async function Dr(r){let{rootDir:e,repoFullName:t,repoCloneUrl:n,headRepoFullName:a,headRepoCloneUrl:s,headRef:i,prNumber:o,runId:c,runCommand:p}=r,m=El(e,t,o,c),u=Kn(e,t);return zn(u,async()=>{let g=!1,P=null;for(let A=0;A<2;A+=1){let w=await ti({rootDir:e,repoFullName:t,repoCloneUrl:n,runCommand:p,forceReclone:A>0});g=g||w.healed;try{let k=await Nl({repoCacheDir:w.repoCacheDir,repoFullName:t,headRepoFullName:a,headRepoCloneUrl:s,headRef:i,runCommand:p});return await Dl(w.repoCacheDir,m,p),ei(w.repoCacheDir,1),{repoCacheDir:w.repoCacheDir,worktreePath:m,healed:g,remoteName:k}}catch(k){P=k instanceof Error?k:new Error(String(k))}}throw P??new Error("Failed to prepare PR worktree")})}async function Fr(r){let{repoCacheDir:e,worktreePath:t,runCommand:n}=r;await zn(e,async()=>{try{await le(n,["-C",e,"worktree","remove","--force",t],3e4),await qn(t,{recursive:!0,force:!0})}finally{ei(e,-1)}})}var ri=3,Hl=3,Ll=12e4;function Ol(r){return{preparePrWorktree:r?.preparePrWorktree??Dr,removePrWorktree:r?.removePrWorktree??Fr,applyFixesWithAgent:r?.applyFixesWithAgent??Ht,runCommand:r?.runCommand??z}}function Ml(r){return Fl("sha256").update(r,"utf8").digest("hex")}function Vn(r,e=180){let t=r.replace(/\s+/g," ").trim();return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function ni(r){let e=new Map;for(let t of r)e.has(t.fingerprint)||e.set(t.fingerprint,t);return Array.from(e.values())}function $l(r,e){return r.map(t=>Vn(t)).filter(t=>t.length>0).slice(0,Math.max(0,e))}function Ul(r,e){let t=$l(r.selectedEvidence,e),n=t.length>0?t.map(a=>` - ${a}`).join(`
830
- `):" - No additional evidence provided";return[`- Fingerprint: ${r.fingerprint}`,` Category: ${r.category}`,` Classification: ${r.classification}`,` Summary: ${Vn(r.summary,220)}`," Evidence:",n].join(`
831
- `)}function Bl(r){let e=Math.max(0,r.maxFailuresToInclude??ri),t=Math.max(0,r.maxEvidencePerFailure??Hl),n=ni(r.failures),a=n.slice(0,e),s=Math.max(0,n.length-a.length),i=["You are fixing failing CI checks for a pull request.","Work only on the failures listed below.","Do not expand scope to unrelated files or tasks.","Make the smallest safe code change that clears the listed checks.","Commit and push your fix to the PR branch.","At the end of your response, include exactly one line in this format:","CI_HEALING_SUMMARY: <one short sentence about what changed and how it was verified>","",`Repository: ${r.repoFullName}`,`Pull request: #${r.prNumber}`,`Title: ${r.title}`,`Author: ${r.author}`,`PR URL: ${r.url}`,`Branch: ${r.branch}`,`Base ref: ${r.baseRef}`,`Head ref: ${r.headRef}`,`Current head SHA: ${r.headSha}`,`Agent: ${r.agent}`,"","Targeted failures:"];if(a.length===0)i.push("- No failures were supplied.");else for(let o of a)i.push(Ul(o,t));return s>0&&i.push(`- ${s} additional failure fingerprint(s) omitted to keep the prompt bounded.`),i.push("","Verification requirements:","1. If you make code changes, ensure the branch is pushed before you finish.","2. Keep the diff focused on the targeted fingerprints above.","3. If you cannot make progress, explain the blocker in the summary line."),i.join(`
832
- `)}function jl(r){let e=r.match(/^CI_HEALING_SUMMARY:\s*(.+)$/m);if(e?.[1])return e[1].trim();let t=r.trim();if(!t)return"No agent summary provided";let n=t.split(/\r?\n/).map(a=>a.trim()).filter(Boolean);return Vn(n.slice(-1).join(" "),240)}async function Jl(r,e){let t=await r.runCommand("git",["-C",e,"rev-parse","HEAD"],{timeoutMs:1e4});if(t.code!==0)throw new Error(`git rev-parse HEAD failed: ${t.stderr||t.stdout}`);return t.stdout.trim()}async function Xl(r,e){let t=await r.runCommand("git",["-C",e,"status","--porcelain"],{timeoutMs:1e4});if(t.code!==0)throw new Error(`git status --porcelain failed: ${t.stderr||t.stdout}`);return t.stdout.split(/\r?\n/).map(n=>n.trimEnd()).filter(n=>n.trim().length>0)}async function Gl(r,e,t,n){let a=await r.runCommand("git",["-C",e,"fetch",t,n],{timeoutMs:Ll});if(a.code!==0)throw new Error(`git fetch ${t} ${n} failed: ${a.stderr||a.stdout}`);let s=await r.runCommand("git",["-C",e,"rev-parse","FETCH_HEAD"],{timeoutMs:1e4});if(s.code!==0)throw new Error(`git rev-parse FETCH_HEAD failed: ${s.stderr||s.stdout}`);return s.stdout.trim()}async function ai(r){let e=Ol(r.dependencies),t=Bl(r),n=Ml(t),a=ni(r.failures).slice(0,Math.max(0,r.maxFailuresToInclude??ri)),s=await e.preparePrWorktree({rootDir:r.rootDir,repoFullName:r.repoFullName,repoCloneUrl:r.repoCloneUrl,headRepoFullName:r.headRepoFullName,headRepoCloneUrl:r.headRepoCloneUrl,headRef:r.headRef,prNumber:r.prNumber,runId:r.runId,runCommand:e.runCommand});try{let i=await e.applyFixesWithAgent({agent:r.agent,cwd:s.worktreePath,prompt:t,env:r.env}),o=await Jl(e,s.worktreePath),c=await Xl(e,s.worktreePath),p=c.length>0,m=p?r.headSha:await Gl(e,s.repoCacheDir,s.remoteName,r.headRef),u=o!==r.headSha,g=m!==r.headSha,P=g,A=i.code===0&&!p&&g,w=null;return A||(i.code!==0?w=`agent exited with code ${i.code}`:p?w=`dirty worktree after agent run: ${c[0]??"unknown changes"}`:u&&!g?w=`local commit ${o} was created but not pushed`:g?w="agent run did not satisfy verification requirements":w=`remote ${s.remoteName}/${r.headRef} did not move from ${r.headSha}`),{accepted:A,rejectionReason:w,summary:jl(i.stdout),prompt:t,promptDigest:n,agentResult:i,verification:{inputHeadSha:r.headSha,localHeadSha:o,remoteHeadSha:m,localCommitCreated:u,worktreeDirty:p,branchMoved:P,pushedNewSha:g},targetFingerprints:a.map(k=>k.fingerprint),classifiedFailures:a,worktreePath:s.worktreePath,repoCacheDir:s.repoCacheDir,remoteName:s.remoteName,agent:r.agent,headRef:r.headRef,baseRef:r.baseRef,prNumber:r.prNumber,title:r.title,url:r.url,author:r.author,branch:r.branch}}finally{await e.removePrWorktree({repoCacheDir:s.repoCacheDir,worktreePath:s.worktreePath,runCommand:e.runCommand})}}var ql=12e4,si=2e3;async function Hr(r){let{storage:e,changelogId:t,prSummaries:n,date:a,preferredAgent:s,timeoutMs:i}=r,o=Wl(i);try{let c=await Ze(s),p=Kl(n,a),m=await z(c,c==="claude"?["-p","--output-format","text",p]:["exec","--skip-git-repo-check","--sandbox","read-only",p],{timeoutMs:o});if(m.code!==0){let g=m.stderr||m.stdout||`Agent exited with code ${m.code}`;console.error(`social-changelog: generation command failed for ${t} (code=${m.code})`,{stdout:m.stdout,stderr:m.stderr}),await e.updateSocialChangelog(t,{status:"error",error:ii(g),completedAt:new Date().toISOString()});return}let u=m.stdout.trim()||"(Agent returned an empty response)";await e.updateSocialChangelog(t,{status:"done",content:u,completedAt:new Date().toISOString()})}catch(c){let p=c instanceof Error?c.message:String(c);console.error(`social-changelog: generation failed for ${t}: ${p}`,c),await e.updateSocialChangelog(t,{status:"error",error:ii(p),completedAt:new Date().toISOString()})}}function Wl(r){if(typeof r=="number"&&Number.isFinite(r)&&r>0)return Math.floor(r);let e=Number(process.env.SOCIAL_CHANGELOG_AGENT_TIMEOUT_MS);return Number.isFinite(e)&&e>0?Math.floor(e):ql}function ii(r){let e=(r||"Unknown error").trim();if(e.length<=si)return e;let t=si-15;return`${e.slice(0,t)}... (truncated)`}function Kl(r,e){let t=r.length,n=r.map(a=>` - PR #${a.number} by @${a.author} (${a.repo}): "${a.title}" \u2014 ${a.url}`).join(`
833
- `);return["You are a developer advocate writing social media copy for Code Factory \u2014 an open-source,","AI-powered GitHub PR manager. It watches repositories, triages review feedback, and","automatically dispatches AI agents (Claude or Codex) to fix code. It runs entirely on the","developer's own machine \u2014 no external hosting, no subscription required.","",`Today (${e}), the following ${t} pull request${t===1?" was":"s were"} merged to main:`,"",n,"","\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500","Using the AIDA copywriting framework, write social media posts that announce these updates","in a way that attracts developers and prospects:",""," \u2022 Attention \u2014 Open with a hook that makes developers stop scrolling. Lead with a bold"," benefit, a pain point every developer recognises, or a surprising capability."," \u2022 Interest \u2014 Highlight 2-3 of the most compelling changes in plain, jargon-free language."," \u2022 Desire \u2014 Paint the outcome: code review time cut, review cycles eliminated, bugs"," auto-fixed while the developer sleeps. Make the reader want that workflow."," \u2022 Action \u2014 Close with a clear, low-friction CTA. Include the placeholder [REPO_URL].","","Write exactly TWO sections:","","## Twitter/X Thread","2-3 connected tweets following the AIDA arc. Rules:"," - Number them (1/3), (2/3), (3/3)."," - Each tweet MUST be 280 characters or fewer \u2014 strictly enforced."," - Use emojis purposefully (not decoratively)."," - End the last tweet with [REPO_URL] and hashtags: #AI #DevTools #GitHub #OpenSource","","## LinkedIn / General","3-5 paragraphs with a narrative arc following AIDA. More detail than the tweets:"," - Paragraph 1 (Attention): powerful opening line, then set the scene."," - Paragraphs 2-3 (Interest + Desire): walk through specific changes, connect each to a"," developer pain point and its resolution."," - Final paragraph (Action): CTA, [REPO_URL], and a hashtag block.","","Tone: enthusiastic but grounded. Developer-first. No buzzword soup. Honest about what the","tool does and doesn't do."].join(`
834
- `)}import{randomUUID as zl}from"crypto";var Lr=class{storage;now;randomUUID;constructor(e,t){this.storage=e,this.now=t?.now??(()=>new Date),this.randomUUID=t?.randomUUID??zl}async enqueue(e,t,n,a={},s){return this.storage.enqueueBackgroundJob({kind:e,targetId:t,dedupeKey:n,payload:a,priority:s?.priority,availableAt:this.resolveNow(s?.availableAt)})}async claimNext(e){let t=this.resolveNow(e.now);return this.storage.claimNextBackgroundJob({workerId:e.workerId,leaseToken:this.randomUUID(),leaseExpiresAt:oi(t,e.leaseMs),now:t,kinds:e.kinds})}async heartbeat(e){let t=this.resolveNow(e.now);return this.storage.heartbeatBackgroundJob(e.jobId,e.leaseToken,t,oi(t,e.leaseMs))}async complete(e){return this.storage.completeBackgroundJob(e.jobId,e.leaseToken,this.resolveNow(e.now))}async fail(e){return this.storage.failBackgroundJob(e.jobId,e.leaseToken,e.error,this.resolveNow(e.now))}async cancel(e){return this.storage.cancelBackgroundJob(e.jobId,e.leaseToken,e.error??null,this.resolveNow(e.now))}async requeueExpired(e){return this.storage.requeueExpiredBackgroundJobs(this.resolveNow(e))}resolveNow(e){return Vl(e??this.now())}};function Ie(r,e){return r==="sync_watched_repos"?r:`${r}:${e}`}function oi(r,e){return new Date(new Date(r).getTime()+e).toISOString()}function Vl(r){return r instanceof Date?r.toISOString():r}import{readFile as Ql,access as Yl}from"fs/promises";import Ot from"path";async function Mt(r){try{return await Yl(r),!0}catch{return!1}}async function Zl(r){if(await Mt(Ot.join(r,"vercel.json")))return{platform:"vercel",configPath:"vercel.json"};if(await Mt(Ot.join(r,".vercel","project.json")))return{platform:"vercel",configPath:".vercel/project.json"};let e=Ot.join(r,"package.json");if(await Mt(e))try{let t=await Ql(e,"utf-8"),a=JSON.parse(t).scripts??{};if(Object.values(a).some(i=>typeof i=="string"&&i.includes("vercel")))return{platform:"vercel",configPath:"package.json"}}catch{}return null}async function eu(r){return await Mt(Ot.join(r,"railway.toml"))?{platform:"railway",configPath:"railway.toml"}:await Mt(Ot.join(r,"railway.json"))?{platform:"railway",configPath:"railway.json"}:await Mt(Ot.join(r,"nixpacks.toml"))?{platform:"railway",configPath:"nixpacks.toml"}:null}async function di(r){return await Zl(r)??await eu(r)}function tu(r){return r==="rejected"||r==="resolved"}function rr(r){return r.replyKind==="review_thread"&&!r.threadResolved&&tu(r.status)}function li(r){return r.replyKind!=="review_thread"||r.threadResolved?r:{...r,threadResolved:!0}}function ui(r,e){return{...r,decision:e,status:{accept:"queued",reject:"rejected",flag:"flagged"}[e],statusReason:"Manual override"}}function St(r,e,t){return e?{...r,decision:"accept",status:"queued",statusReason:t}:{...r,decision:"reject",status:"rejected",statusReason:t}}function ci(r,e){return{...r,decision:"flag",status:"flagged",statusReason:e}}function gi(r){return{...r,status:"in_progress"}}function Or(r){return{...r,status:"resolved"}}function pi(r,e){return{...r,status:"failed",statusReason:e}}function mi(r,e){return{...r,status:"warning",statusReason:e}}function hi(r){return{...r,status:"queued",statusReason:"Queued for retry"}}var nu="PR Babysitter",au="pr-babysitter@local",su=/\bcodefactory-feedback:[^\s<>()[\]{}"']+/g,iu={addReactionToComment:Ls,buildOctokit:Ce,checkCISettled:Us,fetchCheckSnapshotsForRef:ws,fetchFeedbackItemsForPR:Fs,fetchPullCloseState:Ps,fetchPullSummary:Pr,listFailingStatuses:$s,listMergedPullsToday:Js,listOpenPullsForRepo:Hs,postFollowUpForFeedbackItem:Ds,postPRComment:Ns,postStatusReplyForFeedbackItem:Os,resolveReviewThread:er,resolveGitHubAuthToken:Lt,updateStatusReply:Ms},ou={applyFixesWithAgent:Ht,evaluateFixNecessityWithAgent:ps,resolveAgent:Ze,runCommand:z,runCIHealingRepairAttempt:ai},nr={accepted:"\u23F3 **Accepted** \u2014 this comment requires code changes. Queuing fix...",agentRunning:r=>`\u{1F9F0} **Agent running** \u2014 \`${r}\` is working on the fix...`,agentFailed:"\u274C **Agent failed** \u2014 the coding agent exited with an error.",agentCompleted:"\u2705 **Agent completed** \u2014 verifying changes...",resolved:r=>{let e=r.trim().slice(0,7);return e?`\u{1F389} **Resolved** \u2014 addressed in commit \`${e}\`.`:"\u{1F389} **Resolved** \u2014 addressed in the latest babysitter run."}};function $t(r){return{accepted:r.filter(e=>e.decision==="accept").length,rejected:r.filter(e=>e.decision==="reject").length,flagged:r.filter(e=>e.decision==="flag").length}}function du(r,e){let t=new Map(r.map(s=>[s.id,s])),n=0,a=e.map(s=>{let i=t.get(s.id);return i?{...s,decision:i.decision,decisionReason:i.decisionReason,action:i.action,status:i.status,statusReason:i.statusReason}:(n+=1,s)});for(let s of r)a.find(i=>i.id===s.id)||a.push(s);return a.sort((s,i)=>new Date(s.createdAt).getTime()-new Date(i.createdAt).getTime()),{merged:a,newCount:n}}function lu(r){return r.feedbackItems.some(e=>e.replyKind==="review_thread"&&(e.threadId===null||e.threadResolved===null))}function uu(r,e){return`GitHub sync complete: ${r} feedback item${r===1?"":"s"} (${e} new)`}function cu(r){let{pr:e,item:t}=r;return["You are deciding whether a PR comment requires code changes.","Return JSON only.",`Repository: ${e.repo}`,`PR: #${e.number}`,`Comment author: ${t.author}`,`Comment type: ${t.type}`,`File: ${t.file||"n/a"}`,`Line: ${t.line??"n/a"}`,"Comment:",t.body,"Decision rule:","- needsFix=true only when concrete code changes are required.","- needsFix=false for acknowledgements, compliments, or non-actionable statements."].join(`
835
- `)}function gu(r){let{pr:e,context:t,description:n,targetUrl:a}=r;return["You are deciding whether a failing CI status should trigger automated code changes.","Return JSON only.",`Repository: ${e.repo}`,`PR: #${e.number}`,`Status context: ${t}`,`Description: ${n}`,`Target URL: ${a||"n/a"}`,"Decision rule:","- needsFix=true if this is likely caused by source code or project config that can be fixed in-branch.","- needsFix=false if it is transient infra failure, flaky external system, or missing permissions/secrets."].join(`
836
- `)}function Qn(r,e){return r.length<=e?r:`${r.slice(0,e)}
837
- ... (truncated)`}function pu(r){let{pr:e,pullSummary:t,changedFiles:n,diffStat:a,diffPreview:s}=r;return["You are deciding whether a pull request requires repository documentation updates.","Return JSON only.",`Repository: ${e.repo}`,`PR: #${e.number}`,`PR title: ${e.title}`,`Base branch: ${t.baseRef}`,`Head branch: ${t.headRef}`,"","Changed files (git diff --name-only origin/base...HEAD):",Qn(n||"None",4e3),"","Diff stat (git diff --stat origin/base...HEAD):",Qn(a||"None",4e3),"","Unified diff excerpt (git diff --unified=0 origin/base...HEAD):",Qn(s||"None",12e3),"","Decision rule:","- needsFix=true only when docs should be updated in this PR branch.","- needsFix=false when current docs are already accurate for these changes.","- Consider README, setup docs, API docs, configuration docs, and operator docs based on repo conventions.","- reason must briefly explain what docs should change (or why no docs change is needed)."].join(`
838
- `)}function wi(r,e){let t=r.docsAssessment;return!t||t.headSha!==e?null:t}function mu(r,e,t){if(!t)return!1;let n=wi(r,e);return n?n.status==="failed":!0}function hu(r){let{pr:e,pullSummary:t,remoteName:n,conflictFiles:a}=r;return[`You are acting as an autonomous PR babysitter for ${e.repo} PR #${e.number}.`,`PR URL: ${e.url}`,`Base repository: ${t.repoFullName}`,`Head repository: ${t.headRepoFullName}`,`Head branch: ${t.headRef}`,`Base branch: ${t.baseRef}`,`Head remote: ${n}`,"You are running inside an isolated app-owned worktree under ~/.oh-my-pr.","","A merge from the base branch into the head branch has been started but has conflicts.","The following files have merge conflicts:",...a.map(s=>` - ${s}`),"","Your task:","1) Resolve ALL merge conflicts in the listed files.","2) Preserve the intent of both the base branch and head branch changes.","3) When in doubt, prefer the head branch (PR) changes, since that is the author's work.","4) After resolving conflicts, stage the resolved files with `git add`.","5) Complete the merge with `git commit --no-edit`.",`6) Push the result to ${n} HEAD:${t.headRef}.`,"7) Summarize what you resolved in your final response.","","Do not wait for user input, confirmation, or approval at any point.","Do not rewrite unrelated files.","Use the available git tooling in this environment."].join(`
839
- `)}function fu(r){let{pr:e,pullSummary:t,remoteName:n,commentTasks:a,statusTasks:s,docsTaskSummary:i}=r,o=a.length?a.map((m,u)=>[`${u+1}. [${m.type}] ${m.author}`,` file=${m.file||"n/a"} line=${m.line??"n/a"}`,` sourceId=${m.sourceId} sourceUrl=${m.sourceUrl||"n/a"}`,` replyKind=${m.replyKind} threadId=${m.threadId||"n/a"} threadResolved=${m.threadResolved??"n/a"}`,` auditToken=${m.auditToken}`,` ${m.body}`].join(`
831
+ ${n}`:n;return{commentDatabaseId:(await W("status reply fallback",e,()=>t.issues.createComment({owner:e.owner,repo:e.repo,issue_number:e.number,body:c}))).data.id,replyKind:"general_comment",body:c}}let s=await W("status reply in review thread",e,()=>t.graphql(Us,{threadId:r.threadId,body:n})),i=vd.safeParse(s);if(!i.success)throw new se(`GitHub returned an unexpected payload while creating a status reply for feedback item ${r.id} on ${js(e)}.`,502);let o=i.data.addPullRequestReviewThreadReply?.comment?.databaseId;return typeof o!="number"?null:{commentDatabaseId:o,replyKind:r.replyKind,body:n}}return{commentDatabaseId:(await W("status reply",e,()=>t.issues.createComment({owner:e.owner,repo:e.repo,issue_number:e.number,body:n}))).data.id,replyKind:r.replyKind,body:n}}async function ai(t,e,r,n){r.replyKind==="review_thread"?await W("update review comment",e,()=>t.pulls.updateReviewComment({owner:e.owner,repo:e.repo,comment_id:r.commentDatabaseId,body:n})):await W("update issue comment",e,()=>t.issues.updateComment({owner:e.owner,repo:e.repo,comment_id:r.commentDatabaseId,body:n})),r.body=n}async function si(t,e,r){if(!r)return[];let[n,a]=await Promise.all([W("commit statuses",e,()=>t.repos.getCombinedStatusForRef({owner:e.owner,repo:e.repo,ref:r})),W("check runs",e,()=>t.checks.listForRef({owner:e.owner,repo:e.repo,ref:r}))]),s=n.data.statuses.filter(o=>o.state==="failure"||o.state==="error").map(o=>({context:o.context||"status-check",description:o.description||"Failed status check",targetUrl:o.target_url||null})),i=a.data.check_runs.filter(o=>o.conclusion==="failure"||o.conclusion==="timed_out"||o.conclusion==="cancelled").map(o=>({context:o.name,description:o.output?.summary||o.output?.title||`Check run ${o.conclusion}`,targetUrl:o.html_url||null}));return[...s,...i]}async function ii(t,e,r){if(!r)return!1;try{let[n,a]=await Promise.all([W("commit statuses (settled check)",e,()=>t.repos.getCombinedStatusForRef({owner:e.owner,repo:e.repo,ref:r})),W("check runs (settled check)",e,()=>t.checks.listForRef({owner:e.owner,repo:e.repo,ref:r}))]),s=n.data.statuses.some(c=>c.state==="pending"),i=a.data.check_runs.some(c=>c.status!=="completed");return(n.data.statuses.length>0||a.data.check_runs.length>0)&&!s&&!i}catch{return!1}}function Ld(t,e){return t.merged_at?{number:t.number,title:t.title||`PR #${t.number}`,url:t.html_url||`https://github.com/${e.owner}/${e.repo}/pull/${t.number}`,author:t.user?.login??"unknown",repo:Ot(e),mergedAt:t.merged_at,mergeCommitSha:t.merge_commit_sha||null}:null}async function oi(t,e,r){let n=r?.baseRef?.trim()||await Cd(t,e),a=Ad(r?.sinceMergedAt),s=r?.sinceMergeCommitSha?.trim()||null,o=(await W("merged pull requests",e,()=>t.paginate(t.pulls.list,{owner:e.owner,repo:e.repo,state:"closed",base:n,sort:"updated",direction:"desc",per_page:100}))).map(u=>Ld(u,e)).filter(u=>!!u).filter(u=>a===null?!0:Date.parse(u.mergedAt)>a),c=o;if(s){let u=o.findIndex(m=>m.mergeCommitSha===s);u>=0&&(c=o.slice(0,u))}return c.sort((u,m)=>Date.parse(u.mergedAt)-Date.parse(m.mergedAt))}async function li(t,e,r){let n=r?.sinceMergedAt??null,a=r?.sinceMergeCommitSha??null;return!n&&!a&&(n=(await Kr(t,e)).filter(o=>!o.draft&&o.publishedAt).sort((o,c)=>Date.parse(c.publishedAt||"")-Date.parse(o.publishedAt||""))[0]?.publishedAt??null),oi(t,e,{baseRef:r?.baseRef,sinceMergedAt:n,sinceMergeCommitSha:a})}async function di(t,e,r){let n=new Date().toISOString().slice(0,10);return(await oi(t,e,r?{baseRef:r}:void 0)).filter(s=>s.mergedAt.startsWith(n))}var Od=["healed","blocked","escalated","superseded"],Md={idle:["triaging"],triaging:["awaiting_repair_slot","cooldown","blocked","escalated","superseded"],awaiting_repair_slot:["repairing","cooldown","blocked","escalated","superseded"],repairing:["awaiting_ci","cooldown","blocked","escalated","superseded"],awaiting_ci:["verifying","cooldown","blocked","escalated","superseded","healed"],verifying:["healed","awaiting_repair_slot","cooldown","blocked","escalated","superseded"],cooldown:["awaiting_repair_slot","blocked","escalated","superseded"],healed:[],blocked:[],escalated:[],superseded:[]};function ga(t){return t.toISOString()}function ma(t){return Od.includes(t)}function $d(t,e){return t===e?!0:Md[t].includes(e)}var zr=class{constructor(e,r=()=>new Date){this.storage=e;this.clock=r}now(){return this.clock()}async getConfig(){return this.storage.getConfig()}async getSessionByPrAndHead(e,r){return this.storage.getHealingSessionByPrAndHead(e,r)}async getActiveSessionsForPr(e){return(await this.storage.listHealingSessions({prId:e})).filter(n=>!ma(n.state))}async ensureSessionForHead(e){let{prId:r,repo:n,prNumber:a,headSha:s}=e,i=await this.getSessionByPrAndHead(r,s);if(i)return i;let o=await this.getActiveSessionsForPr(r),c=`PR head moved to ${s}`;for(let u of o)u.initialHeadSha!==s&&await this.storage.updateHealingSession(u.id,{state:"superseded",endedAt:ga(this.now()),escalationReason:c});return this.storage.createHealingSession({prId:r,repo:n,prNumber:a,initialHeadSha:s,currentHeadSha:s,state:"triaging",endedAt:null,blockedReason:null,escalationReason:null,latestFingerprint:null,attemptCount:0,lastImprovementScore:null})}async transitionSession(e,r,n={}){let a=await this.storage.getHealingSession(e);if(!a)throw new Error(`Healing session not found: ${e}`);if(!$d(a.state,r))throw new Error(`Illegal healing session transition: ${a.state} -> ${r}`);if(a.state===r){let o=await this.storage.updateHealingSession(e,n);if(!o)throw new Error(`Healing session not found: ${e}`);return o}let s={...n,state:r};r==="repairing"&&(s.attemptCount=a.attemptCount+1),ma(r)&&(s.endedAt=n.endedAt??ga(this.now()));let i=await this.storage.updateHealingSession(e,s);if(!i)throw new Error(`Healing session not found: ${e}`);return i}async markTriaging(e,r={}){return this.transitionSession(e,"triaging",r)}async markAwaitingRepairSlot(e,r={}){return this.transitionSession(e,"awaiting_repair_slot",r)}async markRepairing(e,r={}){return this.transitionSession(e,"repairing",r)}async markAwaitingCi(e,r={}){return this.transitionSession(e,"awaiting_ci",r)}async markVerifying(e,r={}){return this.transitionSession(e,"verifying",r)}async markCooldown(e,r={}){return this.transitionSession(e,"cooldown",r)}async markHealed(e,r={}){return this.transitionSession(e,"healed",r)}async markBlocked(e,r,n={}){return this.transitionSession(e,"blocked",{...n,blockedReason:r,escalationReason:null})}async markEscalated(e,r,n={}){return this.transitionSession(e,"escalated",{...n,escalationReason:r,blockedReason:null})}async supersedeSessionsForPr(e,r,n){let a=await this.getActiveSessionsForPr(e),s=ga(this.now()),i=[];for(let o of a){if(o.initialHeadSha===r)continue;let c=await this.storage.updateHealingSession(o.id,{state:"superseded",endedAt:s,escalationReason:n??`PR head moved to ${r}`});c&&i.push(c)}return i}async canRetry(e,r){let n=await this.getConfig(),a=await this.storage.getHealingSession(e);if(!a)throw new Error(`Healing session not found: ${e}`);let s=await this.storage.listHealingAttempts({sessionId:e}),i=r?s.filter(m=>m.targetFingerprints.includes(r)).length:0,o=this.getCooldownRemainingMs(a,n.healingCooldownMs),c=null,u=!0;return ma(a.state)?(u=!1,c=`session is ${a.state}`):a.state==="cooldown"&&o>0?(u=!1,c=`cooldown active for ${o}ms`):a.attemptCount>=n.maxHealingAttemptsPerSession?(u=!1,c="session retry budget exhausted"):r&&i>=n.maxHealingAttemptsPerFingerprint?(u=!1,c=`retry budget exhausted for fingerprint ${r}`):(a.state==="idle"||a.state==="triaging")&&(u=!1,c=`session is ${a.state}`),{session:a,sessionAttempts:a.attemptCount,fingerprintAttempts:i,maxSessionAttempts:n.maxHealingAttemptsPerSession,maxFingerprintAttempts:n.maxHealingAttemptsPerFingerprint,cooldownRemainingMs:o,canRetry:u,reason:c}}async resumeRetry(e,r){let n=await this.canRetry(e,r);if(!n.canRetry)throw new Error(n.reason??"retry not allowed");return n.session.state!=="cooldown"?n.session:this.markAwaitingRepairSlot(e)}getCooldownRemainingMs(e,r){if(e.state!=="cooldown")return 0;let n=this.now().getTime()-new Date(e.updatedAt).getTime();return Math.max(0,r-n)}};var ci=[{category:"typescript",fingerprint:"typescript",pattern:/\b(tsc|typescript|type[- ]?check|typecheck)\b/i},{category:"lint",fingerprint:"lint",pattern:/\b(eslint|lint|prettier|format(?:ting)?)\b/i},{category:"tests",fingerprint:"tests",pattern:/\b(test(?:s)?|jest|vitest|mocha|ava|pytest|unit[- ]?tests?|integration[- ]?tests?)\b/i},{category:"build",fingerprint:"build",pattern:/\b(build|bundle|bundling|vite|webpack|rollup|esbuild)\b/i},{category:"npm-ci",fingerprint:"npm-ci",pattern:/\b(npm ci|package[- ]?lock|lockfile|yarn\.lock|pnpm-lock)\b/i},{category:"generated-artifacts",fingerprint:"generated-artifacts",pattern:/\b(generate(?:d|ion)?|codegen|artifact(?:s)?)\b/i}],gi=[{category:"missing-secret",fingerprint:"missing-secret",pattern:/\b(secret|token|credential|auth|authorization|unauthorized|forbidden|permission|access denied)\b/i},{category:"external-outage",fingerprint:"external-outage",pattern:/\b(outage|unavailable|service unavailable|502|503|504|network error|dns|connection refused|rate limit|quota|api error)\b/i}],Ud=[{category:"timeout",fingerprint:"timeout",pattern:/\b(timeout|timed[- ]?out|deadline[- ]?exceeded)\b/i},{category:"cancelled",fingerprint:"cancelled",pattern:/\b(cancelled|canceled|aborted)\b/i},{category:"flaky",fingerprint:"flaky",pattern:/\b(flaky|intermittent|transient|rerun|retry)\b/i}];function mi(t){return t.toLowerCase().replace(/[`"'’]/g,"").replace(/[^a-z0-9]+/g," ").replace(/\s+/g," ").trim().replace(/ /g,"-")}function ui(t){return t.map(e=>mi(e)).filter(e=>e.length>0).join(":")}function Bd(t){let e=[t.context,t.description];return t.targetUrl&&e.push(t.targetUrl),e.filter((r,n,a)=>r.trim().length>0&&a.indexOf(r)===n)}function jd(t){for(let e of gi)if(e.pattern.test(t))return{category:e.category,fingerprint:e.fingerprint};for(let e of Ud)if(e.pattern.test(t))return{category:e.category,fingerprint:e.fingerprint};for(let e of ci)if(e.pattern.test(t))return{category:e.category,fingerprint:e.fingerprint};return null}function Jd(t,e){let r=`${t.context}: ${t.description}`.trim();return e==="blocked_external"?`External CI failure likely not fixable in-branch: ${r}`:e==="flaky_or_ambiguous"?`Flaky or ambiguous CI failure: ${r}`:e==="healable_in_branch"?`In-branch fix likely available: ${r}`:`Unclassified CI failure: ${r}`}function Gd(t){let e=mi([t.provider,t.context,t.status,t.conclusion||"",t.description,t.targetUrl||""].join(" ")),r=jd(e),n=r?ci.some(i=>i.fingerprint===r.fingerprint)?"healable_in_branch":gi.some(i=>i.fingerprint===r.fingerprint)?"blocked_external":"flaky_or_ambiguous":"unknown",a=ui(r?[t.provider,r.fingerprint,t.context]:[t.provider,"unknown",t.context,t.conclusion||t.status]),s=r?.category||"unknown";return{fingerprint:a,category:s,classification:n,summary:Jd(t,n),selectedEvidence:Bd(t)}}function pa(t){let e=new Map;for(let r of t){let n=Gd(r),a=e.get(n.fingerprint);if(!a){e.set(n.fingerprint,{...n,selectedEvidence:[...n.selectedEvidence]});continue}let s=new Set([...a.selectedEvidence,...n.selectedEvidence]),i=c=>c==="healable_in_branch"?3:c==="blocked_external"?2:c==="flaky_or_ambiguous"?1:0,o=i(n.classification)>i(a.classification)?n:a;e.set(n.fingerprint,{...o,selectedEvidence:Array.from(s)})}return Array.from(e.values())}import{createHash as eu}from"crypto";import{mkdir as Xd,readdir as qd,rm as ha}from"fs/promises";import Rr from"path";var Qr=new Map,Yr=new Map;function Mt(t){return t.stderr.trim()||t.stdout.trim()||"no output"}function pi(t){let e=t.trim();if(!e)return"";try{let r=new URL(e),n=r.pathname.replace(/\/+$/,""),a=r.port?`:${r.port}`:"";return`${r.protocol.toLowerCase()}//${r.hostname.toLowerCase()}${a}${n}`}catch{return e.replace(/\/+$/,"")}}function _i(t,e){return pi(t)===pi(e)}async function fa(t){await Xd(t,{recursive:!0})}async function _e(t,e,r){return t("git",e,{timeoutMs:r})}function ba(t,e){let r=Be(t);return Rr.join(r.repoRootDir,Zr(e))}function Wd(t,e,r,n){let a=Be(t),s=Zr(e);return Rr.join(a.worktreeRootDir,s,`pr-${r}-${n}`)}function Vd(t){return`fork-${(t.split("/")[0]||"fork").replace(/[^a-zA-Z0-9_.-]+/g,"-")}`}async function ya(t,e){let r=Qr.get(t)??Promise.resolve(),n,a=new Promise(i=>{n=()=>i()}),s=r.then(()=>a);Qr.set(t,s),await r;try{return await e()}finally{n?.(),Qr.get(t)===s&&Qr.delete(t)}}function wi(t,e){let r=Math.max(0,(Yr.get(t)??0)+e);if(r===0){Yr.delete(t);return}Yr.set(t,r)}async function Kd(t,e){let r=await _e(e,["-C",t,"worktree","prune"],15e3);if(r.code!==0&&(await _e(e,["-C",t,"rev-parse","--is-inside-work-tree"],4e3)).code===0)throw new Error(`git worktree prune failed: ${Mt(r)}`)}async function zd(t){try{return(await qd(Rr.join(t,".git","worktrees"),{withFileTypes:!0})).filter(r=>r.isDirectory()).length}catch(e){if(e instanceof Error&&"code"in e&&e.code==="ENOENT")return 0;throw e}}async function hi(t,e){let r=Yr.get(t)??0;if(r>0)throw new Error(`Refusing to reclone repo cache while ${r} active workspace(s) still depend on it`);await Kd(t,e);let n=await zd(t);if(n>0)throw new Error(`Refusing to reclone repo cache while ${n} registered worktree(s) still exist`)}async function Qd(t,e,r){if((await _e(r,["-C",t,"rev-parse","--is-inside-work-tree"],4e3)).code!==0)return!1;let a=await _e(r,["-C",t,"config","--get","remote.origin.url"],4e3);if(a.code!==0||!_i(a.stdout,e))return!1;let s=await _e(r,["-C",t,"status","--porcelain"],4e3);return!(s.code!==0||s.stdout.trim().length>0)}async function fi(t,e,r){await fa(Rr.dirname(t)),await ha(t,{recursive:!0,force:!0});let n=await _e(r,["clone",e,t],18e4);if(n.code!==0)throw new Error(`git clone failed: ${Mt(n)}`)}async function bi(t,e){return _e(e,["-C",t,"fetch","origin","--prune"],12e4)}async function yi(t,e,r,n){let a=await _e(n,["-C",t,"config","--get",`remote.${e}.url`],4e3);if(a.code!==0||!a.stdout.trim()){let s=await _e(n,["-C",t,"remote","add",e,r],8e3);if(s.code!==0)throw new Error(`git remote add ${e} failed: ${Mt(s)}`);return}if(!_i(a.stdout,r)){let s=await _e(n,["-C",t,"remote","set-url",e,r],8e3);if(s.code!==0)throw new Error(`git remote set-url ${e} failed: ${Mt(s)}`)}}async function Yd(t){let{repoCacheDir:e,repoFullName:r,headRepoFullName:n,headRepoCloneUrl:a,headRef:s,runCommand:i}=t,o=n===r?"origin":Vd(n);o!=="origin"&&await yi(e,o,a,i);let c=await _e(i,["-C",e,"fetch",o,s],12e4);if(c.code===0||o!=="origin"&&(await _e(i,["-C",e,"remote","remove",o],8e3),await yi(e,o,a,i),c=await _e(i,["-C",e,"fetch",o,s],12e4),c.code===0))return o;throw new Error(`git fetch ${o} ${s} failed: ${Mt(c)}`)}async function Zd(t,e,r){await fa(Rr.dirname(e)),await ha(e,{recursive:!0,force:!0});let n=await _e(r,["-C",t,"worktree","add","--detach",e,"FETCH_HEAD"],6e4);if(n.code!==0)throw new Error(`git worktree add failed: ${Mt(n)}`)}function Zr(t){return t.replace(/[^a-zA-Z0-9_.-]+/g,"__")}async function Ri(t){let{rootDir:e,repoFullName:r,repoCloneUrl:n,runCommand:a,forceReclone:s=!1}=t,i=Be(e),o=ba(e,r);await fa(i.repoRootDir);let c=s;if((s||!await Qd(o,n,a))&&(await hi(o,a),await fi(o,n,a),c=!0),(await bi(o,a)).code!==0){await hi(o,a),await fi(o,n,a),c=!0;let m=await bi(o,a);if(m.code!==0)throw new Error(`git fetch origin failed: ${Mt(m)}`)}return{repoCacheDir:o,healed:c}}async function en(t){let e=ba(t.rootDir,t.repoFullName);return ya(e,async()=>Ri(t))}async function tn(t){let{rootDir:e,repoFullName:r,repoCloneUrl:n,headRepoFullName:a,headRepoCloneUrl:s,headRef:i,prNumber:o,runId:c,runCommand:u}=t,m=Wd(e,r,o,c),g=ba(e,r);return ya(g,async()=>{let p=!1,h=null;for(let I=0;I<2;I+=1){let R=await Ri({rootDir:e,repoFullName:r,repoCloneUrl:n,runCommand:u,forceReclone:I>0});p=p||R.healed;try{let k=await Yd({repoCacheDir:R.repoCacheDir,repoFullName:r,headRepoFullName:a,headRepoCloneUrl:s,headRef:i,runCommand:u});return await Zd(R.repoCacheDir,m,u),wi(R.repoCacheDir,1),{repoCacheDir:R.repoCacheDir,worktreePath:m,healed:p,remoteName:k}}catch(k){h=k instanceof Error?k:new Error(String(k))}}throw h??new Error("Failed to prepare PR worktree")})}async function rn(t){let{repoCacheDir:e,worktreePath:r,runCommand:n}=t;await ya(e,async()=>{try{await _e(n,["-C",e,"worktree","remove","--force",r],3e4),await ha(r,{recursive:!0,force:!0})}finally{wi(e,-1)}})}var Si=3,tu=3,ru=12e4;function nu(t){return{preparePrWorktree:t?.preparePrWorktree??tn,removePrWorktree:t?.removePrWorktree??rn,applyFixesWithAgent:t?.applyFixesWithAgent??tr,runCommand:t?.runCommand??Z}}function au(t){return eu("sha256").update(t,"utf8").digest("hex")}function _a(t,e=180){let r=t.replace(/\s+/g," ").trim();return r.length<=e?r:`${r.slice(0,e-1)}\u2026`}function ki(t){let e=new Map;for(let r of t)e.has(r.fingerprint)||e.set(r.fingerprint,r);return Array.from(e.values())}function su(t,e){return t.map(r=>_a(r)).filter(r=>r.length>0).slice(0,Math.max(0,e))}function iu(t,e){let r=su(t.selectedEvidence,e),n=r.length>0?r.map(a=>` - ${a}`).join(`
832
+ `):" - No additional evidence provided";return[`- Fingerprint: ${t.fingerprint}`,` Category: ${t.category}`,` Classification: ${t.classification}`,` Summary: ${_a(t.summary,220)}`," Evidence:",n].join(`
833
+ `)}function ou(t){let e=Math.max(0,t.maxFailuresToInclude??Si),r=Math.max(0,t.maxEvidencePerFailure??tu),n=ki(t.failures),a=n.slice(0,e),s=Math.max(0,n.length-a.length),i=["You are fixing failing CI checks for a pull request.","Work only on the failures listed below.","Do not expand scope to unrelated files or tasks.","Make the smallest safe code change that clears the listed checks.","Commit and push your fix to the PR branch.","At the end of your response, include exactly one line in this format:","CI_HEALING_SUMMARY: <one short sentence about what changed and how it was verified>","",`Repository: ${t.repoFullName}`,`Pull request: #${t.prNumber}`,`Title: ${t.title}`,`Author: ${t.author}`,`PR URL: ${t.url}`,`Branch: ${t.branch}`,`Base ref: ${t.baseRef}`,`Head ref: ${t.headRef}`,`Current head SHA: ${t.headSha}`,`Agent: ${t.agent}`,"","Targeted failures:"];if(a.length===0)i.push("- No failures were supplied.");else for(let o of a)i.push(iu(o,r));return s>0&&i.push(`- ${s} additional failure fingerprint(s) omitted to keep the prompt bounded.`),i.push("","Verification requirements:","1. If you make code changes, ensure the branch is pushed before you finish.","2. Keep the diff focused on the targeted fingerprints above.","3. If you cannot make progress, explain the blocker in the summary line."),i.join(`
834
+ `)}function lu(t){let e=t.match(/^CI_HEALING_SUMMARY:\s*(.+)$/m);if(e?.[1])return e[1].trim();let r=t.trim();if(!r)return"No agent summary provided";let n=r.split(/\r?\n/).map(a=>a.trim()).filter(Boolean);return _a(n.slice(-1).join(" "),240)}async function du(t,e){let r=await t.runCommand("git",["-C",e,"rev-parse","HEAD"],{timeoutMs:1e4});if(r.code!==0)throw new Error(`git rev-parse HEAD failed: ${r.stderr||r.stdout}`);return r.stdout.trim()}async function uu(t,e){let r=await t.runCommand("git",["-C",e,"status","--porcelain"],{timeoutMs:1e4});if(r.code!==0)throw new Error(`git status --porcelain failed: ${r.stderr||r.stdout}`);return r.stdout.split(/\r?\n/).map(n=>n.trimEnd()).filter(n=>n.trim().length>0)}async function cu(t,e,r,n){let a=await t.runCommand("git",["-C",e,"fetch",r,n],{timeoutMs:ru});if(a.code!==0)throw new Error(`git fetch ${r} ${n} failed: ${a.stderr||a.stdout}`);let s=await t.runCommand("git",["-C",e,"rev-parse","FETCH_HEAD"],{timeoutMs:1e4});if(s.code!==0)throw new Error(`git rev-parse FETCH_HEAD failed: ${s.stderr||s.stdout}`);return s.stdout.trim()}async function vi(t){let e=nu(t.dependencies),r=ou(t),n=au(r),a=ki(t.failures).slice(0,Math.max(0,t.maxFailuresToInclude??Si)),s=await e.preparePrWorktree({rootDir:t.rootDir,repoFullName:t.repoFullName,repoCloneUrl:t.repoCloneUrl,headRepoFullName:t.headRepoFullName,headRepoCloneUrl:t.headRepoCloneUrl,headRef:t.headRef,prNumber:t.prNumber,runId:t.runId,runCommand:e.runCommand});try{let i=await e.applyFixesWithAgent({agent:t.agent,cwd:s.worktreePath,prompt:r,env:t.env}),o=await du(e,s.worktreePath),c=await uu(e,s.worktreePath),u=c.length>0,m=u?t.headSha:await cu(e,s.repoCacheDir,s.remoteName,t.headRef),g=o!==t.headSha,p=m!==t.headSha,h=p,I=i.code===0&&!u&&p,R=null;return I||(i.code!==0?R=`agent exited with code ${i.code}`:u?R=`dirty worktree after agent run: ${c[0]??"unknown changes"}`:g&&!p?R=`local commit ${o} was created but not pushed`:p?R="agent run did not satisfy verification requirements":R=`remote ${s.remoteName}/${t.headRef} did not move from ${t.headSha}`),{accepted:I,rejectionReason:R,summary:lu(i.stdout),prompt:r,promptDigest:n,agentResult:i,verification:{inputHeadSha:t.headSha,localHeadSha:o,remoteHeadSha:m,localCommitCreated:g,worktreeDirty:u,branchMoved:h,pushedNewSha:p},targetFingerprints:a.map(k=>k.fingerprint),classifiedFailures:a,worktreePath:s.worktreePath,repoCacheDir:s.repoCacheDir,remoteName:s.remoteName,agent:t.agent,headRef:t.headRef,baseRef:t.baseRef,prNumber:t.prNumber,title:t.title,url:t.url,author:t.author,branch:t.branch}}finally{await e.removePrWorktree({repoCacheDir:s.repoCacheDir,worktreePath:s.worktreePath,runCommand:e.runCommand})}}var gu=12e4,Ti=2e3;async function nn(t){let{storage:e,changelogId:r,prSummaries:n,date:a,preferredAgent:s,timeoutMs:i}=t,o=mu(i);try{let c=await pt(s),u=pu(n,a),m=await Z(c,c==="claude"?["-p","--output-format","text",u]:["exec","--skip-git-repo-check","--sandbox","read-only",u],{timeoutMs:o});if(m.code!==0){let p=m.stderr||m.stdout||`Agent exited with code ${m.code}`;console.error(`social-changelog: generation command failed for ${r} (code=${m.code})`,{stdout:m.stdout,stderr:m.stderr}),await e.updateSocialChangelog(r,{status:"error",error:xi(p),completedAt:new Date().toISOString()});return}let g=m.stdout.trim()||"(Agent returned an empty response)";await e.updateSocialChangelog(r,{status:"done",content:g,completedAt:new Date().toISOString()})}catch(c){let u=c instanceof Error?c.message:String(c);console.error(`social-changelog: generation failed for ${r}: ${u}`,c),await e.updateSocialChangelog(r,{status:"error",error:xi(u),completedAt:new Date().toISOString()})}}function mu(t){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return Math.floor(t);let e=Number(process.env.SOCIAL_CHANGELOG_AGENT_TIMEOUT_MS);return Number.isFinite(e)&&e>0?Math.floor(e):gu}function xi(t){let e=(t||"Unknown error").trim();if(e.length<=Ti)return e;let r=Ti-15;return`${e.slice(0,r)}... (truncated)`}function pu(t,e){let r=t.length,n=t.map(a=>` - PR #${a.number} by @${a.author} (${a.repo}): "${a.title}" \u2014 ${a.url}`).join(`
835
+ `);return["You are a developer advocate writing social media copy for Code Factory \u2014 an open-source,","AI-powered GitHub PR manager. It watches repositories, triages review feedback, and","automatically dispatches AI agents (Claude or Codex) to fix code. It runs entirely on the","developer's own machine \u2014 no external hosting, no subscription required.","",`Today (${e}), the following ${r} pull request${r===1?" was":"s were"} merged to main:`,"",n,"","\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500","Using the AIDA copywriting framework, write social media posts that announce these updates","in a way that attracts developers and prospects:",""," \u2022 Attention \u2014 Open with a hook that makes developers stop scrolling. Lead with a bold"," benefit, a pain point every developer recognises, or a surprising capability."," \u2022 Interest \u2014 Highlight 2-3 of the most compelling changes in plain, jargon-free language."," \u2022 Desire \u2014 Paint the outcome: code review time cut, review cycles eliminated, bugs"," auto-fixed while the developer sleeps. Make the reader want that workflow."," \u2022 Action \u2014 Close with a clear, low-friction CTA. Include the placeholder [REPO_URL].","","Write exactly TWO sections:","","## Twitter/X Thread","2-3 connected tweets following the AIDA arc. Rules:"," - Number them (1/3), (2/3), (3/3)."," - Each tweet MUST be 280 characters or fewer \u2014 strictly enforced."," - Use emojis purposefully (not decoratively)."," - End the last tweet with [REPO_URL] and hashtags: #AI #DevTools #GitHub #OpenSource","","## LinkedIn / General","3-5 paragraphs with a narrative arc following AIDA. More detail than the tweets:"," - Paragraph 1 (Attention): powerful opening line, then set the scene."," - Paragraphs 2-3 (Interest + Desire): walk through specific changes, connect each to a"," developer pain point and its resolution."," - Final paragraph (Action): CTA, [REPO_URL], and a hashtag block.","","Tone: enthusiastic but grounded. Developer-first. No buzzword soup. Honest about what the","tool does and doesn't do."].join(`
836
+ `)}import{randomUUID as hu}from"crypto";var an=class{storage;now;randomUUID;constructor(e,r){this.storage=e,this.now=r?.now??(()=>new Date),this.randomUUID=r?.randomUUID??hu}async enqueue(e,r,n,a={},s){return this.storage.enqueueBackgroundJob({kind:e,targetId:r,dedupeKey:n,payload:a,priority:s?.priority,availableAt:this.resolveNow(s?.availableAt)})}async claimNext(e){let r=this.resolveNow(e.now);return this.storage.claimNextBackgroundJob({workerId:e.workerId,leaseToken:this.randomUUID(),leaseExpiresAt:Pi(r,e.leaseMs),now:r,kinds:e.kinds})}async heartbeat(e){let r=this.resolveNow(e.now);return this.storage.heartbeatBackgroundJob(e.jobId,e.leaseToken,r,Pi(r,e.leaseMs))}async complete(e){return this.storage.completeBackgroundJob(e.jobId,e.leaseToken,this.resolveNow(e.now))}async fail(e){return this.storage.failBackgroundJob(e.jobId,e.leaseToken,e.error,this.resolveNow(e.now))}async cancel(e){return this.storage.cancelBackgroundJob(e.jobId,e.leaseToken,e.error??null,this.resolveNow(e.now))}async requeueExpired(e){return this.storage.requeueExpiredBackgroundJobs(this.resolveNow(e))}resolveNow(e){return fu(e??this.now())}};function Je(t,e){return t==="sync_watched_repos"?t:`${t}:${e}`}function Pi(t,e){return new Date(new Date(t).getTime()+e).toISOString()}function fu(t){return t instanceof Date?t.toISOString():t}import{readFile as bu,access as yu}from"fs/promises";import nr from"path";async function ar(t){try{return await yu(t),!0}catch{return!1}}async function _u(t){if(await ar(nr.join(t,"vercel.json")))return{platform:"vercel",configPath:"vercel.json"};if(await ar(nr.join(t,".vercel","project.json")))return{platform:"vercel",configPath:".vercel/project.json"};let e=nr.join(t,"package.json");if(await ar(e))try{let r=await bu(e,"utf-8"),a=JSON.parse(r).scripts??{};if(Object.values(a).some(i=>typeof i=="string"&&i.includes("vercel")))return{platform:"vercel",configPath:"package.json"}}catch{}return null}async function wu(t){return await ar(nr.join(t,"railway.toml"))?{platform:"railway",configPath:"railway.toml"}:await ar(nr.join(t,"railway.json"))?{platform:"railway",configPath:"railway.json"}:await ar(nr.join(t,"nixpacks.toml"))?{platform:"railway",configPath:"nixpacks.toml"}:null}async function Ei(t){return await _u(t)??await wu(t)}function Ru(t){return t==="rejected"||t==="resolved"}function Sr(t){return t.replyKind==="review_thread"&&!t.threadResolved&&Ru(t.status)}function Ai(t){return t.replyKind!=="review_thread"||t.threadResolved?t:{...t,threadResolved:!0}}function Ci(t,e){return{...t,decision:e,status:{accept:"queued",reject:"rejected",flag:"flagged"}[e],statusReason:"Manual override"}}function $t(t,e,r){return e?{...t,decision:"accept",status:"queued",statusReason:r}:{...t,decision:"reject",status:"rejected",statusReason:r}}function Ii(t,e){return{...t,decision:"flag",status:"flagged",statusReason:e}}function Ni(t){return{...t,status:"in_progress"}}function sn(t){return{...t,status:"resolved"}}function Fi(t,e){return{...t,status:"failed",statusReason:e}}function Di(t,e){return{...t,status:"warning",statusReason:e}}function Hi(t){return{...t,status:"queued",statusReason:"Queued for retry"}}var ku="PR Babysitter",vu="pr-babysitter@local",Tu=/\bcodefactory-feedback:[^\s<>()[\]{}"']+/g,xu={addReactionToComment:ri,buildOctokit:je,checkCISettled:ii,fetchCheckSnapshotsForRef:Bs,fetchFeedbackItemsForPR:ei,fetchPullCloseState:qs,fetchPullSummary:Vr,listFailingStatuses:si,listMergedPullsToday:di,listOpenPullsForRepo:ti,postFollowUpForFeedbackItem:Zs,postPRComment:Ys,postStatusReplyForFeedbackItem:ni,resolveReviewThread:wr,resolveGitHubAuthToken:rr,updateStatusReply:ai},Pu={applyFixesWithAgent:tr,evaluateFixNecessityWithAgent:Fs,resolveAgent:pt,runCommand:Z,runCIHealingRepairAttempt:vi},kr={accepted:"\u23F3 **Accepted** \u2014 this comment requires code changes. Queuing fix...",agentRunning:t=>`\u{1F9F0} **Agent running** \u2014 \`${t}\` is working on the fix...`,agentFailed:"\u274C **Agent failed** \u2014 the coding agent exited with an error.",agentCompleted:"\u2705 **Agent completed** \u2014 verifying changes...",resolved:t=>{let e=t.trim().slice(0,7);return e?`\u{1F389} **Resolved** \u2014 addressed in commit \`${e}\`.`:"\u{1F389} **Resolved** \u2014 addressed in the latest babysitter run."}};function sr(t){return{accepted:t.filter(e=>e.decision==="accept").length,rejected:t.filter(e=>e.decision==="reject").length,flagged:t.filter(e=>e.decision==="flag").length}}function Eu(t,e){let r=new Map(t.map(s=>[s.id,s])),n=0,a=e.map(s=>{let i=r.get(s.id);return i?{...s,decision:i.decision,decisionReason:i.decisionReason,action:i.action,status:i.status,statusReason:i.statusReason}:(n+=1,s)});for(let s of t)a.find(i=>i.id===s.id)||a.push(s);return a.sort((s,i)=>new Date(s.createdAt).getTime()-new Date(i.createdAt).getTime()),{merged:a,newCount:n}}function Au(t){return t.feedbackItems.some(e=>e.replyKind==="review_thread"&&(e.threadId===null||e.threadResolved===null))}function Cu(t,e){return`GitHub sync complete: ${t} feedback item${t===1?"":"s"} (${e} new)`}function Iu(t){let{pr:e,item:r}=t;return["You are deciding whether a PR comment requires code changes.","Return JSON only.",`Repository: ${e.repo}`,`PR: #${e.number}`,`Comment author: ${r.author}`,`Comment type: ${r.type}`,`File: ${r.file||"n/a"}`,`Line: ${r.line??"n/a"}`,"Comment:",r.body,"Decision rule:","- needsFix=true only when concrete code changes are required.","- needsFix=false for acknowledgements, compliments, or non-actionable statements."].join(`
837
+ `)}function Nu(t){let{pr:e,context:r,description:n,targetUrl:a}=t;return["You are deciding whether a failing CI status should trigger automated code changes.","Return JSON only.",`Repository: ${e.repo}`,`PR: #${e.number}`,`Status context: ${r}`,`Description: ${n}`,`Target URL: ${a||"n/a"}`,"Decision rule:","- needsFix=true if this is likely caused by source code or project config that can be fixed in-branch.","- needsFix=false if it is transient infra failure, flaky external system, or missing permissions/secrets."].join(`
838
+ `)}function wa(t,e){return t.length<=e?t:`${t.slice(0,e)}
839
+ ... (truncated)`}function Fu(t){let{pr:e,pullSummary:r,changedFiles:n,diffStat:a,diffPreview:s}=t;return["You are deciding whether a pull request requires repository documentation updates.","Return JSON only.",`Repository: ${e.repo}`,`PR: #${e.number}`,`PR title: ${e.title}`,`Base branch: ${r.baseRef}`,`Head branch: ${r.headRef}`,"","Changed files (git diff --name-only origin/base...HEAD):",wa(n||"None",4e3),"","Diff stat (git diff --stat origin/base...HEAD):",wa(a||"None",4e3),"","Unified diff excerpt (git diff --unified=0 origin/base...HEAD):",wa(s||"None",12e3),"","Decision rule:","- needsFix=true only when docs should be updated in this PR branch.","- needsFix=false when current docs are already accurate for these changes.","- Consider README, setup docs, API docs, configuration docs, and operator docs based on repo conventions.","- reason must briefly explain what docs should change (or why no docs change is needed)."].join(`
840
+ `)}function Bi(t,e){let r=t.docsAssessment;return!r||r.headSha!==e?null:r}function Du(t,e,r){if(!r)return!1;let n=Bi(t,e);return n?n.status==="failed":!0}function Hu(t){let{pr:e,pullSummary:r,remoteName:n,conflictFiles:a}=t;return[`You are acting as an autonomous PR babysitter for ${e.repo} PR #${e.number}.`,`PR URL: ${e.url}`,`Base repository: ${r.repoFullName}`,`Head repository: ${r.headRepoFullName}`,`Head branch: ${r.headRef}`,`Base branch: ${r.baseRef}`,`Head remote: ${n}`,"You are running inside an isolated app-owned worktree under ~/.oh-my-pr.","","A merge from the base branch into the head branch has been started but has conflicts.","The following files have merge conflicts:",...a.map(s=>` - ${s}`),"","Your task:","1) Resolve ALL merge conflicts in the listed files.","2) Preserve the intent of both the base branch and head branch changes.","3) When in doubt, prefer the head branch (PR) changes, since that is the author's work.","4) After resolving conflicts, stage the resolved files with `git add`.","5) Complete the merge with `git commit --no-edit`.",`6) Push the result to ${n} HEAD:${r.headRef}.`,"7) Summarize what you resolved in your final response.","","Do not wait for user input, confirmation, or approval at any point.","Do not rewrite unrelated files.","Use the available git tooling in this environment."].join(`
841
+ `)}function Lu(t){let{pr:e,pullSummary:r,remoteName:n,commentTasks:a,statusTasks:s,docsTaskSummary:i}=t,o=a.length?a.map((m,g)=>[`${g+1}. [${m.type}] ${m.author}`,` file=${m.file||"n/a"} line=${m.line??"n/a"}`,` sourceId=${m.sourceId} sourceUrl=${m.sourceUrl||"n/a"}`,` replyKind=${m.replyKind} threadId=${m.threadId||"n/a"} threadResolved=${m.threadResolved??"n/a"}`,` auditToken=${m.auditToken}`,` ${m.body}`].join(`
840
842
  `)).join(`
841
- `):"None",c=s.length?s.map((m,u)=>`${u+1}. ${m.context}: ${m.description}${m.targetUrl?` (${m.targetUrl})`:""}`).join(`
842
- `):"None",p=i?["Documentation updates are required for this PR.",`Assessment summary: ${i}`,"Update the appropriate repository documentation for these changes.","Choose the right docs files for this repository (for example README, docs pages, API/config/operator docs).","If, after inspection, the repository documentation is already accurate or there is no appropriate docs target, leave docs unchanged and report that using the docs summary block with `no_change`."].join(`
843
- `):"None";return[`You are acting as an autonomous PR babysitter for ${e.repo} PR #${e.number}.`,`PR URL: ${e.url}`,`Base repository: ${t.repoFullName}`,`Head repository: ${t.headRepoFullName}`,`Head branch: ${t.headRef}`,`Head remote: ${n}`,"You are running inside an isolated app-owned worktree under ~/.oh-my-pr.","Make only targeted changes that resolve the approved tasks.","Do not wait for user input, confirmation, or approval at any point.","Do not rewrite unrelated files.","Use the available git tooling in this environment.","GitHub follow-up replies and review-thread resolution will be handled by the babysitter after your run.","If a task is invalid after inspection, explain it in your final response and include the exact audit token.","","Approved review-comment tasks:",o,"","Approved status-check tasks:",c,"","Approved documentation tasks:",p,"","When done:","1) Run the relevant verification for your changes.",`2) If you changed files, commit and push to ${n} HEAD:${t.headRef}.`,"3) For each feedback item you addressed or were blocked on, emit a summary block in the following format:"," FEEDBACK_SUMMARY_START <auditToken>"," <A concise 1-2 sentence summary of what you did or why you were blocked>"," FEEDBACK_SUMMARY_END"," Include one block per audit token. These summaries will be posted as follow-up comments on the PR.","4) If documentation tasks were assigned, emit exactly one docs summary block in the following format:"," DOCS_SUMMARY_START <changed|no_change>"," <A concise 1-2 sentence summary of the docs you updated, or why no docs changes were necessary after inspection>"," DOCS_SUMMARY_END"].join(`
844
- `)}function yu(r){let e=r.match(su);return e?Array.from(new Set(e)):[]}var fi=/FEEDBACK_SUMMARY_START\s+(codefactory-feedback:[^\s]+)\s*\n([\s\S]*?)FEEDBACK_SUMMARY_END/g,bu=/DOCS_SUMMARY_START\s+(changed|no_change)\s*\n([\s\S]*?)DOCS_SUMMARY_END/;function _u(r){let e=new Map,t,n=new RegExp(fi.source,fi.flags);for(;(t=n.exec(r))!==null;){let a=t[1],s=t[2].trim();a&&s&&e.set(a,s)}return e}function Ru(r){let e=bu.exec(r);if(!e)return null;let t=e[1],n=e[2]?.trim();return!n||t!=="changed"&&t!=="no_change"?null:{outcome:t,summary:n}}function wu(r,e){let t=yu(r.body).filter(a=>a!==r.auditToken);if(t.length===0)return!1;let n=new Date(r.createdAt).getTime();return t.some(a=>e.some(s=>{if(s.id===r.id||s.auditToken!==a)return!1;let i=new Date(s.createdAt).getTime();return Number.isNaN(n)||Number.isNaN(i)?!1:i<=n}))}function Yn(r,e,t){return e.some(n=>{if(n.id===r.id||!n.body.includes(r.auditToken)||r.replyKind==="review_thread"&&(!r.threadId||n.threadId!==r.threadId))return!1;let a=new Date(n.createdAt).getTime();return Number.isNaN(a)?!1:typeof t=="number"?a>=t:!0})}function Su(r){let{pr:e,followUpTasks:t,runStartedAtMs:n}=r,a=[];for(let s of t)Yn(s,e.feedbackItems,n)||a.push(`missing audit trail for ${s.id}`),s.replyKind==="review_thread"&&(e.feedbackItems.find(o=>o.id===s.id)?.threadResolved||a.push(`review thread not resolved for ${s.id}`));return a}function ku(r,e){return r.decision!=="accept"||r.status!=="queued"&&r.status!=="in_progress"?!1:Yn(r,e)?rr(Or(r)):!0}function vu(r){return r.feedbackItems.filter(e=>ku(e,r.feedbackItems))}function yi(r){return[r.prId,r.sha,r.provider,r.context,r.status,r.conclusion||"",r.description,r.targetUrl||""].join("|")}async function bi(r,e){if(e.length===0)return;let t=await r.listCheckSnapshots({prId:e[0].prId,sha:e[0].sha}),n=new Set(t.map(a=>yi(a)));for(let a of e){let s=yi(a);if(n.has(s))continue;let{id:i,...o}=a;await r.createCheckSnapshot(o),n.add(s)}}async function _i(r,e,t,n){let a=await r.listFailureFingerprints({sessionId:e,sha:t}),s=new Set(a.map(i=>i.fingerprint));for(let i of n)s.has(i.fingerprint)||(await r.createFailureFingerprint({sessionId:e,sha:t,fingerprint:i.fingerprint,category:i.category,classification:i.classification,summary:i.summary,selectedEvidence:i.selectedEvidence}),s.add(i.fingerprint))}function Tu(r,e){let t=new Set(r),n=new Set(e.map(c=>c.fingerprint)),a=r.filter(c=>!n.has(c)),s=r.filter(c=>n.has(c)),i=e.map(c=>c.fingerprint).filter(c=>!t.has(c)),o=a.length*2-s.length*2-i.length*3;return{removedTargetFingerprints:a,remainingTargetFingerprints:s,newUnrelatedFingerprints:i,improvementScore:o}}function Pu(r,e,t){let n=r.trim()?r.trim().slice(0,7):"",s=[n?`Addressed in commit \`${n}\` by the latest babysitter run.`:"Addressed in the latest babysitter run."];if(e.replyKind!=="review_thread"&&e.sourceUrl){let i=(e.body||"").split(`
845
- `)[0]||"",o=i.length>120?i.slice(0,120)+"\u2026":i;s.push("",`> Responding to [comment by @${e.author}](${e.sourceUrl}):`,`> ${o}`)}return t&&s.push("",t),s.push("",e.auditToken),s.join(`
846
- `)}var Si="<!-- codefactory-agent-command -->";function Eu(r){let e=0,t=r.match(/`{3,}/g);if(t)for(let a of t)a.length>e&&(e=a.length);let n="`".repeat(Math.max(3,e+1));return{open:`${n}text`,close:n}}function xu(r){return r.includes(Si)}function Au(r,e){let t=Eu(e);return[Si,`\u{1F916} **CodeFactory** dispatched \`${r}\` with the following prompt:`,"","<details>","<summary>Agent prompt (click to expand)</summary>","",t.open,e,t.close,"","</details>"].join(`
847
- `)}function Cu(r,e){return r?`${r}
848
- ${e}`:e}function Mr(r,e){return[r,...e].join(" ")}function Ut(r){return r.stderr.trim()||r.stdout.trim()||"no output"}function ve(r){return r instanceof Error?r.message:String(r)}function Iu(r,e){let n=`${r}${e}`.split(/\r?\n/);return{lines:n.slice(0,-1),buffer:n.at(-1)??""}}async function Nu(r,e){let t=await e("git",["config","--get","user.name"],{cwd:r,timeoutMs:3e3});(t.code!==0||!t.stdout.trim())&&await e("git",["config","user.name",nu],{cwd:r,timeoutMs:3e3});let n=await e("git",["config","--get","user.email"],{cwd:r,timeoutMs:3e3});(n.code!==0||!n.stdout.trim())&&await e("git",["config","user.email",au],{cwd:r,timeoutMs:3e3})}function Ri(r){return new Promise(e=>setTimeout(e,r))}var $r=class{storage;inProgress=new Set;feedbackMutationLocks=new Map;github;runtime;releaseManager;deploymentHealingManager;scheduleBackgroundJob;clock;constructor(e,t=iu,n=ou,a,s,i){this.storage=e,this.github=t,this.runtime=n,this.releaseManager=a,this.deploymentHealingManager=i,this.scheduleBackgroundJob=s,this.clock=n.now??(()=>new Date)}now(){return this.clock()}getActiveRunCount(){return this.inProgress.size}async waitForIdle(e=12e4){let t=Date.now();for(;this.inProgress.size>0;){if(Date.now()-t>=e)return!1;await Ri(100)}return!0}async runQueuedBabysitPR(e,t){let n=(await this.storage.listAgentRuns({status:"running",prId:e})).slice().sort((s,i)=>Date.parse(i.updatedAt)-Date.parse(s.updatedAt))[0];if(!n){await this.babysitPR(e,t,{allowDuringDrain:!0});return}if(!!!(n.prompt&&n.resolvedAgent&&n.initialHeadSha)){let s=new Date().toISOString();await this.storage.upsertAgentRun({...n,status:"failed",phase:"run.failed",lastError:"Interrupted run missing replay context",updatedAt:s}),await this.babysitPR(e,t,{allowDuringDrain:!0});return}await this.babysitPR(e,n.preferredAgent,{runId:n.id,recoveryMode:!0,forceAgentPrompt:n.prompt,forceResolvedAgent:n.resolvedAgent,replayInitialHeadSha:n.initialHeadSha,allowDuringDrain:!0})}async resumeInterruptedRuns(){let e=await this.storage.listAgentRuns({status:"running"});if(e.length!==0){if(this.scheduleBackgroundJob){let t=new Set;for(let n of e)t.has(n.prId)||(t.add(n.prId),await this.scheduleBackgroundJob("babysit_pr",n.prId,Ie("babysit_pr",n.prId),{preferredAgent:n.preferredAgent}));return}for(let t of e){if(!!!(t.prompt&&t.resolvedAgent&&t.initialHeadSha)){let a=new Date().toISOString();await this.storage.upsertAgentRun({...t,status:"failed",phase:"run.failed",lastError:"Interrupted run missing replay context",updatedAt:a}),await this.babysitPR(t.prId,t.preferredAgent,{allowDuringDrain:!0});continue}await this.babysitPR(t.prId,t.preferredAgent,{runId:t.id,recoveryMode:!0,forceAgentPrompt:t.prompt,forceResolvedAgent:t.resolvedAgent,replayInitialHeadSha:t.initialHeadSha,allowDuringDrain:!0})}}}async withFeedbackMutationLock(e,t){let n=this.feedbackMutationLocks.get(e)??Promise.resolve(),a,s=new Promise(o=>{a=()=>o()}),i=n.then(()=>s);this.feedbackMutationLocks.set(e,i),await n;try{return await t()}finally{a?.(),this.feedbackMutationLocks.get(e)===i&&this.feedbackMutationLocks.delete(e)}}async retryFeedbackItem(e,t){return this.withFeedbackMutationLock(e,async()=>{let n=await this.storage.getPR(e);if(!n)return{kind:"pr_not_found"};let a=n.feedbackItems.find(c=>c.id===t);if(!a)return{kind:"feedback_not_found"};if(a.status!=="failed"&&a.status!=="warning")return{kind:"feedback_not_retryable"};let s=n.feedbackItems.map(c=>c.id===t?hi(c):c),i=$t(s),o=await this.storage.updatePR(n.id,{feedbackItems:s,accepted:i.accepted,rejected:i.rejected,flagged:i.flagged});if(!o)throw new Error(`Failed to queue retry for feedback item ${t} on PR ${e}`);return{kind:"ok",updated:o}})}async syncFeedbackForPR(e,t){let n=await this.storage.getPR(e);if(!n)throw new Error("PR not found");let a=ke(n.repo);if(!a)throw new Error(`Invalid repository slug: ${n.repo}`);let s={owner:a.owner,repo:a.repo,number:n.number},i=await this.storage.getConfig(),o=await this.github.buildOctokit(i),c=t?.phase??"sync";t?.logStart&&await this.storage.addLog(n.id,"info","Syncing GitHub comments/reviews...",{runId:t.runId??null,phase:c});let p=await this.github.fetchFeedbackItemsForPR(o,s,i),{merged:m,newCount:u}=du(n.feedbackItems,p),g=$t(m),P=await this.storage.updatePR(n.id,{title:n.title,status:n.status,lastChecked:new Date().toISOString(),feedbackItems:m,accepted:g.accepted,rejected:g.rejected,flagged:g.flagged});if(!P)throw new Error("Failed to update PR after feedback sync");return await this.storage.addLog(n.id,"info",uu(p.length,u),{runId:t?.runId??null,phase:c,metadata:{total:p.length,newCount:u}}),P}async syncAndBabysitTrackedRepos(){if((await this.storage.getRuntimeState()).drainMode)return;let t=[...await this.storage.getPRs(),...await this.storage.getArchivedPRs()].filter(lu);for(let p of t)try{await this.syncFeedbackForPR(p.id,{phase:"repair"})}catch(m){await this.storage.addLog(p.id,"warn",`Could not repair missing GitHub review-thread metadata: ${ve(m)}`,{phase:"repair"})}let n=await this.storage.getConfig(),a=await this.github.buildOctokit(n),s=await this.storage.getPRs(),i=new Set([...s.map(p=>p.repo),...n.watchedRepos]),o=Array.from(i).map(p=>ke(p)).filter(p=>!!p),c=[];for(let p of o){let m=Rt(p),u;try{u=await this.github.listOpenPullsForRepo(a,p)}catch(w){console.error(`Failed to list open PRs for ${m}`,w);continue}let g=new Set(u.map(w=>w.number)),P=s.filter(w=>w.repo===m),A=!1;for(let w of P)if(!g.has(w.number)&&w.status!=="archived"){let k;if(this.github.fetchPullCloseState)try{k=await this.github.fetchPullCloseState(a,{owner:p.owner,repo:p.repo,number:w.number})}catch(X){await this.storage.addLog(w.id,"warn",`Could not confirm merge state before archival: ${ve(X)}`,{phase:"watcher"})}if(await this.storage.updatePR(w.id,{status:"archived"}),await this.storage.addLog(w.id,"info",`PR #${w.number} is no longer open on GitHub \u2014 archived`,{phase:"watcher"}),k?.merged&&this.releaseManager&&n.autoCreateReleases){let X=k.baseRef.trim(),M=k.mergeCommitSha||k.headSha,E=k.mergedAt||k.closedAt;if(!X||!M||!E){let N=[X?null:"a base branch",M?null:"a commit SHA",E?null:"a merge timestamp"].filter(H=>!!H);await this.storage.addLog(w.id,"warn",`PR #${w.number} was merged, but release evaluation was not queued because GitHub did not return ${N.join(" and ")}.`,{phase:"watcher",metadata:{baseBranch:X,headSha:k.headSha,mergeCommitSha:k.mergeCommitSha,mergedAt:k.mergedAt,closedAt:k.closedAt}})}else try{await this.releaseManager.enqueueMergedPullReleaseEvaluation({repo:m,baseBranch:X,triggerPrNumber:k.number,triggerPrTitle:k.title,triggerPrUrl:k.url,triggerMergeSha:M,triggerMergedAt:E}),await this.storage.addLog(w.id,"info",`PR #${w.number} was merged \u2014 queued release evaluation`,{phase:"watcher",metadata:{baseBranch:X,triggerMergeSha:M}})}catch(N){await this.storage.addLog(w.id,"warn",`PR #${w.number} was merged, but release evaluation could not be queued: ${ve(N)}`,{phase:"watcher"})}}else k&&!k.merged&&await this.storage.addLog(w.id,"info",`PR #${w.number} closed without merge`,{phase:"watcher"});if(k?.merged&&this.deploymentHealingManager&&this.scheduleBackgroundJob&&n.autoHealDeployments){let X=k.baseRef.trim(),M=k.mergeCommitSha||k.headSha;if(X&&M)try{let E=await this.github.resolveGitHubAuthToken(n),N=Tr(m,E),{repoCacheDir:H}=await Nr({repoFullName:m,repoCloneUrl:N,runCommand:this.runtime.runCommand}),d=await di(H);d&&(await this.scheduleBackgroundJob("heal_deployment",`${m}:${M}`,Ie("heal_deployment",`${m}:${M}`),{repo:m,platform:d.platform,mergeSha:M,triggerPrNumber:w.number,triggerPrTitle:w.title,triggerPrUrl:w.url,baseBranch:X}),await this.storage.addLog(w.id,"info",`PR #${w.number} merged \u2014 queued deployment healing (${d.platform})`,{phase:"watcher",metadata:{platform:d.platform,mergeSha:M}}))}catch(E){await this.storage.addLog(w.id,"warn",`Failed to queue deployment healing: ${ve(E)}`,{phase:"watcher"})}}A=!0}A&&c.push(p);for(let w of u){let k=await this.storage.getPRByRepoAndNumber(m,w.number);k||(k=await this.storage.addPR({number:w.number,title:w.title,repo:m,branch:w.branch,author:w.author,url:w.url,status:"watching",feedbackItems:[],accepted:0,rejected:0,flagged:0,testsPassed:null,lintPassed:null,lastChecked:null}),await this.storage.addLog(k.id,"info",`Auto-registered open PR #${w.number} from ${m}`)),k.watchEnabled&&(await this.storage.addLog(k.id,"info","Watcher queued autonomous babysitter run",{phase:"watcher",metadata:{repo:m}}),this.scheduleBackgroundJob?await this.scheduleBackgroundJob("babysit_pr",k.id,Ie("babysit_pr",k.id),{preferredAgent:n.codingAgent}):await this.babysitPR(k.id,n.codingAgent))}}c.length>0&&this.github.listMergedPullsToday&&await this.maybeTriggerSocialChangelog(a,c,n.codingAgent)}async maybeTriggerSocialChangelog(e,t,n){if(!this.github.listMergedPullsToday)return;let a=new Date().toISOString().slice(0,10),s=5,i=[];for(let u of t)try{let g=await this.github.listMergedPullsToday(e,u);i.push(...g)}catch(g){let P=g instanceof Error?g.message:String(g);console.error(`social-changelog: failed to list merged PRs for ${Rt(u)}: ${P}`,g)}let o=i.length;if(o===0||o%s!==0||await this.storage.getSocialChangelogForDateAndCount(a,o))return;let p=i.map(u=>({number:u.number,title:u.title,url:u.url,author:u.author,repo:u.repo})),m=await this.storage.createSocialChangelog({date:a,triggerCount:o,prSummaries:p,content:null,status:"generating",error:null,completedAt:null});if(console.log(`social-changelog: ${o} PRs merged today \u2014 generating social post (id=${m.id})`),this.scheduleBackgroundJob){try{await this.scheduleBackgroundJob("generate_social_changelog",m.id,Ie("generate_social_changelog",m.id))}catch(u){let g=u instanceof Error?u.message:String(u);console.error(`social-changelog: failed to enqueue post for id=${m.id}: ${g}`,u),await this.storage.updateSocialChangelog(m.id,{status:"error",error:g.trim().slice(0,2e3),completedAt:new Date().toISOString()})}return}Hr({storage:this.storage,changelogId:m.id,prSummaries:p,date:a,preferredAgent:n}).catch(u=>{let g=u instanceof Error?u.message:String(u);console.error(`social-changelog: failed to generate post for id=${m.id}: ${g}`,u)})}async pollForCICompletion(e,t,n,a,s,i){let c=this.runtime.ciPollIntervalMs??3e4;for(let p=1;p<=10;p++){await Ri(c);try{let m=await this.github.checkCISettled(e,t,a),u=await this.github.listFailingStatuses(e,t,a);if(await i(s,"info",`CI poll attempt ${p}/10: ${u.length} failure(s), settled=${m}`,{phase:"verify.ci",metadata:{attempt:p,failures:u.length,settled:m}}),m)return u.length>0?{status:"failure",failures:u}:{status:"success",failures:[]}}catch(m){await i(s,"warn",`CI poll attempt ${p} failed: ${ve(m)}`,{phase:"verify.ci",metadata:{attempt:p}})}}try{let p=await this.github.listFailingStatuses(e,t,a);if(p.length>0)return{status:"failure",failures:p}}catch(p){await i(s,"warn",`Final CI status check after timeout failed: ${ve(p)}`,{phase:"verify.ci"})}return{status:"timeout",failures:[]}}async babysitPR(e,t,n){if((await this.storage.getRuntimeState()).drainMode&&!n?.allowDuringDrain){let d=await this.storage.getPR(e);d&&await this.storage.addLog(d.id,"warn","Babysitter run skipped because drain mode is enabled",{phase:"run"});return}if(this.inProgress.has(e)){let d=await this.storage.getPR(e);d&&await this.storage.addLog(d.id,"warn","Babysitter run skipped because another run is already in progress",{phase:"run"});return}this.inProgress.add(e);let s=n?.runId||ru(),i=Math.floor(Date.now()/1e3)*1e3-1e3,o=Promise.resolve(),c=new Date().toISOString(),p=await this.storage.getAgentRun(s)||{id:s,prId:e,preferredAgent:t,resolvedAgent:n?.forceResolvedAgent??null,status:"running",phase:"run.started",prompt:n?.forceAgentPrompt??null,initialHeadSha:n?.replayInitialHeadSha??null,metadata:{recoveryMode:!!n?.recoveryMode},lastError:null,createdAt:c,updatedAt:c};await this.storage.upsertAgentRun(p);let m=async d=>{p={...p,...d,updatedAt:new Date().toISOString()},await this.storage.upsertAgentRun(p)},u=(d,y,h,S)=>(o=o.then(async()=>{await this.storage.addLog(d,y,h,{runId:s,phase:S?.phase??null,metadata:S?.metadata??null})}).catch(_=>{console.error("Babysitter log write failed",_)}),o),g=async(d,y,h,S)=>{await u(d,"warn",h,{phase:y,metadata:S??null})},P=(d,y,h,S)=>{let _="";return{onChunk:v=>{let b=Iu(_,v);_=b.buffer;for(let B of b.lines){let G=B.trim();G&&u(d,S,`[${h}] ${G}`,{phase:y,metadata:{stream:h}})}},flush:async()=>{let v=_.trim();v&&(_="",await u(d,S,`[${h}] ${v}`,{phase:y,metadata:{stream:h}}))}}},A=async d=>{let{currentPrId:y,command:h,args:S,cwd:_,timeoutMs:v,phase:b,successMessage:B}=d;await u(y,"info",`Running ${Mr(h,S)}`,{phase:b});let G=P(y,b,"stdout","info"),Z=P(y,b,"stderr","warn"),Q=await this.runtime.runCommand(h,S,{cwd:_,timeoutMs:v,onStdoutChunk:G.onChunk,onStderrChunk:Z.onChunk});return await G.flush(),await Z.flush(),Q.code===0?await u(y,"info",B,{phase:b,metadata:{command:Mr(h,S),code:Q.code}}):await u(y,"error",`${Mr(h,S)} failed (${Q.code})`,{phase:b,metadata:{command:Mr(h,S),code:Q.code,summary:Ut(Q)}}),Q},w=[],k=n?.forceAgentPrompt??null,X=n?.forceResolvedAgent??null,M=n?.replayInitialHeadSha??null,E=!!n?.recoveryMode,N=!1,H=!1;try{await m({status:"running",phase:"run.started",metadata:{...p.metadata??{},recoveryMode:E},lastError:null}),await this.storage.updatePR(e,{status:"processing",lastChecked:new Date().toISOString()}),await u(e,"info",`Babysitter run started using preferred agent ${t}${E?" (recovery)":""}`,{phase:"run",metadata:{preferredAgent:t,recoveryMode:E}}),await m({phase:"run.sync"});let d=await this.syncFeedbackForPR(e,{runId:s,logStart:!0,phase:"sync"}),y=await this.storage.getConfig(),h=X||await this.runtime.resolveAgent(t);await m({resolvedAgent:h});let S=ke(d.repo);if(!S)throw new Error(`Invalid repository slug: ${d.repo}`);await u(d.id,"info",`Resolved coding agent to ${h}`,{phase:"run"});let _=await this.github.buildOctokit(y),v={owner:S.owner,repo:S.repo,number:d.number},b=await this.github.fetchPullSummary(_,v);k&&M&&b.headSha!==M&&(N=!0,await u(d.id,"warn",`Skipping forced prompt replay because PR head moved (${M.slice(0,7)} -> ${b.headSha.slice(0,7)})`,{phase:"run.replay",metadata:{replayInitialHeadSha:M,currentHeadSha:b.headSha}}));let B=await this.github.listFailingStatuses(_,S,b.headSha),G=this.now().toISOString(),Q=(this.github.fetchCheckSnapshotsForRef?await this.github.fetchCheckSnapshotsForRef(_,S,d.id,b.headSha):B.map(f=>({id:`${f.context}:${f.description}:${b.headSha}`,prId:d.id,sha:b.headSha,provider:"github.commit_status",context:f.context,status:"failure",conclusion:null,description:f.description,targetUrl:f.targetUrl,observedAt:G}))).filter(f=>$n(f)),ar=Gn(Q),sr=ar.filter(f=>f.classification==="healable_in_branch"),Jr=ar.filter(f=>f.classification==="blocked_external"),oe=new xr(this.storage,()=>this.now()),L=null;if(Q.length>0)L=await oe.ensureSessionForHead({prId:d.id,repo:d.repo,prNumber:d.number,headSha:b.headSha}),await bi(this.storage,Q),await _i(this.storage,L.id,b.headSha,ar),Jr.length>0?L=await oe.markBlocked(L.id,Jr[0]?.summary??"CI failure classified as blocked_external",{latestFingerprint:Jr[0]?.fingerprint??null,currentHeadSha:b.headSha}):sr.length>0?L=await oe.markAwaitingRepairSlot(L.id,{latestFingerprint:sr[0]?.fingerprint??null,currentHeadSha:b.headSha}):L=await oe.markEscalated(L.id,"CI failure could not be classified as healable in branch",{latestFingerprint:ar[0]?.fingerprint??null,currentHeadSha:b.headSha});else{let f=await oe.getSessionByPrAndHead(d.id,b.headSha);f&&["triaging","awaiting_repair_slot","repairing","awaiting_ci","verifying","cooldown"].includes(f.state)?(L=await oe.markVerifying(f.id,{currentHeadSha:b.headSha}),L=await oe.markHealed(L.id,{currentHeadSha:b.headSha,lastImprovementScore:L.lastImprovementScore??0})):L=f??null}let ra=new Map,ir=async(f,j)=>{let I=ra.get(f);if(I)try{let K=Cu(I.body,j);await this.github.updateStatusReply(_,v,I,K)}catch(K){await g(d.id,"github.status",`Failed to update status reply for ${f}: ${ve(K)}`,{feedbackId:f})}},na=async(f,j)=>{try{await this.github.postPRComment(_,v,Au(f,j))}catch(I){await g(d.id,"github.agent-command",`Failed to post agent command comment: ${ve(I)}`)}},aa=d.feedbackItems.filter(f=>f.status==="pending");await u(d.id,"info",`Evaluating ${aa.length} pending feedback item(s)`,{phase:"evaluate.comments"});let Bt=new Map;for(let f of aa){if(await u(d.id,"info",`Inspecting feedback from ${f.author}`,{phase:"evaluate.comments",metadata:{feedbackId:f.id,file:f.file,line:f.line}}),xu(f.body)){Bt.set(f.id,St(f,!1,"CodeFactory-authored agent command comment; no code change required")),await u(d.id,"info",`Ignored self-authored agent command comment ${f.id}`,{phase:"evaluate.comments",metadata:{feedbackId:f.id,decision:"reject"}});continue}if(wu(f,d.feedbackItems)){Bt.set(f.id,St(f,!1,"Automation audit trail follow-up; no code change required")),await u(d.id,"info",`Ignored audit-trail follow-up comment ${f.id}`,{phase:"evaluate.comments",metadata:{feedbackId:f.id,decision:"reject"}});continue}let j=cu({pr:d,item:f});await u(d.id,"info",`Evaluating feedback ${f.id} with ${h}`,{phase:"evaluate.comments",metadata:{feedbackId:f.id,agent:h,prompt:j}});let I=await this.runtime.evaluateFixNecessityWithAgent({agent:h,cwd:process.cwd(),prompt:j}),K=St(f,I.needsFix,I.reason);if(Bt.set(f.id,K),I.needsFix){await u(d.id,"info",`Accepted feedback ${f.id}: ${I.reason}`,{phase:"evaluate.comments",metadata:{feedbackId:f.id,decision:"accept"}});try{await this.github.addReactionToComment(_,v,f,"eyes")}catch(J){await g(d.id,"github.reaction",`Failed to add reaction for ${f.id}: ${ve(J)}`,{feedbackId:f.id})}try{let J=await this.github.postStatusReplyForFeedbackItem(_,v,f,nr.accepted);J&&ra.set(f.id,J)}catch(J){await g(d.id,"github.status",`Failed to post status reply for ${f.id}: ${ve(J)}`,{feedbackId:f.id})}}else await u(d.id,"info",`Rejected feedback ${f.id}: ${I.reason}`,{phase:"evaluate.comments",metadata:{feedbackId:f.id,decision:"reject"}})}let tt=[];if(y.autoHealCI&&L)await u(d.id,"info",`Skipping legacy status-task evaluation because CI healing session ${L.id} is active`,{phase:"evaluate.status",metadata:{healingSessionId:L.id,healingState:L.state}});else{await u(d.id,"info",`Evaluating ${B.length} failing status check(s)`,{phase:"evaluate.status"});for(let f of B){let j=gu({pr:d,context:f.context,description:f.description,targetUrl:f.targetUrl});await u(d.id,"info",`Evaluating failing status ${f.context} with ${h}`,{phase:"evaluate.status",metadata:{context:f.context,agent:h,prompt:j}});let I=await this.runtime.evaluateFixNecessityWithAgent({agent:h,cwd:process.cwd(),prompt:j});I.needsFix?(tt.push(f),await u(d.id,"info",`Accepted failing status ${f.context}: ${I.reason}`,{phase:"evaluate.status",metadata:{context:f.context,decision:"accept"}})):await u(d.id,"info",`Rejected failing status ${f.context}: ${I.reason}`,{phase:"evaluate.status",metadata:{context:f.context,decision:"reject"}})}}if(Bt.size>0){let f=d.feedbackItems.map(K=>Bt.get(K.id)??K),j=$t(f),I=await this.storage.updatePR(d.id,{feedbackItems:f,accepted:j.accepted,rejected:j.rejected,flagged:j.flagged});I&&(d=I)}let Li=d.feedbackItems.filter(f=>f.status==="queued"&&f.decision==="accept"),sa=k?d.feedbackItems.filter(f=>(f.status==="queued"||f.status==="in_progress")&&f.decision==="accept"):[],Ne=sa.length>0?sa:Li;w=vu(d);let ia=b.mergeable===!1,Ue=ia&&y.autoResolveMergeConflicts;ia&&!y.autoResolveMergeConflicts&&await u(d.id,"warn",`PR #${d.number} has merge conflicts but auto-resolve is disabled in settings`,{phase:"conflict",metadata:{baseRef:b.baseRef,mergeable:b.mergeable}});let kt=!!(k&&!N),Xr=!!(k&&N),oa=!Xr&&(Ne.length>0||tt.length>0||kt),jt=wi(d,b.headSha),vt=!Xr&&!kt&&mu(d,b.headSha,y.autoUpdateDocs),or=y.autoUpdateDocs&&jt?.status==="needed"?jt.summary:null,De=!!or,da=oa||Ue||vt||De,la=!!(y.autoHealCI&&L&&L.state==="awaiting_repair_slot"&&!Xr&&!oa&&!Ue&&!vt&&!De);if(y.autoUpdateDocs&&jt&&!vt&&await u(d.id,"info",`Documentation assessment already recorded for ${b.headSha.slice(0,7)} (${jt.status})`,{phase:"evaluate.docs",metadata:{headSha:b.headSha,status:jt.status}}),!da&&!la&&w.length===0&&!Ue&&Q.length===0){await u(d.id,"info",`Babysitter checked PR #${d.number}; no necessary fixes identified`,{phase:"run"}),await this.storage.updatePR(d.id,{status:"watching",lastChecked:new Date().toISOString()}),await m({status:"completed",phase:"run.completed",lastError:null});return}let V=b.headSha;H=!1;let dr=null,Gr=new Map,Te=null,qr=!1,Jt=null,W=null;if(Ue&&await u(d.id,"info",`PR #${d.number} has merge conflicts with base branch ${b.baseRef}`,{phase:"conflict",metadata:{baseRef:b.baseRef,mergeable:b.mergeable}}),da||Ue){await u(d.id,"info",`Babysitter preparing fix run with ${Ne.length} comment task(s), ${tt.length} status task(s), ${De?1:0} documentation task(s), and ${w.length} GitHub follow-up task(s)${vt?", with documentation assessment":""}${Ue?", plus merge conflict resolution":""}${kt?", with forced prompt replay":""} using ${h}`,{phase:"run",metadata:{commentTasks:Ne.length,statusTasks:tt.length,docsTasks:De?1:0,docsAssessmentNeeded:vt,followUpTasks:w.length,hasConflicts:Ue,shouldRunForcedReplay:kt,agent:h}});let f=Ae();await u(d.id,"info",`Preparing worktree in ${f.rootDir}`,{phase:"worktree"});let{repoCacheDir:j,worktreePath:I,healed:K,remoteName:J}=await Dr({rootDir:f.rootDir,repoFullName:b.repoFullName,repoCloneUrl:b.repoCloneUrl,headRepoFullName:b.headRepoFullName,headRepoCloneUrl:b.headRepoCloneUrl,headRef:b.headRef,prNumber:d.number,runId:s,runCommand:this.runtime.runCommand});dr=J;try{if(await u(d.id,"info",`Worktree ready at ${I}`,{phase:"worktree",metadata:{remoteName:J,healed:K}}),K&&await u(d.id,"info","Repo cache required auto-heal before the worktree was created",{phase:"worktree",metadata:{repoCacheDir:j}}),await u(d.id,"info",`Prepared PR head from remote ${J}`,{phase:"worktree",metadata:{remoteName:J,headRef:b.headRef}}),await u(d.id,"info","Ensuring git identity",{phase:"git.identity"}),await Nu(I,this.runtime.runCommand),await u(d.id,"info","Git identity ready",{phase:"git.identity"}),vt){await u(d.id,"info","Documentation assessment started",{phase:"evaluate.docs",metadata:{headSha:b.headSha}});try{let de=await A({currentPrId:d.id,command:"git",args:["fetch","origin",b.baseRef],cwd:I,timeoutMs:12e4,phase:"evaluate.docs",successMessage:`Fetched origin/${b.baseRef} for docs assessment`});if(de.code!==0)throw new Error(`Failed to fetch origin/${b.baseRef} for docs assessment: ${Ut(de)}`);let ne=await A({currentPrId:d.id,command:"git",args:["diff","--name-only",`origin/${b.baseRef}...HEAD`],cwd:I,timeoutMs:1e4,phase:"evaluate.docs",successMessage:"Collected changed files for docs assessment"});if(ne.code!==0)throw new Error(`Failed to collect changed files for docs assessment: ${Ut(ne)}`);let Y=await A({currentPrId:d.id,command:"git",args:["diff","--stat",`origin/${b.baseRef}...HEAD`],cwd:I,timeoutMs:1e4,phase:"evaluate.docs",successMessage:"Collected diff stat for docs assessment"});if(Y.code!==0)throw new Error(`Failed to collect diff stat for docs assessment: ${Ut(Y)}`);let ae=await A({currentPrId:d.id,command:"git",args:["diff","--no-color","--unified=0",`origin/${b.baseRef}...HEAD`],cwd:I,timeoutMs:1e4,phase:"evaluate.docs",successMessage:"Collected diff preview for docs assessment"});if(ae.code!==0)throw new Error(`Failed to collect diff preview for docs assessment: ${Ut(ae)}`);let se=pu({pr:d,pullSummary:b,changedFiles:ne.stdout.trim(),diffStat:Y.stdout.trim(),diffPreview:ae.stdout.trim()});await u(d.id,"info",`Evaluating documentation needs with ${h}`,{phase:"evaluate.docs",metadata:{agent:h,prompt:se}});let pe=await this.runtime.evaluateFixNecessityWithAgent({agent:h,cwd:I,prompt:se}),fe={headSha:b.headSha,status:pe.needsFix?"needed":"not_needed",summary:pe.reason,assessedAt:new Date().toISOString()},Fe=await this.storage.updatePR(d.id,{docsAssessment:fe});Fe&&(d=Fe),De=pe.needsFix,or=pe.needsFix?pe.reason:null,await u(d.id,"info",pe.needsFix?`Documentation updates required: ${pe.reason}`:`Documentation updates not required: ${pe.reason}`,{phase:"evaluate.docs",metadata:{decision:pe.needsFix?"needed":"not_needed",headSha:b.headSha}})}catch(de){let ne=ve(de),Y={headSha:b.headSha,status:"failed",summary:ne,assessedAt:new Date().toISOString()},ae=await this.storage.updatePR(d.id,{docsAssessment:Y});ae&&(d=ae),De=!1,or=null,await u(d.id,"warn",`Documentation assessment failed: ${ne}`,{phase:"evaluate.docs",metadata:{headSha:b.headSha}})}}if(Ue){await u(d.id,"info",`Fetching base branch origin/${b.baseRef} for merge`,{phase:"conflict"});let de=await A({currentPrId:d.id,command:"git",args:["fetch","origin",b.baseRef],cwd:I,timeoutMs:12e4,phase:"conflict",successMessage:`Fetched origin/${b.baseRef}`});if(de.code!==0)throw new Error(`Failed to fetch base branch origin/${b.baseRef}: ${Ut(de)}`);await u(d.id,"info",`Attempting merge of origin/${b.baseRef} into ${b.headRef}`,{phase:"conflict"});let ne=await this.runtime.runCommand("git",["merge","FETCH_HEAD","--no-edit"],{cwd:I,timeoutMs:6e4});if(ne.code!==0){await u(d.id,"info","Merge produced conflicts; invoking agent to resolve them",{phase:"conflict"});let ae=(await this.runtime.runCommand("git",["diff","--name-only","--diff-filter=U"],{cwd:I,timeoutMs:1e4})).stdout.trim().split(`
849
- `).filter(Oi=>Oi.trim().length>0);if(ae.length===0)throw new Error(`Merge failed but no conflict files detected: ${ne.stderr||ne.stdout}`);await u(d.id,"info",`Found ${ae.length} file(s) with merge conflicts`,{phase:"conflict",metadata:{conflictFiles:ae}});let se=P(d.id,"conflict.agent","stdout","info"),pe=P(d.id,"conflict.agent","stderr","warn"),fe=await this.github.resolveGitHubAuthToken(y),Fe=fe?{...process.env,GITHUB_TOKEN:fe,GH_TOKEN:fe}:void 0,Kr=hu({pr:d,pullSummary:b,remoteName:J,conflictFiles:ae});await u(d.id,"info",`Launching ${h} to resolve merge conflicts`,{phase:"conflict.agent",metadata:{agent:h,prompt:Kr}}),await na(h,Kr);let Xt=await this.runtime.applyFixesWithAgent({agent:h,cwd:I,prompt:Kr,env:Fe,onStdoutChunk:se.onChunk,onStderrChunk:pe.onChunk});if(await se.flush(),await pe.flush(),Xt.code!==0)throw new Error(`Agent failed to resolve merge conflicts (${Xt.code}): ${Xt.stderr||Xt.stdout}`);await u(d.id,"info","Agent completed merge conflict resolution",{phase:"conflict.agent",metadata:{code:Xt.code}});let ga=await this.runtime.runCommand("git",["status","--porcelain"],{cwd:I,timeoutMs:5e3});if(ga.stdout.trim())throw new Error(`Agent left uncommitted changes after conflict resolution: ${ga.stdout.trim()}`);await u(d.id,"info","Merge conflicts resolved and committed",{phase:"conflict"})}else{await u(d.id,"info","Merge completed without conflicts (GitHub mergeability may have been stale)",{phase:"conflict"});let Y=await A({currentPrId:d.id,command:"git",args:["push",J,`HEAD:${b.headRef}`],cwd:I,timeoutMs:12e4,phase:"conflict",successMessage:`Pushed merge result to ${J}/${b.headRef}`});if(Y.code!==0)throw new Error(`git push ${J} HEAD:${b.headRef} failed: ${Y.stderr||Y.stdout}`)}}if(Ne.length>0){let de=new Set(Ne.map(se=>se.id)),ne=d.feedbackItems.map(se=>de.has(se.id)?gi(se):se),Y=$t(ne),ae=await this.storage.updatePR(d.id,{feedbackItems:ne,accepted:Y.accepted,rejected:Y.rejected,flagged:Y.flagged});ae&&(d=ae)}if(kt||Ne.length>0||tt.length>0||De){let de=P(d.id,"agent","stdout","info"),ne=P(d.id,"agent","stderr","warn"),Y=await this.github.resolveGitHubAuthToken(y),ae=Y?{...process.env,GITHUB_TOKEN:Y,GH_TOKEN:Y}:void 0,se=kt&&k?k:fu({pr:d,pullSummary:b,remoteName:J,commentTasks:Ne,statusTasks:tt,docsTaskSummary:or});await m({phase:"run.prompt-prepared",prompt:se,initialHeadSha:M||b.headSha}),await u(d.id,"info",`Launching ${h} in autonomous mode`,{phase:"agent",metadata:{githubAuth:!!Y,prompt:se}}),await m({phase:"run.agent-running"}),await na(h,se);let pe=nr.agentRunning(h);await Promise.all(Ne.map(Fe=>ir(Fe.id,pe)));let fe=await this.runtime.applyFixesWithAgent({agent:h,cwd:I,prompt:se,env:ae,onStdoutChunk:de.onChunk,onStderrChunk:ne.onChunk});if(await de.flush(),await ne.flush(),fe.code!==0)throw await Promise.all(Ne.map(Fe=>ir(Fe.id,nr.agentFailed))),new Error(`Agent apply failed (${fe.code}): ${fe.stderr||fe.stdout}`);await Promise.all(Ne.map(Fe=>ir(Fe.id,nr.agentCompleted))),Gr=_u(fe.stdout),Te=Ru(fe.stdout),await u(d.id,"info",`${h} completed successfully`,{phase:"agent",metadata:{code:fe.code,extractedSummaries:Gr.size,docsTaskOutcome:Te?.outcome??null}}),await m({phase:"run.agent-finished"})}let ce=await A({currentPrId:d.id,command:"git",args:["status","--porcelain"],cwd:I,timeoutMs:5e3,phase:"verify.git.status",successMessage:"Collected worktree git status"});if(ce.code!==0)throw new Error(`git status failed: ${ce.stderr||ce.stdout}`);if(ce.stdout.trim())throw new Error(`Agent left uncommitted changes in the worktree: ${ce.stdout.trim()}`);await u(d.id,"info","Worktree is clean after agent run",{phase:"verify.git.status"});let ge=await A({currentPrId:d.id,command:"git",args:["rev-parse","HEAD"],cwd:I,timeoutMs:5e3,phase:"verify.git.local-head",successMessage:"Collected worktree HEAD"});if(ge.code!==0)throw new Error(`git rev-parse HEAD failed: ${ge.stderr||ge.stdout}`);let Pe=await A({currentPrId:d.id,command:"git",args:["-C",j,"fetch",J,b.headRef],timeoutMs:12e4,phase:"verify.git.fetch-head",successMessage:`Fetched ${J}/${b.headRef} for verification`});if(Pe.code!==0)throw new Error(`git fetch ${J} ${b.headRef} failed: ${Pe.stderr||Pe.stdout}`);let lr=await A({currentPrId:d.id,command:"git",args:["-C",j,"rev-parse","FETCH_HEAD"],timeoutMs:5e3,phase:"verify.git.remote-head",successMessage:"Collected remote PR head SHA"});if(lr.code!==0)throw new Error(`git rev-parse FETCH_HEAD failed: ${lr.stderr||lr.stdout}`);let ur=ge.stdout.trim(),Wr=lr.stdout.trim();H=Wr!==b.headSha;let ca=ur!==b.headSha;if(ca&&Wr!==ur)throw new Error("Babysitter created a local commit but did not push it to the PR head branch");if(tt.length>0&&!H)throw new Error("Agent did not update the PR head branch for accepted failing status tasks");if(De&&!Te)throw new Error("Agent did not report documentation task outcome");if(De&&!H&&Te?.outcome!=="no_change")throw new Error("Agent did not update the PR head branch for required documentation tasks");if(Ue&&!H)throw new Error("Agent did not push conflict resolution to the PR head branch");if(De&&Te?.outcome==="no_change"){let de=await this.storage.updatePR(d.id,{docsAssessment:{headSha:b.headSha,status:"not_needed",summary:Te.summary,assessedAt:new Date().toISOString()}});de&&(d=de)}V=ur,await u(d.id,"info","Verified git branch state after agent run",{phase:"verify.git",metadata:{initialHeadSha:b.headSha,localHeadSha:ur,remoteHeadSha:Wr,branchMoved:H,localCommitCreated:ca,remoteName:J,docsTaskOutcome:Te?.outcome??null}}),Te&&await u(d.id,"info",`Documentation task outcome: ${Te.outcome} - ${Te.summary}`,{phase:"verify.docs",metadata:{outcome:Te.outcome,branchMoved:H}})}finally{try{await u(d.id,"info","Cleaning up worktree",{phase:"cleanup"}),await Fr({repoCacheDir:j,worktreePath:I,runCommand:this.runtime.runCommand}),await u(d.id,"info","Worktree cleanup complete",{phase:"cleanup"})}catch(ce){let ge=ce instanceof Error?ce.message:String(ce);await u(d.id,"error",`Worktree cleanup failed: ${ge}`,{phase:"cleanup"})}}}else await u(d.id,"info",`Babysitter found ${w.length} accepted feedback item(s) awaiting GitHub follow-up`,{phase:"run",metadata:{followUpTasks:w.length,agent:h}});if(la&&L){let f=sr.map(J=>J.fingerprint);await u(d.id,"info",`Launching dedicated CI healing attempt for ${f.length} fingerprint(s)`,{phase:"healing.run",metadata:{healingSessionId:L.id,targetFingerprints:f}}),L=await oe.markRepairing(L.id,{currentHeadSha:b.headSha,latestFingerprint:f[0]??L.latestFingerprint});let j=await this.github.resolveGitHubAuthToken(y),I=j?{...process.env,GITHUB_TOKEN:j,GH_TOKEN:j}:void 0;if(W=await this.runtime.runCIHealingRepairAttempt?.({prNumber:d.number,repoFullName:b.repoFullName,repoCloneUrl:b.repoCloneUrl,headRepoFullName:b.headRepoFullName,headRepoCloneUrl:b.headRepoCloneUrl,headRef:b.headRef,baseRef:b.baseRef,headSha:b.headSha,title:b.title,url:b.url,author:b.author,branch:d.branch,agent:h,failures:sr,runId:`${s}-ci-healing`,rootDir:Ae().rootDir,env:I})??null,!W)throw new Error("CI healing runtime is unavailable");Jt=(await this.storage.createHealingAttempt({sessionId:L.id,attemptNumber:L.attemptCount,inputSha:b.headSha,outputSha:W.accepted?W.verification.remoteHeadSha:null,status:W.accepted?"awaiting_ci":"failed",endedAt:W.accepted?null:new Date().toISOString(),agent:h,promptDigest:W.promptDigest,targetFingerprints:W.targetFingerprints,summary:W.summary,improvementScore:null,error:W.rejectionReason})).id,qr=!0,W.accepted?(L=await oe.markAwaitingCi(L.id,{currentHeadSha:W.verification.remoteHeadSha,latestFingerprint:W.targetFingerprints[0]??L.latestFingerprint}),H=W.verification.pushedNewSha,V=W.verification.remoteHeadSha,dr=W.remoteName):L=await oe.markEscalated(L.id,W.rejectionReason??"CI healing attempt failed",{currentHeadSha:b.headSha,latestFingerprint:W.targetFingerprints[0]??L.latestFingerprint})}await m({phase:"run.reconcile"});for(let f of w){let j=!Yn(f,d.feedbackItems),I=rr(Or(f));if(j){await u(d.id,"info",`Posting GitHub follow-up for ${f.id}${I?" and resolving conversation":""}`,{phase:"github.followup",metadata:{feedbackId:f.id,replyKind:f.replyKind,resolve:I}});let K=Pu(V,f,Gr.get(f.auditToken));await this.github.postFollowUpForFeedbackItem(_,v,f,K,{resolve:I})}else if(I){if(!f.threadId){await u(d.id,"warn",`Cannot resolve review thread for ${f.id}: thread ID unavailable (skipping)`,{phase:"github.followup",metadata:{feedbackId:f.id}});continue}await this.github.resolveReviewThread(_,v,f.threadId)}await u(d.id,"info",`GitHub follow-up complete for ${f.id}`,{phase:"github.followup",metadata:{feedbackId:f.id,replyKind:f.replyKind,posted:j,resolved:I}}),await ir(f.id,nr.resolved(V))}d=await this.syncFeedbackForPR(d.id,{runId:s,logStart:!0,phase:"verify.sync"});let ua=Su({pr:d,followUpTasks:w,runStartedAtMs:i});if(ua.length>0)throw new ee(`GitHub audit trail verification failed: ${ua.join("; ")}`,502);if(await u(d.id,"info","GitHub audit trail verified",{phase:"verify.github",metadata:{verifiedComments:w.length,remoteName:dr,branchMoved:H}}),w.length>0){let f=new Set(w.map(J=>J.id)),j=d.feedbackItems.map(J=>f.has(J.id)?Or(J):J),I=$t(j),K=await this.storage.updatePR(d.id,{feedbackItems:j,accepted:I.accepted,rejected:I.rejected,flagged:I.flagged});K&&(d=K)}if(H&&V){await u(d.id,"info","Waiting for CI/CD checks on new commit...",{phase:"verify.ci",metadata:{headSha:V}});let f=await this.pollForCICompletion(_,S,v,V,d.id,u);if(f.status==="failure"){let j=f.failures.map(I=>`${I.context}: ${I.description}`).join("; ");await u(d.id,"warn",`CI/CD still failing after agent fix: ${j}`,{phase:"verify.ci",metadata:{failures:f.failures}});try{let I=["## \u26A0\uFE0F CodeFactory CI Alert","",`The agent pushed changes (commit \`${V.slice(0,7)}\`), but CI/CD checks are still failing:`,"",...f.failures.map(K=>`- **${K.context}**: ${K.description}${K.targetUrl?` ([details](${K.targetUrl}))`:""}`),"","Manual investigation may be required."].join(`
850
- `);await this.github.postPRComment(_,v,I)}catch(I){await g(d.id,"verify.ci",`Failed to post CI failure alert comment: ${ve(I)}`)}if(await this.storage.updatePR(d.id,{testsPassed:!1,lastChecked:new Date().toISOString()}),qr&&W&&Jt&&L){L=await oe.markVerifying(L.id,{currentHeadSha:V});let I=this.now().toISOString(),J=(this.github.fetchCheckSnapshotsForRef?await this.github.fetchCheckSnapshotsForRef(_,S,d.id,V):f.failures.map(Pe=>({id:`${Pe.context}:${Pe.description}:${V}`,prId:d.id,sha:V,provider:"github.commit_status",context:Pe.context,status:"failure",conclusion:null,description:Pe.description,targetUrl:Pe.targetUrl,observedAt:I}))).filter(Pe=>$n(Pe)),ce=Gn(J);await bi(this.storage,J),await _i(this.storage,L.id,V,ce);let ge=Tu(W.targetFingerprints,ce);await this.storage.updateHealingAttempt(Jt,{outputSha:V,status:"verified",endedAt:new Date().toISOString(),improvementScore:ge.improvementScore,error:ge.improvementScore>0?null:`CI failures remained unchanged or worsened after repair: ${j}`}),ge.improvementScore>0?L=await oe.markAwaitingRepairSlot(L.id,{currentHeadSha:V,latestFingerprint:ge.remainingTargetFingerprints[0]??ce[0]?.fingerprint??null,lastImprovementScore:ge.improvementScore}):L=await oe.markEscalated(L.id,`CI failures remained unchanged or worsened after repair: ${j}`,{currentHeadSha:V,latestFingerprint:ge.remainingTargetFingerprints[0]??ce[0]?.fingerprint??null,lastImprovementScore:ge.improvementScore})}}else f.status==="success"?(await u(d.id,"info","All CI/CD checks passed on new commit",{phase:"verify.ci",metadata:{headSha:V}}),await this.storage.updatePR(d.id,{testsPassed:!0,lastChecked:new Date().toISOString()}),qr&&W&&Jt&&L&&(L=await oe.markVerifying(L.id,{currentHeadSha:V}),await this.storage.updateHealingAttempt(Jt,{outputSha:V,status:"verified",endedAt:new Date().toISOString(),improvementScore:Math.max(2,W.targetFingerprints.length*2),error:null}),L=await oe.markHealed(L.id,{currentHeadSha:V,latestFingerprint:null,lastImprovementScore:Math.max(2,W.targetFingerprints.length*2)}))):await u(d.id,"info","CI/CD checks did not complete within polling window; will re-check on next cycle",{phase:"verify.ci",metadata:{headSha:V}})}await this.storage.updatePR(d.id,{status:"watching",lastChecked:new Date().toISOString()}),await u(d.id,"info","Babysitter run complete",{phase:"run",metadata:{remoteName:dr,branchMoved:H}}),await m({status:"completed",phase:"run.completed",lastError:null});return}catch(d){let y=d instanceof Error?d.message:String(d);await m({status:"failed",phase:"run.failed",lastError:y});let h=await this.storage.getPR(e);if(h){let _=d instanceof ee&&H,v=_?"warn":"error",b=_?"Babysitter warning":"Babysitter error";if(await u(h.id,v,`${b}: ${y}`,{phase:"run"}),w.length>0){let B=new Set(w.map(Q=>Q.id)),G=h.feedbackItems.map(Q=>B.has(Q.id)?_?mi(Q,`GitHub comment could not be posted: ${y}`):pi(Q,y):Q),Z=$t(G);await this.storage.updatePR(h.id,{feedbackItems:G,accepted:Z.accepted,rejected:Z.rejected,flagged:Z.flagged,status:_?"watching":"error",lastChecked:new Date().toISOString()})}else await this.storage.updatePR(h.id,{status:_?"watching":"error",lastChecked:new Date().toISOString()})}console.error("Babysitter failure",d)}finally{await o,this.inProgress.delete(e)}}};var Du={buildOctokit:Ce,resolveReviewThread:er};function Fu(r){return{accepted:r.filter(e=>e.decision==="accept").length,rejected:r.filter(e=>e.decision==="reject").length,flagged:r.filter(e=>e.decision==="flag").length}}async function ki(r){let{storage:e,pr:t,feedbackId:n,decision:a,github:s=Du}=r,i=t.feedbackItems.map(p=>p.id===n?ui(p,a):p),o=i.find(p=>p.id===n);if(o?.threadId&&rr(o)){let p=vr(t.url);if(!p)throw new ee(`Invalid PR URL: ${t.url}`,500);let m=await e.getConfig(),u=await s.buildOctokit(m);await s.resolveReviewThread(u,p,o.threadId),i=i.map(g=>g.id===n?li(g):g)}let c=Fu(i);return e.updatePR(t.id,{feedbackItems:i,accepted:c.accepted,rejected:c.rejected,flagged:c.flagged})}import{randomUUID as Hu}from"crypto";var $e=class extends Error{constructor(e){super(e),this.name="CancelBackgroundJobError"}},Ur=class{storage;queue;handlers;handledKinds;workerId;pollIntervalMs;leaseMs;heartbeatIntervalMs;now;onError;activeJobs=new Map;running=!1;polling=!1;pollTimer=null;constructor(e){this.storage=e.storage,this.queue=e.queue,this.handlers=e.handlers,this.handledKinds=Object.keys(e.handlers),this.workerId=e.workerId??Hu(),this.pollIntervalMs=e.pollIntervalMs??1e3,this.leaseMs=e.leaseMs??3e4,this.heartbeatIntervalMs=e.heartbeatIntervalMs??1e4,this.now=e.now??(()=>new Date),this.onError=e.onError??(t=>{console.error("Background job dispatcher error",t)})}async start(){this.running||(this.running=!0,await this.queue.requeueExpired(this.now()),this.wake())}stop(){this.running=!1,this.pollTimer&&(clearTimeout(this.pollTimer),this.pollTimer=null)}wake(){this.running&&this.schedulePoll(0)}getActiveRunCount(){return this.activeJobs.size}async waitForIdle(e=12e4){let t=Date.now();for(;this.activeJobs.size>0;){if(Date.now()-t>=e)return!1;await Ou(25)}return!0}schedulePoll(e){this.running&&(this.pollTimer&&clearTimeout(this.pollTimer),this.pollTimer=setTimeout(()=>{this.pollTimer=null,this.pollOnce()},e))}async pollOnce(){if(!(!this.running||this.polling)){this.polling=!0;try{if(this.handledKinds.length===0||(await this.storage.getRuntimeState()).drainMode)return;await this.queue.requeueExpired(this.now());let t=await this.queue.claimNext({workerId:this.workerId,leaseMs:this.leaseMs,now:this.now(),kinds:this.handledKinds});if(!t)return;this.runJob(t),this.schedulePoll(0)}catch(e){this.onError(e)}finally{this.polling=!1,this.running&&!this.pollTimer&&this.schedulePoll(this.pollIntervalMs)}}}runJob(e){let t=e.leaseToken,n=this.handlers[e.kind],a=(async()=>{if(!t)throw new Error(`Claimed background job ${e.id} is missing a lease token`);let s=this.heartbeatIntervalMs>0?setInterval(()=>{this.queue.heartbeat({jobId:e.id,leaseToken:t,leaseMs:this.leaseMs,now:this.now()}).catch(i=>{this.onError(i)})},this.heartbeatIntervalMs):null;try{if(!n)throw new Error(`No background job handler registered for ${e.kind}`);await n(e),await this.queue.complete({jobId:e.id,leaseToken:t,now:this.now()})}catch(i){try{i instanceof $e?await this.queue.cancel({jobId:e.id,leaseToken:t,error:i.message||null,now:this.now()}):await this.queue.fail({jobId:e.id,leaseToken:t,error:Lu(i),now:this.now()})}catch(o){this.onError(o)}}finally{s&&clearInterval(s),this.activeJobs.delete(e.id)}})().catch(s=>{this.onError(s)}).finally(()=>{this.running&&this.schedulePoll(0)});this.activeJobs.set(e.id,a)}};function Lu(r){return(r instanceof Error?r.message:String(r)).trim().slice(0,2e3)}function Ou(r){return new Promise(e=>setTimeout(e,r))}import Mu from"path";function $u(r){switch(r.toUpperCase()){case"READY":return"ready";case"BUILDING":return"building";case"DEPLOYING":case"QUEUED":case"INITIALIZING":return"deploying";case"ERROR":case"CANCELED":return"error";default:return"error"}}function Uu(r){switch(r.toUpperCase()){case"SUCCESS":return"ready";case"BUILDING":return"building";case"DEPLOYING":return"deploying";case"INITIALIZING":case"QUEUED":return"deploying";case"FAILED":case"CRASHED":case"REMOVED":return"error";default:return"error"}}function vi(r){return Mu.join(Ae().repoRootDir,Ir(r))}var Zn=class{platform="vercel";run;constructor(e){this.run=e??z}async getDeploymentStatus(e){let{sha:t}=e,n=await this.run("vercel",["list","--meta",`githubCommitSha=${t}`,"--json"]);if(n.code!==0)return{state:"error",deploymentId:null,url:null,error:n.stderr||"vercel list failed"};let a;try{a=JSON.parse(n.stdout)}catch{return{state:"error",deploymentId:null,url:null,error:"Failed to parse vercel list output"}}let s=a.deployments??[];if(s.length===0)return{state:"not_found",deploymentId:null,url:null,error:null};let i=s[0],o=i.state.toUpperCase();return{state:$u(i.state),deploymentId:i.uid,url:i.url??null,error:o==="ERROR"?i.errorMessage??"Deployment failed":null}}async getDeploymentLogs(e){let{deploymentId:t}=e,n=await this.run("vercel",["inspect",t,"--json"]),a=t;if(n.code===0)try{let i=JSON.parse(n.stdout);i.url&&(a=i.url)}catch{}let s=await this.run("vercel",["logs",a]);return s.stdout||s.stderr}},ea=class{platform="railway";run;constructor(e){this.run=e??z}async getDeploymentStatus(e){let t=await this.run("railway",["status","--json"],{cwd:vi(e.repo)});if(t.code!==0)return{state:"error",deploymentId:null,url:null,error:t.stderr||"railway status failed"};let n;try{n=JSON.parse(t.stdout)}catch{return{state:"error",deploymentId:null,url:null,error:"Failed to parse railway status output"}}return{state:Uu(n.status??""),deploymentId:n.deploymentId??null,url:n.url??null,error:null}}async getDeploymentLogs(e){let{repo:t,deploymentId:n}=e,a=await this.run("railway",["logs","--deployment",n],{cwd:vi(t)});return a.stdout||a.stderr}};function Ti(r,e){switch(r.toLowerCase()){case"vercel":return new Zn(e);case"railway":return new ea(e);default:throw new Error(`Unsupported deployment platform: ${r}`)}}function Bu(r){return{ensureRepoCache:r?.ensureRepoCache??Nr,applyFixesWithAgent:r?.applyFixesWithAgent??Ht,runCommand:r?.runCommand??z}}function ju(r){return["You are fixing a failed deployment for a repository.","A pull request was merged but the deployment to the platform failed.","Your task is to diagnose the deployment failure and apply the minimal fix.","Create a new branch named deploy-fix/<platform>-<timestamp> from the merge SHA.","Commit your fix to that branch and push it.","At the end of your response, include exactly one line in this format:","DEPLOYMENT_FIX_SUMMARY: <one short sentence describing what was fixed>","",`Repository: ${r.repo}`,`Platform: ${r.platform}`,`Merge SHA: ${r.mergeSha}`,`Base branch: ${r.baseBranch}`,`Trigger PR: #${r.triggerPrNumber}`,`Trigger PR title: ${r.triggerPrTitle}`,`Trigger PR URL: ${r.triggerPrUrl}`,"","Deployment failure log:","```",r.deploymentLog,"```","","Instructions:","1. Analyze the deployment log to identify the root cause of the failure.","2. Apply the minimal code change needed to fix the deployment error.","3. Commit your changes with a descriptive commit message.","4. Push the fix branch to origin.","5. Do not merge the branch \u2014 a PR will be created automatically.","6. Include the DEPLOYMENT_FIX_SUMMARY line at the end of your output."].join(`
851
- `)}function ta(r){let e=r.match(/^DEPLOYMENT_FIX_SUMMARY:\s*(.+)$/m);if(e?.[1])return e[1].trim();let t=r.trim();if(!t)return"No agent summary provided";let n=t.split(/\r?\n/).map(a=>a.trim()).filter(Boolean);return n[n.length-1]??"No agent summary provided"}async function Pi(r){let e=Bu(r.dependencies),t=`deploy-fix/${r.platform}-${Math.floor(Date.now()/1e3)}`,n=ju(r),{repoCacheDir:a}=await e.ensureRepoCache({rootDir:r.rootDir,repoFullName:r.repo,repoCloneUrl:r.repoCloneUrl,runCommand:e.runCommand}),s=await e.runCommand("git",["-C",a,"checkout","-b",t,r.mergeSha],{timeoutMs:3e4});if(s.code!==0)return{accepted:!1,rejectionReason:`branch creation failed: ${s.stderr||s.stdout}`,summary:"No agent summary provided",fixBranch:t,agentResult:s};try{let i=await e.applyFixesWithAgent({agent:r.agent,cwd:a,prompt:n,env:r.env}),o=await e.runCommand("git",["-C",a,"log",`${r.mergeSha}..HEAD`,"--oneline"],{timeoutMs:1e4});if(!(o.code===0&&o.stdout.trim().length>0))return{accepted:!1,rejectionReason:"agent did not produce any new commits",summary:ta(i.stdout),fixBranch:t,agentResult:i};let p=await e.runCommand("git",["-C",a,"push","origin",t],{timeoutMs:6e4});return p.code!==0?{accepted:!1,rejectionReason:`push failed: ${p.stderr||p.stdout}`,summary:ta(i.stdout),fixBranch:t,agentResult:i}:{accepted:!0,rejectionReason:null,summary:ta(i.stdout),fixBranch:t,agentResult:i}}finally{await e.runCommand("git",["-C",a,"checkout","--detach"],{timeoutMs:15e3})}}async function Ei(r){let{storage:e,prId:t,questionId:n,question:a,preferredAgent:s}=r;await e.updateQuestion(n,{status:"answering"});try{let i=await Ju(e,t),o=await Ze(s),c=Xu(i,a),p=await z(o,o==="claude"?["-p","--output-format","text",c]:["exec","--skip-git-repo-check","--sandbox","read-only",c],{timeoutMs:18e4});if(p.code!==0){let u=p.stderr||p.stdout||`Agent exited with code ${p.code}`;await e.updateQuestion(n,{status:"error",error:u.slice(0,2e3)});return}let m=p.stdout.trim()||"(Agent returned an empty response)";await e.updateQuestion(n,{status:"answered",answer:m,answeredAt:new Date().toISOString()})}catch(i){let o=i instanceof Error?i.message:String(i);await e.updateQuestion(n,{status:"error",error:o.slice(0,2e3)})}}async function Ju(r,e){let t=await r.getPR(e);if(!t)throw new Error("PR not found");let a=(await r.getLogs(e)).slice(-50).map(i=>`[${i.timestamp}] ${i.level.toUpperCase()} ${i.phase?`[${i.phase}]`:""} ${i.message}`).join(`
852
- `),s=t.feedbackItems.map(i=>[`- [${i.status}]`,i.decision?`decision=${i.decision}`:"",`by ${i.author}`,i.file?`on ${i.file}${i.line?`:${i.line}`:""}`:"",`:: ${i.body.slice(0,200)}`].filter(Boolean).join(" "));return{title:t.title,number:t.number,repo:t.repo,branch:t.branch,author:t.author,url:t.url,status:t.status,testsPassed:t.testsPassed,lintPassed:t.lintPassed,lastChecked:t.lastChecked,feedbackSummary:s.length>0?s.join(`
853
- `):"(no feedback items)",recentLogs:a||"(no recent activity)"}}function Xu(r,e){return["You are Code Factory, a PR review automation assistant. A user is asking a question about the following pull request.","Answer concisely based on the context provided. If the information is not available in the context, say so.","","## Pull Request",`- Title: ${r.title}`,`- Number: #${r.number}`,`- Repository: ${r.repo}`,`- Branch: ${r.branch}`,`- Author: ${r.author}`,`- URL: ${r.url}`,`- Status: ${r.status}`,`- Tests: ${r.testsPassed===null?"not checked":r.testsPassed?"passing":"failing"}`,`- Lint: ${r.lintPassed===null?"not checked":r.lintPassed?"passing":"failing"}`,`- Last checked: ${r.lastChecked??"never"}`,"","## Feedback Items",r.feedbackSummary,"","## Recent Activity Logs (most recent 50 entries)",r.recentLogs,"","## User Question",e].join(`
854
- `)}function et(r,e){let t=r.payload[e];return typeof t=="string"&&t.length>0?t:null}function Gu(r,e){let t=et(r,e);return t==="codex"||t==="claude"?t:null}function xi(r){return new Promise(e=>setTimeout(e,r))}function Ai(r){let e=r.storage,t=r.babysitter,n=r.releaseManager,a=r.deploymentHealingManager,s=r.questionAnswerer??Ei,i=r.socialChangelogGenerator??Hr,o=r.deps?.buildOctokitFn??Ce,c=r.deps?.createAdapterFn??Ti,p=r.deps?.resolveGitHubAuthTokenFn??Lt,m=r.deps?.runDeploymentHealingRepairFn??Pi;return{sync_watched_repos:t?async()=>{await t.syncAndBabysitTrackedRepos()}:void 0,babysit_pr:t?async u=>{let g=await e.getPR(u.targetId);if(!g)throw new $e(`PR ${u.targetId} no longer exists`);let P=Gu(u,"preferredAgent")??(await e.getConfig()).codingAgent;await t.runQueuedBabysitPR(g.id,P)}:void 0,answer_pr_question:async u=>{let g=et(u,"prId");if(!g)throw new $e(`Background job ${u.id} is missing question PR context`);let P=(await e.getQuestions(g)).find(w=>w.id===u.targetId);if(!P)throw new $e(`PR question ${u.targetId} no longer exists`);if(P.status==="answered"||P.status==="error")return;let A=await e.getConfig();await s({storage:e,prId:P.prId,questionId:P.id,question:P.question,preferredAgent:A.codingAgent})},generate_social_changelog:async u=>{let g=await e.getSocialChangelog(u.targetId);if(!g)throw new $e(`Social changelog ${u.targetId} no longer exists`);if(g.status==="done"||g.status==="error")return;let P=await e.getConfig();await i({storage:e,changelogId:g.id,prSummaries:g.prSummaries,date:g.date,preferredAgent:P.codingAgent})},process_release_run:n?async u=>{let g=await e.getReleaseRun(u.targetId);if(!g)throw new $e(`Release run ${u.targetId} no longer exists`);g.status==="published"||g.status==="skipped"||await n.processReleaseRun(g.id)}:void 0,heal_deployment:a?async u=>{let g=a,P=et(u,"repo"),A=et(u,"platform"),w=et(u,"mergeSha"),k=Number(u.payload.triggerPrNumber),X=et(u,"triggerPrTitle"),M=et(u,"triggerPrUrl"),E=et(u,"baseBranch");if(!P||!A||!w||!k||!X||!M||!E)throw new $e(`Background job ${u.id} is missing required deployment healing fields`);let N=await g.ensureSession({repo:P,platform:A,triggerPrNumber:k,triggerPrTitle:X,triggerPrUrl:M,mergeSha:w}),H=await e.getConfig();await xi(H.deploymentCheckDelayMs);let d=c(A),y=Date.now()+H.deploymentCheckTimeoutMs,h=await d.getDeploymentStatus({repo:P,sha:w});for(;h.state!=="ready"&&h.state!=="error"&&Date.now()<y;)await xi(H.deploymentCheckPollIntervalMs),h=await d.getDeploymentStatus({repo:P,sha:w});if(h.state==="ready")return;if(h.state!=="error"){await g.transitionTo(N.id,"escalated",{error:`Deployment status timed out in state: ${h.state}`});return}let S=h.deploymentId??"unknown",_=await d.getDeploymentLogs({repo:P,deploymentId:S});await g.transitionTo(N.id,"failed",{deploymentId:S,deploymentLog:_}),await g.transitionTo(N.id,"fixing");try{let v=ke(P);if(!v)throw new Error(`Cannot parse repo slug: ${P}`);let b=await p(H),B=await o(H),G=await m({repo:P,platform:A,mergeSha:w,triggerPrNumber:k,triggerPrTitle:X,triggerPrUrl:M,deploymentLog:_,baseBranch:E,repoCloneUrl:Tr(P,b),agent:H.codingAgent,githubToken:b??""});if(!G.accepted){await g.transitionTo(N.id,"escalated",{error:G.rejectionReason??"Repair not accepted"});return}let Z=await B.pulls.create({owner:v.owner,repo:v.repo,title:`fix(deploy): ${G.summary}`,head:G.fixBranch,base:E,body:[`Automated deployment fix for ${A} failure after #${k}.`,"",`**Summary:** ${G.summary}`,"",`Triggered by merge of ${M}.`].join(`
855
- `)});await g.transitionTo(N.id,"fix_submitted",{fixBranch:G.fixBranch,fixPrNumber:Z.data.number,fixPrUrl:Z.data.html_url})}catch(v){await g.transitionTo(N.id,"escalated",{error:v instanceof Error?v.message:String(v)})}}:void 0}}function Ci(r,e){let t=null,n=!1,a=[],s=[],i=c=>{let p=s;s=[];let m=c[0];for(let u of p){if(u.propagateErrors&&m!==void 0){u.reject(m);continue}u.resolve()}},o=c=>{let p=new Promise((m,u)=>{s.push({propagateErrors:c,resolve:m,reject:u})});return t?(n=!0,p):(a=[],t=(async()=>{try{do{n=!1;try{await r()}catch(m){a.push(m),e(m)}}while(n)}finally{let m=a;a=[],t=null,i(m)}})(),p)};return{run:()=>o(!1),runAndReportErrors:()=>o(!0)}}import{mkdtemp as qu,readFile as Wu,rm as Ku}from"fs/promises";import{tmpdir as zu}from"os";import Ii from"path";var Vu=12e4;async function Di(r){let e=r.cwd??process.cwd(),t=r.timeoutMs??Vu,n=await Ze(r.preferredAgent),a=Qu(r);if(n==="codex"){let i=await qu(Ii.join(zu(),"codex-release-eval-")),o=Ii.join(i,"output.txt");try{let c=await z("codex",["exec","--skip-git-repo-check","--sandbox","read-only","-o",o,a],{cwd:e,timeoutMs:t});if(c.code!==0)throw new Error(`codex release evaluation failed (${c.code}): ${c.stderr||c.stdout}`);let p=await Wu(o,"utf8");return Ni(p)}finally{await Ku(i,{recursive:!0,force:!0})}}let s=await z("claude",["-p","--output-format","text",a],{cwd:e,timeoutMs:t});if(s.code!==0)throw new Error(`claude release evaluation failed (${s.code}): ${s.stderr||s.stdout}`);return Ni(s.stdout)}function Qu(r){let e=r.includedPulls.map((t,n)=>[`${n+1}. PR #${t.number} by @${t.author}`,` Title: ${t.title}`,` URL: ${t.url}`,` Merged at: ${t.mergedAt}`,` Merge SHA: ${t.mergeSha}`].join(`
843
+ `):"None",c=s.length?s.map((m,g)=>`${g+1}. ${m.context}: ${m.description}${m.targetUrl?` (${m.targetUrl})`:""}`).join(`
844
+ `):"None",u=i?["Documentation updates are required for this PR.",`Assessment summary: ${i}`,"Update the appropriate repository documentation for these changes.","Choose the right docs files for this repository (for example README, docs pages, API/config/operator docs).","If, after inspection, the repository documentation is already accurate or there is no appropriate docs target, leave docs unchanged and report that using the docs summary block with `no_change`."].join(`
845
+ `):"None";return[`You are acting as an autonomous PR babysitter for ${e.repo} PR #${e.number}.`,`PR URL: ${e.url}`,`Base repository: ${r.repoFullName}`,`Head repository: ${r.headRepoFullName}`,`Head branch: ${r.headRef}`,`Head remote: ${n}`,"You are running inside an isolated app-owned worktree under ~/.oh-my-pr.","Make only targeted changes that resolve the approved tasks.","Do not wait for user input, confirmation, or approval at any point.","Do not rewrite unrelated files.","Use the available git tooling in this environment.","GitHub follow-up replies and review-thread resolution will be handled by the babysitter after your run.","If a task is invalid after inspection, explain it in your final response and include the exact audit token.","","Approved review-comment tasks:",o,"","Approved status-check tasks:",c,"","Approved documentation tasks:",u,"","When done:","1) Run the relevant verification for your changes.",`2) If you changed files, commit and push to ${n} HEAD:${r.headRef}.`,"3) For each feedback item you addressed or were blocked on, emit a summary block in the following format:"," FEEDBACK_SUMMARY_START <auditToken>"," <A concise 1-2 sentence summary of what you did or why you were blocked>"," FEEDBACK_SUMMARY_END"," Include one block per audit token. These summaries will be posted as follow-up comments on the PR.","4) If documentation tasks were assigned, emit exactly one docs summary block in the following format:"," DOCS_SUMMARY_START <changed|no_change>"," <A concise 1-2 sentence summary of the docs you updated, or why no docs changes were necessary after inspection>"," DOCS_SUMMARY_END"].join(`
846
+ `)}function Ou(t){let e=t.match(Tu);return e?Array.from(new Set(e)):[]}var Li=/FEEDBACK_SUMMARY_START\s+(codefactory-feedback:[^\s]+)\s*\n([\s\S]*?)FEEDBACK_SUMMARY_END/g,Mu=/DOCS_SUMMARY_START\s+(changed|no_change)\s*\n([\s\S]*?)DOCS_SUMMARY_END/;function $u(t){let e=new Map,r,n=new RegExp(Li.source,Li.flags);for(;(r=n.exec(t))!==null;){let a=r[1],s=r[2].trim();a&&s&&e.set(a,s)}return e}function Uu(t){let e=Mu.exec(t);if(!e)return null;let r=e[1],n=e[2]?.trim();return!n||r!=="changed"&&r!=="no_change"?null:{outcome:r,summary:n}}function Bu(t,e){let r=Ou(t.body).filter(a=>a!==t.auditToken);if(r.length===0)return!1;let n=new Date(t.createdAt).getTime();return r.some(a=>e.some(s=>{if(s.id===t.id||s.auditToken!==a)return!1;let i=new Date(s.createdAt).getTime();return Number.isNaN(n)||Number.isNaN(i)?!1:i<=n}))}function Ra(t,e,r){return e.some(n=>{if(n.id===t.id||!n.body.includes(t.auditToken)||t.replyKind==="review_thread"&&(!t.threadId||n.threadId!==t.threadId))return!1;let a=new Date(n.createdAt).getTime();return Number.isNaN(a)?!1:typeof r=="number"?a>=r:!0})}function ju(t){let{pr:e,followUpTasks:r,runStartedAtMs:n}=t,a=[];for(let s of r)Ra(s,e.feedbackItems,n)||a.push(`missing audit trail for ${s.id}`),s.replyKind==="review_thread"&&(e.feedbackItems.find(o=>o.id===s.id)?.threadResolved||a.push(`review thread not resolved for ${s.id}`));return a}function Ju(t,e){return t.decision!=="accept"||t.status!=="queued"&&t.status!=="in_progress"?!1:Ra(t,e)?Sr(sn(t)):!0}function Gu(t){return t.feedbackItems.filter(e=>Ju(e,t.feedbackItems))}function Oi(t){return[t.prId,t.sha,t.provider,t.context,t.status,t.conclusion||"",t.description,t.targetUrl||""].join("|")}async function Mi(t,e){if(e.length===0)return;let r=await t.listCheckSnapshots({prId:e[0].prId,sha:e[0].sha}),n=new Set(r.map(a=>Oi(a)));for(let a of e){let s=Oi(a);if(n.has(s))continue;let{id:i,...o}=a;await t.createCheckSnapshot(o),n.add(s)}}async function $i(t,e,r,n){let a=await t.listFailureFingerprints({sessionId:e,sha:r}),s=new Set(a.map(i=>i.fingerprint));for(let i of n)s.has(i.fingerprint)||(await t.createFailureFingerprint({sessionId:e,sha:r,fingerprint:i.fingerprint,category:i.category,classification:i.classification,summary:i.summary,selectedEvidence:i.selectedEvidence}),s.add(i.fingerprint))}function Xu(t,e){let r=new Set(t),n=new Set(e.map(c=>c.fingerprint)),a=t.filter(c=>!n.has(c)),s=t.filter(c=>n.has(c)),i=e.map(c=>c.fingerprint).filter(c=>!r.has(c)),o=a.length*2-s.length*2-i.length*3;return{removedTargetFingerprints:a,remainingTargetFingerprints:s,newUnrelatedFingerprints:i,improvementScore:o}}function qu(t,e,r){let n=t.trim()?t.trim().slice(0,7):"",s=[n?`Addressed in commit \`${n}\` by the latest babysitter run.`:"Addressed in the latest babysitter run."];if(e.replyKind!=="review_thread"&&e.sourceUrl){let i=(e.body||"").split(`
847
+ `)[0]||"",o=i.length>120?i.slice(0,120)+"\u2026":i;s.push("",`> Responding to [comment by @${e.author}](${e.sourceUrl}):`,`> ${o}`)}return r&&s.push("",r),s.push("",e.auditToken),s.join(`
848
+ `)}var ji="<!-- codefactory-agent-command -->";function Wu(t){let e=0,r=t.match(/`{3,}/g);if(r)for(let a of r)a.length>e&&(e=a.length);let n="`".repeat(Math.max(3,e+1));return{open:`${n}text`,close:n}}function Vu(t){return t.includes(ji)}function Ku(t,e){let r=Wu(e);return[ji,`\u{1F916} **CodeFactory** dispatched \`${t}\` with the following prompt:`,"","<details>","<summary>Agent prompt (click to expand)</summary>","",r.open,e,r.close,"","</details>"].join(`
849
+ `)}function zu(t,e){return t?`${t}
850
+ ${e}`:e}function on(t,e){return[t,...e].join(" ")}function ir(t){return t.stderr.trim()||t.stdout.trim()||"no output"}function Fe(t){return t instanceof Error?t.message:String(t)}function Qu(t,e){let n=`${t}${e}`.split(/\r?\n/);return{lines:n.slice(0,-1),buffer:n.at(-1)??""}}async function Yu(t,e){let r=await e("git",["config","--get","user.name"],{cwd:t,timeoutMs:3e3});(r.code!==0||!r.stdout.trim())&&await e("git",["config","user.name",ku],{cwd:t,timeoutMs:3e3});let n=await e("git",["config","--get","user.email"],{cwd:t,timeoutMs:3e3});(n.code!==0||!n.stdout.trim())&&await e("git",["config","user.email",vu],{cwd:t,timeoutMs:3e3})}function Ui(t){return new Promise(e=>setTimeout(e,t))}var ln=class{storage;inProgress=new Set;feedbackMutationLocks=new Map;github;runtime;releaseManager;deploymentHealingManager;scheduleBackgroundJob;clock;constructor(e,r=xu,n=Pu,a,s,i){this.storage=e,this.github=r,this.runtime=n,this.releaseManager=a,this.deploymentHealingManager=i,this.scheduleBackgroundJob=s,this.clock=n.now??(()=>new Date)}now(){return this.clock()}getActiveRunCount(){return this.inProgress.size}async waitForIdle(e=12e4){let r=Date.now();for(;this.inProgress.size>0;){if(Date.now()-r>=e)return!1;await Ui(100)}return!0}async runQueuedBabysitPR(e,r){let n=(await this.storage.listAgentRuns({status:"running",prId:e})).slice().sort((s,i)=>Date.parse(i.updatedAt)-Date.parse(s.updatedAt))[0];if(!n){await this.babysitPR(e,r,{allowDuringDrain:!0});return}if(!!!(n.prompt&&n.resolvedAgent&&n.initialHeadSha)){let s=new Date().toISOString();await this.storage.upsertAgentRun({...n,status:"failed",phase:"run.failed",lastError:"Interrupted run missing replay context",updatedAt:s}),await this.babysitPR(e,r,{allowDuringDrain:!0});return}await this.babysitPR(e,n.preferredAgent,{runId:n.id,recoveryMode:!0,forceAgentPrompt:n.prompt,forceResolvedAgent:n.resolvedAgent,replayInitialHeadSha:n.initialHeadSha,allowDuringDrain:!0})}async resumeInterruptedRuns(){let e=await this.storage.listAgentRuns({status:"running"});if(e.length!==0){if(this.scheduleBackgroundJob){let r=new Set;for(let n of e)r.has(n.prId)||(r.add(n.prId),await this.scheduleBackgroundJob("babysit_pr",n.prId,Je("babysit_pr",n.prId),{preferredAgent:n.preferredAgent}));return}for(let r of e){if(!!!(r.prompt&&r.resolvedAgent&&r.initialHeadSha)){let a=new Date().toISOString();await this.storage.upsertAgentRun({...r,status:"failed",phase:"run.failed",lastError:"Interrupted run missing replay context",updatedAt:a}),await this.babysitPR(r.prId,r.preferredAgent,{allowDuringDrain:!0});continue}await this.babysitPR(r.prId,r.preferredAgent,{runId:r.id,recoveryMode:!0,forceAgentPrompt:r.prompt,forceResolvedAgent:r.resolvedAgent,replayInitialHeadSha:r.initialHeadSha,allowDuringDrain:!0})}}}async withFeedbackMutationLock(e,r){let n=this.feedbackMutationLocks.get(e)??Promise.resolve(),a,s=new Promise(o=>{a=()=>o()}),i=n.then(()=>s);this.feedbackMutationLocks.set(e,i),await n;try{return await r()}finally{a?.(),this.feedbackMutationLocks.get(e)===i&&this.feedbackMutationLocks.delete(e)}}async retryFeedbackItem(e,r){return this.withFeedbackMutationLock(e,async()=>{let n=await this.storage.getPR(e);if(!n)return{kind:"pr_not_found"};let a=n.feedbackItems.find(c=>c.id===r);if(!a)return{kind:"feedback_not_found"};if(a.status!=="failed"&&a.status!=="warning")return{kind:"feedback_not_retryable"};let s=n.feedbackItems.map(c=>c.id===r?Hi(c):c),i=sr(s),o=await this.storage.updatePR(n.id,{feedbackItems:s,accepted:i.accepted,rejected:i.rejected,flagged:i.flagged});if(!o)throw new Error(`Failed to queue retry for feedback item ${r} on PR ${e}`);return{kind:"ok",updated:o}})}async syncFeedbackForPR(e,r){let n=await this.storage.getPR(e);if(!n)throw new Error("PR not found");let a=Ne(n.repo);if(!a)throw new Error(`Invalid repository slug: ${n.repo}`);let s={owner:a.owner,repo:a.repo,number:n.number},i=await this.storage.getConfig(),o=await this.github.buildOctokit(i),c=r?.phase??"sync";r?.logStart&&await this.storage.addLog(n.id,"info","Syncing GitHub comments/reviews...",{runId:r.runId??null,phase:c});let u=await this.github.fetchFeedbackItemsForPR(o,s,i),{merged:m,newCount:g}=Eu(n.feedbackItems,u),p=sr(m),h=await this.storage.updatePR(n.id,{title:n.title,status:n.status,lastChecked:new Date().toISOString(),feedbackItems:m,accepted:p.accepted,rejected:p.rejected,flagged:p.flagged});if(!h)throw new Error("Failed to update PR after feedback sync");return await this.storage.addLog(n.id,"info",Cu(u.length,g),{runId:r?.runId??null,phase:c,metadata:{total:u.length,newCount:g}}),h}async syncAndBabysitTrackedRepos(){if((await this.storage.getRuntimeState()).drainMode)return;let r=[...await this.storage.getPRs(),...await this.storage.getArchivedPRs()].filter(Au);for(let u of r)try{await this.syncFeedbackForPR(u.id,{phase:"repair"})}catch(m){await this.storage.addLog(u.id,"warn",`Could not repair missing GitHub review-thread metadata: ${Fe(m)}`,{phase:"repair"})}let n=await this.storage.getConfig(),a=await this.github.buildOctokit(n),s=await this.storage.getPRs(),i=new Set([...s.map(u=>u.repo),...n.watchedRepos]),o=Array.from(i).map(u=>Ne(u)).filter(u=>!!u),c=[];for(let u of o){let m=Ot(u),g;try{g=await this.github.listOpenPullsForRepo(a,u)}catch(R){console.error(`Failed to list open PRs for ${m}`,R);continue}let p=new Set(g.map(R=>R.number)),h=s.filter(R=>R.repo===m),I=!1;for(let R of h)if(!p.has(R.number)&&R.status!=="archived"){let k;if(this.github.fetchPullCloseState)try{k=await this.github.fetchPullCloseState(a,{owner:u.owner,repo:u.repo,number:R.number})}catch(V){await this.storage.addLog(R.id,"warn",`Could not confirm merge state before archival: ${Fe(V)}`,{phase:"watcher"})}if(await this.storage.updatePR(R.id,{status:"archived"}),await this.storage.addLog(R.id,"info",`PR #${R.number} is no longer open on GitHub \u2014 archived`,{phase:"watcher"}),k?.merged&&this.releaseManager&&n.autoCreateReleases){let V=k.baseRef.trim(),B=k.mergeCommitSha||k.headSha,A=k.mergedAt||k.closedAt;if(!V||!B||!A){let F=[V?null:"a base branch",B?null:"a commit SHA",A?null:"a merge timestamp"].filter(D=>!!D);await this.storage.addLog(R.id,"warn",`PR #${R.number} was merged, but release evaluation was not queued because GitHub did not return ${F.join(" and ")}.`,{phase:"watcher",metadata:{baseBranch:V,headSha:k.headSha,mergeCommitSha:k.mergeCommitSha,mergedAt:k.mergedAt,closedAt:k.closedAt}})}else try{await this.releaseManager.enqueueMergedPullReleaseEvaluation({repo:m,baseBranch:V,triggerPrNumber:k.number,triggerPrTitle:k.title,triggerPrUrl:k.url,triggerMergeSha:B,triggerMergedAt:A}),await this.storage.addLog(R.id,"info",`PR #${R.number} was merged \u2014 queued release evaluation`,{phase:"watcher",metadata:{baseBranch:V,triggerMergeSha:B}})}catch(F){await this.storage.addLog(R.id,"warn",`PR #${R.number} was merged, but release evaluation could not be queued: ${Fe(F)}`,{phase:"watcher"})}}else k&&!k.merged&&await this.storage.addLog(R.id,"info",`PR #${R.number} closed without merge`,{phase:"watcher"});if(k?.merged&&this.deploymentHealingManager&&this.scheduleBackgroundJob&&n.autoHealDeployments){let V=k.baseRef.trim(),B=k.mergeCommitSha||k.headSha;if(V&&B)try{let A=await this.github.resolveGitHubAuthToken(n),F=Wr(m,A),{repoCacheDir:D}=await en({repoFullName:m,repoCloneUrl:F,runCommand:this.runtime.runCommand}),l=await Ei(D);l&&(await this.scheduleBackgroundJob("heal_deployment",`${m}:${B}`,Je("heal_deployment",`${m}:${B}`),{repo:m,platform:l.platform,mergeSha:B,triggerPrNumber:R.number,triggerPrTitle:R.title,triggerPrUrl:R.url,baseBranch:V}),await this.storage.addLog(R.id,"info",`PR #${R.number} merged \u2014 queued deployment healing (${l.platform})`,{phase:"watcher",metadata:{platform:l.platform,mergeSha:B}}))}catch(A){await this.storage.addLog(R.id,"warn",`Failed to queue deployment healing: ${Fe(A)}`,{phase:"watcher"})}}I=!0}I&&c.push(u);for(let R of g){let k=await this.storage.getPRByRepoAndNumber(m,R.number);k||(k=await this.storage.addPR({number:R.number,title:R.title,repo:m,branch:R.branch,author:R.author,url:R.url,status:"watching",feedbackItems:[],accepted:0,rejected:0,flagged:0,testsPassed:null,lintPassed:null,lastChecked:null}),await this.storage.addLog(k.id,"info",`Auto-registered open PR #${R.number} from ${m}`)),k.watchEnabled&&(await this.storage.addLog(k.id,"info","Watcher queued autonomous babysitter run",{phase:"watcher",metadata:{repo:m}}),this.scheduleBackgroundJob?await this.scheduleBackgroundJob("babysit_pr",k.id,Je("babysit_pr",k.id),{preferredAgent:n.codingAgent}):await this.babysitPR(k.id,n.codingAgent))}}c.length>0&&this.github.listMergedPullsToday&&await this.maybeTriggerSocialChangelog(a,c,n.codingAgent)}async maybeTriggerSocialChangelog(e,r,n){if(!this.github.listMergedPullsToday)return;let a=new Date().toISOString().slice(0,10),s=5,i=[];for(let g of r)try{let p=await this.github.listMergedPullsToday(e,g);i.push(...p)}catch(p){let h=p instanceof Error?p.message:String(p);console.error(`social-changelog: failed to list merged PRs for ${Ot(g)}: ${h}`,p)}let o=i.length;if(o===0||o%s!==0||await this.storage.getSocialChangelogForDateAndCount(a,o))return;let u=i.map(g=>({number:g.number,title:g.title,url:g.url,author:g.author,repo:g.repo})),m=await this.storage.createSocialChangelog({date:a,triggerCount:o,prSummaries:u,content:null,status:"generating",error:null,completedAt:null});if(console.log(`social-changelog: ${o} PRs merged today \u2014 generating social post (id=${m.id})`),this.scheduleBackgroundJob){try{await this.scheduleBackgroundJob("generate_social_changelog",m.id,Je("generate_social_changelog",m.id))}catch(g){let p=g instanceof Error?g.message:String(g);console.error(`social-changelog: failed to enqueue post for id=${m.id}: ${p}`,g),await this.storage.updateSocialChangelog(m.id,{status:"error",error:p.trim().slice(0,2e3),completedAt:new Date().toISOString()})}return}nn({storage:this.storage,changelogId:m.id,prSummaries:u,date:a,preferredAgent:n}).catch(g=>{let p=g instanceof Error?g.message:String(g);console.error(`social-changelog: failed to generate post for id=${m.id}: ${p}`,g)})}async pollForCICompletion(e,r,n,a,s,i){let c=this.runtime.ciPollIntervalMs??3e4;for(let u=1;u<=10;u++){await Ui(c);try{let m=await this.github.checkCISettled(e,r,a),g=await this.github.listFailingStatuses(e,r,a);if(await i(s,"info",`CI poll attempt ${u}/10: ${g.length} failure(s), settled=${m}`,{phase:"verify.ci",metadata:{attempt:u,failures:g.length,settled:m}}),m)return g.length>0?{status:"failure",failures:g}:{status:"success",failures:[]}}catch(m){await i(s,"warn",`CI poll attempt ${u} failed: ${Fe(m)}`,{phase:"verify.ci",metadata:{attempt:u}})}}try{let u=await this.github.listFailingStatuses(e,r,a);if(u.length>0)return{status:"failure",failures:u}}catch(u){await i(s,"warn",`Final CI status check after timeout failed: ${Fe(u)}`,{phase:"verify.ci"})}return{status:"timeout",failures:[]}}async babysitPR(e,r,n){if((await this.storage.getRuntimeState()).drainMode&&!n?.allowDuringDrain){let l=await this.storage.getPR(e);l&&await this.storage.addLog(l.id,"warn","Babysitter run skipped because drain mode is enabled",{phase:"run"});return}if(this.inProgress.has(e)){let l=await this.storage.getPR(e);l&&await this.storage.addLog(l.id,"warn","Babysitter run skipped because another run is already in progress",{phase:"run"});return}this.inProgress.add(e);let s=n?.runId||Su(),i=Math.floor(Date.now()/1e3)*1e3-1e3,o=Promise.resolve(),c=new Date().toISOString(),u=await this.storage.getAgentRun(s)||{id:s,prId:e,preferredAgent:r,resolvedAgent:n?.forceResolvedAgent??null,status:"running",phase:"run.started",prompt:n?.forceAgentPrompt??null,initialHeadSha:n?.replayInitialHeadSha??null,metadata:{recoveryMode:!!n?.recoveryMode},lastError:null,createdAt:c,updatedAt:c};await this.storage.upsertAgentRun(u);let m=async l=>{u={...u,...l,updatedAt:new Date().toISOString()},await this.storage.upsertAgentRun(u)},g=(l,w,y,T)=>(o=o.then(async()=>{await this.storage.addLog(l,w,y,{runId:s,phase:T?.phase??null,metadata:T?.metadata??null})}).catch(x=>{console.error("Babysitter log write failed",x)}),o),p=async(l,w,y,T)=>{await g(l,"warn",y,{phase:w,metadata:T??null})},h=(l,w,y,T)=>{let x="";return{onChunk:v=>{let b=Qu(x,v);x=b.buffer;for(let O of b.lines){let G=O.trim();G&&g(l,T,`[${y}] ${G}`,{phase:w,metadata:{stream:y}})}},flush:async()=>{let v=x.trim();v&&(x="",await g(l,T,`[${y}] ${v}`,{phase:w,metadata:{stream:y}}))}}},I=async l=>{let{currentPrId:w,command:y,args:T,cwd:x,timeoutMs:v,phase:b,successMessage:O}=l;await g(w,"info",`Running ${on(y,T)}`,{phase:b});let G=h(w,b,"stdout","info"),ae=h(w,b,"stderr","warn"),te=await this.runtime.runCommand(y,T,{cwd:x,timeoutMs:v,onStdoutChunk:G.onChunk,onStderrChunk:ae.onChunk});return await G.flush(),await ae.flush(),te.code===0?await g(w,"info",O,{phase:b,metadata:{command:on(y,T),code:te.code}}):await g(w,"error",`${on(y,T)} failed (${te.code})`,{phase:b,metadata:{command:on(y,T),code:te.code,summary:ir(te)}}),te},R=[],k=n?.forceAgentPrompt??null,V=n?.forceResolvedAgent??null,B=n?.replayInitialHeadSha??null,A=!!n?.recoveryMode,F=!1,D=!1;try{await m({status:"running",phase:"run.started",metadata:{...u.metadata??{},recoveryMode:A},lastError:null}),await this.storage.updatePR(e,{status:"processing",lastChecked:new Date().toISOString()}),await g(e,"info",`Babysitter run started using preferred agent ${r}${A?" (recovery)":""}`,{phase:"run",metadata:{preferredAgent:r,recoveryMode:A}}),await m({phase:"run.sync"});let l=await this.syncFeedbackForPR(e,{runId:s,logStart:!0,phase:"sync"}),w=await this.storage.getConfig(),y=V||await this.runtime.resolveAgent(r);await m({resolvedAgent:y});let T=Ne(l.repo);if(!T)throw new Error(`Invalid repository slug: ${l.repo}`);await g(l.id,"info",`Resolved coding agent to ${y}`,{phase:"run"});let x=await this.github.buildOctokit(w),v={owner:T.owner,repo:T.repo,number:l.number},b=await this.github.fetchPullSummary(x,v);k&&B&&b.headSha!==B&&(F=!0,await g(l.id,"warn",`Skipping forced prompt replay because PR head moved (${B.slice(0,7)} -> ${b.headSha.slice(0,7)})`,{phase:"run.replay",metadata:{replayInitialHeadSha:B,currentHeadSha:b.headSha}}));let O=await this.github.listFailingStatuses(x,T,b.headSha),G=this.now().toISOString(),te=(this.github.fetchCheckSnapshotsForRef?await this.github.fetchCheckSnapshotsForRef(x,T,l.id,b.headSha):O.map(_=>({id:`${_.context}:${_.description}:${b.headSha}`,prId:l.id,sha:b.headSha,provider:"github.commit_status",context:_.context,status:"failure",conclusion:null,description:_.description,targetUrl:_.targetUrl,observedAt:G}))).filter(_=>la(_)),vr=pa(te),Tr=vr.filter(_=>_.classification==="healable_in_branch"),gn=vr.filter(_=>_.classification==="blocked_external"),pe=new zr(this.storage,()=>this.now()),M=null;if(te.length>0)M=await pe.ensureSessionForHead({prId:l.id,repo:l.repo,prNumber:l.number,headSha:b.headSha}),await Mi(this.storage,te),await $i(this.storage,M.id,b.headSha,vr),gn.length>0?M=await pe.markBlocked(M.id,gn[0]?.summary??"CI failure classified as blocked_external",{latestFingerprint:gn[0]?.fingerprint??null,currentHeadSha:b.headSha}):Tr.length>0?M=await pe.markAwaitingRepairSlot(M.id,{latestFingerprint:Tr[0]?.fingerprint??null,currentHeadSha:b.headSha}):M=await pe.markEscalated(M.id,"CI failure could not be classified as healable in branch",{latestFingerprint:vr[0]?.fingerprint??null,currentHeadSha:b.headSha});else{let _=await pe.getSessionByPrAndHead(l.id,b.headSha);_&&["triaging","awaiting_repair_slot","repairing","awaiting_ci","verifying","cooldown"].includes(_.state)?(M=await pe.markVerifying(_.id,{currentHeadSha:b.headSha}),M=await pe.markHealed(M.id,{currentHeadSha:b.headSha,lastImprovementScore:M.lastImprovementScore??0})):M=_??null}let Ta=new Map,xr=async(_,X)=>{let N=Ta.get(_);if(N)try{let Y=zu(N.body,X);await this.github.updateStatusReply(x,v,N,Y)}catch(Y){await p(l.id,"github.status",`Failed to update status reply for ${_}: ${Fe(Y)}`,{feedbackId:_})}},xa=async(_,X)=>{try{await this.github.postPRComment(x,v,Ku(_,X))}catch(N){await p(l.id,"github.agent-command",`Failed to post agent command comment: ${Fe(N)}`)}},Pa=l.feedbackItems.filter(_=>_.status==="pending");await g(l.id,"info",`Evaluating ${Pa.length} pending feedback item(s)`,{phase:"evaluate.comments"});let or=new Map;for(let _ of Pa){if(await g(l.id,"info",`Inspecting feedback from ${_.author}`,{phase:"evaluate.comments",metadata:{feedbackId:_.id,file:_.file,line:_.line}}),Vu(_.body)){or.set(_.id,$t(_,!1,"CodeFactory-authored agent command comment; no code change required")),await g(l.id,"info",`Ignored self-authored agent command comment ${_.id}`,{phase:"evaluate.comments",metadata:{feedbackId:_.id,decision:"reject"}});continue}if(Bu(_,l.feedbackItems)){or.set(_.id,$t(_,!1,"Automation audit trail follow-up; no code change required")),await g(l.id,"info",`Ignored audit-trail follow-up comment ${_.id}`,{phase:"evaluate.comments",metadata:{feedbackId:_.id,decision:"reject"}});continue}let X=Iu({pr:l,item:_});await g(l.id,"info",`Evaluating feedback ${_.id} with ${y}`,{phase:"evaluate.comments",metadata:{feedbackId:_.id,agent:y,prompt:X}});let N=await this.runtime.evaluateFixNecessityWithAgent({agent:y,cwd:process.cwd(),prompt:X}),Y=$t(_,N.needsFix,N.reason);if(or.set(_.id,Y),N.needsFix){await g(l.id,"info",`Accepted feedback ${_.id}: ${N.reason}`,{phase:"evaluate.comments",metadata:{feedbackId:_.id,decision:"accept"}});try{await this.github.addReactionToComment(x,v,_,"eyes")}catch(q){await p(l.id,"github.reaction",`Failed to add reaction for ${_.id}: ${Fe(q)}`,{feedbackId:_.id})}try{let q=await this.github.postStatusReplyForFeedbackItem(x,v,_,kr.accepted);q&&Ta.set(_.id,q)}catch(q){await p(l.id,"github.status",`Failed to post status reply for ${_.id}: ${Fe(q)}`,{feedbackId:_.id})}}else await g(l.id,"info",`Rejected feedback ${_.id}: ${N.reason}`,{phase:"evaluate.comments",metadata:{feedbackId:_.id,decision:"reject"}})}let ft=[];if(w.autoHealCI&&M)await g(l.id,"info",`Skipping legacy status-task evaluation because CI healing session ${M.id} is active`,{phase:"evaluate.status",metadata:{healingSessionId:M.id,healingState:M.state}});else{await g(l.id,"info",`Evaluating ${O.length} failing status check(s)`,{phase:"evaluate.status"});for(let _ of O){let X=Nu({pr:l,context:_.context,description:_.description,targetUrl:_.targetUrl});await g(l.id,"info",`Evaluating failing status ${_.context} with ${y}`,{phase:"evaluate.status",metadata:{context:_.context,agent:y,prompt:X}});let N=await this.runtime.evaluateFixNecessityWithAgent({agent:y,cwd:process.cwd(),prompt:X});N.needsFix?(ft.push(_),await g(l.id,"info",`Accepted failing status ${_.context}: ${N.reason}`,{phase:"evaluate.status",metadata:{context:_.context,decision:"accept"}})):await g(l.id,"info",`Rejected failing status ${_.context}: ${N.reason}`,{phase:"evaluate.status",metadata:{context:_.context,decision:"reject"}})}}if(or.size>0){let _=l.feedbackItems.map(Y=>or.get(Y.id)??Y),X=sr(_),N=await this.storage.updatePR(l.id,{feedbackItems:_,accepted:X.accepted,rejected:X.rejected,flagged:X.flagged});N&&(l=N)}let ro=l.feedbackItems.filter(_=>_.status==="queued"&&_.decision==="accept"),Ea=k?l.feedbackItems.filter(_=>(_.status==="queued"||_.status==="in_progress")&&_.decision==="accept"):[],Ge=Ea.length>0?Ea:ro;R=Gu(l);let Aa=b.mergeable===!1,Ye=Aa&&w.autoResolveMergeConflicts;Aa&&!w.autoResolveMergeConflicts&&await g(l.id,"warn",`PR #${l.number} has merge conflicts but auto-resolve is disabled in settings`,{phase:"conflict",metadata:{baseRef:b.baseRef,mergeable:b.mergeable}});let Ut=!!(k&&!F),mn=!!(k&&F),Ca=!mn&&(Ge.length>0||ft.length>0||Ut),lr=Bi(l,b.headSha),Bt=!mn&&!Ut&&Du(l,b.headSha,w.autoUpdateDocs),Pr=w.autoUpdateDocs&&lr?.status==="needed"?lr.summary:null,Xe=!!Pr,Ia=Ca||Ye||Bt||Xe,Na=!!(w.autoHealCI&&M&&M.state==="awaiting_repair_slot"&&!mn&&!Ca&&!Ye&&!Bt&&!Xe);if(w.autoUpdateDocs&&lr&&!Bt&&await g(l.id,"info",`Documentation assessment already recorded for ${b.headSha.slice(0,7)} (${lr.status})`,{phase:"evaluate.docs",metadata:{headSha:b.headSha,status:lr.status}}),!Ia&&!Na&&R.length===0&&!Ye&&te.length===0){await g(l.id,"info",`Babysitter checked PR #${l.number}; no necessary fixes identified`,{phase:"run"}),await this.storage.updatePR(l.id,{status:"watching",lastChecked:new Date().toISOString()}),await m({status:"completed",phase:"run.completed",lastError:null});return}let ee=b.headSha;D=!1;let Er=null,pn=new Map,De=null,hn=!1,dr=null,Q=null;if(Ye&&await g(l.id,"info",`PR #${l.number} has merge conflicts with base branch ${b.baseRef}`,{phase:"conflict",metadata:{baseRef:b.baseRef,mergeable:b.mergeable}}),Ia||Ye){await g(l.id,"info",`Babysitter preparing fix run with ${Ge.length} comment task(s), ${ft.length} status task(s), ${Xe?1:0} documentation task(s), and ${R.length} GitHub follow-up task(s)${Bt?", with documentation assessment":""}${Ye?", plus merge conflict resolution":""}${Ut?", with forced prompt replay":""} using ${y}`,{phase:"run",metadata:{commentTasks:Ge.length,statusTasks:ft.length,docsTasks:Xe?1:0,docsAssessmentNeeded:Bt,followUpTasks:R.length,hasConflicts:Ye,shouldRunForcedReplay:Ut,agent:y}});let _=Be();await g(l.id,"info",`Preparing worktree in ${_.rootDir}`,{phase:"worktree"});let{repoCacheDir:X,worktreePath:N,healed:Y,remoteName:q}=await tn({rootDir:_.rootDir,repoFullName:b.repoFullName,repoCloneUrl:b.repoCloneUrl,headRepoFullName:b.headRepoFullName,headRepoCloneUrl:b.headRepoCloneUrl,headRef:b.headRef,prNumber:l.number,runId:s,runCommand:this.runtime.runCommand});Er=q;try{if(await g(l.id,"info",`Worktree ready at ${N}`,{phase:"worktree",metadata:{remoteName:q,healed:Y}}),Y&&await g(l.id,"info","Repo cache required auto-heal before the worktree was created",{phase:"worktree",metadata:{repoCacheDir:X}}),await g(l.id,"info",`Prepared PR head from remote ${q}`,{phase:"worktree",metadata:{remoteName:q,headRef:b.headRef}}),await g(l.id,"info","Ensuring git identity",{phase:"git.identity"}),await Yu(N,this.runtime.runCommand),await g(l.id,"info","Git identity ready",{phase:"git.identity"}),Bt){await g(l.id,"info","Documentation assessment started",{phase:"evaluate.docs",metadata:{headSha:b.headSha}});try{let he=await I({currentPrId:l.id,command:"git",args:["fetch","origin",b.baseRef],cwd:N,timeoutMs:12e4,phase:"evaluate.docs",successMessage:`Fetched origin/${b.baseRef} for docs assessment`});if(he.code!==0)throw new Error(`Failed to fetch origin/${b.baseRef} for docs assessment: ${ir(he)}`);let le=await I({currentPrId:l.id,command:"git",args:["diff","--name-only",`origin/${b.baseRef}...HEAD`],cwd:N,timeoutMs:1e4,phase:"evaluate.docs",successMessage:"Collected changed files for docs assessment"});if(le.code!==0)throw new Error(`Failed to collect changed files for docs assessment: ${ir(le)}`);let re=await I({currentPrId:l.id,command:"git",args:["diff","--stat",`origin/${b.baseRef}...HEAD`],cwd:N,timeoutMs:1e4,phase:"evaluate.docs",successMessage:"Collected diff stat for docs assessment"});if(re.code!==0)throw new Error(`Failed to collect diff stat for docs assessment: ${ir(re)}`);let de=await I({currentPrId:l.id,command:"git",args:["diff","--no-color","--unified=0",`origin/${b.baseRef}...HEAD`],cwd:N,timeoutMs:1e4,phase:"evaluate.docs",successMessage:"Collected diff preview for docs assessment"});if(de.code!==0)throw new Error(`Failed to collect diff preview for docs assessment: ${ir(de)}`);let ue=Fu({pr:l,pullSummary:b,changedFiles:le.stdout.trim(),diffStat:re.stdout.trim(),diffPreview:de.stdout.trim()});await g(l.id,"info",`Evaluating documentation needs with ${y}`,{phase:"evaluate.docs",metadata:{agent:y,prompt:ue}});let ke=await this.runtime.evaluateFixNecessityWithAgent({agent:y,cwd:N,prompt:ue}),xe={headSha:b.headSha,status:ke.needsFix?"needed":"not_needed",summary:ke.reason,assessedAt:new Date().toISOString()},qe=await this.storage.updatePR(l.id,{docsAssessment:xe});qe&&(l=qe),Xe=ke.needsFix,Pr=ke.needsFix?ke.reason:null,await g(l.id,"info",ke.needsFix?`Documentation updates required: ${ke.reason}`:`Documentation updates not required: ${ke.reason}`,{phase:"evaluate.docs",metadata:{decision:ke.needsFix?"needed":"not_needed",headSha:b.headSha}})}catch(he){let le=Fe(he),re={headSha:b.headSha,status:"failed",summary:le,assessedAt:new Date().toISOString()},de=await this.storage.updatePR(l.id,{docsAssessment:re});de&&(l=de),Xe=!1,Pr=null,await g(l.id,"warn",`Documentation assessment failed: ${le}`,{phase:"evaluate.docs",metadata:{headSha:b.headSha}})}}if(Ye){await g(l.id,"info",`Fetching base branch origin/${b.baseRef} for merge`,{phase:"conflict"});let he=await I({currentPrId:l.id,command:"git",args:["fetch","origin",b.baseRef],cwd:N,timeoutMs:12e4,phase:"conflict",successMessage:`Fetched origin/${b.baseRef}`});if(he.code!==0)throw new Error(`Failed to fetch base branch origin/${b.baseRef}: ${ir(he)}`);await g(l.id,"info",`Attempting merge of origin/${b.baseRef} into ${b.headRef}`,{phase:"conflict"});let le=await this.runtime.runCommand("git",["merge","FETCH_HEAD","--no-edit"],{cwd:N,timeoutMs:6e4});if(le.code!==0){await g(l.id,"info","Merge produced conflicts; invoking agent to resolve them",{phase:"conflict"});let de=(await this.runtime.runCommand("git",["diff","--name-only","--diff-filter=U"],{cwd:N,timeoutMs:1e4})).stdout.trim().split(`
851
+ `).filter(no=>no.trim().length>0);if(de.length===0)throw new Error(`Merge failed but no conflict files detected: ${le.stderr||le.stdout}`);await g(l.id,"info",`Found ${de.length} file(s) with merge conflicts`,{phase:"conflict",metadata:{conflictFiles:de}});let ue=h(l.id,"conflict.agent","stdout","info"),ke=h(l.id,"conflict.agent","stderr","warn"),xe=await this.github.resolveGitHubAuthToken(w),qe=xe?{...process.env,GITHUB_TOKEN:xe,GH_TOKEN:xe}:void 0,bn=Hu({pr:l,pullSummary:b,remoteName:q,conflictFiles:de});await g(l.id,"info",`Launching ${y} to resolve merge conflicts`,{phase:"conflict.agent",metadata:{agent:y,prompt:bn}}),await xa(y,bn);let ur=await this.runtime.applyFixesWithAgent({agent:y,cwd:N,prompt:bn,env:qe,onStdoutChunk:ue.onChunk,onStderrChunk:ke.onChunk});if(await ue.flush(),await ke.flush(),ur.code!==0)throw new Error(`Agent failed to resolve merge conflicts (${ur.code}): ${ur.stderr||ur.stdout}`);await g(l.id,"info","Agent completed merge conflict resolution",{phase:"conflict.agent",metadata:{code:ur.code}});let Ha=await this.runtime.runCommand("git",["status","--porcelain"],{cwd:N,timeoutMs:5e3});if(Ha.stdout.trim())throw new Error(`Agent left uncommitted changes after conflict resolution: ${Ha.stdout.trim()}`);await g(l.id,"info","Merge conflicts resolved and committed",{phase:"conflict"})}else{await g(l.id,"info","Merge completed without conflicts (GitHub mergeability may have been stale)",{phase:"conflict"});let re=await I({currentPrId:l.id,command:"git",args:["push",q,`HEAD:${b.headRef}`],cwd:N,timeoutMs:12e4,phase:"conflict",successMessage:`Pushed merge result to ${q}/${b.headRef}`});if(re.code!==0)throw new Error(`git push ${q} HEAD:${b.headRef} failed: ${re.stderr||re.stdout}`)}}if(Ge.length>0){let he=new Set(Ge.map(ue=>ue.id)),le=l.feedbackItems.map(ue=>he.has(ue.id)?Ni(ue):ue),re=sr(le),de=await this.storage.updatePR(l.id,{feedbackItems:le,accepted:re.accepted,rejected:re.rejected,flagged:re.flagged});de&&(l=de)}if(Ut||Ge.length>0||ft.length>0||Xe){let he=h(l.id,"agent","stdout","info"),le=h(l.id,"agent","stderr","warn"),re=await this.github.resolveGitHubAuthToken(w),de=re?{...process.env,GITHUB_TOKEN:re,GH_TOKEN:re}:void 0,ue=Ut&&k?k:Lu({pr:l,pullSummary:b,remoteName:q,commentTasks:Ge,statusTasks:ft,docsTaskSummary:Pr});await m({phase:"run.prompt-prepared",prompt:ue,initialHeadSha:B||b.headSha}),await g(l.id,"info",`Launching ${y} in autonomous mode`,{phase:"agent",metadata:{githubAuth:!!re,prompt:ue}}),await m({phase:"run.agent-running"}),await xa(y,ue);let ke=kr.agentRunning(y);await Promise.all(Ge.map(qe=>xr(qe.id,ke)));let xe=await this.runtime.applyFixesWithAgent({agent:y,cwd:N,prompt:ue,env:de,onStdoutChunk:he.onChunk,onStderrChunk:le.onChunk});if(await he.flush(),await le.flush(),xe.code!==0)throw await Promise.all(Ge.map(qe=>xr(qe.id,kr.agentFailed))),new Error(`Agent apply failed (${xe.code}): ${xe.stderr||xe.stdout}`);await Promise.all(Ge.map(qe=>xr(qe.id,kr.agentCompleted))),pn=$u(xe.stdout),De=Uu(xe.stdout),await g(l.id,"info",`${y} completed successfully`,{phase:"agent",metadata:{code:xe.code,extractedSummaries:pn.size,docsTaskOutcome:De?.outcome??null}}),await m({phase:"run.agent-finished"})}let Re=await I({currentPrId:l.id,command:"git",args:["status","--porcelain"],cwd:N,timeoutMs:5e3,phase:"verify.git.status",successMessage:"Collected worktree git status"});if(Re.code!==0)throw new Error(`git status failed: ${Re.stderr||Re.stdout}`);if(Re.stdout.trim())throw new Error(`Agent left uncommitted changes in the worktree: ${Re.stdout.trim()}`);await g(l.id,"info","Worktree is clean after agent run",{phase:"verify.git.status"});let Se=await I({currentPrId:l.id,command:"git",args:["rev-parse","HEAD"],cwd:N,timeoutMs:5e3,phase:"verify.git.local-head",successMessage:"Collected worktree HEAD"});if(Se.code!==0)throw new Error(`git rev-parse HEAD failed: ${Se.stderr||Se.stdout}`);let He=await I({currentPrId:l.id,command:"git",args:["-C",X,"fetch",q,b.headRef],timeoutMs:12e4,phase:"verify.git.fetch-head",successMessage:`Fetched ${q}/${b.headRef} for verification`});if(He.code!==0)throw new Error(`git fetch ${q} ${b.headRef} failed: ${He.stderr||He.stdout}`);let Ar=await I({currentPrId:l.id,command:"git",args:["-C",X,"rev-parse","FETCH_HEAD"],timeoutMs:5e3,phase:"verify.git.remote-head",successMessage:"Collected remote PR head SHA"});if(Ar.code!==0)throw new Error(`git rev-parse FETCH_HEAD failed: ${Ar.stderr||Ar.stdout}`);let Cr=Se.stdout.trim(),fn=Ar.stdout.trim();D=fn!==b.headSha;let Da=Cr!==b.headSha;if(Da&&fn!==Cr)throw new Error("Babysitter created a local commit but did not push it to the PR head branch");if(ft.length>0&&!D)throw new Error("Agent did not update the PR head branch for accepted failing status tasks");if(Xe&&!De)throw new Error("Agent did not report documentation task outcome");if(Xe&&!D&&De?.outcome!=="no_change")throw new Error("Agent did not update the PR head branch for required documentation tasks");if(Ye&&!D)throw new Error("Agent did not push conflict resolution to the PR head branch");if(Xe&&De?.outcome==="no_change"){let he=await this.storage.updatePR(l.id,{docsAssessment:{headSha:b.headSha,status:"not_needed",summary:De.summary,assessedAt:new Date().toISOString()}});he&&(l=he)}ee=Cr,await g(l.id,"info","Verified git branch state after agent run",{phase:"verify.git",metadata:{initialHeadSha:b.headSha,localHeadSha:Cr,remoteHeadSha:fn,branchMoved:D,localCommitCreated:Da,remoteName:q,docsTaskOutcome:De?.outcome??null}}),De&&await g(l.id,"info",`Documentation task outcome: ${De.outcome} - ${De.summary}`,{phase:"verify.docs",metadata:{outcome:De.outcome,branchMoved:D}})}finally{try{await g(l.id,"info","Cleaning up worktree",{phase:"cleanup"}),await rn({repoCacheDir:X,worktreePath:N,runCommand:this.runtime.runCommand}),await g(l.id,"info","Worktree cleanup complete",{phase:"cleanup"})}catch(Re){let Se=Re instanceof Error?Re.message:String(Re);await g(l.id,"error",`Worktree cleanup failed: ${Se}`,{phase:"cleanup"})}}}else await g(l.id,"info",`Babysitter found ${R.length} accepted feedback item(s) awaiting GitHub follow-up`,{phase:"run",metadata:{followUpTasks:R.length,agent:y}});if(Na&&M){let _=Tr.map(q=>q.fingerprint);await g(l.id,"info",`Launching dedicated CI healing attempt for ${_.length} fingerprint(s)`,{phase:"healing.run",metadata:{healingSessionId:M.id,targetFingerprints:_}}),M=await pe.markRepairing(M.id,{currentHeadSha:b.headSha,latestFingerprint:_[0]??M.latestFingerprint});let X=await this.github.resolveGitHubAuthToken(w),N=X?{...process.env,GITHUB_TOKEN:X,GH_TOKEN:X}:void 0;if(Q=await this.runtime.runCIHealingRepairAttempt?.({prNumber:l.number,repoFullName:b.repoFullName,repoCloneUrl:b.repoCloneUrl,headRepoFullName:b.headRepoFullName,headRepoCloneUrl:b.headRepoCloneUrl,headRef:b.headRef,baseRef:b.baseRef,headSha:b.headSha,title:b.title,url:b.url,author:b.author,branch:l.branch,agent:y,failures:Tr,runId:`${s}-ci-healing`,rootDir:Be().rootDir,env:N})??null,!Q)throw new Error("CI healing runtime is unavailable");dr=(await this.storage.createHealingAttempt({sessionId:M.id,attemptNumber:M.attemptCount,inputSha:b.headSha,outputSha:Q.accepted?Q.verification.remoteHeadSha:null,status:Q.accepted?"awaiting_ci":"failed",endedAt:Q.accepted?null:new Date().toISOString(),agent:y,promptDigest:Q.promptDigest,targetFingerprints:Q.targetFingerprints,summary:Q.summary,improvementScore:null,error:Q.rejectionReason})).id,hn=!0,Q.accepted?(M=await pe.markAwaitingCi(M.id,{currentHeadSha:Q.verification.remoteHeadSha,latestFingerprint:Q.targetFingerprints[0]??M.latestFingerprint}),D=Q.verification.pushedNewSha,ee=Q.verification.remoteHeadSha,Er=Q.remoteName):M=await pe.markEscalated(M.id,Q.rejectionReason??"CI healing attempt failed",{currentHeadSha:b.headSha,latestFingerprint:Q.targetFingerprints[0]??M.latestFingerprint})}await m({phase:"run.reconcile"});for(let _ of R){let X=!Ra(_,l.feedbackItems),N=Sr(sn(_));if(X){await g(l.id,"info",`Posting GitHub follow-up for ${_.id}${N?" and resolving conversation":""}`,{phase:"github.followup",metadata:{feedbackId:_.id,replyKind:_.replyKind,resolve:N}});let Y=qu(ee,_,pn.get(_.auditToken));await this.github.postFollowUpForFeedbackItem(x,v,_,Y,{resolve:N})}else if(N){if(!_.threadId){await g(l.id,"warn",`Cannot resolve review thread for ${_.id}: thread ID unavailable (skipping)`,{phase:"github.followup",metadata:{feedbackId:_.id}});continue}await this.github.resolveReviewThread(x,v,_.threadId)}await g(l.id,"info",`GitHub follow-up complete for ${_.id}`,{phase:"github.followup",metadata:{feedbackId:_.id,replyKind:_.replyKind,posted:X,resolved:N}}),await xr(_.id,kr.resolved(ee))}l=await this.syncFeedbackForPR(l.id,{runId:s,logStart:!0,phase:"verify.sync"});let Fa=ju({pr:l,followUpTasks:R,runStartedAtMs:i});if(Fa.length>0)throw new se(`GitHub audit trail verification failed: ${Fa.join("; ")}`,502);if(await g(l.id,"info","GitHub audit trail verified",{phase:"verify.github",metadata:{verifiedComments:R.length,remoteName:Er,branchMoved:D}}),R.length>0){let _=new Set(R.map(q=>q.id)),X=l.feedbackItems.map(q=>_.has(q.id)?sn(q):q),N=sr(X),Y=await this.storage.updatePR(l.id,{feedbackItems:X,accepted:N.accepted,rejected:N.rejected,flagged:N.flagged});Y&&(l=Y)}if(D&&ee){await g(l.id,"info","Waiting for CI/CD checks on new commit...",{phase:"verify.ci",metadata:{headSha:ee}});let _=await this.pollForCICompletion(x,T,v,ee,l.id,g);if(_.status==="failure"){let X=_.failures.map(N=>`${N.context}: ${N.description}`).join("; ");await g(l.id,"warn",`CI/CD still failing after agent fix: ${X}`,{phase:"verify.ci",metadata:{failures:_.failures}});try{let N=["## \u26A0\uFE0F CodeFactory CI Alert","",`The agent pushed changes (commit \`${ee.slice(0,7)}\`), but CI/CD checks are still failing:`,"",..._.failures.map(Y=>`- **${Y.context}**: ${Y.description}${Y.targetUrl?` ([details](${Y.targetUrl}))`:""}`),"","Manual investigation may be required."].join(`
852
+ `);await this.github.postPRComment(x,v,N)}catch(N){await p(l.id,"verify.ci",`Failed to post CI failure alert comment: ${Fe(N)}`)}if(await this.storage.updatePR(l.id,{testsPassed:!1,lastChecked:new Date().toISOString()}),hn&&Q&&dr&&M){M=await pe.markVerifying(M.id,{currentHeadSha:ee});let N=this.now().toISOString(),q=(this.github.fetchCheckSnapshotsForRef?await this.github.fetchCheckSnapshotsForRef(x,T,l.id,ee):_.failures.map(He=>({id:`${He.context}:${He.description}:${ee}`,prId:l.id,sha:ee,provider:"github.commit_status",context:He.context,status:"failure",conclusion:null,description:He.description,targetUrl:He.targetUrl,observedAt:N}))).filter(He=>la(He)),Re=pa(q);await Mi(this.storage,q),await $i(this.storage,M.id,ee,Re);let Se=Xu(Q.targetFingerprints,Re);await this.storage.updateHealingAttempt(dr,{outputSha:ee,status:"verified",endedAt:new Date().toISOString(),improvementScore:Se.improvementScore,error:Se.improvementScore>0?null:`CI failures remained unchanged or worsened after repair: ${X}`}),Se.improvementScore>0?M=await pe.markAwaitingRepairSlot(M.id,{currentHeadSha:ee,latestFingerprint:Se.remainingTargetFingerprints[0]??Re[0]?.fingerprint??null,lastImprovementScore:Se.improvementScore}):M=await pe.markEscalated(M.id,`CI failures remained unchanged or worsened after repair: ${X}`,{currentHeadSha:ee,latestFingerprint:Se.remainingTargetFingerprints[0]??Re[0]?.fingerprint??null,lastImprovementScore:Se.improvementScore})}}else _.status==="success"?(await g(l.id,"info","All CI/CD checks passed on new commit",{phase:"verify.ci",metadata:{headSha:ee}}),await this.storage.updatePR(l.id,{testsPassed:!0,lastChecked:new Date().toISOString()}),hn&&Q&&dr&&M&&(M=await pe.markVerifying(M.id,{currentHeadSha:ee}),await this.storage.updateHealingAttempt(dr,{outputSha:ee,status:"verified",endedAt:new Date().toISOString(),improvementScore:Math.max(2,Q.targetFingerprints.length*2),error:null}),M=await pe.markHealed(M.id,{currentHeadSha:ee,latestFingerprint:null,lastImprovementScore:Math.max(2,Q.targetFingerprints.length*2)}))):await g(l.id,"info","CI/CD checks did not complete within polling window; will re-check on next cycle",{phase:"verify.ci",metadata:{headSha:ee}})}await this.storage.updatePR(l.id,{status:"watching",lastChecked:new Date().toISOString()}),await g(l.id,"info","Babysitter run complete",{phase:"run",metadata:{remoteName:Er,branchMoved:D}}),await m({status:"completed",phase:"run.completed",lastError:null});return}catch(l){let w=l instanceof Error?l.message:String(l);await m({status:"failed",phase:"run.failed",lastError:w});let y=await this.storage.getPR(e);if(y){let x=l instanceof se&&D,v=x?"warn":"error",b=x?"Babysitter warning":"Babysitter error";if(await g(y.id,v,`${b}: ${w}`,{phase:"run"}),R.length>0){let O=new Set(R.map(te=>te.id)),G=y.feedbackItems.map(te=>O.has(te.id)?x?Di(te,`GitHub comment could not be posted: ${w}`):Fi(te,w):te),ae=sr(G);await this.storage.updatePR(y.id,{feedbackItems:G,accepted:ae.accepted,rejected:ae.rejected,flagged:ae.flagged,status:x?"watching":"error",lastChecked:new Date().toISOString()})}else await this.storage.updatePR(y.id,{status:x?"watching":"error",lastChecked:new Date().toISOString()})}console.error("Babysitter failure",l)}finally{await o,this.inProgress.delete(e)}}};var Zu={buildOctokit:je,resolveReviewThread:wr};function ec(t){return{accepted:t.filter(e=>e.decision==="accept").length,rejected:t.filter(e=>e.decision==="reject").length,flagged:t.filter(e=>e.decision==="flag").length}}async function Ji(t){let{storage:e,pr:r,feedbackId:n,decision:a,github:s=Zu}=t,i=r.feedbackItems.map(u=>u.id===n?Ci(u,a):u),o=i.find(u=>u.id===n);if(o?.threadId&&Sr(o)){let u=qr(r.url);if(!u)throw new se(`Invalid PR URL: ${r.url}`,500);let m=await e.getConfig(),g=await s.buildOctokit(m);await s.resolveReviewThread(g,u,o.threadId),i=i.map(p=>p.id===n?Ai(p):p)}let c=ec(i);return e.updatePR(r.id,{feedbackItems:i,accepted:c.accepted,rejected:c.rejected,flagged:c.flagged})}import{randomUUID as tc}from"crypto";var Qe=class extends Error{constructor(e){super(e),this.name="CancelBackgroundJobError"}},dn=class{storage;queue;handlers;handledKinds;workerId;pollIntervalMs;leaseMs;heartbeatIntervalMs;now;onError;activeJobs=new Map;running=!1;polling=!1;pollTimer=null;constructor(e){this.storage=e.storage,this.queue=e.queue,this.handlers=e.handlers,this.handledKinds=Object.keys(e.handlers),this.workerId=e.workerId??tc(),this.pollIntervalMs=e.pollIntervalMs??1e3,this.leaseMs=e.leaseMs??3e4,this.heartbeatIntervalMs=e.heartbeatIntervalMs??1e4,this.now=e.now??(()=>new Date),this.onError=e.onError??(r=>{console.error("Background job dispatcher error",r)})}async start(){this.running||(this.running=!0,await this.queue.requeueExpired(this.now()),this.wake())}stop(){this.running=!1,this.pollTimer&&(clearTimeout(this.pollTimer),this.pollTimer=null)}wake(){this.running&&this.schedulePoll(0)}getActiveRunCount(){return this.activeJobs.size}async waitForIdle(e=12e4){let r=Date.now();for(;this.activeJobs.size>0;){if(Date.now()-r>=e)return!1;await nc(25)}return!0}schedulePoll(e){this.running&&(this.pollTimer&&clearTimeout(this.pollTimer),this.pollTimer=setTimeout(()=>{this.pollTimer=null,this.pollOnce()},e))}async pollOnce(){if(!(!this.running||this.polling)){this.polling=!0;try{if(this.handledKinds.length===0||(await this.storage.getRuntimeState()).drainMode)return;await this.queue.requeueExpired(this.now());let r=await this.queue.claimNext({workerId:this.workerId,leaseMs:this.leaseMs,now:this.now(),kinds:this.handledKinds});if(!r)return;this.runJob(r),this.schedulePoll(0)}catch(e){this.onError(e)}finally{this.polling=!1,this.running&&!this.pollTimer&&this.schedulePoll(this.pollIntervalMs)}}}runJob(e){let r=e.leaseToken,n=this.handlers[e.kind],a=(async()=>{if(!r)throw new Error(`Claimed background job ${e.id} is missing a lease token`);let s=this.heartbeatIntervalMs>0?setInterval(()=>{this.queue.heartbeat({jobId:e.id,leaseToken:r,leaseMs:this.leaseMs,now:this.now()}).catch(i=>{this.onError(i)})},this.heartbeatIntervalMs):null;try{if(!n)throw new Error(`No background job handler registered for ${e.kind}`);await n(e),await this.queue.complete({jobId:e.id,leaseToken:r,now:this.now()})}catch(i){try{i instanceof Qe?await this.queue.cancel({jobId:e.id,leaseToken:r,error:i.message||null,now:this.now()}):await this.queue.fail({jobId:e.id,leaseToken:r,error:rc(i),now:this.now()})}catch(o){this.onError(o)}}finally{s&&clearInterval(s),this.activeJobs.delete(e.id)}})().catch(s=>{this.onError(s)}).finally(()=>{this.running&&this.schedulePoll(0)});this.activeJobs.set(e.id,a)}};function rc(t){return(t instanceof Error?t.message:String(t)).trim().slice(0,2e3)}function nc(t){return new Promise(e=>setTimeout(e,t))}import ac from"path";function sc(t){switch(t.toUpperCase()){case"READY":return"ready";case"BUILDING":return"building";case"DEPLOYING":case"QUEUED":case"INITIALIZING":return"deploying";case"ERROR":case"CANCELED":return"error";default:return"error"}}function ic(t){switch(t.toUpperCase()){case"SUCCESS":return"ready";case"BUILDING":return"building";case"DEPLOYING":return"deploying";case"INITIALIZING":case"QUEUED":return"deploying";case"FAILED":case"CRASHED":case"REMOVED":return"error";default:return"error"}}function Gi(t){return ac.join(Be().repoRootDir,Zr(t))}var Sa=class{platform="vercel";run;constructor(e){this.run=e??Z}async getDeploymentStatus(e){let{sha:r}=e,n=await this.run("vercel",["list","--meta",`githubCommitSha=${r}`,"--json"]);if(n.code!==0)return{state:"error",deploymentId:null,url:null,error:n.stderr||"vercel list failed"};let a;try{a=JSON.parse(n.stdout)}catch{return{state:"error",deploymentId:null,url:null,error:"Failed to parse vercel list output"}}let s=a.deployments??[];if(s.length===0)return{state:"not_found",deploymentId:null,url:null,error:null};let i=s[0],o=i.state.toUpperCase();return{state:sc(i.state),deploymentId:i.uid,url:i.url??null,error:o==="ERROR"?i.errorMessage??"Deployment failed":null}}async getDeploymentLogs(e){let{deploymentId:r}=e,n=await this.run("vercel",["inspect",r,"--json"]),a=r;if(n.code===0)try{let i=JSON.parse(n.stdout);i.url&&(a=i.url)}catch{}let s=await this.run("vercel",["logs",a]);return s.stdout||s.stderr}},ka=class{platform="railway";run;constructor(e){this.run=e??Z}async getDeploymentStatus(e){let r=await this.run("railway",["status","--json"],{cwd:Gi(e.repo)});if(r.code!==0)return{state:"error",deploymentId:null,url:null,error:r.stderr||"railway status failed"};let n;try{n=JSON.parse(r.stdout)}catch{return{state:"error",deploymentId:null,url:null,error:"Failed to parse railway status output"}}return{state:ic(n.status??""),deploymentId:n.deploymentId??null,url:n.url??null,error:null}}async getDeploymentLogs(e){let{repo:r,deploymentId:n}=e,a=await this.run("railway",["logs","--deployment",n],{cwd:Gi(r)});return a.stdout||a.stderr}};function Xi(t,e){switch(t.toLowerCase()){case"vercel":return new Sa(e);case"railway":return new ka(e);default:throw new Error(`Unsupported deployment platform: ${t}`)}}function oc(t){return{ensureRepoCache:t?.ensureRepoCache??en,applyFixesWithAgent:t?.applyFixesWithAgent??tr,runCommand:t?.runCommand??Z}}function lc(t){return["You are fixing a failed deployment for a repository.","A pull request was merged but the deployment to the platform failed.","Your task is to diagnose the deployment failure and apply the minimal fix.","Create a new branch named deploy-fix/<platform>-<timestamp> from the merge SHA.","Commit your fix to that branch and push it.","At the end of your response, include exactly one line in this format:","DEPLOYMENT_FIX_SUMMARY: <one short sentence describing what was fixed>","",`Repository: ${t.repo}`,`Platform: ${t.platform}`,`Merge SHA: ${t.mergeSha}`,`Base branch: ${t.baseBranch}`,`Trigger PR: #${t.triggerPrNumber}`,`Trigger PR title: ${t.triggerPrTitle}`,`Trigger PR URL: ${t.triggerPrUrl}`,"","Deployment failure log:","```",t.deploymentLog,"```","","Instructions:","1. Analyze the deployment log to identify the root cause of the failure.","2. Apply the minimal code change needed to fix the deployment error.","3. Commit your changes with a descriptive commit message.","4. Push the fix branch to origin.","5. Do not merge the branch \u2014 a PR will be created automatically.","6. Include the DEPLOYMENT_FIX_SUMMARY line at the end of your output."].join(`
853
+ `)}function va(t){let e=t.match(/^DEPLOYMENT_FIX_SUMMARY:\s*(.+)$/m);if(e?.[1])return e[1].trim();let r=t.trim();if(!r)return"No agent summary provided";let n=r.split(/\r?\n/).map(a=>a.trim()).filter(Boolean);return n[n.length-1]??"No agent summary provided"}async function qi(t){let e=oc(t.dependencies),r=`deploy-fix/${t.platform}-${Math.floor(Date.now()/1e3)}`,n=lc(t),{repoCacheDir:a}=await e.ensureRepoCache({rootDir:t.rootDir,repoFullName:t.repo,repoCloneUrl:t.repoCloneUrl,runCommand:e.runCommand}),s=await e.runCommand("git",["-C",a,"checkout","-b",r,t.mergeSha],{timeoutMs:3e4});if(s.code!==0)return{accepted:!1,rejectionReason:`branch creation failed: ${s.stderr||s.stdout}`,summary:"No agent summary provided",fixBranch:r,agentResult:s};try{let i=await e.applyFixesWithAgent({agent:t.agent,cwd:a,prompt:n,env:t.env}),o=await e.runCommand("git",["-C",a,"log",`${t.mergeSha}..HEAD`,"--oneline"],{timeoutMs:1e4});if(!(o.code===0&&o.stdout.trim().length>0))return{accepted:!1,rejectionReason:"agent did not produce any new commits",summary:va(i.stdout),fixBranch:r,agentResult:i};let u=await e.runCommand("git",["-C",a,"push","origin",r],{timeoutMs:6e4});return u.code!==0?{accepted:!1,rejectionReason:`push failed: ${u.stderr||u.stdout}`,summary:va(i.stdout),fixBranch:r,agentResult:i}:{accepted:!0,rejectionReason:null,summary:va(i.stdout),fixBranch:r,agentResult:i}}finally{await e.runCommand("git",["-C",a,"checkout","--detach"],{timeoutMs:15e3})}}async function Wi(t){let{storage:e,prId:r,questionId:n,question:a,preferredAgent:s}=t;await e.updateQuestion(n,{status:"answering"});try{let i=await dc(e,r),o=await pt(s),c=uc(i,a),u=await Z(o,o==="claude"?["-p","--output-format","text",c]:["exec","--skip-git-repo-check","--sandbox","read-only",c],{timeoutMs:18e4});if(u.code!==0){let g=u.stderr||u.stdout||`Agent exited with code ${u.code}`;await e.updateQuestion(n,{status:"error",error:g.slice(0,2e3)});return}let m=u.stdout.trim()||"(Agent returned an empty response)";await e.updateQuestion(n,{status:"answered",answer:m,answeredAt:new Date().toISOString()})}catch(i){let o=i instanceof Error?i.message:String(i);await e.updateQuestion(n,{status:"error",error:o.slice(0,2e3)})}}async function dc(t,e){let r=await t.getPR(e);if(!r)throw new Error("PR not found");let a=(await t.getLogs(e)).slice(-50).map(i=>`[${i.timestamp}] ${i.level.toUpperCase()} ${i.phase?`[${i.phase}]`:""} ${i.message}`).join(`
854
+ `),s=r.feedbackItems.map(i=>[`- [${i.status}]`,i.decision?`decision=${i.decision}`:"",`by ${i.author}`,i.file?`on ${i.file}${i.line?`:${i.line}`:""}`:"",`:: ${i.body.slice(0,200)}`].filter(Boolean).join(" "));return{title:r.title,number:r.number,repo:r.repo,branch:r.branch,author:r.author,url:r.url,status:r.status,testsPassed:r.testsPassed,lintPassed:r.lintPassed,lastChecked:r.lastChecked,feedbackSummary:s.length>0?s.join(`
855
+ `):"(no feedback items)",recentLogs:a||"(no recent activity)"}}function uc(t,e){return["You are Code Factory, a PR review automation assistant. A user is asking a question about the following pull request.","Answer concisely based on the context provided. If the information is not available in the context, say so.","","## Pull Request",`- Title: ${t.title}`,`- Number: #${t.number}`,`- Repository: ${t.repo}`,`- Branch: ${t.branch}`,`- Author: ${t.author}`,`- URL: ${t.url}`,`- Status: ${t.status}`,`- Tests: ${t.testsPassed===null?"not checked":t.testsPassed?"passing":"failing"}`,`- Lint: ${t.lintPassed===null?"not checked":t.lintPassed?"passing":"failing"}`,`- Last checked: ${t.lastChecked??"never"}`,"","## Feedback Items",t.feedbackSummary,"","## Recent Activity Logs (most recent 50 entries)",t.recentLogs,"","## User Question",e].join(`
856
+ `)}function ht(t,e){let r=t.payload[e];return typeof r=="string"&&r.length>0?r:null}function cc(t,e){let r=ht(t,e);return r==="codex"||r==="claude"?r:null}function Vi(t){return new Promise(e=>setTimeout(e,t))}function Ki(t){let e=t.storage,r=t.babysitter,n=t.releaseManager,a=t.deploymentHealingManager,s=t.questionAnswerer??Wi,i=t.socialChangelogGenerator??nn,o=t.deps?.buildOctokitFn??je,c=t.deps?.createAdapterFn??Xi,u=t.deps?.resolveGitHubAuthTokenFn??rr,m=t.deps?.runDeploymentHealingRepairFn??qi;return{sync_watched_repos:r?async()=>{await r.syncAndBabysitTrackedRepos()}:void 0,babysit_pr:r?async g=>{let p=await e.getPR(g.targetId);if(!p)throw new Qe(`PR ${g.targetId} no longer exists`);let h=cc(g,"preferredAgent")??(await e.getConfig()).codingAgent;await r.runQueuedBabysitPR(p.id,h)}:void 0,answer_pr_question:async g=>{let p=ht(g,"prId");if(!p)throw new Qe(`Background job ${g.id} is missing question PR context`);let h=(await e.getQuestions(p)).find(R=>R.id===g.targetId);if(!h)throw new Qe(`PR question ${g.targetId} no longer exists`);if(h.status==="answered"||h.status==="error")return;let I=await e.getConfig();await s({storage:e,prId:h.prId,questionId:h.id,question:h.question,preferredAgent:I.codingAgent})},generate_social_changelog:async g=>{let p=await e.getSocialChangelog(g.targetId);if(!p)throw new Qe(`Social changelog ${g.targetId} no longer exists`);if(p.status==="done"||p.status==="error")return;let h=await e.getConfig();await i({storage:e,changelogId:p.id,prSummaries:p.prSummaries,date:p.date,preferredAgent:h.codingAgent})},process_release_run:n?async g=>{let p=await e.getReleaseRun(g.targetId);if(!p)throw new Qe(`Release run ${g.targetId} no longer exists`);p.status==="published"||p.status==="skipped"||await n.processReleaseRun(p.id)}:void 0,heal_deployment:a?async g=>{let p=a,h=ht(g,"repo"),I=ht(g,"platform"),R=ht(g,"mergeSha"),k=Number(g.payload.triggerPrNumber),V=ht(g,"triggerPrTitle"),B=ht(g,"triggerPrUrl"),A=ht(g,"baseBranch");if(!h||!I||!R||!k||!V||!B||!A)throw new Qe(`Background job ${g.id} is missing required deployment healing fields`);let F=await p.ensureSession({repo:h,platform:I,triggerPrNumber:k,triggerPrTitle:V,triggerPrUrl:B,mergeSha:R}),D=await e.getConfig();await Vi(D.deploymentCheckDelayMs);let l=c(I),w=Date.now()+D.deploymentCheckTimeoutMs,y=await l.getDeploymentStatus({repo:h,sha:R});for(;y.state!=="ready"&&y.state!=="error"&&Date.now()<w;)await Vi(D.deploymentCheckPollIntervalMs),y=await l.getDeploymentStatus({repo:h,sha:R});if(y.state==="ready")return;if(y.state!=="error"){await p.transitionTo(F.id,"escalated",{error:`Deployment status timed out in state: ${y.state}`});return}let T=y.deploymentId??"unknown",x=await l.getDeploymentLogs({repo:h,deploymentId:T});await p.transitionTo(F.id,"failed",{deploymentId:T,deploymentLog:x}),await p.transitionTo(F.id,"fixing");try{let v=Ne(h);if(!v)throw new Error(`Cannot parse repo slug: ${h}`);let b=await u(D),O=await o(D),G=await m({repo:h,platform:I,mergeSha:R,triggerPrNumber:k,triggerPrTitle:V,triggerPrUrl:B,deploymentLog:x,baseBranch:A,repoCloneUrl:Wr(h,b),agent:D.codingAgent,githubToken:b??""});if(!G.accepted){await p.transitionTo(F.id,"escalated",{error:G.rejectionReason??"Repair not accepted"});return}let ae=await O.pulls.create({owner:v.owner,repo:v.repo,title:`fix(deploy): ${G.summary}`,head:G.fixBranch,base:A,body:[`Automated deployment fix for ${I} failure after #${k}.`,"",`**Summary:** ${G.summary}`,"",`Triggered by merge of ${B}.`].join(`
857
+ `)});await p.transitionTo(F.id,"fix_submitted",{fixBranch:G.fixBranch,fixPrNumber:ae.data.number,fixPrUrl:ae.data.html_url})}catch(v){await p.transitionTo(F.id,"escalated",{error:v instanceof Error?v.message:String(v)})}}:void 0}}function zi(t,e){let r=null,n=!1,a=[],s=[],i=c=>{let u=s;s=[];let m=c[0];for(let g of u){if(g.propagateErrors&&m!==void 0){g.reject(m);continue}g.resolve()}},o=c=>{let u=new Promise((m,g)=>{s.push({propagateErrors:c,resolve:m,reject:g})});return r?(n=!0,u):(a=[],r=(async()=>{try{do{n=!1;try{await t()}catch(m){a.push(m),e(m)}}while(n)}finally{let m=a;a=[],r=null,i(m)}})(),u)};return{run:()=>o(!1),runAndReportErrors:()=>o(!0)}}import{mkdtemp as gc,readFile as mc,rm as pc}from"fs/promises";import{tmpdir as hc}from"os";import Qi from"path";var fc=12e4;async function Zi(t){let e=t.cwd??process.cwd(),r=t.timeoutMs??fc,n=await pt(t.preferredAgent),a=bc(t);if(n==="codex"){let i=await gc(Qi.join(hc(),"codex-release-eval-")),o=Qi.join(i,"output.txt");try{let c=await Z("codex",["exec","--skip-git-repo-check","--sandbox","read-only","-o",o,a],{cwd:e,timeoutMs:r});if(c.code!==0)throw new Error(`codex release evaluation failed (${c.code}): ${c.stderr||c.stdout}`);let u=await mc(o,"utf8");return Yi(u)}finally{await pc(i,{recursive:!0,force:!0})}}let s=await Z("claude",["-p","--output-format","text",a],{cwd:e,timeoutMs:r});if(s.code!==0)throw new Error(`claude release evaluation failed (${s.code}): ${s.stderr||s.stdout}`);return Yi(s.stdout)}function bc(t){let e=t.includedPulls.map((r,n)=>[`${n+1}. PR #${r.number} by @${r.author}`,` Title: ${r.title}`,` URL: ${r.url}`,` Merged at: ${r.mergedAt}`,` Merge SHA: ${r.mergeSha}`].join(`
856
858
  `)).join(`
857
- `);return["Respond with ONLY valid JSON and nothing else.","Schema:",'{"shouldRelease":boolean,"reason":string,"bump":"patch"|"minor"|"major"|null,"title":string|null,"notes":string|null}',"","You are deciding whether a merged set of pull requests should be published as a GitHub release.","Be conservative. Release only when the merged changes are meaningful enough for users or operators to care about.","",`Repository: ${r.repo}`,`Release branch: ${r.baseBranch}`,`Latest release tag: ${r.latestTag??"none"}`,"",`Trigger PR: #${r.triggerPr.number} "${r.triggerPr.title}"`,`Trigger merged at: ${r.triggerPr.mergedAt}`,`Trigger merge SHA: ${r.triggerPr.mergeSha}`,"","Merged PRs included in this candidate release:",e||"(none)","","Decision rules:","- shouldRelease=true only when the merged changes are worth announcing as a GitHub release.","- bump must be null when shouldRelease=false.","- bump must be one of patch, minor, or major when shouldRelease=true.","- Use patch for fixes or small improvements, minor for additive user-facing features, and major for breaking changes.","- title should be short and release-note ready when shouldRelease=true, else null.","- notes should be GitHub-release Markdown focused on user-visible/operator-visible impact when shouldRelease=true, else null.","- notes must have exactly TWO sections in this order:"," 1. '## Why This Matters' \u2014 a user-friendly, value-driven summary at the top that explains how the release makes users' lives better."," 2. '## Detailed Changes' \u2014 a line-by-line changelog of the included changes in plain English, more detailed than a headline but not deeply technical.","- notes should mention the key merged PRs in plain language, not internal process commentary.","- Prefer user outcomes, workflow improvements, and visible behavior over implementation details."].join(`
858
- `)}function Ni(r){let e=Yu(r.trim());if(!e||typeof e!="object")throw new Error(`Could not parse release evaluation JSON: ${r.slice(0,500)}`);let t=e;if(typeof t.shouldRelease!="boolean")throw new Error("Release evaluation missing boolean 'shouldRelease'");if(typeof t.reason!="string"||t.reason.trim().length===0)throw new Error("Release evaluation missing string 'reason'");if(!t.shouldRelease)return{shouldRelease:!1,reason:t.reason.trim(),bump:null,title:null,notes:null};if(t.bump!=="patch"&&t.bump!=="minor"&&t.bump!=="major")throw new Error("Release evaluation returned invalid 'bump'");if(typeof t.title!="string"||t.title.trim().length===0)throw new Error("Release evaluation missing non-empty 'title'");if(typeof t.notes!="string"||t.notes.trim().length===0)throw new Error("Release evaluation missing non-empty 'notes'");return{shouldRelease:!0,reason:t.reason.trim(),bump:t.bump,title:t.title.trim(),notes:t.notes.trim()}}function Yu(r){try{return JSON.parse(r)}catch{}let e=r.indexOf("{"),t=r.lastIndexOf("}");if(e===-1||t===-1||t<=e)return null;try{return JSON.parse(r.slice(e,t+1))}catch{return null}}var Br=class{storage;github;evaluateRelease;scheduleBackgroundJob;inProgress=new Set;repoLocks=new Map;constructor(e,t){this.storage=e,this.github=t.github,this.evaluateRelease=t.evaluateRelease??Di,this.scheduleBackgroundJob=t.scheduleBackgroundJob}getActiveRunCount(){return this.inProgress.size}async waitForIdle(e=12e4){let t=Date.now();for(;this.inProgress.size>0;){if(Date.now()-t>=e)return!1;await ac(50)}return!0}async enqueueMergedPullReleaseEvaluation(e){let t=await this.storage.getReleaseRunByTrigger(e.repo,e.triggerPrNumber,e.triggerMergeSha);if(t)return nc(t.status)||this.scheduleProcessing(t.id),t;let n=await this.storage.createReleaseRun({repo:e.repo,baseBranch:e.baseBranch,triggerPrNumber:e.triggerPrNumber,triggerPrTitle:e.triggerPrTitle,triggerPrUrl:e.triggerPrUrl,triggerMergeSha:e.triggerMergeSha,triggerMergedAt:e.triggerMergedAt,status:"detected",decisionReason:null,recommendedBump:null,proposedVersion:null,releaseTitle:null,releaseNotes:null,includedPrs:[],targetSha:e.triggerMergeSha,githubReleaseId:null,githubReleaseUrl:null,error:null,completedAt:null});return this.scheduleProcessing(n.id),n}async retryReleaseRun(e){if(!await this.storage.getReleaseRun(e))return;let n=await this.storage.updateReleaseRun(e,{status:"detected",error:null,completedAt:null});if(n)return this.scheduleProcessing(e),n}async processReleaseRun(e){let t=await this.storage.getReleaseRun(e);if(t)return this.withRepoLock(t.repo,async()=>{if(this.inProgress.has(e))return this.storage.getReleaseRun(e);this.inProgress.add(e);try{let n=await this.storage.getReleaseRun(e);if(!n)return;if(n.status==="published"||n.status==="skipped")return n;let a=ke(n.repo);if(!a)return this.failRun(e,`Invalid repository slug: ${n.repo}`);let s=await this.storage.getConfig();if(!s.autoCreateReleases)return await this.storage.updateReleaseRun(e,{status:"skipped",decisionReason:"Automatic release creation is disabled in settings",completedAt:new Date().toISOString()})??void 0;await this.storage.updateReleaseRun(e,{status:"evaluating",error:null,completedAt:null});let i=await this.github.buildOctokit(s),o=await this.github.findLatestSemverReleaseTag(i,a),c=Zu(n),p=await this.loadIncludedPulls(i,a,n,c),m=p.map(ec),u=await this.evaluateRelease({preferredAgent:s.codingAgent,repo:n.repo,baseBranch:n.baseBranch,latestTag:o,triggerPr:c,includedPulls:p});if(!u.shouldRelease)return await this.storage.updateReleaseRun(e,{status:"skipped",decisionReason:u.reason,recommendedBump:null,proposedVersion:null,releaseTitle:null,releaseNotes:null,includedPrs:m,targetSha:n.triggerMergeSha,completedAt:new Date().toISOString()})??void 0;if(!u.bump)throw new Error("Release evaluation approved publishing but did not provide a semver bump");let g=this.github.bumpReleaseTag(o,u.bump),P=tc(u,g),A=u.notes??`Release ${g}`;await this.storage.updateReleaseRun(e,{status:"proposed",decisionReason:u.reason,recommendedBump:u.bump,proposedVersion:g,releaseTitle:P,releaseNotes:A,includedPrs:m,targetSha:n.triggerMergeSha});let w=this.github.findReleaseByTag?await this.github.findReleaseByTag(i,a,g):null;if(w)return await this.storage.updateReleaseRun(e,{status:"published",githubReleaseId:w.id,githubReleaseUrl:w.url,completedAt:new Date().toISOString()})??void 0;await this.storage.updateReleaseRun(e,{status:"publishing"});let k=await this.github.createGitHubRelease(i,a,{tagName:g,targetCommitish:n.triggerMergeSha,name:P,body:A});return await this.storage.updateReleaseRun(e,{status:"published",githubReleaseId:k.id,githubReleaseUrl:k.url,completedAt:new Date().toISOString()})??void 0}catch(n){return this.failRun(e,rc(n))}finally{this.inProgress.delete(e)}})}async loadIncludedPulls(e,t,n,a){if(!this.github.listMergedPullsForReleaseCandidate)return[a];let s=await this.github.listMergedPullsForReleaseCandidate(e,t,{baseBranch:n.baseBranch,untilMergedAt:n.triggerMergedAt,triggerPr:a}),i=new Map;for(let o of s)i.set(o.mergeSha||`${o.repo}#${o.number}`,o);return i.has(a.mergeSha)||i.set(a.mergeSha,a),Array.from(i.values()).sort((o,c)=>o.mergedAt.localeCompare(c.mergedAt))}async failRun(e,t){return this.storage.updateReleaseRun(e,{status:"error",error:t,completedAt:new Date().toISOString()})}async withRepoLock(e,t){let n=this.repoLocks.get(e)??Promise.resolve(),a,s=new Promise(o=>{a=()=>o()}),i=n.then(()=>s);this.repoLocks.set(e,i),await n;try{return await t()}finally{a?.(),this.repoLocks.get(e)===i&&this.repoLocks.delete(e)}}scheduleProcessing(e){if(this.scheduleBackgroundJob){this.scheduleBackgroundJob("process_release_run",e,Ie("process_release_run",e),{releaseRunId:e}).catch(t=>{console.error(`Failed to schedule release run ${e}:`,t)});return}this.processReleaseRun(e).catch(()=>{})}};function Zu(r){return{number:r.triggerPrNumber,title:r.triggerPrTitle,url:r.triggerPrUrl,author:"unknown",repo:r.repo,mergedAt:r.triggerMergedAt,mergeSha:r.triggerMergeSha}}function ec(r){return{number:r.number,title:r.title,url:r.url,author:r.author,mergedAt:r.mergedAt,mergeSha:r.mergeSha}}function tc(r,e){let t=r.title?.trim();return t?t.startsWith(e)?t:`${e} - ${t}`:e}function rc(r){return(r instanceof Error?r.message:String(r)).trim().slice(0,2e3)}function nc(r){return r==="skipped"||r==="published"}function ac(r){return new Promise(e=>setTimeout(e,r))}var sc=["fix_submitted","escalated"],ic={monitoring:["failed","escalated"],failed:["fixing","escalated"],fixing:["fix_submitted","escalated"],fix_submitted:[],escalated:[]},jr=class{constructor(e,t=()=>new Date){this.storage=e;this.clock=t}async createSession(e){return this.storage.createDeploymentHealingSession({...e,deploymentId:null,deploymentLog:null,fixBranch:null,fixPrNumber:null,fixPrUrl:null,state:"monitoring",error:null,completedAt:null})}async ensureSession(e){let t=await this.storage.getDeploymentHealingSessionByRepoAndMergeSha(e.repo,e.mergeSha);return t||this.createSession(e)}async transitionTo(e,t,n={}){let a=await this.storage.getDeploymentHealingSession(e);if(!a)throw new Error(`Deployment healing session not found: ${e}`);if(a.state===t){let o=await this.storage.updateDeploymentHealingSession(e,n);if(!o)throw new Error(`Deployment healing session not found: ${e}`);return o}if(!ic[a.state].includes(t))throw new Error(`Illegal deployment healing transition: ${a.state} -> ${t}`);let s={...n,state:t};sc.includes(t)&&(s.completedAt=n.completedAt??this.clock().toISOString());let i=await this.storage.updateDeploymentHealingSession(e,s);if(!i)throw new Error(`Deployment healing session not found: ${e}`);return i}};var ue=class extends Error{statusCode;constructor(e,t){super(t),this.name="AppRuntimeError",this.statusCode=e}};function Fi(r){return r instanceof Error?r.message:String(r)}function re(r,e){if(r===void 0)throw new ue(404,e);return r}function Hi(r={}){let e=r.storage??ls(),t=new oc,n=r.backgroundJobQueue??new Lr(e),a,s=async(...d)=>{let y=await n.enqueue(...d);return a.wake(),y},i=r.deploymentHealingManager??new jr(e),o=r.releaseManager??new Br(e,{github:{buildOctokit:Ce,findLatestSemverReleaseTag:As,bumpReleaseTag:xs,listMergedPullsForReleaseCandidate:async(d,y,h)=>{let S=await js(d,y,{baseRef:h.baseBranch}),_=Date.parse(h.untilMergedAt);return S.filter(v=>!Number.isFinite(_)||Date.parse(v.mergedAt)<=_).map(v=>({number:v.number,title:v.title,url:v.url,author:v.author,repo:v.repo,mergedAt:v.mergedAt,mergeSha:v.mergeCommitSha??`${v.repo}#${v.number}`}))},findReleaseByTag:async(d,y,h)=>{let _=(await Er(d,y)).find(v=>!v.draft&&v.tagName===h);return _?{id:_.id,url:_.htmlUrl,tagName:_.tagName,name:_.name}:null},createGitHubRelease:async(d,y,h)=>{let S=await Cs(d,y,{tagName:h.tagName,targetCommitish:h.targetCommitish,name:h.name,body:h.body});return{id:S.id,url:S.htmlUrl,tagName:S.tagName,name:S.name}}},scheduleBackgroundJob:s}),c=r.babysitter??new $r(e,void 0,void 0,o,s,i);a=r.backgroundJobDispatcher??new Ur({storage:e,queue:n,handlers:Ai({storage:e,babysitter:c,releaseManager:o,deploymentHealingManager:i})});let p=null,m=0,u=r.watcherScheduler??Ci(async()=>{await s("sync_watched_repos","runtime:1",Ie("sync_watched_repos","runtime:1"))},d=>{console.error("Repository babysitter watcher failed",d)}),g=u.run,P=r.startBackgroundServices??!0,A=r.startWatcher??P,w=!1,k=()=>{t.emit("change")},X=async()=>({...await e.getRuntimeState(),activeRuns:a.getActiveRunCount()}),M=async d=>{let[y,h,S]=await Promise.all([a.waitForIdle(d),c.waitForIdle(d),o.waitForIdle(d)]);return y&&h&&S},E=async()=>{let d=await e.getConfig(),y=Math.max(1e4,d.pollIntervalMs||12e4);p&&m===y||(p&&(clearInterval(p),p=null),m=y,p=setInterval(()=>{g()},y))},N=async(d,y)=>{await s("babysit_pr",d,Ie("babysit_pr",d),{preferredAgent:y})},H={async start(){w||(w=!0,P&&await a.start(),A&&(await E(),c.resumeInterruptedRuns(),g()))},stop(){w=!1,a.stop(),p&&(clearInterval(p),p=null)},subscribe(d){return t.on("change",d),()=>{t.off("change",d)}},getRuntimeSnapshot:X,async setDrainMode(d){let y=await e.updateRuntimeState({drainMode:d.enabled,drainRequestedAt:d.enabled?new Date().toISOString():null,drainReason:d.enabled?d.reason??null:null});if(d.enabled&&d.waitForIdle){let S=await M(d.timeoutMs??12e4),_=await X();return k(),{...y,..._,drained:S}}let h=await X();return k(),{...y,...h}},async listRepos(){let d=await e.getConfig(),y=await e.getPRs();return Array.from(new Set([...d.watchedRepos,...y.map(h=>h.repo)])).sort((h,S)=>h.localeCompare(S))},async addRepo(d){let y=ke(d);if(!y)throw new ue(400,"Invalid repository. Use owner/repo or https://github.com/owner/repo");let h=Rt(y),S=await e.getConfig();return S.watchedRepos.includes(h)||await e.updateConfig({watchedRepos:[...S.watchedRepos,h].sort((_,v)=>_.localeCompare(v))}),g(),k(),{repo:h}},async syncRepos(){if((await e.getRuntimeState()).drainMode)throw new ue(409,"Drain mode is enabled. Sync-triggered runs are blocked until drain mode is disabled.");return await u.runAndReportErrors(),k(),{ok:!0}},async listPRs(d="active"){return d==="archived"?e.getArchivedPRs():e.getPRs()},async getPR(d){return await e.getPR(d)??null},async addPR(d){let y;try{({url:y}=Za.parse({url:d}))}catch(Z){throw Z instanceof l.ZodError?new ue(400,Z.errors[0]?.message??"Invalid PR URL"):Z}let h=vr(y);if(!h)throw new ue(400,"Invalid GitHub PR URL. Expected: https://github.com/owner/repo/pull/123");let S=`${h.owner}/${h.repo}`,_=await e.getPRByRepoAndNumber(S,h.number);if(_)return _;let v=await e.getConfig(),b=await Ce(v),B=await Pr(b,h),G=await e.addPR({number:h.number,title:B.title,repo:S,branch:B.branch,author:B.author,url:B.url,status:"watching",feedbackItems:[],accepted:0,rejected:0,flagged:0,testsPassed:null,lintPassed:null,lastChecked:null});return await e.addLog(G.id,"info",`Registered PR #${h.number} from ${S}`),await e.addLog(G.id,"info",`Repository ${S} added to auto-babysit watch list`),v.watchedRepos.includes(S)||await e.updateConfig({watchedRepos:[...v.watchedRepos,S].sort((Z,Q)=>Z.localeCompare(Q))}),await N(G.id,v.codingAgent),k(),G},async removePR(d){if(!await e.removePR(d))throw new ue(404,"PR not found");return k(),{ok:!0}},async setPRWatchEnabled(d,y){let h=re(await e.getPR(d),"PR not found"),S=await e.updatePR(h.id,{watchEnabled:y}),_=re(S,"PR not found");return h.watchEnabled!==y&&(await e.addLog(h.id,"info",y?"Background watch resumed":"Background watch paused"),y&&g()),k(),_},async setWatchEnabled(d,y){return H.setPRWatchEnabled(d,y)},async fetchPRFeedback(d){let y=re(await e.getPR(d),"PR not found");await e.updatePR(y.id,{status:"processing",lastChecked:new Date().toISOString()}),await e.addLog(y.id,"info","Syncing GitHub comments/reviews...");try{let h=await c.syncFeedbackForPR(y.id);return k(),h}catch(h){let S=Fi(h);throw await e.updatePR(y.id,{status:"error",lastChecked:new Date().toISOString()}),await e.addLog(y.id,"error",`Fetch failed: ${S}`),h}},async triagePR(d){let y=re(await e.getPR(d),"PR not found");await e.updatePR(y.id,{status:"processing"}),await e.addLog(y.id,"info","Triaging feedback...");let h=y.feedbackItems.map(B=>{if(B.decision)return B;let G=B.body.toLowerCase();return G.includes("lgtm")||G.includes("looks good")?St(B,!1,"Acknowledgement, no code change requested"):G.includes("please")||G.includes("should")||G.includes("fix")||G.includes("error")||G.includes("fail")?{...St(B,!0,"Likely actionable request"),action:B.body}:ci(B,"Unclear actionability, flagged for manual review")}),S=h.filter(B=>B.decision==="accept").length,_=h.filter(B=>B.decision==="reject").length,v=h.filter(B=>B.decision==="flag").length,b=await e.updatePR(y.id,{feedbackItems:h,accepted:S,rejected:_,flagged:v,status:"watching"});return await e.addLog(y.id,"info",`Triage complete: ${S} accept, ${_} reject, ${v} flag`),k(),re(b,"PR not found")},async applyPR(d){let y=re(await e.getPR(d),"PR not found");if((await e.getRuntimeState()).drainMode)throw new ue(409,"Drain mode is enabled. Manual runs are blocked until drain mode is disabled.");let S=await e.getConfig();await e.updatePR(y.id,{status:"processing"}),await e.addLog(y.id,"info",`Launching autonomous babysitter run using ${S.codingAgent}`),await N(y.id,S.codingAgent);let _=await e.getPR(y.id);return k(),re(_,"PR disappeared after apply run")},async babysitPR(d){let y=re(await e.getPR(d),"PR not found");if((await e.getRuntimeState()).drainMode)throw new ue(409,"Drain mode is enabled. Manual runs are blocked until drain mode is disabled.");let S=await e.getConfig();await e.addLog(y.id,"info",`Manual babysitter trigger using ${S.codingAgent}`),await N(y.id,S.codingAgent);let _=await e.getPR(y.id);return k(),re(_,"PR disappeared after babysit run")},async queueBabysit(d){return H.babysitPR(d)},async setFeedbackDecision(d,y,h){let S=re(await e.getPR(d),"PR not found"),_=await ki({storage:e,pr:S,feedbackId:y,decision:h});return k(),re(_,"PR not found")},async retryFeedback(d,y){let h=await c.retryFeedbackItem(d,y);if(h.kind==="pr_not_found")throw new ue(404,"PR not found");if(h.kind==="feedback_not_found")throw new ue(404,"Feedback item not found");if(h.kind==="feedback_not_retryable")throw new ue(400,"Only failed or warning items can be retried");await e.addLog(d,"info",`Feedback item ${y} queued for retry`);let S=await e.getConfig();return await N(d,S.codingAgent),k(),h.updated},async listPRQuestions(d){return re(await e.getPR(d),"PR not found"),e.getQuestions(d)},async askQuestion(d,y){re(await e.getPR(d),"PR not found");let h;try{h=ts.parse({question:y})}catch(_){throw _ instanceof l.ZodError?new ue(400,_.errors[0]?.message??"Invalid question"):_}let S=await e.addQuestion(d,h.question);try{await s("answer_pr_question",S.id,Ie("answer_pr_question",S.id),{prId:d})}catch(_){let v=Fi(_);throw await e.updateQuestion(S.id,{status:"error",error:v.trim().slice(0,2e3)}),_}return k(),S},async listLogs(d){return e.getLogs(d)},async getOnboardingStatus(){let d=await e.getConfig();return vs(d,d.watchedRepos)},async installReviewWorkflow(d,y){let h=await e.getConfig();return Ts(h,d,y)},async listHealingSessions(){return e.listHealingSessions()},async getHealingSession(d){return re(await e.getHealingSession(d),"Healing session not found")},async listDeploymentHealingSessions(d){return e.listDeploymentHealingSessions(d?{repo:d}:void 0)},async getDeploymentHealingSession(d){return re(await e.getDeploymentHealingSession(d),"Deployment healing session not found")},async getConfig(){return e.getConfig()},async updateConfig(d){let y=await e.updateConfig(d);return A&&w&&await E(),k(),y},async listSocialChangelogs(){return e.getSocialChangelogs()},async getSocialChangelog(d){return re(await e.getSocialChangelog(d),"Changelog not found")},async listReleaseRuns(){return e.listReleaseRuns()},async getReleaseRun(d){return re(await e.getReleaseRun(d),"Release run not found")},async retryReleaseRun(d){let y=await o.retryReleaseRun(d);if(!y)throw new ue(404,"Release run not found");return k(),y}};return H}async function uc(){(!process.stdout.isTTY||!process.stdin.isTTY)&&(console.error("oh-my-pr tui requires an interactive TTY."),process.exit(1));let r=Hi();await r.start();let e=lc(dc.createElement(sn,{runtime:r}));try{await e.waitUntilExit()}finally{r.stop()}}uc().catch(r=>{console.error(r instanceof Error?r.message:String(r)),process.exit(1)});
859
+ `);return["Respond with ONLY valid JSON and nothing else.","Schema:",'{"shouldRelease":boolean,"reason":string,"bump":"patch"|"minor"|"major"|null,"title":string|null,"notes":string|null}',"","You are deciding whether a merged set of pull requests should be published as a GitHub release.","Be conservative. Release only when the merged changes are meaningful enough for users or operators to care about.","",`Repository: ${t.repo}`,`Release branch: ${t.baseBranch}`,`Latest release tag: ${t.latestTag??"none"}`,"",`Trigger PR: #${t.triggerPr.number} "${t.triggerPr.title}"`,`Trigger merged at: ${t.triggerPr.mergedAt}`,`Trigger merge SHA: ${t.triggerPr.mergeSha}`,"","Merged PRs included in this candidate release:",e||"(none)","","Decision rules:","- shouldRelease=true only when the merged changes are worth announcing as a GitHub release.","- bump must be null when shouldRelease=false.","- bump must be one of patch, minor, or major when shouldRelease=true.","- Use patch for fixes or small improvements, minor for additive user-facing features, and major for breaking changes.","- title should be short and release-note ready when shouldRelease=true, else null.","- notes should be GitHub-release Markdown focused on user-visible/operator-visible impact when shouldRelease=true, else null.","- notes must have exactly TWO sections in this order:"," 1. '## Why This Matters' \u2014 a user-friendly, value-driven summary at the top that explains how the release makes users' lives better."," 2. '## Detailed Changes' \u2014 a line-by-line changelog of the included changes in plain English, more detailed than a headline but not deeply technical.","- notes should mention the key merged PRs in plain language, not internal process commentary.","- Prefer user outcomes, workflow improvements, and visible behavior over implementation details."].join(`
860
+ `)}function Yi(t){let e=yc(t.trim());if(!e||typeof e!="object")throw new Error(`Could not parse release evaluation JSON: ${t.slice(0,500)}`);let r=e;if(typeof r.shouldRelease!="boolean")throw new Error("Release evaluation missing boolean 'shouldRelease'");if(typeof r.reason!="string"||r.reason.trim().length===0)throw new Error("Release evaluation missing string 'reason'");if(!r.shouldRelease)return{shouldRelease:!1,reason:r.reason.trim(),bump:null,title:null,notes:null};if(r.bump!=="patch"&&r.bump!=="minor"&&r.bump!=="major")throw new Error("Release evaluation returned invalid 'bump'");if(typeof r.title!="string"||r.title.trim().length===0)throw new Error("Release evaluation missing non-empty 'title'");if(typeof r.notes!="string"||r.notes.trim().length===0)throw new Error("Release evaluation missing non-empty 'notes'");return{shouldRelease:!0,reason:r.reason.trim(),bump:r.bump,title:r.title.trim(),notes:r.notes.trim()}}function yc(t){try{return JSON.parse(t)}catch{}let e=t.indexOf("{"),r=t.lastIndexOf("}");if(e===-1||r===-1||r<=e)return null;try{return JSON.parse(t.slice(e,r+1))}catch{return null}}var un=class{storage;github;evaluateRelease;scheduleBackgroundJob;inProgress=new Set;repoLocks=new Map;constructor(e,r){this.storage=e,this.github=r.github,this.evaluateRelease=r.evaluateRelease??Zi,this.scheduleBackgroundJob=r.scheduleBackgroundJob}getActiveRunCount(){return this.inProgress.size}async waitForIdle(e=12e4){let r=Date.now();for(;this.inProgress.size>0;){if(Date.now()-r>=e)return!1;await vc(50)}return!0}async enqueueMergedPullReleaseEvaluation(e){let r=await this.storage.getReleaseRunByTrigger(e.repo,e.triggerPrNumber,e.triggerMergeSha);if(r)return kc(r.status)||this.scheduleProcessing(r.id),r;let n=await this.storage.createReleaseRun({repo:e.repo,baseBranch:e.baseBranch,triggerPrNumber:e.triggerPrNumber,triggerPrTitle:e.triggerPrTitle,triggerPrUrl:e.triggerPrUrl,triggerMergeSha:e.triggerMergeSha,triggerMergedAt:e.triggerMergedAt,status:"detected",decisionReason:null,recommendedBump:null,proposedVersion:null,releaseTitle:null,releaseNotes:null,includedPrs:[],targetSha:e.triggerMergeSha,githubReleaseId:null,githubReleaseUrl:null,error:null,completedAt:null});return this.scheduleProcessing(n.id),n}async retryReleaseRun(e){if(!await this.storage.getReleaseRun(e))return;let n=await this.storage.updateReleaseRun(e,{status:"detected",error:null,completedAt:null});if(n)return this.scheduleProcessing(e),n}async processReleaseRun(e){let r=await this.storage.getReleaseRun(e);if(r)return this.withRepoLock(r.repo,async()=>{if(this.inProgress.has(e))return this.storage.getReleaseRun(e);this.inProgress.add(e);try{let n=await this.storage.getReleaseRun(e);if(!n)return;if(n.status==="published"||n.status==="skipped")return n;let a=Ne(n.repo);if(!a)return this.failRun(e,`Invalid repository slug: ${n.repo}`);let s=await this.storage.getConfig();if(!s.autoCreateReleases)return await this.storage.updateReleaseRun(e,{status:"skipped",decisionReason:"Automatic release creation is disabled in settings",completedAt:new Date().toISOString()})??void 0;await this.storage.updateReleaseRun(e,{status:"evaluating",error:null,completedAt:null});let i=await this.github.buildOctokit(s),o=await this.github.findLatestSemverReleaseTag(i,a),c=_c(n),u=await this.loadIncludedPulls(i,a,n,c),m=u.map(wc),g=await this.evaluateRelease({preferredAgent:s.codingAgent,repo:n.repo,baseBranch:n.baseBranch,latestTag:o,triggerPr:c,includedPulls:u});if(!g.shouldRelease)return await this.storage.updateReleaseRun(e,{status:"skipped",decisionReason:g.reason,recommendedBump:null,proposedVersion:null,releaseTitle:null,releaseNotes:null,includedPrs:m,targetSha:n.triggerMergeSha,completedAt:new Date().toISOString()})??void 0;if(!g.bump)throw new Error("Release evaluation approved publishing but did not provide a semver bump");let p=this.github.bumpReleaseTag(o,g.bump),h=Rc(g,p),I=g.notes??`Release ${p}`;await this.storage.updateReleaseRun(e,{status:"proposed",decisionReason:g.reason,recommendedBump:g.bump,proposedVersion:p,releaseTitle:h,releaseNotes:I,includedPrs:m,targetSha:n.triggerMergeSha});let R=this.github.findReleaseByTag?await this.github.findReleaseByTag(i,a,p):null;if(R)return await this.storage.updateReleaseRun(e,{status:"published",githubReleaseId:R.id,githubReleaseUrl:R.url,completedAt:new Date().toISOString()})??void 0;await this.storage.updateReleaseRun(e,{status:"publishing"});let k=await this.github.createGitHubRelease(i,a,{tagName:p,targetCommitish:n.triggerMergeSha,name:h,body:I});return await this.storage.updateReleaseRun(e,{status:"published",githubReleaseId:k.id,githubReleaseUrl:k.url,completedAt:new Date().toISOString()})??void 0}catch(n){return this.failRun(e,Sc(n))}finally{this.inProgress.delete(e)}})}async loadIncludedPulls(e,r,n,a){if(!this.github.listMergedPullsForReleaseCandidate)return[a];let s=await this.github.listMergedPullsForReleaseCandidate(e,r,{baseBranch:n.baseBranch,untilMergedAt:n.triggerMergedAt,triggerPr:a}),i=new Map;for(let o of s)i.set(o.mergeSha||`${o.repo}#${o.number}`,o);return i.has(a.mergeSha)||i.set(a.mergeSha,a),Array.from(i.values()).sort((o,c)=>o.mergedAt.localeCompare(c.mergedAt))}async failRun(e,r){return this.storage.updateReleaseRun(e,{status:"error",error:r,completedAt:new Date().toISOString()})}async withRepoLock(e,r){let n=this.repoLocks.get(e)??Promise.resolve(),a,s=new Promise(o=>{a=()=>o()}),i=n.then(()=>s);this.repoLocks.set(e,i),await n;try{return await r()}finally{a?.(),this.repoLocks.get(e)===i&&this.repoLocks.delete(e)}}scheduleProcessing(e){if(this.scheduleBackgroundJob){this.scheduleBackgroundJob("process_release_run",e,Je("process_release_run",e),{releaseRunId:e}).catch(r=>{console.error(`Failed to schedule release run ${e}:`,r)});return}this.processReleaseRun(e).catch(()=>{})}};function _c(t){return{number:t.triggerPrNumber,title:t.triggerPrTitle,url:t.triggerPrUrl,author:"unknown",repo:t.repo,mergedAt:t.triggerMergedAt,mergeSha:t.triggerMergeSha}}function wc(t){return{number:t.number,title:t.title,url:t.url,author:t.author,mergedAt:t.mergedAt,mergeSha:t.mergeSha}}function Rc(t,e){let r=t.title?.trim();return r?r.startsWith(e)?r:`${e} - ${r}`:e}function Sc(t){return(t instanceof Error?t.message:String(t)).trim().slice(0,2e3)}function kc(t){return t==="skipped"||t==="published"}function vc(t){return new Promise(e=>setTimeout(e,t))}var Tc=["fix_submitted","escalated"],xc={monitoring:["failed","escalated"],failed:["fixing","escalated"],fixing:["fix_submitted","escalated"],fix_submitted:[],escalated:[]},cn=class{constructor(e,r=()=>new Date){this.storage=e;this.clock=r}async createSession(e){return this.storage.createDeploymentHealingSession({...e,deploymentId:null,deploymentLog:null,fixBranch:null,fixPrNumber:null,fixPrUrl:null,state:"monitoring",error:null,completedAt:null})}async ensureSession(e){let r=await this.storage.getDeploymentHealingSessionByRepoAndMergeSha(e.repo,e.mergeSha);return r||this.createSession(e)}async transitionTo(e,r,n={}){let a=await this.storage.getDeploymentHealingSession(e);if(!a)throw new Error(`Deployment healing session not found: ${e}`);if(a.state===r){let o=await this.storage.updateDeploymentHealingSession(e,n);if(!o)throw new Error(`Deployment healing session not found: ${e}`);return o}if(!xc[a.state].includes(r))throw new Error(`Illegal deployment healing transition: ${a.state} -> ${r}`);let s={...n,state:r};Tc.includes(r)&&(s.completedAt=n.completedAt??this.clock().toISOString());let i=await this.storage.updateDeploymentHealingSession(e,s);if(!i)throw new Error(`Deployment healing session not found: ${e}`);return i}};var we=class extends Error{statusCode;constructor(e,r){super(r),this.name="AppRuntimeError",this.statusCode=e}};function eo(t){return t instanceof Error?t.message:String(t)}function oe(t,e){if(t===void 0)throw new we(404,e);return t}function to(t={}){let e=t.storage??As(),r=new Pc,n=t.backgroundJobQueue??new an(e),a,s=async(...l)=>{let w=await n.enqueue(...l);return a.wake(),w},i=t.deploymentHealingManager??new cn(e),o=t.releaseManager??new un(e,{github:{buildOctokit:je,findLatestSemverReleaseTag:Ks,bumpReleaseTag:Vs,listMergedPullsForReleaseCandidate:async(l,w,y)=>{let T=await li(l,w,{baseRef:y.baseBranch}),x=Date.parse(y.untilMergedAt);return T.filter(v=>!Number.isFinite(x)||Date.parse(v.mergedAt)<=x).map(v=>({number:v.number,title:v.title,url:v.url,author:v.author,repo:v.repo,mergedAt:v.mergedAt,mergeSha:v.mergeCommitSha??`${v.repo}#${v.number}`}))},findReleaseByTag:async(l,w,y)=>{let x=(await Kr(l,w)).find(v=>!v.draft&&v.tagName===y);return x?{id:x.id,url:x.htmlUrl,tagName:x.tagName,name:x.name}:null},createGitHubRelease:async(l,w,y)=>{let T=await zs(l,w,{tagName:y.tagName,targetCommitish:y.targetCommitish,name:y.name,body:y.body});return{id:T.id,url:T.htmlUrl,tagName:T.tagName,name:T.name}}},scheduleBackgroundJob:s}),c=t.babysitter??new ln(e,void 0,void 0,o,s,i);a=t.backgroundJobDispatcher??new dn({storage:e,queue:n,handlers:Ki({storage:e,babysitter:c,releaseManager:o,deploymentHealingManager:i})});let u=null,m=0,g=t.watcherScheduler??zi(async()=>{await s("sync_watched_repos","runtime:1",Je("sync_watched_repos","runtime:1"))},l=>{console.error("Repository babysitter watcher failed",l)}),p=g.run,h=t.startBackgroundServices??!0,I=t.startWatcher??h,R=!1,k=()=>{r.emit("change")},V=async()=>({...await e.getRuntimeState(),activeRuns:a.getActiveRunCount()}),B=async l=>{let[w,y,T]=await Promise.all([a.waitForIdle(l),c.waitForIdle(l),o.waitForIdle(l)]);return w&&y&&T},A=async()=>{let l=await e.getConfig(),w=Math.max(1e4,l.pollIntervalMs||12e4);u&&m===w||(u&&(clearInterval(u),u=null),m=w,u=setInterval(()=>{p()},w))},F=async(l,w)=>{await s("babysit_pr",l,Je("babysit_pr",l),{preferredAgent:w})},D={async start(){R||(R=!0,h&&await a.start(),I&&(await A(),c.resumeInterruptedRuns(),p()))},stop(){R=!1,a.stop(),u&&(clearInterval(u),u=null)},subscribe(l){return r.on("change",l),()=>{r.off("change",l)}},getRuntimeSnapshot:V,async setDrainMode(l){let w=await e.updateRuntimeState({drainMode:l.enabled,drainRequestedAt:l.enabled?new Date().toISOString():null,drainReason:l.enabled?l.reason??null:null});if(l.enabled&&l.waitForIdle){let T=await B(l.timeoutMs??12e4),x=await V();return k(),{...w,...x,drained:T}}let y=await V();return k(),{...w,...y}},async listRepos(){let l=await e.getConfig(),w=await e.getPRs();return Array.from(new Set([...l.watchedRepos,...w.map(y=>y.repo)])).sort((y,T)=>y.localeCompare(T))},async addRepo(l){let w=Ne(l);if(!w)throw new we(400,"Invalid repository. Use owner/repo or https://github.com/owner/repo");let y=Ot(w),T=await e.getConfig();return T.watchedRepos.includes(y)||await e.updateConfig({watchedRepos:[...T.watchedRepos,y].sort((x,v)=>x.localeCompare(v))}),p(),k(),{repo:y}},async syncRepos(){if((await e.getRuntimeState()).drainMode)throw new we(409,"Drain mode is enabled. Sync-triggered runs are blocked until drain mode is disabled.");return await g.runAndReportErrors(),k(),{ok:!0}},async listPRs(l="active"){return l==="archived"?e.getArchivedPRs():e.getPRs()},async getPR(l){return await e.getPR(l)??null},async addPR(l){let w;try{({url:w}=_s.parse({url:l}))}catch(ae){throw ae instanceof d.ZodError?new we(400,ae.errors[0]?.message??"Invalid PR URL"):ae}let y=qr(w);if(!y)throw new we(400,"Invalid GitHub PR URL. Expected: https://github.com/owner/repo/pull/123");let T=`${y.owner}/${y.repo}`,x=await e.getPRByRepoAndNumber(T,y.number);if(x)return x;let v=await e.getConfig(),b=await je(v),O=await Vr(b,y),G=await e.addPR({number:y.number,title:O.title,repo:T,branch:O.branch,author:O.author,url:O.url,status:"watching",feedbackItems:[],accepted:0,rejected:0,flagged:0,testsPassed:null,lintPassed:null,lastChecked:null});return await e.addLog(G.id,"info",`Registered PR #${y.number} from ${T}`),await e.addLog(G.id,"info",`Repository ${T} added to auto-babysit watch list`),v.watchedRepos.includes(T)||await e.updateConfig({watchedRepos:[...v.watchedRepos,T].sort((ae,te)=>ae.localeCompare(te))}),await F(G.id,v.codingAgent),k(),G},async removePR(l){if(!await e.removePR(l))throw new we(404,"PR not found");return k(),{ok:!0}},async setPRWatchEnabled(l,w){let y=oe(await e.getPR(l),"PR not found"),T=await e.updatePR(y.id,{watchEnabled:w}),x=oe(T,"PR not found");return y.watchEnabled!==w&&(await e.addLog(y.id,"info",w?"Background watch resumed":"Background watch paused"),w&&p()),k(),x},async setWatchEnabled(l,w){return D.setPRWatchEnabled(l,w)},async fetchPRFeedback(l){let w=oe(await e.getPR(l),"PR not found");await e.updatePR(w.id,{status:"processing",lastChecked:new Date().toISOString()}),await e.addLog(w.id,"info","Syncing GitHub comments/reviews...");try{let y=await c.syncFeedbackForPR(w.id);return k(),y}catch(y){let T=eo(y);throw await e.updatePR(w.id,{status:"error",lastChecked:new Date().toISOString()}),await e.addLog(w.id,"error",`Fetch failed: ${T}`),y}},async triagePR(l){let w=oe(await e.getPR(l),"PR not found");await e.updatePR(w.id,{status:"processing"}),await e.addLog(w.id,"info","Triaging feedback...");let y=w.feedbackItems.map(O=>{if(O.decision)return O;let G=O.body.toLowerCase();return G.includes("lgtm")||G.includes("looks good")?$t(O,!1,"Acknowledgement, no code change requested"):G.includes("please")||G.includes("should")||G.includes("fix")||G.includes("error")||G.includes("fail")?{...$t(O,!0,"Likely actionable request"),action:O.body}:Ii(O,"Unclear actionability, flagged for manual review")}),T=y.filter(O=>O.decision==="accept").length,x=y.filter(O=>O.decision==="reject").length,v=y.filter(O=>O.decision==="flag").length,b=await e.updatePR(w.id,{feedbackItems:y,accepted:T,rejected:x,flagged:v,status:"watching"});return await e.addLog(w.id,"info",`Triage complete: ${T} accept, ${x} reject, ${v} flag`),k(),oe(b,"PR not found")},async applyPR(l){let w=oe(await e.getPR(l),"PR not found");if((await e.getRuntimeState()).drainMode)throw new we(409,"Drain mode is enabled. Manual runs are blocked until drain mode is disabled.");let T=await e.getConfig();await e.updatePR(w.id,{status:"processing"}),await e.addLog(w.id,"info",`Launching autonomous babysitter run using ${T.codingAgent}`),await F(w.id,T.codingAgent);let x=await e.getPR(w.id);return k(),oe(x,"PR disappeared after apply run")},async babysitPR(l){let w=oe(await e.getPR(l),"PR not found");if((await e.getRuntimeState()).drainMode)throw new we(409,"Drain mode is enabled. Manual runs are blocked until drain mode is disabled.");let T=await e.getConfig();await e.addLog(w.id,"info",`Manual babysitter trigger using ${T.codingAgent}`),await F(w.id,T.codingAgent);let x=await e.getPR(w.id);return k(),oe(x,"PR disappeared after babysit run")},async queueBabysit(l){return D.babysitPR(l)},async setFeedbackDecision(l,w,y){let T=oe(await e.getPR(l),"PR not found"),x=await Ji({storage:e,pr:T,feedbackId:w,decision:y});return k(),oe(x,"PR not found")},async retryFeedback(l,w){let y=await c.retryFeedbackItem(l,w);if(y.kind==="pr_not_found")throw new we(404,"PR not found");if(y.kind==="feedback_not_found")throw new we(404,"Feedback item not found");if(y.kind==="feedback_not_retryable")throw new we(400,"Only failed or warning items can be retried");await e.addLog(l,"info",`Feedback item ${w} queued for retry`);let T=await e.getConfig();return await F(l,T.codingAgent),k(),y.updated},async listPRQuestions(l){return oe(await e.getPR(l),"PR not found"),e.getQuestions(l)},async askQuestion(l,w){oe(await e.getPR(l),"PR not found");let y;try{y=Rs.parse({question:w})}catch(x){throw x instanceof d.ZodError?new we(400,x.errors[0]?.message??"Invalid question"):x}let T=await e.addQuestion(l,y.question);try{await s("answer_pr_question",T.id,Je("answer_pr_question",T.id),{prId:l})}catch(x){let v=eo(x);throw await e.updateQuestion(T.id,{status:"error",error:v.trim().slice(0,2e3)}),x}return k(),T},async listLogs(l){return e.getLogs(l)},async getOnboardingStatus(){let l=await e.getConfig();return Gs(l,l.watchedRepos)},async installReviewWorkflow(l,w){let y=await e.getConfig();return Xs(y,l,w)},async listHealingSessions(){return e.listHealingSessions()},async getHealingSession(l){return oe(await e.getHealingSession(l),"Healing session not found")},async listDeploymentHealingSessions(l){return e.listDeploymentHealingSessions(l?{repo:l}:void 0)},async getDeploymentHealingSession(l){return oe(await e.getDeploymentHealingSession(l),"Deployment healing session not found")},async getConfig(){return e.getConfig()},async updateConfig(l){let w=await e.updateConfig(l);return I&&R&&await A(),k(),w},async listSocialChangelogs(){return e.getSocialChangelogs()},async getSocialChangelog(l){return oe(await e.getSocialChangelog(l),"Changelog not found")},async listReleaseRuns(){return e.listReleaseRuns()},async getReleaseRun(l){return oe(await e.getReleaseRun(l),"Release run not found")},async retryReleaseRun(l){let w=await o.retryReleaseRun(l);if(!w)throw new we(404,"Release run not found");return k(),w}};return D}async function Cc(){(!process.stdout.isTTY||!process.stdin.isTTY)&&(console.error("oh-my-pr tui requires an interactive TTY."),process.exit(1));let t=to();await t.start();let e=Ac(Ec.createElement(An,{runtime:t}));try{await e.waitUntilExit()}finally{t.stop()}}Cc().catch(t=>{console.error(t instanceof Error?t.message:String(t)),process.exit(1)});