@oss-autopilot/core 1.4.0 → 1.5.1
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/cli.bundle.cjs
CHANGED
|
@@ -81,7 +81,7 @@ The gh CLI is recommended - install from https://cli.github.com`);return e}funct
|
|
|
81
81
|
onRateLimit: (retryAfter, options) => {/* ... */}
|
|
82
82
|
}
|
|
83
83
|
})
|
|
84
|
-
`);let u={},l=new o.Events(u);return u.on("secondary-limit",c.onSecondaryRateLimit),u.on("rate-limit",c.onRateLimit),u.on("error",d=>e.log.warn("Error in throttling-plugin limit handler",d)),c.retryLimiter.on("failed",async function(d,p){let[g,y,S]=p.args,{pathname:U}=new URL(S.url,"http://github.test");if(!(U.startsWith("/graphql")&&d.status!==401||d.status===403||d.status===429))return;let L=~~y.retryCount;y.retryCount=L,S.request.retryCount=L;let{wantRetry:Z,retryAfter:N=0}=await(async function(){if(/\bsecondary rate\b/i.test(d.message)){let z=Number(d.response.headers["retry-after"])||g.fallbackSecondaryRateRetryAfter;return{wantRetry:await l.trigger("secondary-limit",z,S,e,L),retryAfter:z}}if(d.response.headers!=null&&d.response.headers["x-ratelimit-remaining"]==="0"||(d.response.data?.errors??[]).some(z=>z.type==="RATE_LIMITED")){let z=new Date(~~d.response.headers["x-ratelimit-reset"]*1e3).getTime(),R=Math.max(Math.ceil((z-Date.now())/1e3)+1,0);return{wantRetry:await l.trigger("rate-limit",R,S,e,L),retryAfter:R}}return{}})();if(Z)return y.retryCount++,N*g.retryAfterBaseValue}),e.hook.wrap("request",Ux.bind(null,c)),{}}var Z_,Dx,eg,Gx,M_,V_,Dr,Lx,H_=b(()=>{Z_=re(N_(),1),Dx="0.0.0-development",eg=()=>Promise.resolve();Gx=["/orgs/{org}/invitations","/orgs/{org}/invitations/{invitation_id}","/orgs/{org}/teams/{team_slug}/discussions","/orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments","/repos/{owner}/{repo}/collaborators/{username}","/repos/{owner}/{repo}/commits/{commit_sha}/comments","/repos/{owner}/{repo}/issues","/repos/{owner}/{repo}/issues/{issue_number}/comments","/repos/{owner}/{repo}/issues/{issue_number}/sub_issue","/repos/{owner}/{repo}/issues/{issue_number}/sub_issues/priority","/repos/{owner}/{repo}/pulls","/repos/{owner}/{repo}/pulls/{pull_number}/comments","/repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies","/repos/{owner}/{repo}/pulls/{pull_number}/merge","/repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers","/repos/{owner}/{repo}/pulls/{pull_number}/reviews","/repos/{owner}/{repo}/releases","/teams/{team_id}/discussions","/teams/{team_id}/discussions/{discussion_number}/comments"];M_=Fx(Gx),V_=M_.test.bind(M_),Dr={},Lx=function(e,t){Dr.global=new e.Group({id:"octokit-global",maxConcurrent:10,...t}),Dr.auth=new e.Group({id:"octokit-auth",maxConcurrent:1,...t}),Dr.search=new e.Group({id:"octokit-search",maxConcurrent:1,minTime:2e3,...t}),Dr.write=new e.Group({id:"octokit-write",maxConcurrent:1,minTime:1e3,...t}),Dr.notifications=new e.Group({id:"octokit-notifications",maxConcurrent:1,minTime:3e3,...t})};sa.VERSION=Dx;sa.triggersNotification=V_});function ua(e){return e.toLocaleTimeString("en-US",{hour12:!1})}function Mx(){return{onRateLimit:(e,t,n,o)=>{let r=t,i=new Date(Date.now()+e*1e3);return o<2?(v(aa,`Rate limit hit (retry ${o+1}/2, waiting ${e}s, resets at ${ua(i)}) \u2014 ${r.method} ${r.url}`),!0):(v(aa,`Rate limit exceeded, not retrying \u2014 ${r.method} ${r.url} (resets at ${ua(i)})`),!1)},onSecondaryRateLimit:(e,t,n,o)=>{let r=t,i=new Date(Date.now()+e*1e3);return o<3?(v(aa,`Secondary rate limit hit (retry ${o+1}/3, waiting ${e}s, resets at ${ua(i)}) \u2014 ${r.method} ${r.url}`),!0):(v(aa,`Secondary rate limit exceeded, not retrying \u2014 ${r.method} ${r.url} (resets at ${ua(i)})`),!1)}}}function je(e){if(ca&&q_===e)return ca;let t=Mx();return ca=new Nx({auth:e,throttle:t}),q_=e,ca}async function tg(e){let t=je(e),{data:n}=await t.rateLimit.get(),o=n.resources.search;return{remaining:o.remaining,limit:o.limit,resetAt:new Date(o.reset*1e3).toISOString()}}var aa,Nx,ca,q_,Dn=b(()=>{"use strict";L_();H_();$e();aa="github",Nx=F_.plugin(sa),ca=null,q_=null});function Hx(e,t){if(!e||!t)return!0;let n=e.toLowerCase();return Zx.has(n)?!0:n===t.toLowerCase()}function qx(e,t){let n=new Date(e).getTime(),o=new Date(t).getTime();return Number.isNaN(n)||Number.isNaN(o)?e>t:n-o>=Vx}function B_(e){let{latestCommitDate:t,latestCommitAuthor:n,contributorUsername:o}=e;if(t)return Hx(n,o)?t:void 0}function W_(e,t,n){return!(!e||!t||!qx(e,t)||n&&e<n)}function J_(e,t){return!e||!t?!1:e>=t}function Bx(e){let{ciStatus:t,hasMergeConflict:n,hasUnrespondedComment:o,hasIncompleteChecklist:r,reviewDecision:i,lastMaintainerCommentDate:s,latestChangesRequestedDate:a,hasActionableCIFailure:c=!0}=e,u=B_(e),l=[];return o&&!W_(u,s,a)&&l.push("needs_response"),i==="changes_requested"&&a&&!J_(u,a)&&l.push("needs_changes"),t==="failing"&&c&&l.push("failing_ci"),n&&l.push("merge_conflict"),r&&l.push("incomplete_checklist"),l.length>0?l:void 0}function rg(e){let t=Wx(e),n=Bx(e);return n?{...t,actionReasons:n}:t}function Wx(e){let{ciStatus:t,hasMergeConflict:n,hasUnrespondedComment:o,hasIncompleteChecklist:r,reviewDecision:i,daysSinceActivity:s,dormantThreshold:a,approachingThreshold:c,lastMaintainerCommentDate:u,latestChangesRequestedDate:l,hasActionableCIFailure:d=!0}=e,p="active";s>=a?p="dormant":s>=c&&(p="approaching_dormant");let g=B_(e);return o?W_(g,u,l)?t==="failing"&&d?{status:"needs_addressing",actionReason:"failing_ci",stalenessTier:p}:{status:"waiting_on_maintainer",waitReason:"changes_addressed",stalenessTier:p}:{status:"needs_addressing",actionReason:"needs_response",stalenessTier:p}:i==="changes_requested"&&l?J_(g,l)?t==="failing"&&d?{status:"needs_addressing",actionReason:"failing_ci",stalenessTier:p}:{status:"waiting_on_maintainer",waitReason:"changes_addressed",stalenessTier:p}:{status:"needs_addressing",actionReason:"needs_changes",stalenessTier:p}:t==="failing"?d?s>=5?{status:"waiting_on_maintainer",waitReason:"stale_ci_failure",stalenessTier:p}:{status:"needs_addressing",actionReason:"failing_ci",stalenessTier:p}:{status:"waiting_on_maintainer",waitReason:"ci_blocked",stalenessTier:p}:n?{status:"needs_addressing",actionReason:"merge_conflict",stalenessTier:p}:r?{status:"needs_addressing",actionReason:"incomplete_checklist",stalenessTier:p}:i==="approved"&&(t==="passing"||t==="unknown")?{status:"waiting_on_maintainer",waitReason:"pending_merge",stalenessTier:p}:{status:"waiting_on_maintainer",waitReason:"pending_review",stalenessTier:p}}var Zx,Vx,ng=b(()=>{"use strict";Zx=new Set(["autofix-ci[bot]","prettier-ci[bot]","pre-commit-ci[bot]"]),Vx=120*1e3});async function la(e,t,n){let o=0,r=!1,i=async()=>{for(;o<e.length&&!r;){let a=e[o++];try{await t(a)}catch(c){throw r=!0,c}}},s=Math.min(n,e.length);await Promise.all(Array.from({length:s},()=>i()))}var og=b(()=>{"use strict"});async function $t(e,t=100,n=10){let o=[];for(let r=1;r<=n;r++){let{data:i}=await e(r);if(o.push(...i),i.length<t)break}return o}var Go=b(()=>{"use strict"});function wt(){return ig||(ig=new pa),ig}async function Fo(e,t,n){let o=e.getInflight(t);if(o)return E(gr,`Dedup hit for ${t}`),await o;let i=(async()=>{let a={},c=e.get(t);c&&(a["if-none-match"]=c.etag);try{let u=await n(a),l=u.headers?.etag;return l&&e.set(t,l,u.data),u.data}catch(u){if(Kx(u)){let l=e.get(t);if(l)return E(gr,`304 cache hit for ${t}`),l.body}throw u}})(),s=e.setInflight(t,i);try{return await i}finally{s()}}async function ma(e,t,n,o){let r=e.getIfFresh(t,n);if(r)return E(gr,`Time-based cache hit for ${t}`),r;let i=await o();return e.set(t,"",i),i}function Kx(e){return He(e)===304}var st,da,K_,gr,Jx,pa,ig,Ur=b(()=>{"use strict";st=re(require("fs"),1),da=re(require("path"),1),K_=re(require("crypto"),1);Ue();$e();he();gr="http-cache",Jx=1440*60*1e3,pa=class{cacheDir;inflightRequests=new Map;constructor(t){this.cacheDir=t??Bs()}keyFor(t){return K_.createHash("sha256").update(t).digest("hex")}pathFor(t){return da.join(this.cacheDir,`${this.keyFor(t)}.json`)}getIfFresh(t,n){let o=this.get(t);if(!o)return null;let r=Date.now()-new Date(o.cachedAt).getTime();return!Number.isFinite(r)||r<0||r>n?null:o.body}get(t){let n=this.pathFor(t);try{let o=st.readFileSync(n,"utf-8"),r=JSON.parse(o);return r.url!==t?(E(gr,`Cache collision detected for ${t}, ignoring`),null):r}catch{return null}}set(t,n,o){let r={etag:n,url:t,body:o,cachedAt:new Date().toISOString()};try{st.writeFileSync(this.pathFor(t),JSON.stringify(r),{encoding:"utf-8",mode:384}),E(gr,`Cached response for ${t}`)}catch(i){E(gr,`Failed to write cache for ${t}`,i)}}hasInflight(t){return this.inflightRequests.has(t)}getInflight(t){return this.inflightRequests.get(t)}setInflight(t,n){return this.inflightRequests.set(t,n),()=>{this.inflightRequests.delete(t)}}evictStale(t=Jx){let n=0;try{let o=st.readdirSync(this.cacheDir),r=Date.now();for(let i of o){if(!i.endsWith(".json"))continue;let s=da.join(this.cacheDir,i);try{let a=st.readFileSync(s,"utf-8"),c=JSON.parse(a);r-new Date(c.cachedAt).getTime()>t&&(st.unlinkSync(s),n++)}catch{try{st.unlinkSync(s),n++}catch{}}}}catch{}return n>0&&E(gr,`Evicted ${n} stale cache entries`),n}clear(){try{let t=st.readdirSync(this.cacheDir);for(let n of t)n.endsWith(".json")&&st.unlinkSync(da.join(this.cacheDir,n));E(gr,"Cache cleared")}catch{}}size(){try{return st.readdirSync(this.cacheDir).filter(t=>t.endsWith(".json")).length}catch{return 0}}},ig=null});function ga(){return{status:"unknown",failingCheckNames:[],failingCheckConclusions:new Map}}function sg(e,t,n){if(n==="cancelled"||n==="timed_out")return"infrastructure";if(n==="action_required")return"auth_gate";let o=e.toLowerCase();if(Y_.some(r=>r.test(o)))return"auth_gate";if(X_.some(r=>r.test(o)))return"fork_limitation";if(Q_.some(r=>r.test(o)))return"infrastructure";if(t){let r=t.toLowerCase();if(Y_.some(i=>i.test(r)))return"auth_gate";if(X_.some(i=>i.test(r)))return"fork_limitation";if(Q_.some(i=>i.test(r)))return"infrastructure"}return"actionable"}function fa(e,t){return e.map(n=>{let o=t?.get(n);return{name:n,category:sg(n,void 0,o),conclusion:o}})}function Xx(e){let t=!1,n=!1,o=!1,r=[],i=new Map;for(let s of e)s.conclusion==="failure"||s.conclusion==="cancelled"||s.conclusion==="timed_out"||s.conclusion==="action_required"?(t=!0,r.push(s.name),i.set(s.name,s.conclusion)):s.status==="in_progress"||s.status==="queued"?n=!0:s.conclusion==="success"&&(o=!0);return{hasFailingChecks:t,hasPendingChecks:n,hasSuccessfulChecks:o,failingCheckNames:r,failingCheckConclusions:i}}function Yx(e){let t=e.statuses.filter(c=>{let u=(c.description||"").toLowerCase();return!(c.state==="failure"&&(u.includes("authorization required")||u.includes("authorize")))}),n=t.some(c=>c.state==="failure"||c.state==="error"),o=t.some(c=>c.state==="pending"),r=t.some(c=>c.state==="success"),i;n?i="failure":o?i="pending":r||t.length===0?i="success":i=e.state;let s=e.statuses.length>0,a=[];for(let c of t)(c.state==="failure"||c.state==="error")&&a.push(c.context);return{effectiveCombinedState:i,hasStatuses:s,failingStatusNames:a}}function Qx(e,t,n){let{hasFailingChecks:o,hasPendingChecks:r,hasSuccessfulChecks:i,failingCheckNames:s,failingCheckConclusions:a}=e,{effectiveCombinedState:c,hasStatuses:u,failingStatusNames:l}=t,d=[...s,...l];return o||c==="failure"||c==="error"?{status:"failing",failingCheckNames:d,failingCheckConclusions:a}:r||c==="pending"?{status:"pending",failingCheckNames:[],failingCheckConclusions:new Map}:i||c==="success"?{status:"passing",failingCheckNames:[],failingCheckConclusions:new Map}:ga()}async function ag(e,t,n,o){if(!o)return ga();try{let[r,i]=await Promise.all([e.repos.getCombinedStatusForRef({owner:t,repo:n,ref:o}),e.checks.listForRef({owner:t,repo:n,ref:o}).catch(p=>{let g=He(p);if(g===429)throw p;if(g===403){let y=P(p).toLowerCase();if(y.includes("rate limit")||y.includes("abuse detection"))throw p}return g===404?E("pr-monitor",`Check runs 404 for ${t}/${n}@${o.slice(0,7)} (no checks configured)`):v("pr-monitor",`Non-404 error fetching check runs for ${t}/${n}@${o.slice(0,7)}: ${g??p}`),null})]),s=r.data,a=i?.data?.check_runs||[],c=new Map;for(let p of a){let g=c.get(p.name);(!g||new Date(p.started_at??0)>new Date(g.started_at??0))&&c.set(p.name,p)}let u=[...c.values()],l=Xx(u),d=Yx(s);return Qx(l,d,u.length)}catch(r){let i=He(r);if(i===401||i===403||i===429)throw r;return i===404?E("pr-monitor",`CI check 404 for ${t}/${n} (no CI configured)`):v("pr-monitor",`Failed to check CI for ${t}/${n}@${o.slice(0,7)}: ${P(r)}`),ga()}}var X_,Y_,Q_,cg=b(()=>{"use strict";he();$e();X_=[/vercel/i,/netlify/i,/\bpreview\s*deploy/i,/\bdeploy\s*preview/i,/storybook/i,/chromatic/i,/percy/i,/cloudflare pages/i,/\binternal\b/i],Y_=[/authoriz/i,/approval/i,/\bcla\b/i,/license\/cla/i],Q_=[/\binstall\s*(os\s*)?dep(endenc|s\b)/i,/\bsetup\s+fail(ed|ure)?\b/i,/\bservice\s*unavailable/i,/\binfrastructure/i,/\bblacksmith\b/i,/\breadthedocs\b/i]});function Un(e){return e.includes("[bot]")||eR.has(e.toLowerCase())}function Lo(e){if(!e||e.length>100||e.includes("?"))return!1;let t=e.toLowerCase();return["thanks","thank you","lgtm","looks good","will review","we'll review","we'll get to this","noted","got it","will look","will check"].some(o=>t.includes(o))}var eR,ha=b(()=>{"use strict";eR=new Set(["allcontributors","changeset-bot","claassistant","codecov-commenter","greenkeeper","imgbot","netlify","renovate","snyk-bot","sonarcloud","stale","vercel"])});function e$(e){if(e.length===0)return"review_required";let t=new Map;for(let o of e){let r=o.user?.login,i=o.state;r&&i&&t.set(r,i)}let n=Array.from(t.values());return n.includes("CHANGES_REQUESTED")?"changes_requested":n.includes("APPROVED")?"approved":"review_required"}function t$(e){let t;for(let n of e)n.state==="CHANGES_REQUESTED"&&n.submitted_at&&(!t||n.submitted_at>t)&&(t=n.submitted_at);return t}function tR(e,t){let n=t.filter(r=>r.pull_request_review_id===e);if(n.length===0)return!1;let o=new Map;for(let r of t)r.user?.login&&o.set(r.id,r.user.login.toLowerCase());return n.every(r=>{if(!r.in_reply_to_id)return!1;let i=o.get(r.in_reply_to_id),s=r.user?.login?.toLowerCase();return!(i==null||s==null||i!==s||!r.body||r.body.includes("?"))})}function rR(e,t){return t.find(n=>n.pull_request_review_id===e&&n.body?.trim())?.body?.trim()}function r$(e,t,n,o){let r=[],i=o.toLowerCase();for(let c of e){let u=c.user?.login||"unknown";r.push({author:u,body:c.body||"",createdAt:c.created_at,isUser:u.toLowerCase()===i})}for(let c of t){if(!c.submitted_at)continue;let u=(c.body||"").trim();if(!u&&c.state!=="COMMENTED"&&c.state!=="CHANGES_REQUESTED")continue;let l=c.user?.login||"unknown";if(!u&&c.state==="COMMENTED"&&c.id!=null&&tR(c.id,n))continue;let d=u||(c.id!=null?rR(c.id,n):void 0)||(c.state==="CHANGES_REQUESTED"?"(requested changes via inline review comments)":"(posted inline review comments)");r.push({author:l,body:d,createdAt:c.submitted_at,isUser:l.toLowerCase()===i})}r.sort((c,u)=>new Date(c.createdAt).getTime()-new Date(u.createdAt).getTime());let s=null;for(let c of r)c.isUser&&(s=new Date(c.createdAt));let a;for(let c of r){if(c.isUser||c.author==="unknown"||Un(c.author))continue;let u=new Date(c.createdAt);(!s||u>s)&&(a={author:c.author,body:c.body.slice(0,200)+(c.body.length>200?"...":""),createdAt:c.createdAt})}return a&&Lo(a.body)&&(a=void 0),{hasUnrespondedComment:!!a,lastMaintainerComment:a}}var n$=b(()=>{"use strict";ha()});function o$(e){return nR.test(e.toLowerCase())}function i$(e){if(!e)return{hasIncompleteChecklist:!1};let t=/- \[x\]/gi,n=/^.*- \[ \].*$/gm,o=e.match(t)||[],r=e.match(n)||[],i=o.length;if(i+r.length===0)return{hasIncompleteChecklist:!1};let a=r.filter(u=>!o$(u)),c=i+a.length;return{hasIncompleteChecklist:a.length>0,checklistStats:{checked:i,total:c}}}var nR,ug=b(()=>{"use strict";nR=/\(if\s|\bif applicable\b|\bif needed\b|\bif relevant\b|\bonly if\b|\bwhen applicable\b|\(optional\)|- \[ \]\s*optional\b|\bn\/a\b|\bnot applicable\b|\bif required\b|\bif necessary\b/});function s$(e,t){let n=[];if(t==="changes_requested"&&n.push("changes_requested"),!e)return n;let o=e.toLowerCase();return["screenshot","demo","recording","screen recording","before/after","before and after","gif","video","screencast","show me","can you show"].some(c=>o.includes(c))&&n.push("demo_requested"),["add test","test coverage","unit test","missing test","add a test","write test","needs test","need test"].some(c=>o.includes(c))&&n.push("tests_requested"),["documentation","readme","jsdoc","docstring","add docs","update docs","document this"].some(c=>o.includes(c))&&n.push("docs_requested"),["rebase","merge conflict","out of date","behind main","behind master"].some(c=>o.includes(c))&&n.push("rebase_requested"),n}var a$=b(()=>{"use strict"});function iR(e){let t=c$[e]?.label;return t?t.replace(/[[\]]/g,"").toLowerCase():e}function va(e){if(e.status==="needs_addressing"&&e.actionReason){let t=c$[e.actionReason];if(t){let n=t.description(e);if(e.actionReasons&&e.actionReasons.length>1){let o=e.actionReasons.filter(r=>r!==e.actionReason).map(iR);o.length>0&&(n+=` (also: ${o.join(", ")})`)}return{displayLabel:t.label,displayDescription:n}}}if(e.status==="waiting_on_maintainer"&&e.waitReason){let t=oR[e.waitReason];if(t)return{displayLabel:t.label,displayDescription:t.description(e)}}return v("display-utils",`PR ${e.url} has status "${e.status}" but no matching reason (actionReason=${e.actionReason}, waitReason=${e.waitReason})`),e.status==="needs_addressing"?{displayLabel:"[Needs Addressing]",displayDescription:"Action required"}:{displayLabel:"[Waiting on Maintainer]",displayDescription:"Awaiting maintainer action"}}var c$,oR,lg=b(()=>{"use strict";$e();c$={needs_response:{label:"[Needs Response]",description:e=>e.lastMaintainerComment?`@${e.lastMaintainerComment.author} commented`:"Maintainer awaiting response"},needs_changes:{label:"[Needs Changes]",description:()=>"Review requested changes \u2014 push commits to address"},failing_ci:{label:"[CI Failing]",description:e=>{let t=e.classifiedChecks||[],n=t.filter(i=>i.category==="actionable");if(n.length>0)return`${n.length} check${n.length===1?"":"s"} failed: ${n.map(i=>i.name).join(", ")}`;let o=t.filter(i=>i.category==="infrastructure");if(o.length>0)return`${o.length} check${o.length===1?"":"s"} cancelled/timed out (infrastructure)`;let r=e.failingCheckNames||[];return r.length>0?`${r.length} check${r.length===1?"":"s"} failed`:"One or more CI checks are failing"}},merge_conflict:{label:"[Merge Conflict]",description:()=>"PR has merge conflicts with the base branch"},incomplete_checklist:{label:"[Incomplete Checklist]",description:e=>e.checklistStats?`${e.checklistStats.checked}/${e.checklistStats.total} items checked`:"PR body has unchecked required checkboxes"},ci_not_running:{label:"[CI Not Running]",description:()=>"No CI checks have been triggered"},needs_rebase:{label:"[Needs Rebase]",description:()=>"PR branch is significantly behind upstream"},missing_required_files:{label:"[Missing Files]",description:e=>e.missingRequiredFiles?`Missing: ${e.missingRequiredFiles.join(", ")}`:"Required files are missing"}},oR={pending_review:{label:"[Waiting on Maintainer]",description:()=>"Awaiting review"},pending_merge:{label:"[Waiting on Maintainer]",description:()=>"Approved and CI passes \u2014 waiting for merge"},changes_addressed:{label:"[Waiting on Maintainer]",description:e=>e.hasUnrespondedComment&&e.lastMaintainerComment?`Changes addressed \u2014 waiting for @${e.lastMaintainerComment.author} to re-review`:"Changes addressed \u2014 awaiting re-review"},ci_blocked:{label:"[CI Blocked]",description:e=>{let t=e.classifiedChecks||[];return t.length>0&&t.every(n=>n.category!=="actionable")?`All failing checks are non-actionable (${[...new Set(t.map(o=>o.category))].join(", ")})`:"CI checks are failing but no action is needed from you"}},stale_ci_failure:{label:"[Stale CI Failure]",description:e=>`CI failing for ${e.daysSinceActivity}+ days \u2014 likely pre-existing or non-actionable`}}});function zr(){return{repos:new Map,monthlyCounts:{},monthlyOpenedCounts:{},dailyActivityCounts:{}}}function aR(e){if(typeof e!="object"||e===null)return!1;let t=e;return Array.isArray(t.reposEntries)&&typeof t.monthlyCounts=="object"&&t.monthlyCounts!==null&&typeof t.monthlyOpenedCounts=="object"&&t.monthlyOpenedCounts!==null&&typeof t.dailyActivityCounts=="object"&&t.dailyActivityCounts!==null}async function u$(e,t,n,o,r,i){if(!t)return zr();let s=wt(),a=i?`:stars${i.minStars}`:"",c=`pr-counts:v3:${o}:${t}${a}`,u=s.getIfFresh(c,sR);if(u&&aR(u))return E(Ee,`Using cached ${o} PR counts for @${t}`),{repos:new Map(u.reposEntries),monthlyCounts:u.monthlyCounts,monthlyOpenedCounts:u.monthlyOpenedCounts,dailyActivityCounts:u.dailyActivityCounts};E(Ee,`Fetching ${o} PR counts for @${t}...`);let l=new Map,d={},p={},g={},y=1,S=0,U;for(;;){let{data:T}=await e.search.issuesAndPullRequests({q:`is:pr ${n} author:${t} -user:${t}`,sort:"updated",order:"desc",per_page:100,page:y});U=T.total_count;for(let L of T.items){let Z=Pr(L.html_url);if(!Z){v(Ee,`Skipping ${o} PR with unparseable URL: ${L.html_url}`);continue}let{owner:N}=Z,z=`${N}/${Z.repo}`;if(bt(N,t)||i&&Wt(i.knownStarCounts.get(z),i.minStars))continue;let R=r(l,z,L);if(R){let G=R.slice(0,7);d[G]=(d[G]||0)+1;let ee=R.slice(0,10);ee.length===10&&(g[ee]=(g[ee]||0)+1)}if(L.created_at){let G=L.created_at.slice(0,7);p[G]=(p[G]||0)+1;let ee=L.created_at.slice(0,10);ee.length===10&&(g[ee]=(g[ee]||0)+1)}}if(S+=T.items.length,S>=T.total_count||S>=1e3||T.items.length===0||y>=jr)break;y++}return S<U&&y>=jr&&v(Ee,`Pagination capped at ${jr} pages: fetched ${S} of ${U} ${o} PRs. Stats may be incomplete for prolific contributors.`),E(Ee,`Found ${S} ${o} PRs across ${l.size} repos`),s.set(c,"",{reposEntries:Array.from(l.entries()),monthlyCounts:d,monthlyOpenedCounts:p,dailyActivityCounts:g}),{repos:l,monthlyCounts:d,monthlyOpenedCounts:p,dailyActivityCounts:g}}function l$(e,t,n){return u$(e,t,"is:merged","merged",(o,r,i)=>{i.pull_request?.merged_at||v(Ee,`merged_at missing for merged PR ${i.html_url}${i.closed_at?", falling back to closed_at":", no date available"}`);let s=i.pull_request?.merged_at||i.closed_at||"",a=o.get(r);return a?(a.count+=1,s&&s>a.lastMergedAt&&(a.lastMergedAt=s)):o.set(r,{count:1,lastMergedAt:s}),s},n)}function d$(e,t,n){return u$(e,t,"is:closed is:unmerged","closed",(o,r,i)=>(o.set(r,(o.get(r)||0)+1),i.closed_at||""),n)}async function p$(e,t,n,o,r,i){if(!t.githubUsername)return v(Ee,`Skipping recently ${o} PRs fetch: no githubUsername configured. Run /setup-oss to configure.`),[];let s=new Date;s.setDate(s.getDate()-r);let a=s.toISOString().split("T")[0];E(Ee,`Fetching recently ${o} PRs for @${t.githubUsername} (since ${a})...`);let{data:c}=await e.search.issuesAndPullRequests({q:n.replace("{username}",t.githubUsername).replace("{since}",a),sort:"updated",order:"desc",per_page:100}),u=[];for(let l of c.items){let d=Pe(l.html_url);if(!d){v(Ee,`Could not parse GitHub URL from API response: ${l.html_url}`);continue}let p=`${d.owner}/${d.repo}`;bt(d.owner,t.githubUsername)||u.push(i(l,{owner:d.owner,repo:p,number:d.number}))}return E(Ee,`Found ${u.length} recently ${o} PRs`),u}async function m$(e,t,n=7){return p$(e,t,"is:pr is:closed is:unmerged author:{username} closed:>={since}","closed",n,(o,{repo:r,number:i})=>({url:o.html_url,repo:r,number:i,title:o.title,closedAt:o.closed_at||""}))}async function g$(e,t,n=7){return p$(e,t,"is:pr is:merged author:{username} merged:>={since}","merged",n,(o,{repo:r,number:i})=>{let s=o.pull_request?.merged_at;return s||v(Ee,`merged_at missing for merged PR ${o.html_url}${o.closed_at?", falling back to closed_at":", no date available"}`),{url:o.html_url,repo:r,number:i,title:o.title,mergedAt:s||o.closed_at||""}})}async function f$(e,t,n){if(!t.githubUsername)return v(Ee,"Skipping merged PRs fetch: no githubUsername configured."),[];let o=n?` merged:>${n}`:"",r=`is:pr is:merged author:${t.githubUsername} -user:${t.githubUsername}${o}`;E(Ee,`Fetching merged PRs${n?` since ${n}`:" (all time)"}...`);let i=[],s=1,a=0;for(;;){let{data:c}=await e.search.issuesAndPullRequests({q:r,sort:"updated",order:"desc",per_page:100,page:s});for(let u of c.items){let l=Pe(u.html_url);if(!l){v(Ee,`Skipping merged PR with unparseable URL: ${u.html_url}`);continue}if(bt(l.owner,t.githubUsername))continue;let d=u.pull_request?.merged_at||u.closed_at||"";if(!d){v(Ee,`Skipping merged PR with no merge date: ${u.html_url}`);continue}i.push({url:u.html_url,title:u.title,mergedAt:d})}if(a+=c.items.length,a>=c.total_count||a>=1e3||c.items.length===0||s>=jr)break;s++}return E(Ee,`Fetched ${i.length} merged PRs${n?" (incremental)":" (initial)"}`),i}async function h$(e,t,n){if(!t.githubUsername)return v(Ee,"Skipping closed PRs fetch: no githubUsername configured."),[];let o=n?` closed:>${n}`:"",r=`is:pr is:closed is:unmerged author:${t.githubUsername} -user:${t.githubUsername}${o}`;E(Ee,`Fetching closed PRs${n?` since ${n}`:" (all time)"}...`);let i=[],s=1,a=0,c;for(;;){let{data:u}=await e.search.issuesAndPullRequests({q:r,sort:"updated",order:"desc",per_page:100,page:s});c=u.total_count;for(let l of u.items){let d=Pe(l.html_url);if(!d){v(Ee,`Skipping closed PR with unparseable URL: ${l.html_url}`);continue}if(bt(d.owner,t.githubUsername))continue;let p=l.closed_at||"";if(!p){v(Ee,`Skipping closed PR with no close date: ${l.html_url}`);continue}i.push({url:l.html_url,title:l.title,closedAt:p})}if(a+=u.items.length,a>=c||a>=1e3||u.items.length===0||s>=jr)break;s++}return a<c&&s>=jr&&v(Ee,`Pagination capped at ${jr} pages: fetched ${a} of ${c} closed PRs. Oldest PRs may be missing.`),E(Ee,`Fetched ${i.length} closed PRs${n?" (incremental)":" (initial)"}`),i}var Ee,sR,jr,ba=b(()=>{"use strict";Ue();Dt();$e();Ur();Ee="github-stats",sR=1440*60*1e3,jr=3});function cR(e,t){return e===!1||t==="dirty"}var ya,uR,Gr,v$=b(()=>{"use strict";Dn();On();Ue();ng();og();he();Go();$e();Ur();cg();n$();ug();a$();lg();ba();lg();cg();ug();ng();ya="pr-monitor",uR=En,Gr=class{octokit;stateManager;constructor(t){this.octokit=je(t),this.stateManager=K()}async fetchUserOpenPRs(){let t=this.stateManager.getState().config;if(!t.githubUsername)throw new Zt("No GitHub username configured. Run setup first.");E("pr-monitor",`Fetching open PRs for @${t.githubUsername}...`);let n=[],o=1,r=100,i=await this.octokit.search.issuesAndPullRequests({q:`is:pr is:open author:${t.githubUsername}`,sort:"updated",order:"desc",per_page:r,page:1});n.push(...i.data.items);let s=i.data.total_count;E("pr-monitor",`Found ${s} open PRs`);let a=Math.min(Math.ceil(s/r),10);for(;o<a;){o++;let d=await this.octokit.search.issuesAndPullRequests({q:`is:pr is:open author:${t.githubUsername}`,sort:"updated",order:"desc",per_page:r,page:o});n.push(...d.data.items)}let c=[],u=[],l=n.filter(d=>{if(!d.pull_request)return!1;let p=Pr(d.html_url);return p?!bt(p.owner,t.githubUsername):(v("pr-monitor",`Skipping PR with unparseable URL: ${d.html_url}`),!1)});return E("pr-monitor",`Filtered to ${l.length} PRs after excluding own repos`),await Cm("pr-monitor",`Fetch details for ${l.length} PRs`,async()=>{await la(l,async d=>{try{E("pr-monitor",`Fetching details for ${d.html_url}`);let p=await this.fetchPRDetails(d.html_url);p&&c.push(p)}catch(p){let g=P(p);v("pr-monitor",`Error fetching ${d.html_url}: ${g}`),u.push({prUrl:d.html_url,error:g})}},uR)}),c.sort((d,p)=>d.status===p.status?0:d.status==="needs_addressing"?-1:1),{prs:c,failures:u}}async fetchPRDetails(t){let n=Pe(t);if(!n||n.type!=="pull")throw new fe(`Invalid PR URL format: ${t}`);let{owner:o,repo:r,number:i}=n,s=this.stateManager.getState().config,[a,c,u,l]=await Promise.all([this.octokit.pulls.get({owner:o,repo:r,pull_number:i}),$t(F=>this.octokit.issues.listComments({owner:o,repo:r,issue_number:i,per_page:100,page:F})),this.octokit.pulls.listReviews({owner:o,repo:r,pull_number:i}),$t(F=>this.octokit.pulls.listReviewComments({owner:o,repo:r,pull_number:i,per_page:100,page:F})).catch(F=>{let X=He(F);if(X===429)throw F;if(X===403){let B=P(F).toLowerCase();if(B.includes("rate limit")||B.includes("abuse detection"))throw F;return v("pr-monitor",`403 fetching review comments for ${o}/${r}#${i}: ${B}`),[]}return X===404?E("pr-monitor",`Review comments 404 for ${o}/${r}#${i} (likely no inline comments)`):v("pr-monitor",`Failed to fetch review comments for ${o}/${r}#${i} (status ${X??"unknown"}): self-reply detection will be skipped`),[]})]),d=a.data,p=u.data,g=e$(p),y=cR(d.mergeable,d.mergeable_state),{hasUnrespondedComment:S,lastMaintainerComment:U}=r$(c,p,l,s.githubUsername),T=ag(this.octokit,o,r,d.head.sha),Z=S||g==="changes_requested"?this.octokit.repos.getCommit({owner:o,repo:r,ref:d.head.sha}).then(F=>({date:F.data.commit.author?.date,author:F.data.author?.login})).catch(F=>{let X=He(F);if(X===429)throw F;if(X===403){let B=P(F).toLowerCase();if(B.includes("rate limit")||B.includes("abuse detection"))throw F;v("pr-monitor",`403 fetching commit date for ${o}/${r}@${d.head.sha.slice(0,7)}: ${P(F)}`);return}v("pr-monitor",`Failed to fetch commit date for ${o}/${r}@${d.head.sha.slice(0,7)}: ${P(F)}`)}):Promise.resolve(void 0),[{status:N,failingCheckNames:z,failingCheckConclusions:R},G]=await Promise.all([T,Z]),ee=G?.date,q=G?.author,{hasIncompleteChecklist:ae,checklistStats:Ge}=i$(d.body||""),ve=s$(U?.body,g),be=dt(new Date(d.updated_at),new Date),pt=t$(p),Fe=fa(z,R),tr=N==="failing"&&Fe.some(F=>F.category==="actionable"),{status:Le,actionReason:mt,waitReason:Et,stalenessTier:xt,actionReasons:vr}=rg({ciStatus:N,hasMergeConflict:y,hasUnrespondedComment:S,hasIncompleteChecklist:ae,reviewDecision:g,daysSinceActivity:be,dormantThreshold:s.dormantThresholdDays,approachingThreshold:s.approachingDormantDays,latestCommitDate:ee,latestCommitAuthor:q,contributorUsername:s.githubUsername,lastMaintainerCommentDate:U?.createdAt,latestChangesRequestedDate:pt,hasActionableCIFailure:tr});return this.buildFetchedPR({id:d.id,url:t,repo:`${o}/${r}`,number:i,title:d.title,status:Le,actionReason:mt,waitReason:Et,stalenessTier:xt,actionReasons:vr,createdAt:d.created_at,updatedAt:d.updated_at,daysSinceActivity:be,ciStatus:N,failingCheckNames:z,classifiedChecks:Fe,hasMergeConflict:y,reviewDecision:g,hasUnrespondedComment:S,lastMaintainerComment:U,latestCommitDate:ee,hasIncompleteChecklist:ae,checklistStats:Ge,maintainerActionHints:ve})}buildFetchedPR(t){let n={...t,displayLabel:"",displayDescription:""},{displayLabel:o,displayDescription:r}=va(n);return n.displayLabel=o,n.displayDescription=r,n}async fetchUserMergedPRCounts(t){let n=this.stateManager.getState().config;return l$(this.octokit,n.githubUsername,t)}async fetchUserClosedPRCounts(t){let n=this.stateManager.getState().config;return d$(this.octokit,n.githubUsername,t)}async fetchRepoMetadata(t){if(t.length===0)return new Map;E(ya,`Fetching repo metadata for ${t.length} repos...`);let n=new Map,o=wt(),r=[...new Set(t)],i=10;for(let s=0;s<r.length;s+=i){let a=r.slice(s,s+i),c=await Promise.allSettled(a.map(async l=>{let d=l.split("/");if(d.length!==2||!d[0]||!d[1])throw new fe(`Malformed repo identifier: "${l}"`);let[p,g]=d,y=`/repos/${p}/${g}`,S=await Fo(o,y,T=>this.octokit.repos.get({owner:p,repo:g,headers:T})),U={stars:S.stargazers_count,language:S.language??null};return{repo:l,metadata:U}})),u=0;for(let l=0;l<c.length;l++){let d=c[l];d.status==="fulfilled"?n.set(d.value.repo,d.value.metadata):(u++,v(ya,`Failed to fetch metadata for ${a[l]}: ${P(d.reason)}`))}if(u===a.length&&a.length>0){let l=r.length-s-i;l>0&&v(ya,`Entire chunk failed, aborting remaining ${l} repos`);break}}return E(ya,`Fetched repo metadata for ${n.size}/${t.length} repos`),n}async fetchRecentlyClosedPRs(t=7){let n=this.stateManager.getState().config;return m$(this.octokit,n,t)}async fetchRecentlyMergedPRs(t=7){let n=this.stateManager.getState().config;return g$(this.octokit,n,t)}generateDigest(t,n=[],o=[]){let r=new Date().toISOString(),i=t.filter(c=>c.status==="needs_addressing"),s=t.filter(c=>c.status==="waiting_on_maintainer"),a=this.stateManager.getStats();return{generatedAt:r,openPRs:t,needsAddressingPRs:i,waitingOnMaintainerPRs:s,recentlyClosedPRs:n,recentlyMergedPRs:o,shelvedPRs:[],autoUnshelvedPRs:[],summary:{totalActivePRs:t.length,totalNeedingAttention:i.length,totalMergedAllTime:a.mergedPRs,mergeRate:parseFloat(a.mergeRate)}}}async updateRepoScoreFromObservedPR(t,n){n?this.stateManager.incrementMergedCount(t):this.stateManager.incrementClosedCount(t)}}});function dg(e){if(!e.labels||!Array.isArray(e.labels)||e.labels.length===0)return!1;let n=e.labels.map(o=>(typeof o=="string"?o:o.name||"").toLowerCase()).filter(o=>o.length>0);return n.length===0?!1:n.every(o=>b$.has(o))}function dR(e){return!e.labels||!Array.isArray(e.labels)?!1:e.labels.map(o=>(typeof o=="string"?o:o.name||"").toLowerCase()).filter(o=>lR.has(o)).length>=5}function pR(e){return e?/^.+\s+(question|fact|point|item|task|entry|post|challenge|exercise|example|problem|tip|recipe|snippet)\s+#?\d+$/i.test(e):!1}function y$(e){let t=new Set,n=new Map;for(let o of e){let r=o.repository_url.split("/").slice(-2).join("/");if(dR(o)){t.add(r);continue}o.title&&pR(o.title)&&n.set(r,(n.get(r)||0)+1)}for(let[o,r]of n)r>=3&&t.add(o);return t}function pg(e,t){let n=new Map,o=[];for(let r of e){let i=n.get(r.issue.repo)||0;i<t&&(o.push(r),n.set(r.issue.repo,i+1))}return o}var b$,lR,_a=b(()=>{"use strict";b$=new Set(["documentation","docs","typo","spelling"]);lR=new Set(["good first issue","hacktoberfest","easy","up-for-grabs","first-timers-only","beginner-friendly","beginner","starter","newbie","low-hanging-fruit","community"])});function _$(e,t){let n=0;return e>=5e3?n+=8:e>=500?n+=5:e>=50&&(n+=3),t>=500?n+=4:t>=50&&(n+=2),n}function $$(e){let t=50;e.repoScore!==null&&(t+=e.repoScore*2),t+=e.repoQualityBonus??0,e.mergedPRCount>0&&(t+=15),e.clearRequirements&&(t+=15);let n=new Date(e.issueUpdatedAt),o=dt(n);return o<=14?t+=15:o<=30&&(t+=Math.round(15*(1-(o-14)/16))),e.hasContributionGuidelines&&(t+=10),e.orgHasMergedPRs&&(t+=5),e.matchesPreferredCategory&&(t+=5),e.hasExistingPR&&(t-=30),e.isClaimed&&(t-=20),e.closedWithoutMergeCount>0&&e.mergedPRCount===0&&(t-=15),Math.max(0,Math.min(100,t))}var w$=b(()=>{"use strict";Ue()});function S$(e,t){if(t.length===0)return!1;let n=e.split("/")[0]?.toLowerCase();if(!n)return!1;for(let o of t){let r=gR[o];if(r&&r.some(i=>i.toLowerCase()===n))return!0}return!1}function k$(e){let t=new Set;for(let n of e){let o=mR[n];if(o)for(let r of o)t.add(r)}return[...t]}var mR,gR,mg=b(()=>{"use strict";mR={nonprofit:["nonprofit","social-good","humanitarian","charity","social-impact","civic-tech"],devtools:["developer-tools","devtools","cli","sdk","linter","formatter","build-tool"],infrastructure:["infrastructure","cloud","kubernetes","docker","devops","monitoring","observability"],"web-frameworks":["web-framework","frontend","backend","fullstack","nextjs","react","vue"],"data-ml":["machine-learning","data-science","deep-learning","nlp","data-pipeline","analytics"],education:["education","learning","tutorial","courseware","edtech","teaching"]},gR={nonprofit:["code-for-america","opengovfoundation","ushahidi","hotosm","openfn","democracyearth"],devtools:["eslint","prettier","vitejs","biomejs","oxc-project","ast-grep","turbot"],infrastructure:["kubernetes","hashicorp","grafana","prometheus","open-telemetry","envoyproxy","cncf"],"web-frameworks":["vercel","remix-run","sveltejs","nuxt","astro","redwoodjs","blitz-js"],"data-ml":["huggingface","mlflow","apache","dbt-labs","dagster-io","prefecthq","langchain-ai"],education:["freeCodeCamp","TheOdinProject","exercism","codecademy","oppia","Khan"]}});async function T$(e,t,n,o){try{let{data:r}=await e.search.issuesAndPullRequests({q:`repo:${t}/${n} is:pr ${o}`,per_page:5}),s=(await $t(a=>e.issues.listEventsForTimeline({owner:t,repo:n,issue_number:o,per_page:100,page:a}))).filter(a=>{let c=a;return c.event==="cross-referenced"&&c.source?.issue?.pull_request});return{passed:r.total_count===0&&s.length===0}}catch(r){let i=P(r);return v(gg,`Failed to check for existing PRs on ${t}/${n}#${o}: ${i}. Assuming no existing PR.`),{passed:!0,inconclusive:!0,reason:i}}}async function E$(e,t,n){try{let{data:o}=await e.search.issuesAndPullRequests({q:`repo:${t}/${n} is:pr is:merged author:@me`,per_page:1});return o.total_count}catch(o){let r=P(o);return v(gg,`Could not check merged PRs in ${t}/${n}: ${r}. Defaulting to 0.`),0}}async function x$(e,t,n,o,r){if(r===0)return{passed:!0};try{let s=(await e.paginate(e.issues.listComments,{owner:t,repo:n,issue_number:o,per_page:100},a=>a.data)).slice(-100);for(let a of s){let c=(a.body||"").toLowerCase();if(fR.some(u=>c.includes(u)))return{passed:!1}}return{passed:!0}}catch(i){let s=P(i);return v(gg,`Failed to check claim status on ${t}/${n}#${o}: ${s}. Assuming not claimed.`),{passed:!0,inconclusive:!0,reason:s}}}function R$(e){if(!e||e.length<50)return!1;let t=/\d\.|[-*]\s/.test(e),n=/```/.test(e),o=/expect|should|must|want/i.test(e);return[t,n,o,e.length>200].filter(Boolean).length>=2}var gg,fR,P$=b(()=>{"use strict";Go();he();$e();gg="issue-eligibility",fR=["i'm working on this","i am working on this","i'll take this","i will take this","working on it","i'd like to work on","i would like to work on","can i work on","may i work on","assigned to me","i'm on it","i'll submit a pr","i will submit a pr","working on a fix","working on a pr"]});function O$(){let e=Date.now();for(let[t,n]of Jt.entries())e-n.fetchedAt>I$&&Jt.delete(t);if(Jt.size>C$){let n=Array.from(Jt.entries()).sort((o,r)=>o[1].fetchedAt-r[1].fetchedAt).slice(0,Jt.size-C$);for(let[o]of n)Jt.delete(o)}}async function A$(e,t,n){let o=wt(),r=`health:${t}/${n}`;try{return await ma(o,r,hR,async()=>{let i=`/repos/${t}/${n}`,s=await Fo(o,i,p=>e.repos.get({owner:t,repo:n,headers:p})),{data:a}=await e.repos.listCommits({owner:t,repo:n,per_page:1}),u=a[0]?.commit?.author?.date||s.pushed_at,l=dt(new Date(u)),d="unknown";try{let{data:p}=await e.actions.listRepoWorkflows({owner:t,repo:n,per_page:1});p.total_count>0&&(d="passing")}catch(p){let g=P(p);v(fg,`Failed to check CI status for ${t}/${n}: ${g}. Defaulting to unknown.`)}return{repo:`${t}/${n}`,lastCommitAt:u,daysSinceLastCommit:l,openIssuesCount:s.open_issues_count,avgIssueResponseDays:0,ciStatus:d,isActive:l<30,stargazersCount:s.stargazers_count,forksCount:s.forks_count}})}catch(i){let s=P(i);return v(fg,`Error checking project health for ${t}/${n}: ${s}`),{repo:`${t}/${n}`,lastCommitAt:"",daysSinceLastCommit:999,openIssuesCount:0,avgIssueResponseDays:0,ciStatus:"unknown",isActive:!1,checkFailed:!0,failureReason:s}}}async function D$(e,t,n){let o=`${t}/${n}`,r=Jt.get(o);if(r&&Date.now()-r.fetchedAt<I$)return r.guidelines;let i=["CONTRIBUTING.md",".github/CONTRIBUTING.md","docs/CONTRIBUTING.md","contributing.md"],s=await Promise.allSettled(i.map(a=>e.repos.getContent({owner:t,repo:n,path:a}).then(({data:c})=>"content"in c?Buffer.from(c.content,"base64").toString("utf-8"):null)));for(let a=0;a<s.length;a++){let c=s[a];if(c.status==="fulfilled"&&c.value){let u=vR(c.value);return Jt.set(o,{guidelines:u,fetchedAt:Date.now()}),O$(),u}if(c.status==="rejected"){let u=c.reason instanceof Error?c.reason.message:String(c.reason);!u.includes("404")&&!u.includes("Not Found")&&v(fg,`Unexpected error fetching ${i[a]} from ${t}/${n}: ${u}`)}}Jt.set(o,{guidelines:void 0,fetchedAt:Date.now()}),O$()}function vR(e){let t={rawContent:e},n=e.toLowerCase();if(n.includes("branch")){let o=e.match(/branch[^\n]*(?:named?|format|convention)[^\n]*[`"]([^`"]+)[`"]/i);o&&(t.branchNamingConvention=o[1])}if(n.includes("conventional commit"))t.commitMessageFormat="conventional commits";else if(n.includes("commit message")){let o=e.match(/commit message[^\n]*[`"]([^`"]+)[`"]/i);o&&(t.commitMessageFormat=o[1])}return n.includes("jest")?t.testFramework="Jest":n.includes("rspec")?t.testFramework="RSpec":n.includes("pytest")?t.testFramework="pytest":n.includes("mocha")&&(t.testFramework="Mocha"),n.includes("eslint")?t.linter="ESLint":n.includes("rubocop")?t.linter="RuboCop":n.includes("prettier")&&(t.formatter="Prettier"),(n.includes("cla")||n.includes("contributor license agreement"))&&(t.claRequired=!0),t}var fg,Jt,I$,hR,C$,U$=b(()=>{"use strict";Ue();he();$e();Ur();fg="repo-health",Jt=new Map,I$=3600*1e3,hR=14400*1e3,C$=100});var hg,bR,yR,$a,j$=b(()=>{"use strict";Ue();he();$e();w$();mg();P$();U$();Ur();hg="issue-vetting",bR=3,yR=900*1e3,$a=class{octokit;stateManager;constructor(t,n){this.octokit=t,this.stateManager=n}async vetIssue(t){let n=wt(),o=`vet:${t}`,r=n.getIfFresh(o,yR);if(r&&typeof r=="object"&&"issue"in r&&"viabilityScore"in r)return E(hg,`Vetting cache hit for ${t}`),r;let i=Pe(t);if(!i||i.type!=="issues")throw new fe(`Invalid issue URL: ${t}`);let{owner:s,repo:a,number:c}=i,u=`${s}/${a}`,{data:l}=await this.octokit.issues.get({owner:s,repo:a,issue_number:c}),[d,p,g,y,S]=await Promise.all([T$(this.octokit,s,a,c),x$(this.octokit,s,a,c,l.comments),A$(this.octokit,s,a),D$(this.octokit,s,a),E$(this.octokit,s,a)]),U=d.passed,T=p.passed,L=R$(l.body||""),Z=g.checkFailed?!0:g.isActive,N={passedAllChecks:U&&T&&Z&&L,checks:{noExistingPR:U,notClaimed:T,projectActive:Z,clearRequirements:L,contributionGuidelinesFound:!!y},contributionGuidelines:y,notes:[]};U||N.notes.push("Existing PR found for this issue"),T||N.notes.push("Issue appears to be claimed by someone"),d.inconclusive&&N.notes.push(`Could not verify absence of existing PRs: ${d.reason||"API error"}`),p.inconclusive&&N.notes.push(`Could not verify claim status: ${p.reason||"API error"}`),g.checkFailed?N.notes.push(`Could not verify project activity: ${g.failureReason||"API error"}`):g.isActive||N.notes.push("Project may be inactive"),L||N.notes.push("Issue requirements are unclear"),y||N.notes.push("No CONTRIBUTING.md found");let z={id:l.id,url:t,repo:u,number:c,title:l.title,status:"candidate",labels:l.labels.map(B=>typeof B=="string"?B:B.name||""),createdAt:l.created_at,updatedAt:l.updated_at,vetted:!0,vettingResult:N},R=[],G=[];U||R.push("Has existing PR"),T||R.push("Already claimed"),!g.isActive&&!g.checkFailed&&R.push("Inactive project"),L||R.push("Unclear requirements"),U&&G.push("No existing PR"),T&&G.push("Not claimed"),g.isActive&&!g.checkFailed&&G.push("Active project"),L&&G.push("Clear requirements"),y&&G.push("Has contribution guidelines");let ee=this.stateManager.getState().config,q=this.stateManager.getRepoScore(u),ae=q&&q.mergedPRCount>0?q.mergedPRCount:S;ae>0?G.push(`Trusted project (${ae} PR${ae>1?"s":""} merged)`):ee.trustedProjects.includes(u)&&G.push("Trusted project (previous PR merged)"),q&&(q.closedWithoutMergeCount>0&&ae===0?R.push("User has rejected PR(s) in this repo with no successful merges"):q.closedWithoutMergeCount>0&&ae>0&&N.notes.push(`Mixed history: ${ae} merged, ${q.closedWithoutMergeCount} closed without merge`));let Ge=u.split("/")[0],ve=!1;Ge&&u.includes("/")&&(ve=Object.values(this.stateManager.getState().repoScores).some(B=>B.repo&&B.mergedPRCount>0&&B.repo.startsWith(Ge+"/")&&B.repo!==u)),ve&&G.push(`Org affinity (merged PRs in other ${Ge} repos)`);let be=ee.projectCategories??[],pt=S$(u,be);pt&&G.push("Matches preferred project category");let Fe;N.passedAllChecks?Fe="approve":R.length>2?Fe="skip":Fe="needs_review";let tr=g.checkFailed||d.inconclusive||p.inconclusive;Fe==="approve"&&tr&&(Fe="needs_review",N.notes.push("Recommendation downgraded: one or more checks were inconclusive"));let Le=_$(g.stargazersCount??0,g.forksCount??0);g.checkFailed&&Le===0&&N.notes.push("Repo quality bonus unavailable: could not fetch star/fork counts due to API error");let mt=this.getRepoScore(u),Et=$$({repoScore:mt,hasExistingPR:!U,isClaimed:!T,clearRequirements:L,hasContributionGuidelines:!!y,issueUpdatedAt:l.updated_at,closedWithoutMergeCount:q?.closedWithoutMergeCount??0,mergedPRCount:ae,orgHasMergedPRs:ve,repoQualityBonus:Le,matchesPreferredCategory:pt}),xt=this.stateManager.getStarredRepos(),vr=ee.preferredOrgs??[],F="normal";ae>0?F="merged_pr":vr.some(B=>B.toLowerCase()===Ge?.toLowerCase())?F="preferred_org":xt.includes(u)&&(F="starred");let X={issue:z,vettingResult:N,projectHealth:g,recommendation:Fe,reasonsToSkip:R,reasonsToApprove:G,viabilityScore:Et,searchPriority:F};return n.set(o,"",X),X}async vetIssuesParallel(t,n,o){let r=[],i=new Map,s=0,a=0,c=0;for(let l of t){if(r.length>=n)break;c++;let d=this.vetIssue(l).then(p=>{r.length<n&&(o&&(p.searchPriority=o),r.push(p))}).catch(p=>{s++,Vt(p)&&a++,v(hg,`Error vetting issue ${l}:`,P(p))}).finally(()=>i.delete(l));i.set(l,d),i.size>=bR&&await Promise.race(i.values())}await Promise.allSettled(i.values());let u=s===c&&c>0;return u&&v(hg,`All ${c} issue(s) failed vetting. This may indicate a systemic issue (rate limit, auth, network).`),{candidates:r.slice(0,n),allFailed:u,rateLimitHit:a>0}}getRepoScore(t){return this.stateManager.getState().repoScores?.[t]?.score??null}}});function $R(e,t=0){let n=z$-t+1;if(n<1)return e.length>0&&v(Fr,`Label filtering disabled: ${t} repo/org ORs exceed GitHub's ${z$} operator limit. All ${e.length} label(s) dropped from query.`),[[]];if(e.length<=n)return[e];let o=[];for(let r=0;r<e.length;r+=n)o.push(e.slice(r,r+n));return E(Fr,`Split ${e.length} labels into ${o.length} chunks (${t} ops reserved, max ${n} per chunk)`),o}function wR(e){return e.length===0?"":e.length===1?`label:"${e[0]}"`:`(${e.map(t=>`label:"${t}"`).join(" OR ")})`}function F$(e,t){let n=new Set;for(let o of e)for(let r of Io[o]??[])n.add(r);for(let o of t)n.add(o);return[...n]}function L$(e){let t=[],n=Math.max(...e.map(o=>o.length),0);for(let o=0;o<n;o++)for(let r of e)o<r.length&&t.push(r[o]);return t}function SR(e,t){let n=[];for(let o=0;o<e.length;o+=t)n.push(e.slice(o,o+t));return n}async function vg(e,t){let n=`search:${t.q}:${t.sort}:${t.order}:${t.per_page}`;return ma(wt(),n,kR,async()=>{let{data:o}=await e.search.issuesAndPullRequests(t);return o})}async function wa(e,t,n,o,r){let i=$R(t,n),s=new Set,a=[];for(let c=0;c<i.length;c++){c>0&&await qt(G$);let u=o(wR(i[c])),l=await vg(e,{q:u,sort:"created",order:"desc",per_page:r});for(let d of l.items)s.has(d.html_url)||(s.add(d.html_url),a.push(d))}return a}async function bg(e,t,n,o,r,i,s){let a=y$(t);if(a.size>0){let y=t.filter(S=>a.has(S.repository_url.split("/").slice(-2).join("/"))).length;E(Fr,`[SPAM_FILTER] Filtered ${y} issues from ${a.size} label-farming repos: ${[...a].join(", ")}`)}let c=n(t).filter(y=>{let S=y.repository_url.split("/").slice(-2).join("/");return a.has(S)?!1:o.every(U=>!U.has(S))}).slice(0,r*2);if(c.length===0)return E(Fr,`[${s}] All ${t.length} items filtered before vetting`),{candidates:[],allVetFailed:!1,rateLimitHit:!1};let{candidates:u,allFailed:l,rateLimitHit:d}=await e.vetIssuesParallel(c.map(y=>y.html_url),r,"normal"),p=u.filter(y=>y.projectHealth.checkFailed?!0:(y.projectHealth.stargazersCount??0)>=i),g=u.length-p.length;return g>0&&E(Fr,`[STAR_FILTER] Filtered ${g} ${s} candidates below ${i} stars`),{candidates:p,allVetFailed:l,rateLimitHit:d}}async function Sa(e,t,n,o,r,i,s,a){let c=[],u=SR(n,_R),l=0,d=0;for(let y=0;y<u.length;y++){let S=u[y];if(c.length>=i)break;y>0&&await qt(G$);try{let U=S.map(N=>`repo:${N}`).join(" OR "),T=S.length-1,L=Math.min(30,(i-c.length)*3),Z=await wa(e,r,T,N=>`${o} ${N} (${U})`.replace(/ +/g," ").trim(),L);if(Z.length>0){let N=a(Z),z=i-c.length,{candidates:R,rateLimitHit:G}=await t.vetIssuesParallel(N.slice(0,z*2).map(ee=>ee.html_url),z,s);c.push(...R),G&&d++}}catch(U){l++,Vt(U)&&d++;let T=S.join(", ");v(Fr,`Error searching issues in batch [${T}]:`,P(U))}}let p=l===u.length&&u.length>0,g=d>0;return p&&v(Fr,`All ${u.length} batch(es) failed for ${s} phase. This may indicate a systemic issue (rate limit, auth, network).`),{candidates:c,allBatchesFailed:p,rateLimitHit:g}}var Fr,z$,G$,_R,kR,N$=b(()=>{"use strict";Dt();he();$e();Ur();_a();Ue();Fr="search-phases",z$=5,G$=1500,_R=3;kR=900*1e3});var M$,Z$,ue,ka,No,Ta,Kt,V$=b(()=>{"use strict";M$=re(require("fs"),1),Z$=re(require("path"),1);Dn();On();Ue();Dt();he();$e();_a();j$();mg();N$();ue="issue-discovery",ka=2e3,No=20,Ta=10,Kt=class{octokit;stateManager;githubToken;vetter;rateLimitWarning=null;constructor(t){this.githubToken=t,this.octokit=je(t),this.stateManager=K(),this.vetter=new $a(this.octokit,this.stateManager)}async fetchStarredRepos(){Re(ue,"Fetching starred repositories...");let t=[];try{let n=this.octokit.paginate.iterator(this.octokit.activity.listReposStarredByAuthenticatedUser,{per_page:100}),o=0;for await(let{data:r}of n){for(let i of r){let s;"full_name"in i&&typeof i.full_name=="string"?s=i.full_name:"repo"in i&&i.repo&&typeof i.repo=="object"&&"full_name"in i.repo&&(s=i.repo.full_name),s&&t.push(s)}if(o++,o>=5){Re(ue,"Reached pagination limit for starred repos (500)");break}}return Re(ue,`Fetched ${t.length} starred repositories`),this.stateManager.setStarredRepos(t),t}catch(n){let o=this.stateManager.getStarredRepos(),r=P(n);return v(ue,"Error fetching starred repos:",r),o.length===0?v(ue,`Failed to fetch starred repositories from GitHub API. No cached repos available. Error: ${r}
|
|
84
|
+
`);let u={},l=new o.Events(u);return u.on("secondary-limit",c.onSecondaryRateLimit),u.on("rate-limit",c.onRateLimit),u.on("error",d=>e.log.warn("Error in throttling-plugin limit handler",d)),c.retryLimiter.on("failed",async function(d,p){let[g,y,S]=p.args,{pathname:U}=new URL(S.url,"http://github.test");if(!(U.startsWith("/graphql")&&d.status!==401||d.status===403||d.status===429))return;let L=~~y.retryCount;y.retryCount=L,S.request.retryCount=L;let{wantRetry:Z,retryAfter:N=0}=await(async function(){if(/\bsecondary rate\b/i.test(d.message)){let z=Number(d.response.headers["retry-after"])||g.fallbackSecondaryRateRetryAfter;return{wantRetry:await l.trigger("secondary-limit",z,S,e,L),retryAfter:z}}if(d.response.headers!=null&&d.response.headers["x-ratelimit-remaining"]==="0"||(d.response.data?.errors??[]).some(z=>z.type==="RATE_LIMITED")){let z=new Date(~~d.response.headers["x-ratelimit-reset"]*1e3).getTime(),R=Math.max(Math.ceil((z-Date.now())/1e3)+1,0);return{wantRetry:await l.trigger("rate-limit",R,S,e,L),retryAfter:R}}return{}})();if(Z)return y.retryCount++,N*g.retryAfterBaseValue}),e.hook.wrap("request",Ux.bind(null,c)),{}}var Z_,Dx,eg,Gx,M_,V_,Dr,Lx,H_=b(()=>{Z_=re(N_(),1),Dx="0.0.0-development",eg=()=>Promise.resolve();Gx=["/orgs/{org}/invitations","/orgs/{org}/invitations/{invitation_id}","/orgs/{org}/teams/{team_slug}/discussions","/orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments","/repos/{owner}/{repo}/collaborators/{username}","/repos/{owner}/{repo}/commits/{commit_sha}/comments","/repos/{owner}/{repo}/issues","/repos/{owner}/{repo}/issues/{issue_number}/comments","/repos/{owner}/{repo}/issues/{issue_number}/sub_issue","/repos/{owner}/{repo}/issues/{issue_number}/sub_issues/priority","/repos/{owner}/{repo}/pulls","/repos/{owner}/{repo}/pulls/{pull_number}/comments","/repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies","/repos/{owner}/{repo}/pulls/{pull_number}/merge","/repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers","/repos/{owner}/{repo}/pulls/{pull_number}/reviews","/repos/{owner}/{repo}/releases","/teams/{team_id}/discussions","/teams/{team_id}/discussions/{discussion_number}/comments"];M_=Fx(Gx),V_=M_.test.bind(M_),Dr={},Lx=function(e,t){Dr.global=new e.Group({id:"octokit-global",maxConcurrent:10,...t}),Dr.auth=new e.Group({id:"octokit-auth",maxConcurrent:1,...t}),Dr.search=new e.Group({id:"octokit-search",maxConcurrent:1,minTime:2e3,...t}),Dr.write=new e.Group({id:"octokit-write",maxConcurrent:1,minTime:1e3,...t}),Dr.notifications=new e.Group({id:"octokit-notifications",maxConcurrent:1,minTime:3e3,...t})};sa.VERSION=Dx;sa.triggersNotification=V_});function ua(e){return e.toLocaleTimeString("en-US",{hour12:!1})}function Mx(){return{onRateLimit:(e,t,n,o)=>{let r=t,i=new Date(Date.now()+e*1e3);return o<2?(v(aa,`Rate limit hit (retry ${o+1}/2, waiting ${e}s, resets at ${ua(i)}) \u2014 ${r.method} ${r.url}`),!0):(v(aa,`Rate limit exceeded, not retrying \u2014 ${r.method} ${r.url} (resets at ${ua(i)})`),!1)},onSecondaryRateLimit:(e,t,n,o)=>{let r=t,i=new Date(Date.now()+e*1e3);return o<3?(v(aa,`Secondary rate limit hit (retry ${o+1}/3, waiting ${e}s, resets at ${ua(i)}) \u2014 ${r.method} ${r.url}`),!0):(v(aa,`Secondary rate limit exceeded, not retrying \u2014 ${r.method} ${r.url} (resets at ${ua(i)})`),!1)}}}function je(e){if(ca&&q_===e)return ca;let t=Mx();return ca=new Nx({auth:e,throttle:t}),q_=e,ca}async function tg(e){let t=je(e),{data:n}=await t.rateLimit.get(),o=n.resources.search;return{remaining:o.remaining,limit:o.limit,resetAt:new Date(o.reset*1e3).toISOString()}}var aa,Nx,ca,q_,Dn=b(()=>{"use strict";L_();H_();$e();aa="github",Nx=F_.plugin(sa),ca=null,q_=null});function Hx(e,t){if(!e||!t)return!0;let n=e.toLowerCase();return Zx.has(n)?!0:n===t.toLowerCase()}function qx(e,t){let n=new Date(e).getTime(),o=new Date(t).getTime();return Number.isNaN(n)||Number.isNaN(o)?e>t:n-o>=Vx}function B_(e){let{latestCommitDate:t,latestCommitAuthor:n,contributorUsername:o}=e;if(t)return Hx(n,o)?t:void 0}function W_(e,t,n){return!(!e||!t||!qx(e,t)||n&&e<n)}function J_(e,t){return!e||!t?!1:e>=t}function Bx(e){let{ciStatus:t,hasMergeConflict:n,hasUnrespondedComment:o,hasIncompleteChecklist:r,reviewDecision:i,lastMaintainerCommentDate:s,latestChangesRequestedDate:a,hasActionableCIFailure:c=!0}=e,u=B_(e),l=[];return o&&!W_(u,s,a)&&l.push("needs_response"),i==="changes_requested"&&a&&!J_(u,a)&&l.push("needs_changes"),t==="failing"&&c&&l.push("failing_ci"),n&&l.push("merge_conflict"),r&&l.push("incomplete_checklist"),l.length>0?l:void 0}function rg(e){let t=Wx(e),n=Bx(e);return n?{...t,actionReasons:n}:t}function Wx(e){let{ciStatus:t,hasMergeConflict:n,hasUnrespondedComment:o,hasIncompleteChecklist:r,reviewDecision:i,daysSinceActivity:s,dormantThreshold:a,approachingThreshold:c,lastMaintainerCommentDate:u,latestChangesRequestedDate:l,hasActionableCIFailure:d=!0}=e,p="active";s>=a?p="dormant":s>=c&&(p="approaching_dormant");let g=B_(e);return o?W_(g,u,l)?t==="failing"&&d?{status:"needs_addressing",actionReason:"failing_ci",stalenessTier:p}:{status:"waiting_on_maintainer",waitReason:"changes_addressed",stalenessTier:p}:{status:"needs_addressing",actionReason:"needs_response",stalenessTier:p}:i==="changes_requested"&&l?J_(g,l)?t==="failing"&&d?{status:"needs_addressing",actionReason:"failing_ci",stalenessTier:p}:{status:"waiting_on_maintainer",waitReason:"changes_addressed",stalenessTier:p}:{status:"needs_addressing",actionReason:"needs_changes",stalenessTier:p}:t==="failing"?d?s>=5?{status:"waiting_on_maintainer",waitReason:"stale_ci_failure",stalenessTier:p}:{status:"needs_addressing",actionReason:"failing_ci",stalenessTier:p}:{status:"waiting_on_maintainer",waitReason:"ci_blocked",stalenessTier:p}:n?{status:"needs_addressing",actionReason:"merge_conflict",stalenessTier:p}:r?{status:"needs_addressing",actionReason:"incomplete_checklist",stalenessTier:p}:i==="approved"&&(t==="passing"||t==="unknown")?{status:"waiting_on_maintainer",waitReason:"pending_merge",stalenessTier:p}:{status:"waiting_on_maintainer",waitReason:"pending_review",stalenessTier:p}}var Zx,Vx,ng=b(()=>{"use strict";Zx=new Set(["autofix-ci[bot]","prettier-ci[bot]","pre-commit-ci[bot]"]),Vx=120*1e3});async function la(e,t,n){let o=0,r=!1,i=async()=>{for(;o<e.length&&!r;){let a=e[o++];try{await t(a)}catch(c){throw r=!0,c}}},s=Math.min(n,e.length);await Promise.all(Array.from({length:s},()=>i()))}var og=b(()=>{"use strict"});async function $t(e,t=100,n=10){let o=[];for(let r=1;r<=n;r++){let{data:i}=await e(r);if(o.push(...i),i.length<t)break}return o}var Go=b(()=>{"use strict"});function wt(){return ig||(ig=new pa),ig}async function Fo(e,t,n){let o=e.getInflight(t);if(o)return E(gr,`Dedup hit for ${t}`),await o;let i=(async()=>{let a={},c=e.get(t);c&&(a["if-none-match"]=c.etag);try{let u=await n(a),l=u.headers?.etag;return l&&e.set(t,l,u.data),u.data}catch(u){if(Kx(u)){let l=e.get(t);if(l)return E(gr,`304 cache hit for ${t}`),l.body}throw u}})(),s=e.setInflight(t,i);try{return await i}finally{s()}}async function ma(e,t,n,o){let r=e.getIfFresh(t,n);if(r)return E(gr,`Time-based cache hit for ${t}`),r;let i=await o();return e.set(t,"",i),i}function Kx(e){return He(e)===304}var st,da,K_,gr,Jx,pa,ig,Ur=b(()=>{"use strict";st=re(require("fs"),1),da=re(require("path"),1),K_=re(require("crypto"),1);Ue();$e();he();gr="http-cache",Jx=1440*60*1e3,pa=class{cacheDir;inflightRequests=new Map;constructor(t){this.cacheDir=t??Bs()}keyFor(t){return K_.createHash("sha256").update(t).digest("hex")}pathFor(t){return da.join(this.cacheDir,`${this.keyFor(t)}.json`)}getIfFresh(t,n){let o=this.get(t);if(!o)return null;let r=Date.now()-new Date(o.cachedAt).getTime();return!Number.isFinite(r)||r<0||r>n?null:o.body}get(t){let n=this.pathFor(t);try{let o=st.readFileSync(n,"utf-8"),r=JSON.parse(o);return r.url!==t?(E(gr,`Cache collision detected for ${t}, ignoring`),null):r}catch{return null}}set(t,n,o){let r={etag:n,url:t,body:o,cachedAt:new Date().toISOString()};try{st.writeFileSync(this.pathFor(t),JSON.stringify(r),{encoding:"utf-8",mode:384}),E(gr,`Cached response for ${t}`)}catch(i){E(gr,`Failed to write cache for ${t}`,i)}}hasInflight(t){return this.inflightRequests.has(t)}getInflight(t){return this.inflightRequests.get(t)}setInflight(t,n){return this.inflightRequests.set(t,n),()=>{this.inflightRequests.delete(t)}}evictStale(t=Jx){let n=0;try{let o=st.readdirSync(this.cacheDir),r=Date.now();for(let i of o){if(!i.endsWith(".json"))continue;let s=da.join(this.cacheDir,i);try{let a=st.readFileSync(s,"utf-8"),c=JSON.parse(a);r-new Date(c.cachedAt).getTime()>t&&(st.unlinkSync(s),n++)}catch{try{st.unlinkSync(s),n++}catch{}}}}catch{}return n>0&&E(gr,`Evicted ${n} stale cache entries`),n}clear(){try{let t=st.readdirSync(this.cacheDir);for(let n of t)n.endsWith(".json")&&st.unlinkSync(da.join(this.cacheDir,n));E(gr,"Cache cleared")}catch{}}size(){try{return st.readdirSync(this.cacheDir).filter(t=>t.endsWith(".json")).length}catch{return 0}}},ig=null});function ga(){return{status:"unknown",failingCheckNames:[],failingCheckConclusions:new Map}}function sg(e,t,n){if(n==="cancelled"||n==="timed_out")return"infrastructure";if(n==="action_required")return"auth_gate";let o=e.toLowerCase();if(Y_.some(r=>r.test(o)))return"auth_gate";if(X_.some(r=>r.test(o)))return"fork_limitation";if(Q_.some(r=>r.test(o)))return"infrastructure";if(t){let r=t.toLowerCase();if(Y_.some(i=>i.test(r)))return"auth_gate";if(X_.some(i=>i.test(r)))return"fork_limitation";if(Q_.some(i=>i.test(r)))return"infrastructure"}return"actionable"}function fa(e,t){return e.map(n=>{let o=t?.get(n);return{name:n,category:sg(n,void 0,o),conclusion:o}})}function Xx(e){let t=!1,n=!1,o=!1,r=[],i=new Map;for(let s of e)s.conclusion==="failure"||s.conclusion==="cancelled"||s.conclusion==="timed_out"||s.conclusion==="action_required"?(t=!0,r.push(s.name),i.set(s.name,s.conclusion)):s.status==="in_progress"||s.status==="queued"?n=!0:s.conclusion==="success"&&(o=!0);return{hasFailingChecks:t,hasPendingChecks:n,hasSuccessfulChecks:o,failingCheckNames:r,failingCheckConclusions:i}}function Yx(e){let t=e.statuses.filter(c=>{let u=(c.description||"").toLowerCase();return!(c.state==="failure"&&(u.includes("authorization required")||u.includes("authorize")))}),n=t.some(c=>c.state==="failure"||c.state==="error"),o=t.some(c=>c.state==="pending"),r=t.some(c=>c.state==="success"),i;n?i="failure":o?i="pending":r||t.length===0?i="success":i=e.state;let s=e.statuses.length>0,a=[];for(let c of t)(c.state==="failure"||c.state==="error")&&a.push(c.context);return{effectiveCombinedState:i,hasStatuses:s,failingStatusNames:a}}function Qx(e,t,n){let{hasFailingChecks:o,hasPendingChecks:r,hasSuccessfulChecks:i,failingCheckNames:s,failingCheckConclusions:a}=e,{effectiveCombinedState:c,hasStatuses:u,failingStatusNames:l}=t,d=[...s,...l];return o||c==="failure"||c==="error"?{status:"failing",failingCheckNames:d,failingCheckConclusions:a}:r||c==="pending"?{status:"pending",failingCheckNames:[],failingCheckConclusions:new Map}:i||c==="success"?{status:"passing",failingCheckNames:[],failingCheckConclusions:new Map}:ga()}async function ag(e,t,n,o){if(!o)return ga();try{let[r,i]=await Promise.all([e.repos.getCombinedStatusForRef({owner:t,repo:n,ref:o}),e.checks.listForRef({owner:t,repo:n,ref:o}).catch(p=>{let g=He(p);if(g===429)throw p;if(g===403){let y=P(p).toLowerCase();if(y.includes("rate limit")||y.includes("abuse detection"))throw p}return g===404?E("pr-monitor",`Check runs 404 for ${t}/${n}@${o.slice(0,7)} (no checks configured)`):v("pr-monitor",`Non-404 error fetching check runs for ${t}/${n}@${o.slice(0,7)}: ${g??p}`),null})]),s=r.data,a=i?.data?.check_runs||[],c=new Map;for(let p of a){let g=c.get(p.name);(!g||new Date(p.started_at??0)>new Date(g.started_at??0))&&c.set(p.name,p)}let u=[...c.values()],l=Xx(u),d=Yx(s);return Qx(l,d,u.length)}catch(r){let i=He(r);if(i===401||i===403||i===429)throw r;return i===404?E("pr-monitor",`CI check 404 for ${t}/${n} (no CI configured)`):v("pr-monitor",`Failed to check CI for ${t}/${n}@${o.slice(0,7)}: ${P(r)}`),ga()}}var X_,Y_,Q_,cg=b(()=>{"use strict";he();$e();X_=[/vercel/i,/netlify/i,/\bpreview\s*deploy/i,/\bdeploy\s*preview/i,/storybook/i,/chromatic/i,/percy/i,/cloudflare pages/i,/\binternal\b/i],Y_=[/authoriz/i,/approval/i,/\bcla\b/i,/license\/cla/i],Q_=[/\binstall\s*(os\s*)?dep(endenc|s\b)/i,/\bsetup\s+fail(ed|ure)?\b/i,/\bservice\s*unavailable/i,/\binfrastructure/i,/\bblacksmith\b/i,/\breadthedocs\b/i]});function Un(e){return e.includes("[bot]")||eR.has(e.toLowerCase())}function Lo(e){if(!e||e.length>100||e.includes("?"))return!1;let t=e.toLowerCase();return["thanks","thank you","lgtm","looks good","will review","we'll review","we'll get to this","noted","got it","will look","will check"].some(o=>t.includes(o))}var eR,ha=b(()=>{"use strict";eR=new Set(["allcontributors","changeset-bot","claassistant","codecov-commenter","greenkeeper","imgbot","netlify","renovate","snyk-bot","sonarcloud","stale","vercel"])});function e$(e){if(e.length===0)return"review_required";let t=new Map;for(let o of e){let r=o.user?.login,i=o.state;r&&i&&t.set(r,i)}let n=Array.from(t.values());return n.includes("CHANGES_REQUESTED")?"changes_requested":n.includes("APPROVED")?"approved":"review_required"}function t$(e){let t;for(let n of e)n.state==="CHANGES_REQUESTED"&&n.submitted_at&&(!t||n.submitted_at>t)&&(t=n.submitted_at);return t}function tR(e,t){let n=t.filter(r=>r.pull_request_review_id===e);if(n.length===0)return!1;let o=new Map;for(let r of t)r.user?.login&&o.set(r.id,r.user.login.toLowerCase());return n.every(r=>{if(!r.in_reply_to_id)return!1;let i=o.get(r.in_reply_to_id),s=r.user?.login?.toLowerCase();return!(i==null||s==null||i!==s||!r.body||r.body.includes("?"))})}function rR(e,t){return t.find(n=>n.pull_request_review_id===e&&n.body?.trim())?.body?.trim()}function r$(e,t,n,o){let r=[],i=o.toLowerCase();for(let c of e){let u=c.user?.login||"unknown";r.push({author:u,body:c.body||"",createdAt:c.created_at,isUser:u.toLowerCase()===i})}for(let c of t){if(!c.submitted_at)continue;let u=(c.body||"").trim();if(!u&&c.state!=="COMMENTED"&&c.state!=="CHANGES_REQUESTED")continue;let l=c.user?.login||"unknown";if(!u&&c.state==="COMMENTED"&&c.id!=null&&tR(c.id,n))continue;let d=u||(c.id!=null?rR(c.id,n):void 0)||(c.state==="CHANGES_REQUESTED"?"(requested changes via inline review comments)":"(posted inline review comments)");r.push({author:l,body:d,createdAt:c.submitted_at,isUser:l.toLowerCase()===i})}r.sort((c,u)=>new Date(c.createdAt).getTime()-new Date(u.createdAt).getTime());let s=null;for(let c of r)c.isUser&&(s=new Date(c.createdAt));let a;for(let c of r){if(c.isUser||c.author==="unknown"||Un(c.author))continue;let u=new Date(c.createdAt);(!s||u>s)&&(a={author:c.author,body:c.body.slice(0,200)+(c.body.length>200?"...":""),createdAt:c.createdAt})}return a&&Lo(a.body)&&(a=void 0),{hasUnrespondedComment:!!a,lastMaintainerComment:a}}var n$=b(()=>{"use strict";ha()});function o$(e){return nR.test(e.toLowerCase())}function i$(e){if(!e)return{hasIncompleteChecklist:!1};let t=/- \[x\]/gi,n=/^.*- \[ \].*$/gm,o=e.match(t)||[],r=e.match(n)||[],i=o.length;if(i+r.length===0)return{hasIncompleteChecklist:!1};let a=r.filter(u=>!o$(u)),c=i+a.length;return{hasIncompleteChecklist:a.length>0,checklistStats:{checked:i,total:c}}}var nR,ug=b(()=>{"use strict";nR=/\(if\s|\bif applicable\b|\bif needed\b|\bif relevant\b|\bonly if\b|\bwhen applicable\b|\(optional\)|- \[ \]\s*optional\b|\bn\/a\b|\bnot applicable\b|\bif required\b|\bif necessary\b/});function s$(e,t){let n=[];if(t==="changes_requested"&&n.push("changes_requested"),!e)return n;let o=e.toLowerCase();return["screenshot","demo","recording","screen recording","before/after","before and after","gif","video","screencast","show me","can you show"].some(c=>o.includes(c))&&n.push("demo_requested"),["add test","test coverage","unit test","missing test","add a test","write test","needs test","need test"].some(c=>o.includes(c))&&n.push("tests_requested"),["documentation","readme","jsdoc","docstring","add docs","update docs","document this"].some(c=>o.includes(c))&&n.push("docs_requested"),["rebase","merge conflict","out of date","behind main","behind master"].some(c=>o.includes(c))&&n.push("rebase_requested"),n}var a$=b(()=>{"use strict"});function iR(e){let t=c$[e]?.label;return t?t.replace(/[[\]]/g,"").toLowerCase():e}function va(e){if(e.status==="needs_addressing"&&e.actionReason){let t=c$[e.actionReason];if(t){let n=t.description(e);if(e.actionReasons&&e.actionReasons.length>1){let o=e.actionReasons.filter(r=>r!==e.actionReason).map(iR);o.length>0&&(n+=` (also: ${o.join(", ")})`)}return{displayLabel:t.label,displayDescription:n}}}if(e.status==="waiting_on_maintainer"&&e.waitReason){let t=oR[e.waitReason];if(t)return{displayLabel:t.label,displayDescription:t.description(e)}}return v("display-utils",`PR ${e.url} has status "${e.status}" but no matching reason (actionReason=${e.actionReason}, waitReason=${e.waitReason})`),e.status==="needs_addressing"?{displayLabel:"[Needs Addressing]",displayDescription:"Action required"}:{displayLabel:"[Waiting on Maintainer]",displayDescription:"Awaiting maintainer action"}}var c$,oR,lg=b(()=>{"use strict";$e();c$={needs_response:{label:"[Needs Response]",description:e=>e.lastMaintainerComment?`@${e.lastMaintainerComment.author} commented`:"Maintainer awaiting response"},needs_changes:{label:"[Needs Changes]",description:()=>"Review requested changes \u2014 push commits to address"},failing_ci:{label:"[CI Failing]",description:e=>{let t=e.classifiedChecks||[],n=t.filter(i=>i.category==="actionable");if(n.length>0)return`${n.length} check${n.length===1?"":"s"} failed: ${n.map(i=>i.name).join(", ")}`;let o=t.filter(i=>i.category==="infrastructure");if(o.length>0)return`${o.length} check${o.length===1?"":"s"} cancelled/timed out (infrastructure)`;let r=e.failingCheckNames||[];return r.length>0?`${r.length} check${r.length===1?"":"s"} failed`:"One or more CI checks are failing"}},merge_conflict:{label:"[Merge Conflict]",description:()=>"PR has merge conflicts with the base branch"},incomplete_checklist:{label:"[Incomplete Checklist]",description:e=>e.checklistStats?`${e.checklistStats.checked}/${e.checklistStats.total} items checked`:"PR body has unchecked required checkboxes"},ci_not_running:{label:"[CI Not Running]",description:()=>"No CI checks have been triggered"},needs_rebase:{label:"[Needs Rebase]",description:()=>"PR branch is significantly behind upstream"},missing_required_files:{label:"[Missing Files]",description:e=>e.missingRequiredFiles?`Missing: ${e.missingRequiredFiles.join(", ")}`:"Required files are missing"}},oR={pending_review:{label:"[Waiting on Maintainer]",description:()=>"Awaiting review"},pending_merge:{label:"[Waiting on Maintainer]",description:()=>"Approved and CI passes \u2014 waiting for merge"},changes_addressed:{label:"[Waiting on Maintainer]",description:e=>e.hasUnrespondedComment&&e.lastMaintainerComment?`Changes addressed \u2014 waiting for @${e.lastMaintainerComment.author} to re-review`:"Changes addressed \u2014 awaiting re-review"},ci_blocked:{label:"[CI Blocked]",description:e=>{let t=e.classifiedChecks||[];return t.length>0&&t.every(n=>n.category!=="actionable")?`All failing checks are non-actionable (${[...new Set(t.map(o=>o.category))].join(", ")})`:"CI checks are failing but no action is needed from you"}},stale_ci_failure:{label:"[Stale CI Failure]",description:e=>`CI failing for ${e.daysSinceActivity}+ days \u2014 likely pre-existing or non-actionable`}}});function zr(){return{repos:new Map,monthlyCounts:{},monthlyOpenedCounts:{},dailyActivityCounts:{}}}function aR(e){if(typeof e!="object"||e===null)return!1;let t=e;return Array.isArray(t.reposEntries)&&typeof t.monthlyCounts=="object"&&t.monthlyCounts!==null&&typeof t.monthlyOpenedCounts=="object"&&t.monthlyOpenedCounts!==null&&typeof t.dailyActivityCounts=="object"&&t.dailyActivityCounts!==null}async function u$(e,t,n,o,r,i){if(!t)return zr();let s=wt(),a=i?`:stars${i.minStars}`:"",c=`pr-counts:v3:${o}:${t}${a}`,u=s.getIfFresh(c,sR);if(u&&aR(u))return E(Ee,`Using cached ${o} PR counts for @${t}`),{repos:new Map(u.reposEntries),monthlyCounts:u.monthlyCounts,monthlyOpenedCounts:u.monthlyOpenedCounts,dailyActivityCounts:u.dailyActivityCounts};E(Ee,`Fetching ${o} PR counts for @${t}...`);let l=new Map,d={},p={},g={},y=1,S=0,U;for(;;){let{data:T}=await e.search.issuesAndPullRequests({q:`is:pr ${n} author:${t} -user:${t}`,sort:"updated",order:"desc",per_page:100,page:y});U=T.total_count;for(let L of T.items){let Z=Pr(L.html_url);if(!Z){v(Ee,`Skipping ${o} PR with unparseable URL: ${L.html_url}`);continue}let{owner:N}=Z,z=`${N}/${Z.repo}`;if(bt(N,t)||i&&Wt(i.knownStarCounts.get(z),i.minStars))continue;let R=r(l,z,L);if(R){let G=R.slice(0,7);d[G]=(d[G]||0)+1;let ee=R.slice(0,10);ee.length===10&&(g[ee]=(g[ee]||0)+1)}if(L.created_at){let G=L.created_at.slice(0,7);p[G]=(p[G]||0)+1;let ee=L.created_at.slice(0,10);ee.length===10&&(g[ee]=(g[ee]||0)+1)}}if(S+=T.items.length,S>=T.total_count||S>=1e3||T.items.length===0||y>=jr)break;y++}return S<U&&y>=jr&&v(Ee,`Pagination capped at ${jr} pages: fetched ${S} of ${U} ${o} PRs. Stats may be incomplete for prolific contributors.`),E(Ee,`Found ${S} ${o} PRs across ${l.size} repos`),s.set(c,"",{reposEntries:Array.from(l.entries()),monthlyCounts:d,monthlyOpenedCounts:p,dailyActivityCounts:g}),{repos:l,monthlyCounts:d,monthlyOpenedCounts:p,dailyActivityCounts:g}}function l$(e,t,n){return u$(e,t,"is:merged","merged",(o,r,i)=>{i.pull_request?.merged_at||v(Ee,`merged_at missing for merged PR ${i.html_url}${i.closed_at?", falling back to closed_at":", no date available"}`);let s=i.pull_request?.merged_at||i.closed_at||"",a=o.get(r);return a?(a.count+=1,s&&s>a.lastMergedAt&&(a.lastMergedAt=s)):o.set(r,{count:1,lastMergedAt:s}),s},n)}function d$(e,t,n){return u$(e,t,"is:closed is:unmerged","closed",(o,r,i)=>(o.set(r,(o.get(r)||0)+1),i.closed_at||""),n)}async function p$(e,t,n,o,r,i){if(!t.githubUsername)return v(Ee,`Skipping recently ${o} PRs fetch: no githubUsername configured. Run /setup-oss to configure.`),[];let s=new Date;s.setDate(s.getDate()-r);let a=s.toISOString().split("T")[0];E(Ee,`Fetching recently ${o} PRs for @${t.githubUsername} (since ${a})...`);let{data:c}=await e.search.issuesAndPullRequests({q:n.replace("{username}",t.githubUsername).replace("{since}",a),sort:"updated",order:"desc",per_page:100}),u=[];for(let l of c.items){let d=Pe(l.html_url);if(!d){v(Ee,`Could not parse GitHub URL from API response: ${l.html_url}`);continue}if(bt(d.owner,t.githubUsername))continue;let p=`${d.owner}/${d.repo}`;u.push(i(l,{owner:d.owner,repo:p,number:d.number}))}return E(Ee,`Found ${u.length} recently ${o} PRs`),u}async function m$(e,t,n=7){return p$(e,t,"is:pr is:closed is:unmerged is:public author:{username} closed:>={since}","closed",n,(o,{repo:r,number:i})=>({url:o.html_url,repo:r,number:i,title:o.title,closedAt:o.closed_at||""}))}async function g$(e,t,n=7){return p$(e,t,"is:pr is:merged is:public author:{username} merged:>={since}","merged",n,(o,{repo:r,number:i})=>{let s=o.pull_request?.merged_at;return s||v(Ee,`merged_at missing for merged PR ${o.html_url}${o.closed_at?", falling back to closed_at":", no date available"}`),{url:o.html_url,repo:r,number:i,title:o.title,mergedAt:s||o.closed_at||""}})}async function f$(e,t,n){if(!t.githubUsername)return v(Ee,"Skipping merged PRs fetch: no githubUsername configured."),[];let o=n?` merged:>${n}`:"",r=`is:pr is:merged author:${t.githubUsername} -user:${t.githubUsername}${o}`;E(Ee,`Fetching merged PRs${n?` since ${n}`:" (all time)"}...`);let i=[],s=1,a=0;for(;;){let{data:c}=await e.search.issuesAndPullRequests({q:r,sort:"updated",order:"desc",per_page:100,page:s});for(let u of c.items){let l=Pe(u.html_url);if(!l){v(Ee,`Skipping merged PR with unparseable URL: ${u.html_url}`);continue}if(bt(l.owner,t.githubUsername))continue;let d=u.pull_request?.merged_at||u.closed_at||"";if(!d){v(Ee,`Skipping merged PR with no merge date: ${u.html_url}`);continue}i.push({url:u.html_url,title:u.title,mergedAt:d})}if(a+=c.items.length,a>=c.total_count||a>=1e3||c.items.length===0||s>=jr)break;s++}return E(Ee,`Fetched ${i.length} merged PRs${n?" (incremental)":" (initial)"}`),i}async function h$(e,t,n){if(!t.githubUsername)return v(Ee,"Skipping closed PRs fetch: no githubUsername configured."),[];let o=n?` closed:>${n}`:"",r=`is:pr is:closed is:unmerged author:${t.githubUsername} -user:${t.githubUsername}${o}`;E(Ee,`Fetching closed PRs${n?` since ${n}`:" (all time)"}...`);let i=[],s=1,a=0,c;for(;;){let{data:u}=await e.search.issuesAndPullRequests({q:r,sort:"updated",order:"desc",per_page:100,page:s});c=u.total_count;for(let l of u.items){let d=Pe(l.html_url);if(!d){v(Ee,`Skipping closed PR with unparseable URL: ${l.html_url}`);continue}if(bt(d.owner,t.githubUsername))continue;let p=l.closed_at||"";if(!p){v(Ee,`Skipping closed PR with no close date: ${l.html_url}`);continue}i.push({url:l.html_url,title:l.title,closedAt:p})}if(a+=u.items.length,a>=c||a>=1e3||u.items.length===0||s>=jr)break;s++}return a<c&&s>=jr&&v(Ee,`Pagination capped at ${jr} pages: fetched ${a} of ${c} closed PRs. Oldest PRs may be missing.`),E(Ee,`Fetched ${i.length} closed PRs${n?" (incremental)":" (initial)"}`),i}var Ee,sR,jr,ba=b(()=>{"use strict";Ue();Dt();$e();Ur();Ee="github-stats",sR=1440*60*1e3,jr=3});function cR(e,t){return e===!1||t==="dirty"}var ya,uR,Gr,v$=b(()=>{"use strict";Dn();On();Ue();ng();og();he();Go();$e();Ur();cg();n$();ug();a$();lg();ba();lg();cg();ug();ng();ya="pr-monitor",uR=En,Gr=class{octokit;stateManager;constructor(t){this.octokit=je(t),this.stateManager=K()}async fetchUserOpenPRs(){let t=this.stateManager.getState().config;if(!t.githubUsername)throw new Zt("No GitHub username configured. Run setup first.");E("pr-monitor",`Fetching open PRs for @${t.githubUsername}...`);let n=[],o=1,r=100,i=await this.octokit.search.issuesAndPullRequests({q:`is:pr is:open is:public author:${t.githubUsername}`,sort:"updated",order:"desc",per_page:r,page:1});n.push(...i.data.items);let s=i.data.total_count;E("pr-monitor",`Found ${s} open PRs`);let a=Math.min(Math.ceil(s/r),10);for(;o<a;){o++;let d=await this.octokit.search.issuesAndPullRequests({q:`is:pr is:open is:public author:${t.githubUsername}`,sort:"updated",order:"desc",per_page:r,page:o});n.push(...d.data.items)}let c=[],u=[],l=n.filter(d=>{if(!d.pull_request)return!1;let p=Pr(d.html_url);return p?!bt(p.owner,t.githubUsername):(v("pr-monitor",`Skipping PR with unparseable URL: ${d.html_url}`),!1)});return E("pr-monitor",`Filtered to ${l.length} PRs after excluding own repos`),await Cm("pr-monitor",`Fetch details for ${l.length} PRs`,async()=>{await la(l,async d=>{try{E("pr-monitor",`Fetching details for ${d.html_url}`);let p=await this.fetchPRDetails(d.html_url);p&&c.push(p)}catch(p){let g=P(p);v("pr-monitor",`Error fetching ${d.html_url}: ${g}`),u.push({prUrl:d.html_url,error:g})}},uR)}),c.sort((d,p)=>d.status===p.status?0:d.status==="needs_addressing"?-1:1),{prs:c,failures:u}}async fetchPRDetails(t){let n=Pe(t);if(!n||n.type!=="pull")throw new fe(`Invalid PR URL format: ${t}`);let{owner:o,repo:r,number:i}=n,s=this.stateManager.getState().config,[a,c,u,l]=await Promise.all([this.octokit.pulls.get({owner:o,repo:r,pull_number:i}),$t(F=>this.octokit.issues.listComments({owner:o,repo:r,issue_number:i,per_page:100,page:F})),this.octokit.pulls.listReviews({owner:o,repo:r,pull_number:i}),$t(F=>this.octokit.pulls.listReviewComments({owner:o,repo:r,pull_number:i,per_page:100,page:F})).catch(F=>{let X=He(F);if(X===429)throw F;if(X===403){let B=P(F).toLowerCase();if(B.includes("rate limit")||B.includes("abuse detection"))throw F;return v("pr-monitor",`403 fetching review comments for ${o}/${r}#${i}: ${B}`),[]}return X===404?E("pr-monitor",`Review comments 404 for ${o}/${r}#${i} (likely no inline comments)`):v("pr-monitor",`Failed to fetch review comments for ${o}/${r}#${i} (status ${X??"unknown"}): self-reply detection will be skipped`),[]})]),d=a.data,p=u.data,g=e$(p),y=cR(d.mergeable,d.mergeable_state),{hasUnrespondedComment:S,lastMaintainerComment:U}=r$(c,p,l,s.githubUsername),T=ag(this.octokit,o,r,d.head.sha),Z=S||g==="changes_requested"?this.octokit.repos.getCommit({owner:o,repo:r,ref:d.head.sha}).then(F=>({date:F.data.commit.author?.date,author:F.data.author?.login})).catch(F=>{let X=He(F);if(X===429)throw F;if(X===403){let B=P(F).toLowerCase();if(B.includes("rate limit")||B.includes("abuse detection"))throw F;v("pr-monitor",`403 fetching commit date for ${o}/${r}@${d.head.sha.slice(0,7)}: ${P(F)}`);return}v("pr-monitor",`Failed to fetch commit date for ${o}/${r}@${d.head.sha.slice(0,7)}: ${P(F)}`)}):Promise.resolve(void 0),[{status:N,failingCheckNames:z,failingCheckConclusions:R},G]=await Promise.all([T,Z]),ee=G?.date,q=G?.author,{hasIncompleteChecklist:ae,checklistStats:Ge}=i$(d.body||""),ve=s$(U?.body,g),be=dt(new Date(d.updated_at),new Date),pt=t$(p),Fe=fa(z,R),tr=N==="failing"&&Fe.some(F=>F.category==="actionable"),{status:Le,actionReason:mt,waitReason:Et,stalenessTier:xt,actionReasons:vr}=rg({ciStatus:N,hasMergeConflict:y,hasUnrespondedComment:S,hasIncompleteChecklist:ae,reviewDecision:g,daysSinceActivity:be,dormantThreshold:s.dormantThresholdDays,approachingThreshold:s.approachingDormantDays,latestCommitDate:ee,latestCommitAuthor:q,contributorUsername:s.githubUsername,lastMaintainerCommentDate:U?.createdAt,latestChangesRequestedDate:pt,hasActionableCIFailure:tr});return this.buildFetchedPR({id:d.id,url:t,repo:`${o}/${r}`,number:i,title:d.title,status:Le,actionReason:mt,waitReason:Et,stalenessTier:xt,actionReasons:vr,createdAt:d.created_at,updatedAt:d.updated_at,daysSinceActivity:be,ciStatus:N,failingCheckNames:z,classifiedChecks:Fe,hasMergeConflict:y,reviewDecision:g,hasUnrespondedComment:S,lastMaintainerComment:U,latestCommitDate:ee,hasIncompleteChecklist:ae,checklistStats:Ge,maintainerActionHints:ve})}buildFetchedPR(t){let n={...t,displayLabel:"",displayDescription:""},{displayLabel:o,displayDescription:r}=va(n);return n.displayLabel=o,n.displayDescription=r,n}async fetchUserMergedPRCounts(t){let n=this.stateManager.getState().config;return l$(this.octokit,n.githubUsername,t)}async fetchUserClosedPRCounts(t){let n=this.stateManager.getState().config;return d$(this.octokit,n.githubUsername,t)}async fetchRepoMetadata(t){if(t.length===0)return new Map;E(ya,`Fetching repo metadata for ${t.length} repos...`);let n=new Map,o=wt(),r=[...new Set(t)],i=10;for(let s=0;s<r.length;s+=i){let a=r.slice(s,s+i),c=await Promise.allSettled(a.map(async l=>{let d=l.split("/");if(d.length!==2||!d[0]||!d[1])throw new fe(`Malformed repo identifier: "${l}"`);let[p,g]=d,y=`/repos/${p}/${g}`,S=await Fo(o,y,T=>this.octokit.repos.get({owner:p,repo:g,headers:T})),U={stars:S.stargazers_count,language:S.language??null};return{repo:l,metadata:U}})),u=0;for(let l=0;l<c.length;l++){let d=c[l];d.status==="fulfilled"?n.set(d.value.repo,d.value.metadata):(u++,v(ya,`Failed to fetch metadata for ${a[l]}: ${P(d.reason)}`))}if(u===a.length&&a.length>0){let l=r.length-s-i;l>0&&v(ya,`Entire chunk failed, aborting remaining ${l} repos`);break}}return E(ya,`Fetched repo metadata for ${n.size}/${t.length} repos`),n}async fetchRecentlyClosedPRs(t=7){let n=this.stateManager.getState().config;return m$(this.octokit,n,t)}async fetchRecentlyMergedPRs(t=7){let n=this.stateManager.getState().config;return g$(this.octokit,n,t)}generateDigest(t,n=[],o=[]){let r=new Date().toISOString(),i=t.filter(c=>c.status==="needs_addressing"),s=t.filter(c=>c.status==="waiting_on_maintainer"),a=this.stateManager.getStats();return{generatedAt:r,openPRs:t,needsAddressingPRs:i,waitingOnMaintainerPRs:s,recentlyClosedPRs:n,recentlyMergedPRs:o,shelvedPRs:[],autoUnshelvedPRs:[],summary:{totalActivePRs:t.length,totalNeedingAttention:i.length,totalMergedAllTime:a.mergedPRs,mergeRate:parseFloat(a.mergeRate)}}}async updateRepoScoreFromObservedPR(t,n){n?this.stateManager.incrementMergedCount(t):this.stateManager.incrementClosedCount(t)}}});function dg(e){if(!e.labels||!Array.isArray(e.labels)||e.labels.length===0)return!1;let n=e.labels.map(o=>(typeof o=="string"?o:o.name||"").toLowerCase()).filter(o=>o.length>0);return n.length===0?!1:n.every(o=>b$.has(o))}function dR(e){return!e.labels||!Array.isArray(e.labels)?!1:e.labels.map(o=>(typeof o=="string"?o:o.name||"").toLowerCase()).filter(o=>lR.has(o)).length>=5}function pR(e){return e?/^.+\s+(question|fact|point|item|task|entry|post|challenge|exercise|example|problem|tip|recipe|snippet)\s+#?\d+$/i.test(e):!1}function y$(e){let t=new Set,n=new Map;for(let o of e){let r=o.repository_url.split("/").slice(-2).join("/");if(dR(o)){t.add(r);continue}o.title&&pR(o.title)&&n.set(r,(n.get(r)||0)+1)}for(let[o,r]of n)r>=3&&t.add(o);return t}function pg(e,t){let n=new Map,o=[];for(let r of e){let i=n.get(r.issue.repo)||0;i<t&&(o.push(r),n.set(r.issue.repo,i+1))}return o}var b$,lR,_a=b(()=>{"use strict";b$=new Set(["documentation","docs","typo","spelling"]);lR=new Set(["good first issue","hacktoberfest","easy","up-for-grabs","first-timers-only","beginner-friendly","beginner","starter","newbie","low-hanging-fruit","community"])});function _$(e,t){let n=0;return e>=5e3?n+=8:e>=500?n+=5:e>=50&&(n+=3),t>=500?n+=4:t>=50&&(n+=2),n}function $$(e){let t=50;e.repoScore!==null&&(t+=e.repoScore*2),t+=e.repoQualityBonus??0,e.mergedPRCount>0&&(t+=15),e.clearRequirements&&(t+=15);let n=new Date(e.issueUpdatedAt),o=dt(n);return o<=14?t+=15:o<=30&&(t+=Math.round(15*(1-(o-14)/16))),e.hasContributionGuidelines&&(t+=10),e.orgHasMergedPRs&&(t+=5),e.matchesPreferredCategory&&(t+=5),e.hasExistingPR&&(t-=30),e.isClaimed&&(t-=20),e.closedWithoutMergeCount>0&&e.mergedPRCount===0&&(t-=15),Math.max(0,Math.min(100,t))}var w$=b(()=>{"use strict";Ue()});function S$(e,t){if(t.length===0)return!1;let n=e.split("/")[0]?.toLowerCase();if(!n)return!1;for(let o of t){let r=gR[o];if(r&&r.some(i=>i.toLowerCase()===n))return!0}return!1}function k$(e){let t=new Set;for(let n of e){let o=mR[n];if(o)for(let r of o)t.add(r)}return[...t]}var mR,gR,mg=b(()=>{"use strict";mR={nonprofit:["nonprofit","social-good","humanitarian","charity","social-impact","civic-tech"],devtools:["developer-tools","devtools","cli","sdk","linter","formatter","build-tool"],infrastructure:["infrastructure","cloud","kubernetes","docker","devops","monitoring","observability"],"web-frameworks":["web-framework","frontend","backend","fullstack","nextjs","react","vue"],"data-ml":["machine-learning","data-science","deep-learning","nlp","data-pipeline","analytics"],education:["education","learning","tutorial","courseware","edtech","teaching"]},gR={nonprofit:["code-for-america","opengovfoundation","ushahidi","hotosm","openfn","democracyearth"],devtools:["eslint","prettier","vitejs","biomejs","oxc-project","ast-grep","turbot"],infrastructure:["kubernetes","hashicorp","grafana","prometheus","open-telemetry","envoyproxy","cncf"],"web-frameworks":["vercel","remix-run","sveltejs","nuxt","astro","redwoodjs","blitz-js"],"data-ml":["huggingface","mlflow","apache","dbt-labs","dagster-io","prefecthq","langchain-ai"],education:["freeCodeCamp","TheOdinProject","exercism","codecademy","oppia","Khan"]}});async function T$(e,t,n,o){try{let{data:r}=await e.search.issuesAndPullRequests({q:`repo:${t}/${n} is:pr ${o}`,per_page:5}),s=(await $t(a=>e.issues.listEventsForTimeline({owner:t,repo:n,issue_number:o,per_page:100,page:a}))).filter(a=>{let c=a;return c.event==="cross-referenced"&&c.source?.issue?.pull_request});return{passed:r.total_count===0&&s.length===0}}catch(r){let i=P(r);return v(gg,`Failed to check for existing PRs on ${t}/${n}#${o}: ${i}. Assuming no existing PR.`),{passed:!0,inconclusive:!0,reason:i}}}async function E$(e,t,n){try{let{data:o}=await e.search.issuesAndPullRequests({q:`repo:${t}/${n} is:pr is:merged author:@me`,per_page:1});return o.total_count}catch(o){let r=P(o);return v(gg,`Could not check merged PRs in ${t}/${n}: ${r}. Defaulting to 0.`),0}}async function x$(e,t,n,o,r){if(r===0)return{passed:!0};try{let s=(await e.paginate(e.issues.listComments,{owner:t,repo:n,issue_number:o,per_page:100},a=>a.data)).slice(-100);for(let a of s){let c=(a.body||"").toLowerCase();if(fR.some(u=>c.includes(u)))return{passed:!1}}return{passed:!0}}catch(i){let s=P(i);return v(gg,`Failed to check claim status on ${t}/${n}#${o}: ${s}. Assuming not claimed.`),{passed:!0,inconclusive:!0,reason:s}}}function R$(e){if(!e||e.length<50)return!1;let t=/\d\.|[-*]\s/.test(e),n=/```/.test(e),o=/expect|should|must|want/i.test(e);return[t,n,o,e.length>200].filter(Boolean).length>=2}var gg,fR,P$=b(()=>{"use strict";Go();he();$e();gg="issue-eligibility",fR=["i'm working on this","i am working on this","i'll take this","i will take this","working on it","i'd like to work on","i would like to work on","can i work on","may i work on","assigned to me","i'm on it","i'll submit a pr","i will submit a pr","working on a fix","working on a pr"]});function O$(){let e=Date.now();for(let[t,n]of Jt.entries())e-n.fetchedAt>I$&&Jt.delete(t);if(Jt.size>C$){let n=Array.from(Jt.entries()).sort((o,r)=>o[1].fetchedAt-r[1].fetchedAt).slice(0,Jt.size-C$);for(let[o]of n)Jt.delete(o)}}async function A$(e,t,n){let o=wt(),r=`health:${t}/${n}`;try{return await ma(o,r,hR,async()=>{let i=`/repos/${t}/${n}`,s=await Fo(o,i,p=>e.repos.get({owner:t,repo:n,headers:p})),{data:a}=await e.repos.listCommits({owner:t,repo:n,per_page:1}),u=a[0]?.commit?.author?.date||s.pushed_at,l=dt(new Date(u)),d="unknown";try{let{data:p}=await e.actions.listRepoWorkflows({owner:t,repo:n,per_page:1});p.total_count>0&&(d="passing")}catch(p){let g=P(p);v(fg,`Failed to check CI status for ${t}/${n}: ${g}. Defaulting to unknown.`)}return{repo:`${t}/${n}`,lastCommitAt:u,daysSinceLastCommit:l,openIssuesCount:s.open_issues_count,avgIssueResponseDays:0,ciStatus:d,isActive:l<30,stargazersCount:s.stargazers_count,forksCount:s.forks_count}})}catch(i){let s=P(i);return v(fg,`Error checking project health for ${t}/${n}: ${s}`),{repo:`${t}/${n}`,lastCommitAt:"",daysSinceLastCommit:999,openIssuesCount:0,avgIssueResponseDays:0,ciStatus:"unknown",isActive:!1,checkFailed:!0,failureReason:s}}}async function D$(e,t,n){let o=`${t}/${n}`,r=Jt.get(o);if(r&&Date.now()-r.fetchedAt<I$)return r.guidelines;let i=["CONTRIBUTING.md",".github/CONTRIBUTING.md","docs/CONTRIBUTING.md","contributing.md"],s=await Promise.allSettled(i.map(a=>e.repos.getContent({owner:t,repo:n,path:a}).then(({data:c})=>"content"in c?Buffer.from(c.content,"base64").toString("utf-8"):null)));for(let a=0;a<s.length;a++){let c=s[a];if(c.status==="fulfilled"&&c.value){let u=vR(c.value);return Jt.set(o,{guidelines:u,fetchedAt:Date.now()}),O$(),u}if(c.status==="rejected"){let u=c.reason instanceof Error?c.reason.message:String(c.reason);!u.includes("404")&&!u.includes("Not Found")&&v(fg,`Unexpected error fetching ${i[a]} from ${t}/${n}: ${u}`)}}Jt.set(o,{guidelines:void 0,fetchedAt:Date.now()}),O$()}function vR(e){let t={rawContent:e},n=e.toLowerCase();if(n.includes("branch")){let o=e.match(/branch[^\n]*(?:named?|format|convention)[^\n]*[`"]([^`"]+)[`"]/i);o&&(t.branchNamingConvention=o[1])}if(n.includes("conventional commit"))t.commitMessageFormat="conventional commits";else if(n.includes("commit message")){let o=e.match(/commit message[^\n]*[`"]([^`"]+)[`"]/i);o&&(t.commitMessageFormat=o[1])}return n.includes("jest")?t.testFramework="Jest":n.includes("rspec")?t.testFramework="RSpec":n.includes("pytest")?t.testFramework="pytest":n.includes("mocha")&&(t.testFramework="Mocha"),n.includes("eslint")?t.linter="ESLint":n.includes("rubocop")?t.linter="RuboCop":n.includes("prettier")&&(t.formatter="Prettier"),(n.includes("cla")||n.includes("contributor license agreement"))&&(t.claRequired=!0),t}var fg,Jt,I$,hR,C$,U$=b(()=>{"use strict";Ue();he();$e();Ur();fg="repo-health",Jt=new Map,I$=3600*1e3,hR=14400*1e3,C$=100});var hg,bR,yR,$a,j$=b(()=>{"use strict";Ue();he();$e();w$();mg();P$();U$();Ur();hg="issue-vetting",bR=3,yR=900*1e3,$a=class{octokit;stateManager;constructor(t,n){this.octokit=t,this.stateManager=n}async vetIssue(t){let n=wt(),o=`vet:${t}`,r=n.getIfFresh(o,yR);if(r&&typeof r=="object"&&"issue"in r&&"viabilityScore"in r)return E(hg,`Vetting cache hit for ${t}`),r;let i=Pe(t);if(!i||i.type!=="issues")throw new fe(`Invalid issue URL: ${t}`);let{owner:s,repo:a,number:c}=i,u=`${s}/${a}`,{data:l}=await this.octokit.issues.get({owner:s,repo:a,issue_number:c}),[d,p,g,y,S]=await Promise.all([T$(this.octokit,s,a,c),x$(this.octokit,s,a,c,l.comments),A$(this.octokit,s,a),D$(this.octokit,s,a),E$(this.octokit,s,a)]),U=d.passed,T=p.passed,L=R$(l.body||""),Z=g.checkFailed?!0:g.isActive,N={passedAllChecks:U&&T&&Z&&L,checks:{noExistingPR:U,notClaimed:T,projectActive:Z,clearRequirements:L,contributionGuidelinesFound:!!y},contributionGuidelines:y,notes:[]};U||N.notes.push("Existing PR found for this issue"),T||N.notes.push("Issue appears to be claimed by someone"),d.inconclusive&&N.notes.push(`Could not verify absence of existing PRs: ${d.reason||"API error"}`),p.inconclusive&&N.notes.push(`Could not verify claim status: ${p.reason||"API error"}`),g.checkFailed?N.notes.push(`Could not verify project activity: ${g.failureReason||"API error"}`):g.isActive||N.notes.push("Project may be inactive"),L||N.notes.push("Issue requirements are unclear"),y||N.notes.push("No CONTRIBUTING.md found");let z={id:l.id,url:t,repo:u,number:c,title:l.title,status:"candidate",labels:l.labels.map(B=>typeof B=="string"?B:B.name||""),createdAt:l.created_at,updatedAt:l.updated_at,vetted:!0,vettingResult:N},R=[],G=[];U||R.push("Has existing PR"),T||R.push("Already claimed"),!g.isActive&&!g.checkFailed&&R.push("Inactive project"),L||R.push("Unclear requirements"),U&&G.push("No existing PR"),T&&G.push("Not claimed"),g.isActive&&!g.checkFailed&&G.push("Active project"),L&&G.push("Clear requirements"),y&&G.push("Has contribution guidelines");let ee=this.stateManager.getState().config,q=this.stateManager.getRepoScore(u),ae=q&&q.mergedPRCount>0?q.mergedPRCount:S;ae>0?G.push(`Trusted project (${ae} PR${ae>1?"s":""} merged)`):ee.trustedProjects.includes(u)&&G.push("Trusted project (previous PR merged)"),q&&(q.closedWithoutMergeCount>0&&ae===0?R.push("User has rejected PR(s) in this repo with no successful merges"):q.closedWithoutMergeCount>0&&ae>0&&N.notes.push(`Mixed history: ${ae} merged, ${q.closedWithoutMergeCount} closed without merge`));let Ge=u.split("/")[0],ve=!1;Ge&&u.includes("/")&&(ve=Object.values(this.stateManager.getState().repoScores).some(B=>B.repo&&B.mergedPRCount>0&&B.repo.startsWith(Ge+"/")&&B.repo!==u)),ve&&G.push(`Org affinity (merged PRs in other ${Ge} repos)`);let be=ee.projectCategories??[],pt=S$(u,be);pt&&G.push("Matches preferred project category");let Fe;N.passedAllChecks?Fe="approve":R.length>2?Fe="skip":Fe="needs_review";let tr=g.checkFailed||d.inconclusive||p.inconclusive;Fe==="approve"&&tr&&(Fe="needs_review",N.notes.push("Recommendation downgraded: one or more checks were inconclusive"));let Le=_$(g.stargazersCount??0,g.forksCount??0);g.checkFailed&&Le===0&&N.notes.push("Repo quality bonus unavailable: could not fetch star/fork counts due to API error");let mt=this.getRepoScore(u),Et=$$({repoScore:mt,hasExistingPR:!U,isClaimed:!T,clearRequirements:L,hasContributionGuidelines:!!y,issueUpdatedAt:l.updated_at,closedWithoutMergeCount:q?.closedWithoutMergeCount??0,mergedPRCount:ae,orgHasMergedPRs:ve,repoQualityBonus:Le,matchesPreferredCategory:pt}),xt=this.stateManager.getStarredRepos(),vr=ee.preferredOrgs??[],F="normal";ae>0?F="merged_pr":vr.some(B=>B.toLowerCase()===Ge?.toLowerCase())?F="preferred_org":xt.includes(u)&&(F="starred");let X={issue:z,vettingResult:N,projectHealth:g,recommendation:Fe,reasonsToSkip:R,reasonsToApprove:G,viabilityScore:Et,searchPriority:F};return n.set(o,"",X),X}async vetIssuesParallel(t,n,o){let r=[],i=new Map,s=0,a=0,c=0;for(let l of t){if(r.length>=n)break;c++;let d=this.vetIssue(l).then(p=>{r.length<n&&(o&&(p.searchPriority=o),r.push(p))}).catch(p=>{s++,Vt(p)&&a++,v(hg,`Error vetting issue ${l}:`,P(p))}).finally(()=>i.delete(l));i.set(l,d),i.size>=bR&&await Promise.race(i.values())}await Promise.allSettled(i.values());let u=s===c&&c>0;return u&&v(hg,`All ${c} issue(s) failed vetting. This may indicate a systemic issue (rate limit, auth, network).`),{candidates:r.slice(0,n),allFailed:u,rateLimitHit:a>0}}getRepoScore(t){return this.stateManager.getState().repoScores?.[t]?.score??null}}});function $R(e,t=0){let n=z$-t+1;if(n<1)return e.length>0&&v(Fr,`Label filtering disabled: ${t} repo/org ORs exceed GitHub's ${z$} operator limit. All ${e.length} label(s) dropped from query.`),[[]];if(e.length<=n)return[e];let o=[];for(let r=0;r<e.length;r+=n)o.push(e.slice(r,r+n));return E(Fr,`Split ${e.length} labels into ${o.length} chunks (${t} ops reserved, max ${n} per chunk)`),o}function wR(e){return e.length===0?"":e.length===1?`label:"${e[0]}"`:`(${e.map(t=>`label:"${t}"`).join(" OR ")})`}function F$(e,t){let n=new Set;for(let o of e)for(let r of Io[o]??[])n.add(r);for(let o of t)n.add(o);return[...n]}function L$(e){let t=[],n=Math.max(...e.map(o=>o.length),0);for(let o=0;o<n;o++)for(let r of e)o<r.length&&t.push(r[o]);return t}function SR(e,t){let n=[];for(let o=0;o<e.length;o+=t)n.push(e.slice(o,o+t));return n}async function vg(e,t){let n=`search:${t.q}:${t.sort}:${t.order}:${t.per_page}`;return ma(wt(),n,kR,async()=>{let{data:o}=await e.search.issuesAndPullRequests(t);return o})}async function wa(e,t,n,o,r){let i=$R(t,n),s=new Set,a=[];for(let c=0;c<i.length;c++){c>0&&await qt(G$);let u=o(wR(i[c])),l=await vg(e,{q:u,sort:"created",order:"desc",per_page:r});for(let d of l.items)s.has(d.html_url)||(s.add(d.html_url),a.push(d))}return a}async function bg(e,t,n,o,r,i,s){let a=y$(t);if(a.size>0){let y=t.filter(S=>a.has(S.repository_url.split("/").slice(-2).join("/"))).length;E(Fr,`[SPAM_FILTER] Filtered ${y} issues from ${a.size} label-farming repos: ${[...a].join(", ")}`)}let c=n(t).filter(y=>{let S=y.repository_url.split("/").slice(-2).join("/");return a.has(S)?!1:o.every(U=>!U.has(S))}).slice(0,r*2);if(c.length===0)return E(Fr,`[${s}] All ${t.length} items filtered before vetting`),{candidates:[],allVetFailed:!1,rateLimitHit:!1};let{candidates:u,allFailed:l,rateLimitHit:d}=await e.vetIssuesParallel(c.map(y=>y.html_url),r,"normal"),p=u.filter(y=>y.projectHealth.checkFailed?!0:(y.projectHealth.stargazersCount??0)>=i),g=u.length-p.length;return g>0&&E(Fr,`[STAR_FILTER] Filtered ${g} ${s} candidates below ${i} stars`),{candidates:p,allVetFailed:l,rateLimitHit:d}}async function Sa(e,t,n,o,r,i,s,a){let c=[],u=SR(n,_R),l=0,d=0;for(let y=0;y<u.length;y++){let S=u[y];if(c.length>=i)break;y>0&&await qt(G$);try{let U=S.map(N=>`repo:${N}`).join(" OR "),T=S.length-1,L=Math.min(30,(i-c.length)*3),Z=await wa(e,r,T,N=>`${o} ${N} (${U})`.replace(/ +/g," ").trim(),L);if(Z.length>0){let N=a(Z),z=i-c.length,{candidates:R,rateLimitHit:G}=await t.vetIssuesParallel(N.slice(0,z*2).map(ee=>ee.html_url),z,s);c.push(...R),G&&d++}}catch(U){l++,Vt(U)&&d++;let T=S.join(", ");v(Fr,`Error searching issues in batch [${T}]:`,P(U))}}let p=l===u.length&&u.length>0,g=d>0;return p&&v(Fr,`All ${u.length} batch(es) failed for ${s} phase. This may indicate a systemic issue (rate limit, auth, network).`),{candidates:c,allBatchesFailed:p,rateLimitHit:g}}var Fr,z$,G$,_R,kR,N$=b(()=>{"use strict";Dt();he();$e();Ur();_a();Ue();Fr="search-phases",z$=5,G$=1500,_R=3;kR=900*1e3});var M$,Z$,ue,ka,No,Ta,Kt,V$=b(()=>{"use strict";M$=re(require("fs"),1),Z$=re(require("path"),1);Dn();On();Ue();Dt();he();$e();_a();j$();mg();N$();ue="issue-discovery",ka=2e3,No=20,Ta=10,Kt=class{octokit;stateManager;githubToken;vetter;rateLimitWarning=null;constructor(t){this.githubToken=t,this.octokit=je(t),this.stateManager=K(),this.vetter=new $a(this.octokit,this.stateManager)}async fetchStarredRepos(){Re(ue,"Fetching starred repositories...");let t=[];try{let n=this.octokit.paginate.iterator(this.octokit.activity.listReposStarredByAuthenticatedUser,{per_page:100}),o=0;for await(let{data:r}of n){for(let i of r){let s;"full_name"in i&&typeof i.full_name=="string"?s=i.full_name:"repo"in i&&i.repo&&typeof i.repo=="object"&&"full_name"in i.repo&&(s=i.repo.full_name),s&&t.push(s)}if(o++,o>=5){Re(ue,"Reached pagination limit for starred repos (500)");break}}return Re(ue,`Fetched ${t.length} starred repositories`),this.stateManager.setStarredRepos(t),t}catch(n){let o=this.stateManager.getStarredRepos(),r=P(n);return v(ue,"Error fetching starred repos:",r),o.length===0?v(ue,`Failed to fetch starred repositories from GitHub API. No cached repos available. Error: ${r}
|
|
85
85
|
Tip: Ensure your GITHUB_TOKEN has the 'read:user' scope and try again.`):v(ue,`Failed to fetch starred repositories from GitHub API. Using ${o.length} cached repos instead. Error: ${r}`),o}}async getStarredReposWithRefresh(){return this.stateManager.isStarredReposStale()?this.fetchStarredRepos():this.stateManager.getStarredRepos()}async searchIssues(t={}){let n=this.stateManager.getState().config,o=t.languages||n.languages,r=n.scope,i=t.labels||(r?F$(r,n.labels):n.labels),s=t.maxResults||10,a=n.minStars??50,c=[],u=null,l=null,d=!1;this.rateLimitWarning=null;let p=No-1;try{let F=await tg(this.githubToken);if(p=F.remaining,F.remaining<5){let X=new Date(F.resetAt).toLocaleTimeString("en-US",{hour12:!1});this.rateLimitWarning=`GitHub search API quota low (${F.remaining}/${F.limit} remaining, resets at ${X}). Search may be slow.`,v(ue,this.rateLimitWarning)}p<Ta?Re(ue,`Search budget critical (${p} remaining) \u2014 running only Phase 0`):p<No&&Re(ue,`Search budget low (${p} remaining) \u2014 skipping heavy phases (2, 3)`)}catch(F){if(He(F)===401)throw F;v(ue,"Could not check rate limit \u2014 using conservative budget, skipping heavy phases:",P(F))}let g=this.stateManager.getReposWithMergedPRs(),y=new Set(g),S=this.stateManager.getReposWithOpenPRs(),U=await this.getStarredReposWithRefresh(),T=new Set(U),L=new Set(this.stateManager.getLowScoringRepos(3)),Z=new Set(this.stateManager.getState().activeIssues.map(F=>F.url)),N=new Set(n.excludeRepos),z=n.maxIssueAgeDays||90,R=new Date,ee=o.some(F=>F.toLowerCase()==="any")?"":o.map(F=>`language:${F}`).join(" "),q=`is:issue is:open ${ee} no:assignee`.replace(/ +/g," ").trim(),ae=n.includeDocIssues??!0,Ge=new Set(n.aiPolicyBlocklist??Rn.aiPolicyBlocklist??[]);Ge.size>0&&E(ue,`[AI_POLICY_FILTER] Filtering issues from ${Ge.size} blocklisted repo(s): ${[...Ge].join(", ")}`);let ve=F=>F.filter(X=>{if(Z.has(X.html_url))return!1;let B=X.repository_url.split("/").slice(-2).join("/");if(N.has(B)||Ge.has(B)||L.has(B))return!1;let Ce=new Date(X.updated_at);return!(dt(Ce,R)>z||!ae&&dg(X))}),be=[...g,...S.filter(F=>!y.has(F))].slice(0,10),pt=new Set(be);if(be.length>0){let F=Math.min(g.length,be.length),X=be.length-F;Re(ue,`Phase 0: Searching issues in ${be.length} repos (${F} merged-PR, ${X} open-PR, no label filter)...`);let B=be.slice(0,F);if(B.length>0){let we=s-c.length;if(we>0){let{candidates:ke,allBatchesFailed:ie,rateLimitHit:Oe}=await Sa(this.octokit,this.vetter,B,q,[],we,"merged_pr",ve);c.push(...ke),ie&&(u="All merged-PR repo batches failed"),Oe&&(d=!0),Re(ue,`Found ${ke.length} candidates from merged-PR repos`)}}let Ce=be.slice(F);if(Ce.length>0&&c.length<s){let we=s-c.length;if(we>0){let{candidates:ke,allBatchesFailed:ie,rateLimitHit:Oe}=await Sa(this.octokit,this.vetter,Ce,q,[],we,"starred",ve);if(c.push(...ke),ie){let _e="All open-PR repo batches failed";u=u?`${u}; ${_e}`:_e}Oe&&(d=!0),Re(ue,`Found ${ke.length} candidates from open-PR repos`)}}}let Fe=null,tr=n.preferredOrgs??[];if(c.length<s&&tr.length>0&&p>=Ta){be.length>0&&await qt(ka);let F=new Set(be.map(B=>B.split("/")[0]?.toLowerCase())),X=tr.filter(B=>!F.has(B.toLowerCase())).slice(0,5);if(X.length>0){Re(ue,`Phase 0.5: Searching issues in ${X.length} preferred org(s)...`);let B=s-c.length,Ce=X.map(ke=>`org:${ke}`).join(" OR "),we=X.length-1;try{let ke=await wa(this.octokit,i,we,ie=>`${q} ${ie} (${Ce})`.replace(/ +/g," ").trim(),B*3);if(ke.length>0){let ie=ve(ke).filter(zt=>{let br=zt.repository_url.split("/").slice(-2).join("/");return!pt.has(br)}),{candidates:Oe,allFailed:_e,rateLimitHit:Be}=await this.vetter.vetIssuesParallel(ie.slice(0,B*2).map(zt=>zt.html_url),B,"preferred_org");c.push(...Oe),_e&&(Fe="All preferred org issue vetting failed"),Be&&(d=!0),Re(ue,`Found ${Oe.length} candidates from preferred orgs`)}}catch(ke){let ie=P(ke);Fe=ie,Vt(ke)&&(d=!0),v(ue,`Error searching preferred orgs: ${ie}`)}}}if(c.length<s&&U.length>0&&p>=Ta){await qt(ka);let F=U.filter(X=>!pt.has(X));if(F.length>0){Re(ue,`Phase 1: Searching issues in ${F.length} starred repos...`);let X=s-c.length;if(X>0){let{candidates:B,allBatchesFailed:Ce,rateLimitHit:we}=await Sa(this.octokit,this.vetter,F.slice(0,10),q,i,X,"starred",ve);c.push(...B),Ce&&(l="All starred repo batches failed"),we&&(d=!0),Re(ue,`Found ${B.length} candidates from starred repos`)}}}let Le=null;if(c.length<s&&p>=No){await qt(ka),Re(ue,"Phase 2: General issue search...");let F=s-c.length,X=new Set(c.map(ie=>ie.issue.repo)),B=[];if(r&&r.length>1){for(let _e of r){let Be=Io[_e]??[];if(Be.length===0){v(ue,`Scope "${_e}" has no labels, skipping tier`);continue}B.push({tier:_e,tierLabels:Be})}let ie=new Set(r.flatMap(_e=>Io[_e]??[])),Oe=n.labels.filter(_e=>!ie.has(_e));Oe.length>0&&B.push({tier:"custom",tierLabels:Oe})}else B.push({tier:"general",tierLabels:i});let Ce=Math.ceil(F/B.length),we=[];for(let{tier:ie,tierLabels:Oe}of B)try{let _e=await wa(this.octokit,Oe,0,qr=>`${q} ${qr}`.replace(/ +/g," ").trim(),Ce*3);Re(ue,`Phase 2 [${ie}]: processing ${_e.length} items...`);let{candidates:Be,allVetFailed:zt,rateLimitHit:br}=await bg(this.vetter,_e,ve,[pt,T,X],Ce,a,`Phase 2 [${ie}]`);we.push(Be);for(let qr of Be)X.add(qr.issue.repo);zt&&(Le=(Le?Le+"; ":"")+`${ie}: all vetting failed`),br&&(d=!0),Re(ue,`Found ${Be.length} candidates from ${ie} tier`)}catch(_e){if(He(_e)===401)throw _e;let Be=P(_e);Le=(Le?Le+"; ":"")+`${ie}: ${Be}`,Vt(_e)&&(d=!0),v(ue,`Error in ${ie} tier search: ${Be}`),we.push([])}let ke=L$(we);ke.length===0&&Le&&v(ue,`All ${B.length} scope tiers failed in Phase 2: ${Le}`),c.push(...ke.slice(0,F))}let mt=null;if(c.length<s&&p>=No){await qt(ka),Re(ue,"Phase 3: Searching actively maintained repos...");let F=s-c.length,X=new Date;X.setDate(X.getDate()-30);let B=X.toISOString().split("T")[0],Ce=k$(n.projectCategories??[]),we=Ce.length>0?`topic:${Ce[0]}`:"",ke=`is:issue is:open no:assignee ${ee} ${we} stars:>=${a} pushed:>=${B} archived:false`.replace(/ +/g," ").trim();try{let ie=await vg(this.octokit,{q:ke,sort:"updated",order:"desc",per_page:F*3});Re(ue,`Found ${ie.total_count} issues in maintained-repo search, processing top ${ie.items.length}...`);let Oe=new Set(c.map(br=>br.issue.repo)),{candidates:_e,allVetFailed:Be,rateLimitHit:zt}=await bg(this.vetter,ie.items,ve,[pt,T,Oe],F,a,"Phase 3");c.push(..._e),Be&&(mt="all vetting failed"),zt&&(d=!0),Re(ue,`Found ${_e.length} candidates from maintained-repo search`)}catch(ie){let Oe=P(ie);mt=Oe,Vt(ie)&&(d=!0),v(ue,`Error in maintained-repo search: ${Oe}`)}}let Et=p<No,xt="";if(p<Ta?xt=` Most search phases were skipped due to critically low API quota (${p} remaining).`:Et&&(xt=` Some search phases were skipped due to low API quota (${p} remaining).`),c.length===0){let F=[u?`Phase 0 (merged-PR repos): ${u}`:null,Fe?`Phase 0.5 (preferred orgs): ${Fe}`:null,l?`Phase 1 (starred repos): ${l}`:null,Le?`Phase 2 (general): ${Le}`:null,mt?`Phase 3 (maintained repos): ${mt}`:null].filter(Boolean),X=F.length>0?` ${F.join(". ")}.`:"";if(d||Et)return this.rateLimitWarning=`Search returned no results due to GitHub API rate limits.${X}${xt} Try again after the rate limit resets.`,[];throw new fe(`No issue candidates found across all search phases.${X} Try adjusting your search criteria (languages, labels) or check your network connection.`)}return(d||Et)&&(this.rateLimitWarning=`Search results may be incomplete: GitHub API rate limits were hit during search.${xt} Found ${c.length} candidate${c.length===1?"":"s"} but some search phases were limited. Try again after the rate limit resets for complete results.`),c.sort((F,X)=>{let B={merged_pr:0,preferred_org:1,starred:2,normal:3},Ce=B[F.searchPriority]-B[X.searchPriority];if(Ce!==0)return Ce;let we={approve:0,needs_review:1,skip:2},ke=we[F.recommendation]-we[X.recommendation];return ke!==0?ke:X.viabilityScore-F.viabilityScore}),pg(c,2).slice(0,s)}async vetIssue(t){return this.vetter.vetIssue(t)}saveSearchResults(t){let n=[...t].sort((a,c)=>c.viabilityScore-a.viabilityScore),o=vt(),r=Z$.join(o,"found-issues.md"),i=new Date().toISOString(),s=`# Found Issues
|
|
86
86
|
|
|
87
87
|
`;s+=`> Generated at: ${i}
|
|
@@ -129,7 +129,7 @@ ${o.notes.map(u=>`- ${u}`).join(`
|
|
|
129
129
|
\u{1F4CA} OSS Daily Check
|
|
130
130
|
`),console.log(`Active PRs: ${e.summary.totalActivePRs}`),console.log(`Needing Attention: ${e.summary.totalNeedingAttention}`),console.log(`Merged (all time): ${e.summary.totalMergedAllTime}`),console.log(`Merge Rate: ${e.summary.mergeRate}%`),console.log(`
|
|
131
131
|
Capacity: ${t.hasCapacity?"\u2705 Ready for new work":"\u26A0\uFE0F Focus on existing work"}`),console.log(` ${t.reason}
|
|
132
|
-
`),e.needsAddressingPRs.length>0){console.log("\u274C Needs Addressing:");for(let r of e.needsAddressingPRs)console.log(` - ${r.repo}#${r.number}: ${r.title}`),console.log(` ${r.displayLabel} ${r.displayDescription}`);console.log("")}if(e.waitingOnMaintainerPRs.length>0){console.log("\u23F3 Waiting on Maintainer:");for(let r of e.waitingOnMaintainerPRs)console.log(` - ${r.repo}#${r.number}: ${r.title}`),console.log(` ${r.displayDescription}`);console.log("")}if(e.recentlyMergedPRs.length>0){console.log("\u{1F389} Recently Merged:");for(let r of e.recentlyMergedPRs){let i=r.mergedAt?new Date(r.mergedAt).toLocaleDateString():"";console.log(` - ${r.repo}#${r.number}: ${r.title}${i?` (merged ${i})`:""}`)}console.log("")}if(e.recentlyClosedPRs.length>0){console.log("\u{1F6AB} Recently Closed:");for(let r of e.recentlyClosedPRs){let i=r.closedAt?new Date(r.closedAt).toLocaleDateString():"";console.log(` - ${r.repo}#${r.number}: ${r.title}${i?` (closed ${i})`:""}`)}console.log("")}if(e.autoUnshelvedPRs.length>0){console.log("\u{1F514} Auto-Unshelved:");for(let r of e.autoUnshelvedPRs)console.log(` - ${r.repo}#${r.number}: ${r.title} (${r.status.replace(/_/g," ")})`);console.log("")}if(e.shelvedPRs.length>0){console.log("\u{1F4E6} Shelved:");for(let r of e.shelvedPRs)console.log(` - ${r.repo}#${r.number}: ${r.title}`);console.log("")}let o=n.filter(r=>r.status==="new_response");if(o.length>0){console.log("\u{1F4AC} Issue Replies:");for(let r of o)console.log(` - ${r.repo}#${r.number}: ${r.title}`),console.log(` @${r.lastResponseAuthor}: ${r.lastResponseBody.slice(0,80)}${r.lastResponseBody.length>80?"...":""}`);console.log("")}console.log("Run with --json for structured output"),console.log('Run "dashboard serve" for browser view')}var jn,ER,B$,xR,J$=b(()=>{"use strict";Ue();$e();he();On();jn=new Set(["needs_addressing"]),ER=new Set(["needs_response","needs_changes","failing_ci","merge_conflict"]),B$=new Set(["dormant","approaching_dormant"]),xR=new Set(["needs_addressing","waiting_on_maintainer"])});function _g(e){let{repoScores:t,activePRCount:n}=e,o=0,r=0,i=[];for(let c of Object.values(t))o+=c.mergedPRCount,r+=c.closedWithoutMergeCount,c.mergedPRCount>0&&i.push({repo:c.repo,mergedCount:c.mergedPRCount});let s=o+r,a=s>0?o/s:0;return i.sort((c,u)=>u.mergedCount-c.mergedCount),{totalMerged:o,totalClosed:r,mergeRate:a,activePRs:n,reposContributed:i.length,topRepos:i.slice(0,10)}}var $g=b(()=>{"use strict"});async function wg(e,t,n){for(let o of RR)try{E(Mr,`Checking ${t}/${n} for template at ${o}`);let{data:r}=await e.repos.getContent({owner:t,repo:n,path:o});if(Array.isArray(r)){E(Mr,`${o} is a directory (multiple templates?), skipping`);continue}if(r.type!=="file"){E(Mr,`${o} is type "${r.type}", skipping`);continue}if(!r.content){E(Mr,`${o} has no content, skipping`);continue}let i=Buffer.from(r.content,"base64").toString("utf-8");return E(Mr,`Found PR template at ${o} (${i.length} chars)`),{template:i,source:o}}catch(r){if(He(r)===404)continue;if(De(r))throw r;let i=P(r);return v(Mr,`Error checking ${t}/${n}/${o}: ${i}`),{template:null,source:null,error:i}}return E(Mr,`No PR template found for ${t}/${n}`),{template:null,source:null}}var Mr,RR,Sg=b(()=>{"use strict";$e();he();Mr="pr-template",RR=[".github/PULL_REQUEST_TEMPLATE.md",".github/pull_request_template.md","docs/pull_request_template.md","pull_request_template.md"]});function AR(e){try{let t=tt.readFileSync(e,"utf-8");return JSON.parse(t)}catch(t){E(Ea,`Failed to parse ${e}: ${t instanceof Error?t.message:String(t)}`);return}}function DR(e){try{return tt.readFileSync(e,"utf-8")}catch(t){E(Ea,`Failed to read ${e}: ${t instanceof Error?t.message:String(t)}`);return}}function kg(e,t){for(let n of t)if(tt.existsSync(Ut.join(e,n)))return n}function UR(e){return AR(Ut.join(e,"package.json"))}function jR(e){if(!e?.scripts)return[];let t=[];for(let n of OR){let o=e.scripts[n];o&&t.push({name:n,command:o})}return t}function zR(e){return e?!!(e.devDependencies?.prettier||e.dependencies?.prettier):!1}function K$(e,t,n){let o=DR(Ut.join(e,t));return o?o.includes(n):!1}function xa(e){if(!tt.existsSync(e)||!tt.statSync(e).isDirectory())throw new Error(`Repository path does not exist or is not a directory: ${e}`);let t=[],n=UR(e),o=kg(e,["biome.json","biome.jsonc"]);o&&t.push({name:"biome",configPath:o,fixCommand:"npx @biomejs/biome check --write",checkCommand:"npx @biomejs/biome check",supportsFileArgs:!0});let r=kg(e,PR);r?t.push({name:"prettier",configPath:r,fixCommand:"npx prettier --write .",checkCommand:"npx prettier --check .",supportsFileArgs:!0}):zR(n)&&t.push({name:"prettier",configPath:"package.json",fixCommand:"npx prettier --write .",checkCommand:"npx prettier --check .",supportsFileArgs:!0});let i=kg(e,CR);i&&t.push({name:"eslint",configPath:i,fixCommand:"npx eslint --fix .",checkCommand:"npx eslint .",supportsFileArgs:!0}),tt.existsSync(Ut.join(e,"Cargo.toml"))&&t.push({name:"rustfmt",configPath:"Cargo.toml",fixCommand:"cargo fmt",checkCommand:"cargo fmt --check",supportsFileArgs:!1});let s=tt.existsSync(Ut.join(e,"pyproject.toml"));s&&K$(e,"pyproject.toml","[tool.ruff]")?t.push({name:"ruff",configPath:"pyproject.toml",fixCommand:"ruff format .",checkCommand:"ruff format --check .",supportsFileArgs:!0}):s&&K$(e,"pyproject.toml","[tool.black]")?t.push({name:"black",configPath:"pyproject.toml",fixCommand:"black .",checkCommand:"black --check .",supportsFileArgs:!0}):tt.existsSync(Ut.join(e,"ruff.toml"))&&t.push({name:"ruff",configPath:"ruff.toml",fixCommand:"ruff format .",checkCommand:"ruff format --check .",supportsFileArgs:!0}),tt.existsSync(Ut.join(e,"go.mod"))&&t.push({name:"gofmt",configPath:"go.mod",fixCommand:"gofmt -w .",checkCommand:"gofmt -d .",supportsFileArgs:!0}),tt.existsSync(Ut.join(e,".clang-format"))&&t.push({name:"clang-format",configPath:".clang-format",fixCommand:"clang-format -i",checkCommand:"clang-format --dry-run --Werror",supportsFileArgs:!0}),tt.existsSync(Ut.join(e,".rubocop.yml"))&&t.push({name:"rubocop",configPath:".rubocop.yml",fixCommand:"rubocop -a",checkCommand:"rubocop",supportsFileArgs:!0});let a=jR(n);return E(Ea,`Detected ${t.length} formatters in ${e}`),{formatters:t,packageJsonScripts:a,repoPath:e}}function Tg(e,t){if(!e.trim())return{isFormattingFailure:!1,evidence:[]};let n=[],o;for(let{formatter:i,patterns:s}of IR)for(let a of s){let c=e.match(a);c&&(n.push(c[0]),o||(o=i))}if(!o)return{isFormattingFailure:!1,evidence:[]};let r;if(t)try{let s=xa(t).formatters.find(a=>a.name===o);s&&(r=s.fixCommand)}catch(i){E(Ea,`Cross-reference failed for ${t}: ${i instanceof Error?i.message:String(i)}`)}return r||(r={prettier:"npx prettier --write .",eslint:"npx eslint --fix .",biome:"npx @biomejs/biome check --write",black:"black .",ruff:"ruff format .",rustfmt:"cargo fmt",gofmt:"gofmt -w .","clang-format":"clang-format -i",rubocop:"rubocop -a"}[o]),{isFormattingFailure:!0,formatter:o,fixCommand:r,evidence:n}}var tt,Ut,Ea,PR,CR,OR,IR,Eg=b(()=>{"use strict";tt=re(require("fs"),1),Ut=re(require("path"),1);$e();Ea="formatter-detection",PR=[".prettierrc",".prettierrc.json",".prettierrc.yml",".prettierrc.yaml",".prettierrc.json5",".prettierrc.js",".prettierrc.cjs",".prettierrc.mjs",".prettierrc.toml","prettier.config.js","prettier.config.cjs","prettier.config.mjs"],CR=[".eslintrc",".eslintrc.js",".eslintrc.cjs",".eslintrc.yml",".eslintrc.yaml",".eslintrc.json","eslint.config.js","eslint.config.cjs","eslint.config.mjs","eslint.config.ts"],OR=["lint:fix","format","fmt","lint","format:check","format:fix"],IR=[{formatter:"prettier",patterns:[/Code style issues found/i,/Forgot to run Prettier/i,/prettier --check/i]},{formatter:"ruff",patterns:[/ruff format.*--check/i,/ruff format.*would reformat/i]},{formatter:"black",patterns:[/Oh no! .* files? would be reformatted/i,/black --check/i]},{formatter:"rustfmt",patterns:[/Diff in .*\.rs/i,/rustfmt --check/i,/cargo fmt.*--check/i]},{formatter:"biome",patterns:[/biome check/i,/biome ci/i,/Found \d+ fixable diagnostics?/i]},{formatter:"eslint",patterns:[/eslint.*--fix/i,/eslint.*\d+ problems?/i]},{formatter:"gofmt",patterns:[/gofmt -d/i,/goimports/i]},{formatter:"clang-format",patterns:[/clang-format/i]},{formatter:"rubocop",patterns:[/rubocop.*offense/i,/rubocop -a/i]}]});var Se=b(()=>{"use strict";On();v$();V$();_a();q$();ha();Dn();Ue();he();$e();Ur();J$();$g();Sg();Eg();Dt()});var Og={};ne(Og,{compactActionableIssues:()=>Rg,compactRepoGroups:()=>Pg,deduplicateDigest:()=>xg,jsonError:()=>Q$,jsonSuccess:()=>Y$,outputJson:()=>oe,outputJsonError:()=>Cg,toCompactDailyOutput:()=>X$,toCompactStartupOutput:()=>GR});function X$(e){return{digest:e.digest,capacity:e.capacity,briefSummary:e.briefSummary,actionableIssues:e.actionableIssues,actionMenu:e.actionMenu,commentedIssues:e.commentedIssues,failureCount:e.failures.length}}function xg(e){let t=n=>n.map(o=>o.url);return{generatedAt:e.generatedAt,openPRs:e.openPRs,needsAddressingPRs:t(e.needsAddressingPRs),waitingOnMaintainerPRs:t(e.waitingOnMaintainerPRs),recentlyClosedPRs:e.recentlyClosedPRs,recentlyMergedPRs:e.recentlyMergedPRs,shelvedPRs:e.shelvedPRs,autoUnshelvedPRs:e.autoUnshelvedPRs,summary:e.summary}}function Rg(e){return e.map(t=>({type:t.type,prUrl:t.pr.url,label:t.label,isNewContribution:t.isNewContribution}))}function Pg(e){return e.map(t=>({repo:t.repo,prUrls:t.prs.map(n=>n.url)}))}function GR(e){let{daily:t,...n}=e;return{...n,daily:t?X$(t):void 0,dashboardUrl:e.dashboardUrl,issueList:e.issueList}}function Y$(e){return{success:!0,data:e,timestamp:new Date().toISOString()}}function Q$(e){return{success:!1,error:e,timestamp:new Date().toISOString()}}function oe(e){console.log(JSON.stringify(Y$(e),null,2))}function Cg(e){console.log(JSON.stringify(Q$(e),null,2))}var Jo=b(()=>{"use strict"});function ew(e,t,n,o){let r=e.summary||{totalActivePRs:0,totalMergedAllTime:0,mergeRate:0,totalNeedingAttention:0},i=t.config.minStars??50,s=n!==void 0?Math.max(n,r.totalMergedAllTime):r.totalMergedAllTime,a=Object.values(t.repoScores||{}).reduce((u,l)=>u+(Wt(l.stargazersCount,i)?0:l.closedWithoutMergeCount||0),0),c=o!==void 0?Math.max(o,a):a;return{activePRs:r.totalActivePRs,shelvedPRs:(e.shelvedPRs||[]).length,mergedPRs:s,closedPRs:c,mergeRate:`${(r.mergeRate??0).toFixed(1)}%`}}function Ig(e,t){let n={...e};for(let[o,r]of Object.entries(t))n[o]=r;return n}function Ag(e,t,n,o,r){let i=K(),s=i.getState();try{Object.keys(t).length>0&&i.setMonthlyMergedCounts(Ig(s.monthlyMergedCounts||{},t))}catch(a){v(Ae,`Failed to store monthly merged counts: ${P(a)}`)}try{Object.keys(n).length>0&&i.setMonthlyClosedCounts(Ig(s.monthlyClosedCounts||{},n))}catch(a){v(Ae,`Failed to store monthly closed counts: ${P(a)}`)}try{let a={...o};for(let[c,u]of Object.entries(r))a[c]=(a[c]||0)+u;for(let c of e)if(c.createdAt){let u=c.createdAt.slice(0,7);a[u]=(a[u]||0)+1}Object.keys(a).length>0&&i.setMonthlyOpenedCounts(Ig(s.monthlyOpenedCounts||{},a))}catch(a){v(Ae,`Failed to store monthly opened counts: ${P(a)}`)}}async function Dg(e){let t=K(),n=new Gr(e),o=new Lr(e),r=je(e),i=t.getState().config,s=Ra(t.getState()),a=t.getMergedPRWatermark(),c=t.getClosedPRWatermark(),[{prs:u,failures:l},d,p,g,y,S,U,T]=await Promise.all([n.fetchUserOpenPRs(),n.fetchRecentlyClosedPRs().catch(R=>{if(De(R))throw R;return v(Ae,`Failed to fetch recently closed PRs: ${P(R)}`),[]}),n.fetchRecentlyMergedPRs().catch(R=>{if(De(R))throw R;return v(Ae,`Failed to fetch recently merged PRs: ${P(R)}`),[]}),n.fetchUserMergedPRCounts(s).catch(R=>{if(De(R))throw R;return v(Ae,`Failed to fetch merged PR counts: ${P(R)}`),zr()}),n.fetchUserClosedPRCounts(s).catch(R=>{if(De(R))throw R;return v(Ae,`Failed to fetch closed PR counts: ${P(R)}`),zr()}),o.fetchCommentedIssues().catch(R=>{if(De(R))throw R;let G=P(R);return G.includes("No GitHub username configured")?v(Ae,`Issue conversation tracking requires setup: ${G}`):v(Ae,`Issue conversation fetch failed: ${G}`),{issues:[],failures:[{issueUrl:"N/A",error:`Issue conversation fetch failed: ${G}`}]}}),f$(r,i,a).catch(R=>{if(De(R))throw R;return v(Ae,`Failed to fetch merged PRs for storage: ${P(R)}`),[]}),h$(r,i,c).catch(R=>{if(De(R))throw R;return v(Ae,`Failed to fetch closed PRs for storage: ${P(R)}`),[]})]),L=S.issues;S.failures.length>0&&v(Ae,`${S.failures.length} issue conversation check(s) failed`),l.length>0&&v(Ae,`${l.length} PR fetch(es) failed`);try{t.batch(()=>{try{t.addMergedPRs(U)}catch(be){v(Ae,`Failed to store merged PRs: ${P(be)}`)}try{t.addClosedPRs(T)}catch(be){v(Ae,`Failed to store closed PRs: ${P(be)}`)}let{monthlyCounts:R,monthlyOpenedCounts:G}=g,{monthlyCounts:ee,monthlyOpenedCounts:q}=y;Ag(u,R,ee,G,q);let ae=n.generateDigest(u,d,p),Ge=new Set(t.getState().config.shelvedPRUrls||[]),ve=u.filter(be=>Ge.has(be.url)||be.stalenessTier==="dormant"&&be.status!=="needs_addressing");ae.shelvedPRs=ve.map(Yt),ae.autoUnshelvedPRs=[],ae.summary.totalActivePRs=u.length-ve.length,t.setLastDigest(ae)})}catch(R){v(Ae,`Failed to persist dashboard state: ${P(R)}`)}v(Ae,`Refreshed: ${u.length} PRs fetched`);let Z=Ug(t.getMergedPRs()),N=jg(t.getClosedPRs()),z=t.getState().lastDigest;if(!z)throw new Error("Dashboard data fetch failed: digest was not generated");return{digest:z,commentedIssues:L,allMergedPRs:Z,allClosedPRs:N}}function Ug(e){let t=[],n=0;for(let o of e){let r=Pe(o.url);if(!r){n++;continue}t.push({url:o.url,repo:`${r.owner}/${r.repo}`,number:r.number,title:o.title,mergedAt:o.mergedAt})}return n>0&&v(Ae,`Skipped ${n} stored merged PR(s) with unparseable URLs`),t}function jg(e){let t=[],n=0;for(let o of e){let r=Pe(o.url);if(!r){n++;continue}t.push({url:o.url,repo:`${r.owner}/${r.repo}`,number:r.number,title:o.title,closedAt:o.closedAt})}return n>0&&v(Ae,`Skipped ${n} stored closed PR(s) with unparseable URLs`),t}function tw(e,t){let n={};for(let r of e.openPRs||[])n[r.repo]||(n[r.repo]={active:0,merged:0,closed:0}),n[r.repo].active++;let o=t.config.minStars??50;for(let[r,i]of Object.entries(t.repoScores||{}))Wt(i.stargazersCount,o)||(n[r]||(n[r]={active:0,merged:0,closed:0}),n[r].merged=i.mergedPRCount,n[r].closed=i.closedWithoutMergeCount);return n}function rw(e,t=10){return Object.entries(e).sort((n,o)=>o[1].merged+o[1].active+o[1].closed-(n[1].merged+n[1].active+n[1].closed)).slice(0,t)}function nw(e){return{monthlyMerged:e.monthlyMergedCounts||{},monthlyClosed:e.monthlyClosedCounts||{},monthlyOpened:e.monthlyOpenedCounts||{}}}var Ae,zg=b(()=>{"use strict";Se();he();$e();ba();Ue();Dt();Ko();Ae="dashboard-data"});var Gg={};ne(Gg,{CRITICAL_STATUSES:()=>jn,applyStatusOverrides:()=>Nr,assessCapacity:()=>Vo,buildStarFilter:()=>Ra,collectActionableIssues:()=>Ho,computeActionMenu:()=>qo,computeRepoSignals:()=>Zo,executeDailyCheck:()=>Pa,formatBriefSummary:()=>Bo,formatSummary:()=>Wo,groupPRsByRepo:()=>Mo,printDigest:()=>yg,runDaily:()=>VR,runDailyForDisplay:()=>HR,toShelvedPRRef:()=>Yt});function Ra(e){let t=e.config.minStars??50,n=new Map;for(let[o,r]of Object.entries(e.repoScores))r.stargazersCount!==void 0&&n.set(o,r.stargazersCount);if(n.size!==0)return{minStars:t,knownStarCounts:n}}async function FR(e,t){let{prs:n,failures:o}=await e.fetchUserOpenPRs();o.length>0&&v(le,`${o.length} PR fetch(es) failed`);let r=K().getState(),i=Ra(r),s=new Lr(t),[a,c,u,l,d]=await Promise.all([e.fetchUserMergedPRCounts(i).catch(Z=>{if(De(Z))throw Z;return v(le,`Failed to fetch merged PR counts: ${P(Z)}`),zr()}),e.fetchUserClosedPRCounts(i).catch(Z=>{if(De(Z))throw Z;return v(le,`Failed to fetch closed PR counts: ${P(Z)}`),zr()}),e.fetchRecentlyClosedPRs().catch(Z=>{if(De(Z))throw Z;return v(le,`Failed to fetch recently closed PRs: ${P(Z)}`),[]}),e.fetchRecentlyMergedPRs().catch(Z=>{if(De(Z))throw Z;return v(le,`Failed to fetch recently merged PRs: ${P(Z)}`),[]}),s.fetchCommentedIssues().catch(Z=>{if(De(Z))throw Z;let N=P(Z);return N.includes("No GitHub username configured")?v(le,`Issue conversation tracking requires setup: ${N}`):v(le,`Issue conversation fetch failed: ${N}`),{issues:[],failures:[{issueUrl:"N/A",error:`Issue conversation fetch failed: ${N}`}]}})]),p=d.issues;d.failures.length>0&&v(le,`${d.failures.length} issue conversation check(s) failed`);let{repos:g,monthlyCounts:y,monthlyOpenedCounts:S}=a,{repos:U,monthlyCounts:T,monthlyOpenedCounts:L}=c;return{prs:n,failures:o,mergedCounts:g,closedCounts:U,monthlyCounts:y,monthlyClosedCounts:T,openedFromMerged:S,openedFromClosed:L,recentlyClosedPRs:u,recentlyMergedPRs:l,commentedIssues:p}}async function LR(e,t,n,o){let r=K();try{r.batch(()=>{let a=Object.values(r.getState().repoScores).filter(g=>g.mergedPRCount>0);if(n.size===0&&a.length>0)v(le,`Skipping stale repo reset: API returned 0 merged PR results but state has ${a.length} repo(s) with merges. Possible API issue.`);else for(let g of Object.values(r.getState().repoScores))n.has(g.repo)||r.updateRepoScore(g.repo,{mergedPRCount:0});let c=0;for(let[g,{count:y,lastMergedAt:S}]of n)try{r.updateRepoScore(g,{mergedPRCount:y,lastMergedAt:S||void 0})}catch(U){c++,v(le,`Failed to update merged count for ${g}: ${P(U)}`)}c===n.size&&n.size>0&&v(le,`[ALL_MERGED_COUNT_UPDATES_FAILED] All ${n.size} merged count update(s) failed.`);let u=Object.values(r.getState().repoScores).filter(g=>(g.closedWithoutMergeCount||0)>0);o.size===0&&u.length>0&&v(le,`API returned 0 closed PR results but state has ${u.length} repo(s) with closed PRs. Possible transient API issue.`);let l=0;for(let[g,y]of o)try{r.updateRepoScore(g,{closedWithoutMergeCount:y})}catch(S){l++,v(le,`Failed to update closed count for ${g}: ${P(S)}`)}l===o.size&&o.size>0&&v(le,`[ALL_CLOSED_COUNT_UPDATES_FAILED] All ${o.size} closed count update(s) failed.`);let d=Zo(t),p=0;for(let[g,y]of d)try{r.updateRepoScore(g,{signals:y})}catch(S){p++,v(le,`Failed to update signals for ${g}: ${P(S)}`)}p===d.size&&d.size>0&&v(le,`[ALL_SIGNAL_UPDATES_FAILED] All ${d.size} signal update(s) failed. This may indicate corrupted state.`)})}catch(a){v(le,`Failed to persist repo score updates: ${P(a)}`)}let i=Object.keys(r.getState().repoScores),s;try{s=await e.fetchRepoMetadata(i)}catch(a){if(De(a))throw a;v(le,`Failed to fetch repo metadata: ${P(a)}`),v(le,"Repos without cached metadata will be excluded from dashboard stats and metadata badges until fetched on the next successful run."),s=new Map}try{r.batch(()=>{let a=0;for(let[u,{stars:l,language:d}]of s)try{r.updateRepoScore(u,{stargazersCount:l,language:d})}catch(p){a++,v(le,`Failed to update metadata for ${u}: ${P(p)}`)}a===s.size&&s.size>0&&v(le,`[ALL_METADATA_UPDATES_FAILED] All ${s.size} metadata update(s) failed.`);let c=0;for(let[u]of n)try{r.addTrustedProject(u)}catch(l){c++,v(le,`Failed to sync trusted project ${u}: ${P(l)}`)}c===n.size&&n.size>0&&v(le,`[ALL_TRUST_SYNCS_FAILED] All ${n.size} trusted project sync(s) failed. This may indicate corrupted state.`)})}catch(a){v(le,`Failed to persist metadata/trust updates: ${P(a)}`)}}function NR(e,t,n,o){let r=K(),i=Nr(t,r.getState()),s=[],a=[],c=[];try{r.batch(()=>{for(let d of i)r.isPRShelved(d.url)?jn.has(d.status)?(r.unshelvePR(d.url),a.push(Yt(d)),c.push(d)):s.push(Yt(d)):d.stalenessTier==="dormant"&&!jn.has(d.status)?s.push(Yt(d)):c.push(d);let l=e.generateDigest(i,n,o);l.shelvedPRs=s,l.autoUnshelvedPRs=a,l.summary.totalActivePRs=c.length,r.setLastDigest(l)})}catch(l){v(le,`Failed to persist partition state: ${P(l)}`)}let u=r.getState().lastDigest;return{activePRs:c,shelvedPRs:s,autoUnshelvedPRs:a,digest:u}}function MR(e,t,n,o,r,i){let s=K(),a=Vo(t,s.getState().config.maxActivePRs,n.length),c=[];try{s.batch(()=>{c=o.filter(S=>{let U=s.getIssueDismissedAt(S.url);if(!U)return!0;if(S.status==="new_response"){let T=new Date(S.lastResponseAt).getTime(),L=new Date(U).getTime();if(isNaN(T)||isNaN(L))return v(le,`Invalid timestamp in dismiss check for ${S.url}, including issue`),!0;if(T>L){v(le,`Auto-undismissing issue ${S.url}: new response at ${S.lastResponseAt} after dismiss at ${U}`);try{s.undismissIssue(S.url)}catch(Z){v(le,`Failed to persist auto-undismiss for ${S.url}: ${P(Z)}`)}return!0}}return!1})})}catch(S){v(le,`Failed to persist auto-undismiss state: ${P(S)}`)}let u=c.filter(S=>S.status==="new_response"),l=Wo(e,a,u),d=Ho(t,i);e.summary.totalNeedingAttention=d.length;let p=Bo(e,d.length,u.length),g=qo(d,a,c),y=Mo(t);return{digest:e,capacity:a,summary:l,briefSummary:p,actionableIssues:d,actionMenu:g,commentedIssues:c,repoGroups:y,failures:r}}function ZR(e){return{digest:xg(e.digest),capacity:e.capacity,summary:e.summary,briefSummary:e.briefSummary,actionableIssues:Rg(e.actionableIssues),actionMenu:e.actionMenu,commentedIssues:e.commentedIssues,repoGroups:Pg(e.repoGroups),failures:e.failures}}async function Pa(e){let t=await ow(e);return ZR(t)}async function ow(e){let t=new Gr(e),{prs:n,failures:o,mergedCounts:r,closedCounts:i,monthlyCounts:s,monthlyClosedCounts:a,openedFromMerged:c,openedFromClosed:u,recentlyClosedPRs:l,recentlyMergedPRs:d,commentedIssues:p}=await FR(t,e);await LR(t,n,r,i);try{K().batch(()=>{Ag(n,s,a,c,u)})}catch(T){v(le,`Failed to persist monthly analytics: ${P(T)}`)}let g=K().getState().lastDigestAt,{activePRs:y,shelvedPRs:S,digest:U}=NR(t,n,l,d);return MR(U,y,S,p,o,g)}async function VR(){let e=Ie();return Pa(e)}async function HR(){let e=Ie();return ow(e)}var le,Ko=b(()=>{"use strict";Se();he();$e();ba();zg();Jo();Se();le="daily"});var iw={};ne(iw,{runStatus:()=>qR});async function qR(e){let t=K(),n=t.getStats(),o=t.getState(),r=o.lastDigestAt||o.lastRunAt,{totalTracked:i,...s}=n,a={stats:s,lastRunAt:o.lastRunAt};return e.offline&&(a.offline=!0,a.lastUpdated=r),a}var sw=b(()=>{"use strict";Se()});var aw={};ne(aw,{runSearch:()=>BR});async function BR(e){let t=Ie(),n=new Kt(t),o=await n.searchIssues({maxResults:e.maxResults}),r=K(),{config:i}=r.getState(),s=i.excludeRepos||[],a=i.aiPolicyBlocklist??Rn.aiPolicyBlocklist??[],c={candidates:o.map(u=>{let l=r.getRepoScore(u.issue.repo);return{issue:{repo:u.issue.repo,number:u.issue.number,title:u.issue.title,url:u.issue.url,labels:u.issue.labels},recommendation:u.recommendation,reasonsToApprove:u.reasonsToApprove,reasonsToSkip:u.reasonsToSkip,searchPriority:u.searchPriority,viabilityScore:u.viabilityScore,repoScore:l?{score:l.score,mergedPRCount:l.mergedPRCount,closedWithoutMergeCount:l.closedWithoutMergeCount,isResponsive:l.signals?.isResponsive??!1,lastMergedAt:l.lastMergedAt}:void 0}}),excludedRepos:s,aiPolicyBlocklist:a};return n.rateLimitWarning&&(c.rateLimitWarning=n.rateLimitWarning),c}var cw=b(()=>{"use strict";Se()});function qe(e,t,n){if(t.test(e))return;let o={PR:"https://github.com/owner/repo/pull/123",issue:"https://github.com/owner/repo/issues/123","issue or PR":"https://github.com/owner/repo/issues/123 or https://github.com/owner/repo/pull/123"};throw new fe(`Invalid ${n} URL: ${e}. Expected format: ${o[n]}`)}function ze(e){if(e.length>uw)throw new fe(`URL exceeds maximum length of ${uw} characters`);return e}function Fg(e){if(e.length>lw)throw new fe(`Message exceeds maximum length of ${lw} characters`);return e}function zn(e){if(!e||e.trim().length===0)throw new fe("GitHub username cannot be empty.");let t=e.trim();if(t.length>dw)throw new fe(`GitHub username must be at most ${dw} characters (got ${t.length}).`);if(!WR.test(t))throw new fe("GitHub username can only contain alphanumeric characters and hyphens.");if(t.startsWith("-"))throw new fe("GitHub username cannot start with a hyphen.");if(t.endsWith("-"))throw new fe("GitHub username cannot end with a hyphen.");if(JR.test(t))throw new fe("GitHub username cannot contain consecutive hyphens.");return t}var Qt,er,pw,uw,lw,dw,WR,JR,St=b(()=>{"use strict";he();Qt=/^https:\/\/github\.com\/[^/]+\/[^/]+\/pull\/\d+$/,er=/^https:\/\/github\.com\/[^/]+\/[^/]+\/issues\/\d+$/,pw=/^https:\/\/github\.com\/[^/]+\/[^/]+\/(issues|pull)\/\d+$/,uw=2048,lw=1e3;dw=39,WR=/^[a-zA-Z0-9-]+$/,JR=/--/});var mw={};ne(mw,{runVet:()=>KR});async function KR(e){ze(e.issueUrl),qe(e.issueUrl,er,"issue");let t=Ie(),o=await new Kt(t).vetIssue(e.issueUrl);return{issue:{repo:o.issue.repo,number:o.issue.number,title:o.issue.title,url:o.issue.url,labels:o.issue.labels},recommendation:o.recommendation,reasonsToApprove:o.reasonsToApprove,reasonsToSkip:o.reasonsToSkip,projectHealth:o.projectHealth,vettingResult:o.vettingResult}}var gw=b(()=>{"use strict";Se();St()});function Xo(){return hw.join(vt(),"dashboard-server.pid")}function Oa(e){Gn.writeFileSync(Xo(),JSON.stringify(e),{mode:384})}function Fn(){try{let e=Gn.readFileSync(Xo(),"utf-8"),t=JSON.parse(e);return typeof t!="object"||t===null||typeof t.pid!="number"||!Number.isInteger(t.pid)||t.pid<=0||typeof t.port!="number"||typeof t.startedAt!="string"?(v(Ca,"PID file has invalid structure, ignoring"),null):t}catch(e){return e.code!=="ENOENT"&&v(Ca,`Failed to read PID file: ${e.message}`),null}}function fr(){try{Gn.unlinkSync(Xo())}catch(e){e.code!=="ENOENT"&&v(Ca,`Failed to remove PID file: ${e.message}`)}}function Yo(e){return new Promise(t=>{let n=fw.get(`http://127.0.0.1:${e}/api/data`,{timeout:2e3},o=>{o.resume(),t(o.statusCode===200)});n.on("error",()=>t(!1)),n.on("timeout",()=>{n.destroy(),t(!1)})})}async function Ia(){let e=Fn();if(!e)return null;try{process.kill(e.pid,0)}catch(t){let n=t.code;return n!=="ESRCH"&&n!=="EPERM"&&v(Ca,`Unexpected error checking PID ${e.pid}: ${t.message}`),fr(),null}return await Yo(e.port)?{port:e.port,url:`http://oss.localhost:${e.port}`}:(fr(),null)}var fw,Gn,hw,Ca,Aa=b(()=>{"use strict";fw=re(require("http"),1),Gn=re(require("fs"),1),hw=re(require("path"),1);Se();$e();Ca="dashboard-server"});var Ln,vw=b(()=>{"use strict";Ln=class{maxRequests;windowMs;timestamps=[];constructor(t){this.maxRequests=t.maxRequests,this.windowMs=t.windowMs}check(){let t=Date.now(),n=t-this.windowMs;if(this.timestamps=this.timestamps.filter(o=>o>n),this.timestamps.length>=this.maxRequests){let r=this.timestamps[0]+this.windowMs-t;return{allowed:!1,retryAfterSeconds:Math.ceil(r/1e3)}}return this.timestamps.push(t),{allowed:!0}}}});var Zr={};ne(Zr,{VALID_TARGETS:()=>Lg,runMove:()=>XR});async function XR(e){ze(e.prUrl),qe(e.prUrl,Qt,"PR");let t=e.target;if(!Lg.includes(t))throw new Error(`Invalid target "${e.target}". Must be one of: ${Lg.join(", ")}`);let n=K();switch(t){case"attention":case"waiting":{let o=t==="attention"?"needs_addressing":"waiting_on_maintainer",r=t==="attention"?"Need Attention":"Waiting on Maintainer",i=new Date().toISOString();return n.batch(()=>{n.setStatusOverride(e.prUrl,o,i),n.unshelvePR(e.prUrl)}),{url:e.prUrl,target:t,description:`Moved to ${r}`}}case"shelved":return n.batch(()=>{n.shelvePR(e.prUrl),n.clearStatusOverride(e.prUrl)}),{url:e.prUrl,target:t,description:"Shelved \u2014 excluded from capacity and actionable items"};case"auto":return n.batch(()=>{n.clearStatusOverride(e.prUrl),n.unshelvePR(e.prUrl)}),{url:e.prUrl,target:t,description:"Reset to computed status"};default:{let o=t;throw new Error(`Unhandled move target: ${o}`)}}}var Lg,Vr=b(()=>{"use strict";Se();St();Lg=["attention","waiting","shelved","auto"]});var ww={};ne(ww,{findRunningDashboardServer:()=>Ia,getDashboardPidPath:()=>Xo,isDashboardServerRunning:()=>Yo,readDashboardServerInfo:()=>Fn,removeDashboardServerInfo:()=>fr,startDashboardServer:()=>rP,writeDashboardServerInfo:()=>Oa});function Qo(e,t,n,o,r){let i=tw(e,t),s=rw(i),{monthlyMerged:a,monthlyOpened:c,monthlyClosed:u}=nw(t),l=o??Ug(K().getMergedPRs()),d=r??jg(K().getClosedPRs()),p=t.config.minStars??50,g=t.repoScores||{},y=z=>!Wt(g[z.repo]?.stargazersCount,p),S=l.filter(y),U=d.filter(y),T=ew(e,t,S.length,U.length),L=t.config.dismissedIssues||{},Z=n.filter(z=>z.status==="new_response"&&!(z.url in L)),N={};for(let[z,R]of Object.entries(g))(R.stargazersCount!==void 0||R.language!==void 0)&&(N[z]={stars:R.stargazersCount,language:R.language});return{stats:T,prsByRepo:i,topRepos:s.map(([z,R])=>({repo:z,...R})),monthlyMerged:a,monthlyOpened:c,monthlyClosed:u,activePRs:Nr(e.openPRs||[],t),shelvedPRUrls:t.config.shelvedPRUrls||[],recentlyMergedPRs:e.recentlyMergedPRs||[],recentlyClosedPRs:e.recentlyClosedPRs||[],autoUnshelvedPRs:e.autoUnshelvedPRs||[],commentedIssues:n,issueResponses:Z,allMergedPRs:S,allClosedPRs:U,repoMetadata:N}}function tP(e,t=YR){return new Promise((n,o)=>{let r=[],i=0,s=!1;e.on("data",a=>{if(!s){if(i+=a.length,i>t){s=!0,e.destroy(),o(new Error("Body too large"));return}r.push(a)}}),e.on("end",()=>{s||n(Buffer.concat(r).toString("utf-8"))}),e.on("error",a=>{s||o(a)})})}function $w(e){e.setHeader("X-Content-Type-Options","nosniff"),e.setHeader("X-Frame-Options","DENY"),e.setHeader("Content-Security-Policy","default-src 'self'; script-src 'self' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self'"),e.setHeader("Referrer-Policy","strict-origin-when-cross-origin")}function yw(e,t){let n=e.headers.origin;return n?[`http://localhost:${t}`,`http://127.0.0.1:${t}`,`http://oss.localhost:${t}`].includes(n):!0}function Da(e,t,n){$w(e),e.setHeader("Cache-Control","no-store");let o=JSON.stringify(n);e.writeHead(t,{"Content-Type":"application/json","Content-Length":Buffer.byteLength(o)}),e.end(o)}function xe(e,t,n){Da(e,t,{error:n})}async function rP(e){let{port:t,assetsDir:n,token:o,open:r}=e,i=K(),s=jt.resolve(n),a=i.getState().lastDigest,c=[];if(!a)throw new Error("No dashboard data available. Run the daily check first: GITHUB_TOKEN=$(gh auth token) npm start -- daily");let u;try{u=Qo(a,i.getState(),c)}catch(z){throw new Error(`Failed to build dashboard data: ${P(z)}. State data may be corrupted \u2014 try running: daily --json`,{cause:z})}let l=new Ln({maxRequests:30,windowMs:6e4}),d=new Ln({maxRequests:10,windowMs:6e4}),p=new Ln({maxRequests:6,windowMs:6e4}),g=_w.createServer(async(z,R)=>{let G=z.method||"GET",ee=z.url||"/";try{if(ee==="/api/data"&&G==="GET"){let q=l.check();if(!q.allowed){R.setHeader("Retry-After",String(q.retryAfterSeconds)),xe(R,429,"Too many requests");return}if(i.reloadIfChanged())try{u=Qo(a,i.getState(),c)}catch(ae){v(rt,`Failed to rebuild dashboard data after state reload: ${P(ae)}`)}Da(R,200,u);return}if(ee==="/api/action"&&G==="POST"){if(!yw(z,L)){xe(R,403,"Invalid origin");return}let q=d.check();if(!q.allowed){R.setHeader("Retry-After",String(q.retryAfterSeconds)),xe(R,429,"Too many requests");return}await y(z,R);return}if(ee==="/api/refresh"&&G==="POST"){if(!yw(z,L)){xe(R,403,"Invalid origin");return}let q=p.check();if(!q.allowed){R.setHeader("Retry-After",String(q.retryAfterSeconds)),xe(R,429,"Too many requests");return}await S(z,R);return}if(G==="GET"){U(ee,R);return}xe(R,405,"Method not allowed")}catch(q){v(rt,`Unhandled request error: ${G} ${ee} ${P(q)}`),R.headersSent||xe(R,500,"Internal server error")}});g.requestTimeout=QR;async function y(z,R){i.reloadIfChanged();let G;try{let q=await tP(z);G=JSON.parse(q)}catch(q){let ae=q instanceof Error&&q.message==="Body too large";xe(R,ae?413:400,ae?"Request body too large":"Invalid JSON body");return}if(!G.action||!bw.has(G.action)){xe(R,400,`Invalid action. Must be one of: ${[...bw].join(", ")}`);return}if(!G.url||typeof G.url!="string"){xe(R,400,'Missing or invalid "url" field');return}let ee=G.action==="dismiss_issue_response";try{ze(G.url),qe(G.url,ee?er:Qt,ee?"issue":"PR")}catch(q){q instanceof fe?xe(R,400,q.message):(v(rt,`Unexpected error during URL validation: ${P(q)}`),xe(R,400,"Invalid URL"));return}try{if(G.action==="move"){let{VALID_TARGETS:q,runMove:ae}=await Promise.resolve().then(()=>(Vr(),Zr));if(!G.target||!q.includes(G.target)){xe(R,400,`move requires a valid "target" field (${q.join(", ")})`);return}await ae({prUrl:G.url,target:G.target})}else i.dismissIssue(G.url,new Date().toISOString())}catch(q){v(rt,`Action failed: ${G.action} ${G.url} ${P(q)}`),xe(R,500,"Action failed");return}u=Qo(a,i.getState(),c),Da(R,200,u)}async function S(z,R){let G=o||Bt();if(!G){xe(R,401,"No GitHub token available. Cannot refresh data.");return}try{i.reloadIfChanged(),v(rt,"Refreshing dashboard data from GitHub...");let ee=await Dg(G);a=ee.digest,c=ee.commentedIssues,u=Qo(a,i.getState(),c,ee.allMergedPRs,ee.allClosedPRs),Da(R,200,u)}catch(ee){v(rt,`Dashboard refresh failed: ${P(ee)}`),xe(R,500,"Refresh failed")}}function U(z,R){let G;try{G=decodeURIComponent(z.split("?")[0])}catch{v(rt,`Malformed URL received: ${z}`),xe(R,400,"Malformed URL");return}if(G.includes("..")){xe(R,403,"Forbidden");return}let ee=G==="/"?"index.html":G.replace(/^\/+/,""),q=jt.join(s,ee);if(!q.startsWith(s+jt.sep)&&q!==s){xe(R,403,"Forbidden");return}try{Ua.statSync(q).isDirectory()&&(q=jt.join(s,"index.html"))}catch(ve){if(ve.code==="ENOENT")q=jt.join(s,"index.html");else{v(rt,`Failed to stat file: ${q}`),xe(R,500,"Internal server error");return}}let ae=jt.extname(q).toLowerCase(),Ge=eP[ae]||"application/octet-stream";try{let ve=Ua.readFileSync(q);$w(R),R.writeHead(200,{"Content-Type":Ge,"Content-Length":ve.length,"Cache-Control":"public, max-age=3600"}),R.end(ve)}catch(ve){ve.code==="ENOENT"?xe(R,404,"Not found"):(v(rt,`Failed to serve static file: ${q}`),xe(R,500,"Failed to read file"))}}let T=10,L=t;for(let z=0;z<T;z++)try{await new Promise((R,G)=>{g.once("error",G),g.listen(L,"127.0.0.1",()=>R())});break}catch(R){let G=R;if(G.code==="EADDRINUSE"&&z<T-1){v(rt,`Port ${L} is in use, trying ${L+1}...`),L++;continue}throw new Error(`Failed to start server: ${G.message}`,{cause:R})}Oa({pid:process.pid,port:L,startedAt:new Date().toISOString(),version:At()});let Z=`http://oss.localhost:${L}`;v(rt,`Dashboard server running at ${Z} (also: http://localhost:${L})`),o&&Dg(o).then(z=>{i.reloadIfChanged(),a=z.digest,c=z.commentedIssues,u=Qo(a,i.getState(),c,z.allMergedPRs,z.allClosedPRs),v(rt,"Background data refresh complete")}).catch(z=>{v(rt,`Background data refresh failed (serving cached data): ${P(z)}`)}),r&&ja(Z);let N=()=>{v(rt,"Shutting down dashboard server..."),fr(),g.close(()=>{process.exit(0)}),setTimeout(()=>process.exit(0),3e3).unref()};process.on("SIGINT",N),process.on("SIGTERM",N)}var _w,Ua,jt,bw,rt,YR,QR,eP,Sw=b(()=>{"use strict";_w=re(require("http"),1),Ua=re(require("fs"),1),jt=re(require("path"),1);Se();he();$e();St();zg();za();Aa();vw();Dt();Aa();bw=new Set(["move","dismiss_issue_response"]),rt="dashboard-server",YR=10240,QR=3e4,eP={".html":"text/html",".js":"application/javascript",".css":"text/css",".svg":"image/svg+xml",".json":"application/json",".png":"image/png",".ico":"image/x-icon"}});var kw={};ne(kw,{resolveAssetsDir:()=>Fa,serveDashboard:()=>nP});function Fa(){let e=kt.resolve(__dirname,"../../dashboard/dist");if(Ga.existsSync(kt.join(e,"index.html")))return e;let t=kt.resolve(kt.dirname(process.argv[1]),"../../dashboard/dist");if(Ga.existsSync(kt.join(t,"index.html")))return t;try{let n=require.resolve("@oss-autopilot/dashboard/package.json"),o=kt.join(kt.dirname(n),"dist");if(Ga.existsSync(kt.join(o,"index.html")))return o}catch(n){n.code!=="MODULE_NOT_FOUND"&&console.error("Error resolving dashboard package:",n)}return null}async function nP(e){let t=Fa();t||(console.error("Could not find dashboard SPA assets."),console.error("Make sure packages/dashboard has been built:"),console.error(" cd packages/dashboard && pnpm run build"),process.exit(1));let n=Bt(),{startDashboardServer:o}=await Promise.resolve().then(()=>(Sw(),ww));await o({port:e.port,assetsDir:t,token:n,open:e.open})}var Ga,kt,Ng=b(()=>{"use strict";Ga=re(require("fs"),1),kt=re(require("path"),1);Se()});function aP(e){return new Promise(t=>setTimeout(t,e))}async function Ew(e){if(!Fa())return null;let n=await Ia();if(n){let c=Fn(),u=At();if(c)if(c.version&&u!=="0.0.0"&&c.version!==u){console.error(`[STARTUP] Dashboard server version mismatch (running: ${c.version}, current: ${u}). Restarting...`);let l=!1;try{process.kill(c.pid,"SIGTERM"),l=!0}catch(d){d.code==="ESRCH"?l=!0:console.error(`[STARTUP] Could not kill outdated dashboard (PID ${c.pid}): ${d.message}`)}if(l)fr();else return{url:n.url,port:n.port,alreadyRunning:!0}}else return{url:n.url,port:n.port,alreadyRunning:!0}}let o=e?.port??oP,r=process.argv[1],i=(0,Tw.spawn)("node",[r,"dashboard","serve","--port",String(o),"--no-open"],{detached:!0,stdio:"ignore"}),s=!1,a=!1;i.on("error",c=>{s=!0,console.error(`[STARTUP] Failed to spawn dashboard server: ${c.message}`)}),i.on("exit",c=>{a=!0,c!==0&&c!==null&&console.error(`[STARTUP] Dashboard server exited prematurely (code ${c})`)}),i.unref();for(let c=0;c<sP;c++){if(await aP(iP),s||a)return null;let u=Fn();if(u&&await Yo(u.port))return{url:`http://oss.localhost:${u.port}`,port:u.port,alreadyRunning:!1}}if(console.error("[STARTUP] Dashboard server failed to start within 5 seconds"),i.pid)try{process.kill(i.pid,"SIGTERM")}catch(c){c.code!=="ESRCH"&&console.error(`[STARTUP] Failed to kill orphan dashboard process (PID ${i.pid}): ${c.message}`)}return null}var Tw,oP,iP,sP,xw=b(()=>{"use strict";Tw=require("child_process");Aa();Ng();Se();oP=3e3,iP=200,sP=25});var Ow={};ne(Ow,{countIssueListItems:()=>Cw,detectIssueList:()=>La,openInBrowser:()=>ja,parseIssueListPathFromConfig:()=>Pw,runStartup:()=>cP});function Pw(e){let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return;let o=t[1].match(/issueListPath:\s*["']?([^"'\n]+)["']?/);return o?o[1].trim():void 0}function Cw(e){let t=0,n=0,o=e.split(`
|
|
132
|
+
`),e.needsAddressingPRs.length>0){console.log("\u274C Needs Addressing:");for(let r of e.needsAddressingPRs)console.log(` - ${r.repo}#${r.number}: ${r.title}`),console.log(` ${r.displayLabel} ${r.displayDescription}`);console.log("")}if(e.waitingOnMaintainerPRs.length>0){console.log("\u23F3 Waiting on Maintainer:");for(let r of e.waitingOnMaintainerPRs)console.log(` - ${r.repo}#${r.number}: ${r.title}`),console.log(` ${r.displayDescription}`);console.log("")}if(e.recentlyMergedPRs.length>0){console.log("\u{1F389} Recently Merged:");for(let r of e.recentlyMergedPRs){let i=r.mergedAt?new Date(r.mergedAt).toLocaleDateString():"";console.log(` - ${r.repo}#${r.number}: ${r.title}${i?` (merged ${i})`:""}`)}console.log("")}if(e.recentlyClosedPRs.length>0){console.log("\u{1F6AB} Recently Closed:");for(let r of e.recentlyClosedPRs){let i=r.closedAt?new Date(r.closedAt).toLocaleDateString():"";console.log(` - ${r.repo}#${r.number}: ${r.title}${i?` (closed ${i})`:""}`)}console.log("")}if(e.autoUnshelvedPRs.length>0){console.log("\u{1F514} Auto-Unshelved:");for(let r of e.autoUnshelvedPRs)console.log(` - ${r.repo}#${r.number}: ${r.title} (${r.status.replace(/_/g," ")})`);console.log("")}if(e.shelvedPRs.length>0){console.log("\u{1F4E6} Shelved:");for(let r of e.shelvedPRs)console.log(` - ${r.repo}#${r.number}: ${r.title}`);console.log("")}let o=n.filter(r=>r.status==="new_response");if(o.length>0){console.log("\u{1F4AC} Issue Replies:");for(let r of o)console.log(` - ${r.repo}#${r.number}: ${r.title}`),console.log(` @${r.lastResponseAuthor}: ${r.lastResponseBody.slice(0,80)}${r.lastResponseBody.length>80?"...":""}`);console.log("")}console.log("Run with --json for structured output"),console.log('Run "dashboard serve" for browser view')}var jn,ER,B$,xR,J$=b(()=>{"use strict";Ue();$e();he();On();jn=new Set(["needs_addressing"]),ER=new Set(["needs_response","needs_changes","failing_ci","merge_conflict"]),B$=new Set(["dormant","approaching_dormant"]),xR=new Set(["needs_addressing","waiting_on_maintainer"])});function _g(e){let{repoScores:t,activePRCount:n}=e,o=0,r=0,i=[];for(let c of Object.values(t))o+=c.mergedPRCount,r+=c.closedWithoutMergeCount,c.mergedPRCount>0&&i.push({repo:c.repo,mergedCount:c.mergedPRCount});let s=o+r,a=s>0?o/s:0;return i.sort((c,u)=>u.mergedCount-c.mergedCount),{totalMerged:o,totalClosed:r,mergeRate:a,activePRs:n,reposContributed:i.length,topRepos:i.slice(0,10)}}var $g=b(()=>{"use strict"});async function wg(e,t,n){for(let o of RR)try{E(Mr,`Checking ${t}/${n} for template at ${o}`);let{data:r}=await e.repos.getContent({owner:t,repo:n,path:o});if(Array.isArray(r)){E(Mr,`${o} is a directory (multiple templates?), skipping`);continue}if(r.type!=="file"){E(Mr,`${o} is type "${r.type}", skipping`);continue}if(!r.content){E(Mr,`${o} has no content, skipping`);continue}let i=Buffer.from(r.content,"base64").toString("utf-8");return E(Mr,`Found PR template at ${o} (${i.length} chars)`),{template:i,source:o}}catch(r){if(He(r)===404)continue;if(De(r))throw r;let i=P(r);return v(Mr,`Error checking ${t}/${n}/${o}: ${i}`),{template:null,source:null,error:i}}return E(Mr,`No PR template found for ${t}/${n}`),{template:null,source:null}}var Mr,RR,Sg=b(()=>{"use strict";$e();he();Mr="pr-template",RR=[".github/PULL_REQUEST_TEMPLATE.md",".github/pull_request_template.md","docs/pull_request_template.md","pull_request_template.md"]});function AR(e){try{let t=tt.readFileSync(e,"utf-8");return JSON.parse(t)}catch(t){E(Ea,`Failed to parse ${e}: ${t instanceof Error?t.message:String(t)}`);return}}function DR(e){try{return tt.readFileSync(e,"utf-8")}catch(t){E(Ea,`Failed to read ${e}: ${t instanceof Error?t.message:String(t)}`);return}}function kg(e,t){for(let n of t)if(tt.existsSync(Ut.join(e,n)))return n}function UR(e){return AR(Ut.join(e,"package.json"))}function jR(e){if(!e?.scripts)return[];let t=[];for(let n of OR){let o=e.scripts[n];o&&t.push({name:n,command:o})}return t}function zR(e){return e?!!(e.devDependencies?.prettier||e.dependencies?.prettier):!1}function K$(e,t,n){let o=DR(Ut.join(e,t));return o?o.includes(n):!1}function xa(e){if(!tt.existsSync(e)||!tt.statSync(e).isDirectory())throw new Error(`Repository path does not exist or is not a directory: ${e}`);let t=[],n=UR(e),o=kg(e,["biome.json","biome.jsonc"]);o&&t.push({name:"biome",configPath:o,fixCommand:"npx @biomejs/biome check --write",checkCommand:"npx @biomejs/biome check",supportsFileArgs:!0});let r=kg(e,PR);r?t.push({name:"prettier",configPath:r,fixCommand:"npx prettier --write .",checkCommand:"npx prettier --check .",supportsFileArgs:!0}):zR(n)&&t.push({name:"prettier",configPath:"package.json",fixCommand:"npx prettier --write .",checkCommand:"npx prettier --check .",supportsFileArgs:!0});let i=kg(e,CR);i&&t.push({name:"eslint",configPath:i,fixCommand:"npx eslint --fix .",checkCommand:"npx eslint .",supportsFileArgs:!0}),tt.existsSync(Ut.join(e,"Cargo.toml"))&&t.push({name:"rustfmt",configPath:"Cargo.toml",fixCommand:"cargo fmt",checkCommand:"cargo fmt --check",supportsFileArgs:!1});let s=tt.existsSync(Ut.join(e,"pyproject.toml"));s&&K$(e,"pyproject.toml","[tool.ruff]")?t.push({name:"ruff",configPath:"pyproject.toml",fixCommand:"ruff format .",checkCommand:"ruff format --check .",supportsFileArgs:!0}):s&&K$(e,"pyproject.toml","[tool.black]")?t.push({name:"black",configPath:"pyproject.toml",fixCommand:"black .",checkCommand:"black --check .",supportsFileArgs:!0}):tt.existsSync(Ut.join(e,"ruff.toml"))&&t.push({name:"ruff",configPath:"ruff.toml",fixCommand:"ruff format .",checkCommand:"ruff format --check .",supportsFileArgs:!0}),tt.existsSync(Ut.join(e,"go.mod"))&&t.push({name:"gofmt",configPath:"go.mod",fixCommand:"gofmt -w .",checkCommand:"gofmt -d .",supportsFileArgs:!0}),tt.existsSync(Ut.join(e,".clang-format"))&&t.push({name:"clang-format",configPath:".clang-format",fixCommand:"clang-format -i",checkCommand:"clang-format --dry-run --Werror",supportsFileArgs:!0}),tt.existsSync(Ut.join(e,".rubocop.yml"))&&t.push({name:"rubocop",configPath:".rubocop.yml",fixCommand:"rubocop -a",checkCommand:"rubocop",supportsFileArgs:!0});let a=jR(n);return E(Ea,`Detected ${t.length} formatters in ${e}`),{formatters:t,packageJsonScripts:a,repoPath:e}}function Tg(e,t){if(!e.trim())return{isFormattingFailure:!1,evidence:[]};let n=[],o;for(let{formatter:i,patterns:s}of IR)for(let a of s){let c=e.match(a);c&&(n.push(c[0]),o||(o=i))}if(!o)return{isFormattingFailure:!1,evidence:[]};let r;if(t)try{let s=xa(t).formatters.find(a=>a.name===o);s&&(r=s.fixCommand)}catch(i){E(Ea,`Cross-reference failed for ${t}: ${i instanceof Error?i.message:String(i)}`)}return r||(r={prettier:"npx prettier --write .",eslint:"npx eslint --fix .",biome:"npx @biomejs/biome check --write",black:"black .",ruff:"ruff format .",rustfmt:"cargo fmt",gofmt:"gofmt -w .","clang-format":"clang-format -i",rubocop:"rubocop -a"}[o]),{isFormattingFailure:!0,formatter:o,fixCommand:r,evidence:n}}var tt,Ut,Ea,PR,CR,OR,IR,Eg=b(()=>{"use strict";tt=re(require("fs"),1),Ut=re(require("path"),1);$e();Ea="formatter-detection",PR=[".prettierrc",".prettierrc.json",".prettierrc.yml",".prettierrc.yaml",".prettierrc.json5",".prettierrc.js",".prettierrc.cjs",".prettierrc.mjs",".prettierrc.toml","prettier.config.js","prettier.config.cjs","prettier.config.mjs"],CR=[".eslintrc",".eslintrc.js",".eslintrc.cjs",".eslintrc.yml",".eslintrc.yaml",".eslintrc.json","eslint.config.js","eslint.config.cjs","eslint.config.mjs","eslint.config.ts"],OR=["lint:fix","format","fmt","lint","format:check","format:fix"],IR=[{formatter:"prettier",patterns:[/Code style issues found/i,/Forgot to run Prettier/i,/prettier --check/i]},{formatter:"ruff",patterns:[/ruff format.*--check/i,/ruff format.*would reformat/i]},{formatter:"black",patterns:[/Oh no! .* files? would be reformatted/i,/black --check/i]},{formatter:"rustfmt",patterns:[/Diff in .*\.rs/i,/rustfmt --check/i,/cargo fmt.*--check/i]},{formatter:"biome",patterns:[/biome check/i,/biome ci/i,/Found \d+ fixable diagnostics?/i]},{formatter:"eslint",patterns:[/eslint.*--fix/i,/eslint.*\d+ problems?/i]},{formatter:"gofmt",patterns:[/gofmt -d/i,/goimports/i]},{formatter:"clang-format",patterns:[/clang-format/i]},{formatter:"rubocop",patterns:[/rubocop.*offense/i,/rubocop -a/i]}]});var Se=b(()=>{"use strict";On();v$();V$();_a();q$();ha();Dn();Ue();he();$e();Ur();J$();$g();Sg();Eg();Dt()});var Og={};ne(Og,{compactActionableIssues:()=>Rg,compactRepoGroups:()=>Pg,deduplicateDigest:()=>xg,jsonError:()=>Q$,jsonSuccess:()=>Y$,outputJson:()=>oe,outputJsonError:()=>Cg,toCompactDailyOutput:()=>X$,toCompactStartupOutput:()=>GR});function X$(e){return{digest:e.digest,capacity:e.capacity,briefSummary:e.briefSummary,actionableIssues:e.actionableIssues,actionMenu:e.actionMenu,commentedIssues:e.commentedIssues,failureCount:e.failures.length}}function xg(e){let t=n=>n.map(o=>o.url);return{generatedAt:e.generatedAt,openPRs:e.openPRs,needsAddressingPRs:t(e.needsAddressingPRs),waitingOnMaintainerPRs:t(e.waitingOnMaintainerPRs),recentlyClosedPRs:e.recentlyClosedPRs,recentlyMergedPRs:e.recentlyMergedPRs,shelvedPRs:e.shelvedPRs,autoUnshelvedPRs:e.autoUnshelvedPRs,summary:e.summary}}function Rg(e){return e.map(t=>({type:t.type,prUrl:t.pr.url,label:t.label,isNewContribution:t.isNewContribution}))}function Pg(e){return e.map(t=>({repo:t.repo,prUrls:t.prs.map(n=>n.url)}))}function GR(e){let{daily:t,...n}=e;return{...n,daily:t?X$(t):void 0,dashboardUrl:e.dashboardUrl,issueList:e.issueList}}function Y$(e){return{success:!0,data:e,timestamp:new Date().toISOString()}}function Q$(e){return{success:!1,error:e,timestamp:new Date().toISOString()}}function oe(e){console.log(JSON.stringify(Y$(e),null,2))}function Cg(e){console.log(JSON.stringify(Q$(e),null,2))}var Jo=b(()=>{"use strict"});function ew(e,t,n,o){let r=e.summary||{totalActivePRs:0,totalMergedAllTime:0,mergeRate:0,totalNeedingAttention:0},i=t.config.minStars??50,s=n!==void 0?Math.max(n,r.totalMergedAllTime):r.totalMergedAllTime,a=Object.values(t.repoScores||{}).reduce((u,l)=>u+(Wt(l.stargazersCount,i)?0:l.closedWithoutMergeCount||0),0),c=o!==void 0?Math.max(o,a):a;return{activePRs:r.totalActivePRs,shelvedPRs:(e.shelvedPRs||[]).length,mergedPRs:s,closedPRs:c,mergeRate:`${(r.mergeRate??0).toFixed(1)}%`}}function Ig(e,t){let n={...e};for(let[o,r]of Object.entries(t))n[o]=r;return n}function Ag(e,t,n,o,r){let i=K(),s=i.getState();try{Object.keys(t).length>0&&i.setMonthlyMergedCounts(Ig(s.monthlyMergedCounts||{},t))}catch(a){v(Ae,`Failed to store monthly merged counts: ${P(a)}`)}try{Object.keys(n).length>0&&i.setMonthlyClosedCounts(Ig(s.monthlyClosedCounts||{},n))}catch(a){v(Ae,`Failed to store monthly closed counts: ${P(a)}`)}try{let a={...o};for(let[c,u]of Object.entries(r))a[c]=(a[c]||0)+u;for(let c of e)if(c.createdAt){let u=c.createdAt.slice(0,7);a[u]=(a[u]||0)+1}Object.keys(a).length>0&&i.setMonthlyOpenedCounts(Ig(s.monthlyOpenedCounts||{},a))}catch(a){v(Ae,`Failed to store monthly opened counts: ${P(a)}`)}}async function Dg(e){let t=K(),n=new Gr(e),o=new Lr(e),r=je(e),i=t.getState().config,s=Ra(t.getState()),a=t.getMergedPRWatermark(),c=t.getClosedPRWatermark(),[{prs:u,failures:l},d,p,g,y,S,U,T]=await Promise.all([n.fetchUserOpenPRs(),n.fetchRecentlyClosedPRs().catch(R=>{if(De(R))throw R;return v(Ae,`Failed to fetch recently closed PRs: ${P(R)}`),[]}),n.fetchRecentlyMergedPRs().catch(R=>{if(De(R))throw R;return v(Ae,`Failed to fetch recently merged PRs: ${P(R)}`),[]}),n.fetchUserMergedPRCounts(s).catch(R=>{if(De(R))throw R;return v(Ae,`Failed to fetch merged PR counts: ${P(R)}`),zr()}),n.fetchUserClosedPRCounts(s).catch(R=>{if(De(R))throw R;return v(Ae,`Failed to fetch closed PR counts: ${P(R)}`),zr()}),o.fetchCommentedIssues().catch(R=>{if(De(R))throw R;let G=P(R);return G.includes("No GitHub username configured")?v(Ae,`Issue conversation tracking requires setup: ${G}`):v(Ae,`Issue conversation fetch failed: ${G}`),{issues:[],failures:[{issueUrl:"N/A",error:`Issue conversation fetch failed: ${G}`}]}}),f$(r,i,a).catch(R=>{if(De(R))throw R;return v(Ae,`Failed to fetch merged PRs for storage: ${P(R)}`),[]}),h$(r,i,c).catch(R=>{if(De(R))throw R;return v(Ae,`Failed to fetch closed PRs for storage: ${P(R)}`),[]})]),L=S.issues;S.failures.length>0&&v(Ae,`${S.failures.length} issue conversation check(s) failed`),l.length>0&&v(Ae,`${l.length} PR fetch(es) failed`);try{t.batch(()=>{try{t.addMergedPRs(U)}catch(be){v(Ae,`Failed to store merged PRs: ${P(be)}`)}try{t.addClosedPRs(T)}catch(be){v(Ae,`Failed to store closed PRs: ${P(be)}`)}let{monthlyCounts:R,monthlyOpenedCounts:G}=g,{monthlyCounts:ee,monthlyOpenedCounts:q}=y;Ag(u,R,ee,G,q);let ae=n.generateDigest(u,d,p),Ge=new Set(t.getState().config.shelvedPRUrls||[]),ve=u.filter(be=>Ge.has(be.url)||be.stalenessTier==="dormant"&&be.status!=="needs_addressing");ae.shelvedPRs=ve.map(Yt),ae.autoUnshelvedPRs=[],ae.summary.totalActivePRs=u.length-ve.length,t.setLastDigest(ae)})}catch(R){v(Ae,`Failed to persist dashboard state: ${P(R)}`)}v(Ae,`Refreshed: ${u.length} PRs fetched`);let Z=Ug(t.getMergedPRs()),N=jg(t.getClosedPRs()),z=t.getState().lastDigest;if(!z)throw new Error("Dashboard data fetch failed: digest was not generated");return{digest:z,commentedIssues:L,allMergedPRs:Z,allClosedPRs:N}}function Ug(e){let t=[],n=0;for(let o of e){let r=Pe(o.url);if(!r){n++;continue}t.push({url:o.url,repo:`${r.owner}/${r.repo}`,number:r.number,title:o.title,mergedAt:o.mergedAt})}return n>0&&v(Ae,`Skipped ${n} stored merged PR(s) with unparseable URLs`),t}function jg(e){let t=[],n=0;for(let o of e){let r=Pe(o.url);if(!r){n++;continue}t.push({url:o.url,repo:`${r.owner}/${r.repo}`,number:r.number,title:o.title,closedAt:o.closedAt})}return n>0&&v(Ae,`Skipped ${n} stored closed PR(s) with unparseable URLs`),t}function tw(e,t){let n={};for(let r of e.openPRs||[])n[r.repo]||(n[r.repo]={active:0,merged:0,closed:0}),n[r.repo].active++;let o=t.config.minStars??50;for(let[r,i]of Object.entries(t.repoScores||{}))Wt(i.stargazersCount,o)||(n[r]||(n[r]={active:0,merged:0,closed:0}),n[r].merged=i.mergedPRCount,n[r].closed=i.closedWithoutMergeCount);return n}function rw(e,t=10){return Object.entries(e).sort((n,o)=>o[1].merged+o[1].active+o[1].closed-(n[1].merged+n[1].active+n[1].closed)).slice(0,t)}function nw(e){return{monthlyMerged:e.monthlyMergedCounts||{},monthlyClosed:e.monthlyClosedCounts||{},monthlyOpened:e.monthlyOpenedCounts||{}}}var Ae,zg=b(()=>{"use strict";Se();he();$e();ba();Ue();Dt();Ko();Ae="dashboard-data"});var Gg={};ne(Gg,{CRITICAL_STATUSES:()=>jn,applyStatusOverrides:()=>Nr,assessCapacity:()=>Vo,buildStarFilter:()=>Ra,collectActionableIssues:()=>Ho,computeActionMenu:()=>qo,computeRepoSignals:()=>Zo,executeDailyCheck:()=>Pa,formatBriefSummary:()=>Bo,formatSummary:()=>Wo,groupPRsByRepo:()=>Mo,printDigest:()=>yg,runDaily:()=>VR,runDailyForDisplay:()=>HR,toShelvedPRRef:()=>Yt});function Ra(e){let t=e.config.minStars??50,n=new Map;for(let[o,r]of Object.entries(e.repoScores))r.stargazersCount!==void 0&&n.set(o,r.stargazersCount);if(n.size!==0)return{minStars:t,knownStarCounts:n}}async function FR(e,t){let{prs:n,failures:o}=await e.fetchUserOpenPRs();o.length>0&&v(le,`${o.length} PR fetch(es) failed`);let r=K().getState(),i=Ra(r),s=new Lr(t),[a,c,u,l,d]=await Promise.all([e.fetchUserMergedPRCounts(i).catch(Z=>{if(De(Z))throw Z;return v(le,`Failed to fetch merged PR counts: ${P(Z)}`),zr()}),e.fetchUserClosedPRCounts(i).catch(Z=>{if(De(Z))throw Z;return v(le,`Failed to fetch closed PR counts: ${P(Z)}`),zr()}),e.fetchRecentlyClosedPRs().catch(Z=>{if(De(Z))throw Z;return v(le,`Failed to fetch recently closed PRs: ${P(Z)}`),[]}),e.fetchRecentlyMergedPRs().catch(Z=>{if(De(Z))throw Z;return v(le,`Failed to fetch recently merged PRs: ${P(Z)}`),[]}),s.fetchCommentedIssues().catch(Z=>{if(De(Z))throw Z;let N=P(Z);return N.includes("No GitHub username configured")?v(le,`Issue conversation tracking requires setup: ${N}`):v(le,`Issue conversation fetch failed: ${N}`),{issues:[],failures:[{issueUrl:"N/A",error:`Issue conversation fetch failed: ${N}`}]}})]),p=d.issues;d.failures.length>0&&v(le,`${d.failures.length} issue conversation check(s) failed`);let{repos:g,monthlyCounts:y,monthlyOpenedCounts:S}=a,{repos:U,monthlyCounts:T,monthlyOpenedCounts:L}=c;return{prs:n,failures:o,mergedCounts:g,closedCounts:U,monthlyCounts:y,monthlyClosedCounts:T,openedFromMerged:S,openedFromClosed:L,recentlyClosedPRs:u,recentlyMergedPRs:l,commentedIssues:p}}async function LR(e,t,n,o){let r=K();try{r.batch(()=>{let a=Object.values(r.getState().repoScores).filter(g=>g.mergedPRCount>0);if(n.size===0&&a.length>0)v(le,`Skipping stale repo reset: API returned 0 merged PR results but state has ${a.length} repo(s) with merges. Possible API issue.`);else for(let g of Object.values(r.getState().repoScores))n.has(g.repo)||r.updateRepoScore(g.repo,{mergedPRCount:0});let c=0;for(let[g,{count:y,lastMergedAt:S}]of n)try{r.updateRepoScore(g,{mergedPRCount:y,lastMergedAt:S||void 0})}catch(U){c++,v(le,`Failed to update merged count for ${g}: ${P(U)}`)}c===n.size&&n.size>0&&v(le,`[ALL_MERGED_COUNT_UPDATES_FAILED] All ${n.size} merged count update(s) failed.`);let u=Object.values(r.getState().repoScores).filter(g=>(g.closedWithoutMergeCount||0)>0);o.size===0&&u.length>0&&v(le,`API returned 0 closed PR results but state has ${u.length} repo(s) with closed PRs. Possible transient API issue.`);let l=0;for(let[g,y]of o)try{r.updateRepoScore(g,{closedWithoutMergeCount:y})}catch(S){l++,v(le,`Failed to update closed count for ${g}: ${P(S)}`)}l===o.size&&o.size>0&&v(le,`[ALL_CLOSED_COUNT_UPDATES_FAILED] All ${o.size} closed count update(s) failed.`);let d=Zo(t),p=0;for(let[g,y]of d)try{r.updateRepoScore(g,{signals:y})}catch(S){p++,v(le,`Failed to update signals for ${g}: ${P(S)}`)}p===d.size&&d.size>0&&v(le,`[ALL_SIGNAL_UPDATES_FAILED] All ${d.size} signal update(s) failed. This may indicate corrupted state.`)})}catch(a){v(le,`Failed to persist repo score updates: ${P(a)}`)}let i=Object.keys(r.getState().repoScores),s;try{s=await e.fetchRepoMetadata(i)}catch(a){if(De(a))throw a;v(le,`Failed to fetch repo metadata: ${P(a)}`),v(le,"Repos without cached metadata will be excluded from dashboard stats and metadata badges until fetched on the next successful run."),s=new Map}try{r.batch(()=>{let a=0;for(let[u,{stars:l,language:d}]of s)try{r.updateRepoScore(u,{stargazersCount:l,language:d})}catch(p){a++,v(le,`Failed to update metadata for ${u}: ${P(p)}`)}a===s.size&&s.size>0&&v(le,`[ALL_METADATA_UPDATES_FAILED] All ${s.size} metadata update(s) failed.`);let c=0;for(let[u]of n)try{r.addTrustedProject(u)}catch(l){c++,v(le,`Failed to sync trusted project ${u}: ${P(l)}`)}c===n.size&&n.size>0&&v(le,`[ALL_TRUST_SYNCS_FAILED] All ${n.size} trusted project sync(s) failed. This may indicate corrupted state.`)})}catch(a){v(le,`Failed to persist metadata/trust updates: ${P(a)}`)}}function NR(e,t,n,o){let r=K(),i=Nr(t,r.getState()),s=[],a=[],c=[];try{r.batch(()=>{for(let d of i)r.isPRShelved(d.url)?jn.has(d.status)?(r.unshelvePR(d.url),a.push(Yt(d)),c.push(d)):s.push(Yt(d)):d.stalenessTier==="dormant"&&!jn.has(d.status)?s.push(Yt(d)):c.push(d);let l=e.generateDigest(i,n,o);l.shelvedPRs=s,l.autoUnshelvedPRs=a,l.summary.totalActivePRs=c.length,r.setLastDigest(l)})}catch(l){v(le,`Failed to persist partition state: ${P(l)}`)}let u=r.getState().lastDigest;return{activePRs:c,shelvedPRs:s,autoUnshelvedPRs:a,digest:u}}function MR(e,t,n,o,r,i){let s=K(),a=Vo(t,s.getState().config.maxActivePRs,n.length),c=[];try{s.batch(()=>{c=o.filter(S=>{let U=s.getIssueDismissedAt(S.url);if(!U)return!0;if(S.status==="new_response"){let T=new Date(S.lastResponseAt).getTime(),L=new Date(U).getTime();if(isNaN(T)||isNaN(L))return v(le,`Invalid timestamp in dismiss check for ${S.url}, including issue`),!0;if(T>L){v(le,`Auto-undismissing issue ${S.url}: new response at ${S.lastResponseAt} after dismiss at ${U}`);try{s.undismissIssue(S.url)}catch(Z){v(le,`Failed to persist auto-undismiss for ${S.url}: ${P(Z)}`)}return!0}}return!1})})}catch(S){v(le,`Failed to persist auto-undismiss state: ${P(S)}`)}let u=c.filter(S=>S.status==="new_response"),l=Wo(e,a,u),d=Ho(t,i);e.summary.totalNeedingAttention=d.length;let p=Bo(e,d.length,u.length),g=qo(d,a,c),y=Mo(t);return{digest:e,capacity:a,summary:l,briefSummary:p,actionableIssues:d,actionMenu:g,commentedIssues:c,repoGroups:y,failures:r}}function ZR(e){return{digest:xg(e.digest),capacity:e.capacity,summary:e.summary,briefSummary:e.briefSummary,actionableIssues:Rg(e.actionableIssues),actionMenu:e.actionMenu,commentedIssues:e.commentedIssues,repoGroups:Pg(e.repoGroups),failures:e.failures}}async function Pa(e){let t=await ow(e);return ZR(t)}async function ow(e){let t=new Gr(e),{prs:n,failures:o,mergedCounts:r,closedCounts:i,monthlyCounts:s,monthlyClosedCounts:a,openedFromMerged:c,openedFromClosed:u,recentlyClosedPRs:l,recentlyMergedPRs:d,commentedIssues:p}=await FR(t,e);await LR(t,n,r,i);try{K().batch(()=>{Ag(n,s,a,c,u)})}catch(T){v(le,`Failed to persist monthly analytics: ${P(T)}`)}let g=K().getState().lastDigestAt,{activePRs:y,shelvedPRs:S,digest:U}=NR(t,n,l,d);return MR(U,y,S,p,o,g)}async function VR(){let e=Ie();return Pa(e)}async function HR(){let e=Ie();return ow(e)}var le,Ko=b(()=>{"use strict";Se();he();$e();ba();zg();Jo();Se();le="daily"});var iw={};ne(iw,{runStatus:()=>qR});async function qR(e){let t=K(),n=t.getStats(),o=t.getState(),r=o.lastDigestAt||o.lastRunAt,{totalTracked:i,...s}=n,a={stats:s,lastRunAt:o.lastRunAt};return e.offline&&(a.offline=!0,a.lastUpdated=r),a}var sw=b(()=>{"use strict";Se()});var aw={};ne(aw,{runSearch:()=>BR});async function BR(e){let t=Ie(),n=new Kt(t),o=await n.searchIssues({maxResults:e.maxResults}),r=K(),{config:i}=r.getState(),s=i.excludeRepos||[],a=i.aiPolicyBlocklist??Rn.aiPolicyBlocklist??[],c={candidates:o.map(u=>{let l=r.getRepoScore(u.issue.repo);return{issue:{repo:u.issue.repo,repoUrl:`https://github.com/${u.issue.repo}`,number:u.issue.number,title:u.issue.title,url:u.issue.url,labels:u.issue.labels},recommendation:u.recommendation,reasonsToApprove:u.reasonsToApprove,reasonsToSkip:u.reasonsToSkip,searchPriority:u.searchPriority,viabilityScore:u.viabilityScore,repoScore:l?{score:l.score,mergedPRCount:l.mergedPRCount,closedWithoutMergeCount:l.closedWithoutMergeCount,isResponsive:l.signals?.isResponsive??!1,lastMergedAt:l.lastMergedAt}:void 0}}),excludedRepos:s,aiPolicyBlocklist:a};return n.rateLimitWarning&&(c.rateLimitWarning=n.rateLimitWarning),c}var cw=b(()=>{"use strict";Se()});function qe(e,t,n){if(t.test(e))return;let o={PR:"https://github.com/owner/repo/pull/123",issue:"https://github.com/owner/repo/issues/123","issue or PR":"https://github.com/owner/repo/issues/123 or https://github.com/owner/repo/pull/123"};throw new fe(`Invalid ${n} URL: ${e}. Expected format: ${o[n]}`)}function ze(e){if(e.length>uw)throw new fe(`URL exceeds maximum length of ${uw} characters`);return e}function Fg(e){if(e.length>lw)throw new fe(`Message exceeds maximum length of ${lw} characters`);return e}function zn(e){if(!e||e.trim().length===0)throw new fe("GitHub username cannot be empty.");let t=e.trim();if(t.length>dw)throw new fe(`GitHub username must be at most ${dw} characters (got ${t.length}).`);if(!WR.test(t))throw new fe("GitHub username can only contain alphanumeric characters and hyphens.");if(t.startsWith("-"))throw new fe("GitHub username cannot start with a hyphen.");if(t.endsWith("-"))throw new fe("GitHub username cannot end with a hyphen.");if(JR.test(t))throw new fe("GitHub username cannot contain consecutive hyphens.");return t}var Qt,er,pw,uw,lw,dw,WR,JR,St=b(()=>{"use strict";he();Qt=/^https:\/\/github\.com\/[^/]+\/[^/]+\/pull\/\d+$/,er=/^https:\/\/github\.com\/[^/]+\/[^/]+\/issues\/\d+$/,pw=/^https:\/\/github\.com\/[^/]+\/[^/]+\/(issues|pull)\/\d+$/,uw=2048,lw=1e3;dw=39,WR=/^[a-zA-Z0-9-]+$/,JR=/--/});var mw={};ne(mw,{runVet:()=>KR});async function KR(e){ze(e.issueUrl),qe(e.issueUrl,er,"issue");let t=Ie(),o=await new Kt(t).vetIssue(e.issueUrl);return{issue:{repo:o.issue.repo,number:o.issue.number,title:o.issue.title,url:o.issue.url,labels:o.issue.labels},recommendation:o.recommendation,reasonsToApprove:o.reasonsToApprove,reasonsToSkip:o.reasonsToSkip,projectHealth:o.projectHealth,vettingResult:o.vettingResult}}var gw=b(()=>{"use strict";Se();St()});function Xo(){return hw.join(vt(),"dashboard-server.pid")}function Oa(e){Gn.writeFileSync(Xo(),JSON.stringify(e),{mode:384})}function Fn(){try{let e=Gn.readFileSync(Xo(),"utf-8"),t=JSON.parse(e);return typeof t!="object"||t===null||typeof t.pid!="number"||!Number.isInteger(t.pid)||t.pid<=0||typeof t.port!="number"||typeof t.startedAt!="string"?(v(Ca,"PID file has invalid structure, ignoring"),null):t}catch(e){return e.code!=="ENOENT"&&v(Ca,`Failed to read PID file: ${e.message}`),null}}function fr(){try{Gn.unlinkSync(Xo())}catch(e){e.code!=="ENOENT"&&v(Ca,`Failed to remove PID file: ${e.message}`)}}function Yo(e){return new Promise(t=>{let n=fw.get(`http://127.0.0.1:${e}/api/data`,{timeout:2e3},o=>{o.resume(),t(o.statusCode===200)});n.on("error",()=>t(!1)),n.on("timeout",()=>{n.destroy(),t(!1)})})}async function Ia(){let e=Fn();if(!e)return null;try{process.kill(e.pid,0)}catch(t){let n=t.code;return n!=="ESRCH"&&n!=="EPERM"&&v(Ca,`Unexpected error checking PID ${e.pid}: ${t.message}`),fr(),null}return await Yo(e.port)?{port:e.port,url:`http://oss.localhost:${e.port}`}:(fr(),null)}var fw,Gn,hw,Ca,Aa=b(()=>{"use strict";fw=re(require("http"),1),Gn=re(require("fs"),1),hw=re(require("path"),1);Se();$e();Ca="dashboard-server"});var Ln,vw=b(()=>{"use strict";Ln=class{maxRequests;windowMs;timestamps=[];constructor(t){this.maxRequests=t.maxRequests,this.windowMs=t.windowMs}check(){let t=Date.now(),n=t-this.windowMs;if(this.timestamps=this.timestamps.filter(o=>o>n),this.timestamps.length>=this.maxRequests){let r=this.timestamps[0]+this.windowMs-t;return{allowed:!1,retryAfterSeconds:Math.ceil(r/1e3)}}return this.timestamps.push(t),{allowed:!0}}}});var Zr={};ne(Zr,{VALID_TARGETS:()=>Lg,runMove:()=>XR});async function XR(e){ze(e.prUrl),qe(e.prUrl,Qt,"PR");let t=e.target;if(!Lg.includes(t))throw new Error(`Invalid target "${e.target}". Must be one of: ${Lg.join(", ")}`);let n=K();switch(t){case"attention":case"waiting":{let o=t==="attention"?"needs_addressing":"waiting_on_maintainer",r=t==="attention"?"Need Attention":"Waiting on Maintainer",i=new Date().toISOString();return n.batch(()=>{n.setStatusOverride(e.prUrl,o,i),n.unshelvePR(e.prUrl)}),{url:e.prUrl,target:t,description:`Moved to ${r}`}}case"shelved":return n.batch(()=>{n.shelvePR(e.prUrl),n.clearStatusOverride(e.prUrl)}),{url:e.prUrl,target:t,description:"Shelved \u2014 excluded from capacity and actionable items"};case"auto":return n.batch(()=>{n.clearStatusOverride(e.prUrl),n.unshelvePR(e.prUrl)}),{url:e.prUrl,target:t,description:"Reset to computed status"};default:{let o=t;throw new Error(`Unhandled move target: ${o}`)}}}var Lg,Vr=b(()=>{"use strict";Se();St();Lg=["attention","waiting","shelved","auto"]});var ww={};ne(ww,{findRunningDashboardServer:()=>Ia,getDashboardPidPath:()=>Xo,isDashboardServerRunning:()=>Yo,readDashboardServerInfo:()=>Fn,removeDashboardServerInfo:()=>fr,startDashboardServer:()=>rP,writeDashboardServerInfo:()=>Oa});function Qo(e,t,n,o,r){let i=tw(e,t),s=rw(i),{monthlyMerged:a,monthlyOpened:c,monthlyClosed:u}=nw(t),l=o??Ug(K().getMergedPRs()),d=r??jg(K().getClosedPRs()),p=t.config.minStars??50,g=t.repoScores||{},y=z=>!Wt(g[z.repo]?.stargazersCount,p),S=l.filter(y),U=d.filter(y),T=ew(e,t,S.length,U.length),L=t.config.dismissedIssues||{},Z=n.filter(z=>z.status==="new_response"&&!(z.url in L)),N={};for(let[z,R]of Object.entries(g))(R.stargazersCount!==void 0||R.language!==void 0)&&(N[z]={stars:R.stargazersCount,language:R.language});return{stats:T,prsByRepo:i,topRepos:s.map(([z,R])=>({repo:z,...R})),monthlyMerged:a,monthlyOpened:c,monthlyClosed:u,activePRs:Nr(e.openPRs||[],t),shelvedPRUrls:t.config.shelvedPRUrls||[],recentlyMergedPRs:e.recentlyMergedPRs||[],recentlyClosedPRs:e.recentlyClosedPRs||[],autoUnshelvedPRs:e.autoUnshelvedPRs||[],commentedIssues:n,issueResponses:Z,allMergedPRs:S,allClosedPRs:U,repoMetadata:N}}function tP(e,t=YR){return new Promise((n,o)=>{let r=[],i=0,s=!1;e.on("data",a=>{if(!s){if(i+=a.length,i>t){s=!0,e.destroy(),o(new Error("Body too large"));return}r.push(a)}}),e.on("end",()=>{s||n(Buffer.concat(r).toString("utf-8"))}),e.on("error",a=>{s||o(a)})})}function $w(e){e.setHeader("X-Content-Type-Options","nosniff"),e.setHeader("X-Frame-Options","DENY"),e.setHeader("Content-Security-Policy","default-src 'self'; script-src 'self' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self'"),e.setHeader("Referrer-Policy","strict-origin-when-cross-origin")}function yw(e,t){let n=e.headers.origin;return n?[`http://localhost:${t}`,`http://127.0.0.1:${t}`,`http://oss.localhost:${t}`].includes(n):!0}function Da(e,t,n){$w(e),e.setHeader("Cache-Control","no-store");let o=JSON.stringify(n);e.writeHead(t,{"Content-Type":"application/json","Content-Length":Buffer.byteLength(o)}),e.end(o)}function xe(e,t,n){Da(e,t,{error:n})}async function rP(e){let{port:t,assetsDir:n,token:o,open:r}=e,i=K(),s=jt.resolve(n),a=i.getState().lastDigest,c=[];if(!a)throw new Error("No dashboard data available. Run the daily check first: GITHUB_TOKEN=$(gh auth token) npm start -- daily");let u;try{u=Qo(a,i.getState(),c)}catch(z){throw new Error(`Failed to build dashboard data: ${P(z)}. State data may be corrupted \u2014 try running: daily --json`,{cause:z})}let l=new Ln({maxRequests:30,windowMs:6e4}),d=new Ln({maxRequests:10,windowMs:6e4}),p=new Ln({maxRequests:6,windowMs:6e4}),g=_w.createServer(async(z,R)=>{let G=z.method||"GET",ee=z.url||"/";try{if(ee==="/api/data"&&G==="GET"){let q=l.check();if(!q.allowed){R.setHeader("Retry-After",String(q.retryAfterSeconds)),xe(R,429,"Too many requests");return}if(i.reloadIfChanged())try{u=Qo(a,i.getState(),c)}catch(ae){v(rt,`Failed to rebuild dashboard data after state reload: ${P(ae)}`)}Da(R,200,u);return}if(ee==="/api/action"&&G==="POST"){if(!yw(z,L)){xe(R,403,"Invalid origin");return}let q=d.check();if(!q.allowed){R.setHeader("Retry-After",String(q.retryAfterSeconds)),xe(R,429,"Too many requests");return}await y(z,R);return}if(ee==="/api/refresh"&&G==="POST"){if(!yw(z,L)){xe(R,403,"Invalid origin");return}let q=p.check();if(!q.allowed){R.setHeader("Retry-After",String(q.retryAfterSeconds)),xe(R,429,"Too many requests");return}await S(z,R);return}if(G==="GET"){U(ee,R);return}xe(R,405,"Method not allowed")}catch(q){v(rt,`Unhandled request error: ${G} ${ee} ${P(q)}`),R.headersSent||xe(R,500,"Internal server error")}});g.requestTimeout=QR;async function y(z,R){i.reloadIfChanged();let G;try{let q=await tP(z);G=JSON.parse(q)}catch(q){let ae=q instanceof Error&&q.message==="Body too large";xe(R,ae?413:400,ae?"Request body too large":"Invalid JSON body");return}if(!G.action||!bw.has(G.action)){xe(R,400,`Invalid action. Must be one of: ${[...bw].join(", ")}`);return}if(!G.url||typeof G.url!="string"){xe(R,400,'Missing or invalid "url" field');return}let ee=G.action==="dismiss_issue_response";try{ze(G.url),qe(G.url,ee?er:Qt,ee?"issue":"PR")}catch(q){q instanceof fe?xe(R,400,q.message):(v(rt,`Unexpected error during URL validation: ${P(q)}`),xe(R,400,"Invalid URL"));return}try{if(G.action==="move"){let{VALID_TARGETS:q,runMove:ae}=await Promise.resolve().then(()=>(Vr(),Zr));if(!G.target||!q.includes(G.target)){xe(R,400,`move requires a valid "target" field (${q.join(", ")})`);return}await ae({prUrl:G.url,target:G.target})}else i.dismissIssue(G.url,new Date().toISOString())}catch(q){v(rt,`Action failed: ${G.action} ${G.url} ${P(q)}`),xe(R,500,"Action failed");return}u=Qo(a,i.getState(),c),Da(R,200,u)}async function S(z,R){let G=o||Bt();if(!G){xe(R,401,"No GitHub token available. Cannot refresh data.");return}try{i.reloadIfChanged(),v(rt,"Refreshing dashboard data from GitHub...");let ee=await Dg(G);a=ee.digest,c=ee.commentedIssues,u=Qo(a,i.getState(),c,ee.allMergedPRs,ee.allClosedPRs),Da(R,200,u)}catch(ee){v(rt,`Dashboard refresh failed: ${P(ee)}`),xe(R,500,"Refresh failed")}}function U(z,R){let G;try{G=decodeURIComponent(z.split("?")[0])}catch{v(rt,`Malformed URL received: ${z}`),xe(R,400,"Malformed URL");return}if(G.includes("..")){xe(R,403,"Forbidden");return}let ee=G==="/"?"index.html":G.replace(/^\/+/,""),q=jt.join(s,ee);if(!q.startsWith(s+jt.sep)&&q!==s){xe(R,403,"Forbidden");return}try{Ua.statSync(q).isDirectory()&&(q=jt.join(s,"index.html"))}catch(ve){if(ve.code==="ENOENT")q=jt.join(s,"index.html");else{v(rt,`Failed to stat file: ${q}`),xe(R,500,"Internal server error");return}}let ae=jt.extname(q).toLowerCase(),Ge=eP[ae]||"application/octet-stream";try{let ve=Ua.readFileSync(q);$w(R),R.writeHead(200,{"Content-Type":Ge,"Content-Length":ve.length,"Cache-Control":"public, max-age=3600"}),R.end(ve)}catch(ve){ve.code==="ENOENT"?xe(R,404,"Not found"):(v(rt,`Failed to serve static file: ${q}`),xe(R,500,"Failed to read file"))}}let T=10,L=t;for(let z=0;z<T;z++)try{await new Promise((R,G)=>{g.once("error",G),g.listen(L,"127.0.0.1",()=>R())});break}catch(R){let G=R;if(G.code==="EADDRINUSE"&&z<T-1){v(rt,`Port ${L} is in use, trying ${L+1}...`),L++;continue}throw new Error(`Failed to start server: ${G.message}`,{cause:R})}Oa({pid:process.pid,port:L,startedAt:new Date().toISOString(),version:At()});let Z=`http://oss.localhost:${L}`;v(rt,`Dashboard server running at ${Z} (also: http://localhost:${L})`),o&&Dg(o).then(z=>{i.reloadIfChanged(),a=z.digest,c=z.commentedIssues,u=Qo(a,i.getState(),c,z.allMergedPRs,z.allClosedPRs),v(rt,"Background data refresh complete")}).catch(z=>{v(rt,`Background data refresh failed (serving cached data): ${P(z)}`)}),r&&ja(Z);let N=()=>{v(rt,"Shutting down dashboard server..."),fr(),g.close(()=>{process.exit(0)}),setTimeout(()=>process.exit(0),3e3).unref()};process.on("SIGINT",N),process.on("SIGTERM",N)}var _w,Ua,jt,bw,rt,YR,QR,eP,Sw=b(()=>{"use strict";_w=re(require("http"),1),Ua=re(require("fs"),1),jt=re(require("path"),1);Se();he();$e();St();zg();za();Aa();vw();Dt();Aa();bw=new Set(["move","dismiss_issue_response"]),rt="dashboard-server",YR=10240,QR=3e4,eP={".html":"text/html",".js":"application/javascript",".css":"text/css",".svg":"image/svg+xml",".json":"application/json",".png":"image/png",".ico":"image/x-icon"}});var kw={};ne(kw,{resolveAssetsDir:()=>Fa,serveDashboard:()=>nP});function Fa(){let e=kt.resolve(__dirname,"../../dashboard/dist");if(Ga.existsSync(kt.join(e,"index.html")))return e;let t=kt.resolve(kt.dirname(process.argv[1]),"../../dashboard/dist");if(Ga.existsSync(kt.join(t,"index.html")))return t;try{let n=require.resolve("@oss-autopilot/dashboard/package.json"),o=kt.join(kt.dirname(n),"dist");if(Ga.existsSync(kt.join(o,"index.html")))return o}catch(n){n.code!=="MODULE_NOT_FOUND"&&console.error("Error resolving dashboard package:",n)}return null}async function nP(e){let t=Fa();t||(console.error("Could not find dashboard SPA assets."),console.error("Make sure packages/dashboard has been built:"),console.error(" cd packages/dashboard && pnpm run build"),process.exit(1));let n=Bt(),{startDashboardServer:o}=await Promise.resolve().then(()=>(Sw(),ww));await o({port:e.port,assetsDir:t,token:n,open:e.open})}var Ga,kt,Ng=b(()=>{"use strict";Ga=re(require("fs"),1),kt=re(require("path"),1);Se()});function aP(e){return new Promise(t=>setTimeout(t,e))}async function Ew(e){if(!Fa())return null;let n=await Ia();if(n){let c=Fn(),u=At();if(c)if(c.version&&u!=="0.0.0"&&c.version!==u){console.error(`[STARTUP] Dashboard server version mismatch (running: ${c.version}, current: ${u}). Restarting...`);let l=!1;try{process.kill(c.pid,"SIGTERM"),l=!0}catch(d){d.code==="ESRCH"?l=!0:console.error(`[STARTUP] Could not kill outdated dashboard (PID ${c.pid}): ${d.message}`)}if(l)fr();else return{url:n.url,port:n.port,alreadyRunning:!0}}else return{url:n.url,port:n.port,alreadyRunning:!0}}let o=e?.port??oP,r=process.argv[1],i=(0,Tw.spawn)("node",[r,"dashboard","serve","--port",String(o),"--no-open"],{detached:!0,stdio:"ignore"}),s=!1,a=!1;i.on("error",c=>{s=!0,console.error(`[STARTUP] Failed to spawn dashboard server: ${c.message}`)}),i.on("exit",c=>{a=!0,c!==0&&c!==null&&console.error(`[STARTUP] Dashboard server exited prematurely (code ${c})`)}),i.unref();for(let c=0;c<sP;c++){if(await aP(iP),s||a)return null;let u=Fn();if(u&&await Yo(u.port))return{url:`http://oss.localhost:${u.port}`,port:u.port,alreadyRunning:!1}}if(console.error("[STARTUP] Dashboard server failed to start within 5 seconds"),i.pid)try{process.kill(i.pid,"SIGTERM")}catch(c){c.code!=="ESRCH"&&console.error(`[STARTUP] Failed to kill orphan dashboard process (PID ${i.pid}): ${c.message}`)}return null}var Tw,oP,iP,sP,xw=b(()=>{"use strict";Tw=require("child_process");Aa();Ng();Se();oP=3e3,iP=200,sP=25});var Ow={};ne(Ow,{countIssueListItems:()=>Cw,detectIssueList:()=>La,openInBrowser:()=>ja,parseIssueListPathFromConfig:()=>Pw,runStartup:()=>cP});function Pw(e){let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return;let o=t[1].match(/issueListPath:\s*["']?([^"'\n]+)["']?/);return o?o[1].trim():void 0}function Cw(e){let t=0,n=0,o=e.split(`
|
|
133
133
|
`);for(let r of o)/^\s*- (?:~~)?\[/.test(r)&&(/~~|\*\*Done\*\*/.test(r)?n++:t++);return{availableCount:t,completedCount:n}}function La(){let e="",t="auto-detected";try{let o=K().getState().config.issueListPath;o&&hr.existsSync(o)&&(e=o,t="configured")}catch(n){v("startup",`Could not read issueListPath from state: ${P(n)}`)}if(!e){let n=".claude/oss-autopilot/config.md";if(hr.existsSync(n))try{let o=hr.readFileSync(n,"utf-8"),r=Pw(o);r&&hr.existsSync(r)&&(e=r,t="configured")}catch(o){console.error("[STARTUP] Failed to read config:",P(o))}}if(!e){let n=["open-source/potential-issue-list.md","oss/issue-list.md","issues.md"];for(let o of n)if(hr.existsSync(o)){e=o,t="auto-detected";break}}if(e)try{let n=hr.readFileSync(e,"utf-8"),{availableCount:o,completedCount:r}=Cw(n);return{path:e,source:t,availableCount:o,completedCount:r}}catch(n){return console.error(`[STARTUP] Failed to read issue list at ${e}:`,P(n)),{path:e,source:t,availableCount:0,completedCount:0}}}function ja(e){let t,n;switch(process.platform){case"darwin":t="open",n=[e];break;case"win32":t="cmd",n=["/c","start","",e];break;default:t="xdg-open",n=[e];break}(0,Rw.execFile)(t,n,o=>{o&&console.error(`[STARTUP] Failed to open dashboard in browser: ${o.message}`)})}async function cP(){let e=At(),t=K(),n=!1;if(!t.isSetupComplete()){let c=await Xs();if(c)try{t.initializeWithDefaults(c),n=!0}catch(u){return console.error(`[STARTUP] Auto-detected username "${c}" but failed to save config:`,P(u)),{version:e,setupComplete:!1}}else return{version:e,setupComplete:!1}}let o=Bt();if(!o)return{version:e,setupComplete:!0,authError:'GitHub authentication required. Install GitHub CLI (https://cli.github.com/) and run "gh auth login", or set GITHUB_TOKEN.'};let r=await Pa(o),i,s=!1;if(r.digest.summary.totalActivePRs>0)try{let c=await Ew();c?(i=c.url,ja(c.url),s=!0):console.error("[STARTUP] Dashboard SPA assets not found. Build with: cd packages/dashboard && pnpm run build")}catch(c){console.error("[STARTUP] SPA dashboard launch failed:",P(c))}s&&(r.briefSummary+=" | Dashboard opened in browser");let a=La();return{version:e,setupComplete:!0,autoDetected:n,daily:r,dashboardUrl:i,issueList:a}}var hr,Rw,za=b(()=>{"use strict";hr=re(require("fs"),1),Rw=require("child_process");Se();he();$e();Ko();xw()});var Mg={};ne(Mg,{parseIssueList:()=>Aw,runParseList:()=>pP});function uP(e){let t=e.match(/https:\/\/github\.com\/([^/]+\/[^/]+)\/issues\/(\d+)/);if(t)return{repo:t[1],number:parseInt(t[2],10),url:t[0]};let n=e.match(/https:\/\/github\.com\/([^/]+\/[^/]+)\/pull\/(\d+)/);return n?{repo:n[1],number:parseInt(n[2],10),url:n[0]}:null}function lP(e){let t=e.replace(/\[([^\]]+)\]\([^)]+\)/g,"$1");return t=t.replace(/https?:\/\/\S+/g,""),t=t.replace(/^\s*[-*+]\s*/,"").replace(/^\s*\d+\.\s*/,""),t=t.replace(/\[[ xX]\]\s*/,""),t=t.replace(/~~/g,""),t=t.replace(/\b(Done|DONE|done)\b/g,""),t=t.replace(/^[\s\-\u2013\u2014:]+/,"").replace(/[\s\-\u2013\u2014:]+$/,""),t.trim()}function dP(e){return!!(/~~.+~~/.test(e)||/\[[xX]\]/.test(e)||/\bdone\b/i.test(e))}function Aw(e){let t=e.split(`
|
|
134
134
|
`),n=[],o=[],r="Uncategorized";for(let i of t){let s=i.match(/^#{1,3}\s+(.+)/);if(s){r=s[1].trim();continue}if(!i.trim()||!/^\s*[-*+]|\s*\d+\.|\s*\[[ xX]\]/.test(i))continue;let a=uP(i);if(!a)continue;let c=lP(i),u={repo:a.repo,number:a.number,title:c||`#${a.number}`,tier:r,url:a.url};dP(i)?o.push(u):n.push(u)}return{available:n,completed:o,availableCount:n.length,completedCount:o.length}}async function pP(e){let t=Iw.resolve(e.filePath);if(!Na.existsSync(t))throw new Error(`File not found: ${t}`);let n;try{n=Na.readFileSync(t,"utf-8")}catch(o){let r=P(o);throw new Error(`Failed to read file: ${r}`,{cause:o})}return Aw(n)}var Na,Iw,Zg=b(()=>{"use strict";Na=re(require("fs"),1),Iw=re(require("path"),1);he()});var Uw={};ne(Uw,{classifyListStatus:()=>Dw,runVetList:()=>mP});function Dw(e){let t=e.reasonsToSkip.map(n=>n.toLowerCase());return t.some(n=>n.includes("closed"))?"closed":t.some(n=>n.includes("claimed")||n.includes("assigned"))?"claimed":t.some(n=>n.includes("existing pr")||n.includes("linked pr")||n.includes("pull request"))?"has_pr":(e.recommendation==="approve"||e.recommendation==="needs_review","still_available")}async function mP(e={}){let t=Ie(),n=e.concurrency??5,o=e.issueListPath;if(!o){let g=La();if(!g)throw new Error("No issue list found. Provide a path with --path or configure issueListPath in settings.");o=g.path}let{runParseList:r}=await Promise.resolve().then(()=>(Zg(),Mg)),i=await r({filePath:o});if(i.available.length===0)return{results:[],summary:{total:0,stillAvailable:0,claimed:0,closed:0,hasPR:0,errors:0}};let s=new Kt(t),a=[],c=i.available,u=0;async function l(){for(;u<c.length;){let g=c[u++];try{let y=await s.vetIssue(g.url),S={issue:{repo:y.issue.repo,number:y.issue.number,title:y.issue.title,url:y.issue.url,labels:y.issue.labels},recommendation:y.recommendation,reasonsToApprove:y.reasonsToApprove,reasonsToSkip:y.reasonsToSkip,projectHealth:y.projectHealth,vettingResult:y.vettingResult};a.push({...S,listStatus:Dw(S)})}catch(y){a.push({issue:{repo:g.repo,number:g.number,title:g.title,url:g.url,labels:[]},recommendation:"skip",reasonsToApprove:[],reasonsToSkip:[`Error: ${y instanceof Error?y.message:String(y)}`],projectHealth:{},vettingResult:{},listStatus:"error",errorMessage:y instanceof Error?y.message:String(y)})}}}let d=Array.from({length:Math.min(n,c.length)},()=>l());await Promise.all(d);let p={total:a.length,stillAvailable:a.filter(g=>g.listStatus==="still_available").length,claimed:a.filter(g=>g.listStatus==="claimed").length,closed:a.filter(g=>g.listStatus==="closed").length,hasPR:a.filter(g=>g.listStatus==="has_pr").length,errors:a.filter(g=>g.listStatus==="error").length};return{results:a,summary:p}}var jw=b(()=>{"use strict";Se();za()});var Vg={};ne(Vg,{runTrack:()=>gP,runUntrack:()=>fP});async function gP(e){ze(e.prUrl),qe(e.prUrl,Qt,"PR");let t=Ie(),n=je(t),o=Pe(e.prUrl);if(!o||o.type!=="pull")throw new Error(`Invalid PR URL: ${e.prUrl}`);let{owner:r,repo:i,number:s}=o,{data:a}=await n.pulls.get({owner:r,repo:i,pull_number:s});return{pr:{repo:`${r}/${i}`,number:s,title:a.title,url:e.prUrl}}}async function fP(e){return ze(e.prUrl),qe(e.prUrl,Qt,"PR"),{removed:!1,url:e.prUrl,message:"In v2, PRs are fetched fresh on each daily run \u2014 there is no local tracking list to remove from."}}var Hg=b(()=>{"use strict";Se();St();Ue()});var zw={};ne(zw,{runRead:()=>hP});async function hP(e){if(!e.all&&!e.prUrl)throw new Error("PR URL or --all flag required");return e.prUrl&&ze(e.prUrl),e.all?{markedAsRead:0,all:!0,message:"In v2, PR read state is not tracked locally."}:{marked:!1,url:e.prUrl,message:"In v2, PR read state is not tracked locally."}}var Gw=b(()=>{"use strict";St()});var Ma={};ne(Ma,{runClaim:()=>yP,runComments:()=>vP,runPost:()=>bP});async function vP(e){ze(e.prUrl),qe(e.prUrl,Qt,"PR");let t=Ie(),n=K(),o=je(t),r=Pe(e.prUrl);if(!r||r.type!=="pull")throw new Error("Invalid PR URL format");let{owner:i,repo:s,number:a}=r,{data:c}=await o.pulls.get({owner:i,repo:s,pull_number:a}),[u,l,d]=await Promise.all([$t(T=>o.pulls.listReviewComments({owner:i,repo:s,pull_number:a,per_page:100,page:T})),$t(T=>o.issues.listComments({owner:i,repo:s,issue_number:a,per_page:100,page:T})),$t(T=>o.pulls.listReviews({owner:i,repo:s,pull_number:a,per_page:100,page:T}))]),p=n.getState().config.githubUsername,g=T=>!(!T.user||T.user.login===p||T.user.type==="Bot"&&!e.showBots),y=u.filter(g).sort((T,L)=>new Date(L.created_at).getTime()-new Date(T.created_at).getTime()),S=l.filter(g).sort((T,L)=>new Date(L.created_at).getTime()-new Date(T.created_at).getTime()),U=d.filter(T=>g(T)&&T.body&&T.body.trim()).sort((T,L)=>new Date(L.submitted_at||0).getTime()-new Date(T.submitted_at||0).getTime());return{pr:{title:c.title,state:c.state,mergeable:c.mergeable,head:c.head.ref,base:c.base.ref,url:c.html_url},reviews:U.map(T=>({user:T.user?.login,state:T.state,body:T.body??null,submittedAt:T.submitted_at??null})),reviewComments:y.map(T=>({user:T.user?.login,body:T.body,path:T.path,createdAt:T.created_at})),issueComments:S.map(T=>({user:T.user?.login,body:T.body,createdAt:T.created_at})),summary:{reviewCount:U.length,inlineCommentCount:y.length,discussionCommentCount:S.length}}}async function bP(e){if(ze(e.url),qe(e.url,pw,"issue or PR"),!e.message.trim())throw new Error("No message provided");Fg(e.message);let t=Ie(),n=Pe(e.url);if(!n)throw new Error("Invalid GitHub URL format");let{owner:o,repo:r,number:i}=n,s=je(t),{data:a}=await s.issues.createComment({owner:o,repo:r,issue_number:i,body:e.message});return{commentUrl:a.html_url,url:e.url}}async function yP(e){ze(e.issueUrl),qe(e.issueUrl,er,"issue");let t=Ie(),n=e.message||"Hi! I'd like to work on this issue. Could you assign it to me?";Fg(n);let o=Pe(e.issueUrl);if(!o||o.type!=="issues")throw new Error("Invalid issue URL format (must be an issue, not a PR)");let{owner:r,repo:i,number:s}=o,a=je(t),{data:c}=await a.issues.createComment({owner:r,repo:i,issue_number:s,body:n});try{K().addIssue({id:s,url:e.issueUrl,repo:`${r}/${i}`,number:s,title:"(claimed)",status:"claimed",labels:[],createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),vetted:!1})}catch(u){console.error(`Warning: Comment posted on ${e.issueUrl} but failed to save to local state: ${u instanceof Error?u.message:u}`)}return{commentUrl:c.html_url,issueUrl:e.issueUrl}}var Za=b(()=>{"use strict";Se();Go();St()});var Lw={};ne(Lw,{runConfig:()=>_P});function Fw(e){if(!Pn.includes(e))throw new Error(`Invalid scope "${e}". Valid scopes: ${Pn.join(", ")}`);return e}async function _P(e){let t=K(),n=t.getState().config;if(!e.key)return{config:n};if(!e.value)throw new Error("Value required");let o=e.value;switch(e.key){case"username":t.updateConfig({githubUsername:zn(o)});break;case"add-language":n.languages.includes(o)||t.updateConfig({languages:[...n.languages,o]});break;case"add-label":n.labels.includes(o)||t.updateConfig({labels:[...n.labels,o]});break;case"remove-label":if(!n.labels.includes(o))throw new Error(`Label "${o}" is not currently configured. Current labels: ${n.labels.join(", ")}`);t.updateConfig({labels:n.labels.filter(r=>r!==o)});break;case"add-scope":{let r=Fw(o),i=n.scope??[];i.includes(r)||t.updateConfig({scope:[...i,r]});break}case"remove-scope":{let r=Fw(o),i=n.scope??[];if(!i.includes(r))throw new Error(`Scope "${o}" is not currently set`);let s=i.filter(a=>a!==r);if(s.length===0)throw new Error("Cannot remove the last scope. Use setup to clear scopes entirely.");t.updateConfig({scope:s});break}case"exclude-repo":{let r=o.split("/");if(r.length!==2||!r[0]||!r[1])throw new Error(`Invalid repo format "${o}". Use "owner/repo" format. To exclude an entire org, use: config exclude-org ${o}`);let i=o.toLowerCase();n.excludeRepos.some(s=>s.toLowerCase()===i)||t.batch(()=>{t.updateConfig({excludeRepos:[...n.excludeRepos,o]}),t.cleanupExcludedData([o],[])});break}case"exclude-org":{if(o.includes("/"))throw new Error(`Invalid org name "${o}". Use just the org name (e.g., "facebook"), not "owner/repo" format. To exclude a specific repo, use: config exclude-repo ${o}`);let r=n.excludeOrgs??[];r.some(i=>i.toLowerCase()===o.toLowerCase())||t.batch(()=>{t.updateConfig({excludeOrgs:[...r,o]}),t.cleanupExcludedData([],[o])});break}case"issueListPath":t.updateConfig({issueListPath:o||void 0});break;case"scoreThreshold":{let r=Number(o);if(!Number.isInteger(r)||r<1||r>10)throw new fe(`Invalid value for scoreThreshold: "${o}". Must be an integer between 1 and 10.`);t.updateConfig({scoreThreshold:r});break}default:throw new Error(`Unknown config key: ${e.key}`)}return{success:!0,key:e.key,value:o}}var Nw=b(()=>{"use strict";Se();he();Dt();St()});var Mw={};ne(Mw,{runInit:()=>$P});async function $P(e){return zn(e.username),K().updateConfig({githubUsername:e.username}),{username:e.username,message:"Username saved. Run `daily` to fetch your open PRs from GitHub."}}var Zw=b(()=>{"use strict";Se();St()});var Bg={};ne(Bg,{runCheckSetup:()=>kP,runSetup:()=>SP});function qg(e,t){let n=Number(e);if(!Number.isInteger(n)||n<1)throw new fe(`Invalid value for ${t}: "${e}". Must be a positive integer.`);return n}function wP(e,t,n,o){let r=Number(e);if(!Number.isInteger(r)||r<n||r>o)throw new fe(`Invalid value for ${t}: "${e}". Must be an integer between ${n} and ${o}.`);return r}async function SP(e){let t=K(),n=t.getState().config;if(e.set&&e.set.length>0){let o={},r=[];return t.batch(()=>{for(let i of e.set){let[s,...a]=i.split("="),c=a.join("=");switch(s){case"username":zn(c),t.updateConfig({githubUsername:c}),o[s]=c;break;case"maxActivePRs":{let u=qg(c,"maxActivePRs");t.updateConfig({maxActivePRs:u}),o[s]=String(u);break}case"dormantDays":{let u=qg(c,"dormantDays");t.updateConfig({dormantThresholdDays:u}),o[s]=String(u);break}case"approachingDays":{let u=qg(c,"approachingDays");t.updateConfig({approachingDormantDays:u}),o[s]=String(u);break}case"languages":t.updateConfig({languages:c.split(",").map(u=>u.trim())}),o[s]=c;break;case"labels":t.updateConfig({labels:c.split(",").map(u=>u.trim())}),o[s]=c;break;case"showHealthCheck":t.updateConfig({showHealthCheck:c!=="false"}),o[s]=c!=="false"?"true":"false";break;case"squashByDefault":c==="ask"?(t.updateConfig({squashByDefault:"ask"}),o[s]="ask"):(t.updateConfig({squashByDefault:c!=="false"}),o[s]=c!=="false"?"true":"false");break;case"scoreThreshold":{let u=wP(c,"scoreThreshold",1,10);t.updateConfig({scoreThreshold:u}),o[s]=String(u);break}case"minStars":{let u=Number(c);if(!Number.isInteger(u)||u<0)throw new fe(`Invalid value for minStars: "${c}". Must be a non-negative integer.`);t.updateConfig({minStars:u}),o[s]=String(u);break}case"includeDocIssues":t.updateConfig({includeDocIssues:c==="true"}),o[s]=c==="true"?"true":"false";break;case"aiPolicyBlocklist":{let u=c.split(",").map(p=>p.trim()).filter(Boolean),l=[],d=[];for(let p of u){let g=p.replace(/\s+/g,"");/^[a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+$/.test(g)?l.push(g):d.push(p)}if(d.length>0&&(r.push(`Warning: Skipping invalid entries (expected "owner/repo" format): ${d.join(", ")}`),o.aiPolicyBlocklist_invalidEntries=d.join(", ")),l.length===0&&u.length>0){r.push("Warning: All entries were invalid. Blocklist not updated."),o[s]="(all entries invalid)";break}t.updateConfig({aiPolicyBlocklist:l}),o[s]=l.length>0?l.join(", "):"(empty)";break}case"projectCategories":{let u=c.split(",").map(g=>g.trim()).filter(Boolean),l=[],d=[];for(let g of u)Um.includes(g)?l.push(g):d.push(g);d.length>0&&r.push(`Unknown project categories: ${d.join(", ")}. Valid: ${Um.join(", ")}`);let p=[...new Set(l)];t.updateConfig({projectCategories:p}),o[s]=p.length>0?p.join(", "):"(empty)";break}case"preferredOrgs":{let u=c.split(",").map(p=>p.trim()).filter(Boolean),l=[];for(let p of u)p.includes("/")?r.push(`"${p}" looks like a repo path. Use org name only (e.g., "vercel" not "vercel/next.js").`):/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$/.test(p)?l.push(p.toLowerCase()):r.push(`"${p}" is not a valid GitHub organization name. Skipping.`);let d=[...new Set(l)];t.updateConfig({preferredOrgs:d}),o[s]=d.length>0?d.join(", "):"(empty)";break}case"scope":{let u=c.split(",").map(g=>g.trim()).filter(Boolean),l=[],d=[];for(let g of u)Pn.includes(g)?l.push(g):d.push(g);d.length>0&&r.push(`Unknown issue scopes: ${d.join(", ")}. Valid: ${Pn.join(", ")}`);let p=[...new Set(l)];t.updateConfig({scope:p.length>0?p:void 0}),o[s]=p.length>0?p.join(", "):"(empty \u2014 using labels only)";break}case"issueListPath":t.updateConfig({issueListPath:c||void 0}),o[s]=c||"(cleared)";break;case"complete":c==="true"&&(t.markSetupComplete(),o[s]="true");break;default:r.push(`Unknown setting: ${s}`)}}}),{success:!0,settings:o,warnings:r.length>0?r:void 0}}return n.setupComplete&&!e.reset?{setupComplete:!0,config:{githubUsername:n.githubUsername,maxActivePRs:n.maxActivePRs,dormantThresholdDays:n.dormantThresholdDays,approachingDormantDays:n.approachingDormantDays,languages:n.languages,labels:n.labels,projectCategories:n.projectCategories??[],preferredOrgs:n.preferredOrgs??[],scope:n.scope??[],scoreThreshold:n.scoreThreshold}}:{setupRequired:!0,prompts:[{setting:"username",prompt:"What is your GitHub username?",current:n.githubUsername||null,required:!0,type:"string"},{setting:"maxActivePRs",prompt:"How many PRs do you want to work on at once?",current:n.maxActivePRs,default:10,type:"number"},{setting:"dormantDays",prompt:"After how many days of inactivity should a PR be considered dormant?",current:n.dormantThresholdDays,default:30,type:"number"},{setting:"approachingDays",prompt:"At how many days should we warn about approaching dormancy?",current:n.approachingDormantDays,default:25,type:"number"},{setting:"languages",prompt:"What programming languages do you want to contribute to?",current:n.languages,default:["typescript","javascript"],type:"list"},{setting:"labels",prompt:"What issue labels should we search for?",current:n.labels,default:["good first issue","help wanted"],type:"list"},{setting:"scope",prompt:"What scope of issues do you want to discover? (beginner, intermediate, advanced \u2014 leave empty for default labels only)",current:n.scope??[],default:[],type:"list"},{setting:"scoreThreshold",prompt:"Minimum vet score (1-10) for issues to keep after vetting? Issues below this are auto-filtered.",current:n.scoreThreshold,default:6,type:"number"},{setting:"aiPolicyBlocklist",prompt:"Repos with anti-AI contribution policies to block (owner/repo, comma-separated)?",current:n.aiPolicyBlocklist??Rn.aiPolicyBlocklist??null,default:["matplotlib/matplotlib"],type:"list"},{setting:"projectCategories",prompt:"What types of projects interest you? (nonprofit, devtools, infrastructure, web-frameworks, data-ml, education)",current:n.projectCategories??[],default:[],type:"list"},{setting:"preferredOrgs",prompt:"Any GitHub organizations to prioritize? (org names, comma-separated)",current:n.preferredOrgs??[],default:[],type:"list"}]}}async function kP(){let e=K();return{setupComplete:e.isSetupComplete(),username:e.getState().config.githubUsername}}var Wg=b(()=>{"use strict";Se();he();St();Dt()});var Vw={};ne(Vw,{runCheckIntegration:()=>PP});function xP(e){let t=at.extname(e),n=at.basename(e,t);return n==="index"?at.basename(at.dirname(e)):n}function RP(e,t){let n=at.dirname(e),o=[];for(let i of[".ts",".tsx",".js",".jsx"]){let s=at.join(n,`index${i}`);t.includes(s)&&o.push(s)}let r=at.dirname(n);for(let i of[".ts",".tsx",".js",".jsx"]){let s=at.join(r,`index${i}`);t.includes(s)&&o.push(s)}return[...new Set(o)]}async function PP(e){let t=e.base,n;try{let a=(0,Va.execFileSync)("git",["diff","--name-only","--diff-filter=A",`${t}...HEAD`],{encoding:"utf-8",timeout:1e4}).trim();n=a?a.split(`
|
|
135
135
|
`).filter(Boolean):[]}catch(a){let c=P(a);throw new Error(`Failed to run git diff: ${c}`,{cause:a})}let o=n.filter(a=>{let c=at.extname(a);return TP.has(c)?!EP.some(u=>u.test(a)):!1});if(o.length===0)return{newFiles:[],unreferencedCount:0};let r;try{r=(0,Va.execFileSync)("git",["ls-files"],{encoding:"utf-8",timeout:1e4}).trim().split(`
|
package/dist/commands/search.js
CHANGED
|
@@ -194,10 +194,10 @@ async function fetchRecentPRs(octokit, config, query, label, days, mapItem) {
|
|
|
194
194
|
warn(MODULE, `Could not parse GitHub URL from API response: ${item.html_url}`);
|
|
195
195
|
continue;
|
|
196
196
|
}
|
|
197
|
-
const repo = `${parsed.owner}/${parsed.repo}`;
|
|
198
197
|
// Skip own repos
|
|
199
198
|
if (isOwnRepo(parsed.owner, config.githubUsername))
|
|
200
199
|
continue;
|
|
200
|
+
const repo = `${parsed.owner}/${parsed.repo}`;
|
|
201
201
|
results.push(mapItem(item, { owner: parsed.owner, repo, number: parsed.number }));
|
|
202
202
|
}
|
|
203
203
|
debug(MODULE, `Found ${results.length} recently ${label} PRs`);
|
|
@@ -208,7 +208,7 @@ async function fetchRecentPRs(octokit, config, query, label, days, mapItem) {
|
|
|
208
208
|
* Returns lightweight ClosedPR objects for surfacing in the daily digest.
|
|
209
209
|
*/
|
|
210
210
|
export async function fetchRecentlyClosedPRs(octokit, config, days = 7) {
|
|
211
|
-
return fetchRecentPRs(octokit, config, 'is:pr is:closed is:unmerged author:{username} closed:>={since}', 'closed', days, (item, { repo, number }) => ({
|
|
211
|
+
return fetchRecentPRs(octokit, config, 'is:pr is:closed is:unmerged is:public author:{username} closed:>={since}', 'closed', days, (item, { repo, number }) => ({
|
|
212
212
|
url: item.html_url,
|
|
213
213
|
repo,
|
|
214
214
|
number,
|
|
@@ -221,7 +221,7 @@ export async function fetchRecentlyClosedPRs(octokit, config, days = 7) {
|
|
|
221
221
|
* Returns lightweight MergedPR objects for surfacing as wins in the dashboard.
|
|
222
222
|
*/
|
|
223
223
|
export async function fetchRecentlyMergedPRs(octokit, config, days = 7) {
|
|
224
|
-
return fetchRecentPRs(octokit, config, 'is:pr is:merged author:{username} merged:>={since}', 'merged', days, (item, { repo, number }) => {
|
|
224
|
+
return fetchRecentPRs(octokit, config, 'is:pr is:merged is:public author:{username} merged:>={since}', 'merged', days, (item, { repo, number }) => {
|
|
225
225
|
const mergedAt = item.pull_request?.merged_at;
|
|
226
226
|
if (!mergedAt) {
|
|
227
227
|
warn(MODULE, `merged_at missing for merged PR ${item.html_url}${item.closed_at ? ', falling back to closed_at' : ', no date available'}`);
|
package/dist/core/pr-monitor.js
CHANGED
|
@@ -88,7 +88,7 @@ export class PRMonitor {
|
|
|
88
88
|
let page = 1;
|
|
89
89
|
const perPage = 100;
|
|
90
90
|
const firstPage = await this.octokit.search.issuesAndPullRequests({
|
|
91
|
-
q: `is:pr is:open author:${config.githubUsername}`,
|
|
91
|
+
q: `is:pr is:open is:public author:${config.githubUsername}`,
|
|
92
92
|
sort: 'updated',
|
|
93
93
|
order: 'desc',
|
|
94
94
|
per_page: perPage,
|
|
@@ -102,7 +102,7 @@ export class PRMonitor {
|
|
|
102
102
|
while (page < totalPages) {
|
|
103
103
|
page++;
|
|
104
104
|
const nextPage = await this.octokit.search.issuesAndPullRequests({
|
|
105
|
-
q: `is:pr is:open author:${config.githubUsername}`,
|
|
105
|
+
q: `is:pr is:open is:public author:${config.githubUsername}`,
|
|
106
106
|
sort: 'updated',
|
|
107
107
|
order: 'desc',
|
|
108
108
|
per_page: perPage,
|