@nilsr0711/drydock 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
  3. package/.next/standalone/.next/build-manifest.json +2 -2
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  6. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  7. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page.js +2 -2
  15. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  16. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  17. package/.next/standalone/.next/server/app/adrs/page.js +2 -2
  18. package/.next/standalone/.next/server/app/adrs/page.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/adrs/page_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/analytics/page.js +1 -1
  21. package/.next/standalone/.next/server/app/analytics/page.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/analytics/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/api/control/shutdown/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/cost/export/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/health/route.js +1 -1
  26. package/.next/standalone/.next/server/app/api/health/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/sse/dashboard/route.js +1 -1
  28. package/.next/standalone/.next/server/app/api/sse/dashboard/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/sse/jobs/[id]/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/webhooks/[repoId]/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/costs/page.js +1 -1
  32. package/.next/standalone/.next/server/app/costs/page.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/costs/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/jobs/[id]/page.js +3 -3
  35. package/.next/standalone/.next/server/app/jobs/[id]/page.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/jobs/[id]/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/jobs/page.js +2 -2
  38. package/.next/standalone/.next/server/app/jobs/page.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/jobs/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/needs-human/page.js +2 -2
  41. package/.next/standalone/.next/server/app/needs-human/page.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/needs-human/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/page.js +2 -2
  44. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/prompts/page.js +2 -2
  47. package/.next/standalone/.next/server/app/prompts/page.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/prompts/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/repos/[id]/page.js +2 -2
  50. package/.next/standalone/.next/server/app/repos/[id]/page.js.nft.json +1 -1
  51. package/.next/standalone/.next/server/app/repos/[id]/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/settings/page.js +2 -2
  53. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  54. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app-paths-manifest.json +1 -1
  56. package/.next/standalone/.next/server/chunks/304.js +1 -1
  57. package/.next/standalone/.next/server/chunks/387.js +34 -0
  58. package/.next/standalone/.next/server/chunks/40.js +1 -1
  59. package/.next/standalone/.next/server/chunks/403.js +1 -0
  60. package/.next/standalone/.next/server/chunks/521.js +1 -1
  61. package/.next/standalone/.next/server/chunks/578.js +1 -1
  62. package/.next/standalone/.next/server/chunks/614.js +2 -2
  63. package/.next/standalone/.next/server/chunks/685.js +1 -0
  64. package/.next/standalone/.next/server/chunks/786.js +1 -1
  65. package/.next/standalone/.next/server/chunks/83.js +1 -1
  66. package/.next/standalone/.next/server/chunks/908.js +1 -1
  67. package/.next/standalone/.next/server/chunks/99.js +14 -11
  68. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  69. package/.next/standalone/.next/server/pages/500.html +1 -1
  70. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  72. package/.next/standalone/.next/static/chunks/1298-0d60333e56ac8b2c.js +1 -0
  73. package/.next/standalone/.next/static/chunks/3433-ece700d2e393c23b.js +1 -0
  74. package/.next/standalone/.next/static/chunks/3894-4f48e3cc5be58e10.js +1 -0
  75. package/.next/standalone/.next/static/chunks/5080-16cb43874ff5c536.js +1 -0
  76. package/.next/standalone/.next/static/chunks/{1642-a1ea35450c1b5c95.js → 8264-c27834f1552f983a.js} +1 -1
  77. package/.next/{static/chunks/4624-5e23973d35b58ca5.js → standalone/.next/static/chunks/8745-8b3833b3d2afa30c.js} +1 -1
  78. package/.next/standalone/.next/static/chunks/app/adrs/page-0c221fc18d1e89af.js +1 -0
  79. package/.next/standalone/.next/static/chunks/app/costs/{page-24d086bf67620e30.js → page-5d66d93815eea63a.js} +1 -1
  80. package/.next/standalone/.next/static/chunks/app/jobs/[id]/page-6ef8bc39b5181817.js +1 -0
  81. package/.next/standalone/.next/static/chunks/app/jobs/page-98215ec1497b829e.js +1 -0
  82. package/.next/standalone/.next/static/chunks/app/layout-402d4ab34259b89b.js +1 -0
  83. package/.next/standalone/.next/static/chunks/app/needs-human/page-b69ac22856c0a0b1.js +1 -0
  84. package/.next/standalone/.next/static/chunks/app/page-ccefa99d40734a8c.js +1 -0
  85. package/.next/standalone/.next/static/chunks/app/prompts/page-bcd1063eb5d64aa5.js +1 -0
  86. package/.next/standalone/.next/static/chunks/app/repos/[id]/page-2bd4b35a0b28042e.js +1 -0
  87. package/.next/standalone/.next/static/chunks/app/settings/page-13a04ecac139b74c.js +1 -0
  88. package/.next/standalone/.next/static/css/{bdce0893cf6b9cb9.css → 600a5b5311ad42be.css} +1 -1
  89. package/.next/standalone/drizzle/0034_human_instruction.sql +1 -0
  90. package/.next/standalone/drizzle/0035_agent_release.sql +4 -0
  91. package/.next/standalone/mcp-server.cjs +42934 -0
  92. package/.next/standalone/package.json +5 -3
  93. package/.next/static/chunks/1298-0d60333e56ac8b2c.js +1 -0
  94. package/.next/static/chunks/3433-ece700d2e393c23b.js +1 -0
  95. package/.next/static/chunks/3894-4f48e3cc5be58e10.js +1 -0
  96. package/.next/static/chunks/5080-16cb43874ff5c536.js +1 -0
  97. package/.next/static/chunks/{1642-a1ea35450c1b5c95.js → 8264-c27834f1552f983a.js} +1 -1
  98. package/.next/{standalone/.next/static/chunks/4624-5e23973d35b58ca5.js → static/chunks/8745-8b3833b3d2afa30c.js} +1 -1
  99. package/.next/static/chunks/app/adrs/page-0c221fc18d1e89af.js +1 -0
  100. package/.next/static/chunks/app/costs/{page-24d086bf67620e30.js → page-5d66d93815eea63a.js} +1 -1
  101. package/.next/static/chunks/app/jobs/[id]/page-6ef8bc39b5181817.js +1 -0
  102. package/.next/static/chunks/app/jobs/page-98215ec1497b829e.js +1 -0
  103. package/.next/static/chunks/app/layout-402d4ab34259b89b.js +1 -0
  104. package/.next/static/chunks/app/needs-human/page-b69ac22856c0a0b1.js +1 -0
  105. package/.next/static/chunks/app/page-ccefa99d40734a8c.js +1 -0
  106. package/.next/static/chunks/app/prompts/page-bcd1063eb5d64aa5.js +1 -0
  107. package/.next/static/chunks/app/repos/[id]/page-2bd4b35a0b28042e.js +1 -0
  108. package/.next/static/chunks/app/settings/page-13a04ecac139b74c.js +1 -0
  109. package/.next/static/css/{bdce0893cf6b9cb9.css → 600a5b5311ad42be.css} +1 -1
  110. package/README.md +60 -21
  111. package/bin/drydock.mjs +77 -2
  112. package/drizzle/0034_human_instruction.sql +1 -0
  113. package/drizzle/0035_agent_release.sql +4 -0
  114. package/package.json +5 -3
  115. package/.next/standalone/.next/server/chunks/382.js +0 -31
  116. package/.next/standalone/.next/server/chunks/468.js +0 -1
  117. package/.next/standalone/.next/server/chunks/822.js +0 -1
  118. package/.next/standalone/.next/static/chunks/1298-7ac9c00c70b27598.js +0 -1
  119. package/.next/standalone/.next/static/chunks/3433-719d6f55f39342d8.js +0 -1
  120. package/.next/standalone/.next/static/chunks/3894-c7b01dcfcf83d89b.js +0 -1
  121. package/.next/standalone/.next/static/chunks/7690-6dcfd9ae4cbf4e7d.js +0 -1
  122. package/.next/standalone/.next/static/chunks/app/adrs/page-1dfee698ea4c111f.js +0 -1
  123. package/.next/standalone/.next/static/chunks/app/jobs/[id]/page-8a9e4ed64c3303fe.js +0 -1
  124. package/.next/standalone/.next/static/chunks/app/jobs/page-4180ccc9acd3ddba.js +0 -1
  125. package/.next/standalone/.next/static/chunks/app/layout-189fa697d72d1fdf.js +0 -1
  126. package/.next/standalone/.next/static/chunks/app/needs-human/page-e458ffa78c06a6fa.js +0 -1
  127. package/.next/standalone/.next/static/chunks/app/page-add53cbf6d87a3f5.js +0 -1
  128. package/.next/standalone/.next/static/chunks/app/prompts/page-ff6cc30777232933.js +0 -1
  129. package/.next/standalone/.next/static/chunks/app/repos/[id]/page-cd11007841a5d73f.js +0 -1
  130. package/.next/standalone/.next/static/chunks/app/settings/page-280668b9c92e9b48.js +0 -1
  131. package/.next/static/chunks/1298-7ac9c00c70b27598.js +0 -1
  132. package/.next/static/chunks/3433-719d6f55f39342d8.js +0 -1
  133. package/.next/static/chunks/3894-c7b01dcfcf83d89b.js +0 -1
  134. package/.next/static/chunks/7690-6dcfd9ae4cbf4e7d.js +0 -1
  135. package/.next/static/chunks/app/adrs/page-1dfee698ea4c111f.js +0 -1
  136. package/.next/static/chunks/app/jobs/[id]/page-8a9e4ed64c3303fe.js +0 -1
  137. package/.next/static/chunks/app/jobs/page-4180ccc9acd3ddba.js +0 -1
  138. package/.next/static/chunks/app/layout-189fa697d72d1fdf.js +0 -1
  139. package/.next/static/chunks/app/needs-human/page-e458ffa78c06a6fa.js +0 -1
  140. package/.next/static/chunks/app/page-add53cbf6d87a3f5.js +0 -1
  141. package/.next/static/chunks/app/prompts/page-ff6cc30777232933.js +0 -1
  142. package/.next/static/chunks/app/repos/[id]/page-cd11007841a5d73f.js +0 -1
  143. package/.next/static/chunks/app/settings/page-280668b9c92e9b48.js +0 -1
  144. /package/.next/standalone/.next/static/{-sJQutzNDvUvcdmf3YlJA → qSEvPCWIslg9lcxt6XQhl}/_buildManifest.js +0 -0
  145. /package/.next/standalone/.next/static/{-sJQutzNDvUvcdmf3YlJA → qSEvPCWIslg9lcxt6XQhl}/_ssgManifest.js +0 -0
  146. /package/.next/static/{-sJQutzNDvUvcdmf3YlJA → qSEvPCWIslg9lcxt6XQhl}/_buildManifest.js +0 -0
  147. /package/.next/static/{-sJQutzNDvUvcdmf3YlJA → qSEvPCWIslg9lcxt6XQhl}/_ssgManifest.js +0 -0
