@nilsr0711/drydock 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +4 -2
  3. package/.next/standalone/.next/build-manifest.json +5 -5
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/routes-manifest.json +12 -0
  6. package/.next/standalone/.next/server/app/_global-error/page.js +2 -2
  7. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  10. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  11. package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +2 -2
  12. package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +3 -3
  13. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  14. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  15. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/standalone/.next/server/app/_not-found/page.js +2 -2
  17. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/adrs/page.js +2 -2
  20. package/.next/standalone/.next/server/app/adrs/page.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/adrs/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/analytics/page.js +2 -0
  23. package/.next/standalone/.next/server/app/analytics/page.js.nft.json +1 -0
  24. package/.next/standalone/.next/server/app/analytics/page_client-reference-manifest.js +1 -0
  25. package/.next/standalone/.next/server/app/api/cost/export/route.js +2 -1
  26. package/.next/standalone/.next/server/app/api/cost/export/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/sse/dashboard/route.js +15 -2
  28. package/.next/standalone/.next/server/app/api/sse/dashboard/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/sse/jobs/[id]/route.js +2 -2
  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 +14 -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 +2 -2
  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 -5
  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 -0
  40. package/.next/standalone/.next/server/app/jobs/page.js.nft.json +1 -0
  41. package/.next/standalone/.next/server/app/jobs/page_client-reference-manifest.js +1 -0
  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 -2
  58. package/.next/standalone/.next/server/chunks/198.js +1 -0
  59. package/.next/standalone/.next/server/chunks/279.js +1 -0
  60. package/.next/standalone/.next/server/chunks/318.js +14 -0
  61. package/.next/standalone/.next/server/chunks/417.js +1 -0
  62. package/.next/standalone/.next/server/chunks/468.js +24 -0
  63. package/.next/standalone/.next/server/chunks/471.js +1 -0
  64. package/.next/standalone/.next/server/chunks/49.js +3 -0
  65. package/.next/standalone/.next/server/chunks/496.js +1 -0
  66. package/.next/standalone/.next/server/chunks/511.js +1 -0
  67. package/.next/standalone/.next/server/chunks/541.js +1 -1
  68. package/.next/standalone/.next/server/chunks/665.js +9 -0
  69. package/.next/standalone/.next/server/chunks/847.js +93 -0
  70. package/.next/standalone/.next/server/chunks/{868.js → 997.js} +2 -2
  71. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  72. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  73. package/.next/standalone/.next/server/next-font-manifest.json +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/ImQS3LTFl-iHwI2K1uXy0/_buildManifest.js +1 -0
  78. package/.next/standalone/.next/static/chunks/165-f2c11a8b0992483d.js +1 -0
  79. package/.next/standalone/.next/static/chunks/174-34fe81abafec07fe.js +1 -0
  80. package/.next/standalone/.next/static/chunks/188-14494263cefd30a4.js +1 -0
  81. package/.next/standalone/.next/static/chunks/312-5ab18c6fbb20b9cc.js +1 -0
  82. package/.next/standalone/.next/static/chunks/381-b0d5a35969fad985.js +1 -0
  83. package/.next/standalone/.next/static/chunks/540-b0819a434d7516b1.js +1 -0
  84. package/.next/standalone/.next/static/chunks/586-d7d6e7d3794dcf02.js +32 -0
  85. package/.next/standalone/.next/static/chunks/730-ae05580815adb9b2.js +1 -0
  86. package/.next/standalone/.next/static/chunks/736-503f37bb672c129b.js +1 -0
  87. package/.next/standalone/.next/static/chunks/878-f08fd91a6c00d84b.js +62 -0
  88. package/.next/standalone/.next/static/chunks/app/_global-error/page-03b9886f969453ed.js +1 -0
  89. package/.next/standalone/.next/static/chunks/app/_not-found/page-aa469cca9dc68961.js +1 -0
  90. package/.next/standalone/.next/static/chunks/app/adrs/page-ed0f94a800ba51c8.js +1 -0
  91. package/.next/standalone/.next/static/chunks/app/analytics/page-2d61245dbc9dd300.js +1 -0
  92. package/.next/standalone/.next/static/chunks/app/api/cost/export/route-03b9886f969453ed.js +1 -0
  93. package/.next/standalone/.next/static/chunks/app/api/sse/dashboard/route-03b9886f969453ed.js +1 -0
  94. package/.next/standalone/.next/static/chunks/app/api/sse/jobs/[id]/route-03b9886f969453ed.js +1 -0
  95. package/.next/standalone/.next/static/chunks/app/api/webhooks/[repoId]/route-03b9886f969453ed.js +1 -0
  96. package/.next/standalone/.next/static/chunks/app/costs/page-3eca75e55c68e079.js +1 -0
  97. package/.next/standalone/.next/static/chunks/app/jobs/[id]/page-528826c79cab6cbb.js +1 -0
  98. package/.next/standalone/.next/static/chunks/app/jobs/page-70bd2189d7249e3f.js +1 -0
  99. package/.next/standalone/.next/static/chunks/app/layout-0e04e8b455f51432.js +1 -0
  100. package/.next/standalone/.next/static/chunks/app/needs-human/page-90cc5147aadb3ebe.js +1 -0
  101. package/.next/standalone/.next/static/chunks/app/page-a142f2aa01a429d9.js +1 -0
  102. package/.next/standalone/.next/static/chunks/app/prompts/page-fba107f32faa6568.js +1 -0
  103. package/.next/standalone/.next/static/chunks/app/repos/[id]/page-0da8e297142d8567.js +1 -0
  104. package/.next/standalone/.next/static/chunks/app/settings/page-bd473b1d183c3db6.js +1 -0
  105. package/.next/standalone/.next/static/chunks/ec24c40a-fc218f196ad8b89e.js +1 -0
  106. package/.next/standalone/.next/static/chunks/framework-3631188fe017d11d.js +1 -0
  107. package/.next/standalone/.next/static/chunks/main-app-2ce5d113f02aa743.js +1 -0
  108. package/.next/standalone/.next/static/chunks/main-c73a28f721635e7a.js +5 -0
  109. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-03b9886f969453ed.js +1 -0
  110. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-03b9886f969453ed.js +1 -0
  111. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-3d82ee7a5f817d84.js +1 -0
  112. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-03b9886f969453ed.js +1 -0
  113. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-03b9886f969453ed.js +1 -0
  114. package/.next/standalone/.next/static/css/96c4f935104c1f9a.css +3 -0
  115. package/.next/standalone/drizzle/0010_one_shot_costs.sql +12 -0
  116. package/.next/standalone/drizzle/0021_robust_wind_dancer.sql +48 -0
  117. package/.next/standalone/drizzle/0022_issue_model_override.sql +2 -0
  118. package/.next/standalone/drizzle/meta/0021_snapshot.json +1780 -0
  119. package/.next/standalone/drizzle/meta/_journal.json +7 -0
  120. package/.next/standalone/package.json +2 -1
  121. package/.next/static/ImQS3LTFl-iHwI2K1uXy0/_buildManifest.js +1 -0
  122. package/.next/static/chunks/165-f2c11a8b0992483d.js +1 -0
  123. package/.next/static/chunks/174-34fe81abafec07fe.js +1 -0
  124. package/.next/static/chunks/188-14494263cefd30a4.js +1 -0
  125. package/.next/static/chunks/312-5ab18c6fbb20b9cc.js +1 -0
  126. package/.next/static/chunks/381-b0d5a35969fad985.js +1 -0
  127. package/.next/static/chunks/540-b0819a434d7516b1.js +1 -0
  128. package/.next/static/chunks/586-d7d6e7d3794dcf02.js +32 -0
  129. package/.next/static/chunks/730-ae05580815adb9b2.js +1 -0
  130. package/.next/static/chunks/736-503f37bb672c129b.js +1 -0
  131. package/.next/static/chunks/878-f08fd91a6c00d84b.js +62 -0
  132. package/.next/static/chunks/app/_global-error/page-03b9886f969453ed.js +1 -0
  133. package/.next/static/chunks/app/_not-found/page-aa469cca9dc68961.js +1 -0
  134. package/.next/static/chunks/app/adrs/page-ed0f94a800ba51c8.js +1 -0
  135. package/.next/static/chunks/app/analytics/page-2d61245dbc9dd300.js +1 -0
  136. package/.next/static/chunks/app/api/cost/export/route-03b9886f969453ed.js +1 -0
  137. package/.next/static/chunks/app/api/sse/dashboard/route-03b9886f969453ed.js +1 -0
  138. package/.next/static/chunks/app/api/sse/jobs/[id]/route-03b9886f969453ed.js +1 -0
  139. package/.next/static/chunks/app/api/webhooks/[repoId]/route-03b9886f969453ed.js +1 -0
  140. package/.next/static/chunks/app/costs/page-3eca75e55c68e079.js +1 -0
  141. package/.next/static/chunks/app/jobs/[id]/page-528826c79cab6cbb.js +1 -0
  142. package/.next/static/chunks/app/jobs/page-70bd2189d7249e3f.js +1 -0
  143. package/.next/static/chunks/app/layout-0e04e8b455f51432.js +1 -0
  144. package/.next/static/chunks/app/needs-human/page-90cc5147aadb3ebe.js +1 -0
  145. package/.next/static/chunks/app/page-a142f2aa01a429d9.js +1 -0
  146. package/.next/static/chunks/app/prompts/page-fba107f32faa6568.js +1 -0
  147. package/.next/static/chunks/app/repos/[id]/page-0da8e297142d8567.js +1 -0
  148. package/.next/static/chunks/app/settings/page-bd473b1d183c3db6.js +1 -0
  149. package/.next/static/chunks/ec24c40a-fc218f196ad8b89e.js +1 -0
  150. package/.next/static/chunks/framework-3631188fe017d11d.js +1 -0
  151. package/.next/static/chunks/main-app-2ce5d113f02aa743.js +1 -0
  152. package/.next/static/chunks/main-c73a28f721635e7a.js +5 -0
  153. package/.next/static/chunks/next/dist/client/components/builtin/app-error-03b9886f969453ed.js +1 -0
  154. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-03b9886f969453ed.js +1 -0
  155. package/.next/static/chunks/next/dist/client/components/builtin/global-error-3d82ee7a5f817d84.js +1 -0
  156. package/.next/static/chunks/next/dist/client/components/builtin/not-found-03b9886f969453ed.js +1 -0
  157. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-03b9886f969453ed.js +1 -0
  158. package/.next/static/css/96c4f935104c1f9a.css +3 -0
  159. package/README.md +11 -3
  160. package/bin/drydock.mjs +32 -0
  161. package/drizzle/0010_one_shot_costs.sql +12 -0
  162. package/drizzle/0021_robust_wind_dancer.sql +48 -0
  163. package/drizzle/0022_issue_model_override.sql +2 -0
  164. package/drizzle/meta/0021_snapshot.json +1780 -0
  165. package/drizzle/meta/_journal.json +7 -0
  166. package/package.json +2 -1
  167. package/.next/standalone/.next/server/chunks/185.js +0 -32
  168. package/.next/standalone/.next/server/chunks/235.js +0 -1
  169. package/.next/standalone/.next/server/chunks/309.js +0 -1
  170. package/.next/standalone/.next/server/chunks/350.js +0 -9
  171. package/.next/standalone/.next/server/chunks/39.js +0 -3
  172. package/.next/standalone/.next/server/chunks/447.js +0 -1
  173. package/.next/standalone/.next/server/chunks/462.js +0 -1
  174. package/.next/standalone/.next/server/chunks/507.js +0 -9
  175. package/.next/standalone/.next/server/chunks/537.js +0 -1
  176. package/.next/standalone/.next/server/chunks/579.js +0 -62
  177. package/.next/standalone/.next/server/chunks/710.js +0 -1
  178. package/.next/standalone/.next/server/chunks/777.js +0 -1
  179. package/.next/standalone/.next/server/chunks/9.js +0 -3
  180. package/.next/standalone/.next/static/chunks/0-539cfb6a78b205f0.js +0 -1
  181. package/.next/standalone/.next/static/chunks/586-4f743a204f11d627.js +0 -32
  182. package/.next/standalone/.next/static/chunks/66-a23941cbbf88d6cd.js +0 -1
  183. package/.next/standalone/.next/static/chunks/700-c294ac6d353097ec.js +0 -1
  184. package/.next/standalone/.next/static/chunks/744-6b71dbc0b45f3dee.js +0 -1
  185. package/.next/standalone/.next/static/chunks/750-1062dd98095cb147.js +0 -62
  186. package/.next/standalone/.next/static/chunks/77-ff0a9221f1786b0e.js +0 -1
  187. package/.next/standalone/.next/static/chunks/app/_global-error/page-abc1c30fe033f680.js +0 -1
  188. package/.next/standalone/.next/static/chunks/app/_not-found/page-fbc46f6809bf01bc.js +0 -1
  189. package/.next/standalone/.next/static/chunks/app/adrs/page-54954f500bc3e3c6.js +0 -1
  190. package/.next/standalone/.next/static/chunks/app/api/cost/export/route-abc1c30fe033f680.js +0 -1
  191. package/.next/standalone/.next/static/chunks/app/api/sse/dashboard/route-abc1c30fe033f680.js +0 -1
  192. package/.next/standalone/.next/static/chunks/app/api/sse/jobs/[id]/route-abc1c30fe033f680.js +0 -1
  193. package/.next/standalone/.next/static/chunks/app/api/webhooks/[repoId]/route-abc1c30fe033f680.js +0 -1
  194. package/.next/standalone/.next/static/chunks/app/costs/page-737c89e70adff98b.js +0 -1
  195. package/.next/standalone/.next/static/chunks/app/jobs/[id]/page-217e04f338b50a7e.js +0 -1
  196. package/.next/standalone/.next/static/chunks/app/layout-f6048a8c9f541e0d.js +0 -1
  197. package/.next/standalone/.next/static/chunks/app/needs-human/page-c047e3e842681979.js +0 -1
  198. package/.next/standalone/.next/static/chunks/app/page-382b7fef1f749214.js +0 -1
  199. package/.next/standalone/.next/static/chunks/app/prompts/page-9e32fb8f51e7873e.js +0 -1
  200. package/.next/standalone/.next/static/chunks/app/repos/[id]/page-55b03bdcf107eefe.js +0 -1
  201. package/.next/standalone/.next/static/chunks/app/settings/page-5b2b8683fa6afdf4.js +0 -1
  202. package/.next/standalone/.next/static/chunks/ec24c40a-96b312d151fe54b7.js +0 -1
  203. package/.next/standalone/.next/static/chunks/framework-79acb3679912dc5b.js +0 -1
  204. package/.next/standalone/.next/static/chunks/main-a0c070ad11c80668.js +0 -5
  205. package/.next/standalone/.next/static/chunks/main-app-94b142817f01731e.js +0 -1
  206. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-abc1c30fe033f680.js +0 -1
  207. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-abc1c30fe033f680.js +0 -1
  208. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-0d321d74b6d9f17c.js +0 -1
  209. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-abc1c30fe033f680.js +0 -1
  210. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-abc1c30fe033f680.js +0 -1
  211. package/.next/standalone/.next/static/css/64af283f7f467bc0.css +0 -3
  212. package/.next/standalone/.next/static/g7t6i0qpogjrDGpmNgFei/_buildManifest.js +0 -1
  213. package/.next/static/chunks/0-539cfb6a78b205f0.js +0 -1
  214. package/.next/static/chunks/586-4f743a204f11d627.js +0 -32
  215. package/.next/static/chunks/66-a23941cbbf88d6cd.js +0 -1
  216. package/.next/static/chunks/700-c294ac6d353097ec.js +0 -1
  217. package/.next/static/chunks/744-6b71dbc0b45f3dee.js +0 -1
  218. package/.next/static/chunks/750-1062dd98095cb147.js +0 -62
  219. package/.next/static/chunks/77-ff0a9221f1786b0e.js +0 -1
  220. package/.next/static/chunks/app/_global-error/page-abc1c30fe033f680.js +0 -1
  221. package/.next/static/chunks/app/_not-found/page-fbc46f6809bf01bc.js +0 -1
  222. package/.next/static/chunks/app/adrs/page-54954f500bc3e3c6.js +0 -1
  223. package/.next/static/chunks/app/api/cost/export/route-abc1c30fe033f680.js +0 -1
  224. package/.next/static/chunks/app/api/sse/dashboard/route-abc1c30fe033f680.js +0 -1
  225. package/.next/static/chunks/app/api/sse/jobs/[id]/route-abc1c30fe033f680.js +0 -1
  226. package/.next/static/chunks/app/api/webhooks/[repoId]/route-abc1c30fe033f680.js +0 -1
  227. package/.next/static/chunks/app/costs/page-737c89e70adff98b.js +0 -1
  228. package/.next/static/chunks/app/jobs/[id]/page-217e04f338b50a7e.js +0 -1
  229. package/.next/static/chunks/app/layout-f6048a8c9f541e0d.js +0 -1
  230. package/.next/static/chunks/app/needs-human/page-c047e3e842681979.js +0 -1
  231. package/.next/static/chunks/app/page-382b7fef1f749214.js +0 -1
  232. package/.next/static/chunks/app/prompts/page-9e32fb8f51e7873e.js +0 -1
  233. package/.next/static/chunks/app/repos/[id]/page-55b03bdcf107eefe.js +0 -1
  234. package/.next/static/chunks/app/settings/page-5b2b8683fa6afdf4.js +0 -1
  235. package/.next/static/chunks/ec24c40a-96b312d151fe54b7.js +0 -1
  236. package/.next/static/chunks/framework-79acb3679912dc5b.js +0 -1
  237. package/.next/static/chunks/main-a0c070ad11c80668.js +0 -5
  238. package/.next/static/chunks/main-app-94b142817f01731e.js +0 -1
  239. package/.next/static/chunks/next/dist/client/components/builtin/app-error-abc1c30fe033f680.js +0 -1
  240. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-abc1c30fe033f680.js +0 -1
  241. package/.next/static/chunks/next/dist/client/components/builtin/global-error-0d321d74b6d9f17c.js +0 -1
  242. package/.next/static/chunks/next/dist/client/components/builtin/not-found-abc1c30fe033f680.js +0 -1
  243. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-abc1c30fe033f680.js +0 -1
  244. package/.next/static/css/64af283f7f467bc0.css +0 -3
  245. package/.next/static/g7t6i0qpogjrDGpmNgFei/_buildManifest.js +0 -1
  246. /package/.next/standalone/.next/static/{g7t6i0qpogjrDGpmNgFei → ImQS3LTFl-iHwI2K1uXy0}/_ssgManifest.js +0 -0
  247. /package/.next/static/{g7t6i0qpogjrDGpmNgFei → ImQS3LTFl-iHwI2K1uXy0}/_ssgManifest.js +0 -0
