@nilsr0711/drydock 0.1.7 → 0.1.8
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/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js +2 -2
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/adrs/page.js +2 -2
- package/.next/standalone/.next/server/app/adrs/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/adrs/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/analytics/page.js +1 -1
- package/.next/standalone/.next/server/app/analytics/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/analytics/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/control/shutdown/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cost/export/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/health/route.js +1 -1
- package/.next/standalone/.next/server/app/api/health/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/sse/dashboard/route.js +1 -1
- package/.next/standalone/.next/server/app/api/sse/dashboard/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/sse/jobs/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/webhooks/[repoId]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/costs/page.js +1 -1
- package/.next/standalone/.next/server/app/costs/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/costs/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/jobs/[id]/page.js +3 -3
- package/.next/standalone/.next/server/app/jobs/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/jobs/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/jobs/page.js +2 -2
- package/.next/standalone/.next/server/app/jobs/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/jobs/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/needs-human/page.js +2 -2
- package/.next/standalone/.next/server/app/needs-human/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/needs-human/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/page.js +2 -2
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/prompts/page.js +2 -2
- package/.next/standalone/.next/server/app/prompts/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/prompts/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/repos/[id]/page.js +2 -2
- package/.next/standalone/.next/server/app/repos/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/repos/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page.js +2 -2
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +1 -1
- package/.next/standalone/.next/server/chunks/304.js +1 -1
- package/.next/standalone/.next/server/chunks/387.js +34 -0
- package/.next/standalone/.next/server/chunks/40.js +1 -1
- package/.next/standalone/.next/server/chunks/403.js +1 -0
- package/.next/standalone/.next/server/chunks/521.js +1 -1
- package/.next/standalone/.next/server/chunks/578.js +1 -1
- package/.next/standalone/.next/server/chunks/614.js +2 -2
- package/.next/standalone/.next/server/chunks/685.js +1 -0
- package/.next/standalone/.next/server/chunks/786.js +1 -1
- package/.next/standalone/.next/server/chunks/83.js +1 -1
- package/.next/standalone/.next/server/chunks/908.js +1 -1
- package/.next/standalone/.next/server/chunks/99.js +14 -11
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/1298-0d60333e56ac8b2c.js +1 -0
- package/.next/standalone/.next/static/chunks/3433-ece700d2e393c23b.js +1 -0
- package/.next/standalone/.next/static/chunks/3894-4f48e3cc5be58e10.js +1 -0
- package/.next/standalone/.next/static/chunks/5080-16cb43874ff5c536.js +1 -0
- package/.next/standalone/.next/static/chunks/{1642-a1ea35450c1b5c95.js → 8264-c27834f1552f983a.js} +1 -1
- package/.next/{static/chunks/4624-5e23973d35b58ca5.js → standalone/.next/static/chunks/8745-8b3833b3d2afa30c.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/adrs/page-0c221fc18d1e89af.js +1 -0
- package/.next/standalone/.next/static/chunks/app/costs/{page-24d086bf67620e30.js → page-5d66d93815eea63a.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/jobs/[id]/page-6ef8bc39b5181817.js +1 -0
- package/.next/standalone/.next/static/chunks/app/jobs/page-98215ec1497b829e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/layout-402d4ab34259b89b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/needs-human/page-b69ac22856c0a0b1.js +1 -0
- package/.next/standalone/.next/static/chunks/app/page-ccefa99d40734a8c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/prompts/page-bcd1063eb5d64aa5.js +1 -0
- package/.next/standalone/.next/static/chunks/app/repos/[id]/page-2bd4b35a0b28042e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/settings/page-13a04ecac139b74c.js +1 -0
- package/.next/standalone/.next/static/css/{bdce0893cf6b9cb9.css → 600a5b5311ad42be.css} +1 -1
- package/.next/standalone/drizzle/0034_human_instruction.sql +1 -0
- package/.next/standalone/drizzle/0035_agent_release.sql +4 -0
- package/.next/standalone/mcp-server.cjs +42934 -0
- package/.next/standalone/package.json +5 -3
- package/.next/static/chunks/1298-0d60333e56ac8b2c.js +1 -0
- package/.next/static/chunks/3433-ece700d2e393c23b.js +1 -0
- package/.next/static/chunks/3894-4f48e3cc5be58e10.js +1 -0
- package/.next/static/chunks/5080-16cb43874ff5c536.js +1 -0
- package/.next/static/chunks/{1642-a1ea35450c1b5c95.js → 8264-c27834f1552f983a.js} +1 -1
- package/.next/{standalone/.next/static/chunks/4624-5e23973d35b58ca5.js → static/chunks/8745-8b3833b3d2afa30c.js} +1 -1
- package/.next/static/chunks/app/adrs/page-0c221fc18d1e89af.js +1 -0
- package/.next/static/chunks/app/costs/{page-24d086bf67620e30.js → page-5d66d93815eea63a.js} +1 -1
- package/.next/static/chunks/app/jobs/[id]/page-6ef8bc39b5181817.js +1 -0
- package/.next/static/chunks/app/jobs/page-98215ec1497b829e.js +1 -0
- package/.next/static/chunks/app/layout-402d4ab34259b89b.js +1 -0
- package/.next/static/chunks/app/needs-human/page-b69ac22856c0a0b1.js +1 -0
- package/.next/static/chunks/app/page-ccefa99d40734a8c.js +1 -0
- package/.next/static/chunks/app/prompts/page-bcd1063eb5d64aa5.js +1 -0
- package/.next/static/chunks/app/repos/[id]/page-2bd4b35a0b28042e.js +1 -0
- package/.next/static/chunks/app/settings/page-13a04ecac139b74c.js +1 -0
- package/.next/static/css/{bdce0893cf6b9cb9.css → 600a5b5311ad42be.css} +1 -1
- package/README.md +60 -21
- package/bin/drydock.mjs +77 -2
- package/drizzle/0034_human_instruction.sql +1 -0
- package/drizzle/0035_agent_release.sql +4 -0
- package/package.json +5 -3
- package/.next/standalone/.next/server/chunks/382.js +0 -31
- package/.next/standalone/.next/server/chunks/468.js +0 -1
- package/.next/standalone/.next/server/chunks/822.js +0 -1
- package/.next/standalone/.next/static/chunks/1298-7ac9c00c70b27598.js +0 -1
- package/.next/standalone/.next/static/chunks/3433-719d6f55f39342d8.js +0 -1
- package/.next/standalone/.next/static/chunks/3894-c7b01dcfcf83d89b.js +0 -1
- package/.next/standalone/.next/static/chunks/7690-6dcfd9ae4cbf4e7d.js +0 -1
- package/.next/standalone/.next/static/chunks/app/adrs/page-1dfee698ea4c111f.js +0 -1
- package/.next/standalone/.next/static/chunks/app/jobs/[id]/page-8a9e4ed64c3303fe.js +0 -1
- package/.next/standalone/.next/static/chunks/app/jobs/page-4180ccc9acd3ddba.js +0 -1
- package/.next/standalone/.next/static/chunks/app/layout-189fa697d72d1fdf.js +0 -1
- package/.next/standalone/.next/static/chunks/app/needs-human/page-e458ffa78c06a6fa.js +0 -1
- package/.next/standalone/.next/static/chunks/app/page-add53cbf6d87a3f5.js +0 -1
- package/.next/standalone/.next/static/chunks/app/prompts/page-ff6cc30777232933.js +0 -1
- package/.next/standalone/.next/static/chunks/app/repos/[id]/page-cd11007841a5d73f.js +0 -1
- package/.next/standalone/.next/static/chunks/app/settings/page-280668b9c92e9b48.js +0 -1
- package/.next/static/chunks/1298-7ac9c00c70b27598.js +0 -1
- package/.next/static/chunks/3433-719d6f55f39342d8.js +0 -1
- package/.next/static/chunks/3894-c7b01dcfcf83d89b.js +0 -1
- package/.next/static/chunks/7690-6dcfd9ae4cbf4e7d.js +0 -1
- package/.next/static/chunks/app/adrs/page-1dfee698ea4c111f.js +0 -1
- package/.next/static/chunks/app/jobs/[id]/page-8a9e4ed64c3303fe.js +0 -1
- package/.next/static/chunks/app/jobs/page-4180ccc9acd3ddba.js +0 -1
- package/.next/static/chunks/app/layout-189fa697d72d1fdf.js +0 -1
- package/.next/static/chunks/app/needs-human/page-e458ffa78c06a6fa.js +0 -1
- package/.next/static/chunks/app/page-add53cbf6d87a3f5.js +0 -1
- package/.next/static/chunks/app/prompts/page-ff6cc30777232933.js +0 -1
- package/.next/static/chunks/app/repos/[id]/page-cd11007841a5d73f.js +0 -1
- package/.next/static/chunks/app/settings/page-280668b9c92e9b48.js +0 -1
- /package/.next/standalone/.next/static/{-sJQutzNDvUvcdmf3YlJA → qSEvPCWIslg9lcxt6XQhl}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{-sJQutzNDvUvcdmf3YlJA → qSEvPCWIslg9lcxt6XQhl}/_ssgManifest.js +0 -0
- /package/.next/static/{-sJQutzNDvUvcdmf3YlJA → qSEvPCWIslg9lcxt6XQhl}/_buildManifest.js +0 -0
- /package/.next/static/{-sJQutzNDvUvcdmf3YlJA → qSEvPCWIslg9lcxt6XQhl}/_ssgManifest.js +0 -0
|
@@ -1,18 +1,21 @@
|
|
|
1
|
-
"use strict";exports.id=99,exports.ids=[99],exports.modules={1065:(a,b,c)=>{c.d(b,{ND:()=>n,RD:()=>l,TG:()=>h,_M:()=>j});var d=c(73024),e=c(48161),f=c(76760),g=c(77597);function h(){return process.env.DRYDOCK_HOME??(0,f.join)((0,e.homedir)(),".drydock")}function i(a){return a.replace(/[^a-zA-Z0-9._-]/g,"-")}function j(a){return(0,f.join)(h(),"worktrees",i(a))}class k extends Error{}class l extends k{constructor(){super("nothing to commit")}}let m=new Map;class n{constructor(a=g.Sx){this.run=a}withRepoLock(a,b){let c=(m.get(a)??Promise.resolve()).then(b,b);return m.set(a,c.then(()=>void 0,()=>void 0)),c}async git(a,b){let c=await this.run("git",a,b);if(0!==c.exitCode)throw new k(c.stderr.trim()||`git ${a[0]} failed`);return c.stdout}async prepare(a,b,c=0){let e=`drydock/issue-${c}-job-${b}`,g=(0,f.join)(j(a.name),`job-${b}`),h=await this.withRepoLock(a.path,async()=>(await this.git(["-C",a.path,"worktree","remove","--force",g]).catch(()=>void 0),(0,d.rmSync)(g,{recursive:!0,force:!0}),await this.git(["-C",a.path,"worktree","prune"]).catch(()=>void 0),await this.git(["-C",a.path,"branch","-D",e]).catch(()=>void 0),await this.git(["-C",a.path,"worktree","add","-b",e,g,a.defaultBranch]),this.resolveBase(a.path,e)));return{path:g,branch:e,base:h}}async prepareForBranch(a,b,c){let d=(0,f.join)(j(a.name),`fb-${i(c)}`),e=await this.withRepoLock(a.path,async()=>(await this.git(["-C",a.path,"fetch","origin",b]),await this.git(["-C",a.path,"worktree","add",d,b]),this.resolveBase(a.path,b)));return{path:d,branch:b,base:e}}async prepareForNewBranch(a,b,c){let d=(0,f.join)(j(a.name),`dh-${i(c)}`),e=await this.withRepoLock(a.path,async()=>(await this.git(["-C",a.path,"worktree","add","-b",b,d,a.defaultBranch]),this.resolveBase(a.path,b)));return{path:d,branch:b,base:e}}async resolveBase(a,b){return(await this.git(["-C",a,"rev-parse",b])).trim()}async hasNewCommits(a){return!!a.base&&Number.parseInt((await this.git(["rev-list","--count",`${a.base}..HEAD`],a.path)).trim()||"0",10)>0}async commitAndPush(a,b){if(await this.git(["add","-A"],a.path),""!==(await this.git(["status","--porcelain"],a.path)).trim())await this.git(["commit","-m",b],a.path);else if(!await this.hasNewCommits(a))throw new l;await this.git(["push","-u","origin",a.branch],a.path)}async remove(a,b){await this.withRepoLock(b,async()=>{await this.git(["-C",b,"worktree","remove","--force",a.path]),await this.git(["-C",b,"worktree","prune"])})}}},2412:(a,b,c)=>{c.d(b,{N6:()=>n,_S:()=>j,ax:()=>k,dk:()=>m,i1:()=>o,yM:()=>l});var d=c(97496),e=c(14694),f=c(2025),g=c(64537),h=c(34973),i=c(52479);function j(a,b=(0,f.Lf)()){let c=b.insert(g.jobs).values({repoId:a.repoId,issueNumber:a.issueNumber,status:"queued",model:a.model,agent:a.agent??"claude",maxTurns:a.maxTurns??40,dedupeKey:a.dedupeKey??null}).returning().get();return(0,h.ej)(),c}function k(a,b=(0,f.Lf)()){return b.select().from(g.jobs).where((0,d.eq)(g.jobs.id,a)).get()}function l(a,b,c,d=(0,f.Lf)()){d.insert(g.jobEvents).values({jobId:a,type:b,payload:JSON.stringify(c??{})}).run()}function m(a,b,c={},e=(0,f.Lf)()){let j=e.transaction(e=>{let f=k(a,e);if(!f)throw Error(`job ${a} not found`);(0,i.QJ)(f.status,b);let h=Math.floor(Date.now()/1e3),j={};"working"!==b||f.startedAt||(j.startedAt=h),["merged","needs_human","aborted"].includes(b)&&(j.finishedAt=h);let m=e.update(g.jobs).set({...j,...c,status:b}).where((0,d.eq)(g.jobs.id,a)).returning().get();return l(a,"status",{from:f.status,to:b},e),m});return(0,h.ej)(),j}function n(a,b=(0,f.Lf)()){return b.select().from(g.jobs).where((0,d.eq)(g.jobs.repoId,a)).orderBy((0,e.i)(g.jobs.createdAt)).all()}function o(a,b=(0,f.Lf)()){return b.select().from(g.jobs).where((0,d.RV)(g.jobs.status,a)).all()}},9617:(a,b,c)=>{let d;c.d(b,{Ix:()=>u,Ym:()=>q,_$:()=>p,jQ:()=>r,m:()=>n,pp:()=>t,sV:()=>m,wL:()=>s});var e=c(77598),f=c(48161),g=c(97496),h=c(84232),i=c(2025),j=c(64537),k=c(2412),l=c(52479);let m=3e4,n=1e4,o=()=>Math.floor(Date.now()/1e3);function p(){return d||(d=`${(0,f.hostname)()}#${process.pid}`),d}function q(a={},b=(0,i.Lf)()){let{repoIds:c,excludeAgents:d}=a;if(c&&0===c.length)return;let f=a.leaseMs??m,l=a.worker??p(),n=a.now??o();return b.transaction(a=>{let b=a.select({job:j.jobs}).from(j.jobs).leftJoin(j.issues,(0,g.Uo)((0,g.eq)(j.issues.repoId,j.jobs.repoId),(0,g.eq)(j.issues.number,j.jobs.issueNumber))).where((0,g.Uo)((0,g.eq)(j.jobs.status,"queued"),(0,g.or)((0,g.kZ)(j.jobs.availableAt),(0,g.wJ)(j.jobs.availableAt,n)),c?(0,g.RV)(j.jobs.repoId,c):void 0,d&&d.length>0?(0,g.KL)(j.jobs.agent,d):void 0)).orderBy((0,h.ll)`COALESCE(${j.issues.priority}, 1e9)`,j.jobs.createdAt).get()?.job;if(b)return(0,k.dk)(b.id,"working",{leaseToken:(0,e.randomUUID)(),leaseExpiresAt:n+Math.ceil(f/1e3),workerId:l,attempts:b.attempts+1,availableAt:null},a)})}function r(a,b,c={},d=(0,i.Lf)()){let e=c.leaseMs??m,f=c.now??o();return d.update(j.jobs).set({leaseExpiresAt:f+Math.ceil(e/1e3)}).where((0,g.Uo)((0,g.eq)(j.jobs.id,a),(0,g.eq)(j.jobs.leaseToken,b),(0,g.eq)(j.jobs.status,"working"))).run().changes>0}function s(a,b,c=(0,i.Lf)()){return c.update(j.jobs).set({leaseToken:null,leaseExpiresAt:null,workerId:null}).where((0,g.Uo)((0,g.eq)(j.jobs.id,a),(0,g.eq)(j.jobs.leaseToken,b))).run().changes>0}function t(a={},b=(0,i.Lf)()){let c=a.now??o(),d=a.expiredBefore,e=void 0===d?void 0:(0,g.or)((0,g.kZ)(j.jobs.leaseExpiresAt),(0,g.wJ)(j.jobs.leaseExpiresAt,d)),f=b.select().from(j.jobs).where((0,g.Uo)((0,g.eq)(j.jobs.status,"working"),e)).all();for(let a of f)b.update(j.jobs).set({status:"queued",leaseToken:null,leaseExpiresAt:null,workerId:null,availableAt:c+function(a,b=5,c=300){return a<=0?0:Math.min(b*2**(a-1),c)}(a.attempts)}).where((0,g.eq)(j.jobs.id,a.id)).run(),(0,k.yM)(a.id,"status",{from:"working",to:"queued",reason:"lease_expired"},b);return f.length}function u(a,b=(0,i.Lf)()){let c=a.dedupeKey??`${a.repoId}:${a.issueNumber}`;if(!b.select({id:j.jobs.id}).from(j.jobs).where((0,g.Uo)((0,g.eq)(j.jobs.dedupeKey,c),(0,g.KL)(j.jobs.status,[...l.kl]))).get())try{return(0,k._S)({...a,dedupeKey:c},b)}catch(a){if(a instanceof Error&&"string"==typeof a.code&&"SQLITE_CONSTRAINT_UNIQUE"===a.code)return;throw a}}},16544:(a,b,c)=>{c.d(b,{A:()=>f,i:()=>g});let d=new Set(["OWNER","MEMBER","COLLABORATOR"]);function e(a){try{let b=JSON.parse(a);return Array.isArray(b)?b.filter(a=>"string"==typeof a):[]}catch{return[]}}function f(a){return{autoTriageEnabled:a.autoTriageEnabled,autoProcessEnabled:a.autoProcessEnabled,autoHealCi:a.autoHealCi,autoReviewFeedback:a.autoReviewFeedback,mergeWithoutChecks:a.mergeWithoutChecks,autoResolveMergeConflicts:a.autoResolveMergeConflicts,includeProgressReplies:a.includeProgressReplies,autoDecompose:a.autoDecompose,planFirst:a.planFirst,verifyPr:a.verifyPr,autoHealDeployments:a.autoHealDeployments,releaseEnabled:a.releaseEnabled,deploymentPlatform:a.deploymentPlatform,readyLabels:e(a.readyLabels),blockingLabels:e(a.blockingLabels),autoLabelWhitelist:e(a.autoLabelWhitelist),priorityAuthors:e(a.priorityAuthors),trustedReviewers:e(a.trustedReviewers),trustedBots:e(a.trustedBots),ignoredBots:e(a.ignoredBots),minAuthorAssociation:"any"===a.minAuthorAssociation?"any":"approved",maxAttempts:a.maxAttempts,sandbox:"docker"===a.sandbox?"docker":"none",sandboxImage:a.sandboxImage,sandboxAllowNetwork:a.sandboxAllowNetwork,sandboxCpus:a.sandboxCpus,sandboxMemory:a.sandboxMemory}}function g(a,b){return"any"===a.minAuthorAssociation||null!=b&&d.has(b.toUpperCase())}},20203:(a,b,c)=>{c.d(b,{FD:()=>A,kz:()=>B,X$:()=>D,TU:()=>C});let d={"claude-fable-5":{inputPerMTok:10,outputPerMTok:50,cacheWritePerMTok:12.5,cacheReadPerMTok:1},"claude-opus-4-8":{inputPerMTok:5,outputPerMTok:25,cacheWritePerMTok:6.25,cacheReadPerMTok:.5},"claude-opus-4-7":{inputPerMTok:5,outputPerMTok:25,cacheWritePerMTok:6.25,cacheReadPerMTok:.5},"claude-sonnet-4-6":{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3},"claude-sonnet-4-5":{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3},"claude-haiku-4-5":{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}},e=Object.values(d).reduce((a,b)=>b.outputPerMTok>a.outputPerMTok?b:a,{inputPerMTok:0,outputPerMTok:0,cacheWritePerMTok:0,cacheReadPerMTok:0});var f=c(98887),g=c(14543);let h=[{kind:"auth",pattern:/invalid api key/i},{kind:"auth",pattern:/please run \/login/i},{kind:"auth",pattern:/authentication_error/i},{kind:"auth",pattern:/api error:?\s*401\b/i},{kind:"auth",pattern:/oauth token (?:has )?(?:expired|been revoked)/i},{kind:"billing",pattern:/credit balance is too low/i},{kind:"billing",pattern:/billing_error/i},{kind:"usage_limit",pattern:/usage limit reached/i},{kind:"usage_limit",pattern:/\b(?:\d+-hour|session|weekly) limit reached/i},{kind:"usage_limit",pattern:/limit will reset at/i},{kind:"rate_limit",pattern:/rate.?limit_error/i},{kind:"rate_limit",pattern:/api error:?\s*429\b/i},{kind:"rate_limit",pattern:/too many requests/i},{kind:"rate_limit",pattern:/\brate.?limit(?:ed)?\b.{0,60}\b(?:exceeded|reached|hit)\b/i},{kind:"rate_limit",pattern:/\b(?:exceeded|reached|hit)\b.{0,60}\brate.?limit/i},{kind:"overloaded",pattern:/overloaded_error/i},{kind:"overloaded",pattern:/api error:?\s*529\b/i}],i=/limit reached\|(\d{9,12})\b/i,j=/retry[- ]?after[:\s]+(\d+)\s*(?:s|sec|second)/i;var k=c(29980);let l=[{kind:"auth",pattern:/unexpected status 401\b/i},{kind:"auth",pattern:/\b401 unauthorized\b/i},{kind:"auth",pattern:/access token could not be refreshed/i},{kind:"auth",pattern:/please log out and sign in again/i},{kind:"auth",pattern:/\bnot logged in\b/i},{kind:"auth",pattern:/(?:chatgpt|api key) login is required/i},{kind:"auth",pattern:/missing environment variable.{0,5}OPENAI_API_KEY/i},{kind:"auth",pattern:/re-?run `?codex login`?/i},{kind:"billing",pattern:/quota exceeded\. check your plan and billing/i},{kind:"billing",pattern:/insufficient_quota/i},{kind:"billing",pattern:/exceeded your current quota/i},{kind:"billing",pattern:/\bout of credits\b/i},{kind:"billing",pattern:/\bspend cap\b/i},{kind:"billing",pattern:/to use codex with your chatgpt plan/i},{kind:"usage_limit",pattern:/you.?ve hit your usage limit/i},{kind:"usage_limit",pattern:/usage_limit_reached/i},{kind:"rate_limit",pattern:/rate.?limit_exceeded/i},{kind:"rate_limit",pattern:/rate limit reached for/i},{kind:"rate_limit",pattern:/last status:?\s*429\b/i},{kind:"rate_limit",pattern:/unexpected status 429\b/i},{kind:"rate_limit",pattern:/too many requests/i},{kind:"overloaded",pattern:/selected model is at capacity/i},{kind:"overloaded",pattern:/currently experiencing high demand/i},{kind:"overloaded",pattern:/server_is_overloaded/i},{kind:"overloaded",pattern:/last status:?\s*5\d\d\b/i},{kind:"overloaded",pattern:/unexpected status 5\d\d\b/i}],m=/try again in ([\d.]+)\s*s(?:ec(?:ond)?s?)?\b/i,n="gpt-5-codex",o={"gpt-5-codex":{inputPerMTok:1.25,outputPerMTok:10,cacheWritePerMTok:0,cacheReadPerMTok:0},"gpt-5":{inputPerMTok:1.25,outputPerMTok:10,cacheWritePerMTok:0,cacheReadPerMTok:0},"gpt-5-mini":{inputPerMTok:.25,outputPerMTok:2,cacheWritePerMTok:0,cacheReadPerMTok:0}},p=Object.values(o).reduce((a,b)=>b.outputPerMTok>a.outputPerMTok?b:a,{inputPerMTok:0,outputPerMTok:0,cacheWritePerMTok:0,cacheReadPerMTok:0}),q=k.Ik({input_tokens:k.ai().optional(),cached_input_tokens:k.ai().optional(),output_tokens:k.ai().optional(),reasoning_output_tokens:k.ai().optional()}).passthrough(),r=k.Ik({used_percent:k.ai().optional(),window_minutes:k.ai().optional(),resets_in_seconds:k.ai().optional()}).passthrough(),s=k.Ik({primary:r.nullish(),secondary:r.nullish()}).passthrough(),t=k.Ik({id:k.Yj().optional(),item_type:k.Yj().optional(),text:k.Yj().optional(),command:k.Yj().optional(),exit_code:k.ai().optional(),server:k.Yj().optional(),tool:k.Yj().optional()}).passthrough(),u=k.Ik({type:k.Yj(),thread_id:k.Yj().optional(),usage:q.optional(),rate_limits:s.nullish(),item:t.optional(),error:k.Ik({message:k.Yj().optional()}).passthrough().optional(),message:k.Yj().optional()}).passthrough();function v(a){if(a&&"number"==typeof a.used_percent)return{usedPercent:a.used_percent,windowMinutes:a.window_minutes,resetsInSeconds:a.resets_in_seconds}}class w{push(a){this.buffer+=a;let b=[],c=this.buffer.indexOf("\n");for(;-1!==c;){let a=this.buffer.slice(0,c);this.buffer=this.buffer.slice(c+1);let d=this.consume(a);d&&b.push(d),c=this.buffer.indexOf("\n")}return b}flush(){let a=this.buffer;this.buffer="";let b=this.consume(a);return b?[b]:[]}consume(a){let b;try{b=function(a){let b=a.trim();if(!b)return null;let c=JSON.parse(b);return u.parse(c)}(a)}catch(b){return this.onParseError?.({line:a.trim(),message:(0,f.gJ)(b)}),null}if(!b)return null;let c=function(a){let b=s.nullish().safeParse(a.rate_limits);if(!b.success||!b.data)return;let c=v(b.data.primary),d=v(b.data.secondary);if(c||d)return{primary:c,secondary:d}}(b);if(c&&(this.rateLimits=c),"turn.failed"===b.type||"error"===b.type){this.resultIsError=!0;let a=b.error?.message??b.message;a&&(this.resultText=a)}else"turn.completed"===b.type&&(this.resultIsError=!1,this.resultText=void 0);let d=function(a){let b={type:"assistant",chunks:[],inputTokens:0,outputTokens:0,cacheCreationInputTokens:0,cacheReadInputTokens:0,isError:!1,raw:a};if("thread.started"===a.type)return{...b,type:"system",sessionId:a.thread_id};if("item.completed"===a.type&&a.item)return{...b,type:"assistant",chunks:function(a){let b=a.id??"";switch(a.item_type){case"assistant_message":case"reasoning":return a.text?[{kind:"text",text:a.text}]:[];case"command_execution":return[{kind:"tool_use",name:"command",id:b,input:{command:a.command,exit_code:a.exit_code}}];case"file_change":return[{kind:"tool_use",name:"edit",id:b,input:a}];case"mcp_tool_call":return[{kind:"tool_use",name:`${a.server??"mcp"}/${a.tool??"tool"}`,id:b,input:a}];default:return[]}}(a.item)};if("turn.completed"===a.type){let c=a.usage;return{...b,type:"result",inputTokens:c?.input_tokens??0,outputTokens:(c?.output_tokens??0)+(c?.reasoning_output_tokens??0)}}return"turn.failed"===a.type||"error"===a.type?{...b,type:"result",isError:!0}:null}(b);return d?(d.sessionId&&(this.sessionId=d.sessionId),this.totalInputTokens+=d.inputTokens,this.totalOutputTokens+=d.outputTokens,d):null}constructor(){this.buffer="",this.totalInputTokens=0,this.totalOutputTokens=0,this.totalCacheCreationInputTokens=0,this.totalCacheReadInputTokens=0,this.costUsd=0}}var x=c(87524);let y="openrouter is an HTTP provider; it has no CLI surface (dispatch on provider.kind)",z={claude:{id:"claude",label:"Claude Code",defaultCommand:"claude",supportsResume:!0,resumeModel:"claude-haiku-4-5",resumeMaxTurns:15,defaultModel:"claude-opus-4-8",buildStartArgs:({prompt:a,model:b,maxTurns:c})=>["-p",a,"--max-turns",String(c),"--permission-mode","acceptEdits","--model",b,"--output-format","stream-json","--verbose"],buildResumeArgs:({prompt:a,sessionId:b,model:c,maxTurns:d})=>["-p",a,"--resume",b,"--max-turns",String(d),"--model",c,"--output-format","stream-json","--verbose"],buildOneShotArgs:({prompt:a,model:b})=>["-p",a,"--model",b],buildStreamOneShotArgs:({prompt:a,model:b})=>["-p",a,"--model",b,"--output-format","stream-json","--verbose"],createParser:()=>new f.KO,classifyFailure:function(a){var b;let c;if(0===a.exitCode&&!a.resultIsError)return;let d=[a.resultText,a.stderr].filter(Boolean).join("\n");if(!d.trim())return;let e=h.find(a=>a.pattern.test(d));if(!e)return;let f={agent:"claude",kind:e.kind,rawSnippet:(b=e.pattern,c=d.split("\n").find(a=>b.test(a))??d,(0,g.f)(c.trim()).slice(0,300))};if("usage_limit"===e.kind){let a=d.match(i)?.[1];a&&(f.resetAt=Number(a))}if("rate_limit"===e.kind||"overloaded"===e.kind){let a=d.match(j)?.[1];a&&(f.retryAfterMs=1e3*Number(a))}return f},estimateCost:function(a,b,c,f=0,g=0){let h=function(a){if(!a)return e;let b=d[a];return b||(console.warn(`[drydock] Unknown model id "${a}" — using max-priced fallback to avoid under-counting cost`),e)}(a);return b/1e6*h.inputPerMTok+c/1e6*h.outputPerMTok+f/1e6*h.cacheWritePerMTok+g/1e6*h.cacheReadPerMTok}},codex:{id:"codex",label:"Codex CLI",defaultCommand:"codex",supportsResume:!0,resumeModel:n,resumeMaxTurns:15,defaultModel:n,buildStartArgs:({prompt:a,model:b})=>["exec","--json","--sandbox","workspace-write","--model",b,a],buildResumeArgs:({prompt:a,sessionId:b,model:c})=>["exec","resume",b,"--json","--sandbox","workspace-write","--model",c,a],buildOneShotArgs:({prompt:a,model:b})=>["exec","--model",b,a],buildStreamOneShotArgs:()=>null,createParser:()=>new w,classifyFailure:function(a){var b;let c;if(0===a.exitCode&&!a.resultIsError)return;let d=[a.resultText,a.stderr].filter(Boolean).join("\n");if(!d.trim())return;let e=l.find(a=>a.pattern.test(d));if(!e)return;let f={agent:"codex",kind:e.kind,rawSnippet:(b=e.pattern,c=d.split("\n").find(a=>b.test(a))??d,(0,g.f)(c.trim()).slice(0,300))};if("rate_limit"===e.kind||"overloaded"===e.kind){let a=d.match(m)?.[1],b=a?Math.ceil(1e3*Number(a)):NaN;Number.isFinite(b)&&b>=0&&(f.retryAfterMs=b)}return f},captureUsage:a=>a instanceof w?a.rateLimits:void 0,estimateCost:function(a,b,c){let d=function(a){if(!a)return p;let b=o[a];return b||(console.warn(`[drydock] Unknown codex model id "${a}" — using max-priced fallback to avoid under-counting cost`),p)}(a);return b/1e6*d.inputPerMTok+c/1e6*d.outputPerMTok}},openrouter:{id:"openrouter",kind:"http",label:"OpenRouter",defaultCommand:"",supportsResume:!1,resumeModel:"",resumeMaxTurns:20,defaultModel:"",buildStartArgs(){throw Error(y)},buildResumeArgs:()=>null,buildOneShotArgs(){throw Error(y)},buildStreamOneShotArgs:()=>null,createParser(){throw Error(y)},classifyFailure:x.M,estimateCost:()=>0}},A=["claude","codex","openrouter"],B="claude";function C(a){return"string"==typeof a&&A.includes(a)}function D(a){return C(a)?z[a]:z[B]}},24421:(a,b,c)=>{c.d(b,{GX:()=>n,VK:()=>l,sp:()=>m,ts:()=>k});var d=c(97496),e=c(14694),f=c(70793);c(20203);var g=c(2025),h=c(54304),i=c(64537),j=c(24978);function k(a,b=(0,g.Lf)()){return b.select().from(i.issues).where((0,d.eq)(i.issues.repoId,a)).orderBy((0,e.Y)(i.issues.priority),(0,e.Y)(i.issues.number)).all()}function l(a,b,c=(0,g.Lf)()){let e=c.select().from(i.issues).where((0,d.eq)(i.issues.repoId,a)).all(),h=new Map(e.map(a=>[a.number,a])),j=Math.floor(Date.now()/1e3),k=c.select({value:(0,f.T9)(i.issues.priority)}).from(i.issues).where((0,d.eq)(i.issues.repoId,a)).get(),m=(k?.value??-1)+1,n=new Set;for(let e of b){n.add(e.number);let b=JSON.stringify(e.labels.map(a=>a.name)),f=h.get(e.number);f?c.update(i.issues).set({title:e.title,labels:b,state:"open",syncedAt:j}).where((0,d.eq)(i.issues.id,f.id)).run():c.insert(i.issues).values({repoId:a,number:e.number,title:e.title,labels:b,state:"open",priority:m++,syncedAt:j}).run()}let o=e.filter(a=>!n.has(a.number)).map(a=>a.id);o.length>0&&c.delete(i.issues).where((0,d.RV)(i.issues.id,o)).run()}function m(a,b,c,e,f=(0,g.Lf)()){let h,j=f.select().from(i.issues).where((0,d.Uo)((0,d.eq)(i.issues.repoId,a),(0,d.eq)(i.issues.number,b))).get();if(!j)return;try{let a=JSON.parse(j.labels);h=Array.isArray(a)?a:[]}catch{h=[]}let k=[...h];for(let a of c)k.includes(a)||k.push(a);let l=new Set(e),n=k.filter(a=>!l.has(a));f.update(i.issues).set({labels:JSON.stringify(n)}).where((0,d.eq)(i.issues.id,j.id)).run()}async function n(a,b=(0,g.Lf)()){let c=function(a,b){let c=(0,h.L8)(a,b);if(!c)throw Error(`repo ${a} not found`);return c}(a,b);return l(a,await (0,j.Ie)(c).listAllIssues(),b),k(a,b)}c(58543)},24978:(a,b,c)=>{c.d(b,{Ie:()=>N});var d=c(29980),e=c(77597);class f{get(a){return this.entries.get(a)}set(a,b,c){this.entries.set(a,{etag:b,body:c})}delete(a){this.entries.delete(a)}constructor(){this.entries=new Map}}let g=new f;function h(a){let b=a.replace(/\r\n/g,"\n"),c=b.lastIndexOf("\nHTTP/"),d=c>=0?c+1:b.startsWith("HTTP/")?0:-1;if(d<0)return{status:null,headers:{},body:a};let e=b.slice(d),f=e.indexOf("\n\n"),g=f>=0?e.slice(0,f):e,h=f>=0?e.slice(f+2):"",i=g.split("\n"),j=(i.shift()??"").match(/^HTTP\/\S+\s+(\d+)/),k=j?Number(j[1]):null,l={};for(let a of i){let b=a.indexOf(":");b<=0||(l[a.slice(0,b).trim().toLowerCase()]=a.slice(b+1).trim())}return{status:k,headers:l,body:h}}function i(a){if(!a)return null;for(let b of a.split(",")){let a=b.match(/<([^>]+)>\s*;\s*rel="?next"?/);if(a?.[1])return a[1]}return null}var j=c(64417),k=c(91549);let l=d.Ik({number:d.ai(),title:d.Yj(),labels:d.YO(d.Ik({name:d.Yj()})).default([]),user:d.Ik({login:d.Yj()}).nullish(),author_association:d.Yj().nullish(),pull_request:d.L5().optional()}).transform(a=>({number:a.number,title:a.title,labels:a.labels,author:a.user?.login??null,authorAssociation:a.author_association??null,isPullRequest:void 0!==a.pull_request})),m=d.Ik({resources:d.g1(d.Yj(),d.Ik({limit:d.ai(),remaining:d.ai(),reset:d.ai()}))}),n=d.Ik({number:d.ai(),title:d.Yj(),body:d.Yj().default(""),state:d.Yj().default("open"),labels:d.YO(d.Ik({name:d.Yj()})).default([]),comments:d.YO(d.Ik({author:d.Ik({login:d.Yj()}).default({login:""}),body:d.Yj().default(""),createdAt:d.Yj().default("")})).default([])}),o=d.Ik({name:d.Yj(),state:d.Yj(),bucket:d.Yj().optional()}),p=d.Ik({data:d.Ik({repository:d.Ik({pullRequest:d.Ik({reviewThreads:d.Ik({nodes:d.YO(d.Ik({id:d.Yj(),isResolved:d.zM().default(!1),isOutdated:d.zM().default(!1),path:d.Yj().nullish(),line:d.ai().nullish(),comments:d.Ik({nodes:d.YO(d.Ik({id:d.Yj(),databaseId:d.ai().nullish(),body:d.Yj().default(""),author:d.Ik({login:d.Yj(),__typename:d.Yj().nullish()}).nullish()}))})}))})}).nullish()})})});class q extends Error{}function r(a,b){return`${a}=${b}`}function s(a){let b;try{b=JSON.parse(a||"[]")}catch{throw new q("unexpected gh output: response body was not valid JSON")}if(!Array.isArray(b))throw new q("unexpected gh output: expected a JSON array");return b}class t{constructor(a,b=e.Sx,c=k.og,d=g){this.cwd=a,this.run=b,this.governor=c,this.etags=d}gate(a="core"){let b=this.governor.decide(a,(0,j.u)());if(!b.allowed)throw new k.OE(b.reason,a,b.retryAfterMs)}async exec(a,b="core"){this.gate(b);let c=await this.run("gh",a,this.cwd);return 0!==c.exitCode&&/rate limit|429 too many/i.test(c.stderr)&&this.governor.note429(b),c}async refreshRateLimit(){let a,b=await this.run("gh",["api","rate_limit"],this.cwd);if(0===b.exitCode){try{a=m.parse(JSON.parse(b.stdout||"{}"))}catch{return}for(let b of["core","graphql","search"]){let c=a.resources[b];c&&this.governor.observe(b,c)}}}async conditionalList(a,b){this.gate("core");let c=this.etags.get(a),d=["api",`repos/{owner}/{repo}/issues?${b}`,"--include"];c&&d.push("-H",`If-None-Match: ${c.etag}`);let e=await this.run("gh",d,this.cwd),f=this.checkListResponse(e,h(e.stdout));if(304===f.status&&c)return this.toGhIssues(s(c.body));let g=[...s(f.body)],j=i(f.headers.link),k=Number(new URLSearchParams(b).get("per_page")??"30"),l=!j&&Number.isFinite(k)&&g.length<k,m=1;for(;j&&m<100;){this.gate("core");let a=await this.run("gh",["api",j,"--include"],this.cwd),b=this.checkListResponse(a,h(a.stdout));g.push(...s(b.body)),j=i(b.headers.link),m++}let n=f.headers.etag;return n&&l?this.etags.set(a,n,JSON.stringify(g)):this.etags.delete(a),this.toGhIssues(g)}checkListResponse(a,b){var c,d;let e=(0,k.bR)(b.headers);if(e&&this.governor.observe(e.resource,e.snapshot),304===b.status)return b;if(c=b.status,d=b.headers,429===c||403===c&&"0"===d["x-ratelimit-remaining"]){let a=Number(b.headers["x-ratelimit-reset"]);throw this.governor.note429("core",Number.isFinite(a)?a:void 0),new q(`gh api rate limited (status ${b.status})`)}if(200!==b.status)throw new q(a.stderr||`gh api failed (status ${b.status??"unknown"})`);return b}toGhIssues(a){let b=d.YO(l).safeParse(a);if(!b.success)throw new q(`unexpected gh output: ${b.error.message}`);return b.data.filter(a=>!a.isPullRequest).map(({isPullRequest:a,...b})=>b)}async listIssues(a){let b=`state=open&per_page=100&labels=${encodeURIComponent(a)}`;return this.conditionalList(`${this.cwd}::label:${a}`,b)}async listAllIssues(){return this.conditionalList(`${this.cwd}::all`,"state=open&per_page=100")}async viewIssue(a){let b=await this.exec(["issue","view",String(a),"--json","number,title,body,state,labels,comments"]);if(0!==b.exitCode)throw new q(b.stderr||"gh issue view failed");let c=n.safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);let d=c.data;return{number:d.number,title:d.title,body:d.body,state:d.state,labels:d.labels.map(a=>a.name),comments:d.comments.map(a=>({author:a.author.login,body:a.body,createdAt:a.createdAt}))}}async editIssue(a,b){let c=["issue","edit",String(a)];if(void 0!==b.title&&c.push(r("--title",b.title)),void 0!==b.body&&c.push(r("--body",b.body)),3===c.length)return;let d=await this.exec(c);if(0!==d.exitCode)throw new q(d.stderr||"gh issue edit failed")}async ensureLabel(a,b={}){let c=await this.exec(["label","list","--json","name","--limit","200"]),e=c.stdout.trim();if(0===c.exitCode&&e)try{let b=d.YO(d.Ik({name:d.Yj()})).safeParse(JSON.parse(e));if(b.success&&b.data.some(b=>b.name===a))return}catch{}let f=["label","create"];b.color&&f.push(r("--color",b.color)),b.description&&f.push(r("--description",b.description)),f.push("--",a);let g=await this.exec(f);if(0!==g.exitCode&&!/already exists/i.test(g.stderr))throw new q(g.stderr||"gh label create failed")}async addLabels(a,b){let c=await this.exec(["issue","edit",String(a),r("--add-label",b.join(","))]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue edit failed")}async removeLabels(a,b){let c=await this.exec(["issue","edit",String(a),r("--remove-label",b.join(","))]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue edit failed")}async closeIssue(a){let b=await this.exec(["issue","close",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh issue close failed")}async reopenIssue(a){let b=await this.exec(["issue","reopen",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh issue reopen failed")}async prChecks(a){let b=await this.exec(["pr","checks",String(a),"--json","name,state,bucket"]),c=b.stdout.trim();if(!c){if(0!==b.exitCode)throw new q(b.stderr||"gh pr checks failed");return[]}let e=d.YO(o).safeParse(JSON.parse(c));if(!e.success)throw new q(`unexpected gh output: ${e.error.message}`);return e.data}async prHeadSha(a){let b=await this.exec(["pr","view",String(a),"--json","headRefOid"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr view failed");let c=d.Ik({headRefOid:d.Yj()}).safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);return c.data.headRefOid}async prMergeCommitSha(a){let b=await this.exec(["pr","view",String(a),"--json","mergeCommit"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr view failed");let c=d.Ik({mergeCommit:d.Ik({oid:d.Yj()}).nullish()}).safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);return c.data.mergeCommit?.oid??null}async commentIssue(a,b){let c=await this.exec(["issue","comment",String(a),r("--body",b)]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue comment failed")}async listIssueComments(a){let b,c=await this.exec(["issue","view",String(a),"--json","comments"]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue view failed");try{b=JSON.parse(c.stdout||"{}")}catch{throw new q(`unexpected gh output: ${c.stdout.slice(0,200)}`)}let e=d.Ik({comments:d.YO(d.Ik({id:d.Yj(),body:d.Yj().default("")})).default([])}).safeParse(b);if(!e.success)throw new q(`unexpected gh output: ${e.error.message}`);return e.data.comments.map(a=>({id:a.id,body:a.body}))}async updateIssueComment(a,b,c){let d=await this.exec(["api","graphql","-F",`id=${b}`,"-f",`body=${c}`,"-f","query=mutation($id:ID!,$body:String!){updateIssueComment(input:{id:$id,body:$body}){issueComment{id}}}"],"graphql");if(0!==d.exitCode)throw new q(d.stderr||"gh update issue comment failed")}async commentPr(a,b){let c=await this.exec(["pr","comment",String(a),r("--body",b)]);if(0!==c.exitCode)throw new q(c.stderr||"gh pr comment failed")}async createIssue(a,b){let c=await this.exec(["issue","create",r("--title",a),r("--body",b)]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue create failed");let d=c.stdout.match(/\/issues\/(\d+)/);if(!d?.[1])throw new q(`could not parse issue number from: ${c.stdout}`);return Number(d[1])}async latestFailedRunId(a){let b,c,e=await this.run("gh",["pr","view",String(a),"--json","headRefName"],this.cwd);if(0!==e.exitCode)return null;try{b=d.Ik({headRefName:d.Yj()}).parse(JSON.parse(e.stdout||"{}")).headRefName}catch{return null}if(!b)return null;let f=await this.run("gh",["run","list","--branch",b,"--json","databaseId,conclusion","--limit","20"],this.cwd);if(0!==f.exitCode)return null;try{c=d.YO(d.Ik({databaseId:d.ai(),conclusion:d.Yj().default("")})).parse(JSON.parse(f.stdout||"[]"))}catch{return null}return c.find(a=>"failure"===a.conclusion)?.databaseId??null}async failedRunLog(a){if(!this.governor.decide("core",(0,j.u)()).allowed)return"";let b=await this.latestFailedRunId(a);if(null===b)return"";let c=await this.run("gh",["run","view",String(b),"--log-failed"],this.cwd);return 0!==c.exitCode?"":c.stdout.slice(-8e3)}async reRunFailedChecks(a){if(!this.governor.decide("core",(0,j.u)()).allowed)return!1;let b=await this.latestFailedRunId(a);return null!==b&&0===(await this.run("gh",["run","rerun",String(b),"--failed"],this.cwd)).exitCode}async prDiff(a){if(!this.governor.decide("core",(0,j.u)()).allowed)return"";let b=await this.run("gh",["pr","diff",String(a)],this.cwd);return 0!==b.exitCode?"":b.stdout}async mergePr(a){let b=await this.exec(["pr","merge",String(a),"--squash","--auto"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr merge failed")}async createPr(a){let b=await this.exec(["pr","create",r("--head",a.head),r("--base",a.base),r("--title",a.title),r("--body",a.body)]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr create failed");let c=b.stdout.match(/\/pull\/(\d+)/);if(!c?.[1])throw new q(`could not parse PR number from: ${b.stdout}`);return Number(c[1])}async deleteBranch(a){let b=a.split("/").map(encodeURIComponent).join("/"),c=await this.exec(["api","-X","DELETE",`repos/{owner}/{repo}/git/refs/heads/${b}`]);if(0!==c.exitCode&&!/reference does not exist|HTTP 404/i.test(c.stderr))throw new q(c.stderr||"gh branch delete failed")}async prMergeState(a){let b=await this.exec(["pr","view",String(a),"--json","mergeable,mergeStateStatus"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr view failed");let c=d.Ik({mergeable:d.Yj().default(""),mergeStateStatus:d.Yj().default("")}).safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);let{mergeable:e,mergeStateStatus:f}=c.data;return"CONFLICTING"===e||"DIRTY"===f?"conflicted":"BEHIND"===f?"behind":"MERGEABLE"===e?"clean":"unknown"}async updatePrBranch(a){let b=await this.exec(["pr","update-branch",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr update-branch failed")}async listReleases(){let a=await this.exec(["release","list","--json","tagName,createdAt","--limit","100"]);if(0!==a.exitCode)throw new q(a.stderr||"gh release list failed");let b=d.YO(d.Ik({tagName:d.Yj(),createdAt:d.Yj().default("")})).safeParse(JSON.parse(a.stdout||"[]"));if(!b.success)throw new q(`unexpected gh output: ${b.error.message}`);return b.data}async listMergedPrs(a=100){let b=await this.exec(["pr","list","--state","merged","--json","number,title,mergedAt,labels","--limit",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr list failed");let c=d.YO(d.Ik({number:d.ai(),title:d.Yj().default(""),mergedAt:d.Yj().default(""),labels:d.YO(d.Ik({name:d.Yj()})).default([])})).safeParse(JSON.parse(b.stdout||"[]"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);return c.data.map(a=>({number:a.number,title:a.title,mergedAt:a.mergedAt,labels:a.labels.map(a=>a.name)}))}async createRelease(a){let b=await this.exec(["release","create",a.tag,r("--title",a.title),r("--notes",a.notes),r("--target",a.target)]);if(0!==b.exitCode)throw new q(b.stderr||"gh release create failed")}async repoSlug(){if(this.slug)return this.slug;let a=await this.exec(["repo","view","--json","nameWithOwner"]);if(0!==a.exitCode)throw new q(a.stderr||"gh repo view failed");let b=d.Ik({nameWithOwner:d.Yj()}).safeParse(JSON.parse(a.stdout||"{}"));if(!b.success)throw new q(`unexpected gh output: ${b.error.message}`);let[c,e]=b.data.nameWithOwner.split("/");if(!c||!e)throw new q(`unexpected repo slug: ${b.data.nameWithOwner}`);return this.slug={owner:c,name:e},this.slug}async listReviewThreads(a){let{owner:b,name:c}=await this.repoSlug(),d=await this.exec(["api","graphql","-F",`owner=${b}`,"-F",`name=${c}`,"-F",`number=${a}`,"-f","query=query($owner:String!,$name:String!,$number:Int!){repository(owner:$owner,name:$name){pullRequest(number:$number){reviewThreads(first:100){nodes{id isResolved isOutdated path line comments(first:100){nodes{id databaseId body author{login __typename}}}}}}}}"],"graphql");if(0!==d.exitCode)throw new q(d.stderr||"gh api graphql failed");let e=p.safeParse(JSON.parse(d.stdout||"{}"));if(!e.success)throw new q(`unexpected gh output: ${e.error.message}`);return(e.data.data.repository.pullRequest?.reviewThreads.nodes??[]).map(a=>({id:a.id,isResolved:a.isResolved,isOutdated:a.isOutdated,path:a.path??null,line:a.line??null,comments:a.comments.nodes.map(a=>({id:a.id,databaseId:a.databaseId??null,author:a.author?.login??"",authorIsBot:a.author?.__typename==="Bot",body:a.body}))}))}async replyToReviewThread(a,b){let c=await this.exec(["api","graphql","-F",`threadId=${a}`,"-f",`body=${b}`,"-f","query=mutation($threadId:ID!,$body:String!){addPullRequestReviewThreadReply(input:{pullRequestReviewThreadId:$threadId,body:$body}){comment{id}}}"],"graphql");if(0!==c.exitCode)throw new q(c.stderr||"gh review reply failed")}async updateReviewComment(a,b){let c=await this.exec(["api","graphql","-F",`id=${a}`,"-f",`body=${b}`,"-f","query=mutation($id:ID!,$body:String!){updatePullRequestReviewComment(input:{pullRequestReviewCommentId:$id,body:$body}){pullRequestReviewComment{id}}}"],"graphql");if(0!==c.exitCode)throw new q(c.stderr||"gh update review comment failed")}async resolveReviewThread(a){let b=await this.exec(["api","graphql","-F",`threadId=${a}`,"-f","query=mutation($threadId:ID!){resolveReviewThread(input:{threadId:$threadId}){thread{id isResolved}}}"],"graphql");if(0!==b.exitCode)throw new q(b.stderr||"gh resolve thread failed")}async reactToReviewComment(a,b){let c=await this.exec(["api","graphql","-F",`subjectId=${a}`,"-F",`content=${b}`,"-f","query=mutation($subjectId:ID!,$content:ReactionContent!){addReaction(input:{subjectId:$subjectId,content:$content}){reaction{content}}}"],"graphql");if(0!==c.exitCode&&!/already has this reaction/i.test(c.stderr))throw new q(c.stderr||"gh add reaction failed")}}var u=c(75818),v=c(87105),w=c(87232),x=c(25480);let y=d.Ik({iid:d.ai(),title:d.Yj(),labels:d.YO(d.Yj()).default([]),author:d.Ik({username:d.Yj()}).nullish()}),z=d.Ik({iid:d.ai(),title:d.Yj(),description:d.Yj().nullable().default(""),state:d.Yj().default("opened"),labels:d.YO(d.Yj()).default([])}),A=d.Ik({author:d.Ik({username:d.Yj().default("")}).default({username:""}),body:d.Yj().default(""),created_at:d.Yj().default(""),system:d.zM().default(!1)}),B=d.Ik({id:d.ai(),body:d.Yj().default("")}),C=d.Ik({id:d.ai().optional(),name:d.Yj().default(""),status:d.Yj().default("")}),D=d.Ik({head_pipeline:d.Ik({id:d.ai()}).nullable().optional()}),E=d.Ik({old_path:d.Yj().default(""),new_path:d.Yj().default(""),diff:d.Yj().default("")});class F{constructor(a,b={}){this.config=a,this.http=b.http??v.D,this.run=b.run??e.Sx,this.sleep=b.sleep??(a=>new Promise(b=>setTimeout(b,a))),this.allowPrivateHost=b.allowPrivateHost??(0,x.gT)()}resolveProject(){if(!this.projectRef){let a=(async()=>{let a=await this.run("git",["remote","get-url","origin"],this.config.cwd);if(0!==a.exitCode||!a.stdout.trim())throw new w.Q8(a.stderr||"could not resolve git remote 'origin'");let{host:b,path:c}=function(a){let b=a.trim().replace(/\.git$/,""),c=b.match(/^[\w.-]+@([^:]+):(.+)$/)??b.match(/^ssh:\/\/[^@]+@([^/]+)\/(.+)$/)??b.match(/^https?:\/\/([^/]+)\/(.+)$/);if(!c?.[1]||!c[2])throw new w.Q8(`unsupported git remote URL: ${a}`);return{host:c[1],path:c[2]}}(a.stdout);return{baseUrl:(this.config.baseUrl?.trim()||`https://${b}`).replace(/\/$/,""),encodedPath:encodeURIComponent(c)}})();a.catch(()=>{this.projectRef===a&&(this.projectRef=void 0)}),this.projectRef=a}return this.projectRef}async request(a,b,c={}){let d,{baseUrl:e,encodedPath:f}=await this.resolveProject(),g=`${e}/api/v4/projects/${f}${b}`;if(c.query){let a=new URLSearchParams(c.query).toString();a&&(g+=`?${a}`)}(0,x.sM)(g,{allowPrivate:this.allowPrivateHost});let h={};return this.config.token&&(h["PRIVATE-TOKEN"]=this.config.token),void 0!==c.body&&(h["Content-Type"]="application/json",d=JSON.stringify(c.body)),this.http(g,{method:a,headers:h,body:d})}async mutate(a,b,c={}){let d=await this.request(a,b,c);if(429===d.status)throw await this.sleep(function(a){if(a){let b=a["retry-after"];if(b){let a=Number(b);if(Number.isFinite(a)&&a>0)return Math.min(1e3*a,3e5)}let c=a["ratelimit-reset"]??a["x-ratelimit-reset"];if(c){let a=Number(c);if(Number.isFinite(a)){let b=1e3*a-Date.now();if(b>0)return Math.min(b,3e5)}}}return 6e4}(d.headers)),new w.Q8(`GitLab rate-limited: ${M(d)||`${a} ${b} returned 429`}`);if(!d.ok)throw new w.Q8(M(d)||`GitLab ${a} ${b} failed`);return d}async listIssues(a){return this.listIssuesPaginated({state:"opened",labels:a})}async listAllIssues(){return this.listIssuesPaginated({state:"opened"})}async listIssuesPaginated(a){return this.listPaginated("/issues",a,G)}async listPaginated(a,b,c){let d=[],e=1;for(let f=0;f<100;f++){let f=await this.mutate("GET",a,{query:{...b,per_page:"100",page:String(e)}});d.push(...c(f.body));let g=f.headers?.["x-next-page"];if(!g)break;let h=Number(g);if(!Number.isInteger(h)||h<=e)break;e=h}return d}async viewIssue(a){let b=await this.mutate("GET",`/issues/${a}`),c=await this.listPaginated(`/issues/${a}/notes`,{},K),d=z.parse(L(b.body,{}));return{number:d.iid,title:d.title,body:d.description??"",state:"opened"===d.state?"open":d.state,labels:d.labels,comments:c.filter(a=>!a.system).map(a=>({author:a.author.username,body:a.body,createdAt:a.created_at}))}}async editIssue(a,b){let c={};void 0!==b.title&&(c.title=b.title),void 0!==b.body&&(c.description=b.body),0!==Object.keys(c).length&&await this.mutate("PUT",`/issues/${a}`,{body:c})}async ensureLabel(a,b={}){var c;let e=await this.request("GET","/labels",{query:{per_page:"100"}});if(e.ok){let b=d.YO(d.Ik({name:d.Yj()})).safeParse(L(e.body,[]));if(b.success&&b.data.some(b=>b.name===a))return}let f={name:a,color:(c=b.color??"#808080").startsWith("#")?c:`#${c}`};b.description&&(f.description=b.description);let g=await this.request("POST","/labels",{body:f});if(!g.ok&&409!==g.status&&!/already exists/i.test(g.body))throw new w.Q8(M(g)||"GitLab label create failed")}async addLabels(a,b){await this.mutate("PUT",`/issues/${a}`,{body:{add_labels:b.join(",")}})}async removeLabels(a,b){await this.mutate("PUT",`/issues/${a}`,{body:{remove_labels:b.join(",")}})}async closeIssue(a){await this.mutate("PUT",`/issues/${a}`,{body:{state_event:"close"}})}async reopenIssue(a){await this.mutate("PUT",`/issues/${a}`,{body:{state_event:"reopen"}})}async commentIssue(a,b){await this.mutate("POST",`/issues/${a}/notes`,{body:{body:b}})}async listIssueComments(a){return(await this.listPaginated(`/issues/${a}/notes`,{},H)).map(a=>({id:String(a.id),body:a.body}))}async updateIssueComment(a,b,c){await this.mutate("PUT",`/issues/${a}/notes/${encodeURIComponent(b)}`,{body:{body:c}})}async commentPr(a,b){await this.mutate("POST",`/merge_requests/${a}/notes`,{body:{body:b}})}async createIssue(a,b){let c=await this.mutate("POST","/issues",{body:{title:a,description:b}});return d.Ik({iid:d.ai()}).parse(L(c.body,{})).iid}async prChecks(a){let b=await this.latestPipelineId(a);return null===b?[]:(await this.listPaginated(`/pipelines/${b}/jobs`,{},I)).map(a=>({name:a.name,state:function(a){switch(a){case"success":return"SUCCESS";case"failed":return"FAILURE";case"canceled":case"cancelled":return"CANCELLED";case"running":return"IN_PROGRESS";case"pending":case"created":case"scheduled":case"preparing":case"waiting_for_resource":return"PENDING";case"manual":return"MANUAL";case"skipped":return"SKIPPED";default:return a.toUpperCase()}}(a.status)}))}async prHeadSha(a){let b=await this.mutate("GET",`/merge_requests/${a}`);return d.Ik({sha:d.Yj()}).parse(L(b.body,{})).sha}async prMergeCommitSha(a){let b=await this.mutate("GET",`/merge_requests/${a}`),c=d.Ik({squash_commit_sha:d.Yj().nullish(),merge_commit_sha:d.Yj().nullish()}).parse(L(b.body,{}));return c.squash_commit_sha??c.merge_commit_sha??null}async failedRunLog(a){try{let b=await this.latestPipelineId(a);if(null===b)return"";let c=(await this.listPaginated(`/pipelines/${b}/jobs`,{},I)).find(a=>"failed"===a.status&&void 0!==a.id);if(!c)return"";let d=await this.request("GET",`/jobs/${c.id}/trace`);if(!d.ok)return(0,u.v)(`GitLab failedRunLog: job ${c.id} trace request failed (${d.status})`),"";return d.body.slice(-8e3)}catch(a){return(0,u.v)("GitLab failedRunLog error:",a),""}}async prDiff(a){try{return(await this.listPaginated(`/merge_requests/${a}/diffs`,{},J)).map(a=>`--- a/${a.old_path}
|
|
1
|
+
"use strict";exports.id=99,exports.ids=[99],exports.modules={1065:(a,b,c)=>{c.d(b,{ND:()=>r,RD:()=>p,TG:()=>h,_M:()=>j});var d=c(73024),e=c(48161),f=c(76760),g=c(77597);function h(){return process.env.DRYDOCK_HOME??(0,f.join)((0,e.homedir)(),".drydock")}function i(a){return a.replace(/[^a-zA-Z0-9._-]/g,"-")}function j(a){return(0,f.join)(h(),"worktrees",i(a))}let k="claude|anthropic|codex|openai|chatgpt|copilot|gemini|cursor|devin",l=RegExp(`^(?:co-authored-by:.*\\b(?:${k})\\b|🤖?\\s*generated (?:with|by)\\b.*\\b(?:${k})\\b)`,"i");function m(a){return a.split("\n").filter(a=>!l.test(a.trim())).join("\n").replace(/\n{3,}/g,"\n\n").replace(/\s+$/,"")}function n(a){return""===a.trim()?"chore: update":a}class o extends Error{}class p extends o{constructor(){super("nothing to commit")}}let q=new Map;class r{constructor(a=g.Sx){this.run=a}withRepoLock(a,b){let c=(q.get(a)??Promise.resolve()).then(b,b);return q.set(a,c.then(()=>void 0,()=>void 0)),c}async git(a,b){let c=await this.run("git",a,b);if(0!==c.exitCode)throw new o(c.stderr.trim()||`git ${a[0]} failed`);return c.stdout}async prepare(a,b,c=0,e=`issue-${c}`){let g=`drydock/${e}-job-${b}`,h=(0,f.join)(j(a.name),`job-${b}`),i=await this.withRepoLock(a.path,async()=>(await this.git(["-C",a.path,"worktree","remove","--force",h]).catch(()=>void 0),(0,d.rmSync)(h,{recursive:!0,force:!0}),await this.git(["-C",a.path,"worktree","prune"]).catch(()=>void 0),await this.git(["-C",a.path,"branch","-D",g]).catch(()=>void 0),await this.git(["-C",a.path,"worktree","add","-b",g,h,a.defaultBranch]),this.resolveBase(a.path,g)));return{path:h,branch:g,base:i}}async prepareForBranch(a,b,c){let d=(0,f.join)(j(a.name),`fb-${i(c)}`),e=await this.withRepoLock(a.path,async()=>(await this.git(["-C",a.path,"fetch","origin",b]),await this.git(["-C",a.path,"worktree","add",d,b]),this.resolveBase(a.path,b)));return{path:d,branch:b,base:e}}async prepareResume(a,b,c){let e=(0,f.join)(j(a.name),`job-${b}`),g=await this.withRepoLock(a.path,async()=>(await this.git(["-C",a.path,"worktree","remove","--force",e]).catch(()=>void 0),(0,d.rmSync)(e,{recursive:!0,force:!0}),await this.git(["-C",a.path,"worktree","prune"]).catch(()=>void 0),await this.git(["-C",a.path,"branch","-D",c]).catch(()=>void 0),await this.git(["-C",a.path,"fetch","origin",c]),await this.git(["-C",a.path,"worktree","add","-B",c,e,`origin/${c}`]),this.resolveBase(a.path,c)));return{path:e,branch:c,base:g}}async prepareForNewBranch(a,b,c){let d=(0,f.join)(j(a.name),`dh-${i(c)}`),e=await this.withRepoLock(a.path,async()=>(await this.git(["-C",a.path,"worktree","add","-b",b,d,a.defaultBranch]),this.resolveBase(a.path,b)));return{path:d,branch:b,base:e}}async resolveBase(a,b){return(await this.git(["-C",a,"rev-parse",b])).trim()}async hasNewCommits(a){return!!a.base&&Number.parseInt((await this.git(["rev-list","--count",`${a.base}..HEAD`],a.path)).trim()||"0",10)>0}async stageForPush(a,b){return(await this.git(["add","-A"],a.path),""!==(await this.git(["status","--porcelain"],a.path)).trim())?(await this.git(["commit","-m",n(m(b))],a.path),!0):this.hasNewCommits(a)}async commitAndPush(a,b){if(!await this.stageForPush(a,b))throw new p;await this.stripAttributionFromHistory(a),await this.git(["push","-u","origin",a.branch],a.path)}async commitAndPushForHuman(a,b){return!!await this.stageForPush(a,b)&&(await this.stripAttributionFromHistory(a),await this.git(["push","-u","origin",a.branch],a.path),!0)}async stripAttributionFromHistory(a){if(!a.base)return;let b=(await this.git(["rev-list","--reverse",`${a.base}..HEAD`],a.path)).trim();if(!b)return;let c=b.split("\n"),d=[],e=!1;for(let b of c){let c=(await this.git(["log","-1","--format=%B",b],a.path)).replace(/\s+$/,""),f=m(c);d.push({sha:b,original:c,cleaned:f}),f!==c&&(e=!0)}if(e)for(let b of(await this.git(["reset","--hard",a.base],a.path),d))await this.git(["cherry-pick",b.sha],a.path),b.cleaned!==b.original&&await this.git(["commit","--amend","-m",n(b.cleaned)],a.path)}async remove(a,b){await this.withRepoLock(b,async()=>{await this.git(["-C",b,"worktree","remove","--force",a.path]),await this.git(["-C",b,"worktree","prune"])})}}},2412:(a,b,c)=>{c.d(b,{N6:()=>o,_S:()=>k,ax:()=>l,dk:()=>n,i1:()=>p,yM:()=>m});var d=c(97496),e=c(14694),f=c(2025),g=c(64537),h=c(74644),i=c(34973),j=c(52479);function k(a,b=(0,f.Lf)()){let c=b.insert(g.jobs).values({repoId:a.repoId,issueNumber:a.issueNumber,kind:a.kind??"issue",status:"queued",model:a.model,agent:a.agent??"claude",maxTurns:a.maxTurns??(0,h.mt)(b).maxTurns,dedupeKey:a.dedupeKey??null}).returning().get();return(0,i.ej)(),c}function l(a,b=(0,f.Lf)()){return b.select().from(g.jobs).where((0,d.eq)(g.jobs.id,a)).get()}function m(a,b,c,d=(0,f.Lf)()){d.insert(g.jobEvents).values({jobId:a,type:b,payload:JSON.stringify(c??{})}).run()}function n(a,b,c={},e=(0,f.Lf)()){let h=e.transaction(e=>{let f=l(a,e);if(!f)throw Error(`job ${a} not found`);(0,j.QJ)(f.status,b);let h=Math.floor(Date.now()/1e3),i={};"working"!==b||f.startedAt||(i.startedAt=h),["merged","released","needs_human","aborted"].includes(b)&&(i.finishedAt=h);let k=e.update(g.jobs).set({...i,...c,status:b}).where((0,d.eq)(g.jobs.id,a)).returning().get();return m(a,"status",{from:f.status,to:b},e),k});return(0,i.ej)(),h}function o(a,b=(0,f.Lf)()){return b.select().from(g.jobs).where((0,d.eq)(g.jobs.repoId,a)).orderBy((0,e.i)(g.jobs.createdAt)).all()}function p(a,b=(0,f.Lf)()){return b.select().from(g.jobs).where((0,d.RV)(g.jobs.status,a)).all()}},9617:(a,b,c)=>{let d;c.d(b,{Ix:()=>u,Ym:()=>q,_$:()=>p,jQ:()=>r,m:()=>n,pp:()=>t,sV:()=>m,wL:()=>s});var e=c(77598),f=c(48161),g=c(97496),h=c(84232),i=c(2025),j=c(64537),k=c(2412),l=c(52479);let m=3e4,n=1e4,o=()=>Math.floor(Date.now()/1e3);function p(){return d||(d=`${(0,f.hostname)()}#${process.pid}`),d}function q(a={},b=(0,i.Lf)()){let{repoIds:c,excludeAgents:d}=a;if(c&&0===c.length)return;let f=a.leaseMs??m,l=a.worker??p(),n=a.now??o();return b.transaction(a=>{let b=a.select({job:j.jobs}).from(j.jobs).leftJoin(j.issues,(0,g.Uo)((0,g.eq)(j.issues.repoId,j.jobs.repoId),(0,g.eq)(j.issues.number,j.jobs.issueNumber))).where((0,g.Uo)((0,g.eq)(j.jobs.status,"queued"),(0,g.or)((0,g.kZ)(j.jobs.availableAt),(0,g.wJ)(j.jobs.availableAt,n)),c?(0,g.RV)(j.jobs.repoId,c):void 0,d&&d.length>0?(0,g.KL)(j.jobs.agent,d):void 0)).orderBy((0,h.ll)`COALESCE(${j.issues.priority}, 1e9)`,j.jobs.createdAt).get()?.job;if(b)return(0,k.dk)(b.id,"working",{leaseToken:(0,e.randomUUID)(),leaseExpiresAt:n+Math.ceil(f/1e3),workerId:l,attempts:b.attempts+1,availableAt:null},a)})}function r(a,b,c={},d=(0,i.Lf)()){let e=c.leaseMs??m,f=c.now??o();return d.update(j.jobs).set({leaseExpiresAt:f+Math.ceil(e/1e3)}).where((0,g.Uo)((0,g.eq)(j.jobs.id,a),(0,g.eq)(j.jobs.leaseToken,b),(0,g.eq)(j.jobs.status,"working"))).run().changes>0}function s(a,b,c=(0,i.Lf)()){return c.update(j.jobs).set({leaseToken:null,leaseExpiresAt:null,workerId:null}).where((0,g.Uo)((0,g.eq)(j.jobs.id,a),(0,g.eq)(j.jobs.leaseToken,b))).run().changes>0}function t(a={},b=(0,i.Lf)()){let c=a.now??o(),d=a.expiredBefore,e=void 0===d?void 0:(0,g.or)((0,g.kZ)(j.jobs.leaseExpiresAt),(0,g.wJ)(j.jobs.leaseExpiresAt,d)),f=b.select().from(j.jobs).where((0,g.Uo)((0,g.eq)(j.jobs.status,"working"),e)).all();for(let a of f)b.update(j.jobs).set({status:"queued",leaseToken:null,leaseExpiresAt:null,workerId:null,availableAt:c+function(a,b=5,c=300){return a<=0?0:Math.min(b*2**(a-1),c)}(a.attempts)}).where((0,g.eq)(j.jobs.id,a.id)).run(),(0,k.yM)(a.id,"status",{from:"working",to:"queued",reason:"lease_expired"},b);return f.length}function u(a,b=(0,i.Lf)()){let c=a.dedupeKey??`${a.repoId}:${a.issueNumber}`;if(!b.select({id:j.jobs.id}).from(j.jobs).where((0,g.Uo)((0,g.eq)(j.jobs.dedupeKey,c),(0,g.KL)(j.jobs.status,[...l.kl]))).get())try{return(0,k._S)({...a,dedupeKey:c},b)}catch(a){if(a instanceof Error&&"string"==typeof a.code&&"SQLITE_CONSTRAINT_UNIQUE"===a.code)return;throw a}}},16544:(a,b,c)=>{c.d(b,{A:()=>f,i:()=>g});let d=new Set(["OWNER","MEMBER","COLLABORATOR"]);function e(a){try{let b=JSON.parse(a);return Array.isArray(b)?b.filter(a=>"string"==typeof a):[]}catch{return[]}}function f(a){return{autoTriageEnabled:a.autoTriageEnabled,autoProcessEnabled:a.autoProcessEnabled,autoHealCi:a.autoHealCi,autoReviewFeedback:a.autoReviewFeedback,mergeWithoutChecks:a.mergeWithoutChecks,autoResolveMergeConflicts:a.autoResolveMergeConflicts,includeProgressReplies:a.includeProgressReplies,autoDecompose:a.autoDecompose,planFirst:a.planFirst,verifyPr:a.verifyPr,autoHealDeployments:a.autoHealDeployments,releaseEnabled:a.releaseEnabled,deploymentPlatform:a.deploymentPlatform,readyLabels:e(a.readyLabels),blockingLabels:e(a.blockingLabels),autoLabelWhitelist:e(a.autoLabelWhitelist),priorityAuthors:e(a.priorityAuthors),trustedReviewers:e(a.trustedReviewers),trustedBots:e(a.trustedBots),ignoredBots:e(a.ignoredBots),minAuthorAssociation:"any"===a.minAuthorAssociation?"any":"approved",maxAttempts:a.maxAttempts,sandbox:"docker"===a.sandbox?"docker":"none",sandboxImage:a.sandboxImage,sandboxAllowNetwork:a.sandboxAllowNetwork,sandboxCpus:a.sandboxCpus,sandboxMemory:a.sandboxMemory}}function g(a,b){return"any"===a.minAuthorAssociation||null!=b&&d.has(b.toUpperCase())}},20203:(a,b,c)=>{c.d(b,{FD:()=>B,kz:()=>C,X$:()=>E,TU:()=>D});let d={"claude-fable-5":{inputPerMTok:10,outputPerMTok:50,cacheWritePerMTok:12.5,cacheReadPerMTok:1},"claude-opus-4-8":{inputPerMTok:5,outputPerMTok:25,cacheWritePerMTok:6.25,cacheReadPerMTok:.5},"claude-opus-4-7":{inputPerMTok:5,outputPerMTok:25,cacheWritePerMTok:6.25,cacheReadPerMTok:.5},"claude-sonnet-4-6":{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3},"claude-sonnet-4-5":{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3},"claude-haiku-4-5":{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}},e=Object.values(d).reduce((a,b)=>b.outputPerMTok>a.outputPerMTok?b:a,{inputPerMTok:0,outputPerMTok:0,cacheWritePerMTok:0,cacheReadPerMTok:0});var f=c(98887),g=c(14543);let h=[{kind:"auth",pattern:/invalid api key/i},{kind:"auth",pattern:/please run \/login/i},{kind:"auth",pattern:/authentication_error/i},{kind:"auth",pattern:/api error:?\s*401\b/i},{kind:"auth",pattern:/oauth token (?:has )?(?:expired|been revoked)/i},{kind:"billing",pattern:/credit balance is too low/i},{kind:"billing",pattern:/billing_error/i},{kind:"usage_limit",pattern:/usage limit reached/i},{kind:"usage_limit",pattern:/\b(?:\d+-hour|session|weekly) limit reached/i},{kind:"usage_limit",pattern:/limit will reset at/i},{kind:"rate_limit",pattern:/rate.?limit_error/i},{kind:"rate_limit",pattern:/api error:?\s*429\b/i},{kind:"rate_limit",pattern:/too many requests/i},{kind:"rate_limit",pattern:/\brate.?limit(?:ed)?\b.{0,60}\b(?:exceeded|reached|hit)\b/i},{kind:"rate_limit",pattern:/\b(?:exceeded|reached|hit)\b.{0,60}\brate.?limit/i},{kind:"overloaded",pattern:/overloaded_error/i},{kind:"overloaded",pattern:/api error:?\s*529\b/i}],i=/limit reached\|(\d{9,12})\b/i,j=/retry[- ]?after[:\s]+(\d+)\s*(?:s|sec|second)/i;function k(a){return a>0?["--max-turns",String(a)]:[]}var l=c(29980);let m=[{kind:"auth",pattern:/unexpected status 401\b/i},{kind:"auth",pattern:/\b401 unauthorized\b/i},{kind:"auth",pattern:/access token could not be refreshed/i},{kind:"auth",pattern:/please log out and sign in again/i},{kind:"auth",pattern:/\bnot logged in\b/i},{kind:"auth",pattern:/(?:chatgpt|api key) login is required/i},{kind:"auth",pattern:/missing environment variable.{0,5}OPENAI_API_KEY/i},{kind:"auth",pattern:/re-?run `?codex login`?/i},{kind:"billing",pattern:/quota exceeded\. check your plan and billing/i},{kind:"billing",pattern:/insufficient_quota/i},{kind:"billing",pattern:/exceeded your current quota/i},{kind:"billing",pattern:/\bout of credits\b/i},{kind:"billing",pattern:/\bspend cap\b/i},{kind:"billing",pattern:/to use codex with your chatgpt plan/i},{kind:"usage_limit",pattern:/you.?ve hit your usage limit/i},{kind:"usage_limit",pattern:/usage_limit_reached/i},{kind:"rate_limit",pattern:/rate.?limit_exceeded/i},{kind:"rate_limit",pattern:/rate limit reached for/i},{kind:"rate_limit",pattern:/last status:?\s*429\b/i},{kind:"rate_limit",pattern:/unexpected status 429\b/i},{kind:"rate_limit",pattern:/too many requests/i},{kind:"overloaded",pattern:/selected model is at capacity/i},{kind:"overloaded",pattern:/currently experiencing high demand/i},{kind:"overloaded",pattern:/server_is_overloaded/i},{kind:"overloaded",pattern:/last status:?\s*5\d\d\b/i},{kind:"overloaded",pattern:/unexpected status 5\d\d\b/i}],n=/try again in ([\d.]+)\s*s(?:ec(?:ond)?s?)?\b/i,o="gpt-5-codex",p={"gpt-5-codex":{inputPerMTok:1.25,outputPerMTok:10,cacheWritePerMTok:0,cacheReadPerMTok:0},"gpt-5":{inputPerMTok:1.25,outputPerMTok:10,cacheWritePerMTok:0,cacheReadPerMTok:0},"gpt-5-mini":{inputPerMTok:.25,outputPerMTok:2,cacheWritePerMTok:0,cacheReadPerMTok:0}},q=Object.values(p).reduce((a,b)=>b.outputPerMTok>a.outputPerMTok?b:a,{inputPerMTok:0,outputPerMTok:0,cacheWritePerMTok:0,cacheReadPerMTok:0}),r=l.Ik({input_tokens:l.ai().optional(),cached_input_tokens:l.ai().optional(),output_tokens:l.ai().optional(),reasoning_output_tokens:l.ai().optional()}).passthrough(),s=l.Ik({used_percent:l.ai().optional(),window_minutes:l.ai().optional(),resets_in_seconds:l.ai().optional()}).passthrough(),t=l.Ik({primary:s.nullish(),secondary:s.nullish()}).passthrough(),u=l.Ik({id:l.Yj().optional(),item_type:l.Yj().optional(),text:l.Yj().optional(),command:l.Yj().optional(),exit_code:l.ai().optional(),server:l.Yj().optional(),tool:l.Yj().optional()}).passthrough(),v=l.Ik({type:l.Yj(),thread_id:l.Yj().optional(),usage:r.optional(),rate_limits:t.nullish(),item:u.optional(),error:l.Ik({message:l.Yj().optional()}).passthrough().optional(),message:l.Yj().optional()}).passthrough();function w(a){if(a&&"number"==typeof a.used_percent)return{usedPercent:a.used_percent,windowMinutes:a.window_minutes,resetsInSeconds:a.resets_in_seconds}}class x{push(a){this.buffer+=a;let b=[],c=this.buffer.indexOf("\n");for(;-1!==c;){let a=this.buffer.slice(0,c);this.buffer=this.buffer.slice(c+1);let d=this.consume(a);d&&b.push(d),c=this.buffer.indexOf("\n")}return b}flush(){let a=this.buffer;this.buffer="";let b=this.consume(a);return b?[b]:[]}consume(a){let b;try{b=function(a){let b=a.trim();if(!b)return null;let c=JSON.parse(b);return v.parse(c)}(a)}catch(b){return this.onParseError?.({line:a.trim(),message:(0,f.gJ)(b)}),null}if(!b)return null;let c=function(a){let b=t.nullish().safeParse(a.rate_limits);if(!b.success||!b.data)return;let c=w(b.data.primary),d=w(b.data.secondary);if(c||d)return{primary:c,secondary:d}}(b);if(c&&(this.rateLimits=c),"turn.failed"===b.type||"error"===b.type){this.resultIsError=!0;let a=b.error?.message??b.message;a&&(this.resultText=a)}else"turn.completed"===b.type&&(this.resultIsError=!1,this.resultText=void 0);let d=function(a){let b={type:"assistant",chunks:[],inputTokens:0,outputTokens:0,cacheCreationInputTokens:0,cacheReadInputTokens:0,isError:!1,raw:a};if("thread.started"===a.type)return{...b,type:"system",sessionId:a.thread_id};if("item.completed"===a.type&&a.item)return{...b,type:"assistant",chunks:function(a){let b=a.id??"";switch(a.item_type){case"assistant_message":case"reasoning":return a.text?[{kind:"text",text:a.text}]:[];case"command_execution":return[{kind:"tool_use",name:"command",id:b,input:{command:a.command,exit_code:a.exit_code}}];case"file_change":return[{kind:"tool_use",name:"edit",id:b,input:a}];case"mcp_tool_call":return[{kind:"tool_use",name:`${a.server??"mcp"}/${a.tool??"tool"}`,id:b,input:a}];default:return[]}}(a.item)};if("turn.completed"===a.type){let c=a.usage;return{...b,type:"result",inputTokens:c?.input_tokens??0,outputTokens:(c?.output_tokens??0)+(c?.reasoning_output_tokens??0)}}return"turn.failed"===a.type||"error"===a.type?{...b,type:"result",isError:!0}:null}(b);return d?(d.sessionId&&(this.sessionId=d.sessionId),this.totalInputTokens+=d.inputTokens,this.totalOutputTokens+=d.outputTokens,d):null}constructor(){this.buffer="",this.totalInputTokens=0,this.totalOutputTokens=0,this.totalCacheCreationInputTokens=0,this.totalCacheReadInputTokens=0,this.costUsd=0}}var y=c(87524);let z="openrouter is an HTTP provider; it has no CLI surface (dispatch on provider.kind)",A={claude:{id:"claude",label:"Claude Code",defaultCommand:"claude",supportsResume:!0,resumeModel:"claude-haiku-4-5",resumeMaxTurns:15,defaultModel:"claude-opus-4-8",buildStartArgs:({prompt:a,model:b,maxTurns:c,bypassPermissions:d})=>["-p",a,...k(c),...d?["--dangerously-skip-permissions"]:["--permission-mode","acceptEdits"],"--model",b,"--output-format","stream-json","--verbose"],buildResumeArgs:({prompt:a,sessionId:b,model:c,maxTurns:d,bypassPermissions:e})=>["-p",a,"--resume",b,...k(d),...e?["--dangerously-skip-permissions"]:[],"--model",c,"--output-format","stream-json","--verbose"],buildOneShotArgs:({prompt:a,model:b})=>["-p",a,"--model",b],buildStreamOneShotArgs:({prompt:a,model:b})=>["-p",a,"--model",b,"--output-format","stream-json","--verbose"],createParser:()=>new f.KO,classifyFailure:function(a){var b;let c;if(0===a.exitCode&&!a.resultIsError)return;let d=[a.resultText,a.stderr].filter(Boolean).join("\n");if(!d.trim())return;let e=h.find(a=>a.pattern.test(d));if(!e)return;let f={agent:"claude",kind:e.kind,rawSnippet:(b=e.pattern,c=d.split("\n").find(a=>b.test(a))??d,(0,g.f)(c.trim()).slice(0,300))};if("usage_limit"===e.kind){let a=d.match(i)?.[1];a&&(f.resetAt=Number(a))}if("rate_limit"===e.kind||"overloaded"===e.kind){let a=d.match(j)?.[1];a&&(f.retryAfterMs=1e3*Number(a))}return f},estimateCost:function(a,b,c,f=0,g=0){let h=function(a){if(!a)return e;let b=d[a];return b||(console.warn(`[drydock] Unknown model id "${a}" — using max-priced fallback to avoid under-counting cost`),e)}(a);return b/1e6*h.inputPerMTok+c/1e6*h.outputPerMTok+f/1e6*h.cacheWritePerMTok+g/1e6*h.cacheReadPerMTok}},codex:{id:"codex",label:"Codex CLI",defaultCommand:"codex",supportsResume:!0,resumeModel:o,resumeMaxTurns:15,defaultModel:o,buildStartArgs:({prompt:a,model:b})=>["exec","--json","--sandbox","workspace-write","--model",b,a],buildResumeArgs:({prompt:a,sessionId:b,model:c})=>["exec","resume",b,"--json","--sandbox","workspace-write","--model",c,a],buildOneShotArgs:({prompt:a,model:b})=>["exec","--model",b,a],buildStreamOneShotArgs:()=>null,createParser:()=>new x,classifyFailure:function(a){var b;let c;if(0===a.exitCode&&!a.resultIsError)return;let d=[a.resultText,a.stderr].filter(Boolean).join("\n");if(!d.trim())return;let e=m.find(a=>a.pattern.test(d));if(!e)return;let f={agent:"codex",kind:e.kind,rawSnippet:(b=e.pattern,c=d.split("\n").find(a=>b.test(a))??d,(0,g.f)(c.trim()).slice(0,300))};if("rate_limit"===e.kind||"overloaded"===e.kind){let a=d.match(n)?.[1],b=a?Math.ceil(1e3*Number(a)):NaN;Number.isFinite(b)&&b>=0&&(f.retryAfterMs=b)}return f},captureUsage:a=>a instanceof x?a.rateLimits:void 0,estimateCost:function(a,b,c){let d=function(a){if(!a)return q;let b=p[a];return b||(console.warn(`[drydock] Unknown codex model id "${a}" — using max-priced fallback to avoid under-counting cost`),q)}(a);return b/1e6*d.inputPerMTok+c/1e6*d.outputPerMTok}},openrouter:{id:"openrouter",kind:"http",label:"OpenRouter",defaultCommand:"",supportsResume:!1,resumeModel:"",resumeMaxTurns:20,defaultModel:"",buildStartArgs(){throw Error(z)},buildResumeArgs:()=>null,buildOneShotArgs(){throw Error(z)},buildStreamOneShotArgs:()=>null,createParser(){throw Error(z)},classifyFailure:y.M,estimateCost:()=>0}},B=["claude","codex","openrouter"],C="claude";function D(a){return"string"==typeof a&&B.includes(a)}function E(a){return D(a)?A[a]:A[C]}},24421:(a,b,c)=>{c.d(b,{$l:()=>s,GX:()=>r,VK:()=>o,nc:()=>q,sp:()=>p,ts:()=>n});var d=c(97496),e=c(14694),f=c(70793);c(20203);var g=c(2025),h=c(54304),i=c(64537),j=c(24978);c(58543);let k="needs-human",l={color:"d93f0b",description:"Drydock parked this issue for a human decision"};function m(a,b){let c=(0,h.L8)(a,b);if(!c)throw Error(`repo ${a} not found`);return c}function n(a,b=(0,g.Lf)()){return b.select().from(i.issues).where((0,d.eq)(i.issues.repoId,a)).orderBy((0,e.Y)(i.issues.priority),(0,e.Y)(i.issues.number)).all()}function o(a,b,c=(0,g.Lf)()){let e=c.select().from(i.issues).where((0,d.eq)(i.issues.repoId,a)).all(),h=new Map(e.map(a=>[a.number,a])),j=Math.floor(Date.now()/1e3),k=c.select({value:(0,f.T9)(i.issues.priority)}).from(i.issues).where((0,d.eq)(i.issues.repoId,a)).get(),l=(k?.value??-1)+1,m=new Set;for(let e of b){m.add(e.number);let b=JSON.stringify(e.labels.map(a=>a.name)),f=h.get(e.number);f?c.update(i.issues).set({title:e.title,labels:b,state:"open",syncedAt:j}).where((0,d.eq)(i.issues.id,f.id)).run():c.insert(i.issues).values({repoId:a,number:e.number,title:e.title,labels:b,state:"open",priority:l++,syncedAt:j}).run()}let n=e.filter(a=>!m.has(a.number)).map(a=>a.id);n.length>0&&c.delete(i.issues).where((0,d.RV)(i.issues.id,n)).run()}function p(a,b,c,e,f=(0,g.Lf)()){let h,j=f.select().from(i.issues).where((0,d.Uo)((0,d.eq)(i.issues.repoId,a),(0,d.eq)(i.issues.number,b))).get();if(!j)return;try{let a=JSON.parse(j.labels);h=Array.isArray(a)?a:[]}catch{h=[]}let k=[...h];for(let a of c)k.includes(a)||k.push(a);let l=new Set(e),m=k.filter(a=>!l.has(a));f.update(i.issues).set({labels:JSON.stringify(m)}).where((0,d.eq)(i.issues.id,j.id)).run()}function q(a,b,c,d,e=(0,g.Lf)()){p(a,b,d?[c]:[],d?[]:[c],e)}async function r(a,b=(0,g.Lf)()){let c=m(a,b);return o(a,await (0,j.Ie)(c).listAllIssues(),b),n(a,b)}async function s(a,b,c=(0,g.Lf)()){let d=m(a,c),e=(0,j.Ie)(d);await e.ensureLabel(k,l),await e.addLabels(b,[k]),await e.removeLabels(b,[d.queueLabel]),p(a,b,[k],[d.queueLabel],c)}},24978:(a,b,c)=>{c.d(b,{Ie:()=>N});var d=c(29980),e=c(77597);class f{get(a){return this.entries.get(a)}set(a,b,c){this.entries.set(a,{etag:b,body:c})}delete(a){this.entries.delete(a)}constructor(){this.entries=new Map}}let g=new f;function h(a){let b=a.replace(/\r\n/g,"\n"),c=b.lastIndexOf("\nHTTP/"),d=c>=0?c+1:b.startsWith("HTTP/")?0:-1;if(d<0)return{status:null,headers:{},body:a};let e=b.slice(d),f=e.indexOf("\n\n"),g=f>=0?e.slice(0,f):e,h=f>=0?e.slice(f+2):"",i=g.split("\n"),j=(i.shift()??"").match(/^HTTP\/\S+\s+(\d+)/),k=j?Number(j[1]):null,l={};for(let a of i){let b=a.indexOf(":");b<=0||(l[a.slice(0,b).trim().toLowerCase()]=a.slice(b+1).trim())}return{status:k,headers:l,body:h}}function i(a){if(!a)return null;for(let b of a.split(",")){let a=b.match(/<([^>]+)>\s*;\s*rel="?next"?/);if(a?.[1])return a[1]}return null}var j=c(64417),k=c(91549);let l=d.Ik({number:d.ai(),title:d.Yj(),labels:d.YO(d.Ik({name:d.Yj()})).default([]),user:d.Ik({login:d.Yj()}).nullish(),author_association:d.Yj().nullish(),pull_request:d.L5().optional()}).transform(a=>({number:a.number,title:a.title,labels:a.labels,author:a.user?.login??null,authorAssociation:a.author_association??null,isPullRequest:void 0!==a.pull_request})),m=d.Ik({resources:d.g1(d.Yj(),d.Ik({limit:d.ai(),remaining:d.ai(),reset:d.ai()}))}),n=d.Ik({number:d.ai(),title:d.Yj(),body:d.Yj().default(""),state:d.Yj().default("open"),labels:d.YO(d.Ik({name:d.Yj()})).default([]),comments:d.YO(d.Ik({author:d.Ik({login:d.Yj()}).default({login:""}),body:d.Yj().default(""),createdAt:d.Yj().default("")})).default([])}),o=d.Ik({name:d.Yj(),state:d.Yj(),bucket:d.Yj().optional()}),p=d.Ik({data:d.Ik({repository:d.Ik({pullRequest:d.Ik({reviewThreads:d.Ik({nodes:d.YO(d.Ik({id:d.Yj(),isResolved:d.zM().default(!1),isOutdated:d.zM().default(!1),path:d.Yj().nullish(),line:d.ai().nullish(),comments:d.Ik({nodes:d.YO(d.Ik({id:d.Yj(),databaseId:d.ai().nullish(),body:d.Yj().default(""),author:d.Ik({login:d.Yj(),__typename:d.Yj().nullish()}).nullish()}))})}))})}).nullish()})})});class q extends Error{}function r(a,b){return`${a}=${b}`}function s(a){let b;try{b=JSON.parse(a||"[]")}catch{throw new q("unexpected gh output: response body was not valid JSON")}if(!Array.isArray(b))throw new q("unexpected gh output: expected a JSON array");return b}class t{constructor(a,b=e.Sx,c=k.og,d=g){this.cwd=a,this.run=b,this.governor=c,this.etags=d}gate(a="core"){let b=this.governor.decide(a,(0,j.u)());if(!b.allowed)throw new k.OE(b.reason,a,b.retryAfterMs)}async exec(a,b="core"){this.gate(b);let c=await this.run("gh",a,this.cwd);return 0!==c.exitCode&&/rate limit|429 too many/i.test(c.stderr)&&this.governor.note429(b),c}async refreshRateLimit(){let a,b=await this.run("gh",["api","rate_limit"],this.cwd);if(0===b.exitCode){try{a=m.parse(JSON.parse(b.stdout||"{}"))}catch{return}for(let b of["core","graphql","search"]){let c=a.resources[b];c&&this.governor.observe(b,c)}}}async conditionalList(a,b){this.gate("core");let c=this.etags.get(a),d=["api",`repos/{owner}/{repo}/issues?${b}`,"--include"];c&&d.push("-H",`If-None-Match: ${c.etag}`);let e=await this.run("gh",d,this.cwd),f=this.checkListResponse(e,h(e.stdout));if(304===f.status&&c)return this.toGhIssues(s(c.body));let g=[...s(f.body)],j=i(f.headers.link),k=Number(new URLSearchParams(b).get("per_page")??"30"),l=!j&&Number.isFinite(k)&&g.length<k,m=1;for(;j&&m<100;){this.gate("core");let a=await this.run("gh",["api",j,"--include"],this.cwd),b=this.checkListResponse(a,h(a.stdout));g.push(...s(b.body)),j=i(b.headers.link),m++}let n=f.headers.etag;return n&&l?this.etags.set(a,n,JSON.stringify(g)):this.etags.delete(a),this.toGhIssues(g)}checkListResponse(a,b){var c,d;let e=(0,k.bR)(b.headers);if(e&&this.governor.observe(e.resource,e.snapshot),304===b.status)return b;if(c=b.status,d=b.headers,429===c||403===c&&"0"===d["x-ratelimit-remaining"]){let a=Number(b.headers["x-ratelimit-reset"]);throw this.governor.note429("core",Number.isFinite(a)?a:void 0),new q(`gh api rate limited (status ${b.status})`)}if(200!==b.status)throw new q(a.stderr||`gh api failed (status ${b.status??"unknown"})`);return b}toGhIssues(a){let b=d.YO(l).safeParse(a);if(!b.success)throw new q(`unexpected gh output: ${b.error.message}`);return b.data.filter(a=>!a.isPullRequest).map(({isPullRequest:a,...b})=>b)}async listIssues(a){let b=`state=open&per_page=100&labels=${encodeURIComponent(a)}`;return this.conditionalList(`${this.cwd}::label:${a}`,b)}async listAllIssues(){return this.conditionalList(`${this.cwd}::all`,"state=open&per_page=100")}async viewIssue(a){let b=await this.exec(["issue","view",String(a),"--json","number,title,body,state,labels,comments"]);if(0!==b.exitCode)throw new q(b.stderr||"gh issue view failed");let c=n.safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);let d=c.data;return{number:d.number,title:d.title,body:d.body,state:d.state,labels:d.labels.map(a=>a.name),comments:d.comments.map(a=>({author:a.author.login,body:a.body,createdAt:a.createdAt}))}}async editIssue(a,b){let c=["issue","edit",String(a)];if(void 0!==b.title&&c.push(r("--title",b.title)),void 0!==b.body&&c.push(r("--body",b.body)),3===c.length)return;let d=await this.exec(c);if(0!==d.exitCode)throw new q(d.stderr||"gh issue edit failed")}async ensureLabel(a,b={}){let c=await this.exec(["label","list","--json","name","--limit","200"]),e=c.stdout.trim();if(0===c.exitCode&&e)try{let b=d.YO(d.Ik({name:d.Yj()})).safeParse(JSON.parse(e));if(b.success&&b.data.some(b=>b.name===a))return}catch{}let f=["label","create"];b.color&&f.push(r("--color",b.color)),b.description&&f.push(r("--description",b.description)),f.push("--",a);let g=await this.exec(f);if(0!==g.exitCode&&!/already exists/i.test(g.stderr))throw new q(g.stderr||"gh label create failed")}async addLabels(a,b){let c=await this.exec(["issue","edit",String(a),r("--add-label",b.join(","))]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue edit failed")}async removeLabels(a,b){let c=await this.exec(["issue","edit",String(a),r("--remove-label",b.join(","))]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue edit failed")}async closeIssue(a){let b=await this.exec(["issue","close",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh issue close failed")}async reopenIssue(a){let b=await this.exec(["issue","reopen",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh issue reopen failed")}async prChecks(a){let b=await this.exec(["pr","checks",String(a),"--json","name,state,bucket"]),c=b.stdout.trim();if(!c){if(0!==b.exitCode)throw new q(b.stderr||"gh pr checks failed");return[]}let e=d.YO(o).safeParse(JSON.parse(c));if(!e.success)throw new q(`unexpected gh output: ${e.error.message}`);return e.data}async prHeadSha(a){let b=await this.exec(["pr","view",String(a),"--json","headRefOid"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr view failed");let c=d.Ik({headRefOid:d.Yj()}).safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);return c.data.headRefOid}async prMergeCommitSha(a){let b=await this.exec(["pr","view",String(a),"--json","mergeCommit"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr view failed");let c=d.Ik({mergeCommit:d.Ik({oid:d.Yj()}).nullish()}).safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);return c.data.mergeCommit?.oid??null}async commentIssue(a,b){let c=await this.exec(["issue","comment",String(a),r("--body",b)]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue comment failed")}async listIssueComments(a){let b,c=await this.exec(["issue","view",String(a),"--json","comments"]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue view failed");try{b=JSON.parse(c.stdout||"{}")}catch{throw new q(`unexpected gh output: ${c.stdout.slice(0,200)}`)}let e=d.Ik({comments:d.YO(d.Ik({id:d.Yj(),body:d.Yj().default("")})).default([])}).safeParse(b);if(!e.success)throw new q(`unexpected gh output: ${e.error.message}`);return e.data.comments.map(a=>({id:a.id,body:a.body}))}async updateIssueComment(a,b,c){let d=await this.exec(["api","graphql","-F",`id=${b}`,"-f",`body=${c}`,"-f","query=mutation($id:ID!,$body:String!){updateIssueComment(input:{id:$id,body:$body}){issueComment{id}}}"],"graphql");if(0!==d.exitCode)throw new q(d.stderr||"gh update issue comment failed")}async commentPr(a,b){let c=await this.exec(["pr","comment",String(a),r("--body",b)]);if(0!==c.exitCode)throw new q(c.stderr||"gh pr comment failed")}async createIssue(a,b){let c=await this.exec(["issue","create",r("--title",a),r("--body",b)]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue create failed");let d=c.stdout.match(/\/issues\/(\d+)/);if(!d?.[1])throw new q(`could not parse issue number from: ${c.stdout}`);return Number(d[1])}async latestFailedRunId(a){let b,c,e=await this.run("gh",["pr","view",String(a),"--json","headRefName"],this.cwd);if(0!==e.exitCode)return null;try{b=d.Ik({headRefName:d.Yj()}).parse(JSON.parse(e.stdout||"{}")).headRefName}catch{return null}if(!b)return null;let f=await this.run("gh",["run","list","--branch",b,"--json","databaseId,conclusion","--limit","20"],this.cwd);if(0!==f.exitCode)return null;try{c=d.YO(d.Ik({databaseId:d.ai(),conclusion:d.Yj().default("")})).parse(JSON.parse(f.stdout||"[]"))}catch{return null}return c.find(a=>"failure"===a.conclusion)?.databaseId??null}async failedRunLog(a){if(!this.governor.decide("core",(0,j.u)()).allowed)return"";let b=await this.latestFailedRunId(a);if(null===b)return"";let c=await this.run("gh",["run","view",String(b),"--log-failed"],this.cwd);return 0!==c.exitCode?"":c.stdout.slice(-8e3)}async reRunFailedChecks(a){if(!this.governor.decide("core",(0,j.u)()).allowed)return!1;let b=await this.latestFailedRunId(a);return null!==b&&0===(await this.run("gh",["run","rerun",String(b),"--failed"],this.cwd)).exitCode}async prDiff(a){if(!this.governor.decide("core",(0,j.u)()).allowed)return"";let b=await this.run("gh",["pr","diff",String(a)],this.cwd);return 0!==b.exitCode?"":b.stdout}async mergePr(a){let b=await this.exec(["pr","merge",String(a),"--squash","--auto"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr merge failed")}async createPr(a){let b=await this.exec(["pr","create",r("--head",a.head),r("--base",a.base),r("--title",a.title),r("--body",a.body)]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr create failed");let c=b.stdout.match(/\/pull\/(\d+)/);if(!c?.[1])throw new q(`could not parse PR number from: ${b.stdout}`);return Number(c[1])}async deleteBranch(a){let b=a.split("/").map(encodeURIComponent).join("/"),c=await this.exec(["api","-X","DELETE",`repos/{owner}/{repo}/git/refs/heads/${b}`]);if(0!==c.exitCode&&!/reference does not exist|HTTP 404/i.test(c.stderr))throw new q(c.stderr||"gh branch delete failed")}async prMergeState(a){let b=await this.exec(["pr","view",String(a),"--json","mergeable,mergeStateStatus"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr view failed");let c=d.Ik({mergeable:d.Yj().default(""),mergeStateStatus:d.Yj().default("")}).safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);let{mergeable:e,mergeStateStatus:f}=c.data;return"CONFLICTING"===e||"DIRTY"===f?"conflicted":"BEHIND"===f?"behind":"MERGEABLE"===e?"clean":"unknown"}async updatePrBranch(a){let b=await this.exec(["pr","update-branch",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr update-branch failed")}async listReleases(){let a=await this.exec(["release","list","--json","tagName,createdAt","--limit","100"]);if(0!==a.exitCode)throw new q(a.stderr||"gh release list failed");let b=d.YO(d.Ik({tagName:d.Yj(),createdAt:d.Yj().default("")})).safeParse(JSON.parse(a.stdout||"[]"));if(!b.success)throw new q(`unexpected gh output: ${b.error.message}`);return b.data}async listMergedPrs(a=100){let b=await this.exec(["pr","list","--state","merged","--json","number,title,mergedAt,labels","--limit",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr list failed");let c=d.YO(d.Ik({number:d.ai(),title:d.Yj().default(""),mergedAt:d.Yj().default(""),labels:d.YO(d.Ik({name:d.Yj()})).default([])})).safeParse(JSON.parse(b.stdout||"[]"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);return c.data.map(a=>({number:a.number,title:a.title,mergedAt:a.mergedAt,labels:a.labels.map(a=>a.name)}))}async createRelease(a){let b=await this.exec(["release","create",a.tag,r("--title",a.title),r("--notes",a.notes),r("--target",a.target)]);if(0!==b.exitCode)throw new q(b.stderr||"gh release create failed")}async repoSlug(){if(this.slug)return this.slug;let a=await this.exec(["repo","view","--json","nameWithOwner"]);if(0!==a.exitCode)throw new q(a.stderr||"gh repo view failed");let b=d.Ik({nameWithOwner:d.Yj()}).safeParse(JSON.parse(a.stdout||"{}"));if(!b.success)throw new q(`unexpected gh output: ${b.error.message}`);let[c,e]=b.data.nameWithOwner.split("/");if(!c||!e)throw new q(`unexpected repo slug: ${b.data.nameWithOwner}`);return this.slug={owner:c,name:e},this.slug}async listReviewThreads(a){let{owner:b,name:c}=await this.repoSlug(),d=await this.exec(["api","graphql","-F",`owner=${b}`,"-F",`name=${c}`,"-F",`number=${a}`,"-f","query=query($owner:String!,$name:String!,$number:Int!){repository(owner:$owner,name:$name){pullRequest(number:$number){reviewThreads(first:100){nodes{id isResolved isOutdated path line comments(first:100){nodes{id databaseId body author{login __typename}}}}}}}}"],"graphql");if(0!==d.exitCode)throw new q(d.stderr||"gh api graphql failed");let e=p.safeParse(JSON.parse(d.stdout||"{}"));if(!e.success)throw new q(`unexpected gh output: ${e.error.message}`);return(e.data.data.repository.pullRequest?.reviewThreads.nodes??[]).map(a=>({id:a.id,isResolved:a.isResolved,isOutdated:a.isOutdated,path:a.path??null,line:a.line??null,comments:a.comments.nodes.map(a=>({id:a.id,databaseId:a.databaseId??null,author:a.author?.login??"",authorIsBot:a.author?.__typename==="Bot",body:a.body}))}))}async replyToReviewThread(a,b){let c=await this.exec(["api","graphql","-F",`threadId=${a}`,"-f",`body=${b}`,"-f","query=mutation($threadId:ID!,$body:String!){addPullRequestReviewThreadReply(input:{pullRequestReviewThreadId:$threadId,body:$body}){comment{id}}}"],"graphql");if(0!==c.exitCode)throw new q(c.stderr||"gh review reply failed")}async updateReviewComment(a,b){let c=await this.exec(["api","graphql","-F",`id=${a}`,"-f",`body=${b}`,"-f","query=mutation($id:ID!,$body:String!){updatePullRequestReviewComment(input:{pullRequestReviewCommentId:$id,body:$body}){pullRequestReviewComment{id}}}"],"graphql");if(0!==c.exitCode)throw new q(c.stderr||"gh update review comment failed")}async resolveReviewThread(a){let b=await this.exec(["api","graphql","-F",`threadId=${a}`,"-f","query=mutation($threadId:ID!){resolveReviewThread(input:{threadId:$threadId}){thread{id isResolved}}}"],"graphql");if(0!==b.exitCode)throw new q(b.stderr||"gh resolve thread failed")}async reactToReviewComment(a,b){let c=await this.exec(["api","graphql","-F",`subjectId=${a}`,"-F",`content=${b}`,"-f","query=mutation($subjectId:ID!,$content:ReactionContent!){addReaction(input:{subjectId:$subjectId,content:$content}){reaction{content}}}"],"graphql");if(0!==c.exitCode&&!/already has this reaction/i.test(c.stderr))throw new q(c.stderr||"gh add reaction failed")}}var u=c(75818),v=c(87105),w=c(87232),x=c(25480);let y=d.Ik({iid:d.ai(),title:d.Yj(),labels:d.YO(d.Yj()).default([]),author:d.Ik({username:d.Yj()}).nullish()}),z=d.Ik({iid:d.ai(),title:d.Yj(),description:d.Yj().nullable().default(""),state:d.Yj().default("opened"),labels:d.YO(d.Yj()).default([])}),A=d.Ik({author:d.Ik({username:d.Yj().default("")}).default({username:""}),body:d.Yj().default(""),created_at:d.Yj().default(""),system:d.zM().default(!1)}),B=d.Ik({id:d.ai(),body:d.Yj().default("")}),C=d.Ik({id:d.ai().optional(),name:d.Yj().default(""),status:d.Yj().default("")}),D=d.Ik({head_pipeline:d.Ik({id:d.ai()}).nullable().optional()}),E=d.Ik({old_path:d.Yj().default(""),new_path:d.Yj().default(""),diff:d.Yj().default("")});class F{constructor(a,b={}){this.config=a,this.http=b.http??v.D,this.run=b.run??e.Sx,this.sleep=b.sleep??(a=>new Promise(b=>setTimeout(b,a))),this.allowPrivateHost=b.allowPrivateHost??(0,x.gT)()}resolveProject(){if(!this.projectRef){let a=(async()=>{let a=await this.run("git",["remote","get-url","origin"],this.config.cwd);if(0!==a.exitCode||!a.stdout.trim())throw new w.Q8(a.stderr||"could not resolve git remote 'origin'");let{host:b,path:c}=function(a){let b=a.trim().replace(/\.git$/,""),c=b.match(/^[\w.-]+@([^:]+):(.+)$/)??b.match(/^ssh:\/\/[^@]+@([^/]+)\/(.+)$/)??b.match(/^https?:\/\/([^/]+)\/(.+)$/);if(!c?.[1]||!c[2])throw new w.Q8(`unsupported git remote URL: ${a}`);return{host:c[1],path:c[2]}}(a.stdout);return{baseUrl:(this.config.baseUrl?.trim()||`https://${b}`).replace(/\/$/,""),encodedPath:encodeURIComponent(c)}})();a.catch(()=>{this.projectRef===a&&(this.projectRef=void 0)}),this.projectRef=a}return this.projectRef}async request(a,b,c={}){let d,{baseUrl:e,encodedPath:f}=await this.resolveProject(),g=`${e}/api/v4/projects/${f}${b}`;if(c.query){let a=new URLSearchParams(c.query).toString();a&&(g+=`?${a}`)}(0,x.sM)(g,{allowPrivate:this.allowPrivateHost});let h={};return this.config.token&&(h["PRIVATE-TOKEN"]=this.config.token),void 0!==c.body&&(h["Content-Type"]="application/json",d=JSON.stringify(c.body)),this.http(g,{method:a,headers:h,body:d})}async mutate(a,b,c={}){let d=await this.request(a,b,c);if(429===d.status)throw await this.sleep(function(a){if(a){let b=a["retry-after"];if(b){let a=Number(b);if(Number.isFinite(a)&&a>0)return Math.min(1e3*a,3e5)}let c=a["ratelimit-reset"]??a["x-ratelimit-reset"];if(c){let a=Number(c);if(Number.isFinite(a)){let b=1e3*a-Date.now();if(b>0)return Math.min(b,3e5)}}}return 6e4}(d.headers)),new w.Q8(`GitLab rate-limited: ${M(d)||`${a} ${b} returned 429`}`);if(!d.ok)throw new w.Q8(M(d)||`GitLab ${a} ${b} failed`);return d}async listIssues(a){return this.listIssuesPaginated({state:"opened",labels:a})}async listAllIssues(){return this.listIssuesPaginated({state:"opened"})}async listIssuesPaginated(a){return this.listPaginated("/issues",a,G)}async listPaginated(a,b,c){let d=[],e=1;for(let f=0;f<100;f++){let f=await this.mutate("GET",a,{query:{...b,per_page:"100",page:String(e)}});d.push(...c(f.body));let g=f.headers?.["x-next-page"];if(!g)break;let h=Number(g);if(!Number.isInteger(h)||h<=e)break;e=h}return d}async viewIssue(a){let b=await this.mutate("GET",`/issues/${a}`),c=await this.listPaginated(`/issues/${a}/notes`,{},K),d=z.parse(L(b.body,{}));return{number:d.iid,title:d.title,body:d.description??"",state:"opened"===d.state?"open":d.state,labels:d.labels,comments:c.filter(a=>!a.system).map(a=>({author:a.author.username,body:a.body,createdAt:a.created_at}))}}async editIssue(a,b){let c={};void 0!==b.title&&(c.title=b.title),void 0!==b.body&&(c.description=b.body),0!==Object.keys(c).length&&await this.mutate("PUT",`/issues/${a}`,{body:c})}async ensureLabel(a,b={}){var c;let e=await this.request("GET","/labels",{query:{per_page:"100"}});if(e.ok){let b=d.YO(d.Ik({name:d.Yj()})).safeParse(L(e.body,[]));if(b.success&&b.data.some(b=>b.name===a))return}let f={name:a,color:(c=b.color??"#808080").startsWith("#")?c:`#${c}`};b.description&&(f.description=b.description);let g=await this.request("POST","/labels",{body:f});if(!g.ok&&409!==g.status&&!/already exists/i.test(g.body))throw new w.Q8(M(g)||"GitLab label create failed")}async addLabels(a,b){await this.mutate("PUT",`/issues/${a}`,{body:{add_labels:b.join(",")}})}async removeLabels(a,b){await this.mutate("PUT",`/issues/${a}`,{body:{remove_labels:b.join(",")}})}async closeIssue(a){await this.mutate("PUT",`/issues/${a}`,{body:{state_event:"close"}})}async reopenIssue(a){await this.mutate("PUT",`/issues/${a}`,{body:{state_event:"reopen"}})}async commentIssue(a,b){await this.mutate("POST",`/issues/${a}/notes`,{body:{body:b}})}async listIssueComments(a){return(await this.listPaginated(`/issues/${a}/notes`,{},H)).map(a=>({id:String(a.id),body:a.body}))}async updateIssueComment(a,b,c){await this.mutate("PUT",`/issues/${a}/notes/${encodeURIComponent(b)}`,{body:{body:c}})}async commentPr(a,b){await this.mutate("POST",`/merge_requests/${a}/notes`,{body:{body:b}})}async createIssue(a,b){let c=await this.mutate("POST","/issues",{body:{title:a,description:b}});return d.Ik({iid:d.ai()}).parse(L(c.body,{})).iid}async prChecks(a){let b=await this.latestPipelineId(a);return null===b?[]:(await this.listPaginated(`/pipelines/${b}/jobs`,{},I)).map(a=>({name:a.name,state:function(a){switch(a){case"success":return"SUCCESS";case"failed":return"FAILURE";case"canceled":case"cancelled":return"CANCELLED";case"running":return"IN_PROGRESS";case"pending":case"created":case"scheduled":case"preparing":case"waiting_for_resource":return"PENDING";case"manual":return"MANUAL";case"skipped":return"SKIPPED";default:return a.toUpperCase()}}(a.status)}))}async prHeadSha(a){let b=await this.mutate("GET",`/merge_requests/${a}`);return d.Ik({sha:d.Yj()}).parse(L(b.body,{})).sha}async prMergeCommitSha(a){let b=await this.mutate("GET",`/merge_requests/${a}`),c=d.Ik({squash_commit_sha:d.Yj().nullish(),merge_commit_sha:d.Yj().nullish()}).parse(L(b.body,{}));return c.squash_commit_sha??c.merge_commit_sha??null}async failedRunLog(a){try{let b=await this.latestPipelineId(a);if(null===b)return"";let c=(await this.listPaginated(`/pipelines/${b}/jobs`,{},I)).find(a=>"failed"===a.status&&void 0!==a.id);if(!c)return"";let d=await this.request("GET",`/jobs/${c.id}/trace`);if(!d.ok)return(0,u.v)(`GitLab failedRunLog: job ${c.id} trace request failed (${d.status})`),"";return d.body.slice(-8e3)}catch(a){return(0,u.v)("GitLab failedRunLog error:",a),""}}async prDiff(a){try{return(await this.listPaginated(`/merge_requests/${a}/diffs`,{},J)).map(a=>`--- a/${a.old_path}
|
|
2
2
|
+++ b/${a.new_path}
|
|
3
|
-
${a.diff}`).join("\n")}catch(a){return(0,u.v)("GitLab prDiff error:",a),""}}async mergePr(a){await this.mutate("PUT",`/merge_requests/${a}/merge`,{body:{squash:!0}})}async createPr(a){let b=await this.mutate("POST","/merge_requests",{body:{source_branch:a.head,target_branch:a.base,title:a.title,description:a.body}});return d.Ik({iid:d.ai()}).parse(L(b.body,{})).iid}async deleteBranch(a){let b=await this.request("DELETE",`/repository/branches/${encodeURIComponent(a)}`);if(!b.ok&&404!==b.status)throw new w.Q8(M(b)||"GitLab branch delete failed")}async prMergeState(a){let b=await this.mutate("GET",`/merge_requests/${a}`),c=d.Ik({has_conflicts:d.zM().default(!1),detailed_merge_status:d.Yj().nullish()}).parse(L(b.body,{}));return c.has_conflicts||"conflict"===c.detailed_merge_status?"conflicted":"need_rebase"===c.detailed_merge_status?"behind":"mergeable"===c.detailed_merge_status?"clean":"unknown"}async updatePrBranch(a){await this.mutate("PUT",`/merge_requests/${a}/rebase`)}async latestPipelineId(a){let b=await this.request("GET",`/merge_requests/${a}`);if(!b.ok)return null;let c=D.safeParse(L(b.body,{})),d=c.success?c.data.head_pipeline??null:null;return d?d.id:null}}function G(a){let b=d.YO(y).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data.map(a=>({number:a.iid,title:a.title,labels:a.labels.map(a=>({name:a})),author:a.author?.username??null,authorAssociation:null}))}function H(a){let b=d.YO(B).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data}function I(a){let b=d.YO(C).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data}function J(a){let b=d.YO(E).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data}function K(a){let b=d.YO(A).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data}function L(a,b){try{return JSON.parse(a||"null")??b}catch{return b}}function M(a){let b=d.Ik({message:d.L5(),error:d.L5()}).partial().safeParse(L(a.body,{}));if(b.success){let a=b.data.message??b.data.error;if("string"==typeof a)return a;if(a)return JSON.stringify(a)}return a.body.slice(0,300)}function N(a){return"gitlab"===((0,w.jL)(a.platform)?a.platform:w.cg)?new F({cwd:a.path,baseUrl:a.apiBaseUrl,token:a.apiToken}):new t({cwd:a.path}.cwd,void 0)}},25480:(a,b,c)=>{c.d(b,{gT:()=>h,sM:()=>g});var d=c(87232);function e(a){if(!/^\d{1,3}(\.\d{1,3}){3}$/.test(a))return null;let b=a.split(".").map(Number);return b.some(a=>a>255)?null:b}function f(a){let b=e(a);if(!b)return!1;let[c,d]=b;return 0===c||10===c||127===c||169===c&&254===d||172===c&&d>=16&&d<=31||192===c&&168===d||100===c&&d>=64&&d<=127||!1}function g(a,b={}){let c,h;try{c=new URL(a)}catch{throw new d.Q8(`invalid forge URL: ${a}`)}if("http:"!==c.protocol&&"https:"!==c.protocol)throw new d.Q8(`forge URL must use http(s): ${c.protocol}`);if(!b.allowPrivate&&(""===(h=c.hostname.trim().toLowerCase().replace(/^\[/,"").replace(/\]$/,""))||"localhost"===h||h.endsWith(".localhost")||(h.includes(":")?function(a){let b=a.toLowerCase();if("::1"===b||"::"===b)return!0;let c=b.match(/^::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/);if(c?.[1])return f(c[1]);let d=b.match(/^::ffff:(?:([0-9a-f]{1,4}):)?([0-9a-f]{1,4})$/);if(d?.[2]){let a=Number.parseInt(d[1]??"0",16),b=Number.parseInt(d[2],16);return f(`${a>>8}.${255&a}.${b>>8}.${255&b}`)}return!!(b.startsWith("fe80")||/^f[cd]/.test(b))}(h):!!e(h)&&f(h))))throw new d.Q8(`refusing to send forge token to private/loopback address ${c.hostname}; set DRYDOCK_ALLOW_PRIVATE_FORGE=1 to allow a self-hosted instance`)}function h(){let a=process.env.DRYDOCK_ALLOW_PRIVATE_FORGE?.trim().toLowerCase();return"1"===a||"true"===a||"yes"===a}},26287:(a,b,c)=>{c.d(b,{E:()=>e,_:()=>d});let d={main:"default",ciFix:"ci-fix",plan:"plan",limitResume:"limit-resume"},e={default:'You are working on GitHub issue #$ISSUE_NUM in the repository "$REPO_NAME".\nYou are on branch "$BRANCH". Implement the change the issue asks for.\n\nIssue title: $ISSUE_TITLE\n\nIssue body:\n$ISSUE_BODY\n\nKeep the change focused. You may commit your work or leave it uncommitted —\neither is fine. Do not push or open a pull request yourself; Drydock commits\nany remaining changes, pushes the branch, and opens the PR.\n\nBefore you finish, write a file `.drydock/PR.md` describing the change for the\npull request. The first line is a Conventional Commit subject (used as the\ncommit message and PR title), then a blank line, then a structured body with\nsections: Problem, Solution, Tests, Risks. Drydock reads this file, appends\n`Closes #$ISSUE_NUM` to the body, and removes the file — do not commit it.',"ci-fix":"CI failed. Fix the failure and keep changes minimal.\n\nFailed CI log:\n$CI_LOG",plan:'You are working on GitHub issue #$ISSUE_NUM in the repository "$REPO_NAME".\n\nIssue title: $ISSUE_TITLE\n\nIssue body:\n$ISSUE_BODY\n\nDo not change any files. Explore the codebase and produce a concise,\nstep-by-step implementation plan for the issue: the files to touch, the\nchange in each, the order to make them, and how to verify the result\n(tests, typecheck, build). Reply with the plan only — no preamble.',"limit-resume":'Your previous session on issue #$ISSUE_NUM in "$REPO_NAME" was interrupted by a usage limit.\nYou are resuming in a fresh checkout of branch "$BRANCH"; any uncommitted changes from the\ninterrupted session are gone. Re-apply whatever is missing and finish implementing the issue.\nKeep the change focused. You may commit your work or leave it uncommitted — either is fine.\nDo not push or open a pull request yourself; Drydock commits, pushes, and opens the PR.\nBefore finishing, write `.drydock/PR.md`: first line a Conventional Commit subject (used as\nthe commit message and PR title), then a blank line, then a body with Problem, Solution,\nTests, and Risks sections. Drydock appends `Closes #$ISSUE_NUM` and removes the file — do\nnot commit it.'}},27630:(a,b,c)=>{c.d(b,{V:()=>x,n:()=>y});var d=c(97496),e=c(84232),f=c(51214),g=c(20203),h=c(2025),i=c(64537),j=c(94534),k=c(26287),l=c(29668),m=c(48733),n=c(2412),o=c(7611),p=c(5079),q=c(96356);function r(a,b,c,d){let e=(0,o.nc)(a.id,d);if(e)return c.publish(b.id,{type:"error",payload:{stderr:`session not started: ${a.label} is limit-blocked (${e.kind}) until ${new Date(1e3*e.blockedUntil).toISOString()}`}}),{exitCode:-3,costUsd:0,inputTokens:0,outputTokens:0,timedOut:!1,costExceeded:!1,limit:{agent:a.id,kind:e.kind,resetAt:e.blockedUntil,rawSnippet:e.rawSnippet,latched:!0}}}function s(a,b,c,d){if(!d.timedOut&&!d.costExceeded&&(0!==d.exitCode||b.resultIsError))return a.classifyFailure?.({exitCode:d.exitCode,stderr:c,resultText:b.resultText,resultIsError:b.resultIsError})}function t(a,b,c){let d=Math.floor(Date.now()/1e3),e=(0,f.qE)(b.rateLimit,d);e&&(0,p.IP)(a.id,e,c);let g=a.captureUsage?.(b);g&&(0,p.Cx)(g,c,d)}function u(a,b){let c=()=>{},d=!1;return{tripped:new Promise(a=>{c=a}),observe(){!d&&b()>=a&&(d=!0,c())}}}function v(a,b={}){let{timeoutMs:c,costTripped:d}=b,e=b.graceMs??5e3,f=!!c&&c>0;return f||d?new Promise(b=>{let g,h=!1,i=!1,j=a=>{h||(h=!0,b(a))},k=b=>{let c;if(i)return;i=!0,g&&clearTimeout(g),a.abort();let d=new Promise(a=>{c=setTimeout(a,e),c.unref?.()});Promise.race([a.done,d]).then(()=>{clearTimeout(c),j(b)})};f&&(g=setTimeout(()=>{k({exitCode:-1,timedOut:!0,costExceeded:!1})},c),g.unref?.()),d?.then(()=>{k({exitCode:-2,timedOut:!1,costExceeded:!0})}),a.done.then(a=>{i||(g&&clearTimeout(g),j({exitCode:a,timedOut:!1,costExceeded:!1}))})}):a.done.then(a=>({exitCode:a,timedOut:!1,costExceeded:!1}))}function w(a){return{chunks:a.chunks,costUsd:a.costUsd}}async function x(a,b,f,k={}){let l=k.db??(0,h.Lf)(),o=k.runner??j.g,p=k.broker??(0,m.k)(),y=k.provider??(0,g.X$)(a.agent);if("http"===y.kind){let{runOpenRouterJobSession:d}=await c.e(908).then(c.bind(c,17908));return d(a,b,f,{db:l,broker:k.broker,timeoutMs:k.timeoutMs,costCapUsd:k.costCapUsd,sideSession:k.sideSession,fetchImpl:k.fetchImpl,toolExecutor:k.toolExecutor})}let z=k.command??y.defaultCommand,A=a.model??y.defaultModel,B=y.createParser();B.onParseError=b=>p.publish(a.id,{type:"parse_error",payload:b});let C=r(y,a,p,l);if(C)return C;k.sideSession||("working"!==a.status?(0,n.dk)(a.id,"working",{model:A},l):l.update(i.jobs).set({model:A}).where((0,d.eq)(i.jobs.id,a.id)).run());let D=k.costCapUsd&&k.costCapUsd>0?u(k.costCapUsd,()=>B.costUsd>0?B.costUsd:y.estimateCost(A,B.totalInputTokens,B.totalOutputTokens,B.totalCacheCreationInputTokens,B.totalCacheReadInputTokens)):void 0,E=y.buildStartArgs({prompt:b,model:A,maxTurns:a.maxTurns}),F="",G=o(z,E,f,{onStdout:b=>{for(let c of B.push(b))p.publish(a.id,{type:c.type,payload:w(c)});D?.observe()},onStderr:b=>{F=(F+b).slice(-16384),p.publish(a.id,{type:"error",payload:{stderr:b}})}});(0,q.registerAbort)(a.id,G.abort);let{exitCode:H,timedOut:I,costExceeded:J}=await v(G,{timeoutMs:k.timeoutMs,costTripped:D?.tripped,graceMs:k.graceMs});(0,q.clearAbort)(a.id);let K=I||J?void 0:G.spawnError;for(let b of(I&&p.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${k.timeoutMs}ms`}}),J&&p.publish(a.id,{type:"error",payload:{stderr:`session aborted: per-job cost limit of $${k.costCapUsd} reached`}}),B.flush()))p.publish(a.id,{type:b.type,payload:w(b)});let L=B.costUsd>0?B.costUsd:y.estimateCost(A,B.totalInputTokens,B.totalOutputTokens,B.totalCacheCreationInputTokens,B.totalCacheReadInputTokens);return k.sideSession?l.update(i.jobs).set({totalInputTokens:(0,e.ll)`coalesce(${i.jobs.totalInputTokens}, 0) + ${B.totalInputTokens}`,totalOutputTokens:(0,e.ll)`coalesce(${i.jobs.totalOutputTokens}, 0) + ${B.totalOutputTokens}`,costUsd:(0,e.ll)`coalesce(${i.jobs.costUsd}, 0) + ${L}`}).where((0,d.eq)(i.jobs.id,a.id)).run():l.update(i.jobs).set({sessionId:B.sessionId,totalInputTokens:B.totalInputTokens,totalOutputTokens:B.totalOutputTokens,costUsd:L}).where((0,d.eq)(i.jobs.id,a.id)).run(),t(y,B,l),{exitCode:H,sessionId:B.sessionId,costUsd:L,inputTokens:B.totalInputTokens,outputTokens:B.totalOutputTokens,timedOut:I,costExceeded:J,spawnError:K,limit:s(y,B,F,{exitCode:H,timedOut:I,costExceeded:J})}}async function y(a,b,e,f,n={}){let o=n.db??(0,h.Lf)(),p=n.runner??j.g,w=n.broker??(0,m.k)(),x=n.provider??(0,g.X$)(a.agent),z=n.resumePrompt??(0,l.Xm)((0,l.yx)(a.repoId,k._.ciFix,o),{CI_LOG:e});if("http"===x.kind){let{runOpenRouterJobSession:b}=await c.e(908).then(c.bind(c,17908));return b(a,z,f,{db:o,broker:n.broker,timeoutMs:n.timeoutMs,costCapUsd:n.costCapUsd,sideSession:n.sideSession,additive:!0,maxTurns:n.resumeMaxTurns??x.resumeMaxTurns,fetchImpl:n.fetchImpl,toolExecutor:n.toolExecutor})}let A=n.command??x.defaultCommand,B=n.resumeModel??x.resumeModel,C=n.resumeMaxTurns??x.resumeMaxTurns,D=x.createParser();D.onParseError=b=>w.publish(a.id,{type:"parse_error",payload:b});let E=r(x,a,w,o);if(E)return{...E,sessionId:b};let F=n.costCapUsd&&n.costCapUsd>0?o.select().from(i.jobs).where((0,d.eq)(i.jobs.id,a.id)).get()?.costUsd??0:0,G=n.costCapUsd&&n.costCapUsd>0?u(n.costCapUsd,()=>F+(D.costUsd>0?D.costUsd:x.estimateCost(B,D.totalInputTokens,D.totalOutputTokens,D.totalCacheCreationInputTokens,D.totalCacheReadInputTokens))):void 0,H=(x.supportsResume?x.buildResumeArgs({prompt:z,sessionId:b,model:B,maxTurns:C}):null)??x.buildStartArgs({prompt:z,model:B,maxTurns:C}),I="",J=p(A,H,f,{onStdout:b=>{for(let c of D.push(b))w.publish(a.id,{type:c.type,payload:{chunks:c.chunks}});G?.observe()},onStderr:b=>{I=(I+b).slice(-16384),w.publish(a.id,{type:"error",payload:{stderr:b}})}});(0,q.registerAbort)(a.id,J.abort);let{exitCode:K,timedOut:L,costExceeded:M}=await v(J,{timeoutMs:n.timeoutMs,costTripped:G?.tripped,graceMs:n.graceMs});(0,q.clearAbort)(a.id);let N=L||M?void 0:J.spawnError;for(let b of(L&&w.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${n.timeoutMs}ms`}}),M&&w.publish(a.id,{type:"error",payload:{stderr:`session aborted: per-job cost limit of $${n.costCapUsd} reached`}}),D.flush()))w.publish(a.id,{type:b.type,payload:{chunks:b.chunks}});let O=D.costUsd>0?D.costUsd:x.estimateCost(B,D.totalInputTokens,D.totalOutputTokens,D.totalCacheCreationInputTokens,D.totalCacheReadInputTokens),P=o.select().from(i.jobs).where((0,d.eq)(i.jobs.id,a.id)).get();return o.update(i.jobs).set({sessionId:D.sessionId??b,totalInputTokens:(P?.totalInputTokens??0)+D.totalInputTokens,totalOutputTokens:(P?.totalOutputTokens??0)+D.totalOutputTokens,costUsd:(P?.costUsd??0)+O}).where((0,d.eq)(i.jobs.id,a.id)).run(),t(x,D,o),{exitCode:K,sessionId:D.sessionId??b,costUsd:O,inputTokens:D.totalInputTokens,outputTokens:D.totalOutputTokens,timedOut:L,costExceeded:M,spawnError:N,limit:s(x,D,I,{exitCode:K,timedOut:L,costExceeded:M})}}},29668:(a,b,c)=>{c.d(b,{F1:()=>l,yO:()=>o,Xm:()=>k,XZ:()=>m,yx:()=>n});var d=c(97496),e=c(14694),f=c(29980),g=c(2025),h=c(64537),i=c(26287);let j=["$ISSUE_NUM","$ISSUE_TITLE","$ISSUE_BODY","$BRANCH","$REPO_NAME","$CI_LOG"];function k(a,b){let c={$ISSUE_NUM:void 0!==b.ISSUE_NUM?String(b.ISSUE_NUM):"$ISSUE_NUM",$ISSUE_TITLE:b.ISSUE_TITLE??"$ISSUE_TITLE",$ISSUE_BODY:b.ISSUE_BODY??"$ISSUE_BODY",$BRANCH:b.BRANCH??"$BRANCH",$REPO_NAME:b.REPO_NAME??"$REPO_NAME",$CI_LOG:b.CI_LOG??"$CI_LOG"},d=a;for(let a of[...j].sort((a,b)=>b.length-a.length))d=d.split(a).join(c[a]??a);return d}function l(a,b,c=(0,g.Lf)()){return c.select().from(h.promptTemplates).where((0,d.Uo)((0,d.eq)(h.promptTemplates.repoId,a),(0,d.eq)(h.promptTemplates.name,b))).orderBy((0,e.i)(h.promptTemplates.version)).get()}function m(a,b,c=(0,g.Lf)()){let d=l(a,b,c);return d?{content:d.content,version:d.version}:{content:i.E[b]??"",version:null}}function n(a,b,c=(0,g.Lf)()){return m(a,b,c).content}function o(a,b,c=(0,g.Lf)()){return c.select().from(h.promptTemplates).where((0,d.Uo)((0,d.eq)(h.promptTemplates.repoId,a),(0,d.eq)(h.promptTemplates.name,b))).orderBy((0,e.i)(h.promptTemplates.version)).all()}f.Ik({repoId:f.ai().int().positive(),name:f.Yj().min(1),content:f.Yj()})},34973:(a,b,c)=>{c.d(b,{U9:()=>e,ej:()=>f});let d=new Set;function e(a){return d.add(a),()=>{d.delete(a)}}function f(){for(let a of[...d])try{a()}catch{}}},35494:(a,b,c)=>{c.d(b,{$J:()=>n,DS:()=>t,Hb:()=>s,IZ:()=>i,JY:()=>m,Pn:()=>k,_1:()=>x,f1:()=>v,i2:()=>l,jQ:()=>j});var d=c(73024),e=c(76760),f=c(1065);let g=!1,h=new Set;function i(a){g=a}function j(){return g}function k(a){h.add(a)}function l(a){h.delete(a)}function m(){return h.size}function n(a=3e4,b=100){let c=Date.now()+a;return new Promise(a=>{let d=()=>{if(0===h.size||Date.now()>=c)return a();setTimeout(d,b)};d()})}function o(){return(0,e.join)((0,f.TG)(),"instance.lock")}function p(a){try{return process.kill(a,0),!0}catch{return!1}}function q(a){try{var b;let c,e,f,g;return b=(0,d.readFileSync)(a,"utf8"),e=(c=JSON.parse(b)).pid,f="number"==typeof e&&Number.isInteger(e)&&e>0?e:null,g=c.ts,{pid:f,ts:"number"==typeof g&&Number.isFinite(g)?g:null}}catch{return{pid:null,ts:null}}}function r(a){let b=(0,d.openSync)(a,"wx");try{(0,d.writeSync)(b,JSON.stringify({pid:process.pid,ts:Date.now()}))}finally{(0,d.closeSync)(b)}}function s(){let{pid:a,ts:b}=q(o()),c=null!==b&&Date.now()-b<=9e4,d=null!==a&&c&&p(a);return{held:d,pid:a,self:d&&a===process.pid}}function t(){let a=o();(0,d.mkdirSync)((0,e.dirname)(a),{recursive:!0});try{return r(a),!0}catch{}if(!function(a,b){let{pid:c,ts:d}=a;return!(null!==c&&c!==process.pid&&p(c))||null===d||b-d>9e4}(q(a),Date.now()))return!1;try{return(0,d.unlinkSync)(a),r(a),!0}catch{return!1}}let u=null;function v(a=3e4){w(),u=setInterval(()=>{!function(){let a=o();if(q(a).pid!==process.pid)return!1;let b=`${a}.${process.pid}.tmp`;try{if((0,d.writeFileSync)(b,JSON.stringify({pid:process.pid,ts:Date.now()})),q(a).pid!==process.pid)return(0,d.unlinkSync)(b),!1;return(0,d.renameSync)(b,a),!0}catch{try{(0,d.unlinkSync)(b)}catch{}return!1}}()&&w()},a),u.unref?.()}function w(){u&&(clearInterval(u),u=null)}function x(){w();let a=o();if(q(a).pid===process.pid)try{(0,d.unlinkSync)(a)}catch{}}},41947:(a,b,c)=>{c.d(b,{m:()=>e});var d=c(74644);function e(a,b){if("http"===a.kind)return a.id;let c=(0,d.mt)(b);return"codex"===a.id?c.codexPath:c.claudePath}},44769:(a,b,c)=>{c.d(b,{t:()=>d});function d(a){let b=process.env.DRYDOCK_OPENROUTER_API_KEY?.trim();return b||a.openrouterApiKey}},47843:(a,b,c)=>{let d,e;c.d(b,{Bd:()=>b0,tn:()=>b1,py:()=>b2});var f=c(97496),g=c(20203),h=c(2025),i=c(54304),j=c(64537),k=c(24978),l=c(64417),m=c(91549);let n=["blocked","wontfix","question","needs-human","needs-discussion"],o=[{label:"destructive command",re:/\brm\s+-rf\b|\bdrop\s+table\b|\bgit\s+push\s+--force\b|disable\s+auth/i},{label:"secret material",re:/\bapi[_-]?key\b|\bpassword\b|\bsecret\b|\.env\b|\bsk-[a-z0-9]/i},{label:"exfiltration",re:/\bcurl\b|\bwget\b|webhook|pastebin/i},{label:"privileged area",re:/\bauth(entication|orization)?\b|\bpayment|\bbilling\b|\bdeploy|\bsecurity\b|\bci\/cd\b/i}];function p(a){let b=[],c=a.labels.map(a=>a.toLowerCase()).find(a=>n.includes(a));if(c)return{decision:"blocked",reasons:[`blocking label: ${c}`]};let d=`${a.title}
|
|
3
|
+
${a.diff}`).join("\n")}catch(a){return(0,u.v)("GitLab prDiff error:",a),""}}async mergePr(a){await this.mutate("PUT",`/merge_requests/${a}/merge`,{body:{squash:!0}})}async createPr(a){let b=await this.mutate("POST","/merge_requests",{body:{source_branch:a.head,target_branch:a.base,title:a.title,description:a.body}});return d.Ik({iid:d.ai()}).parse(L(b.body,{})).iid}async deleteBranch(a){let b=await this.request("DELETE",`/repository/branches/${encodeURIComponent(a)}`);if(!b.ok&&404!==b.status)throw new w.Q8(M(b)||"GitLab branch delete failed")}async prMergeState(a){let b=await this.mutate("GET",`/merge_requests/${a}`),c=d.Ik({has_conflicts:d.zM().default(!1),detailed_merge_status:d.Yj().nullish()}).parse(L(b.body,{}));return c.has_conflicts||"conflict"===c.detailed_merge_status?"conflicted":"need_rebase"===c.detailed_merge_status?"behind":"mergeable"===c.detailed_merge_status?"clean":"unknown"}async updatePrBranch(a){await this.mutate("PUT",`/merge_requests/${a}/rebase`)}async latestPipelineId(a){let b=await this.request("GET",`/merge_requests/${a}`);if(!b.ok)return null;let c=D.safeParse(L(b.body,{})),d=c.success?c.data.head_pipeline??null:null;return d?d.id:null}}function G(a){let b=d.YO(y).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data.map(a=>({number:a.iid,title:a.title,labels:a.labels.map(a=>({name:a})),author:a.author?.username??null,authorAssociation:null}))}function H(a){let b=d.YO(B).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data}function I(a){let b=d.YO(C).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data}function J(a){let b=d.YO(E).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data}function K(a){let b=d.YO(A).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data}function L(a,b){try{return JSON.parse(a||"null")??b}catch{return b}}function M(a){let b=d.Ik({message:d.L5(),error:d.L5()}).partial().safeParse(L(a.body,{}));if(b.success){let a=b.data.message??b.data.error;if("string"==typeof a)return a;if(a)return JSON.stringify(a)}return a.body.slice(0,300)}function N(a){return"gitlab"===((0,w.jL)(a.platform)?a.platform:w.cg)?new F({cwd:a.path,baseUrl:a.apiBaseUrl,token:a.apiToken}):new t({cwd:a.path}.cwd,void 0)}},25480:(a,b,c)=>{c.d(b,{gT:()=>h,sM:()=>g});var d=c(87232);function e(a){if(!/^\d{1,3}(\.\d{1,3}){3}$/.test(a))return null;let b=a.split(".").map(Number);return b.some(a=>a>255)?null:b}function f(a){let b=e(a);if(!b)return!1;let[c,d]=b;return 0===c||10===c||127===c||169===c&&254===d||172===c&&d>=16&&d<=31||192===c&&168===d||100===c&&d>=64&&d<=127||!1}function g(a,b={}){let c,h;try{c=new URL(a)}catch{throw new d.Q8(`invalid forge URL: ${a}`)}if("http:"!==c.protocol&&"https:"!==c.protocol)throw new d.Q8(`forge URL must use http(s): ${c.protocol}`);if(!b.allowPrivate&&(""===(h=c.hostname.trim().toLowerCase().replace(/^\[/,"").replace(/\]$/,""))||"localhost"===h||h.endsWith(".localhost")||(h.includes(":")?function(a){let b=a.toLowerCase();if("::1"===b||"::"===b)return!0;let c=b.match(/^::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/);if(c?.[1])return f(c[1]);let d=b.match(/^::ffff:(?:([0-9a-f]{1,4}):)?([0-9a-f]{1,4})$/);if(d?.[2]){let a=Number.parseInt(d[1]??"0",16),b=Number.parseInt(d[2],16);return f(`${a>>8}.${255&a}.${b>>8}.${255&b}`)}return!!(b.startsWith("fe80")||/^f[cd]/.test(b))}(h):!!e(h)&&f(h))))throw new d.Q8(`refusing to send forge token to private/loopback address ${c.hostname}; set DRYDOCK_ALLOW_PRIVATE_FORGE=1 to allow a self-hosted instance`)}function h(){let a=process.env.DRYDOCK_ALLOW_PRIVATE_FORGE?.trim().toLowerCase();return"1"===a||"true"===a||"yes"===a}},26287:(a,b,c)=>{c.d(b,{E:()=>e,_:()=>d});let d={main:"default",ciFix:"ci-fix",plan:"plan",limitResume:"limit-resume",humanResume:"human-resume",prFormat:"pr-format",release:"release"},e={default:'You are a senior engineer working on GitHub issue #$ISSUE_NUM in the\nrepository "$REPO_NAME". You are on branch "$BRANCH". Implement the change the\nissue asks for to a professional, production-ready standard.\n\nIssue title: $ISSUE_TITLE\n\nIssue body:\n$ISSUE_BODY\n\nRead the context before you change anything. Skim the repo\'s `CLAUDE.md`,\n`AGENTS.md`, and `README` (whichever exist), the code next to what you are\ntouching, and any similar existing implementation. Match the surrounding\ncode\'s conventions — its naming, structure, error handling, and test style —\nrather than imposing your own.\n\nWork test-first. Write a failing test that captures the requirement, then\nimplement the minimal code to make it green, then refactor while it stays\ngreen. For a bug, first add a test that reproduces it (red), then fix it.\nCover the happy path, the edge cases, and the error cases. Never weaken,\ndisable, or delete a test to make the suite pass.\n\nUpdate the docs when behaviour, APIs, or configuration change — but only when\nthere is something to update, and following the repo\'s existing docs\nconventions. Do not churn docs gratuitously.\n\nVerify before you finish. Run the repo\'s tests, typecheck, lint, and build,\nand do not finish on a red signal: fix what you broke. If a check is genuinely\nblocked by something only a human can decide, use the `.drydock/QUESTIONS.md`\nchannel below rather than leaving the change broken.\n\nKeep the change minimal and reversible, and scoped to the issue. Never weaken\nauthentication, security, or tests to make something pass; if the issue seems\nto require that, stop and ask via `.drydock/QUESTIONS.md`.\n\nKeep the change focused. Split your work into focused, thematic commits as\nyou go: group changes by concern and give each commit a clear Conventional\nCommit subject (`type(scope): summary`). Do not dump everything into one\nmega-commit. Never add AI attribution to a commit: no `Co-Authored-By` trailer\nnaming an assistant, no `Generated with Claude Code` line, and no mention of\nthe tool or model anywhere in the message. Do not push or open a pull request\nyourself; Drydock pushes the branch and opens the PR, committing any changes\nyou leave uncommitted.\n\nBefore you finish, write a file `.drydock/PR.md` describing the change for the\npull request. The first line is a Conventional Commit subject (used as the\ncommit message and PR title), then a blank line, then a body in this format:\n\n$PR_FORMAT\n\nDrydock reads this file, appends `Closes #$ISSUE_NUM` to the body, and removes\nthe file — do not commit it.\n\nIf — and only if — you hit a decision that a human must make and you genuinely\ncannot proceed, write your open questions to `.drydock/QUESTIONS.md` instead of\nguessing. Commit any partial, safe work first; do not commit that file. Drydock\nthen preserves your branch, hands the questions to a human, and parks the job\ninstead of opening a PR. Use this only for true blockers — not for routine\nchoices you can reasonably make yourself.\n\nWhenever you consciously leave something out of scope ("this should be a\nseparate issue / follow-up / different PR"), append a follow-up to\n`.drydock/FOLLOWUPS.md` instead of only noting it in the PR. Use a `## ` heading\nper item: the heading is a clear Conventional-style issue title, and the lines\nbelow it are the body — context, rationale, and acceptance criteria. Drydock\nopens a real issue for each, links them from the PR, and removes the file — do\nnot commit it.',"ci-fix":"CI failed. Diagnose the root cause from the log below and fix it at the\nsource — keep the change minimal and focused on the failure. Re-run the\nrelevant check (tests, typecheck, lint, or build) to confirm it is green\nbefore finishing. Do not delete, skip, weaken, or disable tests, and do not\nloosen types or lint rules just to silence the failure.\n\nFailed CI log:\n$CI_LOG",plan:'You are working on GitHub issue #$ISSUE_NUM in the repository "$REPO_NAME".\n\nIssue title: $ISSUE_TITLE\n\nIssue body:\n$ISSUE_BODY\n\nDo not change any files. First read the repo\'s conventions (`CLAUDE.md`/\n`AGENTS.md` if present) and the existing patterns near the code you would\ntouch. Then produce a concise, step-by-step implementation plan for the issue:\nthe files to touch, the change in each, the order to make them, the tests to\nwrite first (test-driven), and how to verify the result (tests, typecheck,\nlint, build). Reply with the plan only — no preamble.',"limit-resume":'Your previous session on issue #$ISSUE_NUM in "$REPO_NAME" was interrupted by a usage limit.\nYou are resuming in a fresh checkout of branch "$BRANCH"; any uncommitted changes from the\ninterrupted session are gone. Re-apply whatever is missing and finish implementing the issue.\nFollow the repo\'s conventions (`CLAUDE.md`/`AGENTS.md`, neighbouring code) and keep working\ntest-first: a failing test that captures the requirement, then the code to make it green.\nBefore you finish, verify: run the repo\'s tests, typecheck, lint, and build, and do not\nfinish on a red signal. Never weaken or delete a test to make the suite pass.\nKeep the change focused. Split your work into focused, thematic commits, each with a clear\nConventional Commit subject (`type(scope): summary`) grouped by concern — not one mega-commit.\nNever add AI attribution to a commit: no `Co-Authored-By` trailer naming an assistant, no\n`Generated with Claude Code` line, and no mention of the tool or model in the message.\nDo not push or open a pull request yourself; Drydock pushes and opens the PR, committing\nanything you leave uncommitted.\nBefore finishing, write `.drydock/PR.md`: first line a Conventional Commit subject (used as\nthe commit message and PR title), then a blank line, then a body in this format:\n\n$PR_FORMAT\n\nDrydock appends `Closes #$ISSUE_NUM` and removes the file — do not commit it.',"human-resume":'Your previous session on issue #$ISSUE_NUM in "$REPO_NAME" was paused for a human to review.\nA human has looked at where you got stuck and given you this instruction:\n\n$INSTRUCTION\n\nYou are resuming on branch "$BRANCH" with your prior commits intact. Follow the instruction\nabove to get unblocked and finish implementing the issue. Keep the change focused. You may\ncommit your work or leave it uncommitted — either is fine. Do not push or open a pull request\nyourself; Drydock commits, pushes, and opens the PR.\nBefore finishing, write `.drydock/PR.md`: first line a Conventional Commit subject (used as\nthe commit message and PR title), then a blank line, then a body in this format:\n\n$PR_FORMAT\n\nDrydock appends `Closes #$ISSUE_NUM` and removes the file — do not commit it.',release:'You are cutting a release for the repository "$REPO_NAME". You are in a clean\ncheckout on the throwaway branch "$BRANCH" (cut from "$DEFAULT_BRANCH"). You have\nfull shell access: git, gh, and the repo\'s tooling are available and already\nauthenticated. Whatever you do not push or trigger yourself is discarded.\n\nGoal: discover how THIS repository releases and perform that release end-to-end.\n\n1. Investigate the release mechanism. Read the CI workflows (.github/workflows),\n package.json scripts, release-please / changesets / semantic-release config,\n CHANGELOG, and the prior tags (`git tag`, `gh release list`). Determine how a\n release is normally cut here — e.g. a release-please `workflow_dispatch`, an\n `npm publish`, a tag + GitHub Release, or a changelog + tag convention.\n2. Determine the correct next version from the conventional-commit history and\n the existing tags. Do not guess a magnitude you cannot justify.\n3. Perform the release the way the repo expects: trigger the workflow, push the\n tag, open the release PR, or run the publish — using gh/git/the repo\'s own\n scripts. Prefer the repo\'s established path over inventing a new one.\n4. Verify the release actually started or completed (the workflow run, the tag,\n the GitHub Release, or the published package) before you finish. If\n verification shows the release failed or is incomplete, explain what went\n wrong in `.drydock/QUESTIONS.md` and stop rather than reporting success.\n\nWhen done, write a short `.drydock/RELEASE.md` in either form: start with a\n`Tag: <tag>` line (e.g. `Tag: v1.4.0`) followed by the release title, OR make the\nfirst line a version-looking title (e.g. `v1.4.0`) that doubles as the tag. Then a\nblank line, then notes on what you did. Do not commit this file — Drydock reads it\nto record the run, then removes it.\n\nIf — and only if — you are unsure how this repo releases, what version to cut, or\nwhether it is safe to proceed, do NOT guess: write your open questions to\n`.drydock/QUESTIONS.md` and stop without releasing. Drydock hands them to a human\nand parks the run. A botched release is far worse than a deferred one.',"pr-format":'A one-paragraph **TL;DR** summarising the change in plain language, then:\n\n## Problem\nWhat was wrong or missing, and why it mattered.\n\n## Solution\nWhat you changed and the key decisions behind it.\n\n## Tests\nWhat you added or ran to verify the change.\n\n## Risks\nAnything reviewers should watch for, or "None".'}},27630:(a,b,c)=>{c.d(b,{V:()=>z,n:()=>A});var d=c(97496),e=c(84232),f=c(51214),g=c(20203),h=c(2025),i=c(64537),j=c(94534),k=c(26287),l=c(29668),m=c(48733),n=c(2412),o=c(7611),p=c(5079),q=c(96356);function r(a,b,c,d){let e=(0,o.nc)(a.id,d);if(e)return c.publish(b.id,{type:"error",payload:{stderr:`session not started: ${a.label} is limit-blocked (${e.kind}) until ${new Date(1e3*e.blockedUntil).toISOString()}`}}),{exitCode:-3,costUsd:0,inputTokens:0,outputTokens:0,timedOut:!1,costExceeded:!1,limit:{agent:a.id,kind:e.kind,resetAt:e.blockedUntil,rawSnippet:e.rawSnippet,latched:!0}}}function s(a,b,c,d){if(!d.timedOut&&!d.costExceeded&&(0!==d.exitCode||b.resultIsError))return a.classifyFailure?.({exitCode:d.exitCode,stderr:c,resultText:b.resultText,resultIsError:b.resultIsError})}function t(a,b,c){let d=Math.floor(Date.now()/1e3),e=(0,f.qE)(b.rateLimit,d);e&&(0,p.IP)(a.id,e,c);let g=a.captureUsage?.(b);g&&(0,p.Cx)(g,c,d)}function u(a,b){let c=()=>{},d=!1;return{tripped:new Promise(a=>{c=a}),observe(){!d&&b()>=a&&(d=!0,c())}}}function v(a,b={}){let{timeoutMs:c,costTripped:d}=b,e=b.graceMs??5e3,f=!!c&&c>0;return f||d?new Promise(b=>{let g,h=!1,i=!1,j=a=>{h||(h=!0,b(a))},k=b=>{let c;if(i)return;i=!0,g&&clearTimeout(g),a.abort();let d=new Promise(a=>{c=setTimeout(a,e),c.unref?.()});Promise.race([a.done,d]).then(()=>{clearTimeout(c),j(b)})};f&&(g=setTimeout(()=>{k({exitCode:-1,timedOut:!0,costExceeded:!1})},c),g.unref?.()),d?.then(()=>{k({exitCode:-2,timedOut:!1,costExceeded:!0})}),a.done.then(a=>{i||(g&&clearTimeout(g),j({exitCode:a,timedOut:!1,costExceeded:!1}))})}):a.done.then(a=>({exitCode:a,timedOut:!1,costExceeded:!1}))}let w={costUsd:0,inputTokens:0,outputTokens:0};function x(a,b){let c=a.select().from(i.jobs).where((0,d.eq)(i.jobs.id,b)).get();return{costUsd:c?.costUsd??0,inputTokens:c?.totalInputTokens??0,outputTokens:c?.totalOutputTokens??0}}function y(a,b){return{chunks:a.chunks,costUsd:b.costUsd,inputTokens:b.inputTokens,outputTokens:b.outputTokens}}async function z(a,b,f,k={}){let l=k.db??(0,h.Lf)(),o=k.runner??j.g,p=k.broker??(0,m.k)(),A=k.provider??(0,g.X$)(a.agent);if("http"===A.kind){let{runOpenRouterJobSession:d}=await c.e(908).then(c.bind(c,17908));return d(a,b,f,{db:l,broker:k.broker,timeoutMs:k.timeoutMs,costCapUsd:k.costCapUsd,sideSession:k.sideSession,fetchImpl:k.fetchImpl,toolExecutor:k.toolExecutor})}let B=k.command??A.defaultCommand,C=a.model??A.defaultModel,D=A.createParser();D.onParseError=b=>p.publish(a.id,{type:"parse_error",payload:b});let E=r(A,a,p,l);if(E)return E;k.sideSession||("working"!==a.status?(0,n.dk)(a.id,"working",{model:C},l):l.update(i.jobs).set({model:C}).where((0,d.eq)(i.jobs.id,a.id)).run());let F=()=>D.costUsd>0?D.costUsd:A.estimateCost(C,D.totalInputTokens,D.totalOutputTokens,D.totalCacheCreationInputTokens,D.totalCacheReadInputTokens),G=k.costCapUsd&&k.costCapUsd>0?u(k.costCapUsd,F):void 0,H=k.sideSession?x(l,a.id):w,I=()=>({costUsd:H.costUsd+F(),inputTokens:H.inputTokens+D.totalInputTokens,outputTokens:H.outputTokens+D.totalOutputTokens}),J=A.buildStartArgs({prompt:b,model:C,maxTurns:a.maxTurns,bypassPermissions:k.bypassPermissions}),K="",L=o(B,J,f,{onStdout:b=>{for(let c of D.push(b))p.publish(a.id,{type:c.type,payload:y(c,I())});G?.observe()},onStderr:b=>{K=(K+b).slice(-16384),p.publish(a.id,{type:"error",payload:{stderr:b}})}});(0,q.registerAbort)(a.id,L.abort);let{exitCode:M,timedOut:N,costExceeded:O}=await v(L,{timeoutMs:k.timeoutMs,costTripped:G?.tripped,graceMs:k.graceMs});(0,q.clearAbort)(a.id);let P=N||O?void 0:L.spawnError;for(let b of(N&&p.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${k.timeoutMs}ms`}}),O&&p.publish(a.id,{type:"error",payload:{stderr:`session aborted: per-job cost limit of $${k.costCapUsd} reached`}}),D.flush()))p.publish(a.id,{type:b.type,payload:y(b,I())});let Q=D.costUsd>0?D.costUsd:A.estimateCost(C,D.totalInputTokens,D.totalOutputTokens,D.totalCacheCreationInputTokens,D.totalCacheReadInputTokens);return k.sideSession?l.update(i.jobs).set({totalInputTokens:(0,e.ll)`coalesce(${i.jobs.totalInputTokens}, 0) + ${D.totalInputTokens}`,totalOutputTokens:(0,e.ll)`coalesce(${i.jobs.totalOutputTokens}, 0) + ${D.totalOutputTokens}`,costUsd:(0,e.ll)`coalesce(${i.jobs.costUsd}, 0) + ${Q}`}).where((0,d.eq)(i.jobs.id,a.id)).run():l.update(i.jobs).set({sessionId:D.sessionId,totalInputTokens:D.totalInputTokens,totalOutputTokens:D.totalOutputTokens,costUsd:Q}).where((0,d.eq)(i.jobs.id,a.id)).run(),t(A,D,l),{exitCode:M,sessionId:D.sessionId,costUsd:Q,inputTokens:D.totalInputTokens,outputTokens:D.totalOutputTokens,timedOut:N,costExceeded:O,spawnError:P,limit:s(A,D,K,{exitCode:M,timedOut:N,costExceeded:O})}}async function A(a,b,e,f,n={}){let o=n.db??(0,h.Lf)(),p=n.runner??j.g,w=n.broker??(0,m.k)(),z=n.provider??(0,g.X$)(a.agent),B=n.resumePrompt??(0,l.Xm)((0,l.yx)(a.repoId,k._.ciFix,o),{CI_LOG:e});if("http"===z.kind){let{runOpenRouterJobSession:b}=await c.e(908).then(c.bind(c,17908));return b(a,B,f,{db:o,broker:n.broker,timeoutMs:n.timeoutMs,costCapUsd:n.costCapUsd,sideSession:n.sideSession,additive:!0,maxTurns:n.resumeMaxTurns??z.resumeMaxTurns,fetchImpl:n.fetchImpl,toolExecutor:n.toolExecutor})}let C=n.command??z.defaultCommand,D=n.resumeModel??z.resumeModel,E=n.resumeMaxTurns??z.resumeMaxTurns,F=z.createParser();F.onParseError=b=>w.publish(a.id,{type:"parse_error",payload:b});let G=r(z,a,w,o);if(G)return{...G,sessionId:b};let H=x(o,a.id),I=()=>{let a=F.costUsd>0?F.costUsd:z.estimateCost(D,F.totalInputTokens,F.totalOutputTokens,F.totalCacheCreationInputTokens,F.totalCacheReadInputTokens);return H.costUsd+a},J=n.costCapUsd&&n.costCapUsd>0?u(n.costCapUsd,I):void 0,K=()=>({costUsd:I(),inputTokens:H.inputTokens+F.totalInputTokens,outputTokens:H.outputTokens+F.totalOutputTokens}),L=(z.supportsResume?z.buildResumeArgs({prompt:B,sessionId:b,model:D,maxTurns:E,bypassPermissions:n.bypassPermissions}):null)??z.buildStartArgs({prompt:B,model:D,maxTurns:E,bypassPermissions:n.bypassPermissions}),M="",N=p(C,L,f,{onStdout:b=>{for(let c of F.push(b))w.publish(a.id,{type:c.type,payload:y(c,K())});J?.observe()},onStderr:b=>{M=(M+b).slice(-16384),w.publish(a.id,{type:"error",payload:{stderr:b}})}});(0,q.registerAbort)(a.id,N.abort);let{exitCode:O,timedOut:P,costExceeded:Q}=await v(N,{timeoutMs:n.timeoutMs,costTripped:J?.tripped,graceMs:n.graceMs});(0,q.clearAbort)(a.id);let R=P||Q?void 0:N.spawnError;for(let b of(P&&w.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${n.timeoutMs}ms`}}),Q&&w.publish(a.id,{type:"error",payload:{stderr:`session aborted: per-job cost limit of $${n.costCapUsd} reached`}}),F.flush()))w.publish(a.id,{type:b.type,payload:y(b,K())});let S=F.costUsd>0?F.costUsd:z.estimateCost(D,F.totalInputTokens,F.totalOutputTokens,F.totalCacheCreationInputTokens,F.totalCacheReadInputTokens),T=o.select().from(i.jobs).where((0,d.eq)(i.jobs.id,a.id)).get();return o.update(i.jobs).set({sessionId:F.sessionId??b,totalInputTokens:(T?.totalInputTokens??0)+F.totalInputTokens,totalOutputTokens:(T?.totalOutputTokens??0)+F.totalOutputTokens,costUsd:(T?.costUsd??0)+S}).where((0,d.eq)(i.jobs.id,a.id)).run(),t(z,F,o),{exitCode:O,sessionId:F.sessionId??b,costUsd:S,inputTokens:F.totalInputTokens,outputTokens:F.totalOutputTokens,timedOut:P,costExceeded:Q,spawnError:R,limit:s(z,F,M,{exitCode:O,timedOut:P,costExceeded:Q})}}},29668:(a,b,c)=>{c.d(b,{F1:()=>l,yO:()=>o,Xm:()=>k,XZ:()=>m,yx:()=>n});var d=c(97496),e=c(14694),f=c(29980),g=c(2025),h=c(64537),i=c(26287);let j=["$ISSUE_NUM","$ISSUE_TITLE","$ISSUE_BODY","$BRANCH","$REPO_NAME","$CI_LOG","$PR_FORMAT","$INSTRUCTION","$DEFAULT_BRANCH"];function k(a,b){let c={$ISSUE_NUM:void 0!==b.ISSUE_NUM?String(b.ISSUE_NUM):"$ISSUE_NUM",$ISSUE_TITLE:b.ISSUE_TITLE??"$ISSUE_TITLE",$ISSUE_BODY:b.ISSUE_BODY??"$ISSUE_BODY",$BRANCH:b.BRANCH??"$BRANCH",$REPO_NAME:b.REPO_NAME??"$REPO_NAME",$CI_LOG:b.CI_LOG??"$CI_LOG",$PR_FORMAT:b.PR_FORMAT??"$PR_FORMAT",$INSTRUCTION:b.INSTRUCTION??"$INSTRUCTION",$DEFAULT_BRANCH:b.DEFAULT_BRANCH??"$DEFAULT_BRANCH"},d=a;for(let a of[...j].sort((a,b)=>b.length-a.length))d=d.split(a).join(c[a]??a);return d}function l(a,b,c=(0,g.Lf)()){return c.select().from(h.promptTemplates).where((0,d.Uo)((0,d.eq)(h.promptTemplates.repoId,a),(0,d.eq)(h.promptTemplates.name,b))).orderBy((0,e.i)(h.promptTemplates.version)).get()}function m(a,b,c=(0,g.Lf)()){let d=l(a,b,c);return d?{content:d.content,version:d.version}:{content:i.E[b]??"",version:null}}function n(a,b,c=(0,g.Lf)()){return m(a,b,c).content}function o(a,b,c=(0,g.Lf)()){return c.select().from(h.promptTemplates).where((0,d.Uo)((0,d.eq)(h.promptTemplates.repoId,a),(0,d.eq)(h.promptTemplates.name,b))).orderBy((0,e.i)(h.promptTemplates.version)).all()}f.Ik({repoId:f.ai().int().positive(),name:f.Yj().min(1),content:f.Yj()})},34973:(a,b,c)=>{c.d(b,{U9:()=>g,ej:()=>h});let d=Symbol.for("drydock.dashboard-bus.listeners"),e=globalThis;e[d]??=new Set;let f=e[d];function g(a){return f.add(a),()=>{f.delete(a)}}function h(){for(let a of[...f])try{a()}catch{}}},35494:(a,b,c)=>{c.d(b,{$J:()=>n,DS:()=>t,Hb:()=>s,IZ:()=>i,JY:()=>m,Pn:()=>k,_1:()=>x,f1:()=>v,i2:()=>l,jQ:()=>j});var d=c(73024),e=c(76760),f=c(1065);let g=!1,h=new Set;function i(a){g=a}function j(){return g}function k(a){h.add(a)}function l(a){h.delete(a)}function m(){return h.size}function n(a=3e4,b=100){let c=Date.now()+a;return new Promise(a=>{let d=()=>{if(0===h.size||Date.now()>=c)return a();setTimeout(d,b)};d()})}function o(){return(0,e.join)((0,f.TG)(),"instance.lock")}function p(a){try{return process.kill(a,0),!0}catch{return!1}}function q(a){try{var b;let c,e,f,g;return b=(0,d.readFileSync)(a,"utf8"),e=(c=JSON.parse(b)).pid,f="number"==typeof e&&Number.isInteger(e)&&e>0?e:null,g=c.ts,{pid:f,ts:"number"==typeof g&&Number.isFinite(g)?g:null}}catch{return{pid:null,ts:null}}}function r(a){let b=(0,d.openSync)(a,"wx");try{(0,d.writeSync)(b,JSON.stringify({pid:process.pid,ts:Date.now()}))}finally{(0,d.closeSync)(b)}}function s(){let{pid:a,ts:b}=q(o()),c=null!==b&&Date.now()-b<=9e4,d=null!==a&&c&&p(a);return{held:d,pid:a,self:d&&a===process.pid}}function t(){let a=o();(0,d.mkdirSync)((0,e.dirname)(a),{recursive:!0});try{return r(a),!0}catch{}if(!function(a,b){let{pid:c,ts:d}=a;return!(null!==c&&c!==process.pid&&p(c))||null===d||b-d>9e4}(q(a),Date.now()))return!1;try{return(0,d.unlinkSync)(a),r(a),!0}catch{return!1}}let u=null;function v(a=3e4){w(),u=setInterval(()=>{!function(){let a=o();if(q(a).pid!==process.pid)return!1;let b=`${a}.${process.pid}.tmp`;try{if((0,d.writeFileSync)(b,JSON.stringify({pid:process.pid,ts:Date.now()})),q(a).pid!==process.pid)return(0,d.unlinkSync)(b),!1;return(0,d.renameSync)(b,a),!0}catch{try{(0,d.unlinkSync)(b)}catch{}return!1}}()&&w()},a),u.unref?.()}function w(){u&&(clearInterval(u),u=null)}function x(){w();let a=o();if(q(a).pid===process.pid)try{(0,d.unlinkSync)(a)}catch{}}},41947:(a,b,c)=>{c.d(b,{m:()=>e});var d=c(74644);function e(a,b){if("http"===a.kind)return a.id;let c=(0,d.mt)(b);return"codex"===a.id?c.codexPath:c.claudePath}},44769:(a,b,c)=>{c.d(b,{t:()=>d});function d(a){let b=process.env.DRYDOCK_OPENROUTER_API_KEY?.trim();return b||a.openrouterApiKey}},48036:(a,b,c)=>{c.d(b,{Pe:()=>g,dj:()=>h});var d=c(97496),e=c(2025),f=c(64537);function g(a,b=(0,e.Lf)(),c){let h=[];return a&&h.push((0,d.eq)(f.adrs.status,a)),void 0!==c&&h.push((0,d.eq)(f.adrs.repoId,c)),(h.length?b.select().from(f.adrs).where((0,d.Uo)(...h)).all():b.select().from(f.adrs).all()).sort((a,b)=>b.createdAt-a.createdAt)}function h(a=(0,e.Lf)()){return a.select().from(f.adrs).where((0,d.eq)(f.adrs.status,"pending_review")).all().length}},48733:(a,b,c)=>{let d;c.d(b,{k:()=>k});var e=c(97496),f=c(14694),g=c(2025),h=c(64537),i=c(14543);class j{constructor(a=(0,g.Lf)()){this.db=a,this.subs=new Map}subscribe(a,b){let c=this.subs.get(a);c||(c=new Set,this.subs.set(a,c)),c.add(b)}unsubscribe(a,b){let c=this.subs.get(a);c&&(c.delete(b),0===c.size&&this.subs.delete(a))}subscriberCount(a){return this.subs.get(a)?.size??0}publish(a,b){let c,d=(0,i.f)(JSON.stringify(b.payload??{}));try{c=JSON.parse(d)}catch{c={error:"unparseable event payload"}}let e=this.db.insert(h.jobEvents).values({jobId:a,type:b.type,payload:d}).returning().get(),f=this.subs.get(a);if(f)for(let b of[...f])try{b.send({id:e.id,type:e.type,payload:c})}catch{this.unsubscribe(a,b)}return e}replay(a,b=200,c){return void 0!==c?this.db.select().from(h.jobEvents).where((0,e.Uo)((0,e.eq)(h.jobEvents.jobId,a),(0,e.gt)(h.jobEvents.id,c))).orderBy(h.jobEvents.ts,h.jobEvents.id).limit(b).all():this.db.select().from(h.jobEvents).where((0,e.eq)(h.jobEvents.jobId,a)).orderBy((0,f.i)(h.jobEvents.ts),(0,f.i)(h.jobEvents.id)).limit(b).all().reverse()}}function k(){return d||(d=new j),d}},52479:(a,b,c)=>{c.d(b,{QJ:()=>h,RH:()=>d,kl:()=>f,xh:()=>g});let d=["queued","working","ci_running","ci_failed","retrying","waiting_limit","merged","released","needs_human","aborted","interrupted"],e={queued:["working","aborted","interrupted"],working:["ci_running","waiting_limit","released","needs_human","aborted","interrupted"],ci_running:["ci_failed","merged","needs_human","aborted","interrupted"],ci_failed:["retrying","needs_human","aborted","interrupted"],retrying:["ci_running","needs_human","aborted","interrupted"],waiting_limit:["queued","needs_human","aborted","interrupted"],merged:[],released:[],needs_human:["queued","aborted"],aborted:[],interrupted:["queued","aborted"]},f=["merged","released","aborted"];class g extends Error{constructor(a,b){super(`invalid job transition: ${a} -> ${b}`)}}function h(a,b){if(!e[a].includes(b))throw new g(a,b)}},52484:(a,b,c)=>{c.d(b,{dC:()=>f,rN:()=>e});let d=new Set;function e(a){return b=>new Promise(c=>{let e={repoId:a.repoId,prNumber:a.prNumber,wake:b=>{d.delete(e),clearTimeout(f);try{a.onNudge?.(b)}catch{}c()}},f=setTimeout(()=>{d.delete(e),c()},b);f.unref?.(),d.add(e)})}function f(a,b,c){let e=[...d].filter(c=>c.repoId===a&&(0===b.length||b.includes(c.prNumber)));for(let a of e)a.wake(c);return e.length}},52819:(a,b,c)=>{c.d(b,{CZ:()=>j,PH:()=>f,RQ:()=>h,mW:()=>i});var d=c(2025),e=c(76373);async function f(a,b,c=(0,d.Lf)(),g=e.QD){a?b.active||(b.active=!0,await (0,e.JD)("cost_limit","\uD83D\uDCB8 Daily cost limit reached — new jobs are paused until the budget resets.",c,g)):b.active=!1}let g={claude:{event:"claude_limit",blocked:"⏳ Claude usage limit reached — Claude jobs are parked until the quota resets.",cleared:"▶️ Claude quota available again — parked jobs are resuming."},codex:{event:"codex_limit",blocked:"⏳ Codex usage limit reached — Codex jobs are parked until the quota resets.",cleared:"▶️ Codex capacity available again — parked jobs are resuming."},openrouter:{event:"openrouter_limit",blocked:"⏳ OpenRouter limit reached — OpenRouter jobs are parked until the window resets.",cleared:"▶️ OpenRouter available again — parked jobs are resuming."}};async function h(a,b,c,f=(0,d.Lf)(),i=e.QD){let j=g[a];if(b){if(c.active)return;c.active=!0,await (0,e.JD)(j.event,j.blocked,f,i)}else{if(!c.active)return;c.active=!1,await (0,e.JD)(j.event,j.cleared,f,i)}}async function i(a,b,c=(0,d.Lf)(),f=e.QD){if(a.length>0){if(b.active)return;b.active=!0;let d=a.map(a=>`${a.label}: ${a.message}`).join("; ");await (0,e.JD)("auth_expired",`🔑 Credential check failed — new jobs are paused until auth is restored. ${d}`,c,f)}else{if(!b.active)return;b.active=!1,await (0,e.JD)("auth_expired","\uD83D\uDD11 Credentials restored — the queue is resuming.",c,f)}}async function j(a=(0,d.Lf)(),b=e.QD){await (0,e.JD)("automation_paused","\uD83C\uDF19 Automation draining — finishing in-flight jobs, then shutting down.",a,b)}},54373:(a,b,c)=>{let d,e;c.d(b,{Bd:()=>ci,tn:()=>cj,py:()=>ck});var f=c(97496),g=c(20203),h=c(2025),i=c(54304),j=c(64537),k=c(24978),l=c(64417),m=c(91549);let n=["blocked","wontfix","question","needs-human","needs-discussion"],o=[{label:"destructive command",re:/\brm\s+-rf\b|\bdrop\s+table\b|\bgit\s+push\s+--force\b|disable\s+auth/i},{label:"secret material",re:/\bapi[_-]?key\b|\bpassword\b|\bsecret\b|\.env\b|\bsk-[a-z0-9]/i},{label:"exfiltration",re:/\bcurl\b|\bwget\b|webhook|pastebin/i},{label:"privileged area",re:/\bauth(entication|orization)?\b|\bpayment|\bbilling\b|\bdeploy|\bsecurity\b|\bci\/cd\b/i}];function p(a){let b=[],c=a.labels.map(a=>a.toLowerCase()).find(a=>n.includes(a));if(c)return{decision:"blocked",reasons:[`blocking label: ${c}`]};let d=`${a.title}
|
|
4
4
|
${a.body??""}`;for(let{label:a,re:c}of o)c.test(d)&&b.push(`${a} detected`);return b.length>0?{decision:"needs_review",reasons:b}:{decision:"approved",reasons:[]}}var q=c(24421),r=c(75818),s=c(16544);let t=[{label:"bug",re:/\b(bug|crash|crashes|broken|error|exception|fails?|regression|defect)\b/i},{label:"enhancement",re:/\b(add|support|feature|implement|enhancement|would be nice|allow|introduce)\b/i},{label:"documentation",re:/\b(docs?|documentation|readme|typo|wording|clarify)\b/i}];function u(a,b,c,d){d.update(j.issues).set({triageHash:c,triagedAt:Math.floor(Date.now()/1e3)}).where((0,f.Uo)((0,f.eq)(j.issues.repoId,a),(0,f.eq)(j.issues.number,b))).run()}async function v(a,b,c,d=(0,h.Lf)()){let e=(0,s.A)(a),g=function(a){let b=JSON.stringify([a.title,a.labels.map(a=>a.name).sort()]),c=5381;for(let a=0;a<b.length;a++)c=(c<<5)+c+b.charCodeAt(a)|0;return(c>>>0).toString(16)}(c),i=d.select().from(j.issues).where((0,f.Uo)((0,f.eq)(j.issues.repoId,a.id),(0,f.eq)(j.issues.number,c.number))).get();if(i?.triagedAt&&i.triageHash===g)return{number:c.number,applied:[],reasons:[],skipped:"unchanged"};if(!(0,s.i)(e,c.authorAssociation))return u(a.id,c.number,g,d),{number:c.number,applied:[],reasons:["author not approved"],skipped:"author"};let k=await b.viewIssue(c.number),l=p({number:k.number,title:k.title,body:k.body,labels:k.labels}),m=[],n=function(a,b){let c=new Set(b),d=`${a.title}
|
|
5
|
-
${a.body}`,e=[];for(let{label:a,re:b}of t)c.has(a)&&b.test(d)&&!e.includes(a)&&e.push(a);return e}(k,e.autoLabelWhitelist);for(let a of n)m.push(`classified as ${a}`);if("approved"===l.decision){let a=e.readyLabels[0];a&&(n.push(a),m.push("safe and well-specified"))}else{let a=e.blockingLabels[0];a&&(n.push(a),m.push(...l.reasons.length?l.reasons:["flagged for human review"]))}let o=new Set([...e.autoLabelWhitelist,...e.readyLabels,...e.blockingLabels]),r=new Set(k.labels),w=[...new Set(n)].filter(a=>o.has(a)&&!r.has(a));if(w.length>0){for(let a of w)await b.ensureLabel(a);await b.addLabels(c.number,w);let e=w.map(a=>`\`${a}\``).join(", ");await b.commentIssue(c.number,`auto-triage: applied ${e} — reasons: ${m.join("; ")}.`),(0,q.sp)(a.id,c.number,w,[],d)}return u(a.id,c.number,g,d),{number:c.number,applied:w,reasons:m}}async function w(a,b,c,d=(0,h.Lf)()){let e=[];for(let f of c)try{e.push(await v(a,b,f,d))}catch(b){(0,r.v)(`[triage] issue #${f.number} failed for ${a.name}`,b)}return e}var x=c(52819),y=c(74340),z=c(44769),A=c(74644),B=c(41947),C=c(2412),D=c(52479);let E="janitor",F=new Set(["ci_running","ci_failed","retrying"]);function G(a){return a?.startsWith("drydock/")??!1}async function H(a,b,c,d){if("function"!=typeof c.deleteBranch)return;let e=function(a,b){let c=b.select({jobId:j.jobEvents.jobId,payload:j.jobEvents.payload}).from(j.jobEvents).innerJoin(j.jobs,(0,f.eq)(j.jobEvents.jobId,j.jobs.id)).where((0,f.Uo)((0,f.eq)(j.jobEvents.type,E),(0,f.eq)(j.jobs.repoId,a))).all(),d=new Set;for(let a of c)try{"branch_deleted"===JSON.parse(a.payload??"{}").action&&d.add(a.jobId)}catch{}return d}(a,d),g=new Set(b.filter(a=>!["merged","aborted"].includes(a.status)).map(a=>a.branch).filter(G));for(let a of b.filter(a=>"merged"===a.status&&null!==a.prNumber&&G(a.branch)&&!e.has(a.id)&&!g.has(a.branch))){let b=a.branch;try{await c.deleteBranch(b),(0,C.yM)(a.id,E,{action:"branch_deleted",branch:b},d)}catch(c){(0,r.v)(`[janitor] branch delete failed for job ${a.id} (${b})`,c)}}}async function I(a,b,c,d){if("function"==typeof c.prMergeState)for(let e of b.filter(a=>F.has(a.status)&&null!==a.prNumber&&G(a.branch))){let b=e.prNumber;try{let f=await c.prMergeState(b);"behind"===f&&"function"==typeof c.updatePrBranch?(await c.updatePrBranch(b),(0,C.yM)(e.id,E,{action:"branch_updated",prNumber:b},d)):"conflicted"===f&&await J(a,e,b,c,d)}catch(a){(0,r.v)(`[janitor] PR refresh failed for job ${e.id} (PR #${b})`,a)}}}async function J(a,b,c,d,e){let f=`rebase needed: conflicts with ${a.defaultBranch}`;try{await d.commentIssue(b.issueNumber,`⚠️ PR #${c} conflicts with \`${a.defaultBranch}\` — a rebase is needed. Parking job #${b.id} for a human.`)}catch(a){(0,r.v)(`[janitor] conflict comment failed for job ${b.id}`,a)}try{let a=(0,C.ax)(b.id,e);if(!a||!F.has(a.status))return;(0,C.yM)(b.id,"status",{reason:"merge_conflict",prNumber:c},e),(0,C.dk)(b.id,"needs_human",{errorMessage:f},e)}catch(a){if(!(a instanceof D.xh))throw a}}async function K(a={}){let b=a.db??(0,h.Lf)();for(let c of(0,i.uP)(b))try{let d=a.forgeFor?.(c)??(0,k.Ie)(c),e=(0,C.N6)(c.id,b);await H(c.id,e,d,b),await I(c,e,d,b)}catch(a){(0,r.v)(`[janitor] sweep failed for ${c.name}`,a)}}var L=c(61408),M=c(77597);async function N(a,b={}){let c=b.command??a.defaultCommand,d=b.runner??M.Sx;try{let{stdout:b,exitCode:e}=await d(c,["--version"]);if(0===e)return{agent:a.id,installed:!0,version:b.trim()};return{agent:a.id,installed:!1,message:`${a.label} CLI '${c}' exited ${e} on --version. Check the installation or the CLI path in settings.`}}catch{return{agent:a.id,installed:!1,message:`${a.label} CLI '${c}' not found. Install it or set the correct CLI path in settings.`}}}var O=c(87105),P=c(25480),Q=c(14543),R=c(93612);let S={kind:"ok"},T={kind:"unknown"};function U(a,b,c){return{kind:"failed",failure:{target:a,label:b,message:c}}}function V(a){return(0,Q.f)(a.trim()).slice(0,200)}async function W(a){let b=a.db??(0,h.Lf)(),c={runner:a.runner??M.Sx,http:a.http??O.D,fetchImpl:a.fetchImpl??fetch,governor:a.governor??m.og,now:a.now??Date.now,probeTimeoutMs:a.probeTimeoutMs??3e4},d=(0,A.mt)(b),e=function(a,b,c,d){let e=[];a.some(a=>"gitlab"!==a.platform)&&e.push({id:"github",probe:async()=>{if(!d.governor.decide("core","low").allowed)return T;try{let a=await d.runner(b.ghPath,["auth","status"],void 0,{timeoutMs:d.probeTimeoutMs});if(0===a.exitCode)return S;let c=V(a.stderr||a.stdout);return U("github","GitHub CLI auth",`\`${b.ghPath} auth status\` exited ${a.exitCode}${c?`: ${c}`:""}. Re-authenticate with \`gh auth login\`.`)}catch(a){if(a instanceof Error&&/timed out/i.test(a.message))return T;return U("github","GitHub CLI auth",`GitHub CLI '${b.ghPath}' could not be probed: ${V(String(a))}`)}}});let f=new Map;for(let b of a){if("gitlab"!==b.platform||!b.apiBaseUrl||!b.apiToken)continue;let a=b.apiBaseUrl.trim().replace(/\/+$/,"");!a||f.has(a)||f.set(a,b.apiToken)}for(let[a,b]of f)e.push(function(a,b,c){let d=`gitlab:${a}`,e=a;try{e=new URL(a).host}catch{}let f=`GitLab (${e})`;return{id:d,probe:async()=>{let g=`${a}/api/v4/user`;try{(0,P.sM)(g,{allowPrivate:(0,P.gT)()})}catch(a){return(0,r.v)(`[watchdog] gitlab probe skipped for ${e}`,a),T}try{var h,i;let a=await (h=c.http(g,{headers:{"PRIVATE-TOKEN":b}}),i=c.probeTimeoutMs,new Promise((a,b)=>{let c=setTimeout(()=>b(Error(`probe timed out after ${i}ms`)),i);c.unref?.(),h.then(b=>{clearTimeout(c),a(b)},a=>{clearTimeout(c),b(a)})}));if(401===a.status||403===a.status)return U(d,f,`GitLab rejected the access token (HTTP ${a.status}). Update the token in the repo's forge settings.`);if(a.ok)return S;return T}catch{return T}}}}(a,b,d));let h=new Set;for(let b of a)(0,g.TU)(b.agent)&&h.add(b.agent);for(let a of h)e.push(function(a,b,c,d){let e=`agent:${a}`,f=(0,g.X$)(a);return"openrouter"===a?{id:e,probe:async()=>{let a=(0,z.t)(b);if(!a)return U(e,"OpenRouter API key","No OpenRouter API key is configured — set it in settings or via DRYDOCK_OPENROUTER_API_KEY.");let c=await (0,R.lw)(a,d.fetchImpl);return c.ok?S:/HTTP 40[13]\b/.test(c.error)?U(e,"OpenRouter API key",`OpenRouter rejected the API key (${V(c.error)}). Update the key in settings.`):T}}:{id:e,probe:async()=>{let a=await N(f,{command:(0,B.m)(f,c),runner:(a,b,c,e)=>d.runner(a,b,c,{timeoutMs:d.probeTimeoutMs,...e})});return a.installed?S:U(e,`${f.label} CLI`,a.message??"CLI probe failed.")}}}(a,b,c,d));return e}((0,i.uP)(b),d,b,c),f=(0,L.iC)(b),j=new Map((f?.failures??[]).map(a=>[a.target,a])),k=[];for(let{id:a,outcome:b}of(await Promise.all(e.map(async a=>{try{return{id:a.id,outcome:await a.probe()}}catch(b){return(0,r.v)(`[watchdog] credential probe for ${a.id} failed`,b),{id:a.id,outcome:T}}}))))if("failed"===b.kind)k.push(b.failure);else if("unknown"===b.kind){let b=j.get(a);b&&k.push(b)}let l={checkedAt:Math.floor(c.now()/1e3),failures:k};return(0,L.z8)(l,b),l}let X=!1;async function Y(a={}){if(!X){X=!0,d=(a.now??Date.now)();try{return await W(a)}finally{X=!1}}}var Z=c(1065),$=c(27630),_=c(73024);let aa=["vercel","railway"];function ab(a){return a.exists??_.existsSync}var ac=c(76760);class ad{async detect(a){let b=ab(a);return b((0,ac.join)(a.cwd,"railway.json"))||b((0,ac.join)(a.cwd,"railway.toml"))||b((0,ac.join)(a.cwd,".railway"))}async getStatus(a){let b=await a.run("railway",["status"],a.cwd);return function(a,b){if(0!==b)return"not_found";let c=a.toLowerCase();return/\bfailed\b|\bcrashed\b|\berror\b/.test(c)?"error":/\bsuccess\b|\bdeployed\b|\bready\b/.test(c)?"ready":/\bbuilding\b/.test(c)?"building":/\bdeploying\b|\binitializing\b|\bqueued\b/.test(c)?"deploying":"not_found"}(b.stdout,b.exitCode)}async getLogs(a){let b=await a.run("railway",["logs"],a.cwd);return[b.stdout,b.stderr].filter(Boolean).join("\n").trim()}constructor(){this.id="railway",this.label="Railway"}}function ae(a){return a?["list","--meta",`githubCommitSha=${a}`]:["list"]}class af{async detect(a){let b=ab(a);return b((0,ac.join)(a.cwd,"vercel.json"))||b((0,ac.join)(a.cwd,".vercel"))}async getStatus(a){let b=await a.run("vercel",ae(a.ref),a.cwd);return function(a,b){if(0!==b)return"not_found";let c=a.split("\n").map(a=>a.trim()).filter(Boolean).find(a=>/●|ready|error|building|queued|initializing/i.test(a.replace(/https?:\/\/\S+/g," ")));if(!c)return"not_found";let d=c.replace(/https?:\/\/\S+/g," ").toLowerCase();return/\berror\b|\bfailed\b|canceled/.test(d)?"error":/\bready\b/.test(d)?"ready":/\bbuilding\b/.test(d)?"building":/\bqueued\b|initializing|deploying/.test(d)?"deploying":"not_found"}(b.stdout,b.exitCode)}async getLogs(a){let b=null;if(a.ref){var c;let d=await a.run("vercel",ae(a.ref),a.cwd);0===d.exitCode&&(c=d.stdout,b=c.match(/https?:\/\/\S+/)?.[0]??null)}let d=b?["inspect","--logs",b]:["logs"],e=await a.run("vercel",d,a.cwd);return[e.stdout,e.stderr].filter(Boolean).join("\n").trim()}constructor(){this.id="vercel",this.label="Vercel"}}let ag=[new af,new ad];async function ah(a,b){if(b)return aa.includes(b)?function(a){let b=ag.find(b=>b.id===a);if(!b)throw Error(`unsupported deployment platform: ${a}`);return b}(b):null;for(let b of ag)if(await b.detect(a))return b;return null}var ai=c(64080);function aj(a,b){return{cwd:a.path,ref:b,run:M.Sx}}async function ak(a={}){let b=a.db??(0,h.Lf)(),c=a.now??Date.now,d=a.budgets??ai.ad;for(let e of(0,i.uP)(b))if((0,s.A)(e).autoHealDeployments)try{let f=a.forgeFor?.(e)??(0,k.Ie)(e),g=a.adapterFor??(a=>ah(aj(a,null),a.deploymentPlatform)),h=await g(e);if(!h)continue;let i=a.openFixPr??an;await al(e,f,h,{db:b,now:c,budgets:d,openFixPr:i})}catch(a){(0,r.v)(`[deploy-heal] sweep failed for ${e.name}`,a)}}async function al(a,b,c,d){let{db:e,now:f,budgets:g}=d,h=(0,C.N6)(a.id,e);for(let a of h){let d;if("merged"!==a.status||null==a.prNumber)continue;let h=(a.finishedAt??a.createdAt)*1e3;if(!(f()-h>g.monitorWindowMs)){try{d=await b.prMergeCommitSha?.(a.prNumber)??await b.prHeadSha(a.prNumber)}catch(b){(0,r.v)(`[deploy-heal] merged sha lookup failed for job ${a.id}`,b);continue}(0,ai.SR)(a.id,d,e)||(0,ai.eY)(a.id,a.prNumber,c.id,d,e)}}for(let b of e.select().from(j.deploymentHealingSessions).all().filter(a=>"monitoring"===a.status)){let e=h.find(a=>a.id===b.jobId);if(e)try{await am(a,e,c,b,d)}catch(c){(0,r.v)(`[deploy-heal] session ${b.id} failed for ${a.name}`,c)}}}async function am(a,b,c,d,e){let{db:f,now:g,budgets:h}=e,i=(0,ai.FL)({createdAt:1e3*d.createdAt,lastPolledAt:1e3*d.updatedAt,now:g(),initialDelayMs:h.initialDelayMs,intervalMs:h.intervalMs,timeoutMs:h.timeoutMs});if("wait"===i)return;if("timeout"===i)return void(0,ai.X)(d.id,"escalated",{},f);let j=aj(a,d.commitSha),k=(0,ai.eV)(await c.getStatus(j));if("ready"===k)return void(0,ai.X)(d.id,"healthy",{},f);if("pending"===k)return void(0,ai.LR)(d.id,f);let l=(await c.getLogs(j).catch(()=>"")).split("\n").slice(-h.maxLogLines).join("\n").trim(),m=(0,ai.X)(d.id,"failed",{logsExcerpt:l||null},f);(0,ai.X)(d.id,"repairing",{},f);try{let c=await e.openFixPr(a,b,m,l);(0,ai.X)(d.id,"repaired",{followupPrNumber:c},f)}catch(a){(0,r.v)(`[deploy-heal] fix PR failed for session ${d.id}`,a),(0,ai.X)(d.id,"escalated",{},f)}}async function an(a,b,c,d){let e=(0,h.Lf)(),f=(0,g.X$)(b.agent),i=(0,B.m)(f,e),j=new Z.ND,l=c.commitSha.slice(0,7),m=`drydock/deploy-fix-${b.id}-${l}`,n=(0,k.Ie)(a),o=await j.prepareForNewBranch(a,m,`${b.id}-${l}`);try{let g=await (0,$.V)(b,[`The deployment of the merged pull request #${c.prNumber} failed on`,`${c.platform} (commit ${c.commitSha.slice(0,7)}).`,"\nDeployment logs:\n```",d||"(no logs captured)","```\n\nDiagnose the deployment failure and make the minimal change that fixes it.\nEnsure the project builds and tests pass, then stop — the commit, push, and\npull request are handled for you."].join("\n"),o.path,{db:e,provider:f,command:i,sideSession:!0});if(0!==g.exitCode)throw Error(`${f.label} exited non-zero`);return await j.commitAndPush(o,`Fix failed ${c.platform} deployment for PR #${c.prNumber}`),n.createPr({head:m,base:a.defaultBranch,title:`Fix failed ${c.platform} deployment (PR #${c.prNumber})`,body:`The deployment for #${c.prNumber} (commit ${l}) failed. This PR addresses the deployment failure.`})}finally{try{await j.remove(o,a.path)}catch(a){(0,r.v)(`[deploy-heal] worktree cleanup failed for job ${b.id}`,a)}}}var ao=c(7611),ap=c(9617),aq=c(76373),ar=c(8804),as=c(51455),at=c(48161),au=c(29980),av=c(59144);let aw=au.Ik({release:au.zM(),bump:au.k5(["patch","minor","major"]),title:au.Yj().default(""),notes:au.Yj().default("")});var ax=c(98887);async function ay(a){if("http"===a.provider.kind){let{runOpenRouterOneShot:b}=await c.e(528).then(c.bind(c,59528));return b({model:a.model,prompt:a.prompt,repoId:a.repoId,type:a.type,timeoutMs:a.timeoutMs,db:a.db,fetchImpl:a.fetchImpl})}let b=a.runner??M.Sx,d=a.db??(0,h.Lf)(),e=void 0!==a.timeoutMs?{timeoutMs:a.timeoutMs}:void 0,f=a.provider.buildStreamOneShotArgs({prompt:a.prompt,model:a.model});if(null===f){let c=a.provider.buildOneShotArgs({prompt:a.prompt,model:a.model}),d=e?await b(a.command,c,a.cwd,e):await b(a.command,c,a.cwd);return{text:d.stdout,exitCode:d.exitCode,costUsd:0,stderr:d.stderr}}let g=e?await b(a.command,f,a.cwd,e):await b(a.command,f,a.cwd),i=new ax.KO,k=[...i.push(g.stdout),...i.flush()],l=[];for(let a of k)for(let b of a.chunks)"text"===b.kind&&l.push(b.text);let m=l.join(""),n=i.costUsd>0?i.costUsd:0;return n>0&&void 0!==a.repoId&&d.insert(j.oneShotCosts).values({repoId:a.repoId,type:a.type,costUsd:n,inputTokens:i.totalInputTokens,outputTokens:i.totalOutputTokens}).run(),{text:m,exitCode:g.exitCode,costUsd:n,stderr:g.stderr}}async function az(a){var b;let c,d=await a.listReleases(),e=function(a){let b=null;for(let c of a)(0,av.kf)(c)&&(null===b||(0,av.mU)(c,b)>0)&&(b=c);return b}(d.map(a=>a.tagName)),f=e?d.find(a=>a.tagName===e)?.createdAt??null:null;return{fromTag:e,releases:d,prs:(b=(await a.listMergedPrs(100)).map(a=>({number:a.number,title:a.title,labels:a.labels,mergedAt:a.mergedAt})),c=null===f?null:Date.parse(f),b.filter(a=>{let b=Date.parse(a.mergedAt);return!Number.isNaN(b)&&(null===c||b>c)}).sort((a,b)=>a.number-b.number))}}async function aA(a,b){let c=b.db??(0,h.Lf)(),d=(0,ar.tm)(a,c);if(!d)throw Error(`release run ${a} not found`);let e=d.mode;(0,ar.Cq)(a,"evaluating",{},c);try{var f;let{fromTag:g,releases:h,prs:i}=await az(b.forge);if("manual"===e&&0===i.length&&!d.tag)return(0,ar.Cq)(a,"skipped",{fromTag:g},c);let j=await b.generate({fromTag:g,prs:i});if("auto"===e&&!j)return(0,ar.Cq)(a,"error",{errorMessage:"release evaluation failed"},c);if("auto"===e&&j&&!j.release)return(0,ar.Cq)(a,"skipped",{fromTag:g},c);let k=function(a,b,c){let d="manual"===a?"patch":b?.bump??"patch",e=b?.title?.trim()??"";return{bump:d,title:e,notes:b?.notes?.trim()||(0===c.length?"No changes since the last release.":c.map(a=>`- #${a.number} ${a.title}`).join("\n"))}}(e,j,i),l=d.tag??(f=k.bump,`v${(0,av.rr)(g??"0.0.0",f)}`);if((0,ar.Cq)(a,"proposed",{bump:k.bump,fromTag:g,tag:l,title:k.title||l,notes:k.notes,prNumbers:i.map(a=>a.number)},c),h.some(a=>a.tagName===l))return(0,ar.Cq)(a,"publishing",{},c),(0,ar.Cq)(a,"published",{},c);return(0,ar.Cq)(a,"publishing",{},c),await b.forge.createRelease({tag:l,title:k.title||l,notes:k.notes,target:b.repo.defaultBranch}),(0,ar.Cq)(a,"published",{},c)}catch(f){let b=f instanceof Error?f.message:String(f),d=(0,ar.tm)(a,c),e=d?.status??"evaluating";if("evaluating"===e||"proposed"===e||"publishing"===e)return(0,ar.Cq)(a,"error",{errorMessage:b.slice(0,500)},c);return(0,ar.tm)(a,c)}}async function aB(a,b){let c=await (0,as.mkdtemp)((0,ac.join)((0,at.tmpdir)(),"drydock-release-"));try{var d;let e,f=(e=(d={provider:a.provider,command:a.command,model:a.model,cwd:c,runner:a.runner}).timeoutMs??18e4,async a=>{try{let b,c,f,{text:g,exitCode:h}=await ay({provider:d.provider,command:d.command,model:d.model,cwd:d.cwd,prompt:(c=(b=a.prs.slice(0,200)).length>0?b.map(a=>{let b=a.labels.length>0?` [${a.labels.join(", ")}]`:"";return`- #${a.number} ${a.title}${b}`}).join("\n"):"(no merged pull requests)",["You are deciding whether to cut a new software release. Given the most\nrecent release and the pull requests merged since then, decide whether a\nrelease is warranted, which semantic-version bump it should be, and write\nconcise Markdown release notes.\n",a.fromTag?`The most recent release is ${a.fromTag}.`:"There is no prior release (this would be the first).","\n## Pull requests merged since the last release\n",c,'\n## How to choose the bump\n\n- "major": incompatible / breaking changes.\n- "minor": new, backwards-compatible features.\n- "patch": backwards-compatible bug fixes or internal-only changes.\n\n## Response format\n\nRespond with ONLY a JSON object (no prose, no code fences) of the shape:\n\n{"release": <true|false>, "bump": "patch"|"minor"|"major",\n "title": "<short release title>", "notes": "<Markdown release notes>"}\n\nSet "release" to false when the changes do not warrant a release yet (e.g.\nonly docs/CI tweaks). When false, the other fields are ignored.'].join("\n")),repoId:d.repoId,type:"release",timeoutMs:e,runner:d.runner,db:d.db});if(0!==h)return null;let i=g.match(/\{[\s\S]*\}/);if(!i)return null;try{f=JSON.parse(i[0])}catch{return null}let j=aw.safeParse(f);return j.success?j.data:null}catch{return null}});return await b(f)}finally{try{await (0,as.rm)(c,{recursive:!0,force:!0})}catch{}}}async function aC(a={}){let b=a.db??(0,h.Lf)();if(!(0,A.mt)(b).releaseManagementEnabled)return;let c=a.now??Date.now,d=a.windowMs??36e5,e=a.notify??((a,c)=>(0,aq.JD)(a,c,b));for(let f of(0,i.uP)(b))if((0,s.A)(f).releaseEnabled)try{let h=a.forgeFor?.(f)??(0,k.Ie)(f),i="function"==typeof h.listReleases&&"function"==typeof h.listMergedPrs&&"function"==typeof h.createRelease?h:null;if(!i)continue;let j=a.generatorFor?.(f)??function(a,b){let c=(0,g.X$)(a.agent),d=(0,B.m)(c,b),e=a.defaultModel;return a=>aB({provider:c,command:d,model:e},b=>b(a))}(f,b);await aD(f,h,i,j,{db:b,now:c,windowMs:d,notify:e})}catch(a){(0,r.v)(`[release] sweep failed for ${f.name}`,a)}}async function aD(a,b,c,d,e){let{db:f,now:g,windowMs:h}=e;for(let i of(0,C.N6)(a.id,f)){if("merged"!==i.status||null==i.prNumber)continue;let f=(i.finishedAt??i.createdAt)*1e3;if(!(g()-f>h))try{await aE(a,i,b,c,d,e)}catch(b){(0,r.v)(`[release] job ${i.id} failed for ${a.name}`,b)}}}async function aE(a,b,c,d,e,f){let{db:g,notify:h}=f,i=b.prNumber,j=(0,ar.$J)(a.id,i,g);if(j&&"detected"!==j.status)return;let k=await c.prHeadSha(i),l=(0,ar.v0)({repoId:a.id,mode:"auto",triggerPrNumber:i,triggerSha:k},g);if("detected"!==l.status)return;let m=await aA(l.id,{repo:a,forge:d,db:g,generate:e});"published"===m.status&&m.tag&&await h("release_published",`🚀 Released ${a.name} ${m.tag}.`)}var aF=c(62907),aG=c(48036),aH=c(14694);let aI={pending:["in_progress","skipped","deferred"],in_progress:["done","skipped","deferred"],deferred:["pending","in_progress","skipped"],done:[],skipped:[]};class aJ extends Error{constructor(a,b){super(`invalid subtask transition: ${a} -> ${b}`)}}let aK=/^\s*[-*]\s*\[[ xX]\]\s+(.+?)\s*$/,aL=/^\s*#*\s*(Bug\s+\d+\s*(?:[—:-])\s*.+?)\s*$/;async function aM(a,b={}){let c=function(a){let b=function(a){let b=[];for(let c of a.split("\n")){let a=c.match(aK);a?.[1]&&b.push(a[1].trim())}return b}(a);if(b.length>=2)return b;let c=function(a){let b=[];for(let c of a.split("\n")){let a=c.match(aL);a?.[1]&&b.push(a[1].trim())}return b}(a);return c.length>=2?c:[]}(a.body);if(c.length>=2)return{titles:c,source:"heuristic"};if(b.generate)try{let c=(await b.generate(a)).map(a=>a.trim()).filter(Boolean);if(c.length>=2)return{titles:c,source:"agent"}}catch(b){if(b instanceof ao.vu)throw b;(0,r.v)(`[decompose] agent fallback failed for issue #${a.number}`,b)}return{titles:[],source:"none"}}function aN(a){return a.map((a,b)=>{let{box:c,suffix:d}=function(a){switch(a){case"done":return{box:"[x]",suffix:""};case"skipped":return{box:"[~]",suffix:" — skipped"};case"in_progress":return{box:"[ ]",suffix:" — in progress"};case"deferred":return{box:"[ ]",suffix:" — deferred"};default:return{box:"[ ]",suffix:""}}}(a.status);return`${b+1}. ${c} ${a.title}${d}`}).join("\n")}function aO(a,b,c=(0,h.Lf)()){return c.select().from(j.issueSubtasks).where((0,f.Uo)((0,f.eq)(j.issueSubtasks.repoId,a),(0,f.eq)(j.issueSubtasks.issueNumber,b))).orderBy((0,aH.Y)(j.issueSubtasks.ordinal)).all()}function aP(a,b,c=(0,h.Lf)()){let d=c.select().from(j.issueSubtasks).where((0,f.eq)(j.issueSubtasks.id,a)).get();if(!d)throw Error(`subtask ${a} not found`);var e=d.status;if(!aI[e].includes(b))throw new aJ(e,b);return c.update(j.issueSubtasks).set({status:b}).where((0,f.eq)(j.issueSubtasks.id,a)).returning().get()}async function aQ(a,b,c=(0,h.Lf)(),d={}){var e,g,i,k;let l=function(a){let b=5381;for(let c=0;c<a.length;c++)b=(b<<5)+b+a.charCodeAt(c)|0;return(b>>>0).toString(16)}(b.body);if(e=a.id,g=b.number,c.select({h:j.issues.decomposedHash}).from(j.issues).where((0,f.Uo)((0,f.eq)(j.issues.repoId,e),(0,f.eq)(j.issues.number,g))).get()?.h===l)return{subtasks:aO(a.id,b.number,c),source:"none",skipped:!0};let{titles:m,source:n}=await aM(b,{generate:d.generate}),o=function(a,b,c,d,e=(0,h.Lf)()){return e.transaction(e=>(e.delete(j.issueSubtasks).where((0,f.Uo)((0,f.eq)(j.issueSubtasks.repoId,a),(0,f.eq)(j.issueSubtasks.issueNumber,b))).run(),c.forEach((c,f)=>{e.insert(j.issueSubtasks).values({repoId:a,issueNumber:b,ordinal:f,title:c,bodyHash:d}).run()}),e.select().from(j.issueSubtasks).where((0,f.Uo)((0,f.eq)(j.issueSubtasks.repoId,a),(0,f.eq)(j.issueSubtasks.issueNumber,b))).orderBy((0,aH.Y)(j.issueSubtasks.ordinal)).all()))}(a.id,b.number,m,l,c);return i=a.id,k=b.number,c.update(j.issues).set({decomposedHash:l}).where((0,f.Uo)((0,f.eq)(j.issues.repoId,i),(0,f.eq)(j.issues.number,k))).run(),{subtasks:o,source:n,skipped:!1}}var aR=c(26287),aS=c(29668);function aT(a){return a?.trim()||null}async function aU(a={}){let b=a.runner??M.Sx,c=a.preferred??"auto",d="auto"===c?["docker","podman"]:[c];for(let a of d)try{let{exitCode:c}=await b(a,["--version"]);if(0===c)return{runtime:a}}catch{}let e=d.join(" / ");return{runtime:null,message:`No usable container runtime found (tried ${e}). Install Docker or Podman, or disable sandboxed execution for this repo.`}}var aV=c(94534);function aW(a){try{return(0,_.readFileSync)(a,"utf8")}catch{return null}}async function aX(a){var b;let c,d,e=a.deps??{},f=e.detect??(a=>aU({preferred:a})),g=await f(a.preferredRuntime);if(null===g.runtime)return{ok:!1,reason:g.message};let h=function(a,b,c){if(a.imageOverride)return a.imageOverride;let d=function(a,b){for(let c of[(0,ac.join)(a,".devcontainer","devcontainer.json"),(0,ac.join)(a,".devcontainer.json")]){let a=b.readFileText(c);if(null!=a)try{let b=JSON.parse(a.replace(/\/\*[\s\S]*?\*\//g,"").replace(/(^|[^:])\/\/.*$/gm,"$1").replace(/,\s*([}\]])/g,"$1"));if("string"==typeof b.image&&b.image.trim())return b.image.trim()}catch{}}return null}(b,c);return d||aT(a.defaultImage)}(a.config,a.worktreePath,{readFileText:e.readFileText??aW});if(!h)return{ok:!1,reason:"Sandboxed execution is enabled but no container image could be resolved. Set a per-repo sandbox image, add a devcontainer.json, or set a global default image in settings."};let i=(c=(function(a,b){switch(a){case"codex":return[{host:(0,ac.join)(b,".codex"),container:"/root/.codex"}];case"openrouter":return[];default:return[{host:(0,ac.join)(b,".claude"),container:"/root/.claude"},{host:(0,ac.join)(b,".claude.json"),container:"/root/.claude.json"}]}})((b={agent:a.agent,home:e.home??(0,at.homedir)(),env:e.env??process.env,exists:e.exists??_.existsSync}).agent,b.home).filter(a=>b.exists(a.host)),d=[],b.env.GH_TOKEN?.trim()?d.push("GH_TOKEN"):b.env.GITHUB_TOKEN?.trim()&&d.push("GITHUB_TOKEN"),{mounts:c,env:d});return{ok:!0,session:{runner:function(a,b={}){let c=b.baseRunner??aV.g,d=b.cleanup??M.Sx;return(b,e,f,g)=>{let h=function(a,b,c){let d=["run","--rm","--init","--name",a.containerName,"-v",`${a.hostPath}:${a.workdir}`,"-w",a.workdir];for(let b of(a.allowNetwork||d.push("--network","none"),a.cpus&&d.push("--cpus",a.cpus),a.memory&&d.push("--memory",a.memory),a.mounts))d.push("-v",`${b.host}:${b.container}:ro`);for(let b of a.env)d.push("-e",b);return d.push(a.image,b,...c),{cmd:a.runtime,args:d}}(a,b,e),i=c(h.cmd,h.args,f,g);return{done:i.done,get spawnError(){return i.spawnError},abort:b=>{i.abort(b);try{d(a.runtime,["rm","-f",a.containerName]).catch(b=>(0,r.v)(`[sandbox] failed to remove container ${a.containerName}`,b))}catch(b){(0,r.v)(`[sandbox] failed to remove container ${a.containerName}`,b)}}}}}({runtime:g.runtime,image:h,workdir:"/workspace",hostPath:a.worktreePath,containerName:`drydock-job-${a.jobId}`,allowNetwork:a.config.allowNetwork,cpus:a.config.cpus,memory:a.config.memory,mounts:i.mounts,env:i.env},{baseRunner:e.baseRunner,cleanup:e.cleanup}),command:a.inContainerCommand}}}let aY=["usage_limit","rate_limit","overloaded"],aZ=new Set(["CANCELLED","ACTION_REQUIRED"]),a$=new Set(["TIMED_OUT"]),a_=/\b(ai|claude|codex|copilot|gpt|llm)\b.*\breview\b|\breview\b.*\b(ai|bot)\b/i,a0=/\bcancell?ed\b|\bsecret\b|\b(rate.?limit|secondary rate)\b|\b5\d\d\b|\b(401|403|unauthorized|forbidden)\b|service unavailable/i,a1=/\b(time(d)?.?out|timeout|intermittent|flak(y|e)|econnreset|etimedout|esockettimedout)\b/i,a2=/\b(typecheck|tsc|type error|ts\d{3,5}|lint|biome|eslint|prettier|test|tests|spec|vitest|jest|pytest|assert(ion)?|build|compile|compilation|codegen|generated|snapshot|out of date|outdated)\b/i,a3=[{kind:"type",re:/\berror TS\d{2,5}\b|\bTS\d{2,5}:|\bType error:|is not assignable to/i},{kind:"dependency",re:/\bnpm ERR!|\bERR_PNPM|\bERESOLVE\b|unmet peer|peer dep|frozen lockfile|out of date lockfile|cannot find module '/i},{kind:"lint",re:/\bbiome\b|\beslint\b|\bprettier\b|\blint\/[a-z]|@typescript-eslint\/|formatter would have/i},{kind:"test",re:/\bFAIL\b|✕|✗|✖|●|\bAssertionError\b|expect\(|Expected:|Received:|\bTests?:\s|\d+ failed/i},{kind:"build",re:/failed to compile|module not found|compilation (failed|error)|\bcompile error\b|cannot compile/i},{kind:"timeout",re:/\btimed out\b|\btimeout\b|exceeded \d+\s?ms/i},{kind:"flaky",re:/\bECONNRESET\b|\bETIMEDOUT\b|\bESOCKETTIMEDOUT\b|intermittent|\bflak(y|e)\b/i}];function a4(a,b){if(0===a.length)return{kind:"unknown",evidence:""};let c=a.split("\n"),d=function(a){for(let{kind:b,re:c}of a3)if(c.test(a))return b;return"unknown"}(a);if("unknown"===d)return{kind:d,evidence:c.slice(-b).join("\n")};let e=a3.find(a=>a.kind===d),f=e?c.findIndex(a=>e.re.test(a)):-1;if(f<0)return{kind:d,evidence:c.slice(-b).join("\n")};let g=Math.max(0,f-3);return{kind:d,evidence:c.slice(g,g+b).join("\n")}}let a5={test:"A test is failing. Identify the failing test(s) from the evidence and fix the underlying code so they pass. Do not delete or skip tests, and do not weaken assertions to go green.",type:"A type error is failing the check. Fix the reported type error(s) properly — correct the types; do not silence them with `any` or `@ts-ignore`.",lint:"A lint/format check is failing. Fix the reported rule violations. Prefer the autofix (e.g. `npx biome check --write`) and resolve anything it cannot fix by hand.",build:"The build/compile step failed. Fix the compilation error(s) shown below (e.g. a broken import or unresolved module).",dependency:"A dependency step failed. Resolve the dependency problem below — a missing or incompatible package, or an out-of-date lockfile. Update package.json and the lockfile together.",timeout:"A check timed out. If a change in this branch introduced a hang or a slow path, fix it; otherwise make the affected code complete within the time budget.",flaky:"A check failed on what looks like an intermittent/network error. If the branch made the code fragile to this, harden it; otherwise the failure may not be code-related.",unknown:"A CI check is failing. Diagnose the failure from the evidence below and fix it."};var a6=c(34666);let a7=new Set(["FAILURE","ERROR","CANCELLED","TIMED_OUT","ACTION_REQUIRED"]),a8=new Set(["PENDING","QUEUED","IN_PROGRESS","WAITING","REQUESTED"]);function a9(a){return 0===a.length?"none":a.some(a=>a7.has(a.state.toUpperCase()))?"failed":a.some(a=>a8.has(a.state.toUpperCase()))?"pending":"passed"}function ba(a){return a.timedOut?"CI-fix session timed out":a.costExceeded?"per-job cost limit reached during the CI fix":a.spawnError?`CI-fix session failed to start: ${a.spawnError.message}`:0!==a.exitCode?"CI-fix session exited non-zero":a.settledExternally?"job was settled externally during the CI fix":a.noChanges?"CI-fix session produced no changes":null}function bb(a,b){return()=>!!(0,ao.nc)(a.agent,b)}function bc(a,b,c,d){let e=c.limit;if(!e)return null;if("auth"===e.kind||"billing"===e.kind){let c="auth"===e.kind?"authentication":"billing",f=`CI fix blocked by a provider ${c} error: ${e.rawSnippet}`.slice(0,500);return(0,C.yM)(a.id,"status",{reason:f,prNumber:b},d),{job:(0,C.dk)(a.id,"needs_human",{errorMessage:f},d),done:!0}}return aY.includes(e.kind)&&(0,ao.$q)(e.agent,d)?(e.latched||(0,ao.H_)(e,d),(0,C.yM)(a.id,"status",{reason:`${e.agent}_${e.kind} during CI fix`,prNumber:b},d),{job:(0,C.dk)(a.id,"ci_running",{ciRetryCount:Math.max(0,a.ciRetryCount-1)},d),done:!1}):null}function bd(a,b){let c;return{start:()=>!(a<=0)&&void 0===c&&(c=b(),!0),open:()=>a>0&&void 0!==c&&b()-c<a,reset(){c=void 0}}}let be=a=>new Promise(b=>setTimeout(b,a)),bf=new Set(["ci_running","ci_failed","retrying"]);function bg(a,b){let c=(0,C.ax)(a,b);if(!(!c||bf.has(c.status)))return c}async function bh(a,b,c,d,e){await d.gh.commentIssue(a.issueNumber,`${c} Handing over to a human.`);let f=await d.gh.createIssue(`Follow-up: CI keeps failing for issue #${a.issueNumber}`,`Job ${a.id} could not be auto-healed on PR #${b}. ${c}`);return e.insert(j.followupIssues).values({jobId:a.id,ghIssueNumber:f,title:`Follow-up for #${a.issueNumber}`}).run(),(0,C.dk)(a.id,"needs_human",{errorMessage:c.slice(0,500)},e)}async function bi(a,b,c,d,e,f="checks stayed pending"){let g=Math.round(c/6e4),h=`CI did not complete in time (${f} for over ${g} min on PR #${b}).`;return await d.gh.commentIssue(a.issueNumber,`${h} Handing over to a human.`),(0,C.yM)(a.id,"status",{reason:"ci wait budget exceeded",prNumber:b},e),(0,C.dk)(a.id,"needs_human",{errorMessage:h.slice(0,500)},e)}async function bj(a,b,c){if(c.autoHeal)return bk(a,b,c,c.autoHeal);let d=c.db??(0,h.Lf)(),e=c.sleep??be,f=c.pollMs??3e4,g=c.maxPolls??1/0,i=c.ciWaitMs??1/0,j=c.now??Date.now,k=j()+i,l=bd(c.mergeGateMs??0,j),m=bd(Math.max(c.mergeGateMs??0,f),j),n=c.limitBlocked??bb(a,d),o=!1,p=a,q=0;for(;q<g;){q++;let a=bg(p.id,d);if(a)return a;let g=a9(await c.gh.prChecks(b));if("pending"===g){if(l.reset(),m.reset(),j()>=k)return bi(p,b,i,c,d);await e(f);continue}if("none"===g&&!c.mergeWithoutChecks){if(l.reset(),m.reset(),j()>=k)return bi(p,b,i,c,d,"no CI checks were reported");await e(f);continue}if("none"===g){if(l.reset(),m.start()&&(0,C.yM)(p.id,"status",{reason:"no CI checks reported; settling before an unverified merge",prNumber:b},d),m.open()){if(j()>=k)return bi(p,b,i,c,d,"no CI checks were reported");await e(f);continue}let a=bg(p.id,d);if(a)return a;return(0,C.yM)(p.id,"status",{reason:"merging without CI verification (no checks reported)",prNumber:b},d),await c.gh.mergePr(b),(0,C.dk)(p.id,"merged",{prNumber:b},d)}if("passed"===g){if(m.reset(),l.start()&&(0,C.yM)(p.id,"status",{reason:"merge gate: CI green, waiting for late reviews",prNumber:b},d),l.open()){await e(f);continue}let a=bg(p.id,d);if(a)return a;return await c.gh.mergePr(b),(0,C.dk)(p.id,"merged",{prNumber:b},d)}if(l.reset(),m.reset(),n()){if(j()>=k)return bi(p,b,i,c,d,"the provider usage limit blocked the CI fix");o||((0,C.yM)(p.id,"status",{reason:"ci fix deferred: provider limit latched",prNumber:b},d),o=!0),await e(f);continue}if(o=!1,(p=(0,C.dk)(p.id,"ci_failed",{prNumber:b},d)).ciRetryCount>=3)return bh(p,b,"CI failed 3 times.",c,d);if(!p.sessionId)return(0,C.yM)(p.id,"status",{reason:"missing session id, cannot resume for CI fix"},d),(0,C.dk)(p.id,"needs_human",{errorMessage:"CI failed but no session id to resume"},d);let h=p.sessionId;p=(0,C.dk)(p.id,"retrying",{ciRetryCount:p.ciRetryCount+1},d);let{evidence:r}=a4(await c.gh.failedRunLog(b),200),s=await c.resumeSession(p,h,r),t=bc(p,b,s,d);if(t){if(p=t.job,t.done)return p;continue}let u=ba(s);if(u)return(0,C.yM)(p.id,"status",{reason:u,prNumber:b},d),(0,C.dk)(p.id,"needs_human",{errorMessage:u},d);(0,ao._x)(p.agent,d),p=(0,C.dk)(p.id,"ci_running",{},d)}return(0,C.ax)(p.id,d)??p}async function bk(a,b,c,d){let e,f=c.db??(0,h.Lf)(),g=c.sleep??be,i=c.pollMs??3e4,j=c.maxPolls??1/0,k=d.budgets??a6.op,l=c.now??d.now??Date.now,m=c.ciWaitMs??1/0,n=l()+m,o=bd(c.mergeGateMs??0,l),p=bd(Math.max(c.mergeGateMs??0,i),l),q=c.limitBlocked??bb(a,f),r=a,s=0;for(;s<j;){s++;let a=bg(r.id,f);if(a)return e&&(0,a6.rh)(e.sessionId,"superseded",f),a;let h=await c.gh.prChecks(b),j=a9(h);if("pending"===j){if(o.reset(),p.reset(),l()>=n)return e&&(0,a6.rh)(e.sessionId,"escalated",f),bi(r,b,m,c,f);await g(i);continue}if("none"===j&&!c.mergeWithoutChecks){if(o.reset(),p.reset(),l()>=n)return e&&(0,a6.rh)(e.sessionId,"escalated",f),bi(r,b,m,c,f,"no CI checks were reported");await g(i);continue}if("none"===j){if(o.reset(),p.start()&&(0,C.yM)(r.id,"status",{reason:"no CI checks reported; settling before an unverified merge",prNumber:b},f),p.open()){if(l()>=n)return e&&(0,a6.rh)(e.sessionId,"escalated",f),bi(r,b,m,c,f,"no CI checks were reported");await g(i);continue}let a=bg(r.id,f);if(a)return e&&(0,a6.rh)(e.sessionId,"superseded",f),a;return e&&(0,a6.rh)(e.sessionId,"superseded",f),(0,C.yM)(r.id,"status",{reason:"merging without CI verification (no checks reported)",prNumber:b},f),await c.gh.mergePr(b),(0,C.dk)(r.id,"merged",{prNumber:b},f)}if("passed"===j){if(p.reset(),o.start()&&(0,C.yM)(r.id,"status",{reason:"merge gate: CI green, waiting for late reviews",prNumber:b},f),o.open()){await g(i);continue}let a=bg(r.id,f);if(a)return e&&(0,a6.rh)(e.sessionId,"superseded",f),a;if(e){let a=await d.headSha(b);(0,a6.Az)(e.attemptId,{status:"healed",afterSha:a},f),(0,a6.Yv)(e.sessionId,"verifying",f),(0,a6.Yv)(e.sessionId,"healed",f)}return await c.gh.mergePr(b),(0,C.dk)(r.id,"merged",{prNumber:b},f)}o.reset(),p.reset();let t=h.filter(a=>a7.has(a.state.toUpperCase())),u=await d.headSha(b);if(e){let a="rerun"===e.kind?(0,a6.sk)({beforeFailingCount:e.beforeFailing,afterFailingCount:t.length}):(0,a6.I0)({beforeSha:e.beforeSha,afterSha:u,beforeFailingCount:e.beforeFailing,afterFailingCount:t.length});(0,a6.Az)(e.attemptId,{status:a.verdict,afterSha:u},f);let d=e.sessionId;if(e=void 0,"rejected"===a.verdict)return(0,a6.Yv)(d,"verifying",f),(0,a6.Yv)(d,"escalated",f),bh(r,b,`CI auto-heal: ${a.reason}.`,c,f);(0,a6.Yv)(d,"verifying",f),(0,a6.Yv)(d,"cooldown",f)}if(q()){if(l()>=n)return bi(r,b,m,c,f,"the provider usage limit blocked auto-heal");await g(i);continue}let v=(0,a6.dT)(r.id,b,u,f),w=await c.gh.failedRunLog(b),x=t.map(a=>(function(a,b,c=""){var d,e;let f,g,h=(d=b.name,e=b.state??"",f=e.toUpperCase(),g=`${d}
|
|
6
|
-
${c}`,
|
|
7
|
-
…
|
|
8
|
-
… (
|
|
5
|
+
${a.body}`,e=[];for(let{label:a,re:b}of t)c.has(a)&&b.test(d)&&!e.includes(a)&&e.push(a);return e}(k,e.autoLabelWhitelist);for(let a of n)m.push(`classified as ${a}`);if("approved"===l.decision){let a=e.readyLabels[0];a&&(n.push(a),m.push("safe and well-specified"))}else{let a=e.blockingLabels[0];a&&(n.push(a),m.push(...l.reasons.length?l.reasons:["flagged for human review"]))}let o=new Set([...e.autoLabelWhitelist,...e.readyLabels,...e.blockingLabels]),r=new Set(k.labels),w=[...new Set(n)].filter(a=>o.has(a)&&!r.has(a));if(w.length>0){for(let a of w)await b.ensureLabel(a);await b.addLabels(c.number,w);let e=w.map(a=>`\`${a}\``).join(", ");await b.commentIssue(c.number,`auto-triage: applied ${e} — reasons: ${m.join("; ")}.`),(0,q.sp)(a.id,c.number,w,[],d)}return u(a.id,c.number,g,d),{number:c.number,applied:w,reasons:m}}async function w(a,b,c,d=(0,h.Lf)()){let e=[];for(let f of c)try{e.push(await v(a,b,f,d))}catch(b){(0,r.v)(`[triage] issue #${f.number} failed for ${a.name}`,b)}return e}var x=c(52819),y=c(74340),z=c(44769),A=c(74644),B=c(41947),C=c(2412);let D={color:"d73a4a",description:"Drydock parked this issue; needs a human"};function E(a){return`<!-- drydock:needs-human:${a} -->`}async function F(a,b,c,d=(0,h.Lf)()){try{await c.ensureLabel(a.needsHumanLabel,D)}catch(a){(0,r.v)(`[needs-human] failed to ensure needs-human label on #${b}`,a)}try{await c.addLabels(b,[a.needsHumanLabel])}catch(a){(0,r.v)(`[needs-human] failed to add needs-human label on #${b}`,a)}try{await c.removeLabels(b,[a.queueLabel]),(0,q.nc)(a.id,b,a.queueLabel,!1,d)}catch(a){(0,r.v)(`[needs-human] failed to drop queue label on #${b}`,a)}}async function G(a,b,c,d){let e,f=E(c),g=(e=d.trim()||"review required",[E(c),`⚠️ **Drydock needs a human.** Job \`#${c}\` was parked and removed from the queue.`,"",`**Reason:** ${e}`,"\nFind it under **Needs human** in your Drydock dashboard, then requeue it once the blocker is cleared."].join("\n"));if(a.listIssueComments&&a.updateIssueComment)try{let c=(await a.listIssueComments(b)).find(a=>a.body.includes(f));if(c)return void await a.updateIssueComment(b,c.id,g)}catch(a){(0,r.v)(`[needs-human] comment upsert degraded to a fresh post on #${b}`,a)}await a.commentIssue(b,g)}async function H(a,b={}){let c=b.db??(0,h.Lf)(),d=(0,i.L8)(a.repoId,c);if(!d)return void(0,r.v)(`[needs-human] repo ${a.repoId} not found for job ${a.id}; skipping announce`);let e=b.forge??(0,k.Ie)(d);await F(d,a.issueNumber,e,c);try{await G(e,a.issueNumber,a.id,a.errorMessage??"")}catch(b){(0,r.v)(`[needs-human] failed to comment on #${a.issueNumber}`,b)}}var I=c(52479);let J="janitor",K=new Set(["ci_running","ci_failed","retrying"]);function L(a){return a?.startsWith("drydock/")??!1}async function M(a,b,c,d){if("function"!=typeof c.deleteBranch)return;let e=function(a,b){let c=b.select({jobId:j.jobEvents.jobId,payload:j.jobEvents.payload}).from(j.jobEvents).innerJoin(j.jobs,(0,f.eq)(j.jobEvents.jobId,j.jobs.id)).where((0,f.Uo)((0,f.eq)(j.jobEvents.type,J),(0,f.eq)(j.jobs.repoId,a))).all(),d=new Set;for(let a of c)try{"branch_deleted"===JSON.parse(a.payload??"{}").action&&d.add(a.jobId)}catch{}return d}(a,d),g=new Set(b.filter(a=>!["merged","released","aborted"].includes(a.status)).map(a=>a.branch).filter(L));for(let a of b.filter(a=>"merged"===a.status&&null!==a.prNumber&&L(a.branch)&&!e.has(a.id)&&!g.has(a.branch))){let b=a.branch;try{await c.deleteBranch(b),(0,C.yM)(a.id,J,{action:"branch_deleted",branch:b},d)}catch(c){(0,r.v)(`[janitor] branch delete failed for job ${a.id} (${b})`,c)}}}async function N(a,b,c,d){if("function"==typeof c.prMergeState)for(let e of b.filter(a=>K.has(a.status)&&null!==a.prNumber&&L(a.branch))){let b=e.prNumber;try{let f=await c.prMergeState(b);"behind"===f&&"function"==typeof c.updatePrBranch?(await c.updatePrBranch(b),(0,C.yM)(e.id,J,{action:"branch_updated",prNumber:b},d)):"conflicted"===f&&await O(a,e,b,c,d)}catch(a){(0,r.v)(`[janitor] PR refresh failed for job ${e.id} (PR #${b})`,a)}}}async function O(a,b,c,d,e){let f=`rebase needed: conflicts with ${a.defaultBranch}`;try{await d.commentIssue(b.issueNumber,`⚠️ PR #${c} conflicts with \`${a.defaultBranch}\` — a rebase is needed. Parking job #${b.id} for a human.`)}catch(a){(0,r.v)(`[janitor] conflict comment failed for job ${b.id}`,a)}try{let g=(0,C.ax)(b.id,e);if(!g||!K.has(g.status))return;(0,C.yM)(b.id,"status",{reason:"merge_conflict",prNumber:c},e),(0,C.dk)(b.id,"needs_human",{errorMessage:f},e),await F(a,b.issueNumber,d,e)}catch(a){if(!(a instanceof I.xh))throw a}}async function P(a={}){let b=a.db??(0,h.Lf)();for(let c of(0,i.uP)(b))try{let d=a.forgeFor?.(c)??(0,k.Ie)(c),e=(0,C.N6)(c.id,b);await M(c.id,e,d,b),await N(c,e,d,b)}catch(a){(0,r.v)(`[janitor] sweep failed for ${c.name}`,a)}}var Q=c(61408),R=c(77597);async function S(a,b={}){let c=b.command??a.defaultCommand,d=b.runner??R.Sx;try{let{stdout:b,exitCode:e}=await d(c,["--version"]);if(0===e)return{agent:a.id,installed:!0,version:b.trim()};return{agent:a.id,installed:!1,message:`${a.label} CLI '${c}' exited ${e} on --version. Check the installation or the CLI path in settings.`}}catch{return{agent:a.id,installed:!1,message:`${a.label} CLI '${c}' not found. Install it or set the correct CLI path in settings.`}}}var T=c(87105),U=c(25480),V=c(14543),W=c(93612);let X={kind:"ok"},Y={kind:"unknown"};function Z(a,b,c){return{kind:"failed",failure:{target:a,label:b,message:c}}}function $(a){return(0,V.f)(a.trim()).slice(0,200)}async function _(a){let b=a.db??(0,h.Lf)(),c={runner:a.runner??R.Sx,http:a.http??T.D,fetchImpl:a.fetchImpl??fetch,governor:a.governor??m.og,now:a.now??Date.now,probeTimeoutMs:a.probeTimeoutMs??3e4},d=(0,A.mt)(b),e=function(a,b,c,d){let e=[];a.some(a=>"gitlab"!==a.platform)&&e.push({id:"github",probe:async()=>{if(!d.governor.decide("core","low").allowed)return Y;try{let a=await d.runner(b.ghPath,["auth","status"],void 0,{timeoutMs:d.probeTimeoutMs});if(0===a.exitCode)return X;let c=$(a.stderr||a.stdout);return Z("github","GitHub CLI auth",`\`${b.ghPath} auth status\` exited ${a.exitCode}${c?`: ${c}`:""}. Re-authenticate with \`gh auth login\`.`)}catch(a){if(a instanceof Error&&/timed out/i.test(a.message))return Y;return Z("github","GitHub CLI auth",`GitHub CLI '${b.ghPath}' could not be probed: ${$(String(a))}`)}}});let f=new Map;for(let b of a){if("gitlab"!==b.platform||!b.apiBaseUrl||!b.apiToken)continue;let a=b.apiBaseUrl.trim().replace(/\/+$/,"");!a||f.has(a)||f.set(a,b.apiToken)}for(let[a,b]of f)e.push(function(a,b,c){let d=`gitlab:${a}`,e=a;try{e=new URL(a).host}catch{}let f=`GitLab (${e})`;return{id:d,probe:async()=>{let g=`${a}/api/v4/user`;try{(0,U.sM)(g,{allowPrivate:(0,U.gT)()})}catch(a){return(0,r.v)(`[watchdog] gitlab probe skipped for ${e}`,a),Y}try{var h,i;let a=await (h=c.http(g,{headers:{"PRIVATE-TOKEN":b}}),i=c.probeTimeoutMs,new Promise((a,b)=>{let c=setTimeout(()=>b(Error(`probe timed out after ${i}ms`)),i);c.unref?.(),h.then(b=>{clearTimeout(c),a(b)},a=>{clearTimeout(c),b(a)})}));if(401===a.status||403===a.status)return Z(d,f,`GitLab rejected the access token (HTTP ${a.status}). Update the token in the repo's forge settings.`);if(a.ok)return X;return Y}catch{return Y}}}}(a,b,d));let h=new Set;for(let b of a)(0,g.TU)(b.agent)&&h.add(b.agent);for(let a of h)e.push(function(a,b,c,d){let e=`agent:${a}`,f=(0,g.X$)(a);return"openrouter"===a?{id:e,probe:async()=>{let a=(0,z.t)(b);if(!a)return Z(e,"OpenRouter API key","No OpenRouter API key is configured — set it in settings or via DRYDOCK_OPENROUTER_API_KEY.");let c=await (0,W.lw)(a,d.fetchImpl);return c.ok?X:/HTTP 40[13]\b/.test(c.error)?Z(e,"OpenRouter API key",`OpenRouter rejected the API key (${$(c.error)}). Update the key in settings.`):Y}}:{id:e,probe:async()=>{let a=await S(f,{command:(0,B.m)(f,c),runner:(a,b,c,e)=>d.runner(a,b,c,{timeoutMs:d.probeTimeoutMs,...e})});return a.installed?X:Z(e,`${f.label} CLI`,a.message??"CLI probe failed.")}}}(a,b,c,d));return e}((0,i.uP)(b),d,b,c),f=(0,Q.iC)(b),j=new Map((f?.failures??[]).map(a=>[a.target,a])),k=[];for(let{id:a,outcome:b}of(await Promise.all(e.map(async a=>{try{return{id:a.id,outcome:await a.probe()}}catch(b){return(0,r.v)(`[watchdog] credential probe for ${a.id} failed`,b),{id:a.id,outcome:Y}}}))))if("failed"===b.kind)k.push(b.failure);else if("unknown"===b.kind){let b=j.get(a);b&&k.push(b)}let l={checkedAt:Math.floor(c.now()/1e3),failures:k};return(0,Q.z8)(l,b),l}let aa=!1;async function ab(a={}){if(!aa){aa=!0,d=(a.now??Date.now)();try{return await _(a)}finally{aa=!1}}}var ac=c(1065),ad=c(27630),ae=c(73024);let af=["vercel","railway"];function ag(a){return a.exists??ae.existsSync}var ah=c(76760);class ai{async detect(a){let b=ag(a);return b((0,ah.join)(a.cwd,"railway.json"))||b((0,ah.join)(a.cwd,"railway.toml"))||b((0,ah.join)(a.cwd,".railway"))}async getStatus(a){let b=await a.run("railway",["status"],a.cwd);return function(a,b){if(0!==b)return"not_found";let c=a.toLowerCase();return/\bfailed\b|\bcrashed\b|\berror\b/.test(c)?"error":/\bsuccess\b|\bdeployed\b|\bready\b/.test(c)?"ready":/\bbuilding\b/.test(c)?"building":/\bdeploying\b|\binitializing\b|\bqueued\b/.test(c)?"deploying":"not_found"}(b.stdout,b.exitCode)}async getLogs(a){let b=await a.run("railway",["logs"],a.cwd);return[b.stdout,b.stderr].filter(Boolean).join("\n").trim()}constructor(){this.id="railway",this.label="Railway"}}function aj(a){return a?["list","--meta",`githubCommitSha=${a}`]:["list"]}class ak{async detect(a){let b=ag(a);return b((0,ah.join)(a.cwd,"vercel.json"))||b((0,ah.join)(a.cwd,".vercel"))}async getStatus(a){let b=await a.run("vercel",aj(a.ref),a.cwd);return function(a,b){if(0!==b)return"not_found";let c=a.split("\n").map(a=>a.trim()).filter(Boolean).find(a=>/●|ready|error|building|queued|initializing/i.test(a.replace(/https?:\/\/\S+/g," ")));if(!c)return"not_found";let d=c.replace(/https?:\/\/\S+/g," ").toLowerCase();return/\berror\b|\bfailed\b|canceled/.test(d)?"error":/\bready\b/.test(d)?"ready":/\bbuilding\b/.test(d)?"building":/\bqueued\b|initializing|deploying/.test(d)?"deploying":"not_found"}(b.stdout,b.exitCode)}async getLogs(a){let b=null;if(a.ref){var c;let d=await a.run("vercel",aj(a.ref),a.cwd);0===d.exitCode&&(c=d.stdout,b=c.match(/https?:\/\/\S+/)?.[0]??null)}let d=b?["inspect","--logs",b]:["logs"],e=await a.run("vercel",d,a.cwd);return[e.stdout,e.stderr].filter(Boolean).join("\n").trim()}constructor(){this.id="vercel",this.label="Vercel"}}let al=[new ak,new ai];async function am(a,b){if(b)return af.includes(b)?function(a){let b=al.find(b=>b.id===a);if(!b)throw Error(`unsupported deployment platform: ${a}`);return b}(b):null;for(let b of al)if(await b.detect(a))return b;return null}var an=c(64080);function ao(a,b){return{cwd:a.path,ref:b,run:R.Sx}}async function ap(a={}){let b=a.db??(0,h.Lf)(),c=a.now??Date.now,d=a.budgets??an.ad;for(let e of(0,i.uP)(b))if((0,s.A)(e).autoHealDeployments)try{let f=a.forgeFor?.(e)??(0,k.Ie)(e),g=a.adapterFor??(a=>am(ao(a,null),a.deploymentPlatform)),h=await g(e);if(!h)continue;let i=a.openFixPr??as;await aq(e,f,h,{db:b,now:c,budgets:d,openFixPr:i})}catch(a){(0,r.v)(`[deploy-heal] sweep failed for ${e.name}`,a)}}async function aq(a,b,c,d){let{db:e,now:f,budgets:g}=d,h=(0,C.N6)(a.id,e);for(let a of h){let d;if("merged"!==a.status||null==a.prNumber)continue;let h=(a.finishedAt??a.createdAt)*1e3;if(!(f()-h>g.monitorWindowMs)){try{d=await b.prMergeCommitSha?.(a.prNumber)??await b.prHeadSha(a.prNumber)}catch(b){(0,r.v)(`[deploy-heal] merged sha lookup failed for job ${a.id}`,b);continue}(0,an.SR)(a.id,d,e)||(0,an.eY)(a.id,a.prNumber,c.id,d,e)}}for(let b of e.select().from(j.deploymentHealingSessions).all().filter(a=>"monitoring"===a.status)){let e=h.find(a=>a.id===b.jobId);if(e)try{await ar(a,e,c,b,d)}catch(c){(0,r.v)(`[deploy-heal] session ${b.id} failed for ${a.name}`,c)}}}async function ar(a,b,c,d,e){let{db:f,now:g,budgets:h}=e,i=(0,an.FL)({createdAt:1e3*d.createdAt,lastPolledAt:1e3*d.updatedAt,now:g(),initialDelayMs:h.initialDelayMs,intervalMs:h.intervalMs,timeoutMs:h.timeoutMs});if("wait"===i)return;if("timeout"===i)return void(0,an.X)(d.id,"escalated",{},f);let j=ao(a,d.commitSha),k=(0,an.eV)(await c.getStatus(j));if("ready"===k)return void(0,an.X)(d.id,"healthy",{},f);if("pending"===k)return void(0,an.LR)(d.id,f);let l=(await c.getLogs(j).catch(()=>"")).split("\n").slice(-h.maxLogLines).join("\n").trim(),m=(0,an.X)(d.id,"failed",{logsExcerpt:l||null},f);(0,an.X)(d.id,"repairing",{},f);try{let c=await e.openFixPr(a,b,m,l);(0,an.X)(d.id,"repaired",{followupPrNumber:c},f)}catch(a){(0,r.v)(`[deploy-heal] fix PR failed for session ${d.id}`,a),(0,an.X)(d.id,"escalated",{},f)}}async function as(a,b,c,d){let e=(0,h.Lf)(),f=(0,g.X$)(b.agent),i=(0,B.m)(f,e),j=new ac.ND,l=c.commitSha.slice(0,7),m=`drydock/deploy-fix-${b.id}-${l}`,n=(0,k.Ie)(a),o=await j.prepareForNewBranch(a,m,`${b.id}-${l}`);try{let g=await (0,ad.V)(b,[`The deployment of the merged pull request #${c.prNumber} failed on`,`${c.platform} (commit ${c.commitSha.slice(0,7)}).`,"\nDeployment logs:\n```",d||"(no logs captured)","```\n\nDiagnose the deployment failure and make the minimal change that fixes it.\nEnsure the project builds and tests pass, then stop — the commit, push, and\npull request are handled for you."].join("\n"),o.path,{db:e,provider:f,command:i,sideSession:!0});if(0!==g.exitCode)throw Error(`${f.label} exited non-zero`);return await j.commitAndPush(o,`Fix failed ${c.platform} deployment for PR #${c.prNumber}`),n.createPr({head:m,base:a.defaultBranch,title:`Fix failed ${c.platform} deployment (PR #${c.prNumber})`,body:`The deployment for #${c.prNumber} (commit ${l}) failed. This PR addresses the deployment failure.`})}finally{try{await j.remove(o,a.path)}catch(a){(0,r.v)(`[deploy-heal] worktree cleanup failed for job ${b.id}`,a)}}}var at=c(7611),au=c(9617),av=c(76373),aw=c(8804),ax=c(51455),ay=c(48161),az=c(29980),aA=c(59144);let aB=az.Ik({release:az.zM(),bump:az.k5(["patch","minor","major"]),title:az.Yj().default(""),notes:az.Yj().default("")});var aC=c(98887);async function aD(a){if("http"===a.provider.kind){let{runOpenRouterOneShot:b}=await c.e(528).then(c.bind(c,59528));return b({model:a.model,prompt:a.prompt,repoId:a.repoId,type:a.type,timeoutMs:a.timeoutMs,db:a.db,fetchImpl:a.fetchImpl})}let b=a.runner??R.Sx,d=a.db??(0,h.Lf)(),e=void 0!==a.timeoutMs?{timeoutMs:a.timeoutMs}:void 0,f=a.provider.buildStreamOneShotArgs({prompt:a.prompt,model:a.model});if(null===f){let c=a.provider.buildOneShotArgs({prompt:a.prompt,model:a.model}),d=e?await b(a.command,c,a.cwd,e):await b(a.command,c,a.cwd);return{text:d.stdout,exitCode:d.exitCode,costUsd:0,stderr:d.stderr}}let g=e?await b(a.command,f,a.cwd,e):await b(a.command,f,a.cwd),i=new aC.KO,k=[...i.push(g.stdout),...i.flush()],l=[];for(let a of k)for(let b of a.chunks)"text"===b.kind&&l.push(b.text);let m=l.join(""),n=i.costUsd>0?i.costUsd:0;return n>0&&void 0!==a.repoId&&d.insert(j.oneShotCosts).values({repoId:a.repoId,type:a.type,costUsd:n,inputTokens:i.totalInputTokens,outputTokens:i.totalOutputTokens}).run(),{text:m,exitCode:g.exitCode,costUsd:n,stderr:g.stderr}}async function aE(a){var b;let c,d=await a.listReleases(),e=function(a){let b=null;for(let c of a)(0,aA.kf)(c)&&(null===b||(0,aA.mU)(c,b)>0)&&(b=c);return b}(d.map(a=>a.tagName)),f=e?d.find(a=>a.tagName===e)?.createdAt??null:null;return{fromTag:e,releases:d,prs:(b=(await a.listMergedPrs(100)).map(a=>({number:a.number,title:a.title,labels:a.labels,mergedAt:a.mergedAt})),c=null===f?null:Date.parse(f),b.filter(a=>{let b=Date.parse(a.mergedAt);return!Number.isNaN(b)&&(null===c||b>c)}).sort((a,b)=>a.number-b.number))}}async function aF(a,b){let c=b.db??(0,h.Lf)(),d=(0,aw.tm)(a,c);if(!d)throw Error(`release run ${a} not found`);let e=d.mode;(0,aw.Cq)(a,"evaluating",{},c);try{var f;let{fromTag:g,releases:h,prs:i}=await aE(b.forge);if("manual"===e&&0===i.length&&!d.tag)return(0,aw.Cq)(a,"skipped",{fromTag:g},c);let j=await b.generate({fromTag:g,prs:i});if("auto"===e&&!j)return(0,aw.Cq)(a,"error",{errorMessage:"release evaluation failed"},c);if("auto"===e&&j&&!j.release)return(0,aw.Cq)(a,"skipped",{fromTag:g},c);let k=function(a,b,c){let d="manual"===a?"patch":b?.bump??"patch",e=b?.title?.trim()??"";return{bump:d,title:e,notes:b?.notes?.trim()||(0===c.length?"No changes since the last release.":c.map(a=>`- #${a.number} ${a.title}`).join("\n"))}}(e,j,i),l=d.tag??(f=k.bump,`v${(0,aA.rr)(g??"0.0.0",f)}`);if((0,aw.Cq)(a,"proposed",{bump:k.bump,fromTag:g,tag:l,title:k.title||l,notes:k.notes,prNumbers:i.map(a=>a.number)},c),h.some(a=>a.tagName===l))return(0,aw.Cq)(a,"publishing",{},c),(0,aw.Cq)(a,"published",{},c);return(0,aw.Cq)(a,"publishing",{},c),await b.forge.createRelease({tag:l,title:k.title||l,notes:k.notes,target:b.repo.defaultBranch}),(0,aw.Cq)(a,"published",{},c)}catch(f){let b=f instanceof Error?f.message:String(f),d=(0,aw.tm)(a,c),e=d?.status??"evaluating";if("evaluating"===e||"proposed"===e||"publishing"===e)return(0,aw.Cq)(a,"error",{errorMessage:b.slice(0,500)},c);return(0,aw.tm)(a,c)}}async function aG(a,b){let c=await (0,ax.mkdtemp)((0,ah.join)((0,ay.tmpdir)(),"drydock-release-"));try{var d;let e,f=(e=(d={provider:a.provider,command:a.command,model:a.model,cwd:c,runner:a.runner}).timeoutMs??18e4,async a=>{try{let b,c,f,{text:g,exitCode:h}=await aD({provider:d.provider,command:d.command,model:d.model,cwd:d.cwd,prompt:(c=(b=a.prs.slice(0,200)).length>0?b.map(a=>{let b=a.labels.length>0?` [${a.labels.join(", ")}]`:"";return`- #${a.number} ${a.title}${b}`}).join("\n"):"(no merged pull requests)",["You are deciding whether to cut a new software release. Given the most\nrecent release and the pull requests merged since then, decide whether a\nrelease is warranted, which semantic-version bump it should be, and write\nconcise Markdown release notes.\n",a.fromTag?`The most recent release is ${a.fromTag}.`:"There is no prior release (this would be the first).","\n## Pull requests merged since the last release\n",c,'\n## How to choose the bump\n\n- "major": incompatible / breaking changes.\n- "minor": new, backwards-compatible features.\n- "patch": backwards-compatible bug fixes or internal-only changes.\n\n## Response format\n\nRespond with ONLY a JSON object (no prose, no code fences) of the shape:\n\n{"release": <true|false>, "bump": "patch"|"minor"|"major",\n "title": "<short release title>", "notes": "<Markdown release notes>"}\n\nSet "release" to false when the changes do not warrant a release yet (e.g.\nonly docs/CI tweaks). When false, the other fields are ignored.'].join("\n")),repoId:d.repoId,type:"release",timeoutMs:e,runner:d.runner,db:d.db});if(0!==h)return null;let i=g.match(/\{[\s\S]*\}/);if(!i)return null;try{f=JSON.parse(i[0])}catch{return null}let j=aB.safeParse(f);return j.success?j.data:null}catch{return null}});return await b(f)}finally{try{await (0,ax.rm)(c,{recursive:!0,force:!0})}catch{}}}async function aH(a={}){let b=a.db??(0,h.Lf)();if(!(0,A.mt)(b).releaseManagementEnabled)return;let c=a.now??Date.now,d=a.windowMs??36e5,e=a.notify??((a,c)=>(0,av.JD)(a,c,b));for(let f of(0,i.uP)(b))if((0,s.A)(f).releaseEnabled)try{let h=a.forgeFor?.(f)??(0,k.Ie)(f),i="function"==typeof h.listReleases&&"function"==typeof h.listMergedPrs&&"function"==typeof h.createRelease?h:null;if(!i)continue;let j=a.generatorFor?.(f)??function(a,b){let c=(0,g.X$)(a.agent),d=(0,B.m)(c,b),e=a.defaultModel;return a=>aG({provider:c,command:d,model:e},b=>b(a))}(f,b);await aI(f,h,i,j,{db:b,now:c,windowMs:d,notify:e})}catch(a){(0,r.v)(`[release] sweep failed for ${f.name}`,a)}}async function aI(a,b,c,d,e){let{db:f,now:g,windowMs:h}=e;for(let i of(0,C.N6)(a.id,f)){if("merged"!==i.status||null==i.prNumber)continue;let f=(i.finishedAt??i.createdAt)*1e3;if(!(g()-f>h))try{await aJ(a,i,b,c,d,e)}catch(b){(0,r.v)(`[release] job ${i.id} failed for ${a.name}`,b)}}}async function aJ(a,b,c,d,e,f){let{db:g,notify:h}=f,i=b.prNumber,j=(0,aw.$J)(a.id,i,g);if(j&&"detected"!==j.status)return;let k=await c.prHeadSha(i),l=(0,aw.v0)({repoId:a.id,mode:"auto",triggerPrNumber:i,triggerSha:k},g);if("detected"!==l.status)return;let m=await aF(l.id,{repo:a,forge:d,db:g,generate:e});"published"===m.status&&m.tag&&await h("release_published",`🚀 Released ${a.name} ${m.tag}.`)}var aK=c(62907),aL=c(48036),aM=c(14694);let aN={pending:["in_progress","skipped","deferred"],in_progress:["done","skipped","deferred"],deferred:["pending","in_progress","skipped"],done:[],skipped:[]};class aO extends Error{constructor(a,b){super(`invalid subtask transition: ${a} -> ${b}`)}}let aP=/^\s*[-*]\s*\[[ xX]\]\s+(.+?)\s*$/,aQ=/^\s*#*\s*(Bug\s+\d+\s*(?:[—:-])\s*.+?)\s*$/;async function aR(a,b={}){let c=function(a){let b=function(a){let b=[];for(let c of a.split("\n")){let a=c.match(aP);a?.[1]&&b.push(a[1].trim())}return b}(a);if(b.length>=2)return b;let c=function(a){let b=[];for(let c of a.split("\n")){let a=c.match(aQ);a?.[1]&&b.push(a[1].trim())}return b}(a);return c.length>=2?c:[]}(a.body);if(c.length>=2)return{titles:c,source:"heuristic"};if(b.generate)try{let c=(await b.generate(a)).map(a=>a.trim()).filter(Boolean);if(c.length>=2)return{titles:c,source:"agent"}}catch(b){if(b instanceof at.vu)throw b;(0,r.v)(`[decompose] agent fallback failed for issue #${a.number}`,b)}return{titles:[],source:"none"}}function aS(a){return a.map((a,b)=>{let{box:c,suffix:d}=function(a){switch(a){case"done":return{box:"[x]",suffix:""};case"skipped":return{box:"[~]",suffix:" — skipped"};case"in_progress":return{box:"[ ]",suffix:" — in progress"};case"deferred":return{box:"[ ]",suffix:" — deferred"};default:return{box:"[ ]",suffix:""}}}(a.status);return`${b+1}. ${c} ${a.title}${d}`}).join("\n")}function aT(a,b,c=(0,h.Lf)()){return c.select().from(j.issueSubtasks).where((0,f.Uo)((0,f.eq)(j.issueSubtasks.repoId,a),(0,f.eq)(j.issueSubtasks.issueNumber,b))).orderBy((0,aM.Y)(j.issueSubtasks.ordinal)).all()}function aU(a,b,c=(0,h.Lf)()){let d=c.select().from(j.issueSubtasks).where((0,f.eq)(j.issueSubtasks.id,a)).get();if(!d)throw Error(`subtask ${a} not found`);var e=d.status;if(!aN[e].includes(b))throw new aO(e,b);return c.update(j.issueSubtasks).set({status:b}).where((0,f.eq)(j.issueSubtasks.id,a)).returning().get()}async function aV(a,b,c=(0,h.Lf)(),d={}){var e,g,i,k;let l=function(a){let b=5381;for(let c=0;c<a.length;c++)b=(b<<5)+b+a.charCodeAt(c)|0;return(b>>>0).toString(16)}(b.body);if(e=a.id,g=b.number,c.select({h:j.issues.decomposedHash}).from(j.issues).where((0,f.Uo)((0,f.eq)(j.issues.repoId,e),(0,f.eq)(j.issues.number,g))).get()?.h===l)return{subtasks:aT(a.id,b.number,c),source:"none",skipped:!0};let{titles:m,source:n}=await aR(b,{generate:d.generate}),o=function(a,b,c,d,e=(0,h.Lf)()){return e.transaction(e=>(e.delete(j.issueSubtasks).where((0,f.Uo)((0,f.eq)(j.issueSubtasks.repoId,a),(0,f.eq)(j.issueSubtasks.issueNumber,b))).run(),c.forEach((c,f)=>{e.insert(j.issueSubtasks).values({repoId:a,issueNumber:b,ordinal:f,title:c,bodyHash:d}).run()}),e.select().from(j.issueSubtasks).where((0,f.Uo)((0,f.eq)(j.issueSubtasks.repoId,a),(0,f.eq)(j.issueSubtasks.issueNumber,b))).orderBy((0,aM.Y)(j.issueSubtasks.ordinal)).all()))}(a.id,b.number,m,l,c);return i=a.id,k=b.number,c.update(j.issues).set({decomposedHash:l}).where((0,f.Uo)((0,f.eq)(j.issues.repoId,i),(0,f.eq)(j.issues.number,k))).run(),{subtasks:o,source:n,skipped:!1}}var aW=c(26287),aX=c(29668);function aY(a){return a?.trim()||null}async function aZ(a={}){let b=a.runner??R.Sx,c=a.preferred??"auto",d="auto"===c?["docker","podman"]:[c];for(let a of d)try{let{exitCode:c}=await b(a,["--version"]);if(0===c)return{runtime:a}}catch{}let e=d.join(" / ");return{runtime:null,message:`No usable container runtime found (tried ${e}). Install Docker or Podman, or disable sandboxed execution for this repo.`}}var a$=c(94534);function a_(a){try{return(0,ae.readFileSync)(a,"utf8")}catch{return null}}async function a0(a){var b;let c,d,e=a.deps??{},f=e.detect??(a=>aZ({preferred:a})),g=await f(a.preferredRuntime);if(null===g.runtime)return{ok:!1,reason:g.message};let h=function(a,b,c){if(a.imageOverride)return a.imageOverride;let d=function(a,b){for(let c of[(0,ah.join)(a,".devcontainer","devcontainer.json"),(0,ah.join)(a,".devcontainer.json")]){let a=b.readFileText(c);if(null!=a)try{let b=JSON.parse(a.replace(/\/\*[\s\S]*?\*\//g,"").replace(/(^|[^:])\/\/.*$/gm,"$1").replace(/,\s*([}\]])/g,"$1"));if("string"==typeof b.image&&b.image.trim())return b.image.trim()}catch{}}return null}(b,c);return d||aY(a.defaultImage)}(a.config,a.worktreePath,{readFileText:e.readFileText??a_});if(!h)return{ok:!1,reason:"Sandboxed execution is enabled but no container image could be resolved. Set a per-repo sandbox image, add a devcontainer.json, or set a global default image in settings."};let i=(c=(function(a,b){switch(a){case"codex":return[{host:(0,ah.join)(b,".codex"),container:"/root/.codex"}];case"openrouter":return[];default:return[{host:(0,ah.join)(b,".claude"),container:"/root/.claude"},{host:(0,ah.join)(b,".claude.json"),container:"/root/.claude.json"}]}})((b={agent:a.agent,home:e.home??(0,ay.homedir)(),env:e.env??process.env,exists:e.exists??ae.existsSync}).agent,b.home).filter(a=>b.exists(a.host)),d=[],b.env.GH_TOKEN?.trim()?d.push("GH_TOKEN"):b.env.GITHUB_TOKEN?.trim()&&d.push("GITHUB_TOKEN"),{mounts:c,env:d});return{ok:!0,session:{runner:function(a,b={}){let c=b.baseRunner??a$.g,d=b.cleanup??R.Sx;return(b,e,f,g)=>{let h=function(a,b,c){let d=["run","--rm","--init","--name",a.containerName,"-v",`${a.hostPath}:${a.workdir}`,"-w",a.workdir];for(let b of(a.allowNetwork||d.push("--network","none"),a.cpus&&d.push("--cpus",a.cpus),a.memory&&d.push("--memory",a.memory),a.mounts))d.push("-v",`${b.host}:${b.container}:ro`);for(let b of a.env)d.push("-e",b);return d.push(a.image,b,...c),{cmd:a.runtime,args:d}}(a,b,e),i=c(h.cmd,h.args,f,g);return{done:i.done,get spawnError(){return i.spawnError},abort:b=>{i.abort(b);try{d(a.runtime,["rm","-f",a.containerName]).catch(b=>(0,r.v)(`[sandbox] failed to remove container ${a.containerName}`,b))}catch(b){(0,r.v)(`[sandbox] failed to remove container ${a.containerName}`,b)}}}}}({runtime:g.runtime,image:h,workdir:"/workspace",hostPath:a.worktreePath,containerName:`drydock-job-${a.jobId}`,allowNetwork:a.config.allowNetwork,cpus:a.config.cpus,memory:a.config.memory,mounts:i.mounts,env:i.env},{baseRunner:e.baseRunner,cleanup:e.cleanup}),command:a.inContainerCommand}}}let a1=["usage_limit","rate_limit","overloaded"],a2=new Set(["CANCELLED","ACTION_REQUIRED"]),a3=new Set(["TIMED_OUT"]),a4=/\b(ai|claude|codex|copilot|gpt|llm)\b.*\breview\b|\breview\b.*\b(ai|bot)\b/i,a5=/\bcancell?ed\b|\bsecret\b|\b(rate.?limit|secondary rate)\b|\b5\d\d\b|\b(401|403|unauthorized|forbidden)\b|service unavailable/i,a6=/\b(time(d)?.?out|timeout|intermittent|flak(y|e)|econnreset|etimedout|esockettimedout)\b/i,a7=/\b(typecheck|tsc|type error|ts\d{3,5}|lint|biome|eslint|prettier|test|tests|spec|vitest|jest|pytest|assert(ion)?|build|compile|compilation|codegen|generated|snapshot|out of date|outdated)\b/i,a8=[{kind:"type",re:/\berror TS\d{2,5}\b|\bTS\d{2,5}:|\bType error:|is not assignable to/i},{kind:"dependency",re:/\bnpm ERR!|\bERR_PNPM|\bERESOLVE\b|unmet peer|peer dep|frozen lockfile|out of date lockfile|cannot find module '/i},{kind:"lint",re:/\bbiome\b|\beslint\b|\bprettier\b|\blint\/[a-z]|@typescript-eslint\/|formatter would have/i},{kind:"test",re:/\bFAIL\b|✕|✗|✖|●|\bAssertionError\b|expect\(|Expected:|Received:|\bTests?:\s|\d+ failed/i},{kind:"build",re:/failed to compile|module not found|compilation (failed|error)|\bcompile error\b|cannot compile/i},{kind:"timeout",re:/\btimed out\b|\btimeout\b|exceeded \d+\s?ms/i},{kind:"flaky",re:/\bECONNRESET\b|\bETIMEDOUT\b|\bESOCKETTIMEDOUT\b|intermittent|\bflak(y|e)\b/i}];function a9(a,b){if(0===a.length)return{kind:"unknown",evidence:""};let c=a.split("\n"),d=function(a){for(let{kind:b,re:c}of a8)if(c.test(a))return b;return"unknown"}(a);if("unknown"===d)return{kind:d,evidence:c.slice(-b).join("\n")};let e=a8.find(a=>a.kind===d),f=e?c.findIndex(a=>e.re.test(a)):-1;if(f<0)return{kind:d,evidence:c.slice(-b).join("\n")};let g=Math.max(0,f-3);return{kind:d,evidence:c.slice(g,g+b).join("\n")}}let ba={test:"A test is failing. Identify the failing test(s) from the evidence and fix the underlying code so they pass. Do not delete or skip tests, and do not weaken assertions to go green.",type:"A type error is failing the check. Fix the reported type error(s) properly — correct the types; do not silence them with `any` or `@ts-ignore`.",lint:"A lint/format check is failing. Fix the reported rule violations. Prefer the autofix (e.g. `npx biome check --write`) and resolve anything it cannot fix by hand.",build:"The build/compile step failed. Fix the compilation error(s) shown below (e.g. a broken import or unresolved module).",dependency:"A dependency step failed. Resolve the dependency problem below — a missing or incompatible package, or an out-of-date lockfile. Update package.json and the lockfile together.",timeout:"A check timed out. If a change in this branch introduced a hang or a slow path, fix it; otherwise make the affected code complete within the time budget.",flaky:"A check failed on what looks like an intermittent/network error. If the branch made the code fragile to this, harden it; otherwise the failure may not be code-related.",unknown:"A CI check is failing. Diagnose the failure from the evidence below and fix it."};var bb=c(34666);let bc=new Set(["FAILURE","ERROR","CANCELLED","TIMED_OUT","ACTION_REQUIRED"]),bd=new Set(["PENDING","QUEUED","IN_PROGRESS","WAITING","REQUESTED"]);function be(a){return 0===a.length?"none":a.some(a=>bc.has(a.state.toUpperCase()))?"failed":a.some(a=>bd.has(a.state.toUpperCase()))?"pending":"passed"}function bf(a){return a.timedOut?"CI-fix session timed out":a.costExceeded?"per-job cost limit reached during the CI fix":a.spawnError?`CI-fix session failed to start: ${a.spawnError.message}`:0!==a.exitCode?"CI-fix session exited non-zero":a.settledExternally?"job was settled externally during the CI fix":a.noChanges?"CI-fix session produced no changes":null}function bg(a,b){return()=>!!(0,at.nc)(a.agent,b)}function bh(a,b,c,d){let e=c.limit;if(!e)return null;if("auth"===e.kind||"billing"===e.kind){let c="auth"===e.kind?"authentication":"billing",f=`CI fix blocked by a provider ${c} error: ${e.rawSnippet}`.slice(0,500);return(0,C.yM)(a.id,"status",{reason:f,prNumber:b},d),{job:(0,C.dk)(a.id,"needs_human",{errorMessage:f},d),done:!0}}return a1.includes(e.kind)&&(0,at.$q)(e.agent,d)?(e.latched||(0,at.H_)(e,d),(0,C.yM)(a.id,"status",{reason:`${e.agent}_${e.kind} during CI fix`,prNumber:b},d),{job:(0,C.dk)(a.id,"ci_running",{ciRetryCount:Math.max(0,a.ciRetryCount-1)},d),done:!1}):null}function bi(a,b){let c;return{start:()=>!(a<=0)&&void 0===c&&(c=b(),!0),open:()=>a>0&&void 0!==c&&b()-c<a,reset(){c=void 0}}}let bj=a=>new Promise(b=>setTimeout(b,a)),bk=new Set(["ci_running","ci_failed","retrying"]);function bl(a,b){let c=(0,C.ax)(a,b);if(!(!c||bk.has(c.status)))return c}async function bm(a,b,c,d,e){await d.gh.commentIssue(a.issueNumber,`${c} Handing over to a human.`);let f=await d.gh.createIssue(`Follow-up: CI keeps failing for issue #${a.issueNumber}`,`Job ${a.id} could not be auto-healed on PR #${b}. ${c}`);return e.insert(j.followupIssues).values({jobId:a.id,ghIssueNumber:f,title:`Follow-up for #${a.issueNumber}`}).run(),(0,C.dk)(a.id,"needs_human",{errorMessage:c.slice(0,500)},e)}async function bn(a,b,c,d,e,f="checks stayed pending"){let g=Math.round(c/6e4),h=`CI did not complete in time (${f} for over ${g} min on PR #${b}).`;return await d.gh.commentIssue(a.issueNumber,`${h} Handing over to a human.`),(0,C.yM)(a.id,"status",{reason:"ci wait budget exceeded",prNumber:b},e),(0,C.dk)(a.id,"needs_human",{errorMessage:h.slice(0,500)},e)}async function bo(a,b,c){if(c.autoHeal)return bp(a,b,c,c.autoHeal);let d=c.db??(0,h.Lf)(),e=c.sleep??bj,f=c.pollMs??3e4,g=c.maxPolls??1/0,i=c.ciWaitMs??1/0,j=c.now??Date.now,k=j()+i,l=bi(c.mergeGateMs??0,j),m=bi(Math.max(c.mergeGateMs??0,f),j),n=c.limitBlocked??bg(a,d),o=!1,p=a,q=0;for(;q<g;){q++;let a=bl(p.id,d);if(a)return a;let g=be(await c.gh.prChecks(b));if("pending"===g){if(l.reset(),m.reset(),j()>=k)return bn(p,b,i,c,d);await e(f);continue}if("none"===g&&!c.mergeWithoutChecks){if(l.reset(),m.reset(),j()>=k)return bn(p,b,i,c,d,"no CI checks were reported");await e(f);continue}if("none"===g){if(l.reset(),m.start()&&(0,C.yM)(p.id,"status",{reason:"no CI checks reported; settling before an unverified merge",prNumber:b},d),m.open()){if(j()>=k)return bn(p,b,i,c,d,"no CI checks were reported");await e(f);continue}let a=bl(p.id,d);if(a)return a;return(0,C.yM)(p.id,"status",{reason:"merging without CI verification (no checks reported)",prNumber:b},d),await c.gh.mergePr(b),(0,C.dk)(p.id,"merged",{prNumber:b},d)}if("passed"===g){if(m.reset(),l.start()&&(0,C.yM)(p.id,"status",{reason:"merge gate: CI green, waiting for late reviews",prNumber:b},d),l.open()){await e(f);continue}let a=bl(p.id,d);if(a)return a;return await c.gh.mergePr(b),(0,C.dk)(p.id,"merged",{prNumber:b},d)}if(l.reset(),m.reset(),n()){if(j()>=k)return bn(p,b,i,c,d,"the provider usage limit blocked the CI fix");o||((0,C.yM)(p.id,"status",{reason:"ci fix deferred: provider limit latched",prNumber:b},d),o=!0),await e(f);continue}if(o=!1,(p=(0,C.dk)(p.id,"ci_failed",{prNumber:b},d)).ciRetryCount>=3)return bm(p,b,"CI failed 3 times.",c,d);if(!p.sessionId)return(0,C.yM)(p.id,"status",{reason:"missing session id, cannot resume for CI fix"},d),(0,C.dk)(p.id,"needs_human",{errorMessage:"CI failed but no session id to resume"},d);let h=p.sessionId;p=(0,C.dk)(p.id,"retrying",{ciRetryCount:p.ciRetryCount+1},d);let{evidence:r}=a9(await c.gh.failedRunLog(b),200),s=await c.resumeSession(p,h,r),t=bh(p,b,s,d);if(t){if(p=t.job,t.done)return p;continue}let u=bf(s);if(u)return(0,C.yM)(p.id,"status",{reason:u,prNumber:b},d),(0,C.dk)(p.id,"needs_human",{errorMessage:u},d);(0,at._x)(p.agent,d),p=(0,C.dk)(p.id,"ci_running",{},d)}return(0,C.ax)(p.id,d)??p}async function bp(a,b,c,d){let e,f=c.db??(0,h.Lf)(),g=c.sleep??bj,i=c.pollMs??3e4,j=c.maxPolls??1/0,k=d.budgets??bb.op,l=c.now??d.now??Date.now,m=c.ciWaitMs??1/0,n=l()+m,o=bi(c.mergeGateMs??0,l),p=bi(Math.max(c.mergeGateMs??0,i),l),q=c.limitBlocked??bg(a,f),r=a,s=0;for(;s<j;){s++;let a=bl(r.id,f);if(a)return e&&(0,bb.rh)(e.sessionId,"superseded",f),a;let h=await c.gh.prChecks(b),j=be(h);if("pending"===j){if(o.reset(),p.reset(),l()>=n)return e&&(0,bb.rh)(e.sessionId,"escalated",f),bn(r,b,m,c,f);await g(i);continue}if("none"===j&&!c.mergeWithoutChecks){if(o.reset(),p.reset(),l()>=n)return e&&(0,bb.rh)(e.sessionId,"escalated",f),bn(r,b,m,c,f,"no CI checks were reported");await g(i);continue}if("none"===j){if(o.reset(),p.start()&&(0,C.yM)(r.id,"status",{reason:"no CI checks reported; settling before an unverified merge",prNumber:b},f),p.open()){if(l()>=n)return e&&(0,bb.rh)(e.sessionId,"escalated",f),bn(r,b,m,c,f,"no CI checks were reported");await g(i);continue}let a=bl(r.id,f);if(a)return e&&(0,bb.rh)(e.sessionId,"superseded",f),a;return e&&(0,bb.rh)(e.sessionId,"superseded",f),(0,C.yM)(r.id,"status",{reason:"merging without CI verification (no checks reported)",prNumber:b},f),await c.gh.mergePr(b),(0,C.dk)(r.id,"merged",{prNumber:b},f)}if("passed"===j){if(p.reset(),o.start()&&(0,C.yM)(r.id,"status",{reason:"merge gate: CI green, waiting for late reviews",prNumber:b},f),o.open()){await g(i);continue}let a=bl(r.id,f);if(a)return e&&(0,bb.rh)(e.sessionId,"superseded",f),a;if(e){let a=await d.headSha(b);(0,bb.Az)(e.attemptId,{status:"healed",afterSha:a},f),(0,bb.Yv)(e.sessionId,"verifying",f),(0,bb.Yv)(e.sessionId,"healed",f)}return await c.gh.mergePr(b),(0,C.dk)(r.id,"merged",{prNumber:b},f)}o.reset(),p.reset();let t=h.filter(a=>bc.has(a.state.toUpperCase())),u=await d.headSha(b);if(e){let a="rerun"===e.kind?(0,bb.sk)({beforeFailingCount:e.beforeFailing,afterFailingCount:t.length}):(0,bb.I0)({beforeSha:e.beforeSha,afterSha:u,beforeFailingCount:e.beforeFailing,afterFailingCount:t.length});(0,bb.Az)(e.attemptId,{status:a.verdict,afterSha:u},f);let d=e.sessionId;if(e=void 0,"rejected"===a.verdict)return(0,bb.Yv)(d,"verifying",f),(0,bb.Yv)(d,"escalated",f),bm(r,b,`CI auto-heal: ${a.reason}.`,c,f);(0,bb.Yv)(d,"verifying",f),(0,bb.Yv)(d,"cooldown",f)}if(q()){if(l()>=n)return bn(r,b,m,c,f,"the provider usage limit blocked auto-heal");await g(i);continue}let v=(0,bb.dT)(r.id,b,u,f),w=await c.gh.failedRunLog(b),x=t.map(a=>(function(a,b,c=""){var d,e;let f,g,h=(d=b.name,e=b.state??"",f=e.toUpperCase(),g=`${d}
|
|
6
|
+
${c}`,a2.has(f)||a4.test(d)||a5.test(g)?"blocked_external":a3.has(f)||a6.test(g)?"flaky_or_ambiguous":a7.test(g)?"healable_in_branch":"unknown");return{checkName:b.name,category:h,fingerprint:`${a}:${h}:${b.name.trim().toLowerCase().replace(/\s+/g," ")}`}})(d.provider,a,w)),y=(0,bb.VJ)(v.id,f),z=y.at(-1),A=(0,bb.ZM)({failures:x,attempts:y.map(a=>({fingerprint:a.fingerprint})),lastAttemptAt:z?1e3*z.createdAt:null,now:l(),activeRuns:(0,bb.Bz)(f),budgets:k});switch(A.action){case"block":return(0,bb.rh)(v.id,"blocked",f),await c.gh.commentIssue(r.issueNumber,`CI auto-heal: ${A.reason} — not auto-fixable. Handing over to a human.`),(0,C.dk)(r.id,"needs_human",{errorMessage:`auto-heal blocked: ${A.reason}`.slice(0,500)},f);case"escalate":return(0,bb.rh)(v.id,"escalated",f),bm(r,b,`CI auto-heal: ${A.reason}.`,c,f);case"wait_slot":if(l()>=n)return(0,bb.rh)(v.id,"escalated",f),bn(r,b,m,c,f,"auto-heal waited for a free healing slot");await g(i);continue;case"cooldown":if(l()>=n)return(0,bb.rh)(v.id,"escalated",f),bn(r,b,m,c,f,"auto-heal waited out its cooldown");await g(Math.min(A.waitMs,i));continue;case"repair":{let a=r.sessionId;if(!a)return(0,bb.rh)(v.id,"escalated",f),bm(r,b,"CI failed but no session id to resume.",c,f);let d=(0,bb.Z7)(v.id,A.target,u,f);(0,bb.Yv)(v.id,"awaiting_slot",f),(0,bb.Yv)(v.id,"repairing",f);let g=null;try{r=(0,C.dk)(r.id,"ci_failed",{prNumber:b},f),r=(0,C.dk)(r.id,"retrying",{ciRetryCount:r.ciRetryCount+1},f);let e=function(a){let{kind:b,evidence:c}=a9(a.log,a.maxLines);return[`CI check "${a.checkName}" is failing on this PR.`,ba[b],"Fix only this failure, then commit and push. Failure evidence:\n",c].join("\n")}({checkName:A.target.checkName,log:w,maxLines:k.maxEvidenceLines}),h=await c.resumeSession(r,a,e),i=bh(r,b,h,f);if(i){if((0,bb.kb)(d.id,f),(0,bb.rh)(v.id,i.done?"escalated":"superseded",f),r=i.job,i.done)return r;continue}(g=bf(h))||((0,at._x)(r.agent,f),(0,bb.Yv)(v.id,"awaiting_ci",f),r=(0,C.dk)(r.id,"ci_running",{},f))}catch(a){throw(0,bb.rh)(v.id,"escalated",f),a}if(g)return(0,bb.Az)(d.id,{status:"rejected",afterSha:null},f),(0,bb.rh)(v.id,"escalated",f),bm(r,b,`CI auto-heal: ${g}.`,c,f);e={attemptId:d.id,sessionId:v.id,beforeSha:u,beforeFailing:t.length,kind:"repair"};continue}case"rerun":{if(!await c.gh.reRunFailedChecks?.(b))return(0,bb.rh)(v.id,"escalated",f),bm(r,b,`CI auto-heal: flaky check "${A.target.checkName}" requires a manual re-run (this forge cannot re-run failed checks).`,c,f);let a=(0,bb.Z7)(v.id,A.target,u,f);(0,bb.Yv)(v.id,"awaiting_slot",f),(0,bb.Yv)(v.id,"awaiting_ci",f),(0,C.yM)(r.id,"status",{reason:"auto-heal re-ran flaky check",checkName:A.target.checkName,prNumber:b},f),e={attemptId:a.id,sessionId:v.id,beforeSha:u,beforeFailing:t.length,kind:"rerun"};continue}}}return(0,C.ax)(r.id,f)??r}let bq=(0,ah.join)(".drydock","FOLLOWUPS.md"),br=/^##\s+(.*)$/;function bs(a){let b=function(a){let b;try{b=(0,ae.readFileSync)((0,ah.join)(a,bq),"utf8")}catch{return[]}return function(a){let b=[],c=new Set,d=null,e=[],f=()=>{if(null!==d){if(""!==d&&!c.has(d)&&b.length<20){c.add(d);let a=e.join("\n").trim(),f=a.length>6e4?`${a.slice(0,6e4)}
|
|
7
|
+
… (truncated)`:a;b.push({title:d,body:f})}d=null,e=[]}};for(let b of a.split("\n")){let a=b.match(br);a?(f(),d=(a[1]??"").trim().slice(0,300)):null!==d&&e.push(b)}return f(),b}(b)}(a);return(0,ae.rmSync)((0,ah.join)(a,bq),{force:!0}),b}function bt(a,b){if(a.length<=b)return a;let c=a.length-b;return`${a.slice(0,b)}
|
|
8
|
+
…[truncated ${c} chars]`}let bu=az.Ik({ordinal:az.ai().int().nonnegative(),status:az.k5(["done","pending","deferred"]),reason:az.Yj().default("")}),bv=az.Ik({summary:az.Yj().default(""),verdicts:az.YO(bu).default([])}),bw=["blocker","major","minor","nit","praise"],bx=az.Ik({severity:az.k5(bw),title:az.Yj().default(""),body:az.Yj().default(""),path:az.Yj().optional(),line:az.ai().int().nonnegative().optional(),suggestion:az.Yj().optional()}),by=az.Ik({summary:az.Yj().default(""),recommendation:az.k5(["approve","request_changes","comment"]),findings:az.YO(bx).default([]),issueCoverage:az.Ik({met:az.YO(az.Yj()).default([]),missing:az.YO(az.Yj()).default([])}).default({met:[],missing:[]})});function bz(a){return`<!-- drydock:pr-audit:${a} -->`}let bA={blocker:"⛔",major:"\uD83D\uDD34",minor:"\uD83D\uDFE1",nit:"\uD83D\uDD35",praise:"\uD83C\uDF89"},bB={approve:"✅ approve",request_changes:"\uD83D\uDED1 request changes",comment:"\uD83D\uDCAC comment"};function bC(a){return[bz(a.jobId),"",`### 🔍 Drydock PR audit (${a.agent}/${a.model}, ${a.language})`,""]}var bD=c(58543);async function bE(a,b,c,d){if(a.listIssueComments&&a.updateIssueComment)try{let e=(await a.listIssueComments(b)).find(a=>a.body.includes(c));if(e)return await a.updateIssueComment(b,e.id,d),"updated"}catch(a){(0,r.v)(`[pr-audit] comment upsert degraded to a fresh post on #${b}`,a)}return await a.commentIssue(b,d),"created"}async function bF(a,b){try{return await a()}catch(a){return(0,r.v)("[pr-audit] best-effort read failed, using fallback",a),b}}async function bG(a){var b;let c,d,e,f,i,{job:j,prNumber:k,repo:l,forge:m,db:n}=a,o=(e=(d=(0,g.TU)(l.agent)?l.agent:g.kz)===l.agent,f=(0,g.TU)(l.prAuditAgent)?l.prAuditAgent:d,i=l.prAuditModel??(e&&f===d?l.defaultModel:(0,bD.VJ)(f)),{agent:f,model:i,language:l.prAuditLanguage||"en"}),p={jobId:j.id,agent:o.agent,model:o.model,language:o.language};try{let d;if((0,A.mt)(n).paused)return(0,C.yM)(j.id,"pr_audit_skipped",{reason:"paused"},n),null;(0,C.yM)(j.id,"pr_audit_started",{...p,prNumber:k},n);let e=await bF(()=>m.prDiff(k),"");if(!e.trim())return(0,C.yM)(j.id,"pr_audit_failed",{reason:"empty diff",prNumber:k},n),null;let[f,i]=await Promise.all([bF(()=>m.prChecks(k),[]),bF(()=>m.viewIssue(j.issueNumber),null)]),q=aT(l.id,j.issueNumber,n),r={issueNumber:j.issueNumber,issueTitle:i?.title??`Issue #${j.issueNumber}`,issueBody:i?.body??"",subtasks:q.map(a=>({ordinal:a.ordinal,title:a.title})),prNumber:k,branch:j.branch,diff:e,checks:f.map(a=>({name:a.name,state:a.state})),language:o.language},s=a.generate;if(!s){let d;c=await (0,ax.mkdtemp)((0,ah.join)((0,ay.tmpdir)(),"drydock-pr-audit-"));let e=(0,g.X$)(o.agent);d=(b={provider:e,command:(0,B.m)(e,n),model:o.model,cwd:c,repoId:l.id,db:n,runner:a.runner}).timeoutMs??36e4,s=async a=>{let c,e,f,g;try{var i,j;let g,h,k;({text:c,exitCode:e,stderr:f}=await aD({provider:b.provider,command:b.command,model:b.model,cwd:b.cwd,prompt:(g=bt(a.issueBody.trim(),6e3),h=bt(a.diff.trim(),48e3),k=function(a){let b=a.trim();if(!b)return"English";try{return new Intl.DisplayNames(["en"],{type:"language"}).of(b)??b}catch{return b}}(a.language),["You are performing a READ-ONLY pull request audit. Do NOT edit files, run\ncommands, or make any changes. Review the full diff like a senior code\nreviewer (in the spirit of Bugbot/CodeRabbit) across these dimensions:\n\n1. Correctness — logic bugs, race conditions, error handling gaps\n2. Security — injection, authz, secrets, unsafe defaults (no CVE speculation)\n3. Tests — missing coverage for changed behavior\n4. API / compatibility — breaking changes, migration needs\n5. Maintainability — complexity, naming, duplication\n6. Issue fit — does the diff actually address the linked issue and subtasks\n",`## Issue #${a.issueNumber}: ${a.issueTitle}`,"",g,"\n## Subtasks\n",0===(i=a.subtasks).length?"This issue has no tracked subtasks; judge the issue as a whole.":i.map(a=>`- [ordinal ${a.ordinal}] ${a.title}`).join("\n"),"",`## Pull request #${a.prNumber}${a.branch?` (branch ${a.branch})`:""}`,"\n## CI results\n",0===(j=a.checks).length?"No CI results available.":j.map(a=>`- ${a.name}: ${a.state}`).join("\n"),"\n## Diff\n\n```diff",h,'```\n\n## Response format\n\nRespond with ONLY a JSON object (no prose outside it) of the shape:\n\n{"summary": "<one or two sentence overall assessment>",\n "recommendation": "approve"|"request_changes"|"comment",\n "findings": [{"severity": "blocker"|"major"|"minor"|"nit"|"praise",\n "title": "<short title>", "body": "<explanation>",\n "path": "<file path, optional>", "line": <number, optional>,\n "suggestion": "<suggested fix, optional>"}],\n "issueCoverage": {"met": ["<criterion>"], "missing": ["<criterion>"]}}\n\nReport only findings you are confident about; an empty findings list is a\nvalid answer for a clean diff. This review is advisory: do not gate, merge,\nor approve anything yourself.\n\nWrite all human-readable text (summary, titles, bodies, suggestions,',`coverage entries) in ${k}.`].join("\n")),repoId:b.repoId,type:"pr_audit",timeoutMs:d,runner:b.runner,db:b.db}))}catch{return null}if(0!==e){let a=b.provider.classifyFailure?.({exitCode:e,stderr:f,resultText:c});if(a&&a1.includes(a.kind)){let c=b.db??(0,h.Lf)();if((0,at.$q)(b.provider.id,c))throw(0,at.H_)(a,c),new at.vu(a)}return null}let k=c.match(/\{[\s\S]*\}/);if(!k)return null;try{g=JSON.parse(k[0])}catch{return null}let l=by.safeParse(g);return l.success?l.data:null}}try{d=await s(r)}catch(a){if(a instanceof at.vu)return(0,C.yM)(j.id,"pr_audit_failed",{reason:"provider limit",kind:a.info.kind,agent:a.info.agent},n),null;throw a}let t=bz(j.id);if(!d){let a,b=((a=bC(p)).push("The audit run failed: the agent returned no parseable review (timeout, non-zero exit, or invalid JSON).",""),a.push("Job state is unchanged; re-run the audit from the job page to retry."),a.join("\n"));return await bE(m,j.issueNumber,t,(0,V.f)(b)),(0,C.yM)(j.id,"pr_audit_failed",{reason:"unparseable output",prNumber:k},n),null}let u=(0,V.f)(function(a,b){let c=bC(b);c.push(`**Recommendation:** ${bB[a.recommendation]}`,""),a.summary.trim()&&c.push(a.summary.trim(),"");let d=new Map(bw.map((a,b)=>[a,b])),e=[...a.findings].sort((a,b)=>(d.get(a.severity)??99)-(d.get(b.severity)??99));if(0===e.length)c.push("No findings — the diff looks clean across all review dimensions.","");else{for(let a of(c.push(`#### Findings (${e.length})`,""),e.slice(0,30)))c.push(function(a){let b=a.path?` — \`${a.path}${void 0!==a.line?`:${a.line}`:""}\``:"",c=[`- ${bA[a.severity]} **[${a.severity}] ${a.title}**${b}`];return a.body.trim()&&c.push(` ${a.body.trim().replace(/\n/g,"\n ")}`),a.suggestion?.trim()&&c.push(` Suggested fix: ${a.suggestion.trim().replace(/\n/g,"\n ")}`),c.join("\n")}(a));let a=e.length-30;a>0&&c.push("",`_…and ${a} more finding${1===a?"":"s"} omitted._`),c.push("")}let{met:f,missing:g}=a.issueCoverage;if(f.length>0||g.length>0){for(let a of(c.push("#### Issue coverage",""),f))c.push(`- [x] ${a}`);for(let a of g)c.push(`- [ ] ${a}`);c.push("")}return b.truncated&&(c.push("_Note: the diff and/or issue body was truncated to fit the audit context;_"),c.push("_this is a partial review of an oversized PR._","")),c.push("---"),c.push("_This audit is advisory only; it never merges, blocks, or edits anything._"),c.join("\n")}(d,{...p,truncated:r.diff.trim().length>48e3||r.issueBody.trim().length>6e3}));return await bE(m,j.issueNumber,t,u),l.prAuditPostOnPr&&m.commentPr&&await bF(()=>m.commentPr?.(k,u)??Promise.resolve(),void 0),(0,C.yM)(j.id,"pr_audit_completed",{recommendation:d.recommendation,findings:d.findings.length,blockers:d.findings.filter(a=>"blocker"===a.severity).length,prNumber:k},n),d}catch(a){return(0,r.v)(`[pr-audit] audit pass failed for ${l.name}#${j.issueNumber}`,a),(0,C.yM)(j.id,"pr_audit_failed",{reason:a instanceof Error?a.message.slice(0,300):String(a)},n),null}finally{if(c)try{await (0,ax.rm)(c,{recursive:!0,force:!0})}catch{}}}let bH=(0,ah.join)(".drydock","PR.md");function bI(a){let b=function(a){let b;try{b=(0,ae.readFileSync)((0,ah.join)(a,bH),"utf8")}catch{return null}let c=b.split("\n"),d=0;for(;d<c.length&&""===(c[d]??"").trim();)d++;if(d>=c.length)return null;let e=(c[d]??"").trim().slice(0,300);if(""===e)return null;let f=c.slice(d+1).join("\n").trim();return{title:e,body:f.length>6e4?`${f.slice(0,6e4)}
|
|
9
|
+
… (truncated)`:f}}(a);return(0,ae.rmSync)((0,ah.join)(a,bH),{force:!0}),b}var bJ=c(52484);let bK=(0,ah.join)(".drydock","QUESTIONS.md");function bL(a){let b=function(a){let b,c;try{b=(0,ae.readFileSync)((0,ah.join)(a,bK),"utf8")}catch{return null}return""===(c=b.trim())?null:c.length>6e4?`${c.slice(0,6e4)}
|
|
10
|
+
… (truncated)`:c}(a);return(0,ae.rmSync)((0,ah.join)(a,bK),{force:!0}),b}let bM=(0,ah.join)(".drydock","RELEASE.md"),bN=/^tag:\s*(\S+)\s*$/i,bO=/^v?\d+\.\d+\.\d+/;function bP(a){let b=function(a){let b;try{b=(0,ae.readFileSync)((0,ah.join)(a,bM),"utf8")}catch{return null}return function(a){let b=null,c=[];for(let d of a.split("\n")){let a=d.match(bN);if(a&&null===b){b=a[1]??null;continue}c.push(d)}let d=0;for(;d<c.length&&""===(c[d]??"").trim();)d++;if(d>=c.length)return b?{tag:b,title:b,notes:""}:null;let e=(c[d]??"").trim().slice(0,300);if(""===e)return null;null===b&&bO.test(e)&&(b=e);let f=c.slice(d+1).join("\n").trim();return{tag:b,title:e,notes:f.length>6e4?`${f.slice(0,6e4)}
|
|
11
|
+
… (truncated)`:f}}(b)}(a);return(0,ae.rmSync)((0,ah.join)(a,bM),{force:!0}),b}async function bQ(a,b={},c=(a,c)=>(0,av.JD)(a,c,b.db??(0,h.Lf)())){let d,e=b.db??(0,h.Lf)(),f=(0,C.ax)(a,e);if(!f)throw Error(`job ${a} not found`);let j=(0,i.L8)(f.repoId,e);if(!j)throw Error(`repo ${f.repoId} not found`);let k=(0,aw.Oe)(a,e)??(0,aw.v0)({repoId:j.id,mode:"agent",jobId:a},e);"queued"===f.status&&(0,C.dk)(f.id,"working",{},e);let l=b.worktrees??new ac.ND,m=(0,g.X$)(f.agent),n=(0,B.m)(m,e),o=(0,A.mt)(e),p=j.maxJobMinutes??o.maxJobMinutes,q=6e4*p,s=j.maxJobCostUsd??o.maxJobCostUsd,t=b.runSession??((a,b,c,d)=>(0,ad.V)(a,b,c,{db:e,provider:m,command:n,timeoutMs:q,costCapUsd:s,bypassPermissions:d})),u=b.consumeQuestions??bL,v=b.consumeReleaseMetadata??bP;("detected"===k.status||"error"===k.status)&&(0,aw.Cq)(k.id,"evaluating",{},e);let w=b=>{let c=(0,aw.Oe)(a,e),d=c?.status??"evaluating";("evaluating"===d||"proposed"===d||"publishing"===d)&&(0,aw.Cq)(k.id,"error",{errorMessage:b.slice(0,500)},e)};try{var x,y;d=await l.prepare(j,f.id,0,"release"),(0,C.yM)(f.id,"worktree",{path:d.path,branch:d.branch},e);let a=(0,aX.Xm)((0,aX.yx)(j.id,aW._.release,e),{REPO_NAME:j.name,BRANCH:d.branch,DEFAULT_BRANCH:j.defaultBranch}),b=await t((0,C.ax)(f.id,e),a,d.path,!0),g=(0,C.ax)(f.id,e);if("aborted"===g.status)return w("release aborted"),g;if("interrupted"===g.status)return g;let h=(x=b,y={provider:m.label,maxJobMinutes:p,maxJobCostUsd:s,command:n},x.timedOut?`${y.provider} timed out after ${y.maxJobMinutes} minutes`:x.costExceeded?`per-job cost limit of $${y.maxJobCostUsd} reached`:x.spawnError?`failed to start ${y.command}: ${x.spawnError.message}`:x.limit?`${y.provider} unavailable (${x.limit.kind}): ${x.limit.rawSnippet??"limit reached"}`:0!==x.exitCode?`${y.provider} exited non-zero`:void 0);if(h)return w(h),(0,C.dk)(f.id,"needs_human",{errorMessage:h.slice(0,500)},e);(0,at._x)(m.id,e);let i=u(d.path);if(i)return(0,C.yM)(f.id,"status",{reason:"agent has open questions",questions:i},e),w("agent parked open questions for a human"),(0,C.dk)(f.id,"needs_human",{errorMessage:"agent has open questions",branch:d.branch},e);let o=v(d.path);(0,aw.Dg)(k.id,{tag:o?.tag??null,title:o?.title??null,notes:o?.notes??null},e);let q=(0,C.dk)(f.id,"released",{branch:d.branch},e);return await c("release_published",`🚀 Release done: ${j.name}${o?.tag?` (${o.tag})`:""}.`),q}catch(c){let a=c instanceof Error?c.message:String(c);(0,C.yM)(f.id,"error",{message:a},e),w(a);let b=(0,C.ax)(f.id,e);if("working"===b.status)return(0,C.dk)(f.id,"needs_human",{errorMessage:a.slice(0,500)},e);return b}finally{if(d)try{await l.remove(d,j.path)}catch(a){(0,r.v)(`[release-job] worktree cleanup failed for job ${f.id}`,a)}}}async function bR(a,b,c,d=(0,h.Lf)(),e={}){for(let f of c)try{let c=await b.viewIssue(f.number),g=await aV(a,{number:c.number,title:c.title,body:c.body},d,{generate:e.generate});if(!g.skipped&&g.subtasks.length>=2){let a=aS(g.subtasks.map(a=>({title:a.title,status:a.status})));await b.commentIssue(c.number,`Drydock decomposed this issue into subtasks and will work them in order:
|
|
9
12
|
|
|
10
|
-
${a}`)}}catch(b){if(b instanceof
|
|
11
|
-
… (truncated)`:a}function
|
|
13
|
+
${a}`)}}catch(b){if(b instanceof at.vu)throw b;(0,r.v)(`[subtasks] decomposition failed for ${a.name}#${f.number}`,b)}}function bS(a,b,c=(0,h.Lf)()){for(let d of aT(a,b,c))"pending"===d.status&&aU(d.id,"in_progress",c)}function bT(a,b,c=(0,h.Lf)()){for(let d of aT(a,b,c))"in_progress"===d.status&&(aU(d.id,"deferred",c),aU(d.id,"pending",c))}async function bU(a){let b,{job:c,prNumber:d,repo:e,forge:f,db:g,provider:i,command:j,model:k}=a;try{let m=await f.prDiff(d);if(!m.trim())return null;let n=await f.viewIssue(c.issueNumber),o=aT(e.id,c.issueNumber,g),p={issueNumber:c.issueNumber,issueTitle:n.title,issueBody:n.body,subtasks:o.map(a=>({ordinal:a.ordinal,title:a.title})),diff:m},q=a.generate;if(!q){var l;let c;b=await (0,ax.mkdtemp)((0,ah.join)((0,ay.tmpdir)(),"drydock-verify-")),c=(l={provider:i,command:j,model:k,cwd:b,repoId:e.id,db:g,runner:a.runner}).timeoutMs??18e4,q=async a=>{try{var b;let d,e,f,{text:g,exitCode:h}=await aD({provider:l.provider,command:l.command,model:l.model,cwd:l.cwd,prompt:(d=bt(a.issueBody.trim(),6e3),e=bt(a.diff.trim(),24e3),["You are performing a READ-ONLY verification pass. Do NOT edit files, run\ncommands, or make any changes. Given a GitHub issue, its subtasks, and the\ndiff of a pull request that claims to address it, judge whether the diff\nactually satisfies each subtask (or, if there are none, the issue overall).\n",`## Issue #${a.issueNumber}: ${a.issueTitle}`,"",d,"\n## Subtasks\n",0===(b=a.subtasks).length?"This issue has no tracked subtasks; verify the issue as a whole.":b.map(a=>`- [ordinal ${a.ordinal}] ${a.title}`).join("\n"),"\n## Pull request diff\n\n```diff",e,'```\n\n## Response format\n\nRespond with ONLY a JSON object (no prose, no code fences) of the shape:\n\n{"summary": "<one or two sentence overall assessment>",\n "verdicts": [{"ordinal": <number>, "status": "done"|"pending"|"deferred",\n "reason": "<short justification>"}]}\n\nInclude one verdict per subtask ordinal above. If there are no subtasks,\nreturn a single verdict with ordinal 0 for the issue as a whole. Use\n"done" when the diff fully satisfies it, "pending" when it is unmet or only\npartially addressed, and "deferred" when it is intentionally out of scope.'].join("\n")),repoId:l.repoId,type:"verify",timeoutMs:c,runner:l.runner,db:l.db});if(0!==h)return null;let i=g.match(/\{[\s\S]*\}/);if(!i)return null;try{f=JSON.parse(i[0])}catch{return null}let j=bv.safeParse(f);return j.success?j.data:null}catch{return null}}}let r=await q(p);if(!r)return(0,C.yM)(c.id,"verification",{ok:!1},g),null;let s=function(a,b,c,d=(0,h.Lf)()){let e=new Map(aT(a,b,d).map(a=>[a.ordinal,a])),f=0,g=0,i=[];for(let a of c.verdicts){let b=e.get(a.ordinal);if(b)if("done"===a.status)!function(a,b){let c=a.status;if("done"!==c&&"skipped"!==c)try{if("in_progress"===c)return void aU(a.id,"done",b);aU(a.id,"in_progress",b),aU(a.id,"done",b)}catch{}}(b,d),f+=1;else if("deferred"===a.status)try{aU(b.id,"deferred",d),g+=1}catch{}else i.push(b.title)}return{done:f,deferred:g,pendingTitles:i}}(e.id,c.issueNumber,r,g);return await f.commentIssue(c.issueNumber,(0,V.f)(function(a,b){let c=[`🔎 Drydock post-PR verification`,""];if(a.summary.trim()&&c.push(a.summary.trim(),""),b.pendingTitles.length>0)for(let a of(c.push("Subtasks still pending:"),b.pendingTitles))c.push(`- ${a}`);else c.push("All tracked subtasks appear satisfied by the diff.");return c.join("\n")}(r,s))),(0,C.yM)(c.id,"verification",{ok:!0,summary:r.summary,done:s.done,deferred:s.deferred,pending:s.pendingTitles.length},g),r}catch(a){return(0,r.v)(`[verify] verification pass failed for ${e.name}#${c.issueNumber}`,a),null}finally{if(b)try{await (0,ax.rm)(b,{recursive:!0,force:!0})}catch{}}}function bV(a,b){return a.length>b?`${a.slice(0,b)}
|
|
14
|
+
… (truncated)`:a}async function bW(a,b,c,d){if(0===a.length)return[];let e=new Map(d.select().from(j.followupIssues).where((0,f.eq)(j.followupIssues.jobId,b)).all().map(a=>[a.title,a.ghIssueNumber])),g=[];for(let{title:f,body:h}of a){let a,i=e.get(f);if(void 0!==i){g.push(i);continue}try{a=await c(f,h)}catch(a){(0,r.v)(`[run-job] follow-up issue filing failed for job ${b}: ${f}`,a);continue}g.push(a),e.set(f,a);try{d.insert(j.followupIssues).values({jobId:b,ghIssueNumber:a,title:f}).run()}catch(c){(0,r.v)(`[run-job] follow-up issue recording failed for job ${b}: #${a}`,c)}}return g}function bX(a,b){let[c,d]="codex"===b?["OpenAI","Codex"]:"openrouter"===b?["OpenRouter","OpenRouter"]:["Anthropic","Claude"];switch(a){case"rate_limit":return`${c} API rate limit hit — waiting for the window to clear`;case"overloaded":return`${c} API overloaded — waiting before retrying`;default:return`${d} usage limit reached — waiting for the quota to reset`}}async function bY(a,b={}){let c=b.db??(0,h.Lf)(),d=b.notify??((a,b)=>(0,av.JD)(a,b,c)),e=(0,C.ax)(a,c);if(e?.kind==="release")return bQ(a,{db:c},d);let f=await bZ(a,b,d);if("merged"===f.status)await d("pr_merged",`✅ Merged: ${f.repoId}#${f.issueNumber} (PR #${f.prNumber}).`);else if("needs_human"===f.status){let a=b.announceNeedsHuman??(a=>H(a,{db:c}));await a(f),await d("needs_human",`⚠️ Needs human: ${f.repoId}#${f.issueNumber} — ${f.errorMessage??"review required"}.`)}else"aborted"===f.status&&await d("job_failed",`🛑 Aborted: ${f.repoId}#${f.issueNumber} — ${f.errorMessage??"job aborted"}.`);return f}async function bZ(a,b,c){let d,e=b.db??(0,h.Lf)(),l=(0,C.ax)(a,e);if(!l)throw Error(`job ${a} not found`);let m=(0,i.L8)(l.repoId,e);if(!m)throw Error(`repo ${l.repoId} not found`);"queued"===l.status&&(0,C.dk)(l.id,"working",{},e);let n=b.worktrees??new ac.ND,o=(0,k.Ie)(m),p=(0,g.X$)(l.agent),s=(0,B.m)(p,e),t=(0,A.mt)(e),u=m.maxJobMinutes??t.maxJobMinutes,v=6e4*u,w=(m.maxCiWaitMinutes??t.maxCiWaitMinutes)*6e4,x=m.maxJobCostUsd??t.maxJobCostUsd,y={mode:"docker"===m.sandbox?"docker":"none",imageOverride:aY(m.sandboxImage),defaultImage:t.sandboxDefaultImage,allowNetwork:!!m.sandboxAllowNetwork,cpus:aY(m.sandboxCpus),memory:aY(m.sandboxMemory)},z="docker"===y.mode&&"http"!==p.kind,D=b.prepareSandbox??a0,E={command:s},F=b.runSession??((a,b,c)=>(0,ad.V)(a,b,c,{db:e,provider:p,command:E.command,runner:E.runner,timeoutMs:v,costCapUsd:x})),G=b.createPr??(a=>o.createPr(a)),H=b.runPlan??((a,b,c)=>aD({provider:p,command:s,model:a.model??m.defaultModel,cwd:c,prompt:b,repoId:m.id,type:"plan",timeoutMs:v,db:e}).then(a=>({text:a.text,exitCode:a.exitCode}))),J=b.commentIssue??((a,b)=>o.commentIssue(a,b)),K=b.createIssue??((a,b)=>o.createIssue(a,b)),L=b.viewIssue??(a=>o.viewIssue(a).then(a=>({title:a.title,body:a.body}))),M=b.consumePrMetadata??bI,N=b.consumeQuestions??bL,O=b.consumeFollowups??bs,P=b.markNeedsHuman??(a=>(0,q.$l)(m.id,a,e)),Q=(a,b,c)=>{if(!a.sessionId)throw Error(`job ${a.id} has no session id to resume`);return(0,ad.n)(a,a.sessionId,"",c,{db:e,provider:p,command:E.command,runner:E.runner,timeoutMs:v,costCapUsd:x,resumePrompt:b,resumeModel:a.model??m.defaultModel,resumeMaxTurns:a.maxTurns})},R=b.resumeLimitSession??Q,S=b.resumeInstructionSession??Q,T=async a=>{let b=a.latched?a.resetAt??Math.floor(Date.now()/1e3)+60:(0,at.H_)(a,e).latch.blockedUntil;(0,C.yM)(l.id,"status",{reason:`${a.agent}_${a.kind}`,blockedUntil:b,snippet:a.rawSnippet},e),m.autoDecompose&&bT(m.id,l.issueNumber,e);let c=(0,C.dk)(l.id,"waiting_limit",{errorMessage:bX(a.kind,a.agent),availableAt:b,limitKind:a.kind},e);try{let c=new Date(1e3*b).toISOString().slice(0,16).replace("T"," ");await J(l.issueNumber,`⏳ Drydock paused this job: ${bX(a.kind,a.agent)}. It will retry automatically (next attempt around ${c} UTC).`)}catch(a){(0,r.v)(`[run-job] limit-park comment failed for job ${l.id}`,a)}return c},U=!1,V=async()=>{if(d)try{if(!await n.commitAndPushForHuman(d,`wip: park #${l.issueNumber} for human review`))return;return U=!0,d.branch}catch(a){(0,r.v)(`[run-job] failed to push preserved worktree for job ${l.id}`,a),U=!0;return}},W=async a=>{m.autoDecompose&&bT(m.id,l.issueNumber,e);let b=await V(),c={errorMessage:a.slice(0,500)};return b&&(c.branch=b),(0,C.dk)(l.id,"needs_human",c,e)},X=b.runBabysitter??((a,b)=>{var c;return bo(a,b,{gh:o,db:e,ciWaitMs:w,mergeGateMs:6e4*m.mergeGateMinutes,mergeWithoutChecks:m.mergeWithoutChecks,sleep:(0,bJ.rN)({repoId:m.id,prNumber:b,onNudge:a=>(0,C.yM)(l.id,"status",{reason:`woken by webhook: ${a}`,prNumber:b},e)}),resumeSession:(c={worktrees:n,worktree:()=>d,settled:()=>{let a=(0,C.ax)(l.id,e);return!a||"aborted"===a.status||"interrupted"===a.status},resume:(a,b,c,d)=>(0,ad.n)(a,b,c,d,{db:e,provider:p,command:E.command,runner:E.runner,timeoutMs:v,costCapUsd:x})},async(a,b,d)=>{let e=c.worktree();if(!e)throw Error(`job ${a.id} has no live worktree to resume in`);let f=await c.resume(a,b,d,e.path),g={exitCode:f.exitCode,timedOut:f.timedOut,costExceeded:f.costExceeded,spawnError:f.spawnError,limit:f.limit};if(bf(g))return g;if(c.settled?.())return{...g,settledExternally:!0};try{await c.worktrees.commitAndPush(e,`Fix CI for #${a.issueNumber}`)}catch(a){if(a instanceof ac.RD)return{...g,noChanges:!0};throw a}return g}),autoHeal:m.autoHealCi?{headSha:a=>o.prHeadSha(a),provider:m.platform}:void 0})}),Y=b.verify??((a,b)=>bU({job:a,prNumber:b,repo:m,forge:o,db:e,provider:p,command:s,model:a.model??m.defaultModel}).then(()=>void 0)),Z=b.audit??((a,b)=>bG({job:a,prNumber:b,repo:m,forge:o,db:e}).then(()=>void 0));try{let a,b=l.humanInstruction,g=!!b&&!!l.sessionId&&p.supportsResume;if(d=b&&l.branch?await n.prepareResume(m,l.id,l.branch):await n.prepare(m,l.id,l.issueNumber),(0,C.yM)(l.id,"worktree",{path:d.path,branch:d.branch},e),z){let a=await D({config:y,worktreePath:d.path,jobId:l.id,agent:p.id,inContainerCommand:p.defaultCommand,preferredRuntime:t.containerRuntime});if(!a.ok)return await W(`Sandbox preflight failed: ${a.reason}`);E.runner=a.session.runner,E.command=a.session.command,(0,C.yM)(l.id,"status",{reason:`sandboxed execution (${y.mode})`},e)}let i=!!l.limitKind&&!!l.sessionId&&p.supportsResume;l.humanInstruction&&e.update(j.jobs).set({humanInstruction:null}).where((0,f.eq)(j.jobs.id,l.id)).run(),l.limitKind&&e.update(j.jobs).set({limitKind:null}).where((0,f.eq)(j.jobs.id,l.id)).run();let k=async a=>{var c,d;let g,h,i=(0,aX.XZ)(m.id,aW._.main,e);e.update(j.jobs).set({implementPromptVersion:i.version}).where((0,f.eq)(j.jobs.id,l.id)).run();let k={title:"",body:""};try{k=await L(l.issueNumber)}catch(a){(0,r.v)(`[run-job] failed to fetch issue #${l.issueNumber} for job ${l.id}`,a)}let n=bV(k.title,500),o=bV(k.body,2e4),p=(0,aX.Xm)(i.content,{ISSUE_NUM:l.issueNumber,BRANCH:a.branch,REPO_NAME:m.name,ISSUE_TITLE:n,ISSUE_BODY:o,PR_FORMAT:(0,aX.yx)(m.id,aW._.prFormat,e)});if(m.autoDecompose){let a=aT(m.id,l.issueNumber,e);a.length>0&&(p+=(c=a.map(a=>({title:a.title,status:a.status})),0===c.length?"":["\n\n## Subtasks\n\nThis issue has been broken into the ordered subtasks below. Work through them\nin order, top to bottom, as part of this single change:\n",aS(c)].join("\n")),bS(m.id,l.issueNumber,e))}if(p+=(d=m.agentInstructions,(g=d?.trim())?["\n\n## Repository-specific agent instructions\n\nThe operator of this repository has provided the following instructions. Follow them\nin addition to the task above, unless they conflict with explicit safety constraints:\n",g.slice(0,4e3)].join("\n"):""),b&&(p+=(h=b.trim())?["\n\n## Human guidance\nA human reviewed where this job got stuck and gave the following instruction.\nFollow it to get unblocked:\n",bV(h,4e3)].join("\n"):""),m.planFirst){let b=(0,aX.Xm)((0,aX.yx)(m.id,aW._.plan,e),{ISSUE_NUM:l.issueNumber,BRANCH:a.branch,REPO_NAME:m.name,ISSUE_TITLE:n,ISSUE_BODY:o});try{let c=await H((0,C.ax)(l.id,e),b,a.path),d=c.text.trim();if(0===c.exitCode&&d.length>0){let a;(0,C.yM)(l.id,"status",{reason:"plan stage complete"},e),p+=(a=d.trim())?["\n\n## Implementation plan\nFollow this plan unless the code contradicts it:\n",a.length>1e4?`${a.slice(0,1e4)}
|
|
12
15
|
… (truncated)`:a].join("\n"):"";try{await J(l.issueNumber,`**Implementation plan** (job ${l.id}):
|
|
13
16
|
|
|
14
|
-
${d}`)}catch(a){(0,r.v)(`[run-job] plan comment failed for job ${l.id}`,a)}}else(0,C.yM)(l.id,"status",{reason:"plan stage failed, continuing without a plan",exitCode:c.exitCode},e)}catch(a){(0,r.v)(`[run-job] plan stage failed for job ${l.id}`,a),(0,C.yM)(l.id,"status",{reason:"plan stage failed, continuing without a plan"},e)}}return
|
|
17
|
+
${d}`)}catch(a){(0,r.v)(`[run-job] plan comment failed for job ${l.id}`,a)}}else(0,C.yM)(l.id,"status",{reason:"plan stage failed, continuing without a plan",exitCode:c.exitCode},e)}catch(a){(0,r.v)(`[run-job] plan stage failed for job ${l.id}`,a),(0,C.yM)(l.id,"status",{reason:"plan stage failed, continuing without a plan"},e)}}return F((0,C.ax)(l.id,e),p,a.path)};if(g){(0,C.yM)(l.id,"status",{reason:"resuming session with human instruction",sessionId:l.sessionId},e),m.autoDecompose&&bS(m.id,l.issueNumber,e);let c=(0,aX.Xm)((0,aX.yx)(m.id,aW._.humanResume,e),{ISSUE_NUM:l.issueNumber,BRANCH:d.branch,REPO_NAME:m.name,INSTRUCTION:bV(b,4e3),PR_FORMAT:(0,aX.yx)(m.id,aW._.prFormat,e)});a=await S((0,C.ax)(l.id,e),c,d.path)}else if(i){(0,C.yM)(l.id,"status",{reason:"resuming session after provider limit",sessionId:l.sessionId},e),m.autoDecompose&&bS(m.id,l.issueNumber,e);let b=(0,aX.Xm)((0,aX.yx)(m.id,aW._.limitResume,e),{ISSUE_NUM:l.issueNumber,BRANCH:d.branch,REPO_NAME:m.name,PR_FORMAT:(0,aX.yx)(m.id,aW._.prFormat,e)});a=await R((0,C.ax)(l.id,e),b,d.path)}else a=await k(d);let o=(0,C.ax)(l.id,e);if("aborted"===o.status||"interrupted"===o.status)return m.autoDecompose&&bT(m.id,l.issueNumber,e),o;if(a.timedOut)return await W(`${p.label} timed out after ${u} minutes`);if(a.costExceeded)return await W(`per-job cost limit of $${x} reached`);if(a.spawnError)return await W(`failed to start ${s}: ${a.spawnError.message}`);if(a.limit){let b=a.limit;if("auth"===b.kind||"billing"===b.kind){let a="auth"===b.kind?"authentication":"billing";return await W(`${p.label} ${a} error: ${b.rawSnippet}`)}if(!(0,at.$q)(p.id,e))return await W(`${bX(b.kind,b.agent)} (auto-wait is disabled)`);return await T(b)}if(0!==a.exitCode)return await W(`${p.label} exited non-zero`);(0,at._x)(p.id,e);let v=O(d.path),w=N(d.path);if(w){m.autoDecompose&&bT(m.id,l.issueNumber,e);try{await n.commitAndPush(d,`Partial work for #${l.issueNumber} (parked for review)`)}catch(a){if(!(a instanceof ac.RD))throw a}try{await J(l.issueNumber,`🙋 Drydock needs a human decision before continuing on #${l.issueNumber}:
|
|
15
18
|
|
|
16
|
-
${w}`:w,B=await H({head:d.branch,base:m.defaultBranch,title:v,body:A});if((0,C.dk)(l.id,"ci_running",{branch:d.branch,prNumber:B},e),await c("pr_opened",`🔀 PR opened: ${m.id}#${l.issueNumber} (PR #${B}).`),m.verifyPr)try{await P((0,C.ax)(l.id,e),B)}catch(b){let a=b instanceof Error?b.message:String(b);(0,C.yM)(l.id,"error",{message:`verification pass failed: ${a}`},e)}if(m.autoPrAudit)try{await Q((0,C.ax)(l.id,e),B)}catch(b){let a=b instanceof Error?b.message:String(b);(0,C.yM)(l.id,"error",{message:`pr audit failed: ${a}`},e)}let D=await O((0,C.ax)(l.id,e),B);return m.autoDecompose&&("merged"===D.status?!function(a,b,c=(0,h.Lf)()){for(let d of aO(a,b,c))!function(a,b){let c=a.status;if("done"!==c&&"skipped"!==c){if("in_progress"===c)return aP(a.id,"done",b);aP(a.id,"in_progress",b),aP(a.id,"done",b)}}(d,c)}(m.id,l.issueNumber,e):bE(m.id,l.issueNumber,e)),D}catch(c){let a=c instanceof Error?c.message:String(c);(0,C.yM)(l.id,"error",{message:a},e);let b=(0,C.ax)(l.id,e);if(["working","ci_running","ci_failed","retrying"].includes(b.status)){m.autoDecompose&&bE(m.id,l.issueNumber,e);try{return(0,C.dk)(l.id,"needs_human",{errorMessage:a.slice(0,500)},e)}catch(a){if(!(a instanceof D.xh))throw a;return(0,r.v)(`[run-job] job ${l.id} settled concurrently during failure handling`,a),(0,C.ax)(l.id,e)}}return b}finally{if(d)try{await n.remove(d,m.path)}catch(a){(0,r.v)(`[run-job] worktree cleanup failed for job ${l.id}`,a)}}}var bK=c(35494),bL=c(96356);let bM={active:!1},bN={active:!1},bO={claude:{active:!1},codex:{active:!1},openrouter:{active:!1}};function bP(a,b,c,d,e={}){var f;let i=(0,g.X$)(a.agent),j=(f={provider:i,command:(0,B.m)(i,d),model:a.defaultModel,cwd:a.path,db:d,runner:e.runner},async a=>{let{text:b,exitCode:c,stderr:d}=await ay({provider:f.provider,command:f.command,model:f.model,cwd:f.cwd,prompt:["Break the following GitHub issue into an ordered list of independent subtasks\nthat can each be implemented and reviewed on their own.\n",`Title: ${a.title}`,"",a.body.trim(),"\nRespond with ONLY a JSON array of short subtask title strings, in the order\nthey should be done. If the issue is a single coherent task that should not\nbe split, respond with an empty array []."].join("\n"),repoId:f.repoId,type:"decompose",runner:f.runner,db:f.db});if(0!==c){let a=f.provider.classifyFailure?.({exitCode:c,stderr:d,resultText:b});if(a&&aY.includes(a.kind)){let b=f.db??(0,h.Lf)();if((0,ao.$q)(f.provider.id,b))throw(0,ao.H_)(a,b),new ao.vu(a)}return[]}let e=b.match(/\[[\s\S]*\]/);if(!e)return[];try{let a=JSON.parse(e[0]);if(!Array.isArray(a))return[];return a.filter(a=>"string"==typeof a).map(a=>a.trim()).filter(Boolean)}catch{return[]}});return bC(a,b,c,d,{generate:j})}let bQ=["needs_human","aborted"];async function bR(a,b,c,d,e,g){var h,i;let k=e.some(a=>b.readyLabels.includes(a)),l=e.some(a=>b.blockingLabels.includes(a));return!!k&&!l&&!!(0,s.i)(b,d.authorAssociation)&&(h=a.id,i=d.number,!(g.select().from(j.jobs).where((0,f.Uo)((0,f.eq)(j.jobs.repoId,h),(0,f.eq)(j.jobs.issueNumber,i),(0,f.RV)(j.jobs.status,[...bQ]))).all().length>=b.maxAttempts)||(e.includes(a.needsHumanLabel)||(await c.ensureLabel(a.needsHumanLabel,{color:"d73a4a",description:"Drydock gave up after repeated failures; needs a human"}),await c.addLabels(d.number,[a.needsHumanLabel])),!1))}let bS=D.RH.filter(a=>!D.kl.includes(a)),bT=["working","ci_running","ci_failed","retrying","waiting_limit"];async function bU(a,b,c,d){let e="codex"===a?"Codex capacity":"openrouter"===a?"OpenRouter window":"Claude quota";for(let f of(0,C.i1)(["waiting_limit"],d).filter(b=>b.agent===a)){try{(0,C.dk)(f.id,"queued",{availableAt:null,errorMessage:null},d),(0,C.yM)(f.id,"status",{reason:`${a}_limit_cleared`},d)}catch(a){(0,r.v)(`[driver] limit requeue failed for job ${f.id}`,a);continue}let g=b.find(a=>a.id===f.repoId);if(g)try{let a=c.forgeFor?.(g)??(0,k.Ie)(g);await a.commentIssue(f.issueNumber,`▶️ ${e} available again — resuming job #${f.id}.`)}catch(a){(0,r.v)(`[driver] limit-resume comment failed for job ${f.id}`,a)}}}async function bV(a={}){let b=a.db??(0,h.Lf)(),c=a.runJob??bI,e=(0,i.uP)(b),n=a.triage??w,o=a.decompose??bP;for(let c of e)try{await (0,l.v)("low",async()=>{let d=a.forgeFor?.(c)??(0,k.Ie)(c),e=a.fetchIssues??(async(a,b)=>(await d.refreshRateLimit?.(),d.listAllIssues())),g=await e(c.path,c.queueLabel);(0,q.VK)(c.id,g,b);let h=b.select().from(j.issues).where((0,f.eq)(j.issues.repoId,c.id)).all(),i=new Map(h.map(a=>[a.number,a])),l=(0,s.A)(c);if(l.autoTriageEnabled&&await n(c,d,g,b),l.autoDecompose&&!(0,ao.nc)(c.agent,b)){let a=g.filter(a=>{let b=a.labels.map(a=>a.name);return b.includes(c.queueLabel)||b.some(a=>l.readyLabels.includes(a))});if(a.length>0)try{await o(c,d,a,b)}catch(a){(0,r.v)(`[driver] decomposition sweep failed for ${c.name}`,a)}}for(let a of g){var m,t;let e=a.labels.map(a=>a.name),g=e.includes(c.queueLabel),h=!!l.autoProcessEnabled&&await bR(c,l,d,a,e,b);if(!g&&!h)continue;let k=p({number:a.number,title:a.title,labels:e});if("approved"!==k.decision||function(a,b,c){return(0,C.i1)([...bS],a).some(a=>a.repoId===b&&a.issueNumber===c)}(b,c.id,a.number))continue;h&&a.author&&l.priorityAuthors.includes(a.author)&&(m=c.id,t=a.number,b.update(j.issues).set({priority:-1}).where((0,f.Uo)((0,f.eq)(j.issues.repoId,m),(0,f.eq)(j.issues.number,t))).run());let n=i.get(a.number);(0,ap.Ix)({repoId:c.id,issueNumber:a.number,model:n?.modelOverride??c.defaultModel,agent:n?.agentOverride??c.agent},b)}})}catch(a){a instanceof m.OE?console.debug(`[driver] ${c.name} sweep yielded: ${a.message}`):(0,r.v)(`[driver] issue sync failed for ${c.name}`,a)}(0,x.PH)("cost_limit"===(0,A.Jf)(b).reason,bM,b),(0,x.mW)((0,L.DB)(b),bN,b);try{if(function(a=Date.now()){return!X&&(void 0===d||a-d>=9e5)}()){let c=a.credentialProbe??(a=>Y({db:a}));Promise.resolve(c(b)).catch(a=>(0,r.v)("[driver] credential probe round failed",a))}}catch(a){(0,r.v)("[driver] credential watchdog sweep failed",a)}(0,ap.pp)({expiredBefore:Math.floor(Date.now()/1e3)},b);try{let a=(0,bL.reconcileExternalAborts)(b);a.length>0&&console.log(`[driver] aborted ${a.length} externally-aborted job(s)`)}catch(a){(0,r.v)("[driver] external-abort reconcile failed",a)}let t=[];for(let c of g.FD){let d=(0,ao.nc)(c,b);if((0,x.RQ)(c,!!d,bO[c],b),d){t.push(c);continue}try{await bU(c,e,a,b)}catch(a){(0,r.v)(`[driver] ${c} limit-parked job resume sweep failed`,a)}}let u=t.length>0?t:void 0,v=(0,A.mt)(b).maxParallelJobs,z=(0,ap._$)();for(;!(0,bK.jQ)()&&(0,A.Jf)(b).allowed&&(0,bK.JY)()<v;){let a=e.filter(a=>(0,A.DA)(a.id,b).allowed).filter(a=>!(a.sequential&&function(a,b){return(0,C.i1)([...bT],a).some(a=>a.repoId===b)}(b,a.id))).map(a=>a.id);if(0===a.length)break;let d=(0,ap.Ym)({repoIds:a,worker:z,leaseMs:ap.sV,excludeAgents:u},b);if(!d)break;let f=d.id,g=d.leaseToken;(0,bK.Pn)(f);let h=setInterval(()=>{try{(0,ap.jQ)(f,g,{},b)}catch(a){(0,r.v)(`[driver] heartbeat failed for job ${f}`,a)}},ap.m);h.unref?.(),c(f).catch(a=>(0,r.v)(`[driver] job ${f} failed`,a)).finally(()=>{clearInterval(h),(0,ap.wL)(f,g,b),(0,bK.i2)(f)})}let B=a.reviewFeedback??(a=>(0,aF.L4)({db:a}));try{await (0,l.v)("low",()=>B(b))}catch(a){(0,r.v)("[driver] review-feedback sweep failed",a)}let D=a.deploymentHealing??(a=>ak({db:a}));try{await (0,l.v)("low",()=>D(b))}catch(a){(0,r.v)("[driver] deployment-healing sweep failed",a)}let E=a.releaseManagement??(a=>aC({db:a}));try{await (0,l.v)("low",()=>E(b))}catch(a){(0,r.v)("[driver] release-management sweep failed",a)}let F=a.branchJanitor??(a=>K({db:a}));try{await (0,l.v)("low",()=>F(b))}catch(a){(0,r.v)("[driver] branch-janitor sweep failed",a)}try{let c=(0,A.mt)(b);if(c.openrouterEnabled&&(0,y.Mf)({db:b,refreshHours:c.openrouterCatalogRefreshHours})){let c=a.openrouterCatalogSync??bX;Promise.resolve(c(b)).catch(a=>(0,r.v)("[driver] openrouter catalog sync failed",a))}}catch(a){(0,r.v)("[driver] openrouter catalog sweep failed",a)}}let bW=!1;async function bX(a){if(!bW){bW=!0;try{let b=(0,A.mt)(a);await (0,y.yd)({db:a,apiKey:(0,z.t)(b)||void 0})}finally{bW=!1}}}let bY=!1,bZ=!1,b$=null,b_=null;function b0(){return{running:bY,lastTickAt:b$,intervalMs:b_}}function b1(a={}){if(bY)return;bY=!0;let b=a.tick??(()=>bV()),c=a.intervalMs??1e3*(0,A.mt)().pollIntervalSec;b_=c;let d=async()=>{if(bY){if(!bZ){bZ=!0,b$=Date.now();try{await b()}catch(a){(0,r.v)("[driver] tick failed",a)}finally{bZ=!1}}bY&&(e=setTimeout(d,c))}};d()}function b2(){bY=!1,e&&clearTimeout(e),e=void 0}},48036:(a,b,c)=>{c.d(b,{Pe:()=>g,dj:()=>h});var d=c(97496),e=c(2025),f=c(64537);function g(a,b=(0,e.Lf)(),c){let h=[];return a&&h.push((0,d.eq)(f.adrs.status,a)),void 0!==c&&h.push((0,d.eq)(f.adrs.repoId,c)),(h.length?b.select().from(f.adrs).where((0,d.Uo)(...h)).all():b.select().from(f.adrs).all()).sort((a,b)=>b.createdAt-a.createdAt)}function h(a=(0,e.Lf)()){return a.select().from(f.adrs).where((0,d.eq)(f.adrs.status,"pending_review")).all().length}},48733:(a,b,c)=>{let d;c.d(b,{k:()=>k});var e=c(97496),f=c(14694),g=c(2025),h=c(64537),i=c(14543);class j{constructor(a=(0,g.Lf)()){this.db=a,this.subs=new Map}subscribe(a,b){let c=this.subs.get(a);c||(c=new Set,this.subs.set(a,c)),c.add(b)}unsubscribe(a,b){let c=this.subs.get(a);c&&(c.delete(b),0===c.size&&this.subs.delete(a))}subscriberCount(a){return this.subs.get(a)?.size??0}publish(a,b){let c,d=(0,i.f)(JSON.stringify(b.payload??{}));try{c=JSON.parse(d)}catch{c={error:"unparseable event payload"}}let e=this.db.insert(h.jobEvents).values({jobId:a,type:b.type,payload:d}).returning().get(),f=this.subs.get(a);if(f)for(let b of[...f])try{b.send({id:e.id,type:e.type,payload:c})}catch{this.unsubscribe(a,b)}return e}replay(a,b=200,c){return void 0!==c?this.db.select().from(h.jobEvents).where((0,e.Uo)((0,e.eq)(h.jobEvents.jobId,a),(0,e.gt)(h.jobEvents.id,c))).orderBy(h.jobEvents.ts,h.jobEvents.id).limit(b).all():this.db.select().from(h.jobEvents).where((0,e.eq)(h.jobEvents.jobId,a)).orderBy((0,f.i)(h.jobEvents.ts),(0,f.i)(h.jobEvents.id)).limit(b).all().reverse()}}function k(){return d||(d=new j),d}},52479:(a,b,c)=>{c.d(b,{QJ:()=>h,RH:()=>d,kl:()=>f,xh:()=>g});let d=["queued","working","ci_running","ci_failed","retrying","waiting_limit","merged","needs_human","aborted","interrupted"],e={queued:["working","aborted","interrupted"],working:["ci_running","waiting_limit","needs_human","aborted","interrupted"],ci_running:["ci_failed","merged","needs_human","aborted","interrupted"],ci_failed:["retrying","needs_human","aborted","interrupted"],retrying:["ci_running","needs_human","aborted","interrupted"],waiting_limit:["queued","needs_human","aborted","interrupted"],merged:[],needs_human:["queued","aborted"],aborted:[],interrupted:["queued","aborted"]},f=["merged","aborted"];class g extends Error{constructor(a,b){super(`invalid job transition: ${a} -> ${b}`)}}function h(a,b){if(!e[a].includes(b))throw new g(a,b)}},52484:(a,b,c)=>{c.d(b,{dC:()=>f,rN:()=>e});let d=new Set;function e(a){return b=>new Promise(c=>{let e={repoId:a.repoId,prNumber:a.prNumber,wake:b=>{d.delete(e),clearTimeout(f);try{a.onNudge?.(b)}catch{}c()}},f=setTimeout(()=>{d.delete(e),c()},b);f.unref?.(),d.add(e)})}function f(a,b,c){let e=[...d].filter(c=>c.repoId===a&&(0===b.length||b.includes(c.prNumber)));for(let a of e)a.wake(c);return e.length}},52819:(a,b,c)=>{c.d(b,{CZ:()=>j,PH:()=>f,RQ:()=>h,mW:()=>i});var d=c(2025),e=c(76373);async function f(a,b,c=(0,d.Lf)(),g=e.QD){a?b.active||(b.active=!0,await (0,e.JD)("cost_limit","\uD83D\uDCB8 Daily cost limit reached — new jobs are paused until the budget resets.",c,g)):b.active=!1}let g={claude:{event:"claude_limit",blocked:"⏳ Claude usage limit reached — Claude jobs are parked until the quota resets.",cleared:"▶️ Claude quota available again — parked jobs are resuming."},codex:{event:"codex_limit",blocked:"⏳ Codex usage limit reached — Codex jobs are parked until the quota resets.",cleared:"▶️ Codex capacity available again — parked jobs are resuming."},openrouter:{event:"openrouter_limit",blocked:"⏳ OpenRouter limit reached — OpenRouter jobs are parked until the window resets.",cleared:"▶️ OpenRouter available again — parked jobs are resuming."}};async function h(a,b,c,f=(0,d.Lf)(),i=e.QD){let j=g[a];if(b){if(c.active)return;c.active=!0,await (0,e.JD)(j.event,j.blocked,f,i)}else{if(!c.active)return;c.active=!1,await (0,e.JD)(j.event,j.cleared,f,i)}}async function i(a,b,c=(0,d.Lf)(),f=e.QD){if(a.length>0){if(b.active)return;b.active=!0;let d=a.map(a=>`${a.label}: ${a.message}`).join("; ");await (0,e.JD)("auth_expired",`🔑 Credential check failed — new jobs are paused until auth is restored. ${d}`,c,f)}else{if(!b.active)return;b.active=!1,await (0,e.JD)("auth_expired","\uD83D\uDD11 Credentials restored — the queue is resuming.",c,f)}}async function j(a=(0,d.Lf)(),b=e.QD){await (0,e.JD)("automation_paused","\uD83C\uDF19 Automation draining — finishing in-flight jobs, then shutting down.",a,b)}},59144:(a,b,c)=>{c.d(b,{MQ:()=>h,kf:()=>e,mU:()=>f,rr:()=>g});let d=/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/;function e(a){let b=d.exec(a.trim());return b?{major:Number(b[1]),minor:Number(b[2]),patch:Number(b[3]),prerelease:b[4]??null}:null}function f(a,b){var c,d;let f=e(a),g=e(b);if(!f||!g)throw Error(`cannot compare versions: "${a}" vs "${b}"`);return f.major!==g.major?f.major-g.major:f.minor!==g.minor?f.minor-g.minor:f.patch!==g.patch?f.patch-g.patch:(c=f.prerelease,c===(d=g.prerelease)?0:null===c?1:null===d||c<d?-1:1)}function g(a,b){let c=e(a);if(!c)throw Error(`cannot bump unparseable version: "${a}"`);let{major:d,minor:f,patch:g}=c;return"major"===b?`${d+1}.0.0`:"minor"===b?`${d}.${f+1}.0`:`${d}.${f}.${g+1}`}function h(a,b){return!!e(a)&&!!e(b)&&f(a,b)>0}},62907:(a,b,c)=>{c.d(b,{L4:()=>F,Yr:()=>H});var d=c(20203),e=c(2025),f=c(54304),g=c(24978),h=c(1065),i=c(64417),j=c(75818),k=c(16544),l=c(41947),m=c(27630),n=c(2412),o=c(7611),p=c(97496),q=c(64537);let r=["resolved","failed","rejected","flagged"],s={pending:["queued","rejected","flagged"],queued:["in_progress","flagged","rejected"],in_progress:["resolved","failed","flagged","queued"],resolved:[],failed:[],rejected:[],flagged:[]};class t extends Error{constructor(a,b){super(`invalid feedback transition: ${a} -> ${b}`)}}function u(a){return a.toLowerCase().replace(/\[bot\]$/,"")}let v=/\b(out of scope|follow[- ]?up|separate pr|different pr|unrelated|won'?t fix|nevermind|never mind|ignore this)\b/i,w=/\b(please|change|rename|fix|add|remove|delete|use|extract|refactor|move|replace|guard|handle|update|simplify|inline|should be|consider|nit)\b/i;function x(a,b,c={},d=(0,e.Lf)()){let f=d.select().from(q.reviewFeedbackItems).where((0,p.eq)(q.reviewFeedbackItems.id,a)).get();if(!f)throw Error(`review feedback item ${a} not found`);var g=f.status;if(!s[g].includes(b))throw new t(g,b);return d.update(q.reviewFeedbackItems).set({status:b,detail:c.detail??f.detail,attempts:"in_progress"===b?f.attempts+1:f.attempts,updatedAt:Math.floor(Date.now()/1e3)}).where((0,p.eq)(q.reviewFeedbackItems.id,a)).returning().get()}let y={maxItemsPerSweep:3,maxAttemptsPerItem:2};async function z(a,b,c){var d;let e=(d=b.id,`<!-- drydock:review-feedback:${d} -->`),f=`${c}
|
|
19
|
+
${w}`)}catch(a){(0,r.v)(`[run-job] questions comment failed for job ${l.id}`,a)}try{await P(l.issueNumber)}catch(a){(0,r.v)(`[run-job] needs-human label failed for job ${l.id}`,a)}return(0,C.dk)(l.id,"needs_human",{errorMessage:"agent has open questions",branch:d.branch},e)}if(m.adrGating){let a=(0,aL.Pe)("pending_review",e,m.id);if(a.length>0)return await W(`Blocked by ${a.length} pending ADR review(s).`)}let A=M(d.path),B=A?.title??`Fix #${l.issueNumber}`;try{await n.commitAndPush(d,B)}catch(a){if(a instanceof ac.RD)return await W("Agent produced no changes");throw a}let I=A?.title??(0,q.ts)(m.id,e).find(a=>a.number===l.issueNumber)?.title??`Fix #${l.issueNumber}`,Q=await bW(v,l.id,K,e),U=`Closes #${l.issueNumber}`,V=Q.length>0?`Spun off: ${Q.map(a=>`#${a}`).join(", ")}`:"",$=[A?.body,U,V].filter(Boolean).join("\n\n"),_=await G({head:d.branch,base:m.defaultBranch,title:I,body:$});if((0,C.dk)(l.id,"ci_running",{branch:d.branch,prNumber:_},e),await c("pr_opened",`🔀 PR opened: ${m.id}#${l.issueNumber} (PR #${_}).`),m.verifyPr)try{await Y((0,C.ax)(l.id,e),_)}catch(b){let a=b instanceof Error?b.message:String(b);(0,C.yM)(l.id,"error",{message:`verification pass failed: ${a}`},e)}if(m.autoPrAudit)try{await Z((0,C.ax)(l.id,e),_)}catch(b){let a=b instanceof Error?b.message:String(b);(0,C.yM)(l.id,"error",{message:`pr audit failed: ${a}`},e)}let aa=await X((0,C.ax)(l.id,e),_);return m.autoDecompose&&("merged"===aa.status?!function(a,b,c=(0,h.Lf)()){for(let d of aT(a,b,c))!function(a,b){let c=a.status;if("done"!==c&&"skipped"!==c){if("in_progress"===c)return aU(a.id,"done",b);aU(a.id,"in_progress",b),aU(a.id,"done",b)}}(d,c)}(m.id,l.issueNumber,e):bT(m.id,l.issueNumber,e)),aa}catch(c){let a=c instanceof Error?c.message:String(c);(0,C.yM)(l.id,"error",{message:a},e);let b=(0,C.ax)(l.id,e);if(["working","ci_running","ci_failed","retrying"].includes(b.status)){m.autoDecompose&&bT(m.id,l.issueNumber,e);let b=await V();try{let c={errorMessage:a.slice(0,500)};return b&&(c.branch=b),(0,C.dk)(l.id,"needs_human",c,e)}catch(b){if(!(b instanceof I.xh))throw b;(0,r.v)(`[run-job] job ${l.id} settled concurrently during failure handling`,b);let a=(0,C.ax)(l.id,e);return"needs_human"!==a.status&&(U=!1),a}}return b}finally{if(d&&!U)try{await n.remove(d,m.path)}catch(a){(0,r.v)(`[run-job] worktree cleanup failed for job ${l.id}`,a)}}}var b$=c(35494),b_=c(96356);let b0={active:!1},b1={active:!1},b2={claude:{active:!1},codex:{active:!1},openrouter:{active:!1}};function b3(a,b,c,d,e={}){var f;let i=(0,g.X$)(a.agent),j=(f={provider:i,command:(0,B.m)(i,d),model:a.defaultModel,cwd:a.path,db:d,runner:e.runner},async a=>{let{text:b,exitCode:c,stderr:d}=await aD({provider:f.provider,command:f.command,model:f.model,cwd:f.cwd,prompt:["Break the following GitHub issue into an ordered list of independent subtasks\nthat can each be implemented and reviewed on their own.\n",`Title: ${a.title}`,"",a.body.trim(),"\nRespond with ONLY a JSON array of short subtask title strings, in the order\nthey should be done. If the issue is a single coherent task that should not\nbe split, respond with an empty array []."].join("\n"),repoId:f.repoId,type:"decompose",runner:f.runner,db:f.db});if(0!==c){let a=f.provider.classifyFailure?.({exitCode:c,stderr:d,resultText:b});if(a&&a1.includes(a.kind)){let b=f.db??(0,h.Lf)();if((0,at.$q)(f.provider.id,b))throw(0,at.H_)(a,b),new at.vu(a)}return[]}let e=b.match(/\[[\s\S]*\]/);if(!e)return[];try{let a=JSON.parse(e[0]);if(!Array.isArray(a))return[];return a.filter(a=>"string"==typeof a).map(a=>a.trim()).filter(Boolean)}catch{return[]}});return bR(a,b,c,d,{generate:j})}let b4={color:"d73a4a",description:"Drydock needs a human before automating this issue"},b5=["needs_human","aborted"];async function b6(a,b,c,d,e,g){var h,i;let k=e.some(a=>b.readyLabels.includes(a)),l=e.some(a=>b.blockingLabels.includes(a));return!!k&&!l&&!!(0,s.i)(b,d.authorAssociation)&&(h=a.id,i=d.number,!(g.select().from(j.jobs).where((0,f.Uo)((0,f.eq)(j.jobs.repoId,h),(0,f.eq)(j.jobs.issueNumber,i),(0,f.RV)(j.jobs.status,[...b5]))).all().length>=b.maxAttempts)||(e.includes(a.needsHumanLabel)||(await c.ensureLabel(a.needsHumanLabel,b4),await c.addLabels(d.number,[a.needsHumanLabel])),!1))}async function b7(a,b,c,d,e){if(d.includes(a.needsHumanLabel))return;await b.ensureLabel(a.needsHumanLabel,b4),await b.addLabels(c.number,[a.needsHumanLabel]);let f=e.length>0?e.join("; "):"flagged for human review";await b.commentIssue(c.number,`⏸️ Held for human review before automated work — ${f}. Remove the \`${a.needsHumanLabel}\` label or use "Start now" to proceed.`)}let b8=I.RH.filter(a=>!I.kl.includes(a)),b9=["working","ci_running","ci_failed","retrying","waiting_limit"];async function ca(a,b,c,d){let e="codex"===a?"Codex capacity":"openrouter"===a?"OpenRouter window":"Claude quota";for(let f of(0,C.i1)(["waiting_limit"],d).filter(b=>b.agent===a)){try{(0,C.dk)(f.id,"queued",{availableAt:null,errorMessage:null},d),(0,C.yM)(f.id,"status",{reason:`${a}_limit_cleared`},d)}catch(a){(0,r.v)(`[driver] limit requeue failed for job ${f.id}`,a);continue}let g=b.find(a=>a.id===f.repoId);if(g)try{let a=c.forgeFor?.(g)??(0,k.Ie)(g);await a.commentIssue(f.issueNumber,`▶️ ${e} available again — resuming job #${f.id}.`)}catch(a){(0,r.v)(`[driver] limit-resume comment failed for job ${f.id}`,a)}}}async function cb(a={}){let b=a.db??(0,h.Lf)(),c=a.runJob??bY,e=(0,i.uP)(b),n=a.triage??w,o=a.decompose??b3;for(let c of e)try{await (0,l.v)("low",async()=>{let d=a.forgeFor?.(c)??(0,k.Ie)(c),e=a.fetchIssues??(async(a,b)=>(await d.refreshRateLimit?.(),d.listAllIssues())),g=await e(c.path,c.queueLabel);(0,q.VK)(c.id,g,b);let h=b.select().from(j.issues).where((0,f.eq)(j.issues.repoId,c.id)).all(),i=new Map(h.map(a=>[a.number,a])),l=(0,s.A)(c);if(l.autoTriageEnabled&&await n(c,d,g,b),l.autoDecompose&&!(0,at.nc)(c.agent,b)){let a=g.filter(a=>{let b=a.labels.map(a=>a.name);return b.includes(c.queueLabel)||b.some(a=>l.readyLabels.includes(a))});if(a.length>0)try{await o(c,d,a,b)}catch(a){(0,r.v)(`[driver] decomposition sweep failed for ${c.name}`,a)}}for(let a of g){var m,t;let e=a.labels.map(a=>a.name),g=e.includes(c.queueLabel),h=!!l.autoProcessEnabled&&await b6(c,l,d,a,e,b);if(!g&&!h)continue;let k=p({number:a.number,title:a.title,labels:e});if("blocked"===k.decision)continue;if("needs_review"===k.decision&&!g){await b7(c,d,a,e,k.reasons);continue}if(function(a,b,c){return(0,C.i1)([...b8],a).some(a=>a.repoId===b&&a.issueNumber===c)}(b,c.id,a.number))continue;h&&a.author&&l.priorityAuthors.includes(a.author)&&(m=c.id,t=a.number,b.update(j.issues).set({priority:-1}).where((0,f.Uo)((0,f.eq)(j.issues.repoId,m),(0,f.eq)(j.issues.number,t))).run());let n=i.get(a.number);(0,au.Ix)({repoId:c.id,issueNumber:a.number,model:n?.modelOverride??c.defaultModel,agent:n?.agentOverride??c.agent},b)}})}catch(a){a instanceof m.OE?console.debug(`[driver] ${c.name} sweep yielded: ${a.message}`):(0,r.v)(`[driver] issue sync failed for ${c.name}`,a)}(0,x.PH)("cost_limit"===(0,A.Jf)(b).reason,b0,b),(0,x.mW)((0,Q.DB)(b),b1,b);try{if(function(a=Date.now()){return!aa&&(void 0===d||a-d>=9e5)}()){let c=a.credentialProbe??(a=>ab({db:a}));Promise.resolve(c(b)).catch(a=>(0,r.v)("[driver] credential probe round failed",a))}}catch(a){(0,r.v)("[driver] credential watchdog sweep failed",a)}(0,au.pp)({expiredBefore:Math.floor(Date.now()/1e3)},b);try{let a=(0,b_.reconcileExternalAborts)(b);a.length>0&&console.log(`[driver] aborted ${a.length} externally-aborted job(s)`)}catch(a){(0,r.v)("[driver] external-abort reconcile failed",a)}let t=[];for(let c of g.FD){let d=(0,at.nc)(c,b);if((0,x.RQ)(c,!!d,b2[c],b),d){t.push(c);continue}try{await ca(c,e,a,b)}catch(a){(0,r.v)(`[driver] ${c} limit-parked job resume sweep failed`,a)}}let u=t.length>0?t:void 0,v=(0,A.mt)(b).maxParallelJobs,z=(0,au._$)();for(;!(0,b$.jQ)()&&(0,A.Jf)(b).allowed&&(0,b$.JY)()<v;){let a=e.filter(a=>(0,A.DA)(a.id,b).allowed).filter(a=>!(a.sequential&&function(a,b){return(0,C.i1)([...b9],a).some(a=>a.repoId===b)}(b,a.id))).map(a=>a.id);if(0===a.length)break;let d=(0,au.Ym)({repoIds:a,worker:z,leaseMs:au.sV,excludeAgents:u},b);if(!d)break;let f=d.id,g=d.leaseToken;(0,b$.Pn)(f);let h=setInterval(()=>{try{(0,au.jQ)(f,g,{},b)}catch(a){(0,r.v)(`[driver] heartbeat failed for job ${f}`,a)}},au.m);h.unref?.(),c(f).catch(a=>(0,r.v)(`[driver] job ${f} failed`,a)).finally(()=>{clearInterval(h),(0,au.wL)(f,g,b),(0,b$.i2)(f)})}let B=a.reviewFeedback??(a=>(0,aK.L4)({db:a}));try{await (0,l.v)("low",()=>B(b))}catch(a){(0,r.v)("[driver] review-feedback sweep failed",a)}let D=a.deploymentHealing??(a=>ap({db:a}));try{await (0,l.v)("low",()=>D(b))}catch(a){(0,r.v)("[driver] deployment-healing sweep failed",a)}let E=a.releaseManagement??(a=>aH({db:a}));try{await (0,l.v)("low",()=>E(b))}catch(a){(0,r.v)("[driver] release-management sweep failed",a)}let F=a.branchJanitor??(a=>P({db:a}));try{await (0,l.v)("low",()=>F(b))}catch(a){(0,r.v)("[driver] branch-janitor sweep failed",a)}try{let c=(0,A.mt)(b);if(c.openrouterEnabled&&(0,y.Mf)({db:b,refreshHours:c.openrouterCatalogRefreshHours})){let c=a.openrouterCatalogSync??cd;Promise.resolve(c(b)).catch(a=>(0,r.v)("[driver] openrouter catalog sync failed",a))}}catch(a){(0,r.v)("[driver] openrouter catalog sweep failed",a)}}let cc=!1;async function cd(a){if(!cc){cc=!0;try{let b=(0,A.mt)(a);await (0,y.yd)({db:a,apiKey:(0,z.t)(b)||void 0})}finally{cc=!1}}}let ce=!1,cf=!1,cg=null,ch=null;function ci(){return{running:ce,lastTickAt:cg,intervalMs:ch}}function cj(a={}){if(ce)return;ce=!0;let b=a.tick??(()=>cb()),c=a.intervalMs??1e3*(0,A.mt)().pollIntervalSec;ch=c;let d=async()=>{if(ce){if(!cf){cf=!0,cg=Date.now();try{await b()}catch(a){(0,r.v)("[driver] tick failed",a)}finally{cf=!1}}ce&&(e=setTimeout(d,c))}};d()}function ck(){ce=!1,e&&clearTimeout(e),e=void 0}},59144:(a,b,c)=>{c.d(b,{MQ:()=>h,kf:()=>e,mU:()=>f,rr:()=>g});let d=/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/;function e(a){let b=d.exec(a.trim());return b?{major:Number(b[1]),minor:Number(b[2]),patch:Number(b[3]),prerelease:b[4]??null}:null}function f(a,b){var c,d;let f=e(a),g=e(b);if(!f||!g)throw Error(`cannot compare versions: "${a}" vs "${b}"`);return f.major!==g.major?f.major-g.major:f.minor!==g.minor?f.minor-g.minor:f.patch!==g.patch?f.patch-g.patch:(c=f.prerelease,c===(d=g.prerelease)?0:null===c?1:null===d||c<d?-1:1)}function g(a,b){let c=e(a);if(!c)throw Error(`cannot bump unparseable version: "${a}"`);let{major:d,minor:f,patch:g}=c;return"major"===b?`${d+1}.0.0`:"minor"===b?`${d}.${f+1}.0`:`${d}.${f}.${g+1}`}function h(a,b){return!!e(a)&&!!e(b)&&f(a,b)>0}},62907:(a,b,c)=>{c.d(b,{L4:()=>F,Yr:()=>H});var d=c(20203),e=c(2025),f=c(54304),g=c(24978),h=c(1065),i=c(64417),j=c(75818),k=c(16544),l=c(41947),m=c(27630),n=c(2412),o=c(7611),p=c(97496),q=c(64537);let r=["resolved","failed","rejected","flagged"],s={pending:["queued","rejected","flagged"],queued:["in_progress","flagged","rejected"],in_progress:["resolved","failed","flagged","queued"],resolved:[],failed:[],rejected:[],flagged:[]};class t extends Error{constructor(a,b){super(`invalid feedback transition: ${a} -> ${b}`)}}function u(a){return a.toLowerCase().replace(/\[bot\]$/,"")}let v=/\b(out of scope|follow[- ]?up|separate pr|different pr|unrelated|won'?t fix|nevermind|never mind|ignore this)\b/i,w=/\b(please|change|rename|fix|add|remove|delete|use|extract|refactor|move|replace|guard|handle|update|simplify|inline|should be|consider|nit)\b/i;function x(a,b,c={},d=(0,e.Lf)()){let f=d.select().from(q.reviewFeedbackItems).where((0,p.eq)(q.reviewFeedbackItems.id,a)).get();if(!f)throw Error(`review feedback item ${a} not found`);var g=f.status;if(!s[g].includes(b))throw new t(g,b);return d.update(q.reviewFeedbackItems).set({status:b,detail:c.detail??f.detail,attempts:"in_progress"===b?f.attempts+1:f.attempts,updatedAt:Math.floor(Date.now()/1e3)}).where((0,p.eq)(q.reviewFeedbackItems.id,a)).returning().get()}let y={maxItemsPerSweep:3,maxAttemptsPerItem:2};async function z(a,b,c){var d;let e=(d=b.id,`<!-- drydock:review-feedback:${d} -->`),f=`${c}
|
|
17
20
|
|
|
18
|
-
${e}`,g=b.comments.find(a=>a.body.includes(e));g?await a.updateReviewComment(g.id,f):await a.replyToReviewThread(b.id,f)}async function A(a,b,c){let d=c.db??(0,e.Lf)(),f=c.budgets??y,g={processed:0,resolved:0,flagged:0,rejected:0,failed:0,skipped:0},h=await c.forge.listReviewThreads(b),i=0;for(let k of h){var j;if(k.isResolved){g.skipped++;continue}let h=k.comments[0];if(!h||!function(a,b,c={}){let d=a.toLowerCase();if(c.isBot||d.endsWith("[bot]")){let c=u(a);return!b.ignoredBots.some(a=>u(a)===c)&&b.trustedBots.some(a=>u(a)===c)}return!b.ignoredBots.some(a=>a.toLowerCase()===d)&&b.trustedReviewers.some(a=>a.toLowerCase()===d)}(h.author,c.gate,{isBot:h.authorIsBot})){g.skipped++;continue}let l=function(a){let b=a.trim();return v.test(b)?"out_of_scope":w.test(b)?"actionable":b.includes("?")?"question":"actionable"}(h.body),m=function(a,b=(0,e.Lf)()){let c=function(a,b,c=(0,e.Lf)()){return c.select().from(q.reviewFeedbackItems).where((0,p.Uo)((0,p.eq)(q.reviewFeedbackItems.jobId,a),(0,p.eq)(q.reviewFeedbackItems.threadId,b))).get()}(a.jobId,a.threadId,b);return c||b.insert(q.reviewFeedbackItems).values({jobId:a.jobId,prNumber:a.prNumber,threadId:a.threadId,reviewer:a.reviewer,classification:a.classification}).returning().get()}({jobId:a,prNumber:b,threadId:k.id,reviewer:h.author,classification:l},d);if(j=m.status,r.includes(j)){g.skipped++;continue}if("in_progress"===m.status&&(m=x(m.id,"queued",{},d)),"pending"===m.status)try{await c.forge.reactToReviewComment(h.id,"EYES")}catch{}if("pending"===m.status){if("question"===l){m=x(m.id,"flagged",{},d),await z(c.forge,k,"Drydock: this looks like a question rather than a change request, so it's flagged for a human reviewer."),g.flagged++,g.processed++;continue}if("out_of_scope"===l){m=x(m.id,"rejected",{},d),await z(c.forge,k,"Drydock: treating this as out of scope for this PR — please open a follow-up issue if it should be tracked."),await c.forge.resolveReviewThread(k.id),g.rejected++,g.processed++;continue}m=x(m.id,"queued",{},d)}if("queued"===m.status){let a;if(i>=f.maxItemsPerSweep)continue;if(m.attempts>=f.maxAttemptsPerItem){m=x(m.id,"flagged",{},d),await z(c.forge,k,`Drydock: could not resolve this after ${m.attempts} attempt(s); flagging for a human.`),g.flagged++,g.processed++;continue}i++,m=x(m.id,"in_progress",{},d),c.includeProgressReplies&&await z(c.forge,k,"Drydock: working on this now…");try{a=await c.applyFeedback(m,k)}catch(b){a={ok:!1,detail:b instanceof Error?b.message:String(b)}}g.processed++,a.ok?(x(m.id,"resolved",{detail:a.detail},d),await z(c.forge,k,"Drydock: applied this change and pushed a commit. ✅"),await c.forge.resolveReviewThread(k.id),g.resolved++):m.attempts>=f.maxAttemptsPerItem?(x(m.id,"failed",{detail:a.detail},d),await z(c.forge,k,`Drydock: could not apply this automatically (${a.detail??"no change produced"}); flagging for a human.`),g.failed++):x(m.id,"queued",{detail:a.detail},d)}}return g}let B=new Set(["ci_running","ci_failed","retrying","needs_human"]);function C(a){return"function"==typeof a.listReviewThreads&&"function"==typeof a.replyToReviewThread&&"function"==typeof a.updateReviewComment&&"function"==typeof a.resolveReviewThread&&"function"==typeof a.reactToReviewComment}async function D(a={}){let b=a.db??(0,e.Lf)(),c=a.processJob??I;for(let d of(0,f.uP)(b))if((null==a.repoId||d.id===a.repoId)&&(0,k.A)(d).autoReviewFeedback)try{let e=a.forgeFor?.(d)??(0,g.Ie)(d);if(!C(e))continue;for(let a of(0,n.N6)(d.id,b).filter(a=>null!=a.prNumber&&B.has(a.status)&&!(0,o.nc)(a.agent,b)))try{await c(d,a,e)}catch(b){(0,j.v)(`[review-feedback] job ${a.id} failed for ${d.name}`,b)}}catch(a){(0,j.v)(`[review-feedback] sweep failed for ${d.name}`,a)}}let E=Promise.resolve();function F(a={}){let b=E.then(()=>D(a));return E=b.catch(()=>{}),b}let G=new Map;function H(a,b=2e3){let c=G.get(a);c&&clearTimeout(c);let d=setTimeout(()=>{G.delete(a),(0,i.v)("low",()=>F({repoId:a})).catch(b=>{(0,j.v)(`[webhook] review-feedback sweep failed for repo ${a}`,b)})},b);d.unref?.(),G.set(a,d)}async function I(a,b,c){var f;if(!C(c)||null==b.prNumber)return;let g=(0,e.Lf)(),i=(0,k.A)(a),n=(0,d.X$)(b.agent),o=(0,l.m)(n,g),p=(f={repo:a,job:b,worktrees:new h.ND,runSession:(a,b,c)=>(0,m.V)(a,b,c,{db:g,provider:n,command:o,sideSession:!0}).then(a=>({exitCode:a.exitCode}))},async(a,b)=>{if(!f.job.branch)return{ok:!1,detail:"job has no branch"};let c=await f.worktrees.prepareForBranch(f.repo,f.job.branch,`${f.job.id}-${b.id}`);try{let a,d,e=await f.runSession(f.job,(a=b.comments[0],d=b.path?`${b.path}${b.line?`:${b.line}`:""}`:"this PR",[`A reviewer left this comment on ${d} of the current pull request:`,"",(a?.body??"").trim(),"\nMake only the change this comment asks for. Do not address anything else.\nWhen done, ensure the working tree builds and tests pass, then stop — the\ncommit and push are handled for you."].join("\n")),c.path);if(0!==e.exitCode)return{ok:!1,detail:"agent exited non-zero"};try{await f.worktrees.commitAndPush(c,`Address review feedback on ${b.path??"PR"}`)}catch{return{ok:!1,detail:"no change produced"}}return{ok:!0}}finally{try{await f.worktrees.remove(c,f.repo.path)}catch(a){(0,j.v)(`[review-feedback] worktree cleanup failed for job ${f.job.id}`,a)}}});await A(b.id,b.prNumber,{forge:c,db:g,gate:{trustedReviewers:i.trustedReviewers,trustedBots:i.trustedBots,ignoredBots:i.ignoredBots},includeProgressReplies:i.includeProgressReplies,applyFeedback:p})}},64417:(a,b,c)=>{c.d(b,{u:()=>f,v:()=>e});let d=new(c(16698)).AsyncLocalStorage;function e(a,b){return d.run(a,b)}function f(){return d.getStore()??"high"}},70793:(a,b,c)=>{c.d(b,{T9:()=>h,U9:()=>g});var d=c(26557),e=c(27544),f=c(84232);function g(a){return(0,f.ll)`count(${a||f.ll.raw("*")})`.mapWith(Number)}function h(a){return(0,f.ll)`max(${a})`.mapWith((0,e.is)(a,d.V)?a:String)}},76373:(a,b,c)=>{c.d(b,{JD:()=>h,QD:()=>j});var d=c(2025),e=c(14543),f=c(74644);let g=[{id:"telegram",isConfigured:a=>!!(a.telegramBotToken&&a.telegramChatId),send:(a,b,c)=>c.postJson(`https://api.telegram.org/bot${b.telegramBotToken}/sendMessage`,{chat_id:b.telegramChatId,text:a})},{id:"slack",isConfigured:a=>!!a.slackWebhookUrl,send:(a,b,c)=>c.postJson(b.slackWebhookUrl,{text:a})},{id:"email",isConfigured:a=>!!(a.smtpHost&&a.emailFrom&&a.emailTo),send:(a,b,c)=>c.sendMail({to:b.emailTo,from:b.emailFrom,subject:"Drydock notification",text:a},{host:b.smtpHost,port:b.smtpPort,user:b.smtpUser,pass:b.smtpPass})}];async function h(a,b,c=(0,d.Lf)(),e=j){var k,l;let m=(0,f.mt)(c);if(!m.notifyEvents.includes(a))return;let n=g.filter(a=>a.isConfigured(m));0!==n.length&&await (k=i(n,b,m,e),l=()=>console.error(`[notify] dispatch for ${a} exceeded 5000ms; continuing in background`),new Promise(a=>{let b=setTimeout(()=>{l(),a()},5e3);b.unref?.();let c=()=>{clearTimeout(b),a()};k.then(c,c)}))}async function i(a,b,c,d){for(let f of a)try{await f.send(b,c,d)}catch(a){console.error(`[notify] ${f.id} delivery failed`,(0,e.f)(String(a)))}}let j={postJson:async(a,b)=>{let c=await fetch(a,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(b),signal:AbortSignal.timeout(1e4)});if(!c.ok)throw Error(`HTTP ${c.status}`)},sendMail:async(a,b)=>{let d=(await c.e(689).then(c.t.bind(c,93689,19))).createTransport({host:b.host,port:b.port,secure:465===b.port,auth:b.user?{user:b.user,pass:b.pass}:void 0,connectionTimeout:1e4,greetingTimeout:1e4,socketTimeout:1e4});await d.sendMail(a)}}},77597:(a,b,c)=>{c.d(b,{Sx:()=>g,g8:()=>f,l9:()=>e});var d=c(31421);let e="win32"!==process.platform;function f(a,b){let c=a.pid;if(void 0!==c&&e)try{process.kill(-c,b);return}catch{}a.kill(b)}let g=(a,b,c,g)=>new Promise((h,i)=>{let j=(0,d.spawn)(a,b,{cwd:c,env:process.env,detached:e}),k="",l="",m=!1,n=g?.timeoutMs??3e5,o=setTimeout(()=>{m=!0,f(j,"SIGKILL")},n);o.unref?.(),j.stdout.on("data",a=>{k+=a.toString()}),j.stderr.on("data",a=>{l+=a.toString()}),j.on("error",a=>{clearTimeout(o),i(a)}),j.on("close",(b,c)=>{(clearTimeout(o),m)?i(Error(`\`${a}\` timed out after ${n}ms`)):h({stdout:k,stderr:l,exitCode:b??+!!c})})})},87105:(a,b,c)=>{c.d(b,{D:()=>d});let d=async(a,b)=>{let c=await fetch(a,{method:b?.method??"GET",headers:b?.headers,body:b?.body,redirect:"manual"}),d=await c.text(),e={};return c.headers.forEach((a,b)=>{e[b.toLowerCase()]=a}),{status:c.status,ok:c.ok,body:d,headers:e}}},87232:(a,b,c)=>{c.d(b,{Q8:()=>f,cg:()=>d,jL:()=>e});let d="github";function e(a){return"github"===a||"gitlab"===a}class f extends Error{}},87524:(a,b,c)=>{c.d(b,{M:()=>j,t:()=>g});var d=c(14543);function e(a,b){return 401===a||403===a?"auth":402===a?"billing":429===a?/\b(?:free|daily|quota)\b/i.test(b)?"usage_limit":"rate_limit":408===a||a>=500&&a<600?"overloaded":void 0}function f(a){return(0,d.f)(a.trim()).slice(0,300)}function g(a){let b=e(a.status,a.body);if(!b)return;let c={agent:"openrouter",kind:b,rawSnippet:f(`OpenRouter HTTP ${a.status}: ${a.body}`)};return void 0!==a.retryAfterMs&&("rate_limit"===b||"overloaded"===b)&&(c.retryAfterMs=a.retryAfterMs),c}let h=/openrouter http (\d{3})/i,i=/retry[- ]?after[:\s]+(\d+)\s*(?:s\b|sec|second)/i;function j(a){if(0===a.exitCode&&!a.resultIsError)return;let b=[a.resultText,a.stderr].filter(Boolean).join("\n"),c=b.match(h)?.[1];if(!c)return;let d=e(Number(c),b);if(!d)return;let g={agent:"openrouter",kind:d,rawSnippet:f(b.split("\n").find(a=>h.test(a))??b)},j=b.match(i)?.[1];return j&&("rate_limit"===d||"overloaded"===d)&&(g.retryAfterMs=1e3*Number(j)),g}},91549:(a,b,c)=>{c.d(b,{OE:()=>g,bR:()=>h,og:()=>f});let d=["core","graphql","search"];class e{constructor(a={}){this.resources=new Map,this.now=a.now??Date.now}observe(a,b){this.state(a).snapshot=b}note429(a,b){let c=void 0!==b?1e3*b:this.now()+6e4;this.state(a).limitedUntilMs=c}decide(a,b){let c=this.resources.get(a);if(!c)return{allowed:!0};let d=this.now();if(void 0!==c.limitedUntilMs&&d<c.limitedUntilMs)return{allowed:!1,reason:"limited",retryAfterMs:c.limitedUntilMs-d};let e=c.snapshot;if(!e||e.limit<=0)return{allowed:!0};let f=1e3*e.reset;if(d>=f)return{allowed:!0};let g=e.remaining/e.limit,h=f-d;return g<.05?{allowed:!1,reason:"floor",retryAfterMs:h}:"low"===b&&g<.3?{allowed:!1,reason:"reserve",retryAfterMs:h}:{allowed:!0}}snapshot(a){return this.resources.get(a)?.snapshot}state(a){let b=this.resources.get(a);return b||(b={},this.resources.set(a,b)),b}}let f=new e;class g extends Error{constructor(a,b,c){super(`github ${b} rate limit gated (${a}); retry in ~${Math.ceil(c/1e3)}s`),this.reason=a,this.resource=b,this.retryAfterMs=c,this.name="RateLimitError"}}function h(a){let b=Number(a["x-ratelimit-limit"]),c=Number(a["x-ratelimit-remaining"]),e=Number(a["x-ratelimit-reset"]);if(!Number.isFinite(b)||!Number.isFinite(c)||!Number.isFinite(e))return null;let f=a["x-ratelimit-resource"];return void 0===f?{resource:"core",snapshot:{remaining:c,limit:b,reset:e}}:d.includes(f)?{resource:f,snapshot:{remaining:c,limit:b,reset:e}}:null}},93612:(a,b,c)=>{c.d(b,{Sv:()=>f,lw:()=>e,x8:()=>k});var d=c(29980);async function e(a,b=fetch){let c=new AbortController,d=setTimeout(()=>c.abort(),1e4);d.unref?.();try{let d=await b("https://openrouter.ai/api/v1/key",{headers:{Authorization:`Bearer ${a}`},signal:c.signal});if(d.ok)return{ok:!0};let e=(await d.text().catch(()=>"")).slice(0,200);return{ok:!1,error:`OpenRouter HTTP ${d.status}: ${e}`}}catch(a){if(c.signal.aborted)return{ok:!1,error:"OpenRouter key probe timed out after 10000ms"};return{ok:!1,error:a instanceof Error?a.message:String(a)}}finally{clearTimeout(d)}}class f extends Error{constructor(a,b,c){super(`OpenRouter HTTP ${a}: ${b}`),this.status=a,this.body=b,this.retryAfterMs=c,this.name="OpenRouterHttpError"}}let g=d.Ik({index:d.ai(),id:d.Yj().optional(),function:d.Ik({name:d.Yj().optional(),arguments:d.Yj().optional()}).optional()}),h=d.Ik({choices:d.YO(d.Ik({delta:d.Ik({content:d.Yj().nullish(),tool_calls:d.YO(g).optional()}).passthrough().optional(),finish_reason:d.Yj().nullish()})).optional(),usage:d.Ik({prompt_tokens:d.ai().optional(),completion_tokens:d.ai().optional(),cost:d.ai().nullish()}).passthrough().nullish(),error:d.Ik({code:d.KC([d.ai(),d.Yj()]).nullish(),message:d.Yj().optional()}).passthrough().optional()});function i(a){return"assistant"===a.role&&a.toolCalls?.length?{role:"assistant",content:a.content||null,tool_calls:a.toolCalls.map(a=>({id:a.id,type:"function",function:{name:a.name,arguments:a.arguments}}))}:"tool"===a.role?{role:"tool",tool_call_id:a.toolCallId,content:a.content}:{role:a.role,content:a.content}}async function*j(a){let b=a.getReader(),c=new TextDecoder,d="";try{for(;;){let{done:a,value:e}=await b.read();if(a)break;let f=(d+=c.decode(e,{stream:!0})).indexOf("\n");for(;f>=0;)yield d.slice(0,f).replace(/\r$/,""),f=(d=d.slice(f+1)).indexOf("\n")}(d+=c.decode())&&(yield d)}finally{b.releaseLock()}}async function k(a){let b=a.fetchImpl??fetch,c={Authorization:`Bearer ${a.apiKey}`,"Content-Type":"application/json"};a.siteUrl&&(c["HTTP-Referer"]=a.siteUrl),a.appName&&(c["X-Title"]=a.appName);let d={model:a.model,messages:a.messages.map(i),stream:!0,usage:{include:!0}};a.tools?.length&&(d.tools=a.tools.map(a=>({type:"function",function:{name:a.name,description:a.description,parameters:a.parameters}}))),void 0!==a.maxTokens&&(d.max_tokens=a.maxTokens);let e=await b("https://openrouter.ai/api/v1/chat/completions",{method:"POST",headers:c,body:JSON.stringify(d),signal:a.signal});if(!e.ok){let a=(await e.text().catch(()=>"")).slice(0,2e3);throw new f(e.status,a,function(a){if(!a)return;if(/^\d+$/.test(a))return 1e3*Number(a);let b=Date.parse(a);if(Number.isNaN(b))return;let c=b-Date.now();return c>0?c:void 0}(e.headers.get("retry-after")))}if(!e.body)throw new f(e.status,"response had no body");let g="",k=null,l=!1,m={promptTokens:0,completionTokens:0,costUsd:0},n=new Map;for await(let b of j(e.body)){let c;if(!b||b.startsWith(":")||!b.startsWith("data:"))continue;let d=b.slice(5).trim();if("[DONE]"===d){l=!0;break}try{c=h.parse(JSON.parse(d))}catch{continue}if(c.error)throw new f("number"==typeof c.error.code?c.error.code:500,c.error.message??"stream error");let e=c.choices?.[0];for(let b of(e?.delta?.content&&(g+=e.delta.content,a.onTextDelta?.(e.delta.content)),e?.delta?.tool_calls??[])){let a=n.get(b.index)??{id:"",name:"",argumentParts:[]};b.id&&(a.id=b.id),b.function?.name&&(a.name=b.function.name),b.function?.arguments&&a.argumentParts.push(b.function.arguments),n.set(b.index,a)}e?.finish_reason&&(k=e.finish_reason),c.usage&&(m.promptTokens=c.usage.prompt_tokens??m.promptTokens,m.completionTokens=c.usage.completion_tokens??m.completionTokens,m.costUsd=c.usage.cost??m.costUsd)}if(!l&&null===k)throw new f(502,"OpenRouter stream ended before completion");return{text:g,toolCalls:[...n.entries()].sort(([a],[b])=>a-b).map(([,a])=>({id:a.id,name:a.name,arguments:a.argumentParts.join("")})),finishReason:k,usage:m}}},94534:(a,b,c)=>{c.d(b,{g:()=>f});var d=c(31421),e=c(77597);let f=(a,b,c,f)=>{let g,h=(0,d.spawn)(a,b,{cwd:c,env:process.env,detached:e.l9});h.stdout?.setEncoding("utf8"),h.stderr?.setEncoding("utf8"),h.stdout?.on("data",a=>f.onStdout(a)),h.stderr?.on("data",a=>f.onStderr?.(a));let i=!1,j={done:new Promise(a=>{h.on("close",(b,c)=>{g&&clearTimeout(g),a(b??+!!c)}),h.on("error",b=>{j.spawnError=b,a(1)})}),abort:(a=5e3)=>{i||(i=!0,(0,e.g8)(h,"SIGTERM"),g=setTimeout(()=>(0,e.g8)(h,"SIGKILL"),a),g.unref?.())}};return j}},96356:(a,b,c)=>{c.r(b),c.d(b,{abortAllJobs:()=>F,abortJob:()=>D,clearAbort:()=>C,gracefulShutdown:()=>G,reconcileExternalAborts:()=>E,registerAbort:()=>B,startOrchestrator:()=>H});var d=c(97496),e=c(2025),f=c(84232),g=c(74644),h=c(64537),i=c(75818),j=c(52819),k=c(2412),l=c(9617);let m=["ci_running","ci_failed","retrying"];var n=c(47843),o=c(35494),p=c(73024),q=c(76760),r=c(54304),s=c(77597),t=c(1065),u=c(52479);let v=/^job-(\d+)$/,w=/^fb-(\d+)-/,x=/^dh-(\d+)-/;async function y(a={}){let b=a.db??(0,e.Lf)(),c=a.run??s.Sx,f=function(a){let b=a.select({id:h.jobs.id,status:h.jobs.status}).from(h.jobs).all(),c=new Set;for(let a of b)u.kl.includes(a.status)||c.add(a.id);return c}(b),g=0;for(let a of(0,r.uP)(b)){let e;await c("git",["-C",a.path,"worktree","prune"]).catch(()=>void 0);let j=(0,t._M)(a.name);try{e=(0,p.readdirSync)(j,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name)}catch{continue}for(let k of e){let e=v.exec(k)??w.exec(k)??x.exec(k);if(!e)continue;let l=Number(e[1]);if(f.has(l)||function(a,b){let c=b.select({status:h.jobs.status}).from(h.jobs).where((0,d.eq)(h.jobs.id,a)).get();return void 0!==c&&!u.kl.includes(c.status)}(l,b))continue;let m=(0,q.join)(j,k);await c("git",["-C",a.path,"worktree","remove","--force",m]).catch(()=>void 0);try{(0,p.rmSync)(m,{recursive:!0,force:!0}),g++}catch(a){(0,i.v)(`[worktree-reaper] failed to remove ${m}`,a)}}}return g}let z=!1,A=new Map;function B(a,b){A.set(a,b)}function C(a){A.delete(a)}function D(a,b=5e3){let c=A.get(a);return"function"==typeof c&&(c(b),A.delete(a),!0)}function E(a=(0,e.Lf)()){let b=[];for(let c of[...A.keys()])try{(0,k.ax)(c,a)?.status==="aborted"&&D(c)&&b.push(c)}catch(a){(0,i.v)(`[orchestrator] external-abort kill failed for job ${c}`,a)}return b}function F(a=5e3){let b=[...A.keys()];for(let b of A.values())b(a);return A.clear(),b}async function G(){(0,o.IZ)(!0),(0,n.py)(),await (0,j.CZ)().catch(a=>(0,i.v)("[orchestrator] drain notify failed",a)),F(5e3),await (0,o.$J)(8e3);try{let a=(0,e.Lf)();for(let b of a.select().from(h.jobs).where((0,d.RV)(h.jobs.status,["working","ci_running","ci_failed","retrying"])).all())try{(0,k.dk)(b.id,"interrupted",{},a)}catch(a){(0,i.v)(`[orchestrator] shutdown transition failed for job ${b.id}`,a)}}catch(a){(0,i.v)("[orchestrator] shutdown DB update failed",a)}(0,o._1)()}function H(){if(z)return;if(z=!0,!process.env.VITEST)if((0,o.DS)()){(0,o.f1)();try{let{requeued:a,interrupted:b}=function(a=(0,e.Lf)()){return{requeued:(0,l.pp)({},a),interrupted:function(a=(0,e.Lf)()){let b=a.select().from(h.jobs).where((0,d.RV)(h.jobs.status,m)).all();for(let c of b)a.update(h.jobs).set({status:"interrupted"}).where((0,d.eq)(h.jobs.id,c.id)).run(),(0,k.yM)(c.id,"status",{from:c.status,to:"interrupted",reason:"recovery"},a);return b.length}(a)}}();a>0&&console.log(`[orchestrator] requeued ${a} orphaned job(s)`),b>0&&console.log(`[orchestrator] recovered ${b} interrupted job(s)`)}catch(a){(0,i.v)("[orchestrator] recovery failed",a)}y().then(a=>{a>0&&console.log(`[orchestrator] reaped ${a} orphaned worktree(s)`)}).catch(a=>(0,i.v)("[orchestrator] worktree reap failed",a)).finally(()=>{let a,b;(0,n.tn)(),(a=()=>{try{let{jobEventsDeleted:a}=function(a=(0,e.Lf)(),b={}){let c=b.days??(0,g.mt)(a).retentionDays,i=b.vacuum??!0,j=Math.floor((b.now?.getTime()??Date.now())/1e3)-86400*c,k=a.select({id:h.jobs.id}).from(h.jobs).where((0,d.Uo)((0,d.Pe)(h.jobs.finishedAt),(0,d.lt)(h.jobs.finishedAt,j))),l=a.delete(h.jobEvents).where((0,d.RV)(h.jobEvents.jobId,k)).run().changes;return i&&a.run((0,f.ll)`VACUUM`),{jobEventsDeleted:l,vacuumed:i,cutoff:j}}((0,e.Lf)());a>0&&console.log(`[orchestrator] pruned ${a} job event(s)`)}catch(a){(0,i.v)("[orchestrator] prune sweep failed",a)}})(),b=setInterval(a,864e5),b.unref?.()})}else console.warn("[orchestrator] another instance holds the lock; driver loop not started");let a=async a=>{console.log(`[orchestrator] ${a} received, shutting down gracefully`),await G(),process.exit(0)};process.once("SIGINT",a),process.once("SIGTERM",a)}},98887:(a,b,c)=>{c.d(b,{KO:()=>o,gJ:()=>m});var d=c(29980);let e=d.Ik({input_tokens:d.ai().optional(),output_tokens:d.ai().optional(),cache_creation_input_tokens:d.ai().optional(),cache_read_input_tokens:d.ai().optional()}).passthrough(),f=d.Ik({type:d.eu("system"),subtype:d.Yj().optional(),session_id:d.Yj().optional(),model:d.Yj().optional()}),g=d.Ik({type:d.eu("assistant"),message:d.Ik({role:d.eu("assistant"),content:d.YO(d.g1(d.Yj(),d.L5())),usage:e.optional()})}),h=d.Ik({type:d.eu("user"),message:d.Ik({role:d.eu("user"),content:d.YO(d.g1(d.Yj(),d.L5()))})}),i=d.Ik({status:d.Yj().optional(),resetsAt:d.ai().optional(),rateLimitType:d.Yj().optional()}).passthrough(),j=d.Ik({type:d.eu("rate_limit_event"),rate_limit_info:i.optional(),session_id:d.Yj().optional()}),k=d.Ik({type:d.eu("result"),subtype:d.Yj().optional(),session_id:d.Yj().optional(),is_error:d.zM().optional(),result:d.Yj().optional(),total_cost_usd:d.ai().optional(),usage:e.optional()}),l=d.gM("type",[f,g,h,j,k]);function m(a){return a instanceof Error?a.message:String(a)}function n(a){let b=[];for(let c of a)"text"===c.type&&"string"==typeof c.text?b.push({kind:"text",text:c.text}):"tool_use"===c.type?b.push({kind:"tool_use",name:String(c.name??"unknown"),id:String(c.id??""),input:c.input}):"tool_result"===c.type&&b.push({kind:"tool_result",toolUseId:String(c.tool_use_id??""),isError:!!c.is_error});return b}class o{push(a){this.buffer+=a;let b=[],c=this.buffer.indexOf("\n");for(;-1!==c;){let a=this.buffer.slice(0,c);this.buffer=this.buffer.slice(c+1);let d=this.consume(a);d&&b.push(d),c=this.buffer.indexOf("\n")}return b}flush(){let a=this.buffer;this.buffer="";let b=this.consume(a);return b?[b]:[]}consume(a){let b;try{b=function(a){var b;let c,d=a.trim();if(!d)return null;let e=JSON.parse(d);return c={type:(b=l.parse(e)).type,chunks:[],inputTokens:0,outputTokens:0,cacheCreationInputTokens:0,cacheReadInputTokens:0,isError:!1,raw:b},"system"===b.type?(c.sessionId=b.session_id,c.model=b.model):"assistant"===b.type?(c.chunks=n(b.message.content),c.inputTokens=b.message.usage?.input_tokens??0,c.outputTokens=b.message.usage?.output_tokens??0,c.cacheCreationInputTokens=b.message.usage?.cache_creation_input_tokens??0,c.cacheReadInputTokens=b.message.usage?.cache_read_input_tokens??0):"user"===b.type?c.chunks=n(b.message.content):"rate_limit_event"===b.type?(c.sessionId=b.session_id,c.rateLimitInfo=b.rate_limit_info):(c.sessionId=b.session_id,c.resultText=b.result,c.costUsd=b.total_cost_usd,c.inputTokens=b.usage?.input_tokens??0,c.outputTokens=b.usage?.output_tokens??0,c.cacheCreationInputTokens=b.usage?.cache_creation_input_tokens??0,c.cacheReadInputTokens=b.usage?.cache_read_input_tokens??0,c.isError=b.is_error??!1),c}(a)}catch(b){return this.onParseError?.({line:a.trim(),message:m(b)}),null}return b?(b.sessionId&&(this.sessionId=b.sessionId),b.model&&(this.model=b.model),b.rateLimitInfo&&(this.rateLimit=b.rateLimitInfo),"result"===b.type?(b.inputTokens>0&&(this.totalInputTokens=b.inputTokens),b.outputTokens>0&&(this.totalOutputTokens=b.outputTokens),b.cacheCreationInputTokens>0&&(this.totalCacheCreationInputTokens=b.cacheCreationInputTokens),b.cacheReadInputTokens>0&&(this.totalCacheReadInputTokens=b.cacheReadInputTokens),void 0!==b.costUsd&&(this.costUsd=b.costUsd),void 0!==b.resultText&&(this.resultText=b.resultText),this.resultIsError=b.isError):(this.totalInputTokens+=b.inputTokens,this.totalOutputTokens+=b.outputTokens,this.totalCacheCreationInputTokens+=b.cacheCreationInputTokens,this.totalCacheReadInputTokens+=b.cacheReadInputTokens),b):null}constructor(){this.buffer="",this.totalInputTokens=0,this.totalOutputTokens=0,this.totalCacheCreationInputTokens=0,this.totalCacheReadInputTokens=0,this.costUsd=0,this.resultIsError=!1}}}};
|
|
21
|
+
${e}`,g=b.comments.find(a=>a.body.includes(e));g?await a.updateReviewComment(g.id,f):await a.replyToReviewThread(b.id,f)}async function A(a,b,c){let d=c.db??(0,e.Lf)(),f=c.budgets??y,g={processed:0,resolved:0,flagged:0,rejected:0,failed:0,skipped:0},h=await c.forge.listReviewThreads(b),i=0;for(let k of h){var j;if(k.isResolved){g.skipped++;continue}let h=k.comments[0];if(!h||!function(a,b,c={}){let d=a.toLowerCase();if(c.isBot||d.endsWith("[bot]")){let c=u(a);return!b.ignoredBots.some(a=>u(a)===c)&&b.trustedBots.some(a=>u(a)===c)}return!b.ignoredBots.some(a=>a.toLowerCase()===d)&&b.trustedReviewers.some(a=>a.toLowerCase()===d)}(h.author,c.gate,{isBot:h.authorIsBot})){g.skipped++;continue}let l=function(a){let b=a.trim();return v.test(b)?"out_of_scope":w.test(b)?"actionable":b.includes("?")?"question":"actionable"}(h.body),m=function(a,b=(0,e.Lf)()){let c=function(a,b,c=(0,e.Lf)()){return c.select().from(q.reviewFeedbackItems).where((0,p.Uo)((0,p.eq)(q.reviewFeedbackItems.jobId,a),(0,p.eq)(q.reviewFeedbackItems.threadId,b))).get()}(a.jobId,a.threadId,b);return c||b.insert(q.reviewFeedbackItems).values({jobId:a.jobId,prNumber:a.prNumber,threadId:a.threadId,reviewer:a.reviewer,classification:a.classification}).returning().get()}({jobId:a,prNumber:b,threadId:k.id,reviewer:h.author,classification:l},d);if(j=m.status,r.includes(j)){g.skipped++;continue}if("in_progress"===m.status&&(m=x(m.id,"queued",{},d)),"pending"===m.status)try{await c.forge.reactToReviewComment(h.id,"EYES")}catch{}if("pending"===m.status){if("question"===l){m=x(m.id,"flagged",{},d),await z(c.forge,k,"Drydock: this looks like a question rather than a change request, so it's flagged for a human reviewer."),g.flagged++,g.processed++;continue}if("out_of_scope"===l){m=x(m.id,"rejected",{},d),await z(c.forge,k,"Drydock: treating this as out of scope for this PR — please open a follow-up issue if it should be tracked."),await c.forge.resolveReviewThread(k.id),g.rejected++,g.processed++;continue}m=x(m.id,"queued",{},d)}if("queued"===m.status){let a;if(i>=f.maxItemsPerSweep)continue;if(m.attempts>=f.maxAttemptsPerItem){m=x(m.id,"flagged",{},d),await z(c.forge,k,`Drydock: could not resolve this after ${m.attempts} attempt(s); flagging for a human.`),g.flagged++,g.processed++;continue}i++,m=x(m.id,"in_progress",{},d),c.includeProgressReplies&&await z(c.forge,k,"Drydock: working on this now…");try{a=await c.applyFeedback(m,k)}catch(b){a={ok:!1,detail:b instanceof Error?b.message:String(b)}}g.processed++,a.ok?(x(m.id,"resolved",{detail:a.detail},d),await z(c.forge,k,"Drydock: applied this change and pushed a commit. ✅"),await c.forge.resolveReviewThread(k.id),g.resolved++):m.attempts>=f.maxAttemptsPerItem?(x(m.id,"failed",{detail:a.detail},d),await z(c.forge,k,`Drydock: could not apply this automatically (${a.detail??"no change produced"}); flagging for a human.`),g.failed++):x(m.id,"queued",{detail:a.detail},d)}}return g}let B=new Set(["ci_running","ci_failed","retrying","needs_human"]);function C(a){return"function"==typeof a.listReviewThreads&&"function"==typeof a.replyToReviewThread&&"function"==typeof a.updateReviewComment&&"function"==typeof a.resolveReviewThread&&"function"==typeof a.reactToReviewComment}async function D(a={}){let b=a.db??(0,e.Lf)(),c=a.processJob??I;for(let d of(0,f.uP)(b))if((null==a.repoId||d.id===a.repoId)&&(0,k.A)(d).autoReviewFeedback)try{let e=a.forgeFor?.(d)??(0,g.Ie)(d);if(!C(e))continue;for(let a of(0,n.N6)(d.id,b).filter(a=>null!=a.prNumber&&B.has(a.status)&&!(0,o.nc)(a.agent,b)))try{await c(d,a,e)}catch(b){(0,j.v)(`[review-feedback] job ${a.id} failed for ${d.name}`,b)}}catch(a){(0,j.v)(`[review-feedback] sweep failed for ${d.name}`,a)}}let E=Promise.resolve();function F(a={}){let b=E.then(()=>D(a));return E=b.catch(()=>{}),b}let G=new Map;function H(a,b=2e3){let c=G.get(a);c&&clearTimeout(c);let d=setTimeout(()=>{G.delete(a),(0,i.v)("low",()=>F({repoId:a})).catch(b=>{(0,j.v)(`[webhook] review-feedback sweep failed for repo ${a}`,b)})},b);d.unref?.(),G.set(a,d)}async function I(a,b,c){var f;if(!C(c)||null==b.prNumber)return;let g=(0,e.Lf)(),i=(0,k.A)(a),n=(0,d.X$)(b.agent),o=(0,l.m)(n,g),p=(f={repo:a,job:b,worktrees:new h.ND,runSession:(a,b,c)=>(0,m.V)(a,b,c,{db:g,provider:n,command:o,sideSession:!0}).then(a=>({exitCode:a.exitCode}))},async(a,b)=>{if(!f.job.branch)return{ok:!1,detail:"job has no branch"};let c=await f.worktrees.prepareForBranch(f.repo,f.job.branch,`${f.job.id}-${b.id}`);try{let a,d,e=await f.runSession(f.job,(a=b.comments[0],d=b.path?`${b.path}${b.line?`:${b.line}`:""}`:"this PR",[`A reviewer left this comment on ${d} of the current pull request:`,"",(a?.body??"").trim(),"\nMake only the change this comment asks for. Do not address anything else.\nWhen done, ensure the working tree builds and tests pass, then stop — the\ncommit and push are handled for you."].join("\n")),c.path);if(0!==e.exitCode)return{ok:!1,detail:"agent exited non-zero"};try{await f.worktrees.commitAndPush(c,`Address review feedback on ${b.path??"PR"}`)}catch{return{ok:!1,detail:"no change produced"}}return{ok:!0}}finally{try{await f.worktrees.remove(c,f.repo.path)}catch(a){(0,j.v)(`[review-feedback] worktree cleanup failed for job ${f.job.id}`,a)}}});await A(b.id,b.prNumber,{forge:c,db:g,gate:{trustedReviewers:i.trustedReviewers,trustedBots:i.trustedBots,ignoredBots:i.ignoredBots},includeProgressReplies:i.includeProgressReplies,applyFeedback:p})}},64417:(a,b,c)=>{c.d(b,{u:()=>f,v:()=>e});let d=new(c(16698)).AsyncLocalStorage;function e(a,b){return d.run(a,b)}function f(){return d.getStore()??"high"}},70793:(a,b,c)=>{c.d(b,{T9:()=>h,U9:()=>g});var d=c(26557),e=c(27544),f=c(84232);function g(a){return(0,f.ll)`count(${a||f.ll.raw("*")})`.mapWith(Number)}function h(a){return(0,f.ll)`max(${a})`.mapWith((0,e.is)(a,d.V)?a:String)}},76373:(a,b,c)=>{c.d(b,{JD:()=>h,QD:()=>j});var d=c(2025),e=c(14543),f=c(74644);let g=[{id:"telegram",isConfigured:a=>!!(a.telegramBotToken&&a.telegramChatId),send:(a,b,c)=>c.postJson(`https://api.telegram.org/bot${b.telegramBotToken}/sendMessage`,{chat_id:b.telegramChatId,text:a})},{id:"slack",isConfigured:a=>!!a.slackWebhookUrl,send:(a,b,c)=>c.postJson(b.slackWebhookUrl,{text:a})},{id:"email",isConfigured:a=>!!(a.smtpHost&&a.emailFrom&&a.emailTo),send:(a,b,c)=>c.sendMail({to:b.emailTo,from:b.emailFrom,subject:"Drydock notification",text:a},{host:b.smtpHost,port:b.smtpPort,user:b.smtpUser,pass:b.smtpPass})}];async function h(a,b,c=(0,d.Lf)(),e=j){var k,l;let m=(0,f.mt)(c);if(!m.notifyEvents.includes(a))return;let n=g.filter(a=>a.isConfigured(m));0!==n.length&&await (k=i(n,b,m,e),l=()=>console.error(`[notify] dispatch for ${a} exceeded 5000ms; continuing in background`),new Promise(a=>{let b=setTimeout(()=>{l(),a()},5e3);b.unref?.();let c=()=>{clearTimeout(b),a()};k.then(c,c)}))}async function i(a,b,c,d){for(let f of a)try{await f.send(b,c,d)}catch(a){console.error(`[notify] ${f.id} delivery failed`,(0,e.f)(String(a)))}}let j={postJson:async(a,b)=>{let c=await fetch(a,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(b),signal:AbortSignal.timeout(1e4)});if(!c.ok)throw Error(`HTTP ${c.status}`)},sendMail:async(a,b)=>{let d=(await c.e(689).then(c.t.bind(c,93689,19))).createTransport({host:b.host,port:b.port,secure:465===b.port,auth:b.user?{user:b.user,pass:b.pass}:void 0,connectionTimeout:1e4,greetingTimeout:1e4,socketTimeout:1e4});await d.sendMail(a)}}},77597:(a,b,c)=>{c.d(b,{Sx:()=>g,g8:()=>f,l9:()=>e});var d=c(31421);let e="win32"!==process.platform;function f(a,b){let c=a.pid;if(void 0!==c&&e)try{process.kill(-c,b);return}catch{}a.kill(b)}let g=(a,b,c,g)=>new Promise((h,i)=>{let j=(0,d.spawn)(a,b,{cwd:c,env:process.env,detached:e}),k="",l="",m=!1,n=g?.timeoutMs??3e5,o=setTimeout(()=>{m=!0,f(j,"SIGKILL")},n);o.unref?.(),j.stdout.on("data",a=>{k+=a.toString()}),j.stderr.on("data",a=>{l+=a.toString()}),j.on("error",a=>{clearTimeout(o),i(a)}),j.on("close",(b,c)=>{(clearTimeout(o),m)?i(Error(`\`${a}\` timed out after ${n}ms`)):h({stdout:k,stderr:l,exitCode:b??+!!c})})})},87105:(a,b,c)=>{c.d(b,{D:()=>d});let d=async(a,b)=>{let c=await fetch(a,{method:b?.method??"GET",headers:b?.headers,body:b?.body,redirect:"manual"}),d=await c.text(),e={};return c.headers.forEach((a,b)=>{e[b.toLowerCase()]=a}),{status:c.status,ok:c.ok,body:d,headers:e}}},87232:(a,b,c)=>{c.d(b,{Q8:()=>f,cg:()=>d,jL:()=>e});let d="github";function e(a){return"github"===a||"gitlab"===a}class f extends Error{}},87524:(a,b,c)=>{c.d(b,{M:()=>j,t:()=>g});var d=c(14543);function e(a,b){return 401===a||403===a?"auth":402===a?"billing":429===a?/\b(?:free|daily|quota)\b/i.test(b)?"usage_limit":"rate_limit":408===a||a>=500&&a<600?"overloaded":void 0}function f(a){return(0,d.f)(a.trim()).slice(0,300)}function g(a){let b=e(a.status,a.body);if(!b)return;let c={agent:"openrouter",kind:b,rawSnippet:f(`OpenRouter HTTP ${a.status}: ${a.body}`)};return void 0!==a.retryAfterMs&&("rate_limit"===b||"overloaded"===b)&&(c.retryAfterMs=a.retryAfterMs),c}let h=/openrouter http (\d{3})/i,i=/retry[- ]?after[:\s]+(\d+)\s*(?:s\b|sec|second)/i;function j(a){if(0===a.exitCode&&!a.resultIsError)return;let b=[a.resultText,a.stderr].filter(Boolean).join("\n"),c=b.match(h)?.[1];if(!c)return;let d=e(Number(c),b);if(!d)return;let g={agent:"openrouter",kind:d,rawSnippet:f(b.split("\n").find(a=>h.test(a))??b)},j=b.match(i)?.[1];return j&&("rate_limit"===d||"overloaded"===d)&&(g.retryAfterMs=1e3*Number(j)),g}},91549:(a,b,c)=>{c.d(b,{OE:()=>g,bR:()=>h,og:()=>f});let d=["core","graphql","search"];class e{constructor(a={}){this.resources=new Map,this.now=a.now??Date.now}observe(a,b){this.state(a).snapshot=b}note429(a,b){let c=void 0!==b?1e3*b:this.now()+6e4;this.state(a).limitedUntilMs=c}decide(a,b){let c=this.resources.get(a);if(!c)return{allowed:!0};let d=this.now();if(void 0!==c.limitedUntilMs&&d<c.limitedUntilMs)return{allowed:!1,reason:"limited",retryAfterMs:c.limitedUntilMs-d};let e=c.snapshot;if(!e||e.limit<=0)return{allowed:!0};let f=1e3*e.reset;if(d>=f)return{allowed:!0};let g=e.remaining/e.limit,h=f-d;return g<.05?{allowed:!1,reason:"floor",retryAfterMs:h}:"low"===b&&g<.3?{allowed:!1,reason:"reserve",retryAfterMs:h}:{allowed:!0}}snapshot(a){return this.resources.get(a)?.snapshot}state(a){let b=this.resources.get(a);return b||(b={},this.resources.set(a,b)),b}}let f=new e;class g extends Error{constructor(a,b,c){super(`github ${b} rate limit gated (${a}); retry in ~${Math.ceil(c/1e3)}s`),this.reason=a,this.resource=b,this.retryAfterMs=c,this.name="RateLimitError"}}function h(a){let b=Number(a["x-ratelimit-limit"]),c=Number(a["x-ratelimit-remaining"]),e=Number(a["x-ratelimit-reset"]);if(!Number.isFinite(b)||!Number.isFinite(c)||!Number.isFinite(e))return null;let f=a["x-ratelimit-resource"];return void 0===f?{resource:"core",snapshot:{remaining:c,limit:b,reset:e}}:d.includes(f)?{resource:f,snapshot:{remaining:c,limit:b,reset:e}}:null}},93612:(a,b,c)=>{c.d(b,{Sv:()=>f,lw:()=>e,x8:()=>k});var d=c(29980);async function e(a,b=fetch){let c=new AbortController,d=setTimeout(()=>c.abort(),1e4);d.unref?.();try{let d=await b("https://openrouter.ai/api/v1/key",{headers:{Authorization:`Bearer ${a}`},signal:c.signal});if(d.ok)return{ok:!0};let e=(await d.text().catch(()=>"")).slice(0,200);return{ok:!1,error:`OpenRouter HTTP ${d.status}: ${e}`}}catch(a){if(c.signal.aborted)return{ok:!1,error:"OpenRouter key probe timed out after 10000ms"};return{ok:!1,error:a instanceof Error?a.message:String(a)}}finally{clearTimeout(d)}}class f extends Error{constructor(a,b,c){super(`OpenRouter HTTP ${a}: ${b}`),this.status=a,this.body=b,this.retryAfterMs=c,this.name="OpenRouterHttpError"}}let g=d.Ik({index:d.ai(),id:d.Yj().optional(),function:d.Ik({name:d.Yj().optional(),arguments:d.Yj().optional()}).optional()}),h=d.Ik({choices:d.YO(d.Ik({delta:d.Ik({content:d.Yj().nullish(),tool_calls:d.YO(g).optional()}).passthrough().optional(),finish_reason:d.Yj().nullish()})).optional(),usage:d.Ik({prompt_tokens:d.ai().optional(),completion_tokens:d.ai().optional(),cost:d.ai().nullish()}).passthrough().nullish(),error:d.Ik({code:d.KC([d.ai(),d.Yj()]).nullish(),message:d.Yj().optional()}).passthrough().optional()});function i(a){return"assistant"===a.role&&a.toolCalls?.length?{role:"assistant",content:a.content||null,tool_calls:a.toolCalls.map(a=>({id:a.id,type:"function",function:{name:a.name,arguments:a.arguments}}))}:"tool"===a.role?{role:"tool",tool_call_id:a.toolCallId,content:a.content}:{role:a.role,content:a.content}}async function*j(a){let b=a.getReader(),c=new TextDecoder,d="";try{for(;;){let{done:a,value:e}=await b.read();if(a)break;let f=(d+=c.decode(e,{stream:!0})).indexOf("\n");for(;f>=0;)yield d.slice(0,f).replace(/\r$/,""),f=(d=d.slice(f+1)).indexOf("\n")}(d+=c.decode())&&(yield d)}finally{b.releaseLock()}}async function k(a){let b=a.fetchImpl??fetch,c={Authorization:`Bearer ${a.apiKey}`,"Content-Type":"application/json"};a.siteUrl&&(c["HTTP-Referer"]=a.siteUrl),a.appName&&(c["X-Title"]=a.appName);let d={model:a.model,messages:a.messages.map(i),stream:!0,usage:{include:!0}};a.tools?.length&&(d.tools=a.tools.map(a=>({type:"function",function:{name:a.name,description:a.description,parameters:a.parameters}}))),void 0!==a.maxTokens&&(d.max_tokens=a.maxTokens);let e=await b("https://openrouter.ai/api/v1/chat/completions",{method:"POST",headers:c,body:JSON.stringify(d),signal:a.signal});if(!e.ok){let a=(await e.text().catch(()=>"")).slice(0,2e3);throw new f(e.status,a,function(a){if(!a)return;if(/^\d+$/.test(a))return 1e3*Number(a);let b=Date.parse(a);if(Number.isNaN(b))return;let c=b-Date.now();return c>0?c:void 0}(e.headers.get("retry-after")))}if(!e.body)throw new f(e.status,"response had no body");let g="",k=null,l=!1,m={promptTokens:0,completionTokens:0,costUsd:0},n=new Map;for await(let b of j(e.body)){let c;if(!b||b.startsWith(":")||!b.startsWith("data:"))continue;let d=b.slice(5).trim();if("[DONE]"===d){l=!0;break}try{c=h.parse(JSON.parse(d))}catch{continue}if(c.error)throw new f("number"==typeof c.error.code?c.error.code:500,c.error.message??"stream error");let e=c.choices?.[0];for(let b of(e?.delta?.content&&(g+=e.delta.content,a.onTextDelta?.(e.delta.content)),e?.delta?.tool_calls??[])){let a=n.get(b.index)??{id:"",name:"",argumentParts:[]};b.id&&(a.id=b.id),b.function?.name&&(a.name=b.function.name),b.function?.arguments&&a.argumentParts.push(b.function.arguments),n.set(b.index,a)}e?.finish_reason&&(k=e.finish_reason),c.usage&&(m.promptTokens=c.usage.prompt_tokens??m.promptTokens,m.completionTokens=c.usage.completion_tokens??m.completionTokens,m.costUsd=c.usage.cost??m.costUsd)}if(!l&&null===k)throw new f(502,"OpenRouter stream ended before completion");return{text:g,toolCalls:[...n.entries()].sort(([a],[b])=>a-b).map(([,a])=>({id:a.id,name:a.name,arguments:a.argumentParts.join("")})),finishReason:k,usage:m}}},94534:(a,b,c)=>{c.d(b,{g:()=>f});var d=c(31421),e=c(77597);let f=(a,b,c,f)=>{let g,h=(0,d.spawn)(a,b,{cwd:c,env:process.env,detached:e.l9,stdio:["ignore","pipe","pipe"]});h.stdout?.setEncoding("utf8"),h.stderr?.setEncoding("utf8"),h.stdout?.on("data",a=>f.onStdout(a)),h.stderr?.on("data",a=>f.onStderr?.(a));let i=!1,j={done:new Promise(a=>{h.on("close",(b,c)=>{g&&clearTimeout(g),a(b??+!!c)}),h.on("error",b=>{j.spawnError=b,a(1)})}),abort:(a=5e3)=>{i||(i=!0,(0,e.g8)(h,"SIGTERM"),g=setTimeout(()=>(0,e.g8)(h,"SIGKILL"),a),g.unref?.())}};return j}},96356:(a,b,c)=>{c.r(b),c.d(b,{abortAllJobs:()=>F,abortJob:()=>D,clearAbort:()=>C,gracefulShutdown:()=>G,reconcileExternalAborts:()=>E,registerAbort:()=>B,startOrchestrator:()=>H});var d=c(97496),e=c(2025),f=c(84232),g=c(74644),h=c(64537),i=c(75818),j=c(52819),k=c(2412),l=c(9617);let m=["ci_running","ci_failed","retrying"];var n=c(54373),o=c(35494),p=c(73024),q=c(76760),r=c(54304),s=c(77597),t=c(1065),u=c(52479);let v=/^job-(\d+)$/,w=/^fb-(\d+)-/,x=/^dh-(\d+)-/;async function y(a={}){let b=a.db??(0,e.Lf)(),c=a.run??s.Sx,f=function(a){let b=a.select({id:h.jobs.id,status:h.jobs.status}).from(h.jobs).all(),c=new Set;for(let a of b)u.kl.includes(a.status)||c.add(a.id);return c}(b),g=0;for(let a of(0,r.uP)(b)){let e;await c("git",["-C",a.path,"worktree","prune"]).catch(()=>void 0);let j=(0,t._M)(a.name);try{e=(0,p.readdirSync)(j,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name)}catch{continue}for(let k of e){let e=v.exec(k)??w.exec(k)??x.exec(k);if(!e)continue;let l=Number(e[1]);if(f.has(l)||function(a,b){let c=b.select({status:h.jobs.status}).from(h.jobs).where((0,d.eq)(h.jobs.id,a)).get();return void 0!==c&&!u.kl.includes(c.status)}(l,b))continue;let m=(0,q.join)(j,k);await c("git",["-C",a.path,"worktree","remove","--force",m]).catch(()=>void 0);try{(0,p.rmSync)(m,{recursive:!0,force:!0}),g++}catch(a){(0,i.v)(`[worktree-reaper] failed to remove ${m}`,a)}}}return g}let z=!1,A=new Map;function B(a,b){A.set(a,b)}function C(a){A.delete(a)}function D(a,b=5e3){let c=A.get(a);return"function"==typeof c&&(c(b),A.delete(a),!0)}function E(a=(0,e.Lf)()){let b=[];for(let c of[...A.keys()])try{(0,k.ax)(c,a)?.status==="aborted"&&D(c)&&b.push(c)}catch(a){(0,i.v)(`[orchestrator] external-abort kill failed for job ${c}`,a)}return b}function F(a=5e3){let b=[...A.keys()];for(let b of A.values())b(a);return A.clear(),b}async function G(){(0,o.IZ)(!0),(0,n.py)(),await (0,j.CZ)().catch(a=>(0,i.v)("[orchestrator] drain notify failed",a)),F(5e3),await (0,o.$J)(8e3);try{let a=(0,e.Lf)();for(let b of a.select().from(h.jobs).where((0,d.RV)(h.jobs.status,["working","ci_running","ci_failed","retrying"])).all())try{(0,k.dk)(b.id,"interrupted",{},a)}catch(a){(0,i.v)(`[orchestrator] shutdown transition failed for job ${b.id}`,a)}}catch(a){(0,i.v)("[orchestrator] shutdown DB update failed",a)}(0,o._1)()}function H(){if(z)return;if(z=!0,!process.env.VITEST)if((0,o.DS)()){(0,o.f1)();try{let{requeued:a,interrupted:b}=function(a=(0,e.Lf)()){return{requeued:(0,l.pp)({},a),interrupted:function(a=(0,e.Lf)()){let b=a.select().from(h.jobs).where((0,d.RV)(h.jobs.status,m)).all();for(let c of b)a.update(h.jobs).set({status:"interrupted"}).where((0,d.eq)(h.jobs.id,c.id)).run(),(0,k.yM)(c.id,"status",{from:c.status,to:"interrupted",reason:"recovery"},a);return b.length}(a)}}();a>0&&console.log(`[orchestrator] requeued ${a} orphaned job(s)`),b>0&&console.log(`[orchestrator] recovered ${b} interrupted job(s)`)}catch(a){(0,i.v)("[orchestrator] recovery failed",a)}y().then(a=>{a>0&&console.log(`[orchestrator] reaped ${a} orphaned worktree(s)`)}).catch(a=>(0,i.v)("[orchestrator] worktree reap failed",a)).finally(()=>{let a,b;(0,n.tn)(),(a=()=>{try{let{jobEventsDeleted:a}=function(a=(0,e.Lf)(),b={}){let c=b.days??(0,g.mt)(a).retentionDays,i=b.vacuum??!0,j=Math.floor((b.now?.getTime()??Date.now())/1e3)-86400*c,k=a.select({id:h.jobs.id}).from(h.jobs).where((0,d.Uo)((0,d.Pe)(h.jobs.finishedAt),(0,d.lt)(h.jobs.finishedAt,j))),l=a.delete(h.jobEvents).where((0,d.RV)(h.jobEvents.jobId,k)).run().changes;return i&&a.run((0,f.ll)`VACUUM`),{jobEventsDeleted:l,vacuumed:i,cutoff:j}}((0,e.Lf)());a>0&&console.log(`[orchestrator] pruned ${a} job event(s)`)}catch(a){(0,i.v)("[orchestrator] prune sweep failed",a)}})(),b=setInterval(a,864e5),b.unref?.()})}else console.warn("[orchestrator] another instance holds the lock; driver loop not started");let a=async a=>{console.log(`[orchestrator] ${a} received, shutting down gracefully`),await G(),process.exit(0)};process.once("SIGINT",a),process.once("SIGTERM",a)}},98887:(a,b,c)=>{c.d(b,{KO:()=>o,gJ:()=>m});var d=c(29980);let e=d.Ik({input_tokens:d.ai().optional(),output_tokens:d.ai().optional(),cache_creation_input_tokens:d.ai().optional(),cache_read_input_tokens:d.ai().optional()}).passthrough(),f=d.Ik({type:d.eu("system"),subtype:d.Yj().optional(),session_id:d.Yj().optional(),model:d.Yj().optional()}),g=d.Ik({type:d.eu("assistant"),message:d.Ik({role:d.eu("assistant"),content:d.YO(d.g1(d.Yj(),d.L5())),usage:e.optional()})}),h=d.Ik({type:d.eu("user"),message:d.Ik({role:d.eu("user"),content:d.YO(d.g1(d.Yj(),d.L5()))})}),i=d.Ik({status:d.Yj().optional(),resetsAt:d.ai().optional(),rateLimitType:d.Yj().optional()}).passthrough(),j=d.Ik({type:d.eu("rate_limit_event"),rate_limit_info:i.optional(),session_id:d.Yj().optional()}),k=d.Ik({type:d.eu("result"),subtype:d.Yj().optional(),session_id:d.Yj().optional(),is_error:d.zM().optional(),result:d.Yj().optional(),total_cost_usd:d.ai().optional(),usage:e.optional()}),l=d.gM("type",[f,g,h,j,k]);function m(a){return a instanceof Error?a.message:String(a)}function n(a){let b=[];for(let c of a)"text"===c.type&&"string"==typeof c.text?b.push({kind:"text",text:c.text}):"tool_use"===c.type?b.push({kind:"tool_use",name:String(c.name??"unknown"),id:String(c.id??""),input:c.input}):"tool_result"===c.type&&b.push({kind:"tool_result",toolUseId:String(c.tool_use_id??""),isError:!!c.is_error});return b}class o{push(a){this.buffer+=a;let b=[],c=this.buffer.indexOf("\n");for(;-1!==c;){let a=this.buffer.slice(0,c);this.buffer=this.buffer.slice(c+1);let d=this.consume(a);d&&b.push(d),c=this.buffer.indexOf("\n")}return b}flush(){let a=this.buffer;this.buffer="";let b=this.consume(a);return b?[b]:[]}consume(a){let b;try{b=function(a){var b;let c,d=a.trim();if(!d)return null;let e=JSON.parse(d);return c={type:(b=l.parse(e)).type,chunks:[],inputTokens:0,outputTokens:0,cacheCreationInputTokens:0,cacheReadInputTokens:0,isError:!1,raw:b},"system"===b.type?(c.sessionId=b.session_id,c.model=b.model):"assistant"===b.type?(c.chunks=n(b.message.content),c.inputTokens=b.message.usage?.input_tokens??0,c.outputTokens=b.message.usage?.output_tokens??0,c.cacheCreationInputTokens=b.message.usage?.cache_creation_input_tokens??0,c.cacheReadInputTokens=b.message.usage?.cache_read_input_tokens??0):"user"===b.type?c.chunks=n(b.message.content):"rate_limit_event"===b.type?(c.sessionId=b.session_id,c.rateLimitInfo=b.rate_limit_info):(c.sessionId=b.session_id,c.resultText=b.result,c.costUsd=b.total_cost_usd,c.inputTokens=b.usage?.input_tokens??0,c.outputTokens=b.usage?.output_tokens??0,c.cacheCreationInputTokens=b.usage?.cache_creation_input_tokens??0,c.cacheReadInputTokens=b.usage?.cache_read_input_tokens??0,c.isError=b.is_error??!1),c}(a)}catch(b){return this.onParseError?.({line:a.trim(),message:m(b)}),null}return b?(b.sessionId&&(this.sessionId=b.sessionId),b.model&&(this.model=b.model),b.rateLimitInfo&&(this.rateLimit=b.rateLimitInfo),"result"===b.type?(b.inputTokens>0&&(this.totalInputTokens=b.inputTokens),b.outputTokens>0&&(this.totalOutputTokens=b.outputTokens),b.cacheCreationInputTokens>0&&(this.totalCacheCreationInputTokens=b.cacheCreationInputTokens),b.cacheReadInputTokens>0&&(this.totalCacheReadInputTokens=b.cacheReadInputTokens),void 0!==b.costUsd&&(this.costUsd=b.costUsd),void 0!==b.resultText&&(this.resultText=b.resultText),this.resultIsError=b.isError):(this.totalInputTokens+=b.inputTokens,this.totalOutputTokens+=b.outputTokens,this.totalCacheCreationInputTokens+=b.cacheCreationInputTokens,this.totalCacheReadInputTokens+=b.cacheReadInputTokens),b):null}constructor(){this.buffer="",this.totalInputTokens=0,this.totalOutputTokens=0,this.totalCacheCreationInputTokens=0,this.totalCacheReadInputTokens=0,this.costUsd=0,this.resultIsError=!1}}}};
|