@nilsr0711/drydock 0.1.7 → 0.1.9

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 (157) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +4 -4
  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 +1 -1
  24. package/.next/standalone/.next/server/app/api/control/shutdown/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/cost/export/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/health/route.js +1 -1
  27. package/.next/standalone/.next/server/app/api/health/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/sse/dashboard/route.js +1 -1
  29. package/.next/standalone/.next/server/app/api/sse/dashboard/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/sse/jobs/[id]/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/webhooks/[repoId]/route.js +1 -1
  32. package/.next/standalone/.next/server/app/api/webhooks/[repoId]/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/costs/page.js +1 -1
  34. package/.next/standalone/.next/server/app/costs/page.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/costs/page_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/jobs/[id]/page.js +3 -3
  37. package/.next/standalone/.next/server/app/jobs/[id]/page.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/jobs/[id]/page_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/jobs/page.js +2 -2
  40. package/.next/standalone/.next/server/app/jobs/page.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/jobs/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/needs-human/page.js +2 -2
  43. package/.next/standalone/.next/server/app/needs-human/page.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/needs-human/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/page.js +2 -2
  46. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/prompts/page.js +2 -2
  49. package/.next/standalone/.next/server/app/prompts/page.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/prompts/page_client-reference-manifest.js +1 -1
  51. package/.next/standalone/.next/server/app/repos/[id]/page.js +2 -2
  52. package/.next/standalone/.next/server/app/repos/[id]/page.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/repos/[id]/page_client-reference-manifest.js +1 -1
  54. package/.next/standalone/.next/server/app/settings/page.js +2 -2
  55. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  56. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  57. package/.next/standalone/.next/server/app-paths-manifest.json +4 -4
  58. package/.next/standalone/.next/server/chunks/152.js +3 -0
  59. package/.next/standalone/.next/server/chunks/304.js +1 -1
  60. package/.next/standalone/.next/server/chunks/387.js +34 -0
  61. package/.next/standalone/.next/server/chunks/40.js +1 -1
  62. package/.next/standalone/.next/server/chunks/403.js +1 -0
  63. package/.next/standalone/.next/server/chunks/475.js +19 -0
  64. package/.next/standalone/.next/server/chunks/50.js +1 -0
  65. package/.next/standalone/.next/server/chunks/521.js +1 -1
  66. package/.next/standalone/.next/server/chunks/578.js +1 -1
  67. package/.next/standalone/.next/server/chunks/614.js +2 -2
  68. package/.next/standalone/.next/server/chunks/668.js +1 -0
  69. package/.next/standalone/.next/server/chunks/786.js +1 -1
  70. package/.next/standalone/.next/server/chunks/83.js +1 -1
  71. package/.next/standalone/.next/server/chunks/908.js +1 -1
  72. package/.next/standalone/.next/server/chunks/944.js +1 -0
  73. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  74. package/.next/standalone/.next/server/pages/500.html +1 -1
  75. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  77. package/.next/standalone/.next/static/chunks/3433-ece700d2e393c23b.js +1 -0
  78. package/.next/standalone/.next/static/chunks/3894-4f48e3cc5be58e10.js +1 -0
  79. package/.next/standalone/.next/static/chunks/5080-16cb43874ff5c536.js +1 -0
  80. package/.next/standalone/.next/static/chunks/6634-74f0b66587b57037.js +1 -0
  81. package/.next/standalone/.next/static/chunks/{1642-a1ea35450c1b5c95.js → 8264-c27834f1552f983a.js} +1 -1
  82. package/.next/standalone/.next/static/chunks/8382-5201fc3dd1f64e60.js +1 -0
  83. package/.next/{static/chunks/4624-5e23973d35b58ca5.js → standalone/.next/static/chunks/8745-8b3833b3d2afa30c.js} +1 -1
  84. package/.next/standalone/.next/static/chunks/app/adrs/page-ca11e90e9404af90.js +1 -0
  85. package/.next/standalone/.next/static/chunks/app/costs/{page-24d086bf67620e30.js → page-5d66d93815eea63a.js} +1 -1
  86. package/.next/standalone/.next/static/chunks/app/jobs/[id]/page-dfb41b4785fd7cbb.js +1 -0
  87. package/.next/standalone/.next/static/chunks/app/jobs/page-98215ec1497b829e.js +1 -0
  88. package/.next/standalone/.next/static/chunks/app/layout-134301ff0a9b828d.js +1 -0
  89. package/.next/standalone/.next/static/chunks/app/needs-human/page-569fc0e6aefc7677.js +1 -0
  90. package/.next/standalone/.next/static/chunks/app/page-504585be128c823c.js +1 -0
  91. package/.next/standalone/.next/static/chunks/app/prompts/page-c6bf6a4c782035ac.js +1 -0
  92. package/.next/standalone/.next/static/chunks/app/repos/[id]/page-c0c4531c2af46526.js +1 -0
  93. package/.next/standalone/.next/static/chunks/app/settings/page-84a44ab52a0ff49d.js +1 -0
  94. package/.next/standalone/.next/static/css/{bdce0893cf6b9cb9.css → 600a5b5311ad42be.css} +1 -1
  95. package/.next/standalone/drizzle/0034_human_instruction.sql +1 -0
  96. package/.next/standalone/drizzle/0035_agent_release.sql +4 -0
  97. package/.next/standalone/drizzle/0036_adopt_claude_mem.sql +1 -0
  98. package/.next/standalone/mcp-server.cjs +43157 -0
  99. package/.next/standalone/package.json +5 -3
  100. package/.next/static/chunks/3433-ece700d2e393c23b.js +1 -0
  101. package/.next/static/chunks/3894-4f48e3cc5be58e10.js +1 -0
  102. package/.next/static/chunks/5080-16cb43874ff5c536.js +1 -0
  103. package/.next/static/chunks/6634-74f0b66587b57037.js +1 -0
  104. package/.next/static/chunks/{1642-a1ea35450c1b5c95.js → 8264-c27834f1552f983a.js} +1 -1
  105. package/.next/static/chunks/8382-5201fc3dd1f64e60.js +1 -0
  106. package/.next/{standalone/.next/static/chunks/4624-5e23973d35b58ca5.js → static/chunks/8745-8b3833b3d2afa30c.js} +1 -1
  107. package/.next/static/chunks/app/adrs/page-ca11e90e9404af90.js +1 -0
  108. package/.next/static/chunks/app/costs/{page-24d086bf67620e30.js → page-5d66d93815eea63a.js} +1 -1
  109. package/.next/static/chunks/app/jobs/[id]/page-dfb41b4785fd7cbb.js +1 -0
  110. package/.next/static/chunks/app/jobs/page-98215ec1497b829e.js +1 -0
  111. package/.next/static/chunks/app/layout-134301ff0a9b828d.js +1 -0
  112. package/.next/static/chunks/app/needs-human/page-569fc0e6aefc7677.js +1 -0
  113. package/.next/static/chunks/app/page-504585be128c823c.js +1 -0
  114. package/.next/static/chunks/app/prompts/page-c6bf6a4c782035ac.js +1 -0
  115. package/.next/static/chunks/app/repos/[id]/page-c0c4531c2af46526.js +1 -0
  116. package/.next/static/chunks/app/settings/page-84a44ab52a0ff49d.js +1 -0
  117. package/.next/static/css/{bdce0893cf6b9cb9.css → 600a5b5311ad42be.css} +1 -1
  118. package/README.md +66 -21
  119. package/bin/drydock.mjs +77 -2
  120. package/drizzle/0034_human_instruction.sql +1 -0
  121. package/drizzle/0035_agent_release.sql +4 -0
  122. package/drizzle/0036_adopt_claude_mem.sql +1 -0
  123. package/package.json +5 -3
  124. package/.next/standalone/.next/server/chunks/382.js +0 -31
  125. package/.next/standalone/.next/server/chunks/468.js +0 -1
  126. package/.next/standalone/.next/server/chunks/822.js +0 -1
  127. package/.next/standalone/.next/server/chunks/99.js +0 -18
  128. package/.next/standalone/.next/static/chunks/1298-7ac9c00c70b27598.js +0 -1
  129. package/.next/standalone/.next/static/chunks/3433-719d6f55f39342d8.js +0 -1
  130. package/.next/standalone/.next/static/chunks/3894-c7b01dcfcf83d89b.js +0 -1
  131. package/.next/standalone/.next/static/chunks/7690-6dcfd9ae4cbf4e7d.js +0 -1
  132. package/.next/standalone/.next/static/chunks/app/adrs/page-1dfee698ea4c111f.js +0 -1
  133. package/.next/standalone/.next/static/chunks/app/jobs/[id]/page-8a9e4ed64c3303fe.js +0 -1
  134. package/.next/standalone/.next/static/chunks/app/jobs/page-4180ccc9acd3ddba.js +0 -1
  135. package/.next/standalone/.next/static/chunks/app/layout-189fa697d72d1fdf.js +0 -1
  136. package/.next/standalone/.next/static/chunks/app/needs-human/page-e458ffa78c06a6fa.js +0 -1
  137. package/.next/standalone/.next/static/chunks/app/page-add53cbf6d87a3f5.js +0 -1
  138. package/.next/standalone/.next/static/chunks/app/prompts/page-ff6cc30777232933.js +0 -1
  139. package/.next/standalone/.next/static/chunks/app/repos/[id]/page-cd11007841a5d73f.js +0 -1
  140. package/.next/standalone/.next/static/chunks/app/settings/page-280668b9c92e9b48.js +0 -1
  141. package/.next/static/chunks/1298-7ac9c00c70b27598.js +0 -1
  142. package/.next/static/chunks/3433-719d6f55f39342d8.js +0 -1
  143. package/.next/static/chunks/3894-c7b01dcfcf83d89b.js +0 -1
  144. package/.next/static/chunks/7690-6dcfd9ae4cbf4e7d.js +0 -1
  145. package/.next/static/chunks/app/adrs/page-1dfee698ea4c111f.js +0 -1
  146. package/.next/static/chunks/app/jobs/[id]/page-8a9e4ed64c3303fe.js +0 -1
  147. package/.next/static/chunks/app/jobs/page-4180ccc9acd3ddba.js +0 -1
  148. package/.next/static/chunks/app/layout-189fa697d72d1fdf.js +0 -1
  149. package/.next/static/chunks/app/needs-human/page-e458ffa78c06a6fa.js +0 -1
  150. package/.next/static/chunks/app/page-add53cbf6d87a3f5.js +0 -1
  151. package/.next/static/chunks/app/prompts/page-ff6cc30777232933.js +0 -1
  152. package/.next/static/chunks/app/repos/[id]/page-cd11007841a5d73f.js +0 -1
  153. package/.next/static/chunks/app/settings/page-280668b9c92e9b48.js +0 -1
  154. /package/.next/standalone/.next/static/{-sJQutzNDvUvcdmf3YlJA → gBXyOslZ8CoJrAVnOEHDm}/_buildManifest.js +0 -0
  155. /package/.next/standalone/.next/static/{-sJQutzNDvUvcdmf3YlJA → gBXyOslZ8CoJrAVnOEHDm}/_ssgManifest.js +0 -0
  156. /package/.next/static/{-sJQutzNDvUvcdmf3YlJA → gBXyOslZ8CoJrAVnOEHDm}/_buildManifest.js +0 -0
  157. /package/.next/static/{-sJQutzNDvUvcdmf3YlJA → gBXyOslZ8CoJrAVnOEHDm}/_ssgManifest.js +0 -0
