@nilsr0711/drydock 0.1.4 → 0.1.5
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 +2 -2
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- 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 -2
- package/.next/standalone/.next/server/app/analytics/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/analytics/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/cost/export/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/sse/dashboard/route.js +2 -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.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/webhooks/[repoId]/route.js +2 -2
- 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 -3
- package/.next/standalone/.next/server/app/jobs/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/jobs/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/jobs/page.js +2 -2
- package/.next/standalone/.next/server/app/jobs/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/jobs/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/needs-human/page.js +2 -2
- package/.next/standalone/.next/server/app/needs-human/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/needs-human/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/page.js +2 -2
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/prompts/page.js +2 -2
- package/.next/standalone/.next/server/app/prompts/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/prompts/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/repos/[id]/page.js +2 -2
- package/.next/standalone/.next/server/app/repos/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/repos/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page.js +2 -2
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +2 -2
- package/.next/standalone/.next/server/chunks/198.js +1 -0
- package/.next/standalone/.next/server/chunks/279.js +1 -0
- package/.next/standalone/.next/server/chunks/318.js +2 -2
- package/.next/standalone/.next/server/chunks/417.js +1 -0
- package/.next/standalone/.next/server/chunks/468.js +3 -3
- package/.next/standalone/.next/server/chunks/471.js +1 -0
- package/.next/standalone/.next/server/chunks/496.js +1 -0
- package/.next/standalone/.next/server/chunks/511.js +1 -0
- package/.next/standalone/.next/server/chunks/665.js +1 -1
- package/.next/standalone/.next/server/chunks/847.js +93 -0
- package/.next/standalone/.next/server/chunks/{868.js → 997.js} +2 -2
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/next-font-manifest.js +1 -1
- package/.next/standalone/.next/server/next-font-manifest.json +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/165-f2c11a8b0992483d.js +1 -0
- package/.next/standalone/.next/static/chunks/174-34fe81abafec07fe.js +1 -0
- package/.next/standalone/.next/static/chunks/188-14494263cefd30a4.js +1 -0
- package/.next/standalone/.next/static/chunks/312-5ab18c6fbb20b9cc.js +1 -0
- package/.next/standalone/.next/static/chunks/381-b0d5a35969fad985.js +1 -0
- package/.next/standalone/.next/static/chunks/540-b0819a434d7516b1.js +1 -0
- package/.next/standalone/.next/static/chunks/586-d7d6e7d3794dcf02.js +32 -0
- package/.next/standalone/.next/static/chunks/730-ae05580815adb9b2.js +1 -0
- package/.next/standalone/.next/static/chunks/736-503f37bb672c129b.js +1 -0
- package/.next/{static/chunks/334-ac65cc1c43f3e786.js → standalone/.next/static/chunks/878-f08fd91a6c00d84b.js} +3 -3
- package/.next/standalone/.next/static/chunks/app/_global-error/page-03b9886f969453ed.js +1 -0
- package/.next/standalone/.next/static/chunks/app/_not-found/page-aa469cca9dc68961.js +1 -0
- package/.next/standalone/.next/static/chunks/app/adrs/page-ed0f94a800ba51c8.js +1 -0
- package/.next/standalone/.next/static/chunks/app/analytics/page-2d61245dbc9dd300.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/cost/export/route-03b9886f969453ed.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/sse/dashboard/route-03b9886f969453ed.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/sse/jobs/[id]/route-03b9886f969453ed.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/webhooks/[repoId]/route-03b9886f969453ed.js +1 -0
- package/.next/standalone/.next/static/chunks/app/costs/page-3eca75e55c68e079.js +1 -0
- package/.next/standalone/.next/static/chunks/app/jobs/[id]/page-528826c79cab6cbb.js +1 -0
- package/.next/standalone/.next/static/chunks/app/jobs/page-70bd2189d7249e3f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/layout-0e04e8b455f51432.js +1 -0
- package/.next/standalone/.next/static/chunks/app/needs-human/page-90cc5147aadb3ebe.js +1 -0
- package/.next/standalone/.next/static/chunks/app/page-a142f2aa01a429d9.js +1 -0
- package/.next/standalone/.next/static/chunks/app/prompts/page-fba107f32faa6568.js +1 -0
- package/.next/standalone/.next/static/chunks/app/repos/[id]/page-0da8e297142d8567.js +1 -0
- package/.next/standalone/.next/static/chunks/app/settings/page-bd473b1d183c3db6.js +1 -0
- package/.next/standalone/.next/static/chunks/ec24c40a-fc218f196ad8b89e.js +1 -0
- package/.next/standalone/.next/static/chunks/framework-3631188fe017d11d.js +1 -0
- package/.next/standalone/.next/static/chunks/main-app-2ce5d113f02aa743.js +1 -0
- package/.next/standalone/.next/static/chunks/main-c73a28f721635e7a.js +5 -0
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-03b9886f969453ed.js +1 -0
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-03b9886f969453ed.js +1 -0
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-3d82ee7a5f817d84.js +1 -0
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-03b9886f969453ed.js +1 -0
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-03b9886f969453ed.js +1 -0
- package/.next/standalone/.next/static/css/96c4f935104c1f9a.css +3 -0
- package/.next/standalone/package.json +1 -1
- package/.next/static/chunks/165-f2c11a8b0992483d.js +1 -0
- package/.next/static/chunks/174-34fe81abafec07fe.js +1 -0
- package/.next/static/chunks/188-14494263cefd30a4.js +1 -0
- package/.next/static/chunks/312-5ab18c6fbb20b9cc.js +1 -0
- package/.next/static/chunks/381-b0d5a35969fad985.js +1 -0
- package/.next/static/chunks/540-b0819a434d7516b1.js +1 -0
- package/.next/static/chunks/586-d7d6e7d3794dcf02.js +32 -0
- package/.next/static/chunks/730-ae05580815adb9b2.js +1 -0
- package/.next/static/chunks/736-503f37bb672c129b.js +1 -0
- package/.next/{standalone/.next/static/chunks/334-ac65cc1c43f3e786.js → static/chunks/878-f08fd91a6c00d84b.js} +3 -3
- package/.next/static/chunks/app/_global-error/page-03b9886f969453ed.js +1 -0
- package/.next/static/chunks/app/_not-found/page-aa469cca9dc68961.js +1 -0
- package/.next/static/chunks/app/adrs/page-ed0f94a800ba51c8.js +1 -0
- package/.next/static/chunks/app/analytics/page-2d61245dbc9dd300.js +1 -0
- package/.next/static/chunks/app/api/cost/export/route-03b9886f969453ed.js +1 -0
- package/.next/static/chunks/app/api/sse/dashboard/route-03b9886f969453ed.js +1 -0
- package/.next/static/chunks/app/api/sse/jobs/[id]/route-03b9886f969453ed.js +1 -0
- package/.next/static/chunks/app/api/webhooks/[repoId]/route-03b9886f969453ed.js +1 -0
- package/.next/static/chunks/app/costs/page-3eca75e55c68e079.js +1 -0
- package/.next/static/chunks/app/jobs/[id]/page-528826c79cab6cbb.js +1 -0
- package/.next/static/chunks/app/jobs/page-70bd2189d7249e3f.js +1 -0
- package/.next/static/chunks/app/layout-0e04e8b455f51432.js +1 -0
- package/.next/static/chunks/app/needs-human/page-90cc5147aadb3ebe.js +1 -0
- package/.next/static/chunks/app/page-a142f2aa01a429d9.js +1 -0
- package/.next/static/chunks/app/prompts/page-fba107f32faa6568.js +1 -0
- package/.next/static/chunks/app/repos/[id]/page-0da8e297142d8567.js +1 -0
- package/.next/static/chunks/app/settings/page-bd473b1d183c3db6.js +1 -0
- package/.next/static/chunks/ec24c40a-fc218f196ad8b89e.js +1 -0
- package/.next/static/chunks/framework-3631188fe017d11d.js +1 -0
- package/.next/static/chunks/main-app-2ce5d113f02aa743.js +1 -0
- package/.next/static/chunks/main-c73a28f721635e7a.js +5 -0
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-03b9886f969453ed.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-03b9886f969453ed.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/global-error-3d82ee7a5f817d84.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-03b9886f969453ed.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-03b9886f969453ed.js +1 -0
- package/.next/static/css/96c4f935104c1f9a.css +3 -0
- package/package.json +1 -1
- package/.next/standalone/.next/server/chunks/462.js +0 -1
- package/.next/standalone/.next/server/chunks/537.js +0 -1
- package/.next/standalone/.next/server/chunks/675.js +0 -1
- package/.next/standalone/.next/server/chunks/785.js +0 -93
- package/.next/standalone/.next/server/chunks/859.js +0 -1
- package/.next/standalone/.next/static/chunks/0-539cfb6a78b205f0.js +0 -1
- package/.next/standalone/.next/static/chunks/131-754f0b3c6a7625f0.js +0 -1
- package/.next/standalone/.next/static/chunks/488-94313c3750ed9fec.js +0 -1
- package/.next/standalone/.next/static/chunks/586-4f743a204f11d627.js +0 -32
- package/.next/standalone/.next/static/chunks/626-25255b0a66c520cb.js +0 -1
- package/.next/standalone/.next/static/chunks/744-6b71dbc0b45f3dee.js +0 -1
- package/.next/standalone/.next/static/chunks/751-17d24a843c68c75a.js +0 -1
- package/.next/standalone/.next/static/chunks/77-ff0a9221f1786b0e.js +0 -1
- package/.next/standalone/.next/static/chunks/860-5c68ffeb97288824.js +0 -1
- package/.next/standalone/.next/static/chunks/app/_global-error/page-abc1c30fe033f680.js +0 -1
- package/.next/standalone/.next/static/chunks/app/_not-found/page-fbc46f6809bf01bc.js +0 -1
- package/.next/standalone/.next/static/chunks/app/adrs/page-d427443f113c3575.js +0 -1
- package/.next/standalone/.next/static/chunks/app/analytics/page-4154e54399ac6fb4.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/cost/export/route-abc1c30fe033f680.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/sse/dashboard/route-abc1c30fe033f680.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/sse/jobs/[id]/route-abc1c30fe033f680.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/webhooks/[repoId]/route-abc1c30fe033f680.js +0 -1
- package/.next/standalone/.next/static/chunks/app/costs/page-85ceb7f167a8095a.js +0 -1
- package/.next/standalone/.next/static/chunks/app/jobs/[id]/page-eb2e6d420c330df8.js +0 -1
- package/.next/standalone/.next/static/chunks/app/jobs/page-73240c8c9b0571cf.js +0 -1
- package/.next/standalone/.next/static/chunks/app/layout-717833ce6aaa45ee.js +0 -1
- package/.next/standalone/.next/static/chunks/app/needs-human/page-fd702f6eeab08820.js +0 -1
- package/.next/standalone/.next/static/chunks/app/page-43ce9934744597e6.js +0 -1
- package/.next/standalone/.next/static/chunks/app/prompts/page-ecd6816b8dd8b583.js +0 -1
- package/.next/standalone/.next/static/chunks/app/repos/[id]/page-df838c0805fce188.js +0 -1
- package/.next/standalone/.next/static/chunks/app/settings/page-3274e07b560fc8bc.js +0 -1
- package/.next/standalone/.next/static/chunks/ec24c40a-96b312d151fe54b7.js +0 -1
- package/.next/standalone/.next/static/chunks/framework-79acb3679912dc5b.js +0 -1
- package/.next/standalone/.next/static/chunks/main-a0c070ad11c80668.js +0 -5
- package/.next/standalone/.next/static/chunks/main-app-94b142817f01731e.js +0 -1
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-abc1c30fe033f680.js +0 -1
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-abc1c30fe033f680.js +0 -1
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-0d321d74b6d9f17c.js +0 -1
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-abc1c30fe033f680.js +0 -1
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-abc1c30fe033f680.js +0 -1
- package/.next/standalone/.next/static/css/1f98a1f790475168.css +0 -3
- package/.next/static/chunks/0-539cfb6a78b205f0.js +0 -1
- package/.next/static/chunks/131-754f0b3c6a7625f0.js +0 -1
- package/.next/static/chunks/488-94313c3750ed9fec.js +0 -1
- package/.next/static/chunks/586-4f743a204f11d627.js +0 -32
- package/.next/static/chunks/626-25255b0a66c520cb.js +0 -1
- package/.next/static/chunks/744-6b71dbc0b45f3dee.js +0 -1
- package/.next/static/chunks/751-17d24a843c68c75a.js +0 -1
- package/.next/static/chunks/77-ff0a9221f1786b0e.js +0 -1
- package/.next/static/chunks/860-5c68ffeb97288824.js +0 -1
- package/.next/static/chunks/app/_global-error/page-abc1c30fe033f680.js +0 -1
- package/.next/static/chunks/app/_not-found/page-fbc46f6809bf01bc.js +0 -1
- package/.next/static/chunks/app/adrs/page-d427443f113c3575.js +0 -1
- package/.next/static/chunks/app/analytics/page-4154e54399ac6fb4.js +0 -1
- package/.next/static/chunks/app/api/cost/export/route-abc1c30fe033f680.js +0 -1
- package/.next/static/chunks/app/api/sse/dashboard/route-abc1c30fe033f680.js +0 -1
- package/.next/static/chunks/app/api/sse/jobs/[id]/route-abc1c30fe033f680.js +0 -1
- package/.next/static/chunks/app/api/webhooks/[repoId]/route-abc1c30fe033f680.js +0 -1
- package/.next/static/chunks/app/costs/page-85ceb7f167a8095a.js +0 -1
- package/.next/static/chunks/app/jobs/[id]/page-eb2e6d420c330df8.js +0 -1
- package/.next/static/chunks/app/jobs/page-73240c8c9b0571cf.js +0 -1
- package/.next/static/chunks/app/layout-717833ce6aaa45ee.js +0 -1
- package/.next/static/chunks/app/needs-human/page-fd702f6eeab08820.js +0 -1
- package/.next/static/chunks/app/page-43ce9934744597e6.js +0 -1
- package/.next/static/chunks/app/prompts/page-ecd6816b8dd8b583.js +0 -1
- package/.next/static/chunks/app/repos/[id]/page-df838c0805fce188.js +0 -1
- package/.next/static/chunks/app/settings/page-3274e07b560fc8bc.js +0 -1
- package/.next/static/chunks/ec24c40a-96b312d151fe54b7.js +0 -1
- package/.next/static/chunks/framework-79acb3679912dc5b.js +0 -1
- package/.next/static/chunks/main-a0c070ad11c80668.js +0 -5
- package/.next/static/chunks/main-app-94b142817f01731e.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-abc1c30fe033f680.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-abc1c30fe033f680.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/global-error-0d321d74b6d9f17c.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-abc1c30fe033f680.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-abc1c30fe033f680.js +0 -1
- package/.next/static/css/1f98a1f790475168.css +0 -3
- /package/.next/standalone/.next/static/{eWyghWWF4zppTRQ7rmwde → ImQS3LTFl-iHwI2K1uXy0}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{eWyghWWF4zppTRQ7rmwde → ImQS3LTFl-iHwI2K1uXy0}/_ssgManifest.js +0 -0
- /package/.next/static/{eWyghWWF4zppTRQ7rmwde → ImQS3LTFl-iHwI2K1uXy0}/_buildManifest.js +0 -0
- /package/.next/static/{eWyghWWF4zppTRQ7rmwde → ImQS3LTFl-iHwI2K1uXy0}/_ssgManifest.js +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
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
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)`
|
|
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(" ")}function e(a){if(!a)return"no activity";let b=Math.floor(Date.now()/1e3)-a;return b<60?"just now":b<3600?`${Math.floor(b/60)}m ago`:b<86400?`${Math.floor(b/3600)}h ago`:b<604800?`${Math.floor(b/86400)}d ago`:new Date(1e3*a).toLocaleDateString()}function f(a){if(a>=3600){let b=Math.floor(a/3600),c=Math.round(a%3600/60);return c>0?`${b}h ${c}m`:`${b}h`}return a>=60?`${Math.floor(a/60)}m ${a%60}s`:`${a}s`}function g(a,b=2){return`$${a.toFixed(b)}`}c.d(b,{KW:()=>e,UK:()=>g,a3:()=>f,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,"407d74c9d9d95dab89528a352b01f9f35a45a08e64",null),(0,d.A)(k,"409b22e90e79660f8744a158cff75ef6199aa4e2f2",null),(0,d.A)(l,"006c0490f7ee5ac58567769d11a676aeedd3b071d3",null)},8552:(a,b,c)=>{"use strict";c.d(b,{E:()=>i});var d=c(37477),e=c(2210);let f={neutral:"border-border bg-secondary text-secondary-foreground",primary:"border-primary/40 bg-primary/10 text-primary",success:"border-success-border bg-success-muted text-success-foreground",warning:"border-warning-border bg-warning-muted text-warning-foreground",destructive:"border-destructive/40 bg-destructive/10 text-destructive"},g={queued:"neutral",working:"primary",ci_running:"warning",ci_failed:"destructive",retrying:"warning",merged:"success",needs_human:"destructive",aborted:"neutral",interrupted:"warning",open:"neutral",triaged:"primary",releasing:"primary"},h=new Set(["working","ci_running","retrying","releasing"]);function i({className:a,status:b,tone:c,children:j,...k}){let l=c??(b?g[b]??"neutral":"neutral"),m=void 0!==b&&h.has(b);return(0,d.jsxs)("span",{className:(0,e.cn)("inline-flex items-center gap-1.5 whitespace-nowrap rounded-md border px-2 py-0.5 text-[11px] font-semibold leading-4",f[l],a),...k,children:[m&&(0,d.jsxs)("span",{className:"relative flex h-1.5 w-1.5",children:[(0,d.jsx)("span",{className:"absolute inline-flex h-full w-full animate-ping rounded-full bg-current opacity-60"}),(0,d.jsx)("span",{className:"relative inline-flex h-1.5 w-1.5 rounded-full bg-current"})]}),j??b?.replace(/_/g," ")]})}},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,{I7:()=>o,F1:()=>m,HF:()=>p,yO:()=>q,Xm:()=>k,yx:()=>n,AI:()=>r});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=(0,g.Lf)()){c.delete(h.promptTemplates).where((0,d.Uo)((0,d.eq)(h.promptTemplates.repoId,a),(0,d.eq)(h.promptTemplates.name,b))).run()}function p(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 q(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 r(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 q(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)}},42625:(a,b,c)=>{"use strict";c.d(b,{$:()=>e});var d=c(47609);let e=(0,d.createServerReference)("4018a3a5110655d354c7e22a6d779657adb9f269e2",d.callServer,void 0,d.findSourceMapURL,"togglePauseAction")},50720:(a,b,c)=>{"use strict";c.d(b,{t:()=>m,d:()=>n});var d=c(37477),e=c(45147),f=c(93747),g=c(54932),h=c(34616),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"}),info:(a,b)=>f({title:a,description:b,variant:"info"})}),[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:{icon:"text-success",bar:"bg-success"},error:{icon:"text-destructive",bar:"bg-destructive"},info:{icon:"text-primary",bar:"bg-primary"}};function q({toast:a,onDismiss:b}){let c=o[a.variant],e=p[a.variant];return(0,d.jsxs)("div",{className:"dd-toast dd-toast-in pointer-events-auto relative flex items-start gap-3 overflow-hidden rounded-xl border border-card-border bg-card p-3.5 shadow-lg",children:[(0,d.jsx)(c,{className:(0,k.cn)("mt-0.5 h-[18px] w-[18px] shrink-0",e.icon)}),(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"})}),(0,d.jsx)("span",{className:(0,k.cn)("dd-toast-progress absolute bottom-0 left-0 h-0.5 w-full",e.bar),style:{animationDuration:"5000ms"}})]})}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
4
|
SELECT coalesce(sum(c), 0) AS total FROM (
|
|
5
5
|
SELECT coalesce(sum(cost_usd), 0) AS c
|
|
6
6
|
FROM jobs
|
|
@@ -19,6 +19,6 @@ ${a.body}`,e=[];for(let{label:a,re:b}of F)c.has(a)&&b.test(d)&&!e.includes(a)&&e
|
|
|
19
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
20
|
|
|
21
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}
|
|
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,85578)),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(496).then(c.t.bind(c,27496,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:"dark",enableSystem:!1,disableTransitionOnChange:!0,children:(0,d.jsx)(f.t,{children:a})})}},76558:(a,b,c)=>{"use strict";c.d(b,{l:()=>j});var d=c(37477),e=c(34616),f=c(54848),g=c(2210);let h={neutral:"bg-secondary text-muted-foreground",primary:"bg-primary/10 text-primary",success:"bg-success-muted text-success",warning:"bg-warning-muted text-warning",destructive:"bg-destructive/10 text-destructive"},i={sm:"max-w-sm",md:"max-w-md",lg:"max-w-lg",xl:"max-w-2xl"};function j({open:a,onClose:b,onOpenChange:c,labelledById:k,title:l,description:m,icon:n,tone:o="primary",footer:p,size:q="xl",className:r,children:s}){let t=(0,f.useRef)(null);(0,f.useRef)(null);let[u,v]=(0,f.useState)(a),[w,x]=(0,f.useState)(!1),y=()=>{c?c(!1):b?.()};if((0,f.useRef)(y).current=y,!u)return null;let z=null!=l?"dialog-title":void 0,A=k??z,B=null!=l||null!=m||null!=n;return(0,d.jsxs)("div",{className:"fixed inset-0 z-50 flex items-start justify-center overflow-y-auto p-4 sm:p-8",children:[(0,d.jsx)("div",{className:(0,g.cn)("fixed inset-0 bg-black/50 backdrop-blur-sm transition-opacity duration-200",w?"opacity-100":"opacity-0"),onMouseDown:y}),(0,d.jsx)("div",{ref:t,role:"dialog","aria-modal":"true","aria-labelledby":A,tabIndex:-1,className:(0,g.cn)("relative mt-8 w-full rounded-xl border border-card-border bg-card text-card-foreground shadow-2xl outline-none","transition-all duration-200",w?"scale-100 opacity-100 translate-y-0":"scale-[0.97] opacity-0 translate-y-2",i[q],r),onMouseDown:a=>a.stopPropagation(),children:B?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("div",{className:"flex items-start gap-3 p-5",children:[n&&(0,d.jsx)("span",{className:(0,g.cn)("flex h-9 w-9 shrink-0 items-center justify-center rounded-lg",h[o]),children:(0,d.jsx)(n,{className:"h-[18px] w-[18px]"})}),(0,d.jsxs)("div",{className:"min-w-0 flex-1",children:[null!=l&&(0,d.jsx)("h2",{id:z,className:"text-base font-semibold tracking-tight",children:l}),null!=m&&(0,d.jsx)("p",{className:"mt-1 text-sm text-muted-foreground text-pretty",children:m})]}),(0,d.jsx)("button",{type:"button","aria-label":"Close",onClick:y,className:"-mr-1 -mt-1 shrink-0 rounded-md p-1 text-muted-foreground hover-elevate",children:(0,d.jsx)(e.A,{className:"h-4 w-4"})})]}),null!=s&&(0,d.jsx)("div",{className:"px-5 pb-2",children:s}),null!=p&&(0,d.jsx)("div",{className:"flex justify-end gap-2 p-5 pt-3",children:p})]}):(0,d.jsxs)("div",{className:"p-5",children:[s,null!=p&&(0,d.jsx)("div",{className:"mt-4 flex justify-end gap-2",children:p})]})})]})}},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-sm hover-elevate active-elevate-2",secondary:"bg-secondary text-secondary-foreground hover-elevate active-elevate-2",outline:"border border-border bg-transparent shadow-sm hover-elevate active-elevate-2",destructive:"bg-destructive text-destructive-foreground shadow-sm hover-elevate active-elevate-2",ghost:"border border-transparent hover-elevate active-elevate-2",success:"bg-success text-white shadow-sm 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-6 rounded-lg text-sm",icon:"h-9 w-9 rounded-lg","icon-sm":"h-8 w-8 rounded-md"},i=e.forwardRef(({className:a,variant:b="default",size:c="default",type:e="button",...i},j)=>(0,d.jsx)("button",{ref:j,type:e,className:(0,f.cn)("inline-flex items-center justify-center gap-2 whitespace-nowrap font-medium transition-colors focus-ring","disabled:pointer-events-none disabled:opacity-50","[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",g[b],h[c],a),...i}));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
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)}};
|
|
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)}},85578:(a,b,c)=>{"use strict";c.d(b,{AppShell:()=>L});var d=c(37477),e=c(46117),f=c(47593),g=c(150),h=c(5713),i=c(9058),j=c(9693),k=c(7188),l=c(85011),m=c(83975),n=c(75906),o=c(71416),p=c.n(o),q=c(1087),r=c(10646),s=c(54848),t=c(98872),u=c(50720),v=c(47609);let w=(0,v.createServerReference)("006c0490f7ee5ac58567769d11a676aeedd3b071d3",v.callServer,void 0,v.findSourceMapURL,"emergencyStopAction");function x(){let[a,b]=(0,s.useTransition)(),[c,e]=(0,s.useState)(!1),{success:f,error:g}=(0,u.d)();return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("button",{type:"button",disabled:a,onClick:()=>e(!0),"aria-label":"Emergency stop — pause automation and abort all running jobs",className:"inline-flex h-8 items-center gap-1.5 rounded-lg border border-destructive/30 px-2.5 text-xs font-medium text-destructive hover-elevate focus-ring disabled:opacity-60",children:[(0,d.jsx)(r.A,{className:"h-3.5 w-3.5"}),(0,d.jsx)("span",{className:"hidden sm:inline",children:"Stop all"})]}),(0,d.jsx)(t.T,{open:c,onOpenChange:e,onConfirm:function(){b(async()=>{try{let{aborted:a}=await w();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 y=c(81050),z=c(42625),A=c(2210);function B({paused:a}){let[b,c]=(0,s.useState)(a),[e,f]=(0,s.useTransition)(),{success:g,error:h}=(0,u.d)();return(0,d.jsxs)("button",{type:"button",onClick:function(){let a=!b;f(async()=>{try{let b=await (0,z.$)(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,A.cn)("inline-flex h-8 items-center gap-1.5 rounded-lg px-2.5 text-xs font-medium hover-elevate focus-ring disabled:opacity-60",b?"text-warning":"text-muted-foreground"),children:[b?(0,d.jsx)(y.A,{className:"h-3.5 w-3.5"}):(0,d.jsx)(n.A,{className:"h-3.5 w-3.5"}),(0,d.jsx)("span",{className:"hidden sm:inline",children:b?"Resume":"Pause"})]})}var C=c(68210),D=c(46579),E=c(56556);function F(){let{resolvedTheme:a,setTheme:b}=(0,E.D)(),[c,e]=(0,s.useState)(!1),f="dark"===a;return(0,d.jsx)("button",{type:"button","aria-label":"Toggle theme",onClick:()=>b(f?"light":"dark"),className:"inline-flex h-8 w-8 items-center justify-center rounded-lg text-muted-foreground hover-elevate focus-ring",children:c&&!f?(0,d.jsx)(C.A,{className:"h-4 w-4"}):(0,d.jsx)(D.A,{className:"h-4 w-4"})})}var G=c(87706),H=c(34616),I=c(8552);function J({status:a,installKind:b}){let[c,e]=(0,s.useState)(null),[f,g]=(0,s.useState)(!1);return f&&a.updateAvailable&&a.latestVersion&&a.latestVersion!==c?(0,d.jsxs)(I.E,{tone:"success",className:"h-8 gap-1.5 px-2.5",children:[(0,d.jsx)(G.A,{className:"h-3.5 w-3.5 shrink-0"}),a.releaseUrl?(0,d.jsxs)("a",{href:a.releaseUrl,target:"_blank",rel:"noreferrer",className:"rounded-sm hover:underline focus-ring",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:"-mr-1 rounded p-0.5 hover-elevate focus-ring",children:(0,d.jsx)(H.A,{className:"h-3 w-3"})})]}):null}let K=[{href:"/",label:"Dashboard",icon:e.A},{href:"/needs-human",label:"Needs human",icon:f.A},{href:"/jobs",label:"Jobs",icon:g.A},{href:"/analytics",label:"Analytics",icon:h.A},{href:"/prompts",label:"Prompts",icon:i.A},{href:"/adrs",label:"ADRs",icon:j.A},{href:"/costs",label:"Costs",icon:k.A},{href:"/settings",label:"Settings",icon:l.A}];function L({children:a,adrPending:b=0,needsHuman:c=0,paused:e=!1,updateStatus:f,installKind:g="local"}){let h=(0,q.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.jsxs)("header",{className:"sticky top-0 z-30 border-b border-border bg-background/85 backdrop-blur-md",children:[(0,d.jsxs)("div",{className:"mx-auto flex h-14 max-w-7xl items-center gap-2 px-4",children:[(0,d.jsxs)(p(),{href:"/",className:"mr-2 flex shrink-0 items-center gap-2 rounded-md focus-ring",children:[(0,d.jsx)("span",{className:"flex h-7 w-7 items-center justify-center rounded-lg bg-primary text-primary-foreground shadow-sm",children:(0,d.jsx)(m.A,{className:"h-4 w-4"})}),(0,d.jsx)("span",{className:"text-base font-bold tracking-tight",children:"Drydock"})]}),(0,d.jsx)("nav",{className:"flex min-w-0 flex-1 items-center gap-0.5 overflow-x-auto scrollbar-none",children:K.map(a=>{var e;let f="/"===(e=a.href)?"/"===h:h.startsWith(e),g=a.icon,i="/needs-human"===a.href?c:"/adrs"===a.href?b:0;return(0,d.jsxs)(p(),{href:a.href,"aria-current":f?"page":void 0,className:(0,A.cn)("relative flex shrink-0 items-center gap-1.5 rounded-md px-3 py-1.5 text-sm transition-colors hover-elevate",f?"font-medium text-foreground":"text-muted-foreground"),children:[(0,d.jsx)(g,{className:(0,A.cn)("h-[15px] w-[15px]",f&&"text-primary")}),a.label,i>0&&(0,d.jsx)("span",{className:"ml-0.5 rounded-full bg-destructive px-1.5 text-[10px] font-semibold leading-4 text-destructive-foreground tnum",children:i}),f&&(0,d.jsx)("span",{className:"absolute inset-x-2 -bottom-[7px] h-0.5 rounded-full bg-primary"})]},a.href)})}),(0,d.jsxs)("div",{className:"ml-auto flex shrink-0 items-center gap-1.5",children:[f&&(0,d.jsx)(J,{status:f,installKind:g}),(0,d.jsx)(B,{paused:e}),(0,d.jsx)(x,{}),(0,d.jsx)("div",{className:"mx-1 h-5 w-px bg-border"}),(0,d.jsx)(F,{})]})]}),e&&(0,d.jsx)("div",{className:"border-t border-warning-border bg-warning-muted",children:(0,d.jsxs)("div",{className:"mx-auto flex max-w-7xl items-center gap-2 px-4 py-1.5 text-xs text-warning-foreground",children:[(0,d.jsx)(n.A,{className:"h-[13px] w-[13px]"})," Automation is paused globally. No new jobs will start."]})})]}),(0,d.jsx)("main",{id:"main",className:"mx-auto max-w-7xl px-4 py-6 sm:py-8",children:a})]})}},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))}},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:()=>i});var d=c(37477),e=c(47593),f=c(54932),g=c(78233),h=c(76558);function i({open:a,onOpenChange:b,onConfirm:c,title:j,description:k,confirmLabel:l="Confirm",cancelLabel:m="Cancel",variant:n="default",pending:o=!1,icon:p}){let q="destructive"===n,r=p??(q?e.A:f.A);return(0,d.jsx)(h.l,{open:a,onOpenChange:b,title:j,description:k,icon:r,tone:q?"destructive":"primary",size:"sm",footer:(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(g.$,{variant:"outline",size:"sm",disabled:o,onClick:()=>b(!1),children:m}),(0,d.jsx)(g.$,{variant:q?"destructive":"default",size:"sm",disabled:o,onClick:()=>{c(),b(!1)},children:l})]})})}},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,"409c7401bd6ca2cc239985d3c09dde17c0e997f7c4",null),(0,d.A)(j,"4018a3a5110655d354c7e22a6d779657adb9f269e2",null),(0,d.A)(k,"00fd6a1b7893056d97e217bcc54e97e8f2ec7eadfb",null)}};
|