@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,24 @@
|
|
|
1
|
+
exports.id=468,exports.ids=[468],exports.modules={526:(a,b,c)=>{"use strict";c.d(b,{OX:()=>m,Nx:()=>p});var d=c(54452),e=c(55710),f=c(84654);let g=["resolved","failed","rejected","flagged"],h={pending:["queued","rejected","flagged"],queued:["in_progress","flagged","rejected"],in_progress:["resolved","failed","flagged","queued"],resolved:[],failed:[],rejected:[],flagged:[]};class i extends Error{constructor(a,b){super(`invalid feedback transition: ${a} -> ${b}`)}}let j=/\b(out of scope|follow[- ]?up|separate pr|different pr|unrelated|won'?t fix|nevermind|never mind|ignore this)\b/i,k=/\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 l(a,b,c={},g=(0,e.Lf)()){let j=g.select().from(f.reviewFeedbackItems).where((0,d.eq)(f.reviewFeedbackItems.id,a)).get();if(!j)throw Error(`review feedback item ${a} not found`);var k=j.status;if(!h[k].includes(b))throw new i(k,b);return g.update(f.reviewFeedbackItems).set({status:b,detail:c.detail??j.detail,attempts:"in_progress"===b?j.attempts+1:j.attempts,updatedAt:Math.floor(Date.now()/1e3)}).where((0,d.eq)(f.reviewFeedbackItems.id,a)).returning().get()}function m(a,b=(0,e.Lf)()){return b.select().from(f.reviewFeedbackItems).where((0,d.eq)(f.reviewFeedbackItems.jobId,a)).all()}let n={maxItemsPerSweep:3,maxAttemptsPerItem:2};async function o(a,b,c){var d;let e=(d=b.id,`<!-- drydock:review-feedback:${d} -->`),f=`${c}
|
|
2
|
+
|
|
3
|
+
${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 p(a,b,c){let h=c.db??(0,e.Lf)(),i=c.budgets??n,m={processed:0,resolved:0,flagged:0,rejected:0,failed:0,skipped:0},p=await c.forge.listReviewThreads(b),q=0;for(let n of p){var r;if(n.isResolved){m.skipped++;continue}let p=n.comments[0];if(!p||!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)}(p.author,c.gate)){m.skipped++;continue}let s=function(a){let b=a.trim();return j.test(b)?"out_of_scope":k.test(b)?"actionable":b.includes("?")?"question":"actionable"}(p.body),t=function(a,b=(0,e.Lf)()){let c=function(a,b,c=(0,e.Lf)()){return c.select().from(f.reviewFeedbackItems).where((0,d.Uo)((0,d.eq)(f.reviewFeedbackItems.jobId,a),(0,d.eq)(f.reviewFeedbackItems.threadId,b))).get()}(a.jobId,a.threadId,b);return c||b.insert(f.reviewFeedbackItems).values({jobId:a.jobId,prNumber:a.prNumber,threadId:a.threadId,reviewer:a.reviewer,classification:a.classification}).returning().get()}({jobId:a,prNumber:b,threadId:n.id,reviewer:p.author,classification:s},h);if(r=t.status,g.includes(r)){m.skipped++;continue}if("pending"===t.status)try{await c.forge.reactToReviewComment(p.id,"EYES")}catch{}if("pending"===t.status){if("question"===s){t=l(t.id,"flagged",{},h),await o(c.forge,n,"Drydock: this looks like a question rather than a change request, so it's flagged for a human reviewer."),m.flagged++,m.processed++;continue}if("out_of_scope"===s){t=l(t.id,"rejected",{},h),await o(c.forge,n,"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(n.id),m.rejected++,m.processed++;continue}t=l(t.id,"queued",{},h)}if("queued"===t.status){if(q>=i.maxItemsPerSweep)continue;if(t.attempts>=i.maxAttemptsPerItem){t=l(t.id,"flagged",{},h),await o(c.forge,n,`Drydock: could not resolve this after ${t.attempts} attempt(s); flagging for a human.`),m.flagged++,m.processed++;continue}q++,t=l(t.id,"in_progress",{},h),c.includeProgressReplies&&await o(c.forge,n,"Drydock: working on this now…");let a=await c.applyFeedback(t,n);m.processed++,a.ok?(l(t.id,"resolved",{detail:a.detail},h),await o(c.forge,n,"Drydock: applied this change and pushed a commit. ✅"),await c.forge.resolveReviewThread(n.id),m.resolved++):t.attempts>=i.maxAttemptsPerItem?(l(t.id,"failed",{detail:a.detail},h),await o(c.forge,n,`Drydock: could not apply this automatically (${a.detail??"no change produced"}); flagging for a human.`),m.failed++):l(t.id,"queued",{detail:a.detail},h)}}return m}},2210:(a,b,c)=>{"use strict";function d(...a){return a.filter(Boolean).join(" ")}c.d(b,{cn:()=>d})},2373:(a,b,c)=>{"use strict";c.d(b,{Pe:()=>g,eT:()=>h});var d=c(54452),e=c(55710),f=c(84654);function g(a,b=(0,e.Lf)(),c){let h=[];return a&&h.push((0,d.eq)(f.adrs.status,a)),void 0!==c&&h.push((0,d.eq)(f.adrs.repoId,c)),(h.length?b.select().from(f.adrs).where((0,d.Uo)(...h)).all():b.select().from(f.adrs).all()).sort((a,b)=>b.createdAt-a.createdAt)}function h(a,b,c=(0,e.Lf)()){let g=c.update(f.adrs).set({status:b}).where((0,d.eq)(f.adrs.id,a)).returning().get();if(!g)throw Error(`adr ${a} not found`);return g}},6844:(a,b,c)=>{"use strict";c.d(b,{AU:()=>k,aE:()=>j,o$:()=>l});var d=c(15465),e=c(66406),f=c(96684),g=c(51605),h=c(15629),i=c(61195);async function j(a){let b=(0,h.dk)(a,"queued");return(0,e.revalidatePath)("/needs-human"),(0,e.revalidatePath)("/"),(0,e.revalidatePath)(`/repos/${b.repoId}`),b}async function k(a){(0,i.abortJob)(a);let b=(0,h.dk)(a,"aborted");return(0,e.revalidatePath)("/needs-human"),(0,e.revalidatePath)("/"),(0,e.revalidatePath)(`/jobs/${a}`),(0,e.revalidatePath)(`/repos/${b.repoId}`),b}async function l(){let a=(0,g.mt)();(0,g.DZ)({paused:!0}),await (0,f.Dp)(a.paused,!0);let b=(0,i.abortAllJobs)();for(let a of b)try{(0,h.dk)(a,"aborted")}catch{}return(0,e.revalidatePath)("/"),(0,e.revalidatePath)("/needs-human"),(0,e.revalidatePath)("/settings"),{paused:!0,aborted:b.length}}(0,c(72269).D)([j,k,l]),(0,d.A)(j,"4011e21222e2b56613c057bbde429dbabe6a309359",null),(0,d.A)(k,"406ec111693d339611cf8ea33d5f97241962673b65",null),(0,d.A)(l,"00e11e1cd8053120843b8dd2d222841edf7946ac37",null)},14921:(a,b,c)=>{"use strict";c.d(b,{g:()=>e,gT:()=>i,sM:()=>h});var d=c(57729);function e(a){let b;try{b=new URL(a)}catch{return!1}return"http:"===b.protocol||"https:"===b.protocol}function f(a){if(!/^\d{1,3}(\.\d{1,3}){3}$/.test(a))return null;let b=a.split(".").map(Number);return b.some(a=>a>255)?null:b}function g(a){let b=f(a);if(!b)return!1;let[c,d]=b;return 0===c||10===c||127===c||169===c&&254===d||172===c&&d>=16&&d<=31||192===c&&168===d||100===c&&d>=64&&d<=127||!1}function h(a,b={}){let c;try{c=new URL(a)}catch{throw new d.Q8(`invalid forge URL: ${a}`)}if("http:"!==c.protocol&&"https:"!==c.protocol)throw new d.Q8(`forge URL must use http(s): ${c.protocol}`);if(!b.allowPrivate&&function(a){let b=a.trim().toLowerCase().replace(/^\[/,"").replace(/\]$/,"");if(""===b||"localhost"===b||b.endsWith(".localhost"))return!0;if(b.includes(":")){let a=b.toLowerCase();if("::1"===a||"::"===a)return!0;let c=a.match(/^::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/);return c?.[1]?g(c[1]):!!(a.startsWith("fe80")||/^f[cd]/.test(a))}return!!f(b)&&g(b)}(c.hostname))throw new d.Q8(`refusing to send forge token to private/loopback address ${c.hostname}; set DRYDOCK_ALLOW_PRIVATE_FORGE=1 to allow a self-hosted instance`)}function i(){let a=process.env.DRYDOCK_ALLOW_PRIVATE_FORGE?.trim().toLowerCase();return"1"===a||"true"===a||"yes"===a}},15629:(a,b,c)=>{"use strict";c.d(b,{N6:()=>n,_S:()=>j,ax:()=>k,dk:()=>m,i1:()=>o,yM:()=>l});var d=c(54452),e=c(74366),f=c(55710),g=c(84654),h=c(34546),i=c(66952);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()}},20210:(a,b,c)=>{"use strict";c.d(b,{OE:()=>g,bR:()=>h,og:()=>f});let d=["core","graphql","search"];class e{constructor(a={}){this.resources=new Map,this.now=a.now??Date.now}observe(a,b){this.state(a).snapshot=b}note429(a,b){let c=void 0!==b?1e3*b:this.now()+6e4;this.state(a).limitedUntilMs=c}decide(a,b){let c=this.resources.get(a);if(!c)return{allowed:!0};let d=this.now();if(void 0!==c.limitedUntilMs&&d<c.limitedUntilMs)return{allowed:!1,reason:"limited",retryAfterMs:c.limitedUntilMs-d};let e=c.snapshot;if(!e||e.limit<=0)return{allowed:!0};let f=1e3*e.reset;if(d>=f)return{allowed:!0};let g=e.remaining/e.limit,h=f-d;return g<.05?{allowed:!1,reason:"floor",retryAfterMs:h}:"low"===b&&g<.3?{allowed:!1,reason:"reserve",retryAfterMs:h}:{allowed:!0}}snapshot(a){return this.resources.get(a)?.snapshot}state(a){let b=this.resources.get(a);return b||(b={},this.resources.set(a,b)),b}}let f=new e;class g extends Error{constructor(a,b,c){super(`github ${b} rate limit gated (${a}); retry in ~${Math.ceil(c/1e3)}s`),this.reason=a,this.resource=b,this.retryAfterMs=c,this.name="RateLimitError"}}function h(a){let b=Number(a["x-ratelimit-limit"]),c=Number(a["x-ratelimit-remaining"]),e=Number(a["x-ratelimit-reset"]);if(!Number.isFinite(b)||!Number.isFinite(c)||!Number.isFinite(e))return null;let f=a["x-ratelimit-resource"];return void 0===f?{resource:"core",snapshot:{remaining:c,limit:b,reset:e}}:d.includes(f)?{resource:f,snapshot:{remaining:c,limit:b,reset:e}}:null}},22674:(a,b,c)=>{Promise.resolve().then(c.bind(c,89402)),Promise.resolve().then(c.bind(c,99168))},26424:(a,b,c)=>{"use strict";c.d(b,{WE:()=>e,cp:()=>j,o:()=>i,sw:()=>f});var d=c(89991);let e=2;function f(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)}let g=/^\s*[-*]\s*\[[ xX]\]\s+(.+?)\s*$/,h=/^\s*#*\s*(Bug\s+\d+\s*(?:[—:-])\s*.+?)\s*$/;async function i(a,b={}){let c=function(a){let b=function(a){let b=[];for(let c of a.split("\n")){let a=c.match(g);a?.[1]&&b.push(a[1].trim())}return b}(a);if(b.length>=e)return b;let c=function(a){let b=[];for(let c of a.split("\n")){let a=c.match(h);a?.[1]&&b.push(a[1].trim())}return b}(a);return c.length>=e?c:[]}(a.body);if(c.length>=e)return{titles:c,source:"heuristic"};if(b.generate)try{let c=(await b.generate(a)).map(a=>a.trim()).filter(Boolean);if(c.length>=e)return{titles:c,source:"agent"}}catch(b){(0,d.v)(`[decompose] agent fallback failed for issue #${a.number}`,b)}return{titles:[],source:"none"}}function j(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")}},30028:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,74111,23))},34321:(a,b,c)=>{"use strict";c.d(b,{F1:()=>m,HF:()=>o,yO:()=>p,Xm:()=>k,yx:()=>n,AI:()=>q});var d=c(54452),e=c(74366),f=c(22579),g=c(55710),h=c(84654),i=c(53944);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}let l=f.Ik({repoId:f.ai().int().positive(),name:f.Yj().min(1),content:f.Yj()});function m(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 n(a,b,c=(0,g.Lf)()){return m(a,b,c)?.content??i.E[b]??""}function o(a,b,c,e=(0,g.Lf)()){return e.select().from(h.promptTemplates).where((0,d.Uo)((0,d.eq)(h.promptTemplates.repoId,a),(0,d.eq)(h.promptTemplates.name,b),(0,d.eq)(h.promptTemplates.version,c))).get()}function p(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()}function q(a,b=(0,g.Lf)()){let c=l.parse(a),e=m(c.repoId,c.name,b),f=(e?.version??0)+1,i=b.insert(h.promptTemplates).values({repoId:c.repoId,name:c.name,content:c.content,version:f,updatedAt:Math.floor(Date.now()/1e3)}).returning().get();for(let a of p(c.repoId,c.name,b).slice(20))b.delete(h.promptTemplates).where((0,d.eq)(h.promptTemplates.id,a.id)).run();return i}},34546:(a,b,c)=>{"use strict";c.d(b,{ej:()=>e});let d=new Set;function e(){for(let a of[...d])try{a()}catch{}}},35078:(a,b,c)=>{"use strict";c.d(b,{st:()=>q,Dl:()=>r,NF:()=>s});var d=c(51455),e=c(48161),f=c(76760),g=c(55710),h=c(22579);let i=/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/;function j(a){let b=i.exec(a.trim());return b?{major:Number(b[1]),minor:Number(b[2]),patch:Number(b[3]),prerelease:b[4]??null}:null}function k(a,b){return`v${function(a,b){let c=j(a);if(!c)throw Error(`cannot bump unparseable version: "${a}"`);let{major:d,minor:e,patch:f}=c;return"major"===b?`${d+1}.0.0`:"minor"===b?`${d}.${e+1}.0`:`${d}.${e}.${f+1}`}(a??"0.0.0",b)}`}function l(a){return 0===a.length?"No changes since the last release.":a.map(a=>`- #${a.number} ${a.title}`).join("\n")}let m=h.Ik({release:h.zM(),bump:h.k5(["patch","minor","major"]),title:h.Yj().default(""),notes:h.Yj().default("")});var n=c(77173),o=c(38111);async function p(a){var b;let c,d=await a.listReleases(),e=function(a){let b=null;for(let c of a)j(c)&&(null===b||function(a,b){var c,d;let e=j(a),f=j(b);if(!e||!f)throw Error(`cannot compare versions: "${a}" vs "${b}"`);return e.major!==f.major?e.major-f.major:e.minor!==f.minor?e.minor-f.minor:e.patch!==f.patch?e.patch-f.patch:(c=e.prerelease,c===(d=f.prerelease)?0:null===c?1:null===d||c<d?-1:1)}(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 q(a){let{fromTag:b,prs:c}=await p(a.forge),d=await a.generate({fromTag:b,prs:c}),e=d?.bump??"patch",f=k(b,e);return{fromTag:b,candidateTag:f,bump:e,shouldRelease:d?.release??!1,title:d?.title?.trim()||f,notes:d?.notes?.trim()||l(c),prs:c}}async function r(a,b){let c=b.db??(0,g.Lf)(),d=(0,n.tm)(a,c);if(!d)throw Error(`release run ${a} not found`);let e=d.mode;(0,n.Cq)(a,"evaluating",{},c);try{var f,h,i;let g,j,{fromTag:m,releases:o,prs:q}=await p(b.forge),r=await b.generate({fromTag:m,prs:q});if("auto"===e&&!r)return(0,n.Cq)(a,"error",{errorMessage:"release evaluation failed"},c);if("auto"===e&&r&&!r.release)return(0,n.Cq)(a,"skipped",{fromTag:m},c);let s=(f=e,h=r,i=q,g="manual"===f?"patch":h?.bump??"patch",j=h?.title?.trim()??"",{bump:g,title:j,notes:h?.notes?.trim()||l(i)}),t=d.tag??k(m,s.bump);if((0,n.Cq)(a,"proposed",{bump:s.bump,fromTag:m,tag:t,title:s.title||t,notes:s.notes,prNumbers:q.map(a=>a.number)},c),o.some(a=>a.tagName===t))return(0,n.Cq)(a,"publishing",{},c),(0,n.Cq)(a,"published",{},c);return(0,n.Cq)(a,"publishing",{},c),await b.forge.createRelease({tag:t,title:s.title||t,notes:s.notes,target:b.repo.defaultBranch}),(0,n.Cq)(a,"published",{},c)}catch(f){let b=f instanceof Error?f.message:String(f),d=(0,n.tm)(a,c),e=d?.status??"evaluating";if("evaluating"===e||"proposed"===e||"publishing"===e)return(0,n.Cq)(a,"error",{errorMessage:b.slice(0,500)},c);return(0,n.tm)(a,c)}}async function s(a,b){let c=await (0,d.mkdtemp)((0,f.join)((0,e.tmpdir)(),"drydock-release-"));try{var g;let d,e=(d=(g={provider:a.provider,command:a.command,model:a.model,cwd:c,runner:a.runner}).timeoutMs??18e4,async a=>{try{let b,c,e,{text:f,exitCode:h}=await (0,o.D)({provider:g.provider,command:g.command,model:g.model,cwd:g.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:g.repoId,type:"release",timeoutMs:d,runner:g.runner,db:g.db});if(0!==h)return null;let i=f.match(/\{[\s\S]*\}/);if(!i)return null;try{e=JSON.parse(i[0])}catch{return null}let j=m.safeParse(e);return j.success?j.data:null}catch{return null}});return await b(e)}finally{try{await (0,d.rm)(c,{recursive:!0,force:!0})}catch{}}}},36108:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,5381,23))},36212:(a,b,c)=>{"use strict";c.d(b,{m:()=>e});var d=c(51605);function e(a,b){let c=(0,d.mt)(b);return"codex"===a.id?c.codexPath:c.claudePath}},37567:(a,b,c)=>{"use strict";c.d(b,{Y:()=>e,v:()=>d});let d=4e3;function e(a){let b=a?.trim();return b?["\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",b.slice(0,d)].join("\n"):""}},38111:(a,b,c)=>{"use strict";c.d(b,{D:()=>h});var d=c(55710),e=c(84654),f=c(68434),g=c(94736);async function h(a){let b=a.runner??f.S,c=a.db??(0,d.Lf)(),h=void 0!==a.timeoutMs?{timeoutMs:a.timeoutMs}:void 0,i=a.provider.buildStreamOneShotArgs({prompt:a.prompt,model:a.model});if(null===i){let c=a.provider.buildOneShotArgs({prompt:a.prompt,model:a.model}),d=h?await b(a.command,c,a.cwd,h):await b(a.command,c,a.cwd);return{text:d.stdout,exitCode:d.exitCode,costUsd:0}}let j=h?await b(a.command,i,a.cwd,h):await b(a.command,i,a.cwd),k=new g.KO,l=[...k.push(j.stdout),...k.flush()],m=[];for(let a of l)for(let b of a.chunks)"text"===b.kind&&m.push(b.text);let n=m.join(""),o=k.costUsd>0?k.costUsd:0;return o>0&&void 0!==a.repoId&&c.insert(e.oneShotCosts).values({repoId:a.repoId,type:a.type,costUsd:o,inputTokens:k.totalInputTokens,outputTokens:k.totalOutputTokens}).run(),{text:n,exitCode:j.exitCode,costUsd:o}}},38529:(a,b,c)=>{"use strict";c.d(b,{A:()=>f,i:()=>g});let d=new Set(["OWNER","MEMBER","COLLABORATOR"]);function e(a){try{let b=JSON.parse(a);return Array.isArray(b)?b.filter(a=>"string"==typeof a):[]}catch{return[]}}function f(a){return{autoTriageEnabled:a.autoTriageEnabled,autoProcessEnabled:a.autoProcessEnabled,autoHealCi:a.autoHealCi,autoReviewFeedback:a.autoReviewFeedback,autoResolveMergeConflicts:a.autoResolveMergeConflicts,includeProgressReplies:a.includeProgressReplies,autoDecompose:a.autoDecompose,verifyPr:a.verifyPr,autoHealDeployments:a.autoHealDeployments,releaseEnabled:a.releaseEnabled,deploymentPlatform:a.deploymentPlatform,readyLabels:e(a.readyLabels),blockingLabels:e(a.blockingLabels),autoLabelWhitelist:e(a.autoLabelWhitelist),priorityAuthors:e(a.priorityAuthors),trustedReviewers:e(a.trustedReviewers),ignoredBots:e(a.ignoredBots),minAuthorAssociation:"any"===a.minAuthorAssociation?"any":"approved",maxAttempts:a.maxAttempts}}function g(a,b){return"any"===a.minAuthorAssociation||null!=b&&d.has(b.toUpperCase())}},38593:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>y,dynamic:()=>w,metadata:()=>x});var d=c(39747),e=c(58672),f=c.n(e),g=c(43453),h=c.n(g),i=c(89402),j=c(99168),k=c(24532),l=c(68464),m=c(78293),n=c(73024),o=c(76760);function p(){let a=JSON.parse((0,n.readFileSync)((0,o.join)(process.cwd(),"package.json"),"utf8")).version;return"string"==typeof a?a:null}function q(a={}){let b=a.env??process.env,c=b.DRYDOCK_VERSION?.trim();if(c)return c;let d=a.readPackageVersion??p;try{return d()??"0.0.0"}catch{return"0.0.0"}}var r=c(39889),s=c(10520);let t=null,u=null;async function v(a){let b=a.http??r.D,c=a.repo??"NilsR0711/drydock",d=a.currentVersion??q(),e={updateAvailable:!1,currentVersion:d,latestVersion:null,releaseUrl:null};try{let a=await b(`https://api.github.com/repos/${c}/releases?per_page=20`,{headers:{Accept:"application/vnd.github+json","User-Agent":"drydock-update-check","X-GitHub-Api-Version":"2022-11-28"}});if(!a.ok)return e;let f=function(a){if(!Array.isArray(a))return null;let b=null;for(let c of a){if(!0===c.draft||!0===c.prerelease||"string"!=typeof c.tag_name)continue;let a=(0,s.kf)(c.tag_name);if(!a||null!==a.prerelease)continue;let d=`${a.major}.${a.minor}.${a.patch}`;(!b||(0,s.MQ)(d,b.version))&&(b={version:d,url:"string"==typeof c.html_url?c.html_url:null})}return b}(JSON.parse(a.body));if(!f)return e;return{updateAvailable:(0,s.MQ)(f.version,d),currentVersion:d,latestVersion:f.version,releaseUrl:f.url}}catch{return e}}c(63475);let w="force-dynamic",x={title:"Drydock",description:"Autonomously process GitHub issues via Claude Code"};function y({children:a}){let b=0,c=0,e=!1;try{b=(0,k.dj)(),c=(0,l.zy)().length,e=(0,m.mt)().paused}catch{}let g=function(a={}){let b=a.now??Date.now,c=a.ttlMs??36e5;return(null!==t&&b()-t.fetchedAt<c||u||(function(a={}){let b=a.now??Date.now,c=a.ttlMs??36e5;return t&&b()-t.fetchedAt<c?Promise.resolve(t.status):u||(u=v(a).then(a=>(t={status:a,fetchedAt:b()},a)).finally(()=>{u=null}))})(a).catch(()=>{}),t)?t.status:{updateAvailable:!1,currentVersion:a.currentVersion??q(),latestVersion:null,releaseUrl:null}}(),n=function(a=process.env){let b=a.DRYDOCK_INSTALL_KIND;return"global"===b||"npx"===b?b:"local"}();return(0,d.jsx)("html",{lang:"en",className:`${f().variable} ${h().variable}`,suppressHydrationWarning:!0,children:(0,d.jsx)("body",{children:(0,d.jsx)(j.Providers,{children:(0,d.jsx)(i.AppShell,{adrPending:b,needsHuman:c,paused:e,updateStatus:g,installKind:n,children:a})})})})}},40129:(a,b,c)=>{"use strict";c.d(b,{L8:()=>i,uP:()=>h});var d=c(74366),e=c(54452),f=c(55710);c(51039);var g=c(84654);function h(a=(0,f.Lf)()){return a.select().from(g.repos).orderBy((0,d.i)(g.repos.createdAt)).all()}function i(a,b=(0,f.Lf)()){return b.select().from(g.repos).where((0,e.eq)(g.repos.id,a)).get()}},40568:(a,b,c)=>{"use strict";c.d(b,{WM:()=>e});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"}];function e(a){return d.some(b=>b.id===a)}},50720:(a,b,c)=>{"use strict";c.d(b,{t:()=>m,d:()=>n});var d=c(37477),e=c(42700),f=c(95024),g=c(51499),h=c(37561),i=c(54848);function j(a){return"error"===a?"assertive":"polite"}var k=c(2210);let l=(0,i.createContext)(null);function m({children:a}){let[b,c]=(0,i.useState)([]),e=(0,i.useCallback)(a=>{c(b=>b.filter(b=>b.id!==a))},[]),f=(0,i.useCallback)(a=>{let b=Date.now()+Math.random(),d={id:b,title:a.title,description:a.description,variant:a.variant??"info"};c(a=>[...a,d]),setTimeout(()=>e(b),5e3)},[e]),g=(0,i.useMemo)(()=>({toast:f,success:(a,b)=>f({title:a,description:b,variant:"success"}),error:(a,b)=>f({title:a,description:b,variant:"error"})}),[f]);return(0,d.jsxs)(l.Provider,{value:g,children:[a,(0,d.jsx)(r,{toasts:b,onDismiss:e})]})}function n(){let a=(0,i.useContext)(l);if(!a)throw Error("useToast must be used within a ToastProvider");return a}let o={success:e.A,error:f.A,info:g.A},p={success:"text-success",error:"text-destructive",info:"text-muted-foreground"};function q({toast:a,onDismiss:b}){let c=o[a.variant];return(0,d.jsxs)("div",{className:"pointer-events-auto flex items-start gap-3 rounded-xl border border-card-border bg-card p-3 shadow-lg",children:[(0,d.jsx)(c,{className:(0,k.cn)("mt-0.5 h-4 w-4 shrink-0",p[a.variant])}),(0,d.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,d.jsx)("p",{className:"text-sm font-medium",children:a.title}),a.description&&(0,d.jsx)("p",{className:"mt-0.5 text-xs text-muted-foreground",children:a.description})]}),(0,d.jsx)("button",{type:"button","aria-label":"Dismiss notification",onClick:()=>b(a.id),className:"shrink-0 rounded-md p-0.5 text-muted-foreground hover-elevate",children:(0,d.jsx)(h.A,{className:"h-3.5 w-3.5"})})]})}function r({toasts:a,onDismiss:b}){let c=a.filter(a=>"assertive"===j(a.variant)),e=a.filter(a=>"polite"===j(a.variant));return(0,d.jsxs)("div",{className:"pointer-events-none fixed bottom-4 right-4 z-[60] flex w-full max-w-sm flex-col gap-2",children:[(0,d.jsx)("div",{role:"alert","aria-live":"assertive","aria-atomic":"false",className:"flex flex-col gap-2",children:c.map(a=>(0,d.jsx)(q,{toast:a,onDismiss:b},a.id))}),(0,d.jsx)("div",{"aria-live":"polite","aria-atomic":"false",className:"flex flex-col gap-2",children:e.map(a=>(0,d.jsx)(q,{toast:a,onDismiss:b},a.id))})]})}},51039:(a,b,c)=>{"use strict";c.d(b,{Bt:()=>f});var d=c(94448),e=c(55710);function f(a=(0,e.Lf)(),b){let c=void 0!==b?(0,d.ll)` AND repo_id = ${b}`:(0,d.ll)``,g=a.get((0,d.ll)`
|
|
4
|
+
SELECT coalesce(sum(c), 0) AS total FROM (
|
|
5
|
+
SELECT coalesce(sum(cost_usd), 0) AS c
|
|
6
|
+
FROM jobs
|
|
7
|
+
WHERE strftime('%Y-%m-%d', started_at, 'unixepoch', 'localtime') = strftime('%Y-%m-%d', 'now', 'localtime')
|
|
8
|
+
AND started_at IS NOT NULL
|
|
9
|
+
${c}
|
|
10
|
+
UNION ALL
|
|
11
|
+
SELECT coalesce(sum(cost_usd), 0) AS c
|
|
12
|
+
FROM one_shot_costs
|
|
13
|
+
WHERE strftime('%Y-%m-%d', created_at, 'unixepoch', 'localtime') = strftime('%Y-%m-%d', 'now', 'localtime')
|
|
14
|
+
${c}
|
|
15
|
+
)
|
|
16
|
+
`);return g?.total??0}c(84654)},51605:(a,b,c)=>{"use strict";c.d(b,{mt:()=>m,Jf:()=>o,DA:()=>p,DZ:()=>n});var d=c(54452),e=c(22579),f=c(55710),g=c(51039),h=c(84654),i=c(40568);let j=["needs_human","job_failed","pr_opened","pr_merged","release_published","cost_limit","automation_paused"],k=e.Ik({paused:e.zM().default(!1),dailyCostLimitUsd:e.ai().nonnegative().default(10),pollIntervalSec:e.ai().int().positive().default(30),maxTurns:e.ai().int().positive().default(40),maxJobMinutes:e.ai().int().positive().default(30),maxCiWaitMinutes:e.ai().int().positive().default(60),maxJobCostUsd:e.ai().nonnegative().default(0),releaseManagementEnabled:e.zM().default(!1),defaultModel:e.Yj().refine(i.WM,{message:"unknown model id"}).default("claude-opus-4-8"),defaultAgent:e.k5(["claude","codex"]).default("claude"),claudePath:e.Yj().default("claude"),codexPath:e.Yj().default("codex"),ghPath:e.Yj().default("gh"),maxParallelJobs:e.ai().int().positive().default(3),telegramBotToken:e.Yj().default(""),telegramChatId:e.Yj().default(""),slackWebhookUrl:e.Yj().default(""),smtpHost:e.Yj().default(""),smtpPort:e.ai().int().positive().default(587),smtpUser:e.Yj().default(""),smtpPass:e.Yj().default(""),emailFrom:e.Yj().default(""),emailTo:e.Yj().default(""),notifyEvents:e.YO(e.k5(j)).default([...j]),retentionDays:e.ai().int().positive().default(30)}),l="global";function m(a=(0,f.Lf)()){let b=a.select().from(h.settings).where((0,d.eq)(h.settings.key,l)).get();if(!b)return k.parse({});try{return k.parse(JSON.parse(b.value))}catch{return k.parse({})}}function n(a,b=(0,f.Lf)()){let c=k.parse({...m(b),...a}),e=JSON.stringify(c);return b.select().from(h.settings).where((0,d.eq)(h.settings.key,l)).get()?b.update(h.settings).set({value:e}).where((0,d.eq)(h.settings.key,l)).run():b.insert(h.settings).values({key:l,value:e}).run(),c}function o(a=(0,f.Lf)()){let b=m(a);return b.paused?{allowed:!1,reason:"paused"}:(0,g.Bt)(a)>=b.dailyCostLimitUsd?{allowed:!1,reason:"cost_limit"}:{allowed:!0}}function p(a,b=(0,f.Lf)()){let c=b.select().from(h.repos).where((0,d.eq)(h.repos.id,a)).get();return!c||(0,g.Bt)(b,a)>=c.dailyCostLimitUsd?{allowed:!1,reason:"repo_cost_limit"}:{allowed:!0}}},53944:(a,b,c)=>{"use strict";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"}},55710:(a,b,c)=>{"use strict";let d,e;c.d(b,{Lf:()=>m});var f=c(73024),g=c(76760),h=c(87550),i=c.n(h),j=c(61609),k=c(89991),l=c(84654);function m(){if(e)throw e;if(!d){let a=process.env.DRYDOCK_DB??(0,g.resolve)(process.cwd(),"data/drydock.db");try{d=function(a){":memory:"!==a&&(0,f.mkdirSync)((0,g.dirname)(a),{recursive:!0});let b=new(i())(a);try{return b.pragma("journal_mode = WAL"),b.pragma("foreign_keys = ON"),!function(a){let b,c=process.env.DRYDOCK_MIGRATIONS??(0,g.resolve)(process.cwd(),"drizzle");try{b=(0,f.readdirSync)(c).filter(a=>a.endsWith(".sql")).sort()}catch{return}a.exec("CREATE TABLE IF NOT EXISTS __migrations (name TEXT PRIMARY KEY)");let d=new Set(a.prepare("SELECT name FROM __migrations").all().map(a=>a.name)),e=a.prepare("INSERT INTO __migrations (name) VALUES (?)");for(let h of b){if(d.has(h))continue;let b=(0,f.readFileSync)((0,g.join)(c,h),"utf8");a.transaction(()=>{for(let c of b.split("--\x3e statement-breakpoint")){let b=c.trim();b&&a.exec(b)}e.run(h)})()}}(b),(0,j.f)(b,{schema:l})}catch(a){throw b.close(),a}}(a)}catch(a){throw e=a instanceof Error?a:Error(String(a))}Promise.resolve().then(c.bind(c,61195)).then(a=>a.startOrchestrator()).catch(a=>(0,k.v)("[orchestrator] bootstrap failed",a))}return d}},57729:(a,b,c)=>{"use strict";c.d(b,{Q8:()=>f,cg:()=>d,jL:()=>e});let d="github";function e(a){return"github"===a||"gitlab"===a}class f extends Error{}},57846:(a,b,c)=>{"use strict";c.d(b,{u:()=>f,v:()=>e});let d=new(c(16698)).AsyncLocalStorage;function e(a,b){return d.run(a,b)}function f(){return d.getStore()??"high"}},61195:(a,b,c)=>{"use strict";let d,e,f;c.r(b),c.d(b,{abortAllJobs:()=>bC,abortJob:()=>bB,clearAbort:()=>bA,gracefulShutdown:()=>bD,registerAbort:()=>bz,startOrchestrator:()=>bE});var g=c(54452),h=c(55710),i=c(94448),j=c(51605),k=c(84654),l=c(89991),m=c(96684),n=c(15629),o=c(77598),p=c(48161),q=c(66952);let r=()=>Math.floor(Date.now()/1e3);function s(){return d||(d=`${(0,p.hostname)()}#${process.pid}`),d}function t(a={},b=(0,h.Lf)()){let c=a.now??r(),d=a.expiredBefore,e=void 0===d?void 0:(0,g.or)((0,g.kZ)(k.jobs.leaseExpiresAt),(0,g.wJ)(k.jobs.leaseExpiresAt,d)),f=b.select().from(k.jobs).where((0,g.Uo)((0,g.eq)(k.jobs.status,"working"),e)).all();for(let a of f)b.update(k.jobs).set({status:"queued",leaseToken:null,leaseExpiresAt:null,workerId:null,availableAt:c+function(a,b=5,c=300){return a<=0?0:Math.min(b*2**(a-1),c)}(a.attempts)}).where((0,g.eq)(k.jobs.id,a.id)).run(),(0,n.yM)(a.id,"status",{from:"working",to:"queued",reason:"lease_expired"},b);return f.length}let u=["ci_running","ci_failed","retrying"];var v=c(65332),w=c(40129),x=c(84656),y=c(57846),z=c(20210);let A=["blocked","wontfix","question","needs-human","needs-discussion"],B=[{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 C(a){let b=[],c=a.labels.map(a=>a.toLowerCase()).find(a=>A.includes(a));if(c)return{decision:"blocked",reasons:[`blocking label: ${c}`]};let d=`${a.title}
|
|
17
|
+
${a.body??""}`;for(let{label:a,re:c}of B)c.test(d)&&b.push(`${a} detected`);return b.length>0?{decision:"needs_review",reasons:b}:{decision:"approved",reasons:[]}}var D=c(69914),E=c(38529);let F=[{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 G(a,b,c,d){d.update(k.issues).set({triageHash:c,triagedAt:Math.floor(Date.now()/1e3)}).where((0,g.Uo)((0,g.eq)(k.issues.repoId,a),(0,g.eq)(k.issues.number,b))).run()}async function H(a,b,c,d=(0,h.Lf)()){let e=(0,E.A)(a),f=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(k.issues).where((0,g.Uo)((0,g.eq)(k.issues.repoId,a.id),(0,g.eq)(k.issues.number,c.number))).get();if(i?.triagedAt&&i.triageHash===f)return{number:c.number,applied:[],reasons:[],skipped:"unchanged"};if(!(0,E.i)(e,c.authorAssociation))return G(a.id,c.number,f,d),{number:c.number,applied:[],reasons:["author not approved"],skipped:"author"};let j=await b.viewIssue(c.number),l=C({number:j.number,title:j.title,body:j.body,labels:j.labels}),m=[],n=function(a,b){let c=new Set(b),d=`${a.title}
|
|
18
|
+
${a.body}`,e=[];for(let{label:a,re:b}of F)c.has(a)&&b.test(d)&&!e.includes(a)&&e.push(a);return e}(j,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(j.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,f=d.select().from(k.issues).where((0,g.Uo)((0,g.eq)(k.issues.repoId,a),(0,g.eq)(k.issues.number,b))).get();if(!f)return;try{let a=JSON.parse(f.labels);e=Array.isArray(a)?a:[]}catch{e=[]}let h=[...e];for(let a of c)h.includes(a)||h.push(a);d.update(k.issues).set({labels:JSON.stringify(h)}).where((0,g.eq)(k.issues.id,f.id)).run()}(a.id,c.number,q,d)}return G(a.id,c.number,f,d),{number:c.number,applied:q,reasons:m}}async function I(a,b,c,d=(0,h.Lf)()){let e=[];for(let f of c)try{e.push(await H(a,b,f,d))}catch(b){(0,l.v)(`[triage] issue #${f.number} failed for ${a.name}`,b)}return e}var J=c(36212),K=c(68434),L=c(76760);function M(){return process.env.DRYDOCK_HOME??(0,L.join)((0,p.homedir)(),".drydock")}function N(a){return a.replace(/[^a-zA-Z0-9._-]/g,"-")}function O(a){return(0,L.join)(M(),"worktrees",N(a))}class P extends Error{}class Q extends P{constructor(){super("nothing to commit")}}class R{constructor(a=K.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 P(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,L.join)(O(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,L.join)(O(a.name),`fb-${N(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,L.join)(O(a.name),`dh-${N(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 Q;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 S=c(31421);let T=(a,b,c,d)=>{let e,f=(0,S.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 U=c(53944),V=c(34321),W=c(63480);class X{constructor(a=(0,h.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,W.f)(JSON.stringify(b.payload??{})),d=JSON.parse(c),e=this.db.insert(k.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(k.jobEvents).where((0,g.eq)(k.jobEvents.jobId,a)).orderBy(k.jobEvents.ts,k.jobEvents.id).all().slice(-b)}}function Y(){return e||(e=new X),e}function Z(a,b){let c=()=>{},d=!1;return{tripped:new Promise(a=>{c=a}),observe(){!d&&b()>=a&&(d=!0,c())}}}function $(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 _(a){return{chunks:a.chunks,costUsd:a.costUsd}}async function aa(a,b,c,d={}){let e=d.db??(0,h.Lf)(),f=d.runner??T,i=d.broker??Y(),j=d.provider??(0,v.X$)(a.agent),l=d.command??j.defaultCommand,m=a.model??j.defaultModel,o=j.createParser();o.onParseError=b=>i.publish(a.id,{type:"parse_error",payload:b}),"working"!==a.status?(0,n.dk)(a.id,"working",{model:m},e):e.update(k.jobs).set({model:m}).where((0,g.eq)(k.jobs.id,a.id)).run();let p=d.costCapUsd&&d.costCapUsd>0?Z(d.costCapUsd,()=>o.costUsd>0?o.costUsd:j.estimateCost(m,o.totalInputTokens,o.totalOutputTokens)):void 0,q=f(l,j.buildStartArgs({prompt:b,model:m,maxTurns:a.maxTurns}),c,{onStdout:b=>{for(let c of o.push(b))i.publish(a.id,{type:c.type,payload:_(c)});p?.observe()},onStderr:b=>i.publish(a.id,{type:"error",payload:{stderr:b}})});bz(a.id,q.abort);let{exitCode:r,timedOut:s,costExceeded:t}=await $(q,{timeoutMs:d.timeoutMs,costTripped:p?.tripped,graceMs:d.graceMs});bA(a.id);let u=s||t?void 0:q.spawnError;for(let b of(s&&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`}}),o.flush()))i.publish(a.id,{type:b.type,payload:_(b)});let w=o.costUsd>0?o.costUsd:j.estimateCost(m,o.totalInputTokens,o.totalOutputTokens);return e.update(k.jobs).set({sessionId:o.sessionId,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,costUsd:w}).where((0,g.eq)(k.jobs.id,a.id)).run(),{exitCode:r,sessionId:o.sessionId,costUsd:w,inputTokens:o.totalInputTokens,outputTokens:o.totalOutputTokens,timedOut:s,costExceeded:t,spawnError:u}}async function ab(a,b,c,d,e={}){let f=e.db??(0,h.Lf)(),i=e.runner??T,j=e.broker??Y(),l=e.provider??(0,v.X$)(a.agent),m=e.command??l.defaultCommand,n=a.model??l.resumeModel,o=l.createParser();o.onParseError=b=>j.publish(a.id,{type:"parse_error",payload:b});let p=(0,V.Xm)((0,V.yx)(a.repoId,U._.ciFix,f),{CI_LOG:c}),q=e.costCapUsd&&e.costCapUsd>0?f.select().from(k.jobs).where((0,g.eq)(k.jobs.id,a.id)).get()?.costUsd??0:0,r=e.costCapUsd&&e.costCapUsd>0?Z(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))j.publish(a.id,{type:c.type,payload:{chunks:c.chunks}});r?.observe()},onStderr:b=>j.publish(a.id,{type:"error",payload:{stderr:b}})});bz(a.id,s.abort);let{exitCode:t,timedOut:u,costExceeded:w}=await $(s,{timeoutMs:e.timeoutMs,costTripped:r?.tripped,graceMs:e.graceMs});bA(a.id);let x=u||w?void 0:s.spawnError;for(let b of(u&&j.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${e.timeoutMs}ms`}}),w&&j.publish(a.id,{type:"error",payload:{stderr:`session aborted: per-job cost limit of $${e.costCapUsd} reached`}}),o.flush()))j.publish(a.id,{type:b.type,payload:{chunks:b.chunks}});let y=o.costUsd>0?o.costUsd:l.estimateCost(n,o.totalInputTokens,o.totalOutputTokens),z=f.select().from(k.jobs).where((0,g.eq)(k.jobs.id,a.id)).get();return f.update(k.jobs).set({sessionId:o.sessionId??b,totalInputTokens:(z?.totalInputTokens??0)+o.totalInputTokens,totalOutputTokens:(z?.totalOutputTokens??0)+o.totalOutputTokens,costUsd:(z?.costUsd??0)+y}).where((0,g.eq)(k.jobs.id,a.id)).run(),{exitCode:t,sessionId:o.sessionId??b,costUsd:y,inputTokens:o.totalInputTokens,outputTokens:o.totalOutputTokens,timedOut:u,costExceeded:w,spawnError:x}}var ac=c(73024);let ad=["vercel","railway"];function ae(a){return a.exists??ac.existsSync}class af{async detect(a){let b=ae(a);return b((0,L.join)(a.cwd,"railway.json"))||b((0,L.join)(a.cwd,"railway.toml"))||b((0,L.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 ag{async detect(a){let b=ae(a);return b((0,L.join)(a.cwd,"vercel.json"))||b((0,L.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 ah=[new ag,new af];async function ai(a,b){if(b)return ad.includes(b)?function(a){let b=ah.find(b=>b.id===a);if(!b)throw Error(`unsupported deployment platform: ${a}`);return b}(b):null;for(let b of ah)if(await b.detect(a))return b;return null}let aj={monitoring:["healthy","failed","escalated"],failed:["repairing","escalated"],repairing:["repaired","escalated"],healthy:[],repaired:[],escalated:[]};class ak extends Error{constructor(a,b){super(`invalid deployment-healing transition: ${a} -> ${b}`)}}let al={initialDelayMs:6e4,intervalMs:6e4,timeoutMs:12e5,monitorWindowMs:36e5,maxLogLines:200};function am(){return Math.floor(Date.now()/1e3)}function an(a,b,c={},d=(0,h.Lf)()){let e=function(a,b=(0,h.Lf)()){return b.select().from(k.deploymentHealingSessions).where((0,g.eq)(k.deploymentHealingSessions.id,a)).get()}(a,d);if(!e)throw Error(`deployment healing session ${a} not found`);var f=e.status;if(!aj[f].includes(b))throw new ak(f,b);return d.update(k.deploymentHealingSessions).set({status:b,updatedAt:am(),...c}).where((0,g.eq)(k.deploymentHealingSessions.id,a)).returning().get()}function ao(a,b){return{cwd:a.path,ref:b,run:K.S}}async function ap(a={}){let b=a.db??(0,h.Lf)(),c=a.now??Date.now,d=a.budgets??al;for(let e of(0,w.uP)(b))if((0,E.A)(e).autoHealDeployments)try{let f=a.forgeFor?.(e)??(0,x.Ie)(e),g=a.adapterFor??(a=>ai(ao(a,null),a.deploymentPlatform)),h=await g(e);if(!h)continue;let i=a.openFixPr??as;await aq(e,f,h,{db:b,now:c,budgets:d,openFixPr:i})}catch(a){(0,l.v)(`[deploy-heal] sweep failed for ${e.name}`,a)}}async function aq(a,b,c,d){let{db:e,now:f,budgets:i}=d,j=(0,n.N6)(a.id,e);for(let a of j){let d;if("merged"!==a.status||null==a.prNumber)continue;let j=(a.finishedAt??a.createdAt)*1e3;if(!(f()-j>i.monitorWindowMs)){try{d=await b.prHeadSha(a.prNumber)}catch(b){(0,l.v)(`[deploy-heal] head sha lookup failed for job ${a.id}`,b);continue}!function(a,b,c=(0,h.Lf)()){return c.select().from(k.deploymentHealingSessions).where((0,g.eq)(k.deploymentHealingSessions.jobId,a)).all().some(a=>a.commitSha===b)}(a.id,d,e)&&function(a,b,c,d,e=(0,h.Lf)()){e.select().from(k.deploymentHealingSessions).where((0,g.eq)(k.deploymentHealingSessions.jobId,a)).all().find(a=>a.commitSha===d)||e.insert(k.deploymentHealingSessions).values({jobId:a,prNumber:b,platform:c,commitSha:d}).returning().get()}(a.id,a.prNumber,c.id,d,e)}}for(let b of e.select().from(k.deploymentHealingSessions).all().filter(a=>"monitoring"===a.status)){let e=j.find(a=>a.id===b.jobId);if(e)try{await ar(a,e,c,b,d)}catch(c){(0,l.v)(`[deploy-heal] session ${b.id} failed for ${a.name}`,c)}}}async function ar(a,b,c,d,e){var f,i;let j,{db:m,now:n,budgets:o}=e,p=(j=(f={createdAt:1e3*d.createdAt,lastPolledAt:1e3*d.updatedAt,now:n(),initialDelayMs:o.initialDelayMs,intervalMs:o.intervalMs,timeoutMs:o.timeoutMs}).now-f.createdAt)<f.initialDelayMs?"wait":j>=f.timeoutMs?"timeout":f.lastPolledAt<=f.createdAt||f.now-f.lastPolledAt>=f.intervalMs?"poll":"wait";if("wait"===p)return;if("timeout"===p)return void an(d.id,"escalated",{},m);let q=ao(a,d.commitSha),r="ready"===(i=await c.getStatus(q))?"ready":"error"===i?"error":"pending";if("ready"===r)return void an(d.id,"healthy",{},m);if("pending"===r)return void function(a,b=(0,h.Lf)()){b.update(k.deploymentHealingSessions).set({updatedAt:am()}).where((0,g.eq)(k.deploymentHealingSessions.id,a)).run()}(d.id,m);let s=(await c.getLogs(q).catch(()=>"")).split("\n").slice(-o.maxLogLines).join("\n").trim(),t=an(d.id,"failed",{logsExcerpt:s||null},m);an(d.id,"repairing",{},m);try{let c=await e.openFixPr(a,b,t,s);an(d.id,"repaired",{followupPrNumber:c},m)}catch(a){(0,l.v)(`[deploy-heal] fix PR failed for session ${d.id}`,a),an(d.id,"escalated",{},m)}}async function as(a,b,c,d){let e=(0,h.Lf)(),f=(0,v.X$)(b.agent),g=(0,J.m)(f,e),i=new R,j=c.commitSha.slice(0,7),k=`drydock/deploy-fix-${b.id}-${j}`,m=(0,x.Ie)(a),n=await i.prepareForNewBranch(a,k,`${b.id}-${j}`);try{let h=await aa(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:g});if(0!==h.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:k,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,l.v)(`[deploy-heal] worktree cleanup failed for job ${b.id}`,a)}}}var at=c(74058),au=c(77173),av=c(35078);async function aw(a={}){let b=a.db??(0,h.Lf)();if(!(0,j.mt)(b).releaseManagementEnabled)return;let c=a.now??Date.now,d=a.windowMs??36e5,e=a.notify??((a,c)=>(0,at.JD)(a,c,b));for(let f of(0,w.uP)(b))if((0,E.A)(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=(0,v.X$)(a.agent),d=(0,J.m)(c,b),e=a.defaultModel;return a=>(0,av.NF)({provider:c,command:d,model:e},b=>b(a))}(f,b);await ax(f,g,h,i,{db:b,now:c,windowMs:d,notify:e})}catch(a){(0,l.v)(`[release] sweep failed for ${f.name}`,a)}}async function ax(a,b,c,d,e){let{db:f,now:g,windowMs:h}=e;for(let i of(0,n.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 ay(a,i,b,c,d,e)}catch(b){(0,l.v)(`[release] job ${i.id} failed for ${a.name}`,b)}}}async function ay(a,b,c,d,e,f){let{db:g,notify:h}=f,i=b.prNumber,j=await c.prHeadSha(i),k=(0,au.v0)({repoId:a.id,mode:"auto",triggerPrNumber:i,triggerSha:j},g);if("detected"!==k.status)return;let l=await (0,av.Dl)(k.id,{repo:a,forge:d,db:g,generate:e});"published"===l.status&&l.tag&&await h("release_published",`🚀 Released ${a.name} ${l.tag}.`)}var az=c(526);let aA=new Set(["ci_running","ci_failed","retrying","needs_human"]);function aB(a){return"function"==typeof a.listReviewThreads&&"function"==typeof a.replyToReviewThread&&"function"==typeof a.updateReviewComment&&"function"==typeof a.resolveReviewThread&&"function"==typeof a.reactToReviewComment}async function aC(a={}){let b=a.db??(0,h.Lf)(),c=a.processJob??aD;for(let d of(0,w.uP)(b))if((0,E.A)(d).autoReviewFeedback)try{let e=a.forgeFor?.(d)??(0,x.Ie)(d);if(!aB(e))continue;for(let a of(0,n.N6)(d.id,b).filter(a=>null!=a.prNumber&&aA.has(a.status)))try{await c(d,a,e)}catch(b){(0,l.v)(`[review-feedback] job ${a.id} failed for ${d.name}`,b)}}catch(a){(0,l.v)(`[review-feedback] sweep failed for ${d.name}`,a)}}async function aD(a,b,c){var d;if(!aB(c)||null==b.prNumber)return;let e=(0,h.Lf)(),f=(0,E.A)(a),g=(0,v.X$)(b.agent),i=(0,J.m)(g,e),j=(d={repo:a,job:b,worktrees:new R,runSession:(a,b,c)=>aa(a,b,c,{db:e,provider:g,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,l.v)(`[review-feedback] worktree cleanup failed for job ${d.job.id}`,a)}}});await (0,az.Nx)(b.id,b.prNumber,{forge:c,db:e,gate:{trustedReviewers:f.trustedReviewers,ignoredBots:f.ignoredBots},includeProgressReplies:f.includeProgressReplies,applyFeedback:j})}var aE=c(2373),aF=c(71218),aG=c(37567);let aH=new Set(["CANCELLED","ACTION_REQUIRED"]),aI=new Set(["TIMED_OUT"]),aJ=/\b(ai|claude|codex|copilot|gpt|llm)\b.*\breview\b|\breview\b.*\b(ai|bot)\b/i,aK=/\bcancell?ed\b|\bsecret\b|\b(rate.?limit|secondary rate)\b|\b5\d\d\b|\b(401|403|unauthorized|forbidden)\b|service unavailable/i,aL=/\b(time(d)?.?out|timeout|intermittent|flak(y|e)|econnreset|etimedout|esockettimedout)\b/i,aM=/\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,aN=[{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 aO(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 aN)if(c.test(a))return b;return"unknown"}(a);if("unknown"===d)return{kind:d,evidence:c.slice(-b).join("\n")};let e=aN.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 aP={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."},aQ=["healed","blocked","escalated","superseded"],aR=["blocked","escalated","superseded"],aS={triaging:["awaiting_slot",...aR],awaiting_slot:["repairing",...aR],repairing:["awaiting_ci",...aR],awaiting_ci:["verifying",...aR],verifying:["healed","cooldown",...aR],cooldown:["awaiting_slot",...aR],healed:[],blocked:[],escalated:[],superseded:[]};class aT extends Error{constructor(a,b){super(`invalid healing transition: ${a} -> ${b}`)}}let aU={maxHealAttemptsPerSession:3,maxHealAttemptsPerFingerprint:2,cooldownMs:9e5,maxConcurrentHealingRuns:1,maxEvidenceLines:200},aV=["repairing","awaiting_ci","verifying"];function aW(a,b=(0,h.Lf)()){return b.select().from(k.healingSessions).where((0,g.eq)(k.healingSessions.id,a)).get()}function aX(a,b,c=(0,h.Lf)()){let d=aW(a,c);if(!d)throw Error(`healing session ${a} not found`);var e=d.status;if(!aS[e].includes(b))throw new aT(e,b);return c.update(k.healingSessions).set({status:b,updatedAt:Math.floor(Date.now()/1e3)}).where((0,g.eq)(k.healingSessions.id,a)).returning().get()}function aY(a,b,c=(0,h.Lf)()){c.update(k.healingAttempts).set({status:b.status,afterSha:b.afterSha??null}).where((0,g.eq)(k.healingAttempts.id,a)).run()}let aZ=new Set(["FAILURE","ERROR","CANCELLED","TIMED_OUT","ACTION_REQUIRED"]),a$=new Set(["PENDING","QUEUED","IN_PROGRESS","WAITING","REQUESTED"]);function a_(a){return 0===a.length?"pending":a.some(a=>aZ.has(a.state.toUpperCase()))?"failed":a.some(a=>a$.has(a.state.toUpperCase()))?"pending":"passed"}let a0=a=>new Promise(b=>setTimeout(b,a));async function a1(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(k.followupIssues).values({jobId:a.id,ghIssueNumber:f,title:`Follow-up for #${a.issueNumber}`}).run(),(0,n.dk)(a.id,"needs_human",{errorMessage:c.slice(0,500)},e)}async function a2(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,n.yM)(a.id,"status",{reason:"ci wait budget exceeded",prNumber:b},e),(0,n.dk)(a.id,"needs_human",{errorMessage:g.slice(0,500)},e)}async function a3(a,b,c){if(c.autoHeal)return a4(a,b,c,c.autoHeal);let d=c.db??(0,h.Lf)(),e=c.sleep??a0,f=c.pollMs??3e4,g=c.maxPolls??1/0,i=c.ciWaitMs??1/0,j=c.now??Date.now,k=j()+i,l=a,m=0;for(;m<g;){m++;let a=a_(await c.gh.prChecks(b));if("pending"===a){if(j()>=k)return a2(l,b,i,c,d);await e(f);continue}if("passed"===a)return await c.gh.mergePr(b),(0,n.dk)(l.id,"merged",{prNumber:b},d);if((l=(0,n.dk)(l.id,"ci_failed",{prNumber:b},d)).ciRetryCount>=3)return a1(l,b,"CI failed 3 times.",c,d);if(!l.sessionId)return(0,n.yM)(l.id,"status",{reason:"missing session id, cannot resume for CI fix"},d),(0,n.dk)(l.id,"needs_human",{errorMessage:"CI failed but no session id to resume"},d);let g=l.sessionId;l=(0,n.dk)(l.id,"retrying",{ciRetryCount:l.ciRetryCount+1},d);let{evidence:h}=aO(await c.gh.failedRunLog(b),200);await c.resumeSession(l,g,h),l=(0,n.dk)(l.id,"ci_running",{},d)}return(0,n.ax)(l.id,d)??l}async function a4(a,b,c,d){let e,f=c.db??(0,h.Lf)(),i=c.sleep??a0,j=c.pollMs??3e4,l=c.maxPolls??1/0,m=d.budgets??aU,o=c.now??d.now??Date.now,p=c.ciWaitMs??1/0,q=o()+p,r=a,s=0;for(;s<l;){s++;let a=await c.gh.prChecks(b),l=a_(a);if("pending"===l){if(o()>=q)return a2(r,b,p,c,f);await i(j);continue}if("passed"===l){if(e){let a=await d.headSha(b);aY(e.attemptId,{status:"healed",afterSha:a},f),aX(e.sessionId,"verifying",f),aX(e.sessionId,"healed",f)}return await c.gh.mergePr(b),(0,n.dk)(r.id,"merged",{prNumber:b},f)}let u=a.filter(a=>aZ.has(a.state.toUpperCase())),v=await d.headSha(b);if(e){var t;let a=(t={beforeSha:e.beforeSha,afterSha:v,beforeFailingCount:e.beforeFailing,afterFailingCount:u.length}).afterSha===t.beforeSha?{verdict:"rejected",reason:"no change pushed (no new commit)"}:t.afterFailingCount>=t.beforeFailingCount?{verdict:"rejected",reason:"no measurable improvement in failing checks"}:0===t.afterFailingCount?{verdict:"healed",reason:"all checks green"}:{verdict:"progressed",reason:"fewer checks failing"};aY(e.attemptId,{status:a.verdict,afterSha:v},f);let d=e.sessionId;if(e=void 0,"rejected"===a.verdict)return aX(d,"verifying",f),aX(d,"escalated",f),a1(r,b,`CI auto-heal: ${a.reason}.`,c,f)}let w=function(a,b,c,d=(0,h.Lf)()){let e=d.select().from(k.healingSessions).where((0,g.eq)(k.healingSessions.prNumber,b)).all();for(let a of e){var f;a.headSha===c||(f=a.status,aQ.includes(f))||aX(a.id,"superseded",d)}let i=e.find(a=>a.headSha===c);return i?aW(i.id,d)??i:d.insert(k.healingSessions).values({jobId:a,prNumber:b,headSha:c}).returning().get()}(r.id,b,v,f),x=await c.gh.failedRunLog(b),y=u.map(a=>(function(a,b,c=""){var d,e;let f,g,h=(d=b.name,e=b.state??"",f=e.toUpperCase(),g=`${d}
|
|
19
|
+
${c}`,aH.has(f)||aJ.test(d)||aK.test(g)?"blocked_external":aI.has(f)||aL.test(g)?"flaky_or_ambiguous":aM.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,x)),z=function(a,b=(0,h.Lf)()){return b.select().from(k.healingAttempts).where((0,g.eq)(k.healingAttempts.sessionId,a)).all()}(w.id,f),A=z.at(-1),B=function(a){let{failures:b,attempts:c,budgets:d}=a,e=b.filter(a=>"healable_in_branch"===a.category),f=b.filter(a=>"flaky_or_ambiguous"===a.category),g=b.filter(a=>"blocked_external"===a.category);if(0==[...e,...f].length){let a=g[0];return a?{action:"block",reason:`external failure: ${a.checkName}`}:{action:"escalate",reason:"unrecognised CI failure"}}if(c.length>=d.maxHealAttemptsPerSession)return{action:"escalate",reason:"per-session heal budget exhausted"};let h=new Map;for(let a of c)h.set(a.fingerprint,(h.get(a.fingerprint)??0)+1);let i=a=>(h.get(a.fingerprint)??0)<d.maxHealAttemptsPerFingerprint,j=e.find(i)??f.find(i);if(!j)return{action:"escalate",reason:"per-fingerprint heal budget exhausted"};if(a.activeRuns>=d.maxConcurrentHealingRuns)return{action:"wait_slot"};if(null!=a.lastAttemptAt){let b=a.now-a.lastAttemptAt;if(b<d.cooldownMs)return{action:"cooldown",waitMs:d.cooldownMs-b}}return"healable_in_branch"===j.category?{action:"repair",target:j}:{action:"rerun",target:j}}({failures:y,attempts:z.map(a=>({fingerprint:a.fingerprint})),lastAttemptAt:A?1e3*A.createdAt:null,now:o(),activeRuns:function(a=(0,h.Lf)()){return a.select().from(k.healingSessions).all().filter(a=>aV.includes(a.status)).length}(f),budgets:m});switch(B.action){case"block":return"triaging"===w.status&&aX(w.id,"blocked",f),await c.gh.commentIssue(r.issueNumber,`CI auto-heal: ${B.reason} — not auto-fixable. Handing over to a human.`),(0,n.dk)(r.id,"needs_human",{errorMessage:`auto-heal blocked: ${B.reason}`.slice(0,500)},f);case"escalate":return"triaging"===w.status&&aX(w.id,"escalated",f),a1(r,b,`CI auto-heal: ${B.reason}.`,c,f);case"wait_slot":await i(j);continue;case"cooldown":await i(Math.min(B.waitMs,j));continue;case"repair":case"rerun":{let a=r.sessionId;if(!a)return"triaging"===w.status&&aX(w.id,"escalated",f),a1(r,b,"CI failed but no session id to resume.",c,f);let d=function(a,b,c,d=(0,h.Lf)()){return d.insert(k.healingAttempts).values({sessionId:a,fingerprint:b.fingerprint,category:b.category,checkName:b.checkName,beforeSha:c}).returning().get()}(w.id,B.target,v,f);if(aX(w.id,"awaiting_slot",f),aX(w.id,"repairing",f),r=(0,n.dk)(r.id,"ci_failed",{prNumber:b},f),r=(0,n.dk)(r.id,"retrying",{ciRetryCount:r.ciRetryCount+1},f),"repair"===B.action){let b=function(a){let{kind:b,evidence:c}=aO(a.log,a.maxLines);return[`CI check "${a.checkName}" is failing on this PR.`,aP[b],"Fix only this failure, then commit and push. Failure evidence:\n",c].join("\n")}({checkName:B.target.checkName,log:x,maxLines:m.maxEvidenceLines});await c.resumeSession(r,a,b)}aX(w.id,"awaiting_ci",f),r=(0,n.dk)(r.id,"ci_running",{},f),e={attemptId:d.id,sessionId:w.id,beforeSha:v,beforeFailing:u.length};continue}}}return(0,n.ax)(r.id,f)??r}var a5=c(26424),a6=c(38111);async function a7(a,b,c,d=(0,h.Lf)(),e={}){for(let f of c)try{let c=await b.viewIssue(f.number),g=await (0,aF.dv)(a,{number:c.number,title:c.title,body:c.body},d,{generate:e.generate});if(!g.skipped&&g.subtasks.length>=a5.WE){let a=(0,a5.cp)(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:
|
|
20
|
+
|
|
21
|
+
${a}`)}}catch(b){(0,l.v)(`[subtasks] decomposition failed for ${a.name}#${f.number}`,b)}}function a8(a,b,c=(0,h.Lf)()){for(let d of(0,aF.t0)(a,b,c))"in_progress"===d.status&&((0,aF.ZY)(d.id,"deferred",c),(0,aF.ZY)(d.id,"pending",c))}var a9=c(51455),ba=c(22579);function bb(a,b){if(a.length<=b)return a;let c=a.length-b;return`${a.slice(0,b)}
|
|
22
|
+
…[truncated ${c} chars]`}let bc=ba.Ik({ordinal:ba.ai().int().nonnegative(),status:ba.k5(["done","pending","deferred"]),reason:ba.Yj().default("")}),bd=ba.Ik({summary:ba.Yj().default(""),verdicts:ba.YO(bc).default([])});async function be(a){let b,{job:c,prNumber:d,repo:e,forge:f,db:g,provider:i,command:j,model:k}=a;try{let l=await f.prDiff(d);if(!l.trim())return null;let o=await f.viewIssue(c.issueNumber),q=(0,aF.t0)(e.id,c.issueNumber,g),r={issueNumber:c.issueNumber,issueTitle:o.title,issueBody:o.body,subtasks:q.map(a=>({ordinal:a.ordinal,title:a.title})),diff:l},s=a.generate;if(!s){var m;let c;b=await (0,a9.mkdtemp)((0,L.join)((0,p.tmpdir)(),"drydock-verify-")),c=(m={provider:i,command:j,model:k,cwd:b,repoId:e.id,db:g,runner:a.runner}).timeoutMs??18e4,s=async a=>{try{var b;let d,e,f,{text:g,exitCode:h}=await (0,a6.D)({provider:m.provider,command:m.command,model:m.model,cwd:m.cwd,prompt:(d=bb(a.issueBody.trim(),6e3),e=bb(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:m.repoId,type:"verify",timeoutMs:c,runner:m.runner,db:m.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=bd.safeParse(f);return j.success?j.data:null}catch{return null}}}let t=await s(r);if(!t)return(0,n.yM)(c.id,"verification",{ok:!1},g),null;let u=function(a,b,c,d=(0,h.Lf)()){let e=new Map((0,aF.t0)(a,b,d).map(a=>[a.ordinal,a])),f=0,g=0,i=[];for(let a of c.verdicts){let b=e.get(a.ordinal);if(b)if("done"===a.status)!function(a,b){let c=a.status;if("done"!==c&&"skipped"!==c)try{if("in_progress"===c)return void(0,aF.ZY)(a.id,"done",b);(0,aF.ZY)(a.id,"in_progress",b),(0,aF.ZY)(a.id,"done",b)}catch{}}(b,d),f+=1;else if("deferred"===a.status)try{(0,aF.ZY)(b.id,"deferred",d),g+=1}catch{}else i.push(b.title)}return{done:f,deferred:g,pendingTitles:i}}(e.id,c.issueNumber,t,g);return await f.commentIssue(c.issueNumber,(0,W.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,u))),(0,n.yM)(c.id,"verification",{ok:!0,summary:t.summary,done:u.done,deferred:u.deferred,pending:u.pendingTitles.length},g),t}catch(a){return(0,l.v)(`[verify] verification pass failed for ${e.name}#${c.issueNumber}`,a),null}finally{if(b)try{await (0,a9.rm)(b,{recursive:!0,force:!0})}catch{}}}async function bf(a,b={}){let c=b.db??(0,h.Lf)(),d=b.notify??((a,b)=>(0,at.JD)(a,b,c)),e=await bg(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 bg(a,b,c){let d,e=b.db??(0,h.Lf)(),f=(0,n.ax)(a,e);if(!f)throw Error(`job ${a} not found`);let g=(0,w.L8)(f.repoId,e);if(!g)throw Error(`repo ${f.repoId} not found`);"queued"===f.status&&(0,n.dk)(f.id,"working",{},e);let i=b.worktrees??new R,k=(0,x.Ie)(g),m=(0,v.X$)(f.agent),o=(0,J.m)(m,e),p=(0,j.mt)(e),q=g.maxJobMinutes??p.maxJobMinutes,r=6e4*q,s=(g.maxCiWaitMinutes??p.maxCiWaitMinutes)*6e4,t=g.maxJobCostUsd??p.maxJobCostUsd,u=b.runSession??((a,b,c)=>aa(a,b,c,{db:e,provider:m,command:o,timeoutMs:r,costCapUsd:t})),y=b.createPr??(a=>k.createPr(a)),z=b.runBabysitter??((a,b)=>a3(a,b,{gh:k,db:e,ciWaitMs:s,resumeSession:(a,b,c)=>ab(a,b,c,g.path,{db:e,provider:m,command:o,timeoutMs:r,costCapUsd:t}).then(()=>void 0),autoHeal:g.autoHealCi?{headSha:a=>k.prHeadSha(a),provider:g.platform}:void 0})),A=b.verify??((a,b)=>be({job:a,prNumber:b,repo:g,forge:k,db:e,provider:m,command:o,model:a.model??g.defaultModel}).then(()=>void 0));try{d=await i.prepare(g,f.id,f.issueNumber),(0,n.yM)(f.id,"worktree",{path:d.path,branch:d.branch},e);let a=(0,V.Xm)((0,V.yx)(g.id,U._.main,e),{ISSUE_NUM:f.issueNumber,BRANCH:d.branch,REPO_NAME:g.name});if(g.autoDecompose){let b=(0,aF.t0)(g.id,f.issueNumber,e);if(b.length>0){var B;a+=(B=b.map(a=>({title:a.title,status:a.status})),0===B.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",(0,a5.cp)(B)].join("\n")),function(a,b,c=(0,h.Lf)()){for(let d of(0,aF.t0)(a,b,c))"pending"===d.status&&(0,aF.ZY)(d.id,"in_progress",c)}(g.id,f.issueNumber,e)}}a+=(0,aG.Y)(g.agentInstructions);let b=await u((0,n.ax)(f.id,e),a,d.path);if(b.timedOut)return g.autoDecompose&&a8(g.id,f.issueNumber,e),(0,n.dk)(f.id,"needs_human",{errorMessage:`${m.label} timed out after ${q} minutes`},e);if(b.costExceeded)return g.autoDecompose&&a8(g.id,f.issueNumber,e),(0,n.dk)(f.id,"needs_human",{errorMessage:`per-job cost limit of $${t} reached`},e);if(b.spawnError)return g.autoDecompose&&a8(g.id,f.issueNumber,e),(0,n.dk)(f.id,"needs_human",{errorMessage:`failed to start ${o}: ${b.spawnError.message}`},e);if(0!==b.exitCode)return g.autoDecompose&&a8(g.id,f.issueNumber,e),(0,n.dk)(f.id,"needs_human",{errorMessage:`${m.label} exited non-zero`},e);if(g.adrGating){let a=(0,aE.Pe)("pending_review",e,g.id);if(a.length>0)return g.autoDecompose&&a8(g.id,f.issueNumber,e),(0,n.dk)(f.id,"needs_human",{errorMessage:`Blocked by ${a.length} pending ADR review(s).`},e)}try{await i.commitAndPush(d,`Fix #${f.issueNumber}`)}catch(a){if(a instanceof Q)return g.autoDecompose&&a8(g.id,f.issueNumber,e),(0,n.dk)(f.id,"needs_human",{errorMessage:"Agent produced no changes"},e);throw a}let j=(0,D.ts)(g.id,e).find(a=>a.number===f.issueNumber)?.title??`Fix #${f.issueNumber}`,k=await y({head:d.branch,base:g.defaultBranch,title:j,body:`Closes #${f.issueNumber}`});if((0,n.dk)(f.id,"ci_running",{branch:d.branch,prNumber:k},e),await c("pr_opened",`🔀 PR opened: ${g.id}#${f.issueNumber} (PR #${k}).`),g.verifyPr)try{await A((0,n.ax)(f.id,e),k)}catch(b){let a=b instanceof Error?b.message:String(b);(0,n.yM)(f.id,"error",{message:`verification pass failed: ${a}`},e)}let l=await z((0,n.ax)(f.id,e),k);return g.autoDecompose&&("merged"===l.status?!function(a,b,c=(0,h.Lf)()){for(let d of(0,aF.t0)(a,b,c))!function(a,b){let c=a.status;if("done"!==c&&"skipped"!==c){if("in_progress"===c)return(0,aF.ZY)(a.id,"done",b);(0,aF.ZY)(a.id,"in_progress",b),(0,aF.ZY)(a.id,"done",b)}}(d,c)}(g.id,f.issueNumber,e):a8(g.id,f.issueNumber,e)),l}catch(c){let a=c instanceof Error?c.message:String(c);(0,n.yM)(f.id,"error",{message:a},e);let b=(0,n.ax)(f.id,e);if(["working","ci_running","retrying"].includes(b.status))return g.autoDecompose&&a8(g.id,f.issueNumber,e),(0,n.dk)(f.id,"needs_human",{errorMessage:a.slice(0,500)},e);return b}finally{if(d)try{await i.remove(d,g.path)}catch(a){(0,l.v)(`[run-job] worktree cleanup failed for job ${f.id}`,a)}}}let bh=!1,bi=new Set;function bj(a){let b=(0,ac.openSync)(a,"wx");try{(0,ac.writeSync)(b,JSON.stringify({pid:process.pid,ts:Date.now()}))}finally{(0,ac.closeSync)(b)}}let bk={active:!1};function bl(a,b,c,d,e={}){var f;let g=(0,v.X$)(a.agent),h=(f={provider:g,command:(0,J.m)(g,d),model:a.defaultModel,cwd:a.path,runner:e.runner},async a=>{let{text:b,exitCode:c}=await (0,a6.D)({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 a7(a,b,c,d,{generate:h})}let bm=["needs_human","aborted"];async function bn(a,b,c,d,e,f){var h,i;let j=e.some(a=>b.readyLabels.includes(a)),l=e.some(a=>b.blockingLabels.includes(a));return!!j&&!l&&!!(0,E.i)(b,d.authorAssociation)&&(h=a.id,i=d.number,!(f.select().from(k.jobs).where((0,g.Uo)((0,g.eq)(k.jobs.repoId,h),(0,g.eq)(k.jobs.issueNumber,i),(0,g.RV)(k.jobs.status,[...bm]))).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 bo=["queued","working","ci_running","ci_failed","retrying"],bp=["working","ci_running","ci_failed","retrying"];async function bq(a={}){let b=a.db??(0,h.Lf)(),c=a.runJob??bf,d=(0,w.uP)(b),e=a.triage??I,f=a.decompose??bl;for(let c of d)try{await (0,y.v)("low",async()=>{let d=a.forgeFor?.(c)??(0,x.Ie)(c),i=a.fetchIssues??(async(a,b)=>(await d.refreshRateLimit?.(),d.listAllIssues())),j=await i(c.path,c.queueLabel);(0,D.VK)(c.id,j,b);let l=b.select().from(k.issues).where((0,g.eq)(k.issues.repoId,c.id)).all(),m=new Map(l.map(a=>[a.number,a])),o=(0,E.A)(c);if(o.autoTriageEnabled&&await e(c,d,j,b),o.autoDecompose){let a=j.filter(a=>{let b=a.labels.map(a=>a.name);return b.includes(c.queueLabel)||b.some(a=>o.readyLabels.includes(a))});a.length>0&&await f(c,d,a,b)}for(let a of j){var p,r;let e=a.labels.map(a=>a.name),f=e.includes(c.queueLabel),i=!!o.autoProcessEnabled&&await bn(c,o,d,a,e,b);if(!f&&!i)continue;let j=C({number:a.number,title:a.title,labels:e});if("approved"!==j.decision||function(a,b,c){return(0,n.i1)([...bo],a).some(a=>a.repoId===b&&a.issueNumber===c)}(b,c.id,a.number))continue;i&&a.author&&o.priorityAuthors.includes(a.author)&&(p=c.id,r=a.number,b.update(k.issues).set({priority:-1}).where((0,g.Uo)((0,g.eq)(k.issues.repoId,p),(0,g.eq)(k.issues.number,r))).run());let l=m.get(a.number);!function(a,b=(0,h.Lf)()){let c=a.dedupeKey??`${a.repoId}:${a.issueNumber}`;if(!b.select({id:k.jobs.id}).from(k.jobs).where((0,g.Uo)((0,g.eq)(k.jobs.dedupeKey,c),(0,g.KL)(k.jobs.status,[...q.kl]))).get())try{(0,n._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,l.v)(`[driver] issue sync failed for ${c.name}`,a)}(0,m.PH)("cost_limit"===(0,j.Jf)(b).reason,bk,b),t({expiredBefore:Math.floor(Date.now()/1e3)},b);let p=(0,j.mt)(b).maxParallelJobs,u=s();for(;!bh&&(0,j.Jf)(b).allowed&&bi.size<p;){let a=d.filter(a=>(0,j.DA)(a.id,b).allowed).filter(a=>!(a.sequential&&function(a,b){return(0,n.i1)([...bp],a).some(a=>a.repoId===b)}(b,a.id))).map(a=>a.id);if(0===a.length)break;let e=function(a={},b=(0,h.Lf)()){let{repoIds:c}=a;if(c&&0===c.length)return;let d=a.leaseMs??3e4,e=a.worker??s(),f=a.now??r();return b.transaction(a=>{let b=a.select({job:k.jobs}).from(k.jobs).leftJoin(k.issues,(0,g.Uo)((0,g.eq)(k.issues.repoId,k.jobs.repoId),(0,g.eq)(k.issues.number,k.jobs.issueNumber))).where((0,g.Uo)((0,g.eq)(k.jobs.status,"queued"),(0,g.or)((0,g.kZ)(k.jobs.availableAt),(0,g.wJ)(k.jobs.availableAt,f)),c?(0,g.RV)(k.jobs.repoId,c):void 0)).orderBy((0,i.ll)`COALESCE(${k.issues.priority}, 1e9)`,k.jobs.createdAt).get()?.job;if(b)return(0,n.dk)(b.id,"working",{leaseToken:(0,o.randomUUID)(),leaseExpiresAt:f+Math.ceil(d/1e3),workerId:e,attempts:b.attempts+1,availableAt:null},a)})}({repoIds:a,worker:u,leaseMs:3e4},b);if(!e)break;let f=e.id,m=e.leaseToken;bi.add(f);let p=setInterval(()=>{try{!function(a,b,c={},d=(0,h.Lf)()){let e=c.leaseMs??3e4,f=c.now??r();d.update(k.jobs).set({leaseExpiresAt:f+Math.ceil(e/1e3)}).where((0,g.Uo)((0,g.eq)(k.jobs.id,a),(0,g.eq)(k.jobs.leaseToken,b),(0,g.eq)(k.jobs.status,"working"))).run().changes}(f,m,{},b)}catch(a){(0,l.v)(`[driver] heartbeat failed for job ${f}`,a)}},1e4);p.unref?.(),c(f).catch(a=>(0,l.v)(`[driver] job ${f} failed`,a)).finally(()=>{clearInterval(p),function(a,b,c=(0,h.Lf)()){c.update(k.jobs).set({leaseToken:null,leaseExpiresAt:null,workerId:null}).where((0,g.Uo)((0,g.eq)(k.jobs.id,a),(0,g.eq)(k.jobs.leaseToken,b))).run().changes}(f,m,b),bi.delete(f)})}let v=a.reviewFeedback??(a=>aC({db:a}));try{await (0,y.v)("low",()=>v(b))}catch(a){(0,l.v)("[driver] review-feedback sweep failed",a)}let A=a.deploymentHealing??(a=>ap({db:a}));try{await (0,y.v)("low",()=>A(b))}catch(a){(0,l.v)("[driver] deployment-healing sweep failed",a)}let B=a.releaseManagement??(a=>aw({db:a}));try{await (0,y.v)("low",()=>B(b))}catch(a){(0,l.v)("[driver] release-management sweep failed",a)}}let br=!1,bs=!1,bt=/^job-(\d+)$/,bu=/^fb-(\d+)-/,bv=/^dh-(\d+)-/;async function bw(a={}){let b=a.db??(0,h.Lf)(),c=a.run??K.S,d=function(a){let b=a.select({id:k.jobs.id,status:k.jobs.status}).from(k.jobs).all(),c=new Set;for(let a of b)q.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=O(a.name);try{b=(0,ac.readdirSync)(f,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name)}catch{continue}for(let g of b){let b=bt.exec(g)??bu.exec(g)??bv.exec(g);if(!b||d.has(Number(b[1])))continue;let h=(0,L.join)(f,g);await c("git",["-C",a.path,"worktree","remove","--force",h]).catch(()=>void 0);try{(0,ac.rmSync)(h,{recursive:!0,force:!0}),e++}catch(a){(0,l.v)(`[worktree-reaper] failed to remove ${h}`,a)}}}return e}let bx=!1,by=new Map;function bz(a,b){by.set(a,b)}function bA(a){by.delete(a)}function bB(a,b=5e3){let c=by.get(a);return"function"==typeof c&&(c(b),by.delete(a),!0)}function bC(a=5e3){let b=[...by.keys()];for(let b of by.values())b(a);return by.clear(),b}async function bD(){bh=!0,br=!1,f&&clearTimeout(f),f=void 0,await (0,m.CZ)().catch(a=>(0,l.v)("[orchestrator] drain notify failed",a)),bC(5e3),await function(a=3e4,b=100){let c=Date.now()+a;return new Promise(a=>{let d=()=>{if(0===bi.size||Date.now()>=c)return a();setTimeout(d,b)};d()})}(8e3);try{let a=(0,h.Lf)();for(let b of a.select().from(k.jobs).where((0,g.RV)(k.jobs.status,["working","ci_running","ci_failed","retrying"])).all())try{(0,n.dk)(b.id,"interrupted",{},a)}catch(a){(0,l.v)(`[orchestrator] shutdown transition failed for job ${b.id}`,a)}}catch(a){(0,l.v)("[orchestrator] shutdown DB update failed",a)}}function bE(){if(bx)return;if(bx=!0,!process.env.VITEST){try{let{requeued:a,interrupted:b}=function(a=(0,h.Lf)()){return{requeued:t({},a),interrupted:function(a=(0,h.Lf)()){let b=a.select().from(k.jobs).where((0,g.RV)(k.jobs.status,u)).all();for(let c of b)a.update(k.jobs).set({status:"interrupted"}).where((0,g.eq)(k.jobs.id,c.id)).run(),(0,n.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,l.v)("[orchestrator] recovery failed",a)}if(function(){let a=(0,L.join)(M(),"instance.lock");(0,ac.mkdirSync)((0,L.dirname)(a),{recursive:!0});try{return bj(a),!0}catch{}let b=!1;try{let{pid:c}=JSON.parse((0,ac.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,ac.unlinkSync)(a),bj(a),!0}catch{return!1}}()){let a,b;bw().then(a=>{a>0&&console.log(`[orchestrator] reaped ${a} orphaned worktree(s)`)}).catch(a=>(0,l.v)("[orchestrator] worktree reap failed",a)),function(a={}){if(br)return;br=!0;let b=a.tick??(()=>bq()),c=a.intervalMs??1e3*(0,j.mt)().pollIntervalSec,d=async()=>{if(br){if(!bs){bs=!0;try{await b()}catch(a){(0,l.v)("[driver] tick failed",a)}finally{bs=!1}}br&&(f=setTimeout(d,c))}};d()}(),(a=()=>{try{let{jobEventsDeleted:a}=function(a=(0,h.Lf)(),b={}){let c=b.days??(0,j.mt)(a).retentionDays,d=b.vacuum??!0,e=Math.floor((b.now?.getTime()??Date.now())/1e3)-86400*c,f=a.select({id:k.jobs.id}).from(k.jobs).where((0,g.Uo)((0,g.Pe)(k.jobs.finishedAt),(0,g.lt)(k.jobs.finishedAt,e))).all().map(a=>a.id),l=0;return f.length>0&&(l=a.delete(k.jobEvents).where((0,g.RV)(k.jobEvents.jobId,f)).run().changes),d&&a.run((0,i.ll)`VACUUM`),{jobEventsDeleted:l,vacuumed:d,cutoff:e}}((0,h.Lf)());a>0&&console.log(`[orchestrator] pruned ${a} job event(s)`)}catch(a){(0,l.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 bD(),process.exit(0)};process.once("SIGINT",a),process.once("SIGTERM",a)}},63475:()=>{},63480:(a,b,c)=>{"use strict";c.d(b,{f:()=>f});let d="[REDACTED]",e=[/\bgh[pousr]_[A-Za-z0-9]{36,}\b/g,/\bgithub_pat_[A-Za-z0-9_]{50,}\b/g,/\bglpat-[A-Za-z0-9_-]{20,}\b/g,/(Bearer )[A-Za-z0-9._~+/-]+=*/g,/(https?:\/\/)[^\s/@:]+:[^\s/@]+(?=@)/g,/(PRIVATE-TOKEN:\s*)\S+/gi,/(Basic )[A-Za-z0-9+/]+=*/g,/\b(?:AKIA|ASIA|AGPA|AIDA|ANPA|AROA)[0-9A-Z]{16}\b/g];function f(a){let b=a;for(let a of e)b=b.replace(a,(a,b)=>"string"==typeof b?`${b}${d}`:d);return b}},65332:(a,b,c)=>{"use strict";c.d(b,{X$:()=>q});let d={"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}},e=Object.values(d).reduce((a,b)=>b.outputPerMTok>a.outputPerMTok?b:a,{inputPerMTok:0,outputPerMTok:0,cacheWritePerMTok:0,cacheReadPerMTok:0});var f=c(94736),g=c(22579);let h="gpt-5-codex",i={"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}},j=Object.values(i).reduce((a,b)=>b.outputPerMTok>a.outputPerMTok?b:a,{inputPerMTok:0,outputPerMTok:0,cacheWritePerMTok:0,cacheReadPerMTok:0}),k=g.Ik({input_tokens:g.ai().optional(),cached_input_tokens:g.ai().optional(),output_tokens:g.ai().optional(),reasoning_output_tokens:g.ai().optional()}).passthrough(),l=g.Ik({id:g.Yj().optional(),item_type:g.Yj().optional(),text:g.Yj().optional(),command:g.Yj().optional(),exit_code:g.ai().optional(),server:g.Yj().optional(),tool:g.Yj().optional()}).passthrough(),m=g.Ik({type:g.Yj(),thread_id:g.Yj().optional(),usage:k.optional(),item:l.optional()}).passthrough();class n{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=m.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:(0,f.gJ)(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 o={claude:{id:"claude",label:"Claude Code",defaultCommand:"claude",supportsResume:!0,resumeModel:"claude-haiku-4-5",resumeMaxTurns:15,defaultModel:"claude-opus-4-8",buildStartArgs:({prompt:a,model:b,maxTurns:c})=>["-p",a,"--max-turns",String(c),"--permission-mode","acceptEdits","--model",b,"--output-format","stream-json","--verbose"],buildResumeArgs:({prompt:a,sessionId:b,model:c,maxTurns:d})=>["-p",a,"--resume",b,"--max-turns",String(d),"--model",c,"--output-format","stream-json","--verbose"],buildOneShotArgs:({prompt:a,model:b})=>["-p",a,"--model",b],buildStreamOneShotArgs:({prompt:a,model:b})=>["-p",a,"--model",b,"--output-format","stream-json","--verbose"],createParser:()=>new f.KO,estimateCost:function(a,b,c,f=0,g=0){let h=function(a){if(!a)return e;let b=d[a];return b||(console.warn(`[drydock] Unknown model id "${a}" — using max-priced fallback to avoid under-counting cost`),e)}(a);return b/1e6*h.inputPerMTok+c/1e6*h.outputPerMTok+f/1e6*h.cacheWritePerMTok+g/1e6*h.cacheReadPerMTok}},codex:{id:"codex",label:"Codex CLI",defaultCommand:"codex",supportsResume:!0,resumeModel:h,resumeMaxTurns:15,defaultModel:h,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 n,estimateCost:function(a,b,c){let d=function(a){if(!a)return j;let b=i[a];return b||(console.warn(`[drydock] Unknown codex model id "${a}" — using max-priced fallback to avoid under-counting cost`),j)}(a);return b/1e6*d.inputPerMTok+c/1e6*d.outputPerMTok}}},p=["claude","codex"];function q(a){return"string"==typeof a&&p.includes(a)?o[a]:o.claude}},66952:(a,b,c)=>{"use strict";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)}},68434:(a,b,c)=>{"use strict";c.d(b,{S:()=>e});var d=c(31421);let e=(a,b,c,e)=>new Promise((f,g)=>{let h=(0,d.spawn)(a,b,{cwd:c,env:process.env}),i="",j="",k=!1,l=e?.timeoutMs??3e5,m=setTimeout(()=>{k=!0,h.kill("SIGKILL")},l);m.unref?.(),h.stdout.on("data",a=>{i+=a.toString()}),h.stderr.on("data",a=>{j+=a.toString()}),h.on("error",a=>{clearTimeout(m),g(a)}),h.on("close",b=>{(clearTimeout(m),k)?g(Error(`\`${a}\` timed out after ${l}ms`)):f({stdout:i,stderr:j,exitCode:b??0})})})},69530:(a,b,c)=>{Promise.resolve().then(c.bind(c,90924)),Promise.resolve().then(c.bind(c,75922))},69914:(a,b,c)=>{"use strict";c.d(b,{CY:()=>s,Fg:()=>v,GX:()=>p,NV:()=>u,RC:()=>t,VK:()=>n,c1:()=>r,mU:()=>w,ts:()=>m,xt:()=>q});var d=c(54452),e=c(74366),f=c(39829),g=c(55710),h=c(40129),i=c(84654),j=c(84656);let k={color:"1f6feb",description:"Queued for processing by Drydock"};function l(a,b){let c=(0,h.L8)(a,b);if(!c)throw Error(`repo ${a} not found`);return c}function m(a,b=(0,g.Lf)()){return b.select().from(i.issues).where((0,d.eq)(i.issues.repoId,a)).orderBy((0,e.Y)(i.issues.priority),(0,e.Y)(i.issues.number)).all()}function n(a,b,c=(0,g.Lf)()){let e=c.select().from(i.issues).where((0,d.eq)(i.issues.repoId,a)).all(),h=new Map(e.map(a=>[a.number,a])),j=Math.floor(Date.now()/1e3),k=c.select({value:(0,f.T9)(i.issues.priority)}).from(i.issues).where((0,d.eq)(i.issues.repoId,a)).get(),l=(k?.value??-1)+1,m=new Set;for(let e of b){m.add(e.number);let b=JSON.stringify(e.labels.map(a=>a.name)),f=h.get(e.number);f?c.update(i.issues).set({title:e.title,labels:b,state:"open",syncedAt:j}).where((0,d.eq)(i.issues.id,f.id)).run():c.insert(i.issues).values({repoId:a,number:e.number,title:e.title,labels:b,state:"open",priority:l++,syncedAt:j}).run()}let o=e.filter(a=>!m.has(a.number)).map(a=>a.id);o.length>0&&c.delete(i.issues).where((0,d.RV)(i.issues.id,o)).run()}function o(a,b,c,e,f=(0,g.Lf)()){let h,j=f.select().from(i.issues).where((0,d.Uo)((0,d.eq)(i.issues.repoId,a),(0,d.eq)(i.issues.number,b))).get();if(!j)return;try{let a=JSON.parse(j.labels);h=Array.isArray(a)?a:[]}catch{h=[]}let k=h.includes(c),l=h;e&&!k&&(l=[...h,c]),!e&&k&&(l=h.filter(a=>a!==c)),f.update(i.issues).set({labels:JSON.stringify(l)}).where((0,d.eq)(i.issues.id,j.id)).run()}async function p(a,b=(0,g.Lf)()){let c=l(a,b);return n(a,await (0,j.Ie)(c).listAllIssues(),b),m(a,b)}async function q(a,b,c={},e=(0,g.Lf)()){let f=l(a,e),h=(0,j.Ie)(f);return await h.ensureLabel(f.queueLabel,k),await h.addLabels(b,[f.queueLabel]),o(a,b,f.queueLabel,!0,e),(void 0!==c.model||void 0!==c.agent)&&e.update(i.issues).set({modelOverride:c.model??null,agentOverride:c.agent??null}).where((0,d.Uo)((0,d.eq)(i.issues.repoId,a),(0,d.eq)(i.issues.number,b))).run(),m(a,e)}async function r(a,b,c=(0,g.Lf)()){let d=l(a,c);return await (0,j.Ie)(d).removeLabels(b,[d.queueLabel]),o(a,b,d.queueLabel,!1,c),m(a,c)}async function s(a,b,c=(0,g.Lf)()){let d=l(a,c);if(0===b.length)return m(a,c);let e=(0,j.Ie)(d);for(let f of(await e.ensureLabel(d.queueLabel,k),b))await e.addLabels(f,[d.queueLabel]),o(a,f,d.queueLabel,!0,c);return m(a,c)}async function t(a,b,c=(0,g.Lf)()){let d=l(a,c);if(0===b.length)return m(a,c);let e=(0,j.Ie)(d);for(let f of b)await e.removeLabels(f,[d.queueLabel]),o(a,f,d.queueLabel,!1,c);return m(a,c)}async function u(a,b,c,d=(0,g.Lf)()){if(0===b.length)return m(a,d);for(let e of b)await v(a,e,[c],[],d);return m(a,d)}async function v(a,b,c,d,e=(0,g.Lf)()){let f=l(a,e),h=(0,j.Ie)(f);c.includes(f.queueLabel)&&await h.ensureLabel(f.queueLabel,k),c.length&&await h.addLabels(b,c),d.length&&await h.removeLabels(b,d),c.includes(f.queueLabel)&&o(a,b,f.queueLabel,!0,e),d.includes(f.queueLabel)&&o(a,b,f.queueLabel,!1,e)}function w(a,b,c=(0,g.Lf)()){b.forEach((b,e)=>{c.update(i.issues).set({priority:e}).where((0,d.Uo)((0,d.eq)(i.issues.repoId,a),(0,d.eq)(i.issues.number,b))).run()})}},71218:(a,b,c)=>{"use strict";c.d(b,{dv:()=>m,t0:()=>k,ZY:()=>l});var d=c(54452),e=c(74366),f=c(55710),g=c(84654);let h={pending:["in_progress","skipped","deferred"],in_progress:["done","skipped","deferred"],deferred:["pending","in_progress","skipped"],done:[],skipped:[]};class i extends Error{constructor(a,b){super(`invalid subtask transition: ${a} -> ${b}`)}}var j=c(26424);function k(a,b,c=(0,f.Lf)()){return c.select().from(g.issueSubtasks).where((0,d.Uo)((0,d.eq)(g.issueSubtasks.repoId,a),(0,d.eq)(g.issueSubtasks.issueNumber,b))).orderBy((0,e.Y)(g.issueSubtasks.ordinal)).all()}function l(a,b,c=(0,f.Lf)()){let e=c.select().from(g.issueSubtasks).where((0,d.eq)(g.issueSubtasks.id,a)).get();if(!e)throw Error(`subtask ${a} not found`);var j=e.status;if(!h[j].includes(b))throw new i(j,b);return c.update(g.issueSubtasks).set({status:b}).where((0,d.eq)(g.issueSubtasks.id,a)).returning().get()}async function m(a,b,c=(0,f.Lf)(),h={}){var i,l,n,o;let p=(0,j.sw)(b.body);if(i=a.id,l=b.number,c.select({h:g.issues.decomposedHash}).from(g.issues).where((0,d.Uo)((0,d.eq)(g.issues.repoId,i),(0,d.eq)(g.issues.number,l))).get()?.h===p)return{subtasks:k(a.id,b.number,c),source:"none",skipped:!0};let{titles:q,source:r}=await (0,j.o)(b,{generate:h.generate}),s=function(a,b,c,h,i=(0,f.Lf)()){return i.transaction(f=>(f.delete(g.issueSubtasks).where((0,d.Uo)((0,d.eq)(g.issueSubtasks.repoId,a),(0,d.eq)(g.issueSubtasks.issueNumber,b))).run(),c.forEach((c,d)=>{f.insert(g.issueSubtasks).values({repoId:a,issueNumber:b,ordinal:d,title:c,bodyHash:h}).run()}),f.select().from(g.issueSubtasks).where((0,d.Uo)((0,d.eq)(g.issueSubtasks.repoId,a),(0,d.eq)(g.issueSubtasks.issueNumber,b))).orderBy((0,e.Y)(g.issueSubtasks.ordinal)).all()))}(a.id,b.number,q,p,c);return n=a.id,o=b.number,c.update(g.issues).set({decomposedHash:p}).where((0,d.Uo)((0,d.eq)(g.issues.repoId,n),(0,d.eq)(g.issues.number,o))).run(),{subtasks:s,source:r,skipped:!1}}},72388:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,74111,23)),Promise.resolve().then(c.t.bind(c,35598,23)),Promise.resolve().then(c.t.bind(c,77192,23)),Promise.resolve().then(c.t.bind(c,22047,23)),Promise.resolve().then(c.t.bind(c,99607,23)),Promise.resolve().then(c.t.bind(c,25241,23)),Promise.resolve().then(c.t.bind(c,60518,23)),Promise.resolve().then(c.t.bind(c,89871,23))},74058:(a,b,c)=>{"use strict";c.d(b,{Fl:()=>k,JD:()=>i,QD:()=>l});var d=c(55710),e=c(63480),f=c(51605);let g=[{id:"telegram",isConfigured:a=>!!(a.telegramBotToken&&a.telegramChatId),send:(a,b,c)=>c.postJson(`https://api.telegram.org/bot${b.telegramBotToken}/sendMessage`,{chat_id:b.telegramChatId,text:a})},{id:"slack",isConfigured:a=>!!a.slackWebhookUrl,send:(a,b,c)=>c.postJson(b.slackWebhookUrl,{text:a})},{id:"email",isConfigured:a=>!!(a.smtpHost&&a.emailFrom&&a.emailTo),send:(a,b,c)=>c.sendMail({to:b.emailTo,from:b.emailFrom,subject:"Drydock notification",text:a},{host:b.smtpHost,port:b.smtpPort,user:b.smtpUser,pass:b.smtpPass})}];function h(a){return g.filter(b=>b.isConfigured(a))}async function i(a,b,c=(0,d.Lf)(),e=l){let g=(0,f.mt)(c);if(!g.notifyEvents.includes(a))return;let k=h(g);if(0!==k.length){var m,n;await (m=j(k,b,g,e),n=()=>console.error(`[notify] dispatch for ${a} exceeded 5000ms; continuing in background`),new Promise(a=>{let b=setTimeout(()=>{n(),a()},5e3);b.unref?.();let c=()=>{clearTimeout(b),a()};m.then(c,c)}))}}async function j(a,b,c,d){for(let f of a)try{await f.send(b,c,d)}catch(a){console.error(`[notify] ${f.id} delivery failed`,(0,e.f)(String(a)))}}async function k(a=(0,d.Lf)(),b=l){let c=(0,f.mt)(a),g=[];for(let a of h(c))try{await a.send("Drydock test notification — your channel is configured correctly.",c,b),g.push({channel:a.id,ok:!0})}catch(b){var i;console.error(`[notify] ${a.id} test failed`,(0,e.f)(String(b))),g.push({channel:a.id,ok:!1,error:(0,e.f)((i=b)instanceof Error?i.message:String(i))})}return g}let l={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(462).then(c.t.bind(c,17462,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)}}},75922:(a,b,c)=>{"use strict";c.d(b,{Providers:()=>g});var d=c(37477),e=c(56556),f=c(50720);function g({children:a}){return(0,d.jsx)(e.N,{attribute:"class",defaultTheme:"light",enableSystem:!1,disableTransitionOnChange:!0,children:(0,d.jsx)(f.t,{children:a})})}},76558:(a,b,c)=>{"use strict";c.d(b,{l:()=>f});var d=c(37477),e=c(54848);function f({open:a,onClose:b,labelledById:c,children:g}){let h=(0,e.useRef)(null);return((0,e.useRef)(null),a)?(0,d.jsx)("div",{className:"fixed inset-0 z-50 flex items-start justify-center overflow-y-auto bg-black/50 p-4 sm:p-8",onMouseDown:b,children:(0,d.jsx)("div",{ref:h,role:"dialog","aria-modal":"true","aria-labelledby":c,tabIndex:-1,className:"mt-8 w-full max-w-2xl rounded-xl border border-card-border bg-card p-5 shadow-lg outline-none",onMouseDown:a=>a.stopPropagation(),children:g})}):null}},77173:(a,b,c)=>{"use strict";c.d(b,{v0:()=>j,tm:()=>k,Dn:()=>m,Cq:()=>l});var d=c(54452),e=c(74366),f=c(55710),g=c(84654);let h={detected:["evaluating","error"],evaluating:["proposed","skipped","error"],proposed:["publishing","skipped","error"],publishing:["published","error"],published:[],skipped:[],error:["evaluating"]};class i extends Error{constructor(a,b){super(`invalid release transition: ${a} -> ${b}`)}}function j(a,b=(0,f.Lf)()){let c=a.triggerSha??null;if(null!==c){let e=b.select().from(g.releaseRuns).where((0,d.Uo)((0,d.eq)(g.releaseRuns.repoId,a.repoId),(0,d.eq)(g.releaseRuns.triggerSha,c))).get();if(e)return e}return b.insert(g.releaseRuns).values({repoId:a.repoId,mode:a.mode,triggerPrNumber:a.triggerPrNumber??null,triggerSha:c}).returning().get()}function k(a,b=(0,f.Lf)()){return b.select().from(g.releaseRuns).where((0,d.eq)(g.releaseRuns.id,a)).get()}function l(a,b,c={},e=(0,f.Lf)()){let j=k(a,e);if(!j)throw Error(`release run ${a} not found`);var m=j.status;if(!h[m].includes(b))throw new i(m,b);let{prNumbers:n,...o}=c;return e.update(g.releaseRuns).set({status:b,updatedAt:Math.floor(Date.now()/1e3),...o,...void 0!==n?{prNumbers:JSON.stringify(n)}:{}}).where((0,d.eq)(g.releaseRuns.id,a)).returning().get()}function m(a,b=(0,f.Lf)(),c=10){return b.select().from(g.releaseRuns).where((0,d.eq)(g.releaseRuns.repoId,a)).orderBy((0,e.i)(g.releaseRuns.updatedAt),(0,e.i)(g.releaseRuns.id)).limit(c).all().map(a=>({id:a.id,mode:a.mode,status:a.status,triggerPrNumber:a.triggerPrNumber,fromTag:a.fromTag,tag:a.tag,title:a.title,prNumbers:function(a){try{let b=JSON.parse(a);return Array.isArray(b)?b.filter(a=>"number"==typeof a):[]}catch{return[]}}(a.prNumbers),errorMessage:a.errorMessage,updatedAt:a.updatedAt}))}},78233:(a,b,c)=>{"use strict";c.d(b,{$:()=>i});var d=c(37477),e=c(54848),f=c(2210);let g={default:"bg-primary text-primary-foreground shadow-xs hover-elevate active-elevate-2",secondary:"bg-secondary text-secondary-foreground hover-elevate active-elevate-2",outline:"border border-border bg-transparent shadow-xs hover-elevate active-elevate-2",destructive:"bg-destructive text-destructive-foreground shadow-xs hover-elevate active-elevate-2",ghost:"border border-transparent hover-elevate active-elevate-2"},h={default:"h-9 px-4 py-2 rounded-lg text-sm",sm:"h-8 px-3 rounded-md text-xs",lg:"h-10 px-8 rounded-lg text-sm",icon:"h-9 w-9 rounded-lg"},i=e.forwardRef(({className:a,variant:b="default",size:c="default",...e},i)=>(0,d.jsx)("button",{ref:i,className:(0,f.cn)("inline-flex items-center justify-center gap-2 whitespace-nowrap font-medium transition-colors","focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring","disabled:pointer-events-none disabled:opacity-50","[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",g[b],h[c],a),...e}));i.displayName="Button"},84654:(a,b,c)=>{"use strict";c.r(b),c.d(b,{adrs:()=>n,deploymentHealingSessions:()=>u,followupIssues:()=>o,healingAttempts:()=>r,healingSessions:()=>q,issueSubtasks:()=>t,issues:()=>p,jobEvents:()=>m,jobs:()=>l,oneShotCosts:()=>y,prQuestions:()=>v,promptTemplates:()=>k,releaseRuns:()=>w,repos:()=>j,reviewFeedbackItems:()=>s,settings:()=>x});var d=c(94448),e=c(25356),f=c(95584),g=c(71139),h=c(73042),i=c(73126);let j=(0,e.D)("repos",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),path:(0,g.Qq)("path").notNull(),name:(0,g.Qq)("name").notNull(),defaultBranch:(0,g.Qq)("default_branch").notNull().default("main"),queueLabel:(0,g.Qq)("queue_label").notNull().default("drydock:queue"),workingLabel:(0,g.Qq)("working_label").notNull().default("drydock:working"),needsHumanLabel:(0,g.Qq)("needs_human_label").notNull().default("drydock:needs-human"),defaultModel:(0,g.Qq)("default_model").notNull().default("claude-opus-4-8"),agent:(0,g.Qq)("agent").notNull().default("claude"),platform:(0,g.Qq)("platform").notNull().default("github"),apiBaseUrl:(0,g.Qq)("api_base_url"),apiToken:(0,g.Qq)("api_token"),dailyCostLimitUsd:(0,h.x)("daily_cost_limit_usd").notNull().default(10),adrGating:(0,f.nd)("adr_gating",{mode:"boolean"}).notNull().default(!1),sequential:(0,f.nd)("sequential",{mode:"boolean"}).notNull().default(!0),autoTriageEnabled:(0,f.nd)("auto_triage_enabled",{mode:"boolean"}).notNull().default(!1),autoProcessEnabled:(0,f.nd)("auto_process_enabled",{mode:"boolean"}).notNull().default(!1),autoHealCi:(0,f.nd)("auto_heal_ci",{mode:"boolean"}).notNull().default(!1),autoReviewFeedback:(0,f.nd)("auto_review_feedback",{mode:"boolean"}).notNull().default(!1),autoResolveMergeConflicts:(0,f.nd)("auto_resolve_merge_conflicts",{mode:"boolean"}).notNull().default(!1),includeProgressReplies:(0,f.nd)("include_progress_replies",{mode:"boolean"}).notNull().default(!1),autoDecompose:(0,f.nd)("auto_decompose",{mode:"boolean"}).notNull().default(!1),verifyPr:(0,f.nd)("verify_pr",{mode:"boolean"}).notNull().default(!1),autoHealDeployments:(0,f.nd)("auto_heal_deployments",{mode:"boolean"}).notNull().default(!1),deploymentPlatform:(0,g.Qq)("deployment_platform"),trustedReviewers:(0,g.Qq)("trusted_reviewers").notNull().default("[]"),ignoredBots:(0,g.Qq)("ignored_bots").notNull().default('["dependabot[bot]","github-actions[bot]","codecov[bot]"]'),readyLabels:(0,g.Qq)("ready_labels").notNull().default('["ready","ready-for-agent","ready-to-work"]'),blockingLabels:(0,g.Qq)("blocking_labels").notNull().default('["blocked","question","needs-human","needs-discussion","wontfix","duplicate","invalid"]'),autoLabelWhitelist:(0,g.Qq)("auto_label_whitelist").notNull().default('["bug","enhancement","documentation","ready"]'),priorityAuthors:(0,g.Qq)("priority_authors").notNull().default("[]"),minAuthorAssociation:(0,g.Qq)("min_author_association").notNull().default("approved"),maxAttempts:(0,f.nd)("max_attempts").notNull().default(3),maxJobMinutes:(0,f.nd)("max_job_minutes"),maxCiWaitMinutes:(0,f.nd)("max_ci_wait_minutes"),maxJobCostUsd:(0,h.x)("max_job_cost_usd"),agentInstructions:(0,g.Qq)("agent_instructions"),releaseEnabled:(0,f.nd)("release_enabled",{mode:"boolean"}).notNull().default(!1),webhookSecret:(0,g.Qq)("webhook_secret"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),k=(0,e.D)("prompt_templates",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").references(()=>j.id,{onDelete:"cascade"}),name:(0,g.Qq)("name").notNull(),content:(0,g.Qq)("content").notNull(),version:(0,f.nd)("version").notNull().default(1),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)}),l=(0,e.D)("jobs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),issueNumber:(0,f.nd)("issue_number").notNull(),status:(0,g.Qq)("status").notNull().default("queued"),branch:(0,g.Qq)("branch"),prNumber:(0,f.nd)("pr_number"),sessionId:(0,g.Qq)("session_id"),agent:(0,g.Qq)("agent").notNull().default("claude"),startedAt:(0,f.nd)("started_at"),finishedAt:(0,f.nd)("finished_at"),model:(0,g.Qq)("model"),maxTurns:(0,f.nd)("max_turns").notNull().default(40),totalInputTokens:(0,f.nd)("total_input_tokens").notNull().default(0),totalOutputTokens:(0,f.nd)("total_output_tokens").notNull().default(0),costUsd:(0,h.x)("cost_usd").notNull().default(0),ciRetryCount:(0,f.nd)("ci_retry_count").notNull().default(0),errorMessage:(0,g.Qq)("error_message"),attempts:(0,f.nd)("attempts").notNull().default(0),leaseToken:(0,g.Qq)("lease_token"),leaseExpiresAt:(0,f.nd)("lease_expires_at"),workerId:(0,g.Qq)("worker_id"),availableAt:(0,f.nd)("available_at"),dedupeKey:(0,g.Qq)("dedupe_key"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoIdx:(0,i.Pe)("jobs_repo_idx").on(a.repoId),statusIdx:(0,i.Pe)("jobs_status_idx").on(a.status),leaseIdx:(0,i.Pe)("jobs_lease_idx").on(a.leaseExpiresAt),dedupeActiveUnique:(0,i.GL)("jobs_dedupe_active_unique").on(a.dedupeKey).where((0,d.ll)`${a.dedupeKey} is not null and ${a.status} not in ('merged', 'aborted')`)})),m=(0,e.D)("job_events",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),ts:(0,f.nd)("ts").notNull().default((0,d.ll)`(unixepoch())`),type:(0,g.Qq)("type").notNull(),payload:(0,g.Qq)("payload").notNull().default("{}")},a=>({jobTsIdx:(0,i.Pe)("job_events_job_ts_idx").on(a.jobId,a.ts)})),n=(0,e.D)("adrs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").references(()=>l.id,{onDelete:"set null"}),repoId:(0,f.nd)("repo_id").references(()=>j.id,{onDelete:"cascade"}),filePath:(0,g.Qq)("file_path").notNull(),title:(0,g.Qq)("title").notNull(),status:(0,g.Qq)("status").notNull().default("pending_review"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),o=(0,e.D)("followup_issues",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").references(()=>l.id,{onDelete:"set null"}),ghIssueNumber:(0,f.nd)("gh_issue_number").notNull(),title:(0,g.Qq)("title").notNull(),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),p=(0,e.D)("issues",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),number:(0,f.nd)("number").notNull(),title:(0,g.Qq)("title").notNull(),labels:(0,g.Qq)("labels").notNull().default("[]"),state:(0,g.Qq)("state").notNull().default("open"),priority:(0,f.nd)("priority").notNull().default(0),triageHash:(0,g.Qq)("triage_hash"),triagedAt:(0,f.nd)("triaged_at"),decomposedHash:(0,g.Qq)("decomposed_hash"),modelOverride:(0,g.Qq)("model_override"),agentOverride:(0,g.Qq)("agent_override"),syncedAt:(0,f.nd)("synced_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoNumberUnique:(0,i.GL)("issues_repo_number_unique").on(a.repoId,a.number),repoPriorityIdx:(0,i.Pe)("issues_repo_priority_idx").on(a.repoId,a.priority)})),q=(0,e.D)("healing_sessions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),headSha:(0,g.Qq)("head_sha").notNull(),status:(0,g.Qq)("status").notNull().default("triaging"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("healing_sessions_job_idx").on(a.jobId),prShaIdx:(0,i.Pe)("healing_sessions_pr_sha_idx").on(a.prNumber,a.headSha)})),r=(0,e.D)("healing_attempts",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),sessionId:(0,f.nd)("session_id").notNull().references(()=>q.id,{onDelete:"cascade"}),fingerprint:(0,g.Qq)("fingerprint").notNull(),category:(0,g.Qq)("category").notNull(),checkName:(0,g.Qq)("check_name").notNull(),status:(0,g.Qq)("status").notNull().default("repairing"),beforeSha:(0,g.Qq)("before_sha"),afterSha:(0,g.Qq)("after_sha"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({sessionIdx:(0,i.Pe)("healing_attempts_session_idx").on(a.sessionId),fingerprintIdx:(0,i.Pe)("healing_attempts_fingerprint_idx").on(a.sessionId,a.fingerprint)})),s=(0,e.D)("review_feedback_items",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),threadId:(0,g.Qq)("thread_id").notNull(),reviewer:(0,g.Qq)("reviewer").notNull(),classification:(0,g.Qq)("classification").notNull(),status:(0,g.Qq)("status").notNull().default("pending"),attempts:(0,f.nd)("attempts").notNull().default(0),detail:(0,g.Qq)("detail"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("review_feedback_job_idx").on(a.jobId),jobThreadUnique:(0,i.GL)("review_feedback_job_thread_unique").on(a.jobId,a.threadId)})),t=(0,e.D)("issue_subtasks",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),issueNumber:(0,f.nd)("issue_number").notNull(),ordinal:(0,f.nd)("ordinal").notNull(),title:(0,g.Qq)("title").notNull(),status:(0,g.Qq)("status").notNull().default("pending"),bodyHash:(0,g.Qq)("body_hash").notNull(),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({issueIdx:(0,i.Pe)("issue_subtasks_issue_idx").on(a.repoId,a.issueNumber),issueOrdinalUnique:(0,i.GL)("issue_subtasks_issue_ordinal_unique").on(a.repoId,a.issueNumber,a.ordinal)})),u=(0,e.D)("deployment_healing_sessions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),platform:(0,g.Qq)("platform").notNull(),commitSha:(0,g.Qq)("commit_sha").notNull(),status:(0,g.Qq)("status").notNull().default("monitoring"),logsExcerpt:(0,g.Qq)("logs_excerpt"),followupPrNumber:(0,f.nd)("followup_pr_number"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("deployment_healing_job_idx").on(a.jobId),jobShaUnique:(0,i.GL)("deployment_healing_job_sha_unique").on(a.jobId,a.commitSha)})),v=(0,e.D)("pr_questions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),question:(0,g.Qq)("question").notNull(),answer:(0,g.Qq)("answer"),status:(0,g.Qq)("status").notNull().default("answering"),errorMessage:(0,g.Qq)("error_message"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("pr_questions_job_idx").on(a.jobId)})),w=(0,e.D)("release_runs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),mode:(0,g.Qq)("mode").notNull().default("auto"),triggerPrNumber:(0,f.nd)("trigger_pr_number"),triggerSha:(0,g.Qq)("trigger_sha"),status:(0,g.Qq)("status").notNull().default("detected"),bump:(0,g.Qq)("bump"),fromTag:(0,g.Qq)("from_tag"),tag:(0,g.Qq)("tag"),title:(0,g.Qq)("title"),notes:(0,g.Qq)("notes"),prNumbers:(0,g.Qq)("pr_numbers").notNull().default("[]"),errorMessage:(0,g.Qq)("error_message"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoIdx:(0,i.Pe)("release_runs_repo_idx").on(a.repoId),triggerUnique:(0,i.GL)("release_runs_trigger_unique").on(a.repoId,a.triggerSha).where((0,d.ll)`${a.triggerSha} is not null`)})),x=(0,e.D)("settings",{key:(0,g.Qq)("key").primaryKey(),value:(0,g.Qq)("value").notNull()}),y=(0,e.D)("one_shot_costs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),type:(0,g.Qq)("type").notNull(),costUsd:(0,h.x)("cost_usd").notNull().default(0),inputTokens:(0,f.nd)("input_tokens").notNull().default(0),outputTokens:(0,f.nd)("output_tokens").notNull().default(0),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoIdx:(0,i.Pe)("one_shot_costs_repo_idx").on(a.repoId)}))},84656:(a,b,c)=>{"use strict";c.d(b,{Ie:()=>H});var d=c(22579),e=c(68434);class f{get(a){return this.entries.get(a)}set(a,b,c){this.entries.set(a,{etag:b,body:c})}constructor(){this.entries=new Map}}let g=new f;function h(a){let b=a.replace(/\r\n/g,"\n"),c=b.lastIndexOf("\nHTTP/"),d=c>=0?c+1:b.startsWith("HTTP/")?0:-1;if(d<0)return{status:null,headers:{},body:a};let e=b.slice(d),f=e.indexOf("\n\n"),g=f>=0?e.slice(0,f):e,h=f>=0?e.slice(f+2):"",i=g.split("\n"),j=(i.shift()??"").match(/^HTTP\/\S+\s+(\d+)/),k=j?Number(j[1]):null,l={};for(let a of i){let b=a.indexOf(":");b<=0||(l[a.slice(0,b).trim().toLowerCase()]=a.slice(b+1).trim())}return{status:k,headers:l,body:h}}function i(a){if(!a)return null;for(let b of a.split(",")){let a=b.match(/<([^>]+)>\s*;\s*rel="?next"?/);if(a?.[1])return a[1]}return null}var j=c(57846),k=c(20210);let l=d.Ik({number:d.ai(),title:d.Yj(),labels:d.YO(d.Ik({name:d.Yj()})).default([]),user:d.Ik({login:d.Yj()}).nullish(),author_association:d.Yj().nullish(),pull_request:d.L5().optional()}).transform(a=>({number:a.number,title:a.title,labels:a.labels,author:a.user?.login??null,authorAssociation:a.author_association??null,isPullRequest:void 0!==a.pull_request})),m=d.Ik({resources:d.g1(d.Yj(),d.Ik({limit:d.ai(),remaining:d.ai(),reset:d.ai()}))}),n=d.Ik({number:d.ai(),title:d.Yj(),body:d.Yj().default(""),state:d.Yj().default("open"),labels:d.YO(d.Ik({name:d.Yj()})).default([]),comments:d.YO(d.Ik({author:d.Ik({login:d.Yj()}).default({login:""}),body:d.Yj().default(""),createdAt:d.Yj().default("")})).default([])}),o=d.Ik({name:d.Yj(),state:d.Yj(),bucket:d.Yj().optional()}),p=d.Ik({data:d.Ik({repository:d.Ik({pullRequest:d.Ik({reviewThreads:d.Ik({nodes:d.YO(d.Ik({id:d.Yj(),isResolved:d.zM().default(!1),isOutdated:d.zM().default(!1),path:d.Yj().nullish(),line:d.ai().nullish(),comments:d.Ik({nodes:d.YO(d.Ik({id:d.Yj(),databaseId:d.ai().nullish(),body:d.Yj().default(""),author:d.Ik({login:d.Yj()}).nullish()}))})}))})}).nullish()})})});class q extends Error{}function r(a,b){return`${a}=${b}`}function s(a){let b;try{b=JSON.parse(a||"[]")}catch{throw new q("unexpected gh output: response body was not valid JSON")}if(!Array.isArray(b))throw new q("unexpected gh output: expected a JSON array");return b}class t{constructor(a,b=e.S,c=k.og,d=g){this.cwd=a,this.run=b,this.governor=c,this.etags=d}gate(a="core"){let b=this.governor.decide(a,(0,j.u)());if(!b.allowed)throw new k.OE(b.reason,a,b.retryAfterMs)}async exec(a,b="core"){this.gate(b);let c=await this.run("gh",a,this.cwd);return 0!==c.exitCode&&/rate limit|429 too many/i.test(c.stderr)&&this.governor.note429(b),c}async refreshRateLimit(){let a,b=await this.run("gh",["api","rate_limit"],this.cwd);if(0===b.exitCode){try{a=m.parse(JSON.parse(b.stdout||"{}"))}catch{return}for(let b of["core","graphql","search"]){let c=a.resources[b];c&&this.governor.observe(b,c)}}}async conditionalList(a,b){this.gate("core");let c=this.etags.get(a),d=["api",`repos/{owner}/{repo}/issues?${b}`,"--include"];c&&d.push("-H",`If-None-Match: ${c.etag}`);let e=await this.run("gh",d,this.cwd),f=this.checkListResponse(e,h(e.stdout));if(304===f.status&&c)return this.toGhIssues(s(c.body));let g=[...s(f.body)],j=i(f.headers.link),k=1;for(;j&&k<100;){this.gate("core");let a=await this.run("gh",["api",j,"--include"],this.cwd),b=this.checkListResponse(a,h(a.stdout));g.push(...s(b.body)),j=i(b.headers.link),k++}let l=f.headers.etag;return l&&this.etags.set(a,l,JSON.stringify(g)),this.toGhIssues(g)}checkListResponse(a,b){var c,d;let e=(0,k.bR)(b.headers);if(e&&this.governor.observe(e.resource,e.snapshot),304===b.status)return b;if(c=b.status,d=b.headers,429===c||403===c&&"0"===d["x-ratelimit-remaining"]){let a=Number(b.headers["x-ratelimit-reset"]);throw this.governor.note429("core",Number.isFinite(a)?a:void 0),new q(`gh api rate limited (status ${b.status})`)}if(200!==b.status)throw new q(a.stderr||`gh api failed (status ${b.status??"unknown"})`);return b}toGhIssues(a){let b=d.YO(l).safeParse(a);if(!b.success)throw new q(`unexpected gh output: ${b.error.message}`);return b.data.filter(a=>!a.isPullRequest).map(({isPullRequest:a,...b})=>b)}async listIssues(a){let b=`state=open&per_page=100&labels=${encodeURIComponent(a)}`;return this.conditionalList(`${this.cwd}::label:${a}`,b)}async listAllIssues(){return this.conditionalList(`${this.cwd}::all`,"state=open&per_page=100")}async viewIssue(a){let b=await this.exec(["issue","view",String(a),"--json","number,title,body,state,labels,comments"]);if(0!==b.exitCode)throw new q(b.stderr||"gh issue view failed");let c=n.safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);let d=c.data;return{number:d.number,title:d.title,body:d.body,state:d.state,labels:d.labels.map(a=>a.name),comments:d.comments.map(a=>({author:a.author.login,body:a.body,createdAt:a.createdAt}))}}async editIssue(a,b){let c=["issue","edit",String(a)];if(void 0!==b.title&&c.push(r("--title",b.title)),void 0!==b.body&&c.push(r("--body",b.body)),3===c.length)return;let d=await this.exec(c);if(0!==d.exitCode)throw new q(d.stderr||"gh issue edit failed")}async ensureLabel(a,b={}){let c=await this.exec(["label","list","--json","name","--limit","200"]),e=c.stdout.trim();if(0===c.exitCode&&e)try{let b=d.YO(d.Ik({name:d.Yj()})).safeParse(JSON.parse(e));if(b.success&&b.data.some(b=>b.name===a))return}catch{}let f=["label","create",a];b.color&&f.push("--color",b.color),b.description&&f.push("--description",b.description);let g=await this.exec(f);if(0!==g.exitCode&&!/already exists/i.test(g.stderr))throw new q(g.stderr||"gh label create failed")}async addLabels(a,b){let c=await this.exec(["issue","edit",String(a),r("--add-label",b.join(","))]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue edit failed")}async removeLabels(a,b){let c=await this.exec(["issue","edit",String(a),r("--remove-label",b.join(","))]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue edit failed")}async closeIssue(a){let b=await this.exec(["issue","close",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh issue close failed")}async reopenIssue(a){let b=await this.exec(["issue","reopen",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh issue reopen failed")}async prChecks(a){let b=await this.exec(["pr","checks",String(a),"--json","name,state,bucket"]),c=b.stdout.trim();if(!c){if(0!==b.exitCode)throw new q(b.stderr||"gh pr checks failed");return[]}let e=d.YO(o).safeParse(JSON.parse(c));if(!e.success)throw new q(`unexpected gh output: ${e.error.message}`);return e.data}async prHeadSha(a){let b=await this.exec(["pr","view",String(a),"--json","headRefOid"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr view failed");let c=d.Ik({headRefOid:d.Yj()}).safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);return c.data.headRefOid}async commentIssue(a,b){let c=await this.exec(["issue","comment",String(a),r("--body",b)]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue comment failed")}async createIssue(a,b){let c=await this.exec(["issue","create",r("--title",a),r("--body",b)]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue create failed");let d=c.stdout.match(/\/issues\/(\d+)/);if(!d?.[1])throw new q(`could not parse issue number from: ${c.stdout}`);return Number(d[1])}async failedRunLog(a){let b,c;if(!this.governor.decide("core",(0,j.u)()).allowed)return"";let e=await this.run("gh",["pr","view",String(a),"--json","headRefName"],this.cwd);if(0!==e.exitCode)return"";try{b=d.Ik({headRefName:d.Yj()}).parse(JSON.parse(e.stdout||"{}")).headRefName}catch{return""}if(!b)return"";let f=await this.run("gh",["run","list","--branch",b,"--json","databaseId,conclusion","--limit","20"],this.cwd);if(0!==f.exitCode)return"";try{c=d.YO(d.Ik({databaseId:d.ai(),conclusion:d.Yj().default("")})).parse(JSON.parse(f.stdout||"[]"))}catch{return""}let g=c.find(a=>"failure"===a.conclusion);if(!g)return"";let h=await this.run("gh",["run","view",String(g.databaseId),"--log-failed"],this.cwd);return 0!==h.exitCode?"":h.stdout.slice(-8e3)}async prDiff(a){if(!this.governor.decide("core",(0,j.u)()).allowed)return"";let b=await this.run("gh",["pr","diff",String(a)],this.cwd);return 0!==b.exitCode?"":b.stdout}async mergePr(a){let b=await this.exec(["pr","merge",String(a),"--squash","--auto"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr merge failed")}async createPr(a){let b=await this.exec(["pr","create",r("--head",a.head),r("--base",a.base),r("--title",a.title),r("--body",a.body)]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr create failed");let c=b.stdout.match(/\/pull\/(\d+)/);if(!c?.[1])throw new q(`could not parse PR number from: ${b.stdout}`);return Number(c[1])}async listReleases(){let a=await this.exec(["release","list","--json","tagName,createdAt","--limit","100"]);if(0!==a.exitCode)throw new q(a.stderr||"gh release list failed");let b=d.YO(d.Ik({tagName:d.Yj(),createdAt:d.Yj().default("")})).safeParse(JSON.parse(a.stdout||"[]"));if(!b.success)throw new q(`unexpected gh output: ${b.error.message}`);return b.data}async listMergedPrs(a=100){let b=await this.exec(["pr","list","--state","merged","--json","number,title,mergedAt,labels","--limit",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr list failed");let c=d.YO(d.Ik({number:d.ai(),title:d.Yj().default(""),mergedAt:d.Yj().default(""),labels:d.YO(d.Ik({name:d.Yj()})).default([])})).safeParse(JSON.parse(b.stdout||"[]"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);return c.data.map(a=>({number:a.number,title:a.title,mergedAt:a.mergedAt,labels:a.labels.map(a=>a.name)}))}async createRelease(a){let b=await this.exec(["release","create",a.tag,r("--title",a.title),r("--notes",a.notes),r("--target",a.target)]);if(0!==b.exitCode)throw new q(b.stderr||"gh release create failed")}async repoSlug(){if(this.slug)return this.slug;let a=await this.exec(["repo","view","--json","nameWithOwner"]);if(0!==a.exitCode)throw new q(a.stderr||"gh repo view failed");let b=d.Ik({nameWithOwner:d.Yj()}).safeParse(JSON.parse(a.stdout||"{}"));if(!b.success)throw new q(`unexpected gh output: ${b.error.message}`);let[c,e]=b.data.nameWithOwner.split("/");if(!c||!e)throw new q(`unexpected repo slug: ${b.data.nameWithOwner}`);return this.slug={owner:c,name:e},this.slug}async listReviewThreads(a){let{owner:b,name:c}=await this.repoSlug(),d=await this.exec(["api","graphql","-F",`owner=${b}`,"-F",`name=${c}`,"-F",`number=${a}`,"-f","query=query($owner:String!,$name:String!,$number:Int!){repository(owner:$owner,name:$name){pullRequest(number:$number){reviewThreads(first:100){nodes{id isResolved isOutdated path line comments(first:100){nodes{id databaseId body author{login}}}}}}}}"],"graphql");if(0!==d.exitCode)throw new q(d.stderr||"gh api graphql failed");let e=p.safeParse(JSON.parse(d.stdout||"{}"));if(!e.success)throw new q(`unexpected gh output: ${e.error.message}`);return(e.data.data.repository.pullRequest?.reviewThreads.nodes??[]).map(a=>({id:a.id,isResolved:a.isResolved,isOutdated:a.isOutdated,path:a.path??null,line:a.line??null,comments:a.comments.nodes.map(a=>({id:a.id,databaseId:a.databaseId??null,author:a.author?.login??"",body:a.body}))}))}async replyToReviewThread(a,b){let c=await this.exec(["api","graphql","-F",`threadId=${a}`,"-f",`body=${b}`,"-f","query=mutation($threadId:ID!,$body:String!){addPullRequestReviewThreadReply(input:{pullRequestReviewThreadId:$threadId,body:$body}){comment{id}}}"],"graphql");if(0!==c.exitCode)throw new q(c.stderr||"gh review reply failed")}async updateReviewComment(a,b){let c=await this.exec(["api","graphql","-F",`id=${a}`,"-f",`body=${b}`,"-f","query=mutation($id:ID!,$body:String!){updatePullRequestReviewComment(input:{pullRequestReviewCommentId:$id,body:$body}){pullRequestReviewComment{id}}}"],"graphql");if(0!==c.exitCode)throw new q(c.stderr||"gh update review comment failed")}async resolveReviewThread(a){let b=await this.exec(["api","graphql","-F",`threadId=${a}`,"-f","query=mutation($threadId:ID!){resolveReviewThread(input:{threadId:$threadId}){thread{id isResolved}}}"],"graphql");if(0!==b.exitCode)throw new q(b.stderr||"gh resolve thread failed")}async reactToReviewComment(a,b){let c=await this.exec(["api","graphql","-F",`subjectId=${a}`,"-F",`content=${b}`,"-f","query=mutation($subjectId:ID!,$content:ReactionContent!){addReaction(input:{subjectId:$subjectId,content:$content}){reaction{content}}}"],"graphql");if(0!==c.exitCode&&!/already has this reaction/i.test(c.stderr))throw new q(c.stderr||"gh add reaction failed")}}var u=c(89991);let v=async(a,b)=>{let c=await fetch(a,{method:b?.method??"GET",headers:b?.headers,body:b?.body,redirect:"manual"}),d=await c.text(),e={};return c.headers.forEach((a,b)=>{e[b.toLowerCase()]=a}),{status:c.status,ok:c.ok,body:d,headers:e}};var w=c(57729),x=c(14921);let y=d.Ik({iid:d.ai(),title:d.Yj(),labels:d.YO(d.Yj()).default([]),author:d.Ik({username:d.Yj()}).nullish()}),z=d.Ik({iid:d.ai(),title:d.Yj(),description:d.Yj().nullable().default(""),state:d.Yj().default("opened"),labels:d.YO(d.Yj()).default([])}),A=d.Ik({author:d.Ik({username:d.Yj().default("")}).default({username:""}),body:d.Yj().default(""),created_at:d.Yj().default(""),system:d.zM().default(!1)}),B=d.Ik({id:d.ai().optional(),name:d.Yj().default(""),status:d.Yj().default("")}),C=d.Ik({head_pipeline:d.Ik({id:d.ai()}).nullable().optional()}),D=d.Ik({old_path:d.Yj().default(""),new_path:d.Yj().default(""),diff:d.Yj().default("")});class E{constructor(a,b={}){this.config=a,this.http=b.http??v,this.run=b.run??e.S,this.sleep=b.sleep??(a=>new Promise(b=>setTimeout(b,a))),this.allowPrivateHost=b.allowPrivateHost??(0,x.gT)()}resolveProject(){return this.projectRef||(this.projectRef=(async()=>{let a=await this.run("git",["remote","get-url","origin"],this.config.cwd);if(0!==a.exitCode||!a.stdout.trim())throw new w.Q8(a.stderr||"could not resolve git remote 'origin'");let{host:b,path:c}=function(a){let b=a.trim().replace(/\.git$/,""),c=b.match(/^[\w.-]+@([^:]+):(.+)$/)??b.match(/^ssh:\/\/[^@]+@([^/]+)\/(.+)$/)??b.match(/^https?:\/\/([^/]+)\/(.+)$/);if(!c?.[1]||!c[2])throw new w.Q8(`unsupported git remote URL: ${a}`);return{host:c[1],path:c[2]}}(a.stdout);return{baseUrl:(this.config.baseUrl?.trim()||`https://${b}`).replace(/\/$/,""),encodedPath:encodeURIComponent(c)}})()),this.projectRef}async request(a,b,c={}){let d,{baseUrl:e,encodedPath:f}=await this.resolveProject(),g=`${e}/api/v4/projects/${f}${b}`;if(c.query){let a=new URLSearchParams(c.query).toString();a&&(g+=`?${a}`)}(0,x.sM)(g,{allowPrivate:this.allowPrivateHost});let h={};return this.config.token&&(h["PRIVATE-TOKEN"]=this.config.token),void 0!==c.body&&(h["Content-Type"]="application/json",d=JSON.stringify(c.body)),this.http(g,{method:a,headers:h,body:d})}async mutate(a,b,c={}){let d=await this.request(a,b,c);if(429===d.status)throw await this.sleep(function(a){if(a){let b=a["retry-after"];if(b){let a=Number(b);if(Number.isFinite(a)&&a>0)return Math.min(1e3*a,3e5)}let c=a["ratelimit-reset"]??a["x-ratelimit-reset"];if(c){let a=Number(c);if(Number.isFinite(a)){let b=1e3*a-Date.now();if(b>0)return Math.min(b,3e5)}}}return 6e4}(d.headers)),new w.Q8(`GitLab rate-limited: ${G(d)||`${a} ${b} returned 429`}`);if(!d.ok)throw new w.Q8(G(d)||`GitLab ${a} ${b} failed`);return d}async listIssues(a){return this.listIssuesPaginated({state:"opened",labels:a})}async listAllIssues(){return this.listIssuesPaginated({state:"opened"})}async listIssuesPaginated(a){let b=[],c=1;for(let e=0;e<100;e++){let e=await this.mutate("GET","/issues",{query:{...a,per_page:"100",page:String(c)}});b.push(...function(a){let b=d.YO(y).safeParse(F(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data.map(a=>({number:a.iid,title:a.title,labels:a.labels.map(a=>({name:a})),author:a.author?.username??null,authorAssociation:null}))}(e.body));let f=e.headers?.["x-next-page"];if(!f)break;let g=Number(f);if(!Number.isInteger(g)||g<=c)break;c=g}return b}async viewIssue(a){let b=await this.mutate("GET",`/issues/${a}`),c=await this.mutate("GET",`/issues/${a}/notes`,{query:{per_page:"100"}}),e=z.parse(F(b.body,{})),f=d.YO(A).parse(F(c.body,[]));return{number:e.iid,title:e.title,body:e.description??"",state:"opened"===e.state?"open":e.state,labels:e.labels,comments:f.filter(a=>!a.system).map(a=>({author:a.author.username,body:a.body,createdAt:a.created_at}))}}async editIssue(a,b){let c={};void 0!==b.title&&(c.title=b.title),void 0!==b.body&&(c.description=b.body),0!==Object.keys(c).length&&await this.mutate("PUT",`/issues/${a}`,{body:c})}async ensureLabel(a,b={}){var c;let e=await this.request("GET","/labels",{query:{per_page:"100"}});if(e.ok){let b=d.YO(d.Ik({name:d.Yj()})).safeParse(F(e.body,[]));if(b.success&&b.data.some(b=>b.name===a))return}let f={name:a,color:(c=b.color??"#808080").startsWith("#")?c:`#${c}`};b.description&&(f.description=b.description);let g=await this.request("POST","/labels",{body:f});if(!g.ok&&409!==g.status&&!/already exists/i.test(g.body))throw new w.Q8(G(g)||"GitLab label create failed")}async addLabels(a,b){await this.mutate("PUT",`/issues/${a}`,{body:{add_labels:b.join(",")}})}async removeLabels(a,b){await this.mutate("PUT",`/issues/${a}`,{body:{remove_labels:b.join(",")}})}async closeIssue(a){await this.mutate("PUT",`/issues/${a}`,{body:{state_event:"close"}})}async reopenIssue(a){await this.mutate("PUT",`/issues/${a}`,{body:{state_event:"reopen"}})}async commentIssue(a,b){await this.mutate("POST",`/issues/${a}/notes`,{body:{body:b}})}async createIssue(a,b){let c=await this.mutate("POST","/issues",{body:{title:a,description:b}});return d.Ik({iid:d.ai()}).parse(F(c.body,{})).iid}async prChecks(a){let b=await this.latestPipelineId(a);if(null===b)return[];let c=await this.mutate("GET",`/pipelines/${b}/jobs`,{query:{per_page:"100"}});return d.YO(B).parse(F(c.body,[])).map(a=>({name:a.name,state:function(a){switch(a){case"success":return"SUCCESS";case"failed":return"FAILURE";case"canceled":case"cancelled":return"CANCELLED";case"running":return"IN_PROGRESS";case"pending":case"created":case"scheduled":case"preparing":case"waiting_for_resource":return"PENDING";case"manual":return"MANUAL";case"skipped":return"SKIPPED";default:return a.toUpperCase()}}(a.status)}))}async prHeadSha(a){let b=await this.mutate("GET",`/merge_requests/${a}`);return d.Ik({sha:d.Yj()}).parse(F(b.body,{})).sha}async failedRunLog(a){try{let b=await this.latestPipelineId(a);if(null===b)return"";let c=await this.request("GET",`/pipelines/${b}/jobs`,{query:{per_page:"100"}});if(!c.ok)return(0,u.v)(`GitLab failedRunLog: pipeline ${b} jobs request failed (${c.status})`),"";let e=d.YO(B).safeParse(F(c.body,[]));if(!e.success)return"";let f=e.data.find(a=>"failed"===a.status&&void 0!==a.id);if(!f)return"";let g=await this.request("GET",`/jobs/${f.id}/trace`);if(!g.ok)return(0,u.v)(`GitLab failedRunLog: job ${f.id} trace request failed (${g.status})`),"";return g.body.slice(-8e3)}catch(a){return(0,u.v)("GitLab failedRunLog error:",a),""}}async prDiff(a){try{let b=await this.request("GET",`/merge_requests/${a}/diffs`,{query:{per_page:"100"}});if(!b.ok)return(0,u.v)(`GitLab prDiff: MR ${a} diffs request failed (${b.status})`),"";let c=d.YO(D).safeParse(F(b.body,[]));if(!c.success)return"";return c.data.map(a=>`--- a/${a.old_path}
|
|
23
|
+
+++ b/${a.new_path}
|
|
24
|
+
${a.diff}`).join("\n")}catch(a){return(0,u.v)("GitLab prDiff error:",a),""}}async mergePr(a){await this.mutate("PUT",`/merge_requests/${a}/merge`,{body:{squash:!0}})}async createPr(a){let b=await this.mutate("POST","/merge_requests",{body:{source_branch:a.head,target_branch:a.base,title:a.title,description:a.body}});return d.Ik({iid:d.ai()}).parse(F(b.body,{})).iid}async latestPipelineId(a){let b=await this.request("GET",`/merge_requests/${a}`);if(!b.ok)return null;let c=C.safeParse(F(b.body,{})),d=c.success?c.data.head_pipeline??null:null;return d?d.id:null}}function F(a,b){try{return JSON.parse(a||"null")??b}catch{return b}}function G(a){let b=d.Ik({message:d.L5(),error:d.L5()}).partial().safeParse(F(a.body,{}));if(b.success){let a=b.data.message??b.data.error;if("string"==typeof a)return a;if(a)return JSON.stringify(a)}return a.body.slice(0,300)}function H(a){return"gitlab"===((0,w.jL)(a.platform)?a.platform:w.cg)?new E({cwd:a.path,baseUrl:a.apiBaseUrl,token:a.apiToken}):new t({cwd:a.path}.cwd,void 0)}},89402:(a,b,c)=>{"use strict";c.d(b,{AppShell:()=>d});let d=(0,c(37251).registerClientReference)(function(){throw Error("Attempted to call AppShell() from the server but AppShell is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/work/drydock/drydock/src/components/app-shell.tsx","AppShell")},89991:(a,b,c)=>{"use strict";c.d(b,{v:()=>f});var d=c(63480);function e(a){if(a instanceof Error)return(0,d.f)(a.stack??`${a.name}: ${a.message}`);if("string"==typeof a)return(0,d.f)(a);try{return(0,d.f)(JSON.stringify(a))}catch{return(0,d.f)(String(a))}}function f(...a){console.error(...a.map(e))}},90924:(a,b,c)=>{"use strict";c.d(b,{AppShell:()=>D});var d=c(37477),e=c(60372),f=c(71416),g=c.n(f),h=c(1087),i=c(21687),j=c(54848),k=c(78233),l=c(98872),m=c(50720),n=c(47609);let o=(0,n.createServerReference)("00e11e1cd8053120843b8dd2d222841edf7946ac37",n.callServer,void 0,n.findSourceMapURL,"emergencyStopAction");function p(){let[a,b]=(0,j.useTransition)(),[c,e]=(0,j.useState)(!1),{success:f,error:g}=(0,m.d)();return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(k.$,{variant:"destructive",size:"sm",disabled:a,onClick:()=>e(!0),"aria-label":"Emergency stop — pause automation and abort all running jobs",children:[(0,d.jsx)(i.A,{className:"h-3.5 w-3.5"}),"Stop all"]}),(0,d.jsx)(l.T,{open:c,onOpenChange:e,onConfirm:function(){b(async()=>{try{let{aborted:a}=await o();f("Emergency stop",1===a?"Automation paused, 1 job aborted":`Automation paused, ${a} jobs aborted`)}catch(a){g("Emergency stop failed",a instanceof Error?a.message:String(a))}})},title:"Emergency stop?",description:"This pauses automation and aborts every running job, terminating their agents immediately.",confirmLabel:"Stop all",variant:"destructive",pending:a})]})}var q=c(36498),r=c(35178);let s=(0,n.createServerReference)("40f753c4fb4fd148c1b57eb92aec027419e39cfa6c",n.callServer,void 0,n.findSourceMapURL,"togglePauseAction");var t=c(2210);function u({paused:a}){let[b,c]=(0,j.useState)(a),[e,f]=(0,j.useTransition)(),{success:g,error:h}=(0,m.d)();return(0,d.jsx)("button",{type:"button",onClick:function(){let a=!b;f(async()=>{try{let b=await s(a);c(b.paused),g(b.paused?"Automation paused":"Automation resumed")}catch(a){h("Failed to toggle pause",a instanceof Error?a.message:String(a))}})},disabled:e,"aria-pressed":b,"aria-label":b?"Resume automation":"Pause automation",className:(0,t.cn)("flex items-center gap-1.5 rounded-md border px-2 py-1 text-xs font-medium transition-colors disabled:opacity-60",b?"border-warning-border bg-warning-muted text-warning-foreground hover-elevate":"border-border bg-background text-muted-foreground hover-elevate"),children:b?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(q.A,{className:"h-3.5 w-3.5"}),"Resume"]}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(r.A,{className:"h-3.5 w-3.5"}),"Pause"]})})}var v=c(43207),w=c(37412),x=c(56556);function y(){let{resolvedTheme:a,setTheme:b}=(0,x.D)(),[c,e]=(0,j.useState)(!1),f="dark"===a;return(0,d.jsx)(k.$,{variant:"ghost",size:"icon","aria-label":"Toggle theme",onClick:()=>b(f?"light":"dark"),children:c&&f?(0,d.jsx)(v.A,{}):(0,d.jsx)(w.A,{})})}var z=c(78916),A=c(37561);function B({status:a,installKind:b}){let[c,e]=(0,j.useState)(null),[f,g]=(0,j.useState)(!1);return f&&a.updateAvailable&&a.latestVersion&&a.latestVersion!==c?(0,d.jsxs)("div",{className:"flex items-center gap-1.5 rounded-md border border-success-border bg-success-muted px-2 py-1 text-xs font-medium text-success-foreground",children:[(0,d.jsx)(z.A,{className:"h-3.5 w-3.5 shrink-0"}),a.releaseUrl?(0,d.jsxs)("a",{href:a.releaseUrl,target:"_blank",rel:"noreferrer",className:"hover:underline",title:"global"===b?"Run `drydock update` to upgrade":"View the release on GitHub",children:["Update available: v",a.latestVersion]}):(0,d.jsxs)("span",{children:["Update available: v",a.latestVersion]}),"global"===b&&(0,d.jsx)("code",{className:"rounded bg-success/15 px-1 font-mono",children:"drydock update"}),(0,d.jsx)("button",{type:"button",onClick:()=>{try{a.latestVersion&&localStorage.setItem("drydock:update-dismissed",a.latestVersion)}catch{}e(a.latestVersion)},"aria-label":"Dismiss update notice",className:"rounded p-0.5 hover-elevate",children:(0,d.jsx)(A.A,{className:"h-3 w-3"})})]}):null}let C=[{href:"/",label:"Dashboard"},{href:"/needs-human",label:"Needs human"},{href:"/jobs",label:"Jobs"},{href:"/analytics",label:"Analytics"},{href:"/prompts",label:"Prompts"},{href:"/adrs",label:"ADRs"},{href:"/costs",label:"Costs"},{href:"/settings",label:"Settings"}];function D({children:a,adrPending:b=0,needsHuman:c=0,paused:f=!1,updateStatus:i,installKind:j="local"}){let k=(0,h.usePathname)();return(0,d.jsxs)("div",{className:"min-h-screen bg-background",children:[(0,d.jsx)("a",{href:"#main",className:"sr-only focus:not-sr-only focus:absolute focus:left-4 focus:top-4 focus:z-50 focus:rounded-md focus:bg-background focus:px-4 focus:py-2 focus:text-sm focus:font-medium focus:ring-2 focus:ring-ring",children:"Skip to main content"}),(0,d.jsx)("header",{className:"sticky top-0 z-30 border-b border-border bg-background/80 backdrop-blur",children:(0,d.jsxs)("div",{className:"mx-auto flex h-12 max-w-7xl items-center gap-1 px-4",children:[(0,d.jsxs)(g(),{href:"/",className:"mr-3 flex items-center gap-2",children:[(0,d.jsx)("span",{className:"flex h-6 w-6 items-center justify-center rounded-md bg-primary text-primary-foreground",children:(0,d.jsx)(e.A,{className:"h-3.5 w-3.5"})}),(0,d.jsx)("span",{className:"text-sm font-semibold tracking-tight",children:"Drydock"})]}),(0,d.jsx)("nav",{className:"flex items-center gap-0.5",children:C.map(a=>{var e;let f="/"===(e=a.href)?"/"===k:k.startsWith(e);return(0,d.jsxs)(g(),{href:a.href,className:(0,t.cn)("flex items-center gap-1.5 rounded-md px-3 py-1.5 text-sm transition-colors hover-elevate",f?"bg-accent font-medium text-accent-foreground":"text-muted-foreground"),children:[a.label,"/adrs"===a.href&&b>0&&(0,d.jsx)("span",{className:"rounded-full bg-destructive px-1.5 text-[10px] font-semibold text-destructive-foreground",children:b}),"/needs-human"===a.href&&c>0&&(0,d.jsx)("span",{className:"rounded-full bg-destructive px-1.5 text-[10px] font-semibold text-destructive-foreground",children:c})]},a.href)})}),(0,d.jsxs)("div",{className:"ml-auto flex items-center gap-2",children:[i&&(0,d.jsx)(B,{status:i,installKind:j}),(0,d.jsx)(u,{paused:f}),(0,d.jsx)(p,{}),(0,d.jsx)(y,{})]})]})}),(0,d.jsx)("main",{id:"main",className:"mx-auto max-w-7xl px-4 py-6",children:a})]})}},94736:(a,b,c)=>{"use strict";c.d(b,{KO:()=>m,gJ:()=>k});var d=c(22579);let e=d.Ik({input_tokens:d.ai().optional(),output_tokens:d.ai().optional(),cache_creation_input_tokens:d.ai().optional(),cache_read_input_tokens:d.ai().optional()}).passthrough(),f=d.Ik({type:d.eu("system"),subtype:d.Yj().optional(),session_id:d.Yj().optional(),model:d.Yj().optional()}),g=d.Ik({type:d.eu("assistant"),message:d.Ik({role:d.eu("assistant"),content:d.YO(d.g1(d.Yj(),d.L5())),usage:e.optional()})}),h=d.Ik({type:d.eu("user"),message:d.Ik({role:d.eu("user"),content:d.YO(d.g1(d.Yj(),d.L5()))})}),i=d.Ik({type:d.eu("result"),subtype:d.Yj().optional(),session_id:d.Yj().optional(),is_error:d.zM().optional(),total_cost_usd:d.ai().optional(),usage:e.optional()}),j=d.gM("type",[f,g,h,i]);function k(a){return a instanceof Error?a.message:String(a)}function l(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 m{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=j.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=l(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=l(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:k(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}}},96356:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,5381,23)),Promise.resolve().then(c.t.bind(c,45308,23)),Promise.resolve().then(c.t.bind(c,93298,23)),Promise.resolve().then(c.t.bind(c,98181,23)),Promise.resolve().then(c.t.bind(c,10689,23)),Promise.resolve().then(c.t.bind(c,86563,23)),Promise.resolve().then(c.t.bind(c,57548,23)),Promise.resolve().then(c.bind(c,9217))},96684:(a,b,c)=>{"use strict";c.d(b,{CZ:()=>h,Dp:()=>g,PH:()=>f});var d=c(55710),e=c(74058);async function f(a,b,c=(0,d.Lf)(),g=e.QD){a?b.active||(b.active=!0,await (0,e.JD)("cost_limit","\uD83D\uDCB8 Daily cost limit reached — new jobs are paused until the budget resets.",c,g)):b.active=!1}async function g(a,b,c=(0,d.Lf)(),f=e.QD){!a&&b&&await (0,e.JD)("automation_paused","⏸️ Automation paused — no new jobs will start until it resumes.",c,f)}async function h(a=(0,d.Lf)(),b=e.QD){await (0,e.JD)("automation_paused","\uD83C\uDF19 Automation draining — finishing in-flight jobs, then shutting down.",a,b)}},98872:(a,b,c)=>{"use strict";c.d(b,{T:()=>g});var d=c(37477),e=c(78233),f=c(76558);function g({open:a,onOpenChange:b,onConfirm:c,title:h,description:i,confirmLabel:j="Confirm",cancelLabel:k="Cancel",variant:l="default",pending:m=!1}){let n="confirm-dialog-title";return(0,d.jsx)(f.l,{open:a,onClose:()=>b(!1),labelledById:n,children:(0,d.jsxs)("div",{className:"space-y-4",children:[(0,d.jsxs)("div",{className:"space-y-1",children:[(0,d.jsx)("h2",{id:n,className:"text-base font-semibold",children:h}),i&&(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:i})]}),(0,d.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,d.jsx)(e.$,{variant:"outline",size:"sm",disabled:m,onClick:()=>b(!1),children:k}),(0,d.jsx)(e.$,{variant:"destructive"===l?"destructive":"default",size:"sm",disabled:m,onClick:()=>{c(),b(!1)},children:j})]})]})})}},99168:(a,b,c)=>{"use strict";c.d(b,{Providers:()=>d});let d=(0,c(37251).registerClientReference)(function(){throw Error("Attempted to call Providers() from the server but Providers is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/work/drydock/drydock/src/components/providers.tsx","Providers")},99773:(a,b,c)=>{"use strict";c.d(b,{$y:()=>j,MA:()=>k,r6:()=>i});var d=c(15465),e=c(66406),f=c(96684),g=c(74058),h=c(51605);async function i(a){let b=(0,h.mt)(),c=(0,h.DZ)(a);return await (0,f.Dp)(b.paused,c.paused),(0,e.revalidatePath)("/settings"),(0,e.revalidatePath)("/"),c}async function j(a){let b=(0,h.mt)(),c=(0,h.DZ)({paused:a});return await (0,f.Dp)(b.paused,c.paused),(0,e.revalidatePath)("/settings"),(0,e.revalidatePath)("/"),c}async function k(){return(0,g.Fl)()}(0,c(72269).D)([i,j,k]),(0,d.A)(i,"4010b8b40072f29c6a0fe100fbd97f4f7ce63fa76f",null),(0,d.A)(j,"40f753c4fb4fd148c1b57eb92aec027419e39cfa6c",null),(0,d.A)(k,"0091e788d04117a34b2cb0037b45b7f1f53987ba91",null)}};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";exports.id=49,exports.ids=[49],exports.modules={12717:(a,b,c)=>{c.d(b,{OE:()=>g,bR:()=>h,og:()=>f});let d=["core","graphql","search"];class e{constructor(a={}){this.resources=new Map,this.now=a.now??Date.now}observe(a,b){this.state(a).snapshot=b}note429(a,b){let c=void 0!==b?1e3*b:this.now()+6e4;this.state(a).limitedUntilMs=c}decide(a,b){let c=this.resources.get(a);if(!c)return{allowed:!0};let d=this.now();if(void 0!==c.limitedUntilMs&&d<c.limitedUntilMs)return{allowed:!1,reason:"limited",retryAfterMs:c.limitedUntilMs-d};let e=c.snapshot;if(!e||e.limit<=0)return{allowed:!0};let f=1e3*e.reset;if(d>=f)return{allowed:!0};let g=e.remaining/e.limit,h=f-d;return g<.05?{allowed:!1,reason:"floor",retryAfterMs:h}:"low"===b&&g<.3?{allowed:!1,reason:"reserve",retryAfterMs:h}:{allowed:!0}}snapshot(a){return this.resources.get(a)?.snapshot}state(a){let b=this.resources.get(a);return b||(b={},this.resources.set(a,b)),b}}let f=new e;class g extends Error{constructor(a,b,c){super(`github ${b} rate limit gated (${a}); retry in ~${Math.ceil(c/1e3)}s`),this.reason=a,this.resource=b,this.retryAfterMs=c,this.name="RateLimitError"}}function h(a){let b=Number(a["x-ratelimit-limit"]),c=Number(a["x-ratelimit-remaining"]),e=Number(a["x-ratelimit-reset"]);if(!Number.isFinite(b)||!Number.isFinite(c)||!Number.isFinite(e))return null;let f=a["x-ratelimit-resource"];return void 0===f?{resource:"core",snapshot:{remaining:c,limit:b,reset:e}}:d.includes(f)?{resource:f,snapshot:{remaining:c,limit:b,reset:e}}:null}},12731:(a,b,c)=>{c.d(b,{Ie:()=>I});var d=c(35895),e=c(71117);class f{get(a){return this.entries.get(a)}set(a,b,c){this.entries.set(a,{etag:b,body:c})}constructor(){this.entries=new Map}}let g=new f;function h(a){let b=a.replace(/\r\n/g,"\n"),c=b.lastIndexOf("\nHTTP/"),d=c>=0?c+1:b.startsWith("HTTP/")?0:-1;if(d<0)return{status:null,headers:{},body:a};let e=b.slice(d),f=e.indexOf("\n\n"),g=f>=0?e.slice(0,f):e,h=f>=0?e.slice(f+2):"",i=g.split("\n"),j=(i.shift()??"").match(/^HTTP\/\S+\s+(\d+)/),k=j?Number(j[1]):null,l={};for(let a of i){let b=a.indexOf(":");b<=0||(l[a.slice(0,b).trim().toLowerCase()]=a.slice(b+1).trim())}return{status:k,headers:l,body:h}}function i(a){if(!a)return null;for(let b of a.split(",")){let a=b.match(/<([^>]+)>\s*;\s*rel="?next"?/);if(a?.[1])return a[1]}return null}var j=c(23601),k=c(12717);let l=d.Ik({number:d.ai(),title:d.Yj(),labels:d.YO(d.Ik({name:d.Yj()})).default([]),user:d.Ik({login:d.Yj()}).nullish(),author_association:d.Yj().nullish(),pull_request:d.L5().optional()}).transform(a=>({number:a.number,title:a.title,labels:a.labels,author:a.user?.login??null,authorAssociation:a.author_association??null,isPullRequest:void 0!==a.pull_request})),m=d.Ik({resources:d.g1(d.Yj(),d.Ik({limit:d.ai(),remaining:d.ai(),reset:d.ai()}))}),n=d.Ik({number:d.ai(),title:d.Yj(),body:d.Yj().default(""),state:d.Yj().default("open"),labels:d.YO(d.Ik({name:d.Yj()})).default([]),comments:d.YO(d.Ik({author:d.Ik({login:d.Yj()}).default({login:""}),body:d.Yj().default(""),createdAt:d.Yj().default("")})).default([])}),o=d.Ik({name:d.Yj(),state:d.Yj(),bucket:d.Yj().optional()}),p=d.Ik({data:d.Ik({repository:d.Ik({pullRequest:d.Ik({reviewThreads:d.Ik({nodes:d.YO(d.Ik({id:d.Yj(),isResolved:d.zM().default(!1),isOutdated:d.zM().default(!1),path:d.Yj().nullish(),line:d.ai().nullish(),comments:d.Ik({nodes:d.YO(d.Ik({id:d.Yj(),databaseId:d.ai().nullish(),body:d.Yj().default(""),author:d.Ik({login:d.Yj()}).nullish()}))})}))})}).nullish()})})});class q extends Error{}function r(a,b){return`${a}=${b}`}function s(a){let b;try{b=JSON.parse(a||"[]")}catch{throw new q("unexpected gh output: response body was not valid JSON")}if(!Array.isArray(b))throw new q("unexpected gh output: expected a JSON array");return b}class t{constructor(a,b=e.S,c=k.og,d=g){this.cwd=a,this.run=b,this.governor=c,this.etags=d}gate(a="core"){let b=this.governor.decide(a,(0,j.u)());if(!b.allowed)throw new k.OE(b.reason,a,b.retryAfterMs)}async exec(a,b="core"){this.gate(b);let c=await this.run("gh",a,this.cwd);return 0!==c.exitCode&&/rate limit|429 too many/i.test(c.stderr)&&this.governor.note429(b),c}async refreshRateLimit(){let a,b=await this.run("gh",["api","rate_limit"],this.cwd);if(0===b.exitCode){try{a=m.parse(JSON.parse(b.stdout||"{}"))}catch{return}for(let b of["core","graphql","search"]){let c=a.resources[b];c&&this.governor.observe(b,c)}}}async conditionalList(a,b){this.gate("core");let c=this.etags.get(a),d=["api",`repos/{owner}/{repo}/issues?${b}`,"--include"];c&&d.push("-H",`If-None-Match: ${c.etag}`);let e=await this.run("gh",d,this.cwd),f=this.checkListResponse(e,h(e.stdout));if(304===f.status&&c)return this.toGhIssues(s(c.body));let g=[...s(f.body)],j=i(f.headers.link),k=1;for(;j&&k<100;){this.gate("core");let a=await this.run("gh",["api",j,"--include"],this.cwd),b=this.checkListResponse(a,h(a.stdout));g.push(...s(b.body)),j=i(b.headers.link),k++}let l=f.headers.etag;return l&&this.etags.set(a,l,JSON.stringify(g)),this.toGhIssues(g)}checkListResponse(a,b){var c,d;let e=(0,k.bR)(b.headers);if(e&&this.governor.observe(e.resource,e.snapshot),304===b.status)return b;if(c=b.status,d=b.headers,429===c||403===c&&"0"===d["x-ratelimit-remaining"]){let a=Number(b.headers["x-ratelimit-reset"]);throw this.governor.note429("core",Number.isFinite(a)?a:void 0),new q(`gh api rate limited (status ${b.status})`)}if(200!==b.status)throw new q(a.stderr||`gh api failed (status ${b.status??"unknown"})`);return b}toGhIssues(a){let b=d.YO(l).safeParse(a);if(!b.success)throw new q(`unexpected gh output: ${b.error.message}`);return b.data.filter(a=>!a.isPullRequest).map(({isPullRequest:a,...b})=>b)}async listIssues(a){let b=`state=open&per_page=100&labels=${encodeURIComponent(a)}`;return this.conditionalList(`${this.cwd}::label:${a}`,b)}async listAllIssues(){return this.conditionalList(`${this.cwd}::all`,"state=open&per_page=100")}async viewIssue(a){let b=await this.exec(["issue","view",String(a),"--json","number,title,body,state,labels,comments"]);if(0!==b.exitCode)throw new q(b.stderr||"gh issue view failed");let c=n.safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);let d=c.data;return{number:d.number,title:d.title,body:d.body,state:d.state,labels:d.labels.map(a=>a.name),comments:d.comments.map(a=>({author:a.author.login,body:a.body,createdAt:a.createdAt}))}}async editIssue(a,b){let c=["issue","edit",String(a)];if(void 0!==b.title&&c.push(r("--title",b.title)),void 0!==b.body&&c.push(r("--body",b.body)),3===c.length)return;let d=await this.exec(c);if(0!==d.exitCode)throw new q(d.stderr||"gh issue edit failed")}async ensureLabel(a,b={}){let c=await this.exec(["label","list","--json","name","--limit","200"]),e=c.stdout.trim();if(0===c.exitCode&&e)try{let b=d.YO(d.Ik({name:d.Yj()})).safeParse(JSON.parse(e));if(b.success&&b.data.some(b=>b.name===a))return}catch{}let f=["label","create",a];b.color&&f.push("--color",b.color),b.description&&f.push("--description",b.description);let g=await this.exec(f);if(0!==g.exitCode&&!/already exists/i.test(g.stderr))throw new q(g.stderr||"gh label create failed")}async addLabels(a,b){let c=await this.exec(["issue","edit",String(a),r("--add-label",b.join(","))]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue edit failed")}async removeLabels(a,b){let c=await this.exec(["issue","edit",String(a),r("--remove-label",b.join(","))]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue edit failed")}async closeIssue(a){let b=await this.exec(["issue","close",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh issue close failed")}async reopenIssue(a){let b=await this.exec(["issue","reopen",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh issue reopen failed")}async prChecks(a){let b=await this.exec(["pr","checks",String(a),"--json","name,state,bucket"]),c=b.stdout.trim();if(!c){if(0!==b.exitCode)throw new q(b.stderr||"gh pr checks failed");return[]}let e=d.YO(o).safeParse(JSON.parse(c));if(!e.success)throw new q(`unexpected gh output: ${e.error.message}`);return e.data}async prHeadSha(a){let b=await this.exec(["pr","view",String(a),"--json","headRefOid"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr view failed");let c=d.Ik({headRefOid:d.Yj()}).safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);return c.data.headRefOid}async commentIssue(a,b){let c=await this.exec(["issue","comment",String(a),r("--body",b)]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue comment failed")}async createIssue(a,b){let c=await this.exec(["issue","create",r("--title",a),r("--body",b)]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue create failed");let d=c.stdout.match(/\/issues\/(\d+)/);if(!d?.[1])throw new q(`could not parse issue number from: ${c.stdout}`);return Number(d[1])}async failedRunLog(a){let b,c;if(!this.governor.decide("core",(0,j.u)()).allowed)return"";let e=await this.run("gh",["pr","view",String(a),"--json","headRefName"],this.cwd);if(0!==e.exitCode)return"";try{b=d.Ik({headRefName:d.Yj()}).parse(JSON.parse(e.stdout||"{}")).headRefName}catch{return""}if(!b)return"";let f=await this.run("gh",["run","list","--branch",b,"--json","databaseId,conclusion","--limit","20"],this.cwd);if(0!==f.exitCode)return"";try{c=d.YO(d.Ik({databaseId:d.ai(),conclusion:d.Yj().default("")})).parse(JSON.parse(f.stdout||"[]"))}catch{return""}let g=c.find(a=>"failure"===a.conclusion);if(!g)return"";let h=await this.run("gh",["run","view",String(g.databaseId),"--log-failed"],this.cwd);return 0!==h.exitCode?"":h.stdout.slice(-8e3)}async prDiff(a){if(!this.governor.decide("core",(0,j.u)()).allowed)return"";let b=await this.run("gh",["pr","diff",String(a)],this.cwd);return 0!==b.exitCode?"":b.stdout}async mergePr(a){let b=await this.exec(["pr","merge",String(a),"--squash","--auto"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr merge failed")}async createPr(a){let b=await this.exec(["pr","create",r("--head",a.head),r("--base",a.base),r("--title",a.title),r("--body",a.body)]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr create failed");let c=b.stdout.match(/\/pull\/(\d+)/);if(!c?.[1])throw new q(`could not parse PR number from: ${b.stdout}`);return Number(c[1])}async listReleases(){let a=await this.exec(["release","list","--json","tagName,createdAt","--limit","100"]);if(0!==a.exitCode)throw new q(a.stderr||"gh release list failed");let b=d.YO(d.Ik({tagName:d.Yj(),createdAt:d.Yj().default("")})).safeParse(JSON.parse(a.stdout||"[]"));if(!b.success)throw new q(`unexpected gh output: ${b.error.message}`);return b.data}async listMergedPrs(a=100){let b=await this.exec(["pr","list","--state","merged","--json","number,title,mergedAt,labels","--limit",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr list failed");let c=d.YO(d.Ik({number:d.ai(),title:d.Yj().default(""),mergedAt:d.Yj().default(""),labels:d.YO(d.Ik({name:d.Yj()})).default([])})).safeParse(JSON.parse(b.stdout||"[]"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);return c.data.map(a=>({number:a.number,title:a.title,mergedAt:a.mergedAt,labels:a.labels.map(a=>a.name)}))}async createRelease(a){let b=await this.exec(["release","create",a.tag,r("--title",a.title),r("--notes",a.notes),r("--target",a.target)]);if(0!==b.exitCode)throw new q(b.stderr||"gh release create failed")}async repoSlug(){if(this.slug)return this.slug;let a=await this.exec(["repo","view","--json","nameWithOwner"]);if(0!==a.exitCode)throw new q(a.stderr||"gh repo view failed");let b=d.Ik({nameWithOwner:d.Yj()}).safeParse(JSON.parse(a.stdout||"{}"));if(!b.success)throw new q(`unexpected gh output: ${b.error.message}`);let[c,e]=b.data.nameWithOwner.split("/");if(!c||!e)throw new q(`unexpected repo slug: ${b.data.nameWithOwner}`);return this.slug={owner:c,name:e},this.slug}async listReviewThreads(a){let{owner:b,name:c}=await this.repoSlug(),d=await this.exec(["api","graphql","-F",`owner=${b}`,"-F",`name=${c}`,"-F",`number=${a}`,"-f","query=query($owner:String!,$name:String!,$number:Int!){repository(owner:$owner,name:$name){pullRequest(number:$number){reviewThreads(first:100){nodes{id isResolved isOutdated path line comments(first:100){nodes{id databaseId body author{login}}}}}}}}"],"graphql");if(0!==d.exitCode)throw new q(d.stderr||"gh api graphql failed");let e=p.safeParse(JSON.parse(d.stdout||"{}"));if(!e.success)throw new q(`unexpected gh output: ${e.error.message}`);return(e.data.data.repository.pullRequest?.reviewThreads.nodes??[]).map(a=>({id:a.id,isResolved:a.isResolved,isOutdated:a.isOutdated,path:a.path??null,line:a.line??null,comments:a.comments.nodes.map(a=>({id:a.id,databaseId:a.databaseId??null,author:a.author?.login??"",body:a.body}))}))}async replyToReviewThread(a,b){let c=await this.exec(["api","graphql","-F",`threadId=${a}`,"-f",`body=${b}`,"-f","query=mutation($threadId:ID!,$body:String!){addPullRequestReviewThreadReply(input:{pullRequestReviewThreadId:$threadId,body:$body}){comment{id}}}"],"graphql");if(0!==c.exitCode)throw new q(c.stderr||"gh review reply failed")}async updateReviewComment(a,b){let c=await this.exec(["api","graphql","-F",`id=${a}`,"-f",`body=${b}`,"-f","query=mutation($id:ID!,$body:String!){updatePullRequestReviewComment(input:{pullRequestReviewCommentId:$id,body:$body}){pullRequestReviewComment{id}}}"],"graphql");if(0!==c.exitCode)throw new q(c.stderr||"gh update review comment failed")}async resolveReviewThread(a){let b=await this.exec(["api","graphql","-F",`threadId=${a}`,"-f","query=mutation($threadId:ID!){resolveReviewThread(input:{threadId:$threadId}){thread{id isResolved}}}"],"graphql");if(0!==b.exitCode)throw new q(b.stderr||"gh resolve thread failed")}async reactToReviewComment(a,b){let c=await this.exec(["api","graphql","-F",`subjectId=${a}`,"-F",`content=${b}`,"-f","query=mutation($subjectId:ID!,$content:ReactionContent!){addReaction(input:{subjectId:$subjectId,content:$content}){reaction{content}}}"],"graphql");if(0!==c.exitCode&&!/already has this reaction/i.test(c.stderr))throw new q(c.stderr||"gh add reaction failed")}}var u=c(23226),v=c(39889);class w extends Error{}function x(a){if(!/^\d{1,3}(\.\d{1,3}){3}$/.test(a))return null;let b=a.split(".").map(Number);return b.some(a=>a>255)?null:b}function y(a){let b=x(a);if(!b)return!1;let[c,d]=b;return 0===c||10===c||127===c||169===c&&254===d||172===c&&d>=16&&d<=31||192===c&&168===d||100===c&&d>=64&&d<=127||!1}let z=d.Ik({iid:d.ai(),title:d.Yj(),labels:d.YO(d.Yj()).default([]),author:d.Ik({username:d.Yj()}).nullish()}),A=d.Ik({iid:d.ai(),title:d.Yj(),description:d.Yj().nullable().default(""),state:d.Yj().default("opened"),labels:d.YO(d.Yj()).default([])}),B=d.Ik({author:d.Ik({username:d.Yj().default("")}).default({username:""}),body:d.Yj().default(""),created_at:d.Yj().default(""),system:d.zM().default(!1)}),C=d.Ik({id:d.ai().optional(),name:d.Yj().default(""),status:d.Yj().default("")}),D=d.Ik({head_pipeline:d.Ik({id:d.ai()}).nullable().optional()}),E=d.Ik({old_path:d.Yj().default(""),new_path:d.Yj().default(""),diff:d.Yj().default("")});class F{constructor(a,b={}){this.config=a,this.http=b.http??v.D,this.run=b.run??e.S,this.sleep=b.sleep??(a=>new Promise(b=>setTimeout(b,a))),this.allowPrivateHost=b.allowPrivateHost??function(){let a=process.env.DRYDOCK_ALLOW_PRIVATE_FORGE?.trim().toLowerCase();return"1"===a||"true"===a||"yes"===a}()}resolveProject(){return this.projectRef||(this.projectRef=(async()=>{let a=await this.run("git",["remote","get-url","origin"],this.config.cwd);if(0!==a.exitCode||!a.stdout.trim())throw new w(a.stderr||"could not resolve git remote 'origin'");let{host:b,path:c}=function(a){let b=a.trim().replace(/\.git$/,""),c=b.match(/^[\w.-]+@([^:]+):(.+)$/)??b.match(/^ssh:\/\/[^@]+@([^/]+)\/(.+)$/)??b.match(/^https?:\/\/([^/]+)\/(.+)$/);if(!c?.[1]||!c[2])throw new w(`unsupported git remote URL: ${a}`);return{host:c[1],path:c[2]}}(a.stdout);return{baseUrl:(this.config.baseUrl?.trim()||`https://${b}`).replace(/\/$/,""),encodedPath:encodeURIComponent(c)}})()),this.projectRef}async request(a,b,c={}){let d,{baseUrl:e,encodedPath:f}=await this.resolveProject(),g=`${e}/api/v4/projects/${f}${b}`;if(c.query){let a=new URLSearchParams(c.query).toString();a&&(g+=`?${a}`)}!function(a,b={}){let c;try{c=new URL(a)}catch{throw new w(`invalid forge URL: ${a}`)}if("http:"!==c.protocol&&"https:"!==c.protocol)throw new w(`forge URL must use http(s): ${c.protocol}`);if(!b.allowPrivate&&function(a){let b=a.trim().toLowerCase().replace(/^\[/,"").replace(/\]$/,"");if(""===b||"localhost"===b||b.endsWith(".localhost"))return!0;if(b.includes(":")){let a=b.toLowerCase();if("::1"===a||"::"===a)return!0;let c=a.match(/^::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/);return c?.[1]?y(c[1]):!!(a.startsWith("fe80")||/^f[cd]/.test(a))}return!!x(b)&&y(b)}(c.hostname))throw new w(`refusing to send forge token to private/loopback address ${c.hostname}; set DRYDOCK_ALLOW_PRIVATE_FORGE=1 to allow a self-hosted instance`)}(g,{allowPrivate:this.allowPrivateHost});let h={};return this.config.token&&(h["PRIVATE-TOKEN"]=this.config.token),void 0!==c.body&&(h["Content-Type"]="application/json",d=JSON.stringify(c.body)),this.http(g,{method:a,headers:h,body:d})}async mutate(a,b,c={}){let d=await this.request(a,b,c);if(429===d.status)throw await this.sleep(function(a){if(a){let b=a["retry-after"];if(b){let a=Number(b);if(Number.isFinite(a)&&a>0)return Math.min(1e3*a,3e5)}let c=a["ratelimit-reset"]??a["x-ratelimit-reset"];if(c){let a=Number(c);if(Number.isFinite(a)){let b=1e3*a-Date.now();if(b>0)return Math.min(b,3e5)}}}return 6e4}(d.headers)),new w(`GitLab rate-limited: ${H(d)||`${a} ${b} returned 429`}`);if(!d.ok)throw new w(H(d)||`GitLab ${a} ${b} failed`);return d}async listIssues(a){return this.listIssuesPaginated({state:"opened",labels:a})}async listAllIssues(){return this.listIssuesPaginated({state:"opened"})}async listIssuesPaginated(a){let b=[],c=1;for(let e=0;e<100;e++){let e=await this.mutate("GET","/issues",{query:{...a,per_page:"100",page:String(c)}});b.push(...function(a){let b=d.YO(z).safeParse(G(a,[]));if(!b.success)throw new w(`unexpected GitLab output: ${b.error.message}`);return b.data.map(a=>({number:a.iid,title:a.title,labels:a.labels.map(a=>({name:a})),author:a.author?.username??null,authorAssociation:null}))}(e.body));let f=e.headers?.["x-next-page"];if(!f)break;let g=Number(f);if(!Number.isInteger(g)||g<=c)break;c=g}return b}async viewIssue(a){let b=await this.mutate("GET",`/issues/${a}`),c=await this.mutate("GET",`/issues/${a}/notes`,{query:{per_page:"100"}}),e=A.parse(G(b.body,{})),f=d.YO(B).parse(G(c.body,[]));return{number:e.iid,title:e.title,body:e.description??"",state:"opened"===e.state?"open":e.state,labels:e.labels,comments:f.filter(a=>!a.system).map(a=>({author:a.author.username,body:a.body,createdAt:a.created_at}))}}async editIssue(a,b){let c={};void 0!==b.title&&(c.title=b.title),void 0!==b.body&&(c.description=b.body),0!==Object.keys(c).length&&await this.mutate("PUT",`/issues/${a}`,{body:c})}async ensureLabel(a,b={}){var c;let e=await this.request("GET","/labels",{query:{per_page:"100"}});if(e.ok){let b=d.YO(d.Ik({name:d.Yj()})).safeParse(G(e.body,[]));if(b.success&&b.data.some(b=>b.name===a))return}let f={name:a,color:(c=b.color??"#808080").startsWith("#")?c:`#${c}`};b.description&&(f.description=b.description);let g=await this.request("POST","/labels",{body:f});if(!g.ok&&409!==g.status&&!/already exists/i.test(g.body))throw new w(H(g)||"GitLab label create failed")}async addLabels(a,b){await this.mutate("PUT",`/issues/${a}`,{body:{add_labels:b.join(",")}})}async removeLabels(a,b){await this.mutate("PUT",`/issues/${a}`,{body:{remove_labels:b.join(",")}})}async closeIssue(a){await this.mutate("PUT",`/issues/${a}`,{body:{state_event:"close"}})}async reopenIssue(a){await this.mutate("PUT",`/issues/${a}`,{body:{state_event:"reopen"}})}async commentIssue(a,b){await this.mutate("POST",`/issues/${a}/notes`,{body:{body:b}})}async createIssue(a,b){let c=await this.mutate("POST","/issues",{body:{title:a,description:b}});return d.Ik({iid:d.ai()}).parse(G(c.body,{})).iid}async prChecks(a){let b=await this.latestPipelineId(a);if(null===b)return[];let c=await this.mutate("GET",`/pipelines/${b}/jobs`,{query:{per_page:"100"}});return d.YO(C).parse(G(c.body,[])).map(a=>({name:a.name,state:function(a){switch(a){case"success":return"SUCCESS";case"failed":return"FAILURE";case"canceled":case"cancelled":return"CANCELLED";case"running":return"IN_PROGRESS";case"pending":case"created":case"scheduled":case"preparing":case"waiting_for_resource":return"PENDING";case"manual":return"MANUAL";case"skipped":return"SKIPPED";default:return a.toUpperCase()}}(a.status)}))}async prHeadSha(a){let b=await this.mutate("GET",`/merge_requests/${a}`);return d.Ik({sha:d.Yj()}).parse(G(b.body,{})).sha}async failedRunLog(a){try{let b=await this.latestPipelineId(a);if(null===b)return"";let c=await this.request("GET",`/pipelines/${b}/jobs`,{query:{per_page:"100"}});if(!c.ok)return(0,u.v)(`GitLab failedRunLog: pipeline ${b} jobs request failed (${c.status})`),"";let e=d.YO(C).safeParse(G(c.body,[]));if(!e.success)return"";let f=e.data.find(a=>"failed"===a.status&&void 0!==a.id);if(!f)return"";let g=await this.request("GET",`/jobs/${f.id}/trace`);if(!g.ok)return(0,u.v)(`GitLab failedRunLog: job ${f.id} trace request failed (${g.status})`),"";return g.body.slice(-8e3)}catch(a){return(0,u.v)("GitLab failedRunLog error:",a),""}}async prDiff(a){try{let b=await this.request("GET",`/merge_requests/${a}/diffs`,{query:{per_page:"100"}});if(!b.ok)return(0,u.v)(`GitLab prDiff: MR ${a} diffs request failed (${b.status})`),"";let c=d.YO(E).safeParse(G(b.body,[]));if(!c.success)return"";return c.data.map(a=>`--- a/${a.old_path}
|
|
2
|
+
+++ b/${a.new_path}
|
|
3
|
+
${a.diff}`).join("\n")}catch(a){return(0,u.v)("GitLab prDiff error:",a),""}}async mergePr(a){await this.mutate("PUT",`/merge_requests/${a}/merge`,{body:{squash:!0}})}async createPr(a){let b=await this.mutate("POST","/merge_requests",{body:{source_branch:a.head,target_branch:a.base,title:a.title,description:a.body}});return d.Ik({iid:d.ai()}).parse(G(b.body,{})).iid}async latestPipelineId(a){let b=await this.request("GET",`/merge_requests/${a}`);if(!b.ok)return null;let c=D.safeParse(G(b.body,{})),d=c.success?c.data.head_pipeline??null:null;return d?d.id:null}}function G(a,b){try{return JSON.parse(a||"null")??b}catch{return b}}function H(a){let b=d.Ik({message:d.L5(),error:d.L5()}).partial().safeParse(G(a.body,{}));if(b.success){let a=b.data.message??b.data.error;if("string"==typeof a)return a;if(a)return JSON.stringify(a)}return a.body.slice(0,300)}function I(a){var b;return"gitlab"===("github"===(b=a.platform)||"gitlab"===b?a.platform:"github")?new F({cwd:a.path,baseUrl:a.apiBaseUrl,token:a.apiToken}):new t({cwd:a.path}.cwd,void 0)}},23601:(a,b,c)=>{c.d(b,{u:()=>f,v:()=>e});let d=new(c(16698)).AsyncLocalStorage;function e(a,b){return d.run(a,b)}function f(){return d.getStore()??"high"}},24525:(a,b,c)=>{c.d(b,{U9:()=>e,ej:()=>f});let d=new Set;function e(a){return d.add(a),()=>{d.delete(a)}}function f(){for(let a of[...d])try{a()}catch{}}},32693:(a,b,c)=>{c.d(b,{GX:()=>m,VK:()=>l,ts:()=>k});var d=c(37003),e=c(97337),f=c(69604),g=c(2937),h=c(68464),i=c(93929),j=c(12731);function k(a,b=(0,g.Lf)()){return b.select().from(i.issues).where((0,d.eq)(i.issues.repoId,a)).orderBy((0,e.Y)(i.issues.priority),(0,e.Y)(i.issues.number)).all()}function l(a,b,c=(0,g.Lf)()){let e=c.select().from(i.issues).where((0,d.eq)(i.issues.repoId,a)).all(),h=new Map(e.map(a=>[a.number,a])),j=Math.floor(Date.now()/1e3),k=c.select({value:(0,f.T9)(i.issues.priority)}).from(i.issues).where((0,d.eq)(i.issues.repoId,a)).get(),m=(k?.value??-1)+1,n=new Set;for(let e of b){n.add(e.number);let b=JSON.stringify(e.labels.map(a=>a.name)),f=h.get(e.number);f?c.update(i.issues).set({title:e.title,labels:b,state:"open",syncedAt:j}).where((0,d.eq)(i.issues.id,f.id)).run():c.insert(i.issues).values({repoId:a,number:e.number,title:e.title,labels:b,state:"open",priority:m++,syncedAt:j}).run()}let o=e.filter(a=>!n.has(a.number)).map(a=>a.id);o.length>0&&c.delete(i.issues).where((0,d.RV)(i.issues.id,o)).run()}async function m(a,b=(0,g.Lf)()){let c=function(a,b){let c=(0,h.L8)(a,b);if(!c)throw Error(`repo ${a} not found`);return c}(a,b);return l(a,await (0,j.Ie)(c).listAllIssues(),b),k(a,b)}},69604:(a,b,c)=>{c.d(b,{T9:()=>h,U9:()=>g});var d=c(68246),e=c(34775),f=c(90109);function g(a){return(0,f.ll)`count(${a||f.ll.raw("*")})`.mapWith(Number)}function h(a){return(0,f.ll)`max(${a})`.mapWith((0,e.is)(a,d.V)?a:String)}},71117:(a,b,c)=>{c.d(b,{S:()=>e});var d=c(31421);let e=(a,b,c,e)=>new Promise((f,g)=>{let h=(0,d.spawn)(a,b,{cwd:c,env:process.env}),i="",j="",k=!1,l=e?.timeoutMs??3e5,m=setTimeout(()=>{k=!0,h.kill("SIGKILL")},l);m.unref?.(),h.stdout.on("data",a=>{i+=a.toString()}),h.stderr.on("data",a=>{j+=a.toString()}),h.on("error",a=>{clearTimeout(m),g(a)}),h.on("close",b=>{(clearTimeout(m),k)?g(Error(`\`${a}\` timed out after ${l}ms`)):f({stdout:i,stderr:j,exitCode:b??0})})})}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
exports.id=541,exports.ids=[541],exports.modules={2937:(a,b,c)=>{"use strict";let d;c.d(b,{Lf:()=>k});var e=c(73024),f=c(76760),g=c(87550),h=c.n(g),i=c(96652),j=c(93929);function k(){if(!d){var a;let b;":memory:"!==(a=process.env.DRYDOCK_DB??(0,f.resolve)(process.cwd(),"data/drydock.db"))&&(0,e.mkdirSync)((0,f.dirname)(a),{recursive:!0}),(b=new(h())(a)).pragma("journal_mode = WAL"),b.pragma("foreign_keys = ON"),function(a){let b,c=process.env.DRYDOCK_MIGRATIONS??(0,f.resolve)(process.cwd(),"drizzle");try{b=(0,e.readdirSync)(c).filter(a=>a.endsWith(".sql")).sort()}catch{return}a.exec("CREATE TABLE IF NOT EXISTS __migrations (name TEXT PRIMARY KEY)");let d=new Set(a.prepare("SELECT name FROM __migrations").all().map(a=>a.name)),g=a.prepare("INSERT INTO __migrations (name) VALUES (?)");for(let h of b){if(d.has(h))continue;let b=(0,e.readFileSync)((0,f.join)(c,h),"utf8");a.transaction(()=>{for(let c of b.split("--\x3e statement-breakpoint")){let b=c.trim();b&&a.exec(b)}g.run(h)})()}}(b),d=(0,i.f)(b,{schema:j}),Promise.all([c.e(895),c.e(39),c.e(75),c.e(350)]).then(c.bind(c,89350)).then(a=>a.startOrchestrator()).catch(a=>console.error("[orchestrator] bootstrap failed",a))}return d}},63107:()=>{},63787:()=>{},93929:(a,b,c)=>{"use strict";c.r(b),c.d(b,{adrs:()=>n,deploymentHealingSessions:()=>u,followupIssues:()=>o,healingAttempts:()=>r,healingSessions:()=>q,issueSubtasks:()=>t,issues:()=>p,jobEvents:()=>m,jobs:()=>l,prQuestions:()=>v,promptTemplates:()=>k,releaseRuns:()=>w,repos:()=>j,reviewFeedbackItems:()=>s,settings:()=>x});var d=c(90109),e=c(55215),f=c(38151),g=c(71126),h=c(72717),i=c(2049);let j=(0,e.D)("repos",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),path:(0,g.Qq)("path").notNull(),name:(0,g.Qq)("name").notNull(),defaultBranch:(0,g.Qq)("default_branch").notNull().default("main"),queueLabel:(0,g.Qq)("queue_label").notNull().default("drydock:queue"),workingLabel:(0,g.Qq)("working_label").notNull().default("drydock:working"),needsHumanLabel:(0,g.Qq)("needs_human_label").notNull().default("drydock:needs-human"),defaultModel:(0,g.Qq)("default_model").notNull().default("claude-opus-4-7"),agent:(0,g.Qq)("agent").notNull().default("claude"),platform:(0,g.Qq)("platform").notNull().default("github"),apiBaseUrl:(0,g.Qq)("api_base_url"),apiToken:(0,g.Qq)("api_token"),dailyCostLimitUsd:(0,h.x)("daily_cost_limit_usd").notNull().default(10),adrGating:(0,f.nd)("adr_gating",{mode:"boolean"}).notNull().default(!1),sequential:(0,f.nd)("sequential",{mode:"boolean"}).notNull().default(!0),autoTriageEnabled:(0,f.nd)("auto_triage_enabled",{mode:"boolean"}).notNull().default(!1),autoProcessEnabled:(0,f.nd)("auto_process_enabled",{mode:"boolean"}).notNull().default(!1),autoHealCi:(0,f.nd)("auto_heal_ci",{mode:"boolean"}).notNull().default(!1),autoReviewFeedback:(0,f.nd)("auto_review_feedback",{mode:"boolean"}).notNull().default(!1),autoResolveMergeConflicts:(0,f.nd)("auto_resolve_merge_conflicts",{mode:"boolean"}).notNull().default(!1),includeProgressReplies:(0,f.nd)("include_progress_replies",{mode:"boolean"}).notNull().default(!1),autoDecompose:(0,f.nd)("auto_decompose",{mode:"boolean"}).notNull().default(!1),verifyPr:(0,f.nd)("verify_pr",{mode:"boolean"}).notNull().default(!1),autoHealDeployments:(0,f.nd)("auto_heal_deployments",{mode:"boolean"}).notNull().default(!1),deploymentPlatform:(0,g.Qq)("deployment_platform"),trustedReviewers:(0,g.Qq)("trusted_reviewers").notNull().default("[]"),ignoredBots:(0,g.Qq)("ignored_bots").notNull().default('["dependabot[bot]","github-actions[bot]","codecov[bot]"]'),readyLabels:(0,g.Qq)("ready_labels").notNull().default('["ready","ready-for-agent","ready-to-work"]'),blockingLabels:(0,g.Qq)("blocking_labels").notNull().default('["blocked","question","needs-human","needs-discussion","wontfix","duplicate","invalid"]'),autoLabelWhitelist:(0,g.Qq)("auto_label_whitelist").notNull().default('["bug","enhancement","documentation","ready"]'),priorityAuthors:(0,g.Qq)("priority_authors").notNull().default("[]"),minAuthorAssociation:(0,g.Qq)("min_author_association").notNull().default("approved"),maxAttempts:(0,f.nd)("max_attempts").notNull().default(3),maxJobMinutes:(0,f.nd)("max_job_minutes"),maxCiWaitMinutes:(0,f.nd)("max_ci_wait_minutes"),maxJobCostUsd:(0,h.x)("max_job_cost_usd"),agentInstructions:(0,g.Qq)("agent_instructions"),releaseEnabled:(0,f.nd)("release_enabled",{mode:"boolean"}).notNull().default(!1),webhookSecret:(0,g.Qq)("webhook_secret"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),k=(0,e.D)("prompt_templates",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").references(()=>j.id,{onDelete:"cascade"}),name:(0,g.Qq)("name").notNull(),content:(0,g.Qq)("content").notNull(),version:(0,f.nd)("version").notNull().default(1),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)}),l=(0,e.D)("jobs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),issueNumber:(0,f.nd)("issue_number").notNull(),status:(0,g.Qq)("status").notNull().default("queued"),branch:(0,g.Qq)("branch"),prNumber:(0,f.nd)("pr_number"),sessionId:(0,g.Qq)("session_id"),agent:(0,g.Qq)("agent").notNull().default("claude"),startedAt:(0,f.nd)("started_at"),finishedAt:(0,f.nd)("finished_at"),model:(0,g.Qq)("model"),maxTurns:(0,f.nd)("max_turns").notNull().default(40),totalInputTokens:(0,f.nd)("total_input_tokens").notNull().default(0),totalOutputTokens:(0,f.nd)("total_output_tokens").notNull().default(0),costUsd:(0,h.x)("cost_usd").notNull().default(0),ciRetryCount:(0,f.nd)("ci_retry_count").notNull().default(0),errorMessage:(0,g.Qq)("error_message"),attempts:(0,f.nd)("attempts").notNull().default(0),leaseToken:(0,g.Qq)("lease_token"),leaseExpiresAt:(0,f.nd)("lease_expires_at"),workerId:(0,g.Qq)("worker_id"),availableAt:(0,f.nd)("available_at"),dedupeKey:(0,g.Qq)("dedupe_key"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoIdx:(0,i.Pe)("jobs_repo_idx").on(a.repoId),statusIdx:(0,i.Pe)("jobs_status_idx").on(a.status),leaseIdx:(0,i.Pe)("jobs_lease_idx").on(a.leaseExpiresAt),dedupeActiveUnique:(0,i.GL)("jobs_dedupe_active_unique").on(a.dedupeKey).where((0,d.ll)`${a.dedupeKey} is not null and ${a.status} not in ('merged', 'aborted')`)})),m=(0,e.D)("job_events",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),ts:(0,f.nd)("ts").notNull().default((0,d.ll)`(unixepoch())`),type:(0,g.Qq)("type").notNull(),payload:(0,g.Qq)("payload").notNull().default("{}")},a=>({jobTsIdx:(0,i.Pe)("job_events_job_ts_idx").on(a.jobId,a.ts)})),n=(0,e.D)("adrs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").references(()=>l.id,{onDelete:"set null"}),repoId:(0,f.nd)("repo_id").references(()=>j.id,{onDelete:"cascade"}),filePath:(0,g.Qq)("file_path").notNull(),title:(0,g.Qq)("title").notNull(),status:(0,g.Qq)("status").notNull().default("pending_review"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),o=(0,e.D)("followup_issues",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").references(()=>l.id,{onDelete:"set null"}),ghIssueNumber:(0,f.nd)("gh_issue_number").notNull(),title:(0,g.Qq)("title").notNull(),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),p=(0,e.D)("issues",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),number:(0,f.nd)("number").notNull(),title:(0,g.Qq)("title").notNull(),labels:(0,g.Qq)("labels").notNull().default("[]"),state:(0,g.Qq)("state").notNull().default("open"),priority:(0,f.nd)("priority").notNull().default(0),triageHash:(0,g.Qq)("triage_hash"),triagedAt:(0,f.nd)("triaged_at"),decomposedHash:(0,g.Qq)("decomposed_hash"),syncedAt:(0,f.nd)("synced_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoNumberUnique:(0,i.GL)("issues_repo_number_unique").on(a.repoId,a.number),repoPriorityIdx:(0,i.Pe)("issues_repo_priority_idx").on(a.repoId,a.priority)})),q=(0,e.D)("healing_sessions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),headSha:(0,g.Qq)("head_sha").notNull(),status:(0,g.Qq)("status").notNull().default("triaging"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("healing_sessions_job_idx").on(a.jobId),prShaIdx:(0,i.Pe)("healing_sessions_pr_sha_idx").on(a.prNumber,a.headSha)})),r=(0,e.D)("healing_attempts",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),sessionId:(0,f.nd)("session_id").notNull().references(()=>q.id,{onDelete:"cascade"}),fingerprint:(0,g.Qq)("fingerprint").notNull(),category:(0,g.Qq)("category").notNull(),checkName:(0,g.Qq)("check_name").notNull(),status:(0,g.Qq)("status").notNull().default("repairing"),beforeSha:(0,g.Qq)("before_sha"),afterSha:(0,g.Qq)("after_sha"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({sessionIdx:(0,i.Pe)("healing_attempts_session_idx").on(a.sessionId),fingerprintIdx:(0,i.Pe)("healing_attempts_fingerprint_idx").on(a.sessionId,a.fingerprint)})),s=(0,e.D)("review_feedback_items",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),threadId:(0,g.Qq)("thread_id").notNull(),reviewer:(0,g.Qq)("reviewer").notNull(),classification:(0,g.Qq)("classification").notNull(),status:(0,g.Qq)("status").notNull().default("pending"),attempts:(0,f.nd)("attempts").notNull().default(0),detail:(0,g.Qq)("detail"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("review_feedback_job_idx").on(a.jobId),jobThreadUnique:(0,i.GL)("review_feedback_job_thread_unique").on(a.jobId,a.threadId)})),t=(0,e.D)("issue_subtasks",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),issueNumber:(0,f.nd)("issue_number").notNull(),ordinal:(0,f.nd)("ordinal").notNull(),title:(0,g.Qq)("title").notNull(),status:(0,g.Qq)("status").notNull().default("pending"),bodyHash:(0,g.Qq)("body_hash").notNull(),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({issueIdx:(0,i.Pe)("issue_subtasks_issue_idx").on(a.repoId,a.issueNumber),issueOrdinalUnique:(0,i.GL)("issue_subtasks_issue_ordinal_unique").on(a.repoId,a.issueNumber,a.ordinal)})),u=(0,e.D)("deployment_healing_sessions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),platform:(0,g.Qq)("platform").notNull(),commitSha:(0,g.Qq)("commit_sha").notNull(),status:(0,g.Qq)("status").notNull().default("monitoring"),logsExcerpt:(0,g.Qq)("logs_excerpt"),followupPrNumber:(0,f.nd)("followup_pr_number"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("deployment_healing_job_idx").on(a.jobId),jobShaUnique:(0,i.GL)("deployment_healing_job_sha_unique").on(a.jobId,a.commitSha)})),v=(0,e.D)("pr_questions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),question:(0,g.Qq)("question").notNull(),answer:(0,g.Qq)("answer"),status:(0,g.Qq)("status").notNull().default("answering"),errorMessage:(0,g.Qq)("error_message"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("pr_questions_job_idx").on(a.jobId)})),w=(0,e.D)("release_runs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),mode:(0,g.Qq)("mode").notNull().default("auto"),triggerPrNumber:(0,f.nd)("trigger_pr_number"),triggerSha:(0,g.Qq)("trigger_sha"),status:(0,g.Qq)("status").notNull().default("detected"),bump:(0,g.Qq)("bump"),fromTag:(0,g.Qq)("from_tag"),tag:(0,g.Qq)("tag"),title:(0,g.Qq)("title"),notes:(0,g.Qq)("notes"),prNumbers:(0,g.Qq)("pr_numbers").notNull().default("[]"),errorMessage:(0,g.Qq)("error_message"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoIdx:(0,i.Pe)("release_runs_repo_idx").on(a.repoId),triggerUnique:(0,i.GL)("release_runs_trigger_unique").on(a.repoId,a.triggerSha).where((0,d.ll)`${a.triggerSha} is not null`)})),x=(0,e.D)("settings",{key:(0,g.Qq)("key").primaryKey(),value:(0,g.Qq)("value").notNull()})}};
|
|
1
|
+
exports.id=541,exports.ids=[541],exports.modules={2937:(a,b,c)=>{"use strict";let d,e;c.d(b,{Lf:()=>m});var f=c(73024),g=c(76760),h=c(87550),i=c.n(h),j=c(96652),k=c(23226),l=c(93929);function m(){if(e)throw e;if(!d){let a=process.env.DRYDOCK_DB??(0,g.resolve)(process.cwd(),"data/drydock.db");try{d=function(a){":memory:"!==a&&(0,f.mkdirSync)((0,g.dirname)(a),{recursive:!0});let b=new(i())(a);try{return b.pragma("journal_mode = WAL"),b.pragma("foreign_keys = ON"),!function(a){let b,c=process.env.DRYDOCK_MIGRATIONS??(0,g.resolve)(process.cwd(),"drizzle");try{b=(0,f.readdirSync)(c).filter(a=>a.endsWith(".sql")).sort()}catch{return}a.exec("CREATE TABLE IF NOT EXISTS __migrations (name TEXT PRIMARY KEY)");let d=new Set(a.prepare("SELECT name FROM __migrations").all().map(a=>a.name)),e=a.prepare("INSERT INTO __migrations (name) VALUES (?)");for(let h of b){if(d.has(h))continue;let b=(0,f.readFileSync)((0,g.join)(c,h),"utf8");a.transaction(()=>{for(let c of b.split("--\x3e statement-breakpoint")){let b=c.trim();b&&a.exec(b)}e.run(h)})()}}(b),(0,j.f)(b,{schema:l})}catch(a){throw b.close(),a}}(a)}catch(a){throw e=a instanceof Error?a:Error(String(a))}Promise.all([c.e(895),c.e(318),c.e(49),c.e(75),c.e(665)]).then(c.bind(c,99665)).then(a=>a.startOrchestrator()).catch(a=>(0,k.v)("[orchestrator] bootstrap failed",a))}return d}},23226:(a,b,c)=>{"use strict";c.d(b,{v:()=>f});var d=c(36639);function e(a){if(a instanceof Error)return(0,d.f)(a.stack??`${a.name}: ${a.message}`);if("string"==typeof a)return(0,d.f)(a);try{return(0,d.f)(JSON.stringify(a))}catch{return(0,d.f)(String(a))}}function f(...a){console.error(...a.map(e))}},36639:(a,b,c)=>{"use strict";c.d(b,{f:()=>f});let d="[REDACTED]",e=[/\bgh[pousr]_[A-Za-z0-9]{36,}\b/g,/\bgithub_pat_[A-Za-z0-9_]{50,}\b/g,/\bglpat-[A-Za-z0-9_-]{20,}\b/g,/(Bearer )[A-Za-z0-9._~+/-]+=*/g,/(https?:\/\/)[^\s/@:]+:[^\s/@]+(?=@)/g,/(PRIVATE-TOKEN:\s*)\S+/gi,/(Basic )[A-Za-z0-9+/]+=*/g,/\b(?:AKIA|ASIA|AGPA|AIDA|ANPA|AROA)[0-9A-Z]{16}\b/g];function f(a){let b=a;for(let a of e)b=b.replace(a,(a,b)=>"string"==typeof b?`${b}${d}`:d);return b}},63107:()=>{},63787:()=>{},93929:(a,b,c)=>{"use strict";c.r(b),c.d(b,{adrs:()=>n,deploymentHealingSessions:()=>u,followupIssues:()=>o,healingAttempts:()=>r,healingSessions:()=>q,issueSubtasks:()=>t,issues:()=>p,jobEvents:()=>m,jobs:()=>l,oneShotCosts:()=>y,prQuestions:()=>v,promptTemplates:()=>k,releaseRuns:()=>w,repos:()=>j,reviewFeedbackItems:()=>s,settings:()=>x});var d=c(90109),e=c(55215),f=c(38151),g=c(71126),h=c(72717),i=c(2049);let j=(0,e.D)("repos",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),path:(0,g.Qq)("path").notNull(),name:(0,g.Qq)("name").notNull(),defaultBranch:(0,g.Qq)("default_branch").notNull().default("main"),queueLabel:(0,g.Qq)("queue_label").notNull().default("drydock:queue"),workingLabel:(0,g.Qq)("working_label").notNull().default("drydock:working"),needsHumanLabel:(0,g.Qq)("needs_human_label").notNull().default("drydock:needs-human"),defaultModel:(0,g.Qq)("default_model").notNull().default("claude-opus-4-8"),agent:(0,g.Qq)("agent").notNull().default("claude"),platform:(0,g.Qq)("platform").notNull().default("github"),apiBaseUrl:(0,g.Qq)("api_base_url"),apiToken:(0,g.Qq)("api_token"),dailyCostLimitUsd:(0,h.x)("daily_cost_limit_usd").notNull().default(10),adrGating:(0,f.nd)("adr_gating",{mode:"boolean"}).notNull().default(!1),sequential:(0,f.nd)("sequential",{mode:"boolean"}).notNull().default(!0),autoTriageEnabled:(0,f.nd)("auto_triage_enabled",{mode:"boolean"}).notNull().default(!1),autoProcessEnabled:(0,f.nd)("auto_process_enabled",{mode:"boolean"}).notNull().default(!1),autoHealCi:(0,f.nd)("auto_heal_ci",{mode:"boolean"}).notNull().default(!1),autoReviewFeedback:(0,f.nd)("auto_review_feedback",{mode:"boolean"}).notNull().default(!1),autoResolveMergeConflicts:(0,f.nd)("auto_resolve_merge_conflicts",{mode:"boolean"}).notNull().default(!1),includeProgressReplies:(0,f.nd)("include_progress_replies",{mode:"boolean"}).notNull().default(!1),autoDecompose:(0,f.nd)("auto_decompose",{mode:"boolean"}).notNull().default(!1),verifyPr:(0,f.nd)("verify_pr",{mode:"boolean"}).notNull().default(!1),autoHealDeployments:(0,f.nd)("auto_heal_deployments",{mode:"boolean"}).notNull().default(!1),deploymentPlatform:(0,g.Qq)("deployment_platform"),trustedReviewers:(0,g.Qq)("trusted_reviewers").notNull().default("[]"),ignoredBots:(0,g.Qq)("ignored_bots").notNull().default('["dependabot[bot]","github-actions[bot]","codecov[bot]"]'),readyLabels:(0,g.Qq)("ready_labels").notNull().default('["ready","ready-for-agent","ready-to-work"]'),blockingLabels:(0,g.Qq)("blocking_labels").notNull().default('["blocked","question","needs-human","needs-discussion","wontfix","duplicate","invalid"]'),autoLabelWhitelist:(0,g.Qq)("auto_label_whitelist").notNull().default('["bug","enhancement","documentation","ready"]'),priorityAuthors:(0,g.Qq)("priority_authors").notNull().default("[]"),minAuthorAssociation:(0,g.Qq)("min_author_association").notNull().default("approved"),maxAttempts:(0,f.nd)("max_attempts").notNull().default(3),maxJobMinutes:(0,f.nd)("max_job_minutes"),maxCiWaitMinutes:(0,f.nd)("max_ci_wait_minutes"),maxJobCostUsd:(0,h.x)("max_job_cost_usd"),agentInstructions:(0,g.Qq)("agent_instructions"),releaseEnabled:(0,f.nd)("release_enabled",{mode:"boolean"}).notNull().default(!1),webhookSecret:(0,g.Qq)("webhook_secret"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),k=(0,e.D)("prompt_templates",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").references(()=>j.id,{onDelete:"cascade"}),name:(0,g.Qq)("name").notNull(),content:(0,g.Qq)("content").notNull(),version:(0,f.nd)("version").notNull().default(1),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)}),l=(0,e.D)("jobs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),issueNumber:(0,f.nd)("issue_number").notNull(),status:(0,g.Qq)("status").notNull().default("queued"),branch:(0,g.Qq)("branch"),prNumber:(0,f.nd)("pr_number"),sessionId:(0,g.Qq)("session_id"),agent:(0,g.Qq)("agent").notNull().default("claude"),startedAt:(0,f.nd)("started_at"),finishedAt:(0,f.nd)("finished_at"),model:(0,g.Qq)("model"),maxTurns:(0,f.nd)("max_turns").notNull().default(40),totalInputTokens:(0,f.nd)("total_input_tokens").notNull().default(0),totalOutputTokens:(0,f.nd)("total_output_tokens").notNull().default(0),costUsd:(0,h.x)("cost_usd").notNull().default(0),ciRetryCount:(0,f.nd)("ci_retry_count").notNull().default(0),errorMessage:(0,g.Qq)("error_message"),attempts:(0,f.nd)("attempts").notNull().default(0),leaseToken:(0,g.Qq)("lease_token"),leaseExpiresAt:(0,f.nd)("lease_expires_at"),workerId:(0,g.Qq)("worker_id"),availableAt:(0,f.nd)("available_at"),dedupeKey:(0,g.Qq)("dedupe_key"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoIdx:(0,i.Pe)("jobs_repo_idx").on(a.repoId),statusIdx:(0,i.Pe)("jobs_status_idx").on(a.status),leaseIdx:(0,i.Pe)("jobs_lease_idx").on(a.leaseExpiresAt),dedupeActiveUnique:(0,i.GL)("jobs_dedupe_active_unique").on(a.dedupeKey).where((0,d.ll)`${a.dedupeKey} is not null and ${a.status} not in ('merged', 'aborted')`)})),m=(0,e.D)("job_events",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),ts:(0,f.nd)("ts").notNull().default((0,d.ll)`(unixepoch())`),type:(0,g.Qq)("type").notNull(),payload:(0,g.Qq)("payload").notNull().default("{}")},a=>({jobTsIdx:(0,i.Pe)("job_events_job_ts_idx").on(a.jobId,a.ts)})),n=(0,e.D)("adrs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").references(()=>l.id,{onDelete:"set null"}),repoId:(0,f.nd)("repo_id").references(()=>j.id,{onDelete:"cascade"}),filePath:(0,g.Qq)("file_path").notNull(),title:(0,g.Qq)("title").notNull(),status:(0,g.Qq)("status").notNull().default("pending_review"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),o=(0,e.D)("followup_issues",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").references(()=>l.id,{onDelete:"set null"}),ghIssueNumber:(0,f.nd)("gh_issue_number").notNull(),title:(0,g.Qq)("title").notNull(),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),p=(0,e.D)("issues",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),number:(0,f.nd)("number").notNull(),title:(0,g.Qq)("title").notNull(),labels:(0,g.Qq)("labels").notNull().default("[]"),state:(0,g.Qq)("state").notNull().default("open"),priority:(0,f.nd)("priority").notNull().default(0),triageHash:(0,g.Qq)("triage_hash"),triagedAt:(0,f.nd)("triaged_at"),decomposedHash:(0,g.Qq)("decomposed_hash"),modelOverride:(0,g.Qq)("model_override"),agentOverride:(0,g.Qq)("agent_override"),syncedAt:(0,f.nd)("synced_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoNumberUnique:(0,i.GL)("issues_repo_number_unique").on(a.repoId,a.number),repoPriorityIdx:(0,i.Pe)("issues_repo_priority_idx").on(a.repoId,a.priority)})),q=(0,e.D)("healing_sessions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),headSha:(0,g.Qq)("head_sha").notNull(),status:(0,g.Qq)("status").notNull().default("triaging"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("healing_sessions_job_idx").on(a.jobId),prShaIdx:(0,i.Pe)("healing_sessions_pr_sha_idx").on(a.prNumber,a.headSha)})),r=(0,e.D)("healing_attempts",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),sessionId:(0,f.nd)("session_id").notNull().references(()=>q.id,{onDelete:"cascade"}),fingerprint:(0,g.Qq)("fingerprint").notNull(),category:(0,g.Qq)("category").notNull(),checkName:(0,g.Qq)("check_name").notNull(),status:(0,g.Qq)("status").notNull().default("repairing"),beforeSha:(0,g.Qq)("before_sha"),afterSha:(0,g.Qq)("after_sha"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({sessionIdx:(0,i.Pe)("healing_attempts_session_idx").on(a.sessionId),fingerprintIdx:(0,i.Pe)("healing_attempts_fingerprint_idx").on(a.sessionId,a.fingerprint)})),s=(0,e.D)("review_feedback_items",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),threadId:(0,g.Qq)("thread_id").notNull(),reviewer:(0,g.Qq)("reviewer").notNull(),classification:(0,g.Qq)("classification").notNull(),status:(0,g.Qq)("status").notNull().default("pending"),attempts:(0,f.nd)("attempts").notNull().default(0),detail:(0,g.Qq)("detail"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("review_feedback_job_idx").on(a.jobId),jobThreadUnique:(0,i.GL)("review_feedback_job_thread_unique").on(a.jobId,a.threadId)})),t=(0,e.D)("issue_subtasks",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),issueNumber:(0,f.nd)("issue_number").notNull(),ordinal:(0,f.nd)("ordinal").notNull(),title:(0,g.Qq)("title").notNull(),status:(0,g.Qq)("status").notNull().default("pending"),bodyHash:(0,g.Qq)("body_hash").notNull(),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({issueIdx:(0,i.Pe)("issue_subtasks_issue_idx").on(a.repoId,a.issueNumber),issueOrdinalUnique:(0,i.GL)("issue_subtasks_issue_ordinal_unique").on(a.repoId,a.issueNumber,a.ordinal)})),u=(0,e.D)("deployment_healing_sessions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),platform:(0,g.Qq)("platform").notNull(),commitSha:(0,g.Qq)("commit_sha").notNull(),status:(0,g.Qq)("status").notNull().default("monitoring"),logsExcerpt:(0,g.Qq)("logs_excerpt"),followupPrNumber:(0,f.nd)("followup_pr_number"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("deployment_healing_job_idx").on(a.jobId),jobShaUnique:(0,i.GL)("deployment_healing_job_sha_unique").on(a.jobId,a.commitSha)})),v=(0,e.D)("pr_questions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),question:(0,g.Qq)("question").notNull(),answer:(0,g.Qq)("answer"),status:(0,g.Qq)("status").notNull().default("answering"),errorMessage:(0,g.Qq)("error_message"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("pr_questions_job_idx").on(a.jobId)})),w=(0,e.D)("release_runs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),mode:(0,g.Qq)("mode").notNull().default("auto"),triggerPrNumber:(0,f.nd)("trigger_pr_number"),triggerSha:(0,g.Qq)("trigger_sha"),status:(0,g.Qq)("status").notNull().default("detected"),bump:(0,g.Qq)("bump"),fromTag:(0,g.Qq)("from_tag"),tag:(0,g.Qq)("tag"),title:(0,g.Qq)("title"),notes:(0,g.Qq)("notes"),prNumbers:(0,g.Qq)("pr_numbers").notNull().default("[]"),errorMessage:(0,g.Qq)("error_message"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoIdx:(0,i.Pe)("release_runs_repo_idx").on(a.repoId),triggerUnique:(0,i.GL)("release_runs_trigger_unique").on(a.repoId,a.triggerSha).where((0,d.ll)`${a.triggerSha} is not null`)})),x=(0,e.D)("settings",{key:(0,g.Qq)("key").primaryKey(),value:(0,g.Qq)("value").notNull()}),y=(0,e.D)("one_shot_costs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),type:(0,g.Qq)("type").notNull(),costUsd:(0,h.x)("cost_usd").notNull().default(0),inputTokens:(0,f.nd)("input_tokens").notNull().default(0),outputTokens:(0,f.nd)("output_tokens").notNull().default(0),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoIdx:(0,i.Pe)("one_shot_costs_repo_idx").on(a.repoId)}))}};
|