@nilsr0711/drydock 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +5 -3
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/routes-manifest.json +12 -0
- package/.next/standalone/.next/server/app/_global-error/page.js +2 -2
- 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 +2 -0
- package/.next/standalone/.next/server/app/analytics/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/analytics/page_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/cost/export/route.js +2 -1
- package/.next/standalone/.next/server/app/api/cost/export/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/sse/dashboard/route.js +15 -2
- 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 +2 -2
- 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 +14 -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 +2 -2
- 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 -5
- 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 -0
- package/.next/standalone/.next/server/app/jobs/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/jobs/page_client-reference-manifest.js +1 -0
- 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 +5 -3
- package/.next/standalone/.next/server/chunks/318.js +14 -0
- package/.next/standalone/.next/server/chunks/468.js +24 -0
- package/.next/standalone/.next/server/chunks/49.js +3 -0
- package/.next/standalone/.next/server/chunks/541.js +1 -1
- package/.next/standalone/.next/server/chunks/665.js +9 -0
- package/.next/standalone/.next/server/chunks/675.js +1 -0
- package/.next/standalone/.next/server/chunks/785.js +93 -0
- package/.next/standalone/.next/server/chunks/859.js +1 -0
- 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/131-754f0b3c6a7625f0.js +1 -0
- package/.next/standalone/.next/static/chunks/{750-1062dd98095cb147.js → 334-ac65cc1c43f3e786.js} +3 -3
- package/.next/standalone/.next/static/chunks/488-94313c3750ed9fec.js +1 -0
- package/.next/standalone/.next/static/chunks/626-25255b0a66c520cb.js +1 -0
- package/.next/standalone/.next/static/chunks/751-17d24a843c68c75a.js +1 -0
- package/.next/standalone/.next/static/chunks/860-5c68ffeb97288824.js +1 -0
- package/.next/standalone/.next/static/chunks/app/adrs/page-d427443f113c3575.js +1 -0
- package/.next/standalone/.next/static/chunks/app/analytics/page-4154e54399ac6fb4.js +1 -0
- package/.next/standalone/.next/static/chunks/app/costs/page-85ceb7f167a8095a.js +1 -0
- package/.next/standalone/.next/static/chunks/app/jobs/[id]/page-eb2e6d420c330df8.js +1 -0
- package/.next/standalone/.next/static/chunks/app/jobs/page-73240c8c9b0571cf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/layout-717833ce6aaa45ee.js +1 -0
- package/.next/standalone/.next/static/chunks/app/needs-human/page-fd702f6eeab08820.js +1 -0
- package/.next/standalone/.next/static/chunks/app/page-43ce9934744597e6.js +1 -0
- package/.next/standalone/.next/static/chunks/app/prompts/page-ecd6816b8dd8b583.js +1 -0
- package/.next/standalone/.next/static/chunks/app/repos/[id]/page-df838c0805fce188.js +1 -0
- package/.next/standalone/.next/static/chunks/app/settings/page-3274e07b560fc8bc.js +1 -0
- package/.next/standalone/.next/static/css/1f98a1f790475168.css +3 -0
- package/.next/standalone/.next/static/eWyghWWF4zppTRQ7rmwde/_buildManifest.js +1 -0
- package/.next/standalone/drizzle/0010_one_shot_costs.sql +12 -0
- package/.next/standalone/drizzle/0021_robust_wind_dancer.sql +48 -0
- package/.next/standalone/drizzle/0022_issue_model_override.sql +2 -0
- package/.next/standalone/drizzle/meta/0021_snapshot.json +1780 -0
- package/.next/standalone/drizzle/meta/_journal.json +7 -0
- package/.next/standalone/package.json +2 -1
- package/.next/static/chunks/131-754f0b3c6a7625f0.js +1 -0
- package/.next/static/chunks/{750-1062dd98095cb147.js → 334-ac65cc1c43f3e786.js} +3 -3
- package/.next/static/chunks/488-94313c3750ed9fec.js +1 -0
- package/.next/static/chunks/626-25255b0a66c520cb.js +1 -0
- package/.next/static/chunks/751-17d24a843c68c75a.js +1 -0
- package/.next/static/chunks/860-5c68ffeb97288824.js +1 -0
- package/.next/static/chunks/app/adrs/page-d427443f113c3575.js +1 -0
- package/.next/static/chunks/app/analytics/page-4154e54399ac6fb4.js +1 -0
- package/.next/static/chunks/app/costs/page-85ceb7f167a8095a.js +1 -0
- package/.next/static/chunks/app/jobs/[id]/page-eb2e6d420c330df8.js +1 -0
- package/.next/static/chunks/app/jobs/page-73240c8c9b0571cf.js +1 -0
- package/.next/static/chunks/app/layout-717833ce6aaa45ee.js +1 -0
- package/.next/static/chunks/app/needs-human/page-fd702f6eeab08820.js +1 -0
- package/.next/static/chunks/app/page-43ce9934744597e6.js +1 -0
- package/.next/static/chunks/app/prompts/page-ecd6816b8dd8b583.js +1 -0
- package/.next/static/chunks/app/repos/[id]/page-df838c0805fce188.js +1 -0
- package/.next/static/chunks/app/settings/page-3274e07b560fc8bc.js +1 -0
- package/.next/static/css/1f98a1f790475168.css +3 -0
- package/.next/static/eWyghWWF4zppTRQ7rmwde/_buildManifest.js +1 -0
- package/README.md +11 -3
- package/bin/drydock.mjs +32 -0
- package/drizzle/0010_one_shot_costs.sql +12 -0
- package/drizzle/0021_robust_wind_dancer.sql +48 -0
- package/drizzle/0022_issue_model_override.sql +2 -0
- package/drizzle/meta/0021_snapshot.json +1780 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +2 -1
- package/.next/standalone/.next/server/chunks/185.js +0 -32
- package/.next/standalone/.next/server/chunks/235.js +0 -1
- package/.next/standalone/.next/server/chunks/309.js +0 -1
- package/.next/standalone/.next/server/chunks/350.js +0 -9
- package/.next/standalone/.next/server/chunks/39.js +0 -3
- package/.next/standalone/.next/server/chunks/447.js +0 -1
- package/.next/standalone/.next/server/chunks/507.js +0 -9
- package/.next/standalone/.next/server/chunks/579.js +0 -62
- package/.next/standalone/.next/server/chunks/710.js +0 -1
- package/.next/standalone/.next/server/chunks/777.js +0 -1
- package/.next/standalone/.next/server/chunks/9.js +0 -3
- package/.next/standalone/.next/static/chunks/66-a23941cbbf88d6cd.js +0 -1
- package/.next/standalone/.next/static/chunks/700-c294ac6d353097ec.js +0 -1
- package/.next/standalone/.next/static/chunks/app/adrs/page-54954f500bc3e3c6.js +0 -1
- package/.next/standalone/.next/static/chunks/app/costs/page-737c89e70adff98b.js +0 -1
- package/.next/standalone/.next/static/chunks/app/jobs/[id]/page-217e04f338b50a7e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/layout-f6048a8c9f541e0d.js +0 -1
- package/.next/standalone/.next/static/chunks/app/needs-human/page-c047e3e842681979.js +0 -1
- package/.next/standalone/.next/static/chunks/app/page-382b7fef1f749214.js +0 -1
- package/.next/standalone/.next/static/chunks/app/prompts/page-9e32fb8f51e7873e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/repos/[id]/page-55b03bdcf107eefe.js +0 -1
- package/.next/standalone/.next/static/chunks/app/settings/page-5b2b8683fa6afdf4.js +0 -1
- package/.next/standalone/.next/static/css/64af283f7f467bc0.css +0 -3
- package/.next/standalone/.next/static/g7t6i0qpogjrDGpmNgFei/_buildManifest.js +0 -1
- package/.next/static/chunks/66-a23941cbbf88d6cd.js +0 -1
- package/.next/static/chunks/700-c294ac6d353097ec.js +0 -1
- package/.next/static/chunks/app/adrs/page-54954f500bc3e3c6.js +0 -1
- package/.next/static/chunks/app/costs/page-737c89e70adff98b.js +0 -1
- package/.next/static/chunks/app/jobs/[id]/page-217e04f338b50a7e.js +0 -1
- package/.next/static/chunks/app/layout-f6048a8c9f541e0d.js +0 -1
- package/.next/static/chunks/app/needs-human/page-c047e3e842681979.js +0 -1
- package/.next/static/chunks/app/page-382b7fef1f749214.js +0 -1
- package/.next/static/chunks/app/prompts/page-9e32fb8f51e7873e.js +0 -1
- package/.next/static/chunks/app/repos/[id]/page-55b03bdcf107eefe.js +0 -1
- package/.next/static/chunks/app/settings/page-5b2b8683fa6afdf4.js +0 -1
- package/.next/static/css/64af283f7f467bc0.css +0 -3
- package/.next/static/g7t6i0qpogjrDGpmNgFei/_buildManifest.js +0 -1
- /package/.next/standalone/.next/static/{g7t6i0qpogjrDGpmNgFei → eWyghWWF4zppTRQ7rmwde}/_ssgManifest.js +0 -0
- /package/.next/static/{g7t6i0qpogjrDGpmNgFei → eWyghWWF4zppTRQ7rmwde}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";exports.id=665,exports.ids=[665],exports.modules={20031:(a,b,c)=>{c.d(b,{E:()=>e,_:()=>d});let d={main:"default",ciFix:"ci-fix"},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.\nKeep the change focused and commit-ready. Do not push or open a PR yourself.',"ci-fix":"CI failed. Fix the failure and keep changes minimal.\n\nFailed CI log:\n$CI_LOG"}},22157:(a,b,c)=>{let d;c.d(b,{k:()=>j});var e=c(37003),f=c(2937),g=c(93929),h=c(36639);class i{constructor(a=(0,f.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=(0,h.f)(JSON.stringify(b.payload??{})),d=JSON.parse(c),e=this.db.insert(g.jobEvents).values({jobId:a,type:b.type,payload:c}).returning().get(),f=this.subs.get(a);if(f)for(let a of f)a.send({id:e.id,type:e.type,payload:d});return e}replay(a,b=200){return this.db.select().from(g.jobEvents).where((0,e.eq)(g.jobEvents.jobId,a)).orderBy(g.jobEvents.ts,g.jobEvents.id).all().slice(-b)}}function j(){return d||(d=new i),d}},23791:(a,b,c)=>{c.d(b,{QJ:()=>g,kl:()=>e});let d={queued:["working","aborted","interrupted"],working:["ci_running","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"],merged:[],needs_human:["queued","aborted"],aborted:[],interrupted:["queued","aborted"]},e=["merged","aborted"];class f extends Error{constructor(a,b){super(`invalid job transition: ${a} -> ${b}`)}}function g(a,b){if(!d[a].includes(b))throw new f(a,b)}},50813:(a,b,c)=>{c.d(b,{F1:()=>l,yO:()=>n,Xm:()=>k,yx:()=>m});var d=c(37003),e=c(97337),f=c(35895),g=c(2937),h=c(93929),i=c(20031);let j=["$ISSUE_NUM","$BRANCH","$REPO_NAME","$CI_LOG"];function k(a,b){let c={$ISSUE_NUM:void 0!==b.ISSUE_NUM?String(b.ISSUE_NUM):"$ISSUE_NUM",$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)()){return l(a,b,c)?.content??i.E[b]??""}function n(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()})},68476:(a,b,c)=>{c.d(b,{N6:()=>n,_S:()=>j,ax:()=>k,dk:()=>m,i1:()=>o,yM:()=>l});var d=c(37003),e=c(97337),f=c(2937),g=c(93929),h=c(24525),i=c(23791);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=k(a,e);if(!j)throw Error(`job ${a} not found`);(0,i.QJ)(j.status,b);let n=Math.floor(Date.now()/1e3),o={};"working"!==b||j.startedAt||(o.startedAt=n),["merged","needs_human","aborted"].includes(b)&&(o.finishedAt=n);let p=e.update(g.jobs).set({...o,...c,status:b}).where((0,d.eq)(g.jobs.id,a)).returning().get();return l(a,"status",{from:j.status,to:b},e),(0,h.ej)(),p}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()}},99665:(a,b,c)=>{let d,e;c.r(b),c.d(b,{abortAllJobs:()=>b6,abortJob:()=>b5,clearAbort:()=>b4,gracefulShutdown:()=>b7,registerAbort:()=>b3,startOrchestrator:()=>b8});var f=c(37003),g=c(2937),h=c(90109),i=c(78293),j=c(93929),k=c(23226),l=c(36639);let m=[{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 n(a,b,c=(0,g.Lf)(),d=p){var e,f;let h=(0,i.mt)(c);if(!h.notifyEvents.includes(a))return;let j=m.filter(a=>a.isConfigured(h));0!==j.length&&await (e=o(j,b,h,d),f=()=>console.error(`[notify] dispatch for ${a} exceeded 5000ms; continuing in background`),new Promise(a=>{let b=setTimeout(()=>{f(),a()},5e3);b.unref?.();let c=()=>{clearTimeout(b),a()};e.then(c,c)}))}async function o(a,b,c,d){for(let e of a)try{await e.send(b,c,d)}catch(a){console.error(`[notify] ${e.id} delivery failed`,(0,l.f)(String(a)))}}let p={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(537).then(c.t.bind(c,83537,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)}};async function q(a,b,c=(0,g.Lf)(),d=p){a?b.active||(b.active=!0,await n("cost_limit","\uD83D\uDCB8 Daily cost limit reached — new jobs are paused until the budget resets.",c,d)):b.active=!1}async function r(a=(0,g.Lf)(),b=p){await n("automation_paused","\uD83C\uDF19 Automation draining — finishing in-flight jobs, then shutting down.",a,b)}var s=c(68476),t=c(77598),u=c(48161),v=c(23791);let w=()=>Math.floor(Date.now()/1e3);function x(){return d||(d=`${(0,u.hostname)()}#${process.pid}`),d}function y(a={},b=(0,g.Lf)()){let c=a.now??w(),d=a.expiredBefore,e=void 0===d?void 0:(0,f.or)((0,f.kZ)(j.jobs.leaseExpiresAt),(0,f.wJ)(j.jobs.leaseExpiresAt,d)),h=b.select().from(j.jobs).where((0,f.Uo)((0,f.eq)(j.jobs.status,"working"),e)).all();for(let a of h)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,f.eq)(j.jobs.id,a.id)).run(),(0,s.yM)(a.id,"status",{from:"working",to:"queued",reason:"lease_expired"},b);return h.length}let z=["ci_running","ci_failed","retrying"],A={"claude-opus-4-8":{inputPerMTok:5,outputPerMTok:25,cacheWritePerMTok:6.25,cacheReadPerMTok:.5},"claude-opus-4-7":{inputPerMTok:15,outputPerMTok:75,cacheWritePerMTok:18.75,cacheReadPerMTok:1.5},"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}},B=Object.values(A).reduce((a,b)=>b.outputPerMTok>a.outputPerMTok?b:a,{inputPerMTok:0,outputPerMTok:0,cacheWritePerMTok:0,cacheReadPerMTok:0});var C=c(35895);let D=C.Ik({input_tokens:C.ai().optional(),output_tokens:C.ai().optional(),cache_creation_input_tokens:C.ai().optional(),cache_read_input_tokens:C.ai().optional()}).passthrough(),E=C.Ik({type:C.eu("system"),subtype:C.Yj().optional(),session_id:C.Yj().optional(),model:C.Yj().optional()}),F=C.Ik({type:C.eu("assistant"),message:C.Ik({role:C.eu("assistant"),content:C.YO(C.g1(C.Yj(),C.L5())),usage:D.optional()})}),G=C.Ik({type:C.eu("user"),message:C.Ik({role:C.eu("user"),content:C.YO(C.g1(C.Yj(),C.L5()))})}),H=C.Ik({type:C.eu("result"),subtype:C.Yj().optional(),session_id:C.Yj().optional(),is_error:C.zM().optional(),total_cost_usd:C.ai().optional(),usage:D.optional()}),I=C.gM("type",[E,F,G,H]);function J(a){return a instanceof Error?a.message:String(a)}function K(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 L{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=I.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=K(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=K(b.message.content):(c.sessionId=b.session_id,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:J(b)}),null}return b?(b.sessionId&&(this.sessionId=b.sessionId),b.model&&(this.model=b.model),"result"===b.type?(b.inputTokens>0&&(this.totalInputTokens=b.inputTokens),b.outputTokens>0&&(this.totalOutputTokens=b.outputTokens),b.cacheReadInputTokens>0&&(this.totalCacheReadInputTokens=b.cacheReadInputTokens),void 0!==b.costUsd&&(this.costUsd=b.costUsd)):(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}}let M="gpt-5-codex",N={"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}},O=Object.values(N).reduce((a,b)=>b.outputPerMTok>a.outputPerMTok?b:a,{inputPerMTok:0,outputPerMTok:0,cacheWritePerMTok:0,cacheReadPerMTok:0}),P=C.Ik({input_tokens:C.ai().optional(),cached_input_tokens:C.ai().optional(),output_tokens:C.ai().optional(),reasoning_output_tokens:C.ai().optional()}).passthrough(),Q=C.Ik({id:C.Yj().optional(),item_type:C.Yj().optional(),text:C.Yj().optional(),command:C.Yj().optional(),exit_code:C.ai().optional(),server:C.Yj().optional(),tool:C.Yj().optional()}).passthrough(),R=C.Ik({type:C.Yj(),thread_id:C.Yj().optional(),usage:P.optional(),item:Q.optional()}).passthrough();class S{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);var d=R.parse(c);let e={type:"assistant",chunks:[],inputTokens:0,outputTokens:0,cacheCreationInputTokens:0,cacheReadInputTokens:0,isError:!1,raw:d};if("thread.started"===d.type)return{...e,type:"system",sessionId:d.thread_id};if("item.completed"===d.type&&d.item)return{...e,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[]}}(d.item)};if("turn.completed"===d.type){let a=d.usage;return{...e,type:"result",inputTokens:a?.input_tokens??0,outputTokens:(a?.output_tokens??0)+(a?.reasoning_output_tokens??0)}}return"turn.failed"===d.type||"error"===d.type?{...e,type:"result",isError:!0}:null}(a)}catch(b){return this.onParseError?.({line:a.trim(),message:J(b)}),null}return b?(b.sessionId&&(this.sessionId=b.sessionId),this.totalInputTokens+=b.inputTokens,this.totalOutputTokens+=b.outputTokens,b):null}constructor(){this.buffer="",this.totalInputTokens=0,this.totalOutputTokens=0,this.costUsd=0}}let T={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 L,estimateCost:function(a,b,c,d=0,e=0){let f=function(a){if(!a)return B;let b=A[a];return b||(console.warn(`[drydock] Unknown model id "${a}" — using max-priced fallback to avoid under-counting cost`),B)}(a);return b/1e6*f.inputPerMTok+c/1e6*f.outputPerMTok+d/1e6*f.cacheWritePerMTok+e/1e6*f.cacheReadPerMTok}},codex:{id:"codex",label:"Codex CLI",defaultCommand:"codex",supportsResume:!0,resumeModel:M,resumeMaxTurns:15,defaultModel:M,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 S,estimateCost:function(a,b,c){let d=function(a){if(!a)return O;let b=N[a];return b||(console.warn(`[drydock] Unknown codex model id "${a}" — using max-priced fallback to avoid under-counting cost`),O)}(a);return b/1e6*d.inputPerMTok+c/1e6*d.outputPerMTok}}},U=["claude","codex"];function V(a){return"string"==typeof a&&U.includes(a)?T[a]:T.claude}var W=c(68464),X=c(12731),Y=c(23601),Z=c(12717);let $=["blocked","wontfix","question","needs-human","needs-discussion"],_=[{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 aa(a){let b=[],c=a.labels.map(a=>a.toLowerCase()).find(a=>$.includes(a));if(c)return{decision:"blocked",reasons:[`blocking label: ${c}`]};let d=`${a.title}
|
|
2
|
+
${a.body??""}`;for(let{label:a,re:c}of _)c.test(d)&&b.push(`${a} detected`);return b.length>0?{decision:"needs_review",reasons:b}:{decision:"approved",reasons:[]}}var ab=c(32693);let ac=new Set(["OWNER","MEMBER","COLLABORATOR"]);function ad(a){try{let b=JSON.parse(a);return Array.isArray(b)?b.filter(a=>"string"==typeof a):[]}catch{return[]}}function ae(a){return{autoTriageEnabled:a.autoTriageEnabled,autoProcessEnabled:a.autoProcessEnabled,autoHealCi:a.autoHealCi,autoReviewFeedback:a.autoReviewFeedback,autoResolveMergeConflicts:a.autoResolveMergeConflicts,includeProgressReplies:a.includeProgressReplies,autoDecompose:a.autoDecompose,verifyPr:a.verifyPr,autoHealDeployments:a.autoHealDeployments,releaseEnabled:a.releaseEnabled,deploymentPlatform:a.deploymentPlatform,readyLabels:ad(a.readyLabels),blockingLabels:ad(a.blockingLabels),autoLabelWhitelist:ad(a.autoLabelWhitelist),priorityAuthors:ad(a.priorityAuthors),trustedReviewers:ad(a.trustedReviewers),ignoredBots:ad(a.ignoredBots),minAuthorAssociation:"any"===a.minAuthorAssociation?"any":"approved",maxAttempts:a.maxAttempts}}function af(a,b){return"any"===a.minAuthorAssociation||null!=b&&ac.has(b.toUpperCase())}let ag=[{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 ah(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 ai(a,b,c,d=(0,g.Lf)()){let e=ae(a),h=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===h)return{number:c.number,applied:[],reasons:[],skipped:"unchanged"};if(!af(e,c.authorAssociation))return ah(a.id,c.number,h,d),{number:c.number,applied:[],reasons:["author not approved"],skipped:"author"};let k=await b.viewIssue(c.number),l=aa({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}
|
|
3
|
+
${a.body}`,e=[];for(let{label:a,re:b}of ag)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]),p=new Set(k.labels),q=[...new Set(n)].filter(a=>o.has(a)&&!p.has(a));if(q.length>0){for(let a of q)await b.ensureLabel(a);await b.addLabels(c.number,q);let e=q.map(a=>`\`${a}\``).join(", ");await b.commentIssue(c.number,`auto-triage: applied ${e} — reasons: ${m.join("; ")}.`),function(a,b,c,d){let e,g=d.select().from(j.issues).where((0,f.Uo)((0,f.eq)(j.issues.repoId,a),(0,f.eq)(j.issues.number,b))).get();if(!g)return;try{let a=JSON.parse(g.labels);e=Array.isArray(a)?a:[]}catch{e=[]}let h=[...e];for(let a of c)h.includes(a)||h.push(a);d.update(j.issues).set({labels:JSON.stringify(h)}).where((0,f.eq)(j.issues.id,g.id)).run()}(a.id,c.number,q,d)}return ah(a.id,c.number,h,d),{number:c.number,applied:q,reasons:m}}async function aj(a,b,c,d=(0,g.Lf)()){let e=[];for(let f of c)try{e.push(await ai(a,b,f,d))}catch(b){(0,k.v)(`[triage] issue #${f.number} failed for ${a.name}`,b)}return e}function ak(a,b){let c=(0,i.mt)(b);return"codex"===a.id?c.codexPath:c.claudePath}var al=c(71117),am=c(76760);function an(){return process.env.DRYDOCK_HOME??(0,am.join)((0,u.homedir)(),".drydock")}function ao(a){return a.replace(/[^a-zA-Z0-9._-]/g,"-")}function ap(a){return(0,am.join)(an(),"worktrees",ao(a))}class aq extends Error{}class ar extends aq{constructor(){super("nothing to commit")}}class as{constructor(a=al.S){this.run=a,this.locks=new Map}withRepoLock(a,b){let c=(this.locks.get(a)??Promise.resolve()).then(b,b);return this.locks.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 aq(c.stderr.trim()||`git ${a[0]} failed`);return c.stdout}async prepare(a,b,c=0){let d=`drydock/issue-${c}-job-${b}`,e=(0,am.join)(ap(a.name),`job-${b}`);return await this.withRepoLock(a.path,()=>this.git(["-C",a.path,"worktree","add","-b",d,e,a.defaultBranch])),{path:e,branch:d}}async prepareForBranch(a,b,c){let d=(0,am.join)(ap(a.name),`fb-${ao(c)}`);return 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])}),{path:d,branch:b}}async prepareForNewBranch(a,b,c){let d=(0,am.join)(ap(a.name),`dh-${ao(c)}`);return await this.withRepoLock(a.path,()=>this.git(["-C",a.path,"worktree","add","-b",b,d,a.defaultBranch])),{path:d,branch:b}}async commitAndPush(a,b){if(await this.git(["add","-A"],a.path),""===(await this.git(["status","--porcelain"],a.path)).trim())throw new ar;await this.git(["commit","-m",b],a.path),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"])})}}var at=c(31421);let au=(a,b,c,d)=>{let e,f=(0,at.spawn)(a,b,{cwd:c,env:process.env});f.stdout?.setEncoding("utf8"),f.stderr?.setEncoding("utf8"),f.stdout?.on("data",a=>d.onStdout(a)),f.stderr?.on("data",a=>d.onStderr?.(a));let g={done:new Promise(a=>{f.on("close",b=>{e&&clearTimeout(e),a(b??0)}),f.on("error",b=>{g.spawnError=b,a(1)})}),abort:(a=5e3)=>{f.kill("SIGTERM"),e=setTimeout(()=>f.kill("SIGKILL"),a)}};return g};var av=c(20031),aw=c(50813),ax=c(22157);function ay(a,b){let c=()=>{},d=!1;return{tripped:new Promise(a=>{c=a}),observe(){!d&&b()>=a&&(d=!0,c())}}}function az(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 aA(a){return{chunks:a.chunks,costUsd:a.costUsd}}async function aB(a,b,c,d={}){let e=d.db??(0,g.Lf)(),h=d.runner??au,i=d.broker??(0,ax.k)(),k=d.provider??V(a.agent),l=d.command??k.defaultCommand,m=a.model??k.defaultModel,n=k.createParser();n.onParseError=b=>i.publish(a.id,{type:"parse_error",payload:b}),"working"!==a.status?(0,s.dk)(a.id,"working",{model:m},e):e.update(j.jobs).set({model:m}).where((0,f.eq)(j.jobs.id,a.id)).run();let o=d.costCapUsd&&d.costCapUsd>0?ay(d.costCapUsd,()=>n.costUsd>0?n.costUsd:k.estimateCost(m,n.totalInputTokens,n.totalOutputTokens)):void 0,p=h(l,k.buildStartArgs({prompt:b,model:m,maxTurns:a.maxTurns}),c,{onStdout:b=>{for(let c of n.push(b))i.publish(a.id,{type:c.type,payload:aA(c)});o?.observe()},onStderr:b=>i.publish(a.id,{type:"error",payload:{stderr:b}})});b3(a.id,p.abort);let{exitCode:q,timedOut:r,costExceeded:t}=await az(p,{timeoutMs:d.timeoutMs,costTripped:o?.tripped,graceMs:d.graceMs});b4(a.id);let u=r||t?void 0:p.spawnError;for(let b of(r&&i.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${d.timeoutMs}ms`}}),t&&i.publish(a.id,{type:"error",payload:{stderr:`session aborted: per-job cost limit of $${d.costCapUsd} reached`}}),n.flush()))i.publish(a.id,{type:b.type,payload:aA(b)});let v=n.costUsd>0?n.costUsd:k.estimateCost(m,n.totalInputTokens,n.totalOutputTokens);return e.update(j.jobs).set({sessionId:n.sessionId,totalInputTokens:n.totalInputTokens,totalOutputTokens:n.totalOutputTokens,costUsd:v}).where((0,f.eq)(j.jobs.id,a.id)).run(),{exitCode:q,sessionId:n.sessionId,costUsd:v,inputTokens:n.totalInputTokens,outputTokens:n.totalOutputTokens,timedOut:r,costExceeded:t,spawnError:u}}async function aC(a,b,c,d,e={}){let h=e.db??(0,g.Lf)(),i=e.runner??au,k=e.broker??(0,ax.k)(),l=e.provider??V(a.agent),m=e.command??l.defaultCommand,n=a.model??l.resumeModel,o=l.createParser();o.onParseError=b=>k.publish(a.id,{type:"parse_error",payload:b});let p=(0,aw.Xm)((0,aw.yx)(a.repoId,av._.ciFix,h),{CI_LOG:c}),q=e.costCapUsd&&e.costCapUsd>0?h.select().from(j.jobs).where((0,f.eq)(j.jobs.id,a.id)).get()?.costUsd??0:0,r=e.costCapUsd&&e.costCapUsd>0?ay(e.costCapUsd,()=>q+(o.costUsd>0?o.costUsd:l.estimateCost(n,o.totalInputTokens,o.totalOutputTokens))):void 0,s=i(m,(l.supportsResume?l.buildResumeArgs({prompt:p,sessionId:b,model:l.resumeModel,maxTurns:l.resumeMaxTurns}):null)??l.buildStartArgs({prompt:p,model:l.resumeModel,maxTurns:l.resumeMaxTurns}),d,{onStdout:b=>{for(let c of o.push(b))k.publish(a.id,{type:c.type,payload:{chunks:c.chunks}});r?.observe()},onStderr:b=>k.publish(a.id,{type:"error",payload:{stderr:b}})});b3(a.id,s.abort);let{exitCode:t,timedOut:u,costExceeded:v}=await az(s,{timeoutMs:e.timeoutMs,costTripped:r?.tripped,graceMs:e.graceMs});b4(a.id);let w=u||v?void 0:s.spawnError;for(let b of(u&&k.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${e.timeoutMs}ms`}}),v&&k.publish(a.id,{type:"error",payload:{stderr:`session aborted: per-job cost limit of $${e.costCapUsd} reached`}}),o.flush()))k.publish(a.id,{type:b.type,payload:{chunks:b.chunks}});let x=o.costUsd>0?o.costUsd:l.estimateCost(n,o.totalInputTokens,o.totalOutputTokens),y=h.select().from(j.jobs).where((0,f.eq)(j.jobs.id,a.id)).get();return h.update(j.jobs).set({sessionId:o.sessionId??b,totalInputTokens:(y?.totalInputTokens??0)+o.totalInputTokens,totalOutputTokens:(y?.totalOutputTokens??0)+o.totalOutputTokens,costUsd:(y?.costUsd??0)+x}).where((0,f.eq)(j.jobs.id,a.id)).run(),{exitCode:t,sessionId:o.sessionId??b,costUsd:x,inputTokens:o.totalInputTokens,outputTokens:o.totalOutputTokens,timedOut:u,costExceeded:v,spawnError:w}}var aD=c(73024);let aE=["vercel","railway"];function aF(a){return a.exists??aD.existsSync}class aG{async detect(a){let b=aF(a);return b((0,am.join)(a.cwd,"railway.json"))||b((0,am.join)(a.cwd,"railway.toml"))||b((0,am.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"}}class aH{async detect(a){let b=aF(a);return b((0,am.join)(a.cwd,"vercel.json"))||b((0,am.join)(a.cwd,".vercel"))}async getStatus(a){let b=await a.run("vercel",["list"],a.cwd);return function(a,b,c){let d;if(0!==b)return"not_found";let e=a.split("\n").map(a=>a.trim()).filter(Boolean),f=c?c.slice(0,7):null;if(f){if(!(d=e.find(a=>a.includes(f))))return"not_found"}else d=e.find(a=>/●|ready|error|building|queued|initializing/i.test(a));let g=(d??a).toLowerCase();return/\berror\b|\bfailed\b|canceled/.test(g)?"error":/\bready\b/.test(g)?"ready":/\bbuilding\b/.test(g)?"building":/\bqueued\b|initializing|deploying/.test(g)?"deploying":"not_found"}(b.stdout,b.exitCode,a.ref)}async getLogs(a){let b=a.ref?["inspect","--logs",a.ref]:["logs"],c=await a.run("vercel",b,a.cwd);return[c.stdout,c.stderr].filter(Boolean).join("\n").trim()}constructor(){this.id="vercel",this.label="Vercel"}}let aI=[new aH,new aG];async function aJ(a,b){if(b)return aE.includes(b)?function(a){let b=aI.find(b=>b.id===a);if(!b)throw Error(`unsupported deployment platform: ${a}`);return b}(b):null;for(let b of aI)if(await b.detect(a))return b;return null}var aK=c(46146);function aL(a,b){return{cwd:a.path,ref:b,run:al.S}}async function aM(a={}){let b=a.db??(0,g.Lf)(),c=a.now??Date.now,d=a.budgets??aK.ad;for(let e of(0,W.uP)(b))if(ae(e).autoHealDeployments)try{let f=a.forgeFor?.(e)??(0,X.Ie)(e),g=a.adapterFor??(a=>aJ(aL(a,null),a.deploymentPlatform)),h=await g(e);if(!h)continue;let i=a.openFixPr??aP;await aN(e,f,h,{db:b,now:c,budgets:d,openFixPr:i})}catch(a){(0,k.v)(`[deploy-heal] sweep failed for ${e.name}`,a)}}async function aN(a,b,c,d){let{db:e,now:f,budgets:g}=d,h=(0,s.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.prHeadSha(a.prNumber)}catch(b){(0,k.v)(`[deploy-heal] head sha lookup failed for job ${a.id}`,b);continue}(0,aK.SR)(a.id,d,e)||(0,aK.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 aO(a,e,c,b,d)}catch(c){(0,k.v)(`[deploy-heal] session ${b.id} failed for ${a.name}`,c)}}}async function aO(a,b,c,d,e){let{db:f,now:g,budgets:h}=e,i=(0,aK.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,aK.X)(d.id,"escalated",{},f);let j=aL(a,d.commitSha),l=(0,aK.eV)(await c.getStatus(j));if("ready"===l)return void(0,aK.X)(d.id,"healthy",{},f);if("pending"===l)return void(0,aK.LR)(d.id,f);let m=(await c.getLogs(j).catch(()=>"")).split("\n").slice(-h.maxLogLines).join("\n").trim(),n=(0,aK.X)(d.id,"failed",{logsExcerpt:m||null},f);(0,aK.X)(d.id,"repairing",{},f);try{let c=await e.openFixPr(a,b,n,m);(0,aK.X)(d.id,"repaired",{followupPrNumber:c},f)}catch(a){(0,k.v)(`[deploy-heal] fix PR failed for session ${d.id}`,a),(0,aK.X)(d.id,"escalated",{},f)}}async function aP(a,b,c,d){let e=(0,g.Lf)(),f=V(b.agent),h=ak(f,e),i=new as,j=c.commitSha.slice(0,7),l=`drydock/deploy-fix-${b.id}-${j}`,m=(0,X.Ie)(a),n=await i.prepareForNewBranch(a,l,`${b.id}-${j}`);try{let g=await aB(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"),n.path,{db:e,provider:f,command:h});if(0!==g.exitCode)throw Error(`${f.label} exited non-zero`);return await i.commitAndPush(n,`Fix failed ${c.platform} deployment for PR #${c.prNumber}`),m.createPr({head:l,base:a.defaultBranch,title:`Fix failed ${c.platform} deployment (PR #${c.prNumber})`,body:`The deployment for #${c.prNumber} (commit ${j}) failed. This PR addresses the deployment failure.`})}finally{try{await i.remove(n,a.path)}catch(a){(0,k.v)(`[deploy-heal] worktree cleanup failed for job ${b.id}`,a)}}}var aQ=c(34717),aR=c(51455),aS=c(10520);let aT=C.Ik({release:C.zM(),bump:C.k5(["patch","minor","major"]),title:C.Yj().default(""),notes:C.Yj().default("")});async function aU(a){let b=a.runner??al.S,c=a.db??(0,g.Lf)(),d=void 0!==a.timeoutMs?{timeoutMs:a.timeoutMs}:void 0,e=a.provider.buildStreamOneShotArgs({prompt:a.prompt,model:a.model});if(null===e){let c=a.provider.buildOneShotArgs({prompt:a.prompt,model:a.model}),e=d?await b(a.command,c,a.cwd,d):await b(a.command,c,a.cwd);return{text:e.stdout,exitCode:e.exitCode,costUsd:0}}let f=d?await b(a.command,e,a.cwd,d):await b(a.command,e,a.cwd),h=new L,i=[...h.push(f.stdout),...h.flush()],k=[];for(let a of i)for(let b of a.chunks)"text"===b.kind&&k.push(b.text);let l=k.join(""),m=h.costUsd>0?h.costUsd:0;return m>0&&void 0!==a.repoId&&c.insert(j.oneShotCosts).values({repoId:a.repoId,type:a.type,costUsd:m,inputTokens:h.totalInputTokens,outputTokens:h.totalOutputTokens}).run(),{text:l,exitCode:f.exitCode,costUsd:m}}async function aV(a){var b;let c,d=await a.listReleases(),e=function(a){let b=null;for(let c of a)(0,aS.kf)(c)&&(null===b||(0,aS.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 aW(a,b){let c=b.db??(0,g.Lf)(),d=(0,aQ.tm)(a,c);if(!d)throw Error(`release run ${a} not found`);let e=d.mode;(0,aQ.Cq)(a,"evaluating",{},c);try{var f;let{fromTag:g,releases:h,prs:i}=await aV(b.forge),j=await b.generate({fromTag:g,prs:i});if("auto"===e&&!j)return(0,aQ.Cq)(a,"error",{errorMessage:"release evaluation failed"},c);if("auto"===e&&j&&!j.release)return(0,aQ.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,aS.rr)(g??"0.0.0",f)}`);if((0,aQ.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,aQ.Cq)(a,"publishing",{},c),(0,aQ.Cq)(a,"published",{},c);return(0,aQ.Cq)(a,"publishing",{},c),await b.forge.createRelease({tag:l,title:k.title||l,notes:k.notes,target:b.repo.defaultBranch}),(0,aQ.Cq)(a,"published",{},c)}catch(f){let b=f instanceof Error?f.message:String(f),d=(0,aQ.tm)(a,c),e=d?.status??"evaluating";if("evaluating"===e||"proposed"===e||"publishing"===e)return(0,aQ.Cq)(a,"error",{errorMessage:b.slice(0,500)},c);return(0,aQ.tm)(a,c)}}async function aX(a,b){let c=await (0,aR.mkdtemp)((0,am.join)((0,u.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 aU({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=aT.safeParse(f);return j.success?j.data:null}catch{return null}});return await b(f)}finally{try{await (0,aR.rm)(c,{recursive:!0,force:!0})}catch{}}}async function aY(a={}){let b=a.db??(0,g.Lf)();if(!(0,i.mt)(b).releaseManagementEnabled)return;let c=a.now??Date.now,d=a.windowMs??36e5,e=a.notify??((a,c)=>n(a,c,b));for(let f of(0,W.uP)(b))if(ae(f).releaseEnabled)try{let g=a.forgeFor?.(f)??(0,X.Ie)(f),h="function"==typeof g.listReleases&&"function"==typeof g.listMergedPrs&&"function"==typeof g.createRelease?g:null;if(!h)continue;let i=a.generatorFor?.(f)??function(a,b){let c=V(a.agent),d=ak(c,b),e=a.defaultModel;return a=>aX({provider:c,command:d,model:e},b=>b(a))}(f,b);await aZ(f,g,h,i,{db:b,now:c,windowMs:d,notify:e})}catch(a){(0,k.v)(`[release] sweep failed for ${f.name}`,a)}}async function aZ(a,b,c,d,e){let{db:f,now:g,windowMs:h}=e;for(let i of(0,s.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 a$(a,i,b,c,d,e)}catch(b){(0,k.v)(`[release] job ${i.id} failed for ${a.name}`,b)}}}async function a$(a,b,c,d,e,f){let{db:g,notify:h}=f,i=b.prNumber,j=await c.prHeadSha(i),k=(0,aQ.v0)({repoId:a.id,mode:"auto",triggerPrNumber:i,triggerSha:j},g);if("detected"!==k.status)return;let l=await aW(k.id,{repo:a,forge:d,db:g,generate:e});"published"===l.status&&l.tag&&await h("release_published",`🚀 Released ${a.name} ${l.tag}.`)}let a_=["resolved","failed","rejected","flagged"],a0={pending:["queued","rejected","flagged"],queued:["in_progress","flagged","rejected"],in_progress:["resolved","failed","flagged","queued"],resolved:[],failed:[],rejected:[],flagged:[]};class a1 extends Error{constructor(a,b){super(`invalid feedback transition: ${a} -> ${b}`)}}let a2=/\b(out of scope|follow[- ]?up|separate pr|different pr|unrelated|won'?t fix|nevermind|never mind|ignore this)\b/i,a3=/\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 a4(a,b,c={},d=(0,g.Lf)()){let e=d.select().from(j.reviewFeedbackItems).where((0,f.eq)(j.reviewFeedbackItems.id,a)).get();if(!e)throw Error(`review feedback item ${a} not found`);var h=e.status;if(!a0[h].includes(b))throw new a1(h,b);return d.update(j.reviewFeedbackItems).set({status:b,detail:c.detail??e.detail,attempts:"in_progress"===b?e.attempts+1:e.attempts,updatedAt:Math.floor(Date.now()/1e3)}).where((0,f.eq)(j.reviewFeedbackItems.id,a)).returning().get()}let a5={maxItemsPerSweep:3,maxAttemptsPerItem:2};async function a6(a,b,c){var d;let e=(d=b.id,`<!-- drydock:review-feedback:${d} -->`),f=`${c}
|
|
4
|
+
|
|
5
|
+
${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 a7(a,b,c){let d=c.db??(0,g.Lf)(),e=c.budgets??a5,h={processed:0,resolved:0,flagged:0,rejected:0,failed:0,skipped:0},i=await c.forge.listReviewThreads(b),k=0;for(let m of i){var l;if(m.isResolved){h.skipped++;continue}let i=m.comments[0];if(!i||!function(a,b){let c=a.toLowerCase();return!(c.endsWith("[bot]")||b.ignoredBots.some(a=>a.toLowerCase()===c))&&b.trustedReviewers.some(a=>a.toLowerCase()===c)}(i.author,c.gate)){h.skipped++;continue}let n=function(a){let b=a.trim();return a2.test(b)?"out_of_scope":a3.test(b)?"actionable":b.includes("?")?"question":"actionable"}(i.body),o=function(a,b=(0,g.Lf)()){let c=function(a,b,c=(0,g.Lf)()){return c.select().from(j.reviewFeedbackItems).where((0,f.Uo)((0,f.eq)(j.reviewFeedbackItems.jobId,a),(0,f.eq)(j.reviewFeedbackItems.threadId,b))).get()}(a.jobId,a.threadId,b);return c||b.insert(j.reviewFeedbackItems).values({jobId:a.jobId,prNumber:a.prNumber,threadId:a.threadId,reviewer:a.reviewer,classification:a.classification}).returning().get()}({jobId:a,prNumber:b,threadId:m.id,reviewer:i.author,classification:n},d);if(l=o.status,a_.includes(l)){h.skipped++;continue}if("pending"===o.status)try{await c.forge.reactToReviewComment(i.id,"EYES")}catch{}if("pending"===o.status){if("question"===n){o=a4(o.id,"flagged",{},d),await a6(c.forge,m,"Drydock: this looks like a question rather than a change request, so it's flagged for a human reviewer."),h.flagged++,h.processed++;continue}if("out_of_scope"===n){o=a4(o.id,"rejected",{},d),await a6(c.forge,m,"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(m.id),h.rejected++,h.processed++;continue}o=a4(o.id,"queued",{},d)}if("queued"===o.status){if(k>=e.maxItemsPerSweep)continue;if(o.attempts>=e.maxAttemptsPerItem){o=a4(o.id,"flagged",{},d),await a6(c.forge,m,`Drydock: could not resolve this after ${o.attempts} attempt(s); flagging for a human.`),h.flagged++,h.processed++;continue}k++,o=a4(o.id,"in_progress",{},d),c.includeProgressReplies&&await a6(c.forge,m,"Drydock: working on this now…");let a=await c.applyFeedback(o,m);h.processed++,a.ok?(a4(o.id,"resolved",{detail:a.detail},d),await a6(c.forge,m,"Drydock: applied this change and pushed a commit. ✅"),await c.forge.resolveReviewThread(m.id),h.resolved++):o.attempts>=e.maxAttemptsPerItem?(a4(o.id,"failed",{detail:a.detail},d),await a6(c.forge,m,`Drydock: could not apply this automatically (${a.detail??"no change produced"}); flagging for a human.`),h.failed++):a4(o.id,"queued",{detail:a.detail},d)}}return h}let a8=new Set(["ci_running","ci_failed","retrying","needs_human"]);function a9(a){return"function"==typeof a.listReviewThreads&&"function"==typeof a.replyToReviewThread&&"function"==typeof a.updateReviewComment&&"function"==typeof a.resolveReviewThread&&"function"==typeof a.reactToReviewComment}async function ba(a={}){let b=a.db??(0,g.Lf)(),c=a.processJob??bb;for(let d of(0,W.uP)(b))if(ae(d).autoReviewFeedback)try{let e=a.forgeFor?.(d)??(0,X.Ie)(d);if(!a9(e))continue;for(let a of(0,s.N6)(d.id,b).filter(a=>null!=a.prNumber&&a8.has(a.status)))try{await c(d,a,e)}catch(b){(0,k.v)(`[review-feedback] job ${a.id} failed for ${d.name}`,b)}}catch(a){(0,k.v)(`[review-feedback] sweep failed for ${d.name}`,a)}}async function bb(a,b,c){var d;if(!a9(c)||null==b.prNumber)return;let e=(0,g.Lf)(),f=ae(a),h=V(b.agent),i=ak(h,e),j=(d={repo:a,job:b,worktrees:new as,runSession:(a,b,c)=>aB(a,b,c,{db:e,provider:h,command:i}).then(a=>({exitCode:a.exitCode}))},async(a,b)=>{if(!d.job.branch)return{ok:!1,detail:"job has no branch"};let c=await d.worktrees.prepareForBranch(d.repo,d.job.branch,`${d.job.id}-${b.id}`);try{let a,e,f=await d.runSession(d.job,(a=b.comments[0],e=b.path?`${b.path}${b.line?`:${b.line}`:""}`:"this PR",[`A reviewer left this comment on ${e} 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!==f.exitCode)return{ok:!1,detail:"agent exited non-zero"};try{await d.worktrees.commitAndPush(c,`Address review feedback on ${b.path??"PR"}`)}catch{return{ok:!1,detail:"no change produced"}}return{ok:!0}}finally{try{await d.worktrees.remove(c,d.repo.path)}catch(a){(0,k.v)(`[review-feedback] worktree cleanup failed for job ${d.job.id}`,a)}}});await a7(b.id,b.prNumber,{forge:c,db:e,gate:{trustedReviewers:f.trustedReviewers,ignoredBots:f.ignoredBots},includeProgressReplies:f.includeProgressReplies,applyFeedback:j})}var bc=c(24532),bd=c(97337);let be={pending:["in_progress","skipped","deferred"],in_progress:["done","skipped","deferred"],deferred:["pending","in_progress","skipped"],done:[],skipped:[]};class bf extends Error{constructor(a,b){super(`invalid subtask transition: ${a} -> ${b}`)}}let bg=/^\s*[-*]\s*\[[ xX]\]\s+(.+?)\s*$/,bh=/^\s*#*\s*(Bug\s+\d+\s*(?:[—:-])\s*.+?)\s*$/;async function bi(a,b={}){let c=function(a){let b=function(a){let b=[];for(let c of a.split("\n")){let a=c.match(bg);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(bh);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){(0,k.v)(`[decompose] agent fallback failed for issue #${a.number}`,b)}return{titles:[],source:"none"}}function bj(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 bk(a,b,c=(0,g.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,bd.Y)(j.issueSubtasks.ordinal)).all()}function bl(a,b,c=(0,g.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(!be[e].includes(b))throw new bf(e,b);return c.update(j.issueSubtasks).set({status:b}).where((0,f.eq)(j.issueSubtasks.id,a)).returning().get()}async function bm(a,b,c=(0,g.Lf)(),d={}){var e,h,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,h=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,h))).get()?.h===l)return{subtasks:bk(a.id,b.number,c),source:"none",skipped:!0};let{titles:m,source:n}=await bi(b,{generate:d.generate}),o=function(a,b,c,d,e=(0,g.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,bd.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}}let bn=new Set(["CANCELLED","ACTION_REQUIRED"]),bo=new Set(["TIMED_OUT"]),bp=/\b(ai|claude|codex|copilot|gpt|llm)\b.*\breview\b|\breview\b.*\b(ai|bot)\b/i,bq=/\bcancell?ed\b|\bsecret\b|\b(rate.?limit|secondary rate)\b|\b5\d\d\b|\b(401|403|unauthorized|forbidden)\b|service unavailable/i,br=/\b(time(d)?.?out|timeout|intermittent|flak(y|e)|econnreset|etimedout|esockettimedout)\b/i,bs=/\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,bt=[{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 bu(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 bt)if(c.test(a))return b;return"unknown"}(a);if("unknown"===d)return{kind:d,evidence:c.slice(-b).join("\n")};let e=bt.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 bv={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 bw=c(53566);let bx=new Set(["FAILURE","ERROR","CANCELLED","TIMED_OUT","ACTION_REQUIRED"]),by=new Set(["PENDING","QUEUED","IN_PROGRESS","WAITING","REQUESTED"]);function bz(a){return 0===a.length?"pending":a.some(a=>bx.has(a.state.toUpperCase()))?"failed":a.some(a=>by.has(a.state.toUpperCase()))?"pending":"passed"}let bA=a=>new Promise(b=>setTimeout(b,a));async function bB(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,s.dk)(a.id,"needs_human",{errorMessage:c.slice(0,500)},e)}async function bC(a,b,c,d,e){let f=Math.round(c/6e4),g=`CI did not complete in time (checks stayed pending for over ${f} min on PR #${b}).`;return await d.gh.commentIssue(a.issueNumber,`${g} Handing over to a human.`),(0,s.yM)(a.id,"status",{reason:"ci wait budget exceeded",prNumber:b},e),(0,s.dk)(a.id,"needs_human",{errorMessage:g.slice(0,500)},e)}async function bD(a,b,c){if(c.autoHeal)return bE(a,b,c,c.autoHeal);let d=c.db??(0,g.Lf)(),e=c.sleep??bA,f=c.pollMs??3e4,h=c.maxPolls??1/0,i=c.ciWaitMs??1/0,j=c.now??Date.now,k=j()+i,l=a,m=0;for(;m<h;){m++;let a=bz(await c.gh.prChecks(b));if("pending"===a){if(j()>=k)return bC(l,b,i,c,d);await e(f);continue}if("passed"===a)return await c.gh.mergePr(b),(0,s.dk)(l.id,"merged",{prNumber:b},d);if((l=(0,s.dk)(l.id,"ci_failed",{prNumber:b},d)).ciRetryCount>=3)return bB(l,b,"CI failed 3 times.",c,d);if(!l.sessionId)return(0,s.yM)(l.id,"status",{reason:"missing session id, cannot resume for CI fix"},d),(0,s.dk)(l.id,"needs_human",{errorMessage:"CI failed but no session id to resume"},d);let g=l.sessionId;l=(0,s.dk)(l.id,"retrying",{ciRetryCount:l.ciRetryCount+1},d);let{evidence:h}=bu(await c.gh.failedRunLog(b),200);await c.resumeSession(l,g,h),l=(0,s.dk)(l.id,"ci_running",{},d)}return(0,s.ax)(l.id,d)??l}async function bE(a,b,c,d){let e,f=c.db??(0,g.Lf)(),h=c.sleep??bA,i=c.pollMs??3e4,j=c.maxPolls??1/0,k=d.budgets??bw.op,l=c.now??d.now??Date.now,m=c.ciWaitMs??1/0,n=l()+m,o=a,p=0;for(;p<j;){p++;let a=await c.gh.prChecks(b),g=bz(a);if("pending"===g){if(l()>=n)return bC(o,b,m,c,f);await h(i);continue}if("passed"===g){if(e){let a=await d.headSha(b);(0,bw.Az)(e.attemptId,{status:"healed",afterSha:a},f),(0,bw.Yv)(e.sessionId,"verifying",f),(0,bw.Yv)(e.sessionId,"healed",f)}return await c.gh.mergePr(b),(0,s.dk)(o.id,"merged",{prNumber:b},f)}let j=a.filter(a=>bx.has(a.state.toUpperCase())),q=await d.headSha(b);if(e){let a=(0,bw.I0)({beforeSha:e.beforeSha,afterSha:q,beforeFailingCount:e.beforeFailing,afterFailingCount:j.length});(0,bw.Az)(e.attemptId,{status:a.verdict,afterSha:q},f);let d=e.sessionId;if(e=void 0,"rejected"===a.verdict)return(0,bw.Yv)(d,"verifying",f),(0,bw.Yv)(d,"escalated",f),bB(o,b,`CI auto-heal: ${a.reason}.`,c,f)}let r=(0,bw.dT)(o.id,b,q,f),t=await c.gh.failedRunLog(b),u=j.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}`,bn.has(f)||bp.test(d)||bq.test(g)?"blocked_external":bo.has(f)||br.test(g)?"flaky_or_ambiguous":bs.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,t)),v=(0,bw.VJ)(r.id,f),w=v.at(-1),x=(0,bw.ZM)({failures:u,attempts:v.map(a=>({fingerprint:a.fingerprint})),lastAttemptAt:w?1e3*w.createdAt:null,now:l(),activeRuns:(0,bw.Bz)(f),budgets:k});switch(x.action){case"block":return"triaging"===r.status&&(0,bw.Yv)(r.id,"blocked",f),await c.gh.commentIssue(o.issueNumber,`CI auto-heal: ${x.reason} — not auto-fixable. Handing over to a human.`),(0,s.dk)(o.id,"needs_human",{errorMessage:`auto-heal blocked: ${x.reason}`.slice(0,500)},f);case"escalate":return"triaging"===r.status&&(0,bw.Yv)(r.id,"escalated",f),bB(o,b,`CI auto-heal: ${x.reason}.`,c,f);case"wait_slot":await h(i);continue;case"cooldown":await h(Math.min(x.waitMs,i));continue;case"repair":case"rerun":{let a=o.sessionId;if(!a)return"triaging"===r.status&&(0,bw.Yv)(r.id,"escalated",f),bB(o,b,"CI failed but no session id to resume.",c,f);let d=(0,bw.Z7)(r.id,x.target,q,f);if((0,bw.Yv)(r.id,"awaiting_slot",f),(0,bw.Yv)(r.id,"repairing",f),o=(0,s.dk)(o.id,"ci_failed",{prNumber:b},f),o=(0,s.dk)(o.id,"retrying",{ciRetryCount:o.ciRetryCount+1},f),"repair"===x.action){let b=function(a){let{kind:b,evidence:c}=bu(a.log,a.maxLines);return[`CI check "${a.checkName}" is failing on this PR.`,bv[b],"Fix only this failure, then commit and push. Failure evidence:\n",c].join("\n")}({checkName:x.target.checkName,log:t,maxLines:k.maxEvidenceLines});await c.resumeSession(o,a,b)}(0,bw.Yv)(r.id,"awaiting_ci",f),o=(0,s.dk)(o.id,"ci_running",{},f),e={attemptId:d.id,sessionId:r.id,beforeSha:q,beforeFailing:j.length};continue}}}return(0,s.ax)(o.id,f)??o}async function bF(a,b,c,d=(0,g.Lf)(),e={}){for(let f of c)try{let c=await b.viewIssue(f.number),g=await bm(a,{number:c.number,title:c.title,body:c.body},d,{generate:e.generate});if(!g.skipped&&g.subtasks.length>=2){let a=bj(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:
|
|
7
|
+
|
|
8
|
+
${a}`)}}catch(b){(0,k.v)(`[subtasks] decomposition failed for ${a.name}#${f.number}`,b)}}function bG(a,b,c=(0,g.Lf)()){for(let d of bk(a,b,c))"in_progress"===d.status&&(bl(d.id,"deferred",c),bl(d.id,"pending",c))}function bH(a,b){if(a.length<=b)return a;let c=a.length-b;return`${a.slice(0,b)}
|
|
9
|
+
…[truncated ${c} chars]`}let bI=C.Ik({ordinal:C.ai().int().nonnegative(),status:C.k5(["done","pending","deferred"]),reason:C.Yj().default("")}),bJ=C.Ik({summary:C.Yj().default(""),verdicts:C.YO(bI).default([])});async function bK(a){let b,{job:c,prNumber:d,repo:e,forge:f,db:h,provider:i,command:j,model:m}=a;try{let k=await f.prDiff(d);if(!k.trim())return null;let o=await f.viewIssue(c.issueNumber),p=bk(e.id,c.issueNumber,h),q={issueNumber:c.issueNumber,issueTitle:o.title,issueBody:o.body,subtasks:p.map(a=>({ordinal:a.ordinal,title:a.title})),diff:k},r=a.generate;if(!r){var n;let c;b=await (0,aR.mkdtemp)((0,am.join)((0,u.tmpdir)(),"drydock-verify-")),c=(n={provider:i,command:j,model:m,cwd:b,repoId:e.id,db:h,runner:a.runner}).timeoutMs??18e4,r=async a=>{try{var b;let d,e,f,{text:g,exitCode:h}=await aU({provider:n.provider,command:n.command,model:n.model,cwd:n.cwd,prompt:(d=bH(a.issueBody.trim(),6e3),e=bH(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:n.repoId,type:"verify",timeoutMs:c,runner:n.runner,db:n.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=bJ.safeParse(f);return j.success?j.data:null}catch{return null}}}let t=await r(q);if(!t)return(0,s.yM)(c.id,"verification",{ok:!1},h),null;let v=function(a,b,c,d=(0,g.Lf)()){let e=new Map(bk(a,b,d).map(a=>[a.ordinal,a])),f=0,h=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 bl(a.id,"done",b);bl(a.id,"in_progress",b),bl(a.id,"done",b)}catch{}}(b,d),f+=1;else if("deferred"===a.status)try{bl(b.id,"deferred",d),h+=1}catch{}else i.push(b.title)}return{done:f,deferred:h,pendingTitles:i}}(e.id,c.issueNumber,t,h);return await f.commentIssue(c.issueNumber,(0,l.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")}(t,v))),(0,s.yM)(c.id,"verification",{ok:!0,summary:t.summary,done:v.done,deferred:v.deferred,pending:v.pendingTitles.length},h),t}catch(a){return(0,k.v)(`[verify] verification pass failed for ${e.name}#${c.issueNumber}`,a),null}finally{if(b)try{await (0,aR.rm)(b,{recursive:!0,force:!0})}catch{}}}async function bL(a,b={}){let c=b.db??(0,g.Lf)(),d=b.notify??((a,b)=>n(a,b,c)),e=await bM(a,b,d);return"merged"===e.status?await d("pr_merged",`✅ Merged: ${e.repoId}#${e.issueNumber} (PR #${e.prNumber}).`):"needs_human"===e.status?await d("needs_human",`⚠️ Needs human: ${e.repoId}#${e.issueNumber} — ${e.errorMessage??"review required"}.`):"aborted"===e.status&&await d("job_failed",`🛑 Aborted: ${e.repoId}#${e.issueNumber} — ${e.errorMessage??"job aborted"}.`),e}async function bM(a,b,c){let d,e=b.db??(0,g.Lf)(),f=(0,s.ax)(a,e);if(!f)throw Error(`job ${a} not found`);let h=(0,W.L8)(f.repoId,e);if(!h)throw Error(`repo ${f.repoId} not found`);"queued"===f.status&&(0,s.dk)(f.id,"working",{},e);let j=b.worktrees??new as,l=(0,X.Ie)(h),m=V(f.agent),n=ak(m,e),o=(0,i.mt)(e),p=h.maxJobMinutes??o.maxJobMinutes,q=6e4*p,r=(h.maxCiWaitMinutes??o.maxCiWaitMinutes)*6e4,t=h.maxJobCostUsd??o.maxJobCostUsd,u=b.runSession??((a,b,c)=>aB(a,b,c,{db:e,provider:m,command:n,timeoutMs:q,costCapUsd:t})),v=b.createPr??(a=>l.createPr(a)),w=b.runBabysitter??((a,b)=>bD(a,b,{gh:l,db:e,ciWaitMs:r,resumeSession:(a,b,c)=>aC(a,b,c,h.path,{db:e,provider:m,command:n,timeoutMs:q,costCapUsd:t}).then(()=>void 0),autoHeal:h.autoHealCi?{headSha:a=>l.prHeadSha(a),provider:h.platform}:void 0})),x=b.verify??((a,b)=>bK({job:a,prNumber:b,repo:h,forge:l,db:e,provider:m,command:n,model:a.model??h.defaultModel}).then(()=>void 0));try{var y,z;let a;d=await j.prepare(h,f.id,f.issueNumber),(0,s.yM)(f.id,"worktree",{path:d.path,branch:d.branch},e);let b=(0,aw.Xm)((0,aw.yx)(h.id,av._.main,e),{ISSUE_NUM:f.issueNumber,BRANCH:d.branch,REPO_NAME:h.name});if(h.autoDecompose){let a=bk(h.id,f.issueNumber,e);a.length>0&&(b+=(y=a.map(a=>({title:a.title,status:a.status})),0===y.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",bj(y)].join("\n")),function(a,b,c=(0,g.Lf)()){for(let d of bk(a,b,c))"pending"===d.status&&bl(d.id,"in_progress",c)}(h.id,f.issueNumber,e))}b+=(z=h.agentInstructions,(a=z?.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",a.slice(0,4e3)].join("\n"):"");let i=await u((0,s.ax)(f.id,e),b,d.path);if(i.timedOut)return h.autoDecompose&&bG(h.id,f.issueNumber,e),(0,s.dk)(f.id,"needs_human",{errorMessage:`${m.label} timed out after ${p} minutes`},e);if(i.costExceeded)return h.autoDecompose&&bG(h.id,f.issueNumber,e),(0,s.dk)(f.id,"needs_human",{errorMessage:`per-job cost limit of $${t} reached`},e);if(i.spawnError)return h.autoDecompose&&bG(h.id,f.issueNumber,e),(0,s.dk)(f.id,"needs_human",{errorMessage:`failed to start ${n}: ${i.spawnError.message}`},e);if(0!==i.exitCode)return h.autoDecompose&&bG(h.id,f.issueNumber,e),(0,s.dk)(f.id,"needs_human",{errorMessage:`${m.label} exited non-zero`},e);if(h.adrGating){let a=(0,bc.Pe)("pending_review",e,h.id);if(a.length>0)return h.autoDecompose&&bG(h.id,f.issueNumber,e),(0,s.dk)(f.id,"needs_human",{errorMessage:`Blocked by ${a.length} pending ADR review(s).`},e)}try{await j.commitAndPush(d,`Fix #${f.issueNumber}`)}catch(a){if(a instanceof ar)return h.autoDecompose&&bG(h.id,f.issueNumber,e),(0,s.dk)(f.id,"needs_human",{errorMessage:"Agent produced no changes"},e);throw a}let k=(0,ab.ts)(h.id,e).find(a=>a.number===f.issueNumber)?.title??`Fix #${f.issueNumber}`,l=await v({head:d.branch,base:h.defaultBranch,title:k,body:`Closes #${f.issueNumber}`});if((0,s.dk)(f.id,"ci_running",{branch:d.branch,prNumber:l},e),await c("pr_opened",`🔀 PR opened: ${h.id}#${f.issueNumber} (PR #${l}).`),h.verifyPr)try{await x((0,s.ax)(f.id,e),l)}catch(b){let a=b instanceof Error?b.message:String(b);(0,s.yM)(f.id,"error",{message:`verification pass failed: ${a}`},e)}let o=await w((0,s.ax)(f.id,e),l);return h.autoDecompose&&("merged"===o.status?!function(a,b,c=(0,g.Lf)()){for(let d of bk(a,b,c))!function(a,b){let c=a.status;if("done"!==c&&"skipped"!==c){if("in_progress"===c)return bl(a.id,"done",b);bl(a.id,"in_progress",b),bl(a.id,"done",b)}}(d,c)}(h.id,f.issueNumber,e):bG(h.id,f.issueNumber,e)),o}catch(c){let a=c instanceof Error?c.message:String(c);(0,s.yM)(f.id,"error",{message:a},e);let b=(0,s.ax)(f.id,e);if(["working","ci_running","retrying"].includes(b.status))return h.autoDecompose&&bG(h.id,f.issueNumber,e),(0,s.dk)(f.id,"needs_human",{errorMessage:a.slice(0,500)},e);return b}finally{if(d)try{await j.remove(d,h.path)}catch(a){(0,k.v)(`[run-job] worktree cleanup failed for job ${f.id}`,a)}}}let bN=!1,bO=new Set;function bP(a){let b=(0,aD.openSync)(a,"wx");try{(0,aD.writeSync)(b,JSON.stringify({pid:process.pid,ts:Date.now()}))}finally{(0,aD.closeSync)(b)}}let bQ={active:!1};function bR(a,b,c,d,e={}){var f;let g=V(a.agent),h=(f={provider:g,command:ak(g,d),model:a.defaultModel,cwd:a.path,runner:e.runner},async a=>{let{text:b,exitCode:c}=await aU({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)return[];let d=b.match(/\[[\s\S]*\]/);if(!d)return[];try{let a=JSON.parse(d[0]);if(!Array.isArray(a))return[];return a.filter(a=>"string"==typeof a).map(a=>a.trim()).filter(Boolean)}catch{return[]}});return bF(a,b,c,d,{generate:h})}let bS=["needs_human","aborted"];async function bT(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&&!!af(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,[...bS]))).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 bU=["queued","working","ci_running","ci_failed","retrying"],bV=["working","ci_running","ci_failed","retrying"];async function bW(a={}){let b=a.db??(0,g.Lf)(),c=a.runJob??bL,d=(0,W.uP)(b),e=a.triage??aj,l=a.decompose??bR;for(let c of d)try{await (0,Y.v)("low",async()=>{let d=a.forgeFor?.(c)??(0,X.Ie)(c),h=a.fetchIssues??(async(a,b)=>(await d.refreshRateLimit?.(),d.listAllIssues())),i=await h(c.path,c.queueLabel);(0,ab.VK)(c.id,i,b);let k=b.select().from(j.issues).where((0,f.eq)(j.issues.repoId,c.id)).all(),m=new Map(k.map(a=>[a.number,a])),n=ae(c);if(n.autoTriageEnabled&&await e(c,d,i,b),n.autoDecompose){let a=i.filter(a=>{let b=a.labels.map(a=>a.name);return b.includes(c.queueLabel)||b.some(a=>n.readyLabels.includes(a))});a.length>0&&await l(c,d,a,b)}for(let a of i){var o,p;let e=a.labels.map(a=>a.name),h=e.includes(c.queueLabel),i=!!n.autoProcessEnabled&&await bT(c,n,d,a,e,b);if(!h&&!i)continue;let k=aa({number:a.number,title:a.title,labels:e});if("approved"!==k.decision||function(a,b,c){return(0,s.i1)([...bU],a).some(a=>a.repoId===b&&a.issueNumber===c)}(b,c.id,a.number))continue;i&&a.author&&n.priorityAuthors.includes(a.author)&&(o=c.id,p=a.number,b.update(j.issues).set({priority:-1}).where((0,f.Uo)((0,f.eq)(j.issues.repoId,o),(0,f.eq)(j.issues.number,p))).run());let l=m.get(a.number);!function(a,b=(0,g.Lf)()){let c=a.dedupeKey??`${a.repoId}:${a.issueNumber}`;if(!b.select({id:j.jobs.id}).from(j.jobs).where((0,f.Uo)((0,f.eq)(j.jobs.dedupeKey,c),(0,f.KL)(j.jobs.status,[...v.kl]))).get())try{(0,s._S)({...a,dedupeKey:c},b)}catch(a){if(a instanceof Error&&"string"==typeof a.code&&"SQLITE_CONSTRAINT_UNIQUE"===a.code)return;throw a}}({repoId:c.id,issueNumber:a.number,model:l?.modelOverride??c.defaultModel,agent:l?.agentOverride??c.agent},b)}})}catch(a){a instanceof Z.OE?console.debug(`[driver] ${c.name} sweep yielded: ${a.message}`):(0,k.v)(`[driver] issue sync failed for ${c.name}`,a)}q("cost_limit"===(0,i.Jf)(b).reason,bQ,b),y({expiredBefore:Math.floor(Date.now()/1e3)},b);let m=(0,i.mt)(b).maxParallelJobs,n=x();for(;!bN&&(0,i.Jf)(b).allowed&&bO.size<m;){let a=d.filter(a=>(0,i.DA)(a.id,b).allowed).filter(a=>!(a.sequential&&function(a,b){return(0,s.i1)([...bV],a).some(a=>a.repoId===b)}(b,a.id))).map(a=>a.id);if(0===a.length)break;let e=function(a={},b=(0,g.Lf)()){let{repoIds:c}=a;if(c&&0===c.length)return;let d=a.leaseMs??3e4,e=a.worker??x(),i=a.now??w();return b.transaction(a=>{let b=a.select({job:j.jobs}).from(j.jobs).leftJoin(j.issues,(0,f.Uo)((0,f.eq)(j.issues.repoId,j.jobs.repoId),(0,f.eq)(j.issues.number,j.jobs.issueNumber))).where((0,f.Uo)((0,f.eq)(j.jobs.status,"queued"),(0,f.or)((0,f.kZ)(j.jobs.availableAt),(0,f.wJ)(j.jobs.availableAt,i)),c?(0,f.RV)(j.jobs.repoId,c):void 0)).orderBy((0,h.ll)`COALESCE(${j.issues.priority}, 1e9)`,j.jobs.createdAt).get()?.job;if(b)return(0,s.dk)(b.id,"working",{leaseToken:(0,t.randomUUID)(),leaseExpiresAt:i+Math.ceil(d/1e3),workerId:e,attempts:b.attempts+1,availableAt:null},a)})}({repoIds:a,worker:n,leaseMs:3e4},b);if(!e)break;let l=e.id,m=e.leaseToken;bO.add(l);let o=setInterval(()=>{try{!function(a,b,c={},d=(0,g.Lf)()){let e=c.leaseMs??3e4,h=c.now??w();d.update(j.jobs).set({leaseExpiresAt:h+Math.ceil(e/1e3)}).where((0,f.Uo)((0,f.eq)(j.jobs.id,a),(0,f.eq)(j.jobs.leaseToken,b),(0,f.eq)(j.jobs.status,"working"))).run().changes}(l,m,{},b)}catch(a){(0,k.v)(`[driver] heartbeat failed for job ${l}`,a)}},1e4);o.unref?.(),c(l).catch(a=>(0,k.v)(`[driver] job ${l} failed`,a)).finally(()=>{clearInterval(o),function(a,b,c=(0,g.Lf)()){c.update(j.jobs).set({leaseToken:null,leaseExpiresAt:null,workerId:null}).where((0,f.Uo)((0,f.eq)(j.jobs.id,a),(0,f.eq)(j.jobs.leaseToken,b))).run().changes}(l,m,b),bO.delete(l)})}let o=a.reviewFeedback??(a=>ba({db:a}));try{await (0,Y.v)("low",()=>o(b))}catch(a){(0,k.v)("[driver] review-feedback sweep failed",a)}let p=a.deploymentHealing??(a=>aM({db:a}));try{await (0,Y.v)("low",()=>p(b))}catch(a){(0,k.v)("[driver] deployment-healing sweep failed",a)}let r=a.releaseManagement??(a=>aY({db:a}));try{await (0,Y.v)("low",()=>r(b))}catch(a){(0,k.v)("[driver] release-management sweep failed",a)}}let bX=!1,bY=!1,bZ=/^job-(\d+)$/,b$=/^fb-(\d+)-/,b_=/^dh-(\d+)-/;async function b0(a={}){let b=a.db??(0,g.Lf)(),c=a.run??al.S,d=function(a){let b=a.select({id:j.jobs.id,status:j.jobs.status}).from(j.jobs).all(),c=new Set;for(let a of b)v.kl.includes(a.status)||c.add(a.id);return c}(b),e=0;for(let a of(0,W.uP)(b)){let b;await c("git",["-C",a.path,"worktree","prune"]).catch(()=>void 0);let f=ap(a.name);try{b=(0,aD.readdirSync)(f,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name)}catch{continue}for(let g of b){let b=bZ.exec(g)??b$.exec(g)??b_.exec(g);if(!b||d.has(Number(b[1])))continue;let h=(0,am.join)(f,g);await c("git",["-C",a.path,"worktree","remove","--force",h]).catch(()=>void 0);try{(0,aD.rmSync)(h,{recursive:!0,force:!0}),e++}catch(a){(0,k.v)(`[worktree-reaper] failed to remove ${h}`,a)}}}return e}let b1=!1,b2=new Map;function b3(a,b){b2.set(a,b)}function b4(a){b2.delete(a)}function b5(a,b=5e3){let c=b2.get(a);return"function"==typeof c&&(c(b),b2.delete(a),!0)}function b6(a=5e3){let b=[...b2.keys()];for(let b of b2.values())b(a);return b2.clear(),b}async function b7(){bN=!0,bX=!1,e&&clearTimeout(e),e=void 0,await r().catch(a=>(0,k.v)("[orchestrator] drain notify failed",a)),b6(5e3),await function(a=3e4,b=100){let c=Date.now()+a;return new Promise(a=>{let d=()=>{if(0===bO.size||Date.now()>=c)return a();setTimeout(d,b)};d()})}(8e3);try{let a=(0,g.Lf)();for(let b of a.select().from(j.jobs).where((0,f.RV)(j.jobs.status,["working","ci_running","ci_failed","retrying"])).all())try{(0,s.dk)(b.id,"interrupted",{},a)}catch(a){(0,k.v)(`[orchestrator] shutdown transition failed for job ${b.id}`,a)}}catch(a){(0,k.v)("[orchestrator] shutdown DB update failed",a)}}function b8(){if(b1)return;if(b1=!0,!process.env.VITEST){try{let{requeued:a,interrupted:b}=function(a=(0,g.Lf)()){return{requeued:y({},a),interrupted:function(a=(0,g.Lf)()){let b=a.select().from(j.jobs).where((0,f.RV)(j.jobs.status,z)).all();for(let c of b)a.update(j.jobs).set({status:"interrupted"}).where((0,f.eq)(j.jobs.id,c.id)).run(),(0,s.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,k.v)("[orchestrator] recovery failed",a)}if(function(){let a=(0,am.join)(an(),"instance.lock");(0,aD.mkdirSync)((0,am.dirname)(a),{recursive:!0});try{return bP(a),!0}catch{}let b=!1;try{let{pid:c}=JSON.parse((0,aD.readFileSync)(a,"utf8"));!function(a){try{return process.kill(a,0),!0}catch{return!1}}(c)&&(b=!0)}catch{b=!0}if(!b)return!1;try{return(0,aD.unlinkSync)(a),bP(a),!0}catch{return!1}}()){let a,b;b0().then(a=>{a>0&&console.log(`[orchestrator] reaped ${a} orphaned worktree(s)`)}).catch(a=>(0,k.v)("[orchestrator] worktree reap failed",a)),function(a={}){if(bX)return;bX=!0;let b=a.tick??(()=>bW()),c=a.intervalMs??1e3*(0,i.mt)().pollIntervalSec,d=async()=>{if(bX){if(!bY){bY=!0;try{await b()}catch(a){(0,k.v)("[driver] tick failed",a)}finally{bY=!1}}bX&&(e=setTimeout(d,c))}};d()}(),(a=()=>{try{let{jobEventsDeleted:a}=function(a=(0,g.Lf)(),b={}){let c=b.days??(0,i.mt)(a).retentionDays,d=b.vacuum??!0,e=Math.floor((b.now?.getTime()??Date.now())/1e3)-86400*c,k=a.select({id:j.jobs.id}).from(j.jobs).where((0,f.Uo)((0,f.Pe)(j.jobs.finishedAt),(0,f.lt)(j.jobs.finishedAt,e))).all().map(a=>a.id),l=0;return k.length>0&&(l=a.delete(j.jobEvents).where((0,f.RV)(j.jobEvents.jobId,k)).run().changes),d&&a.run((0,h.ll)`VACUUM`),{jobEventsDeleted:l,vacuumed:d,cutoff:e}}((0,g.Lf)());a>0&&console.log(`[orchestrator] pruned ${a} job event(s)`)}catch(a){(0,k.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 b7(),process.exit(0)};process.once("SIGINT",a),process.once("SIGTERM",a)}}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";exports.id=675,exports.ids=[675],exports.modules={2874:(a,b,c)=>{c.d(b,{a:()=>A});var d=c(37477),e=c(73801);let f={"claude-opus-4-8":{inputPerMTok:5,outputPerMTok:25,cacheWritePerMTok:6.25,cacheReadPerMTok:.5},"claude-opus-4-7":{inputPerMTok:15,outputPerMTok:75,cacheWritePerMTok:18.75,cacheReadPerMTok:1.5},"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}},g=Object.values(f).reduce((a,b)=>b.outputPerMTok>a.outputPerMTok?b:a,{inputPerMTok:0,outputPerMTok:0,cacheWritePerMTok:0,cacheReadPerMTok:0});var h=c(14868);let i=h.Ik({input_tokens:h.ai().optional(),output_tokens:h.ai().optional(),cache_creation_input_tokens:h.ai().optional(),cache_read_input_tokens:h.ai().optional()}).passthrough(),j=h.Ik({type:h.eu("system"),subtype:h.Yj().optional(),session_id:h.Yj().optional(),model:h.Yj().optional()}),k=h.Ik({type:h.eu("assistant"),message:h.Ik({role:h.eu("assistant"),content:h.YO(h.g1(h.Yj(),h.L5())),usage:i.optional()})}),l=h.Ik({type:h.eu("user"),message:h.Ik({role:h.eu("user"),content:h.YO(h.g1(h.Yj(),h.L5()))})}),m=h.Ik({type:h.eu("result"),subtype:h.Yj().optional(),session_id:h.Yj().optional(),is_error:h.zM().optional(),total_cost_usd:h.ai().optional(),usage:i.optional()}),n=h.gM("type",[j,k,l,m]);function o(a){return a instanceof Error?a.message:String(a)}function p(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 q{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=n.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=p(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=p(b.message.content):(c.sessionId=b.session_id,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:o(b)}),null}return b?(b.sessionId&&(this.sessionId=b.sessionId),b.model&&(this.model=b.model),"result"===b.type?(b.inputTokens>0&&(this.totalInputTokens=b.inputTokens),b.outputTokens>0&&(this.totalOutputTokens=b.outputTokens),b.cacheReadInputTokens>0&&(this.totalCacheReadInputTokens=b.cacheReadInputTokens),void 0!==b.costUsd&&(this.costUsd=b.costUsd)):(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}}let r="gpt-5-codex",s={"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}},t=Object.values(s).reduce((a,b)=>b.outputPerMTok>a.outputPerMTok?b:a,{inputPerMTok:0,outputPerMTok:0,cacheWritePerMTok:0,cacheReadPerMTok:0}),u=h.Ik({input_tokens:h.ai().optional(),cached_input_tokens:h.ai().optional(),output_tokens:h.ai().optional(),reasoning_output_tokens:h.ai().optional()}).passthrough(),v=h.Ik({id:h.Yj().optional(),item_type:h.Yj().optional(),text:h.Yj().optional(),command:h.Yj().optional(),exit_code:h.ai().optional(),server:h.Yj().optional(),tool:h.Yj().optional()}).passthrough(),w=h.Ik({type:h.Yj(),thread_id:h.Yj().optional(),usage:u.optional(),item:v.optional()}).passthrough();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);var d=w.parse(c);let e={type:"assistant",chunks:[],inputTokens:0,outputTokens:0,cacheCreationInputTokens:0,cacheReadInputTokens:0,isError:!1,raw:d};if("thread.started"===d.type)return{...e,type:"system",sessionId:d.thread_id};if("item.completed"===d.type&&d.item)return{...e,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[]}}(d.item)};if("turn.completed"===d.type){let a=d.usage;return{...e,type:"result",inputTokens:a?.input_tokens??0,outputTokens:(a?.output_tokens??0)+(a?.reasoning_output_tokens??0)}}return"turn.failed"===d.type||"error"===d.type?{...e,type:"result",isError:!0}:null}(a)}catch(b){return this.onParseError?.({line:a.trim(),message:o(b)}),null}return b?(b.sessionId&&(this.sessionId=b.sessionId),this.totalInputTokens+=b.inputTokens,this.totalOutputTokens+=b.outputTokens,b):null}constructor(){this.buffer="",this.totalInputTokens=0,this.totalOutputTokens=0,this.costUsd=0}}let y={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 q,estimateCost:function(a,b,c,d=0,e=0){let h=function(a){if(!a)return g;let b=f[a];return b||(console.warn(`[drydock] Unknown model id "${a}" — using max-priced fallback to avoid under-counting cost`),g)}(a);return b/1e6*h.inputPerMTok+c/1e6*h.outputPerMTok+d/1e6*h.cacheWritePerMTok+e/1e6*h.cacheReadPerMTok}},codex:{id:"codex",label:"Codex CLI",defaultCommand:"codex",supportsResume:!0,resumeModel:r,resumeMaxTurns:15,defaultModel:r,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,estimateCost:function(a,b,c){let d=function(a){if(!a)return t;let b=s[a];return b||(console.warn(`[drydock] Unknown codex model id "${a}" — using max-priced fallback to avoid under-counting cost`),t)}(a);return b/1e6*d.inputPerMTok+c/1e6*d.outputPerMTok}}},z=["claude","codex"].map(a=>y[a]);function A({value:a,onChange:b,id:c,className:f}){return(0,d.jsx)(e.l,{id:c,value:a,onChange:a=>b(a.target.value),className:f,children:z.map(a=>(0,d.jsx)("option",{value:a.id,children:a.label},a.id))})}},23325:(a,b,c)=>{c.d(b,{L6:()=>d,UB:()=>e,VJ:()=>g,tT:()=>f});let d=[{id:"claude-opus-4-8",label:"Claude Opus 4.8",agent:"claude"},{id:"claude-opus-4-7",label:"Claude Opus 4.7",agent:"claude"},{id:"claude-sonnet-4-5",label:"Claude Sonnet 4.5",agent:"claude"},{id:"claude-haiku-4-5",label:"Claude Haiku 4.5",agent:"claude"},{id:"gpt-5-codex",label:"GPT-5 Codex",agent:"codex"},{id:"gpt-5",label:"GPT-5",agent:"codex"},{id:"gpt-5-mini",label:"GPT-5 Mini",agent:"codex"}],e="claude-opus-4-8";function f(a){return d.filter(b=>b.agent===a)}function g(a){return f(a)[0]?.id??e}},29974:(a,b,c)=>{c.d(b,{o:()=>g});var d=c(37477),e=c(73801),f=c(23325);function g({value:a,onChange:b,agent:c,id:h,className:i}){let j=c?(0,f.tT)(c):f.L6;return(0,d.jsx)(e.l,{id:h,value:a,onChange:a=>b(a.target.value),className:i,children:j.map(a=>(0,d.jsx)("option",{value:a.id,children:a.label},a.id))})}},73801:(a,b,c)=>{c.d(b,{l:()=>g});var d=c(37477),e=c(54848),f=c(2210);let g=e.forwardRef(({className:a,...b},c)=>(0,d.jsx)("select",{ref:c,className:(0,f.cn)("h-9 rounded-md border border-input bg-background px-2.5 text-sm text-foreground","focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 focus:ring-offset-background","disabled:cursor-not-allowed disabled:opacity-50",a),...b}));g.displayName="Select"}};
|