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/index.cjs +1 -1
- package/dist/tui.mjs +101 -99
- package/package.json +1 -1
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
|
-
`
|
|
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)&<.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(
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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:
|
|
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
|
-
`),
|
|
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
|
-
`),
|
|
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(!
|
|
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,
|
|
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
|
-
`,
|
|
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,
|
|
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,
|
|
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=
|
|
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,
|
|
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&&
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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
|
-
`,
|
|
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
|
|
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
|
|
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
|
|
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
|
-
`,
|
|
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
|
|
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
|
|
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
|
-
`,
|
|
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
|
|
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
|
-
`,
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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 ${
|
|
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=
|
|
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,
|
|
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,
|
|
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,
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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,
|
|
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
|
-
`,
|
|
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
|
|
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
|
|
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,
|
|
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,
|
|
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
|
|
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
|
-
`,
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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
|
-
`,
|
|
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
|
|
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
|
|
711
|
-
`),code:c?124:m??1,signal:
|
|
712
|
-
${m.message}`.trim(),code:1})})})}import{Octokit as
|
|
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
|
-
`,
|
|
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
|
-
`,
|
|
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
|
-
`,
|
|
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
|
-
`,
|
|
775
|
-
`).toLowerCase(),
|
|
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
|
|
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
|
|
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: ${
|
|
831
|
-
`)}function
|
|
832
|
-
`)}function
|
|
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 ${
|
|
834
|
-
`)}import{randomUUID as
|
|
835
|
-
`)}function
|
|
836
|
-
`)}function
|
|
837
|
-
... (truncated)`}function
|
|
838
|
-
`)}function
|
|
839
|
-
`)}function
|
|
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,
|
|
842
|
-
`):"None",
|
|
843
|
-
`):"None";return[`You are acting as an autonomous PR babysitter for ${e.repo} PR #${e.number}.`,`PR URL: ${e.url}`,`Base repository: ${
|
|
844
|
-
`)}function
|
|
845
|
-
`)[0]||"",o=i.length>120?i.slice(0,120)+"\u2026":i;s.push("",`> Responding to [comment by @${e.author}](${e.sourceUrl}):`,`> ${o}`)}return
|
|
846
|
-
`)}var
|
|
847
|
-
`)}function
|
|
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(
|
|
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
|
|
852
|
-
`),s=
|
|
853
|
-
`):"(no feedback items)",recentLogs:a||"(no recent activity)"}}function
|
|
854
|
-
`)}function
|
|
855
|
-
`)});await
|
|
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: ${
|
|
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)});
|