@@ -1,31 +0,0 @@
1
- exports.id=382,exports.ids=[382],exports.modules={580:(a,b,c)=>{"use strict";c.d(b,{m:()=>e});var d=c(41575);function e(a,b){if("http"===a.kind)return a.id;let c=(0,d.mt)(b);return"codex"===a.id?c.codexPath:c.claudePath}},2534:(a,b,c)=>{"use strict";c.d(b,{L:()=>t,_:()=>q});var d=c(27905),e=c(14873),f=c(35924),g=c(64760);let h=g.Ik({usedPercent:g.ai(),resetsAt:g.ai().optional(),windowMinutes:g.ai().optional()});function i(a,b){if(null===a||a<=b)return null;let c=a-b;if(c<60)return`${c}s`;if(c<3600)return`${Math.floor(c/60)}m`;if(c<86400){let a=Math.floor(c/3600),b=Math.floor(c%3600/60);return b>0?`${a}h ${b}m`:`${a}h`}let d=Math.floor(c/86400),e=Math.floor(c%86400/3600);return e>0?`${d}d ${e}h`:`${d}d`}g.Ik({capturedAt:g.ai(),primary:h.optional(),secondary:h.optional()});var j=c(31003),k=c(27796),l=c(20443);let m={neutral:"bg-secondary text-muted-foreground",success:"bg-success/10 text-success",warning:"bg-warning/10 text-warning",destructive:"bg-destructive/10 text-destructive"},n={neutral:"bg-muted-foreground/40",success:"bg-success",warning:"bg-warning",destructive:"bg-destructive"};function o(a){let[,b]=(0,f.useReducer)(a=>a+1,0)}function p(a){return Math.round(Math.min(Math.max(a,0),100))}function q({view:a}){let b,c=(0,j.p)()?i(a.resetsAt,Math.floor(Date.now()/1e3)):null;o(null!==c),b="blocked"===a.state?c?`Codex limited \xb7 ${c}`:"Codex limited":null!==a.usedPercent?`Codex ${p(a.usedPercent)}%`:"Codex usage —";let f="unknown"===a.state?"Codex OAuth usage: no recent reading yet":`Codex OAuth — ${a.label}${null!==a.usedPercent?` (${p(a.usedPercent)}% used)`:""}${c?` \xb7 resets in ${c}`:""}`;return(0,d.jsxs)(k.E,{tone:a.tone,title:f,className:"shrink-0",children:[(0,d.jsx)(e.A,{className:"h-3 w-3","aria-hidden":!0}),b]})}function r({label:a,window:b,tone:c,now:e}){let f=i(b.resetsAt??null,e);return(0,d.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,d.jsxs)("div",{className:"flex items-baseline justify-between text-xs",children:[(0,d.jsx)("span",{className:"font-medium text-foreground",children:function(a,b){if(void 0===a)return b;if(a>=10020)return"weekly window";if(a>=60){let b=Math.round(a/60);return`${b}h window`}return`${a}m window`}(b.windowMinutes,a)}),(0,d.jsxs)("span",{className:"tnum text-muted-foreground",children:[p(b.usedPercent),"%"]})]}),(0,d.jsx)("div",{className:"h-1.5 w-full overflow-hidden rounded-full bg-secondary",children:(0,d.jsx)("div",{className:`h-full rounded-full ${n[c]}`,style:{width:`${p(b.usedPercent)}%`}})}),f&&(0,d.jsxs)("span",{className:"text-[11px] text-muted-foreground/80",children:["resets in ",f]})]})}function s(a){return a>=90?"destructive":a>=75?"warning":"success"}function t({view:a}){let b=(0,j.p)(),c=Math.floor(Date.now()/1e3),f=b&&a.blocked?i(a.resetsAt,c):null;return o((a.primary?.resetsAt??a.resetsAt)!==null&&b),(0,d.jsxs)(l.Zp,{pad:"lg",children:[(0,d.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsx)("span",{className:`flex h-8 w-8 items-center justify-center rounded-lg ${m[a.tone]}`,children:(0,d.jsx)(e.A,{className:"h-4 w-4","aria-hidden":!0})}),(0,d.jsx)("span",{className:"text-sm font-medium text-foreground",children:"Codex usage"})]}),(0,d.jsx)(k.E,{tone:a.tone,children:a.label})]}),"unknown"===a.state?(0,d.jsx)("p",{className:"mt-3 text-sm text-muted-foreground",children:"No quota reading yet. Codex reports its OAuth usage as it runs."}):(0,d.jsxs)("div",{className:"mt-3 flex flex-col gap-3",children:[a.blocked&&(0,d.jsxs)("div",{className:"rounded-lg border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive",children:["Quota exhausted — work is parked",f?`, resets in ${f}`:"","."]}),a.primary&&(0,d.jsx)(r,{label:"5h window",window:a.primary,tone:s(a.primary.usedPercent),now:c}),a.secondary&&(0,d.jsx)(r,{label:"weekly window",window:a.secondary,tone:s(a.secondary.usedPercent),now:c}),!a.primary&&!a.secondary&&(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:"No window details reported."})]})]})}},3061:(a,b,c)=>{"use strict";c.d(b,{Hi:()=>s,Mf:()=>u,fj:()=>r,hz:()=>t,yd:()=>q});var d=c(79241),e=c(67055),f=c(95310),g=c(92958);let h="openrouter_catalog_meta",i=e.Ik({lastSyncAt:e.ai().nullable().default(null),lastSuccessAt:e.ai().nullable().default(null),lastError:e.Yj().nullable().default(null),modelCount:e.ai().int().nonnegative().default(0),consecutiveFailures:e.ai().int().nonnegative().default(0)}),j={lastSyncAt:null,lastSuccessAt:null,lastError:null,modelCount:0,consecutiveFailures:0},k=e.Ik({id:e.Yj().min(1),name:e.Yj().optional(),description:e.Yj().nullish(),context_length:e.ai().nullish(),pricing:e.Ik({prompt:e.KC([e.Yj(),e.ai()]).optional(),completion:e.KC([e.Yj(),e.ai()]).optional()}).passthrough().nullish(),supported_parameters:e.YO(e.Yj()).nullish(),expiration_date:e.KC([e.Yj(),e.ai()]).nullish()}),l=e.Ik({data:e.YO(e.L5())});function m(a){if(void 0===a)return 0;let b="number"==typeof a?a:Number.parseFloat(a);return Number.isFinite(b)&&b>=0?b:0}function n(a=(0,f.Lf)()){let b=a.select().from(g.settings).where((0,d.eq)(g.settings.key,h)).get();if(!b)return{...j};try{return i.parse(JSON.parse(b.value))}catch{return{...j}}}function o(a,b){let c=JSON.stringify(a);b.select().from(g.settings).where((0,d.eq)(g.settings.key,h)).get()?b.update(g.settings).set({value:c}).where((0,d.eq)(g.settings.key,h)).run():b.insert(g.settings).values({key:h,value:c}).run()}let p=()=>Math.floor(Date.now()/1e3);async function q(a){let b,c=a.db??(0,f.Lf)(),e=a.fetchImpl??fetch,h=a.now??p(),i=n(c);i.lastSyncAt=h;try{let c={};a.apiKey&&(c.Authorization=`Bearer ${a.apiKey}`);let d=await e("https://openrouter.ai/api/v1/models",{headers:c});if(!d.ok)throw Error(`OpenRouter models API returned HTTP ${d.status}`);b=function(a){let{data:b}=l.parse(a),c=[];for(let a of b){let b=k.safeParse(a);if(!b.success)continue;let d=b.data,e=m(d.pricing?.prompt),f=m(d.pricing?.completion),g=d.supported_parameters??[];c.push({id:d.id,name:d.name??d.id,description:d.description??"",contextLength:d.context_length??0,promptCostPerToken:e,completionCostPerToken:f,supportedParameters:g,expirationDate:function(a){if(null==a)return null;if("number"==typeof a)return Number.isFinite(a)?Math.floor(a):null;let b=Date.parse(a);return Number.isNaN(b)?null:Math.floor(b/1e3)}(d.expiration_date),isFree:d.id.endsWith(":free")||0===e&&0===f,supportsTools:g.includes("tools")})}return c}(await d.json())}catch(a){return i.lastError=a instanceof Error?a.message:String(a),i.consecutiveFailures+=1,o(i,c),{ok:!1,error:i.lastError}}let j=new Set(b.map(a=>a.id));return c.transaction(a=>{for(let c of b){let b={id:c.id,name:c.name,description:c.description,contextLength:c.contextLength,promptCostPerToken:c.promptCostPerToken,completionCostPerToken:c.completionCostPerToken,supportedParameters:JSON.stringify(c.supportedParameters),expirationDate:c.expirationDate,isFree:c.isFree,supportsTools:c.supportsTools,removedAt:null,syncedAt:h};a.insert(g.openrouterModels).values(b).onConflictDoUpdate({target:g.openrouterModels.id,set:b}).run()}for(let b of a.select({id:g.openrouterModels.id}).from(g.openrouterModels).all())j.has(b.id)||a.update(g.openrouterModels).set({removedAt:h}).where((0,d.eq)(g.openrouterModels.id,b.id)).run()}),i.lastSuccessAt=h,i.lastError=null,i.modelCount=b.length,i.consecutiveFailures=0,o(i,c),{ok:!0,modelCount:b.length}}function r(a,b=p()){return null===a.removedAt&&(null===a.expirationDate||!(a.expirationDate<=b))}function s(a,b=(0,f.Lf)()){return b.select().from(g.openrouterModels).where((0,d.eq)(g.openrouterModels.id,a)).get()}function t(a,b,c,d=(0,f.Lf)()){let e=s(a,d);return e?b*e.promptCostPerToken+c*e.completionCostPerToken:0}function u(a){let b=a.db??(0,f.Lf)(),c=a.now??p(),d=n(b);if(null===d.lastSyncAt||0===d.modelCount&&0===d.consecutiveFailures)return!0;let e=d.consecutiveFailures>0?Math.min(300*2**(d.consecutiveFailures-1),3600):Math.floor(3600*a.refreshHours);return c-d.lastSyncAt>=e}},5501:(a,b,c)=>{"use strict";c.d(b,{N6:()=>n,_S:()=>j,ax:()=>k,dk:()=>m,i1:()=>o,yM:()=>l});var d=c(79241),e=c(80179),f=c(95310),g=c(92958),h=c(88162),i=c(70040);function j(a,b=(0,f.Lf)()){let c=b.insert(g.jobs).values({repoId:a.repoId,issueNumber:a.issueNumber,status:"queued",model:a.model,agent:a.agent??"claude",maxTurns:a.maxTurns??40,dedupeKey:a.dedupeKey??null}).returning().get();return(0,h.ej)(),c}function k(a,b=(0,f.Lf)()){return b.select().from(g.jobs).where((0,d.eq)(g.jobs.id,a)).get()}function l(a,b,c,d=(0,f.Lf)()){d.insert(g.jobEvents).values({jobId:a,type:b,payload:JSON.stringify(c??{})}).run()}function m(a,b,c={},e=(0,f.Lf)()){let j=e.transaction(e=>{let f=k(a,e);if(!f)throw Error(`job ${a} not found`);(0,i.QJ)(f.status,b);let h=Math.floor(Date.now()/1e3),j={};"working"!==b||f.startedAt||(j.startedAt=h),["merged","needs_human","aborted"].includes(b)&&(j.finishedAt=h);let m=e.update(g.jobs).set({...j,...c,status:b}).where((0,d.eq)(g.jobs.id,a)).returning().get();return l(a,"status",{from:f.status,to:b},e),m});return(0,h.ej)(),j}function n(a,b=(0,f.Lf)()){return b.select().from(g.jobs).where((0,d.eq)(g.jobs.repoId,a)).orderBy((0,e.i)(g.jobs.createdAt)).all()}function o(a,b=(0,f.Lf)()){return b.select().from(g.jobs).where((0,d.RV)(g.jobs.status,a)).all()}},6012:(a,b,c)=>{"use strict";c.d(b,{FD:()=>A,kz:()=>B,X$:()=>D,TU:()=>C});let d={"claude-fable-5":{inputPerMTok:10,outputPerMTok:50,cacheWritePerMTok:12.5,cacheReadPerMTok:1},"claude-opus-4-8":{inputPerMTok:5,outputPerMTok:25,cacheWritePerMTok:6.25,cacheReadPerMTok:.5},"claude-opus-4-7":{inputPerMTok:5,outputPerMTok:25,cacheWritePerMTok:6.25,cacheReadPerMTok:.5},"claude-sonnet-4-6":{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3},"claude-sonnet-4-5":{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3},"claude-haiku-4-5":{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}},e=Object.values(d).reduce((a,b)=>b.outputPerMTok>a.outputPerMTok?b:a,{inputPerMTok:0,outputPerMTok:0,cacheWritePerMTok:0,cacheReadPerMTok:0});var f=c(57568),g=c(16680);let h=[{kind:"auth",pattern:/invalid api key/i},{kind:"auth",pattern:/please run \/login/i},{kind:"auth",pattern:/authentication_error/i},{kind:"auth",pattern:/api error:?\s*401\b/i},{kind:"auth",pattern:/oauth token (?:has )?(?:expired|been revoked)/i},{kind:"billing",pattern:/credit balance is too low/i},{kind:"billing",pattern:/billing_error/i},{kind:"usage_limit",pattern:/usage limit reached/i},{kind:"usage_limit",pattern:/\b(?:\d+-hour|session|weekly) limit reached/i},{kind:"usage_limit",pattern:/limit will reset at/i},{kind:"rate_limit",pattern:/rate.?limit_error/i},{kind:"rate_limit",pattern:/api error:?\s*429\b/i},{kind:"rate_limit",pattern:/too many requests/i},{kind:"rate_limit",pattern:/\brate.?limit(?:ed)?\b.{0,60}\b(?:exceeded|reached|hit)\b/i},{kind:"rate_limit",pattern:/\b(?:exceeded|reached|hit)\b.{0,60}\brate.?limit/i},{kind:"overloaded",pattern:/overloaded_error/i},{kind:"overloaded",pattern:/api error:?\s*529\b/i}],i=/limit reached\|(\d{9,12})\b/i,j=/retry[- ]?after[:\s]+(\d+)\s*(?:s|sec|second)/i;var k=c(67055);let l=[{kind:"auth",pattern:/unexpected status 401\b/i},{kind:"auth",pattern:/\b401 unauthorized\b/i},{kind:"auth",pattern:/access token could not be refreshed/i},{kind:"auth",pattern:/please log out and sign in again/i},{kind:"auth",pattern:/\bnot logged in\b/i},{kind:"auth",pattern:/(?:chatgpt|api key) login is required/i},{kind:"auth",pattern:/missing environment variable.{0,5}OPENAI_API_KEY/i},{kind:"auth",pattern:/re-?run `?codex login`?/i},{kind:"billing",pattern:/quota exceeded\. check your plan and billing/i},{kind:"billing",pattern:/insufficient_quota/i},{kind:"billing",pattern:/exceeded your current quota/i},{kind:"billing",pattern:/\bout of credits\b/i},{kind:"billing",pattern:/\bspend cap\b/i},{kind:"billing",pattern:/to use codex with your chatgpt plan/i},{kind:"usage_limit",pattern:/you.?ve hit your usage limit/i},{kind:"usage_limit",pattern:/usage_limit_reached/i},{kind:"rate_limit",pattern:/rate.?limit_exceeded/i},{kind:"rate_limit",pattern:/rate limit reached for/i},{kind:"rate_limit",pattern:/last status:?\s*429\b/i},{kind:"rate_limit",pattern:/unexpected status 429\b/i},{kind:"rate_limit",pattern:/too many requests/i},{kind:"overloaded",pattern:/selected model is at capacity/i},{kind:"overloaded",pattern:/currently experiencing high demand/i},{kind:"overloaded",pattern:/server_is_overloaded/i},{kind:"overloaded",pattern:/last status:?\s*5\d\d\b/i},{kind:"overloaded",pattern:/unexpected status 5\d\d\b/i}],m=/try again in ([\d.]+)\s*s(?:ec(?:ond)?s?)?\b/i,n="gpt-5-codex",o={"gpt-5-codex":{inputPerMTok:1.25,outputPerMTok:10,cacheWritePerMTok:0,cacheReadPerMTok:0},"gpt-5":{inputPerMTok:1.25,outputPerMTok:10,cacheWritePerMTok:0,cacheReadPerMTok:0},"gpt-5-mini":{inputPerMTok:.25,outputPerMTok:2,cacheWritePerMTok:0,cacheReadPerMTok:0}},p=Object.values(o).reduce((a,b)=>b.outputPerMTok>a.outputPerMTok?b:a,{inputPerMTok:0,outputPerMTok:0,cacheWritePerMTok:0,cacheReadPerMTok:0}),q=k.Ik({input_tokens:k.ai().optional(),cached_input_tokens:k.ai().optional(),output_tokens:k.ai().optional(),reasoning_output_tokens:k.ai().optional()}).passthrough(),r=k.Ik({used_percent:k.ai().optional(),window_minutes:k.ai().optional(),resets_in_seconds:k.ai().optional()}).passthrough(),s=k.Ik({primary:r.nullish(),secondary:r.nullish()}).passthrough(),t=k.Ik({id:k.Yj().optional(),item_type:k.Yj().optional(),text:k.Yj().optional(),command:k.Yj().optional(),exit_code:k.ai().optional(),server:k.Yj().optional(),tool:k.Yj().optional()}).passthrough(),u=k.Ik({type:k.Yj(),thread_id:k.Yj().optional(),usage:q.optional(),rate_limits:s.nullish(),item:t.optional(),error:k.Ik({message:k.Yj().optional()}).passthrough().optional(),message:k.Yj().optional()}).passthrough();function v(a){if(a&&"number"==typeof a.used_percent)return{usedPercent:a.used_percent,windowMinutes:a.window_minutes,resetsInSeconds:a.resets_in_seconds}}class w{push(a){this.buffer+=a;let b=[],c=this.buffer.indexOf("\n");for(;-1!==c;){let a=this.buffer.slice(0,c);this.buffer=this.buffer.slice(c+1);let d=this.consume(a);d&&b.push(d),c=this.buffer.indexOf("\n")}return b}flush(){let a=this.buffer;this.buffer="";let b=this.consume(a);return b?[b]:[]}consume(a){let b;try{b=function(a){let b=a.trim();if(!b)return null;let c=JSON.parse(b);return u.parse(c)}(a)}catch(b){return this.onParseError?.({line:a.trim(),message:(0,f.gJ)(b)}),null}if(!b)return null;let c=function(a){let b=s.nullish().safeParse(a.rate_limits);if(!b.success||!b.data)return;let c=v(b.data.primary),d=v(b.data.secondary);if(c||d)return{primary:c,secondary:d}}(b);if(c&&(this.rateLimits=c),"turn.failed"===b.type||"error"===b.type){this.resultIsError=!0;let a=b.error?.message??b.message;a&&(this.resultText=a)}else"turn.completed"===b.type&&(this.resultIsError=!1,this.resultText=void 0);let d=function(a){let b={type:"assistant",chunks:[],inputTokens:0,outputTokens:0,cacheCreationInputTokens:0,cacheReadInputTokens:0,isError:!1,raw:a};if("thread.started"===a.type)return{...b,type:"system",sessionId:a.thread_id};if("item.completed"===a.type&&a.item)return{...b,type:"assistant",chunks:function(a){let b=a.id??"";switch(a.item_type){case"assistant_message":case"reasoning":return a.text?[{kind:"text",text:a.text}]:[];case"command_execution":return[{kind:"tool_use",name:"command",id:b,input:{command:a.command,exit_code:a.exit_code}}];case"file_change":return[{kind:"tool_use",name:"edit",id:b,input:a}];case"mcp_tool_call":return[{kind:"tool_use",name:`${a.server??"mcp"}/${a.tool??"tool"}`,id:b,input:a}];default:return[]}}(a.item)};if("turn.completed"===a.type){let c=a.usage;return{...b,type:"result",inputTokens:c?.input_tokens??0,outputTokens:(c?.output_tokens??0)+(c?.reasoning_output_tokens??0)}}return"turn.failed"===a.type||"error"===a.type?{...b,type:"result",isError:!0}:null}(b);return d?(d.sessionId&&(this.sessionId=d.sessionId),this.totalInputTokens+=d.inputTokens,this.totalOutputTokens+=d.outputTokens,d):null}constructor(){this.buffer="",this.totalInputTokens=0,this.totalOutputTokens=0,this.totalCacheCreationInputTokens=0,this.totalCacheReadInputTokens=0,this.costUsd=0}}var x=c(51541);let y="openrouter is an HTTP provider; it has no CLI surface (dispatch on provider.kind)",z={claude:{id:"claude",label:"Claude Code",defaultCommand:"claude",supportsResume:!0,resumeModel:"claude-haiku-4-5",resumeMaxTurns:15,defaultModel:"claude-opus-4-8",buildStartArgs:({prompt:a,model:b,maxTurns:c})=>["-p",a,"--max-turns",String(c),"--permission-mode","acceptEdits","--model",b,"--output-format","stream-json","--verbose"],buildResumeArgs:({prompt:a,sessionId:b,model:c,maxTurns:d})=>["-p",a,"--resume",b,"--max-turns",String(d),"--model",c,"--output-format","stream-json","--verbose"],buildOneShotArgs:({prompt:a,model:b})=>["-p",a,"--model",b],buildStreamOneShotArgs:({prompt:a,model:b})=>["-p",a,"--model",b,"--output-format","stream-json","--verbose"],createParser:()=>new f.KO,classifyFailure:function(a){var b;let c;if(0===a.exitCode&&!a.resultIsError)return;let d=[a.resultText,a.stderr].filter(Boolean).join("\n");if(!d.trim())return;let e=h.find(a=>a.pattern.test(d));if(!e)return;let f={agent:"claude",kind:e.kind,rawSnippet:(b=e.pattern,c=d.split("\n").find(a=>b.test(a))??d,(0,g.f)(c.trim()).slice(0,300))};if("usage_limit"===e.kind){let a=d.match(i)?.[1];a&&(f.resetAt=Number(a))}if("rate_limit"===e.kind||"overloaded"===e.kind){let a=d.match(j)?.[1];a&&(f.retryAfterMs=1e3*Number(a))}return f},estimateCost:function(a,b,c,f=0,g=0){let h=function(a){if(!a)return e;let b=d[a];return b||(console.warn(`[drydock] Unknown model id "${a}" — using max-priced fallback to avoid under-counting cost`),e)}(a);return b/1e6*h.inputPerMTok+c/1e6*h.outputPerMTok+f/1e6*h.cacheWritePerMTok+g/1e6*h.cacheReadPerMTok}},codex:{id:"codex",label:"Codex CLI",defaultCommand:"codex",supportsResume:!0,resumeModel:n,resumeMaxTurns:15,defaultModel:n,buildStartArgs:({prompt:a,model:b})=>["exec","--json","--sandbox","workspace-write","--model",b,a],buildResumeArgs:({prompt:a,sessionId:b,model:c})=>["exec","resume",b,"--json","--sandbox","workspace-write","--model",c,a],buildOneShotArgs:({prompt:a,model:b})=>["exec","--model",b,a],buildStreamOneShotArgs:()=>null,createParser:()=>new w,classifyFailure:function(a){var b;let c;if(0===a.exitCode&&!a.resultIsError)return;let d=[a.resultText,a.stderr].filter(Boolean).join("\n");if(!d.trim())return;let e=l.find(a=>a.pattern.test(d));if(!e)return;let f={agent:"codex",kind:e.kind,rawSnippet:(b=e.pattern,c=d.split("\n").find(a=>b.test(a))??d,(0,g.f)(c.trim()).slice(0,300))};if("rate_limit"===e.kind||"overloaded"===e.kind){let a=d.match(m)?.[1],b=a?Math.ceil(1e3*Number(a)):NaN;Number.isFinite(b)&&b>=0&&(f.retryAfterMs=b)}return f},captureUsage:a=>a instanceof w?a.rateLimits:void 0,estimateCost:function(a,b,c){let d=function(a){if(!a)return p;let b=o[a];return b||(console.warn(`[drydock] Unknown codex model id "${a}" — using max-priced fallback to avoid under-counting cost`),p)}(a);return b/1e6*d.inputPerMTok+c/1e6*d.outputPerMTok}},openrouter:{id:"openrouter",kind:"http",label:"OpenRouter",defaultCommand:"",supportsResume:!1,resumeModel:"",resumeMaxTurns:20,defaultModel:"",buildStartArgs(){throw Error(y)},buildResumeArgs:()=>null,buildOneShotArgs(){throw Error(y)},buildStreamOneShotArgs:()=>null,createParser(){throw Error(y)},classifyFailure:x.M,estimateCost:()=>0}},A=["claude","codex","openrouter"],B="claude";function C(a){return"string"==typeof a&&A.includes(a)}function D(a){return C(a)?z[a]:z[B]}},6402:(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}},7420:(a,b,c)=>{"use strict";c.d(b,{T:()=>i});var d=c(27905),e=c(46753),f=c(75244),g=c(32029),h=c(51413);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})]})})}},10446:(a,b,c)=>{Promise.resolve().then(c.bind(c,60618)),Promise.resolve().then(c.bind(c,39280))},10669:(a,b,c)=>{"use strict";c.d(b,{AppShell:()=>P});var d=c(27905),e=c(2253),f=c(46753),g=c(20702),h=c(58761),i=c(97370),j=c(2277),k=c(20620),l=c(19579),m=c(45823),n=c(83802),o=c(9324),p=c.n(o),q=c(21747),r=c(75857),s=c(2534),t=c(70802);function u({failures:a}){return 0===a.length?null:(0,d.jsx)("div",{role:"alert",className:"border-t border-destructive/30 bg-destructive/10",children:(0,d.jsxs)("div",{className:"mx-auto flex max-w-7xl items-start gap-2 px-4 py-1.5 text-xs text-destructive",children:[(0,d.jsx)(t.A,{className:"mt-0.5 h-[13px] w-[13px] shrink-0"}),(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsx)("span",{className:"font-semibold",children:"Credential check failed — new jobs are paused until auth is restored."})," ",a.map(a=>(0,d.jsxs)("span",{className:"after:content-['_']",children:[(0,d.jsxs)("span",{className:"font-medium",children:[a.label,":"]})," ",a.message]},a.target))]})]})})}var v=c(2526),w=c(35924),x=c(7420),y=c(46553),z=c(23581);let A=(0,z.createServerReference)("00d40d65ec366596ba0f414253cbf8a8e26ce81760",z.callServer,void 0,z.findSourceMapURL,"emergencyStopAction");function B(){let[a,b]=(0,w.useTransition)(),[c,e]=(0,w.useState)(!1),{success:f,error:g}=(0,y.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)(v.A,{className:"h-3.5 w-3.5"}),(0,d.jsx)("span",{className:"hidden sm:inline",children:"Stop all"})]}),(0,d.jsx)(x.T,{open:c,onOpenChange:e,onConfirm:function(){b(async()=>{try{let{aborted:a}=await A();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 C=c(43682),D=c(72914),E=c(5270);function F({paused:a}){let[b,c]=(0,w.useState)(a),[e,f]=(0,w.useTransition)(),{success:g,error:h}=(0,y.d)();return(0,d.jsxs)("button",{type:"button",onClick:function(){let a=!b;f(async()=>{try{let b=await (0,D.$)(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,E.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)(C.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 G=c(39482),H=c(16699),I=c(14359);function J(){let{resolvedTheme:a,setTheme:b}=(0,I.D)(),[c,e]=(0,w.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)(G.A,{className:"h-4 w-4"}):(0,d.jsx)(H.A,{className:"h-4 w-4"})})}var K=c(54914),L=c(38048),M=c(27796);function N({status:a,installKind:b}){let[c,e]=(0,w.useState)(null),[f,g]=(0,w.useState)(!1);return f&&a.updateAvailable&&a.latestVersion&&a.latestVersion!==c?(0,d.jsxs)(M.E,{tone:"success",className:"h-8 gap-1.5 px-2.5",children:[(0,d.jsx)(K.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)(L.A,{className:"h-3 w-3"})})]}):null}let O=[{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 P({children:a,adrPending:b=0,needsHuman:c=0,paused:e=!1,updateStatus:f,installKind:g="local",credentialFailures:h=[],claudeUsage:i,codexUsage:j}){let k=(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:O.map(a=>{var e;let f="/"===(e=a.href)?"/"===k:k.startsWith(e),g=a.icon,h="/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,E.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,E.cn)("h-[15px] w-[15px]",f&&"text-primary")}),a.label,h>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:h}),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:[i&&(0,d.jsx)(r.B,{view:i}),j&&(0,d.jsx)(s._,{view:j}),f&&(0,d.jsx)(N,{status:f,installKind:g}),(0,d.jsx)(F,{paused:e}),(0,d.jsx)(B,{}),(0,d.jsx)("div",{className:"mx-1 h-5 w-px bg-border"}),(0,d.jsx)(J,{})]})]}),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)(u,{failures:h})]}),(0,d.jsx)("main",{id:"main",className:"mx-auto max-w-7xl px-4 py-6 sm:py-8",children:a})]})}},11430:(a,b,c)=>{"use strict";c.d(b,{u:()=>f,v:()=>e});let d=new(c(16698)).AsyncLocalStorage;function e(a,b){return d.run(a,b)}function f(){return d.getStore()??"high"}},16680:(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,/\bsk-ant-[A-Za-z0-9_-]{20,}\b/g,/\bsk-(?:proj-)?[A-Za-z0-9_-]{20,}\b/g,/\d{8,10}:[A-Za-z0-9_-]{35}\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}},16719:(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"):""}},16746:(a,b,c)=>{"use strict";c.d(b,{Vz:()=>i,cQ:()=>f,xv:()=>e});var d=c(67055);function e(a,b){if(a.length<=b)return a;let c=a.length-b;return`${a.slice(0,b)}
2
- …[truncated ${c} chars]`}function f(a){var b;let c=e(a.issueBody.trim(),6e3),d=e(a.diff.trim(),24e3);return["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}`,"",c,"\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",d,'```\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")}let g=d.Ik({ordinal:d.ai().int().nonnegative(),status:d.k5(["done","pending","deferred"]),reason:d.Yj().default("")}),h=d.Ik({summary:d.Yj().default(""),verdicts:d.YO(g).default([])});function i(a){let b,c=a.match(/\{[\s\S]*\}/);if(!c)return null;try{b=JSON.parse(c[0])}catch{return null}let d=h.safeParse(b);return d.success?d.data:null}},17398:(a,b,c)=>{"use strict";let d;c.d(b,{Ix:()=>u,Ym:()=>q,_$:()=>p,jQ:()=>r,m:()=>n,pp:()=>t,sV:()=>m,wL:()=>s});var e=c(77598),f=c(48161),g=c(79241),h=c(97095),i=c(95310),j=c(92958),k=c(5501),l=c(70040);let m=3e4,n=1e4,o=()=>Math.floor(Date.now()/1e3);function p(){return d||(d=`${(0,f.hostname)()}#${process.pid}`),d}function q(a={},b=(0,i.Lf)()){let{repoIds:c,excludeAgents:d}=a;if(c&&0===c.length)return;let f=a.leaseMs??m,l=a.worker??p(),n=a.now??o();return b.transaction(a=>{let b=a.select({job:j.jobs}).from(j.jobs).leftJoin(j.issues,(0,g.Uo)((0,g.eq)(j.issues.repoId,j.jobs.repoId),(0,g.eq)(j.issues.number,j.jobs.issueNumber))).where((0,g.Uo)((0,g.eq)(j.jobs.status,"queued"),(0,g.or)((0,g.kZ)(j.jobs.availableAt),(0,g.wJ)(j.jobs.availableAt,n)),c?(0,g.RV)(j.jobs.repoId,c):void 0,d&&d.length>0?(0,g.KL)(j.jobs.agent,d):void 0)).orderBy((0,h.ll)`COALESCE(${j.issues.priority}, 1e9)`,j.jobs.createdAt).get()?.job;if(b)return(0,k.dk)(b.id,"working",{leaseToken:(0,e.randomUUID)(),leaseExpiresAt:n+Math.ceil(f/1e3),workerId:l,attempts:b.attempts+1,availableAt:null},a)})}function r(a,b,c={},d=(0,i.Lf)()){let e=c.leaseMs??m,f=c.now??o();return d.update(j.jobs).set({leaseExpiresAt:f+Math.ceil(e/1e3)}).where((0,g.Uo)((0,g.eq)(j.jobs.id,a),(0,g.eq)(j.jobs.leaseToken,b),(0,g.eq)(j.jobs.status,"working"))).run().changes>0}function s(a,b,c=(0,i.Lf)()){return c.update(j.jobs).set({leaseToken:null,leaseExpiresAt:null,workerId:null}).where((0,g.Uo)((0,g.eq)(j.jobs.id,a),(0,g.eq)(j.jobs.leaseToken,b))).run().changes>0}function t(a={},b=(0,i.Lf)()){let c=a.now??o(),d=a.expiredBefore,e=void 0===d?void 0:(0,g.or)((0,g.kZ)(j.jobs.leaseExpiresAt),(0,g.wJ)(j.jobs.leaseExpiresAt,d)),f=b.select().from(j.jobs).where((0,g.Uo)((0,g.eq)(j.jobs.status,"working"),e)).all();for(let a of f)b.update(j.jobs).set({status:"queued",leaseToken:null,leaseExpiresAt:null,workerId:null,availableAt:c+function(a,b=5,c=300){return a<=0?0:Math.min(b*2**(a-1),c)}(a.attempts)}).where((0,g.eq)(j.jobs.id,a.id)).run(),(0,k.yM)(a.id,"status",{from:"working",to:"queued",reason:"lease_expired"},b);return f.length}function u(a,b=(0,i.Lf)()){let c=a.dedupeKey??`${a.repoId}:${a.issueNumber}`;if(!b.select({id:j.jobs.id}).from(j.jobs).where((0,g.Uo)((0,g.eq)(j.jobs.dedupeKey,c),(0,g.KL)(j.jobs.status,[...l.kl]))).get())try{return(0,k._S)({...a,dedupeKey:c},b)}catch(a){if(a instanceof Error&&"string"==typeof a.code&&"SQLITE_CONSTRAINT_UNIQUE"===a.code)return;throw a}}},17717:(a,b,c)=>{"use strict";c.d(b,{Pe:()=>g,eT:()=>h});var d=c(79241),e=c(95310),f=c(92958);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}},18767:()=>{},19761:(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,mergeWithoutChecks:a.mergeWithoutChecks,autoResolveMergeConflicts:a.autoResolveMergeConflicts,includeProgressReplies:a.includeProgressReplies,autoDecompose:a.autoDecompose,planFirst:a.planFirst,verifyPr:a.verifyPr,autoHealDeployments:a.autoHealDeployments,releaseEnabled:a.releaseEnabled,deploymentPlatform:a.deploymentPlatform,readyLabels:e(a.readyLabels),blockingLabels:e(a.blockingLabels),autoLabelWhitelist:e(a.autoLabelWhitelist),priorityAuthors:e(a.priorityAuthors),trustedReviewers:e(a.trustedReviewers),trustedBots:e(a.trustedBots),ignoredBots:e(a.ignoredBots),minAuthorAssociation:"any"===a.minAuthorAssociation?"any":"approved",maxAttempts:a.maxAttempts,sandbox:"docker"===a.sandbox?"docker":"none",sandboxImage:a.sandboxImage,sandboxAllowNetwork:a.sandboxAllowNetwork,sandboxCpus:a.sandboxCpus,sandboxMemory:a.sandboxMemory}}function g(a,b){return"any"===a.minAuthorAssociation||null!=b&&d.has(b.toUpperCase())}},20200:(a,b,c)=>{"use strict";c.d(b,{VJ:()=>f,WM:()=>g,r7:()=>h});let d=[{id:"claude-opus-4-8",label:"Claude Opus 4.8",agent:"claude"},{id:"claude-fable-5",label:"Claude Fable 5",agent:"claude"},{id:"claude-opus-4-7",label:"Claude Opus 4.7",agent:"claude"},{id:"claude-sonnet-4-6",label:"Claude Sonnet 4.6",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.filter(b=>b.agent===a)}function f(a){return"openrouter"===a?"":e(a)[0]?.id??"claude-opus-4-8"}function g(a){return d.some(b=>b.id===a)}function h(a,b){if(!b)return null;let c=e(a),d=c.findIndex(a=>a.id===b);return d<=0?null:c[d-1]?.id??null}},22287:(a,b,c)=>{"use strict";c.d(b,{dv:()=>m,t0:()=>k,ZY:()=>l});var d=c(79241),e=c(80179),f=c(95310),g=c(92958);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(86888);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}}},23174:(a,b,c)=>{"use strict";c.d(b,{D:()=>d});let d=async(a,b)=>{let c=await fetch(a,{method:b?.method??"GET",headers:b?.headers,body:b?.body,redirect:"manual"}),d=await c.text(),e={};return c.headers.forEach((a,b)=>{e[b.toLowerCase()]=a}),{status:c.status,ok:c.ok,body:d,headers:e}}},24845:(a,b,c)=>{"use strict";c.d(b,{I7:()=>p,F1:()=>m,HF:()=>q,yO:()=>r,Xm:()=>k,XZ:()=>n,yx:()=>o,AI:()=>s});var d=c(79241),e=c(80179),f=c(67055),g=c(95310),h=c(92958),i=c(68008);let j=["$ISSUE_NUM","$ISSUE_TITLE","$ISSUE_BODY","$BRANCH","$REPO_NAME","$CI_LOG"];function k(a,b){let c={$ISSUE_NUM:void 0!==b.ISSUE_NUM?String(b.ISSUE_NUM):"$ISSUE_NUM",$ISSUE_TITLE:b.ISSUE_TITLE??"$ISSUE_TITLE",$ISSUE_BODY:b.ISSUE_BODY??"$ISSUE_BODY",$BRANCH:b.BRANCH??"$BRANCH",$REPO_NAME:b.REPO_NAME??"$REPO_NAME",$CI_LOG:b.CI_LOG??"$CI_LOG"},d=a;for(let a of[...j].sort((a,b)=>b.length-a.length))d=d.split(a).join(c[a]??a);return d}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)()){let d=m(a,b,c);return d?{content:d.content,version:d.version}:{content:i.E[b]??"",version:null}}function o(a,b,c=(0,g.Lf)()){return n(a,b,c).content}function p(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 q(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 r(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 s(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 r(c.repoId,c.name,b).slice(20))b.delete(h.promptTemplates).where((0,d.eq)(h.promptTemplates.id,a.id)).run();return i}},26370:(a,b,c)=>{"use strict";c.d(b,{Sx:()=>g,g8:()=>f,l9:()=>e});var d=c(31421);let e="win32"!==process.platform;function f(a,b){let c=a.pid;if(void 0!==c&&e)try{process.kill(-c,b);return}catch{}a.kill(b)}let g=(a,b,c,g)=>new Promise((h,i)=>{let j=(0,d.spawn)(a,b,{cwd:c,env:process.env,detached:e}),k="",l="",m=!1,n=g?.timeoutMs??3e5,o=setTimeout(()=>{m=!0,f(j,"SIGKILL")},n);o.unref?.(),j.stdout.on("data",a=>{k+=a.toString()}),j.stderr.on("data",a=>{l+=a.toString()}),j.on("error",a=>{clearTimeout(o),i(a)}),j.on("close",(b,c)=>{(clearTimeout(o),m)?i(Error(`\`${a}\` timed out after ${n}ms`)):h({stdout:k,stderr:l,exitCode:b??+!!c})})})},26511:(a,b,c)=>{"use strict";c.d(b,{D:()=>h});var d=c(95310),e=c(92958),f=c(26370),g=c(57568);async function h(a){if("http"===a.provider.kind){let{runOpenRouterOneShot:b}=await c.e(977).then(c.bind(c,37977));return b({model:a.model,prompt:a.prompt,repoId:a.repoId,type:a.type,timeoutMs:a.timeoutMs,db:a.db,fetchImpl:a.fetchImpl})}let b=a.runner??f.Sx,h=a.db??(0,d.Lf)(),i=void 0!==a.timeoutMs?{timeoutMs:a.timeoutMs}:void 0,j=a.provider.buildStreamOneShotArgs({prompt:a.prompt,model:a.model});if(null===j){let c=a.provider.buildOneShotArgs({prompt:a.prompt,model:a.model}),d=i?await b(a.command,c,a.cwd,i):await b(a.command,c,a.cwd);return{text:d.stdout,exitCode:d.exitCode,costUsd:0,stderr:d.stderr}}let k=i?await b(a.command,j,a.cwd,i):await b(a.command,j,a.cwd),l=new g.KO,m=[...l.push(k.stdout),...l.flush()],n=[];for(let a of m)for(let b of a.chunks)"text"===b.kind&&n.push(b.text);let o=n.join(""),p=l.costUsd>0?l.costUsd:0;return p>0&&void 0!==a.repoId&&h.insert(e.oneShotCosts).values({repoId:a.repoId,type:a.type,costUsd:p,inputTokens:l.totalInputTokens,outputTokens:l.totalOutputTokens}).run(),{text:o,exitCode:k.exitCode,costUsd:p,stderr:k.stderr}}},27796:(a,b,c)=>{"use strict";c.d(b,{E:()=>i});var d=c(27905),e=c(5270);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",waiting_limit:"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," ")]})}},29218:(a,b,c)=>{"use strict";let d;c.d(b,{k:()=>k});var e=c(79241),f=c(80179),g=c(95310),h=c(92958),i=c(16680);class j{constructor(a=(0,g.Lf)()){this.db=a,this.subs=new Map}subscribe(a,b){let c=this.subs.get(a);c||(c=new Set,this.subs.set(a,c)),c.add(b)}unsubscribe(a,b){let c=this.subs.get(a);c&&(c.delete(b),0===c.size&&this.subs.delete(a))}subscriberCount(a){return this.subs.get(a)?.size??0}publish(a,b){let c,d=(0,i.f)(JSON.stringify(b.payload??{}));try{c=JSON.parse(d)}catch{c={error:"unparseable event payload"}}let e=this.db.insert(h.jobEvents).values({jobId:a,type:b.type,payload:d}).returning().get(),f=this.subs.get(a);if(f)for(let b of[...f])try{b.send({id:e.id,type:e.type,payload:c})}catch{this.unsubscribe(a,b)}return e}replay(a,b=200,c){return void 0!==c?this.db.select().from(h.jobEvents).where((0,e.Uo)((0,e.eq)(h.jobEvents.jobId,a),(0,e.gt)(h.jobEvents.id,c))).orderBy(h.jobEvents.ts,h.jobEvents.id).limit(b).all():this.db.select().from(h.jobEvents).where((0,e.eq)(h.jobEvents.jobId,a)).orderBy((0,f.i)(h.jobEvents.ts),(0,f.i)(h.jobEvents.id)).limit(b).all().reverse()}}function k(){return d||(d=new j),d}},31003:(a,b,c)=>{"use strict";c.d(b,{p:()=>f});var d=c(35924);let e=()=>()=>{};function f(){return(0,d.useSyncExternalStore)(e,()=>!0,()=>!1)}},34850:(a,b,c)=>{"use strict";c.d(b,{bC:()=>g});var d=c(67055);let e=d.Ik({usedPercent:d.ai(),resetsAt:d.ai().optional(),windowMinutes:d.ai().optional()});function f(a,b){if(a)return{usedPercent:a.usedPercent,windowMinutes:a.windowMinutes,resetsAt:void 0!==a.resetsInSeconds?b+a.resetsInSeconds:void 0}}function g(a,b){return{capturedAt:b,primary:f(a.primary,b),secondary:f(a.secondary,b)}}d.Ik({capturedAt:d.ai(),primary:e.optional(),secondary:e.optional()})},37078:(a,b,c)=>{"use strict";c.d(b,{AU:()=>o,o$:()=>p,aE:()=>n});var d=c(14565),e=c(89642),f=c(58748),g=c(41575),h=c(95310),i=c(74929),j=c(20200),k=c(5501),l=c(73683),m=c(70040);async function n(a){let b=function(a,b=(0,h.Lf)()){let c=(0,k.ax)(a,b);if(!c)throw Error(`job ${a} not found`);let d=null;if("needs_human"===c.status){let a=(0,i.L8)(c.repoId,b);a?.escalateModelOnRetry&&(d=(0,j.r7)(c.agent,c.model))}let e=(0,k.dk)(a,"queued",d?{model:d}:{},b);return d&&(0,k.yM)(a,"status",{reason:`model_escalated: ${c.model} → ${d}`},b),e}(a);return(0,e.revalidatePath)("/needs-human"),(0,e.revalidatePath)("/"),(0,e.revalidatePath)(`/repos/${b.repoId}`),b}async function o(a){(0,l.abortJob)(a);let b=(0,k.ax)(a);if(!b)throw Error(`job ${a} not found`);if((0,m.w)(b.status,"aborted"))try{b=(0,k.dk)(a,"aborted")}catch(c){if(!(c instanceof m.xh))throw c;b=(0,k.ax)(a)??b}return(0,e.revalidatePath)("/needs-human"),(0,e.revalidatePath)("/"),(0,e.revalidatePath)(`/jobs/${a}`),(0,e.revalidatePath)(`/repos/${b.repoId}`),b}async function p(){let a=(0,g.mt)();(0,g.DZ)({paused:!0}),await (0,f.Dp)(a.paused,!0);let b=(0,l.abortAllJobs)();for(let a of b)try{(0,k.dk)(a,"aborted")}catch{}return(0,e.revalidatePath)("/"),(0,e.revalidatePath)("/needs-human"),(0,e.revalidatePath)("/settings"),{paused:!0,aborted:b.length}}(0,c(13897).D)([n,o,p]),(0,d.A)(n,"40ea5d9a48c67bf43c3c92eead681338f5513aaa29",null),(0,d.A)(o,"403fc9b2867e1f720d4d1326cb1ea3c5c67b2fad36",null),(0,d.A)(p,"00d40d65ec366596ba0f414253cbf8a8e26ce81760",null)},39152:(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(95310),h=c(67055);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(77058),o=c(26511);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);if("manual"===e&&0===q.length&&!d.tag)return(0,n.Cq)(a,"skipped",{fromTag:m},c);let 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{}}}},39280:(a,b,c)=>{"use strict";c.d(b,{Providers:()=>d});let d=(0,c(34215).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")},40900:(a,b,c)=>{"use strict";c.d(b,{$q:()=>s,H_:()=>q,_x:()=>r,nc:()=>t,vu:()=>i});var d=c(79241),e=c(67055),f=c(95310),g=c(92958),h=c(41575);class i extends Error{constructor(a){super(`${a.agent} ${a.kind}: ${a.rawSnippet}`),this.info=a,this.name="ProviderLimitError"}}let j=e.Ik({agent:e.Yj(),kind:e.k5(["usage_limit","rate_limit","overloaded","auth","billing"]),since:e.ai(),blockedUntil:e.ai(),strikes:e.ai().int().positive(),rawSnippet:e.Yj()}),k=a=>`provider_limit:${a}`,l=()=>Math.floor(Date.now()/1e3),m={usage_limit:1800,rate_limit:300,overloaded:120},n={usage_limit:14400,rate_limit:1800,overloaded:1800},o=(a,b,c)=>Math.min(Math.max(a,b),c);function p(a,b=(0,f.Lf)()){let c=b.select().from(g.settings).where((0,d.eq)(g.settings.key,k(a))).get();if(c)try{return j.parse(JSON.parse(c.value))}catch{return}}function q(a,b=(0,f.Lf)(),c=l()){let e,h,i,j=p(a.agent,b),r=j?.kind===a.kind,s=r?j.strikes+1:1;e=void 0!==a.resetAt?o(a.resetAt,c+60,c+86400):void 0!==a.retryAfterMs?o(c+Math.ceil(a.retryAfterMs/1e3),c+60,c+86400):c+Math.min((m[a.kind]??m.usage_limit??1800)*2**(s-1),n[a.kind]??n.usage_limit??14400);let t={agent:a.agent,kind:a.kind,since:r?j.since:c,blockedUntil:e,strikes:s,rawSnippet:a.rawSnippet};return h=k(t.agent),i=JSON.stringify(t),b.select().from(g.settings).where((0,d.eq)(g.settings.key,h)).get()?b.update(g.settings).set({value:i}).where((0,d.eq)(g.settings.key,h)).run():b.insert(g.settings).values({key:h,value:i}).run(),{latch:t,entered:!(void 0!==j&&j.blockedUntil>c)}}function r(a,b=(0,f.Lf)()){b.delete(g.settings).where((0,d.eq)(g.settings.key,k(a))).run()}function s(a,b=(0,f.Lf)()){let c=(0,h.mt)(b);return"codex"===a?c.codexLimitAutoWait:"openrouter"===a?c.openrouterLimitAutoWait:c.claudeLimitAutoWait}function t(a,b=(0,f.Lf)(),c=l()){if(s(a,b))return function(a,b=(0,f.Lf)(),c=l()){let d=p(a,b);if(d&&!(d.blockedUntil<=c))return d}(a,b,c)}},41575:(a,b,c)=>{"use strict";c.d(b,{mt:()=>n,Jf:()=>p,DA:()=>q,DZ:()=>o});var d=c(79241),e=c(67055),f=c(95310),g=c(57807),h=c(92958),i=c(20200);let j=["needs_human","job_failed","pr_opened","pr_merged","release_published","cost_limit","claude_limit","codex_limit","openrouter_limit","auth_expired","automation_paused"];var k=c(46609);let l=e.Ik({paused:e.zM().default(!1),draining:e.zM().default(!1),dailyCostLimitUsd:e.ai().nonnegative().default(10),pollIntervalSec:e.ai().int().positive().default(30),maxTurns:e.ai().int().positive().default(40),maxJobMinutes:e.ai().int().positive().default(30),maxCiWaitMinutes:e.ai().int().positive().default(60),maxJobCostUsd:e.ai().nonnegative().default(0),claudeLimitAutoWait:e.zM().default(!0),codexLimitAutoWait:e.zM().default(!0),releaseManagementEnabled:e.zM().default(!1),defaultModel:e.Yj().refine(i.WM,{message:"unknown model id"}).default("claude-opus-4-8"),defaultAgent:e.k5(["claude","codex"]).default("claude"),claudePath:e.Yj().default("claude"),codexPath:e.Yj().default("codex"),ghPath:e.Yj().default("gh"),maxParallelJobs:e.ai().int().positive().default(3),telegramBotToken:e.Yj().default(""),telegramChatId:e.Yj().default(""),slackWebhookUrl:e.Yj().default(""),smtpHost:e.Yj().default(""),smtpPort:e.ai().int().positive().default(587),smtpUser:e.Yj().default(""),smtpPass:e.Yj().default(""),emailFrom:e.Yj().default(""),emailTo:e.Yj().default(""),openrouterEnabled:e.zM().default(!1),openrouterApiKey:e.Yj().default(""),openrouterCatalogRefreshHours:e.ai().min(.25).default(6),openrouterDefaultModel:e.Yj().default(""),openrouterFreeModelsOnly:e.zM().default(!1),openrouterSiteUrl:e.Yj().default(""),openrouterAppName:e.Yj().default("Drydock"),openrouterLimitAutoWait:e.zM().default(!0),sandboxDefaultImage:e.Yj().default("node:20-bookworm"),containerRuntime:e.k5(["auto","docker","podman"]).default("auto"),notifyEvents:e.YO(e.k5(j)).default([...j]),retentionDays:e.ai().int().positive().default(30)}),m="global";function n(a=(0,f.Lf)()){let b=a.select().from(h.settings).where((0,d.eq)(h.settings.key,m)).get();if(!b)return l.parse({});try{return l.parse(JSON.parse(b.value))}catch{return l.parse({})}}function o(a,b=(0,f.Lf)()){let c=l.parse({...n(b),...a}),e=JSON.stringify(c);return b.select().from(h.settings).where((0,d.eq)(h.settings.key,m)).get()?b.update(h.settings).set({value:e}).where((0,d.eq)(h.settings.key,m)).run():b.insert(h.settings).values({key:m,value:e}).run(),c}function p(a=(0,f.Lf)()){let b=n(a);return b.paused?{allowed:!1,reason:"paused"}:b.draining?{allowed:!1,reason:"draining"}:(0,k.DB)(a).length>0?{allowed:!1,reason:"auth"}:(0,g.Bt)(a)>=b.dailyCostLimitUsd?{allowed:!1,reason:"cost_limit"}:{allowed:!0}}function q(a,b=(0,f.Lf)()){let c=b.select().from(h.repos).where((0,d.eq)(h.repos.id,a)).get();return!c||(0,g.Bt)(b,a)>=c.dailyCostLimitUsd?{allowed:!1,reason:"repo_cost_limit"}:{allowed:!0}}},44045:(a,b,c)=>{"use strict";c.d(b,{$y:()=>j,MA:()=>k,r6:()=>i});var d=c(14565),e=c(89642),f=c(58748),g=c(56634),h=c(41575);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(13897).D)([i,j,k]),(0,d.A)(i,"40a385ca6c1b8479def93fa7e48a72fcfaf4c58010",null),(0,d.A)(j,"40d6ac063e31ed3ee52059d74d9460570a55d99e84",null),(0,d.A)(k,"00f17bccf1224c648f7e7a74f84441484b3c19a422",null)},44411:(a,b,c)=>{"use strict";c.d(b,{qE:()=>e});var d=c(67055);function e(a,b){if(!a)return;let c=function(a){switch(a?.toLowerCase()){case"allowed":return"ok";case"allowed_warning":case"warning":return"warning";case"rejected":case"blocked":return"blocked";default:return}}(a.status),d="number"==typeof a.resetsAt;if((void 0===a.status||void 0!==c)&&(void 0!==c||d))return{status:c??"ok",windowType:a.rateLimitType??"unknown",resetsAt:d?a.resetsAt:null,capturedAt:b}}d.Ik({status:d.k5(["ok","warning","blocked"]),windowType:d.Yj(),resetsAt:d.ai().nullable(),capturedAt:d.ai()})},44850:(a,b,c)=>{"use strict";c.d(b,{OX:()=>n,Nx:()=>q});var d=c(79241),e=c(95310),f=c(92958);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}`)}}function j(a){return a.toLowerCase().replace(/\[bot\]$/,"")}let k=/\b(out of scope|follow[- ]?up|separate pr|different pr|unrelated|won'?t fix|nevermind|never mind|ignore this)\b/i,l=/\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 m(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 n(a,b=(0,e.Lf)()){return b.select().from(f.reviewFeedbackItems).where((0,d.eq)(f.reviewFeedbackItems.jobId,a)).all()}let o={maxItemsPerSweep:3,maxAttemptsPerItem:2};async function p(a,b,c){var d;let e=(d=b.id,`<!-- drydock:review-feedback:${d} -->`),f=`${c}
3
-
4
- ${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 q(a,b,c){let h=c.db??(0,e.Lf)(),i=c.budgets??o,n={processed:0,resolved:0,flagged:0,rejected:0,failed:0,skipped:0},q=await c.forge.listReviewThreads(b),r=0;for(let o of q){var s;if(o.isResolved){n.skipped++;continue}let q=o.comments[0];if(!q||!function(a,b,c={}){let d=a.toLowerCase();if(c.isBot||d.endsWith("[bot]")){let c=j(a);return!b.ignoredBots.some(a=>j(a)===c)&&b.trustedBots.some(a=>j(a)===c)}return!b.ignoredBots.some(a=>a.toLowerCase()===d)&&b.trustedReviewers.some(a=>a.toLowerCase()===d)}(q.author,c.gate,{isBot:q.authorIsBot})){n.skipped++;continue}let t=function(a){let b=a.trim();return k.test(b)?"out_of_scope":l.test(b)?"actionable":b.includes("?")?"question":"actionable"}(q.body),u=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:o.id,reviewer:q.author,classification:t},h);if(s=u.status,g.includes(s)){n.skipped++;continue}if("in_progress"===u.status&&(u=m(u.id,"queued",{},h)),"pending"===u.status)try{await c.forge.reactToReviewComment(q.id,"EYES")}catch{}if("pending"===u.status){if("question"===t){u=m(u.id,"flagged",{},h),await p(c.forge,o,"Drydock: this looks like a question rather than a change request, so it's flagged for a human reviewer."),n.flagged++,n.processed++;continue}if("out_of_scope"===t){u=m(u.id,"rejected",{},h),await p(c.forge,o,"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(o.id),n.rejected++,n.processed++;continue}u=m(u.id,"queued",{},h)}if("queued"===u.status){let a;if(r>=i.maxItemsPerSweep)continue;if(u.attempts>=i.maxAttemptsPerItem){u=m(u.id,"flagged",{},h),await p(c.forge,o,`Drydock: could not resolve this after ${u.attempts} attempt(s); flagging for a human.`),n.flagged++,n.processed++;continue}r++,u=m(u.id,"in_progress",{},h),c.includeProgressReplies&&await p(c.forge,o,"Drydock: working on this now…");try{a=await c.applyFeedback(u,o)}catch(b){a={ok:!1,detail:b instanceof Error?b.message:String(b)}}n.processed++,a.ok?(m(u.id,"resolved",{detail:a.detail},h),await p(c.forge,o,"Drydock: applied this change and pushed a commit. ✅"),await c.forge.resolveReviewThread(o.id),n.resolved++):u.attempts>=i.maxAttemptsPerItem?(m(u.id,"failed",{detail:a.detail},h),await p(c.forge,o,`Drydock: could not apply this automatically (${a.detail??"no change produced"}); flagging for a human.`),n.failed++):m(u.id,"queued",{detail:a.detail},h)}}return n}},46553:(a,b,c)=>{"use strict";c.d(b,{t:()=>m,d:()=>n});var d=c(27905),e=c(39571),f=c(26811),g=c(75244),h=c(38048),i=c(35924);function j(a){return"error"===a?"assertive":"polite"}var k=c(5270);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))})]})}},46609:(a,b,c)=>{"use strict";c.d(b,{DB:()=>m,iC:()=>k,z8:()=>l});var d=c(79241),e=c(67055),f=c(95310),g=c(92958);let h="credential_watchdog",i=e.Ik({target:e.Yj(),label:e.Yj(),message:e.Yj()}),j=e.Ik({checkedAt:e.ai(),failures:e.YO(i)});function k(a=(0,f.Lf)()){let b=a.select().from(g.settings).where((0,d.eq)(g.settings.key,h)).get();if(b)try{return j.parse(JSON.parse(b.value))}catch{return}}function l(a,b=(0,f.Lf)()){let c=JSON.stringify(a);b.insert(g.settings).values({key:h,value:c}).onConflictDoUpdate({target:g.settings.key,set:{value:c}}).run()}function m(a=(0,f.Lf)()){return k(a)?.failures??[]}},47601:(a,b,c)=>{"use strict";c.d(b,{Q8:()=>f,cg:()=>d,jL:()=>e});let d="github";function e(a){return"github"===a||"gitlab"===a}class f extends Error{}},48036:(a,b,c)=>{"use strict";c.d(b,{Pe:()=>g,dj:()=>h});var d=c(97496),e=c(2025),f=c(64537);function g(a,b=(0,e.Lf)(),c){let h=[];return a&&h.push((0,d.eq)(f.adrs.status,a)),void 0!==c&&h.push((0,d.eq)(f.adrs.repoId,c)),(h.length?b.select().from(f.adrs).where((0,d.Uo)(...h)).all():b.select().from(f.adrs).all()).sort((a,b)=>b.createdAt-a.createdAt)}function h(a=(0,e.Lf)()){return a.select().from(f.adrs).where((0,d.eq)(f.adrs.status,"pending_review")).all().length}},50186:(a,b,c)=>{"use strict";c.d(b,{CY:()=>w,Fg:()=>z,GX:()=>s,NV:()=>y,RC:()=>x,VK:()=>p,c1:()=>v,mU:()=>A,sp:()=>q,ts:()=>o,xt:()=>u});var d=c(79241),e=c(80179),f=c(61774),g=c(6012),h=c(95310),i=c(74929),j=c(92958),k=c(67806),l=c(20200);let m={color:"1f6feb",description:"Queued for processing by Drydock"};function n(a,b){let c=(0,i.L8)(a,b);if(!c)throw Error(`repo ${a} not found`);return c}function o(a,b=(0,h.Lf)()){return b.select().from(j.issues).where((0,d.eq)(j.issues.repoId,a)).orderBy((0,e.Y)(j.issues.priority),(0,e.Y)(j.issues.number)).all()}function p(a,b,c=(0,h.Lf)()){let e=c.select().from(j.issues).where((0,d.eq)(j.issues.repoId,a)).all(),g=new Map(e.map(a=>[a.number,a])),i=Math.floor(Date.now()/1e3),k=c.select({value:(0,f.T9)(j.issues.priority)}).from(j.issues).where((0,d.eq)(j.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=g.get(e.number);f?c.update(j.issues).set({title:e.title,labels:b,state:"open",syncedAt:i}).where((0,d.eq)(j.issues.id,f.id)).run():c.insert(j.issues).values({repoId:a,number:e.number,title:e.title,labels:b,state:"open",priority:l++,syncedAt:i}).run()}let n=e.filter(a=>!m.has(a.number)).map(a=>a.id);n.length>0&&c.delete(j.issues).where((0,d.RV)(j.issues.id,n)).run()}function q(a,b,c,e,f=(0,h.Lf)()){let g,i=f.select().from(j.issues).where((0,d.Uo)((0,d.eq)(j.issues.repoId,a),(0,d.eq)(j.issues.number,b))).get();if(!i)return;try{let a=JSON.parse(i.labels);g=Array.isArray(a)?a:[]}catch{g=[]}let k=[...g];for(let a of c)k.includes(a)||k.push(a);let l=new Set(e),m=k.filter(a=>!l.has(a));f.update(j.issues).set({labels:JSON.stringify(m)}).where((0,d.eq)(j.issues.id,i.id)).run()}function r(a,b,c,d,e=(0,h.Lf)()){q(a,b,d?[c]:[],d?[]:[c],e)}async function s(a,b=(0,h.Lf)()){let c=n(a,b);return p(a,await (0,k.Ie)(c).listAllIssues(),b),o(a,b)}function t(a,b,c,e){e.update(j.issues).set({modelOverride:c.model??null,agentOverride:c.agent??null}).where((0,d.Uo)((0,d.eq)(j.issues.repoId,a),(0,d.eq)(j.issues.number,b))).run()}async function u(a,b,c={},d=(0,h.Lf)()){let e=n(a,d);if(void 0!==c.model&&!(0,l.WM)(c.model))throw Error(`unknown model id: ${c.model}`);if(void 0!==c.agent&&!(0,g.TU)(c.agent))throw Error(`unknown agent: ${c.agent}`);let f=(0,k.Ie)(e);return await f.ensureLabel(e.queueLabel,m),await f.addLabels(b,[e.queueLabel]),r(a,b,e.queueLabel,!0,d),t(a,b,c,d),o(a,d)}async function v(a,b,c=(0,h.Lf)()){let d=n(a,c);return await (0,k.Ie)(d).removeLabels(b,[d.queueLabel]),r(a,b,d.queueLabel,!1,c),t(a,b,{},c),o(a,c)}async function w(a,b,c=(0,h.Lf)()){let d=n(a,c);if(0===b.length)return o(a,c);let e=(0,k.Ie)(d);for(let f of(await e.ensureLabel(d.queueLabel,m),b))await e.addLabels(f,[d.queueLabel]),r(a,f,d.queueLabel,!0,c),t(a,f,{},c);return o(a,c)}async function x(a,b,c=(0,h.Lf)()){let d=n(a,c);if(0===b.length)return o(a,c);let e=(0,k.Ie)(d);for(let f of b)await e.removeLabels(f,[d.queueLabel]),r(a,f,d.queueLabel,!1,c),t(a,f,{},c);return o(a,c)}async function y(a,b,c,d=(0,h.Lf)()){if(0===b.length)return o(a,d);for(let e of b)await z(a,e,[c],[],d);return o(a,d)}async function z(a,b,c,d,e=(0,h.Lf)()){let f=n(a,e),g=(0,k.Ie)(f);c.includes(f.queueLabel)&&await g.ensureLabel(f.queueLabel,m),c.length&&await g.addLabels(b,c),d.length&&await g.removeLabels(b,d),q(a,b,c,d,e)}function A(a,b,c=(0,h.Lf)()){c.transaction(c=>{b.forEach((b,e)=>{c.update(j.issues).set({priority:e}).where((0,d.Uo)((0,d.eq)(j.issues.repoId,a),(0,d.eq)(j.issues.number,b))).run()})})}},51413:(a,b,c)=>{"use strict";c.d(b,{l:()=>j});var d=c(27905),e=c(38048),f=c(35924),g=c(5270);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=(0,f.useId)(),z=()=>{c?c(!1):b?.()};if((0,f.useRef)(z).current=z,!u)return null;let A=null!=l?y:void 0,B=k??A,C=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:z}),(0,d.jsx)("div",{ref:t,role:"dialog","aria-modal":"true","aria-labelledby":B,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:C?(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:A,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:z,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})]})})]})}},51541:(a,b,c)=>{"use strict";c.d(b,{M:()=>j,t:()=>g});var d=c(16680);function e(a,b){return 401===a||403===a?"auth":402===a?"billing":429===a?/\b(?:free|daily|quota)\b/i.test(b)?"usage_limit":"rate_limit":408===a||a>=500&&a<600?"overloaded":void 0}function f(a){return(0,d.f)(a.trim()).slice(0,300)}function g(a){let b=e(a.status,a.body);if(!b)return;let c={agent:"openrouter",kind:b,rawSnippet:f(`OpenRouter HTTP ${a.status}: ${a.body}`)};return void 0!==a.retryAfterMs&&("rate_limit"===b||"overloaded"===b)&&(c.retryAfterMs=a.retryAfterMs),c}let h=/openrouter http (\d{3})/i,i=/retry[- ]?after[:\s]+(\d+)\s*(?:s\b|sec|second)/i;function j(a){if(0===a.exitCode&&!a.resultIsError)return;let b=[a.resultText,a.stderr].filter(Boolean).join("\n"),c=b.match(h)?.[1];if(!c)return;let d=e(Number(c),b);if(!d)return;let g={agent:"openrouter",kind:d,rawSnippet:f(b.split("\n").find(a=>h.test(a))??b)},j=b.match(i)?.[1];return j&&("rate_limit"===d||"overloaded"===d)&&(g.retryAfterMs=1e3*Number(j)),g}},51769:(a,b,c)=>{"use strict";c.d(b,{g:()=>e,gT:()=>i,sM:()=>h});var d=c(47601);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,e;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&&(""===(e=c.hostname.trim().toLowerCase().replace(/^\[/,"").replace(/\]$/,""))||"localhost"===e||e.endsWith(".localhost")||(e.includes(":")?function(a){let b=a.toLowerCase();if("::1"===b||"::"===b)return!0;let c=b.match(/^::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/);if(c?.[1])return g(c[1]);let d=b.match(/^::ffff:(?:([0-9a-f]{1,4}):)?([0-9a-f]{1,4})$/);if(d?.[2]){let a=Number.parseInt(d[1]??"0",16),b=Number.parseInt(d[2],16);return g(`${a>>8}.${255&a}.${b>>8}.${255&b}`)}return!!(b.startsWith("fe80")||/^f[cd]/.test(b))}(e):!!f(e)&&g(e))))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}},52166:(a,b,c)=>{"use strict";function d(a){let b=process.env.DRYDOCK_OPENROUTER_API_KEY?.trim();return b||a.openrouterApiKey}c.d(b,{t:()=>d})},56634:(a,b,c)=>{"use strict";c.d(b,{Fl:()=>k,JD:()=>i,QD:()=>l});var d=c(95310),e=c(16680),f=c(41575);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(638).then(c.t.bind(c,32638,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)}}},57568:(a,b,c)=>{"use strict";c.d(b,{KO:()=>o,gJ:()=>m});var d=c(67055);let e=d.Ik({input_tokens:d.ai().optional(),output_tokens:d.ai().optional(),cache_creation_input_tokens:d.ai().optional(),cache_read_input_tokens:d.ai().optional()}).passthrough(),f=d.Ik({type:d.eu("system"),subtype:d.Yj().optional(),session_id:d.Yj().optional(),model:d.Yj().optional()}),g=d.Ik({type:d.eu("assistant"),message:d.Ik({role:d.eu("assistant"),content:d.YO(d.g1(d.Yj(),d.L5())),usage:e.optional()})}),h=d.Ik({type:d.eu("user"),message:d.Ik({role:d.eu("user"),content:d.YO(d.g1(d.Yj(),d.L5()))})}),i=d.Ik({status:d.Yj().optional(),resetsAt:d.ai().optional(),rateLimitType:d.Yj().optional()}).passthrough(),j=d.Ik({type:d.eu("rate_limit_event"),rate_limit_info:i.optional(),session_id:d.Yj().optional()}),k=d.Ik({type:d.eu("result"),subtype:d.Yj().optional(),session_id:d.Yj().optional(),is_error:d.zM().optional(),result:d.Yj().optional(),total_cost_usd:d.ai().optional(),usage:e.optional()}),l=d.gM("type",[f,g,h,j,k]);function m(a){return a instanceof Error?a.message:String(a)}function n(a){let b=[];for(let c of a)"text"===c.type&&"string"==typeof c.text?b.push({kind:"text",text:c.text}):"tool_use"===c.type?b.push({kind:"tool_use",name:String(c.name??"unknown"),id:String(c.id??""),input:c.input}):"tool_result"===c.type&&b.push({kind:"tool_result",toolUseId:String(c.tool_use_id??""),isError:!!c.is_error});return b}class o{push(a){this.buffer+=a;let b=[],c=this.buffer.indexOf("\n");for(;-1!==c;){let a=this.buffer.slice(0,c);this.buffer=this.buffer.slice(c+1);let d=this.consume(a);d&&b.push(d),c=this.buffer.indexOf("\n")}return b}flush(){let a=this.buffer;this.buffer="";let b=this.consume(a);return b?[b]:[]}consume(a){let b;try{b=function(a){var b;let c,d=a.trim();if(!d)return null;let e=JSON.parse(d);return c={type:(b=l.parse(e)).type,chunks:[],inputTokens:0,outputTokens:0,cacheCreationInputTokens:0,cacheReadInputTokens:0,isError:!1,raw:b},"system"===b.type?(c.sessionId=b.session_id,c.model=b.model):"assistant"===b.type?(c.chunks=n(b.message.content),c.inputTokens=b.message.usage?.input_tokens??0,c.outputTokens=b.message.usage?.output_tokens??0,c.cacheCreationInputTokens=b.message.usage?.cache_creation_input_tokens??0,c.cacheReadInputTokens=b.message.usage?.cache_read_input_tokens??0):"user"===b.type?c.chunks=n(b.message.content):"rate_limit_event"===b.type?(c.sessionId=b.session_id,c.rateLimitInfo=b.rate_limit_info):(c.sessionId=b.session_id,c.resultText=b.result,c.costUsd=b.total_cost_usd,c.inputTokens=b.usage?.input_tokens??0,c.outputTokens=b.usage?.output_tokens??0,c.cacheCreationInputTokens=b.usage?.cache_creation_input_tokens??0,c.cacheReadInputTokens=b.usage?.cache_read_input_tokens??0,c.isError=b.is_error??!1),c}(a)}catch(b){return this.onParseError?.({line:a.trim(),message:m(b)}),null}return b?(b.sessionId&&(this.sessionId=b.sessionId),b.model&&(this.model=b.model),b.rateLimitInfo&&(this.rateLimit=b.rateLimitInfo),"result"===b.type?(b.inputTokens>0&&(this.totalInputTokens=b.inputTokens),b.outputTokens>0&&(this.totalOutputTokens=b.outputTokens),b.cacheCreationInputTokens>0&&(this.totalCacheCreationInputTokens=b.cacheCreationInputTokens),b.cacheReadInputTokens>0&&(this.totalCacheReadInputTokens=b.cacheReadInputTokens),void 0!==b.costUsd&&(this.costUsd=b.costUsd),void 0!==b.resultText&&(this.resultText=b.resultText),this.resultIsError=b.isError):(this.totalInputTokens+=b.inputTokens,this.totalOutputTokens+=b.outputTokens,this.totalCacheCreationInputTokens+=b.cacheCreationInputTokens,this.totalCacheReadInputTokens+=b.cacheReadInputTokens),b):null}constructor(){this.buffer="",this.totalInputTokens=0,this.totalOutputTokens=0,this.totalCacheCreationInputTokens=0,this.totalCacheReadInputTokens=0,this.costUsd=0,this.resultIsError=!1}}},57807:(a,b,c)=>{"use strict";c.d(b,{Bt:()=>f});var d=c(97095),e=c(95310);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)`
5
- SELECT coalesce(sum(c), 0) AS total FROM (
6
- SELECT coalesce(sum(cost_usd), 0) AS c
7
- FROM jobs
8
- WHERE strftime('%Y-%m-%d', started_at, 'unixepoch', 'localtime') = strftime('%Y-%m-%d', 'now', 'localtime')
9
- AND started_at IS NOT NULL
10
- ${c}
11
- UNION ALL
12
- SELECT coalesce(sum(cost_usd), 0) AS c
13
- FROM one_shot_costs
14
- WHERE strftime('%Y-%m-%d', created_at, 'unixepoch', 'localtime') = strftime('%Y-%m-%d', 'now', 'localtime')
15
- ${c}
16
- )
17
- `);return g?.total??0}c(92958)},58748:(a,b,c)=>{"use strict";c.d(b,{CZ:()=>k,Dp:()=>j,PH:()=>f,RQ:()=>h,mW:()=>i});var d=c(95310),e=c(56634);async function f(a,b,c=(0,d.Lf)(),g=e.QD){a?b.active||(b.active=!0,await (0,e.JD)("cost_limit","\uD83D\uDCB8 Daily cost limit reached — new jobs are paused until the budget resets.",c,g)):b.active=!1}let g={claude:{event:"claude_limit",blocked:"⏳ Claude usage limit reached — Claude jobs are parked until the quota resets.",cleared:"▶️ Claude quota available again — parked jobs are resuming."},codex:{event:"codex_limit",blocked:"⏳ Codex usage limit reached — Codex jobs are parked until the quota resets.",cleared:"▶️ Codex capacity available again — parked jobs are resuming."},openrouter:{event:"openrouter_limit",blocked:"⏳ OpenRouter limit reached — OpenRouter jobs are parked until the window resets.",cleared:"▶️ OpenRouter available again — parked jobs are resuming."}};async function h(a,b,c,f=(0,d.Lf)(),i=e.QD){let j=g[a];if(b){if(c.active)return;c.active=!0,await (0,e.JD)(j.event,j.blocked,f,i)}else{if(!c.active)return;c.active=!1,await (0,e.JD)(j.event,j.cleared,f,i)}}async function i(a,b,c=(0,d.Lf)(),f=e.QD){if(a.length>0){if(b.active)return;b.active=!0;let d=a.map(a=>`${a.label}: ${a.message}`).join("; ");await (0,e.JD)("auth_expired",`🔑 Credential check failed — new jobs are paused until auth is restored. ${d}`,c,f)}else{if(!b.active)return;b.active=!1,await (0,e.JD)("auth_expired","\uD83D\uDD11 Credentials restored — the queue is resuming.",c,f)}}async function j(a,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 k(a=(0,d.Lf)(),b=e.QD){await (0,e.JD)("automation_paused","\uD83C\uDF19 Automation draining — finishing in-flight jobs, then shutting down.",a,b)}},59144:(a,b,c)=>{"use strict";c.d(b,{MQ:()=>h,kf:()=>e,mU:()=>f,rr:()=>g});let d=/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/;function e(a){let b=d.exec(a.trim());return b?{major:Number(b[1]),minor:Number(b[2]),patch:Number(b[3]),prerelease:b[4]??null}:null}function f(a,b){var c,d;let f=e(a),g=e(b);if(!f||!g)throw Error(`cannot compare versions: "${a}" vs "${b}"`);return f.major!==g.major?f.major-g.major:f.minor!==g.minor?f.minor-g.minor:f.patch!==g.patch?f.patch-g.patch:(c=f.prerelease,c===(d=g.prerelease)?0:null===c?1:null===d||c<d?-1:1)}function g(a,b){let c=e(a);if(!c)throw Error(`cannot bump unparseable version: "${a}"`);let{major:d,minor:f,patch:g}=c;return"major"===b?`${d+1}.0.0`:"minor"===b?`${d}.${f+1}.0`:`${d}.${f}.${g+1}`}function h(a,b){return!!e(a)&&!!e(b)&&f(a,b)>0}},60618:(a,b,c)=>{"use strict";c.d(b,{AppShell:()=>d});let d=(0,c(34215).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")},65006:(a,b,c)=>{"use strict";c.d(b,{Providers:()=>g});var d=c(27905),e=c(14359),f=c(46553);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})})}},66025:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>y,dynamic:()=>w,metadata:()=>x});var d=c(87383),e=c(43636),f=c.n(e),g=c(15633),h=c.n(g),i=c(60618),j=c(39280),k=c(48036),l=c(51214),m=c(97565),n=c(54304),o=c(61408),p=c(74644),q=c(82931),r=c(87105),s=c(59144);let t=null,u=null;async function v(a){let b=a.http??r.D,c=a.repo??"NilsR0711/drydock",d=a.currentVersion??(0,q.M)(),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(18767);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,g=[],r=(0,l.Cn)({now:Math.floor(Date.now()/1e3)}),s=(0,m.Ky)({now:Math.floor(Date.now()/1e3)});try{b=(0,k.dj)(),c=(0,n.zy)().length,e=(0,p.mt)().paused,g=(0,o.DB)(),r=(0,n.nT)(),s=(0,n.MJ)()}catch{}let w=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??(0,q.M)(),latestVersion:null,releaseUrl:null}}(),x=(0,q.g)();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:w,installKind:x,credentialFailures:g,claudeUsage:r,codexUsage:s,children:a})})})})}},66542:(a,b,c)=>{"use strict";c.d(b,{m:()=>d});let d=["usage_limit","rate_limit","overloaded"]},67102:(a,b,c)=>{"use strict";c.d(b,{Cr:()=>F,YD:()=>G});var d=c(51455),e=c(48161),f=c(76760),g=c(6012),h=c(66542),i=c(95310),j=c(74929),k=c(67806),l=c(67055),m=c(16746);let n=["blocker","major","minor","nit","praise"],o=l.Ik({severity:l.k5(n),title:l.Yj().default(""),body:l.Yj().default(""),path:l.Yj().optional(),line:l.ai().int().nonnegative().optional(),suggestion:l.Yj().optional()}),p=l.Ik({summary:l.Yj().default(""),recommendation:l.k5(["approve","request_changes","comment"]),findings:l.YO(o).default([]),issueCoverage:l.Ik({met:l.YO(l.Yj()).default([]),missing:l.YO(l.Yj()).default([])}).default({met:[],missing:[]})});function q(a){return`<!-- drydock:pr-audit:${a} -->`}let r={blocker:"⛔",major:"\uD83D\uDD34",minor:"\uD83D\uDFE1",nit:"\uD83D\uDD35",praise:"\uD83C\uDF89"},s={approve:"✅ approve",request_changes:"\uD83D\uDED1 request changes",comment:"\uD83D\uDCAC comment"};function t(a){return[q(a.jobId),"",`### 🔍 Drydock PR audit (${a.agent}/${a.model}, ${a.language})`,""]}var u=c(22287),v=c(98103),w=c(16680),x=c(20200),y=c(41575),z=c(580),A=c(5501),B=c(26511),C=c(40900);async function D(a,b,c,d){if(a.listIssueComments&&a.updateIssueComment)try{let e=(await a.listIssueComments(b)).find(a=>a.body.includes(c));if(e)return await a.updateIssueComment(b,e.id,d),"updated"}catch(a){(0,v.v)(`[pr-audit] comment upsert degraded to a fresh post on #${b}`,a)}return await a.commentIssue(b,d),"created"}async function E(a,b){try{return await a()}catch(a){return(0,v.v)("[pr-audit] best-effort read failed, using fallback",a),b}}async function F(a){var b;let c,j,k,l,o,{job:F,prNumber:G,repo:H,forge:I,db:J}=a,K=(k=(j=(0,g.TU)(H.agent)?H.agent:g.kz)===H.agent,l=(0,g.TU)(H.prAuditAgent)?H.prAuditAgent:j,o=H.prAuditModel??(k&&l===j?H.defaultModel:(0,x.VJ)(l)),{agent:l,model:o,language:H.prAuditLanguage||"en"}),L={jobId:F.id,agent:K.agent,model:K.model,language:K.language};try{let j;if((0,y.mt)(J).paused)return(0,A.yM)(F.id,"pr_audit_skipped",{reason:"paused"},J),null;(0,A.yM)(F.id,"pr_audit_started",{...L,prNumber:G},J);let k=await E(()=>I.prDiff(G),"");if(!k.trim())return(0,A.yM)(F.id,"pr_audit_failed",{reason:"empty diff",prNumber:G},J),null;let[l,o]=await Promise.all([E(()=>I.prChecks(G),[]),E(()=>I.viewIssue(F.issueNumber),null)]),v=(0,u.t0)(H.id,F.issueNumber,J),x={issueNumber:F.issueNumber,issueTitle:o?.title??`Issue #${F.issueNumber}`,issueBody:o?.body??"",subtasks:v.map(a=>({ordinal:a.ordinal,title:a.title})),prNumber:G,branch:F.branch,diff:k,checks:l.map(a=>({name:a.name,state:a.state})),language:K.language},M=a.generate;if(!M){let j;c=await (0,d.mkdtemp)((0,f.join)((0,e.tmpdir)(),"drydock-pr-audit-"));let k=(0,g.X$)(K.agent);j=(b={provider:k,command:(0,z.m)(k,J),model:K.model,cwd:c,repoId:H.id,db:J,runner:a.runner}).timeoutMs??36e4,M=async a=>{let c,d,e,f;try{var g,k;let f,h,i;({text:c,exitCode:d,stderr:e}=await (0,B.D)({provider:b.provider,command:b.command,model:b.model,cwd:b.cwd,prompt:(f=(0,m.xv)(a.issueBody.trim(),6e3),h=(0,m.xv)(a.diff.trim(),48e3),i=function(a){let b=a.trim();if(!b)return"English";try{return new Intl.DisplayNames(["en"],{type:"language"}).of(b)??b}catch{return b}}(a.language),["You are performing a READ-ONLY pull request audit. Do NOT edit files, run\ncommands, or make any changes. Review the full diff like a senior code\nreviewer (in the spirit of Bugbot/CodeRabbit) across these dimensions:\n\n1. Correctness — logic bugs, race conditions, error handling gaps\n2. Security — injection, authz, secrets, unsafe defaults (no CVE speculation)\n3. Tests — missing coverage for changed behavior\n4. API / compatibility — breaking changes, migration needs\n5. Maintainability — complexity, naming, duplication\n6. Issue fit — does the diff actually address the linked issue and subtasks\n",`## Issue #${a.issueNumber}: ${a.issueTitle}`,"",f,"\n## Subtasks\n",0===(g=a.subtasks).length?"This issue has no tracked subtasks; judge the issue as a whole.":g.map(a=>`- [ordinal ${a.ordinal}] ${a.title}`).join("\n"),"",`## Pull request #${a.prNumber}${a.branch?` (branch ${a.branch})`:""}`,"\n## CI results\n",0===(k=a.checks).length?"No CI results available.":k.map(a=>`- ${a.name}: ${a.state}`).join("\n"),"\n## Diff\n\n```diff",h,'```\n\n## Response format\n\nRespond with ONLY a JSON object (no prose outside it) of the shape:\n\n{"summary": "<one or two sentence overall assessment>",\n "recommendation": "approve"|"request_changes"|"comment",\n "findings": [{"severity": "blocker"|"major"|"minor"|"nit"|"praise",\n "title": "<short title>", "body": "<explanation>",\n "path": "<file path, optional>", "line": <number, optional>,\n "suggestion": "<suggested fix, optional>"}],\n "issueCoverage": {"met": ["<criterion>"], "missing": ["<criterion>"]}}\n\nReport only findings you are confident about; an empty findings list is a\nvalid answer for a clean diff. This review is advisory: do not gate, merge,\nor approve anything yourself.\n\nWrite all human-readable text (summary, titles, bodies, suggestions,',`coverage entries) in ${i}.`].join("\n")),repoId:b.repoId,type:"pr_audit",timeoutMs:j,runner:b.runner,db:b.db}))}catch{return null}if(0!==d){let a=b.provider.classifyFailure?.({exitCode:d,stderr:e,resultText:c});if(a&&h.m.includes(a.kind)){let c=b.db??(0,i.Lf)();if((0,C.$q)(b.provider.id,c))throw(0,C.H_)(a,c),new C.vu(a)}return null}let l=c.match(/\{[\s\S]*\}/);if(!l)return null;try{f=JSON.parse(l[0])}catch{return null}let n=p.safeParse(f);return n.success?n.data:null}}try{j=await M(x)}catch(a){if(a instanceof C.vu)return(0,A.yM)(F.id,"pr_audit_failed",{reason:"provider limit",kind:a.info.kind,agent:a.info.agent},J),null;throw a}let N=q(F.id);if(!j){let a,b=((a=t(L)).push("The audit run failed: the agent returned no parseable review (timeout, non-zero exit, or invalid JSON).",""),a.push("Job state is unchanged; re-run the audit from the job page to retry."),a.join("\n"));return await D(I,F.issueNumber,N,(0,w.f)(b)),(0,A.yM)(F.id,"pr_audit_failed",{reason:"unparseable output",prNumber:G},J),null}let O=(0,w.f)(function(a,b){let c=t(b);c.push(`**Recommendation:** ${s[a.recommendation]}`,""),a.summary.trim()&&c.push(a.summary.trim(),"");let d=new Map(n.map((a,b)=>[a,b])),e=[...a.findings].sort((a,b)=>(d.get(a.severity)??99)-(d.get(b.severity)??99));if(0===e.length)c.push("No findings — the diff looks clean across all review dimensions.","");else{for(let a of(c.push(`#### Findings (${e.length})`,""),e.slice(0,30)))c.push(function(a){let b=a.path?` — \`${a.path}${void 0!==a.line?`:${a.line}`:""}\``:"",c=[`- ${r[a.severity]} **[${a.severity}] ${a.title}**${b}`];return a.body.trim()&&c.push(` ${a.body.trim().replace(/\n/g,"\n ")}`),a.suggestion?.trim()&&c.push(` Suggested fix: ${a.suggestion.trim().replace(/\n/g,"\n ")}`),c.join("\n")}(a));let a=e.length-30;a>0&&c.push("",`_…and ${a} more finding${1===a?"":"s"} omitted._`),c.push("")}let{met:f,missing:g}=a.issueCoverage;if(f.length>0||g.length>0){for(let a of(c.push("#### Issue coverage",""),f))c.push(`- [x] ${a}`);for(let a of g)c.push(`- [ ] ${a}`);c.push("")}return b.truncated&&(c.push("_Note: the diff and/or issue body was truncated to fit the audit context;_"),c.push("_this is a partial review of an oversized PR._","")),c.push("---"),c.push("_This audit is advisory only; it never merges, blocks, or edits anything._"),c.join("\n")}(j,{...L,truncated:x.diff.trim().length>48e3||x.issueBody.trim().length>6e3}));return await D(I,F.issueNumber,N,O),H.prAuditPostOnPr&&I.commentPr&&await E(()=>I.commentPr?.(G,O)??Promise.resolve(),void 0),(0,A.yM)(F.id,"pr_audit_completed",{recommendation:j.recommendation,findings:j.findings.length,blockers:j.findings.filter(a=>"blocker"===a.severity).length,prNumber:G},J),j}catch(a){return(0,v.v)(`[pr-audit] audit pass failed for ${H.name}#${F.issueNumber}`,a),(0,A.yM)(F.id,"pr_audit_failed",{reason:a instanceof Error?a.message.slice(0,300):String(a)},J),null}finally{if(c)try{await (0,d.rm)(c,{recursive:!0,force:!0})}catch{}}}function G(a,b=(0,i.Lf)(),c={}){let d=(0,A.ax)(a,b);if(!d)throw Error(`job ${a} not found`);if(null==d.prNumber)throw Error("This job has no PR to audit yet.");let e=(0,j.L8)(d.repoId,b);if(!e)throw Error(`repo ${d.repoId} not found`);let f=c.forge??(0,k.Ie)(e),g=F({job:d,prNumber:d.prNumber,repo:e,forge:f,db:b,generate:c.generate});return{job:d,prNumber:d.prNumber,done:g}}},67806:(a,b,c)=>{"use strict";c.d(b,{Ie:()=>N});var d=c(67055),e=c(26370);class f{get(a){return this.entries.get(a)}set(a,b,c){this.entries.set(a,{etag:b,body:c})}delete(a){this.entries.delete(a)}constructor(){this.entries=new Map}}let g=new f;function h(a){let b=a.replace(/\r\n/g,"\n"),c=b.lastIndexOf("\nHTTP/"),d=c>=0?c+1:b.startsWith("HTTP/")?0:-1;if(d<0)return{status:null,headers:{},body:a};let e=b.slice(d),f=e.indexOf("\n\n"),g=f>=0?e.slice(0,f):e,h=f>=0?e.slice(f+2):"",i=g.split("\n"),j=(i.shift()??"").match(/^HTTP\/\S+\s+(\d+)/),k=j?Number(j[1]):null,l={};for(let a of i){let b=a.indexOf(":");b<=0||(l[a.slice(0,b).trim().toLowerCase()]=a.slice(b+1).trim())}return{status:k,headers:l,body:h}}function i(a){if(!a)return null;for(let b of a.split(",")){let a=b.match(/<([^>]+)>\s*;\s*rel="?next"?/);if(a?.[1])return a[1]}return null}var j=c(11430),k=c(6402);let l=d.Ik({number:d.ai(),title:d.Yj(),labels:d.YO(d.Ik({name:d.Yj()})).default([]),user:d.Ik({login:d.Yj()}).nullish(),author_association:d.Yj().nullish(),pull_request:d.L5().optional()}).transform(a=>({number:a.number,title:a.title,labels:a.labels,author:a.user?.login??null,authorAssociation:a.author_association??null,isPullRequest:void 0!==a.pull_request})),m=d.Ik({resources:d.g1(d.Yj(),d.Ik({limit:d.ai(),remaining:d.ai(),reset:d.ai()}))}),n=d.Ik({number:d.ai(),title:d.Yj(),body:d.Yj().default(""),state:d.Yj().default("open"),labels:d.YO(d.Ik({name:d.Yj()})).default([]),comments:d.YO(d.Ik({author:d.Ik({login:d.Yj()}).default({login:""}),body:d.Yj().default(""),createdAt:d.Yj().default("")})).default([])}),o=d.Ik({name:d.Yj(),state:d.Yj(),bucket:d.Yj().optional()}),p=d.Ik({data:d.Ik({repository:d.Ik({pullRequest:d.Ik({reviewThreads:d.Ik({nodes:d.YO(d.Ik({id:d.Yj(),isResolved:d.zM().default(!1),isOutdated:d.zM().default(!1),path:d.Yj().nullish(),line:d.ai().nullish(),comments:d.Ik({nodes:d.YO(d.Ik({id:d.Yj(),databaseId:d.ai().nullish(),body:d.Yj().default(""),author:d.Ik({login:d.Yj(),__typename:d.Yj().nullish()}).nullish()}))})}))})}).nullish()})})});class q extends Error{}function r(a,b){return`${a}=${b}`}function s(a){let b;try{b=JSON.parse(a||"[]")}catch{throw new q("unexpected gh output: response body was not valid JSON")}if(!Array.isArray(b))throw new q("unexpected gh output: expected a JSON array");return b}class t{constructor(a,b=e.Sx,c=k.og,d=g){this.cwd=a,this.run=b,this.governor=c,this.etags=d}gate(a="core"){let b=this.governor.decide(a,(0,j.u)());if(!b.allowed)throw new k.OE(b.reason,a,b.retryAfterMs)}async exec(a,b="core"){this.gate(b);let c=await this.run("gh",a,this.cwd);return 0!==c.exitCode&&/rate limit|429 too many/i.test(c.stderr)&&this.governor.note429(b),c}async refreshRateLimit(){let a,b=await this.run("gh",["api","rate_limit"],this.cwd);if(0===b.exitCode){try{a=m.parse(JSON.parse(b.stdout||"{}"))}catch{return}for(let b of["core","graphql","search"]){let c=a.resources[b];c&&this.governor.observe(b,c)}}}async conditionalList(a,b){this.gate("core");let c=this.etags.get(a),d=["api",`repos/{owner}/{repo}/issues?${b}`,"--include"];c&&d.push("-H",`If-None-Match: ${c.etag}`);let e=await this.run("gh",d,this.cwd),f=this.checkListResponse(e,h(e.stdout));if(304===f.status&&c)return this.toGhIssues(s(c.body));let g=[...s(f.body)],j=i(f.headers.link),k=Number(new URLSearchParams(b).get("per_page")??"30"),l=!j&&Number.isFinite(k)&&g.length<k,m=1;for(;j&&m<100;){this.gate("core");let a=await this.run("gh",["api",j,"--include"],this.cwd),b=this.checkListResponse(a,h(a.stdout));g.push(...s(b.body)),j=i(b.headers.link),m++}let n=f.headers.etag;return n&&l?this.etags.set(a,n,JSON.stringify(g)):this.etags.delete(a),this.toGhIssues(g)}checkListResponse(a,b){var c,d;let e=(0,k.bR)(b.headers);if(e&&this.governor.observe(e.resource,e.snapshot),304===b.status)return b;if(c=b.status,d=b.headers,429===c||403===c&&"0"===d["x-ratelimit-remaining"]){let a=Number(b.headers["x-ratelimit-reset"]);throw this.governor.note429("core",Number.isFinite(a)?a:void 0),new q(`gh api rate limited (status ${b.status})`)}if(200!==b.status)throw new q(a.stderr||`gh api failed (status ${b.status??"unknown"})`);return b}toGhIssues(a){let b=d.YO(l).safeParse(a);if(!b.success)throw new q(`unexpected gh output: ${b.error.message}`);return b.data.filter(a=>!a.isPullRequest).map(({isPullRequest:a,...b})=>b)}async listIssues(a){let b=`state=open&per_page=100&labels=${encodeURIComponent(a)}`;return this.conditionalList(`${this.cwd}::label:${a}`,b)}async listAllIssues(){return this.conditionalList(`${this.cwd}::all`,"state=open&per_page=100")}async viewIssue(a){let b=await this.exec(["issue","view",String(a),"--json","number,title,body,state,labels,comments"]);if(0!==b.exitCode)throw new q(b.stderr||"gh issue view failed");let c=n.safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);let d=c.data;return{number:d.number,title:d.title,body:d.body,state:d.state,labels:d.labels.map(a=>a.name),comments:d.comments.map(a=>({author:a.author.login,body:a.body,createdAt:a.createdAt}))}}async editIssue(a,b){let c=["issue","edit",String(a)];if(void 0!==b.title&&c.push(r("--title",b.title)),void 0!==b.body&&c.push(r("--body",b.body)),3===c.length)return;let d=await this.exec(c);if(0!==d.exitCode)throw new q(d.stderr||"gh issue edit failed")}async ensureLabel(a,b={}){let c=await this.exec(["label","list","--json","name","--limit","200"]),e=c.stdout.trim();if(0===c.exitCode&&e)try{let b=d.YO(d.Ik({name:d.Yj()})).safeParse(JSON.parse(e));if(b.success&&b.data.some(b=>b.name===a))return}catch{}let f=["label","create"];b.color&&f.push(r("--color",b.color)),b.description&&f.push(r("--description",b.description)),f.push("--",a);let g=await this.exec(f);if(0!==g.exitCode&&!/already exists/i.test(g.stderr))throw new q(g.stderr||"gh label create failed")}async addLabels(a,b){let c=await this.exec(["issue","edit",String(a),r("--add-label",b.join(","))]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue edit failed")}async removeLabels(a,b){let c=await this.exec(["issue","edit",String(a),r("--remove-label",b.join(","))]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue edit failed")}async closeIssue(a){let b=await this.exec(["issue","close",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh issue close failed")}async reopenIssue(a){let b=await this.exec(["issue","reopen",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh issue reopen failed")}async prChecks(a){let b=await this.exec(["pr","checks",String(a),"--json","name,state,bucket"]),c=b.stdout.trim();if(!c){if(0!==b.exitCode)throw new q(b.stderr||"gh pr checks failed");return[]}let e=d.YO(o).safeParse(JSON.parse(c));if(!e.success)throw new q(`unexpected gh output: ${e.error.message}`);return e.data}async prHeadSha(a){let b=await this.exec(["pr","view",String(a),"--json","headRefOid"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr view failed");let c=d.Ik({headRefOid:d.Yj()}).safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);return c.data.headRefOid}async prMergeCommitSha(a){let b=await this.exec(["pr","view",String(a),"--json","mergeCommit"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr view failed");let c=d.Ik({mergeCommit:d.Ik({oid:d.Yj()}).nullish()}).safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);return c.data.mergeCommit?.oid??null}async commentIssue(a,b){let c=await this.exec(["issue","comment",String(a),r("--body",b)]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue comment failed")}async listIssueComments(a){let b,c=await this.exec(["issue","view",String(a),"--json","comments"]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue view failed");try{b=JSON.parse(c.stdout||"{}")}catch{throw new q(`unexpected gh output: ${c.stdout.slice(0,200)}`)}let e=d.Ik({comments:d.YO(d.Ik({id:d.Yj(),body:d.Yj().default("")})).default([])}).safeParse(b);if(!e.success)throw new q(`unexpected gh output: ${e.error.message}`);return e.data.comments.map(a=>({id:a.id,body:a.body}))}async updateIssueComment(a,b,c){let d=await this.exec(["api","graphql","-F",`id=${b}`,"-f",`body=${c}`,"-f","query=mutation($id:ID!,$body:String!){updateIssueComment(input:{id:$id,body:$body}){issueComment{id}}}"],"graphql");if(0!==d.exitCode)throw new q(d.stderr||"gh update issue comment failed")}async commentPr(a,b){let c=await this.exec(["pr","comment",String(a),r("--body",b)]);if(0!==c.exitCode)throw new q(c.stderr||"gh pr comment failed")}async createIssue(a,b){let c=await this.exec(["issue","create",r("--title",a),r("--body",b)]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue create failed");let d=c.stdout.match(/\/issues\/(\d+)/);if(!d?.[1])throw new q(`could not parse issue number from: ${c.stdout}`);return Number(d[1])}async latestFailedRunId(a){let b,c,e=await this.run("gh",["pr","view",String(a),"--json","headRefName"],this.cwd);if(0!==e.exitCode)return null;try{b=d.Ik({headRefName:d.Yj()}).parse(JSON.parse(e.stdout||"{}")).headRefName}catch{return null}if(!b)return null;let f=await this.run("gh",["run","list","--branch",b,"--json","databaseId,conclusion","--limit","20"],this.cwd);if(0!==f.exitCode)return null;try{c=d.YO(d.Ik({databaseId:d.ai(),conclusion:d.Yj().default("")})).parse(JSON.parse(f.stdout||"[]"))}catch{return null}return c.find(a=>"failure"===a.conclusion)?.databaseId??null}async failedRunLog(a){if(!this.governor.decide("core",(0,j.u)()).allowed)return"";let b=await this.latestFailedRunId(a);if(null===b)return"";let c=await this.run("gh",["run","view",String(b),"--log-failed"],this.cwd);return 0!==c.exitCode?"":c.stdout.slice(-8e3)}async reRunFailedChecks(a){if(!this.governor.decide("core",(0,j.u)()).allowed)return!1;let b=await this.latestFailedRunId(a);return null!==b&&0===(await this.run("gh",["run","rerun",String(b),"--failed"],this.cwd)).exitCode}async prDiff(a){if(!this.governor.decide("core",(0,j.u)()).allowed)return"";let b=await this.run("gh",["pr","diff",String(a)],this.cwd);return 0!==b.exitCode?"":b.stdout}async mergePr(a){let b=await this.exec(["pr","merge",String(a),"--squash","--auto"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr merge failed")}async createPr(a){let b=await this.exec(["pr","create",r("--head",a.head),r("--base",a.base),r("--title",a.title),r("--body",a.body)]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr create failed");let c=b.stdout.match(/\/pull\/(\d+)/);if(!c?.[1])throw new q(`could not parse PR number from: ${b.stdout}`);return Number(c[1])}async deleteBranch(a){let b=a.split("/").map(encodeURIComponent).join("/"),c=await this.exec(["api","-X","DELETE",`repos/{owner}/{repo}/git/refs/heads/${b}`]);if(0!==c.exitCode&&!/reference does not exist|HTTP 404/i.test(c.stderr))throw new q(c.stderr||"gh branch delete failed")}async prMergeState(a){let b=await this.exec(["pr","view",String(a),"--json","mergeable,mergeStateStatus"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr view failed");let c=d.Ik({mergeable:d.Yj().default(""),mergeStateStatus:d.Yj().default("")}).safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);let{mergeable:e,mergeStateStatus:f}=c.data;return"CONFLICTING"===e||"DIRTY"===f?"conflicted":"BEHIND"===f?"behind":"MERGEABLE"===e?"clean":"unknown"}async updatePrBranch(a){let b=await this.exec(["pr","update-branch",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr update-branch failed")}async listReleases(){let a=await this.exec(["release","list","--json","tagName,createdAt","--limit","100"]);if(0!==a.exitCode)throw new q(a.stderr||"gh release list failed");let b=d.YO(d.Ik({tagName:d.Yj(),createdAt:d.Yj().default("")})).safeParse(JSON.parse(a.stdout||"[]"));if(!b.success)throw new q(`unexpected gh output: ${b.error.message}`);return b.data}async listMergedPrs(a=100){let b=await this.exec(["pr","list","--state","merged","--json","number,title,mergedAt,labels","--limit",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr list failed");let c=d.YO(d.Ik({number:d.ai(),title:d.Yj().default(""),mergedAt:d.Yj().default(""),labels:d.YO(d.Ik({name:d.Yj()})).default([])})).safeParse(JSON.parse(b.stdout||"[]"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);return c.data.map(a=>({number:a.number,title:a.title,mergedAt:a.mergedAt,labels:a.labels.map(a=>a.name)}))}async createRelease(a){let b=await this.exec(["release","create",a.tag,r("--title",a.title),r("--notes",a.notes),r("--target",a.target)]);if(0!==b.exitCode)throw new q(b.stderr||"gh release create failed")}async repoSlug(){if(this.slug)return this.slug;let a=await this.exec(["repo","view","--json","nameWithOwner"]);if(0!==a.exitCode)throw new q(a.stderr||"gh repo view failed");let b=d.Ik({nameWithOwner:d.Yj()}).safeParse(JSON.parse(a.stdout||"{}"));if(!b.success)throw new q(`unexpected gh output: ${b.error.message}`);let[c,e]=b.data.nameWithOwner.split("/");if(!c||!e)throw new q(`unexpected repo slug: ${b.data.nameWithOwner}`);return this.slug={owner:c,name:e},this.slug}async listReviewThreads(a){let{owner:b,name:c}=await this.repoSlug(),d=await this.exec(["api","graphql","-F",`owner=${b}`,"-F",`name=${c}`,"-F",`number=${a}`,"-f","query=query($owner:String!,$name:String!,$number:Int!){repository(owner:$owner,name:$name){pullRequest(number:$number){reviewThreads(first:100){nodes{id isResolved isOutdated path line comments(first:100){nodes{id databaseId body author{login __typename}}}}}}}}"],"graphql");if(0!==d.exitCode)throw new q(d.stderr||"gh api graphql failed");let e=p.safeParse(JSON.parse(d.stdout||"{}"));if(!e.success)throw new q(`unexpected gh output: ${e.error.message}`);return(e.data.data.repository.pullRequest?.reviewThreads.nodes??[]).map(a=>({id:a.id,isResolved:a.isResolved,isOutdated:a.isOutdated,path:a.path??null,line:a.line??null,comments:a.comments.nodes.map(a=>({id:a.id,databaseId:a.databaseId??null,author:a.author?.login??"",authorIsBot:a.author?.__typename==="Bot",body:a.body}))}))}async replyToReviewThread(a,b){let c=await this.exec(["api","graphql","-F",`threadId=${a}`,"-f",`body=${b}`,"-f","query=mutation($threadId:ID!,$body:String!){addPullRequestReviewThreadReply(input:{pullRequestReviewThreadId:$threadId,body:$body}){comment{id}}}"],"graphql");if(0!==c.exitCode)throw new q(c.stderr||"gh review reply failed")}async updateReviewComment(a,b){let c=await this.exec(["api","graphql","-F",`id=${a}`,"-f",`body=${b}`,"-f","query=mutation($id:ID!,$body:String!){updatePullRequestReviewComment(input:{pullRequestReviewCommentId:$id,body:$body}){pullRequestReviewComment{id}}}"],"graphql");if(0!==c.exitCode)throw new q(c.stderr||"gh update review comment failed")}async resolveReviewThread(a){let b=await this.exec(["api","graphql","-F",`threadId=${a}`,"-f","query=mutation($threadId:ID!){resolveReviewThread(input:{threadId:$threadId}){thread{id isResolved}}}"],"graphql");if(0!==b.exitCode)throw new q(b.stderr||"gh resolve thread failed")}async reactToReviewComment(a,b){let c=await this.exec(["api","graphql","-F",`subjectId=${a}`,"-F",`content=${b}`,"-f","query=mutation($subjectId:ID!,$content:ReactionContent!){addReaction(input:{subjectId:$subjectId,content:$content}){reaction{content}}}"],"graphql");if(0!==c.exitCode&&!/already has this reaction/i.test(c.stderr))throw new q(c.stderr||"gh add reaction failed")}}var u=c(98103),v=c(23174),w=c(47601),x=c(51769);let y=d.Ik({iid:d.ai(),title:d.Yj(),labels:d.YO(d.Yj()).default([]),author:d.Ik({username:d.Yj()}).nullish()}),z=d.Ik({iid:d.ai(),title:d.Yj(),description:d.Yj().nullable().default(""),state:d.Yj().default("opened"),labels:d.YO(d.Yj()).default([])}),A=d.Ik({author:d.Ik({username:d.Yj().default("")}).default({username:""}),body:d.Yj().default(""),created_at:d.Yj().default(""),system:d.zM().default(!1)}),B=d.Ik({id:d.ai(),body:d.Yj().default("")}),C=d.Ik({id:d.ai().optional(),name:d.Yj().default(""),status:d.Yj().default("")}),D=d.Ik({head_pipeline:d.Ik({id:d.ai()}).nullable().optional()}),E=d.Ik({old_path:d.Yj().default(""),new_path:d.Yj().default(""),diff:d.Yj().default("")});class F{constructor(a,b={}){this.config=a,this.http=b.http??v.D,this.run=b.run??e.Sx,this.sleep=b.sleep??(a=>new Promise(b=>setTimeout(b,a))),this.allowPrivateHost=b.allowPrivateHost??(0,x.gT)()}resolveProject(){if(!this.projectRef){let a=(async()=>{let a=await this.run("git",["remote","get-url","origin"],this.config.cwd);if(0!==a.exitCode||!a.stdout.trim())throw new w.Q8(a.stderr||"could not resolve git remote 'origin'");let{host:b,path:c}=function(a){let b=a.trim().replace(/\.git$/,""),c=b.match(/^[\w.-]+@([^:]+):(.+)$/)??b.match(/^ssh:\/\/[^@]+@([^/]+)\/(.+)$/)??b.match(/^https?:\/\/([^/]+)\/(.+)$/);if(!c?.[1]||!c[2])throw new w.Q8(`unsupported git remote URL: ${a}`);return{host:c[1],path:c[2]}}(a.stdout);return{baseUrl:(this.config.baseUrl?.trim()||`https://${b}`).replace(/\/$/,""),encodedPath:encodeURIComponent(c)}})();a.catch(()=>{this.projectRef===a&&(this.projectRef=void 0)}),this.projectRef=a}return this.projectRef}async request(a,b,c={}){let d,{baseUrl:e,encodedPath:f}=await this.resolveProject(),g=`${e}/api/v4/projects/${f}${b}`;if(c.query){let a=new URLSearchParams(c.query).toString();a&&(g+=`?${a}`)}(0,x.sM)(g,{allowPrivate:this.allowPrivateHost});let h={};return this.config.token&&(h["PRIVATE-TOKEN"]=this.config.token),void 0!==c.body&&(h["Content-Type"]="application/json",d=JSON.stringify(c.body)),this.http(g,{method:a,headers:h,body:d})}async mutate(a,b,c={}){let d=await this.request(a,b,c);if(429===d.status)throw await this.sleep(function(a){if(a){let b=a["retry-after"];if(b){let a=Number(b);if(Number.isFinite(a)&&a>0)return Math.min(1e3*a,3e5)}let c=a["ratelimit-reset"]??a["x-ratelimit-reset"];if(c){let a=Number(c);if(Number.isFinite(a)){let b=1e3*a-Date.now();if(b>0)return Math.min(b,3e5)}}}return 6e4}(d.headers)),new w.Q8(`GitLab rate-limited: ${M(d)||`${a} ${b} returned 429`}`);if(!d.ok)throw new w.Q8(M(d)||`GitLab ${a} ${b} failed`);return d}async listIssues(a){return this.listIssuesPaginated({state:"opened",labels:a})}async listAllIssues(){return this.listIssuesPaginated({state:"opened"})}async listIssuesPaginated(a){return this.listPaginated("/issues",a,G)}async listPaginated(a,b,c){let d=[],e=1;for(let f=0;f<100;f++){let f=await this.mutate("GET",a,{query:{...b,per_page:"100",page:String(e)}});d.push(...c(f.body));let g=f.headers?.["x-next-page"];if(!g)break;let h=Number(g);if(!Number.isInteger(h)||h<=e)break;e=h}return d}async viewIssue(a){let b=await this.mutate("GET",`/issues/${a}`),c=await this.listPaginated(`/issues/${a}/notes`,{},K),d=z.parse(L(b.body,{}));return{number:d.iid,title:d.title,body:d.description??"",state:"opened"===d.state?"open":d.state,labels:d.labels,comments:c.filter(a=>!a.system).map(a=>({author:a.author.username,body:a.body,createdAt:a.created_at}))}}async editIssue(a,b){let c={};void 0!==b.title&&(c.title=b.title),void 0!==b.body&&(c.description=b.body),0!==Object.keys(c).length&&await this.mutate("PUT",`/issues/${a}`,{body:c})}async ensureLabel(a,b={}){var c;let e=await this.request("GET","/labels",{query:{per_page:"100"}});if(e.ok){let b=d.YO(d.Ik({name:d.Yj()})).safeParse(L(e.body,[]));if(b.success&&b.data.some(b=>b.name===a))return}let f={name:a,color:(c=b.color??"#808080").startsWith("#")?c:`#${c}`};b.description&&(f.description=b.description);let g=await this.request("POST","/labels",{body:f});if(!g.ok&&409!==g.status&&!/already exists/i.test(g.body))throw new w.Q8(M(g)||"GitLab label create failed")}async addLabels(a,b){await this.mutate("PUT",`/issues/${a}`,{body:{add_labels:b.join(",")}})}async removeLabels(a,b){await this.mutate("PUT",`/issues/${a}`,{body:{remove_labels:b.join(",")}})}async closeIssue(a){await this.mutate("PUT",`/issues/${a}`,{body:{state_event:"close"}})}async reopenIssue(a){await this.mutate("PUT",`/issues/${a}`,{body:{state_event:"reopen"}})}async commentIssue(a,b){await this.mutate("POST",`/issues/${a}/notes`,{body:{body:b}})}async listIssueComments(a){return(await this.listPaginated(`/issues/${a}/notes`,{},H)).map(a=>({id:String(a.id),body:a.body}))}async updateIssueComment(a,b,c){await this.mutate("PUT",`/issues/${a}/notes/${encodeURIComponent(b)}`,{body:{body:c}})}async commentPr(a,b){await this.mutate("POST",`/merge_requests/${a}/notes`,{body:{body:b}})}async createIssue(a,b){let c=await this.mutate("POST","/issues",{body:{title:a,description:b}});return d.Ik({iid:d.ai()}).parse(L(c.body,{})).iid}async prChecks(a){let b=await this.latestPipelineId(a);return null===b?[]:(await this.listPaginated(`/pipelines/${b}/jobs`,{},I)).map(a=>({name:a.name,state:function(a){switch(a){case"success":return"SUCCESS";case"failed":return"FAILURE";case"canceled":case"cancelled":return"CANCELLED";case"running":return"IN_PROGRESS";case"pending":case"created":case"scheduled":case"preparing":case"waiting_for_resource":return"PENDING";case"manual":return"MANUAL";case"skipped":return"SKIPPED";default:return a.toUpperCase()}}(a.status)}))}async prHeadSha(a){let b=await this.mutate("GET",`/merge_requests/${a}`);return d.Ik({sha:d.Yj()}).parse(L(b.body,{})).sha}async prMergeCommitSha(a){let b=await this.mutate("GET",`/merge_requests/${a}`),c=d.Ik({squash_commit_sha:d.Yj().nullish(),merge_commit_sha:d.Yj().nullish()}).parse(L(b.body,{}));return c.squash_commit_sha??c.merge_commit_sha??null}async failedRunLog(a){try{let b=await this.latestPipelineId(a);if(null===b)return"";let c=(await this.listPaginated(`/pipelines/${b}/jobs`,{},I)).find(a=>"failed"===a.status&&void 0!==a.id);if(!c)return"";let d=await this.request("GET",`/jobs/${c.id}/trace`);if(!d.ok)return(0,u.v)(`GitLab failedRunLog: job ${c.id} trace request failed (${d.status})`),"";return d.body.slice(-8e3)}catch(a){return(0,u.v)("GitLab failedRunLog error:",a),""}}async prDiff(a){try{return(await this.listPaginated(`/merge_requests/${a}/diffs`,{},J)).map(a=>`--- a/${a.old_path}
18
- +++ b/${a.new_path}
19
- ${a.diff}`).join("\n")}catch(a){return(0,u.v)("GitLab prDiff error:",a),""}}async mergePr(a){await this.mutate("PUT",`/merge_requests/${a}/merge`,{body:{squash:!0}})}async createPr(a){let b=await this.mutate("POST","/merge_requests",{body:{source_branch:a.head,target_branch:a.base,title:a.title,description:a.body}});return d.Ik({iid:d.ai()}).parse(L(b.body,{})).iid}async deleteBranch(a){let b=await this.request("DELETE",`/repository/branches/${encodeURIComponent(a)}`);if(!b.ok&&404!==b.status)throw new w.Q8(M(b)||"GitLab branch delete failed")}async prMergeState(a){let b=await this.mutate("GET",`/merge_requests/${a}`),c=d.Ik({has_conflicts:d.zM().default(!1),detailed_merge_status:d.Yj().nullish()}).parse(L(b.body,{}));return c.has_conflicts||"conflict"===c.detailed_merge_status?"conflicted":"need_rebase"===c.detailed_merge_status?"behind":"mergeable"===c.detailed_merge_status?"clean":"unknown"}async updatePrBranch(a){await this.mutate("PUT",`/merge_requests/${a}/rebase`)}async latestPipelineId(a){let b=await this.request("GET",`/merge_requests/${a}`);if(!b.ok)return null;let c=D.safeParse(L(b.body,{})),d=c.success?c.data.head_pipeline??null:null;return d?d.id:null}}function G(a){let b=d.YO(y).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data.map(a=>({number:a.iid,title:a.title,labels:a.labels.map(a=>({name:a})),author:a.author?.username??null,authorAssociation:null}))}function H(a){let b=d.YO(B).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data}function I(a){let b=d.YO(C).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data}function J(a){let b=d.YO(E).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data}function K(a){let b=d.YO(A).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data}function L(a,b){try{return JSON.parse(a||"null")??b}catch{return b}}function M(a){let b=d.Ik({message:d.L5(),error:d.L5()}).partial().safeParse(L(a.body,{}));if(b.success){let a=b.data.message??b.data.error;if("string"==typeof a)return a;if(a)return JSON.stringify(a)}return a.body.slice(0,300)}function N(a){return"gitlab"===((0,w.jL)(a.platform)?a.platform:w.cg)?new F({cwd:a.path,baseUrl:a.apiBaseUrl,token:a.apiToken}):new t({cwd:a.path}.cwd,void 0)}},68008:(a,b,c)=>{"use strict";c.d(b,{E:()=>e,_:()=>d});let d={main:"default",ciFix:"ci-fix",plan:"plan",limitResume:"limit-resume"},e={default:'You are working on GitHub issue #$ISSUE_NUM in the repository "$REPO_NAME".\nYou are on branch "$BRANCH". Implement the change the issue asks for.\n\nIssue title: $ISSUE_TITLE\n\nIssue body:\n$ISSUE_BODY\n\nKeep the change focused. You may commit your work or leave it uncommitted —\neither is fine. Do not push or open a pull request yourself; Drydock commits\nany remaining changes, pushes the branch, and opens the PR.\n\nBefore you finish, write a file `.drydock/PR.md` describing the change for the\npull request. The first line is a Conventional Commit subject (used as the\ncommit message and PR title), then a blank line, then a structured body with\nsections: Problem, Solution, Tests, Risks. Drydock reads this file, appends\n`Closes #$ISSUE_NUM` to the body, and removes the file — do not commit it.',"ci-fix":"CI failed. Fix the failure and keep changes minimal.\n\nFailed CI log:\n$CI_LOG",plan:'You are working on GitHub issue #$ISSUE_NUM in the repository "$REPO_NAME".\n\nIssue title: $ISSUE_TITLE\n\nIssue body:\n$ISSUE_BODY\n\nDo not change any files. Explore the codebase and produce a concise,\nstep-by-step implementation plan for the issue: the files to touch, the\nchange in each, the order to make them, and how to verify the result\n(tests, typecheck, build). Reply with the plan only — no preamble.',"limit-resume":'Your previous session on issue #$ISSUE_NUM in "$REPO_NAME" was interrupted by a usage limit.\nYou are resuming in a fresh checkout of branch "$BRANCH"; any uncommitted changes from the\ninterrupted session are gone. Re-apply whatever is missing and finish implementing the issue.\nKeep the change focused. You may commit your work or leave it uncommitted — either is fine.\nDo not push or open a pull request yourself; Drydock commits, pushes, and opens the PR.\nBefore finishing, write `.drydock/PR.md`: first line a Conventional Commit subject (used as\nthe commit message and PR title), then a blank line, then a body with Problem, Solution,\nTests, and Risks sections. Drydock appends `Closes #$ISSUE_NUM` and removes the file — do\nnot commit it.'}},70040:(a,b,c)=>{"use strict";c.d(b,{QJ:()=>i,RH:()=>d,kl:()=>f,w:()=>g,xh:()=>h});let d=["queued","working","ci_running","ci_failed","retrying","waiting_limit","merged","needs_human","aborted","interrupted"],e={queued:["working","aborted","interrupted"],working:["ci_running","waiting_limit","needs_human","aborted","interrupted"],ci_running:["ci_failed","merged","needs_human","aborted","interrupted"],ci_failed:["retrying","needs_human","aborted","interrupted"],retrying:["ci_running","needs_human","aborted","interrupted"],waiting_limit:["queued","needs_human","aborted","interrupted"],merged:[],needs_human:["queued","aborted"],aborted:[],interrupted:["queued","aborted"]},f=["merged","aborted"];function g(a,b){return e[a].includes(b)}class h extends Error{constructor(a,b){super(`invalid job transition: ${a} -> ${b}`)}}function i(a,b){if(!g(a,b))throw new h(a,b)}},72914:(a,b,c)=>{"use strict";c.d(b,{$:()=>e});var d=c(23581);let e=(0,d.createServerReference)("40d6ac063e31ed3ee52059d74d9460570a55d99e84",d.callServer,void 0,d.findSourceMapURL,"togglePauseAction")},73494:(a,b,c)=>{Promise.resolve().then(c.bind(c,10669)),Promise.resolve().then(c.bind(c,65006))},73683:(a,b,c)=>{"use strict";let d,e;c.r(b),c.d(b,{abortAllJobs:()=>cs,abortJob:()=>cq,clearAbort:()=>cp,gracefulShutdown:()=>ct,reconcileExternalAborts:()=>cr,registerAbort:()=>co,startOrchestrator:()=>cu});var f=c(79241),g=c(95310),h=c(97095),i=c(41575),j=c(92958),k=c(98103),l=c(58748),m=c(5501),n=c(17398);let o=["ci_running","ci_failed","retrying"];var p=c(6012),q=c(74929),r=c(67806),s=c(11430),t=c(6402);let u=["blocked","wontfix","question","needs-human","needs-discussion"],v=[{label:"destructive command",re:/\brm\s+-rf\b|\bdrop\s+table\b|\bgit\s+push\s+--force\b|disable\s+auth/i},{label:"secret material",re:/\bapi[_-]?key\b|\bpassword\b|\bsecret\b|\.env\b|\bsk-[a-z0-9]/i},{label:"exfiltration",re:/\bcurl\b|\bwget\b|webhook|pastebin/i},{label:"privileged area",re:/\bauth(entication|orization)?\b|\bpayment|\bbilling\b|\bdeploy|\bsecurity\b|\bci\/cd\b/i}];function w(a){let b=[],c=a.labels.map(a=>a.toLowerCase()).find(a=>u.includes(a));if(c)return{decision:"blocked",reasons:[`blocking label: ${c}`]};let d=`${a.title}
20
- ${a.body??""}`;for(let{label:a,re:c}of v)c.test(d)&&b.push(`${a} detected`);return b.length>0?{decision:"needs_review",reasons:b}:{decision:"approved",reasons:[]}}var x=c(50186),y=c(19761);let z=[{label:"bug",re:/\b(bug|crash|crashes|broken|error|exception|fails?|regression|defect)\b/i},{label:"enhancement",re:/\b(add|support|feature|implement|enhancement|would be nice|allow|introduce)\b/i},{label:"documentation",re:/\b(docs?|documentation|readme|typo|wording|clarify)\b/i}];function A(a,b,c,d){d.update(j.issues).set({triageHash:c,triagedAt:Math.floor(Date.now()/1e3)}).where((0,f.Uo)((0,f.eq)(j.issues.repoId,a),(0,f.eq)(j.issues.number,b))).run()}async function B(a,b,c,d=(0,g.Lf)()){let e=(0,y.A)(a),h=function(a){let b=JSON.stringify([a.title,a.labels.map(a=>a.name).sort()]),c=5381;for(let a=0;a<b.length;a++)c=(c<<5)+c+b.charCodeAt(a)|0;return(c>>>0).toString(16)}(c),i=d.select().from(j.issues).where((0,f.Uo)((0,f.eq)(j.issues.repoId,a.id),(0,f.eq)(j.issues.number,c.number))).get();if(i?.triagedAt&&i.triageHash===h)return{number:c.number,applied:[],reasons:[],skipped:"unchanged"};if(!(0,y.i)(e,c.authorAssociation))return A(a.id,c.number,h,d),{number:c.number,applied:[],reasons:["author not approved"],skipped:"author"};let k=await b.viewIssue(c.number),l=w({number:k.number,title:k.title,body:k.body,labels:k.labels}),m=[],n=function(a,b){let c=new Set(b),d=`${a.title}
21
- ${a.body}`,e=[];for(let{label:a,re:b}of z)c.has(a)&&b.test(d)&&!e.includes(a)&&e.push(a);return e}(k,e.autoLabelWhitelist);for(let a of n)m.push(`classified as ${a}`);if("approved"===l.decision){let a=e.readyLabels[0];a&&(n.push(a),m.push("safe and well-specified"))}else{let a=e.blockingLabels[0];a&&(n.push(a),m.push(...l.reasons.length?l.reasons:["flagged for human review"]))}let o=new Set([...e.autoLabelWhitelist,...e.readyLabels,...e.blockingLabels]),p=new Set(k.labels),q=[...new Set(n)].filter(a=>o.has(a)&&!p.has(a));if(q.length>0){for(let a of q)await b.ensureLabel(a);await b.addLabels(c.number,q);let e=q.map(a=>`\`${a}\``).join(", ");await b.commentIssue(c.number,`auto-triage: applied ${e} — reasons: ${m.join("; ")}.`),(0,x.sp)(a.id,c.number,q,[],d)}return A(a.id,c.number,h,d),{number:c.number,applied:q,reasons:m}}async function C(a,b,c,d=(0,g.Lf)()){let e=[];for(let f of c)try{e.push(await B(a,b,f,d))}catch(b){(0,k.v)(`[triage] issue #${f.number} failed for ${a.name}`,b)}return e}var D=c(3061),E=c(52166),F=c(580),G=c(70040);let H="janitor",I=new Set(["ci_running","ci_failed","retrying"]);function J(a){return a?.startsWith("drydock/")??!1}async function K(a,b,c,d){if("function"!=typeof c.deleteBranch)return;let e=function(a,b){let c=b.select({jobId:j.jobEvents.jobId,payload:j.jobEvents.payload}).from(j.jobEvents).innerJoin(j.jobs,(0,f.eq)(j.jobEvents.jobId,j.jobs.id)).where((0,f.Uo)((0,f.eq)(j.jobEvents.type,H),(0,f.eq)(j.jobs.repoId,a))).all(),d=new Set;for(let a of c)try{"branch_deleted"===JSON.parse(a.payload??"{}").action&&d.add(a.jobId)}catch{}return d}(a,d),g=new Set(b.filter(a=>!["merged","aborted"].includes(a.status)).map(a=>a.branch).filter(J));for(let a of b.filter(a=>"merged"===a.status&&null!==a.prNumber&&J(a.branch)&&!e.has(a.id)&&!g.has(a.branch))){let b=a.branch;try{await c.deleteBranch(b),(0,m.yM)(a.id,H,{action:"branch_deleted",branch:b},d)}catch(c){(0,k.v)(`[janitor] branch delete failed for job ${a.id} (${b})`,c)}}}async function L(a,b,c,d){if("function"==typeof c.prMergeState)for(let e of b.filter(a=>I.has(a.status)&&null!==a.prNumber&&J(a.branch))){let b=e.prNumber;try{let f=await c.prMergeState(b);"behind"===f&&"function"==typeof c.updatePrBranch?(await c.updatePrBranch(b),(0,m.yM)(e.id,H,{action:"branch_updated",prNumber:b},d)):"conflicted"===f&&await M(a,e,b,c,d)}catch(a){(0,k.v)(`[janitor] PR refresh failed for job ${e.id} (PR #${b})`,a)}}}async function M(a,b,c,d,e){let f=`rebase needed: conflicts with ${a.defaultBranch}`;try{await d.commentIssue(b.issueNumber,`⚠️ PR #${c} conflicts with \`${a.defaultBranch}\` — a rebase is needed. Parking job #${b.id} for a human.`)}catch(a){(0,k.v)(`[janitor] conflict comment failed for job ${b.id}`,a)}try{let a=(0,m.ax)(b.id,e);if(!a||!I.has(a.status))return;(0,m.yM)(b.id,"status",{reason:"merge_conflict",prNumber:c},e),(0,m.dk)(b.id,"needs_human",{errorMessage:f},e)}catch(a){if(!(a instanceof G.xh))throw a}}async function N(a={}){let b=a.db??(0,g.Lf)();for(let c of(0,q.uP)(b))try{let d=a.forgeFor?.(c)??(0,r.Ie)(c),e=(0,m.N6)(c.id,b);await K(c.id,e,d,b),await L(c,e,d,b)}catch(a){(0,k.v)(`[janitor] sweep failed for ${c.name}`,a)}}var O=c(46609),P=c(26370);async function Q(a,b={}){let c=b.command??a.defaultCommand,d=b.runner??P.Sx;try{let{stdout:b,exitCode:e}=await d(c,["--version"]);if(0===e)return{agent:a.id,installed:!0,version:b.trim()};return{agent:a.id,installed:!1,message:`${a.label} CLI '${c}' exited ${e} on --version. Check the installation or the CLI path in settings.`}}catch{return{agent:a.id,installed:!1,message:`${a.label} CLI '${c}' not found. Install it or set the correct CLI path in settings.`}}}var R=c(23174),S=c(51769),T=c(16680),U=c(84637);let V={kind:"ok"},W={kind:"unknown"};function X(a,b,c){return{kind:"failed",failure:{target:a,label:b,message:c}}}function Y(a){return(0,T.f)(a.trim()).slice(0,200)}async function Z(a){let b=a.db??(0,g.Lf)(),c={runner:a.runner??P.Sx,http:a.http??R.D,fetchImpl:a.fetchImpl??fetch,governor:a.governor??t.og,now:a.now??Date.now,probeTimeoutMs:a.probeTimeoutMs??3e4},d=(0,i.mt)(b),e=function(a,b,c,d){let e=[];a.some(a=>"gitlab"!==a.platform)&&e.push({id:"github",probe:async()=>{if(!d.governor.decide("core","low").allowed)return W;try{let a=await d.runner(b.ghPath,["auth","status"],void 0,{timeoutMs:d.probeTimeoutMs});if(0===a.exitCode)return V;let c=Y(a.stderr||a.stdout);return X("github","GitHub CLI auth",`\`${b.ghPath} auth status\` exited ${a.exitCode}${c?`: ${c}`:""}. Re-authenticate with \`gh auth login\`.`)}catch(a){if(a instanceof Error&&/timed out/i.test(a.message))return W;return X("github","GitHub CLI auth",`GitHub CLI '${b.ghPath}' could not be probed: ${Y(String(a))}`)}}});let f=new Map;for(let b of a){if("gitlab"!==b.platform||!b.apiBaseUrl||!b.apiToken)continue;let a=b.apiBaseUrl.trim().replace(/\/+$/,"");!a||f.has(a)||f.set(a,b.apiToken)}for(let[a,b]of f)e.push(function(a,b,c){let d=`gitlab:${a}`,e=a;try{e=new URL(a).host}catch{}let f=`GitLab (${e})`;return{id:d,probe:async()=>{let g=`${a}/api/v4/user`;try{(0,S.sM)(g,{allowPrivate:(0,S.gT)()})}catch(a){return(0,k.v)(`[watchdog] gitlab probe skipped for ${e}`,a),W}try{var h,i;let a=await (h=c.http(g,{headers:{"PRIVATE-TOKEN":b}}),i=c.probeTimeoutMs,new Promise((a,b)=>{let c=setTimeout(()=>b(Error(`probe timed out after ${i}ms`)),i);c.unref?.(),h.then(b=>{clearTimeout(c),a(b)},a=>{clearTimeout(c),b(a)})}));if(401===a.status||403===a.status)return X(d,f,`GitLab rejected the access token (HTTP ${a.status}). Update the token in the repo's forge settings.`);if(a.ok)return V;return W}catch{return W}}}}(a,b,d));let g=new Set;for(let b of a)(0,p.TU)(b.agent)&&g.add(b.agent);for(let a of g)e.push(function(a,b,c,d){let e=`agent:${a}`,f=(0,p.X$)(a);return"openrouter"===a?{id:e,probe:async()=>{let a=(0,E.t)(b);if(!a)return X(e,"OpenRouter API key","No OpenRouter API key is configured — set it in settings or via DRYDOCK_OPENROUTER_API_KEY.");let c=await (0,U.lw)(a,d.fetchImpl);return c.ok?V:/HTTP 40[13]\b/.test(c.error)?X(e,"OpenRouter API key",`OpenRouter rejected the API key (${Y(c.error)}). Update the key in settings.`):W}}:{id:e,probe:async()=>{let a=await Q(f,{command:(0,F.m)(f,c),runner:(a,b,c,e)=>d.runner(a,b,c,{timeoutMs:d.probeTimeoutMs,...e})});return a.installed?V:X(e,`${f.label} CLI`,a.message??"CLI probe failed.")}}}(a,b,c,d));return e}((0,q.uP)(b),d,b,c),f=(0,O.iC)(b),h=new Map((f?.failures??[]).map(a=>[a.target,a])),j=[];for(let{id:a,outcome:b}of(await Promise.all(e.map(async a=>{try{return{id:a.id,outcome:await a.probe()}}catch(b){return(0,k.v)(`[watchdog] credential probe for ${a.id} failed`,b),{id:a.id,outcome:W}}}))))if("failed"===b.kind)j.push(b.failure);else if("unknown"===b.kind){let b=h.get(a);b&&j.push(b)}let l={checkedAt:Math.floor(c.now()/1e3),failures:j};return(0,O.z8)(l,b),l}let $=!1;async function _(a={}){if(!$){$=!0,d=(a.now??Date.now)();try{return await Z(a)}finally{$=!1}}}var aa=c(73024),ab=c(48161),ac=c(76760);function ad(){return process.env.DRYDOCK_HOME??(0,ac.join)((0,ab.homedir)(),".drydock")}function ae(a){return a.replace(/[^a-zA-Z0-9._-]/g,"-")}function af(a){return(0,ac.join)(ad(),"worktrees",ae(a))}class ag extends Error{}class ah extends ag{constructor(){super("nothing to commit")}}let ai=new Map;class aj{constructor(a=P.Sx){this.run=a}withRepoLock(a,b){let c=(ai.get(a)??Promise.resolve()).then(b,b);return ai.set(a,c.then(()=>void 0,()=>void 0)),c}async git(a,b){let c=await this.run("git",a,b);if(0!==c.exitCode)throw new ag(c.stderr.trim()||`git ${a[0]} failed`);return c.stdout}async prepare(a,b,c=0){let d=`drydock/issue-${c}-job-${b}`,e=(0,ac.join)(af(a.name),`job-${b}`),f=await this.withRepoLock(a.path,async()=>(await this.git(["-C",a.path,"worktree","remove","--force",e]).catch(()=>void 0),(0,aa.rmSync)(e,{recursive:!0,force:!0}),await this.git(["-C",a.path,"worktree","prune"]).catch(()=>void 0),await this.git(["-C",a.path,"branch","-D",d]).catch(()=>void 0),await this.git(["-C",a.path,"worktree","add","-b",d,e,a.defaultBranch]),this.resolveBase(a.path,d)));return{path:e,branch:d,base:f}}async prepareForBranch(a,b,c){let d=(0,ac.join)(af(a.name),`fb-${ae(c)}`),e=await this.withRepoLock(a.path,async()=>(await this.git(["-C",a.path,"fetch","origin",b]),await this.git(["-C",a.path,"worktree","add",d,b]),this.resolveBase(a.path,b)));return{path:d,branch:b,base:e}}async prepareForNewBranch(a,b,c){let d=(0,ac.join)(af(a.name),`dh-${ae(c)}`),e=await this.withRepoLock(a.path,async()=>(await this.git(["-C",a.path,"worktree","add","-b",b,d,a.defaultBranch]),this.resolveBase(a.path,b)));return{path:d,branch:b,base:e}}async resolveBase(a,b){return(await this.git(["-C",a,"rev-parse",b])).trim()}async hasNewCommits(a){return!!a.base&&Number.parseInt((await this.git(["rev-list","--count",`${a.base}..HEAD`],a.path)).trim()||"0",10)>0}async commitAndPush(a,b){if(await this.git(["add","-A"],a.path),""!==(await this.git(["status","--porcelain"],a.path)).trim())await this.git(["commit","-m",b],a.path);else if(!await this.hasNewCommits(a))throw new ah;await this.git(["push","-u","origin",a.branch],a.path)}async remove(a,b){await this.withRepoLock(b,async()=>{await this.git(["-C",b,"worktree","remove","--force",a.path]),await this.git(["-C",b,"worktree","prune"])})}}var ak=c(44411),al=c(31421);let am=(a,b,c,d)=>{let e,f=(0,al.spawn)(a,b,{cwd:c,env:process.env,detached:P.l9});f.stdout?.setEncoding("utf8"),f.stderr?.setEncoding("utf8"),f.stdout?.on("data",a=>d.onStdout(a)),f.stderr?.on("data",a=>d.onStderr?.(a));let g=!1,h={done:new Promise(a=>{f.on("close",(b,c)=>{e&&clearTimeout(e),a(b??+!!c)}),f.on("error",b=>{h.spawnError=b,a(1)})}),abort:(a=5e3)=>{g||(g=!0,(0,P.g8)(f,"SIGTERM"),e=setTimeout(()=>(0,P.g8)(f,"SIGKILL"),a),e.unref?.())}};return h};var an=c(68008),ao=c(24845),ap=c(29218),aq=c(40900),ar=c(77712);function as(a,b,c,d){let e=(0,aq.nc)(a.id,d);if(e)return c.publish(b.id,{type:"error",payload:{stderr:`session not started: ${a.label} is limit-blocked (${e.kind}) until ${new Date(1e3*e.blockedUntil).toISOString()}`}}),{exitCode:-3,costUsd:0,inputTokens:0,outputTokens:0,timedOut:!1,costExceeded:!1,limit:{agent:a.id,kind:e.kind,resetAt:e.blockedUntil,rawSnippet:e.rawSnippet,latched:!0}}}function at(a,b,c,d){if(!d.timedOut&&!d.costExceeded&&(0!==d.exitCode||b.resultIsError))return a.classifyFailure?.({exitCode:d.exitCode,stderr:c,resultText:b.resultText,resultIsError:b.resultIsError})}function au(a,b,c){let d=Math.floor(Date.now()/1e3),e=(0,ak.qE)(b.rateLimit,d);e&&(0,ar.IP)(a.id,e,c);let f=a.captureUsage?.(b);f&&(0,ar.Cx)(f,c,d)}function av(a,b){let c=()=>{},d=!1;return{tripped:new Promise(a=>{c=a}),observe(){!d&&b()>=a&&(d=!0,c())}}}function aw(a,b={}){let{timeoutMs:c,costTripped:d}=b,e=b.graceMs??5e3,f=!!c&&c>0;return f||d?new Promise(b=>{let g,h=!1,i=!1,j=a=>{h||(h=!0,b(a))},k=b=>{let c;if(i)return;i=!0,g&&clearTimeout(g),a.abort();let d=new Promise(a=>{c=setTimeout(a,e),c.unref?.()});Promise.race([a.done,d]).then(()=>{clearTimeout(c),j(b)})};f&&(g=setTimeout(()=>{k({exitCode:-1,timedOut:!0,costExceeded:!1})},c),g.unref?.()),d?.then(()=>{k({exitCode:-2,timedOut:!1,costExceeded:!0})}),a.done.then(a=>{i||(g&&clearTimeout(g),j({exitCode:a,timedOut:!1,costExceeded:!1}))})}):a.done.then(a=>({exitCode:a,timedOut:!1,costExceeded:!1}))}function ax(a){return{chunks:a.chunks,costUsd:a.costUsd}}async function ay(a,b,d,e={}){let i=e.db??(0,g.Lf)(),k=e.runner??am,l=e.broker??(0,ap.k)(),n=e.provider??(0,p.X$)(a.agent);if("http"===n.kind){let{runOpenRouterJobSession:f}=await c.e(614).then(c.bind(c,12614));return f(a,b,d,{db:i,broker:e.broker,timeoutMs:e.timeoutMs,costCapUsd:e.costCapUsd,sideSession:e.sideSession,fetchImpl:e.fetchImpl,toolExecutor:e.toolExecutor})}let o=e.command??n.defaultCommand,q=a.model??n.defaultModel,r=n.createParser();r.onParseError=b=>l.publish(a.id,{type:"parse_error",payload:b});let s=as(n,a,l,i);if(s)return s;e.sideSession||("working"!==a.status?(0,m.dk)(a.id,"working",{model:q},i):i.update(j.jobs).set({model:q}).where((0,f.eq)(j.jobs.id,a.id)).run());let t=e.costCapUsd&&e.costCapUsd>0?av(e.costCapUsd,()=>r.costUsd>0?r.costUsd:n.estimateCost(q,r.totalInputTokens,r.totalOutputTokens,r.totalCacheCreationInputTokens,r.totalCacheReadInputTokens)):void 0,u=n.buildStartArgs({prompt:b,model:q,maxTurns:a.maxTurns}),v="",w=k(o,u,d,{onStdout:b=>{for(let c of r.push(b))l.publish(a.id,{type:c.type,payload:ax(c)});t?.observe()},onStderr:b=>{v=(v+b).slice(-16384),l.publish(a.id,{type:"error",payload:{stderr:b}})}});co(a.id,w.abort);let{exitCode:x,timedOut:y,costExceeded:z}=await aw(w,{timeoutMs:e.timeoutMs,costTripped:t?.tripped,graceMs:e.graceMs});cp(a.id);let A=y||z?void 0:w.spawnError;for(let b of(y&&l.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${e.timeoutMs}ms`}}),z&&l.publish(a.id,{type:"error",payload:{stderr:`session aborted: per-job cost limit of $${e.costCapUsd} reached`}}),r.flush()))l.publish(a.id,{type:b.type,payload:ax(b)});let B=r.costUsd>0?r.costUsd:n.estimateCost(q,r.totalInputTokens,r.totalOutputTokens,r.totalCacheCreationInputTokens,r.totalCacheReadInputTokens);return e.sideSession?i.update(j.jobs).set({totalInputTokens:(0,h.ll)`coalesce(${j.jobs.totalInputTokens}, 0) + ${r.totalInputTokens}`,totalOutputTokens:(0,h.ll)`coalesce(${j.jobs.totalOutputTokens}, 0) + ${r.totalOutputTokens}`,costUsd:(0,h.ll)`coalesce(${j.jobs.costUsd}, 0) + ${B}`}).where((0,f.eq)(j.jobs.id,a.id)).run():i.update(j.jobs).set({sessionId:r.sessionId,totalInputTokens:r.totalInputTokens,totalOutputTokens:r.totalOutputTokens,costUsd:B}).where((0,f.eq)(j.jobs.id,a.id)).run(),au(n,r,i),{exitCode:x,sessionId:r.sessionId,costUsd:B,inputTokens:r.totalInputTokens,outputTokens:r.totalOutputTokens,timedOut:y,costExceeded:z,spawnError:A,limit:at(n,r,v,{exitCode:x,timedOut:y,costExceeded:z})}}async function az(a,b,d,e,h={}){let i=h.db??(0,g.Lf)(),k=h.runner??am,l=h.broker??(0,ap.k)(),m=h.provider??(0,p.X$)(a.agent),n=h.resumePrompt??(0,ao.Xm)((0,ao.yx)(a.repoId,an._.ciFix,i),{CI_LOG:d});if("http"===m.kind){let{runOpenRouterJobSession:b}=await c.e(614).then(c.bind(c,12614));return b(a,n,e,{db:i,broker:h.broker,timeoutMs:h.timeoutMs,costCapUsd:h.costCapUsd,sideSession:h.sideSession,additive:!0,maxTurns:h.resumeMaxTurns??m.resumeMaxTurns,fetchImpl:h.fetchImpl,toolExecutor:h.toolExecutor})}let o=h.command??m.defaultCommand,q=h.resumeModel??m.resumeModel,r=h.resumeMaxTurns??m.resumeMaxTurns,s=m.createParser();s.onParseError=b=>l.publish(a.id,{type:"parse_error",payload:b});let t=as(m,a,l,i);if(t)return{...t,sessionId:b};let u=h.costCapUsd&&h.costCapUsd>0?i.select().from(j.jobs).where((0,f.eq)(j.jobs.id,a.id)).get()?.costUsd??0:0,v=h.costCapUsd&&h.costCapUsd>0?av(h.costCapUsd,()=>u+(s.costUsd>0?s.costUsd:m.estimateCost(q,s.totalInputTokens,s.totalOutputTokens,s.totalCacheCreationInputTokens,s.totalCacheReadInputTokens))):void 0,w=(m.supportsResume?m.buildResumeArgs({prompt:n,sessionId:b,model:q,maxTurns:r}):null)??m.buildStartArgs({prompt:n,model:q,maxTurns:r}),x="",y=k(o,w,e,{onStdout:b=>{for(let c of s.push(b))l.publish(a.id,{type:c.type,payload:{chunks:c.chunks}});v?.observe()},onStderr:b=>{x=(x+b).slice(-16384),l.publish(a.id,{type:"error",payload:{stderr:b}})}});co(a.id,y.abort);let{exitCode:z,timedOut:A,costExceeded:B}=await aw(y,{timeoutMs:h.timeoutMs,costTripped:v?.tripped,graceMs:h.graceMs});cp(a.id);let C=A||B?void 0:y.spawnError;for(let b of(A&&l.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${h.timeoutMs}ms`}}),B&&l.publish(a.id,{type:"error",payload:{stderr:`session aborted: per-job cost limit of $${h.costCapUsd} reached`}}),s.flush()))l.publish(a.id,{type:b.type,payload:{chunks:b.chunks}});let D=s.costUsd>0?s.costUsd:m.estimateCost(q,s.totalInputTokens,s.totalOutputTokens,s.totalCacheCreationInputTokens,s.totalCacheReadInputTokens),E=i.select().from(j.jobs).where((0,f.eq)(j.jobs.id,a.id)).get();return i.update(j.jobs).set({sessionId:s.sessionId??b,totalInputTokens:(E?.totalInputTokens??0)+s.totalInputTokens,totalOutputTokens:(E?.totalOutputTokens??0)+s.totalOutputTokens,costUsd:(E?.costUsd??0)+D}).where((0,f.eq)(j.jobs.id,a.id)).run(),au(m,s,i),{exitCode:z,sessionId:s.sessionId??b,costUsd:D,inputTokens:s.totalInputTokens,outputTokens:s.totalOutputTokens,timedOut:A,costExceeded:B,spawnError:C,limit:at(m,s,x,{exitCode:z,timedOut:A,costExceeded:B})}}let aA=["vercel","railway"];function aB(a){return a.exists??aa.existsSync}class aC{async detect(a){let b=aB(a);return b((0,ac.join)(a.cwd,"railway.json"))||b((0,ac.join)(a.cwd,"railway.toml"))||b((0,ac.join)(a.cwd,".railway"))}async getStatus(a){let b=await a.run("railway",["status"],a.cwd);return function(a,b){if(0!==b)return"not_found";let c=a.toLowerCase();return/\bfailed\b|\bcrashed\b|\berror\b/.test(c)?"error":/\bsuccess\b|\bdeployed\b|\bready\b/.test(c)?"ready":/\bbuilding\b/.test(c)?"building":/\bdeploying\b|\binitializing\b|\bqueued\b/.test(c)?"deploying":"not_found"}(b.stdout,b.exitCode)}async getLogs(a){let b=await a.run("railway",["logs"],a.cwd);return[b.stdout,b.stderr].filter(Boolean).join("\n").trim()}constructor(){this.id="railway",this.label="Railway"}}function aD(a){return a?["list","--meta",`githubCommitSha=${a}`]:["list"]}class aE{async detect(a){let b=aB(a);return b((0,ac.join)(a.cwd,"vercel.json"))||b((0,ac.join)(a.cwd,".vercel"))}async getStatus(a){let b=await a.run("vercel",aD(a.ref),a.cwd);return function(a,b){if(0!==b)return"not_found";let c=a.split("\n").map(a=>a.trim()).filter(Boolean).find(a=>/●|ready|error|building|queued|initializing/i.test(a.replace(/https?:\/\/\S+/g," ")));if(!c)return"not_found";let d=c.replace(/https?:\/\/\S+/g," ").toLowerCase();return/\berror\b|\bfailed\b|canceled/.test(d)?"error":/\bready\b/.test(d)?"ready":/\bbuilding\b/.test(d)?"building":/\bqueued\b|initializing|deploying/.test(d)?"deploying":"not_found"}(b.stdout,b.exitCode)}async getLogs(a){let b=null;if(a.ref){var c;let d=await a.run("vercel",aD(a.ref),a.cwd);0===d.exitCode&&(c=d.stdout,b=c.match(/https?:\/\/\S+/)?.[0]??null)}let d=b?["inspect","--logs",b]:["logs"],e=await a.run("vercel",d,a.cwd);return[e.stdout,e.stderr].filter(Boolean).join("\n").trim()}constructor(){this.id="vercel",this.label="Vercel"}}let aF=[new aE,new aC];async function aG(a,b){if(b)return aA.includes(b)?function(a){let b=aF.find(b=>b.id===a);if(!b)throw Error(`unsupported deployment platform: ${a}`);return b}(b):null;for(let b of aF)if(await b.detect(a))return b;return null}let aH={monitoring:["healthy","failed","escalated"],failed:["repairing","escalated"],repairing:["repaired","escalated"],healthy:[],repaired:[],escalated:[]};class aI extends Error{constructor(a,b){super(`invalid deployment-healing transition: ${a} -> ${b}`)}}let aJ={initialDelayMs:6e4,intervalMs:6e4,timeoutMs:12e5,monitorWindowMs:36e5,maxLogLines:200};function aK(){return Math.floor(Date.now()/1e3)}function aL(a,b,c={},d=(0,g.Lf)()){let e=function(a,b=(0,g.Lf)()){return b.select().from(j.deploymentHealingSessions).where((0,f.eq)(j.deploymentHealingSessions.id,a)).get()}(a,d);if(!e)throw Error(`deployment healing session ${a} not found`);var h=e.status;if(!aH[h].includes(b))throw new aI(h,b);return d.update(j.deploymentHealingSessions).set({status:b,updatedAt:aK(),...c}).where((0,f.eq)(j.deploymentHealingSessions.id,a)).returning().get()}function aM(a,b){return{cwd:a.path,ref:b,run:P.Sx}}async function aN(a={}){let b=a.db??(0,g.Lf)(),c=a.now??Date.now,d=a.budgets??aJ;for(let e of(0,q.uP)(b))if((0,y.A)(e).autoHealDeployments)try{let f=a.forgeFor?.(e)??(0,r.Ie)(e),g=a.adapterFor??(a=>aG(aM(a,null),a.deploymentPlatform)),h=await g(e);if(!h)continue;let i=a.openFixPr??aQ;await aO(e,f,h,{db:b,now:c,budgets:d,openFixPr:i})}catch(a){(0,k.v)(`[deploy-heal] sweep failed for ${e.name}`,a)}}async function aO(a,b,c,d){let{db:e,now:h,budgets:i}=d,l=(0,m.N6)(a.id,e);for(let a of l){let d;if("merged"!==a.status||null==a.prNumber)continue;let l=(a.finishedAt??a.createdAt)*1e3;if(!(h()-l>i.monitorWindowMs)){try{d=await b.prMergeCommitSha?.(a.prNumber)??await b.prHeadSha(a.prNumber)}catch(b){(0,k.v)(`[deploy-heal] merged sha lookup failed for job ${a.id}`,b);continue}!function(a,b,c=(0,g.Lf)()){return c.select().from(j.deploymentHealingSessions).where((0,f.eq)(j.deploymentHealingSessions.jobId,a)).all().some(a=>a.commitSha===b)}(a.id,d,e)&&function(a,b,c,d,e=(0,g.Lf)()){e.select().from(j.deploymentHealingSessions).where((0,f.eq)(j.deploymentHealingSessions.jobId,a)).all().find(a=>a.commitSha===d)||e.insert(j.deploymentHealingSessions).values({jobId:a,prNumber:b,platform:c,commitSha:d}).returning().get()}(a.id,a.prNumber,c.id,d,e)}}for(let b of e.select().from(j.deploymentHealingSessions).all().filter(a=>"monitoring"===a.status)){let e=l.find(a=>a.id===b.jobId);if(e)try{await aP(a,e,c,b,d)}catch(c){(0,k.v)(`[deploy-heal] session ${b.id} failed for ${a.name}`,c)}}}async function aP(a,b,c,d,e){var h,i;let l,{db:m,now:n,budgets:o}=e,p=(l=(h={createdAt:1e3*d.createdAt,lastPolledAt:1e3*d.updatedAt,now:n(),initialDelayMs:o.initialDelayMs,intervalMs:o.intervalMs,timeoutMs:o.timeoutMs}).now-h.createdAt)<h.initialDelayMs?"wait":l>=h.timeoutMs?"timeout":h.lastPolledAt<=h.createdAt||h.now-h.lastPolledAt>=h.intervalMs?"poll":"wait";if("wait"===p)return;if("timeout"===p)return void aL(d.id,"escalated",{},m);let q=aM(a,d.commitSha),r="ready"===(i=await c.getStatus(q))?"ready":"error"===i?"error":"pending";if("ready"===r)return void aL(d.id,"healthy",{},m);if("pending"===r)return void function(a,b=(0,g.Lf)()){b.update(j.deploymentHealingSessions).set({updatedAt:aK()}).where((0,f.eq)(j.deploymentHealingSessions.id,a)).run()}(d.id,m);let s=(await c.getLogs(q).catch(()=>"")).split("\n").slice(-o.maxLogLines).join("\n").trim(),t=aL(d.id,"failed",{logsExcerpt:s||null},m);aL(d.id,"repairing",{},m);try{let c=await e.openFixPr(a,b,t,s);aL(d.id,"repaired",{followupPrNumber:c},m)}catch(a){(0,k.v)(`[deploy-heal] fix PR failed for session ${d.id}`,a),aL(d.id,"escalated",{},m)}}async function aQ(a,b,c,d){let e=(0,g.Lf)(),f=(0,p.X$)(b.agent),h=(0,F.m)(f,e),i=new aj,j=c.commitSha.slice(0,7),l=`drydock/deploy-fix-${b.id}-${j}`,m=(0,r.Ie)(a),n=await i.prepareForNewBranch(a,l,`${b.id}-${j}`);try{let g=await ay(b,[`The deployment of the merged pull request #${c.prNumber} failed on`,`${c.platform} (commit ${c.commitSha.slice(0,7)}).`,"\nDeployment logs:\n```",d||"(no logs captured)","```\n\nDiagnose the deployment failure and make the minimal change that fixes it.\nEnsure the project builds and tests pass, then stop — the commit, push, and\npull request are handled for you."].join("\n"),n.path,{db:e,provider:f,command:h,sideSession:!0});if(0!==g.exitCode)throw Error(`${f.label} exited non-zero`);return await i.commitAndPush(n,`Fix failed ${c.platform} deployment for PR #${c.prNumber}`),m.createPr({head:l,base:a.defaultBranch,title:`Fix failed ${c.platform} deployment (PR #${c.prNumber})`,body:`The deployment for #${c.prNumber} (commit ${j}) failed. This PR addresses the deployment failure.`})}finally{try{await i.remove(n,a.path)}catch(a){(0,k.v)(`[deploy-heal] worktree cleanup failed for job ${b.id}`,a)}}}var aR=c(56634),aS=c(77058),aT=c(39152);async function aU(a={}){let b=a.db??(0,g.Lf)();if(!(0,i.mt)(b).releaseManagementEnabled)return;let c=a.now??Date.now,d=a.windowMs??36e5,e=a.notify??((a,c)=>(0,aR.JD)(a,c,b));for(let f of(0,q.uP)(b))if((0,y.A)(f).releaseEnabled)try{let g=a.forgeFor?.(f)??(0,r.Ie)(f),h="function"==typeof g.listReleases&&"function"==typeof g.listMergedPrs&&"function"==typeof g.createRelease?g:null;if(!h)continue;let i=a.generatorFor?.(f)??function(a,b){let c=(0,p.X$)(a.agent),d=(0,F.m)(c,b),e=a.defaultModel;return a=>(0,aT.NF)({provider:c,command:d,model:e},b=>b(a))}(f,b);await aV(f,g,h,i,{db:b,now:c,windowMs:d,notify:e})}catch(a){(0,k.v)(`[release] sweep failed for ${f.name}`,a)}}async function aV(a,b,c,d,e){let{db:f,now:g,windowMs:h}=e;for(let i of(0,m.N6)(a.id,f)){if("merged"!==i.status||null==i.prNumber)continue;let f=(i.finishedAt??i.createdAt)*1e3;if(!(g()-f>h))try{await aW(a,i,b,c,d,e)}catch(b){(0,k.v)(`[release] job ${i.id} failed for ${a.name}`,b)}}}async function aW(a,b,c,d,e,f){let{db:g,notify:h}=f,i=b.prNumber,j=(0,aS.$J)(a.id,i,g);if(j&&"detected"!==j.status)return;let k=await c.prHeadSha(i),l=(0,aS.v0)({repoId:a.id,mode:"auto",triggerPrNumber:i,triggerSha:k},g);if("detected"!==l.status)return;let m=await (0,aT.Dl)(l.id,{repo:a,forge:d,db:g,generate:e});"published"===m.status&&m.tag&&await h("release_published",`🚀 Released ${a.name} ${m.tag}.`)}var aX=c(44850);let aY=new Set(["ci_running","ci_failed","retrying","needs_human"]);function aZ(a){return"function"==typeof a.listReviewThreads&&"function"==typeof a.replyToReviewThread&&"function"==typeof a.updateReviewComment&&"function"==typeof a.resolveReviewThread&&"function"==typeof a.reactToReviewComment}async function a$(a={}){let b=a.db??(0,g.Lf)(),c=a.processJob??a0;for(let d of(0,q.uP)(b))if((null==a.repoId||d.id===a.repoId)&&(0,y.A)(d).autoReviewFeedback)try{let e=a.forgeFor?.(d)??(0,r.Ie)(d);if(!aZ(e))continue;for(let a of(0,m.N6)(d.id,b).filter(a=>null!=a.prNumber&&aY.has(a.status)&&!(0,aq.nc)(a.agent,b)))try{await c(d,a,e)}catch(b){(0,k.v)(`[review-feedback] job ${a.id} failed for ${d.name}`,b)}}catch(a){(0,k.v)(`[review-feedback] sweep failed for ${d.name}`,a)}}let a_=Promise.resolve();async function a0(a,b,c){var d;if(!aZ(c)||null==b.prNumber)return;let e=(0,g.Lf)(),f=(0,y.A)(a),h=(0,p.X$)(b.agent),i=(0,F.m)(h,e),j=(d={repo:a,job:b,worktrees:new aj,runSession:(a,b,c)=>ay(a,b,c,{db:e,provider:h,command:i,sideSession:!0}).then(a=>({exitCode:a.exitCode}))},async(a,b)=>{if(!d.job.branch)return{ok:!1,detail:"job has no branch"};let c=await d.worktrees.prepareForBranch(d.repo,d.job.branch,`${d.job.id}-${b.id}`);try{let a,e,f=await d.runSession(d.job,(a=b.comments[0],e=b.path?`${b.path}${b.line?`:${b.line}`:""}`:"this PR",[`A reviewer left this comment on ${e} of the current pull request:`,"",(a?.body??"").trim(),"\nMake only the change this comment asks for. Do not address anything else.\nWhen done, ensure the working tree builds and tests pass, then stop — the\ncommit and push are handled for you."].join("\n")),c.path);if(0!==f.exitCode)return{ok:!1,detail:"agent exited non-zero"};try{await d.worktrees.commitAndPush(c,`Address review feedback on ${b.path??"PR"}`)}catch{return{ok:!1,detail:"no change produced"}}return{ok:!0}}finally{try{await d.worktrees.remove(c,d.repo.path)}catch(a){(0,k.v)(`[review-feedback] worktree cleanup failed for job ${d.job.id}`,a)}}});await (0,aX.Nx)(b.id,b.prNumber,{forge:c,db:e,gate:{trustedReviewers:f.trustedReviewers,trustedBots:f.trustedBots,ignoredBots:f.ignoredBots},includeProgressReplies:f.includeProgressReplies,applyFeedback:j})}var a1=c(17717),a2=c(22287),a3=c(16719);function a4(a){return a?.trim()||null}async function a5(a={}){let b=a.runner??P.Sx,c=a.preferred??"auto",d="auto"===c?["docker","podman"]:[c];for(let a of d)try{let{exitCode:c}=await b(a,["--version"]);if(0===c)return{runtime:a}}catch{}let e=d.join(" / ");return{runtime:null,message:`No usable container runtime found (tried ${e}). Install Docker or Podman, or disable sandboxed execution for this repo.`}}function a6(a){try{return(0,aa.readFileSync)(a,"utf8")}catch{return null}}async function a7(a){var b;let c,d,e=a.deps??{},f=e.detect??(a=>a5({preferred:a})),g=await f(a.preferredRuntime);if(null===g.runtime)return{ok:!1,reason:g.message};let h=function(a,b,c){if(a.imageOverride)return a.imageOverride;let d=function(a,b){for(let c of[(0,ac.join)(a,".devcontainer","devcontainer.json"),(0,ac.join)(a,".devcontainer.json")]){let a=b.readFileText(c);if(null!=a)try{let b=JSON.parse(a.replace(/\/\*[\s\S]*?\*\//g,"").replace(/(^|[^:])\/\/.*$/gm,"$1").replace(/,\s*([}\]])/g,"$1"));if("string"==typeof b.image&&b.image.trim())return b.image.trim()}catch{}}return null}(b,c);return d||a4(a.defaultImage)}(a.config,a.worktreePath,{readFileText:e.readFileText??a6});if(!h)return{ok:!1,reason:"Sandboxed execution is enabled but no container image could be resolved. Set a per-repo sandbox image, add a devcontainer.json, or set a global default image in settings."};let i=(c=(function(a,b){switch(a){case"codex":return[{host:(0,ac.join)(b,".codex"),container:"/root/.codex"}];case"openrouter":return[];default:return[{host:(0,ac.join)(b,".claude"),container:"/root/.claude"},{host:(0,ac.join)(b,".claude.json"),container:"/root/.claude.json"}]}})((b={agent:a.agent,home:e.home??(0,ab.homedir)(),env:e.env??process.env,exists:e.exists??aa.existsSync}).agent,b.home).filter(a=>b.exists(a.host)),d=[],b.env.GH_TOKEN?.trim()?d.push("GH_TOKEN"):b.env.GITHUB_TOKEN?.trim()&&d.push("GITHUB_TOKEN"),{mounts:c,env:d});return{ok:!0,session:{runner:function(a,b={}){let c=b.baseRunner??am,d=b.cleanup??P.Sx;return(b,e,f,g)=>{let h=function(a,b,c){let d=["run","--rm","--init","--name",a.containerName,"-v",`${a.hostPath}:${a.workdir}`,"-w",a.workdir];for(let b of(a.allowNetwork||d.push("--network","none"),a.cpus&&d.push("--cpus",a.cpus),a.memory&&d.push("--memory",a.memory),a.mounts))d.push("-v",`${b.host}:${b.container}:ro`);for(let b of a.env)d.push("-e",b);return d.push(a.image,b,...c),{cmd:a.runtime,args:d}}(a,b,e),i=c(h.cmd,h.args,f,g);return{done:i.done,get spawnError(){return i.spawnError},abort:b=>{i.abort(b);try{d(a.runtime,["rm","-f",a.containerName]).catch(b=>(0,k.v)(`[sandbox] failed to remove container ${a.containerName}`,b))}catch(b){(0,k.v)(`[sandbox] failed to remove container ${a.containerName}`,b)}}}}}({runtime:g.runtime,image:h,workdir:"/workspace",hostPath:a.worktreePath,containerName:`drydock-job-${a.jobId}`,allowNetwork:a.config.allowNetwork,cpus:a.config.cpus,memory:a.config.memory,mounts:i.mounts,env:i.env},{baseRunner:e.baseRunner,cleanup:e.cleanup}),command:a.inContainerCommand}}}var a8=c(66542);let a9=new Set(["CANCELLED","ACTION_REQUIRED"]),ba=new Set(["TIMED_OUT"]),bb=/\b(ai|claude|codex|copilot|gpt|llm)\b.*\breview\b|\breview\b.*\b(ai|bot)\b/i,bc=/\bcancell?ed\b|\bsecret\b|\b(rate.?limit|secondary rate)\b|\b5\d\d\b|\b(401|403|unauthorized|forbidden)\b|service unavailable/i,bd=/\b(time(d)?.?out|timeout|intermittent|flak(y|e)|econnreset|etimedout|esockettimedout)\b/i,be=/\b(typecheck|tsc|type error|ts\d{3,5}|lint|biome|eslint|prettier|test|tests|spec|vitest|jest|pytest|assert(ion)?|build|compile|compilation|codegen|generated|snapshot|out of date|outdated)\b/i,bf=[{kind:"type",re:/\berror TS\d{2,5}\b|\bTS\d{2,5}:|\bType error:|is not assignable to/i},{kind:"dependency",re:/\bnpm ERR!|\bERR_PNPM|\bERESOLVE\b|unmet peer|peer dep|frozen lockfile|out of date lockfile|cannot find module '/i},{kind:"lint",re:/\bbiome\b|\beslint\b|\bprettier\b|\blint\/[a-z]|@typescript-eslint\/|formatter would have/i},{kind:"test",re:/\bFAIL\b|✕|✗|✖|●|\bAssertionError\b|expect\(|Expected:|Received:|\bTests?:\s|\d+ failed/i},{kind:"build",re:/failed to compile|module not found|compilation (failed|error)|\bcompile error\b|cannot compile/i},{kind:"timeout",re:/\btimed out\b|\btimeout\b|exceeded \d+\s?ms/i},{kind:"flaky",re:/\bECONNRESET\b|\bETIMEDOUT\b|\bESOCKETTIMEDOUT\b|intermittent|\bflak(y|e)\b/i}];function bg(a,b){if(0===a.length)return{kind:"unknown",evidence:""};let c=a.split("\n"),d=function(a){for(let{kind:b,re:c}of bf)if(c.test(a))return b;return"unknown"}(a);if("unknown"===d)return{kind:d,evidence:c.slice(-b).join("\n")};let e=bf.find(a=>a.kind===d),f=e?c.findIndex(a=>e.re.test(a)):-1;if(f<0)return{kind:d,evidence:c.slice(-b).join("\n")};let g=Math.max(0,f-3);return{kind:d,evidence:c.slice(g,g+b).join("\n")}}let bh={test:"A test is failing. Identify the failing test(s) from the evidence and fix the underlying code so they pass. Do not delete or skip tests, and do not weaken assertions to go green.",type:"A type error is failing the check. Fix the reported type error(s) properly — correct the types; do not silence them with `any` or `@ts-ignore`.",lint:"A lint/format check is failing. Fix the reported rule violations. Prefer the autofix (e.g. `npx biome check --write`) and resolve anything it cannot fix by hand.",build:"The build/compile step failed. Fix the compilation error(s) shown below (e.g. a broken import or unresolved module).",dependency:"A dependency step failed. Resolve the dependency problem below — a missing or incompatible package, or an out-of-date lockfile. Update package.json and the lockfile together.",timeout:"A check timed out. If a change in this branch introduced a hang or a slow path, fix it; otherwise make the affected code complete within the time budget.",flaky:"A check failed on what looks like an intermittent/network error. If the branch made the code fragile to this, harden it; otherwise the failure may not be code-related.",unknown:"A CI check is failing. Diagnose the failure from the evidence below and fix it."},bi=["healed","blocked","escalated","superseded"],bj=["blocked","escalated","superseded"],bk={triaging:["awaiting_slot",...bj],awaiting_slot:["repairing","awaiting_ci",...bj],repairing:["awaiting_ci",...bj],awaiting_ci:["verifying",...bj],verifying:["healed","cooldown",...bj],cooldown:["awaiting_slot",...bj],healed:[],blocked:[],escalated:[],superseded:[]};class bl extends Error{constructor(a,b){super(`invalid healing transition: ${a} -> ${b}`)}}let bm={maxHealAttemptsPerSession:3,maxHealAttemptsPerFingerprint:2,cooldownMs:9e5,maxConcurrentHealingRuns:1,maxEvidenceLines:200},bn=["repairing","awaiting_ci","verifying"];function bo(a){return bi.includes(a)}function bp(a,b=(0,g.Lf)()){return b.select().from(j.healingSessions).where((0,f.eq)(j.healingSessions.id,a)).get()}let bq=["triaging","cooldown"];function br(a,b,c=(0,g.Lf)()){let d=bp(a,c);!d||bo(d.status)||bs(a,b,c)}function bs(a,b,c=(0,g.Lf)()){let d=bp(a,c);if(!d)throw Error(`healing session ${a} not found`);var e=d.status;if(!bk[e].includes(b))throw new bl(e,b);return c.update(j.healingSessions).set({status:b,updatedAt:Math.floor(Date.now()/1e3)}).where((0,f.eq)(j.healingSessions.id,a)).returning().get()}function bt(a,b,c,d=(0,g.Lf)()){return d.insert(j.healingAttempts).values({sessionId:a,fingerprint:b.fingerprint,category:b.category,checkName:b.checkName,beforeSha:c}).returning().get()}function bu(a,b,c=(0,g.Lf)()){c.update(j.healingAttempts).set({status:b.status,afterSha:b.afterSha??null}).where((0,f.eq)(j.healingAttempts.id,a)).run()}let bv=new Set(["FAILURE","ERROR","CANCELLED","TIMED_OUT","ACTION_REQUIRED"]),bw=new Set(["PENDING","QUEUED","IN_PROGRESS","WAITING","REQUESTED"]);function bx(a){return 0===a.length?"none":a.some(a=>bv.has(a.state.toUpperCase()))?"failed":a.some(a=>bw.has(a.state.toUpperCase()))?"pending":"passed"}function by(a){return a.timedOut?"CI-fix session timed out":a.costExceeded?"per-job cost limit reached during the CI fix":a.spawnError?`CI-fix session failed to start: ${a.spawnError.message}`:0!==a.exitCode?"CI-fix session exited non-zero":a.settledExternally?"job was settled externally during the CI fix":a.noChanges?"CI-fix session produced no changes":null}function bz(a,b){return()=>!!(0,aq.nc)(a.agent,b)}function bA(a,b,c,d){let e=c.limit;if(!e)return null;if("auth"===e.kind||"billing"===e.kind){let c="auth"===e.kind?"authentication":"billing",f=`CI fix blocked by a provider ${c} error: ${e.rawSnippet}`.slice(0,500);return(0,m.yM)(a.id,"status",{reason:f,prNumber:b},d),{job:(0,m.dk)(a.id,"needs_human",{errorMessage:f},d),done:!0}}return a8.m.includes(e.kind)&&(0,aq.$q)(e.agent,d)?(e.latched||(0,aq.H_)(e,d),(0,m.yM)(a.id,"status",{reason:`${e.agent}_${e.kind} during CI fix`,prNumber:b},d),{job:(0,m.dk)(a.id,"ci_running",{ciRetryCount:Math.max(0,a.ciRetryCount-1)},d),done:!1}):null}function bB(a,b){let c;return{start:()=>!(a<=0)&&void 0===c&&(c=b(),!0),open:()=>a>0&&void 0!==c&&b()-c<a,reset(){c=void 0}}}let bC=a=>new Promise(b=>setTimeout(b,a)),bD=new Set(["ci_running","ci_failed","retrying"]);function bE(a,b){let c=(0,m.ax)(a,b);if(!(!c||bD.has(c.status)))return c}async function bF(a,b,c,d,e){await d.gh.commentIssue(a.issueNumber,`${c} Handing over to a human.`);let f=await d.gh.createIssue(`Follow-up: CI keeps failing for issue #${a.issueNumber}`,`Job ${a.id} could not be auto-healed on PR #${b}. ${c}`);return e.insert(j.followupIssues).values({jobId:a.id,ghIssueNumber:f,title:`Follow-up for #${a.issueNumber}`}).run(),(0,m.dk)(a.id,"needs_human",{errorMessage:c.slice(0,500)},e)}async function bG(a,b,c,d,e,f="checks stayed pending"){let g=Math.round(c/6e4),h=`CI did not complete in time (${f} for over ${g} min on PR #${b}).`;return await d.gh.commentIssue(a.issueNumber,`${h} Handing over to a human.`),(0,m.yM)(a.id,"status",{reason:"ci wait budget exceeded",prNumber:b},e),(0,m.dk)(a.id,"needs_human",{errorMessage:h.slice(0,500)},e)}async function bH(a,b,c){if(c.autoHeal)return bI(a,b,c,c.autoHeal);let d=c.db??(0,g.Lf)(),e=c.sleep??bC,f=c.pollMs??3e4,h=c.maxPolls??1/0,i=c.ciWaitMs??1/0,j=c.now??Date.now,k=j()+i,l=bB(c.mergeGateMs??0,j),n=bB(Math.max(c.mergeGateMs??0,f),j),o=c.limitBlocked??bz(a,d),p=!1,q=a,r=0;for(;r<h;){r++;let a=bE(q.id,d);if(a)return a;let g=bx(await c.gh.prChecks(b));if("pending"===g){if(l.reset(),n.reset(),j()>=k)return bG(q,b,i,c,d);await e(f);continue}if("none"===g&&!c.mergeWithoutChecks){if(l.reset(),n.reset(),j()>=k)return bG(q,b,i,c,d,"no CI checks were reported");await e(f);continue}if("none"===g){if(l.reset(),n.start()&&(0,m.yM)(q.id,"status",{reason:"no CI checks reported; settling before an unverified merge",prNumber:b},d),n.open()){if(j()>=k)return bG(q,b,i,c,d,"no CI checks were reported");await e(f);continue}let a=bE(q.id,d);if(a)return a;return(0,m.yM)(q.id,"status",{reason:"merging without CI verification (no checks reported)",prNumber:b},d),await c.gh.mergePr(b),(0,m.dk)(q.id,"merged",{prNumber:b},d)}if("passed"===g){if(n.reset(),l.start()&&(0,m.yM)(q.id,"status",{reason:"merge gate: CI green, waiting for late reviews",prNumber:b},d),l.open()){await e(f);continue}let a=bE(q.id,d);if(a)return a;return await c.gh.mergePr(b),(0,m.dk)(q.id,"merged",{prNumber:b},d)}if(l.reset(),n.reset(),o()){if(j()>=k)return bG(q,b,i,c,d,"the provider usage limit blocked the CI fix");p||((0,m.yM)(q.id,"status",{reason:"ci fix deferred: provider limit latched",prNumber:b},d),p=!0),await e(f);continue}if(p=!1,(q=(0,m.dk)(q.id,"ci_failed",{prNumber:b},d)).ciRetryCount>=3)return bF(q,b,"CI failed 3 times.",c,d);if(!q.sessionId)return(0,m.yM)(q.id,"status",{reason:"missing session id, cannot resume for CI fix"},d),(0,m.dk)(q.id,"needs_human",{errorMessage:"CI failed but no session id to resume"},d);let h=q.sessionId;q=(0,m.dk)(q.id,"retrying",{ciRetryCount:q.ciRetryCount+1},d);let{evidence:s}=bg(await c.gh.failedRunLog(b),200),t=await c.resumeSession(q,h,s),u=bA(q,b,t,d);if(u){if(q=u.job,u.done)return q;continue}let v=by(t);if(v)return(0,m.yM)(q.id,"status",{reason:v,prNumber:b},d),(0,m.dk)(q.id,"needs_human",{errorMessage:v},d);(0,aq._x)(q.agent,d),q=(0,m.dk)(q.id,"ci_running",{},d)}return(0,m.ax)(q.id,d)??q}async function bI(a,b,c,d){let e,h=c.db??(0,g.Lf)(),i=c.sleep??bC,k=c.pollMs??3e4,l=c.maxPolls??1/0,n=d.budgets??bm,o=c.now??d.now??Date.now,p=c.ciWaitMs??1/0,q=o()+p,r=bB(c.mergeGateMs??0,o),s=bB(Math.max(c.mergeGateMs??0,k),o),t=c.limitBlocked??bz(a,h),u=a,v=0;for(;v<l;){v++;let a=bE(u.id,h);if(a)return e&&br(e.sessionId,"superseded",h),a;let l=await c.gh.prChecks(b),y=bx(l);if("pending"===y){if(r.reset(),s.reset(),o()>=q)return e&&br(e.sessionId,"escalated",h),bG(u,b,p,c,h);await i(k);continue}if("none"===y&&!c.mergeWithoutChecks){if(r.reset(),s.reset(),o()>=q)return e&&br(e.sessionId,"escalated",h),bG(u,b,p,c,h,"no CI checks were reported");await i(k);continue}if("none"===y){if(r.reset(),s.start()&&(0,m.yM)(u.id,"status",{reason:"no CI checks reported; settling before an unverified merge",prNumber:b},h),s.open()){if(o()>=q)return e&&br(e.sessionId,"escalated",h),bG(u,b,p,c,h,"no CI checks were reported");await i(k);continue}let a=bE(u.id,h);if(a)return e&&br(e.sessionId,"superseded",h),a;return e&&br(e.sessionId,"superseded",h),(0,m.yM)(u.id,"status",{reason:"merging without CI verification (no checks reported)",prNumber:b},h),await c.gh.mergePr(b),(0,m.dk)(u.id,"merged",{prNumber:b},h)}if("passed"===y){if(s.reset(),r.start()&&(0,m.yM)(u.id,"status",{reason:"merge gate: CI green, waiting for late reviews",prNumber:b},h),r.open()){await i(k);continue}let a=bE(u.id,h);if(a)return e&&br(e.sessionId,"superseded",h),a;if(e){let a=await d.headSha(b);bu(e.attemptId,{status:"healed",afterSha:a},h),bs(e.sessionId,"verifying",h),bs(e.sessionId,"healed",h)}return await c.gh.mergePr(b),(0,m.dk)(u.id,"merged",{prNumber:b},h)}r.reset(),s.reset();let z=l.filter(a=>bv.has(a.state.toUpperCase())),A=await d.headSha(b);if(e){var w,x;let a="rerun"===e.kind?(w={beforeFailingCount:e.beforeFailing,afterFailingCount:z.length}).afterFailingCount>=w.beforeFailingCount?{verdict:"rejected",reason:"re-run did not clear the flaky check"}:0===w.afterFailingCount?{verdict:"healed",reason:"all checks green after re-run"}:{verdict:"progressed",reason:"fewer checks failing after re-run"}:(x={beforeSha:e.beforeSha,afterSha:A,beforeFailingCount:e.beforeFailing,afterFailingCount:z.length}).afterSha===x.beforeSha?{verdict:"rejected",reason:"no change pushed (no new commit)"}:x.afterFailingCount>=x.beforeFailingCount?{verdict:"rejected",reason:"no measurable improvement in failing checks"}:0===x.afterFailingCount?{verdict:"healed",reason:"all checks green"}:{verdict:"progressed",reason:"fewer checks failing"};bu(e.attemptId,{status:a.verdict,afterSha:A},h);let d=e.sessionId;if(e=void 0,"rejected"===a.verdict)return bs(d,"verifying",h),bs(d,"escalated",h),bF(u,b,`CI auto-heal: ${a.reason}.`,c,h);bs(d,"verifying",h),bs(d,"cooldown",h)}if(t()){if(o()>=q)return bG(u,b,p,c,h,"the provider usage limit blocked auto-heal");await i(k);continue}let B=function(a,b,c,d=(0,g.Lf)()){let e=d.select().from(j.healingSessions).where((0,f.eq)(j.healingSessions.prNumber,b)).all();for(let a of e)a.headSha===c||bo(a.status)||bs(a.id,"superseded",d);let h=e.filter(a=>a.headSha===c),i=h.find(a=>bq.includes(a.status));if(i)return bp(i.id,d)??i;for(let a of h)bo(a.status)||bs(a.id,"superseded",d);return d.insert(j.healingSessions).values({jobId:a,prNumber:b,headSha:c}).returning().get()}(u.id,b,A,h),C=await c.gh.failedRunLog(b),D=z.map(a=>(function(a,b,c=""){var d,e;let f,g,h=(d=b.name,e=b.state??"",f=e.toUpperCase(),g=`${d}
22
- ${c}`,a9.has(f)||bb.test(d)||bc.test(g)?"blocked_external":ba.has(f)||bd.test(g)?"flaky_or_ambiguous":be.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,C)),E=function(a,b=(0,g.Lf)()){return b.select().from(j.healingAttempts).where((0,f.eq)(j.healingAttempts.sessionId,a)).all()}(B.id,h),F=E.at(-1),G=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:D,attempts:E.map(a=>({fingerprint:a.fingerprint})),lastAttemptAt:F?1e3*F.createdAt:null,now:o(),activeRuns:function(a=(0,g.Lf)()){return a.select().from(j.healingSessions).all().filter(a=>bn.includes(a.status)).length}(h),budgets:n});switch(G.action){case"block":return br(B.id,"blocked",h),await c.gh.commentIssue(u.issueNumber,`CI auto-heal: ${G.reason} — not auto-fixable. Handing over to a human.`),(0,m.dk)(u.id,"needs_human",{errorMessage:`auto-heal blocked: ${G.reason}`.slice(0,500)},h);case"escalate":return br(B.id,"escalated",h),bF(u,b,`CI auto-heal: ${G.reason}.`,c,h);case"wait_slot":if(o()>=q)return br(B.id,"escalated",h),bG(u,b,p,c,h,"auto-heal waited for a free healing slot");await i(k);continue;case"cooldown":if(o()>=q)return br(B.id,"escalated",h),bG(u,b,p,c,h,"auto-heal waited out its cooldown");await i(Math.min(G.waitMs,k));continue;case"repair":{let a=u.sessionId;if(!a)return br(B.id,"escalated",h),bF(u,b,"CI failed but no session id to resume.",c,h);let d=bt(B.id,G.target,A,h);bs(B.id,"awaiting_slot",h),bs(B.id,"repairing",h);let i=null;try{u=(0,m.dk)(u.id,"ci_failed",{prNumber:b},h),u=(0,m.dk)(u.id,"retrying",{ciRetryCount:u.ciRetryCount+1},h);let e=function(a){let{kind:b,evidence:c}=bg(a.log,a.maxLines);return[`CI check "${a.checkName}" is failing on this PR.`,bh[b],"Fix only this failure, then commit and push. Failure evidence:\n",c].join("\n")}({checkName:G.target.checkName,log:C,maxLines:n.maxEvidenceLines}),k=await c.resumeSession(u,a,e),l=bA(u,b,k,h);if(l){if(!function(a,b=(0,g.Lf)()){b.delete(j.healingAttempts).where((0,f.eq)(j.healingAttempts.id,a)).run()}(d.id,h),br(B.id,l.done?"escalated":"superseded",h),u=l.job,l.done)return u;continue}(i=by(k))||((0,aq._x)(u.agent,h),bs(B.id,"awaiting_ci",h),u=(0,m.dk)(u.id,"ci_running",{},h))}catch(a){throw br(B.id,"escalated",h),a}if(i)return bu(d.id,{status:"rejected",afterSha:null},h),br(B.id,"escalated",h),bF(u,b,`CI auto-heal: ${i}.`,c,h);e={attemptId:d.id,sessionId:B.id,beforeSha:A,beforeFailing:z.length,kind:"repair"};continue}case"rerun":{if(!await c.gh.reRunFailedChecks?.(b))return br(B.id,"escalated",h),bF(u,b,`CI auto-heal: flaky check "${G.target.checkName}" requires a manual re-run (this forge cannot re-run failed checks).`,c,h);let a=bt(B.id,G.target,A,h);bs(B.id,"awaiting_slot",h),bs(B.id,"awaiting_ci",h),(0,m.yM)(u.id,"status",{reason:"auto-heal re-ran flaky check",checkName:G.target.checkName,prNumber:b},h),e={attemptId:a.id,sessionId:B.id,beforeSha:A,beforeFailing:z.length,kind:"rerun"};continue}}}return(0,m.ax)(u.id,h)??u}var bJ=c(26511),bK=c(67102);let bL=(0,ac.join)(".drydock","PR.md");function bM(a){let b=function(a){let b;try{b=(0,aa.readFileSync)((0,ac.join)(a,bL),"utf8")}catch{return null}let c=b.split("\n"),d=0;for(;d<c.length&&""===(c[d]??"").trim();)d++;if(d>=c.length)return null;let e=(c[d]??"").trim().slice(0,300);if(""===e)return null;let f=c.slice(d+1).join("\n").trim();return{title:e,body:f.length>6e4?`${f.slice(0,6e4)}
23
- … (truncated)`:f}}(a);return(0,aa.rmSync)((0,ac.join)(a,bL),{force:!0}),b}let bN=new Set;var bO=c(86888);async function bP(a,b,c,d=(0,g.Lf)(),e={}){for(let f of c)try{let c=await b.viewIssue(f.number),g=await (0,a2.dv)(a,{number:c.number,title:c.title,body:c.body},d,{generate:e.generate});if(!g.skipped&&g.subtasks.length>=bO.WE){let a=(0,bO.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:
24
-
25
- ${a}`)}}catch(b){if(b instanceof aq.vu)throw b;(0,k.v)(`[subtasks] decomposition failed for ${a.name}#${f.number}`,b)}}function bQ(a,b,c=(0,g.Lf)()){for(let d of(0,a2.t0)(a,b,c))"pending"===d.status&&(0,a2.ZY)(d.id,"in_progress",c)}function bR(a,b,c=(0,g.Lf)()){for(let d of(0,a2.t0)(a,b,c))"in_progress"===d.status&&((0,a2.ZY)(d.id,"deferred",c),(0,a2.ZY)(d.id,"pending",c))}var bS=c(51455),bT=c(16746);async function bU(a){let b,{job:c,prNumber:d,repo:e,forge:f,db:h,provider:i,command:j,model:l}=a;try{let k=await f.prDiff(d);if(!k.trim())return null;let o=await f.viewIssue(c.issueNumber),p=(0,a2.t0)(e.id,c.issueNumber,h),q={issueNumber:c.issueNumber,issueTitle:o.title,issueBody:o.body,subtasks:p.map(a=>({ordinal:a.ordinal,title:a.title})),diff:k},r=a.generate;if(!r){var n;let c;b=await (0,bS.mkdtemp)((0,ac.join)((0,ab.tmpdir)(),"drydock-verify-")),c=(n={provider:i,command:j,model:l,cwd:b,repoId:e.id,db:h,runner:a.runner}).timeoutMs??18e4,r=async a=>{try{let{text:b,exitCode:d}=await (0,bJ.D)({provider:n.provider,command:n.command,model:n.model,cwd:n.cwd,prompt:(0,bT.cQ)(a),repoId:n.repoId,type:"verify",timeoutMs:c,runner:n.runner,db:n.db});if(0!==d)return null;return(0,bT.Vz)(b)}catch{return null}}}let s=await r(q);if(!s)return(0,m.yM)(c.id,"verification",{ok:!1},h),null;let t=function(a,b,c,d=(0,g.Lf)()){let e=new Map((0,a2.t0)(a,b,d).map(a=>[a.ordinal,a])),f=0,h=0,i=[];for(let a of c.verdicts){let b=e.get(a.ordinal);if(b)if("done"===a.status)!function(a,b){let c=a.status;if("done"!==c&&"skipped"!==c)try{if("in_progress"===c)return void(0,a2.ZY)(a.id,"done",b);(0,a2.ZY)(a.id,"in_progress",b),(0,a2.ZY)(a.id,"done",b)}catch{}}(b,d),f+=1;else if("deferred"===a.status)try{(0,a2.ZY)(b.id,"deferred",d),h+=1}catch{}else i.push(b.title)}return{done:f,deferred:h,pendingTitles:i}}(e.id,c.issueNumber,s,h);return await f.commentIssue(c.issueNumber,(0,T.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")}(s,t))),(0,m.yM)(c.id,"verification",{ok:!0,summary:s.summary,done:t.done,deferred:t.deferred,pending:t.pendingTitles.length},h),s}catch(a){return(0,k.v)(`[verify] verification pass failed for ${e.name}#${c.issueNumber}`,a),null}finally{if(b)try{await (0,bS.rm)(b,{recursive:!0,force:!0})}catch{}}}function bV(a,b){return a.length>b?`${a.slice(0,b)}
26
- … (truncated)`:a}function bW(a,b){let[c,d]="codex"===b?["OpenAI","Codex"]:"openrouter"===b?["OpenRouter","OpenRouter"]:["Anthropic","Claude"];switch(a){case"rate_limit":return`${c} API rate limit hit — waiting for the window to clear`;case"overloaded":return`${c} API overloaded — waiting before retrying`;default:return`${d} usage limit reached — waiting for the quota to reset`}}async function bX(a,b={}){let c=b.db??(0,g.Lf)(),d=b.notify??((a,b)=>(0,aR.JD)(a,b,c)),e=await bY(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 bY(a,b,c){let d,e=b.db??(0,g.Lf)(),h=(0,m.ax)(a,e);if(!h)throw Error(`job ${a} not found`);let l=(0,q.L8)(h.repoId,e);if(!l)throw Error(`repo ${h.repoId} not found`);"queued"===h.status&&(0,m.dk)(h.id,"working",{},e);let n=b.worktrees??new aj,o=(0,r.Ie)(l),s=(0,p.X$)(h.agent),t=(0,F.m)(s,e),u=(0,i.mt)(e),v=l.maxJobMinutes??u.maxJobMinutes,w=6e4*v,y=(l.maxCiWaitMinutes??u.maxCiWaitMinutes)*6e4,z=l.maxJobCostUsd??u.maxJobCostUsd,A={mode:"docker"===l.sandbox?"docker":"none",imageOverride:a4(l.sandboxImage),defaultImage:u.sandboxDefaultImage,allowNetwork:!!l.sandboxAllowNetwork,cpus:a4(l.sandboxCpus),memory:a4(l.sandboxMemory)},B="docker"===A.mode&&"http"!==s.kind,C=b.prepareSandbox??a7,D={command:t},E=b.runSession??((a,b,c)=>ay(a,b,c,{db:e,provider:s,command:D.command,runner:D.runner,timeoutMs:w,costCapUsd:z})),H=b.createPr??(a=>o.createPr(a)),I=b.runPlan??((a,b,c)=>(0,bJ.D)({provider:s,command:t,model:a.model??l.defaultModel,cwd:c,prompt:b,repoId:l.id,type:"plan",timeoutMs:w,db:e}).then(a=>({text:a.text,exitCode:a.exitCode}))),J=b.commentIssue??((a,b)=>o.commentIssue(a,b)),K=b.viewIssue??(a=>o.viewIssue(a).then(a=>({title:a.title,body:a.body}))),L=b.consumePrMetadata??bM,M=b.resumeLimitSession??((a,b,c)=>{if(!a.sessionId)throw Error(`job ${a.id} has no session id to resume after a limit`);return az(a,a.sessionId,"",c,{db:e,provider:s,command:D.command,runner:D.runner,timeoutMs:w,costCapUsd:z,resumePrompt:b,resumeModel:a.model??l.defaultModel,resumeMaxTurns:a.maxTurns})}),N=async a=>{let b=a.latched?a.resetAt??Math.floor(Date.now()/1e3)+60:(0,aq.H_)(a,e).latch.blockedUntil;(0,m.yM)(h.id,"status",{reason:`${a.agent}_${a.kind}`,blockedUntil:b,snippet:a.rawSnippet},e),l.autoDecompose&&bR(l.id,h.issueNumber,e);let c=(0,m.dk)(h.id,"waiting_limit",{errorMessage:bW(a.kind,a.agent),availableAt:b,limitKind:a.kind},e);try{let c=new Date(1e3*b).toISOString().slice(0,16).replace("T"," ");await J(h.issueNumber,`⏳ Drydock paused this job: ${bW(a.kind,a.agent)}. It will retry automatically (next attempt around ${c} UTC).`)}catch(a){(0,k.v)(`[run-job] limit-park comment failed for job ${h.id}`,a)}return c},O=b.runBabysitter??((a,b)=>{var c,f;return bH(a,b,{gh:o,db:e,ciWaitMs:y,mergeGateMs:6e4*l.mergeGateMinutes,mergeWithoutChecks:l.mergeWithoutChecks,sleep:(c={repoId:l.id,prNumber:b,onNudge:a=>(0,m.yM)(h.id,"status",{reason:`woken by webhook: ${a}`,prNumber:b},e)},a=>new Promise(b=>{let d={repoId:c.repoId,prNumber:c.prNumber,wake:a=>{bN.delete(d),clearTimeout(e);try{c.onNudge?.(a)}catch{}b()}},e=setTimeout(()=>{bN.delete(d),b()},a);e.unref?.(),bN.add(d)})),resumeSession:(f={worktrees:n,worktree:()=>d,settled:()=>{let a=(0,m.ax)(h.id,e);return!a||"aborted"===a.status||"interrupted"===a.status},resume:(a,b,c,d)=>az(a,b,c,d,{db:e,provider:s,command:D.command,runner:D.runner,timeoutMs:w,costCapUsd:z})},async(a,b,c)=>{let d=f.worktree();if(!d)throw Error(`job ${a.id} has no live worktree to resume in`);let e=await f.resume(a,b,c,d.path),g={exitCode:e.exitCode,timedOut:e.timedOut,costExceeded:e.costExceeded,spawnError:e.spawnError,limit:e.limit};if(by(g))return g;if(f.settled?.())return{...g,settledExternally:!0};try{await f.worktrees.commitAndPush(d,`Fix CI for #${a.issueNumber}`)}catch(a){if(a instanceof ah)return{...g,noChanges:!0};throw a}return g}),autoHeal:l.autoHealCi?{headSha:a=>o.prHeadSha(a),provider:l.platform}:void 0})}),P=b.verify??((a,b)=>bU({job:a,prNumber:b,repo:l,forge:o,db:e,provider:s,command:t,model:a.model??l.defaultModel}).then(()=>void 0)),Q=b.audit??((a,b)=>(0,bK.Cr)({job:a,prNumber:b,repo:l,forge:o,db:e}).then(()=>void 0));try{let a;if(d=await n.prepare(l,h.id,h.issueNumber),(0,m.yM)(h.id,"worktree",{path:d.path,branch:d.branch},e),B){let a=await C({config:A,worktreePath:d.path,jobId:h.id,agent:s.id,inContainerCommand:s.defaultCommand,preferredRuntime:u.containerRuntime});if(!a.ok)return l.autoDecompose&&bR(l.id,h.issueNumber,e),(0,m.dk)(h.id,"needs_human",{errorMessage:`Sandbox preflight failed: ${a.reason}`.slice(0,500)},e);D.runner=a.session.runner,D.command=a.session.command,(0,m.yM)(h.id,"status",{reason:`sandboxed execution (${A.mode})`},e)}let b=!!h.limitKind&&!!h.sessionId&&s.supportsResume;h.limitKind&&e.update(j.jobs).set({limitKind:null}).where((0,f.eq)(j.jobs.id,h.id)).run();let i=async a=>{let b=(0,ao.XZ)(l.id,an._.main,e);e.update(j.jobs).set({implementPromptVersion:b.version}).where((0,f.eq)(j.jobs.id,h.id)).run();let c={title:"",body:""};try{c=await K(h.issueNumber)}catch(a){(0,k.v)(`[run-job] failed to fetch issue #${h.issueNumber} for job ${h.id}`,a)}let d=bV(c.title,500),g=bV(c.body,2e4),i=(0,ao.Xm)(b.content,{ISSUE_NUM:h.issueNumber,BRANCH:a.branch,REPO_NAME:l.name,ISSUE_TITLE:d,ISSUE_BODY:g});if(l.autoDecompose){let a=(0,a2.t0)(l.id,h.issueNumber,e);if(a.length>0){var n;i+=(n=a.map(a=>({title:a.title,status:a.status})),0===n.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,bO.cp)(n)].join("\n")),bQ(l.id,h.issueNumber,e)}}if(i+=(0,a3.Y)(l.agentInstructions),l.planFirst){let b=(0,ao.Xm)((0,ao.yx)(l.id,an._.plan,e),{ISSUE_NUM:h.issueNumber,BRANCH:a.branch,REPO_NAME:l.name,ISSUE_TITLE:d,ISSUE_BODY:g});try{let c=await I((0,m.ax)(h.id,e),b,a.path),d=c.text.trim();if(0===c.exitCode&&d.length>0){let a;(0,m.yM)(h.id,"status",{reason:"plan stage complete"},e),i+=(a=d.trim())?["\n\n## Implementation plan\nFollow this plan unless the code contradicts it:\n",a.length>1e4?`${a.slice(0,1e4)}
27
- … (truncated)`:a].join("\n"):"";try{await J(h.issueNumber,`**Implementation plan** (job ${h.id}):
28
-
29
- ${d}`)}catch(a){(0,k.v)(`[run-job] plan comment failed for job ${h.id}`,a)}}else(0,m.yM)(h.id,"status",{reason:"plan stage failed, continuing without a plan",exitCode:c.exitCode},e)}catch(a){(0,k.v)(`[run-job] plan stage failed for job ${h.id}`,a),(0,m.yM)(h.id,"status",{reason:"plan stage failed, continuing without a plan"},e)}}return E((0,m.ax)(h.id,e),i,a.path)};if(b){(0,m.yM)(h.id,"status",{reason:"resuming session after provider limit",sessionId:h.sessionId},e),l.autoDecompose&&bQ(l.id,h.issueNumber,e);let b=(0,ao.Xm)((0,ao.yx)(l.id,an._.limitResume,e),{ISSUE_NUM:h.issueNumber,BRANCH:d.branch,REPO_NAME:l.name});a=await M((0,m.ax)(h.id,e),b,d.path)}else a=await i(d);let o=(0,m.ax)(h.id,e);if("aborted"===o.status||"interrupted"===o.status)return l.autoDecompose&&bR(l.id,h.issueNumber,e),o;if(a.timedOut)return l.autoDecompose&&bR(l.id,h.issueNumber,e),(0,m.dk)(h.id,"needs_human",{errorMessage:`${s.label} timed out after ${v} minutes`},e);if(a.costExceeded)return l.autoDecompose&&bR(l.id,h.issueNumber,e),(0,m.dk)(h.id,"needs_human",{errorMessage:`per-job cost limit of $${z} reached`},e);if(a.spawnError)return l.autoDecompose&&bR(l.id,h.issueNumber,e),(0,m.dk)(h.id,"needs_human",{errorMessage:`failed to start ${t}: ${a.spawnError.message}`},e);if(a.limit){let b=a.limit;if("auth"===b.kind||"billing"===b.kind){l.autoDecompose&&bR(l.id,h.issueNumber,e);let a="auth"===b.kind?"authentication":"billing";return(0,m.dk)(h.id,"needs_human",{errorMessage:`${s.label} ${a} error: ${b.rawSnippet}`.slice(0,500)},e)}if(!(0,aq.$q)(s.id,e))return l.autoDecompose&&bR(l.id,h.issueNumber,e),(0,m.dk)(h.id,"needs_human",{errorMessage:`${bW(b.kind,b.agent)} (auto-wait is disabled)`},e);return await N(b)}if(0!==a.exitCode)return l.autoDecompose&&bR(l.id,h.issueNumber,e),(0,m.dk)(h.id,"needs_human",{errorMessage:`${s.label} exited non-zero`},e);if((0,aq._x)(s.id,e),l.adrGating){let a=(0,a1.Pe)("pending_review",e,l.id);if(a.length>0)return l.autoDecompose&&bR(l.id,h.issueNumber,e),(0,m.dk)(h.id,"needs_human",{errorMessage:`Blocked by ${a.length} pending ADR review(s).`},e)}let p=L(d.path),q=p?.title??`Fix #${h.issueNumber}`;try{await n.commitAndPush(d,q)}catch(a){if(a instanceof ah)return l.autoDecompose&&bR(l.id,h.issueNumber,e),(0,m.dk)(h.id,"needs_human",{errorMessage:"Agent produced no changes"},e);throw a}let r=p?.title??(0,x.ts)(l.id,e).find(a=>a.number===h.issueNumber)?.title??`Fix #${h.issueNumber}`,w=`Closes #${h.issueNumber}`,y=p?.body?`${p.body}
30
-
31
- ${w}`:w,F=await H({head:d.branch,base:l.defaultBranch,title:r,body:y});if((0,m.dk)(h.id,"ci_running",{branch:d.branch,prNumber:F},e),await c("pr_opened",`🔀 PR opened: ${l.id}#${h.issueNumber} (PR #${F}).`),l.verifyPr)try{await P((0,m.ax)(h.id,e),F)}catch(b){let a=b instanceof Error?b.message:String(b);(0,m.yM)(h.id,"error",{message:`verification pass failed: ${a}`},e)}if(l.autoPrAudit)try{await Q((0,m.ax)(h.id,e),F)}catch(b){let a=b instanceof Error?b.message:String(b);(0,m.yM)(h.id,"error",{message:`pr audit failed: ${a}`},e)}let G=await O((0,m.ax)(h.id,e),F);return l.autoDecompose&&("merged"===G.status?!function(a,b,c=(0,g.Lf)()){for(let d of(0,a2.t0)(a,b,c))!function(a,b){let c=a.status;if("done"!==c&&"skipped"!==c){if("in_progress"===c)return(0,a2.ZY)(a.id,"done",b);(0,a2.ZY)(a.id,"in_progress",b),(0,a2.ZY)(a.id,"done",b)}}(d,c)}(l.id,h.issueNumber,e):bR(l.id,h.issueNumber,e)),G}catch(c){let a=c instanceof Error?c.message:String(c);(0,m.yM)(h.id,"error",{message:a},e);let b=(0,m.ax)(h.id,e);if(["working","ci_running","ci_failed","retrying"].includes(b.status)){l.autoDecompose&&bR(l.id,h.issueNumber,e);try{return(0,m.dk)(h.id,"needs_human",{errorMessage:a.slice(0,500)},e)}catch(a){if(!(a instanceof G.xh))throw a;return(0,k.v)(`[run-job] job ${h.id} settled concurrently during failure handling`,a),(0,m.ax)(h.id,e)}}return b}finally{if(d)try{await n.remove(d,l.path)}catch(a){(0,k.v)(`[run-job] worktree cleanup failed for job ${h.id}`,a)}}}let bZ=!1,b$=new Set;function b_(){return(0,ac.join)(ad(),"instance.lock")}function b0(a){try{var b;let c,d,e,f;return b=(0,aa.readFileSync)(a,"utf8"),d=(c=JSON.parse(b)).pid,e="number"==typeof d&&Number.isInteger(d)&&d>0?d:null,f=c.ts,{pid:e,ts:"number"==typeof f&&Number.isFinite(f)?f:null}}catch{return{pid:null,ts:null}}}function b1(a){let b=(0,aa.openSync)(a,"wx");try{(0,aa.writeSync)(b,JSON.stringify({pid:process.pid,ts:Date.now()}))}finally{(0,aa.closeSync)(b)}}let b2=null;function b3(){b2&&(clearInterval(b2),b2=null)}let b4={active:!1},b5={active:!1},b6={claude:{active:!1},codex:{active:!1},openrouter:{active:!1}};function b7(a,b,c,d,e={}){var f;let h=(0,p.X$)(a.agent),i=(f={provider:h,command:(0,F.m)(h,d),model:a.defaultModel,cwd:a.path,db:d,runner:e.runner},async a=>{let{text:b,exitCode:c,stderr:d}=await (0,bJ.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){let a=f.provider.classifyFailure?.({exitCode:c,stderr:d,resultText:b});if(a&&a8.m.includes(a.kind)){let b=f.db??(0,g.Lf)();if((0,aq.$q)(f.provider.id,b))throw(0,aq.H_)(a,b),new aq.vu(a)}return[]}let e=b.match(/\[[\s\S]*\]/);if(!e)return[];try{let a=JSON.parse(e[0]);if(!Array.isArray(a))return[];return a.filter(a=>"string"==typeof a).map(a=>a.trim()).filter(Boolean)}catch{return[]}});return bP(a,b,c,d,{generate:i})}let b8=["needs_human","aborted"];async function b9(a,b,c,d,e,g){var h,i;let k=e.some(a=>b.readyLabels.includes(a)),l=e.some(a=>b.blockingLabels.includes(a));return!!k&&!l&&!!(0,y.i)(b,d.authorAssociation)&&(h=a.id,i=d.number,!(g.select().from(j.jobs).where((0,f.Uo)((0,f.eq)(j.jobs.repoId,h),(0,f.eq)(j.jobs.issueNumber,i),(0,f.RV)(j.jobs.status,[...b8]))).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 ca=G.RH.filter(a=>!G.kl.includes(a)),cb=["working","ci_running","ci_failed","retrying","waiting_limit"];async function cc(a,b,c,d){let e="codex"===a?"Codex capacity":"openrouter"===a?"OpenRouter window":"Claude quota";for(let f of(0,m.i1)(["waiting_limit"],d).filter(b=>b.agent===a)){try{(0,m.dk)(f.id,"queued",{availableAt:null,errorMessage:null},d),(0,m.yM)(f.id,"status",{reason:`${a}_limit_cleared`},d)}catch(a){(0,k.v)(`[driver] limit requeue failed for job ${f.id}`,a);continue}let g=b.find(a=>a.id===f.repoId);if(g)try{let a=c.forgeFor?.(g)??(0,r.Ie)(g);await a.commentIssue(f.issueNumber,`▶️ ${e} available again — resuming job #${f.id}.`)}catch(a){(0,k.v)(`[driver] limit-resume comment failed for job ${f.id}`,a)}}}async function cd(a={}){let b=a.db??(0,g.Lf)(),c=a.runJob??bX,e=(0,q.uP)(b),h=a.triage??C,o=a.decompose??b7;for(let c of e)try{await (0,s.v)("low",async()=>{let d=a.forgeFor?.(c)??(0,r.Ie)(c),e=a.fetchIssues??(async(a,b)=>(await d.refreshRateLimit?.(),d.listAllIssues())),g=await e(c.path,c.queueLabel);(0,x.VK)(c.id,g,b);let i=b.select().from(j.issues).where((0,f.eq)(j.issues.repoId,c.id)).all(),l=new Map(i.map(a=>[a.number,a])),p=(0,y.A)(c);if(p.autoTriageEnabled&&await h(c,d,g,b),p.autoDecompose&&!(0,aq.nc)(c.agent,b)){let a=g.filter(a=>{let b=a.labels.map(a=>a.name);return b.includes(c.queueLabel)||b.some(a=>p.readyLabels.includes(a))});if(a.length>0)try{await o(c,d,a,b)}catch(a){(0,k.v)(`[driver] decomposition sweep failed for ${c.name}`,a)}}for(let a of g){var q,s;let e=a.labels.map(a=>a.name),g=e.includes(c.queueLabel),h=!!p.autoProcessEnabled&&await b9(c,p,d,a,e,b);if(!g&&!h)continue;let i=w({number:a.number,title:a.title,labels:e});if("approved"!==i.decision||function(a,b,c){return(0,m.i1)([...ca],a).some(a=>a.repoId===b&&a.issueNumber===c)}(b,c.id,a.number))continue;h&&a.author&&p.priorityAuthors.includes(a.author)&&(q=c.id,s=a.number,b.update(j.issues).set({priority:-1}).where((0,f.Uo)((0,f.eq)(j.issues.repoId,q),(0,f.eq)(j.issues.number,s))).run());let k=l.get(a.number);(0,n.Ix)({repoId:c.id,issueNumber:a.number,model:k?.modelOverride??c.defaultModel,agent:k?.agentOverride??c.agent},b)}})}catch(a){a instanceof t.OE?console.debug(`[driver] ${c.name} sweep yielded: ${a.message}`):(0,k.v)(`[driver] issue sync failed for ${c.name}`,a)}(0,l.PH)("cost_limit"===(0,i.Jf)(b).reason,b4,b),(0,l.mW)((0,O.DB)(b),b5,b);try{if(function(a=Date.now()){return!$&&(void 0===d||a-d>=9e5)}()){let c=a.credentialProbe??(a=>_({db:a}));Promise.resolve(c(b)).catch(a=>(0,k.v)("[driver] credential probe round failed",a))}}catch(a){(0,k.v)("[driver] credential watchdog sweep failed",a)}(0,n.pp)({expiredBefore:Math.floor(Date.now()/1e3)},b);try{let a=cr(b);a.length>0&&console.log(`[driver] aborted ${a.length} externally-aborted job(s)`)}catch(a){(0,k.v)("[driver] external-abort reconcile failed",a)}let u=[];for(let c of p.FD){let d=(0,aq.nc)(c,b);if((0,l.RQ)(c,!!d,b6[c],b),d){u.push(c);continue}try{await cc(c,e,a,b)}catch(a){(0,k.v)(`[driver] ${c} limit-parked job resume sweep failed`,a)}}let v=u.length>0?u:void 0,z=(0,i.mt)(b).maxParallelJobs,A=(0,n._$)();for(;!bZ&&(0,i.Jf)(b).allowed&&b$.size<z;){let a=e.filter(a=>(0,i.DA)(a.id,b).allowed).filter(a=>!(a.sequential&&function(a,b){return(0,m.i1)([...cb],a).some(a=>a.repoId===b)}(b,a.id))).map(a=>a.id);if(0===a.length)break;let d=(0,n.Ym)({repoIds:a,worker:A,leaseMs:n.sV,excludeAgents:v},b);if(!d)break;let f=d.id,g=d.leaseToken;b$.add(f);let h=setInterval(()=>{try{(0,n.jQ)(f,g,{},b)}catch(a){(0,k.v)(`[driver] heartbeat failed for job ${f}`,a)}},n.m);h.unref?.(),c(f).catch(a=>(0,k.v)(`[driver] job ${f} failed`,a)).finally(()=>{clearInterval(h),(0,n.wL)(f,g,b),b$.delete(f)})}let B=a.reviewFeedback??(a=>(function(a={}){let b=a_.then(()=>a$(a));return a_=b.catch(()=>{}),b})({db:a}));try{await (0,s.v)("low",()=>B(b))}catch(a){(0,k.v)("[driver] review-feedback sweep failed",a)}let E=a.deploymentHealing??(a=>aN({db:a}));try{await (0,s.v)("low",()=>E(b))}catch(a){(0,k.v)("[driver] deployment-healing sweep failed",a)}let F=a.releaseManagement??(a=>aU({db:a}));try{await (0,s.v)("low",()=>F(b))}catch(a){(0,k.v)("[driver] release-management sweep failed",a)}let G=a.branchJanitor??(a=>N({db:a}));try{await (0,s.v)("low",()=>G(b))}catch(a){(0,k.v)("[driver] branch-janitor sweep failed",a)}try{let c=(0,i.mt)(b);if(c.openrouterEnabled&&(0,D.Mf)({db:b,refreshHours:c.openrouterCatalogRefreshHours})){let c=a.openrouterCatalogSync??cf;Promise.resolve(c(b)).catch(a=>(0,k.v)("[driver] openrouter catalog sync failed",a))}}catch(a){(0,k.v)("[driver] openrouter catalog sweep failed",a)}}let ce=!1;async function cf(a){if(!ce){ce=!0;try{let b=(0,i.mt)(a);await (0,D.yd)({db:a,apiKey:(0,E.t)(b)||void 0})}finally{ce=!1}}}let cg=!1,ch=!1,ci=/^job-(\d+)$/,cj=/^fb-(\d+)-/,ck=/^dh-(\d+)-/;async function cl(a={}){let b=a.db??(0,g.Lf)(),c=a.run??P.Sx,d=function(a){let b=a.select({id:j.jobs.id,status:j.jobs.status}).from(j.jobs).all(),c=new Set;for(let a of b)G.kl.includes(a.status)||c.add(a.id);return c}(b),e=0;for(let a of(0,q.uP)(b)){let g;await c("git",["-C",a.path,"worktree","prune"]).catch(()=>void 0);let h=af(a.name);try{g=(0,aa.readdirSync)(h,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name)}catch{continue}for(let i of g){let g=ci.exec(i)??cj.exec(i)??ck.exec(i);if(!g)continue;let l=Number(g[1]);if(d.has(l)||function(a,b){let c=b.select({status:j.jobs.status}).from(j.jobs).where((0,f.eq)(j.jobs.id,a)).get();return void 0!==c&&!G.kl.includes(c.status)}(l,b))continue;let m=(0,ac.join)(h,i);await c("git",["-C",a.path,"worktree","remove","--force",m]).catch(()=>void 0);try{(0,aa.rmSync)(m,{recursive:!0,force:!0}),e++}catch(a){(0,k.v)(`[worktree-reaper] failed to remove ${m}`,a)}}}return e}let cm=!1,cn=new Map;function co(a,b){cn.set(a,b)}function cp(a){cn.delete(a)}function cq(a,b=5e3){let c=cn.get(a);return"function"==typeof c&&(c(b),cn.delete(a),!0)}function cr(a=(0,g.Lf)()){let b=[];for(let c of[...cn.keys()])try{(0,m.ax)(c,a)?.status==="aborted"&&cq(c)&&b.push(c)}catch(a){(0,k.v)(`[orchestrator] external-abort kill failed for job ${c}`,a)}return b}function cs(a=5e3){let b=[...cn.keys()];for(let b of cn.values())b(a);return cn.clear(),b}async function ct(){bZ=!0,cg=!1,e&&clearTimeout(e),e=void 0,await (0,l.CZ)().catch(a=>(0,k.v)("[orchestrator] drain notify failed",a)),cs(5e3),await function(a=3e4,b=100){let c=Date.now()+a;return new Promise(a=>{let d=()=>{if(0===b$.size||Date.now()>=c)return a();setTimeout(d,b)};d()})}(8e3);try{let a=(0,g.Lf)();for(let b of a.select().from(j.jobs).where((0,f.RV)(j.jobs.status,["working","ci_running","ci_failed","retrying"])).all())try{(0,m.dk)(b.id,"interrupted",{},a)}catch(a){(0,k.v)(`[orchestrator] shutdown transition failed for job ${b.id}`,a)}}catch(a){(0,k.v)("[orchestrator] shutdown DB update failed",a)}b3();let a=b_();if(b0(a).pid===process.pid)try{(0,aa.unlinkSync)(a)}catch{}}function cu(){if(cm)return;if(cm=!0,!process.env.VITEST)if(function(){let a=b_();(0,aa.mkdirSync)((0,ac.dirname)(a),{recursive:!0});try{return b1(a),!0}catch{}if(!function(a,b){let{pid:c,ts:d}=a;return!(null!==c&&c!==process.pid&&function(a){try{return process.kill(a,0),!0}catch{return!1}}(c))||null===d||b-d>9e4}(b0(a),Date.now()))return!1;try{return(0,aa.unlinkSync)(a),b1(a),!0}catch{return!1}}()){!function(a=3e4){b3(),b2=setInterval(()=>{!function(){let a=b_();if(b0(a).pid!==process.pid)return!1;let b=`${a}.${process.pid}.tmp`;try{if((0,aa.writeFileSync)(b,JSON.stringify({pid:process.pid,ts:Date.now()})),b0(a).pid!==process.pid)return(0,aa.unlinkSync)(b),!1;return(0,aa.renameSync)(b,a),!0}catch{try{(0,aa.unlinkSync)(b)}catch{}return!1}}()&&b3()},a),b2.unref?.()}();try{let{requeued:a,interrupted:b}=function(a=(0,g.Lf)()){return{requeued:(0,n.pp)({},a),interrupted:function(a=(0,g.Lf)()){let b=a.select().from(j.jobs).where((0,f.RV)(j.jobs.status,o)).all();for(let c of b)a.update(j.jobs).set({status:"interrupted"}).where((0,f.eq)(j.jobs.id,c.id)).run(),(0,m.yM)(c.id,"status",{from:c.status,to:"interrupted",reason:"recovery"},a);return b.length}(a)}}();a>0&&console.log(`[orchestrator] requeued ${a} orphaned job(s)`),b>0&&console.log(`[orchestrator] recovered ${b} interrupted job(s)`)}catch(a){(0,k.v)("[orchestrator] recovery failed",a)}cl().then(a=>{a>0&&console.log(`[orchestrator] reaped ${a} orphaned worktree(s)`)}).catch(a=>(0,k.v)("[orchestrator] worktree reap failed",a)).finally(()=>{let a,b;!function(a={}){if(cg)return;cg=!0;let b=a.tick??(()=>cd()),c=a.intervalMs??1e3*(0,i.mt)().pollIntervalSec,d=async()=>{if(cg){if(!ch){ch=!0,Date.now();try{await b()}catch(a){(0,k.v)("[driver] tick failed",a)}finally{ch=!1}}cg&&(e=setTimeout(d,c))}};d()}(),(a=()=>{try{let{jobEventsDeleted:a}=function(a=(0,g.Lf)(),b={}){let c=b.days??(0,i.mt)(a).retentionDays,d=b.vacuum??!0,e=Math.floor((b.now?.getTime()??Date.now())/1e3)-86400*c,k=a.select({id:j.jobs.id}).from(j.jobs).where((0,f.Uo)((0,f.Pe)(j.jobs.finishedAt),(0,f.lt)(j.jobs.finishedAt,e))),l=a.delete(j.jobEvents).where((0,f.RV)(j.jobEvents.jobId,k)).run().changes;return d&&a.run((0,h.ll)`VACUUM`),{jobEventsDeleted:l,vacuumed:d,cutoff:e}}((0,g.Lf)());a>0&&console.log(`[orchestrator] pruned ${a} job event(s)`)}catch(a){(0,k.v)("[orchestrator] prune sweep failed",a)}})(),b=setInterval(a,864e5),b.unref?.()})}else console.warn("[orchestrator] another instance holds the lock; driver loop not started");let a=async a=>{console.log(`[orchestrator] ${a} received, shutting down gracefully`),await ct(),process.exit(0)};process.once("SIGINT",a),process.once("SIGTERM",a)}},74929:(a,b,c)=>{"use strict";c.d(b,{L8:()=>i,uP:()=>h});var d=c(80179),e=c(79241);c(44411),c(34850),c(40900),c(77712);var f=c(95310);c(57807);var g=c(92958);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()}},75857:(a,b,c)=>{"use strict";c.d(b,{C:()=>p,B:()=>o});var d=c(27905),e=c(14873),f=c(35924),g=c(64760);g.Ik({status:g.k5(["ok","warning","blocked"]),windowType:g.Yj(),resetsAt:g.ai().nullable(),capturedAt:g.ai()});var h=c(31003),i=c(27796),j=c(20443);let k={neutral:"bg-secondary text-muted-foreground",success:"bg-success/10 text-success",warning:"bg-warning/10 text-warning",destructive:"bg-destructive/10 text-destructive"};function l(a){return a&&"unknown"!==a?"five_hour"===a?"5h window":"weekly"===a?"weekly window":a.replace(/_/g," "):null}function m(a){let[,b]=(0,f.useReducer)(a=>a+1,0)}function n(a){return function(a,b){if(null===a||a<=b)return null;let c=a-b;if(c<60)return`${c}s`;if(c<3600)return`${Math.floor(c/60)}m`;if(c<86400){let a=Math.floor(c/3600),b=Math.floor(c%3600/60);return b>0?`${a}h ${b}m`:`${a}h`}let d=Math.floor(c/86400),e=Math.floor(c%86400/3600);return e>0?`${d}d ${e}h`:`${d}d`}(a.resetsAt,Math.floor(Date.now()/1e3))}function o({view:a}){let b,c=(0,h.p)()?n(a):null;m(null!==c),b="blocked"===a.state?c?`Claude limited \xb7 ${c}`:"Claude limited":"warning"===a.state?c?`Claude \xb7 ${c}`:"Claude limit near":"ok"===a.state?"Claude OK":"Claude usage —";let f="unknown"===a.state?"Claude subscription usage: no recent reading yet":`Claude ${l(a.windowType)??"subscription"} — ${a.label}${c?` \xb7 resets in ${c}`:""}`;return(0,d.jsxs)(i.E,{tone:a.tone,title:f,className:"shrink-0",children:[(0,d.jsx)(e.A,{className:"h-3 w-3","aria-hidden":!0}),b]})}function p({view:a}){let b,c=(0,h.p)()?n(a):null;m(null!==c);let f=l(a.windowType);return b="unknown"===a.state?"No recent reading yet.":a.blocked?c?`Parked — resets in ${c}`:"Parked until the window resets":c?`Resets in ${c}`:f?`${f} active`:"Within limits",(0,d.jsxs)(j.Zp,{pad:"lg",children:[(0,d.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsx)("span",{className:`flex h-8 w-8 items-center justify-center rounded-lg ${k[a.tone]}`,children:(0,d.jsx)(e.A,{className:"h-4 w-4","aria-hidden":!0})}),(0,d.jsx)("span",{className:"text-sm font-medium text-foreground",children:"Claude usage"})]}),(0,d.jsx)(i.E,{tone:a.tone,children:a.label})]}),(0,d.jsxs)("div",{className:"mt-3 flex items-baseline justify-between",children:[(0,d.jsx)("span",{className:"text-sm text-muted-foreground",children:b}),f&&"unknown"!==a.state&&(0,d.jsx)("span",{className:"text-xs text-muted-foreground/70",children:f})]})]})}},77058:(a,b,c)=>{"use strict";c.d(b,{Fg:()=>m,v0:()=>j,$J:()=>n,tm:()=>k,Dn:()=>p,Cq:()=>o});var d=c(79241),e=c(80179),f=c(95310),g=c(92958);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()}let l=["detected","evaluating","proposed","publishing"];function m(a,b=(0,f.Lf)()){return b.select().from(g.releaseRuns).where((0,d.Uo)((0,d.eq)(g.releaseRuns.repoId,a),(0,d.RV)(g.releaseRuns.status,[...l]))).get()}function n(a,b,c=(0,f.Lf)()){return c.select().from(g.releaseRuns).where((0,d.Uo)((0,d.eq)(g.releaseRuns.repoId,a),(0,d.eq)(g.releaseRuns.triggerPrNumber,b))).orderBy((0,e.i)(g.releaseRuns.id)).get()}function o(a,b,c={},e=(0,f.Lf)()){let j=k(a,e);if(!j)throw Error(`release run ${a} not found`);var l=j.status;if(!h[l].includes(b))throw new i(l,b);let{prNumbers:m,...n}=c;return e.update(g.releaseRuns).set({status:b,updatedAt:Math.floor(Date.now()/1e3),...n,...void 0!==m?{prNumbers:JSON.stringify(m)}:{}}).where((0,d.eq)(g.releaseRuns.id,a)).returning().get()}function p(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}))}},77712:(a,b,c)=>{"use strict";c.d(b,{Cx:()=>i,IP:()=>h}),c(44411);var d=c(34850),e=c(95310),f=c(92958);function g(a,b,c){let d=JSON.stringify(b);c.insert(f.settings).values({key:`provider_usage:${a}`,value:d}).onConflictDoUpdate({target:f.settings.key,set:{value:d}}).run()}function h(a,b,c=(0,e.Lf)()){g(a,b,c)}function i(a,b=(0,e.Lf)(),c=Math.floor(Date.now()/1e3)){let f=(0,d.bC)(a,c);return g("codex",f,b),f}},82931:(a,b,c)=>{"use strict";c.d(b,{M:()=>g,g:()=>h});var d=c(73024),e=c(76760);function f(){let a=JSON.parse((0,d.readFileSync)((0,e.join)(process.cwd(),"package.json"),"utf8")).version;return"string"==typeof a?a:null}function g(a={}){let b=a.env??process.env,c=b.DRYDOCK_VERSION?.trim();if(c)return c;let d=a.readPackageVersion??f;try{return d()??"0.0.0"}catch{return"0.0.0"}}function h(a=process.env){let b=a.DRYDOCK_INSTALL_KIND;return"global"===b||"npx"===b?b:"local"}},84637:(a,b,c)=>{"use strict";c.d(b,{Sv:()=>f,lw:()=>e,x8:()=>k});var d=c(67055);async function e(a,b=fetch){let c=new AbortController,d=setTimeout(()=>c.abort(),1e4);d.unref?.();try{let d=await b("https://openrouter.ai/api/v1/key",{headers:{Authorization:`Bearer ${a}`},signal:c.signal});if(d.ok)return{ok:!0};let e=(await d.text().catch(()=>"")).slice(0,200);return{ok:!1,error:`OpenRouter HTTP ${d.status}: ${e}`}}catch(a){if(c.signal.aborted)return{ok:!1,error:"OpenRouter key probe timed out after 10000ms"};return{ok:!1,error:a instanceof Error?a.message:String(a)}}finally{clearTimeout(d)}}class f extends Error{constructor(a,b,c){super(`OpenRouter HTTP ${a}: ${b}`),this.status=a,this.body=b,this.retryAfterMs=c,this.name="OpenRouterHttpError"}}let g=d.Ik({index:d.ai(),id:d.Yj().optional(),function:d.Ik({name:d.Yj().optional(),arguments:d.Yj().optional()}).optional()}),h=d.Ik({choices:d.YO(d.Ik({delta:d.Ik({content:d.Yj().nullish(),tool_calls:d.YO(g).optional()}).passthrough().optional(),finish_reason:d.Yj().nullish()})).optional(),usage:d.Ik({prompt_tokens:d.ai().optional(),completion_tokens:d.ai().optional(),cost:d.ai().nullish()}).passthrough().nullish(),error:d.Ik({code:d.KC([d.ai(),d.Yj()]).nullish(),message:d.Yj().optional()}).passthrough().optional()});function i(a){return"assistant"===a.role&&a.toolCalls?.length?{role:"assistant",content:a.content||null,tool_calls:a.toolCalls.map(a=>({id:a.id,type:"function",function:{name:a.name,arguments:a.arguments}}))}:"tool"===a.role?{role:"tool",tool_call_id:a.toolCallId,content:a.content}:{role:a.role,content:a.content}}async function*j(a){let b=a.getReader(),c=new TextDecoder,d="";try{for(;;){let{done:a,value:e}=await b.read();if(a)break;let f=(d+=c.decode(e,{stream:!0})).indexOf("\n");for(;f>=0;)yield d.slice(0,f).replace(/\r$/,""),f=(d=d.slice(f+1)).indexOf("\n")}(d+=c.decode())&&(yield d)}finally{b.releaseLock()}}async function k(a){let b=a.fetchImpl??fetch,c={Authorization:`Bearer ${a.apiKey}`,"Content-Type":"application/json"};a.siteUrl&&(c["HTTP-Referer"]=a.siteUrl),a.appName&&(c["X-Title"]=a.appName);let d={model:a.model,messages:a.messages.map(i),stream:!0,usage:{include:!0}};a.tools?.length&&(d.tools=a.tools.map(a=>({type:"function",function:{name:a.name,description:a.description,parameters:a.parameters}}))),void 0!==a.maxTokens&&(d.max_tokens=a.maxTokens);let e=await b("https://openrouter.ai/api/v1/chat/completions",{method:"POST",headers:c,body:JSON.stringify(d),signal:a.signal});if(!e.ok){let a=(await e.text().catch(()=>"")).slice(0,2e3);throw new f(e.status,a,function(a){if(!a)return;if(/^\d+$/.test(a))return 1e3*Number(a);let b=Date.parse(a);if(Number.isNaN(b))return;let c=b-Date.now();return c>0?c:void 0}(e.headers.get("retry-after")))}if(!e.body)throw new f(e.status,"response had no body");let g="",k=null,l=!1,m={promptTokens:0,completionTokens:0,costUsd:0},n=new Map;for await(let b of j(e.body)){let c;if(!b||b.startsWith(":")||!b.startsWith("data:"))continue;let d=b.slice(5).trim();if("[DONE]"===d){l=!0;break}try{c=h.parse(JSON.parse(d))}catch{continue}if(c.error)throw new f("number"==typeof c.error.code?c.error.code:500,c.error.message??"stream error");let e=c.choices?.[0];for(let b of(e?.delta?.content&&(g+=e.delta.content,a.onTextDelta?.(e.delta.content)),e?.delta?.tool_calls??[])){let a=n.get(b.index)??{id:"",name:"",argumentParts:[]};b.id&&(a.id=b.id),b.function?.name&&(a.name=b.function.name),b.function?.arguments&&a.argumentParts.push(b.function.arguments),n.set(b.index,a)}e?.finish_reason&&(k=e.finish_reason),c.usage&&(m.promptTokens=c.usage.prompt_tokens??m.promptTokens,m.completionTokens=c.usage.completion_tokens??m.completionTokens,m.costUsd=c.usage.cost??m.costUsd)}if(!l&&null===k)throw new f(502,"OpenRouter stream ended before completion");return{text:g,toolCalls:[...n.entries()].sort(([a],[b])=>a-b).map(([,a])=>({id:a.id,name:a.name,arguments:a.argumentParts.join("")})),finishReason:k,usage:m}}},86888:(a,b,c)=>{"use strict";c.d(b,{WE:()=>f,cp:()=>k,o:()=>j,sw:()=>g});var d=c(98103),e=c(40900);let f=2;function g(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 h=/^\s*[-*]\s*\[[ xX]\]\s+(.+?)\s*$/,i=/^\s*#*\s*(Bug\s+\d+\s*(?:[—:-])\s*.+?)\s*$/;async function j(a,b={}){let c=function(a){let b=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);if(b.length>=f)return b;let c=function(a){let b=[];for(let c of a.split("\n")){let a=c.match(i);a?.[1]&&b.push(a[1].trim())}return b}(a);return c.length>=f?c:[]}(a.body);if(c.length>=f)return{titles:c,source:"heuristic"};if(b.generate)try{let c=(await b.generate(a)).map(a=>a.trim()).filter(Boolean);if(c.length>=f)return{titles:c,source:"agent"}}catch(b){if(b instanceof e.vu)throw b;(0,d.v)(`[decompose] agent fallback failed for issue #${a.number}`,b)}return{titles:[],source:"none"}}function k(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")}},87105:(a,b,c)=>{"use strict";c.d(b,{D:()=>d});let d=async(a,b)=>{let c=await fetch(a,{method:b?.method??"GET",headers:b?.headers,body:b?.body,redirect:"manual"}),d=await c.text(),e={};return c.headers.forEach((a,b)=>{e[b.toLowerCase()]=a}),{status:c.status,ok:c.ok,body:d,headers:e}}},88162:(a,b,c)=>{"use strict";c.d(b,{ej:()=>e});let d=new Set;function e(){for(let a of[...d])try{a()}catch{}}},92958:(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,openrouterModels:()=>z,prQuestions:()=>v,promptTemplates:()=>k,releaseRuns:()=>w,repos:()=>j,reviewFeedbackItems:()=>s,settings:()=>x});var d=c(97095),e=c(723),f=c(78675),g=c(87130),h=c(60123),i=c(92713);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(!0),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),planFirst:(0,f.nd)("plan_first",{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("[]"),trustedBots:(0,g.Qq)("trusted_bots").notNull().default('["cursor[bot]","coderabbitai[bot]"]'),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"),mergeGateMinutes:(0,f.nd)("merge_gate_minutes").notNull().default(0),mergeWithoutChecks:(0,f.nd)("merge_without_checks",{mode:"boolean"}).notNull().default(!1),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"),autoPrAudit:(0,f.nd)("auto_pr_audit",{mode:"boolean"}).notNull().default(!1),prAuditAgent:(0,g.Qq)("pr_audit_agent"),prAuditModel:(0,g.Qq)("pr_audit_model"),prAuditLanguage:(0,g.Qq)("pr_audit_language").notNull().default("en"),prAuditPostOnPr:(0,f.nd)("pr_audit_post_on_pr",{mode:"boolean"}).notNull().default(!1),escalateModelOnRetry:(0,f.nd)("escalate_model_on_retry",{mode:"boolean"}).notNull().default(!1),sandbox:(0,g.Qq)("sandbox").notNull().default("none"),sandboxImage:(0,g.Qq)("sandbox_image"),sandboxAllowNetwork:(0,f.nd)("sandbox_allow_network",{mode:"boolean"}).notNull().default(!1),sandboxCpus:(0,g.Qq)("sandbox_cpus"),sandboxMemory:(0,g.Qq)("sandbox_memory"),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"),implementPromptVersion:(0,f.nd)("implement_prompt_version"),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"),limitKind:(0,g.Qq)("limit_kind"),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)})),z=(0,e.D)("openrouter_models",{id:(0,g.Qq)("id").primaryKey(),name:(0,g.Qq)("name").notNull(),description:(0,g.Qq)("description").notNull().default(""),contextLength:(0,f.nd)("context_length").notNull().default(0),promptCostPerToken:(0,h.x)("prompt_cost_per_token").notNull().default(0),completionCostPerToken:(0,h.x)("completion_cost_per_token").notNull().default(0),supportedParameters:(0,g.Qq)("supported_parameters").notNull().default("[]"),expirationDate:(0,f.nd)("expiration_date"),isFree:(0,f.nd)("is_free",{mode:"boolean"}).notNull().default(!1),supportsTools:(0,f.nd)("supports_tools",{mode:"boolean"}).notNull().default(!1),removedAt:(0,f.nd)("removed_at"),syncedAt:(0,f.nd)("synced_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({freeIdx:(0,i.Pe)("openrouter_models_free_idx").on(a.isFree),removedIdx:(0,i.Pe)("openrouter_models_removed_idx").on(a.removedAt)}))},95310:(a,b,c)=>{"use strict";let d,e;c.d(b,{Lf:()=>n});var f=c(73024),g=c(76760),h=c(87550),i=c.n(h),j=c(56943),k=c(98103),l=c(92958);let m=/^PRAGMA\s+foreign_keys\s*=/i;function n(){if(e)throw e;if(!d){let a=process.env.DRYDOCK_DB??(0,g.resolve)(process.cwd(),"data/drydock.db");try{d=function(a){":memory:"!==a&&(0,f.mkdirSync)((0,g.dirname)(a),{recursive:!0});let b=new(i())(a);try{return b.pragma("journal_mode = WAL"),b.pragma("foreign_keys = ON"),!function(a){let b,c=process.env.DRYDOCK_MIGRATIONS??(0,g.resolve)(process.cwd(),"drizzle");try{b=(0,f.readdirSync)(c).filter(a=>a.endsWith(".sql")).sort()}catch{return}a.exec("CREATE TABLE IF NOT EXISTS __migrations (name TEXT PRIMARY KEY)");let d=new Set(a.prepare("SELECT name FROM __migrations").all().map(a=>a.name)),e=a.prepare("INSERT INTO __migrations (name) VALUES (?)");for(let h of b){if(d.has(h))continue;let b=(0,f.readFileSync)((0,g.join)(c,h),"utf8");a.pragma("foreign_keys = OFF");try{a.transaction(()=>{for(let c of b.split("--\x3e statement-breakpoint")){let b=c.trim();!b||m.test(b)||a.exec(b)}let c=a.pragma("foreign_key_check");if(c.length>0)throw Error(`migration ${h} would leave ${c.length} foreign key violation(s); rolled back`);e.run(h)})()}finally{a.pragma("foreign_keys = ON")}}}(b),(0,j.f)(b,{schema:l})}catch(a){throw b.close(),a}}(a)}catch(a){throw e=a instanceof Error?a:Error(String(a))}Promise.resolve().then(c.bind(c,73683)).then(a=>a.startOrchestrator()).catch(a=>(0,k.v)("[orchestrator] bootstrap failed",a))}return d}},98103:(a,b,c)=>{"use strict";c.d(b,{v:()=>f});var d=c(16680);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))}}};