@@ -1,18 +0,0 @@
1
- "use strict";exports.id=99,exports.ids=[99],exports.modules={1065:(a,b,c)=>{c.d(b,{ND:()=>n,RD:()=>l,TG:()=>h,_M:()=>j});var d=c(73024),e=c(48161),f=c(76760),g=c(77597);function h(){return process.env.DRYDOCK_HOME??(0,f.join)((0,e.homedir)(),".drydock")}function i(a){return a.replace(/[^a-zA-Z0-9._-]/g,"-")}function j(a){return(0,f.join)(h(),"worktrees",i(a))}class k extends Error{}class l extends k{constructor(){super("nothing to commit")}}let m=new Map;class n{constructor(a=g.Sx){this.run=a}withRepoLock(a,b){let c=(m.get(a)??Promise.resolve()).then(b,b);return m.set(a,c.then(()=>void 0,()=>void 0)),c}async git(a,b){let c=await this.run("git",a,b);if(0!==c.exitCode)throw new k(c.stderr.trim()||`git ${a[0]} failed`);return c.stdout}async prepare(a,b,c=0){let e=`drydock/issue-${c}-job-${b}`,g=(0,f.join)(j(a.name),`job-${b}`),h=await this.withRepoLock(a.path,async()=>(await this.git(["-C",a.path,"worktree","remove","--force",g]).catch(()=>void 0),(0,d.rmSync)(g,{recursive:!0,force:!0}),await this.git(["-C",a.path,"worktree","prune"]).catch(()=>void 0),await this.git(["-C",a.path,"branch","-D",e]).catch(()=>void 0),await this.git(["-C",a.path,"worktree","add","-b",e,g,a.defaultBranch]),this.resolveBase(a.path,e)));return{path:g,branch:e,base:h}}async prepareForBranch(a,b,c){let d=(0,f.join)(j(a.name),`fb-${i(c)}`),e=await this.withRepoLock(a.path,async()=>(await this.git(["-C",a.path,"fetch","origin",b]),await this.git(["-C",a.path,"worktree","add",d,b]),this.resolveBase(a.path,b)));return{path:d,branch:b,base:e}}async prepareForNewBranch(a,b,c){let d=(0,f.join)(j(a.name),`dh-${i(c)}`),e=await this.withRepoLock(a.path,async()=>(await this.git(["-C",a.path,"worktree","add","-b",b,d,a.defaultBranch]),this.resolveBase(a.path,b)));return{path:d,branch:b,base:e}}async resolveBase(a,b){return(await this.git(["-C",a,"rev-parse",b])).trim()}async hasNewCommits(a){return!!a.base&&Number.parseInt((await this.git(["rev-list","--count",`${a.base}..HEAD`],a.path)).trim()||"0",10)>0}async commitAndPush(a,b){if(await this.git(["add","-A"],a.path),""!==(await this.git(["status","--porcelain"],a.path)).trim())await this.git(["commit","-m",b],a.path);else if(!await this.hasNewCommits(a))throw new l;await this.git(["push","-u","origin",a.branch],a.path)}async remove(a,b){await this.withRepoLock(b,async()=>{await this.git(["-C",b,"worktree","remove","--force",a.path]),await this.git(["-C",b,"worktree","prune"])})}}},2412:(a,b,c)=>{c.d(b,{N6:()=>n,_S:()=>j,ax:()=>k,dk:()=>m,i1:()=>o,yM:()=>l});var d=c(97496),e=c(14694),f=c(2025),g=c(64537),h=c(34973),i=c(52479);function j(a,b=(0,f.Lf)()){let c=b.insert(g.jobs).values({repoId:a.repoId,issueNumber:a.issueNumber,status:"queued",model:a.model,agent:a.agent??"claude",maxTurns:a.maxTurns??40,dedupeKey:a.dedupeKey??null}).returning().get();return(0,h.ej)(),c}function k(a,b=(0,f.Lf)()){return b.select().from(g.jobs).where((0,d.eq)(g.jobs.id,a)).get()}function l(a,b,c,d=(0,f.Lf)()){d.insert(g.jobEvents).values({jobId:a,type:b,payload:JSON.stringify(c??{})}).run()}function m(a,b,c={},e=(0,f.Lf)()){let j=e.transaction(e=>{let f=k(a,e);if(!f)throw Error(`job ${a} not found`);(0,i.QJ)(f.status,b);let h=Math.floor(Date.now()/1e3),j={};"working"!==b||f.startedAt||(j.startedAt=h),["merged","needs_human","aborted"].includes(b)&&(j.finishedAt=h);let m=e.update(g.jobs).set({...j,...c,status:b}).where((0,d.eq)(g.jobs.id,a)).returning().get();return l(a,"status",{from:f.status,to:b},e),m});return(0,h.ej)(),j}function n(a,b=(0,f.Lf)()){return b.select().from(g.jobs).where((0,d.eq)(g.jobs.repoId,a)).orderBy((0,e.i)(g.jobs.createdAt)).all()}function o(a,b=(0,f.Lf)()){return b.select().from(g.jobs).where((0,d.RV)(g.jobs.status,a)).all()}},9617:(a,b,c)=>{let d;c.d(b,{Ix:()=>u,Ym:()=>q,_$:()=>p,jQ:()=>r,m:()=>n,pp:()=>t,sV:()=>m,wL:()=>s});var e=c(77598),f=c(48161),g=c(97496),h=c(84232),i=c(2025),j=c(64537),k=c(2412),l=c(52479);let m=3e4,n=1e4,o=()=>Math.floor(Date.now()/1e3);function p(){return d||(d=`${(0,f.hostname)()}#${process.pid}`),d}function q(a={},b=(0,i.Lf)()){let{repoIds:c,excludeAgents:d}=a;if(c&&0===c.length)return;let f=a.leaseMs??m,l=a.worker??p(),n=a.now??o();return b.transaction(a=>{let b=a.select({job:j.jobs}).from(j.jobs).leftJoin(j.issues,(0,g.Uo)((0,g.eq)(j.issues.repoId,j.jobs.repoId),(0,g.eq)(j.issues.number,j.jobs.issueNumber))).where((0,g.Uo)((0,g.eq)(j.jobs.status,"queued"),(0,g.or)((0,g.kZ)(j.jobs.availableAt),(0,g.wJ)(j.jobs.availableAt,n)),c?(0,g.RV)(j.jobs.repoId,c):void 0,d&&d.length>0?(0,g.KL)(j.jobs.agent,d):void 0)).orderBy((0,h.ll)`COALESCE(${j.issues.priority}, 1e9)`,j.jobs.createdAt).get()?.job;if(b)return(0,k.dk)(b.id,"working",{leaseToken:(0,e.randomUUID)(),leaseExpiresAt:n+Math.ceil(f/1e3),workerId:l,attempts:b.attempts+1,availableAt:null},a)})}function r(a,b,c={},d=(0,i.Lf)()){let e=c.leaseMs??m,f=c.now??o();return d.update(j.jobs).set({leaseExpiresAt:f+Math.ceil(e/1e3)}).where((0,g.Uo)((0,g.eq)(j.jobs.id,a),(0,g.eq)(j.jobs.leaseToken,b),(0,g.eq)(j.jobs.status,"working"))).run().changes>0}function s(a,b,c=(0,i.Lf)()){return c.update(j.jobs).set({leaseToken:null,leaseExpiresAt:null,workerId:null}).where((0,g.Uo)((0,g.eq)(j.jobs.id,a),(0,g.eq)(j.jobs.leaseToken,b))).run().changes>0}function t(a={},b=(0,i.Lf)()){let c=a.now??o(),d=a.expiredBefore,e=void 0===d?void 0:(0,g.or)((0,g.kZ)(j.jobs.leaseExpiresAt),(0,g.wJ)(j.jobs.leaseExpiresAt,d)),f=b.select().from(j.jobs).where((0,g.Uo)((0,g.eq)(j.jobs.status,"working"),e)).all();for(let a of f)b.update(j.jobs).set({status:"queued",leaseToken:null,leaseExpiresAt:null,workerId:null,availableAt:c+function(a,b=5,c=300){return a<=0?0:Math.min(b*2**(a-1),c)}(a.attempts)}).where((0,g.eq)(j.jobs.id,a.id)).run(),(0,k.yM)(a.id,"status",{from:"working",to:"queued",reason:"lease_expired"},b);return f.length}function u(a,b=(0,i.Lf)()){let c=a.dedupeKey??`${a.repoId}:${a.issueNumber}`;if(!b.select({id:j.jobs.id}).from(j.jobs).where((0,g.Uo)((0,g.eq)(j.jobs.dedupeKey,c),(0,g.KL)(j.jobs.status,[...l.kl]))).get())try{return(0,k._S)({...a,dedupeKey:c},b)}catch(a){if(a instanceof Error&&"string"==typeof a.code&&"SQLITE_CONSTRAINT_UNIQUE"===a.code)return;throw a}}},16544:(a,b,c)=>{c.d(b,{A:()=>f,i:()=>g});let d=new Set(["OWNER","MEMBER","COLLABORATOR"]);function e(a){try{let b=JSON.parse(a);return Array.isArray(b)?b.filter(a=>"string"==typeof a):[]}catch{return[]}}function f(a){return{autoTriageEnabled:a.autoTriageEnabled,autoProcessEnabled:a.autoProcessEnabled,autoHealCi:a.autoHealCi,autoReviewFeedback:a.autoReviewFeedback,mergeWithoutChecks:a.mergeWithoutChecks,autoResolveMergeConflicts:a.autoResolveMergeConflicts,includeProgressReplies:a.includeProgressReplies,autoDecompose:a.autoDecompose,planFirst:a.planFirst,verifyPr:a.verifyPr,autoHealDeployments:a.autoHealDeployments,releaseEnabled:a.releaseEnabled,deploymentPlatform:a.deploymentPlatform,readyLabels:e(a.readyLabels),blockingLabels:e(a.blockingLabels),autoLabelWhitelist:e(a.autoLabelWhitelist),priorityAuthors:e(a.priorityAuthors),trustedReviewers:e(a.trustedReviewers),trustedBots:e(a.trustedBots),ignoredBots:e(a.ignoredBots),minAuthorAssociation:"any"===a.minAuthorAssociation?"any":"approved",maxAttempts:a.maxAttempts,sandbox:"docker"===a.sandbox?"docker":"none",sandboxImage:a.sandboxImage,sandboxAllowNetwork:a.sandboxAllowNetwork,sandboxCpus:a.sandboxCpus,sandboxMemory:a.sandboxMemory}}function g(a,b){return"any"===a.minAuthorAssociation||null!=b&&d.has(b.toUpperCase())}},20203:(a,b,c)=>{c.d(b,{FD:()=>A,kz:()=>B,X$:()=>D,TU:()=>C});let d={"claude-fable-5":{inputPerMTok:10,outputPerMTok:50,cacheWritePerMTok:12.5,cacheReadPerMTok:1},"claude-opus-4-8":{inputPerMTok:5,outputPerMTok:25,cacheWritePerMTok:6.25,cacheReadPerMTok:.5},"claude-opus-4-7":{inputPerMTok:5,outputPerMTok:25,cacheWritePerMTok:6.25,cacheReadPerMTok:.5},"claude-sonnet-4-6":{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3},"claude-sonnet-4-5":{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3},"claude-haiku-4-5":{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}},e=Object.values(d).reduce((a,b)=>b.outputPerMTok>a.outputPerMTok?b:a,{inputPerMTok:0,outputPerMTok:0,cacheWritePerMTok:0,cacheReadPerMTok:0});var f=c(98887),g=c(14543);let h=[{kind:"auth",pattern:/invalid api key/i},{kind:"auth",pattern:/please run \/login/i},{kind:"auth",pattern:/authentication_error/i},{kind:"auth",pattern:/api error:?\s*401\b/i},{kind:"auth",pattern:/oauth token (?:has )?(?:expired|been revoked)/i},{kind:"billing",pattern:/credit balance is too low/i},{kind:"billing",pattern:/billing_error/i},{kind:"usage_limit",pattern:/usage limit reached/i},{kind:"usage_limit",pattern:/\b(?:\d+-hour|session|weekly) limit reached/i},{kind:"usage_limit",pattern:/limit will reset at/i},{kind:"rate_limit",pattern:/rate.?limit_error/i},{kind:"rate_limit",pattern:/api error:?\s*429\b/i},{kind:"rate_limit",pattern:/too many requests/i},{kind:"rate_limit",pattern:/\brate.?limit(?:ed)?\b.{0,60}\b(?:exceeded|reached|hit)\b/i},{kind:"rate_limit",pattern:/\b(?:exceeded|reached|hit)\b.{0,60}\brate.?limit/i},{kind:"overloaded",pattern:/overloaded_error/i},{kind:"overloaded",pattern:/api error:?\s*529\b/i}],i=/limit reached\|(\d{9,12})\b/i,j=/retry[- ]?after[:\s]+(\d+)\s*(?:s|sec|second)/i;var k=c(29980);let l=[{kind:"auth",pattern:/unexpected status 401\b/i},{kind:"auth",pattern:/\b401 unauthorized\b/i},{kind:"auth",pattern:/access token could not be refreshed/i},{kind:"auth",pattern:/please log out and sign in again/i},{kind:"auth",pattern:/\bnot logged in\b/i},{kind:"auth",pattern:/(?:chatgpt|api key) login is required/i},{kind:"auth",pattern:/missing environment variable.{0,5}OPENAI_API_KEY/i},{kind:"auth",pattern:/re-?run `?codex login`?/i},{kind:"billing",pattern:/quota exceeded\. check your plan and billing/i},{kind:"billing",pattern:/insufficient_quota/i},{kind:"billing",pattern:/exceeded your current quota/i},{kind:"billing",pattern:/\bout of credits\b/i},{kind:"billing",pattern:/\bspend cap\b/i},{kind:"billing",pattern:/to use codex with your chatgpt plan/i},{kind:"usage_limit",pattern:/you.?ve hit your usage limit/i},{kind:"usage_limit",pattern:/usage_limit_reached/i},{kind:"rate_limit",pattern:/rate.?limit_exceeded/i},{kind:"rate_limit",pattern:/rate limit reached for/i},{kind:"rate_limit",pattern:/last status:?\s*429\b/i},{kind:"rate_limit",pattern:/unexpected status 429\b/i},{kind:"rate_limit",pattern:/too many requests/i},{kind:"overloaded",pattern:/selected model is at capacity/i},{kind:"overloaded",pattern:/currently experiencing high demand/i},{kind:"overloaded",pattern:/server_is_overloaded/i},{kind:"overloaded",pattern:/last status:?\s*5\d\d\b/i},{kind:"overloaded",pattern:/unexpected status 5\d\d\b/i}],m=/try again in ([\d.]+)\s*s(?:ec(?:ond)?s?)?\b/i,n="gpt-5-codex",o={"gpt-5-codex":{inputPerMTok:1.25,outputPerMTok:10,cacheWritePerMTok:0,cacheReadPerMTok:0},"gpt-5":{inputPerMTok:1.25,outputPerMTok:10,cacheWritePerMTok:0,cacheReadPerMTok:0},"gpt-5-mini":{inputPerMTok:.25,outputPerMTok:2,cacheWritePerMTok:0,cacheReadPerMTok:0}},p=Object.values(o).reduce((a,b)=>b.outputPerMTok>a.outputPerMTok?b:a,{inputPerMTok:0,outputPerMTok:0,cacheWritePerMTok:0,cacheReadPerMTok:0}),q=k.Ik({input_tokens:k.ai().optional(),cached_input_tokens:k.ai().optional(),output_tokens:k.ai().optional(),reasoning_output_tokens:k.ai().optional()}).passthrough(),r=k.Ik({used_percent:k.ai().optional(),window_minutes:k.ai().optional(),resets_in_seconds:k.ai().optional()}).passthrough(),s=k.Ik({primary:r.nullish(),secondary:r.nullish()}).passthrough(),t=k.Ik({id:k.Yj().optional(),item_type:k.Yj().optional(),text:k.Yj().optional(),command:k.Yj().optional(),exit_code:k.ai().optional(),server:k.Yj().optional(),tool:k.Yj().optional()}).passthrough(),u=k.Ik({type:k.Yj(),thread_id:k.Yj().optional(),usage:q.optional(),rate_limits:s.nullish(),item:t.optional(),error:k.Ik({message:k.Yj().optional()}).passthrough().optional(),message:k.Yj().optional()}).passthrough();function v(a){if(a&&"number"==typeof a.used_percent)return{usedPercent:a.used_percent,windowMinutes:a.window_minutes,resetsInSeconds:a.resets_in_seconds}}class w{push(a){this.buffer+=a;let b=[],c=this.buffer.indexOf("\n");for(;-1!==c;){let a=this.buffer.slice(0,c);this.buffer=this.buffer.slice(c+1);let d=this.consume(a);d&&b.push(d),c=this.buffer.indexOf("\n")}return b}flush(){let a=this.buffer;this.buffer="";let b=this.consume(a);return b?[b]:[]}consume(a){let b;try{b=function(a){let b=a.trim();if(!b)return null;let c=JSON.parse(b);return u.parse(c)}(a)}catch(b){return this.onParseError?.({line:a.trim(),message:(0,f.gJ)(b)}),null}if(!b)return null;let c=function(a){let b=s.nullish().safeParse(a.rate_limits);if(!b.success||!b.data)return;let c=v(b.data.primary),d=v(b.data.secondary);if(c||d)return{primary:c,secondary:d}}(b);if(c&&(this.rateLimits=c),"turn.failed"===b.type||"error"===b.type){this.resultIsError=!0;let a=b.error?.message??b.message;a&&(this.resultText=a)}else"turn.completed"===b.type&&(this.resultIsError=!1,this.resultText=void 0);let d=function(a){let b={type:"assistant",chunks:[],inputTokens:0,outputTokens:0,cacheCreationInputTokens:0,cacheReadInputTokens:0,isError:!1,raw:a};if("thread.started"===a.type)return{...b,type:"system",sessionId:a.thread_id};if("item.completed"===a.type&&a.item)return{...b,type:"assistant",chunks:function(a){let b=a.id??"";switch(a.item_type){case"assistant_message":case"reasoning":return a.text?[{kind:"text",text:a.text}]:[];case"command_execution":return[{kind:"tool_use",name:"command",id:b,input:{command:a.command,exit_code:a.exit_code}}];case"file_change":return[{kind:"tool_use",name:"edit",id:b,input:a}];case"mcp_tool_call":return[{kind:"tool_use",name:`${a.server??"mcp"}/${a.tool??"tool"}`,id:b,input:a}];default:return[]}}(a.item)};if("turn.completed"===a.type){let c=a.usage;return{...b,type:"result",inputTokens:c?.input_tokens??0,outputTokens:(c?.output_tokens??0)+(c?.reasoning_output_tokens??0)}}return"turn.failed"===a.type||"error"===a.type?{...b,type:"result",isError:!0}:null}(b);return d?(d.sessionId&&(this.sessionId=d.sessionId),this.totalInputTokens+=d.inputTokens,this.totalOutputTokens+=d.outputTokens,d):null}constructor(){this.buffer="",this.totalInputTokens=0,this.totalOutputTokens=0,this.totalCacheCreationInputTokens=0,this.totalCacheReadInputTokens=0,this.costUsd=0}}var x=c(87524);let y="openrouter is an HTTP provider; it has no CLI surface (dispatch on provider.kind)",z={claude:{id:"claude",label:"Claude Code",defaultCommand:"claude",supportsResume:!0,resumeModel:"claude-haiku-4-5",resumeMaxTurns:15,defaultModel:"claude-opus-4-8",buildStartArgs:({prompt:a,model:b,maxTurns:c})=>["-p",a,"--max-turns",String(c),"--permission-mode","acceptEdits","--model",b,"--output-format","stream-json","--verbose"],buildResumeArgs:({prompt:a,sessionId:b,model:c,maxTurns:d})=>["-p",a,"--resume",b,"--max-turns",String(d),"--model",c,"--output-format","stream-json","--verbose"],buildOneShotArgs:({prompt:a,model:b})=>["-p",a,"--model",b],buildStreamOneShotArgs:({prompt:a,model:b})=>["-p",a,"--model",b,"--output-format","stream-json","--verbose"],createParser:()=>new f.KO,classifyFailure:function(a){var b;let c;if(0===a.exitCode&&!a.resultIsError)return;let d=[a.resultText,a.stderr].filter(Boolean).join("\n");if(!d.trim())return;let e=h.find(a=>a.pattern.test(d));if(!e)return;let f={agent:"claude",kind:e.kind,rawSnippet:(b=e.pattern,c=d.split("\n").find(a=>b.test(a))??d,(0,g.f)(c.trim()).slice(0,300))};if("usage_limit"===e.kind){let a=d.match(i)?.[1];a&&(f.resetAt=Number(a))}if("rate_limit"===e.kind||"overloaded"===e.kind){let a=d.match(j)?.[1];a&&(f.retryAfterMs=1e3*Number(a))}return f},estimateCost:function(a,b,c,f=0,g=0){let h=function(a){if(!a)return e;let b=d[a];return b||(console.warn(`[drydock] Unknown model id "${a}" — using max-priced fallback to avoid under-counting cost`),e)}(a);return b/1e6*h.inputPerMTok+c/1e6*h.outputPerMTok+f/1e6*h.cacheWritePerMTok+g/1e6*h.cacheReadPerMTok}},codex:{id:"codex",label:"Codex CLI",defaultCommand:"codex",supportsResume:!0,resumeModel:n,resumeMaxTurns:15,defaultModel:n,buildStartArgs:({prompt:a,model:b})=>["exec","--json","--sandbox","workspace-write","--model",b,a],buildResumeArgs:({prompt:a,sessionId:b,model:c})=>["exec","resume",b,"--json","--sandbox","workspace-write","--model",c,a],buildOneShotArgs:({prompt:a,model:b})=>["exec","--model",b,a],buildStreamOneShotArgs:()=>null,createParser:()=>new w,classifyFailure:function(a){var b;let c;if(0===a.exitCode&&!a.resultIsError)return;let d=[a.resultText,a.stderr].filter(Boolean).join("\n");if(!d.trim())return;let e=l.find(a=>a.pattern.test(d));if(!e)return;let f={agent:"codex",kind:e.kind,rawSnippet:(b=e.pattern,c=d.split("\n").find(a=>b.test(a))??d,(0,g.f)(c.trim()).slice(0,300))};if("rate_limit"===e.kind||"overloaded"===e.kind){let a=d.match(m)?.[1],b=a?Math.ceil(1e3*Number(a)):NaN;Number.isFinite(b)&&b>=0&&(f.retryAfterMs=b)}return f},captureUsage:a=>a instanceof w?a.rateLimits:void 0,estimateCost:function(a,b,c){let d=function(a){if(!a)return p;let b=o[a];return b||(console.warn(`[drydock] Unknown codex model id "${a}" — using max-priced fallback to avoid under-counting cost`),p)}(a);return b/1e6*d.inputPerMTok+c/1e6*d.outputPerMTok}},openrouter:{id:"openrouter",kind:"http",label:"OpenRouter",defaultCommand:"",supportsResume:!1,resumeModel:"",resumeMaxTurns:20,defaultModel:"",buildStartArgs(){throw Error(y)},buildResumeArgs:()=>null,buildOneShotArgs(){throw Error(y)},buildStreamOneShotArgs:()=>null,createParser(){throw Error(y)},classifyFailure:x.M,estimateCost:()=>0}},A=["claude","codex","openrouter"],B="claude";function C(a){return"string"==typeof a&&A.includes(a)}function D(a){return C(a)?z[a]:z[B]}},24421:(a,b,c)=>{c.d(b,{GX:()=>n,VK:()=>l,sp:()=>m,ts:()=>k});var d=c(97496),e=c(14694),f=c(70793);c(20203);var g=c(2025),h=c(54304),i=c(64537),j=c(24978);function k(a,b=(0,g.Lf)()){return b.select().from(i.issues).where((0,d.eq)(i.issues.repoId,a)).orderBy((0,e.Y)(i.issues.priority),(0,e.Y)(i.issues.number)).all()}function l(a,b,c=(0,g.Lf)()){let e=c.select().from(i.issues).where((0,d.eq)(i.issues.repoId,a)).all(),h=new Map(e.map(a=>[a.number,a])),j=Math.floor(Date.now()/1e3),k=c.select({value:(0,f.T9)(i.issues.priority)}).from(i.issues).where((0,d.eq)(i.issues.repoId,a)).get(),m=(k?.value??-1)+1,n=new Set;for(let e of b){n.add(e.number);let b=JSON.stringify(e.labels.map(a=>a.name)),f=h.get(e.number);f?c.update(i.issues).set({title:e.title,labels:b,state:"open",syncedAt:j}).where((0,d.eq)(i.issues.id,f.id)).run():c.insert(i.issues).values({repoId:a,number:e.number,title:e.title,labels:b,state:"open",priority:m++,syncedAt:j}).run()}let o=e.filter(a=>!n.has(a.number)).map(a=>a.id);o.length>0&&c.delete(i.issues).where((0,d.RV)(i.issues.id,o)).run()}function m(a,b,c,e,f=(0,g.Lf)()){let h,j=f.select().from(i.issues).where((0,d.Uo)((0,d.eq)(i.issues.repoId,a),(0,d.eq)(i.issues.number,b))).get();if(!j)return;try{let a=JSON.parse(j.labels);h=Array.isArray(a)?a:[]}catch{h=[]}let k=[...h];for(let a of c)k.includes(a)||k.push(a);let l=new Set(e),n=k.filter(a=>!l.has(a));f.update(i.issues).set({labels:JSON.stringify(n)}).where((0,d.eq)(i.issues.id,j.id)).run()}async function n(a,b=(0,g.Lf)()){let c=function(a,b){let c=(0,h.L8)(a,b);if(!c)throw Error(`repo ${a} not found`);return c}(a,b);return l(a,await (0,j.Ie)(c).listAllIssues(),b),k(a,b)}c(58543)},24978:(a,b,c)=>{c.d(b,{Ie:()=>N});var d=c(29980),e=c(77597);class f{get(a){return this.entries.get(a)}set(a,b,c){this.entries.set(a,{etag:b,body:c})}delete(a){this.entries.delete(a)}constructor(){this.entries=new Map}}let g=new f;function h(a){let b=a.replace(/\r\n/g,"\n"),c=b.lastIndexOf("\nHTTP/"),d=c>=0?c+1:b.startsWith("HTTP/")?0:-1;if(d<0)return{status:null,headers:{},body:a};let e=b.slice(d),f=e.indexOf("\n\n"),g=f>=0?e.slice(0,f):e,h=f>=0?e.slice(f+2):"",i=g.split("\n"),j=(i.shift()??"").match(/^HTTP\/\S+\s+(\d+)/),k=j?Number(j[1]):null,l={};for(let a of i){let b=a.indexOf(":");b<=0||(l[a.slice(0,b).trim().toLowerCase()]=a.slice(b+1).trim())}return{status:k,headers:l,body:h}}function i(a){if(!a)return null;for(let b of a.split(",")){let a=b.match(/<([^>]+)>\s*;\s*rel="?next"?/);if(a?.[1])return a[1]}return null}var j=c(64417),k=c(91549);let l=d.Ik({number:d.ai(),title:d.Yj(),labels:d.YO(d.Ik({name:d.Yj()})).default([]),user:d.Ik({login:d.Yj()}).nullish(),author_association:d.Yj().nullish(),pull_request:d.L5().optional()}).transform(a=>({number:a.number,title:a.title,labels:a.labels,author:a.user?.login??null,authorAssociation:a.author_association??null,isPullRequest:void 0!==a.pull_request})),m=d.Ik({resources:d.g1(d.Yj(),d.Ik({limit:d.ai(),remaining:d.ai(),reset:d.ai()}))}),n=d.Ik({number:d.ai(),title:d.Yj(),body:d.Yj().default(""),state:d.Yj().default("open"),labels:d.YO(d.Ik({name:d.Yj()})).default([]),comments:d.YO(d.Ik({author:d.Ik({login:d.Yj()}).default({login:""}),body:d.Yj().default(""),createdAt:d.Yj().default("")})).default([])}),o=d.Ik({name:d.Yj(),state:d.Yj(),bucket:d.Yj().optional()}),p=d.Ik({data:d.Ik({repository:d.Ik({pullRequest:d.Ik({reviewThreads:d.Ik({nodes:d.YO(d.Ik({id:d.Yj(),isResolved:d.zM().default(!1),isOutdated:d.zM().default(!1),path:d.Yj().nullish(),line:d.ai().nullish(),comments:d.Ik({nodes:d.YO(d.Ik({id:d.Yj(),databaseId:d.ai().nullish(),body:d.Yj().default(""),author:d.Ik({login:d.Yj(),__typename:d.Yj().nullish()}).nullish()}))})}))})}).nullish()})})});class q extends Error{}function r(a,b){return`${a}=${b}`}function s(a){let b;try{b=JSON.parse(a||"[]")}catch{throw new q("unexpected gh output: response body was not valid JSON")}if(!Array.isArray(b))throw new q("unexpected gh output: expected a JSON array");return b}class t{constructor(a,b=e.Sx,c=k.og,d=g){this.cwd=a,this.run=b,this.governor=c,this.etags=d}gate(a="core"){let b=this.governor.decide(a,(0,j.u)());if(!b.allowed)throw new k.OE(b.reason,a,b.retryAfterMs)}async exec(a,b="core"){this.gate(b);let c=await this.run("gh",a,this.cwd);return 0!==c.exitCode&&/rate limit|429 too many/i.test(c.stderr)&&this.governor.note429(b),c}async refreshRateLimit(){let a,b=await this.run("gh",["api","rate_limit"],this.cwd);if(0===b.exitCode){try{a=m.parse(JSON.parse(b.stdout||"{}"))}catch{return}for(let b of["core","graphql","search"]){let c=a.resources[b];c&&this.governor.observe(b,c)}}}async conditionalList(a,b){this.gate("core");let c=this.etags.get(a),d=["api",`repos/{owner}/{repo}/issues?${b}`,"--include"];c&&d.push("-H",`If-None-Match: ${c.etag}`);let e=await this.run("gh",d,this.cwd),f=this.checkListResponse(e,h(e.stdout));if(304===f.status&&c)return this.toGhIssues(s(c.body));let g=[...s(f.body)],j=i(f.headers.link),k=Number(new URLSearchParams(b).get("per_page")??"30"),l=!j&&Number.isFinite(k)&&g.length<k,m=1;for(;j&&m<100;){this.gate("core");let a=await this.run("gh",["api",j,"--include"],this.cwd),b=this.checkListResponse(a,h(a.stdout));g.push(...s(b.body)),j=i(b.headers.link),m++}let n=f.headers.etag;return n&&l?this.etags.set(a,n,JSON.stringify(g)):this.etags.delete(a),this.toGhIssues(g)}checkListResponse(a,b){var c,d;let e=(0,k.bR)(b.headers);if(e&&this.governor.observe(e.resource,e.snapshot),304===b.status)return b;if(c=b.status,d=b.headers,429===c||403===c&&"0"===d["x-ratelimit-remaining"]){let a=Number(b.headers["x-ratelimit-reset"]);throw this.governor.note429("core",Number.isFinite(a)?a:void 0),new q(`gh api rate limited (status ${b.status})`)}if(200!==b.status)throw new q(a.stderr||`gh api failed (status ${b.status??"unknown"})`);return b}toGhIssues(a){let b=d.YO(l).safeParse(a);if(!b.success)throw new q(`unexpected gh output: ${b.error.message}`);return b.data.filter(a=>!a.isPullRequest).map(({isPullRequest:a,...b})=>b)}async listIssues(a){let b=`state=open&per_page=100&labels=${encodeURIComponent(a)}`;return this.conditionalList(`${this.cwd}::label:${a}`,b)}async listAllIssues(){return this.conditionalList(`${this.cwd}::all`,"state=open&per_page=100")}async viewIssue(a){let b=await this.exec(["issue","view",String(a),"--json","number,title,body,state,labels,comments"]);if(0!==b.exitCode)throw new q(b.stderr||"gh issue view failed");let c=n.safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);let d=c.data;return{number:d.number,title:d.title,body:d.body,state:d.state,labels:d.labels.map(a=>a.name),comments:d.comments.map(a=>({author:a.author.login,body:a.body,createdAt:a.createdAt}))}}async editIssue(a,b){let c=["issue","edit",String(a)];if(void 0!==b.title&&c.push(r("--title",b.title)),void 0!==b.body&&c.push(r("--body",b.body)),3===c.length)return;let d=await this.exec(c);if(0!==d.exitCode)throw new q(d.stderr||"gh issue edit failed")}async ensureLabel(a,b={}){let c=await this.exec(["label","list","--json","name","--limit","200"]),e=c.stdout.trim();if(0===c.exitCode&&e)try{let b=d.YO(d.Ik({name:d.Yj()})).safeParse(JSON.parse(e));if(b.success&&b.data.some(b=>b.name===a))return}catch{}let f=["label","create"];b.color&&f.push(r("--color",b.color)),b.description&&f.push(r("--description",b.description)),f.push("--",a);let g=await this.exec(f);if(0!==g.exitCode&&!/already exists/i.test(g.stderr))throw new q(g.stderr||"gh label create failed")}async addLabels(a,b){let c=await this.exec(["issue","edit",String(a),r("--add-label",b.join(","))]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue edit failed")}async removeLabels(a,b){let c=await this.exec(["issue","edit",String(a),r("--remove-label",b.join(","))]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue edit failed")}async closeIssue(a){let b=await this.exec(["issue","close",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh issue close failed")}async reopenIssue(a){let b=await this.exec(["issue","reopen",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh issue reopen failed")}async prChecks(a){let b=await this.exec(["pr","checks",String(a),"--json","name,state,bucket"]),c=b.stdout.trim();if(!c){if(0!==b.exitCode)throw new q(b.stderr||"gh pr checks failed");return[]}let e=d.YO(o).safeParse(JSON.parse(c));if(!e.success)throw new q(`unexpected gh output: ${e.error.message}`);return e.data}async prHeadSha(a){let b=await this.exec(["pr","view",String(a),"--json","headRefOid"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr view failed");let c=d.Ik({headRefOid:d.Yj()}).safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);return c.data.headRefOid}async prMergeCommitSha(a){let b=await this.exec(["pr","view",String(a),"--json","mergeCommit"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr view failed");let c=d.Ik({mergeCommit:d.Ik({oid:d.Yj()}).nullish()}).safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);return c.data.mergeCommit?.oid??null}async commentIssue(a,b){let c=await this.exec(["issue","comment",String(a),r("--body",b)]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue comment failed")}async listIssueComments(a){let b,c=await this.exec(["issue","view",String(a),"--json","comments"]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue view failed");try{b=JSON.parse(c.stdout||"{}")}catch{throw new q(`unexpected gh output: ${c.stdout.slice(0,200)}`)}let e=d.Ik({comments:d.YO(d.Ik({id:d.Yj(),body:d.Yj().default("")})).default([])}).safeParse(b);if(!e.success)throw new q(`unexpected gh output: ${e.error.message}`);return e.data.comments.map(a=>({id:a.id,body:a.body}))}async updateIssueComment(a,b,c){let d=await this.exec(["api","graphql","-F",`id=${b}`,"-f",`body=${c}`,"-f","query=mutation($id:ID!,$body:String!){updateIssueComment(input:{id:$id,body:$body}){issueComment{id}}}"],"graphql");if(0!==d.exitCode)throw new q(d.stderr||"gh update issue comment failed")}async commentPr(a,b){let c=await this.exec(["pr","comment",String(a),r("--body",b)]);if(0!==c.exitCode)throw new q(c.stderr||"gh pr comment failed")}async createIssue(a,b){let c=await this.exec(["issue","create",r("--title",a),r("--body",b)]);if(0!==c.exitCode)throw new q(c.stderr||"gh issue create failed");let d=c.stdout.match(/\/issues\/(\d+)/);if(!d?.[1])throw new q(`could not parse issue number from: ${c.stdout}`);return Number(d[1])}async latestFailedRunId(a){let b,c,e=await this.run("gh",["pr","view",String(a),"--json","headRefName"],this.cwd);if(0!==e.exitCode)return null;try{b=d.Ik({headRefName:d.Yj()}).parse(JSON.parse(e.stdout||"{}")).headRefName}catch{return null}if(!b)return null;let f=await this.run("gh",["run","list","--branch",b,"--json","databaseId,conclusion","--limit","20"],this.cwd);if(0!==f.exitCode)return null;try{c=d.YO(d.Ik({databaseId:d.ai(),conclusion:d.Yj().default("")})).parse(JSON.parse(f.stdout||"[]"))}catch{return null}return c.find(a=>"failure"===a.conclusion)?.databaseId??null}async failedRunLog(a){if(!this.governor.decide("core",(0,j.u)()).allowed)return"";let b=await this.latestFailedRunId(a);if(null===b)return"";let c=await this.run("gh",["run","view",String(b),"--log-failed"],this.cwd);return 0!==c.exitCode?"":c.stdout.slice(-8e3)}async reRunFailedChecks(a){if(!this.governor.decide("core",(0,j.u)()).allowed)return!1;let b=await this.latestFailedRunId(a);return null!==b&&0===(await this.run("gh",["run","rerun",String(b),"--failed"],this.cwd)).exitCode}async prDiff(a){if(!this.governor.decide("core",(0,j.u)()).allowed)return"";let b=await this.run("gh",["pr","diff",String(a)],this.cwd);return 0!==b.exitCode?"":b.stdout}async mergePr(a){let b=await this.exec(["pr","merge",String(a),"--squash","--auto"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr merge failed")}async createPr(a){let b=await this.exec(["pr","create",r("--head",a.head),r("--base",a.base),r("--title",a.title),r("--body",a.body)]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr create failed");let c=b.stdout.match(/\/pull\/(\d+)/);if(!c?.[1])throw new q(`could not parse PR number from: ${b.stdout}`);return Number(c[1])}async deleteBranch(a){let b=a.split("/").map(encodeURIComponent).join("/"),c=await this.exec(["api","-X","DELETE",`repos/{owner}/{repo}/git/refs/heads/${b}`]);if(0!==c.exitCode&&!/reference does not exist|HTTP 404/i.test(c.stderr))throw new q(c.stderr||"gh branch delete failed")}async prMergeState(a){let b=await this.exec(["pr","view",String(a),"--json","mergeable,mergeStateStatus"]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr view failed");let c=d.Ik({mergeable:d.Yj().default(""),mergeStateStatus:d.Yj().default("")}).safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);let{mergeable:e,mergeStateStatus:f}=c.data;return"CONFLICTING"===e||"DIRTY"===f?"conflicted":"BEHIND"===f?"behind":"MERGEABLE"===e?"clean":"unknown"}async updatePrBranch(a){let b=await this.exec(["pr","update-branch",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr update-branch failed")}async listReleases(){let a=await this.exec(["release","list","--json","tagName,createdAt","--limit","100"]);if(0!==a.exitCode)throw new q(a.stderr||"gh release list failed");let b=d.YO(d.Ik({tagName:d.Yj(),createdAt:d.Yj().default("")})).safeParse(JSON.parse(a.stdout||"[]"));if(!b.success)throw new q(`unexpected gh output: ${b.error.message}`);return b.data}async listMergedPrs(a=100){let b=await this.exec(["pr","list","--state","merged","--json","number,title,mergedAt,labels","--limit",String(a)]);if(0!==b.exitCode)throw new q(b.stderr||"gh pr list failed");let c=d.YO(d.Ik({number:d.ai(),title:d.Yj().default(""),mergedAt:d.Yj().default(""),labels:d.YO(d.Ik({name:d.Yj()})).default([])})).safeParse(JSON.parse(b.stdout||"[]"));if(!c.success)throw new q(`unexpected gh output: ${c.error.message}`);return c.data.map(a=>({number:a.number,title:a.title,mergedAt:a.mergedAt,labels:a.labels.map(a=>a.name)}))}async createRelease(a){let b=await this.exec(["release","create",a.tag,r("--title",a.title),r("--notes",a.notes),r("--target",a.target)]);if(0!==b.exitCode)throw new q(b.stderr||"gh release create failed")}async repoSlug(){if(this.slug)return this.slug;let a=await this.exec(["repo","view","--json","nameWithOwner"]);if(0!==a.exitCode)throw new q(a.stderr||"gh repo view failed");let b=d.Ik({nameWithOwner:d.Yj()}).safeParse(JSON.parse(a.stdout||"{}"));if(!b.success)throw new q(`unexpected gh output: ${b.error.message}`);let[c,e]=b.data.nameWithOwner.split("/");if(!c||!e)throw new q(`unexpected repo slug: ${b.data.nameWithOwner}`);return this.slug={owner:c,name:e},this.slug}async listReviewThreads(a){let{owner:b,name:c}=await this.repoSlug(),d=await this.exec(["api","graphql","-F",`owner=${b}`,"-F",`name=${c}`,"-F",`number=${a}`,"-f","query=query($owner:String!,$name:String!,$number:Int!){repository(owner:$owner,name:$name){pullRequest(number:$number){reviewThreads(first:100){nodes{id isResolved isOutdated path line comments(first:100){nodes{id databaseId body author{login __typename}}}}}}}}"],"graphql");if(0!==d.exitCode)throw new q(d.stderr||"gh api graphql failed");let e=p.safeParse(JSON.parse(d.stdout||"{}"));if(!e.success)throw new q(`unexpected gh output: ${e.error.message}`);return(e.data.data.repository.pullRequest?.reviewThreads.nodes??[]).map(a=>({id:a.id,isResolved:a.isResolved,isOutdated:a.isOutdated,path:a.path??null,line:a.line??null,comments:a.comments.nodes.map(a=>({id:a.id,databaseId:a.databaseId??null,author:a.author?.login??"",authorIsBot:a.author?.__typename==="Bot",body:a.body}))}))}async replyToReviewThread(a,b){let c=await this.exec(["api","graphql","-F",`threadId=${a}`,"-f",`body=${b}`,"-f","query=mutation($threadId:ID!,$body:String!){addPullRequestReviewThreadReply(input:{pullRequestReviewThreadId:$threadId,body:$body}){comment{id}}}"],"graphql");if(0!==c.exitCode)throw new q(c.stderr||"gh review reply failed")}async updateReviewComment(a,b){let c=await this.exec(["api","graphql","-F",`id=${a}`,"-f",`body=${b}`,"-f","query=mutation($id:ID!,$body:String!){updatePullRequestReviewComment(input:{pullRequestReviewCommentId:$id,body:$body}){pullRequestReviewComment{id}}}"],"graphql");if(0!==c.exitCode)throw new q(c.stderr||"gh update review comment failed")}async resolveReviewThread(a){let b=await this.exec(["api","graphql","-F",`threadId=${a}`,"-f","query=mutation($threadId:ID!){resolveReviewThread(input:{threadId:$threadId}){thread{id isResolved}}}"],"graphql");if(0!==b.exitCode)throw new q(b.stderr||"gh resolve thread failed")}async reactToReviewComment(a,b){let c=await this.exec(["api","graphql","-F",`subjectId=${a}`,"-F",`content=${b}`,"-f","query=mutation($subjectId:ID!,$content:ReactionContent!){addReaction(input:{subjectId:$subjectId,content:$content}){reaction{content}}}"],"graphql");if(0!==c.exitCode&&!/already has this reaction/i.test(c.stderr))throw new q(c.stderr||"gh add reaction failed")}}var u=c(75818),v=c(87105),w=c(87232),x=c(25480);let y=d.Ik({iid:d.ai(),title:d.Yj(),labels:d.YO(d.Yj()).default([]),author:d.Ik({username:d.Yj()}).nullish()}),z=d.Ik({iid:d.ai(),title:d.Yj(),description:d.Yj().nullable().default(""),state:d.Yj().default("opened"),labels:d.YO(d.Yj()).default([])}),A=d.Ik({author:d.Ik({username:d.Yj().default("")}).default({username:""}),body:d.Yj().default(""),created_at:d.Yj().default(""),system:d.zM().default(!1)}),B=d.Ik({id:d.ai(),body:d.Yj().default("")}),C=d.Ik({id:d.ai().optional(),name:d.Yj().default(""),status:d.Yj().default("")}),D=d.Ik({head_pipeline:d.Ik({id:d.ai()}).nullable().optional()}),E=d.Ik({old_path:d.Yj().default(""),new_path:d.Yj().default(""),diff:d.Yj().default("")});class F{constructor(a,b={}){this.config=a,this.http=b.http??v.D,this.run=b.run??e.Sx,this.sleep=b.sleep??(a=>new Promise(b=>setTimeout(b,a))),this.allowPrivateHost=b.allowPrivateHost??(0,x.gT)()}resolveProject(){if(!this.projectRef){let a=(async()=>{let a=await this.run("git",["remote","get-url","origin"],this.config.cwd);if(0!==a.exitCode||!a.stdout.trim())throw new w.Q8(a.stderr||"could not resolve git remote 'origin'");let{host:b,path:c}=function(a){let b=a.trim().replace(/\.git$/,""),c=b.match(/^[\w.-]+@([^:]+):(.+)$/)??b.match(/^ssh:\/\/[^@]+@([^/]+)\/(.+)$/)??b.match(/^https?:\/\/([^/]+)\/(.+)$/);if(!c?.[1]||!c[2])throw new w.Q8(`unsupported git remote URL: ${a}`);return{host:c[1],path:c[2]}}(a.stdout);return{baseUrl:(this.config.baseUrl?.trim()||`https://${b}`).replace(/\/$/,""),encodedPath:encodeURIComponent(c)}})();a.catch(()=>{this.projectRef===a&&(this.projectRef=void 0)}),this.projectRef=a}return this.projectRef}async request(a,b,c={}){let d,{baseUrl:e,encodedPath:f}=await this.resolveProject(),g=`${e}/api/v4/projects/${f}${b}`;if(c.query){let a=new URLSearchParams(c.query).toString();a&&(g+=`?${a}`)}(0,x.sM)(g,{allowPrivate:this.allowPrivateHost});let h={};return this.config.token&&(h["PRIVATE-TOKEN"]=this.config.token),void 0!==c.body&&(h["Content-Type"]="application/json",d=JSON.stringify(c.body)),this.http(g,{method:a,headers:h,body:d})}async mutate(a,b,c={}){let d=await this.request(a,b,c);if(429===d.status)throw await this.sleep(function(a){if(a){let b=a["retry-after"];if(b){let a=Number(b);if(Number.isFinite(a)&&a>0)return Math.min(1e3*a,3e5)}let c=a["ratelimit-reset"]??a["x-ratelimit-reset"];if(c){let a=Number(c);if(Number.isFinite(a)){let b=1e3*a-Date.now();if(b>0)return Math.min(b,3e5)}}}return 6e4}(d.headers)),new w.Q8(`GitLab rate-limited: ${M(d)||`${a} ${b} returned 429`}`);if(!d.ok)throw new w.Q8(M(d)||`GitLab ${a} ${b} failed`);return d}async listIssues(a){return this.listIssuesPaginated({state:"opened",labels:a})}async listAllIssues(){return this.listIssuesPaginated({state:"opened"})}async listIssuesPaginated(a){return this.listPaginated("/issues",a,G)}async listPaginated(a,b,c){let d=[],e=1;for(let f=0;f<100;f++){let f=await this.mutate("GET",a,{query:{...b,per_page:"100",page:String(e)}});d.push(...c(f.body));let g=f.headers?.["x-next-page"];if(!g)break;let h=Number(g);if(!Number.isInteger(h)||h<=e)break;e=h}return d}async viewIssue(a){let b=await this.mutate("GET",`/issues/${a}`),c=await this.listPaginated(`/issues/${a}/notes`,{},K),d=z.parse(L(b.body,{}));return{number:d.iid,title:d.title,body:d.description??"",state:"opened"===d.state?"open":d.state,labels:d.labels,comments:c.filter(a=>!a.system).map(a=>({author:a.author.username,body:a.body,createdAt:a.created_at}))}}async editIssue(a,b){let c={};void 0!==b.title&&(c.title=b.title),void 0!==b.body&&(c.description=b.body),0!==Object.keys(c).length&&await this.mutate("PUT",`/issues/${a}`,{body:c})}async ensureLabel(a,b={}){var c;let e=await this.request("GET","/labels",{query:{per_page:"100"}});if(e.ok){let b=d.YO(d.Ik({name:d.Yj()})).safeParse(L(e.body,[]));if(b.success&&b.data.some(b=>b.name===a))return}let f={name:a,color:(c=b.color??"#808080").startsWith("#")?c:`#${c}`};b.description&&(f.description=b.description);let g=await this.request("POST","/labels",{body:f});if(!g.ok&&409!==g.status&&!/already exists/i.test(g.body))throw new w.Q8(M(g)||"GitLab label create failed")}async addLabels(a,b){await this.mutate("PUT",`/issues/${a}`,{body:{add_labels:b.join(",")}})}async removeLabels(a,b){await this.mutate("PUT",`/issues/${a}`,{body:{remove_labels:b.join(",")}})}async closeIssue(a){await this.mutate("PUT",`/issues/${a}`,{body:{state_event:"close"}})}async reopenIssue(a){await this.mutate("PUT",`/issues/${a}`,{body:{state_event:"reopen"}})}async commentIssue(a,b){await this.mutate("POST",`/issues/${a}/notes`,{body:{body:b}})}async listIssueComments(a){return(await this.listPaginated(`/issues/${a}/notes`,{},H)).map(a=>({id:String(a.id),body:a.body}))}async updateIssueComment(a,b,c){await this.mutate("PUT",`/issues/${a}/notes/${encodeURIComponent(b)}`,{body:{body:c}})}async commentPr(a,b){await this.mutate("POST",`/merge_requests/${a}/notes`,{body:{body:b}})}async createIssue(a,b){let c=await this.mutate("POST","/issues",{body:{title:a,description:b}});return d.Ik({iid:d.ai()}).parse(L(c.body,{})).iid}async prChecks(a){let b=await this.latestPipelineId(a);return null===b?[]:(await this.listPaginated(`/pipelines/${b}/jobs`,{},I)).map(a=>({name:a.name,state:function(a){switch(a){case"success":return"SUCCESS";case"failed":return"FAILURE";case"canceled":case"cancelled":return"CANCELLED";case"running":return"IN_PROGRESS";case"pending":case"created":case"scheduled":case"preparing":case"waiting_for_resource":return"PENDING";case"manual":return"MANUAL";case"skipped":return"SKIPPED";default:return a.toUpperCase()}}(a.status)}))}async prHeadSha(a){let b=await this.mutate("GET",`/merge_requests/${a}`);return d.Ik({sha:d.Yj()}).parse(L(b.body,{})).sha}async prMergeCommitSha(a){let b=await this.mutate("GET",`/merge_requests/${a}`),c=d.Ik({squash_commit_sha:d.Yj().nullish(),merge_commit_sha:d.Yj().nullish()}).parse(L(b.body,{}));return c.squash_commit_sha??c.merge_commit_sha??null}async failedRunLog(a){try{let b=await this.latestPipelineId(a);if(null===b)return"";let c=(await this.listPaginated(`/pipelines/${b}/jobs`,{},I)).find(a=>"failed"===a.status&&void 0!==a.id);if(!c)return"";let d=await this.request("GET",`/jobs/${c.id}/trace`);if(!d.ok)return(0,u.v)(`GitLab failedRunLog: job ${c.id} trace request failed (${d.status})`),"";return d.body.slice(-8e3)}catch(a){return(0,u.v)("GitLab failedRunLog error:",a),""}}async prDiff(a){try{return(await this.listPaginated(`/merge_requests/${a}/diffs`,{},J)).map(a=>`--- a/${a.old_path}
2
- +++ b/${a.new_path}
3
- ${a.diff}`).join("\n")}catch(a){return(0,u.v)("GitLab prDiff error:",a),""}}async mergePr(a){await this.mutate("PUT",`/merge_requests/${a}/merge`,{body:{squash:!0}})}async createPr(a){let b=await this.mutate("POST","/merge_requests",{body:{source_branch:a.head,target_branch:a.base,title:a.title,description:a.body}});return d.Ik({iid:d.ai()}).parse(L(b.body,{})).iid}async deleteBranch(a){let b=await this.request("DELETE",`/repository/branches/${encodeURIComponent(a)}`);if(!b.ok&&404!==b.status)throw new w.Q8(M(b)||"GitLab branch delete failed")}async prMergeState(a){let b=await this.mutate("GET",`/merge_requests/${a}`),c=d.Ik({has_conflicts:d.zM().default(!1),detailed_merge_status:d.Yj().nullish()}).parse(L(b.body,{}));return c.has_conflicts||"conflict"===c.detailed_merge_status?"conflicted":"need_rebase"===c.detailed_merge_status?"behind":"mergeable"===c.detailed_merge_status?"clean":"unknown"}async updatePrBranch(a){await this.mutate("PUT",`/merge_requests/${a}/rebase`)}async latestPipelineId(a){let b=await this.request("GET",`/merge_requests/${a}`);if(!b.ok)return null;let c=D.safeParse(L(b.body,{})),d=c.success?c.data.head_pipeline??null:null;return d?d.id:null}}function G(a){let b=d.YO(y).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data.map(a=>({number:a.iid,title:a.title,labels:a.labels.map(a=>({name:a})),author:a.author?.username??null,authorAssociation:null}))}function H(a){let b=d.YO(B).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data}function I(a){let b=d.YO(C).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data}function J(a){let b=d.YO(E).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data}function K(a){let b=d.YO(A).safeParse(L(a,[]));if(!b.success)throw new w.Q8(`unexpected GitLab output: ${b.error.message}`);return b.data}function L(a,b){try{return JSON.parse(a||"null")??b}catch{return b}}function M(a){let b=d.Ik({message:d.L5(),error:d.L5()}).partial().safeParse(L(a.body,{}));if(b.success){let a=b.data.message??b.data.error;if("string"==typeof a)return a;if(a)return JSON.stringify(a)}return a.body.slice(0,300)}function N(a){return"gitlab"===((0,w.jL)(a.platform)?a.platform:w.cg)?new F({cwd:a.path,baseUrl:a.apiBaseUrl,token:a.apiToken}):new t({cwd:a.path}.cwd,void 0)}},25480:(a,b,c)=>{c.d(b,{gT:()=>h,sM:()=>g});var d=c(87232);function e(a){if(!/^\d{1,3}(\.\d{1,3}){3}$/.test(a))return null;let b=a.split(".").map(Number);return b.some(a=>a>255)?null:b}function f(a){let b=e(a);if(!b)return!1;let[c,d]=b;return 0===c||10===c||127===c||169===c&&254===d||172===c&&d>=16&&d<=31||192===c&&168===d||100===c&&d>=64&&d<=127||!1}function g(a,b={}){let c,h;try{c=new URL(a)}catch{throw new d.Q8(`invalid forge URL: ${a}`)}if("http:"!==c.protocol&&"https:"!==c.protocol)throw new d.Q8(`forge URL must use http(s): ${c.protocol}`);if(!b.allowPrivate&&(""===(h=c.hostname.trim().toLowerCase().replace(/^\[/,"").replace(/\]$/,""))||"localhost"===h||h.endsWith(".localhost")||(h.includes(":")?function(a){let b=a.toLowerCase();if("::1"===b||"::"===b)return!0;let c=b.match(/^::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/);if(c?.[1])return f(c[1]);let d=b.match(/^::ffff:(?:([0-9a-f]{1,4}):)?([0-9a-f]{1,4})$/);if(d?.[2]){let a=Number.parseInt(d[1]??"0",16),b=Number.parseInt(d[2],16);return f(`${a>>8}.${255&a}.${b>>8}.${255&b}`)}return!!(b.startsWith("fe80")||/^f[cd]/.test(b))}(h):!!e(h)&&f(h))))throw new d.Q8(`refusing to send forge token to private/loopback address ${c.hostname}; set DRYDOCK_ALLOW_PRIVATE_FORGE=1 to allow a self-hosted instance`)}function h(){let a=process.env.DRYDOCK_ALLOW_PRIVATE_FORGE?.trim().toLowerCase();return"1"===a||"true"===a||"yes"===a}},26287:(a,b,c)=>{c.d(b,{E:()=>e,_:()=>d});let d={main:"default",ciFix:"ci-fix",plan:"plan",limitResume:"limit-resume"},e={default:'You are working on GitHub issue #$ISSUE_NUM in the repository "$REPO_NAME".\nYou are on branch "$BRANCH". Implement the change the issue asks for.\n\nIssue title: $ISSUE_TITLE\n\nIssue body:\n$ISSUE_BODY\n\nKeep the change focused. You may commit your work or leave it uncommitted —\neither is fine. Do not push or open a pull request yourself; Drydock commits\nany remaining changes, pushes the branch, and opens the PR.\n\nBefore you finish, write a file `.drydock/PR.md` describing the change for the\npull request. The first line is a Conventional Commit subject (used as the\ncommit message and PR title), then a blank line, then a structured body with\nsections: Problem, Solution, Tests, Risks. Drydock reads this file, appends\n`Closes #$ISSUE_NUM` to the body, and removes the file — do not commit it.',"ci-fix":"CI failed. Fix the failure and keep changes minimal.\n\nFailed CI log:\n$CI_LOG",plan:'You are working on GitHub issue #$ISSUE_NUM in the repository "$REPO_NAME".\n\nIssue title: $ISSUE_TITLE\n\nIssue body:\n$ISSUE_BODY\n\nDo not change any files. Explore the codebase and produce a concise,\nstep-by-step implementation plan for the issue: the files to touch, the\nchange in each, the order to make them, and how to verify the result\n(tests, typecheck, build). Reply with the plan only — no preamble.',"limit-resume":'Your previous session on issue #$ISSUE_NUM in "$REPO_NAME" was interrupted by a usage limit.\nYou are resuming in a fresh checkout of branch "$BRANCH"; any uncommitted changes from the\ninterrupted session are gone. Re-apply whatever is missing and finish implementing the issue.\nKeep the change focused. You may commit your work or leave it uncommitted — either is fine.\nDo not push or open a pull request yourself; Drydock commits, pushes, and opens the PR.\nBefore finishing, write `.drydock/PR.md`: first line a Conventional Commit subject (used as\nthe commit message and PR title), then a blank line, then a body with Problem, Solution,\nTests, and Risks sections. Drydock appends `Closes #$ISSUE_NUM` and removes the file — do\nnot commit it.'}},27630:(a,b,c)=>{c.d(b,{V:()=>x,n:()=>y});var d=c(97496),e=c(84232),f=c(51214),g=c(20203),h=c(2025),i=c(64537),j=c(94534),k=c(26287),l=c(29668),m=c(48733),n=c(2412),o=c(7611),p=c(5079),q=c(96356);function r(a,b,c,d){let e=(0,o.nc)(a.id,d);if(e)return c.publish(b.id,{type:"error",payload:{stderr:`session not started: ${a.label} is limit-blocked (${e.kind}) until ${new Date(1e3*e.blockedUntil).toISOString()}`}}),{exitCode:-3,costUsd:0,inputTokens:0,outputTokens:0,timedOut:!1,costExceeded:!1,limit:{agent:a.id,kind:e.kind,resetAt:e.blockedUntil,rawSnippet:e.rawSnippet,latched:!0}}}function s(a,b,c,d){if(!d.timedOut&&!d.costExceeded&&(0!==d.exitCode||b.resultIsError))return a.classifyFailure?.({exitCode:d.exitCode,stderr:c,resultText:b.resultText,resultIsError:b.resultIsError})}function t(a,b,c){let d=Math.floor(Date.now()/1e3),e=(0,f.qE)(b.rateLimit,d);e&&(0,p.IP)(a.id,e,c);let g=a.captureUsage?.(b);g&&(0,p.Cx)(g,c,d)}function u(a,b){let c=()=>{},d=!1;return{tripped:new Promise(a=>{c=a}),observe(){!d&&b()>=a&&(d=!0,c())}}}function v(a,b={}){let{timeoutMs:c,costTripped:d}=b,e=b.graceMs??5e3,f=!!c&&c>0;return f||d?new Promise(b=>{let g,h=!1,i=!1,j=a=>{h||(h=!0,b(a))},k=b=>{let c;if(i)return;i=!0,g&&clearTimeout(g),a.abort();let d=new Promise(a=>{c=setTimeout(a,e),c.unref?.()});Promise.race([a.done,d]).then(()=>{clearTimeout(c),j(b)})};f&&(g=setTimeout(()=>{k({exitCode:-1,timedOut:!0,costExceeded:!1})},c),g.unref?.()),d?.then(()=>{k({exitCode:-2,timedOut:!1,costExceeded:!0})}),a.done.then(a=>{i||(g&&clearTimeout(g),j({exitCode:a,timedOut:!1,costExceeded:!1}))})}):a.done.then(a=>({exitCode:a,timedOut:!1,costExceeded:!1}))}function w(a){return{chunks:a.chunks,costUsd:a.costUsd}}async function x(a,b,f,k={}){let l=k.db??(0,h.Lf)(),o=k.runner??j.g,p=k.broker??(0,m.k)(),y=k.provider??(0,g.X$)(a.agent);if("http"===y.kind){let{runOpenRouterJobSession:d}=await c.e(908).then(c.bind(c,17908));return d(a,b,f,{db:l,broker:k.broker,timeoutMs:k.timeoutMs,costCapUsd:k.costCapUsd,sideSession:k.sideSession,fetchImpl:k.fetchImpl,toolExecutor:k.toolExecutor})}let z=k.command??y.defaultCommand,A=a.model??y.defaultModel,B=y.createParser();B.onParseError=b=>p.publish(a.id,{type:"parse_error",payload:b});let C=r(y,a,p,l);if(C)return C;k.sideSession||("working"!==a.status?(0,n.dk)(a.id,"working",{model:A},l):l.update(i.jobs).set({model:A}).where((0,d.eq)(i.jobs.id,a.id)).run());let D=k.costCapUsd&&k.costCapUsd>0?u(k.costCapUsd,()=>B.costUsd>0?B.costUsd:y.estimateCost(A,B.totalInputTokens,B.totalOutputTokens,B.totalCacheCreationInputTokens,B.totalCacheReadInputTokens)):void 0,E=y.buildStartArgs({prompt:b,model:A,maxTurns:a.maxTurns}),F="",G=o(z,E,f,{onStdout:b=>{for(let c of B.push(b))p.publish(a.id,{type:c.type,payload:w(c)});D?.observe()},onStderr:b=>{F=(F+b).slice(-16384),p.publish(a.id,{type:"error",payload:{stderr:b}})}});(0,q.registerAbort)(a.id,G.abort);let{exitCode:H,timedOut:I,costExceeded:J}=await v(G,{timeoutMs:k.timeoutMs,costTripped:D?.tripped,graceMs:k.graceMs});(0,q.clearAbort)(a.id);let K=I||J?void 0:G.spawnError;for(let b of(I&&p.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${k.timeoutMs}ms`}}),J&&p.publish(a.id,{type:"error",payload:{stderr:`session aborted: per-job cost limit of $${k.costCapUsd} reached`}}),B.flush()))p.publish(a.id,{type:b.type,payload:w(b)});let L=B.costUsd>0?B.costUsd:y.estimateCost(A,B.totalInputTokens,B.totalOutputTokens,B.totalCacheCreationInputTokens,B.totalCacheReadInputTokens);return k.sideSession?l.update(i.jobs).set({totalInputTokens:(0,e.ll)`coalesce(${i.jobs.totalInputTokens}, 0) + ${B.totalInputTokens}`,totalOutputTokens:(0,e.ll)`coalesce(${i.jobs.totalOutputTokens}, 0) + ${B.totalOutputTokens}`,costUsd:(0,e.ll)`coalesce(${i.jobs.costUsd}, 0) + ${L}`}).where((0,d.eq)(i.jobs.id,a.id)).run():l.update(i.jobs).set({sessionId:B.sessionId,totalInputTokens:B.totalInputTokens,totalOutputTokens:B.totalOutputTokens,costUsd:L}).where((0,d.eq)(i.jobs.id,a.id)).run(),t(y,B,l),{exitCode:H,sessionId:B.sessionId,costUsd:L,inputTokens:B.totalInputTokens,outputTokens:B.totalOutputTokens,timedOut:I,costExceeded:J,spawnError:K,limit:s(y,B,F,{exitCode:H,timedOut:I,costExceeded:J})}}async function y(a,b,e,f,n={}){let o=n.db??(0,h.Lf)(),p=n.runner??j.g,w=n.broker??(0,m.k)(),x=n.provider??(0,g.X$)(a.agent),z=n.resumePrompt??(0,l.Xm)((0,l.yx)(a.repoId,k._.ciFix,o),{CI_LOG:e});if("http"===x.kind){let{runOpenRouterJobSession:b}=await c.e(908).then(c.bind(c,17908));return b(a,z,f,{db:o,broker:n.broker,timeoutMs:n.timeoutMs,costCapUsd:n.costCapUsd,sideSession:n.sideSession,additive:!0,maxTurns:n.resumeMaxTurns??x.resumeMaxTurns,fetchImpl:n.fetchImpl,toolExecutor:n.toolExecutor})}let A=n.command??x.defaultCommand,B=n.resumeModel??x.resumeModel,C=n.resumeMaxTurns??x.resumeMaxTurns,D=x.createParser();D.onParseError=b=>w.publish(a.id,{type:"parse_error",payload:b});let E=r(x,a,w,o);if(E)return{...E,sessionId:b};let F=n.costCapUsd&&n.costCapUsd>0?o.select().from(i.jobs).where((0,d.eq)(i.jobs.id,a.id)).get()?.costUsd??0:0,G=n.costCapUsd&&n.costCapUsd>0?u(n.costCapUsd,()=>F+(D.costUsd>0?D.costUsd:x.estimateCost(B,D.totalInputTokens,D.totalOutputTokens,D.totalCacheCreationInputTokens,D.totalCacheReadInputTokens))):void 0,H=(x.supportsResume?x.buildResumeArgs({prompt:z,sessionId:b,model:B,maxTurns:C}):null)??x.buildStartArgs({prompt:z,model:B,maxTurns:C}),I="",J=p(A,H,f,{onStdout:b=>{for(let c of D.push(b))w.publish(a.id,{type:c.type,payload:{chunks:c.chunks}});G?.observe()},onStderr:b=>{I=(I+b).slice(-16384),w.publish(a.id,{type:"error",payload:{stderr:b}})}});(0,q.registerAbort)(a.id,J.abort);let{exitCode:K,timedOut:L,costExceeded:M}=await v(J,{timeoutMs:n.timeoutMs,costTripped:G?.tripped,graceMs:n.graceMs});(0,q.clearAbort)(a.id);let N=L||M?void 0:J.spawnError;for(let b of(L&&w.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${n.timeoutMs}ms`}}),M&&w.publish(a.id,{type:"error",payload:{stderr:`session aborted: per-job cost limit of $${n.costCapUsd} reached`}}),D.flush()))w.publish(a.id,{type:b.type,payload:{chunks:b.chunks}});let O=D.costUsd>0?D.costUsd:x.estimateCost(B,D.totalInputTokens,D.totalOutputTokens,D.totalCacheCreationInputTokens,D.totalCacheReadInputTokens),P=o.select().from(i.jobs).where((0,d.eq)(i.jobs.id,a.id)).get();return o.update(i.jobs).set({sessionId:D.sessionId??b,totalInputTokens:(P?.totalInputTokens??0)+D.totalInputTokens,totalOutputTokens:(P?.totalOutputTokens??0)+D.totalOutputTokens,costUsd:(P?.costUsd??0)+O}).where((0,d.eq)(i.jobs.id,a.id)).run(),t(x,D,o),{exitCode:K,sessionId:D.sessionId??b,costUsd:O,inputTokens:D.totalInputTokens,outputTokens:D.totalOutputTokens,timedOut:L,costExceeded:M,spawnError:N,limit:s(x,D,I,{exitCode:K,timedOut:L,costExceeded:M})}}},29668:(a,b,c)=>{c.d(b,{F1:()=>l,yO:()=>o,Xm:()=>k,XZ:()=>m,yx:()=>n});var d=c(97496),e=c(14694),f=c(29980),g=c(2025),h=c(64537),i=c(26287);let j=["$ISSUE_NUM","$ISSUE_TITLE","$ISSUE_BODY","$BRANCH","$REPO_NAME","$CI_LOG"];function k(a,b){let c={$ISSUE_NUM:void 0!==b.ISSUE_NUM?String(b.ISSUE_NUM):"$ISSUE_NUM",$ISSUE_TITLE:b.ISSUE_TITLE??"$ISSUE_TITLE",$ISSUE_BODY:b.ISSUE_BODY??"$ISSUE_BODY",$BRANCH:b.BRANCH??"$BRANCH",$REPO_NAME:b.REPO_NAME??"$REPO_NAME",$CI_LOG:b.CI_LOG??"$CI_LOG"},d=a;for(let a of[...j].sort((a,b)=>b.length-a.length))d=d.split(a).join(c[a]??a);return d}function l(a,b,c=(0,g.Lf)()){return c.select().from(h.promptTemplates).where((0,d.Uo)((0,d.eq)(h.promptTemplates.repoId,a),(0,d.eq)(h.promptTemplates.name,b))).orderBy((0,e.i)(h.promptTemplates.version)).get()}function m(a,b,c=(0,g.Lf)()){let d=l(a,b,c);return d?{content:d.content,version:d.version}:{content:i.E[b]??"",version:null}}function n(a,b,c=(0,g.Lf)()){return m(a,b,c).content}function o(a,b,c=(0,g.Lf)()){return c.select().from(h.promptTemplates).where((0,d.Uo)((0,d.eq)(h.promptTemplates.repoId,a),(0,d.eq)(h.promptTemplates.name,b))).orderBy((0,e.i)(h.promptTemplates.version)).all()}f.Ik({repoId:f.ai().int().positive(),name:f.Yj().min(1),content:f.Yj()})},34973:(a,b,c)=>{c.d(b,{U9:()=>e,ej:()=>f});let d=new Set;function e(a){return d.add(a),()=>{d.delete(a)}}function f(){for(let a of[...d])try{a()}catch{}}},35494:(a,b,c)=>{c.d(b,{$J:()=>n,DS:()=>t,Hb:()=>s,IZ:()=>i,JY:()=>m,Pn:()=>k,_1:()=>x,f1:()=>v,i2:()=>l,jQ:()=>j});var d=c(73024),e=c(76760),f=c(1065);let g=!1,h=new Set;function i(a){g=a}function j(){return g}function k(a){h.add(a)}function l(a){h.delete(a)}function m(){return h.size}function n(a=3e4,b=100){let c=Date.now()+a;return new Promise(a=>{let d=()=>{if(0===h.size||Date.now()>=c)return a();setTimeout(d,b)};d()})}function o(){return(0,e.join)((0,f.TG)(),"instance.lock")}function p(a){try{return process.kill(a,0),!0}catch{return!1}}function q(a){try{var b;let c,e,f,g;return b=(0,d.readFileSync)(a,"utf8"),e=(c=JSON.parse(b)).pid,f="number"==typeof e&&Number.isInteger(e)&&e>0?e:null,g=c.ts,{pid:f,ts:"number"==typeof g&&Number.isFinite(g)?g:null}}catch{return{pid:null,ts:null}}}function r(a){let b=(0,d.openSync)(a,"wx");try{(0,d.writeSync)(b,JSON.stringify({pid:process.pid,ts:Date.now()}))}finally{(0,d.closeSync)(b)}}function s(){let{pid:a,ts:b}=q(o()),c=null!==b&&Date.now()-b<=9e4,d=null!==a&&c&&p(a);return{held:d,pid:a,self:d&&a===process.pid}}function t(){let a=o();(0,d.mkdirSync)((0,e.dirname)(a),{recursive:!0});try{return r(a),!0}catch{}if(!function(a,b){let{pid:c,ts:d}=a;return!(null!==c&&c!==process.pid&&p(c))||null===d||b-d>9e4}(q(a),Date.now()))return!1;try{return(0,d.unlinkSync)(a),r(a),!0}catch{return!1}}let u=null;function v(a=3e4){w(),u=setInterval(()=>{!function(){let a=o();if(q(a).pid!==process.pid)return!1;let b=`${a}.${process.pid}.tmp`;try{if((0,d.writeFileSync)(b,JSON.stringify({pid:process.pid,ts:Date.now()})),q(a).pid!==process.pid)return(0,d.unlinkSync)(b),!1;return(0,d.renameSync)(b,a),!0}catch{try{(0,d.unlinkSync)(b)}catch{}return!1}}()&&w()},a),u.unref?.()}function w(){u&&(clearInterval(u),u=null)}function x(){w();let a=o();if(q(a).pid===process.pid)try{(0,d.unlinkSync)(a)}catch{}}},41947:(a,b,c)=>{c.d(b,{m:()=>e});var d=c(74644);function e(a,b){if("http"===a.kind)return a.id;let c=(0,d.mt)(b);return"codex"===a.id?c.codexPath:c.claudePath}},44769:(a,b,c)=>{c.d(b,{t:()=>d});function d(a){let b=process.env.DRYDOCK_OPENROUTER_API_KEY?.trim();return b||a.openrouterApiKey}},47843:(a,b,c)=>{let d,e;c.d(b,{Bd:()=>b0,tn:()=>b1,py:()=>b2});var f=c(97496),g=c(20203),h=c(2025),i=c(54304),j=c(64537),k=c(24978),l=c(64417),m=c(91549);let n=["blocked","wontfix","question","needs-human","needs-discussion"],o=[{label:"destructive command",re:/\brm\s+-rf\b|\bdrop\s+table\b|\bgit\s+push\s+--force\b|disable\s+auth/i},{label:"secret material",re:/\bapi[_-]?key\b|\bpassword\b|\bsecret\b|\.env\b|\bsk-[a-z0-9]/i},{label:"exfiltration",re:/\bcurl\b|\bwget\b|webhook|pastebin/i},{label:"privileged area",re:/\bauth(entication|orization)?\b|\bpayment|\bbilling\b|\bdeploy|\bsecurity\b|\bci\/cd\b/i}];function p(a){let b=[],c=a.labels.map(a=>a.toLowerCase()).find(a=>n.includes(a));if(c)return{decision:"blocked",reasons:[`blocking label: ${c}`]};let d=`${a.title}
4
- ${a.body??""}`;for(let{label:a,re:c}of o)c.test(d)&&b.push(`${a} detected`);return b.length>0?{decision:"needs_review",reasons:b}:{decision:"approved",reasons:[]}}var q=c(24421),r=c(75818),s=c(16544);let t=[{label:"bug",re:/\b(bug|crash|crashes|broken|error|exception|fails?|regression|defect)\b/i},{label:"enhancement",re:/\b(add|support|feature|implement|enhancement|would be nice|allow|introduce)\b/i},{label:"documentation",re:/\b(docs?|documentation|readme|typo|wording|clarify)\b/i}];function u(a,b,c,d){d.update(j.issues).set({triageHash:c,triagedAt:Math.floor(Date.now()/1e3)}).where((0,f.Uo)((0,f.eq)(j.issues.repoId,a),(0,f.eq)(j.issues.number,b))).run()}async function v(a,b,c,d=(0,h.Lf)()){let e=(0,s.A)(a),g=function(a){let b=JSON.stringify([a.title,a.labels.map(a=>a.name).sort()]),c=5381;for(let a=0;a<b.length;a++)c=(c<<5)+c+b.charCodeAt(a)|0;return(c>>>0).toString(16)}(c),i=d.select().from(j.issues).where((0,f.Uo)((0,f.eq)(j.issues.repoId,a.id),(0,f.eq)(j.issues.number,c.number))).get();if(i?.triagedAt&&i.triageHash===g)return{number:c.number,applied:[],reasons:[],skipped:"unchanged"};if(!(0,s.i)(e,c.authorAssociation))return u(a.id,c.number,g,d),{number:c.number,applied:[],reasons:["author not approved"],skipped:"author"};let k=await b.viewIssue(c.number),l=p({number:k.number,title:k.title,body:k.body,labels:k.labels}),m=[],n=function(a,b){let c=new Set(b),d=`${a.title}
5
- ${a.body}`,e=[];for(let{label:a,re:b}of t)c.has(a)&&b.test(d)&&!e.includes(a)&&e.push(a);return e}(k,e.autoLabelWhitelist);for(let a of n)m.push(`classified as ${a}`);if("approved"===l.decision){let a=e.readyLabels[0];a&&(n.push(a),m.push("safe and well-specified"))}else{let a=e.blockingLabels[0];a&&(n.push(a),m.push(...l.reasons.length?l.reasons:["flagged for human review"]))}let o=new Set([...e.autoLabelWhitelist,...e.readyLabels,...e.blockingLabels]),r=new Set(k.labels),w=[...new Set(n)].filter(a=>o.has(a)&&!r.has(a));if(w.length>0){for(let a of w)await b.ensureLabel(a);await b.addLabels(c.number,w);let e=w.map(a=>`\`${a}\``).join(", ");await b.commentIssue(c.number,`auto-triage: applied ${e} — reasons: ${m.join("; ")}.`),(0,q.sp)(a.id,c.number,w,[],d)}return u(a.id,c.number,g,d),{number:c.number,applied:w,reasons:m}}async function w(a,b,c,d=(0,h.Lf)()){let e=[];for(let f of c)try{e.push(await v(a,b,f,d))}catch(b){(0,r.v)(`[triage] issue #${f.number} failed for ${a.name}`,b)}return e}var x=c(52819),y=c(74340),z=c(44769),A=c(74644),B=c(41947),C=c(2412),D=c(52479);let E="janitor",F=new Set(["ci_running","ci_failed","retrying"]);function G(a){return a?.startsWith("drydock/")??!1}async function H(a,b,c,d){if("function"!=typeof c.deleteBranch)return;let e=function(a,b){let c=b.select({jobId:j.jobEvents.jobId,payload:j.jobEvents.payload}).from(j.jobEvents).innerJoin(j.jobs,(0,f.eq)(j.jobEvents.jobId,j.jobs.id)).where((0,f.Uo)((0,f.eq)(j.jobEvents.type,E),(0,f.eq)(j.jobs.repoId,a))).all(),d=new Set;for(let a of c)try{"branch_deleted"===JSON.parse(a.payload??"{}").action&&d.add(a.jobId)}catch{}return d}(a,d),g=new Set(b.filter(a=>!["merged","aborted"].includes(a.status)).map(a=>a.branch).filter(G));for(let a of b.filter(a=>"merged"===a.status&&null!==a.prNumber&&G(a.branch)&&!e.has(a.id)&&!g.has(a.branch))){let b=a.branch;try{await c.deleteBranch(b),(0,C.yM)(a.id,E,{action:"branch_deleted",branch:b},d)}catch(c){(0,r.v)(`[janitor] branch delete failed for job ${a.id} (${b})`,c)}}}async function I(a,b,c,d){if("function"==typeof c.prMergeState)for(let e of b.filter(a=>F.has(a.status)&&null!==a.prNumber&&G(a.branch))){let b=e.prNumber;try{let f=await c.prMergeState(b);"behind"===f&&"function"==typeof c.updatePrBranch?(await c.updatePrBranch(b),(0,C.yM)(e.id,E,{action:"branch_updated",prNumber:b},d)):"conflicted"===f&&await J(a,e,b,c,d)}catch(a){(0,r.v)(`[janitor] PR refresh failed for job ${e.id} (PR #${b})`,a)}}}async function J(a,b,c,d,e){let f=`rebase needed: conflicts with ${a.defaultBranch}`;try{await d.commentIssue(b.issueNumber,`⚠️ PR #${c} conflicts with \`${a.defaultBranch}\` — a rebase is needed. Parking job #${b.id} for a human.`)}catch(a){(0,r.v)(`[janitor] conflict comment failed for job ${b.id}`,a)}try{let a=(0,C.ax)(b.id,e);if(!a||!F.has(a.status))return;(0,C.yM)(b.id,"status",{reason:"merge_conflict",prNumber:c},e),(0,C.dk)(b.id,"needs_human",{errorMessage:f},e)}catch(a){if(!(a instanceof D.xh))throw a}}async function K(a={}){let b=a.db??(0,h.Lf)();for(let c of(0,i.uP)(b))try{let d=a.forgeFor?.(c)??(0,k.Ie)(c),e=(0,C.N6)(c.id,b);await H(c.id,e,d,b),await I(c,e,d,b)}catch(a){(0,r.v)(`[janitor] sweep failed for ${c.name}`,a)}}var L=c(61408),M=c(77597);async function N(a,b={}){let c=b.command??a.defaultCommand,d=b.runner??M.Sx;try{let{stdout:b,exitCode:e}=await d(c,["--version"]);if(0===e)return{agent:a.id,installed:!0,version:b.trim()};return{agent:a.id,installed:!1,message:`${a.label} CLI '${c}' exited ${e} on --version. Check the installation or the CLI path in settings.`}}catch{return{agent:a.id,installed:!1,message:`${a.label} CLI '${c}' not found. Install it or set the correct CLI path in settings.`}}}var O=c(87105),P=c(25480),Q=c(14543),R=c(93612);let S={kind:"ok"},T={kind:"unknown"};function U(a,b,c){return{kind:"failed",failure:{target:a,label:b,message:c}}}function V(a){return(0,Q.f)(a.trim()).slice(0,200)}async function W(a){let b=a.db??(0,h.Lf)(),c={runner:a.runner??M.Sx,http:a.http??O.D,fetchImpl:a.fetchImpl??fetch,governor:a.governor??m.og,now:a.now??Date.now,probeTimeoutMs:a.probeTimeoutMs??3e4},d=(0,A.mt)(b),e=function(a,b,c,d){let e=[];a.some(a=>"gitlab"!==a.platform)&&e.push({id:"github",probe:async()=>{if(!d.governor.decide("core","low").allowed)return T;try{let a=await d.runner(b.ghPath,["auth","status"],void 0,{timeoutMs:d.probeTimeoutMs});if(0===a.exitCode)return S;let c=V(a.stderr||a.stdout);return U("github","GitHub CLI auth",`\`${b.ghPath} auth status\` exited ${a.exitCode}${c?`: ${c}`:""}. Re-authenticate with \`gh auth login\`.`)}catch(a){if(a instanceof Error&&/timed out/i.test(a.message))return T;return U("github","GitHub CLI auth",`GitHub CLI '${b.ghPath}' could not be probed: ${V(String(a))}`)}}});let f=new Map;for(let b of a){if("gitlab"!==b.platform||!b.apiBaseUrl||!b.apiToken)continue;let a=b.apiBaseUrl.trim().replace(/\/+$/,"");!a||f.has(a)||f.set(a,b.apiToken)}for(let[a,b]of f)e.push(function(a,b,c){let d=`gitlab:${a}`,e=a;try{e=new URL(a).host}catch{}let f=`GitLab (${e})`;return{id:d,probe:async()=>{let g=`${a}/api/v4/user`;try{(0,P.sM)(g,{allowPrivate:(0,P.gT)()})}catch(a){return(0,r.v)(`[watchdog] gitlab probe skipped for ${e}`,a),T}try{var h,i;let a=await (h=c.http(g,{headers:{"PRIVATE-TOKEN":b}}),i=c.probeTimeoutMs,new Promise((a,b)=>{let c=setTimeout(()=>b(Error(`probe timed out after ${i}ms`)),i);c.unref?.(),h.then(b=>{clearTimeout(c),a(b)},a=>{clearTimeout(c),b(a)})}));if(401===a.status||403===a.status)return U(d,f,`GitLab rejected the access token (HTTP ${a.status}). Update the token in the repo's forge settings.`);if(a.ok)return S;return T}catch{return T}}}}(a,b,d));let h=new Set;for(let b of a)(0,g.TU)(b.agent)&&h.add(b.agent);for(let a of h)e.push(function(a,b,c,d){let e=`agent:${a}`,f=(0,g.X$)(a);return"openrouter"===a?{id:e,probe:async()=>{let a=(0,z.t)(b);if(!a)return U(e,"OpenRouter API key","No OpenRouter API key is configured — set it in settings or via DRYDOCK_OPENROUTER_API_KEY.");let c=await (0,R.lw)(a,d.fetchImpl);return c.ok?S:/HTTP 40[13]\b/.test(c.error)?U(e,"OpenRouter API key",`OpenRouter rejected the API key (${V(c.error)}). Update the key in settings.`):T}}:{id:e,probe:async()=>{let a=await N(f,{command:(0,B.m)(f,c),runner:(a,b,c,e)=>d.runner(a,b,c,{timeoutMs:d.probeTimeoutMs,...e})});return a.installed?S:U(e,`${f.label} CLI`,a.message??"CLI probe failed.")}}}(a,b,c,d));return e}((0,i.uP)(b),d,b,c),f=(0,L.iC)(b),j=new Map((f?.failures??[]).map(a=>[a.target,a])),k=[];for(let{id:a,outcome:b}of(await Promise.all(e.map(async a=>{try{return{id:a.id,outcome:await a.probe()}}catch(b){return(0,r.v)(`[watchdog] credential probe for ${a.id} failed`,b),{id:a.id,outcome:T}}}))))if("failed"===b.kind)k.push(b.failure);else if("unknown"===b.kind){let b=j.get(a);b&&k.push(b)}let l={checkedAt:Math.floor(c.now()/1e3),failures:k};return(0,L.z8)(l,b),l}let X=!1;async function Y(a={}){if(!X){X=!0,d=(a.now??Date.now)();try{return await W(a)}finally{X=!1}}}var Z=c(1065),$=c(27630),_=c(73024);let aa=["vercel","railway"];function ab(a){return a.exists??_.existsSync}var ac=c(76760);class ad{async detect(a){let b=ab(a);return b((0,ac.join)(a.cwd,"railway.json"))||b((0,ac.join)(a.cwd,"railway.toml"))||b((0,ac.join)(a.cwd,".railway"))}async getStatus(a){let b=await a.run("railway",["status"],a.cwd);return function(a,b){if(0!==b)return"not_found";let c=a.toLowerCase();return/\bfailed\b|\bcrashed\b|\berror\b/.test(c)?"error":/\bsuccess\b|\bdeployed\b|\bready\b/.test(c)?"ready":/\bbuilding\b/.test(c)?"building":/\bdeploying\b|\binitializing\b|\bqueued\b/.test(c)?"deploying":"not_found"}(b.stdout,b.exitCode)}async getLogs(a){let b=await a.run("railway",["logs"],a.cwd);return[b.stdout,b.stderr].filter(Boolean).join("\n").trim()}constructor(){this.id="railway",this.label="Railway"}}function ae(a){return a?["list","--meta",`githubCommitSha=${a}`]:["list"]}class af{async detect(a){let b=ab(a);return b((0,ac.join)(a.cwd,"vercel.json"))||b((0,ac.join)(a.cwd,".vercel"))}async getStatus(a){let b=await a.run("vercel",ae(a.ref),a.cwd);return function(a,b){if(0!==b)return"not_found";let c=a.split("\n").map(a=>a.trim()).filter(Boolean).find(a=>/●|ready|error|building|queued|initializing/i.test(a.replace(/https?:\/\/\S+/g," ")));if(!c)return"not_found";let d=c.replace(/https?:\/\/\S+/g," ").toLowerCase();return/\berror\b|\bfailed\b|canceled/.test(d)?"error":/\bready\b/.test(d)?"ready":/\bbuilding\b/.test(d)?"building":/\bqueued\b|initializing|deploying/.test(d)?"deploying":"not_found"}(b.stdout,b.exitCode)}async getLogs(a){let b=null;if(a.ref){var c;let d=await a.run("vercel",ae(a.ref),a.cwd);0===d.exitCode&&(c=d.stdout,b=c.match(/https?:\/\/\S+/)?.[0]??null)}let d=b?["inspect","--logs",b]:["logs"],e=await a.run("vercel",d,a.cwd);return[e.stdout,e.stderr].filter(Boolean).join("\n").trim()}constructor(){this.id="vercel",this.label="Vercel"}}let ag=[new af,new ad];async function ah(a,b){if(b)return aa.includes(b)?function(a){let b=ag.find(b=>b.id===a);if(!b)throw Error(`unsupported deployment platform: ${a}`);return b}(b):null;for(let b of ag)if(await b.detect(a))return b;return null}var ai=c(64080);function aj(a,b){return{cwd:a.path,ref:b,run:M.Sx}}async function ak(a={}){let b=a.db??(0,h.Lf)(),c=a.now??Date.now,d=a.budgets??ai.ad;for(let e of(0,i.uP)(b))if((0,s.A)(e).autoHealDeployments)try{let f=a.forgeFor?.(e)??(0,k.Ie)(e),g=a.adapterFor??(a=>ah(aj(a,null),a.deploymentPlatform)),h=await g(e);if(!h)continue;let i=a.openFixPr??an;await al(e,f,h,{db:b,now:c,budgets:d,openFixPr:i})}catch(a){(0,r.v)(`[deploy-heal] sweep failed for ${e.name}`,a)}}async function al(a,b,c,d){let{db:e,now:f,budgets:g}=d,h=(0,C.N6)(a.id,e);for(let a of h){let d;if("merged"!==a.status||null==a.prNumber)continue;let h=(a.finishedAt??a.createdAt)*1e3;if(!(f()-h>g.monitorWindowMs)){try{d=await b.prMergeCommitSha?.(a.prNumber)??await b.prHeadSha(a.prNumber)}catch(b){(0,r.v)(`[deploy-heal] merged sha lookup failed for job ${a.id}`,b);continue}(0,ai.SR)(a.id,d,e)||(0,ai.eY)(a.id,a.prNumber,c.id,d,e)}}for(let b of e.select().from(j.deploymentHealingSessions).all().filter(a=>"monitoring"===a.status)){let e=h.find(a=>a.id===b.jobId);if(e)try{await am(a,e,c,b,d)}catch(c){(0,r.v)(`[deploy-heal] session ${b.id} failed for ${a.name}`,c)}}}async function am(a,b,c,d,e){let{db:f,now:g,budgets:h}=e,i=(0,ai.FL)({createdAt:1e3*d.createdAt,lastPolledAt:1e3*d.updatedAt,now:g(),initialDelayMs:h.initialDelayMs,intervalMs:h.intervalMs,timeoutMs:h.timeoutMs});if("wait"===i)return;if("timeout"===i)return void(0,ai.X)(d.id,"escalated",{},f);let j=aj(a,d.commitSha),k=(0,ai.eV)(await c.getStatus(j));if("ready"===k)return void(0,ai.X)(d.id,"healthy",{},f);if("pending"===k)return void(0,ai.LR)(d.id,f);let l=(await c.getLogs(j).catch(()=>"")).split("\n").slice(-h.maxLogLines).join("\n").trim(),m=(0,ai.X)(d.id,"failed",{logsExcerpt:l||null},f);(0,ai.X)(d.id,"repairing",{},f);try{let c=await e.openFixPr(a,b,m,l);(0,ai.X)(d.id,"repaired",{followupPrNumber:c},f)}catch(a){(0,r.v)(`[deploy-heal] fix PR failed for session ${d.id}`,a),(0,ai.X)(d.id,"escalated",{},f)}}async function an(a,b,c,d){let e=(0,h.Lf)(),f=(0,g.X$)(b.agent),i=(0,B.m)(f,e),j=new Z.ND,l=c.commitSha.slice(0,7),m=`drydock/deploy-fix-${b.id}-${l}`,n=(0,k.Ie)(a),o=await j.prepareForNewBranch(a,m,`${b.id}-${l}`);try{let g=await (0,$.V)(b,[`The deployment of the merged pull request #${c.prNumber} failed on`,`${c.platform} (commit ${c.commitSha.slice(0,7)}).`,"\nDeployment logs:\n```",d||"(no logs captured)","```\n\nDiagnose the deployment failure and make the minimal change that fixes it.\nEnsure the project builds and tests pass, then stop — the commit, push, and\npull request are handled for you."].join("\n"),o.path,{db:e,provider:f,command:i,sideSession:!0});if(0!==g.exitCode)throw Error(`${f.label} exited non-zero`);return await j.commitAndPush(o,`Fix failed ${c.platform} deployment for PR #${c.prNumber}`),n.createPr({head:m,base:a.defaultBranch,title:`Fix failed ${c.platform} deployment (PR #${c.prNumber})`,body:`The deployment for #${c.prNumber} (commit ${l}) failed. This PR addresses the deployment failure.`})}finally{try{await j.remove(o,a.path)}catch(a){(0,r.v)(`[deploy-heal] worktree cleanup failed for job ${b.id}`,a)}}}var ao=c(7611),ap=c(9617),aq=c(76373),ar=c(8804),as=c(51455),at=c(48161),au=c(29980),av=c(59144);let aw=au.Ik({release:au.zM(),bump:au.k5(["patch","minor","major"]),title:au.Yj().default(""),notes:au.Yj().default("")});var ax=c(98887);async function ay(a){if("http"===a.provider.kind){let{runOpenRouterOneShot:b}=await c.e(528).then(c.bind(c,59528));return b({model:a.model,prompt:a.prompt,repoId:a.repoId,type:a.type,timeoutMs:a.timeoutMs,db:a.db,fetchImpl:a.fetchImpl})}let b=a.runner??M.Sx,d=a.db??(0,h.Lf)(),e=void 0!==a.timeoutMs?{timeoutMs:a.timeoutMs}:void 0,f=a.provider.buildStreamOneShotArgs({prompt:a.prompt,model:a.model});if(null===f){let c=a.provider.buildOneShotArgs({prompt:a.prompt,model:a.model}),d=e?await b(a.command,c,a.cwd,e):await b(a.command,c,a.cwd);return{text:d.stdout,exitCode:d.exitCode,costUsd:0,stderr:d.stderr}}let g=e?await b(a.command,f,a.cwd,e):await b(a.command,f,a.cwd),i=new ax.KO,k=[...i.push(g.stdout),...i.flush()],l=[];for(let a of k)for(let b of a.chunks)"text"===b.kind&&l.push(b.text);let m=l.join(""),n=i.costUsd>0?i.costUsd:0;return n>0&&void 0!==a.repoId&&d.insert(j.oneShotCosts).values({repoId:a.repoId,type:a.type,costUsd:n,inputTokens:i.totalInputTokens,outputTokens:i.totalOutputTokens}).run(),{text:m,exitCode:g.exitCode,costUsd:n,stderr:g.stderr}}async function az(a){var b;let c,d=await a.listReleases(),e=function(a){let b=null;for(let c of a)(0,av.kf)(c)&&(null===b||(0,av.mU)(c,b)>0)&&(b=c);return b}(d.map(a=>a.tagName)),f=e?d.find(a=>a.tagName===e)?.createdAt??null:null;return{fromTag:e,releases:d,prs:(b=(await a.listMergedPrs(100)).map(a=>({number:a.number,title:a.title,labels:a.labels,mergedAt:a.mergedAt})),c=null===f?null:Date.parse(f),b.filter(a=>{let b=Date.parse(a.mergedAt);return!Number.isNaN(b)&&(null===c||b>c)}).sort((a,b)=>a.number-b.number))}}async function aA(a,b){let c=b.db??(0,h.Lf)(),d=(0,ar.tm)(a,c);if(!d)throw Error(`release run ${a} not found`);let e=d.mode;(0,ar.Cq)(a,"evaluating",{},c);try{var f;let{fromTag:g,releases:h,prs:i}=await az(b.forge);if("manual"===e&&0===i.length&&!d.tag)return(0,ar.Cq)(a,"skipped",{fromTag:g},c);let j=await b.generate({fromTag:g,prs:i});if("auto"===e&&!j)return(0,ar.Cq)(a,"error",{errorMessage:"release evaluation failed"},c);if("auto"===e&&j&&!j.release)return(0,ar.Cq)(a,"skipped",{fromTag:g},c);let k=function(a,b,c){let d="manual"===a?"patch":b?.bump??"patch",e=b?.title?.trim()??"";return{bump:d,title:e,notes:b?.notes?.trim()||(0===c.length?"No changes since the last release.":c.map(a=>`- #${a.number} ${a.title}`).join("\n"))}}(e,j,i),l=d.tag??(f=k.bump,`v${(0,av.rr)(g??"0.0.0",f)}`);if((0,ar.Cq)(a,"proposed",{bump:k.bump,fromTag:g,tag:l,title:k.title||l,notes:k.notes,prNumbers:i.map(a=>a.number)},c),h.some(a=>a.tagName===l))return(0,ar.Cq)(a,"publishing",{},c),(0,ar.Cq)(a,"published",{},c);return(0,ar.Cq)(a,"publishing",{},c),await b.forge.createRelease({tag:l,title:k.title||l,notes:k.notes,target:b.repo.defaultBranch}),(0,ar.Cq)(a,"published",{},c)}catch(f){let b=f instanceof Error?f.message:String(f),d=(0,ar.tm)(a,c),e=d?.status??"evaluating";if("evaluating"===e||"proposed"===e||"publishing"===e)return(0,ar.Cq)(a,"error",{errorMessage:b.slice(0,500)},c);return(0,ar.tm)(a,c)}}async function aB(a,b){let c=await (0,as.mkdtemp)((0,ac.join)((0,at.tmpdir)(),"drydock-release-"));try{var d;let e,f=(e=(d={provider:a.provider,command:a.command,model:a.model,cwd:c,runner:a.runner}).timeoutMs??18e4,async a=>{try{let b,c,f,{text:g,exitCode:h}=await ay({provider:d.provider,command:d.command,model:d.model,cwd:d.cwd,prompt:(c=(b=a.prs.slice(0,200)).length>0?b.map(a=>{let b=a.labels.length>0?` [${a.labels.join(", ")}]`:"";return`- #${a.number} ${a.title}${b}`}).join("\n"):"(no merged pull requests)",["You are deciding whether to cut a new software release. Given the most\nrecent release and the pull requests merged since then, decide whether a\nrelease is warranted, which semantic-version bump it should be, and write\nconcise Markdown release notes.\n",a.fromTag?`The most recent release is ${a.fromTag}.`:"There is no prior release (this would be the first).","\n## Pull requests merged since the last release\n",c,'\n## How to choose the bump\n\n- "major": incompatible / breaking changes.\n- "minor": new, backwards-compatible features.\n- "patch": backwards-compatible bug fixes or internal-only changes.\n\n## Response format\n\nRespond with ONLY a JSON object (no prose, no code fences) of the shape:\n\n{"release": <true|false>, "bump": "patch"|"minor"|"major",\n "title": "<short release title>", "notes": "<Markdown release notes>"}\n\nSet "release" to false when the changes do not warrant a release yet (e.g.\nonly docs/CI tweaks). When false, the other fields are ignored.'].join("\n")),repoId:d.repoId,type:"release",timeoutMs:e,runner:d.runner,db:d.db});if(0!==h)return null;let i=g.match(/\{[\s\S]*\}/);if(!i)return null;try{f=JSON.parse(i[0])}catch{return null}let j=aw.safeParse(f);return j.success?j.data:null}catch{return null}});return await b(f)}finally{try{await (0,as.rm)(c,{recursive:!0,force:!0})}catch{}}}async function aC(a={}){let b=a.db??(0,h.Lf)();if(!(0,A.mt)(b).releaseManagementEnabled)return;let c=a.now??Date.now,d=a.windowMs??36e5,e=a.notify??((a,c)=>(0,aq.JD)(a,c,b));for(let f of(0,i.uP)(b))if((0,s.A)(f).releaseEnabled)try{let h=a.forgeFor?.(f)??(0,k.Ie)(f),i="function"==typeof h.listReleases&&"function"==typeof h.listMergedPrs&&"function"==typeof h.createRelease?h:null;if(!i)continue;let j=a.generatorFor?.(f)??function(a,b){let c=(0,g.X$)(a.agent),d=(0,B.m)(c,b),e=a.defaultModel;return a=>aB({provider:c,command:d,model:e},b=>b(a))}(f,b);await aD(f,h,i,j,{db:b,now:c,windowMs:d,notify:e})}catch(a){(0,r.v)(`[release] sweep failed for ${f.name}`,a)}}async function aD(a,b,c,d,e){let{db:f,now:g,windowMs:h}=e;for(let i of(0,C.N6)(a.id,f)){if("merged"!==i.status||null==i.prNumber)continue;let f=(i.finishedAt??i.createdAt)*1e3;if(!(g()-f>h))try{await aE(a,i,b,c,d,e)}catch(b){(0,r.v)(`[release] job ${i.id} failed for ${a.name}`,b)}}}async function aE(a,b,c,d,e,f){let{db:g,notify:h}=f,i=b.prNumber,j=(0,ar.$J)(a.id,i,g);if(j&&"detected"!==j.status)return;let k=await c.prHeadSha(i),l=(0,ar.v0)({repoId:a.id,mode:"auto",triggerPrNumber:i,triggerSha:k},g);if("detected"!==l.status)return;let m=await aA(l.id,{repo:a,forge:d,db:g,generate:e});"published"===m.status&&m.tag&&await h("release_published",`🚀 Released ${a.name} ${m.tag}.`)}var aF=c(62907),aG=c(48036),aH=c(14694);let aI={pending:["in_progress","skipped","deferred"],in_progress:["done","skipped","deferred"],deferred:["pending","in_progress","skipped"],done:[],skipped:[]};class aJ extends Error{constructor(a,b){super(`invalid subtask transition: ${a} -> ${b}`)}}let aK=/^\s*[-*]\s*\[[ xX]\]\s+(.+?)\s*$/,aL=/^\s*#*\s*(Bug\s+\d+\s*(?:[—:-])\s*.+?)\s*$/;async function aM(a,b={}){let c=function(a){let b=function(a){let b=[];for(let c of a.split("\n")){let a=c.match(aK);a?.[1]&&b.push(a[1].trim())}return b}(a);if(b.length>=2)return b;let c=function(a){let b=[];for(let c of a.split("\n")){let a=c.match(aL);a?.[1]&&b.push(a[1].trim())}return b}(a);return c.length>=2?c:[]}(a.body);if(c.length>=2)return{titles:c,source:"heuristic"};if(b.generate)try{let c=(await b.generate(a)).map(a=>a.trim()).filter(Boolean);if(c.length>=2)return{titles:c,source:"agent"}}catch(b){if(b instanceof ao.vu)throw b;(0,r.v)(`[decompose] agent fallback failed for issue #${a.number}`,b)}return{titles:[],source:"none"}}function aN(a){return a.map((a,b)=>{let{box:c,suffix:d}=function(a){switch(a){case"done":return{box:"[x]",suffix:""};case"skipped":return{box:"[~]",suffix:" — skipped"};case"in_progress":return{box:"[ ]",suffix:" — in progress"};case"deferred":return{box:"[ ]",suffix:" — deferred"};default:return{box:"[ ]",suffix:""}}}(a.status);return`${b+1}. ${c} ${a.title}${d}`}).join("\n")}function aO(a,b,c=(0,h.Lf)()){return c.select().from(j.issueSubtasks).where((0,f.Uo)((0,f.eq)(j.issueSubtasks.repoId,a),(0,f.eq)(j.issueSubtasks.issueNumber,b))).orderBy((0,aH.Y)(j.issueSubtasks.ordinal)).all()}function aP(a,b,c=(0,h.Lf)()){let d=c.select().from(j.issueSubtasks).where((0,f.eq)(j.issueSubtasks.id,a)).get();if(!d)throw Error(`subtask ${a} not found`);var e=d.status;if(!aI[e].includes(b))throw new aJ(e,b);return c.update(j.issueSubtasks).set({status:b}).where((0,f.eq)(j.issueSubtasks.id,a)).returning().get()}async function aQ(a,b,c=(0,h.Lf)(),d={}){var e,g,i,k;let l=function(a){let b=5381;for(let c=0;c<a.length;c++)b=(b<<5)+b+a.charCodeAt(c)|0;return(b>>>0).toString(16)}(b.body);if(e=a.id,g=b.number,c.select({h:j.issues.decomposedHash}).from(j.issues).where((0,f.Uo)((0,f.eq)(j.issues.repoId,e),(0,f.eq)(j.issues.number,g))).get()?.h===l)return{subtasks:aO(a.id,b.number,c),source:"none",skipped:!0};let{titles:m,source:n}=await aM(b,{generate:d.generate}),o=function(a,b,c,d,e=(0,h.Lf)()){return e.transaction(e=>(e.delete(j.issueSubtasks).where((0,f.Uo)((0,f.eq)(j.issueSubtasks.repoId,a),(0,f.eq)(j.issueSubtasks.issueNumber,b))).run(),c.forEach((c,f)=>{e.insert(j.issueSubtasks).values({repoId:a,issueNumber:b,ordinal:f,title:c,bodyHash:d}).run()}),e.select().from(j.issueSubtasks).where((0,f.Uo)((0,f.eq)(j.issueSubtasks.repoId,a),(0,f.eq)(j.issueSubtasks.issueNumber,b))).orderBy((0,aH.Y)(j.issueSubtasks.ordinal)).all()))}(a.id,b.number,m,l,c);return i=a.id,k=b.number,c.update(j.issues).set({decomposedHash:l}).where((0,f.Uo)((0,f.eq)(j.issues.repoId,i),(0,f.eq)(j.issues.number,k))).run(),{subtasks:o,source:n,skipped:!1}}var aR=c(26287),aS=c(29668);function aT(a){return a?.trim()||null}async function aU(a={}){let b=a.runner??M.Sx,c=a.preferred??"auto",d="auto"===c?["docker","podman"]:[c];for(let a of d)try{let{exitCode:c}=await b(a,["--version"]);if(0===c)return{runtime:a}}catch{}let e=d.join(" / ");return{runtime:null,message:`No usable container runtime found (tried ${e}). Install Docker or Podman, or disable sandboxed execution for this repo.`}}var aV=c(94534);function aW(a){try{return(0,_.readFileSync)(a,"utf8")}catch{return null}}async function aX(a){var b;let c,d,e=a.deps??{},f=e.detect??(a=>aU({preferred:a})),g=await f(a.preferredRuntime);if(null===g.runtime)return{ok:!1,reason:g.message};let h=function(a,b,c){if(a.imageOverride)return a.imageOverride;let d=function(a,b){for(let c of[(0,ac.join)(a,".devcontainer","devcontainer.json"),(0,ac.join)(a,".devcontainer.json")]){let a=b.readFileText(c);if(null!=a)try{let b=JSON.parse(a.replace(/\/\*[\s\S]*?\*\//g,"").replace(/(^|[^:])\/\/.*$/gm,"$1").replace(/,\s*([}\]])/g,"$1"));if("string"==typeof b.image&&b.image.trim())return b.image.trim()}catch{}}return null}(b,c);return d||aT(a.defaultImage)}(a.config,a.worktreePath,{readFileText:e.readFileText??aW});if(!h)return{ok:!1,reason:"Sandboxed execution is enabled but no container image could be resolved. Set a per-repo sandbox image, add a devcontainer.json, or set a global default image in settings."};let i=(c=(function(a,b){switch(a){case"codex":return[{host:(0,ac.join)(b,".codex"),container:"/root/.codex"}];case"openrouter":return[];default:return[{host:(0,ac.join)(b,".claude"),container:"/root/.claude"},{host:(0,ac.join)(b,".claude.json"),container:"/root/.claude.json"}]}})((b={agent:a.agent,home:e.home??(0,at.homedir)(),env:e.env??process.env,exists:e.exists??_.existsSync}).agent,b.home).filter(a=>b.exists(a.host)),d=[],b.env.GH_TOKEN?.trim()?d.push("GH_TOKEN"):b.env.GITHUB_TOKEN?.trim()&&d.push("GITHUB_TOKEN"),{mounts:c,env:d});return{ok:!0,session:{runner:function(a,b={}){let c=b.baseRunner??aV.g,d=b.cleanup??M.Sx;return(b,e,f,g)=>{let h=function(a,b,c){let d=["run","--rm","--init","--name",a.containerName,"-v",`${a.hostPath}:${a.workdir}`,"-w",a.workdir];for(let b of(a.allowNetwork||d.push("--network","none"),a.cpus&&d.push("--cpus",a.cpus),a.memory&&d.push("--memory",a.memory),a.mounts))d.push("-v",`${b.host}:${b.container}:ro`);for(let b of a.env)d.push("-e",b);return d.push(a.image,b,...c),{cmd:a.runtime,args:d}}(a,b,e),i=c(h.cmd,h.args,f,g);return{done:i.done,get spawnError(){return i.spawnError},abort:b=>{i.abort(b);try{d(a.runtime,["rm","-f",a.containerName]).catch(b=>(0,r.v)(`[sandbox] failed to remove container ${a.containerName}`,b))}catch(b){(0,r.v)(`[sandbox] failed to remove container ${a.containerName}`,b)}}}}}({runtime:g.runtime,image:h,workdir:"/workspace",hostPath:a.worktreePath,containerName:`drydock-job-${a.jobId}`,allowNetwork:a.config.allowNetwork,cpus:a.config.cpus,memory:a.config.memory,mounts:i.mounts,env:i.env},{baseRunner:e.baseRunner,cleanup:e.cleanup}),command:a.inContainerCommand}}}let aY=["usage_limit","rate_limit","overloaded"],aZ=new Set(["CANCELLED","ACTION_REQUIRED"]),a$=new Set(["TIMED_OUT"]),a_=/\b(ai|claude|codex|copilot|gpt|llm)\b.*\breview\b|\breview\b.*\b(ai|bot)\b/i,a0=/\bcancell?ed\b|\bsecret\b|\b(rate.?limit|secondary rate)\b|\b5\d\d\b|\b(401|403|unauthorized|forbidden)\b|service unavailable/i,a1=/\b(time(d)?.?out|timeout|intermittent|flak(y|e)|econnreset|etimedout|esockettimedout)\b/i,a2=/\b(typecheck|tsc|type error|ts\d{3,5}|lint|biome|eslint|prettier|test|tests|spec|vitest|jest|pytest|assert(ion)?|build|compile|compilation|codegen|generated|snapshot|out of date|outdated)\b/i,a3=[{kind:"type",re:/\berror TS\d{2,5}\b|\bTS\d{2,5}:|\bType error:|is not assignable to/i},{kind:"dependency",re:/\bnpm ERR!|\bERR_PNPM|\bERESOLVE\b|unmet peer|peer dep|frozen lockfile|out of date lockfile|cannot find module '/i},{kind:"lint",re:/\bbiome\b|\beslint\b|\bprettier\b|\blint\/[a-z]|@typescript-eslint\/|formatter would have/i},{kind:"test",re:/\bFAIL\b|✕|✗|✖|●|\bAssertionError\b|expect\(|Expected:|Received:|\bTests?:\s|\d+ failed/i},{kind:"build",re:/failed to compile|module not found|compilation (failed|error)|\bcompile error\b|cannot compile/i},{kind:"timeout",re:/\btimed out\b|\btimeout\b|exceeded \d+\s?ms/i},{kind:"flaky",re:/\bECONNRESET\b|\bETIMEDOUT\b|\bESOCKETTIMEDOUT\b|intermittent|\bflak(y|e)\b/i}];function a4(a,b){if(0===a.length)return{kind:"unknown",evidence:""};let c=a.split("\n"),d=function(a){for(let{kind:b,re:c}of a3)if(c.test(a))return b;return"unknown"}(a);if("unknown"===d)return{kind:d,evidence:c.slice(-b).join("\n")};let e=a3.find(a=>a.kind===d),f=e?c.findIndex(a=>e.re.test(a)):-1;if(f<0)return{kind:d,evidence:c.slice(-b).join("\n")};let g=Math.max(0,f-3);return{kind:d,evidence:c.slice(g,g+b).join("\n")}}let a5={test:"A test is failing. Identify the failing test(s) from the evidence and fix the underlying code so they pass. Do not delete or skip tests, and do not weaken assertions to go green.",type:"A type error is failing the check. Fix the reported type error(s) properly — correct the types; do not silence them with `any` or `@ts-ignore`.",lint:"A lint/format check is failing. Fix the reported rule violations. Prefer the autofix (e.g. `npx biome check --write`) and resolve anything it cannot fix by hand.",build:"The build/compile step failed. Fix the compilation error(s) shown below (e.g. a broken import or unresolved module).",dependency:"A dependency step failed. Resolve the dependency problem below — a missing or incompatible package, or an out-of-date lockfile. Update package.json and the lockfile together.",timeout:"A check timed out. If a change in this branch introduced a hang or a slow path, fix it; otherwise make the affected code complete within the time budget.",flaky:"A check failed on what looks like an intermittent/network error. If the branch made the code fragile to this, harden it; otherwise the failure may not be code-related.",unknown:"A CI check is failing. Diagnose the failure from the evidence below and fix it."};var a6=c(34666);let a7=new Set(["FAILURE","ERROR","CANCELLED","TIMED_OUT","ACTION_REQUIRED"]),a8=new Set(["PENDING","QUEUED","IN_PROGRESS","WAITING","REQUESTED"]);function a9(a){return 0===a.length?"none":a.some(a=>a7.has(a.state.toUpperCase()))?"failed":a.some(a=>a8.has(a.state.toUpperCase()))?"pending":"passed"}function ba(a){return a.timedOut?"CI-fix session timed out":a.costExceeded?"per-job cost limit reached during the CI fix":a.spawnError?`CI-fix session failed to start: ${a.spawnError.message}`:0!==a.exitCode?"CI-fix session exited non-zero":a.settledExternally?"job was settled externally during the CI fix":a.noChanges?"CI-fix session produced no changes":null}function bb(a,b){return()=>!!(0,ao.nc)(a.agent,b)}function bc(a,b,c,d){let e=c.limit;if(!e)return null;if("auth"===e.kind||"billing"===e.kind){let c="auth"===e.kind?"authentication":"billing",f=`CI fix blocked by a provider ${c} error: ${e.rawSnippet}`.slice(0,500);return(0,C.yM)(a.id,"status",{reason:f,prNumber:b},d),{job:(0,C.dk)(a.id,"needs_human",{errorMessage:f},d),done:!0}}return aY.includes(e.kind)&&(0,ao.$q)(e.agent,d)?(e.latched||(0,ao.H_)(e,d),(0,C.yM)(a.id,"status",{reason:`${e.agent}_${e.kind} during CI fix`,prNumber:b},d),{job:(0,C.dk)(a.id,"ci_running",{ciRetryCount:Math.max(0,a.ciRetryCount-1)},d),done:!1}):null}function bd(a,b){let c;return{start:()=>!(a<=0)&&void 0===c&&(c=b(),!0),open:()=>a>0&&void 0!==c&&b()-c<a,reset(){c=void 0}}}let be=a=>new Promise(b=>setTimeout(b,a)),bf=new Set(["ci_running","ci_failed","retrying"]);function bg(a,b){let c=(0,C.ax)(a,b);if(!(!c||bf.has(c.status)))return c}async function bh(a,b,c,d,e){await d.gh.commentIssue(a.issueNumber,`${c} Handing over to a human.`);let f=await d.gh.createIssue(`Follow-up: CI keeps failing for issue #${a.issueNumber}`,`Job ${a.id} could not be auto-healed on PR #${b}. ${c}`);return e.insert(j.followupIssues).values({jobId:a.id,ghIssueNumber:f,title:`Follow-up for #${a.issueNumber}`}).run(),(0,C.dk)(a.id,"needs_human",{errorMessage:c.slice(0,500)},e)}async function bi(a,b,c,d,e,f="checks stayed pending"){let g=Math.round(c/6e4),h=`CI did not complete in time (${f} for over ${g} min on PR #${b}).`;return await d.gh.commentIssue(a.issueNumber,`${h} Handing over to a human.`),(0,C.yM)(a.id,"status",{reason:"ci wait budget exceeded",prNumber:b},e),(0,C.dk)(a.id,"needs_human",{errorMessage:h.slice(0,500)},e)}async function bj(a,b,c){if(c.autoHeal)return bk(a,b,c,c.autoHeal);let d=c.db??(0,h.Lf)(),e=c.sleep??be,f=c.pollMs??3e4,g=c.maxPolls??1/0,i=c.ciWaitMs??1/0,j=c.now??Date.now,k=j()+i,l=bd(c.mergeGateMs??0,j),m=bd(Math.max(c.mergeGateMs??0,f),j),n=c.limitBlocked??bb(a,d),o=!1,p=a,q=0;for(;q<g;){q++;let a=bg(p.id,d);if(a)return a;let g=a9(await c.gh.prChecks(b));if("pending"===g){if(l.reset(),m.reset(),j()>=k)return bi(p,b,i,c,d);await e(f);continue}if("none"===g&&!c.mergeWithoutChecks){if(l.reset(),m.reset(),j()>=k)return bi(p,b,i,c,d,"no CI checks were reported");await e(f);continue}if("none"===g){if(l.reset(),m.start()&&(0,C.yM)(p.id,"status",{reason:"no CI checks reported; settling before an unverified merge",prNumber:b},d),m.open()){if(j()>=k)return bi(p,b,i,c,d,"no CI checks were reported");await e(f);continue}let a=bg(p.id,d);if(a)return a;return(0,C.yM)(p.id,"status",{reason:"merging without CI verification (no checks reported)",prNumber:b},d),await c.gh.mergePr(b),(0,C.dk)(p.id,"merged",{prNumber:b},d)}if("passed"===g){if(m.reset(),l.start()&&(0,C.yM)(p.id,"status",{reason:"merge gate: CI green, waiting for late reviews",prNumber:b},d),l.open()){await e(f);continue}let a=bg(p.id,d);if(a)return a;return await c.gh.mergePr(b),(0,C.dk)(p.id,"merged",{prNumber:b},d)}if(l.reset(),m.reset(),n()){if(j()>=k)return bi(p,b,i,c,d,"the provider usage limit blocked the CI fix");o||((0,C.yM)(p.id,"status",{reason:"ci fix deferred: provider limit latched",prNumber:b},d),o=!0),await e(f);continue}if(o=!1,(p=(0,C.dk)(p.id,"ci_failed",{prNumber:b},d)).ciRetryCount>=3)return bh(p,b,"CI failed 3 times.",c,d);if(!p.sessionId)return(0,C.yM)(p.id,"status",{reason:"missing session id, cannot resume for CI fix"},d),(0,C.dk)(p.id,"needs_human",{errorMessage:"CI failed but no session id to resume"},d);let h=p.sessionId;p=(0,C.dk)(p.id,"retrying",{ciRetryCount:p.ciRetryCount+1},d);let{evidence:r}=a4(await c.gh.failedRunLog(b),200),s=await c.resumeSession(p,h,r),t=bc(p,b,s,d);if(t){if(p=t.job,t.done)return p;continue}let u=ba(s);if(u)return(0,C.yM)(p.id,"status",{reason:u,prNumber:b},d),(0,C.dk)(p.id,"needs_human",{errorMessage:u},d);(0,ao._x)(p.agent,d),p=(0,C.dk)(p.id,"ci_running",{},d)}return(0,C.ax)(p.id,d)??p}async function bk(a,b,c,d){let e,f=c.db??(0,h.Lf)(),g=c.sleep??be,i=c.pollMs??3e4,j=c.maxPolls??1/0,k=d.budgets??a6.op,l=c.now??d.now??Date.now,m=c.ciWaitMs??1/0,n=l()+m,o=bd(c.mergeGateMs??0,l),p=bd(Math.max(c.mergeGateMs??0,i),l),q=c.limitBlocked??bb(a,f),r=a,s=0;for(;s<j;){s++;let a=bg(r.id,f);if(a)return e&&(0,a6.rh)(e.sessionId,"superseded",f),a;let h=await c.gh.prChecks(b),j=a9(h);if("pending"===j){if(o.reset(),p.reset(),l()>=n)return e&&(0,a6.rh)(e.sessionId,"escalated",f),bi(r,b,m,c,f);await g(i);continue}if("none"===j&&!c.mergeWithoutChecks){if(o.reset(),p.reset(),l()>=n)return e&&(0,a6.rh)(e.sessionId,"escalated",f),bi(r,b,m,c,f,"no CI checks were reported");await g(i);continue}if("none"===j){if(o.reset(),p.start()&&(0,C.yM)(r.id,"status",{reason:"no CI checks reported; settling before an unverified merge",prNumber:b},f),p.open()){if(l()>=n)return e&&(0,a6.rh)(e.sessionId,"escalated",f),bi(r,b,m,c,f,"no CI checks were reported");await g(i);continue}let a=bg(r.id,f);if(a)return e&&(0,a6.rh)(e.sessionId,"superseded",f),a;return e&&(0,a6.rh)(e.sessionId,"superseded",f),(0,C.yM)(r.id,"status",{reason:"merging without CI verification (no checks reported)",prNumber:b},f),await c.gh.mergePr(b),(0,C.dk)(r.id,"merged",{prNumber:b},f)}if("passed"===j){if(p.reset(),o.start()&&(0,C.yM)(r.id,"status",{reason:"merge gate: CI green, waiting for late reviews",prNumber:b},f),o.open()){await g(i);continue}let a=bg(r.id,f);if(a)return e&&(0,a6.rh)(e.sessionId,"superseded",f),a;if(e){let a=await d.headSha(b);(0,a6.Az)(e.attemptId,{status:"healed",afterSha:a},f),(0,a6.Yv)(e.sessionId,"verifying",f),(0,a6.Yv)(e.sessionId,"healed",f)}return await c.gh.mergePr(b),(0,C.dk)(r.id,"merged",{prNumber:b},f)}o.reset(),p.reset();let t=h.filter(a=>a7.has(a.state.toUpperCase())),u=await d.headSha(b);if(e){let a="rerun"===e.kind?(0,a6.sk)({beforeFailingCount:e.beforeFailing,afterFailingCount:t.length}):(0,a6.I0)({beforeSha:e.beforeSha,afterSha:u,beforeFailingCount:e.beforeFailing,afterFailingCount:t.length});(0,a6.Az)(e.attemptId,{status:a.verdict,afterSha:u},f);let d=e.sessionId;if(e=void 0,"rejected"===a.verdict)return(0,a6.Yv)(d,"verifying",f),(0,a6.Yv)(d,"escalated",f),bh(r,b,`CI auto-heal: ${a.reason}.`,c,f);(0,a6.Yv)(d,"verifying",f),(0,a6.Yv)(d,"cooldown",f)}if(q()){if(l()>=n)return bi(r,b,m,c,f,"the provider usage limit blocked auto-heal");await g(i);continue}let v=(0,a6.dT)(r.id,b,u,f),w=await c.gh.failedRunLog(b),x=t.map(a=>(function(a,b,c=""){var d,e;let f,g,h=(d=b.name,e=b.state??"",f=e.toUpperCase(),g=`${d}
6
- ${c}`,aZ.has(f)||a_.test(d)||a0.test(g)?"blocked_external":a$.has(f)||a1.test(g)?"flaky_or_ambiguous":a2.test(g)?"healable_in_branch":"unknown");return{checkName:b.name,category:h,fingerprint:`${a}:${h}:${b.name.trim().toLowerCase().replace(/\s+/g," ")}`}})(d.provider,a,w)),y=(0,a6.VJ)(v.id,f),z=y.at(-1),A=(0,a6.ZM)({failures:x,attempts:y.map(a=>({fingerprint:a.fingerprint})),lastAttemptAt:z?1e3*z.createdAt:null,now:l(),activeRuns:(0,a6.Bz)(f),budgets:k});switch(A.action){case"block":return(0,a6.rh)(v.id,"blocked",f),await c.gh.commentIssue(r.issueNumber,`CI auto-heal: ${A.reason} — not auto-fixable. Handing over to a human.`),(0,C.dk)(r.id,"needs_human",{errorMessage:`auto-heal blocked: ${A.reason}`.slice(0,500)},f);case"escalate":return(0,a6.rh)(v.id,"escalated",f),bh(r,b,`CI auto-heal: ${A.reason}.`,c,f);case"wait_slot":if(l()>=n)return(0,a6.rh)(v.id,"escalated",f),bi(r,b,m,c,f,"auto-heal waited for a free healing slot");await g(i);continue;case"cooldown":if(l()>=n)return(0,a6.rh)(v.id,"escalated",f),bi(r,b,m,c,f,"auto-heal waited out its cooldown");await g(Math.min(A.waitMs,i));continue;case"repair":{let a=r.sessionId;if(!a)return(0,a6.rh)(v.id,"escalated",f),bh(r,b,"CI failed but no session id to resume.",c,f);let d=(0,a6.Z7)(v.id,A.target,u,f);(0,a6.Yv)(v.id,"awaiting_slot",f),(0,a6.Yv)(v.id,"repairing",f);let g=null;try{r=(0,C.dk)(r.id,"ci_failed",{prNumber:b},f),r=(0,C.dk)(r.id,"retrying",{ciRetryCount:r.ciRetryCount+1},f);let e=function(a){let{kind:b,evidence:c}=a4(a.log,a.maxLines);return[`CI check "${a.checkName}" is failing on this PR.`,a5[b],"Fix only this failure, then commit and push. Failure evidence:\n",c].join("\n")}({checkName:A.target.checkName,log:w,maxLines:k.maxEvidenceLines}),h=await c.resumeSession(r,a,e),i=bc(r,b,h,f);if(i){if((0,a6.kb)(d.id,f),(0,a6.rh)(v.id,i.done?"escalated":"superseded",f),r=i.job,i.done)return r;continue}(g=ba(h))||((0,ao._x)(r.agent,f),(0,a6.Yv)(v.id,"awaiting_ci",f),r=(0,C.dk)(r.id,"ci_running",{},f))}catch(a){throw(0,a6.rh)(v.id,"escalated",f),a}if(g)return(0,a6.Az)(d.id,{status:"rejected",afterSha:null},f),(0,a6.rh)(v.id,"escalated",f),bh(r,b,`CI auto-heal: ${g}.`,c,f);e={attemptId:d.id,sessionId:v.id,beforeSha:u,beforeFailing:t.length,kind:"repair"};continue}case"rerun":{if(!await c.gh.reRunFailedChecks?.(b))return(0,a6.rh)(v.id,"escalated",f),bh(r,b,`CI auto-heal: flaky check "${A.target.checkName}" requires a manual re-run (this forge cannot re-run failed checks).`,c,f);let a=(0,a6.Z7)(v.id,A.target,u,f);(0,a6.Yv)(v.id,"awaiting_slot",f),(0,a6.Yv)(v.id,"awaiting_ci",f),(0,C.yM)(r.id,"status",{reason:"auto-heal re-ran flaky check",checkName:A.target.checkName,prNumber:b},f),e={attemptId:a.id,sessionId:v.id,beforeSha:u,beforeFailing:t.length,kind:"rerun"};continue}}}return(0,C.ax)(r.id,f)??r}function bl(a,b){if(a.length<=b)return a;let c=a.length-b;return`${a.slice(0,b)}
7
- …[truncated ${c} chars]`}let bm=au.Ik({ordinal:au.ai().int().nonnegative(),status:au.k5(["done","pending","deferred"]),reason:au.Yj().default("")}),bn=au.Ik({summary:au.Yj().default(""),verdicts:au.YO(bm).default([])}),bo=["blocker","major","minor","nit","praise"],bp=au.Ik({severity:au.k5(bo),title:au.Yj().default(""),body:au.Yj().default(""),path:au.Yj().optional(),line:au.ai().int().nonnegative().optional(),suggestion:au.Yj().optional()}),bq=au.Ik({summary:au.Yj().default(""),recommendation:au.k5(["approve","request_changes","comment"]),findings:au.YO(bp).default([]),issueCoverage:au.Ik({met:au.YO(au.Yj()).default([]),missing:au.YO(au.Yj()).default([])}).default({met:[],missing:[]})});function br(a){return`<!-- drydock:pr-audit:${a} -->`}let bs={blocker:"⛔",major:"\uD83D\uDD34",minor:"\uD83D\uDFE1",nit:"\uD83D\uDD35",praise:"\uD83C\uDF89"},bt={approve:"✅ approve",request_changes:"\uD83D\uDED1 request changes",comment:"\uD83D\uDCAC comment"};function bu(a){return[br(a.jobId),"",`### 🔍 Drydock PR audit (${a.agent}/${a.model}, ${a.language})`,""]}var bv=c(58543);async function bw(a,b,c,d){if(a.listIssueComments&&a.updateIssueComment)try{let e=(await a.listIssueComments(b)).find(a=>a.body.includes(c));if(e)return await a.updateIssueComment(b,e.id,d),"updated"}catch(a){(0,r.v)(`[pr-audit] comment upsert degraded to a fresh post on #${b}`,a)}return await a.commentIssue(b,d),"created"}async function bx(a,b){try{return await a()}catch(a){return(0,r.v)("[pr-audit] best-effort read failed, using fallback",a),b}}async function by(a){var b;let c,d,e,f,i,{job:j,prNumber:k,repo:l,forge:m,db:n}=a,o=(e=(d=(0,g.TU)(l.agent)?l.agent:g.kz)===l.agent,f=(0,g.TU)(l.prAuditAgent)?l.prAuditAgent:d,i=l.prAuditModel??(e&&f===d?l.defaultModel:(0,bv.VJ)(f)),{agent:f,model:i,language:l.prAuditLanguage||"en"}),p={jobId:j.id,agent:o.agent,model:o.model,language:o.language};try{let d;if((0,A.mt)(n).paused)return(0,C.yM)(j.id,"pr_audit_skipped",{reason:"paused"},n),null;(0,C.yM)(j.id,"pr_audit_started",{...p,prNumber:k},n);let e=await bx(()=>m.prDiff(k),"");if(!e.trim())return(0,C.yM)(j.id,"pr_audit_failed",{reason:"empty diff",prNumber:k},n),null;let[f,i]=await Promise.all([bx(()=>m.prChecks(k),[]),bx(()=>m.viewIssue(j.issueNumber),null)]),q=aO(l.id,j.issueNumber,n),r={issueNumber:j.issueNumber,issueTitle:i?.title??`Issue #${j.issueNumber}`,issueBody:i?.body??"",subtasks:q.map(a=>({ordinal:a.ordinal,title:a.title})),prNumber:k,branch:j.branch,diff:e,checks:f.map(a=>({name:a.name,state:a.state})),language:o.language},s=a.generate;if(!s){let d;c=await (0,as.mkdtemp)((0,ac.join)((0,at.tmpdir)(),"drydock-pr-audit-"));let e=(0,g.X$)(o.agent);d=(b={provider:e,command:(0,B.m)(e,n),model:o.model,cwd:c,repoId:l.id,db:n,runner:a.runner}).timeoutMs??36e4,s=async a=>{let c,e,f,g;try{var i,j;let g,h,k;({text:c,exitCode:e,stderr:f}=await ay({provider:b.provider,command:b.command,model:b.model,cwd:b.cwd,prompt:(g=bl(a.issueBody.trim(),6e3),h=bl(a.diff.trim(),48e3),k=function(a){let b=a.trim();if(!b)return"English";try{return new Intl.DisplayNames(["en"],{type:"language"}).of(b)??b}catch{return b}}(a.language),["You are performing a READ-ONLY pull request audit. Do NOT edit files, run\ncommands, or make any changes. Review the full diff like a senior code\nreviewer (in the spirit of Bugbot/CodeRabbit) across these dimensions:\n\n1. Correctness — logic bugs, race conditions, error handling gaps\n2. Security — injection, authz, secrets, unsafe defaults (no CVE speculation)\n3. Tests — missing coverage for changed behavior\n4. API / compatibility — breaking changes, migration needs\n5. Maintainability — complexity, naming, duplication\n6. Issue fit — does the diff actually address the linked issue and subtasks\n",`## Issue #${a.issueNumber}: ${a.issueTitle}`,"",g,"\n## Subtasks\n",0===(i=a.subtasks).length?"This issue has no tracked subtasks; judge the issue as a whole.":i.map(a=>`- [ordinal ${a.ordinal}] ${a.title}`).join("\n"),"",`## Pull request #${a.prNumber}${a.branch?` (branch ${a.branch})`:""}`,"\n## CI results\n",0===(j=a.checks).length?"No CI results available.":j.map(a=>`- ${a.name}: ${a.state}`).join("\n"),"\n## Diff\n\n```diff",h,'```\n\n## Response format\n\nRespond with ONLY a JSON object (no prose outside it) of the shape:\n\n{"summary": "<one or two sentence overall assessment>",\n "recommendation": "approve"|"request_changes"|"comment",\n "findings": [{"severity": "blocker"|"major"|"minor"|"nit"|"praise",\n "title": "<short title>", "body": "<explanation>",\n "path": "<file path, optional>", "line": <number, optional>,\n "suggestion": "<suggested fix, optional>"}],\n "issueCoverage": {"met": ["<criterion>"], "missing": ["<criterion>"]}}\n\nReport only findings you are confident about; an empty findings list is a\nvalid answer for a clean diff. This review is advisory: do not gate, merge,\nor approve anything yourself.\n\nWrite all human-readable text (summary, titles, bodies, suggestions,',`coverage entries) in ${k}.`].join("\n")),repoId:b.repoId,type:"pr_audit",timeoutMs:d,runner:b.runner,db:b.db}))}catch{return null}if(0!==e){let a=b.provider.classifyFailure?.({exitCode:e,stderr:f,resultText:c});if(a&&aY.includes(a.kind)){let c=b.db??(0,h.Lf)();if((0,ao.$q)(b.provider.id,c))throw(0,ao.H_)(a,c),new ao.vu(a)}return null}let k=c.match(/\{[\s\S]*\}/);if(!k)return null;try{g=JSON.parse(k[0])}catch{return null}let l=bq.safeParse(g);return l.success?l.data:null}}try{d=await s(r)}catch(a){if(a instanceof ao.vu)return(0,C.yM)(j.id,"pr_audit_failed",{reason:"provider limit",kind:a.info.kind,agent:a.info.agent},n),null;throw a}let t=br(j.id);if(!d){let a,b=((a=bu(p)).push("The audit run failed: the agent returned no parseable review (timeout, non-zero exit, or invalid JSON).",""),a.push("Job state is unchanged; re-run the audit from the job page to retry."),a.join("\n"));return await bw(m,j.issueNumber,t,(0,Q.f)(b)),(0,C.yM)(j.id,"pr_audit_failed",{reason:"unparseable output",prNumber:k},n),null}let u=(0,Q.f)(function(a,b){let c=bu(b);c.push(`**Recommendation:** ${bt[a.recommendation]}`,""),a.summary.trim()&&c.push(a.summary.trim(),"");let d=new Map(bo.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=[`- ${bs[a.severity]} **[${a.severity}] ${a.title}**${b}`];return a.body.trim()&&c.push(` ${a.body.trim().replace(/\n/g,"\n ")}`),a.suggestion?.trim()&&c.push(` Suggested fix: ${a.suggestion.trim().replace(/\n/g,"\n ")}`),c.join("\n")}(a));let a=e.length-30;a>0&&c.push("",`_…and ${a} more finding${1===a?"":"s"} omitted._`),c.push("")}let{met:f,missing:g}=a.issueCoverage;if(f.length>0||g.length>0){for(let a of(c.push("#### Issue coverage",""),f))c.push(`- [x] ${a}`);for(let a of g)c.push(`- [ ] ${a}`);c.push("")}return b.truncated&&(c.push("_Note: the diff and/or issue body was truncated to fit the audit context;_"),c.push("_this is a partial review of an oversized PR._","")),c.push("---"),c.push("_This audit is advisory only; it never merges, blocks, or edits anything._"),c.join("\n")}(d,{...p,truncated:r.diff.trim().length>48e3||r.issueBody.trim().length>6e3}));return await bw(m,j.issueNumber,t,u),l.prAuditPostOnPr&&m.commentPr&&await bx(()=>m.commentPr?.(k,u)??Promise.resolve(),void 0),(0,C.yM)(j.id,"pr_audit_completed",{recommendation:d.recommendation,findings:d.findings.length,blockers:d.findings.filter(a=>"blocker"===a.severity).length,prNumber:k},n),d}catch(a){return(0,r.v)(`[pr-audit] audit pass failed for ${l.name}#${j.issueNumber}`,a),(0,C.yM)(j.id,"pr_audit_failed",{reason:a instanceof Error?a.message.slice(0,300):String(a)},n),null}finally{if(c)try{await (0,as.rm)(c,{recursive:!0,force:!0})}catch{}}}let bz=(0,ac.join)(".drydock","PR.md");function bA(a){let b=function(a){let b;try{b=(0,_.readFileSync)((0,ac.join)(a,bz),"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)}
8
- … (truncated)`:f}}(a);return(0,_.rmSync)((0,ac.join)(a,bz),{force:!0}),b}var bB=c(52484);async function bC(a,b,c,d=(0,h.Lf)(),e={}){for(let f of c)try{let c=await b.viewIssue(f.number),g=await aQ(a,{number:c.number,title:c.title,body:c.body},d,{generate:e.generate});if(!g.skipped&&g.subtasks.length>=2){let a=aN(g.subtasks.map(a=>({title:a.title,status:a.status})));await b.commentIssue(c.number,`Drydock decomposed this issue into subtasks and will work them in order:
9
-
10
- ${a}`)}}catch(b){if(b instanceof ao.vu)throw b;(0,r.v)(`[subtasks] decomposition failed for ${a.name}#${f.number}`,b)}}function bD(a,b,c=(0,h.Lf)()){for(let d of aO(a,b,c))"pending"===d.status&&aP(d.id,"in_progress",c)}function bE(a,b,c=(0,h.Lf)()){for(let d of aO(a,b,c))"in_progress"===d.status&&(aP(d.id,"deferred",c),aP(d.id,"pending",c))}async function bF(a){let b,{job:c,prNumber:d,repo:e,forge:f,db:g,provider:i,command:j,model:k}=a;try{let m=await f.prDiff(d);if(!m.trim())return null;let n=await f.viewIssue(c.issueNumber),o=aO(e.id,c.issueNumber,g),p={issueNumber:c.issueNumber,issueTitle:n.title,issueBody:n.body,subtasks:o.map(a=>({ordinal:a.ordinal,title:a.title})),diff:m},q=a.generate;if(!q){var l;let c;b=await (0,as.mkdtemp)((0,ac.join)((0,at.tmpdir)(),"drydock-verify-")),c=(l={provider:i,command:j,model:k,cwd:b,repoId:e.id,db:g,runner:a.runner}).timeoutMs??18e4,q=async a=>{try{var b;let d,e,f,{text:g,exitCode:h}=await ay({provider:l.provider,command:l.command,model:l.model,cwd:l.cwd,prompt:(d=bl(a.issueBody.trim(),6e3),e=bl(a.diff.trim(),24e3),["You are performing a READ-ONLY verification pass. Do NOT edit files, run\ncommands, or make any changes. Given a GitHub issue, its subtasks, and the\ndiff of a pull request that claims to address it, judge whether the diff\nactually satisfies each subtask (or, if there are none, the issue overall).\n",`## Issue #${a.issueNumber}: ${a.issueTitle}`,"",d,"\n## Subtasks\n",0===(b=a.subtasks).length?"This issue has no tracked subtasks; verify the issue as a whole.":b.map(a=>`- [ordinal ${a.ordinal}] ${a.title}`).join("\n"),"\n## Pull request diff\n\n```diff",e,'```\n\n## Response format\n\nRespond with ONLY a JSON object (no prose, no code fences) of the shape:\n\n{"summary": "<one or two sentence overall assessment>",\n "verdicts": [{"ordinal": <number>, "status": "done"|"pending"|"deferred",\n "reason": "<short justification>"}]}\n\nInclude one verdict per subtask ordinal above. If there are no subtasks,\nreturn a single verdict with ordinal 0 for the issue as a whole. Use\n"done" when the diff fully satisfies it, "pending" when it is unmet or only\npartially addressed, and "deferred" when it is intentionally out of scope.'].join("\n")),repoId:l.repoId,type:"verify",timeoutMs:c,runner:l.runner,db:l.db});if(0!==h)return null;let i=g.match(/\{[\s\S]*\}/);if(!i)return null;try{f=JSON.parse(i[0])}catch{return null}let j=bn.safeParse(f);return j.success?j.data:null}catch{return null}}}let r=await q(p);if(!r)return(0,C.yM)(c.id,"verification",{ok:!1},g),null;let s=function(a,b,c,d=(0,h.Lf)()){let e=new Map(aO(a,b,d).map(a=>[a.ordinal,a])),f=0,g=0,i=[];for(let a of c.verdicts){let b=e.get(a.ordinal);if(b)if("done"===a.status)!function(a,b){let c=a.status;if("done"!==c&&"skipped"!==c)try{if("in_progress"===c)return void aP(a.id,"done",b);aP(a.id,"in_progress",b),aP(a.id,"done",b)}catch{}}(b,d),f+=1;else if("deferred"===a.status)try{aP(b.id,"deferred",d),g+=1}catch{}else i.push(b.title)}return{done:f,deferred:g,pendingTitles:i}}(e.id,c.issueNumber,r,g);return await f.commentIssue(c.issueNumber,(0,Q.f)(function(a,b){let c=[`🔎 Drydock post-PR verification`,""];if(a.summary.trim()&&c.push(a.summary.trim(),""),b.pendingTitles.length>0)for(let a of(c.push("Subtasks still pending:"),b.pendingTitles))c.push(`- ${a}`);else c.push("All tracked subtasks appear satisfied by the diff.");return c.join("\n")}(r,s))),(0,C.yM)(c.id,"verification",{ok:!0,summary:r.summary,done:s.done,deferred:s.deferred,pending:s.pendingTitles.length},g),r}catch(a){return(0,r.v)(`[verify] verification pass failed for ${e.name}#${c.issueNumber}`,a),null}finally{if(b)try{await (0,as.rm)(b,{recursive:!0,force:!0})}catch{}}}function bG(a,b){return a.length>b?`${a.slice(0,b)}
11
- … (truncated)`:a}function bH(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 bI(a,b={}){let c=b.db??(0,h.Lf)(),d=b.notify??((a,b)=>(0,aq.JD)(a,b,c)),e=await bJ(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 bJ(a,b,c){let d,e=b.db??(0,h.Lf)(),l=(0,C.ax)(a,e);if(!l)throw Error(`job ${a} not found`);let m=(0,i.L8)(l.repoId,e);if(!m)throw Error(`repo ${l.repoId} not found`);"queued"===l.status&&(0,C.dk)(l.id,"working",{},e);let n=b.worktrees??new Z.ND,o=(0,k.Ie)(m),p=(0,g.X$)(l.agent),s=(0,B.m)(p,e),t=(0,A.mt)(e),u=m.maxJobMinutes??t.maxJobMinutes,v=6e4*u,w=(m.maxCiWaitMinutes??t.maxCiWaitMinutes)*6e4,x=m.maxJobCostUsd??t.maxJobCostUsd,y={mode:"docker"===m.sandbox?"docker":"none",imageOverride:aT(m.sandboxImage),defaultImage:t.sandboxDefaultImage,allowNetwork:!!m.sandboxAllowNetwork,cpus:aT(m.sandboxCpus),memory:aT(m.sandboxMemory)},z="docker"===y.mode&&"http"!==p.kind,E=b.prepareSandbox??aX,F={command:s},G=b.runSession??((a,b,c)=>(0,$.V)(a,b,c,{db:e,provider:p,command:F.command,runner:F.runner,timeoutMs:v,costCapUsd:x})),H=b.createPr??(a=>o.createPr(a)),I=b.runPlan??((a,b,c)=>ay({provider:p,command:s,model:a.model??m.defaultModel,cwd:c,prompt:b,repoId:m.id,type:"plan",timeoutMs:v,db:e}).then(a=>({text:a.text,exitCode:a.exitCode}))),J=b.commentIssue??((a,b)=>o.commentIssue(a,b)),K=b.viewIssue??(a=>o.viewIssue(a).then(a=>({title:a.title,body:a.body}))),L=b.consumePrMetadata??bA,M=b.resumeLimitSession??((a,b,c)=>{if(!a.sessionId)throw Error(`job ${a.id} has no session id to resume after a limit`);return(0,$.n)(a,a.sessionId,"",c,{db:e,provider:p,command:F.command,runner:F.runner,timeoutMs:v,costCapUsd:x,resumePrompt:b,resumeModel:a.model??m.defaultModel,resumeMaxTurns:a.maxTurns})}),N=async a=>{let b=a.latched?a.resetAt??Math.floor(Date.now()/1e3)+60:(0,ao.H_)(a,e).latch.blockedUntil;(0,C.yM)(l.id,"status",{reason:`${a.agent}_${a.kind}`,blockedUntil:b,snippet:a.rawSnippet},e),m.autoDecompose&&bE(m.id,l.issueNumber,e);let c=(0,C.dk)(l.id,"waiting_limit",{errorMessage:bH(a.kind,a.agent),availableAt:b,limitKind:a.kind},e);try{let c=new Date(1e3*b).toISOString().slice(0,16).replace("T"," ");await J(l.issueNumber,`⏳ Drydock paused this job: ${bH(a.kind,a.agent)}. It will retry automatically (next attempt around ${c} UTC).`)}catch(a){(0,r.v)(`[run-job] limit-park comment failed for job ${l.id}`,a)}return c},O=b.runBabysitter??((a,b)=>{var c;return bj(a,b,{gh:o,db:e,ciWaitMs:w,mergeGateMs:6e4*m.mergeGateMinutes,mergeWithoutChecks:m.mergeWithoutChecks,sleep:(0,bB.rN)({repoId:m.id,prNumber:b,onNudge:a=>(0,C.yM)(l.id,"status",{reason:`woken by webhook: ${a}`,prNumber:b},e)}),resumeSession:(c={worktrees:n,worktree:()=>d,settled:()=>{let a=(0,C.ax)(l.id,e);return!a||"aborted"===a.status||"interrupted"===a.status},resume:(a,b,c,d)=>(0,$.n)(a,b,c,d,{db:e,provider:p,command:F.command,runner:F.runner,timeoutMs:v,costCapUsd:x})},async(a,b,d)=>{let e=c.worktree();if(!e)throw Error(`job ${a.id} has no live worktree to resume in`);let f=await c.resume(a,b,d,e.path),g={exitCode:f.exitCode,timedOut:f.timedOut,costExceeded:f.costExceeded,spawnError:f.spawnError,limit:f.limit};if(ba(g))return g;if(c.settled?.())return{...g,settledExternally:!0};try{await c.worktrees.commitAndPush(e,`Fix CI for #${a.issueNumber}`)}catch(a){if(a instanceof Z.RD)return{...g,noChanges:!0};throw a}return g}),autoHeal:m.autoHealCi?{headSha:a=>o.prHeadSha(a),provider:m.platform}:void 0})}),P=b.verify??((a,b)=>bF({job:a,prNumber:b,repo:m,forge:o,db:e,provider:p,command:s,model:a.model??m.defaultModel}).then(()=>void 0)),Q=b.audit??((a,b)=>by({job:a,prNumber:b,repo:m,forge:o,db:e}).then(()=>void 0));try{let a;if(d=await n.prepare(m,l.id,l.issueNumber),(0,C.yM)(l.id,"worktree",{path:d.path,branch:d.branch},e),z){let a=await E({config:y,worktreePath:d.path,jobId:l.id,agent:p.id,inContainerCommand:p.defaultCommand,preferredRuntime:t.containerRuntime});if(!a.ok)return m.autoDecompose&&bE(m.id,l.issueNumber,e),(0,C.dk)(l.id,"needs_human",{errorMessage:`Sandbox preflight failed: ${a.reason}`.slice(0,500)},e);F.runner=a.session.runner,F.command=a.session.command,(0,C.yM)(l.id,"status",{reason:`sandboxed execution (${y.mode})`},e)}let b=!!l.limitKind&&!!l.sessionId&&p.supportsResume;l.limitKind&&e.update(j.jobs).set({limitKind:null}).where((0,f.eq)(j.jobs.id,l.id)).run();let g=async a=>{var b,c;let d,g=(0,aS.XZ)(m.id,aR._.main,e);e.update(j.jobs).set({implementPromptVersion:g.version}).where((0,f.eq)(j.jobs.id,l.id)).run();let h={title:"",body:""};try{h=await K(l.issueNumber)}catch(a){(0,r.v)(`[run-job] failed to fetch issue #${l.issueNumber} for job ${l.id}`,a)}let i=bG(h.title,500),k=bG(h.body,2e4),n=(0,aS.Xm)(g.content,{ISSUE_NUM:l.issueNumber,BRANCH:a.branch,REPO_NAME:m.name,ISSUE_TITLE:i,ISSUE_BODY:k});if(m.autoDecompose){let a=aO(m.id,l.issueNumber,e);a.length>0&&(n+=(b=a.map(a=>({title:a.title,status:a.status})),0===b.length?"":["\n\n## Subtasks\n\nThis issue has been broken into the ordered subtasks below. Work through them\nin order, top to bottom, as part of this single change:\n",aN(b)].join("\n")),bD(m.id,l.issueNumber,e))}if(n+=(c=m.agentInstructions,(d=c?.trim())?["\n\n## Repository-specific agent instructions\n\nThe operator of this repository has provided the following instructions. Follow them\nin addition to the task above, unless they conflict with explicit safety constraints:\n",d.slice(0,4e3)].join("\n"):""),m.planFirst){let b=(0,aS.Xm)((0,aS.yx)(m.id,aR._.plan,e),{ISSUE_NUM:l.issueNumber,BRANCH:a.branch,REPO_NAME:m.name,ISSUE_TITLE:i,ISSUE_BODY:k});try{let c=await I((0,C.ax)(l.id,e),b,a.path),d=c.text.trim();if(0===c.exitCode&&d.length>0){let a;(0,C.yM)(l.id,"status",{reason:"plan stage complete"},e),n+=(a=d.trim())?["\n\n## Implementation plan\nFollow this plan unless the code contradicts it:\n",a.length>1e4?`${a.slice(0,1e4)}
12
- … (truncated)`:a].join("\n"):"";try{await J(l.issueNumber,`**Implementation plan** (job ${l.id}):
13
-
14
- ${d}`)}catch(a){(0,r.v)(`[run-job] plan comment failed for job ${l.id}`,a)}}else(0,C.yM)(l.id,"status",{reason:"plan stage failed, continuing without a plan",exitCode:c.exitCode},e)}catch(a){(0,r.v)(`[run-job] plan stage failed for job ${l.id}`,a),(0,C.yM)(l.id,"status",{reason:"plan stage failed, continuing without a plan"},e)}}return G((0,C.ax)(l.id,e),n,a.path)};if(b){(0,C.yM)(l.id,"status",{reason:"resuming session after provider limit",sessionId:l.sessionId},e),m.autoDecompose&&bD(m.id,l.issueNumber,e);let b=(0,aS.Xm)((0,aS.yx)(m.id,aR._.limitResume,e),{ISSUE_NUM:l.issueNumber,BRANCH:d.branch,REPO_NAME:m.name});a=await M((0,C.ax)(l.id,e),b,d.path)}else a=await g(d);let i=(0,C.ax)(l.id,e);if("aborted"===i.status||"interrupted"===i.status)return m.autoDecompose&&bE(m.id,l.issueNumber,e),i;if(a.timedOut)return m.autoDecompose&&bE(m.id,l.issueNumber,e),(0,C.dk)(l.id,"needs_human",{errorMessage:`${p.label} timed out after ${u} minutes`},e);if(a.costExceeded)return m.autoDecompose&&bE(m.id,l.issueNumber,e),(0,C.dk)(l.id,"needs_human",{errorMessage:`per-job cost limit of $${x} reached`},e);if(a.spawnError)return m.autoDecompose&&bE(m.id,l.issueNumber,e),(0,C.dk)(l.id,"needs_human",{errorMessage:`failed to start ${s}: ${a.spawnError.message}`},e);if(a.limit){let b=a.limit;if("auth"===b.kind||"billing"===b.kind){m.autoDecompose&&bE(m.id,l.issueNumber,e);let a="auth"===b.kind?"authentication":"billing";return(0,C.dk)(l.id,"needs_human",{errorMessage:`${p.label} ${a} error: ${b.rawSnippet}`.slice(0,500)},e)}if(!(0,ao.$q)(p.id,e))return m.autoDecompose&&bE(m.id,l.issueNumber,e),(0,C.dk)(l.id,"needs_human",{errorMessage:`${bH(b.kind,b.agent)} (auto-wait is disabled)`},e);return await N(b)}if(0!==a.exitCode)return m.autoDecompose&&bE(m.id,l.issueNumber,e),(0,C.dk)(l.id,"needs_human",{errorMessage:`${p.label} exited non-zero`},e);if((0,ao._x)(p.id,e),m.adrGating){let a=(0,aG.Pe)("pending_review",e,m.id);if(a.length>0)return m.autoDecompose&&bE(m.id,l.issueNumber,e),(0,C.dk)(l.id,"needs_human",{errorMessage:`Blocked by ${a.length} pending ADR review(s).`},e)}let k=L(d.path),o=k?.title??`Fix #${l.issueNumber}`;try{await n.commitAndPush(d,o)}catch(a){if(a instanceof Z.RD)return m.autoDecompose&&bE(m.id,l.issueNumber,e),(0,C.dk)(l.id,"needs_human",{errorMessage:"Agent produced no changes"},e);throw a}let v=k?.title??(0,q.ts)(m.id,e).find(a=>a.number===l.issueNumber)?.title??`Fix #${l.issueNumber}`,w=`Closes #${l.issueNumber}`,A=k?.body?`${k.body}
15
-
16
- ${w}`:w,B=await H({head:d.branch,base:m.defaultBranch,title:v,body:A});if((0,C.dk)(l.id,"ci_running",{branch:d.branch,prNumber:B},e),await c("pr_opened",`🔀 PR opened: ${m.id}#${l.issueNumber} (PR #${B}).`),m.verifyPr)try{await P((0,C.ax)(l.id,e),B)}catch(b){let a=b instanceof Error?b.message:String(b);(0,C.yM)(l.id,"error",{message:`verification pass failed: ${a}`},e)}if(m.autoPrAudit)try{await Q((0,C.ax)(l.id,e),B)}catch(b){let a=b instanceof Error?b.message:String(b);(0,C.yM)(l.id,"error",{message:`pr audit failed: ${a}`},e)}let D=await O((0,C.ax)(l.id,e),B);return m.autoDecompose&&("merged"===D.status?!function(a,b,c=(0,h.Lf)()){for(let d of aO(a,b,c))!function(a,b){let c=a.status;if("done"!==c&&"skipped"!==c){if("in_progress"===c)return aP(a.id,"done",b);aP(a.id,"in_progress",b),aP(a.id,"done",b)}}(d,c)}(m.id,l.issueNumber,e):bE(m.id,l.issueNumber,e)),D}catch(c){let a=c instanceof Error?c.message:String(c);(0,C.yM)(l.id,"error",{message:a},e);let b=(0,C.ax)(l.id,e);if(["working","ci_running","ci_failed","retrying"].includes(b.status)){m.autoDecompose&&bE(m.id,l.issueNumber,e);try{return(0,C.dk)(l.id,"needs_human",{errorMessage:a.slice(0,500)},e)}catch(a){if(!(a instanceof D.xh))throw a;return(0,r.v)(`[run-job] job ${l.id} settled concurrently during failure handling`,a),(0,C.ax)(l.id,e)}}return b}finally{if(d)try{await n.remove(d,m.path)}catch(a){(0,r.v)(`[run-job] worktree cleanup failed for job ${l.id}`,a)}}}var bK=c(35494),bL=c(96356);let bM={active:!1},bN={active:!1},bO={claude:{active:!1},codex:{active:!1},openrouter:{active:!1}};function bP(a,b,c,d,e={}){var f;let i=(0,g.X$)(a.agent),j=(f={provider:i,command:(0,B.m)(i,d),model:a.defaultModel,cwd:a.path,db:d,runner:e.runner},async a=>{let{text:b,exitCode:c,stderr:d}=await ay({provider:f.provider,command:f.command,model:f.model,cwd:f.cwd,prompt:["Break the following GitHub issue into an ordered list of independent subtasks\nthat can each be implemented and reviewed on their own.\n",`Title: ${a.title}`,"",a.body.trim(),"\nRespond with ONLY a JSON array of short subtask title strings, in the order\nthey should be done. If the issue is a single coherent task that should not\nbe split, respond with an empty array []."].join("\n"),repoId:f.repoId,type:"decompose",runner:f.runner,db:f.db});if(0!==c){let a=f.provider.classifyFailure?.({exitCode:c,stderr:d,resultText:b});if(a&&aY.includes(a.kind)){let b=f.db??(0,h.Lf)();if((0,ao.$q)(f.provider.id,b))throw(0,ao.H_)(a,b),new ao.vu(a)}return[]}let e=b.match(/\[[\s\S]*\]/);if(!e)return[];try{let a=JSON.parse(e[0]);if(!Array.isArray(a))return[];return a.filter(a=>"string"==typeof a).map(a=>a.trim()).filter(Boolean)}catch{return[]}});return bC(a,b,c,d,{generate:j})}let bQ=["needs_human","aborted"];async function bR(a,b,c,d,e,g){var h,i;let k=e.some(a=>b.readyLabels.includes(a)),l=e.some(a=>b.blockingLabels.includes(a));return!!k&&!l&&!!(0,s.i)(b,d.authorAssociation)&&(h=a.id,i=d.number,!(g.select().from(j.jobs).where((0,f.Uo)((0,f.eq)(j.jobs.repoId,h),(0,f.eq)(j.jobs.issueNumber,i),(0,f.RV)(j.jobs.status,[...bQ]))).all().length>=b.maxAttempts)||(e.includes(a.needsHumanLabel)||(await c.ensureLabel(a.needsHumanLabel,{color:"d73a4a",description:"Drydock gave up after repeated failures; needs a human"}),await c.addLabels(d.number,[a.needsHumanLabel])),!1))}let bS=D.RH.filter(a=>!D.kl.includes(a)),bT=["working","ci_running","ci_failed","retrying","waiting_limit"];async function bU(a,b,c,d){let e="codex"===a?"Codex capacity":"openrouter"===a?"OpenRouter window":"Claude quota";for(let f of(0,C.i1)(["waiting_limit"],d).filter(b=>b.agent===a)){try{(0,C.dk)(f.id,"queued",{availableAt:null,errorMessage:null},d),(0,C.yM)(f.id,"status",{reason:`${a}_limit_cleared`},d)}catch(a){(0,r.v)(`[driver] limit requeue failed for job ${f.id}`,a);continue}let g=b.find(a=>a.id===f.repoId);if(g)try{let a=c.forgeFor?.(g)??(0,k.Ie)(g);await a.commentIssue(f.issueNumber,`▶️ ${e} available again — resuming job #${f.id}.`)}catch(a){(0,r.v)(`[driver] limit-resume comment failed for job ${f.id}`,a)}}}async function bV(a={}){let b=a.db??(0,h.Lf)(),c=a.runJob??bI,e=(0,i.uP)(b),n=a.triage??w,o=a.decompose??bP;for(let c of e)try{await (0,l.v)("low",async()=>{let d=a.forgeFor?.(c)??(0,k.Ie)(c),e=a.fetchIssues??(async(a,b)=>(await d.refreshRateLimit?.(),d.listAllIssues())),g=await e(c.path,c.queueLabel);(0,q.VK)(c.id,g,b);let h=b.select().from(j.issues).where((0,f.eq)(j.issues.repoId,c.id)).all(),i=new Map(h.map(a=>[a.number,a])),l=(0,s.A)(c);if(l.autoTriageEnabled&&await n(c,d,g,b),l.autoDecompose&&!(0,ao.nc)(c.agent,b)){let a=g.filter(a=>{let b=a.labels.map(a=>a.name);return b.includes(c.queueLabel)||b.some(a=>l.readyLabels.includes(a))});if(a.length>0)try{await o(c,d,a,b)}catch(a){(0,r.v)(`[driver] decomposition sweep failed for ${c.name}`,a)}}for(let a of g){var m,t;let e=a.labels.map(a=>a.name),g=e.includes(c.queueLabel),h=!!l.autoProcessEnabled&&await bR(c,l,d,a,e,b);if(!g&&!h)continue;let k=p({number:a.number,title:a.title,labels:e});if("approved"!==k.decision||function(a,b,c){return(0,C.i1)([...bS],a).some(a=>a.repoId===b&&a.issueNumber===c)}(b,c.id,a.number))continue;h&&a.author&&l.priorityAuthors.includes(a.author)&&(m=c.id,t=a.number,b.update(j.issues).set({priority:-1}).where((0,f.Uo)((0,f.eq)(j.issues.repoId,m),(0,f.eq)(j.issues.number,t))).run());let n=i.get(a.number);(0,ap.Ix)({repoId:c.id,issueNumber:a.number,model:n?.modelOverride??c.defaultModel,agent:n?.agentOverride??c.agent},b)}})}catch(a){a instanceof m.OE?console.debug(`[driver] ${c.name} sweep yielded: ${a.message}`):(0,r.v)(`[driver] issue sync failed for ${c.name}`,a)}(0,x.PH)("cost_limit"===(0,A.Jf)(b).reason,bM,b),(0,x.mW)((0,L.DB)(b),bN,b);try{if(function(a=Date.now()){return!X&&(void 0===d||a-d>=9e5)}()){let c=a.credentialProbe??(a=>Y({db:a}));Promise.resolve(c(b)).catch(a=>(0,r.v)("[driver] credential probe round failed",a))}}catch(a){(0,r.v)("[driver] credential watchdog sweep failed",a)}(0,ap.pp)({expiredBefore:Math.floor(Date.now()/1e3)},b);try{let a=(0,bL.reconcileExternalAborts)(b);a.length>0&&console.log(`[driver] aborted ${a.length} externally-aborted job(s)`)}catch(a){(0,r.v)("[driver] external-abort reconcile failed",a)}let t=[];for(let c of g.FD){let d=(0,ao.nc)(c,b);if((0,x.RQ)(c,!!d,bO[c],b),d){t.push(c);continue}try{await bU(c,e,a,b)}catch(a){(0,r.v)(`[driver] ${c} limit-parked job resume sweep failed`,a)}}let u=t.length>0?t:void 0,v=(0,A.mt)(b).maxParallelJobs,z=(0,ap._$)();for(;!(0,bK.jQ)()&&(0,A.Jf)(b).allowed&&(0,bK.JY)()<v;){let a=e.filter(a=>(0,A.DA)(a.id,b).allowed).filter(a=>!(a.sequential&&function(a,b){return(0,C.i1)([...bT],a).some(a=>a.repoId===b)}(b,a.id))).map(a=>a.id);if(0===a.length)break;let d=(0,ap.Ym)({repoIds:a,worker:z,leaseMs:ap.sV,excludeAgents:u},b);if(!d)break;let f=d.id,g=d.leaseToken;(0,bK.Pn)(f);let h=setInterval(()=>{try{(0,ap.jQ)(f,g,{},b)}catch(a){(0,r.v)(`[driver] heartbeat failed for job ${f}`,a)}},ap.m);h.unref?.(),c(f).catch(a=>(0,r.v)(`[driver] job ${f} failed`,a)).finally(()=>{clearInterval(h),(0,ap.wL)(f,g,b),(0,bK.i2)(f)})}let B=a.reviewFeedback??(a=>(0,aF.L4)({db:a}));try{await (0,l.v)("low",()=>B(b))}catch(a){(0,r.v)("[driver] review-feedback sweep failed",a)}let D=a.deploymentHealing??(a=>ak({db:a}));try{await (0,l.v)("low",()=>D(b))}catch(a){(0,r.v)("[driver] deployment-healing sweep failed",a)}let E=a.releaseManagement??(a=>aC({db:a}));try{await (0,l.v)("low",()=>E(b))}catch(a){(0,r.v)("[driver] release-management sweep failed",a)}let F=a.branchJanitor??(a=>K({db:a}));try{await (0,l.v)("low",()=>F(b))}catch(a){(0,r.v)("[driver] branch-janitor sweep failed",a)}try{let c=(0,A.mt)(b);if(c.openrouterEnabled&&(0,y.Mf)({db:b,refreshHours:c.openrouterCatalogRefreshHours})){let c=a.openrouterCatalogSync??bX;Promise.resolve(c(b)).catch(a=>(0,r.v)("[driver] openrouter catalog sync failed",a))}}catch(a){(0,r.v)("[driver] openrouter catalog sweep failed",a)}}let bW=!1;async function bX(a){if(!bW){bW=!0;try{let b=(0,A.mt)(a);await (0,y.yd)({db:a,apiKey:(0,z.t)(b)||void 0})}finally{bW=!1}}}let bY=!1,bZ=!1,b$=null,b_=null;function b0(){return{running:bY,lastTickAt:b$,intervalMs:b_}}function b1(a={}){if(bY)return;bY=!0;let b=a.tick??(()=>bV()),c=a.intervalMs??1e3*(0,A.mt)().pollIntervalSec;b_=c;let d=async()=>{if(bY){if(!bZ){bZ=!0,b$=Date.now();try{await b()}catch(a){(0,r.v)("[driver] tick failed",a)}finally{bZ=!1}}bY&&(e=setTimeout(d,c))}};d()}function b2(){bY=!1,e&&clearTimeout(e),e=void 0}},48036:(a,b,c)=>{c.d(b,{Pe:()=>g,dj:()=>h});var d=c(97496),e=c(2025),f=c(64537);function g(a,b=(0,e.Lf)(),c){let h=[];return a&&h.push((0,d.eq)(f.adrs.status,a)),void 0!==c&&h.push((0,d.eq)(f.adrs.repoId,c)),(h.length?b.select().from(f.adrs).where((0,d.Uo)(...h)).all():b.select().from(f.adrs).all()).sort((a,b)=>b.createdAt-a.createdAt)}function h(a=(0,e.Lf)()){return a.select().from(f.adrs).where((0,d.eq)(f.adrs.status,"pending_review")).all().length}},48733:(a,b,c)=>{let d;c.d(b,{k:()=>k});var e=c(97496),f=c(14694),g=c(2025),h=c(64537),i=c(14543);class j{constructor(a=(0,g.Lf)()){this.db=a,this.subs=new Map}subscribe(a,b){let c=this.subs.get(a);c||(c=new Set,this.subs.set(a,c)),c.add(b)}unsubscribe(a,b){let c=this.subs.get(a);c&&(c.delete(b),0===c.size&&this.subs.delete(a))}subscriberCount(a){return this.subs.get(a)?.size??0}publish(a,b){let c,d=(0,i.f)(JSON.stringify(b.payload??{}));try{c=JSON.parse(d)}catch{c={error:"unparseable event payload"}}let e=this.db.insert(h.jobEvents).values({jobId:a,type:b.type,payload:d}).returning().get(),f=this.subs.get(a);if(f)for(let b of[...f])try{b.send({id:e.id,type:e.type,payload:c})}catch{this.unsubscribe(a,b)}return e}replay(a,b=200,c){return void 0!==c?this.db.select().from(h.jobEvents).where((0,e.Uo)((0,e.eq)(h.jobEvents.jobId,a),(0,e.gt)(h.jobEvents.id,c))).orderBy(h.jobEvents.ts,h.jobEvents.id).limit(b).all():this.db.select().from(h.jobEvents).where((0,e.eq)(h.jobEvents.jobId,a)).orderBy((0,f.i)(h.jobEvents.ts),(0,f.i)(h.jobEvents.id)).limit(b).all().reverse()}}function k(){return d||(d=new j),d}},52479:(a,b,c)=>{c.d(b,{QJ:()=>h,RH:()=>d,kl:()=>f,xh:()=>g});let d=["queued","working","ci_running","ci_failed","retrying","waiting_limit","merged","needs_human","aborted","interrupted"],e={queued:["working","aborted","interrupted"],working:["ci_running","waiting_limit","needs_human","aborted","interrupted"],ci_running:["ci_failed","merged","needs_human","aborted","interrupted"],ci_failed:["retrying","needs_human","aborted","interrupted"],retrying:["ci_running","needs_human","aborted","interrupted"],waiting_limit:["queued","needs_human","aborted","interrupted"],merged:[],needs_human:["queued","aborted"],aborted:[],interrupted:["queued","aborted"]},f=["merged","aborted"];class g extends Error{constructor(a,b){super(`invalid job transition: ${a} -> ${b}`)}}function h(a,b){if(!e[a].includes(b))throw new g(a,b)}},52484:(a,b,c)=>{c.d(b,{dC:()=>f,rN:()=>e});let d=new Set;function e(a){return b=>new Promise(c=>{let e={repoId:a.repoId,prNumber:a.prNumber,wake:b=>{d.delete(e),clearTimeout(f);try{a.onNudge?.(b)}catch{}c()}},f=setTimeout(()=>{d.delete(e),c()},b);f.unref?.(),d.add(e)})}function f(a,b,c){let e=[...d].filter(c=>c.repoId===a&&(0===b.length||b.includes(c.prNumber)));for(let a of e)a.wake(c);return e.length}},52819:(a,b,c)=>{c.d(b,{CZ:()=>j,PH:()=>f,RQ:()=>h,mW:()=>i});var d=c(2025),e=c(76373);async function f(a,b,c=(0,d.Lf)(),g=e.QD){a?b.active||(b.active=!0,await (0,e.JD)("cost_limit","\uD83D\uDCB8 Daily cost limit reached — new jobs are paused until the budget resets.",c,g)):b.active=!1}let g={claude:{event:"claude_limit",blocked:"⏳ Claude usage limit reached — Claude jobs are parked until the quota resets.",cleared:"▶️ Claude quota available again — parked jobs are resuming."},codex:{event:"codex_limit",blocked:"⏳ Codex usage limit reached — Codex jobs are parked until the quota resets.",cleared:"▶️ Codex capacity available again — parked jobs are resuming."},openrouter:{event:"openrouter_limit",blocked:"⏳ OpenRouter limit reached — OpenRouter jobs are parked until the window resets.",cleared:"▶️ OpenRouter available again — parked jobs are resuming."}};async function h(a,b,c,f=(0,d.Lf)(),i=e.QD){let j=g[a];if(b){if(c.active)return;c.active=!0,await (0,e.JD)(j.event,j.blocked,f,i)}else{if(!c.active)return;c.active=!1,await (0,e.JD)(j.event,j.cleared,f,i)}}async function i(a,b,c=(0,d.Lf)(),f=e.QD){if(a.length>0){if(b.active)return;b.active=!0;let d=a.map(a=>`${a.label}: ${a.message}`).join("; ");await (0,e.JD)("auth_expired",`🔑 Credential check failed — new jobs are paused until auth is restored. ${d}`,c,f)}else{if(!b.active)return;b.active=!1,await (0,e.JD)("auth_expired","\uD83D\uDD11 Credentials restored — the queue is resuming.",c,f)}}async function j(a=(0,d.Lf)(),b=e.QD){await (0,e.JD)("automation_paused","\uD83C\uDF19 Automation draining — finishing in-flight jobs, then shutting down.",a,b)}},59144:(a,b,c)=>{c.d(b,{MQ:()=>h,kf:()=>e,mU:()=>f,rr:()=>g});let d=/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/;function e(a){let b=d.exec(a.trim());return b?{major:Number(b[1]),minor:Number(b[2]),patch:Number(b[3]),prerelease:b[4]??null}:null}function f(a,b){var c,d;let f=e(a),g=e(b);if(!f||!g)throw Error(`cannot compare versions: "${a}" vs "${b}"`);return f.major!==g.major?f.major-g.major:f.minor!==g.minor?f.minor-g.minor:f.patch!==g.patch?f.patch-g.patch:(c=f.prerelease,c===(d=g.prerelease)?0:null===c?1:null===d||c<d?-1:1)}function g(a,b){let c=e(a);if(!c)throw Error(`cannot bump unparseable version: "${a}"`);let{major:d,minor:f,patch:g}=c;return"major"===b?`${d+1}.0.0`:"minor"===b?`${d}.${f+1}.0`:`${d}.${f}.${g+1}`}function h(a,b){return!!e(a)&&!!e(b)&&f(a,b)>0}},62907:(a,b,c)=>{c.d(b,{L4:()=>F,Yr:()=>H});var d=c(20203),e=c(2025),f=c(54304),g=c(24978),h=c(1065),i=c(64417),j=c(75818),k=c(16544),l=c(41947),m=c(27630),n=c(2412),o=c(7611),p=c(97496),q=c(64537);let r=["resolved","failed","rejected","flagged"],s={pending:["queued","rejected","flagged"],queued:["in_progress","flagged","rejected"],in_progress:["resolved","failed","flagged","queued"],resolved:[],failed:[],rejected:[],flagged:[]};class t extends Error{constructor(a,b){super(`invalid feedback transition: ${a} -> ${b}`)}}function u(a){return a.toLowerCase().replace(/\[bot\]$/,"")}let v=/\b(out of scope|follow[- ]?up|separate pr|different pr|unrelated|won'?t fix|nevermind|never mind|ignore this)\b/i,w=/\b(please|change|rename|fix|add|remove|delete|use|extract|refactor|move|replace|guard|handle|update|simplify|inline|should be|consider|nit)\b/i;function x(a,b,c={},d=(0,e.Lf)()){let f=d.select().from(q.reviewFeedbackItems).where((0,p.eq)(q.reviewFeedbackItems.id,a)).get();if(!f)throw Error(`review feedback item ${a} not found`);var g=f.status;if(!s[g].includes(b))throw new t(g,b);return d.update(q.reviewFeedbackItems).set({status:b,detail:c.detail??f.detail,attempts:"in_progress"===b?f.attempts+1:f.attempts,updatedAt:Math.floor(Date.now()/1e3)}).where((0,p.eq)(q.reviewFeedbackItems.id,a)).returning().get()}let y={maxItemsPerSweep:3,maxAttemptsPerItem:2};async function z(a,b,c){var d;let e=(d=b.id,`<!-- drydock:review-feedback:${d} -->`),f=`${c}
17
-
18
- ${e}`,g=b.comments.find(a=>a.body.includes(e));g?await a.updateReviewComment(g.id,f):await a.replyToReviewThread(b.id,f)}async function A(a,b,c){let d=c.db??(0,e.Lf)(),f=c.budgets??y,g={processed:0,resolved:0,flagged:0,rejected:0,failed:0,skipped:0},h=await c.forge.listReviewThreads(b),i=0;for(let k of h){var j;if(k.isResolved){g.skipped++;continue}let h=k.comments[0];if(!h||!function(a,b,c={}){let d=a.toLowerCase();if(c.isBot||d.endsWith("[bot]")){let c=u(a);return!b.ignoredBots.some(a=>u(a)===c)&&b.trustedBots.some(a=>u(a)===c)}return!b.ignoredBots.some(a=>a.toLowerCase()===d)&&b.trustedReviewers.some(a=>a.toLowerCase()===d)}(h.author,c.gate,{isBot:h.authorIsBot})){g.skipped++;continue}let l=function(a){let b=a.trim();return v.test(b)?"out_of_scope":w.test(b)?"actionable":b.includes("?")?"question":"actionable"}(h.body),m=function(a,b=(0,e.Lf)()){let c=function(a,b,c=(0,e.Lf)()){return c.select().from(q.reviewFeedbackItems).where((0,p.Uo)((0,p.eq)(q.reviewFeedbackItems.jobId,a),(0,p.eq)(q.reviewFeedbackItems.threadId,b))).get()}(a.jobId,a.threadId,b);return c||b.insert(q.reviewFeedbackItems).values({jobId:a.jobId,prNumber:a.prNumber,threadId:a.threadId,reviewer:a.reviewer,classification:a.classification}).returning().get()}({jobId:a,prNumber:b,threadId:k.id,reviewer:h.author,classification:l},d);if(j=m.status,r.includes(j)){g.skipped++;continue}if("in_progress"===m.status&&(m=x(m.id,"queued",{},d)),"pending"===m.status)try{await c.forge.reactToReviewComment(h.id,"EYES")}catch{}if("pending"===m.status){if("question"===l){m=x(m.id,"flagged",{},d),await z(c.forge,k,"Drydock: this looks like a question rather than a change request, so it's flagged for a human reviewer."),g.flagged++,g.processed++;continue}if("out_of_scope"===l){m=x(m.id,"rejected",{},d),await z(c.forge,k,"Drydock: treating this as out of scope for this PR — please open a follow-up issue if it should be tracked."),await c.forge.resolveReviewThread(k.id),g.rejected++,g.processed++;continue}m=x(m.id,"queued",{},d)}if("queued"===m.status){let a;if(i>=f.maxItemsPerSweep)continue;if(m.attempts>=f.maxAttemptsPerItem){m=x(m.id,"flagged",{},d),await z(c.forge,k,`Drydock: could not resolve this after ${m.attempts} attempt(s); flagging for a human.`),g.flagged++,g.processed++;continue}i++,m=x(m.id,"in_progress",{},d),c.includeProgressReplies&&await z(c.forge,k,"Drydock: working on this now…");try{a=await c.applyFeedback(m,k)}catch(b){a={ok:!1,detail:b instanceof Error?b.message:String(b)}}g.processed++,a.ok?(x(m.id,"resolved",{detail:a.detail},d),await z(c.forge,k,"Drydock: applied this change and pushed a commit. ✅"),await c.forge.resolveReviewThread(k.id),g.resolved++):m.attempts>=f.maxAttemptsPerItem?(x(m.id,"failed",{detail:a.detail},d),await z(c.forge,k,`Drydock: could not apply this automatically (${a.detail??"no change produced"}); flagging for a human.`),g.failed++):x(m.id,"queued",{detail:a.detail},d)}}return g}let B=new Set(["ci_running","ci_failed","retrying","needs_human"]);function C(a){return"function"==typeof a.listReviewThreads&&"function"==typeof a.replyToReviewThread&&"function"==typeof a.updateReviewComment&&"function"==typeof a.resolveReviewThread&&"function"==typeof a.reactToReviewComment}async function D(a={}){let b=a.db??(0,e.Lf)(),c=a.processJob??I;for(let d of(0,f.uP)(b))if((null==a.repoId||d.id===a.repoId)&&(0,k.A)(d).autoReviewFeedback)try{let e=a.forgeFor?.(d)??(0,g.Ie)(d);if(!C(e))continue;for(let a of(0,n.N6)(d.id,b).filter(a=>null!=a.prNumber&&B.has(a.status)&&!(0,o.nc)(a.agent,b)))try{await c(d,a,e)}catch(b){(0,j.v)(`[review-feedback] job ${a.id} failed for ${d.name}`,b)}}catch(a){(0,j.v)(`[review-feedback] sweep failed for ${d.name}`,a)}}let E=Promise.resolve();function F(a={}){let b=E.then(()=>D(a));return E=b.catch(()=>{}),b}let G=new Map;function H(a,b=2e3){let c=G.get(a);c&&clearTimeout(c);let d=setTimeout(()=>{G.delete(a),(0,i.v)("low",()=>F({repoId:a})).catch(b=>{(0,j.v)(`[webhook] review-feedback sweep failed for repo ${a}`,b)})},b);d.unref?.(),G.set(a,d)}async function I(a,b,c){var f;if(!C(c)||null==b.prNumber)return;let g=(0,e.Lf)(),i=(0,k.A)(a),n=(0,d.X$)(b.agent),o=(0,l.m)(n,g),p=(f={repo:a,job:b,worktrees:new h.ND,runSession:(a,b,c)=>(0,m.V)(a,b,c,{db:g,provider:n,command:o,sideSession:!0}).then(a=>({exitCode:a.exitCode}))},async(a,b)=>{if(!f.job.branch)return{ok:!1,detail:"job has no branch"};let c=await f.worktrees.prepareForBranch(f.repo,f.job.branch,`${f.job.id}-${b.id}`);try{let a,d,e=await f.runSession(f.job,(a=b.comments[0],d=b.path?`${b.path}${b.line?`:${b.line}`:""}`:"this PR",[`A reviewer left this comment on ${d} of the current pull request:`,"",(a?.body??"").trim(),"\nMake only the change this comment asks for. Do not address anything else.\nWhen done, ensure the working tree builds and tests pass, then stop — the\ncommit and push are handled for you."].join("\n")),c.path);if(0!==e.exitCode)return{ok:!1,detail:"agent exited non-zero"};try{await f.worktrees.commitAndPush(c,`Address review feedback on ${b.path??"PR"}`)}catch{return{ok:!1,detail:"no change produced"}}return{ok:!0}}finally{try{await f.worktrees.remove(c,f.repo.path)}catch(a){(0,j.v)(`[review-feedback] worktree cleanup failed for job ${f.job.id}`,a)}}});await A(b.id,b.prNumber,{forge:c,db:g,gate:{trustedReviewers:i.trustedReviewers,trustedBots:i.trustedBots,ignoredBots:i.ignoredBots},includeProgressReplies:i.includeProgressReplies,applyFeedback:p})}},64417:(a,b,c)=>{c.d(b,{u:()=>f,v:()=>e});let d=new(c(16698)).AsyncLocalStorage;function e(a,b){return d.run(a,b)}function f(){return d.getStore()??"high"}},70793:(a,b,c)=>{c.d(b,{T9:()=>h,U9:()=>g});var d=c(26557),e=c(27544),f=c(84232);function g(a){return(0,f.ll)`count(${a||f.ll.raw("*")})`.mapWith(Number)}function h(a){return(0,f.ll)`max(${a})`.mapWith((0,e.is)(a,d.V)?a:String)}},76373:(a,b,c)=>{c.d(b,{JD:()=>h,QD:()=>j});var d=c(2025),e=c(14543),f=c(74644);let g=[{id:"telegram",isConfigured:a=>!!(a.telegramBotToken&&a.telegramChatId),send:(a,b,c)=>c.postJson(`https://api.telegram.org/bot${b.telegramBotToken}/sendMessage`,{chat_id:b.telegramChatId,text:a})},{id:"slack",isConfigured:a=>!!a.slackWebhookUrl,send:(a,b,c)=>c.postJson(b.slackWebhookUrl,{text:a})},{id:"email",isConfigured:a=>!!(a.smtpHost&&a.emailFrom&&a.emailTo),send:(a,b,c)=>c.sendMail({to:b.emailTo,from:b.emailFrom,subject:"Drydock notification",text:a},{host:b.smtpHost,port:b.smtpPort,user:b.smtpUser,pass:b.smtpPass})}];async function h(a,b,c=(0,d.Lf)(),e=j){var k,l;let m=(0,f.mt)(c);if(!m.notifyEvents.includes(a))return;let n=g.filter(a=>a.isConfigured(m));0!==n.length&&await (k=i(n,b,m,e),l=()=>console.error(`[notify] dispatch for ${a} exceeded 5000ms; continuing in background`),new Promise(a=>{let b=setTimeout(()=>{l(),a()},5e3);b.unref?.();let c=()=>{clearTimeout(b),a()};k.then(c,c)}))}async function i(a,b,c,d){for(let f of a)try{await f.send(b,c,d)}catch(a){console.error(`[notify] ${f.id} delivery failed`,(0,e.f)(String(a)))}}let j={postJson:async(a,b)=>{let c=await fetch(a,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(b),signal:AbortSignal.timeout(1e4)});if(!c.ok)throw Error(`HTTP ${c.status}`)},sendMail:async(a,b)=>{let d=(await c.e(689).then(c.t.bind(c,93689,19))).createTransport({host:b.host,port:b.port,secure:465===b.port,auth:b.user?{user:b.user,pass:b.pass}:void 0,connectionTimeout:1e4,greetingTimeout:1e4,socketTimeout:1e4});await d.sendMail(a)}}},77597:(a,b,c)=>{c.d(b,{Sx:()=>g,g8:()=>f,l9:()=>e});var d=c(31421);let e="win32"!==process.platform;function f(a,b){let c=a.pid;if(void 0!==c&&e)try{process.kill(-c,b);return}catch{}a.kill(b)}let g=(a,b,c,g)=>new Promise((h,i)=>{let j=(0,d.spawn)(a,b,{cwd:c,env:process.env,detached:e}),k="",l="",m=!1,n=g?.timeoutMs??3e5,o=setTimeout(()=>{m=!0,f(j,"SIGKILL")},n);o.unref?.(),j.stdout.on("data",a=>{k+=a.toString()}),j.stderr.on("data",a=>{l+=a.toString()}),j.on("error",a=>{clearTimeout(o),i(a)}),j.on("close",(b,c)=>{(clearTimeout(o),m)?i(Error(`\`${a}\` timed out after ${n}ms`)):h({stdout:k,stderr:l,exitCode:b??+!!c})})})},87105:(a,b,c)=>{c.d(b,{D:()=>d});let d=async(a,b)=>{let c=await fetch(a,{method:b?.method??"GET",headers:b?.headers,body:b?.body,redirect:"manual"}),d=await c.text(),e={};return c.headers.forEach((a,b)=>{e[b.toLowerCase()]=a}),{status:c.status,ok:c.ok,body:d,headers:e}}},87232:(a,b,c)=>{c.d(b,{Q8:()=>f,cg:()=>d,jL:()=>e});let d="github";function e(a){return"github"===a||"gitlab"===a}class f extends Error{}},87524:(a,b,c)=>{c.d(b,{M:()=>j,t:()=>g});var d=c(14543);function e(a,b){return 401===a||403===a?"auth":402===a?"billing":429===a?/\b(?:free|daily|quota)\b/i.test(b)?"usage_limit":"rate_limit":408===a||a>=500&&a<600?"overloaded":void 0}function f(a){return(0,d.f)(a.trim()).slice(0,300)}function g(a){let b=e(a.status,a.body);if(!b)return;let c={agent:"openrouter",kind:b,rawSnippet:f(`OpenRouter HTTP ${a.status}: ${a.body}`)};return void 0!==a.retryAfterMs&&("rate_limit"===b||"overloaded"===b)&&(c.retryAfterMs=a.retryAfterMs),c}let h=/openrouter http (\d{3})/i,i=/retry[- ]?after[:\s]+(\d+)\s*(?:s\b|sec|second)/i;function j(a){if(0===a.exitCode&&!a.resultIsError)return;let b=[a.resultText,a.stderr].filter(Boolean).join("\n"),c=b.match(h)?.[1];if(!c)return;let d=e(Number(c),b);if(!d)return;let g={agent:"openrouter",kind:d,rawSnippet:f(b.split("\n").find(a=>h.test(a))??b)},j=b.match(i)?.[1];return j&&("rate_limit"===d||"overloaded"===d)&&(g.retryAfterMs=1e3*Number(j)),g}},91549:(a,b,c)=>{c.d(b,{OE:()=>g,bR:()=>h,og:()=>f});let d=["core","graphql","search"];class e{constructor(a={}){this.resources=new Map,this.now=a.now??Date.now}observe(a,b){this.state(a).snapshot=b}note429(a,b){let c=void 0!==b?1e3*b:this.now()+6e4;this.state(a).limitedUntilMs=c}decide(a,b){let c=this.resources.get(a);if(!c)return{allowed:!0};let d=this.now();if(void 0!==c.limitedUntilMs&&d<c.limitedUntilMs)return{allowed:!1,reason:"limited",retryAfterMs:c.limitedUntilMs-d};let e=c.snapshot;if(!e||e.limit<=0)return{allowed:!0};let f=1e3*e.reset;if(d>=f)return{allowed:!0};let g=e.remaining/e.limit,h=f-d;return g<.05?{allowed:!1,reason:"floor",retryAfterMs:h}:"low"===b&&g<.3?{allowed:!1,reason:"reserve",retryAfterMs:h}:{allowed:!0}}snapshot(a){return this.resources.get(a)?.snapshot}state(a){let b=this.resources.get(a);return b||(b={},this.resources.set(a,b)),b}}let f=new e;class g extends Error{constructor(a,b,c){super(`github ${b} rate limit gated (${a}); retry in ~${Math.ceil(c/1e3)}s`),this.reason=a,this.resource=b,this.retryAfterMs=c,this.name="RateLimitError"}}function h(a){let b=Number(a["x-ratelimit-limit"]),c=Number(a["x-ratelimit-remaining"]),e=Number(a["x-ratelimit-reset"]);if(!Number.isFinite(b)||!Number.isFinite(c)||!Number.isFinite(e))return null;let f=a["x-ratelimit-resource"];return void 0===f?{resource:"core",snapshot:{remaining:c,limit:b,reset:e}}:d.includes(f)?{resource:f,snapshot:{remaining:c,limit:b,reset:e}}:null}},93612:(a,b,c)=>{c.d(b,{Sv:()=>f,lw:()=>e,x8:()=>k});var d=c(29980);async function e(a,b=fetch){let c=new AbortController,d=setTimeout(()=>c.abort(),1e4);d.unref?.();try{let d=await b("https://openrouter.ai/api/v1/key",{headers:{Authorization:`Bearer ${a}`},signal:c.signal});if(d.ok)return{ok:!0};let e=(await d.text().catch(()=>"")).slice(0,200);return{ok:!1,error:`OpenRouter HTTP ${d.status}: ${e}`}}catch(a){if(c.signal.aborted)return{ok:!1,error:"OpenRouter key probe timed out after 10000ms"};return{ok:!1,error:a instanceof Error?a.message:String(a)}}finally{clearTimeout(d)}}class f extends Error{constructor(a,b,c){super(`OpenRouter HTTP ${a}: ${b}`),this.status=a,this.body=b,this.retryAfterMs=c,this.name="OpenRouterHttpError"}}let g=d.Ik({index:d.ai(),id:d.Yj().optional(),function:d.Ik({name:d.Yj().optional(),arguments:d.Yj().optional()}).optional()}),h=d.Ik({choices:d.YO(d.Ik({delta:d.Ik({content:d.Yj().nullish(),tool_calls:d.YO(g).optional()}).passthrough().optional(),finish_reason:d.Yj().nullish()})).optional(),usage:d.Ik({prompt_tokens:d.ai().optional(),completion_tokens:d.ai().optional(),cost:d.ai().nullish()}).passthrough().nullish(),error:d.Ik({code:d.KC([d.ai(),d.Yj()]).nullish(),message:d.Yj().optional()}).passthrough().optional()});function i(a){return"assistant"===a.role&&a.toolCalls?.length?{role:"assistant",content:a.content||null,tool_calls:a.toolCalls.map(a=>({id:a.id,type:"function",function:{name:a.name,arguments:a.arguments}}))}:"tool"===a.role?{role:"tool",tool_call_id:a.toolCallId,content:a.content}:{role:a.role,content:a.content}}async function*j(a){let b=a.getReader(),c=new TextDecoder,d="";try{for(;;){let{done:a,value:e}=await b.read();if(a)break;let f=(d+=c.decode(e,{stream:!0})).indexOf("\n");for(;f>=0;)yield d.slice(0,f).replace(/\r$/,""),f=(d=d.slice(f+1)).indexOf("\n")}(d+=c.decode())&&(yield d)}finally{b.releaseLock()}}async function k(a){let b=a.fetchImpl??fetch,c={Authorization:`Bearer ${a.apiKey}`,"Content-Type":"application/json"};a.siteUrl&&(c["HTTP-Referer"]=a.siteUrl),a.appName&&(c["X-Title"]=a.appName);let d={model:a.model,messages:a.messages.map(i),stream:!0,usage:{include:!0}};a.tools?.length&&(d.tools=a.tools.map(a=>({type:"function",function:{name:a.name,description:a.description,parameters:a.parameters}}))),void 0!==a.maxTokens&&(d.max_tokens=a.maxTokens);let e=await b("https://openrouter.ai/api/v1/chat/completions",{method:"POST",headers:c,body:JSON.stringify(d),signal:a.signal});if(!e.ok){let a=(await e.text().catch(()=>"")).slice(0,2e3);throw new f(e.status,a,function(a){if(!a)return;if(/^\d+$/.test(a))return 1e3*Number(a);let b=Date.parse(a);if(Number.isNaN(b))return;let c=b-Date.now();return c>0?c:void 0}(e.headers.get("retry-after")))}if(!e.body)throw new f(e.status,"response had no body");let g="",k=null,l=!1,m={promptTokens:0,completionTokens:0,costUsd:0},n=new Map;for await(let b of j(e.body)){let c;if(!b||b.startsWith(":")||!b.startsWith("data:"))continue;let d=b.slice(5).trim();if("[DONE]"===d){l=!0;break}try{c=h.parse(JSON.parse(d))}catch{continue}if(c.error)throw new f("number"==typeof c.error.code?c.error.code:500,c.error.message??"stream error");let e=c.choices?.[0];for(let b of(e?.delta?.content&&(g+=e.delta.content,a.onTextDelta?.(e.delta.content)),e?.delta?.tool_calls??[])){let a=n.get(b.index)??{id:"",name:"",argumentParts:[]};b.id&&(a.id=b.id),b.function?.name&&(a.name=b.function.name),b.function?.arguments&&a.argumentParts.push(b.function.arguments),n.set(b.index,a)}e?.finish_reason&&(k=e.finish_reason),c.usage&&(m.promptTokens=c.usage.prompt_tokens??m.promptTokens,m.completionTokens=c.usage.completion_tokens??m.completionTokens,m.costUsd=c.usage.cost??m.costUsd)}if(!l&&null===k)throw new f(502,"OpenRouter stream ended before completion");return{text:g,toolCalls:[...n.entries()].sort(([a],[b])=>a-b).map(([,a])=>({id:a.id,name:a.name,arguments:a.argumentParts.join("")})),finishReason:k,usage:m}}},94534:(a,b,c)=>{c.d(b,{g:()=>f});var d=c(31421),e=c(77597);let f=(a,b,c,f)=>{let g,h=(0,d.spawn)(a,b,{cwd:c,env:process.env,detached:e.l9});h.stdout?.setEncoding("utf8"),h.stderr?.setEncoding("utf8"),h.stdout?.on("data",a=>f.onStdout(a)),h.stderr?.on("data",a=>f.onStderr?.(a));let i=!1,j={done:new Promise(a=>{h.on("close",(b,c)=>{g&&clearTimeout(g),a(b??+!!c)}),h.on("error",b=>{j.spawnError=b,a(1)})}),abort:(a=5e3)=>{i||(i=!0,(0,e.g8)(h,"SIGTERM"),g=setTimeout(()=>(0,e.g8)(h,"SIGKILL"),a),g.unref?.())}};return j}},96356:(a,b,c)=>{c.r(b),c.d(b,{abortAllJobs:()=>F,abortJob:()=>D,clearAbort:()=>C,gracefulShutdown:()=>G,reconcileExternalAborts:()=>E,registerAbort:()=>B,startOrchestrator:()=>H});var d=c(97496),e=c(2025),f=c(84232),g=c(74644),h=c(64537),i=c(75818),j=c(52819),k=c(2412),l=c(9617);let m=["ci_running","ci_failed","retrying"];var n=c(47843),o=c(35494),p=c(73024),q=c(76760),r=c(54304),s=c(77597),t=c(1065),u=c(52479);let v=/^job-(\d+)$/,w=/^fb-(\d+)-/,x=/^dh-(\d+)-/;async function y(a={}){let b=a.db??(0,e.Lf)(),c=a.run??s.Sx,f=function(a){let b=a.select({id:h.jobs.id,status:h.jobs.status}).from(h.jobs).all(),c=new Set;for(let a of b)u.kl.includes(a.status)||c.add(a.id);return c}(b),g=0;for(let a of(0,r.uP)(b)){let e;await c("git",["-C",a.path,"worktree","prune"]).catch(()=>void 0);let j=(0,t._M)(a.name);try{e=(0,p.readdirSync)(j,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name)}catch{continue}for(let k of e){let e=v.exec(k)??w.exec(k)??x.exec(k);if(!e)continue;let l=Number(e[1]);if(f.has(l)||function(a,b){let c=b.select({status:h.jobs.status}).from(h.jobs).where((0,d.eq)(h.jobs.id,a)).get();return void 0!==c&&!u.kl.includes(c.status)}(l,b))continue;let m=(0,q.join)(j,k);await c("git",["-C",a.path,"worktree","remove","--force",m]).catch(()=>void 0);try{(0,p.rmSync)(m,{recursive:!0,force:!0}),g++}catch(a){(0,i.v)(`[worktree-reaper] failed to remove ${m}`,a)}}}return g}let z=!1,A=new Map;function B(a,b){A.set(a,b)}function C(a){A.delete(a)}function D(a,b=5e3){let c=A.get(a);return"function"==typeof c&&(c(b),A.delete(a),!0)}function E(a=(0,e.Lf)()){let b=[];for(let c of[...A.keys()])try{(0,k.ax)(c,a)?.status==="aborted"&&D(c)&&b.push(c)}catch(a){(0,i.v)(`[orchestrator] external-abort kill failed for job ${c}`,a)}return b}function F(a=5e3){let b=[...A.keys()];for(let b of A.values())b(a);return A.clear(),b}async function G(){(0,o.IZ)(!0),(0,n.py)(),await (0,j.CZ)().catch(a=>(0,i.v)("[orchestrator] drain notify failed",a)),F(5e3),await (0,o.$J)(8e3);try{let a=(0,e.Lf)();for(let b of a.select().from(h.jobs).where((0,d.RV)(h.jobs.status,["working","ci_running","ci_failed","retrying"])).all())try{(0,k.dk)(b.id,"interrupted",{},a)}catch(a){(0,i.v)(`[orchestrator] shutdown transition failed for job ${b.id}`,a)}}catch(a){(0,i.v)("[orchestrator] shutdown DB update failed",a)}(0,o._1)()}function H(){if(z)return;if(z=!0,!process.env.VITEST)if((0,o.DS)()){(0,o.f1)();try{let{requeued:a,interrupted:b}=function(a=(0,e.Lf)()){return{requeued:(0,l.pp)({},a),interrupted:function(a=(0,e.Lf)()){let b=a.select().from(h.jobs).where((0,d.RV)(h.jobs.status,m)).all();for(let c of b)a.update(h.jobs).set({status:"interrupted"}).where((0,d.eq)(h.jobs.id,c.id)).run(),(0,k.yM)(c.id,"status",{from:c.status,to:"interrupted",reason:"recovery"},a);return b.length}(a)}}();a>0&&console.log(`[orchestrator] requeued ${a} orphaned job(s)`),b>0&&console.log(`[orchestrator] recovered ${b} interrupted job(s)`)}catch(a){(0,i.v)("[orchestrator] recovery failed",a)}y().then(a=>{a>0&&console.log(`[orchestrator] reaped ${a} orphaned worktree(s)`)}).catch(a=>(0,i.v)("[orchestrator] worktree reap failed",a)).finally(()=>{let a,b;(0,n.tn)(),(a=()=>{try{let{jobEventsDeleted:a}=function(a=(0,e.Lf)(),b={}){let c=b.days??(0,g.mt)(a).retentionDays,i=b.vacuum??!0,j=Math.floor((b.now?.getTime()??Date.now())/1e3)-86400*c,k=a.select({id:h.jobs.id}).from(h.jobs).where((0,d.Uo)((0,d.Pe)(h.jobs.finishedAt),(0,d.lt)(h.jobs.finishedAt,j))),l=a.delete(h.jobEvents).where((0,d.RV)(h.jobEvents.jobId,k)).run().changes;return i&&a.run((0,f.ll)`VACUUM`),{jobEventsDeleted:l,vacuumed:i,cutoff:j}}((0,e.Lf)());a>0&&console.log(`[orchestrator] pruned ${a} job event(s)`)}catch(a){(0,i.v)("[orchestrator] prune sweep failed",a)}})(),b=setInterval(a,864e5),b.unref?.()})}else console.warn("[orchestrator] another instance holds the lock; driver loop not started");let a=async a=>{console.log(`[orchestrator] ${a} received, shutting down gracefully`),await G(),process.exit(0)};process.once("SIGINT",a),process.once("SIGTERM",a)}},98887:(a,b,c)=>{c.d(b,{KO:()=>o,gJ:()=>m});var d=c(29980);let e=d.Ik({input_tokens:d.ai().optional(),output_tokens:d.ai().optional(),cache_creation_input_tokens:d.ai().optional(),cache_read_input_tokens:d.ai().optional()}).passthrough(),f=d.Ik({type:d.eu("system"),subtype:d.Yj().optional(),session_id:d.Yj().optional(),model:d.Yj().optional()}),g=d.Ik({type:d.eu("assistant"),message:d.Ik({role:d.eu("assistant"),content:d.YO(d.g1(d.Yj(),d.L5())),usage:e.optional()})}),h=d.Ik({type:d.eu("user"),message:d.Ik({role:d.eu("user"),content:d.YO(d.g1(d.Yj(),d.L5()))})}),i=d.Ik({status:d.Yj().optional(),resetsAt:d.ai().optional(),rateLimitType:d.Yj().optional()}).passthrough(),j=d.Ik({type:d.eu("rate_limit_event"),rate_limit_info:i.optional(),session_id:d.Yj().optional()}),k=d.Ik({type:d.eu("result"),subtype:d.Yj().optional(),session_id:d.Yj().optional(),is_error:d.zM().optional(),result:d.Yj().optional(),total_cost_usd:d.ai().optional(),usage:e.optional()}),l=d.gM("type",[f,g,h,j,k]);function m(a){return a instanceof Error?a.message:String(a)}function n(a){let b=[];for(let c of a)"text"===c.type&&"string"==typeof c.text?b.push({kind:"text",text:c.text}):"tool_use"===c.type?b.push({kind:"tool_use",name:String(c.name??"unknown"),id:String(c.id??""),input:c.input}):"tool_result"===c.type&&b.push({kind:"tool_result",toolUseId:String(c.tool_use_id??""),isError:!!c.is_error});return b}class o{push(a){this.buffer+=a;let b=[],c=this.buffer.indexOf("\n");for(;-1!==c;){let a=this.buffer.slice(0,c);this.buffer=this.buffer.slice(c+1);let d=this.consume(a);d&&b.push(d),c=this.buffer.indexOf("\n")}return b}flush(){let a=this.buffer;this.buffer="";let b=this.consume(a);return b?[b]:[]}consume(a){let b;try{b=function(a){var b;let c,d=a.trim();if(!d)return null;let e=JSON.parse(d);return c={type:(b=l.parse(e)).type,chunks:[],inputTokens:0,outputTokens:0,cacheCreationInputTokens:0,cacheReadInputTokens:0,isError:!1,raw:b},"system"===b.type?(c.sessionId=b.session_id,c.model=b.model):"assistant"===b.type?(c.chunks=n(b.message.content),c.inputTokens=b.message.usage?.input_tokens??0,c.outputTokens=b.message.usage?.output_tokens??0,c.cacheCreationInputTokens=b.message.usage?.cache_creation_input_tokens??0,c.cacheReadInputTokens=b.message.usage?.cache_read_input_tokens??0):"user"===b.type?c.chunks=n(b.message.content):"rate_limit_event"===b.type?(c.sessionId=b.session_id,c.rateLimitInfo=b.rate_limit_info):(c.sessionId=b.session_id,c.resultText=b.result,c.costUsd=b.total_cost_usd,c.inputTokens=b.usage?.input_tokens??0,c.outputTokens=b.usage?.output_tokens??0,c.cacheCreationInputTokens=b.usage?.cache_creation_input_tokens??0,c.cacheReadInputTokens=b.usage?.cache_read_input_tokens??0,c.isError=b.is_error??!1),c}(a)}catch(b){return this.onParseError?.({line:a.trim(),message:m(b)}),null}return b?(b.sessionId&&(this.sessionId=b.sessionId),b.model&&(this.model=b.model),b.rateLimitInfo&&(this.rateLimit=b.rateLimitInfo),"result"===b.type?(b.inputTokens>0&&(this.totalInputTokens=b.inputTokens),b.outputTokens>0&&(this.totalOutputTokens=b.outputTokens),b.cacheCreationInputTokens>0&&(this.totalCacheCreationInputTokens=b.cacheCreationInputTokens),b.cacheReadInputTokens>0&&(this.totalCacheReadInputTokens=b.cacheReadInputTokens),void 0!==b.costUsd&&(this.costUsd=b.costUsd),void 0!==b.resultText&&(this.resultText=b.resultText),this.resultIsError=b.isError):(this.totalInputTokens+=b.inputTokens,this.totalOutputTokens+=b.outputTokens,this.totalCacheCreationInputTokens+=b.cacheCreationInputTokens,this.totalCacheReadInputTokens+=b.cacheReadInputTokens),b):null}constructor(){this.buffer="",this.totalInputTokens=0,this.totalOutputTokens=0,this.totalCacheCreationInputTokens=0,this.totalCacheReadInputTokens=0,this.costUsd=0,this.resultIsError=!1}}}};
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1298],{598:(e,t,r)=>{r.d(t,{y:()=>s});var n=r(515),i=r(8108),o=r(5832);function s({size:e=16,className:t}){return(0,n.jsx)(i.A,{width:e,height:e,className:(0,o.cn)("dd-spin",t),"aria-hidden":!0})}},1059:(e,t,r)=>{r.d(t,{d:()=>o});var n=r(515),i=r(5832);function o({checked:e,onChange:t,disabled:r,id:s,"aria-label":a}){return(0,n.jsx)("button",{type:"button",role:"switch",id:s,"aria-checked":e,"aria-label":a,disabled:r,onClick:()=>!r&&t?.(!e),className:(0,i.cn)("relative inline-flex h-[22px] w-[38px] shrink-0 items-center rounded-full transition-colors focus-ring",e?"bg-primary":"bg-input",r&&"pointer-events-none opacity-50"),children:(0,n.jsx)("span",{className:(0,i.cn)("inline-block h-4 w-4 transform rounded-full bg-white shadow-sm transition-transform",e?"translate-x-[18px]":"translate-x-[3px]")})})}},1837:(e,t,r)=>{r.d(t,{L6:()=>n,UB:()=>i,VJ:()=>s,tT:()=>o});let n=[{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"}],i="claude-opus-4-8";function o(e){return n.filter(t=>t.agent===e)}function s(e){return"openrouter"===e?"":o(e)[0]?.id??i}},2655:(e,t,r)=>{r.d(t,{A:()=>n});let n=(0,r(1330).A)("container",[["path",{d:"M22 7.7c0-.6-.4-1.2-.8-1.5l-6.3-3.9a1.72 1.72 0 0 0-1.7 0l-10.3 6c-.5.2-.9.8-.9 1.4v6.6c0 .5.4 1.2.8 1.5l6.3 3.9a1.72 1.72 0 0 0 1.7 0l10.3-6c.5-.3.9-1 .9-1.5Z",key:"1t2lqe"}],["path",{d:"M10 21.9V14L2.1 9.1",key:"o7czzq"}],["path",{d:"m10 14 11.9-6.9",key:"zm5e20"}],["path",{d:"M14 19.8v-8.1",key:"159ecu"}],["path",{d:"M18 17.5V9.4",key:"11uown"}]])},3798:(e,t,r)=>{r.d(t,{A:()=>n});let n=(0,r(1330).A)("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]])},4148:(e,t,r)=>{r.d(t,{S:()=>s});var n=r(515),i=r(4266),o=r(5832);function s({checked:e,onChange:t,disabled:r,id:a,className:u,"aria-label":l}){return(0,n.jsx)("button",{type:"button",role:"checkbox",id:a,"aria-checked":e,"aria-label":l,disabled:r,onClick:()=>!r&&t?.(!e),className:(0,o.cn)("flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-[5px] border transition-colors focus-ring",e?"border-primary bg-primary text-primary-foreground":"border-input bg-background hover:border-muted-foreground",r&&"pointer-events-none opacity-50",u),children:e&&(0,n.jsx)(i.A,{className:"h-[13px] w-[13px]",strokeWidth:3})})}},4266:(e,t,r)=>{r.d(t,{A:()=>n});let n=(0,r(1330).A)("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]])},4783:(e,t,r)=>{r.d(t,{F:()=>p,W:()=>h});var n=r(515),i=r(6512),o=r(8131),s=r(4877),a=r(5662),u=r(5529),l=r(9214),d=r(5832);let c={info:{cls:"border-primary/30 bg-primary/5 text-foreground",icon:i.A,ic:"text-primary"},success:{cls:"border-success-border bg-success-muted text-foreground",icon:o.A,ic:"text-success"},warning:{cls:"border-warning-border bg-warning-muted text-foreground",icon:s.A,ic:"text-warning"},destructive:{cls:"border-destructive/30 bg-destructive/5 text-foreground",icon:a.A,ic:"text-destructive"}};function p({tone:e="info",title:t,children:r,action:i,icon:o,className:s}){let a=c[e],u=o??a.icon;return(0,n.jsxs)("div",{className:(0,d.cn)("flex gap-3 rounded-xl border p-4",a.cls,s),role:"alert",children:[(0,n.jsx)(u,{className:(0,d.cn)("mt-0.5 h-[18px] w-[18px] shrink-0",a.ic)}),(0,n.jsxs)("div",{className:"min-w-0 flex-1",children:[t&&(0,n.jsx)("p",{className:"text-sm font-semibold",children:t}),r&&(0,n.jsx)("div",{className:"mt-0.5 text-pretty text-sm text-muted-foreground",children:r})]}),i&&(0,n.jsx)("div",{className:"shrink-0",children:i})]})}function h({title:e="Something went wrong",description:t,action:r,className:i}){return(0,n.jsx)(u.Zp,{className:(0,d.cn)("border-destructive/30",i),children:(0,n.jsx)(l.p,{icon:a.A,tone:"destructive",title:e,description:t,action:r})})}},7217:(e,t,r)=>{r.d(t,{D:()=>s});var n=r(515),i=r(5832);function o({htmlFor:e,className:t,children:r}){return(0,n.jsx)("label",{htmlFor:e,className:(0,i.cn)("text-sm font-medium text-foreground",t),children:r})}function s({label:e,hint:t,htmlFor:r,children:a,className:u}){return(0,n.jsxs)("div",{className:(0,i.cn)("flex flex-col gap-1.5",u),children:[e&&(0,n.jsx)(o,{htmlFor:r,children:e}),a,t&&(0,n.jsx)("p",{className:"text-xs leading-relaxed text-muted-foreground",children:t})]})}},7241:(e,t,r)=>{r.d(t,{a:()=>F});var n=r(515),i=r(8067);let o={"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}},s=Object.values(o).reduce((e,t)=>t.outputPerMTok>e.outputPerMTok?t:e,{inputPerMTok:0,outputPerMTok:0,cacheWritePerMTok:0,cacheReadPerMTok:0});var a=r(4502);let u=a.Ik({input_tokens:a.ai().optional(),output_tokens:a.ai().optional(),cache_creation_input_tokens:a.ai().optional(),cache_read_input_tokens:a.ai().optional()}).passthrough(),l=a.Ik({type:a.eu("system"),subtype:a.Yj().optional(),session_id:a.Yj().optional(),model:a.Yj().optional()}),d=a.Ik({type:a.eu("assistant"),message:a.Ik({role:a.eu("assistant"),content:a.YO(a.g1(a.Yj(),a.L5())),usage:u.optional()})}),c=a.Ik({type:a.eu("user"),message:a.Ik({role:a.eu("user"),content:a.YO(a.g1(a.Yj(),a.L5()))})}),p=a.Ik({status:a.Yj().optional(),resetsAt:a.ai().optional(),rateLimitType:a.Yj().optional()}).passthrough(),h=a.Ik({type:a.eu("rate_limit_event"),rate_limit_info:p.optional(),session_id:a.Yj().optional()}),m=a.Ik({type:a.eu("result"),subtype:a.Yj().optional(),session_id:a.Yj().optional(),is_error:a.zM().optional(),result:a.Yj().optional(),total_cost_usd:a.ai().optional(),usage:u.optional()}),k=a.gM("type",[l,d,c,h,m]);function f(e){return e instanceof Error?e.message:String(e)}function g(e){let t=[];for(let r of e)"text"===r.type&&"string"==typeof r.text?t.push({kind:"text",text:r.text}):"tool_use"===r.type?t.push({kind:"tool_use",name:String(r.name??"unknown"),id:String(r.id??""),input:r.input}):"tool_result"===r.type&&t.push({kind:"tool_result",toolUseId:String(r.tool_use_id??""),isError:!!r.is_error});return t}class b{push(e){this.buffer+=e;let t=[],r=this.buffer.indexOf("\n");for(;-1!==r;){let e=this.buffer.slice(0,r);this.buffer=this.buffer.slice(r+1);let n=this.consume(e);n&&t.push(n),r=this.buffer.indexOf("\n")}return t}flush(){let e=this.buffer;this.buffer="";let t=this.consume(e);return t?[t]:[]}consume(e){let t;try{t=function(e){var t;let r,n=e.trim();if(!n)return null;let i=JSON.parse(n);return r={type:(t=k.parse(i)).type,chunks:[],inputTokens:0,outputTokens:0,cacheCreationInputTokens:0,cacheReadInputTokens:0,isError:!1,raw:t},"system"===t.type?(r.sessionId=t.session_id,r.model=t.model):"assistant"===t.type?(r.chunks=g(t.message.content),r.inputTokens=t.message.usage?.input_tokens??0,r.outputTokens=t.message.usage?.output_tokens??0,r.cacheCreationInputTokens=t.message.usage?.cache_creation_input_tokens??0,r.cacheReadInputTokens=t.message.usage?.cache_read_input_tokens??0):"user"===t.type?r.chunks=g(t.message.content):"rate_limit_event"===t.type?(r.sessionId=t.session_id,r.rateLimitInfo=t.rate_limit_info):(r.sessionId=t.session_id,r.resultText=t.result,r.costUsd=t.total_cost_usd,r.inputTokens=t.usage?.input_tokens??0,r.outputTokens=t.usage?.output_tokens??0,r.cacheCreationInputTokens=t.usage?.cache_creation_input_tokens??0,r.cacheReadInputTokens=t.usage?.cache_read_input_tokens??0,r.isError=t.is_error??!1),r}(e)}catch(t){return this.onParseError?.({line:e.trim(),message:f(t)}),null}return t?(t.sessionId&&(this.sessionId=t.sessionId),t.model&&(this.model=t.model),t.rateLimitInfo&&(this.rateLimit=t.rateLimitInfo),"result"===t.type?(t.inputTokens>0&&(this.totalInputTokens=t.inputTokens),t.outputTokens>0&&(this.totalOutputTokens=t.outputTokens),t.cacheCreationInputTokens>0&&(this.totalCacheCreationInputTokens=t.cacheCreationInputTokens),t.cacheReadInputTokens>0&&(this.totalCacheReadInputTokens=t.cacheReadInputTokens),void 0!==t.costUsd&&(this.costUsd=t.costUsd),void 0!==t.resultText&&(this.resultText=t.resultText),this.resultIsError=t.isError):(this.totalInputTokens+=t.inputTokens,this.totalOutputTokens+=t.outputTokens,this.totalCacheCreationInputTokens+=t.cacheCreationInputTokens,this.totalCacheReadInputTokens+=t.cacheReadInputTokens),t):null}constructor(){this.buffer="",this.totalInputTokens=0,this.totalOutputTokens=0,this.totalCacheCreationInputTokens=0,this.totalCacheReadInputTokens=0,this.costUsd=0,this.resultIsError=!1}}let x="[REDACTED]",_=[/\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 T(e){let t=e;for(let e of _)t=t.replace(e,(e,t)=>"string"==typeof t?`${t}${x}`:x);return t}let y=[{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}],v=/limit reached\|(\d{9,12})\b/i,M=/retry[- ]?after[:\s]+(\d+)\s*(?:s|sec|second)/i,I=[{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}],j=/try again in ([\d.]+)\s*s(?:ec(?:ond)?s?)?\b/i,P="gpt-5-codex",w={"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}},A=Object.values(w).reduce((e,t)=>t.outputPerMTok>e.outputPerMTok?t:e,{inputPerMTok:0,outputPerMTok:0,cacheWritePerMTok:0,cacheReadPerMTok:0}),C=a.Ik({input_tokens:a.ai().optional(),cached_input_tokens:a.ai().optional(),output_tokens:a.ai().optional(),reasoning_output_tokens:a.ai().optional()}).passthrough(),N=a.Ik({used_percent:a.ai().optional(),window_minutes:a.ai().optional(),resets_in_seconds:a.ai().optional()}).passthrough(),R=a.Ik({primary:N.nullish(),secondary:N.nullish()}).passthrough(),S=a.Ik({id:a.Yj().optional(),item_type:a.Yj().optional(),text:a.Yj().optional(),command:a.Yj().optional(),exit_code:a.ai().optional(),server:a.Yj().optional(),tool:a.Yj().optional()}).passthrough(),E=a.Ik({type:a.Yj(),thread_id:a.Yj().optional(),usage:C.optional(),rate_limits:R.nullish(),item:S.optional(),error:a.Ik({message:a.Yj().optional()}).passthrough().optional(),message:a.Yj().optional()}).passthrough();function O(e){if(e&&"number"==typeof e.used_percent)return{usedPercent:e.used_percent,windowMinutes:e.window_minutes,resetsInSeconds:e.resets_in_seconds}}class Y{push(e){this.buffer+=e;let t=[],r=this.buffer.indexOf("\n");for(;-1!==r;){let e=this.buffer.slice(0,r);this.buffer=this.buffer.slice(r+1);let n=this.consume(e);n&&t.push(n),r=this.buffer.indexOf("\n")}return t}flush(){let e=this.buffer;this.buffer="";let t=this.consume(e);return t?[t]:[]}consume(e){let t;try{t=function(e){let t=e.trim();if(!t)return null;let r=JSON.parse(t);return E.parse(r)}(e)}catch(t){return this.onParseError?.({line:e.trim(),message:f(t)}),null}if(!t)return null;let r=function(e){let t=R.nullish().safeParse(e.rate_limits);if(!t.success||!t.data)return;let r=O(t.data.primary),n=O(t.data.secondary);if(r||n)return{primary:r,secondary:n}}(t);if(r&&(this.rateLimits=r),"turn.failed"===t.type||"error"===t.type){this.resultIsError=!0;let e=t.error?.message??t.message;e&&(this.resultText=e)}else"turn.completed"===t.type&&(this.resultIsError=!1,this.resultText=void 0);let n=function(e){let t={type:"assistant",chunks:[],inputTokens:0,outputTokens:0,cacheCreationInputTokens:0,cacheReadInputTokens:0,isError:!1,raw:e};if("thread.started"===e.type)return{...t,type:"system",sessionId:e.thread_id};if("item.completed"===e.type&&e.item)return{...t,type:"assistant",chunks:function(e){let t=e.id??"";switch(e.item_type){case"assistant_message":case"reasoning":return e.text?[{kind:"text",text:e.text}]:[];case"command_execution":return[{kind:"tool_use",name:"command",id:t,input:{command:e.command,exit_code:e.exit_code}}];case"file_change":return[{kind:"tool_use",name:"edit",id:t,input:e}];case"mcp_tool_call":return[{kind:"tool_use",name:`${e.server??"mcp"}/${e.tool??"tool"}`,id:t,input:e}];default:return[]}}(e.item)};if("turn.completed"===e.type){let r=e.usage;return{...t,type:"result",inputTokens:r?.input_tokens??0,outputTokens:(r?.output_tokens??0)+(r?.reasoning_output_tokens??0)}}return"turn.failed"===e.type||"error"===e.type?{...t,type:"result",isError:!0}:null}(t);return n?(n.sessionId&&(this.sessionId=n.sessionId),this.totalInputTokens+=n.inputTokens,this.totalOutputTokens+=n.outputTokens,n):null}constructor(){this.buffer="",this.totalInputTokens=0,this.totalOutputTokens=0,this.totalCacheCreationInputTokens=0,this.totalCacheReadInputTokens=0,this.costUsd=0}}let L=/openrouter http (\d{3})/i,W=/retry[- ]?after[:\s]+(\d+)\s*(?:s\b|sec|second)/i,z="openrouter is an HTTP provider; it has no CLI surface (dispatch on provider.kind)",U={claude:{id:"claude",label:"Claude Code",defaultCommand:"claude",supportsResume:!0,resumeModel:"claude-haiku-4-5",resumeMaxTurns:15,defaultModel:"claude-opus-4-8",buildStartArgs:({prompt:e,model:t,maxTurns:r})=>["-p",e,"--max-turns",String(r),"--permission-mode","acceptEdits","--model",t,"--output-format","stream-json","--verbose"],buildResumeArgs:({prompt:e,sessionId:t,model:r,maxTurns:n})=>["-p",e,"--resume",t,"--max-turns",String(n),"--model",r,"--output-format","stream-json","--verbose"],buildOneShotArgs:({prompt:e,model:t})=>["-p",e,"--model",t],buildStreamOneShotArgs:({prompt:e,model:t})=>["-p",e,"--model",t,"--output-format","stream-json","--verbose"],createParser:()=>new b,classifyFailure:function(e){var t;if(0===e.exitCode&&!e.resultIsError)return;let r=[e.resultText,e.stderr].filter(Boolean).join("\n");if(!r.trim())return;let n=y.find(e=>e.pattern.test(r));if(!n)return;let i={agent:"claude",kind:n.kind,rawSnippet:(t=n.pattern,T((r.split("\n").find(e=>t.test(e))??r).trim()).slice(0,300))};if("usage_limit"===n.kind){let e=r.match(v)?.[1];e&&(i.resetAt=Number(e))}if("rate_limit"===n.kind||"overloaded"===n.kind){let e=r.match(M)?.[1];e&&(i.retryAfterMs=1e3*Number(e))}return i},estimateCost:function(e,t,r,n=0,i=0){let a=function(e){if(!e)return s;let t=o[e];return t||(console.warn(`[drydock] Unknown model id "${e}" — using max-priced fallback to avoid under-counting cost`),s)}(e);return t/1e6*a.inputPerMTok+r/1e6*a.outputPerMTok+n/1e6*a.cacheWritePerMTok+i/1e6*a.cacheReadPerMTok}},codex:{id:"codex",label:"Codex CLI",defaultCommand:"codex",supportsResume:!0,resumeModel:P,resumeMaxTurns:15,defaultModel:P,buildStartArgs:({prompt:e,model:t})=>["exec","--json","--sandbox","workspace-write","--model",t,e],buildResumeArgs:({prompt:e,sessionId:t,model:r})=>["exec","resume",t,"--json","--sandbox","workspace-write","--model",r,e],buildOneShotArgs:({prompt:e,model:t})=>["exec","--model",t,e],buildStreamOneShotArgs:()=>null,createParser:()=>new Y,classifyFailure:function(e){var t;if(0===e.exitCode&&!e.resultIsError)return;let r=[e.resultText,e.stderr].filter(Boolean).join("\n");if(!r.trim())return;let n=I.find(e=>e.pattern.test(r));if(!n)return;let i={agent:"codex",kind:n.kind,rawSnippet:(t=n.pattern,T((r.split("\n").find(e=>t.test(e))??r).trim()).slice(0,300))};if("rate_limit"===n.kind||"overloaded"===n.kind){let e=r.match(j)?.[1],t=e?Math.ceil(1e3*Number(e)):NaN;Number.isFinite(t)&&t>=0&&(i.retryAfterMs=t)}return i},captureUsage:e=>e instanceof Y?e.rateLimits:void 0,estimateCost:function(e,t,r){let n=function(e){if(!e)return A;let t=w[e];return t||(console.warn(`[drydock] Unknown codex model id "${e}" — using max-priced fallback to avoid under-counting cost`),A)}(e);return t/1e6*n.inputPerMTok+r/1e6*n.outputPerMTok}},openrouter:{id:"openrouter",kind:"http",label:"OpenRouter",defaultCommand:"",supportsResume:!1,resumeModel:"",resumeMaxTurns:20,defaultModel:"",buildStartArgs(){throw Error(z)},buildResumeArgs:()=>null,buildOneShotArgs(){throw Error(z)},buildStreamOneShotArgs:()=>null,createParser(){throw Error(z)},classifyFailure:function(e){var t;if(0===e.exitCode&&!e.resultIsError)return;let r=[e.resultText,e.stderr].filter(Boolean).join("\n"),n=r.match(L)?.[1];if(!n)return;let i=(t=Number(n),401===t||403===t?"auth":402===t?"billing":429===t?/\b(?:free|daily|quota)\b/i.test(r)?"usage_limit":"rate_limit":408===t||t>=500&&t<600?"overloaded":void 0);if(!i)return;let o={agent:"openrouter",kind:i,rawSnippet:T((r.split("\n").find(e=>L.test(e))??r).trim()).slice(0,300)},s=r.match(W)?.[1];return s&&("rate_limit"===i||"overloaded"===i)&&(o.retryAfterMs=1e3*Number(s)),o},estimateCost:()=>0}},Z=["claude","codex","openrouter"].map(e=>U[e]),q=["claude","codex"];function F({value:e,onChange:t,id:r,className:o,agents:s=q}){let a=Z.filter(e=>s.includes(e.id));return(0,n.jsx)(i.l,{id:r,value:e,onChange:e=>t(e.target.value),className:o,children:a.map(e=>(0,n.jsx)("option",{value:e.id,children:e.label},e.id))})}},7405:(e,t,r)=>{r.d(t,{p:()=>s});var n=r(515),i=r(1171),o=r(5832);let s=i.forwardRef(({className:e,...t},r)=>(0,n.jsx)("input",{ref:r,className:(0,o.cn)("h-9 w-full rounded-lg border border-input bg-background px-3 text-sm text-foreground","placeholder:text-muted-foreground transition focus-ring","disabled:cursor-not-allowed disabled:opacity-50",e),...t}));s.displayName="Input"},8067:(e,t,r)=>{r.d(t,{l:()=>a});var n=r(515),i=r(3798),o=r(1171),s=r(5832);let a=o.forwardRef(({className:e,children:t,...r},o)=>(0,n.jsxs)("div",{className:"relative",children:[(0,n.jsx)("select",{ref:o,className:(0,s.cn)("h-9 w-full appearance-none cursor-pointer rounded-lg border border-input bg-background pl-3 pr-9 text-sm text-foreground","transition focus-ring","disabled:cursor-not-allowed disabled:opacity-50",e),...r,children:t}),(0,n.jsx)(i.A,{className:"pointer-events-none absolute right-2.5 top-1/2 h-[15px] w-[15px] -translate-y-1/2 text-muted-foreground"})]}));a.displayName="Select"},9214:(e,t,r)=>{r.d(t,{p:()=>s});var n=r(515),i=r(5832);let o={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"};function s({icon:e,tone:t="neutral",title:r,description:a,action:u,secondary:l,className:d,compact:c}){return(0,n.jsxs)("div",{className:(0,i.cn)("flex flex-col items-center justify-center text-center",c?"py-10":"py-16",d),children:[e&&(0,n.jsx)("div",{className:(0,i.cn)("flex items-center justify-center rounded-2xl",c?"h-12 w-12":"h-16 w-16",o[t]),children:(0,n.jsx)(e,{className:c?"h-[22px] w-[22px]":"h-7 w-7"})}),(0,n.jsx)("h3",{className:"mt-4 text-base font-semibold",children:r}),a&&(0,n.jsx)("p",{className:"mt-1 max-w-sm text-pretty text-sm text-muted-foreground",children:a}),(u||l)&&(0,n.jsxs)("div",{className:"mt-5 flex items-center gap-2",children:[u,l]})]})}},9754:(e,t,r)=>{r.d(t,{o:()=>s});var n=r(515),i=r(8067),o=r(1837);function s({value:e,onChange:t,agent:r,openrouterModels:a=[],id:u,className:l}){if("openrouter"===r)return(0,n.jsxs)(i.l,{id:u,value:e,onChange:e=>t(e.target.value),className:l,children:[0===a.length&&(0,n.jsx)("option",{value:"",disabled:!0,children:"No synced models — refresh the catalog in Settings"}),a.length>0&&""!==e&&!a.some(t=>t.id===e)&&(0,n.jsxs)("option",{value:e,disabled:!0,children:[e," (no longer in catalog)"]}),a.map(e=>(0,n.jsx)("option",{value:e.id,children:e.isFree?`${e.label} (free)`:e.label},e.id))]});let d=r?(0,o.tT)(r):o.L6;return(0,n.jsx)(i.l,{id:u,value:e,onChange:e=>t(e.target.value),className:l,children:d.map(e=>(0,n.jsx)("option",{value:e.id,children:e.label},e.id))})}}}]);
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3433],{395:(e,t,r)=>{r.d(t,{$:()=>l});var n=r(515),a=r(1171),s=r(5832);let i={default:"bg-primary text-primary-foreground shadow-sm hover-elevate active-elevate-2",secondary:"bg-secondary text-secondary-foreground hover-elevate active-elevate-2",outline:"border border-border bg-transparent shadow-sm hover-elevate active-elevate-2",destructive:"bg-destructive text-destructive-foreground shadow-sm hover-elevate active-elevate-2",ghost:"border border-transparent hover-elevate active-elevate-2",success:"bg-success text-white shadow-sm hover-elevate active-elevate-2"},o={default:"h-9 px-4 py-2 rounded-lg text-sm",sm:"h-8 px-3 rounded-md text-xs",lg:"h-10 px-6 rounded-lg text-sm",icon:"h-9 w-9 rounded-lg","icon-sm":"h-8 w-8 rounded-md"},l=a.forwardRef(({className:e,variant:t="default",size:r="default",type:a="button",...l},d)=>(0,n.jsx)("button",{ref:d,type:a,className:(0,s.cn)("inline-flex items-center justify-center gap-2 whitespace-nowrap font-medium transition-colors focus-ring","disabled:pointer-events-none disabled:opacity-50","[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",i[t],o[r],e),...l}));l.displayName="Button"},5529:(e,t,r)=>{r.d(t,{Wu:()=>d,ZB:()=>l,Zp:()=>i,aR:()=>o});var n=r(515),a=r(5832);let s={none:"",sm:"p-4",default:"p-5",lg:"p-6"};function i({className:e,pad:t,hover:r,...o}){return(0,n.jsx)("div",{className:(0,a.cn)("rounded-xl border border-card-border bg-card text-card-foreground shadow-sm",r&&"hover-elevate transition-shadow hover:shadow-md",t&&s[t],e),...o})}function o({className:e,...t}){return(0,n.jsx)("div",{className:(0,a.cn)("flex flex-col gap-1.5 p-5",e),...t})}function l({className:e,...t}){return(0,n.jsx)("h3",{className:(0,a.cn)("text-base font-semibold leading-none tracking-tight",e),...t})}function d({className:e,...t}){return(0,n.jsx)("div",{className:(0,a.cn)("p-5 pt-0",e),...t})}},5832:(e,t,r)=>{function n(...e){return e.filter(Boolean).join(" ")}function a(e){if(!e)return"no activity";let t=Math.floor(Date.now()/1e3)-e;return t<60?"just now":t<3600?`${Math.floor(t/60)}m ago`:t<86400?`${Math.floor(t/3600)}h ago`:t<604800?`${Math.floor(t/86400)}d ago`:new Date(1e3*e).toLocaleDateString()}function s(e){if(e>=3600){let t=Math.floor(e/3600),r=Math.round(e%3600/60);return r>0?`${t}h ${r}m`:`${t}h`}return e>=60?`${Math.floor(e/60)}m ${e%60}s`:`${e}s`}function i(e,t=2){return`$${e.toFixed(t)}`}r.d(t,{KW:()=>a,UK:()=>i,a3:()=>s,cn:()=>n})},6644:(e,t,r)=>{r.d(t,{E:()=>l});var n=r(515),a=r(5832);let s={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"},i={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"},o=new Set(["working","ci_running","retrying","releasing"]);function l({className:e,status:t,tone:r,children:d,...c}){let u=r??(t?i[t]??"neutral":"neutral"),m=void 0!==t&&o.has(t);return(0,n.jsxs)("span",{className:(0,a.cn)("inline-flex items-center gap-1.5 whitespace-nowrap rounded-md border px-2 py-0.5 text-[11px] font-semibold leading-4",s[u],e),...c,children:[m&&(0,n.jsxs)("span",{className:"relative flex h-1.5 w-1.5",children:[(0,n.jsx)("span",{className:"absolute inline-flex h-full w-full animate-ping rounded-full bg-current opacity-60"}),(0,n.jsx)("span",{className:"relative inline-flex h-1.5 w-1.5 rounded-full bg-current"})]}),d??t?.replace(/_/g," ")]})}},6845:(e,t,r)=>{r.d(t,{p:()=>s});var n=r(1171);let a=()=>()=>{};function s(){return(0,n.useSyncExternalStore)(a,()=>!0,()=>!1)}},7901:(e,t,r)=>{r.d(t,{l:()=>c});var n=r(515),a=r(5378),s=r(1171);function i(e){return Array.from(e.querySelectorAll('a[href]:not([tabindex="-1"]), button:not([disabled]):not([tabindex="-1"]), input:not([disabled]):not([tabindex="-1"]), select:not([disabled]):not([tabindex="-1"]), textarea:not([disabled]):not([tabindex="-1"]), [tabindex]:not([tabindex="-1"])'))}var o=r(5832);let l={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"},d={sm:"max-w-sm",md:"max-w-md",lg:"max-w-lg",xl:"max-w-2xl"};function c({open:e,onClose:t,onOpenChange:r,labelledById:u,title:m,description:x,icon:f,tone:v="primary",footer:p,size:g="xl",className:h,children:b}){let w=(0,s.useRef)(null),y=(0,s.useRef)(null),[j,N]=(0,s.useState)(e),[k,C]=(0,s.useState)(!1),$=(0,s.useId)(),D=()=>{r?r(!1):t?.()},E=(0,s.useRef)(D);if(E.current=D,(0,s.useEffect)(()=>{let t;return e?(N(!0),t=setTimeout(()=>C(!0),10)):(C(!1),t=setTimeout(()=>N(!1),180)),()=>clearTimeout(t)},[e]),(0,s.useEffect)(()=>{if(!e||!j)return;y.current=document.activeElement;let t=w.current;function r(e){if("Escape"===e.key){e.preventDefault(),E.current();return}let t=w.current;if("Tab"===e.key&&t){var r,n;let a,s,o;e.preventDefault();let l=i(t);if(0===l.length)return;(r=document.activeElement,n=e.shiftKey,a=l.indexOf(r),s=l[l.length-1],o=l[0],-1===a?n?s:o:l[((n?a-1:a+1)+l.length)%l.length]).focus()}}return t&&(i(t)[0]??t).focus(),document.addEventListener("keydown",r),()=>{document.removeEventListener("keydown",r),y.current instanceof HTMLElement&&y.current.focus(),y.current=null}},[e,j]),!j)return null;let _=null!=m?$:void 0,M=u??_,A=null!=m||null!=x||null!=f;return(0,n.jsxs)("div",{className:"fixed inset-0 z-50 flex items-start justify-center overflow-y-auto p-4 sm:p-8",children:[(0,n.jsx)("div",{className:(0,o.cn)("fixed inset-0 bg-black/50 backdrop-blur-sm transition-opacity duration-200",k?"opacity-100":"opacity-0"),onMouseDown:D}),(0,n.jsx)("div",{ref:w,role:"dialog","aria-modal":"true","aria-labelledby":M,tabIndex:-1,className:(0,o.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",k?"scale-100 opacity-100 translate-y-0":"scale-[0.97] opacity-0 translate-y-2",d[g],h),onMouseDown:e=>e.stopPropagation(),children:A?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"flex items-start gap-3 p-5",children:[f&&(0,n.jsx)("span",{className:(0,o.cn)("flex h-9 w-9 shrink-0 items-center justify-center rounded-lg",l[v]),children:(0,n.jsx)(f,{className:"h-[18px] w-[18px]"})}),(0,n.jsxs)("div",{className:"min-w-0 flex-1",children:[null!=m&&(0,n.jsx)("h2",{id:_,className:"text-base font-semibold tracking-tight",children:m}),null!=x&&(0,n.jsx)("p",{className:"mt-1 text-sm text-muted-foreground text-pretty",children:x})]}),(0,n.jsx)("button",{type:"button","aria-label":"Close",onClick:D,className:"-mr-1 -mt-1 shrink-0 rounded-md p-1 text-muted-foreground hover-elevate",children:(0,n.jsx)(a.A,{className:"h-4 w-4"})})]}),null!=b&&(0,n.jsx)("div",{className:"px-5 pb-2",children:b}),null!=p&&(0,n.jsx)("div",{className:"flex justify-end gap-2 p-5 pt-3",children:p})]}):(0,n.jsxs)("div",{className:"p-5",children:[b,null!=p&&(0,n.jsx)("div",{className:"mt-4 flex justify-end gap-2",children:p})]})})]})}},8479:(e,t,r)=>{r.d(t,{t:()=>m,d:()=>x});var n=r(515),a=r(8131),s=r(6003),i=r(6512),o=r(5378),l=r(1171);function d(e){return"error"===e?"assertive":"polite"}var c=r(5832);let u=(0,l.createContext)(null);function m({children:e}){let[t,r]=(0,l.useState)([]),a=(0,l.useCallback)(e=>{r(t=>t.filter(t=>t.id!==e))},[]),s=(0,l.useCallback)(e=>{let t=Date.now()+Math.random(),n={id:t,title:e.title,description:e.description,variant:e.variant??"info"};r(e=>[...e,n]),setTimeout(()=>a(t),5e3)},[a]),i=(0,l.useMemo)(()=>({toast:s,success:(e,t)=>s({title:e,description:t,variant:"success"}),error:(e,t)=>s({title:e,description:t,variant:"error"}),info:(e,t)=>s({title:e,description:t,variant:"info"})}),[s]);return(0,n.jsxs)(u.Provider,{value:i,children:[e,(0,n.jsx)(g,{toasts:t,onDismiss:a})]})}function x(){let e=(0,l.useContext)(u);if(!e)throw Error("useToast must be used within a ToastProvider");return e}let f={success:a.A,error:s.A,info:i.A},v={success:{icon:"text-success",bar:"bg-success"},error:{icon:"text-destructive",bar:"bg-destructive"},info:{icon:"text-primary",bar:"bg-primary"}};function p({toast:e,onDismiss:t}){let r=f[e.variant],a=v[e.variant];return(0,n.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,n.jsx)(r,{className:(0,c.cn)("mt-0.5 h-[18px] w-[18px] shrink-0",a.icon)}),(0,n.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,n.jsx)("p",{className:"text-sm font-medium",children:e.title}),e.description&&(0,n.jsx)("p",{className:"mt-0.5 text-xs text-muted-foreground",children:e.description})]}),(0,n.jsx)("button",{type:"button","aria-label":"Dismiss notification",onClick:()=>t(e.id),className:"shrink-0 rounded-md p-0.5 text-muted-foreground hover-elevate",children:(0,n.jsx)(o.A,{className:"h-3.5 w-3.5"})}),(0,n.jsx)("span",{className:(0,c.cn)("dd-toast-progress absolute bottom-0 left-0 h-0.5 w-full",a.bar),style:{animationDuration:"5000ms"}})]})}function g({toasts:e,onDismiss:t}){let r=e.filter(e=>"assertive"===d(e.variant)),a=e.filter(e=>"polite"===d(e.variant));return(0,n.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,n.jsx)("div",{role:"alert","aria-live":"assertive","aria-atomic":"false",className:"flex flex-col gap-2",children:r.map(e=>(0,n.jsx)(p,{toast:e,onDismiss:t},e.id))}),(0,n.jsx)("div",{"aria-live":"polite","aria-atomic":"false",className:"flex flex-col gap-2",children:a.map(e=>(0,n.jsx)(p,{toast:e,onDismiss:t},e.id))})]})}},9694:(e,t,r)=>{r.d(t,{T:()=>l});var n=r(515),a=r(4877),s=r(6512),i=r(395),o=r(7901);function l({open:e,onOpenChange:t,onConfirm:r,title:d,description:c,confirmLabel:u="Confirm",cancelLabel:m="Cancel",variant:x="default",pending:f=!1,icon:v}){let p="destructive"===x,g=v??(p?a.A:s.A);return(0,n.jsx)(o.l,{open:e,onOpenChange:t,title:d,description:c,icon:g,tone:p?"destructive":"primary",size:"sm",footer:(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.$,{variant:"outline",size:"sm",disabled:f,onClick:()=>t(!1),children:m}),(0,n.jsx)(i.$,{variant:p?"destructive":"default",size:"sm",disabled:f,onClick:()=>{r(),t(!1)},children:u})]})})}}}]);
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3894],{9:(e,t,r)=>{r.d(t,{T:()=>a});var s=r(515),n=r(1171),o=r(5832);let a=n.forwardRef(({className:e,...t},r)=>(0,s.jsx)("textarea",{ref:r,className:(0,o.cn)("min-h-[80px] w-full rounded-lg border border-input bg-background px-3 py-2 text-sm text-foreground leading-relaxed","placeholder:text-muted-foreground transition focus-ring","disabled:cursor-not-allowed disabled:opacity-50",e),...t}));a.displayName="Textarea"},715:(e,t,r)=>{r.d(t,{LogViewer:()=>O});var s=r(515),n=r(6512),o=r(1753),a=r(5803),l=r(2863),i=r(8131),d=r(159),c=r(5662),u=r(6819),p=r(1365),x=r(2961),m=r(3611),f=r(1171),g=r(2497),h=r(6644),b=r(598),y=r(8479),j=r(6845),N=r(5832);let v=["status","text","tool_use","tool_result","result","claude_exit","error"],w={status:{icon:n.A,color:"text-muted-foreground",chip:"bg-secondary text-muted-foreground",label:"status"},text:{icon:o.A,color:"text-primary",chip:"bg-primary/10 text-primary",label:"assistant"},tool_use:{icon:a.A,color:"text-primary",chip:"bg-primary/10 text-primary",label:"tool"},tool_result:{icon:l.A,color:"text-success",chip:"bg-success-muted text-success",label:"result"},result:{icon:i.A,color:"text-success",chip:"bg-success-muted text-success",label:"done"},claude_exit:{icon:d.A,color:"text-muted-foreground",chip:"bg-secondary text-muted-foreground",label:"exit"},error:{icon:c.A,color:"text-destructive",chip:"bg-destructive/10 text-destructive",label:"error"}},k={icon:n.A,color:"text-muted-foreground",chip:"bg-secondary text-muted-foreground",label:"event"};function S(e){return new Date(1e3*e).toTimeString().slice(0,8)}function _(e,t){if(e&&"object"==typeof e&&t in e){let r=e[t];return null==r?void 0:String(r)}}let A=new Set(["merged","needs_human","aborted","interrupted"]);function C(e,t){if("result"===e||"claude_exit"===e)return!0;if("status"!==e)return!1;let r=_(t,"to");return void 0!==r&&A.has(r)}function E({type:e,payload:t}){if("text"===e)return(0,s.jsx)("p",{className:"leading-relaxed text-foreground/90",children:"string"==typeof t?t:_(t,"text")??JSON.stringify(t)});if("status"===e){let e=_(t,"from"),r=_(t,"to"),n=_(t,"reason");return e||r?(0,s.jsxs)("span",{className:"text-muted-foreground",children:[e??"?"," ",(0,s.jsx)("span",{className:"text-muted-foreground/60",children:"→"})," ",(0,s.jsx)("span",{className:"text-foreground",children:r??"?"}),n&&(0,s.jsxs)(s.Fragment,{children:[" \xb7 ",n]})]}):(0,s.jsx)("span",{className:"text-muted-foreground",children:_(t,"message")??n??("string"==typeof t?t:JSON.stringify(t))})}if("error"===e)return(0,s.jsx)("span",{className:"text-destructive",children:_(t,"message")??("string"==typeof t?t:JSON.stringify(t))});if("claude_exit"===e){let e=_(t,"exitCode")??_(t,"code"),r=_(t,"reason");return(0,s.jsxs)("span",{className:"text-muted-foreground",children:["exited code ",(0,s.jsx)("span",{className:"text-foreground",children:e??"?"}),r&&(0,s.jsxs)(s.Fragment,{children:[" \xb7 ",r]})]})}if("tool_use"===e){let e=_(t,"name")??"tool",r=(t&&"object"==typeof t?t.input:void 0)??{},n=r.file_path??r.command??r.pattern??r.summary??Object.values(r)[0]??"";return(0,s.jsxs)("span",{children:[(0,s.jsx)("span",{className:"font-semibold text-primary",children:e}),(0,s.jsx)("span",{className:"text-muted-foreground",children:"("}),(0,s.jsx)("span",{className:"text-foreground/80",children:String(n)}),(0,s.jsx)("span",{className:"text-muted-foreground",children:")"}),!!r.summary&&!!r.file_path&&(0,s.jsxs)("span",{className:"text-muted-foreground",children:[" — ",String(r.summary)]})]})}if("tool_result"===e){let e=t&&"object"==typeof t&&t.ok,r=_(t,"summary")??"",n=e?i.A:c.A;return(0,s.jsxs)("span",{className:(0,N.cn)("inline-flex items-center gap-1.5",e?"text-success":"text-destructive"),children:[(0,s.jsx)(n,{className:"h-3 w-3 shrink-0"}),(0,s.jsx)("span",{className:"text-foreground/80",children:r})]})}if("result"===e){let e=t??{},r="number"==typeof e.costUsd?e.costUsd:void 0,n="number"==typeof e.durationSec?e.durationSec:void 0,o="number"==typeof e.turns?e.turns:void 0,a="number"==typeof e.inputTokens?e.inputTokens:void 0,l="number"==typeof e.outputTokens?e.outputTokens:void 0,i="rounded bg-secondary px-1.5 py-0.5 text-[11px] tnum";return(0,s.jsxs)("span",{className:"inline-flex flex-wrap items-center gap-2 align-middle",children:[(0,s.jsx)(h.E,{tone:"success",children:"done"}),null!=r&&(0,s.jsxs)("span",{className:i,children:["$",r.toFixed(2)]}),null!=n&&(0,s.jsxs)("span",{className:i,children:[Math.floor(n/60),"m ",n%60,"s"]}),null!=o&&(0,s.jsxs)("span",{className:i,children:[o," turns"]}),null!=a&&null!=l&&(0,s.jsxs)("span",{className:i,children:[(a/1e3).toFixed(0),"k in \xb7 ",(l/1e3).toFixed(1),"k out"]})]})}return(0,s.jsx)("span",{className:"text-muted-foreground",children:"string"==typeof t?t:JSON.stringify(t)})}function T({line:e,showClock:t}){let r=w[e.type]??k,n=r.icon,o=t&&e.ts?S(e.ts):"";return(0,s.jsxs)("div",{className:(0,N.cn)("dd-log-in flex gap-2.5 rounded-md px-2.5 py-1.5 hover:bg-secondary/40","error"===e.type&&"bg-destructive/[0.06]"),children:[(0,s.jsx)("span",{className:"shrink-0 select-none pt-0.5 text-[11px] tnum text-muted-foreground/60",children:o}),(0,s.jsx)(n,{className:(0,N.cn)("mt-0.5 h-[13px] w-[13px] shrink-0",r.color)}),(0,s.jsx)("span",{className:(0,N.cn)("w-[68px] shrink-0 pt-0.5 text-[10px] font-semibold uppercase tracking-wide",r.color),children:r.label}),(0,s.jsx)("div",{className:"min-w-0 flex-1 whitespace-pre-wrap break-words pt-0.5",children:(0,s.jsx)(E,{type:e.type,payload:e.payload})})]})}function O({jobId:e,initial:t=[],active:r=!0}){let[n,o]=(0,f.useState)(t),[a,l]=(0,f.useState)(()=>!r||t.some(e=>C(e.type,e.payload))),[i,d]=(0,f.useState)(!0),[c,_]=(0,f.useState)(()=>new Set),[A,E]=(0,f.useState)(!1),$=(0,f.useRef)(new Set(t.map(e=>e.id))),F=(0,j.p)(),{success:J,error:L}=(0,y.d)();(0,f.useEffect)(()=>{if(!r||a)return;let t=new EventSource(`/api/sse/jobs/${e}`),s=e=>t=>{let r=t.lastEventId?Number(t.lastEventId):Date.now();if($.current.has(r))return;$.current.add(r);let s=t.data;try{s=JSON.parse(t.data)}catch{}o(t=>[...t,{id:r,type:e,payload:s,ts:Math.floor(Date.now()/1e3)}]),C(e,s)&&l(!0)};for(let e of v)t.addEventListener(e,s(e));return()=>t.close()},[e,r,a]);let z=(0,f.useMemo)(()=>n.filter(e=>!c.has(e.type)),[n,c]),D=!a,M=c.size;return(0,s.jsxs)("div",{className:"overflow-hidden rounded-xl border border-card-border bg-card shadow-sm",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 border-b border-card-border bg-secondary/40 px-3 py-2",children:[(0,s.jsxs)("span",{className:"flex items-center gap-2 text-sm font-semibold",children:[(0,s.jsx)(u.A,{className:"h-[15px] w-[15px] text-muted-foreground"})," Log stream"]}),D?(0,s.jsx)(h.E,{status:"working",children:"live"}):(0,s.jsxs)(h.E,{tone:"neutral",children:["complete \xb7 ",n.length," events"]}),(0,s.jsxs)("div",{className:"ml-auto flex items-center gap-1",children:[(0,s.jsxs)("button",{type:"button",onClick:()=>E(e=>!e),className:(0,N.cn)("inline-flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium hover-elevate focus-ring",M>0&&"text-primary"),children:[(0,s.jsx)(p.A,{className:"h-3.5 w-3.5"})," Filter",M>0&&(0,s.jsxs)("span",{className:"tnum",children:["\xb7 ",v.length-M]})]}),(0,s.jsxs)("button",{type:"button",onClick:()=>d(e=>!e),className:(0,N.cn)("inline-flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium hover-elevate focus-ring",i?"text-primary":"text-muted-foreground"),"aria-pressed":i,children:[(0,s.jsx)(x.A,{className:"h-3.5 w-3.5"})," Autoscroll"]}),(0,s.jsxs)("button",{type:"button",onClick:function(){let e=n.map(e=>{let t=e.ts?`[${S(e.ts)}] `:"",r="string"==typeof e.payload?e.payload:JSON.stringify(e.payload);return`${t}${e.type} ${r}`}).join("\n"),t=navigator.clipboard;t?t.writeText(e).then(()=>J("Log copied",`${n.length} events`)).catch(()=>L("Copy failed","Could not write to the clipboard.")):L("Copy failed","The clipboard is unavailable in this context.")},className:"inline-flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium text-muted-foreground hover-elevate focus-ring",children:[(0,s.jsx)(m.A,{className:"h-3.5 w-3.5"})," Copy"]})]})]}),A&&(0,s.jsx)("div",{className:"dd-fade-up flex flex-wrap items-center gap-1.5 border-b border-card-border bg-secondary/20 px-3 py-2",children:v.map(e=>{let t=!c.has(e),r=w[e]??k,n=r.icon;return(0,s.jsxs)("button",{type:"button",onClick:()=>{_(t=>{let r=new Set(t);return r.has(e)?r.delete(e):r.add(e),r})},className:(0,N.cn)("inline-flex items-center gap-1.5 rounded-md border px-2 py-1 text-[11px] font-medium transition-colors focus-ring",t?`${r.chip} border-transparent`:"border-border text-muted-foreground/60 line-through"),children:[(0,s.jsx)(n,{className:"h-[11px] w-[11px]"})," ",r.label]},e)})}),(0,s.jsx)("div",{role:"log","aria-live":"polite","aria-label":"Job log stream",className:"h-[460px] bg-background/40 px-1 py-1 font-mono text-xs",children:(0,s.jsx)(g.aY,{data:z,followOutput:!!i&&"smooth",itemContent:(e,t)=>(0,s.jsx)(T,{line:t,showClock:F}),components:{Footer:()=>D?(0,s.jsxs)("div",{className:"flex items-center gap-2.5 px-2.5 py-1.5 text-muted-foreground",children:[(0,s.jsx)("span",{className:"w-[42px]"}),(0,s.jsx)(b.y,{size:13}),(0,s.jsx)("span",{className:"text-[11px]",children:"streaming…"})]}):null}})})]})}},5172:(e,t,r)=>{r.d(t,{V:()=>i,m:()=>l});var s=r(515),n=r(4393),o=r(5832);let a={top:"bottom-full left-1/2 -translate-x-1/2 mb-2",bottom:"top-full left-1/2 -translate-x-1/2 mt-2",right:"left-full top-1/2 -translate-y-1/2 ml-2",left:"right-full top-1/2 -translate-y-1/2 mr-2"};function l({content:e,children:t,side:r="top",className:n}){return(0,s.jsxs)("span",{className:"group/tt relative inline-flex",children:[t,(0,s.jsx)("span",{role:"tooltip",className:(0,o.cn)("pointer-events-none absolute z-50 w-max max-w-[260px] rounded-lg border border-border bg-popover px-2.5 py-1.5 text-xs leading-relaxed text-popover-foreground shadow-lg","translate-y-0.5 opacity-0 transition-all duration-150 group-focus-within/tt:opacity-100 group-hover/tt:translate-y-0 group-hover/tt:opacity-100",a[r],n),children:e})]})}function i({content:e,side:t="top"}){return(0,s.jsx)(l,{content:e,side:t,children:(0,s.jsx)("button",{type:"button",className:"inline-flex h-4 w-4 items-center justify-center rounded-full text-muted-foreground/70 transition-colors hover:text-foreground focus-ring","aria-label":"Help",children:(0,s.jsx)(n.A,{className:"h-3.5 w-3.5"})})})}}}]);
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7690],{2235:(e,t,n)=>{var s=n(2067);n.o(s,"usePathname")&&n.d(t,{usePathname:function(){return s.usePathname}}),n.o(s,"useRouter")&&n.d(t,{useRouter:function(){return s.useRouter}}),n.o(s,"useSearchParams")&&n.d(t,{useSearchParams:function(){return s.useSearchParams}})},2414:(e,t,n)=>{n.d(t,{A:()=>s});let s=(0,n(1330).A)("dollar-sign",[["line",{x1:"12",x2:"12",y1:"2",y2:"22",key:"7eqyqh"}],["path",{d:"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6",key:"1b0p4s"}]])},3823:(e,t,n)=>{n.d(t,{A:()=>s});let s=(0,n(1330).A)("gauge",[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]])},4913:(e,t,n)=>{n.d(t,{C:()=>m,B:()=>f});var s=n(515),r=n(3823),a=n(1171),l=n(4502);l.Ik({status:l.k5(["ok","warning","blocked"]),windowType:l.Yj(),resetsAt:l.ai().nullable(),capturedAt:l.ai()});var u=n(6845),i=n(6644),d=n(5529);let o={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 c(e){return e&&"unknown"!==e?"five_hour"===e?"5h window":"weekly"===e?"weekly window":e.replace(/_/g," "):null}function x(e){let[,t]=(0,a.useReducer)(e=>e+1,0);(0,a.useEffect)(()=>{if(!e)return;let n=setInterval(t,1e3);return()=>clearInterval(n)},[e])}function h(e){return function(e,t){if(null===e||e<=t)return null;let n=e-t;if(n<60)return`${n}s`;if(n<3600)return`${Math.floor(n/60)}m`;if(n<86400){let e=Math.floor(n/3600),t=Math.floor(n%3600/60);return t>0?`${e}h ${t}m`:`${e}h`}let s=Math.floor(n/86400),r=Math.floor(n%86400/3600);return r>0?`${s}d ${r}h`:`${s}d`}(e.resetsAt,Math.floor(Date.now()/1e3))}function f({view:e}){let t,n=(0,u.p)()?h(e):null;x(null!==n),t="blocked"===e.state?n?`Claude limited \xb7 ${n}`:"Claude limited":"warning"===e.state?n?`Claude \xb7 ${n}`:"Claude limit near":"ok"===e.state?"Claude OK":"Claude usage —";let a="unknown"===e.state?"Claude subscription usage: no recent reading yet":`Claude ${c(e.windowType)??"subscription"} — ${e.label}${n?` \xb7 resets in ${n}`:""}`;return(0,s.jsxs)(i.E,{tone:e.tone,title:a,className:"shrink-0",children:[(0,s.jsx)(r.A,{className:"h-3 w-3","aria-hidden":!0}),t]})}function m({view:e}){let t,n=(0,u.p)()?h(e):null;x(null!==n);let a=c(e.windowType);return t="unknown"===e.state?"No recent reading yet.":e.blocked?n?`Parked — resets in ${n}`:"Parked until the window resets":n?`Resets in ${n}`:a?`${a} active`:"Within limits",(0,s.jsxs)(d.Zp,{pad:"lg",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:`flex h-8 w-8 items-center justify-center rounded-lg ${o[e.tone]}`,children:(0,s.jsx)(r.A,{className:"h-4 w-4","aria-hidden":!0})}),(0,s.jsx)("span",{className:"text-sm font-medium text-foreground",children:"Claude usage"})]}),(0,s.jsx)(i.E,{tone:e.tone,children:e.label})]}),(0,s.jsxs)("div",{className:"mt-3 flex items-baseline justify-between",children:[(0,s.jsx)("span",{className:"text-sm text-muted-foreground",children:t}),a&&"unknown"!==e.state&&(0,s.jsx)("span",{className:"text-xs text-muted-foreground/70",children:a})]})]})}},9583:(e,t,n)=>{n.d(t,{L:()=>b,_:()=>w});var s=n(515),r=n(3823),a=n(1171),l=n(4502);let u=l.Ik({usedPercent:l.ai(),resetsAt:l.ai().optional(),windowMinutes:l.ai().optional()});function i(e,t){if(null===e||e<=t)return null;let n=e-t;if(n<60)return`${n}s`;if(n<3600)return`${Math.floor(n/60)}m`;if(n<86400){let e=Math.floor(n/3600),t=Math.floor(n%3600/60);return t>0?`${e}h ${t}m`:`${e}h`}let s=Math.floor(n/86400),r=Math.floor(n%86400/3600);return r>0?`${s}d ${r}h`:`${s}d`}l.Ik({capturedAt:l.ai(),primary:u.optional(),secondary:u.optional()});var d=n(6845),o=n(6644),c=n(5529);let x={neutral:"bg-secondary text-muted-foreground",success:"bg-success/10 text-success",warning:"bg-warning/10 text-warning",destructive:"bg-destructive/10 text-destructive"},h={neutral:"bg-muted-foreground/40",success:"bg-success",warning:"bg-warning",destructive:"bg-destructive"};function f(e){let[,t]=(0,a.useReducer)(e=>e+1,0);(0,a.useEffect)(()=>{if(!e)return;let n=setInterval(t,1e3);return()=>clearInterval(n)},[e])}function m(e){return Math.round(Math.min(Math.max(e,0),100))}function w({view:e}){let t,n=(0,d.p)()?i(e.resetsAt,Math.floor(Date.now()/1e3)):null;f(null!==n),t="blocked"===e.state?n?`Codex limited \xb7 ${n}`:"Codex limited":null!==e.usedPercent?`Codex ${m(e.usedPercent)}%`:"Codex usage —";let a="unknown"===e.state?"Codex OAuth usage: no recent reading yet":`Codex OAuth — ${e.label}${null!==e.usedPercent?` (${m(e.usedPercent)}% used)`:""}${n?` \xb7 resets in ${n}`:""}`;return(0,s.jsxs)(o.E,{tone:e.tone,title:a,className:"shrink-0",children:[(0,s.jsx)(r.A,{className:"h-3 w-3","aria-hidden":!0}),t]})}function g({label:e,window:t,tone:n,now:r}){let a=i(t.resetsAt??null,r);return(0,s.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,s.jsxs)("div",{className:"flex items-baseline justify-between text-xs",children:[(0,s.jsx)("span",{className:"font-medium text-foreground",children:function(e,t){if(void 0===e)return t;if(e>=10020)return"weekly window";if(e>=60){let t=Math.round(e/60);return`${t}h window`}return`${e}m window`}(t.windowMinutes,e)}),(0,s.jsxs)("span",{className:"tnum text-muted-foreground",children:[m(t.usedPercent),"%"]})]}),(0,s.jsx)("div",{className:"h-1.5 w-full overflow-hidden rounded-full bg-secondary",children:(0,s.jsx)("div",{className:`h-full rounded-full ${h[n]}`,style:{width:`${m(t.usedPercent)}%`}})}),a&&(0,s.jsxs)("span",{className:"text-[11px] text-muted-foreground/80",children:["resets in ",a]})]})}function p(e){return e>=90?"destructive":e>=75?"warning":"success"}function b({view:e}){let t=(0,d.p)(),n=Math.floor(Date.now()/1e3),a=t&&e.blocked?i(e.resetsAt,n):null;return f((e.primary?.resetsAt??e.resetsAt)!==null&&t),(0,s.jsxs)(c.Zp,{pad:"lg",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("span",{className:`flex h-8 w-8 items-center justify-center rounded-lg ${x[e.tone]}`,children:(0,s.jsx)(r.A,{className:"h-4 w-4","aria-hidden":!0})}),(0,s.jsx)("span",{className:"text-sm font-medium text-foreground",children:"Codex usage"})]}),(0,s.jsx)(o.E,{tone:e.tone,children:e.label})]}),"unknown"===e.state?(0,s.jsx)("p",{className:"mt-3 text-sm text-muted-foreground",children:"No quota reading yet. Codex reports its OAuth usage as it runs."}):(0,s.jsxs)("div",{className:"mt-3 flex flex-col gap-3",children:[e.blocked&&(0,s.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",a?`, resets in ${a}`:"","."]}),e.primary&&(0,s.jsx)(g,{label:"5h window",window:e.primary,tone:p(e.primary.usedPercent),now:n}),e.secondary&&(0,s.jsx)(g,{label:"weekly window",window:e.secondary,tone:p(e.secondary.usedPercent),now:n}),!e.primary&&!e.secondary&&(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"No window details reported."})]})]})}}}]);