@@ -1,9 +0,0 @@
1
- "use strict";exports.id=507,exports.ids=[507],exports.modules={526:(a,b,c)=>{c.d(b,{OX:()=>m,Nx:()=>p});var d=c(54452),e=c(55710),f=c(84654);let g=["resolved","failed","rejected","flagged"],h={pending:["queued","rejected","flagged"],queued:["in_progress","flagged","rejected"],in_progress:["resolved","failed","flagged","queued"],resolved:[],failed:[],rejected:[],flagged:[]};class i extends Error{constructor(a,b){super(`invalid feedback transition: ${a} -> ${b}`)}}let j=/\b(out of scope|follow[- ]?up|separate pr|different pr|unrelated|won'?t fix|nevermind|never mind|ignore this)\b/i,k=/\b(please|change|rename|fix|add|remove|delete|use|extract|refactor|move|replace|guard|handle|update|simplify|inline|should be|consider|nit)\b/i;function l(a,b,c={},g=(0,e.Lf)()){let j=g.select().from(f.reviewFeedbackItems).where((0,d.eq)(f.reviewFeedbackItems.id,a)).get();if(!j)throw Error(`review feedback item ${a} not found`);var k=j.status;if(!h[k].includes(b))throw new i(k,b);return g.update(f.reviewFeedbackItems).set({status:b,detail:c.detail??j.detail,attempts:"in_progress"===b?j.attempts+1:j.attempts,updatedAt:Math.floor(Date.now()/1e3)}).where((0,d.eq)(f.reviewFeedbackItems.id,a)).returning().get()}function m(a,b=(0,e.Lf)()){return b.select().from(f.reviewFeedbackItems).where((0,d.eq)(f.reviewFeedbackItems.jobId,a)).all()}let n={maxItemsPerSweep:3,maxAttemptsPerItem:2};async function o(a,b,c){var d;let e=(d=b.id,`<!-- drydock:review-feedback:${d} -->`),f=`${c}
2
-
3
- ${e}`,g=b.comments.find(a=>a.body.includes(e));g?await a.updateReviewComment(g.id,f):await a.replyToReviewThread(b.id,f)}async function p(a,b,c){let h=c.db??(0,e.Lf)(),i=c.budgets??n,m={processed:0,resolved:0,flagged:0,rejected:0,failed:0,skipped:0},p=await c.forge.listReviewThreads(b),q=0;for(let n of p){var r;if(n.isResolved){m.skipped++;continue}let p=n.comments[0];if(!p||!function(a,b){let c=a.toLowerCase();return!(c.endsWith("[bot]")||b.ignoredBots.some(a=>a.toLowerCase()===c))&&b.trustedReviewers.some(a=>a.toLowerCase()===c)}(p.author,c.gate)){m.skipped++;continue}let s=function(a){let b=a.trim();return j.test(b)?"out_of_scope":k.test(b)?"actionable":b.includes("?")?"question":"actionable"}(p.body),t=function(a,b=(0,e.Lf)()){let c=function(a,b,c=(0,e.Lf)()){return c.select().from(f.reviewFeedbackItems).where((0,d.Uo)((0,d.eq)(f.reviewFeedbackItems.jobId,a),(0,d.eq)(f.reviewFeedbackItems.threadId,b))).get()}(a.jobId,a.threadId,b);return c||b.insert(f.reviewFeedbackItems).values({jobId:a.jobId,prNumber:a.prNumber,threadId:a.threadId,reviewer:a.reviewer,classification:a.classification}).returning().get()}({jobId:a,prNumber:b,threadId:n.id,reviewer:p.author,classification:s},h);if(r=t.status,g.includes(r)){m.skipped++;continue}if("pending"===t.status)try{await c.forge.reactToReviewComment(p.id,"EYES")}catch{}if("pending"===t.status){if("question"===s){t=l(t.id,"flagged",{},h),await o(c.forge,n,"Drydock: this looks like a question rather than a change request, so it's flagged for a human reviewer."),m.flagged++,m.processed++;continue}if("out_of_scope"===s){t=l(t.id,"rejected",{},h),await o(c.forge,n,"Drydock: treating this as out of scope for this PR — please open a follow-up issue if it should be tracked."),await c.forge.resolveReviewThread(n.id),m.rejected++,m.processed++;continue}t=l(t.id,"queued",{},h)}if("queued"===t.status){if(q>=i.maxItemsPerSweep)continue;if(t.attempts>=i.maxAttemptsPerItem){t=l(t.id,"flagged",{},h),await o(c.forge,n,`Drydock: could not resolve this after ${t.attempts} attempt(s); flagging for a human.`),m.flagged++,m.processed++;continue}q++,t=l(t.id,"in_progress",{},h),c.includeProgressReplies&&await o(c.forge,n,"Drydock: working on this now…");let a=await c.applyFeedback(t,n);m.processed++,a.ok?(l(t.id,"resolved",{detail:a.detail},h),await o(c.forge,n,"Drydock: applied this change and pushed a commit. ✅"),await c.forge.resolveReviewThread(n.id),m.resolved++):t.attempts>=i.maxAttemptsPerItem?(l(t.id,"failed",{detail:a.detail},h),await o(c.forge,n,`Drydock: could not apply this automatically (${a.detail??"no change produced"}); flagging for a human.`),m.failed++):l(t.id,"queued",{detail:a.detail},h)}}return m}},2373:(a,b,c)=>{c.d(b,{Pe:()=>g,eT:()=>h});var d=c(54452),e=c(55710),f=c(84654);function g(a,b=(0,e.Lf)(),c){let h=[];return a&&h.push((0,d.eq)(f.adrs.status,a)),void 0!==c&&h.push((0,d.eq)(f.adrs.repoId,c)),(h.length?b.select().from(f.adrs).where((0,d.Uo)(...h)).all():b.select().from(f.adrs).all()).sort((a,b)=>b.createdAt-a.createdAt)}function h(a,b,c=(0,e.Lf)()){let g=c.update(f.adrs).set({status:b}).where((0,d.eq)(f.adrs.id,a)).returning().get();if(!g)throw Error(`adr ${a} not found`);return g}},34321:(a,b,c)=>{c.d(b,{F1:()=>m,yO:()=>o,Xm:()=>k,yx:()=>n,AI:()=>p});var d=c(54452),e=c(74366),f=c(22579),g=c(55710),h=c(84654),i=c(53944);let j=["$ISSUE_NUM","$BRANCH","$REPO_NAME","$CI_LOG"];function k(a,b){let c={$ISSUE_NUM:void 0!==b.ISSUE_NUM?String(b.ISSUE_NUM):"$ISSUE_NUM",$BRANCH:b.BRANCH??"$BRANCH",$REPO_NAME:b.REPO_NAME??"$REPO_NAME",$CI_LOG:b.CI_LOG??"$CI_LOG"},d=a;for(let a of[...j].sort((a,b)=>b.length-a.length))d=d.split(a).join(c[a]??a);return d}let l=f.Ik({repoId:f.ai().int().positive(),name:f.Yj().min(1),content:f.Yj()});function m(a,b,c=(0,g.Lf)()){return c.select().from(h.promptTemplates).where((0,d.Uo)((0,d.eq)(h.promptTemplates.repoId,a),(0,d.eq)(h.promptTemplates.name,b))).orderBy((0,e.i)(h.promptTemplates.version)).get()}function n(a,b,c=(0,g.Lf)()){return m(a,b,c)?.content??i.E[b]??""}function o(a,b,c=(0,g.Lf)()){return c.select().from(h.promptTemplates).where((0,d.Uo)((0,d.eq)(h.promptTemplates.repoId,a),(0,d.eq)(h.promptTemplates.name,b))).orderBy((0,e.i)(h.promptTemplates.version)).all()}function p(a,b=(0,g.Lf)()){let c=l.parse(a),e=m(c.repoId,c.name,b),f=(e?.version??0)+1,i=b.insert(h.promptTemplates).values({repoId:c.repoId,name:c.name,content:c.content,version:f,updatedAt:Math.floor(Date.now()/1e3)}).returning().get();for(let a of o(c.repoId,c.name,b).slice(20))b.delete(h.promptTemplates).where((0,d.eq)(h.promptTemplates.id,a.id)).run();return i}},39829:(a,b,c)=>{c.d(b,{T9:()=>g});var d=c(17283),e=c(6384),f=c(94448);function g(a){return(0,f.ll)`max(${a})`.mapWith((0,e.is)(a,d.V)?a:String)}},53944:(a,b,c)=>{c.d(b,{E:()=>e,_:()=>d});let d={main:"default",ciFix:"ci-fix"},e={default:'You are working on GitHub issue #$ISSUE_NUM in the repository "$REPO_NAME".\nYou are on branch "$BRANCH". Implement the change the issue asks for.\nKeep the change focused and commit-ready. Do not push or open a PR yourself.',"ci-fix":"CI failed. Fix the failure and keep changes minimal.\n\nFailed CI log:\n$CI_LOG"}},61195:(a,b,c)=>{let d,e,f;c.r(b),c.d(b,{clearAbort:()=>bu,gracefulShutdown:()=>bv,registerAbort:()=>bt,startOrchestrator:()=>bw});var g=c(54452),h=c(55710),i=c(94448),j=c(51605),k=c(84654),l=c(96684),m=c(15629),n=c(77598),o=c(48161),p=c(66952);let q=()=>Math.floor(Date.now()/1e3);function r(){return d||(d=`${(0,o.hostname)()}#${process.pid}`),d}let s=["ci_running","ci_failed","retrying"];var t=c(35743),u=c(40129),v=c(89508),w=c(57846),x=c(20210);let y=["blocked","wontfix","question","needs-human","needs-discussion"],z=[{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 A(a){let b=[],c=a.labels.map(a=>a.toLowerCase()).find(a=>y.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 z)c.test(d)&&b.push(`${a} detected`);return b.length>0?{decision:"needs_review",reasons:b}:{decision:"approved",reasons:[]}}var B=c(69914),C=c(38529);let D=[{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 E(a,b,c,d){d.update(k.issues).set({triageHash:c,triagedAt:Math.floor(Date.now()/1e3)}).where((0,g.Uo)((0,g.eq)(k.issues.repoId,a),(0,g.eq)(k.issues.number,b))).run()}async function F(a,b,c,d=(0,h.Lf)()){let e=(0,C.A)(a),f=function(a){let b=JSON.stringify([a.title,a.labels.map(a=>a.name).sort()]),c=5381;for(let a=0;a<b.length;a++)c=(c<<5)+c+b.charCodeAt(a)|0;return(c>>>0).toString(16)}(c),i=d.select().from(k.issues).where((0,g.Uo)((0,g.eq)(k.issues.repoId,a.id),(0,g.eq)(k.issues.number,c.number))).get();if(i?.triagedAt&&i.triageHash===f)return{number:c.number,applied:[],reasons:[],skipped:"unchanged"};if(!(0,C.i)(e,c.authorAssociation))return E(a.id,c.number,f,d),{number:c.number,applied:[],reasons:["author not approved"],skipped:"author"};let j=await b.viewIssue(c.number),l=A({number:j.number,title:j.title,body:j.body,labels:j.labels}),m=[],n=function(a,b){let c=new Set(b),d=`${a.title}
5
- ${a.body}`,e=[];for(let{label:a,re:b}of D)c.has(a)&&b.test(d)&&!e.includes(a)&&e.push(a);return e}(j,e.autoLabelWhitelist);for(let a of n)m.push(`classified as ${a}`);if("approved"===l.decision){let a=e.readyLabels[0];a&&(n.push(a),m.push("safe and well-specified"))}else{let a=e.blockingLabels[0];a&&(n.push(a),m.push(...l.reasons.length?l.reasons:["flagged for human review"]))}let o=new Set([...e.autoLabelWhitelist,...e.readyLabels,...e.blockingLabels]),p=new Set(j.labels),q=[...new Set(n)].filter(a=>o.has(a)&&!p.has(a));if(q.length>0){for(let a of q)await b.ensureLabel(a);await b.addLabels(c.number,q);let e=q.map(a=>`\`${a}\``).join(", ");await b.commentIssue(c.number,`auto-triage: applied ${e} — reasons: ${m.join("; ")}.`),function(a,b,c,d){let e,f=d.select().from(k.issues).where((0,g.Uo)((0,g.eq)(k.issues.repoId,a),(0,g.eq)(k.issues.number,b))).get();if(!f)return;try{let a=JSON.parse(f.labels);e=Array.isArray(a)?a:[]}catch{e=[]}let h=[...e];for(let a of c)h.includes(a)||h.push(a);d.update(k.issues).set({labels:JSON.stringify(h)}).where((0,g.eq)(k.issues.id,f.id)).run()}(a.id,c.number,q,d)}return E(a.id,c.number,f,d),{number:c.number,applied:q,reasons:m}}async function G(a,b,c,d=(0,h.Lf)()){let e=[];for(let f of c)try{e.push(await F(a,b,f,d))}catch(b){console.error(`[triage] issue #${f.number} failed for ${a.name}`,b)}return e}var H=c(36212),I=c(68434),J=c(76760);function K(){return process.env.DRYDOCK_HOME??(0,J.join)((0,o.homedir)(),".drydock")}function L(a){return a.replace(/[^a-zA-Z0-9._-]/g,"-")}function M(a){return(0,J.join)(K(),"worktrees",L(a))}class N extends Error{}class O extends N{constructor(){super("nothing to commit")}}class P{constructor(a=I.S){this.run=a,this.locks=new Map}withRepoLock(a,b){let c=(this.locks.get(a)??Promise.resolve()).then(b,b);return this.locks.set(a,c.then(()=>void 0,()=>void 0)),c}async git(a,b){let c=await this.run("git",a,b);if(0!==c.exitCode)throw new N(c.stderr.trim()||`git ${a[0]} failed`);return c.stdout}async prepare(a,b,c=0){let d=`drydock/issue-${c}-job-${b}`,e=(0,J.join)(M(a.name),`job-${b}`);return await this.withRepoLock(a.path,()=>this.git(["-C",a.path,"worktree","add","-b",d,e,a.defaultBranch])),{path:e,branch:d}}async prepareForBranch(a,b,c){let d=(0,J.join)(M(a.name),`fb-${L(c)}`);return await this.withRepoLock(a.path,async()=>{await this.git(["-C",a.path,"fetch","origin",b]),await this.git(["-C",a.path,"worktree","add",d,b])}),{path:d,branch:b}}async prepareForNewBranch(a,b,c){let d=(0,J.join)(M(a.name),`dh-${L(c)}`);return await this.withRepoLock(a.path,()=>this.git(["-C",a.path,"worktree","add","-b",b,d,a.defaultBranch])),{path:d,branch:b}}async commitAndPush(a,b){if(await this.git(["add","-A"],a.path),""===(await this.git(["status","--porcelain"],a.path)).trim())throw new O;await this.git(["commit","-m",b],a.path),await this.git(["push","-u","origin",a.branch],a.path)}async remove(a,b){await this.withRepoLock(b,async()=>{await this.git(["-C",b,"worktree","remove","--force",a.path]),await this.git(["-C",b,"worktree","prune"])})}}var Q=c(31421);let R=(a,b,c,d)=>{let e=(0,Q.spawn)(a,b,{cwd:c,env:process.env});return e.stdout?.setEncoding("utf8"),e.stderr?.setEncoding("utf8"),e.stdout?.on("data",a=>d.onStdout(a)),e.stderr?.on("data",a=>d.onStderr?.(a)),{done:new Promise(a=>{e.on("close",b=>a(b??0)),e.on("error",()=>a(1))}),abort:(a=5e3)=>{e.kill("SIGTERM");let b=setTimeout(()=>e.kill("SIGKILL"),a);e.on("close",()=>clearTimeout(b))}}};var S=c(53944),T=c(34321),U=c(63480);class V{constructor(a=(0,h.Lf)()){this.db=a,this.subs=new Map}subscribe(a,b){let c=this.subs.get(a);c||(c=new Set,this.subs.set(a,c)),c.add(b)}unsubscribe(a,b){let c=this.subs.get(a);c&&(c.delete(b),0===c.size&&this.subs.delete(a))}subscriberCount(a){return this.subs.get(a)?.size??0}publish(a,b){let c=(0,U.f)(JSON.stringify(b.payload??{})),d=JSON.parse(c),e=this.db.insert(k.jobEvents).values({jobId:a,type:b.type,payload:c}).returning().get(),f=this.subs.get(a);if(f)for(let a of f)a.send({id:e.id,type:e.type,payload:d});return e}replay(a,b=200){return this.db.select().from(k.jobEvents).where((0,g.eq)(k.jobEvents.jobId,a)).orderBy(k.jobEvents.ts,k.jobEvents.id).all().slice(-b)}}function W(){return e||(e=new V),e}function X(a,b){let c=()=>{},d=!1;return{tripped:new Promise(a=>{c=a}),observe(){!d&&b()>=a&&(d=!0,c())}}}function Y(a,b={}){let{timeoutMs:c,costTripped:d}=b,e=!!c&&c>0;return e||d?new Promise(b=>{let f,g=!1,h=a=>{g||(g=!0,b(a))};e&&(f=setTimeout(()=>{a.abort(),h({exitCode:-1,timedOut:!0,costExceeded:!1})},c),f.unref?.()),d?.then(()=>{a.abort(),h({exitCode:-2,timedOut:!1,costExceeded:!0})}),a.done.then(a=>{f&&clearTimeout(f),h({exitCode:a,timedOut:!1,costExceeded:!1})})}):a.done.then(a=>({exitCode:a,timedOut:!1,costExceeded:!1}))}function Z(a){return{chunks:a.chunks,costUsd:a.costUsd}}async function $(a,b,c,d={}){let e=d.db??(0,h.Lf)(),f=d.runner??R,i=d.broker??W(),j=d.provider??(0,t.X$)(a.agent),l=d.command??j.defaultCommand,n=a.model??j.defaultModel,o=j.createParser();o.onParseError=b=>i.publish(a.id,{type:"parse_error",payload:b}),"working"!==a.status?(0,m.dk)(a.id,"working",{model:n},e):e.update(k.jobs).set({model:n}).where((0,g.eq)(k.jobs.id,a.id)).run();let p=d.costCapUsd&&d.costCapUsd>0?X(d.costCapUsd,()=>o.costUsd>0?o.costUsd:j.estimateCost(n,o.totalInputTokens,o.totalOutputTokens)):void 0,q=f(l,j.buildStartArgs({prompt:b,model:n,maxTurns:a.maxTurns}),c,{onStdout:b=>{for(let c of o.push(b))i.publish(a.id,{type:c.type,payload:Z(c)});p?.observe()},onStderr:b=>i.publish(a.id,{type:"error",payload:{stderr:b}})});bt(a.id,q.abort);let{exitCode:r,timedOut:s,costExceeded:u}=await Y(q,{timeoutMs:d.timeoutMs,costTripped:p?.tripped});for(let b of(bu(a.id),s&&i.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${d.timeoutMs}ms`}}),u&&i.publish(a.id,{type:"error",payload:{stderr:`session aborted: per-job cost limit of $${d.costCapUsd} reached`}}),o.flush()))i.publish(a.id,{type:b.type,payload:Z(b)});let v=o.costUsd>0?o.costUsd:j.estimateCost(n,o.totalInputTokens,o.totalOutputTokens);return e.update(k.jobs).set({sessionId:o.sessionId,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,costUsd:v}).where((0,g.eq)(k.jobs.id,a.id)).run(),{exitCode:r,sessionId:o.sessionId,costUsd:v,inputTokens:o.totalInputTokens,outputTokens:o.totalOutputTokens,timedOut:s,costExceeded:u}}async function _(a,b,c,d,e={}){let f=e.db??(0,h.Lf)(),i=e.runner??R,j=e.broker??W(),l=e.provider??(0,t.X$)(a.agent),m=e.command??l.defaultCommand,n=a.model??l.resumeModel,o=l.createParser();o.onParseError=b=>j.publish(a.id,{type:"parse_error",payload:b});let p=(0,T.Xm)((0,T.yx)(a.repoId,S._.ciFix,f),{CI_LOG:c}),q=e.costCapUsd&&e.costCapUsd>0?X(e.costCapUsd,()=>o.costUsd>0?o.costUsd:l.estimateCost(n,o.totalInputTokens,o.totalOutputTokens)):void 0,r=i(m,(l.supportsResume?l.buildResumeArgs({prompt:p,sessionId:b,model:l.resumeModel,maxTurns:l.resumeMaxTurns}):null)??l.buildStartArgs({prompt:p,model:l.resumeModel,maxTurns:l.resumeMaxTurns}),d,{onStdout:b=>{for(let c of o.push(b))j.publish(a.id,{type:c.type,payload:{chunks:c.chunks}});q?.observe()},onStderr:b=>j.publish(a.id,{type:"error",payload:{stderr:b}})});bt(a.id,r.abort);let{exitCode:s,timedOut:u,costExceeded:v}=await Y(r,{timeoutMs:e.timeoutMs,costTripped:q?.tripped});for(let b of(bu(a.id),u&&j.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${e.timeoutMs}ms`}}),v&&j.publish(a.id,{type:"error",payload:{stderr:`session aborted: per-job cost limit of $${e.costCapUsd} reached`}}),o.flush()))j.publish(a.id,{type:b.type,payload:{chunks:b.chunks}});let w=o.costUsd>0?o.costUsd:l.estimateCost(n,o.totalInputTokens,o.totalOutputTokens),x=f.select().from(k.jobs).where((0,g.eq)(k.jobs.id,a.id)).get();return f.update(k.jobs).set({sessionId:o.sessionId??b,totalInputTokens:(x?.totalInputTokens??0)+o.totalInputTokens,totalOutputTokens:(x?.totalOutputTokens??0)+o.totalOutputTokens,costUsd:(x?.costUsd??0)+w}).where((0,g.eq)(k.jobs.id,a.id)).run(),{exitCode:s,sessionId:o.sessionId??b,costUsd:w,inputTokens:o.totalInputTokens,outputTokens:o.totalOutputTokens,timedOut:u,costExceeded:v}}var aa=c(73024);let ab=["vercel","railway"];function ac(a){return a.exists??aa.existsSync}class ad{async detect(a){let b=ac(a);return b((0,J.join)(a.cwd,"railway.json"))||b((0,J.join)(a.cwd,"railway.toml"))||b((0,J.join)(a.cwd,".railway"))}async getStatus(a){let b=await a.run("railway",["status"],a.cwd);return function(a,b){if(0!==b)return"not_found";let c=a.toLowerCase();return/\bfailed\b|\bcrashed\b|\berror\b/.test(c)?"error":/\bsuccess\b|\bdeployed\b|\bready\b/.test(c)?"ready":/\bbuilding\b/.test(c)?"building":/\bdeploying\b|\binitializing\b|\bqueued\b/.test(c)?"deploying":"not_found"}(b.stdout,b.exitCode)}async getLogs(a){let b=await a.run("railway",["logs"],a.cwd);return[b.stdout,b.stderr].filter(Boolean).join("\n").trim()}constructor(){this.id="railway",this.label="Railway"}}class ae{async detect(a){let b=ac(a);return b((0,J.join)(a.cwd,"vercel.json"))||b((0,J.join)(a.cwd,".vercel"))}async getStatus(a){let b=await a.run("vercel",["list"],a.cwd);return function(a,b,c){let d;if(0!==b)return"not_found";let e=a.split("\n").map(a=>a.trim()).filter(Boolean),f=c?c.slice(0,7):null;if(f){if(!(d=e.find(a=>a.includes(f))))return"not_found"}else d=e.find(a=>/●|ready|error|building|queued|initializing/i.test(a));let g=(d??a).toLowerCase();return/\berror\b|\bfailed\b|canceled/.test(g)?"error":/\bready\b/.test(g)?"ready":/\bbuilding\b/.test(g)?"building":/\bqueued\b|initializing|deploying/.test(g)?"deploying":"not_found"}(b.stdout,b.exitCode,a.ref)}async getLogs(a){let b=a.ref?["inspect","--logs",a.ref]:["logs"],c=await a.run("vercel",b,a.cwd);return[c.stdout,c.stderr].filter(Boolean).join("\n").trim()}constructor(){this.id="vercel",this.label="Vercel"}}let af=[new ae,new ad];async function ag(a,b){if(b)return ab.includes(b)?function(a){let b=af.find(b=>b.id===a);if(!b)throw Error(`unsupported deployment platform: ${a}`);return b}(b):null;for(let b of af)if(await b.detect(a))return b;return null}let ah={monitoring:["healthy","failed","escalated"],failed:["repairing","escalated"],repairing:["repaired","escalated"],healthy:[],repaired:[],escalated:[]};class ai extends Error{constructor(a,b){super(`invalid deployment-healing transition: ${a} -> ${b}`)}}let aj={initialDelayMs:6e4,intervalMs:6e4,timeoutMs:12e5,monitorWindowMs:36e5,maxLogLines:200};function ak(){return Math.floor(Date.now()/1e3)}function al(a,b,c={},d=(0,h.Lf)()){let e=function(a,b=(0,h.Lf)()){return b.select().from(k.deploymentHealingSessions).where((0,g.eq)(k.deploymentHealingSessions.id,a)).get()}(a,d);if(!e)throw Error(`deployment healing session ${a} not found`);var f=e.status;if(!ah[f].includes(b))throw new ai(f,b);return d.update(k.deploymentHealingSessions).set({status:b,updatedAt:ak(),...c}).where((0,g.eq)(k.deploymentHealingSessions.id,a)).returning().get()}function am(a,b){return{cwd:a.path,ref:b,run:I.S}}async function an(a={}){let b=a.db??(0,h.Lf)(),c=a.now??Date.now,d=a.budgets??aj;for(let e of(0,u.uP)(b))if((0,C.A)(e).autoHealDeployments)try{let f=a.forgeFor?.(e)??(0,v.Ie)(e),g=a.adapterFor??(a=>ag(am(a,null),a.deploymentPlatform)),h=await g(e);if(!h)continue;let i=a.openFixPr??aq;await ao(e,f,h,{db:b,now:c,budgets:d,openFixPr:i})}catch(a){console.error(`[deploy-heal] sweep failed for ${e.name}`,a)}}async function ao(a,b,c,d){let{db:e,now:f,budgets:i}=d,j=(0,m.N6)(a.id,e);for(let a of j){let d;if("merged"!==a.status||null==a.prNumber)continue;let j=(a.finishedAt??a.createdAt)*1e3;if(!(f()-j>i.monitorWindowMs)){try{d=await b.prHeadSha(a.prNumber)}catch(b){console.error(`[deploy-heal] head sha lookup failed for job ${a.id}`,b);continue}!function(a,b,c=(0,h.Lf)()){return c.select().from(k.deploymentHealingSessions).where((0,g.eq)(k.deploymentHealingSessions.jobId,a)).all().some(a=>a.commitSha===b)}(a.id,d,e)&&function(a,b,c,d,e=(0,h.Lf)()){e.select().from(k.deploymentHealingSessions).where((0,g.eq)(k.deploymentHealingSessions.jobId,a)).all().find(a=>a.commitSha===d)||e.insert(k.deploymentHealingSessions).values({jobId:a,prNumber:b,platform:c,commitSha:d}).returning().get()}(a.id,a.prNumber,c.id,d,e)}}for(let b of e.select().from(k.deploymentHealingSessions).all().filter(a=>"monitoring"===a.status)){let e=j.find(a=>a.id===b.jobId);if(e)try{await ap(a,e,c,b,d)}catch(c){console.error(`[deploy-heal] session ${b.id} failed for ${a.name}`,c)}}}async function ap(a,b,c,d,e){var f,i;let j,{db:l,now:m,budgets:n}=e,o=(j=(f={createdAt:1e3*d.createdAt,lastPolledAt:1e3*d.updatedAt,now:m(),initialDelayMs:n.initialDelayMs,intervalMs:n.intervalMs,timeoutMs:n.timeoutMs}).now-f.createdAt)<f.initialDelayMs?"wait":j>=f.timeoutMs?"timeout":f.lastPolledAt<=f.createdAt||f.now-f.lastPolledAt>=f.intervalMs?"poll":"wait";if("wait"===o)return;if("timeout"===o)return void al(d.id,"escalated",{},l);let p=am(a,d.commitSha),q="ready"===(i=await c.getStatus(p))?"ready":"error"===i?"error":"pending";if("ready"===q)return void al(d.id,"healthy",{},l);if("pending"===q)return void function(a,b=(0,h.Lf)()){b.update(k.deploymentHealingSessions).set({updatedAt:ak()}).where((0,g.eq)(k.deploymentHealingSessions.id,a)).run()}(d.id,l);let r=(await c.getLogs(p).catch(()=>"")).split("\n").slice(-n.maxLogLines).join("\n").trim(),s=al(d.id,"failed",{logsExcerpt:r||null},l);al(d.id,"repairing",{},l);try{let c=await e.openFixPr(a,b,s,r);al(d.id,"repaired",{followupPrNumber:c},l)}catch(a){console.error(`[deploy-heal] fix PR failed for session ${d.id}`,a),al(d.id,"escalated",{},l)}}async function aq(a,b,c,d){let e=(0,h.Lf)(),f=(0,t.X$)(b.agent),g=(0,H.m)(f,e),i=new P,j=c.commitSha.slice(0,7),k=`drydock/deploy-fix-${b.id}-${j}`,l=(0,v.Ie)(a),m=await i.prepareForNewBranch(a,k,`${b.id}-${j}`);try{let h=await $(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"),m.path,{db:e,provider:f,command:g});if(0!==h.exitCode)throw Error(`${f.label} exited non-zero`);return await i.commitAndPush(m,`Fix failed ${c.platform} deployment for PR #${c.prNumber}`),l.createPr({head:k,base:a.defaultBranch,title:`Fix failed ${c.platform} deployment (PR #${c.prNumber})`,body:`The deployment for #${c.prNumber} (commit ${j}) failed. This PR addresses the deployment failure.`})}finally{try{await i.remove(m,a.path)}catch(a){console.error(`[deploy-heal] worktree cleanup failed for job ${b.id}`,a)}}}var ar=c(74058),as=c(77173),at=c(35078);async function au(a={}){let b=a.db??(0,h.Lf)();if(!(0,j.mt)(b).releaseManagementEnabled)return;let c=a.now??Date.now,d=a.windowMs??36e5,e=a.notify??((a,c)=>(0,ar.JD)(a,c,b));for(let f of(0,u.uP)(b))if((0,C.A)(f).releaseEnabled)try{let g=a.forgeFor?.(f)??(0,v.Ie)(f),h="function"==typeof g.listReleases&&"function"==typeof g.listMergedPrs&&"function"==typeof g.createRelease?g:null;if(!h)continue;let i=a.generatorFor?.(f)??function(a,b){let c=(0,t.X$)(a.agent),d=(0,H.m)(c,b),e=a.defaultModel;return a=>(0,at.NF)({provider:c,command:d,model:e},b=>b(a))}(f,b);await av(f,g,h,i,{db:b,now:c,windowMs:d,notify:e})}catch(a){console.error(`[release] sweep failed for ${f.name}`,a)}}async function av(a,b,c,d,e){let{db:f,now:g,windowMs:h}=e;for(let i of(0,m.N6)(a.id,f)){if("merged"!==i.status||null==i.prNumber)continue;let f=(i.finishedAt??i.createdAt)*1e3;if(!(g()-f>h))try{await aw(a,i,b,c,d,e)}catch(b){console.error(`[release] job ${i.id} failed for ${a.name}`,b)}}}async function aw(a,b,c,d,e,f){let{db:g,notify:h}=f,i=b.prNumber,j=await c.prHeadSha(i),k=(0,as.v0)({repoId:a.id,mode:"auto",triggerPrNumber:i,triggerSha:j},g);if("detected"!==k.status)return;let l=await (0,at.Dl)(k.id,{repo:a,forge:d,db:g,generate:e});"published"===l.status&&l.tag&&await h("release_published",`🚀 Released ${a.name} ${l.tag}.`)}var ax=c(526);let ay=new Set(["ci_running","ci_failed","retrying","needs_human"]);function az(a){return"function"==typeof a.listReviewThreads&&"function"==typeof a.replyToReviewThread&&"function"==typeof a.updateReviewComment&&"function"==typeof a.resolveReviewThread&&"function"==typeof a.reactToReviewComment}async function aA(a={}){let b=a.db??(0,h.Lf)(),c=a.processJob??aB;for(let d of(0,u.uP)(b))if((0,C.A)(d).autoReviewFeedback)try{let e=a.forgeFor?.(d)??(0,v.Ie)(d);if(!az(e))continue;for(let a of(0,m.N6)(d.id,b).filter(a=>null!=a.prNumber&&ay.has(a.status)))try{await c(d,a,e)}catch(b){console.error(`[review-feedback] job ${a.id} failed for ${d.name}`,b)}}catch(a){console.error(`[review-feedback] sweep failed for ${d.name}`,a)}}async function aB(a,b,c){var d;if(!az(c)||null==b.prNumber)return;let e=(0,h.Lf)(),f=(0,C.A)(a),g=(0,t.X$)(b.agent),i=(0,H.m)(g,e),j=(d={repo:a,job:b,worktrees:new P,runSession:(a,b,c)=>$(a,b,c,{db:e,provider:g,command:i}).then(a=>({exitCode:a.exitCode}))},async(a,b)=>{if(!d.job.branch)return{ok:!1,detail:"job has no branch"};let c=await d.worktrees.prepareForBranch(d.repo,d.job.branch,`${d.job.id}-${b.id}`);try{let a,e,f=await d.runSession(d.job,(a=b.comments[0],e=b.path?`${b.path}${b.line?`:${b.line}`:""}`:"this PR",[`A reviewer left this comment on ${e} of the current pull request:`,"",(a?.body??"").trim(),"\nMake only the change this comment asks for. Do not address anything else.\nWhen done, ensure the working tree builds and tests pass, then stop — the\ncommit and push are handled for you."].join("\n")),c.path);if(0!==f.exitCode)return{ok:!1,detail:"agent exited non-zero"};try{await d.worktrees.commitAndPush(c,`Address review feedback on ${b.path??"PR"}`)}catch{return{ok:!1,detail:"no change produced"}}return{ok:!0}}finally{try{await d.worktrees.remove(c,d.repo.path)}catch(a){console.error(`[review-feedback] worktree cleanup failed for job ${d.job.id}`,a)}}});await (0,ax.Nx)(b.id,b.prNumber,{forge:c,db:e,gate:{trustedReviewers:f.trustedReviewers,ignoredBots:f.ignoredBots},includeProgressReplies:f.includeProgressReplies,applyFeedback:j})}var aC=c(2373),aD=c(71218),aE=c(37567);let aF=new Set(["CANCELLED","ACTION_REQUIRED"]),aG=new Set(["TIMED_OUT"]),aH=/\b(ai|claude|codex|copilot|gpt|llm)\b.*\breview\b|\breview\b.*\b(ai|bot)\b/i,aI=/\bcancell?ed\b|\bsecret\b|\b(rate.?limit|secondary rate)\b|\b5\d\d\b|\b(401|403|unauthorized|forbidden)\b|service unavailable/i,aJ=/\b(time(d)?.?out|timeout|intermittent|flak(y|e)|econnreset|etimedout|esockettimedout)\b/i,aK=/\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,aL=[{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 aM(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 aL)if(c.test(a))return b;return"unknown"}(a);if("unknown"===d)return{kind:d,evidence:c.slice(-b).join("\n")};let e=aL.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 aN={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."},aO=["healed","blocked","escalated","superseded"],aP=["blocked","escalated","superseded"],aQ={triaging:["awaiting_slot",...aP],awaiting_slot:["repairing",...aP],repairing:["awaiting_ci",...aP],awaiting_ci:["verifying",...aP],verifying:["healed","cooldown",...aP],cooldown:["awaiting_slot",...aP],healed:[],blocked:[],escalated:[],superseded:[]};class aR extends Error{constructor(a,b){super(`invalid healing transition: ${a} -> ${b}`)}}let aS={maxHealAttemptsPerSession:3,maxHealAttemptsPerFingerprint:2,cooldownMs:9e5,maxConcurrentHealingRuns:1,maxEvidenceLines:200},aT=["repairing","awaiting_ci","verifying"];function aU(a,b=(0,h.Lf)()){return b.select().from(k.healingSessions).where((0,g.eq)(k.healingSessions.id,a)).get()}function aV(a,b,c=(0,h.Lf)()){let d=aU(a,c);if(!d)throw Error(`healing session ${a} not found`);var e=d.status;if(!aQ[e].includes(b))throw new aR(e,b);return c.update(k.healingSessions).set({status:b,updatedAt:Math.floor(Date.now()/1e3)}).where((0,g.eq)(k.healingSessions.id,a)).returning().get()}function aW(a,b,c=(0,h.Lf)()){c.update(k.healingAttempts).set({status:b.status,afterSha:b.afterSha??null}).where((0,g.eq)(k.healingAttempts.id,a)).run()}let aX=new Set(["FAILURE","ERROR","CANCELLED","TIMED_OUT","ACTION_REQUIRED"]),aY=new Set(["PENDING","QUEUED","IN_PROGRESS","WAITING","REQUESTED"]);function aZ(a){return 0===a.length?"pending":a.some(a=>aX.has(a.state.toUpperCase()))?"failed":a.some(a=>aY.has(a.state.toUpperCase()))?"pending":"passed"}let a$=a=>new Promise(b=>setTimeout(b,a));async function a_(a,b,c,d,e){await d.gh.commentIssue(a.issueNumber,`${c} Handing over to a human.`);let f=await d.gh.createIssue(`Follow-up: CI keeps failing for issue #${a.issueNumber}`,`Job ${a.id} could not be auto-healed on PR #${b}. ${c}`);return e.insert(k.followupIssues).values({jobId:a.id,ghIssueNumber:f,title:`Follow-up for #${a.issueNumber}`}).run(),(0,m.dk)(a.id,"needs_human",{errorMessage:c.slice(0,500)},e)}async function a0(a,b,c,d,e){let f=Math.round(c/6e4),g=`CI did not complete in time (checks stayed pending for over ${f} min on PR #${b}).`;return await d.gh.commentIssue(a.issueNumber,`${g} Handing over to a human.`),(0,m.yM)(a.id,"status",{reason:"ci wait budget exceeded",prNumber:b},e),(0,m.dk)(a.id,"needs_human",{errorMessage:g.slice(0,500)},e)}async function a1(a,b,c){if(c.autoHeal)return a2(a,b,c,c.autoHeal);let d=c.db??(0,h.Lf)(),e=c.sleep??a$,f=c.pollMs??3e4,g=c.maxPolls??1/0,i=c.ciWaitMs??1/0,j=c.now??Date.now,k=j()+i,l=a,n=0;for(;n<g;){n++;let a=aZ(await c.gh.prChecks(b));if("pending"===a){if(j()>=k)return a0(l,b,i,c,d);await e(f);continue}if("passed"===a)return await c.gh.mergePr(b),(0,m.dk)(l.id,"merged",{prNumber:b},d);if((l=(0,m.dk)(l.id,"ci_failed",{prNumber:b},d)).ciRetryCount>=3)return a_(l,b,"CI failed 3 times.",c,d);if(!l.sessionId)return(0,m.yM)(l.id,"status",{reason:"missing session id, cannot resume for CI fix"},d),(0,m.dk)(l.id,"needs_human",{errorMessage:"CI failed but no session id to resume"},d);let g=l.sessionId;l=(0,m.dk)(l.id,"retrying",{ciRetryCount:l.ciRetryCount+1},d);let{evidence:h}=aM(await c.gh.failedRunLog(b),200);await c.resumeSession(l,g,h),l=(0,m.dk)(l.id,"ci_running",{},d)}return(0,m.ax)(l.id,d)??l}async function a2(a,b,c,d){let e,f=c.db??(0,h.Lf)(),i=c.sleep??a$,j=c.pollMs??3e4,l=c.maxPolls??1/0,n=d.budgets??aS,o=c.now??d.now??Date.now,p=c.ciWaitMs??1/0,q=o()+p,r=a,s=0;for(;s<l;){s++;let a=await c.gh.prChecks(b),l=aZ(a);if("pending"===l){if(o()>=q)return a0(r,b,p,c,f);await i(j);continue}if("passed"===l){if(e){let a=await d.headSha(b);aW(e.attemptId,{status:"healed",afterSha:a},f),aV(e.sessionId,"verifying",f),aV(e.sessionId,"healed",f)}return await c.gh.mergePr(b),(0,m.dk)(r.id,"merged",{prNumber:b},f)}let u=a.filter(a=>aX.has(a.state.toUpperCase())),v=await d.headSha(b);if(e){var t;let a=(t={beforeSha:e.beforeSha,afterSha:v,beforeFailingCount:e.beforeFailing,afterFailingCount:u.length}).afterSha===t.beforeSha?{verdict:"rejected",reason:"no change pushed (no new commit)"}:t.afterFailingCount>=t.beforeFailingCount?{verdict:"rejected",reason:"no measurable improvement in failing checks"}:0===t.afterFailingCount?{verdict:"healed",reason:"all checks green"}:{verdict:"progressed",reason:"fewer checks failing"};aW(e.attemptId,{status:a.verdict,afterSha:v},f);let d=e.sessionId;if(e=void 0,"rejected"===a.verdict)return aV(d,"verifying",f),aV(d,"escalated",f),a_(r,b,`CI auto-heal: ${a.reason}.`,c,f)}let w=function(a,b,c,d=(0,h.Lf)()){let e=d.select().from(k.healingSessions).where((0,g.eq)(k.healingSessions.prNumber,b)).all();for(let a of e){var f;a.headSha===c||(f=a.status,aO.includes(f))||aV(a.id,"superseded",d)}let i=e.find(a=>a.headSha===c);return i?aU(i.id,d)??i:d.insert(k.healingSessions).values({jobId:a,prNumber:b,headSha:c}).returning().get()}(r.id,b,v,f),x=await c.gh.failedRunLog(b),y=u.map(a=>(function(a,b,c=""){var d,e;let f,g,h=(d=b.name,e=b.state??"",f=e.toUpperCase(),g=`${d}
6
- ${c}`,aF.has(f)||aH.test(d)||aI.test(g)?"blocked_external":aG.has(f)||aJ.test(g)?"flaky_or_ambiguous":aK.test(g)?"healable_in_branch":"unknown");return{checkName:b.name,category:h,fingerprint:`${a}:${h}:${b.name.trim().toLowerCase().replace(/\s+/g," ")}`}})(d.provider,a,x)),z=function(a,b=(0,h.Lf)()){return b.select().from(k.healingAttempts).where((0,g.eq)(k.healingAttempts.sessionId,a)).all()}(w.id,f),A=z.at(-1),B=function(a){let{failures:b,attempts:c,budgets:d}=a,e=b.filter(a=>"healable_in_branch"===a.category),f=b.filter(a=>"flaky_or_ambiguous"===a.category),g=b.filter(a=>"blocked_external"===a.category);if(0==[...e,...f].length){let a=g[0];return a?{action:"block",reason:`external failure: ${a.checkName}`}:{action:"escalate",reason:"unrecognised CI failure"}}if(c.length>=d.maxHealAttemptsPerSession)return{action:"escalate",reason:"per-session heal budget exhausted"};let h=new Map;for(let a of c)h.set(a.fingerprint,(h.get(a.fingerprint)??0)+1);let i=a=>(h.get(a.fingerprint)??0)<d.maxHealAttemptsPerFingerprint,j=e.find(i)??f.find(i);if(!j)return{action:"escalate",reason:"per-fingerprint heal budget exhausted"};if(a.activeRuns>=d.maxConcurrentHealingRuns)return{action:"wait_slot"};if(null!=a.lastAttemptAt){let b=a.now-a.lastAttemptAt;if(b<d.cooldownMs)return{action:"cooldown",waitMs:d.cooldownMs-b}}return"healable_in_branch"===j.category?{action:"repair",target:j}:{action:"rerun",target:j}}({failures:y,attempts:z.map(a=>({fingerprint:a.fingerprint})),lastAttemptAt:A?1e3*A.createdAt:null,now:o(),activeRuns:function(a=(0,h.Lf)()){return a.select().from(k.healingSessions).all().filter(a=>aT.includes(a.status)).length}(f),budgets:n});switch(B.action){case"block":return"triaging"===w.status&&aV(w.id,"blocked",f),await c.gh.commentIssue(r.issueNumber,`CI auto-heal: ${B.reason} — not auto-fixable. Handing over to a human.`),(0,m.dk)(r.id,"needs_human",{errorMessage:`auto-heal blocked: ${B.reason}`.slice(0,500)},f);case"escalate":return"triaging"===w.status&&aV(w.id,"escalated",f),a_(r,b,`CI auto-heal: ${B.reason}.`,c,f);case"wait_slot":await i(j);continue;case"cooldown":await i(Math.min(B.waitMs,j));continue;case"repair":case"rerun":{let a=r.sessionId;if(!a)return"triaging"===w.status&&aV(w.id,"escalated",f),a_(r,b,"CI failed but no session id to resume.",c,f);let d=function(a,b,c,d=(0,h.Lf)()){return d.insert(k.healingAttempts).values({sessionId:a,fingerprint:b.fingerprint,category:b.category,checkName:b.checkName,beforeSha:c}).returning().get()}(w.id,B.target,v,f);if(aV(w.id,"awaiting_slot",f),aV(w.id,"repairing",f),r=(0,m.dk)(r.id,"ci_failed",{prNumber:b},f),r=(0,m.dk)(r.id,"retrying",{ciRetryCount:r.ciRetryCount+1},f),"repair"===B.action){let b=function(a){let{kind:b,evidence:c}=aM(a.log,a.maxLines);return[`CI check "${a.checkName}" is failing on this PR.`,aN[b],"Fix only this failure, then commit and push. Failure evidence:\n",c].join("\n")}({checkName:B.target.checkName,log:x,maxLines:n.maxEvidenceLines});await c.resumeSession(r,a,b)}aV(w.id,"awaiting_ci",f),r=(0,m.dk)(r.id,"ci_running",{},f),e={attemptId:d.id,sessionId:w.id,beforeSha:v,beforeFailing:u.length};continue}}}return(0,m.ax)(r.id,f)??r}var a3=c(26424);async function a4(a,b,c,d=(0,h.Lf)(),e={}){for(let f of c)try{let c=await b.viewIssue(f.number),g=await (0,aD.dv)(a,{number:c.number,title:c.title,body:c.body},d,{generate:e.generate});if(!g.skipped&&g.subtasks.length>=a3.WE){let a=(0,a3.cp)(g.subtasks.map(a=>({title:a.title,status:a.status})));await b.commentIssue(c.number,`Drydock decomposed this issue into subtasks and will work them in order:
7
-
8
- ${a}`)}}catch(b){console.error(`[subtasks] decomposition failed for ${a.name}#${f.number}`,b)}}var a5=c(51455),a6=c(22579);function a7(a,b){if(a.length<=b)return a;let c=a.length-b;return`${a.slice(0,b)}
9
- …[truncated ${c} chars]`}let a8=a6.Ik({ordinal:a6.ai().int().nonnegative(),status:a6.k5(["done","pending","deferred"]),reason:a6.Yj().default("")}),a9=a6.Ik({summary:a6.Yj().default(""),verdicts:a6.YO(a8).default([])});async function ba(a){let b,{job:c,prNumber:d,repo:e,forge:f,db:g,provider:i,command:j,model:k}=a;try{let n=await f.prDiff(d);if(!n.trim())return null;let p=await f.viewIssue(c.issueNumber),q=(0,aD.t0)(e.id,c.issueNumber,g),r={issueNumber:c.issueNumber,issueTitle:p.title,issueBody:p.body,subtasks:q.map(a=>({ordinal:a.ordinal,title:a.title})),diff:n},s=a.generate;if(!s){var l;let c,d;b=await (0,a5.mkdtemp)((0,J.join)((0,o.tmpdir)(),"drydock-verify-")),c=(l={provider:i,command:j,model:k,cwd:b,runner:a.runner}).runner??I.S,d=l.timeoutMs??18e4,s=async a=>{var b;let e,f,g=l.provider.buildOneShotArgs({prompt:(e=a7(a.issueBody.trim(),6e3),f=a7(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}`,"",e,"\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",f,'```\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")),model:l.model});try{let a=await c(l.command,g,l.cwd,{timeoutMs:d});if(0!==a.exitCode)return null;return function(a){let b,c=a.match(/\{[\s\S]*\}/);if(!c)return null;try{b=JSON.parse(c[0])}catch{return null}let d=a9.safeParse(b);return d.success?d.data:null}(a.stdout)}catch{return null}}}let t=await s(r);if(!t)return(0,m.yM)(c.id,"verification",{ok:!1},g),null;let u=function(a,b,c,d=(0,h.Lf)()){let e=new Map((0,aD.t0)(a,b,d).map(a=>[a.ordinal,a])),f=0,g=0,i=[];for(let a of c.verdicts){let b=e.get(a.ordinal);if(b)if("done"===a.status)!function(a,b){let c=a.status;if("done"!==c&&"skipped"!==c)try{if("in_progress"===c)return void(0,aD.ZY)(a.id,"done",b);(0,aD.ZY)(a.id,"in_progress",b),(0,aD.ZY)(a.id,"done",b)}catch{}}(b,d),f+=1;else if("deferred"===a.status)try{(0,aD.ZY)(b.id,"deferred",d),g+=1}catch{}else i.push(b.title)}return{done:f,deferred:g,pendingTitles:i}}(e.id,c.issueNumber,t,g);return await f.commentIssue(c.issueNumber,(0,U.f)(function(a,b){let c=[`🔎 Drydock post-PR verification`,""];if(a.summary.trim()&&c.push(a.summary.trim(),""),b.pendingTitles.length>0)for(let a of(c.push("Subtasks still pending:"),b.pendingTitles))c.push(`- ${a}`);else c.push("All tracked subtasks appear satisfied by the diff.");return c.join("\n")}(t,u))),(0,m.yM)(c.id,"verification",{ok:!0,summary:t.summary,done:u.done,deferred:u.deferred,pending:u.pendingTitles.length},g),t}catch(a){return console.error(`[verify] verification pass failed for ${e.name}#${c.issueNumber}`,a),null}finally{if(b)try{await (0,a5.rm)(b,{recursive:!0,force:!0})}catch{}}}async function bb(a,b={}){let c=b.db??(0,h.Lf)(),d=b.notify??((a,b)=>(0,ar.JD)(a,b,c)),e=await bc(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 bc(a,b,c){let d,e=b.db??(0,h.Lf)(),f=(0,m.ax)(a,e);if(!f)throw Error(`job ${a} not found`);let g=(0,u.L8)(f.repoId,e);if(!g)throw Error(`repo ${f.repoId} not found`);"queued"===f.status&&(0,m.dk)(f.id,"working",{},e);let i=b.worktrees??new P,k=(0,v.Ie)(g),l=(0,t.X$)(f.agent),n=(0,H.m)(l,e),o=(0,j.mt)(e),p=g.maxJobMinutes??o.maxJobMinutes,q=6e4*p,r=(g.maxCiWaitMinutes??o.maxCiWaitMinutes)*6e4,s=g.maxJobCostUsd??o.maxJobCostUsd,w=b.runSession??((a,b,c)=>$(a,b,c,{db:e,provider:l,command:n,timeoutMs:q,costCapUsd:s})),x=b.createPr??(a=>k.createPr(a)),y=b.runBabysitter??((a,b)=>a1(a,b,{gh:k,db:e,ciWaitMs:r,resumeSession:(a,b,c)=>_(a,b,c,g.path,{db:e,provider:l,command:n,timeoutMs:q,costCapUsd:s}).then(()=>void 0),autoHeal:g.autoHealCi?{headSha:a=>k.prHeadSha(a),provider:g.platform}:void 0})),z=b.verify??((a,b)=>ba({job:a,prNumber:b,repo:g,forge:k,db:e,provider:l,command:n,model:a.model??g.defaultModel}).then(()=>void 0));try{d=await i.prepare(g,f.id,f.issueNumber),(0,m.yM)(f.id,"worktree",{path:d.path,branch:d.branch},e);let a=(0,T.Xm)((0,T.yx)(g.id,S._.main,e),{ISSUE_NUM:f.issueNumber,BRANCH:d.branch,REPO_NAME:g.name});if(g.autoDecompose){let b=(0,aD.t0)(g.id,f.issueNumber,e);if(b.length>0){var A;a+=(A=b.map(a=>({title:a.title,status:a.status})),0===A.length?"":["\n\n## Subtasks\n\nThis issue has been broken into the ordered subtasks below. Work through them\nin order, top to bottom, as part of this single change:\n",(0,a3.cp)(A)].join("\n")),function(a,b,c=(0,h.Lf)()){for(let d of(0,aD.t0)(a,b,c))"pending"===d.status&&(0,aD.ZY)(d.id,"in_progress",c)}(g.id,f.issueNumber,e)}}a+=(0,aE.Y)(g.agentInstructions);let b=await w((0,m.ax)(f.id,e),a,d.path);if(b.timedOut)return(0,m.dk)(f.id,"needs_human",{errorMessage:`${l.label} timed out after ${p} minutes`},e);if(b.costExceeded)return(0,m.dk)(f.id,"needs_human",{errorMessage:`per-job cost limit of $${s} reached`},e);if(0!==b.exitCode)return(0,m.dk)(f.id,"needs_human",{errorMessage:`${l.label} exited non-zero`},e);if(g.adrGating){let a=(0,aC.Pe)("pending_review",e,g.id);if(a.length>0)return(0,m.dk)(f.id,"needs_human",{errorMessage:`Blocked by ${a.length} pending ADR review(s).`},e)}try{await i.commitAndPush(d,`Fix #${f.issueNumber}`)}catch(a){if(a instanceof O)return(0,m.dk)(f.id,"needs_human",{errorMessage:"Agent produced no changes"},e);throw a}let j=(0,B.ts)(g.id,e).find(a=>a.number===f.issueNumber)?.title??`Fix #${f.issueNumber}`,k=await x({head:d.branch,base:g.defaultBranch,title:j,body:`Closes #${f.issueNumber}`});if((0,m.dk)(f.id,"ci_running",{branch:d.branch,prNumber:k},e),await c("pr_opened",`🔀 PR opened: ${g.id}#${f.issueNumber} (PR #${k}).`),g.verifyPr)try{await z((0,m.ax)(f.id,e),k)}catch(b){let a=b instanceof Error?b.message:String(b);(0,m.yM)(f.id,"error",{message:`verification pass failed: ${a}`},e)}let n=await y((0,m.ax)(f.id,e),k);return g.autoDecompose&&"merged"===n.status&&function(a,b,c=(0,h.Lf)()){for(let d of(0,aD.t0)(a,b,c))!function(a,b){let c=a.status;if("done"!==c&&"skipped"!==c){if("in_progress"===c)return(0,aD.ZY)(a.id,"done",b);(0,aD.ZY)(a.id,"in_progress",b),(0,aD.ZY)(a.id,"done",b)}}(d,c)}(g.id,f.issueNumber,e),n}catch(c){let a=c instanceof Error?c.message:String(c);(0,m.yM)(f.id,"error",{message:a},e);let b=(0,m.ax)(f.id,e);if(["working","ci_running","retrying"].includes(b.status))return(0,m.dk)(f.id,"needs_human",{errorMessage:a.slice(0,500)},e);return b}finally{if(d)try{await i.remove(d,g.path)}catch(a){console.error(`[run-job] worktree cleanup failed for job ${f.id}`,a)}}}let bd=!1,be=new Set;function bf(a){let b=(0,aa.openSync)(a,"wx");try{(0,aa.writeSync)(b,JSON.stringify({pid:process.pid,ts:Date.now()}))}finally{(0,aa.closeSync)(b)}}let bg={active:!1};function bh(a,b,c,d,e={}){var f;let g,h=(0,t.X$)(a.agent),i=(g=(f={provider:h,command:(0,H.m)(h,d),model:a.defaultModel,cwd:a.path,runner:e.runner}).runner??I.S,async a=>{let b=f.provider.buildOneShotArgs({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"),model:f.model}),c=await g(f.command,b,f.cwd);if(0!==c.exitCode)return[];let d=c.stdout.match(/\[[\s\S]*\]/);if(!d)return[];try{let a=JSON.parse(d[0]);if(!Array.isArray(a))return[];return a.filter(a=>"string"==typeof a).map(a=>a.trim()).filter(Boolean)}catch{return[]}});return a4(a,b,c,d,{generate:i})}let bi=["needs_human","aborted"];async function bj(a,b,c,d,e,f){var h,i;let j=e.some(a=>b.readyLabels.includes(a)),l=e.some(a=>b.blockingLabels.includes(a));return!!j&&!l&&!!(0,C.i)(b,d.authorAssociation)&&(h=a.id,i=d.number,!(f.select().from(k.jobs).where((0,g.Uo)((0,g.eq)(k.jobs.repoId,h),(0,g.eq)(k.jobs.issueNumber,i),(0,g.RV)(k.jobs.status,[...bi]))).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 bk=["queued","working","ci_running","ci_failed","retrying"],bl=["working","ci_running","ci_failed","retrying"];async function bm(a={}){let b=a.db??(0,h.Lf)(),c=a.runJob??bb,d=(0,u.uP)(b),e=a.triage??G,f=a.decompose??bh;for(let c of d)try{await (0,w.v)("low",async()=>{let d=a.forgeFor?.(c)??(0,v.Ie)(c),i=a.fetchIssues??(async(a,b)=>(await d.refreshRateLimit?.(),d.listAllIssues())),j=await i(c.path,c.queueLabel);(0,B.VK)(c.id,j,b);let l=(0,C.A)(c);if(l.autoTriageEnabled&&await e(c,d,j,b),l.autoDecompose){let a=j.filter(a=>{let b=a.labels.map(a=>a.name);return b.includes(c.queueLabel)||b.some(a=>l.readyLabels.includes(a))});a.length>0&&await f(c,d,a,b)}for(let a of j){let e=a.labels.map(a=>a.name),f=e.includes(c.queueLabel),i=!!l.autoProcessEnabled&&await bj(c,l,d,a,e,b);if(!f&&!i)continue;let j=A({number:a.number,title:a.title,labels:e});if("approved"===j.decision&&!function(a,b,c){return(0,m.i1)([...bk],a).some(a=>a.repoId===b&&a.issueNumber===c)}(b,c.id,a.number)){var n,o;i&&a.author&&l.priorityAuthors.includes(a.author)&&(n=c.id,o=a.number,b.update(k.issues).set({priority:-1}).where((0,g.Uo)((0,g.eq)(k.issues.repoId,n),(0,g.eq)(k.issues.number,o))).run()),function(a,b=(0,h.Lf)()){let c=a.dedupeKey??`${a.repoId}:${a.issueNumber}`;if(!b.select({id:k.jobs.id}).from(k.jobs).where((0,g.Uo)((0,g.eq)(k.jobs.dedupeKey,c),(0,g.KL)(k.jobs.status,[...p.kl]))).get())try{(0,m._S)({...a,dedupeKey:c},b)}catch(a){if(a instanceof Error&&"string"==typeof a.code&&"SQLITE_CONSTRAINT_UNIQUE"===a.code)return;throw a}}({repoId:c.id,issueNumber:a.number,model:c.defaultModel,agent:c.agent},b)}}})}catch(a){a instanceof x.OE?console.debug(`[driver] ${c.name} sweep yielded: ${a.message}`):console.error(`[driver] issue sync failed for ${c.name}`,a)}(0,l.PH)("cost_limit"===(0,j.Jf)(b).reason,bg,b);let o=(0,j.mt)(b).maxParallelJobs,s=r();for(;!bd&&(0,j.Jf)(b).allowed&&be.size<o;){let a=d.filter(a=>(0,j.DA)(a.id,b).allowed).filter(a=>!(a.sequential&&function(a,b){return(0,m.i1)([...bl],a).some(a=>a.repoId===b)}(b,a.id))).map(a=>a.id);if(0===a.length)break;let e=function(a={},b=(0,h.Lf)()){let{repoIds:c}=a;if(c&&0===c.length)return;let d=a.leaseMs??3e4,e=a.worker??r(),f=a.now??q();return b.transaction(a=>{let b=a.select({job:k.jobs}).from(k.jobs).leftJoin(k.issues,(0,g.Uo)((0,g.eq)(k.issues.repoId,k.jobs.repoId),(0,g.eq)(k.issues.number,k.jobs.issueNumber))).where((0,g.Uo)((0,g.eq)(k.jobs.status,"queued"),(0,g.or)((0,g.kZ)(k.jobs.availableAt),(0,g.wJ)(k.jobs.availableAt,f)),c?(0,g.RV)(k.jobs.repoId,c):void 0)).orderBy((0,i.ll)`COALESCE(${k.issues.priority}, 1e9)`,k.jobs.createdAt).get()?.job;if(b)return(0,m.dk)(b.id,"working",{leaseToken:(0,n.randomUUID)(),leaseExpiresAt:f+Math.ceil(d/1e3),workerId:e,attempts:b.attempts+1,availableAt:null},a)})}({repoIds:a,worker:s,leaseMs:3e4},b);if(!e)break;let f=e.id,l=e.leaseToken;be.add(f);let o=setInterval(()=>{try{!function(a,b,c={},d=(0,h.Lf)()){let e=c.leaseMs??3e4,f=c.now??q();d.update(k.jobs).set({leaseExpiresAt:f+Math.ceil(e/1e3)}).where((0,g.Uo)((0,g.eq)(k.jobs.id,a),(0,g.eq)(k.jobs.leaseToken,b),(0,g.eq)(k.jobs.status,"working"))).run().changes}(f,l,{},b)}catch(a){console.error(`[driver] heartbeat failed for job ${f}`,a)}},1e4);o.unref?.(),c(f).catch(a=>console.error(`[driver] job ${f} failed`,a)).finally(()=>{clearInterval(o),function(a,b,c=(0,h.Lf)()){c.update(k.jobs).set({leaseToken:null,leaseExpiresAt:null,workerId:null}).where((0,g.Uo)((0,g.eq)(k.jobs.id,a),(0,g.eq)(k.jobs.leaseToken,b))).run().changes}(f,l,b),be.delete(f)})}let t=a.reviewFeedback??(a=>aA({db:a}));try{await (0,w.v)("low",()=>t(b))}catch(a){console.error("[driver] review-feedback sweep failed",a)}let y=a.deploymentHealing??(a=>an({db:a}));try{await (0,w.v)("low",()=>y(b))}catch(a){console.error("[driver] deployment-healing sweep failed",a)}let z=a.releaseManagement??(a=>au({db:a}));try{await (0,w.v)("low",()=>z(b))}catch(a){console.error("[driver] release-management sweep failed",a)}}let bn=!1,bo=!1,bp=/^job-(\d+)$/;async function bq(a={}){let b=a.db??(0,h.Lf)(),c=a.run??I.S,d=function(a){let b=a.select({id:k.jobs.id,status:k.jobs.status}).from(k.jobs).all(),c=new Set;for(let a of b)p.kl.includes(a.status)||c.add(a.id);return c}(b),e=0;for(let a of(0,u.uP)(b)){let b;await c("git",["-C",a.path,"worktree","prune"]).catch(()=>void 0);let f=M(a.name);try{b=(0,aa.readdirSync)(f,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name)}catch{continue}for(let g of b){let b=bp.exec(g);if(!b||d.has(Number(b[1])))continue;let h=(0,J.join)(f,g);await c("git",["-C",a.path,"worktree","remove","--force",h]).catch(()=>void 0);try{(0,aa.rmSync)(h,{recursive:!0,force:!0}),e++}catch(a){console.error(`[worktree-reaper] failed to remove ${h}`,a)}}}return e}let br=!1,bs=new Map;function bt(a,b){bs.set(a,b)}function bu(a){bs.delete(a)}async function bv(){for(let a of(bd=!0,bn=!1,f&&clearTimeout(f),f=void 0,await (0,l.CZ)().catch(a=>console.error("[orchestrator] drain notify failed",a)),bs.values()))a(5e3);bs.clear(),await function(a=3e4,b=100){let c=Date.now()+a;return new Promise(a=>{let d=()=>{if(0===be.size||Date.now()>=c)return a();setTimeout(d,b)};d()})}(5e3);try{let a=(0,h.Lf)();for(let b of a.select().from(k.jobs).where((0,g.RV)(k.jobs.status,["working","ci_running","ci_failed","retrying"])).all())try{(0,m.dk)(b.id,"interrupted",{},a)}catch(a){console.error(`[orchestrator] shutdown transition failed for job ${b.id}`,a)}}catch(a){console.error("[orchestrator] shutdown DB update failed",a)}}function bw(){if(br)return;if(br=!0,!process.env.VITEST){try{let{requeued:a,interrupted:b}=function(a=(0,h.Lf)()){return{requeued:function(a={},b=(0,h.Lf)()){let c=a.now??q(),d=a.expiredBefore,e=void 0===d?void 0:(0,g.or)((0,g.kZ)(k.jobs.leaseExpiresAt),(0,g.wJ)(k.jobs.leaseExpiresAt,d)),f=b.select().from(k.jobs).where((0,g.Uo)((0,g.eq)(k.jobs.status,"working"),e)).all();for(let a of f)b.update(k.jobs).set({status:"queued",leaseToken:null,leaseExpiresAt:null,workerId:null,availableAt:c+function(a,b=5,c=300){return a<=0?0:Math.min(b*2**(a-1),c)}(a.attempts)}).where((0,g.eq)(k.jobs.id,a.id)).run(),(0,m.yM)(a.id,"status",{from:"working",to:"queued",reason:"lease_expired"},b);return f.length}({},a),interrupted:function(a=(0,h.Lf)()){let b=a.select().from(k.jobs).where((0,g.RV)(k.jobs.status,s)).all();for(let c of b)a.update(k.jobs).set({status:"interrupted"}).where((0,g.eq)(k.jobs.id,c.id)).run(),(0,m.yM)(c.id,"status",{from:c.status,to:"interrupted",reason:"recovery"},a);return b.length}(a)}}();a>0&&console.log(`[orchestrator] requeued ${a} orphaned job(s)`),b>0&&console.log(`[orchestrator] recovered ${b} interrupted job(s)`)}catch(a){console.error("[orchestrator] recovery failed",a)}if(function(){let a=(0,J.join)(K(),"instance.lock");(0,aa.mkdirSync)((0,J.dirname)(a),{recursive:!0});try{return bf(a),!0}catch{}let b=!1;try{let{pid:c}=JSON.parse((0,aa.readFileSync)(a,"utf8"));!function(a){try{return process.kill(a,0),!0}catch{return!1}}(c)&&(b=!0)}catch{b=!0}if(!b)return!1;try{return(0,aa.unlinkSync)(a),bf(a),!0}catch{return!1}}()){let a,b;bq().then(a=>{a>0&&console.log(`[orchestrator] reaped ${a} orphaned worktree(s)`)}).catch(a=>console.error("[orchestrator] worktree reap failed",a)),function(a={}){if(bn)return;bn=!0;let b=a.tick??(()=>bm()),c=a.intervalMs??1e3*(0,j.mt)().pollIntervalSec,d=async()=>{if(bn){if(!bo){bo=!0;try{await b()}catch(a){console.error("[driver] tick failed",a)}finally{bo=!1}}bn&&(f=setTimeout(d,c))}};d()}(),(a=()=>{try{let{jobEventsDeleted:a}=function(a=(0,h.Lf)(),b={}){let c=b.days??(0,j.mt)(a).retentionDays,d=b.vacuum??!0,e=Math.floor((b.now?.getTime()??Date.now())/1e3)-86400*c,f=a.select({id:k.jobs.id}).from(k.jobs).where((0,g.Uo)((0,g.Pe)(k.jobs.finishedAt),(0,g.lt)(k.jobs.finishedAt,e))).all().map(a=>a.id),l=0;return f.length>0&&(l=a.delete(k.jobEvents).where((0,g.RV)(k.jobEvents.jobId,f)).run().changes),d&&a.run((0,i.ll)`VACUUM`),{jobEventsDeleted:l,vacuumed:d,cutoff:e}}((0,h.Lf)());a>0&&console.log(`[orchestrator] pruned ${a} job event(s)`)}catch(a){console.error("[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 bv(),process.exit(0)};process.once("SIGINT",a),process.once("SIGTERM",a)}},63480:(a,b,c)=>{c.d(b,{f:()=>f});let d="[REDACTED]",e=[/\bgh[pousr]_[A-Za-z0-9]{36,}\b/g,/\bgithub_pat_[A-Za-z0-9_]{50,}\b/g,/\bglpat-[A-Za-z0-9_-]{20,}\b/g,/(Bearer )[A-Za-z0-9._~+/-]+=*/g,/(https?:\/\/)[^\s/@:]+:[^\s/@]+(?=@)/g,/(PRIVATE-TOKEN:\s*)\S+/gi,/(Basic )[A-Za-z0-9+/]+=*/g,/\b(?:AKIA|ASIA|AGPA|AIDA|ANPA|AROA)[0-9A-Z]{16}\b/g];function f(a){let b=a;for(let a of e)b=b.replace(a,(a,b)=>"string"==typeof b?`${b}${d}`:d);return b}},74058:(a,b,c)=>{c.d(b,{Fl:()=>j,JD:()=>i,QD:()=>k});var d=c(55710),e=c(63480),f=c(51605);let g=[{id:"telegram",isConfigured:a=>!!(a.telegramBotToken&&a.telegramChatId),send:(a,b,c)=>c.postJson(`https://api.telegram.org/bot${b.telegramBotToken}/sendMessage`,{chat_id:b.telegramChatId,text:a})},{id:"slack",isConfigured:a=>!!a.slackWebhookUrl,send:(a,b,c)=>c.postJson(b.slackWebhookUrl,{text:a})},{id:"email",isConfigured:a=>!!(a.smtpHost&&a.emailFrom&&a.emailTo),send:(a,b,c)=>c.sendMail({to:b.emailTo,from:b.emailFrom,subject:"Drydock notification",text:a},{host:b.smtpHost,port:b.smtpPort,user:b.smtpUser,pass:b.smtpPass})}];function h(a){return g.filter(b=>b.isConfigured(a))}async function i(a,b,c=(0,d.Lf)(),g=k){let j=(0,f.mt)(c);if(j.notifyEvents.includes(a))for(let a of h(j))try{await a.send(b,j,g)}catch(b){console.error(`[notify] ${a.id} delivery failed`,(0,e.f)(String(b)))}}async function j(a=(0,d.Lf)(),b=k){let c=(0,f.mt)(a),g=[];for(let a of h(c))try{await a.send("Drydock test notification — your channel is configured correctly.",c,b),g.push({channel:a.id,ok:!0})}catch(b){var i;console.error(`[notify] ${a.id} test failed`,(0,e.f)(String(b))),g.push({channel:a.id,ok:!1,error:(0,e.f)((i=b)instanceof Error?i.message:String(i))})}return g}let k={postJson:async(a,b)=>{let c=await fetch(a,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(b)});if(!c.ok)throw Error(`HTTP ${c.status}`)},sendMail:async(a,b)=>{let d=(await c.e(462).then(c.t.bind(c,17462,19))).createTransport({host:b.host,port:b.port,secure:465===b.port,auth:b.user?{user:b.user,pass:b.pass}:void 0});await d.sendMail(a)}}},96684:(a,b,c)=>{c.d(b,{CZ:()=>h,Dp:()=>g,PH:()=>f});var d=c(55710),e=c(74058);async function f(a,b,c=(0,d.Lf)(),g=e.QD){a?b.active||(b.active=!0,await (0,e.JD)("cost_limit","\uD83D\uDCB8 Daily cost limit reached — new jobs are paused until the budget resets.",c,g)):b.active=!1}async function g(a,b,c=(0,d.Lf)(),f=e.QD){!a&&b&&await (0,e.JD)("automation_paused","⏸️ Automation paused — no new jobs will start until it resumes.",c,f)}async function h(a=(0,d.Lf)(),b=e.QD){await (0,e.JD)("automation_paused","\uD83C\uDF19 Automation draining — finishing in-flight jobs, then shutting down.",a,b)}}};