@nilsr0711/drydock 0.1.1 → 0.1.3

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 (198) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +6 -3
  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/routes-manifest.json +20 -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 +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  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/api/cost/export/route.js +1 -0
  23. package/.next/standalone/.next/server/app/api/cost/export/route.js.nft.json +1 -0
  24. package/.next/standalone/.next/server/app/api/cost/export/route_client-reference-manifest.js +1 -0
  25. package/.next/standalone/.next/server/app/api/sse/dashboard/route.js +4 -0
  26. package/.next/standalone/.next/server/app/api/sse/dashboard/route.js.nft.json +1 -0
  27. package/.next/standalone/.next/server/app/api/sse/dashboard/route_client-reference-manifest.js +1 -0
  28. package/.next/standalone/.next/server/app/api/sse/jobs/[id]/route.js +2 -2
  29. package/.next/standalone/.next/server/app/api/sse/jobs/[id]/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/webhooks/[repoId]/route.js +1 -0
  31. package/.next/standalone/.next/server/app/api/webhooks/[repoId]/route.js.nft.json +1 -0
  32. package/.next/standalone/.next/server/app/api/webhooks/[repoId]/route_client-reference-manifest.js +1 -0
  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 +5 -2
  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/needs-human/page.js +2 -2
  40. package/.next/standalone/.next/server/app/needs-human/page.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/needs-human/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/page.js +2 -2
  43. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/prompts/page.js +2 -2
  46. package/.next/standalone/.next/server/app/prompts/page.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/prompts/page_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/repos/[id]/page.js +2 -2
  49. package/.next/standalone/.next/server/app/repos/[id]/page.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/repos/[id]/page_client-reference-manifest.js +1 -1
  51. package/.next/standalone/.next/server/app/settings/page.js +2 -2
  52. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  54. package/.next/standalone/.next/server/app-paths-manifest.json +6 -3
  55. package/.next/standalone/.next/server/chunks/235.js +1 -0
  56. package/.next/standalone/.next/server/chunks/309.js +1 -0
  57. package/.next/standalone/.next/server/chunks/350.js +9 -0
  58. package/.next/standalone/.next/server/chunks/39.js +3 -0
  59. package/.next/standalone/.next/server/chunks/447.js +1 -0
  60. package/.next/standalone/.next/server/chunks/507.js +9 -0
  61. package/.next/standalone/.next/server/chunks/541.js +1 -0
  62. package/.next/standalone/.next/server/chunks/710.js +1 -0
  63. package/.next/standalone/.next/server/chunks/75.js +1 -0
  64. package/.next/standalone/.next/server/chunks/777.js +1 -0
  65. package/.next/standalone/.next/server/chunks/895.js +62 -0
  66. package/.next/standalone/.next/server/chunks/9.js +3 -0
  67. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  68. package/.next/standalone/.next/server/pages/500.html +1 -1
  69. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  70. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  71. package/.next/standalone/.next/static/chunks/0-539cfb6a78b205f0.js +1 -0
  72. package/.next/standalone/.next/static/chunks/66-a23941cbbf88d6cd.js +1 -0
  73. package/.next/standalone/.next/static/chunks/app/_global-error/page-abc1c30fe033f680.js +1 -0
  74. package/.next/standalone/.next/static/chunks/app/adrs/{page-881f748d299c703e.js → page-54954f500bc3e3c6.js} +1 -1
  75. package/.next/standalone/.next/static/chunks/app/api/cost/export/route-abc1c30fe033f680.js +1 -0
  76. package/.next/standalone/.next/static/chunks/app/api/sse/dashboard/route-abc1c30fe033f680.js +1 -0
  77. package/.next/standalone/.next/static/chunks/app/api/sse/jobs/[id]/route-abc1c30fe033f680.js +1 -0
  78. package/.next/standalone/.next/static/chunks/app/api/webhooks/[repoId]/route-abc1c30fe033f680.js +1 -0
  79. package/.next/standalone/.next/static/chunks/app/costs/page-737c89e70adff98b.js +1 -0
  80. package/.next/standalone/.next/static/chunks/app/jobs/[id]/page-217e04f338b50a7e.js +1 -0
  81. package/.next/standalone/.next/static/chunks/app/layout-f6048a8c9f541e0d.js +1 -0
  82. package/.next/standalone/.next/static/chunks/app/needs-human/page-c047e3e842681979.js +1 -0
  83. package/.next/standalone/.next/static/chunks/app/page-382b7fef1f749214.js +1 -0
  84. package/.next/standalone/.next/static/chunks/app/prompts/page-9e32fb8f51e7873e.js +1 -0
  85. package/.next/standalone/.next/static/chunks/app/repos/[id]/page-55b03bdcf107eefe.js +1 -0
  86. package/.next/standalone/.next/static/chunks/app/settings/page-5b2b8683fa6afdf4.js +1 -0
  87. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-abc1c30fe033f680.js +1 -0
  88. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-abc1c30fe033f680.js +1 -0
  89. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-abc1c30fe033f680.js +1 -0
  90. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-abc1c30fe033f680.js +1 -0
  91. package/.next/standalone/.next/static/css/64af283f7f467bc0.css +3 -0
  92. package/.next/standalone/.next/static/g7t6i0qpogjrDGpmNgFei/_buildManifest.js +1 -0
  93. package/.next/standalone/drizzle/0013_true_red_wolf.sql +1 -0
  94. package/.next/standalone/drizzle/0014_dry_medusa.sql +1 -0
  95. package/.next/standalone/drizzle/0015_dapper_ben_grimm.sql +1 -0
  96. package/.next/standalone/drizzle/0016_charming_natasha_romanoff.sql +14 -0
  97. package/.next/standalone/drizzle/0017_free_warbound.sql +1 -0
  98. package/.next/standalone/drizzle/0018_confused_franklin_storm.sql +1 -0
  99. package/.next/standalone/drizzle/0019_uneven_meggan.sql +22 -0
  100. package/.next/standalone/drizzle/0020_chunky_meggan.sql +1 -0
  101. package/.next/standalone/drizzle/meta/0013_snapshot.json +1487 -0
  102. package/.next/standalone/drizzle/meta/0014_snapshot.json +1494 -0
  103. package/.next/standalone/drizzle/meta/0015_snapshot.json +1502 -0
  104. package/.next/standalone/drizzle/meta/0016_snapshot.json +1600 -0
  105. package/.next/standalone/drizzle/meta/0017_snapshot.json +1607 -0
  106. package/.next/standalone/drizzle/meta/0018_snapshot.json +1614 -0
  107. package/.next/standalone/drizzle/meta/0019_snapshot.json +1773 -0
  108. package/.next/standalone/drizzle/meta/0020_snapshot.json +1780 -0
  109. package/.next/standalone/drizzle/meta/_journal.json +56 -0
  110. package/.next/standalone/package.json +1 -1
  111. package/.next/static/chunks/0-539cfb6a78b205f0.js +1 -0
  112. package/.next/static/chunks/66-a23941cbbf88d6cd.js +1 -0
  113. package/.next/static/chunks/app/_global-error/page-abc1c30fe033f680.js +1 -0
  114. package/.next/static/chunks/app/adrs/{page-881f748d299c703e.js → page-54954f500bc3e3c6.js} +1 -1
  115. package/.next/static/chunks/app/api/cost/export/route-abc1c30fe033f680.js +1 -0
  116. package/.next/static/chunks/app/api/sse/dashboard/route-abc1c30fe033f680.js +1 -0
  117. package/.next/static/chunks/app/api/sse/jobs/[id]/route-abc1c30fe033f680.js +1 -0
  118. package/.next/static/chunks/app/api/webhooks/[repoId]/route-abc1c30fe033f680.js +1 -0
  119. package/.next/static/chunks/app/costs/page-737c89e70adff98b.js +1 -0
  120. package/.next/static/chunks/app/jobs/[id]/page-217e04f338b50a7e.js +1 -0
  121. package/.next/static/chunks/app/layout-f6048a8c9f541e0d.js +1 -0
  122. package/.next/static/chunks/app/needs-human/page-c047e3e842681979.js +1 -0
  123. package/.next/static/chunks/app/page-382b7fef1f749214.js +1 -0
  124. package/.next/static/chunks/app/prompts/page-9e32fb8f51e7873e.js +1 -0
  125. package/.next/static/chunks/app/repos/[id]/page-55b03bdcf107eefe.js +1 -0
  126. package/.next/static/chunks/app/settings/page-5b2b8683fa6afdf4.js +1 -0
  127. package/.next/static/chunks/next/dist/client/components/builtin/app-error-abc1c30fe033f680.js +1 -0
  128. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-abc1c30fe033f680.js +1 -0
  129. package/.next/static/chunks/next/dist/client/components/builtin/not-found-abc1c30fe033f680.js +1 -0
  130. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-abc1c30fe033f680.js +1 -0
  131. package/.next/static/css/64af283f7f467bc0.css +3 -0
  132. package/.next/static/g7t6i0qpogjrDGpmNgFei/_buildManifest.js +1 -0
  133. package/README.md +25 -12
  134. package/bin/drydock.mjs +132 -7
  135. package/drizzle/0013_true_red_wolf.sql +1 -0
  136. package/drizzle/0014_dry_medusa.sql +1 -0
  137. package/drizzle/0015_dapper_ben_grimm.sql +1 -0
  138. package/drizzle/0016_charming_natasha_romanoff.sql +14 -0
  139. package/drizzle/0017_free_warbound.sql +1 -0
  140. package/drizzle/0018_confused_franklin_storm.sql +1 -0
  141. package/drizzle/0019_uneven_meggan.sql +22 -0
  142. package/drizzle/0020_chunky_meggan.sql +1 -0
  143. package/drizzle/meta/0013_snapshot.json +1487 -0
  144. package/drizzle/meta/0014_snapshot.json +1494 -0
  145. package/drizzle/meta/0015_snapshot.json +1502 -0
  146. package/drizzle/meta/0016_snapshot.json +1600 -0
  147. package/drizzle/meta/0017_snapshot.json +1607 -0
  148. package/drizzle/meta/0018_snapshot.json +1614 -0
  149. package/drizzle/meta/0019_snapshot.json +1773 -0
  150. package/drizzle/meta/0020_snapshot.json +1780 -0
  151. package/drizzle/meta/_journal.json +56 -0
  152. package/package.json +1 -1
  153. package/.next/standalone/.next/server/chunks/152.js +0 -8
  154. package/.next/standalone/.next/server/chunks/21.js +0 -1
  155. package/.next/standalone/.next/server/chunks/441.js +0 -1
  156. package/.next/standalone/.next/server/chunks/633.js +0 -1
  157. package/.next/standalone/.next/server/chunks/706.js +0 -8
  158. package/.next/standalone/.next/server/chunks/753.js +0 -1
  159. package/.next/standalone/.next/server/chunks/774.js +0 -62
  160. package/.next/standalone/.next/server/chunks/859.js +0 -1
  161. package/.next/standalone/.next/static/chunks/602-2da35213db585d76.js +0 -1
  162. package/.next/standalone/.next/static/chunks/66-2a5c080641376f3a.js +0 -1
  163. package/.next/standalone/.next/static/chunks/app/_global-error/page-94dd6bc2d60a8443.js +0 -1
  164. package/.next/standalone/.next/static/chunks/app/api/sse/jobs/[id]/route-94dd6bc2d60a8443.js +0 -1
  165. package/.next/standalone/.next/static/chunks/app/costs/page-7aeb8fd8816090f7.js +0 -1
  166. package/.next/standalone/.next/static/chunks/app/jobs/[id]/page-23dddd5f27bc7c02.js +0 -1
  167. package/.next/standalone/.next/static/chunks/app/layout-6ad777543855c715.js +0 -1
  168. package/.next/standalone/.next/static/chunks/app/needs-human/page-abedbafec351380c.js +0 -1
  169. package/.next/standalone/.next/static/chunks/app/page-ebe54ab85fbcf147.js +0 -1
  170. package/.next/standalone/.next/static/chunks/app/prompts/page-3b9006a4513a173a.js +0 -1
  171. package/.next/standalone/.next/static/chunks/app/repos/[id]/page-16e031b6eab3ee05.js +0 -1
  172. package/.next/standalone/.next/static/chunks/app/settings/page-54d0967b6d9f734f.js +0 -1
  173. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-94dd6bc2d60a8443.js +0 -1
  174. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-94dd6bc2d60a8443.js +0 -1
  175. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-94dd6bc2d60a8443.js +0 -1
  176. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-94dd6bc2d60a8443.js +0 -1
  177. package/.next/standalone/.next/static/css/b4ec7103106db91b.css +0 -3
  178. package/.next/standalone/.next/static/iEqTV0p0ZoW-sr0JEYokX/_buildManifest.js +0 -1
  179. package/.next/static/chunks/602-2da35213db585d76.js +0 -1
  180. package/.next/static/chunks/66-2a5c080641376f3a.js +0 -1
  181. package/.next/static/chunks/app/_global-error/page-94dd6bc2d60a8443.js +0 -1
  182. package/.next/static/chunks/app/api/sse/jobs/[id]/route-94dd6bc2d60a8443.js +0 -1
  183. package/.next/static/chunks/app/costs/page-7aeb8fd8816090f7.js +0 -1
  184. package/.next/static/chunks/app/jobs/[id]/page-23dddd5f27bc7c02.js +0 -1
  185. package/.next/static/chunks/app/layout-6ad777543855c715.js +0 -1
  186. package/.next/static/chunks/app/needs-human/page-abedbafec351380c.js +0 -1
  187. package/.next/static/chunks/app/page-ebe54ab85fbcf147.js +0 -1
  188. package/.next/static/chunks/app/prompts/page-3b9006a4513a173a.js +0 -1
  189. package/.next/static/chunks/app/repos/[id]/page-16e031b6eab3ee05.js +0 -1
  190. package/.next/static/chunks/app/settings/page-54d0967b6d9f734f.js +0 -1
  191. package/.next/static/chunks/next/dist/client/components/builtin/app-error-94dd6bc2d60a8443.js +0 -1
  192. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-94dd6bc2d60a8443.js +0 -1
  193. package/.next/static/chunks/next/dist/client/components/builtin/not-found-94dd6bc2d60a8443.js +0 -1
  194. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-94dd6bc2d60a8443.js +0 -1
  195. package/.next/static/css/b4ec7103106db91b.css +0 -3
  196. package/.next/static/iEqTV0p0ZoW-sr0JEYokX/_buildManifest.js +0 -1
  197. /package/.next/standalone/.next/static/{iEqTV0p0ZoW-sr0JEYokX → g7t6i0qpogjrDGpmNgFei}/_ssgManifest.js +0 -0
  198. /package/.next/static/{iEqTV0p0ZoW-sr0JEYokX → g7t6i0qpogjrDGpmNgFei}/_ssgManifest.js +0 -0
@@ -92,6 +92,62 @@
92
92
  "when": 1779927561945,
93
93
  "tag": "0012_small_ultimatum",
94
94
  "breakpoints": true
95
+ },
96
+ {
97
+ "idx": 13,
98
+ "version": "6",
99
+ "when": 1779992130920,
100
+ "tag": "0013_true_red_wolf",
101
+ "breakpoints": true
102
+ },
103
+ {
104
+ "idx": 14,
105
+ "version": "6",
106
+ "when": 1780003719318,
107
+ "tag": "0014_dry_medusa",
108
+ "breakpoints": true
109
+ },
110
+ {
111
+ "idx": 15,
112
+ "version": "6",
113
+ "when": 1780005381175,
114
+ "tag": "0015_dapper_ben_grimm",
115
+ "breakpoints": true
116
+ },
117
+ {
118
+ "idx": 16,
119
+ "version": "6",
120
+ "when": 1780006775125,
121
+ "tag": "0016_charming_natasha_romanoff",
122
+ "breakpoints": true
123
+ },
124
+ {
125
+ "idx": 17,
126
+ "version": "6",
127
+ "when": 1780007754894,
128
+ "tag": "0017_free_warbound",
129
+ "breakpoints": true
130
+ },
131
+ {
132
+ "idx": 18,
133
+ "version": "6",
134
+ "when": 1780008739108,
135
+ "tag": "0018_confused_franklin_storm",
136
+ "breakpoints": true
137
+ },
138
+ {
139
+ "idx": 19,
140
+ "version": "6",
141
+ "when": 1780010868125,
142
+ "tag": "0019_uneven_meggan",
143
+ "breakpoints": true
144
+ },
145
+ {
146
+ "idx": 20,
147
+ "version": "6",
148
+ "when": 1780014414336,
149
+ "tag": "0020_chunky_meggan",
150
+ "breakpoints": true
95
151
  }
96
152
  ]
97
153
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nilsr0711/drydock",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "type": "module",
5
5
  "description": "Local-first tool that autonomously turns GitHub issues into pull requests via the Claude CLI, startable from the terminal with `npx @nilsr0711/drydock`.",
6
6
  "keywords": [
@@ -1,8 +0,0 @@
1
- "use strict";exports.id=152,exports.ids=[152],exports.modules={20031:(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"}},22157:(a,b,c)=>{let d;c.d(b,{k:()=>j});var e=c(37003),f=c(2937),g=c(93929),h=c(36639);class i{constructor(a=(0,f.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,h.f)(JSON.stringify(b.payload??{})),d=JSON.parse(c),e=this.db.insert(g.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(g.jobEvents).where((0,e.eq)(g.jobEvents.jobId,a)).orderBy(g.jobEvents.ts,g.jobEvents.id).all().slice(-b)}}function j(){return d||(d=new i),d}},23791:(a,b,c)=>{c.d(b,{QJ:()=>g,kl:()=>e});let d={queued:["working","aborted","interrupted"],working:["ci_running","needs_human","aborted","interrupted"],ci_running:["ci_failed","merged","needs_human","aborted","interrupted"],ci_failed:["retrying","needs_human","aborted","interrupted"],retrying:["ci_running","needs_human","aborted","interrupted"],merged:[],needs_human:["queued","aborted"],aborted:[],interrupted:["queued","aborted"]},e=["merged","aborted"];class f extends Error{constructor(a,b){super(`invalid job transition: ${a} -> ${b}`)}}function g(a,b){if(!d[a].includes(b))throw new f(a,b)}},24532:(a,b,c)=>{c.d(b,{Pe:()=>g,dj:()=>h});var d=c(37003),e=c(2937),f=c(93929);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}},35152:(a,b,c)=>{let d,e;c.r(b),c.d(b,{clearAbort:()=>bZ,gracefulShutdown:()=>b$,registerAbort:()=>bY,startOrchestrator:()=>b_});var f=c(37003),g=c(2937),h=c(90109),i=c(78293),j=c(93929),k=c(36639);let l=[{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 m(a,b,c=(0,g.Lf)(),d=n){let e=(0,i.mt)(c);if(e.notifyEvents.includes(a)){for(let a of l.filter(a=>a.isConfigured(e)))try{await a.send(b,e,d)}catch(b){console.error(`[notify] ${a.id} delivery failed`,(0,k.f)(String(b)))}}}let n={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(537).then(c.t.bind(c,83537,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)}};async function o(a,b,c=(0,g.Lf)(),d=n){a?b.active||(b.active=!0,await m("cost_limit","\uD83D\uDCB8 Daily cost limit reached — new jobs are paused until the budget resets.",c,d)):b.active=!1}async function p(a=(0,g.Lf)(),b=n){await m("automation_paused","\uD83C\uDF19 Automation draining — finishing in-flight jobs, then shutting down.",a,b)}var q=c(68476),r=c(77598),s=c(48161),t=c(23791);let u=()=>Math.floor(Date.now()/1e3);function v(){return d||(d=`${(0,s.hostname)()}#${process.pid}`),d}let w=["ci_running","ci_failed","retrying"];var x=c(68464),y=c(93774),z=c(31421);let A=(a,b,c)=>new Promise((d,e)=>{let f=(0,z.spawn)(a,b,{cwd:c,env:process.env}),g="",h="";f.stdout.on("data",a=>{g+=a.toString()}),f.stderr.on("data",a=>{h+=a.toString()}),f.on("error",e),f.on("close",a=>{d({stdout:g,stderr:h,exitCode:a??0})})});class B{get(a){return this.entries.get(a)}set(a,b,c){this.entries.set(a,{etag:b,body:c})}constructor(){this.entries=new Map}}let C=new B,D=new(c(16698)).AsyncLocalStorage;function E(){return D.getStore()??"high"}let F=["core","graphql","search"];class G{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 H=new G;class I 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"}}let J=y.Ik({number:y.ai(),title:y.Yj(),labels:y.YO(y.Ik({name:y.Yj()})).default([]),user:y.Ik({login:y.Yj()}).nullish(),author_association:y.Yj().nullish(),pull_request:y.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})),K=y.Ik({resources:y.g1(y.Yj(),y.Ik({limit:y.ai(),remaining:y.ai(),reset:y.ai()}))}),L=y.Ik({number:y.ai(),title:y.Yj(),body:y.Yj().default(""),state:y.Yj().default("open"),labels:y.YO(y.Ik({name:y.Yj()})).default([]),comments:y.YO(y.Ik({author:y.Ik({login:y.Yj()}).default({login:""}),body:y.Yj().default(""),createdAt:y.Yj().default("")})).default([])}),M=y.Ik({name:y.Yj(),state:y.Yj(),bucket:y.Yj().optional()}),N=y.Ik({data:y.Ik({repository:y.Ik({pullRequest:y.Ik({reviewThreads:y.Ik({nodes:y.YO(y.Ik({id:y.Yj(),isResolved:y.zM().default(!1),isOutdated:y.zM().default(!1),path:y.Yj().nullish(),line:y.ai().nullish(),comments:y.Ik({nodes:y.YO(y.Ik({id:y.Yj(),databaseId:y.ai().nullish(),body:y.Yj().default(""),author:y.Ik({login:y.Yj()}).nullish()}))})}))})}).nullish()})})});class O extends Error{}function P(a,b){return`${a}=${b}`}class Q{constructor(a,b=A,c=H,d=C){this.cwd=a,this.run=b,this.governor=c,this.etags=d}gate(a="core"){let b=this.governor.decide(a,E());if(!b.allowed)throw new I(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=K.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){let c;this.gate("core");let d=this.etags.get(a),e=["api",`repos/{owner}/{repo}/issues?${b}`,"--include"];d&&e.push("-H",`If-None-Match: ${d.etag}`);let f=await this.run("gh",e,this.cwd),g=function(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}}(f.stdout),h=function(a){let b=Number(a["x-ratelimit-limit"]),c=Number(a["x-ratelimit-remaining"]),d=Number(a["x-ratelimit-reset"]);if(!Number.isFinite(b)||!Number.isFinite(c)||!Number.isFinite(d))return null;let e=a["x-ratelimit-resource"];return void 0===e?{resource:"core",snapshot:{remaining:c,limit:b,reset:d}}:F.includes(e)?{resource:e,snapshot:{remaining:c,limit:b,reset:d}}:null}(g.headers);if(h&&this.governor.observe(h.resource,h.snapshot),304===g.status&&d)c=d.body;else{var i,j;if(i=g.status,j=g.headers,429===i||403===i&&"0"===j["x-ratelimit-remaining"]){let a=Number(g.headers["x-ratelimit-reset"]);throw this.governor.note429("core",Number.isFinite(a)?a:void 0),new O(`gh api rate limited (status ${g.status})`)}if(200===g.status){let b=g.headers.etag;b&&this.etags.set(a,b,g.body),c=g.body}else throw new O(f.stderr||`gh api failed (status ${g.status??"unknown"})`)}let k=y.YO(J).safeParse(JSON.parse(c||"[]"));if(!k.success)throw new O(`unexpected gh output: ${k.error.message}`);return k.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 O(b.stderr||"gh issue view failed");let c=L.safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new O(`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(P("--title",b.title)),void 0!==b.body&&c.push(P("--body",b.body)),3===c.length)return;let d=await this.exec(c);if(0!==d.exitCode)throw new O(d.stderr||"gh issue edit failed")}async ensureLabel(a,b={}){let c=await this.exec(["label","list","--json","name","--limit","200"]),d=c.stdout.trim();if(0===c.exitCode&&d)try{let b=y.YO(y.Ik({name:y.Yj()})).safeParse(JSON.parse(d));if(b.success&&b.data.some(b=>b.name===a))return}catch{}let e=["label","create",a];b.color&&e.push("--color",b.color),b.description&&e.push("--description",b.description);let f=await this.exec(e);if(0!==f.exitCode&&!/already exists/i.test(f.stderr))throw new O(f.stderr||"gh label create failed")}async addLabels(a,b){let c=await this.exec(["issue","edit",String(a),P("--add-label",b.join(","))]);if(0!==c.exitCode)throw new O(c.stderr||"gh issue edit failed")}async removeLabels(a,b){let c=await this.exec(["issue","edit",String(a),P("--remove-label",b.join(","))]);if(0!==c.exitCode)throw new O(c.stderr||"gh issue edit failed")}async closeIssue(a){let b=await this.exec(["issue","close",String(a)]);if(0!==b.exitCode)throw new O(b.stderr||"gh issue close failed")}async reopenIssue(a){let b=await this.exec(["issue","reopen",String(a)]);if(0!==b.exitCode)throw new O(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 O(b.stderr||"gh pr checks failed");return[]}let d=y.YO(M).safeParse(JSON.parse(c));if(!d.success)throw new O(`unexpected gh output: ${d.error.message}`);return d.data}async prHeadSha(a){let b=await this.exec(["pr","view",String(a),"--json","headRefOid"]);if(0!==b.exitCode)throw new O(b.stderr||"gh pr view failed");let c=y.Ik({headRefOid:y.Yj()}).safeParse(JSON.parse(b.stdout||"{}"));if(!c.success)throw new O(`unexpected gh output: ${c.error.message}`);return c.data.headRefOid}async commentIssue(a,b){let c=await this.exec(["issue","comment",String(a),P("--body",b)]);if(0!==c.exitCode)throw new O(c.stderr||"gh issue comment failed")}async createIssue(a,b){let c=await this.exec(["issue","create",P("--title",a),P("--body",b)]);if(0!==c.exitCode)throw new O(c.stderr||"gh issue create failed");let d=c.stdout.match(/\/issues\/(\d+)/);if(!d?.[1])throw new O(`could not parse issue number from: ${c.stdout}`);return Number(d[1])}async failedRunLog(a){let b,c;if(!this.governor.decide("core",E()).allowed)return"";let d=await this.run("gh",["pr","view",String(a),"--json","headRefName"],this.cwd);if(0!==d.exitCode)return"";try{b=y.Ik({headRefName:y.Yj()}).parse(JSON.parse(d.stdout||"{}")).headRefName}catch{return""}if(!b)return"";let e=await this.run("gh",["run","list","--branch",b,"--json","databaseId,conclusion","--limit","20"],this.cwd);if(0!==e.exitCode)return"";try{c=y.YO(y.Ik({databaseId:y.ai(),conclusion:y.Yj().default("")})).parse(JSON.parse(e.stdout||"[]"))}catch{return""}let f=c.find(a=>"failure"===a.conclusion);if(!f)return"";let g=await this.run("gh",["run","view",String(f.databaseId),"--log-failed"],this.cwd);return 0!==g.exitCode?"":g.stdout.slice(-8e3)}async mergePr(a){let b=await this.exec(["pr","merge",String(a),"--squash","--auto"]);if(0!==b.exitCode)throw new O(b.stderr||"gh pr merge failed")}async createPr(a){let b=await this.exec(["pr","create",P("--head",a.head),P("--base",a.base),P("--title",a.title),P("--body",a.body)]);if(0!==b.exitCode)throw new O(b.stderr||"gh pr create failed");let c=b.stdout.match(/\/pull\/(\d+)/);if(!c?.[1])throw new O(`could not parse PR number from: ${b.stdout}`);return Number(c[1])}async repoSlug(){if(this.slug)return this.slug;let a=await this.exec(["repo","view","--json","nameWithOwner"]);if(0!==a.exitCode)throw new O(a.stderr||"gh repo view failed");let b=y.Ik({nameWithOwner:y.Yj()}).safeParse(JSON.parse(a.stdout||"{}"));if(!b.success)throw new O(`unexpected gh output: ${b.error.message}`);let[c,d]=b.data.nameWithOwner.split("/");if(!c||!d)throw new O(`unexpected repo slug: ${b.data.nameWithOwner}`);return this.slug={owner:c,name:d},this.slug}async listReviewThreads(a){let{owner:b,name:c}=await this.repoSlug(),d=await this.exec(["api","graphql","-F",`owner=${b}`,"-F",`name=${c}`,"-F",`number=${a}`,"-f","query=query($owner:String!,$name:String!,$number:Int!){repository(owner:$owner,name:$name){pullRequest(number:$number){reviewThreads(first:100){nodes{id isResolved isOutdated path line comments(first:100){nodes{id databaseId body author{login}}}}}}}}"],"graphql");if(0!==d.exitCode)throw new O(d.stderr||"gh api graphql failed");let e=N.safeParse(JSON.parse(d.stdout||"{}"));if(!e.success)throw new O(`unexpected gh output: ${e.error.message}`);return(e.data.data.repository.pullRequest?.reviewThreads.nodes??[]).map(a=>({id:a.id,isResolved:a.isResolved,isOutdated:a.isOutdated,path:a.path??null,line:a.line??null,comments:a.comments.nodes.map(a=>({id:a.id,databaseId:a.databaseId??null,author:a.author?.login??"",body:a.body}))}))}async replyToReviewThread(a,b){let c=await this.exec(["api","graphql","-F",`threadId=${a}`,"-f",`body=${b}`,"-f","query=mutation($threadId:ID!,$body:String!){addPullRequestReviewThreadReply(input:{pullRequestReviewThreadId:$threadId,body:$body}){comment{id}}}"],"graphql");if(0!==c.exitCode)throw new O(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 O(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 O(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 O(c.stderr||"gh add reaction failed")}}let R=async(a,b)=>{let c=await fetch(a,{method:b?.method??"GET",headers:b?.headers,body:b?.body}),d=await c.text();return{status:c.status,ok:c.ok,body:d}};class S extends Error{}let T=y.Ik({iid:y.ai(),title:y.Yj(),labels:y.YO(y.Yj()).default([]),author:y.Ik({username:y.Yj()}).nullish()}),U=y.Ik({iid:y.ai(),title:y.Yj(),description:y.Yj().nullable().default(""),state:y.Yj().default("opened"),labels:y.YO(y.Yj()).default([])}),V=y.Ik({author:y.Ik({username:y.Yj().default("")}).default({username:""}),body:y.Yj().default(""),created_at:y.Yj().default(""),system:y.zM().default(!1)}),W=y.Ik({id:y.ai().optional(),name:y.Yj().default(""),status:y.Yj().default("")}),X=y.Ik({id:y.ai()});class Y{constructor(a,b={}){this.config=a,this.http=b.http??R,this.run=b.run??A}resolveProject(){return this.projectRef||(this.projectRef=(async()=>{let a=await this.run("git",["remote","get-url","origin"],this.config.cwd);if(0!==a.exitCode||!a.stdout.trim())throw new S(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 S(`unsupported git remote URL: ${a}`);return{host:c[1],path:c[2]}}(a.stdout);return{baseUrl:(this.config.baseUrl?.trim()||`https://${b}`).replace(/\/$/,""),encodedPath:encodeURIComponent(c)}})()),this.projectRef}async request(a,b,c={}){let d,{baseUrl:e,encodedPath:f}=await this.resolveProject(),g=`${e}/api/v4/projects/${f}${b}`;if(c.query){let a=new URLSearchParams(c.query).toString();a&&(g+=`?${a}`)}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(!d.ok)throw new S(_(d)||`GitLab ${a} ${b} failed`);return d}async listIssues(a){return Z((await this.mutate("GET","/issues",{query:{state:"opened",labels:a,per_page:"100"}})).body)}async listAllIssues(){return Z((await this.mutate("GET","/issues",{query:{state:"opened",per_page:"100"}})).body)}async viewIssue(a){let b=await this.mutate("GET",`/issues/${a}`),c=await this.mutate("GET",`/issues/${a}/notes`,{query:{per_page:"100"}}),d=U.parse($(b.body,{})),e=y.YO(V).parse($(c.body,[]));return{number:d.iid,title:d.title,body:d.description??"",state:"opened"===d.state?"open":d.state,labels:d.labels,comments:e.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 d=await this.request("GET","/labels",{query:{per_page:"100"}});if(d.ok){let b=y.YO(y.Ik({name:y.Yj()})).safeParse($(d.body,[]));if(b.success&&b.data.some(b=>b.name===a))return}let e={name:a,color:(c=b.color??"#808080").startsWith("#")?c:`#${c}`};b.description&&(e.description=b.description);let f=await this.request("POST","/labels",{body:e});if(!f.ok&&409!==f.status&&!/already exists/i.test(f.body))throw new S(_(f)||"GitLab label create failed")}async addLabels(a,b){await this.mutate("PUT",`/issues/${a}`,{body:{add_labels:b.join(",")}})}async removeLabels(a,b){await this.mutate("PUT",`/issues/${a}`,{body:{remove_labels:b.join(",")}})}async closeIssue(a){await this.mutate("PUT",`/issues/${a}`,{body:{state_event:"close"}})}async reopenIssue(a){await this.mutate("PUT",`/issues/${a}`,{body:{state_event:"reopen"}})}async commentIssue(a,b){await this.mutate("POST",`/issues/${a}/notes`,{body:{body:b}})}async createIssue(a,b){let c=await this.mutate("POST","/issues",{body:{title:a,description:b}});return y.Ik({iid:y.ai()}).parse($(c.body,{})).iid}async prChecks(a){let b=await this.latestPipelineId(a);if(null===b)return[];let c=await this.mutate("GET",`/pipelines/${b}/jobs`,{query:{per_page:"100"}});return y.YO(W).parse($(c.body,[])).map(a=>({name:a.name,state:function(a){switch(a){case"success":return"SUCCESS";case"failed":return"FAILURE";case"canceled":case"cancelled":return"CANCELLED";case"running":return"IN_PROGRESS";case"pending":case"created":case"scheduled":case"preparing":case"waiting_for_resource":return"PENDING";case"manual":return"MANUAL";case"skipped":return"SKIPPED";default:return a.toUpperCase()}}(a.status)}))}async prHeadSha(a){let b=await this.mutate("GET",`/merge_requests/${a}`);return y.Ik({sha:y.Yj()}).parse($(b.body,{})).sha}async failedRunLog(a){try{let b=await this.latestPipelineId(a);if(null===b)return"";let c=await this.request("GET",`/pipelines/${b}/jobs`,{query:{per_page:"100"}});if(!c.ok)return"";let d=y.YO(W).safeParse($(c.body,[]));if(!d.success)return"";let e=d.data.find(a=>"failed"===a.status&&void 0!==a.id);if(!e)return"";let f=await this.request("GET",`/jobs/${e.id}/trace`);if(!f.ok)return"";return f.body.slice(-8e3)}catch{return""}}async mergePr(a){await this.mutate("PUT",`/merge_requests/${a}/merge`,{body:{squash:!0,merge_when_pipeline_succeeds:!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 y.Ik({iid:y.ai()}).parse($(b.body,{})).iid}async latestPipelineId(a){let b=await this.request("GET",`/merge_requests/${a}/pipelines`);if(!b.ok)return null;let c=y.YO(X).safeParse($(b.body,[])),d=c.success?c.data[0]:void 0;return d?d.id:null}}function Z(a){let b=y.YO(T).safeParse($(a,[]));if(!b.success)throw new S(`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 $(a,b){try{return JSON.parse(a||"null")??b}catch{return b}}function _(a){let b=y.Ik({message:y.L5(),error:y.L5()}).partial().safeParse($(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 aa(a){var b;return"gitlab"===("github"===(b=a.platform)||"gitlab"===b?a.platform:"github")?new Y({cwd:a.path,baseUrl:a.apiBaseUrl,token:a.apiToken}):new Q({cwd:a.path}.cwd,void 0)}let ab=["blocked","wontfix","question","needs-human","needs-discussion"],ac=[{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 ad(a){let b=[],c=a.labels.map(a=>a.toLowerCase()).find(a=>ab.includes(a));if(c)return{decision:"blocked",reasons:[`blocking label: ${c}`]};let d=`${a.title}
2
- ${a.body??""}`;for(let{label:a,re:c}of ac)c.test(d)&&b.push(`${a} detected`);return b.length>0?{decision:"needs_review",reasons:b}:{decision:"approved",reasons:[]}}var ae=c(97337),af=c(68246),ag=c(34775);let ah=new Set(["OWNER","MEMBER","COLLABORATOR"]);function ai(a){try{let b=JSON.parse(a);return Array.isArray(b)?b.filter(a=>"string"==typeof a):[]}catch{return[]}}function aj(a){return{autoTriageEnabled:a.autoTriageEnabled,autoProcessEnabled:a.autoProcessEnabled,autoHealCi:a.autoHealCi,autoReviewFeedback:a.autoReviewFeedback,autoResolveMergeConflicts:a.autoResolveMergeConflicts,includeProgressReplies:a.includeProgressReplies,autoDecompose:a.autoDecompose,autoHealDeployments:a.autoHealDeployments,deploymentPlatform:a.deploymentPlatform,readyLabels:ai(a.readyLabels),blockingLabels:ai(a.blockingLabels),autoLabelWhitelist:ai(a.autoLabelWhitelist),priorityAuthors:ai(a.priorityAuthors),trustedReviewers:ai(a.trustedReviewers),ignoredBots:ai(a.ignoredBots),minAuthorAssociation:"any"===a.minAuthorAssociation?"any":"approved",maxAttempts:a.maxAttempts}}function ak(a,b){return"any"===a.minAuthorAssociation||null!=b&&ah.has(b.toUpperCase())}let al=[{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 am(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 an(a,b,c,d=(0,g.Lf)()){let e=aj(a),h=function(a){let b=JSON.stringify([a.title,a.labels.map(a=>a.name).sort()]),c=5381;for(let a=0;a<b.length;a++)c=(c<<5)+c+b.charCodeAt(a)|0;return(c>>>0).toString(16)}(c),i=d.select().from(j.issues).where((0,f.Uo)((0,f.eq)(j.issues.repoId,a.id),(0,f.eq)(j.issues.number,c.number))).get();if(i?.triagedAt&&i.triageHash===h)return{number:c.number,applied:[],reasons:[],skipped:"unchanged"};if(!ak(e,c.authorAssociation))return am(a.id,c.number,h,d),{number:c.number,applied:[],reasons:["author not approved"],skipped:"author"};let k=await b.viewIssue(c.number),l=ad({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}
3
- ${a.body}`,e=[];for(let{label:a,re:b}of al)c.has(a)&&b.test(d)&&!e.includes(a)&&e.push(a);return e}(k,e.autoLabelWhitelist);for(let a of n)m.push(`classified as ${a}`);if("approved"===l.decision){let a=e.readyLabels[0];a&&(n.push(a),m.push("safe and well-specified"))}else{let a=e.blockingLabels[0];a&&(n.push(a),m.push(...l.reasons.length?l.reasons:["flagged for human review"]))}let o=new Set([...e.autoLabelWhitelist,...e.readyLabels,...e.blockingLabels]),p=new Set(k.labels),q=[...new Set(n)].filter(a=>o.has(a)&&!p.has(a));if(q.length>0){for(let a of q)await b.ensureLabel(a);await b.addLabels(c.number,q);let e=q.map(a=>`\`${a}\``).join(", ");await b.commentIssue(c.number,`auto-triage: applied ${e} — reasons: ${m.join("; ")}.`),function(a,b,c,d){let e,g=d.select().from(j.issues).where((0,f.Uo)((0,f.eq)(j.issues.repoId,a),(0,f.eq)(j.issues.number,b))).get();if(!g)return;try{let a=JSON.parse(g.labels);e=Array.isArray(a)?a:[]}catch{e=[]}let h=[...e];for(let a of c)h.includes(a)||h.push(a);d.update(j.issues).set({labels:JSON.stringify(h)}).where((0,f.eq)(j.issues.id,g.id)).run()}(a.id,c.number,q,d)}return am(a.id,c.number,h,d),{number:c.number,applied:q,reasons:m}}async function ao(a,b,c,d=(0,g.Lf)()){let e=[];for(let f of c)try{e.push(await an(a,b,f,d))}catch(b){console.error(`[triage] issue #${f.number} failed for ${a.name}`,b)}return e}let ap={"claude-opus-4-7":{inputPerMTok:15,outputPerMTok:75},"claude-sonnet-4-5":{inputPerMTok:3,outputPerMTok:15},"claude-haiku-4-5":{inputPerMTok:1,outputPerMTok:5}},aq=ap["claude-sonnet-4-5"],ar=y.Ik({input_tokens:y.ai().optional(),output_tokens:y.ai().optional(),cache_creation_input_tokens:y.ai().optional(),cache_read_input_tokens:y.ai().optional()}).passthrough(),as=y.Ik({type:y.eu("system"),subtype:y.Yj().optional(),session_id:y.Yj().optional(),model:y.Yj().optional()}),at=y.Ik({type:y.eu("assistant"),message:y.Ik({role:y.eu("assistant"),content:y.YO(y.g1(y.Yj(),y.L5())),usage:ar.optional()})}),au=y.Ik({type:y.eu("user"),message:y.Ik({role:y.eu("user"),content:y.YO(y.g1(y.Yj(),y.L5()))})}),av=y.Ik({type:y.eu("result"),subtype:y.Yj().optional(),session_id:y.Yj().optional(),is_error:y.zM().optional(),total_cost_usd:y.ai().optional(),usage:ar.optional()}),aw=y.gM("type",[as,at,au,av]);function ax(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 ay{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=function(a){var b;let c,d=a.trim();if(!d)return null;let e=JSON.parse(d);return c={type:(b=aw.parse(e)).type,chunks:[],inputTokens:0,outputTokens:0,isError:!1,raw:b},"system"===b.type?(c.sessionId=b.session_id,c.model=b.model):"assistant"===b.type?(c.chunks=ax(b.message.content),c.inputTokens=b.message.usage?.input_tokens??0,c.outputTokens=b.message.usage?.output_tokens??0):"user"===b.type?c.chunks=ax(b.message.content):(c.sessionId=b.session_id,c.costUsd=b.total_cost_usd,c.inputTokens=b.usage?.input_tokens??0,c.outputTokens=b.usage?.output_tokens??0,c.isError=b.is_error??!1),c}(a);return b?(b.sessionId&&(this.sessionId=b.sessionId),b.model&&(this.model=b.model),this.totalInputTokens+=b.inputTokens,this.totalOutputTokens+=b.outputTokens,"result"===b.type&&void 0!==b.costUsd&&(this.costUsd=b.costUsd),b):null}constructor(){this.buffer="",this.totalInputTokens=0,this.totalOutputTokens=0,this.costUsd=0}}let az="gpt-5-codex",aA={"gpt-5-codex":{inputPerMTok:1.25,outputPerMTok:10},"gpt-5":{inputPerMTok:1.25,outputPerMTok:10},"gpt-5-mini":{inputPerMTok:.25,outputPerMTok:2}},aB=aA[az],aC=y.Ik({input_tokens:y.ai().optional(),cached_input_tokens:y.ai().optional(),output_tokens:y.ai().optional(),reasoning_output_tokens:y.ai().optional()}).passthrough(),aD=y.Ik({id:y.Yj().optional(),item_type:y.Yj().optional(),text:y.Yj().optional(),command:y.Yj().optional(),exit_code:y.ai().optional(),server:y.Yj().optional(),tool:y.Yj().optional()}).passthrough(),aE=y.Ik({type:y.Yj(),thread_id:y.Yj().optional(),usage:aC.optional(),item:aD.optional()}).passthrough();class aF{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=function(a){let b=a.trim();if(!b)return null;let c=JSON.parse(b);var d=aE.parse(c);let e={type:"assistant",chunks:[],inputTokens:0,outputTokens:0,isError:!1,raw:d};if("thread.started"===d.type)return{...e,type:"system",sessionId:d.thread_id};if("item.completed"===d.type&&d.item)return{...e,type:"assistant",chunks:function(a){let b=a.id??"";switch(a.item_type){case"assistant_message":case"reasoning":return a.text?[{kind:"text",text:a.text}]:[];case"command_execution":return[{kind:"tool_use",name:"command",id:b,input:{command:a.command,exit_code:a.exit_code}}];case"file_change":return[{kind:"tool_use",name:"edit",id:b,input:a}];case"mcp_tool_call":return[{kind:"tool_use",name:`${a.server??"mcp"}/${a.tool??"tool"}`,id:b,input:a}];default:return[]}}(d.item)};if("turn.completed"===d.type){let a=d.usage;return{...e,type:"result",inputTokens:a?.input_tokens??0,outputTokens:(a?.output_tokens??0)+(a?.reasoning_output_tokens??0)}}return"turn.failed"===d.type||"error"===d.type?{...e,type:"result",isError:!0}:null}(a);return b?(b.sessionId&&(this.sessionId=b.sessionId),this.totalInputTokens+=b.inputTokens,this.totalOutputTokens+=b.outputTokens,b):null}constructor(){this.buffer="",this.totalInputTokens=0,this.totalOutputTokens=0,this.costUsd=0}}let aG={claude:{id:"claude",label:"Claude Code",defaultCommand:"claude",supportsResume:!0,resumeModel:"claude-haiku-4-5",resumeMaxTurns:15,defaultModel:"claude-opus-4-7",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"],createParser:()=>new ay,estimateCost:function(a,b,c){let d=a?ap[a]??aq:aq;return b/1e6*d.inputPerMTok+c/1e6*d.outputPerMTok}},codex:{id:"codex",label:"Codex CLI",defaultCommand:"codex",supportsResume:!0,resumeModel:az,resumeMaxTurns:15,defaultModel:az,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],createParser:()=>new aF,estimateCost:function(a,b,c){let d=a?aA[a]??aB:aB;return b/1e6*d.inputPerMTok+c/1e6*d.outputPerMTok}}},aH=["claude","codex"];function aI(a){return"string"==typeof a&&aH.includes(a)?aG[a]:aG.claude}var aJ=c(76760);function aK(){return process.env.DRYDOCK_HOME??(0,aJ.join)((0,s.homedir)(),".drydock")}function aL(a){return a.replace(/[^a-zA-Z0-9._-]/g,"-")}class aM extends Error{}class aN{constructor(a=A){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 aM(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,aJ.join)(aK(),"worktrees",aL(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,aJ.join)(aK(),"worktrees",aL(a.name),`fb-${aL(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,aJ.join)(aK(),"worktrees",aL(a.name),`dh-${aL(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){await this.git(["add","-A"],a.path),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"])})}}let aO=(a,b,c,d)=>{let e=(0,z.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 aP=c(20031),aQ=c(50813),aR=c(22157);function aS(a){return{chunks:a.chunks,costUsd:a.costUsd}}async function aT(a,b,c,d={}){let e=d.db??(0,g.Lf)(),h=d.runner??aO,i=d.broker??(0,aR.k)(),k=d.provider??aI(a.agent),l=d.command??k.defaultCommand,m=a.model??k.defaultModel,n=k.createParser();"working"!==a.status?(0,q.dk)(a.id,"working",{model:m},e):e.update(j.jobs).set({model:m}).where((0,f.eq)(j.jobs.id,a.id)).run();let o=h(l,k.buildStartArgs({prompt:b,model:m,maxTurns:a.maxTurns}),c,{onStdout:b=>{for(let c of n.push(b))i.publish(a.id,{type:c.type,payload:aS(c)})},onStderr:b=>i.publish(a.id,{type:"error",payload:{stderr:b}})});bY(a.id,o.abort);let p=await o.done;for(let b of(bZ(a.id),n.flush()))i.publish(a.id,{type:b.type,payload:aS(b)});let r=n.costUsd>0?n.costUsd:k.estimateCost(m,n.totalInputTokens,n.totalOutputTokens);return e.update(j.jobs).set({sessionId:n.sessionId,totalInputTokens:n.totalInputTokens,totalOutputTokens:n.totalOutputTokens,costUsd:r}).where((0,f.eq)(j.jobs.id,a.id)).run(),{exitCode:p,sessionId:n.sessionId,costUsd:r,inputTokens:n.totalInputTokens,outputTokens:n.totalOutputTokens}}async function aU(a,b,c,d,e={}){let h=e.db??(0,g.Lf)(),i=e.runner??aO,k=e.broker??(0,aR.k)(),l=e.provider??aI(a.agent),m=e.command??l.defaultCommand,n=l.createParser(),o=(0,aQ.Xm)((0,aQ.yx)(a.repoId,aP._.ciFix,h),{CI_LOG:c}),p=i(m,(l.supportsResume?l.buildResumeArgs({prompt:o,sessionId:b,model:l.resumeModel,maxTurns:l.resumeMaxTurns}):null)??l.buildStartArgs({prompt:o,model:l.resumeModel,maxTurns:l.resumeMaxTurns}),d,{onStdout:b=>{for(let c of n.push(b))k.publish(a.id,{type:c.type,payload:{chunks:c.chunks}})},onStderr:b=>k.publish(a.id,{type:"error",payload:{stderr:b}})});bY(a.id,p.abort);let q=await p.done;for(let b of(bZ(a.id),n.flush()))k.publish(a.id,{type:b.type,payload:{chunks:b.chunks}});let r=a.model??l.resumeModel,s=n.costUsd>0?n.costUsd:l.estimateCost(r,n.totalInputTokens,n.totalOutputTokens),t=h.select().from(j.jobs).where((0,f.eq)(j.jobs.id,a.id)).get();return h.update(j.jobs).set({sessionId:n.sessionId??b,totalInputTokens:(t?.totalInputTokens??0)+n.totalInputTokens,totalOutputTokens:(t?.totalOutputTokens??0)+n.totalOutputTokens,costUsd:(t?.costUsd??0)+s}).where((0,f.eq)(j.jobs.id,a.id)).run(),{exitCode:q,sessionId:n.sessionId??b,costUsd:s,inputTokens:n.totalInputTokens,outputTokens:n.totalOutputTokens}}var aV=c(73024);let aW=["vercel","railway"];function aX(a){return a.exists??aV.existsSync}class aY{async detect(a){let b=aX(a);return b((0,aJ.join)(a.cwd,"railway.json"))||b((0,aJ.join)(a.cwd,"railway.toml"))||b((0,aJ.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 aZ{async detect(a){let b=aX(a);return b((0,aJ.join)(a.cwd,"vercel.json"))||b((0,aJ.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 a$=[new aZ,new aY];async function a_(a,b){if(b)return aW.includes(b)?function(a){let b=a$.find(b=>b.id===a);if(!b)throw Error(`unsupported deployment platform: ${a}`);return b}(b):null;for(let b of a$)if(await b.detect(a))return b;return null}var a0=c(46146);function a1(a,b){return{cwd:a.path,ref:b,run:A}}async function a2(a={}){let b=a.db??(0,g.Lf)(),c=a.now??Date.now,d=a.budgets??a0.ad;for(let e of(0,x.uP)(b))if(aj(e).autoHealDeployments)try{let f=a.forgeFor?.(e)??aa(e),g=a.adapterFor??(a=>a_(a1(a,null),a.deploymentPlatform)),h=await g(e);if(!h)continue;let i=a.openFixPr??a5;await a3(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 a3(a,b,c,d){let{db:e,now:f,budgets:g}=d,h=(0,q.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.prHeadSha(a.prNumber)}catch(b){console.error(`[deploy-heal] head sha lookup failed for job ${a.id}`,b);continue}(0,a0.SR)(a.id,d,e)||(0,a0.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 a4(a,e,c,b,d)}catch(c){console.error(`[deploy-heal] session ${b.id} failed for ${a.name}`,c)}}}async function a4(a,b,c,d,e){let{db:f,now:g,budgets:h}=e,i=(0,a0.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,a0.X)(d.id,"escalated",{},f);let j=a1(a,d.commitSha),k=(0,a0.eV)(await c.getStatus(j));if("ready"===k)return void(0,a0.X)(d.id,"healthy",{},f);if("pending"===k)return void(0,a0.LR)(d.id,f);let l=(await c.getLogs(j).catch(()=>"")).split("\n").slice(-h.maxLogLines).join("\n").trim(),m=(0,a0.X)(d.id,"failed",{logsExcerpt:l||null},f);(0,a0.X)(d.id,"repairing",{},f);try{let c=await e.openFixPr(a,b,m,l);(0,a0.X)(d.id,"repaired",{followupPrNumber:c},f)}catch(a){console.error(`[deploy-heal] fix PR failed for session ${d.id}`,a),(0,a0.X)(d.id,"escalated",{},f)}}async function a5(a,b,c,d){let e,f=(0,g.Lf)(),h=aI(b.agent),j=(e=(0,i.mt)(f),"codex"===h.id?e.codexPath:e.claudePath),k=new aN,l=c.commitSha.slice(0,7),m=`drydock/deploy-fix-${b.id}-${l}`,n=aa(a),o=await k.prepareForNewBranch(a,m,`${b.id}-${l}`);try{let e=await aT(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:f,provider:h,command:j});if(0!==e.exitCode)throw Error(`${h.label} exited non-zero`);return await k.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 k.remove(o,a.path)}catch(a){console.error(`[deploy-heal] worktree cleanup failed for job ${b.id}`,a)}}}let a6=["resolved","failed","rejected","flagged"],a7={pending:["queued","rejected","flagged"],queued:["in_progress","flagged","rejected"],in_progress:["resolved","failed","flagged","queued"],resolved:[],failed:[],rejected:[],flagged:[]};class a8 extends Error{constructor(a,b){super(`invalid feedback transition: ${a} -> ${b}`)}}let a9=/\b(out of scope|follow[- ]?up|separate pr|different pr|unrelated|won'?t fix|nevermind|never mind|ignore this)\b/i,ba=/\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 bb(a,b,c={},d=(0,g.Lf)()){let e=d.select().from(j.reviewFeedbackItems).where((0,f.eq)(j.reviewFeedbackItems.id,a)).get();if(!e)throw Error(`review feedback item ${a} not found`);var h=e.status;if(!a7[h].includes(b))throw new a8(h,b);return d.update(j.reviewFeedbackItems).set({status:b,detail:c.detail??e.detail,attempts:"in_progress"===b?e.attempts+1:e.attempts,updatedAt:Math.floor(Date.now()/1e3)}).where((0,f.eq)(j.reviewFeedbackItems.id,a)).returning().get()}let bc={maxItemsPerSweep:3,maxAttemptsPerItem:2};async function bd(a,b,c){var d;let e=(d=b.id,`<!-- drydock:review-feedback:${d} -->`),f=`${c}
4
-
5
- ${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 be(a,b,c){let d=c.db??(0,g.Lf)(),e=c.budgets??bc,h={processed:0,resolved:0,flagged:0,rejected:0,failed:0,skipped:0},i=await c.forge.listReviewThreads(b),k=0;for(let m of i){var l;if(m.isResolved){h.skipped++;continue}let i=m.comments[0];if(!i||!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)}(i.author,c.gate)){h.skipped++;continue}let n=function(a){let b=a.trim();return a9.test(b)?"out_of_scope":ba.test(b)?"actionable":b.includes("?")?"question":"actionable"}(i.body),o=function(a,b=(0,g.Lf)()){let c=function(a,b,c=(0,g.Lf)()){return c.select().from(j.reviewFeedbackItems).where((0,f.Uo)((0,f.eq)(j.reviewFeedbackItems.jobId,a),(0,f.eq)(j.reviewFeedbackItems.threadId,b))).get()}(a.jobId,a.threadId,b);return c||b.insert(j.reviewFeedbackItems).values({jobId:a.jobId,prNumber:a.prNumber,threadId:a.threadId,reviewer:a.reviewer,classification:a.classification}).returning().get()}({jobId:a,prNumber:b,threadId:m.id,reviewer:i.author,classification:n},d);if(l=o.status,a6.includes(l)){h.skipped++;continue}if("pending"===o.status)try{await c.forge.reactToReviewComment(i.id,"EYES")}catch{}if("pending"===o.status){if("question"===n){o=bb(o.id,"flagged",{},d),await bd(c.forge,m,"Drydock: this looks like a question rather than a change request, so it's flagged for a human reviewer."),h.flagged++,h.processed++;continue}if("out_of_scope"===n){o=bb(o.id,"rejected",{},d),await bd(c.forge,m,"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(m.id),h.rejected++,h.processed++;continue}o=bb(o.id,"queued",{},d)}if("queued"===o.status){if(k>=e.maxItemsPerSweep)continue;if(o.attempts>=e.maxAttemptsPerItem){o=bb(o.id,"flagged",{},d),await bd(c.forge,m,`Drydock: could not resolve this after ${o.attempts} attempt(s); flagging for a human.`),h.flagged++,h.processed++;continue}k++,o=bb(o.id,"in_progress",{},d),c.includeProgressReplies&&await bd(c.forge,m,"Drydock: working on this now…");let a=await c.applyFeedback(o,m);h.processed++,a.ok?(bb(o.id,"resolved",{detail:a.detail},d),await bd(c.forge,m,"Drydock: applied this change and pushed a commit. ✅"),await c.forge.resolveReviewThread(m.id),h.resolved++):o.attempts>=e.maxAttemptsPerItem?(bb(o.id,"failed",{detail:a.detail},d),await bd(c.forge,m,`Drydock: could not apply this automatically (${a.detail??"no change produced"}); flagging for a human.`),h.failed++):bb(o.id,"queued",{detail:a.detail},d)}}return h}let bf=new Set(["ci_running","ci_failed","retrying","needs_human"]);function bg(a){return"function"==typeof a.listReviewThreads&&"function"==typeof a.replyToReviewThread&&"function"==typeof a.updateReviewComment&&"function"==typeof a.resolveReviewThread&&"function"==typeof a.reactToReviewComment}async function bh(a={}){let b=a.db??(0,g.Lf)(),c=a.processJob??bi;for(let d of(0,x.uP)(b))if(aj(d).autoReviewFeedback)try{let e=a.forgeFor?.(d)??aa(d);if(!bg(e))continue;for(let a of(0,q.N6)(d.id,b).filter(a=>null!=a.prNumber&&bf.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 bi(a,b,c){var d;let e;if(!bg(c)||null==b.prNumber)return;let f=(0,g.Lf)(),h=aj(a),j=aI(b.agent),k=(e=(0,i.mt)(f),"codex"===j.id?e.codexPath:e.claudePath),l=(d={repo:a,job:b,worktrees:new aN,runSession:(a,b,c)=>aT(a,b,c,{db:f,provider:j,command:k}).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 be(b.id,b.prNumber,{forge:c,db:f,gate:{trustedReviewers:h.trustedReviewers,ignoredBots:h.ignoredBots},includeProgressReplies:h.includeProgressReplies,applyFeedback:l})}var bj=c(24532);let bk={pending:["in_progress","skipped","deferred"],in_progress:["done","skipped","deferred"],deferred:["pending","in_progress","skipped"],done:[],skipped:[]};class bl extends Error{constructor(a,b){super(`invalid subtask transition: ${a} -> ${b}`)}}let bm=/^\s*[-*]\s*\[[ xX]\]\s+(.+?)\s*$/,bn=/^\s*#*\s*(Bug\s+\d+\s*(?:[—:-])\s*.+?)\s*$/;async function bo(a,b={}){let c=function(a){let b=function(a){let b=[];for(let c of a.split("\n")){let a=c.match(bm);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(bn);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){console.error(`[decompose] agent fallback failed for issue #${a.number}`,b)}return{titles:[],source:"none"}}function bp(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 bq(a,b,c=(0,g.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,ae.Y)(j.issueSubtasks.ordinal)).all()}function br(a,b,c=(0,g.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(!bk[e].includes(b))throw new bl(e,b);return c.update(j.issueSubtasks).set({status:b}).where((0,f.eq)(j.issueSubtasks.id,a)).returning().get()}async function bs(a,b,c=(0,g.Lf)(),d={}){var e,h,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,h=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,h))).get()?.h===l)return{subtasks:bq(a.id,b.number,c),source:"none",skipped:!0};let{titles:m,source:n}=await bo(b,{generate:d.generate}),o=function(a,b,c,d,e=(0,g.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,ae.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}}let bt=new Set(["CANCELLED","ACTION_REQUIRED"]),bu=new Set(["TIMED_OUT"]),bv=/\b(ai|claude|codex|copilot|gpt|llm)\b.*\breview\b|\breview\b.*\b(ai|bot)\b/i,bw=/\bcancell?ed\b|\bsecret\b|\b(rate.?limit|secondary rate)\b|\b5\d\d\b|\b(401|403|unauthorized|forbidden)\b|service unavailable/i,bx=/\b(time(d)?.?out|timeout|intermittent|flak(y|e)|econnreset|etimedout|esockettimedout)\b/i,by=/\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;var bz=c(53566);let bA=new Set(["FAILURE","ERROR","CANCELLED","TIMED_OUT","ACTION_REQUIRED"]),bB=new Set(["PENDING","QUEUED","IN_PROGRESS","WAITING","REQUESTED"]);function bC(a){return 0===a.length?"pending":a.some(a=>bA.has(a.state.toUpperCase()))?"failed":a.some(a=>bB.has(a.state.toUpperCase()))?"pending":"passed"}let bD=a=>new Promise(b=>setTimeout(b,a));async function bE(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,q.dk)(a.id,"needs_human",{errorMessage:c.slice(0,500)},e)}async function bF(a,b,c){if(c.autoHeal)return bG(a,b,c,c.autoHeal);let d=c.db??(0,g.Lf)(),e=c.sleep??bD,f=c.pollMs??3e4,h=c.maxPolls??1/0,i=a,j=0;for(;j<h;){j++;let a=bC(await c.gh.prChecks(b));if("pending"===a){await e(f);continue}if("passed"===a)return await c.gh.mergePr(b),(0,q.dk)(i.id,"merged",{prNumber:b},d);if((i=(0,q.dk)(i.id,"ci_failed",{prNumber:b},d)).ciRetryCount>=3)return bE(i,b,"CI failed 3 times.",c,d);if(!i.sessionId)return(0,q.yM)(i.id,"status",{reason:"missing session id, cannot resume for CI fix"},d),(0,q.dk)(i.id,"needs_human",{errorMessage:"CI failed but no session id to resume"},d);let g=i.sessionId;i=(0,q.dk)(i.id,"retrying",{ciRetryCount:i.ciRetryCount+1},d);let h=await c.gh.failedRunLog(b);await c.resumeSession(i,g,h),i=(0,q.dk)(i.id,"ci_running",{},d)}return(0,q.ax)(i.id,d)??i}async function bG(a,b,c,d){let e,f=c.db??(0,g.Lf)(),h=c.sleep??bD,i=c.pollMs??3e4,j=c.maxPolls??1/0,k=d.budgets??bz.op,l=d.now??Date.now,m=a,n=0;for(;n<j;){n++;let a=await c.gh.prChecks(b),g=bC(a);if("pending"===g){await h(i);continue}if("passed"===g){if(e){let a=await d.headSha(b);(0,bz.Az)(e.attemptId,{status:"healed",afterSha:a},f),(0,bz.Yv)(e.sessionId,"verifying",f),(0,bz.Yv)(e.sessionId,"healed",f)}return await c.gh.mergePr(b),(0,q.dk)(m.id,"merged",{prNumber:b},f)}let j=a.filter(a=>bA.has(a.state.toUpperCase())),p=await d.headSha(b);if(e){let a=(0,bz.I0)({beforeSha:e.beforeSha,afterSha:p,beforeFailingCount:e.beforeFailing,afterFailingCount:j.length});(0,bz.Az)(e.attemptId,{status:a.verdict,afterSha:p},f);let d=e.sessionId;if(e=void 0,"rejected"===a.verdict)return(0,bz.Yv)(d,"verifying",f),(0,bz.Yv)(d,"escalated",f),bE(m,b,`CI auto-heal: ${a.reason}.`,c,f)}let r=(0,bz.dT)(m.id,b,p,f),s=await c.gh.failedRunLog(b),t=j.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}`,bt.has(f)||bv.test(d)||bw.test(g)?"blocked_external":bu.has(f)||bx.test(g)?"flaky_or_ambiguous":by.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,s)),u=(0,bz.VJ)(r.id,f),v=u.at(-1),w=(0,bz.ZM)({failures:t,attempts:u.map(a=>({fingerprint:a.fingerprint})),lastAttemptAt:v?1e3*v.createdAt:null,now:l(),activeRuns:(0,bz.Bz)(f),budgets:k});switch(w.action){case"block":return"triaging"===r.status&&(0,bz.Yv)(r.id,"blocked",f),await c.gh.commentIssue(m.issueNumber,`CI auto-heal: ${w.reason} — not auto-fixable. Handing over to a human.`),(0,q.dk)(m.id,"needs_human",{errorMessage:`auto-heal blocked: ${w.reason}`.slice(0,500)},f);case"escalate":return"triaging"===r.status&&(0,bz.Yv)(r.id,"escalated",f),bE(m,b,`CI auto-heal: ${w.reason}.`,c,f);case"wait_slot":await h(i);continue;case"cooldown":await h(Math.min(w.waitMs,i));continue;case"repair":case"rerun":{let a=m.sessionId;if(!a)return"triaging"===r.status&&(0,bz.Yv)(r.id,"escalated",f),bE(m,b,"CI failed but no session id to resume.",c,f);let d=(0,bz.Z7)(r.id,w.target,p,f);if((0,bz.Yv)(r.id,"awaiting_slot",f),(0,bz.Yv)(r.id,"repairing",f),m=(0,q.dk)(m.id,"ci_failed",{prNumber:b},f),m=(0,q.dk)(m.id,"retrying",{ciRetryCount:m.ciRetryCount+1},f),"repair"===w.action){var o;let b=[`CI check "${w.target.checkName}" is failing on this PR.`,"Fix only this failure, then commit and push. Failure evidence:\n",(o=k.maxEvidenceLines,s.split("\n").slice(-o).join("\n"))].join("\n");await c.resumeSession(m,a,b)}(0,bz.Yv)(r.id,"awaiting_ci",f),m=(0,q.dk)(m.id,"ci_running",{},f),e={attemptId:d.id,sessionId:r.id,beforeSha:p,beforeFailing:j.length};continue}}}return(0,q.ax)(m.id,f)??m}async function bH(a,b,c,d=(0,g.Lf)(),e={}){for(let f of c)try{let c=await b.viewIssue(f.number),g=await bs(a,{number:c.number,title:c.title,body:c.body},d,{generate:e.generate});if(!g.skipped&&g.subtasks.length>=2){let a=bp(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)}}async function bI(a,b={}){let c=b.db??(0,g.Lf)(),d=b.notify??((a,b)=>m(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){var d;let e,h,k=b.db??(0,g.Lf)(),l=(0,q.ax)(a,k);if(!l)throw Error(`job ${a} not found`);let m=(0,x.L8)(l.repoId,k);if(!m)throw Error(`repo ${l.repoId} not found`);"queued"===l.status&&(0,q.dk)(l.id,"working",{},k);let n=b.worktrees??new aN,o=aa(m),p=aI(l.agent),r=(h=(0,i.mt)(k),"codex"===p.id?h.codexPath:h.claudePath),s=b.runSession??((a,b,c)=>aT(a,b,c,{db:k,provider:p,command:r})),t=b.createPr??(a=>o.createPr(a)),u=b.runBabysitter??((a,b)=>bF(a,b,{gh:o,db:k,resumeSession:(a,b,c)=>aU(a,b,c,m.path,{db:k,provider:p,command:r}).then(()=>void 0),autoHeal:m.autoHealCi?{headSha:a=>o.prHeadSha(a),provider:m.platform}:void 0}));try{e=await n.prepare(m,l.id,l.issueNumber),(0,q.yM)(l.id,"worktree",{path:e.path,branch:e.branch},k);let a=(0,aQ.Xm)((0,aQ.yx)(m.id,aP._.main,k),{ISSUE_NUM:l.issueNumber,BRANCH:e.branch,REPO_NAME:m.name});if(m.autoDecompose){let b=bq(m.id,l.issueNumber,k);b.length>0&&(a+=(d=b.map(a=>({title:a.title,status:a.status})),0===d.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",bp(d)].join("\n")),function(a,b,c=(0,g.Lf)()){for(let d of bq(a,b,c))"pending"===d.status&&br(d.id,"in_progress",c)}(m.id,l.issueNumber,k))}let b=await s((0,q.ax)(l.id,k),a,e.path);if(0!==b.exitCode)return(0,q.dk)(l.id,"needs_human",{errorMessage:`${p.label} exited non-zero`},k);if(m.adrGating){let a=(0,bj.Pe)("pending_review",k,m.id);if(a.length>0)return(0,q.dk)(l.id,"needs_human",{errorMessage:`Blocked by ${a.length} pending ADR review(s).`},k)}await n.commitAndPush(e,`Fix #${l.issueNumber}`);let h=(function(a,b=(0,g.Lf)()){return b.select().from(j.issues).where((0,f.eq)(j.issues.repoId,a)).orderBy((0,ae.Y)(j.issues.priority),(0,ae.Y)(j.issues.number)).all()})(m.id,k).find(a=>a.number===l.issueNumber)?.title??`Fix #${l.issueNumber}`,i=await t({head:e.branch,base:m.defaultBranch,title:h,body:`Closes #${l.issueNumber}`});(0,q.dk)(l.id,"ci_running",{branch:e.branch,prNumber:i},k),await c("pr_opened",`🔀 PR opened: ${m.id}#${l.issueNumber} (PR #${i}).`);let o=await u((0,q.ax)(l.id,k),i);return m.autoDecompose&&"merged"===o.status&&function(a,b,c=(0,g.Lf)()){for(let d of bq(a,b,c))!function(a,b){let c=a.status;if("done"!==c&&"skipped"!==c){if("in_progress"===c)return br(a.id,"done",b);br(a.id,"in_progress",b),br(a.id,"done",b)}}(d,c)}(m.id,l.issueNumber,k),o}catch(c){let a=c instanceof Error?c.message:String(c);(0,q.yM)(l.id,"error",{message:a},k);let b=(0,q.ax)(l.id,k);if(["working","ci_running","retrying"].includes(b.status))return(0,q.dk)(l.id,"needs_human",{errorMessage:a.slice(0,500)},k);return b}finally{if(e)try{await n.remove(e,m.path)}catch(a){console.error(`[run-job] worktree cleanup failed for job ${l.id}`,a)}}}let bK=!1,bL=new Set;function bM(a){let b=(0,aV.openSync)(a,"wx");try{(0,aV.writeSync)(b,JSON.stringify({pid:process.pid,ts:Date.now()}))}finally{(0,aV.closeSync)(b)}}let bN={active:!1};function bO(a,b,c,d){var e;let f,g=(f=(e={command:(0,i.mt)(d).claudePath,model:a.defaultModel,cwd:a.path}).runner??A,async a=>{let b=await f(e.command,["-p",["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",e.model],e.cwd);if(0!==b.exitCode)return[];let c=b.stdout.match(/\[[\s\S]*\]/);if(!c)return[];try{let a=JSON.parse(c[0]);if(!Array.isArray(a))return[];return a.filter(a=>"string"==typeof a).map(a=>a.trim()).filter(Boolean)}catch{return[]}});return bH(a,b,c,d,{generate:g})}let bP=["needs_human","aborted"];async function bQ(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&&!!ak(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,[...bP]))).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 bR=["queued","working","ci_running","ci_failed","retrying"],bS=["working","ci_running","ci_failed","retrying"];async function bT(a={}){var b,c,d;let e=a.db??(0,g.Lf)(),k=a.runJob??bI,l=(0,x.uP)(e),m=a.triage??ao,n=a.decompose??bO;for(let c of l)try{await (b=async()=>{let b=a.forgeFor?.(c)??aa(c),d=a.fetchIssues??(async(a,c)=>(await b.refreshRateLimit?.(),b.listAllIssues())),i=await d(c.path,c.queueLabel);!function(a,b,c=(0,g.Lf)()){var d;let e=c.select().from(j.issues).where((0,f.eq)(j.issues.repoId,a)).all(),i=new Map(e.map(a=>[a.number,a])),k=Math.floor(Date.now()/1e3),l=c.select({value:(d=j.issues.priority,(0,h.ll)`max(${d})`.mapWith((0,ag.is)(d,af.V)?d:String))}).from(j.issues).where((0,f.eq)(j.issues.repoId,a)).get(),m=(l?.value??-1)+1,n=new Set;for(let d of b){n.add(d.number);let b=JSON.stringify(d.labels.map(a=>a.name)),e=i.get(d.number);e?c.update(j.issues).set({title:d.title,labels:b,state:"open",syncedAt:k}).where((0,f.eq)(j.issues.id,e.id)).run():c.insert(j.issues).values({repoId:a,number:d.number,title:d.title,labels:b,state:"open",priority:m++,syncedAt:k}).run()}let o=e.filter(a=>!n.has(a.number)).map(a=>a.id);o.length>0&&c.delete(j.issues).where((0,f.RV)(j.issues.id,o)).run()}(c.id,i,e);let k=aj(c);if(k.autoTriageEnabled&&await m(c,b,i,e),k.autoDecompose){let a=i.filter(a=>{let b=a.labels.map(a=>a.name);return b.includes(c.queueLabel)||b.some(a=>k.readyLabels.includes(a))});a.length>0&&await n(c,b,a,e)}for(let a of i){let d=a.labels.map(a=>a.name),h=d.includes(c.queueLabel),i=!!k.autoProcessEnabled&&await bQ(c,k,b,a,d,e);if(!h&&!i)continue;let m=ad({number:a.number,title:a.title,labels:d});if("approved"===m.decision&&!function(a,b,c){return(0,q.i1)([...bR],a).some(a=>a.repoId===b&&a.issueNumber===c)}(e,c.id,a.number)){var l,o;i&&a.author&&k.priorityAuthors.includes(a.author)&&(l=c.id,o=a.number,e.update(j.issues).set({priority:-1}).where((0,f.Uo)((0,f.eq)(j.issues.repoId,l),(0,f.eq)(j.issues.number,o))).run()),function(a,b=(0,g.Lf)()){let c=a.dedupeKey??`${a.repoId}:${a.issueNumber}`;if(!b.select({id:j.jobs.id}).from(j.jobs).where((0,f.Uo)((0,f.eq)(j.jobs.dedupeKey,c),(0,f.KL)(j.jobs.status,[...t.kl]))).get())try{(0,q._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},e)}}},D.run("low",b))}catch(a){a instanceof I?console.debug(`[driver] ${c.name} sweep yielded: ${a.message}`):console.error(`[driver] issue sync failed for ${c.name}`,a)}o("cost_limit"===(0,i.Jf)(e).reason,bN,e);let p=(0,i.mt)(e).maxParallelJobs,s=v();for(;!bK&&(0,i.Jf)(e).allowed&&bL.size<p;){let a=l.filter(a=>(0,i.DA)(a.id,e).allowed).filter(a=>!(a.sequential&&function(a,b){return(0,q.i1)([...bS],a).some(a=>a.repoId===b)}(e,a.id))).map(a=>a.id);if(0===a.length)break;let b=function(a={},b=(0,g.Lf)()){let{repoIds:c}=a;if(c&&0===c.length)return;let d=a.leaseMs??3e4,e=a.worker??v(),i=a.now??u();return b.transaction(a=>{let b=a.select({job:j.jobs}).from(j.jobs).leftJoin(j.issues,(0,f.Uo)((0,f.eq)(j.issues.repoId,j.jobs.repoId),(0,f.eq)(j.issues.number,j.jobs.issueNumber))).where((0,f.Uo)((0,f.eq)(j.jobs.status,"queued"),(0,f.or)((0,f.kZ)(j.jobs.availableAt),(0,f.wJ)(j.jobs.availableAt,i)),c?(0,f.RV)(j.jobs.repoId,c):void 0)).orderBy((0,h.ll)`COALESCE(${j.issues.priority}, 1e9)`,j.jobs.createdAt).get()?.job;if(b)return(0,q.dk)(b.id,"working",{leaseToken:(0,r.randomUUID)(),leaseExpiresAt:i+Math.ceil(d/1e3),workerId:e,attempts:b.attempts+1,availableAt:null},a)})}({repoIds:a,worker:s,leaseMs:3e4},e);if(!b)break;let c=b.id,d=b.leaseToken;bL.add(c);let m=setInterval(()=>{try{!function(a,b,c={},d=(0,g.Lf)()){let e=c.leaseMs??3e4,h=c.now??u();d.update(j.jobs).set({leaseExpiresAt:h+Math.ceil(e/1e3)}).where((0,f.Uo)((0,f.eq)(j.jobs.id,a),(0,f.eq)(j.jobs.leaseToken,b),(0,f.eq)(j.jobs.status,"working"))).run().changes}(c,d,{},e)}catch(a){console.error(`[driver] heartbeat failed for job ${c}`,a)}},1e4);m.unref?.(),k(c).catch(a=>console.error(`[driver] job ${c} failed`,a)).finally(()=>{clearInterval(m),function(a,b,c=(0,g.Lf)()){c.update(j.jobs).set({leaseToken:null,leaseExpiresAt:null,workerId:null}).where((0,f.Uo)((0,f.eq)(j.jobs.id,a),(0,f.eq)(j.jobs.leaseToken,b))).run().changes}(c,d,e),bL.delete(c)})}let w=a.reviewFeedback??(a=>bh({db:a}));try{await (c=()=>w(e),D.run("low",c))}catch(a){console.error("[driver] review-feedback sweep failed",a)}let y=a.deploymentHealing??(a=>a2({db:a}));try{await (d=()=>y(e),D.run("low",d))}catch(a){console.error("[driver] deployment-healing sweep failed",a)}}let bU=!1,bV=!1,bW=!1,bX=new Map;function bY(a,b){bX.set(a,b)}function bZ(a){bX.delete(a)}async function b$(){for(let a of(bK=!0,bU=!1,e&&clearTimeout(e),e=void 0,await p().catch(a=>console.error("[orchestrator] drain notify failed",a)),bX.values()))a(5e3);bX.clear(),await function(a=3e4,b=100){let c=Date.now()+a;return new Promise(a=>{let d=()=>{if(0===bL.size||Date.now()>=c)return a();setTimeout(d,b)};d()})}(5e3);try{let a=(0,g.Lf)();for(let b of a.select().from(j.jobs).where((0,f.RV)(j.jobs.status,["working","ci_running","ci_failed","retrying"])).all())try{(0,q.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 b_(){if(bW)return;if(bW=!0,!process.env.VITEST){try{let{requeued:a,interrupted:b}=function(a=(0,g.Lf)()){return{requeued:function(a={},b=(0,g.Lf)()){let c=a.now??u(),d=a.expiredBefore,e=void 0===d?void 0:(0,f.or)((0,f.kZ)(j.jobs.leaseExpiresAt),(0,f.wJ)(j.jobs.leaseExpiresAt,d)),h=b.select().from(j.jobs).where((0,f.Uo)((0,f.eq)(j.jobs.status,"working"),e)).all();for(let a of h)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,f.eq)(j.jobs.id,a.id)).run(),(0,q.yM)(a.id,"status",{from:"working",to:"queued",reason:"lease_expired"},b);return h.length}({},a),interrupted:function(a=(0,g.Lf)()){let b=a.select().from(j.jobs).where((0,f.RV)(j.jobs.status,w)).all();for(let c of b)a.update(j.jobs).set({status:"interrupted"}).where((0,f.eq)(j.jobs.id,c.id)).run(),(0,q.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,aJ.join)(aK(),"instance.lock");(0,aV.mkdirSync)((0,aJ.dirname)(a),{recursive:!0});try{return bM(a),!0}catch{}let b=!1;try{let{pid:c}=JSON.parse((0,aV.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,aV.unlinkSync)(a),bM(a),!0}catch{return!1}}()){let a,b;!function(a={}){if(bU)return;bU=!0;let b=a.tick??(()=>bT()),c=a.intervalMs??1e3*(0,i.mt)().pollIntervalSec,d=async()=>{if(bU){if(!bV){bV=!0;try{await b()}catch(a){console.error("[driver] tick failed",a)}finally{bV=!1}}bU&&(e=setTimeout(d,c))}};d()}(),(a=()=>{try{let{jobEventsDeleted:a}=function(a=(0,g.Lf)(),b={}){let c=b.days??(0,i.mt)(a).retentionDays,d=b.vacuum??!0,e=Math.floor((b.now?.getTime()??Date.now())/1e3)-86400*c,k=a.select({id:j.jobs.id}).from(j.jobs).where((0,f.Uo)((0,f.Pe)(j.jobs.finishedAt),(0,f.lt)(j.jobs.finishedAt,e))).all().map(a=>a.id),l=0;return k.length>0&&(l=a.delete(j.jobEvents).where((0,f.RV)(j.jobEvents.jobId,k)).run().changes),d&&a.run((0,h.ll)`VACUUM`),{jobEventsDeleted:l,vacuumed:d,cutoff:e}}((0,g.Lf)());a>0&&console.log(`[orchestrator] pruned ${a} job event(s)`)}catch(a){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 b$(),process.exit(0)};process.once("SIGINT",a),process.once("SIGTERM",a)}},36639:(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];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}},46146:(a,b,c)=>{c.d(b,{ad:()=>j,eV:()=>k,SR:()=>n,eY:()=>o,FL:()=>l,ED:()=>r,LR:()=>q,X:()=>p});var d=c(37003),e=c(97337),f=c(2937),g=c(93929);let h={monitoring:["healthy","failed","escalated"],failed:["repairing","escalated"],repairing:["repaired","escalated"],healthy:[],repaired:[],escalated:[]};class i extends Error{constructor(a,b){super(`invalid deployment-healing transition: ${a} -> ${b}`)}}let j={initialDelayMs:6e4,intervalMs:6e4,timeoutMs:12e5,monitorWindowMs:36e5,maxLogLines:200};function k(a){return"ready"===a?"ready":"error"===a?"error":"pending"}function l(a){let b=a.now-a.createdAt;return b<a.initialDelayMs?"wait":b>=a.timeoutMs?"timeout":a.lastPolledAt<=a.createdAt||a.now-a.lastPolledAt>=a.intervalMs?"poll":"wait"}function m(){return Math.floor(Date.now()/1e3)}function n(a,b,c=(0,f.Lf)()){return c.select().from(g.deploymentHealingSessions).where((0,d.eq)(g.deploymentHealingSessions.jobId,a)).all().some(a=>a.commitSha===b)}function o(a,b,c,e,h=(0,f.Lf)()){let i=h.select().from(g.deploymentHealingSessions).where((0,d.eq)(g.deploymentHealingSessions.jobId,a)).all().find(a=>a.commitSha===e);return i||h.insert(g.deploymentHealingSessions).values({jobId:a,prNumber:b,platform:c,commitSha:e}).returning().get()}function p(a,b,c={},e=(0,f.Lf)()){let j=function(a,b=(0,f.Lf)()){return b.select().from(g.deploymentHealingSessions).where((0,d.eq)(g.deploymentHealingSessions.id,a)).get()}(a,e);if(!j)throw Error(`deployment healing session ${a} not found`);var k=j.status;if(!h[k].includes(b))throw new i(k,b);return e.update(g.deploymentHealingSessions).set({status:b,updatedAt:m(),...c}).where((0,d.eq)(g.deploymentHealingSessions.id,a)).returning().get()}function q(a,b=(0,f.Lf)()){b.update(g.deploymentHealingSessions).set({updatedAt:m()}).where((0,d.eq)(g.deploymentHealingSessions.id,a)).run()}function r(a,b=(0,f.Lf)(),c=10){return b.select({id:g.deploymentHealingSessions.id,jobId:g.deploymentHealingSessions.jobId,issueNumber:g.jobs.issueNumber,prNumber:g.deploymentHealingSessions.prNumber,platform:g.deploymentHealingSessions.platform,commitSha:g.deploymentHealingSessions.commitSha,status:g.deploymentHealingSessions.status,followupPrNumber:g.deploymentHealingSessions.followupPrNumber,updatedAt:g.deploymentHealingSessions.updatedAt}).from(g.deploymentHealingSessions).innerJoin(g.jobs,(0,d.eq)(g.jobs.id,g.deploymentHealingSessions.jobId)).where((0,d.eq)(g.jobs.repoId,a)).orderBy((0,e.i)(g.deploymentHealingSessions.updatedAt)).limit(c).all()}},50813:(a,b,c)=>{c.d(b,{F1:()=>l,yO:()=>n,Xm:()=>k,yx:()=>m});var d=c(37003),e=c(97337),f=c(93774),g=c(2937),h=c(93929),i=c(20031);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}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)()){return l(a,b,c)?.content??i.E[b]??""}function n(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()})},51026:(a,b,c)=>{c.d(b,{Bt:()=>m,OM:()=>l,YA:()=>k,i_:()=>j});var d=c(90109),e=c(37003),f=c(97337),g=c(2937),h=c(93929);let i=a=>void 0===a?void 0:(0,d.ll)`${h.jobs.repoId} = ${a}`;function j(a=(0,g.Lf)(),b){return a.select({day:(0,d.ll)`strftime('%Y-%m-%d', ${h.jobs.startedAt}, 'unixepoch')`,inputTokens:(0,d.ll)`coalesce(sum(${h.jobs.totalInputTokens}), 0)`,outputTokens:(0,d.ll)`coalesce(sum(${h.jobs.totalOutputTokens}), 0)`,costUsd:(0,d.ll)`coalesce(sum(${h.jobs.costUsd}), 0)`}).from(h.jobs).where((0,e.Uo)((0,d.ll)`${h.jobs.startedAt} is not null`,i(b))).groupBy((0,d.ll)`1`).orderBy((0,d.ll)`1 desc`).all()}function k(a=(0,g.Lf)(),b){return a.select({model:(0,d.ll)`coalesce(${h.jobs.model}, 'unknown')`,costUsd:(0,d.ll)`coalesce(sum(${h.jobs.costUsd}), 0)`}).from(h.jobs).where(i(b)).groupBy(h.jobs.model).all()}function l(a=10,b=(0,g.Lf)(),c){return b.select().from(h.jobs).where(i(c)).orderBy((0,f.i)(h.jobs.costUsd)).limit(a).all()}function m(a=(0,g.Lf)(),b){let c=(0,d.ll)`strftime('%Y-%m-%d', ${h.jobs.startedAt}, 'unixepoch') = strftime('%Y-%m-%d', 'now')`,f=a.select({total:(0,d.ll)`coalesce(sum(${h.jobs.costUsd}), 0)`}).from(h.jobs).where((0,e.Uo)(c,i(b))).get();return f?.total??0}},53566:(a,b,c)=>{c.d(b,{op:()=>m,Bz:()=>x,Az:()=>u,VJ:()=>v,dT:()=>r,ZM:()=>n,ZA:()=>w,Z7:()=>t,Yv:()=>s,I0:()=>o});var d=c(37003),e=c(90109),f=c(97337),g=c(2937),h=c(93929);let i=["healed","blocked","escalated","superseded"],j=["blocked","escalated","superseded"],k={triaging:["awaiting_slot",...j],awaiting_slot:["repairing",...j],repairing:["awaiting_ci",...j],awaiting_ci:["verifying",...j],verifying:["healed","cooldown",...j],cooldown:["awaiting_slot",...j],healed:[],blocked:[],escalated:[],superseded:[]};class l extends Error{constructor(a,b){super(`invalid healing transition: ${a} -> ${b}`)}}let m={maxHealAttemptsPerSession:3,maxHealAttemptsPerFingerprint:2,cooldownMs:9e5,maxConcurrentHealingRuns:1,maxEvidenceLines:200};function n(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}}function o(a){return a.afterSha===a.beforeSha?{verdict:"rejected",reason:"no change pushed (no new commit)"}:a.afterFailingCount>=a.beforeFailingCount?{verdict:"rejected",reason:"no measurable improvement in failing checks"}:0===a.afterFailingCount?{verdict:"healed",reason:"all checks green"}:{verdict:"progressed",reason:"fewer checks failing"}}let p=["repairing","awaiting_ci","verifying"];function q(a,b=(0,g.Lf)()){return b.select().from(h.healingSessions).where((0,d.eq)(h.healingSessions.id,a)).get()}function r(a,b,c,e=(0,g.Lf)()){let f=e.select().from(h.healingSessions).where((0,d.eq)(h.healingSessions.prNumber,b)).all();for(let a of f){var j;a.headSha===c||(j=a.status,i.includes(j))||s(a.id,"superseded",e)}let k=f.find(a=>a.headSha===c);return k?q(k.id,e)??k:e.insert(h.healingSessions).values({jobId:a,prNumber:b,headSha:c}).returning().get()}function s(a,b,c=(0,g.Lf)()){let e=q(a,c);if(!e)throw Error(`healing session ${a} not found`);var f=e.status;if(!k[f].includes(b))throw new l(f,b);return c.update(h.healingSessions).set({status:b,updatedAt:Math.floor(Date.now()/1e3)}).where((0,d.eq)(h.healingSessions.id,a)).returning().get()}function t(a,b,c,d=(0,g.Lf)()){return d.insert(h.healingAttempts).values({sessionId:a,fingerprint:b.fingerprint,category:b.category,checkName:b.checkName,beforeSha:c}).returning().get()}function u(a,b,c=(0,g.Lf)()){c.update(h.healingAttempts).set({status:b.status,afterSha:b.afterSha??null}).where((0,d.eq)(h.healingAttempts.id,a)).run()}function v(a,b=(0,g.Lf)()){return b.select().from(h.healingAttempts).where((0,d.eq)(h.healingAttempts.sessionId,a)).all()}function w(a,b=(0,g.Lf)(),c=10){return b.select({id:h.healingSessions.id,jobId:h.healingSessions.jobId,issueNumber:h.jobs.issueNumber,prNumber:h.healingSessions.prNumber,headSha:h.healingSessions.headSha,status:h.healingSessions.status,updatedAt:h.healingSessions.updatedAt,attempts:(0,e.ll)`(select count(*) from ${h.healingAttempts} where ${h.healingAttempts.sessionId} = ${h.healingSessions.id})`}).from(h.healingSessions).innerJoin(h.jobs,(0,d.eq)(h.jobs.id,h.healingSessions.jobId)).where((0,d.eq)(h.jobs.repoId,a)).orderBy((0,f.i)(h.healingSessions.updatedAt)).limit(c).all()}function x(a=(0,g.Lf)()){return a.select().from(h.healingSessions).all().filter(a=>p.includes(a.status)).length}},68464:(a,b,c)=>{c.d(b,{Je:()=>k,L8:()=>i,Zc:()=>n,m:()=>m,uP:()=>h,zy:()=>j});var d=c(97337),e=c(37003),f=c(2937),g=c(93929);function h(a=(0,f.Lf)()){return a.select().from(g.repos).orderBy((0,d.i)(g.repos.createdAt)).all()}function i(a,b=(0,f.Lf)()){return b.select().from(g.repos).where((0,e.eq)(g.repos.id,a)).get()}function j(a=(0,f.Lf)()){return a.select().from(g.jobs).innerJoin(g.repos,(0,e.eq)(g.jobs.repoId,g.repos.id)).where((0,e.eq)(g.jobs.status,"needs_human")).orderBy((0,d.i)(g.jobs.finishedAt)).all().map(a=>({...a.jobs,repoName:a.repos.name}))}function k(a=(0,f.Lf)()){return h(a).map(b=>{let c=a.select().from(g.jobs).where((0,e.eq)(g.jobs.repoId,b.id)).orderBy((0,d.i)(g.jobs.createdAt)).all(),f=a=>c.filter(b=>a.includes(b.status)).length;return{...b,activeJobs:f(["queued","working","ci_running","retrying"]),queuedCount:f(["queued"]),workingCount:f(["working","ci_running","retrying"]),mergedCount:f(["merged"]),recentJobs:c.slice(0,5)}})}let l=["queued","working","ci_running","retrying"];function m(a,b=(0,f.Lf)()){let c=i(a,b);if(!c)return;let h=b.select().from(g.issues).where((0,e.eq)(g.issues.repoId,a)).orderBy((0,d.Y)(g.issues.priority),(0,d.Y)(g.issues.number)).all(),j=b.select().from(g.jobs).where((0,e.eq)(g.jobs.repoId,a)).orderBy((0,d.i)(g.jobs.createdAt)).all();return{repo:c,issues:h,activeJob:j.find(a=>l.includes(a.status)),recentJobs:j.slice(0,8)}}function n(a=(0,f.Lf)()){let b=a.select().from(g.jobs).all(),c=a=>b.filter(b=>a.includes(b.status)).length;return{repos:a.select().from(g.repos).all().length,queued:c(["queued"]),running:c(["working","ci_running","retrying"]),merged:c(["merged"]),needsHuman:c(["needs_human"])}}},68476:(a,b,c)=>{c.d(b,{N6:()=>m,_S:()=>i,ax:()=>j,dk:()=>l,i1:()=>n,yM:()=>k});var d=c(37003),e=c(97337),f=c(2937),g=c(93929),h=c(23791);function i(a,b=(0,f.Lf)()){return 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()}function j(a,b=(0,f.Lf)()){return b.select().from(g.jobs).where((0,d.eq)(g.jobs.id,a)).get()}function k(a,b,c,d=(0,f.Lf)()){d.insert(g.jobEvents).values({jobId:a,type:b,payload:JSON.stringify(c??{})}).run()}function l(a,b,c={},e=(0,f.Lf)()){let i=j(a,e);if(!i)throw Error(`job ${a} not found`);(0,h.QJ)(i.status,b);let m=Math.floor(Date.now()/1e3),n={};"working"!==b||i.startedAt||(n.startedAt=m),["merged","needs_human","aborted"].includes(b)&&(n.finishedAt=m);let o=e.update(g.jobs).set({...n,...c,status:b}).where((0,d.eq)(g.jobs.id,a)).returning().get();return k(a,"status",{from:i.status,to:b},e),o}function m(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 n(a,b=(0,f.Lf)()){return b.select().from(g.jobs).where((0,d.RV)(g.jobs.status,a)).all()}},78293:(a,b,c)=>{c.d(b,{mt:()=>k,Jf:()=>l,DA:()=>m});var d=c(37003),e=c(93774),f=c(2937),g=c(51026),h=c(93929);let i=["needs_human","job_failed","pr_opened","pr_merged","cost_limit","automation_paused"],j=e.Ik({paused:e.zM().default(!1),dailyCostLimitUsd:e.ai().nonnegative().default(10),pollIntervalSec:e.ai().int().positive().default(30),maxTurns:e.ai().int().positive().default(40),defaultModel:e.Yj().default("claude-opus-4-7"),defaultAgent:e.k5(["claude","codex"]).default("claude"),claudePath:e.Yj().default("claude"),codexPath:e.Yj().default("codex"),ghPath:e.Yj().default("gh"),maxParallelJobs:e.ai().int().positive().default(3),telegramBotToken:e.Yj().default(""),telegramChatId:e.Yj().default(""),slackWebhookUrl:e.Yj().default(""),smtpHost:e.Yj().default(""),smtpPort:e.ai().int().positive().default(587),smtpUser:e.Yj().default(""),smtpPass:e.Yj().default(""),emailFrom:e.Yj().default(""),emailTo:e.Yj().default(""),notifyEvents:e.YO(e.k5(i)).default([...i]),retentionDays:e.ai().int().positive().default(30)});function k(a=(0,f.Lf)()){let b=a.select().from(h.settings).where((0,d.eq)(h.settings.key,"global")).get();if(!b)return j.parse({});try{return j.parse(JSON.parse(b.value))}catch{return j.parse({})}}function l(a=(0,f.Lf)()){let b=k(a);return b.paused?{allowed:!1,reason:"paused"}:(0,g.Bt)(a)>=b.dailyCostLimitUsd?{allowed:!1,reason:"cost_limit"}:{allowed:!0}}function m(a,b=(0,f.Lf)()){let c=b.select().from(h.repos).where((0,d.eq)(h.repos.id,a)).get();return!c||(0,g.Bt)(b,a)>=c.dailyCostLimitUsd?{allowed:!1,reason:"repo_cost_limit"}:{allowed:!0}}}};
@@ -1 +0,0 @@
1
- exports.id=21,exports.ids=[21],exports.modules={2210:(a,b,c)=>{"use strict";function d(...a){return a.filter(Boolean).join(" ")}c.d(b,{cn:()=>d})},2937:(a,b,c)=>{"use strict";let d;c.d(b,{Lf:()=>k});var e=c(73024),f=c(76760),g=c(87550),h=c.n(g),i=c(96652),j=c(93929);function k(){if(!d){var a;let b;":memory:"!==(a=process.env.DRYDOCK_DB??(0,f.resolve)(process.cwd(),"data/drydock.db"))&&(0,e.mkdirSync)((0,f.dirname)(a),{recursive:!0}),(b=new(h())(a)).pragma("journal_mode = WAL"),b.pragma("foreign_keys = ON"),function(a){let b,c=process.env.DRYDOCK_MIGRATIONS??(0,f.resolve)(process.cwd(),"drizzle");try{b=(0,e.readdirSync)(c).filter(a=>a.endsWith(".sql")).sort()}catch{return}a.exec("CREATE TABLE IF NOT EXISTS __migrations (name TEXT PRIMARY KEY)");let d=new Set(a.prepare("SELECT name FROM __migrations").all().map(a=>a.name)),g=a.prepare("INSERT INTO __migrations (name) VALUES (?)");for(let h of b){if(d.has(h))continue;let b=(0,e.readFileSync)((0,f.join)(c,h),"utf8");a.transaction(()=>{for(let c of b.split("--\x3e statement-breakpoint")){let b=c.trim();b&&a.exec(b)}g.run(h)})()}}(b),d=(0,i.f)(b,{schema:j}),Promise.all([c.e(774),c.e(152)]).then(c.bind(c,35152)).then(a=>a.startOrchestrator()).catch(a=>console.error("[orchestrator] bootstrap failed",a))}return d}},4356:(a,b,c)=>{"use strict";c.d(b,{d:()=>m,t:()=>l});var d=c(37477),e=c(42700),f=c(95024),g=c(51499),h=c(37561),i=c(54848),j=c(2210);let k=(0,i.createContext)(null);function l({children:a}){let[b,c]=(0,i.useState)([]),e=(0,i.useCallback)(a=>{c(b=>b.filter(b=>b.id!==a))},[]),f=(0,i.useCallback)(a=>{let b=Date.now()+Math.random(),d={id:b,title:a.title,description:a.description,variant:a.variant??"info"};c(a=>[...a,d]),setTimeout(()=>e(b),5e3)},[e]),g=(0,i.useMemo)(()=>({toast:f,success:(a,b)=>f({title:a,description:b,variant:"success"}),error:(a,b)=>f({title:a,description:b,variant:"error"})}),[f]);return(0,d.jsxs)(k.Provider,{value:g,children:[a,(0,d.jsx)(p,{toasts:b,onDismiss:e})]})}function m(){let a=(0,i.useContext)(k);if(!a)throw Error("useToast must be used within a ToastProvider");return a}let n={success:e.A,error:f.A,info:g.A},o={success:"text-success",error:"text-destructive",info:"text-muted-foreground"};function p({toasts:a,onDismiss:b}){return 0===a.length?null:(0,d.jsx)("div",{className:"pointer-events-none fixed bottom-4 right-4 z-[60] flex w-full max-w-sm flex-col gap-2",children:a.map(a=>{let c=n[a.variant];return(0,d.jsxs)("output",{"aria-live":"polite",className:"pointer-events-auto flex items-start gap-3 rounded-xl border border-card-border bg-card p-3 shadow-lg",children:[(0,d.jsx)(c,{className:(0,j.cn)("mt-0.5 h-4 w-4 shrink-0",o[a.variant])}),(0,d.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,d.jsx)("p",{className:"text-sm font-medium",children:a.title}),a.description&&(0,d.jsx)("p",{className:"mt-0.5 text-xs text-muted-foreground",children:a.description})]}),(0,d.jsx)("button",{type:"button","aria-label":"Dismiss notification",onClick:()=>b(a.id),className:"shrink-0 rounded-md p-0.5 text-muted-foreground hover-elevate",children:(0,d.jsx)(h.A,{className:"h-3.5 w-3.5"})})]},a.id)})})}},22674:(a,b,c)=>{Promise.resolve().then(c.bind(c,89402)),Promise.resolve().then(c.bind(c,99168))},24532:(a,b,c)=>{"use strict";c.d(b,{Pe:()=>g,dj:()=>h});var d=c(37003),e=c(2937),f=c(93929);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}},30028:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,74111,23))},36108:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,5381,23))},36182:(a,b,c)=>{"use strict";c.d(b,{AppShell:()=>r});var d=c(37477),e=c(60372),f=c(35178),g=c(71416),h=c.n(g),i=c(1087),j=c(43207),k=c(37412),l=c(56556),m=c(54848),n=c(78233);function o(){let{resolvedTheme:a,setTheme:b}=(0,l.D)(),[c,e]=(0,m.useState)(!1),f="dark"===a;return(0,d.jsx)(n.$,{variant:"ghost",size:"icon","aria-label":"Toggle theme",onClick:()=>b(f?"light":"dark"),children:c&&f?(0,d.jsx)(j.A,{}):(0,d.jsx)(k.A,{})})}var p=c(2210);let q=[{href:"/",label:"Dashboard"},{href:"/needs-human",label:"Needs human"},{href:"/prompts",label:"Prompts"},{href:"/adrs",label:"ADRs"},{href:"/costs",label:"Costs"},{href:"/settings",label:"Settings"}];function r({children:a,adrPending:b=0,needsHuman:c=0,paused:g=!1}){let j=(0,i.usePathname)();return(0,d.jsxs)("div",{className:"min-h-screen bg-background",children:[(0,d.jsx)("header",{className:"sticky top-0 z-30 border-b border-border bg-background/80 backdrop-blur",children:(0,d.jsxs)("div",{className:"mx-auto flex h-12 max-w-7xl items-center gap-1 px-4",children:[(0,d.jsxs)(h(),{href:"/",className:"mr-3 flex items-center gap-2",children:[(0,d.jsx)("span",{className:"flex h-6 w-6 items-center justify-center rounded-md bg-primary text-primary-foreground",children:(0,d.jsx)(e.A,{className:"h-3.5 w-3.5"})}),(0,d.jsx)("span",{className:"text-sm font-semibold tracking-tight",children:"Drydock"})]}),(0,d.jsx)("nav",{className:"flex items-center gap-0.5",children:q.map(a=>{var e;let f="/"===(e=a.href)?"/"===j:j.startsWith(e);return(0,d.jsxs)(h(),{href:a.href,className:(0,p.cn)("flex items-center gap-1.5 rounded-md px-3 py-1.5 text-sm transition-colors hover-elevate",f?"bg-accent font-medium text-accent-foreground":"text-muted-foreground"),children:[a.label,"/adrs"===a.href&&b>0&&(0,d.jsx)("span",{className:"rounded-full bg-destructive px-1.5 text-[10px] font-semibold text-destructive-foreground",children:b}),"/needs-human"===a.href&&c>0&&(0,d.jsx)("span",{className:"rounded-full bg-destructive px-1.5 text-[10px] font-semibold text-destructive-foreground",children:c})]},a.href)})}),(0,d.jsxs)("div",{className:"ml-auto flex items-center gap-2",children:[g&&(0,d.jsxs)(h(),{href:"/settings","aria-label":"Automation paused — open settings",className:"flex items-center gap-1.5 rounded-md border border-warning-border bg-warning-muted px-2 py-1 text-xs font-medium text-warning",children:[(0,d.jsx)(f.A,{className:"h-3.5 w-3.5"}),"Paused"]}),(0,d.jsx)(o,{})]})]})}),(0,d.jsx)("main",{className:"mx-auto max-w-7xl px-4 py-6",children:a})]})}},51026:(a,b,c)=>{"use strict";c.d(b,{Bt:()=>m,OM:()=>l,YA:()=>k,i_:()=>j});var d=c(90109),e=c(37003),f=c(97337),g=c(2937),h=c(93929);let i=a=>void 0===a?void 0:(0,d.ll)`${h.jobs.repoId} = ${a}`;function j(a=(0,g.Lf)(),b){return a.select({day:(0,d.ll)`strftime('%Y-%m-%d', ${h.jobs.startedAt}, 'unixepoch')`,inputTokens:(0,d.ll)`coalesce(sum(${h.jobs.totalInputTokens}), 0)`,outputTokens:(0,d.ll)`coalesce(sum(${h.jobs.totalOutputTokens}), 0)`,costUsd:(0,d.ll)`coalesce(sum(${h.jobs.costUsd}), 0)`}).from(h.jobs).where((0,e.Uo)((0,d.ll)`${h.jobs.startedAt} is not null`,i(b))).groupBy((0,d.ll)`1`).orderBy((0,d.ll)`1 desc`).all()}function k(a=(0,g.Lf)(),b){return a.select({model:(0,d.ll)`coalesce(${h.jobs.model}, 'unknown')`,costUsd:(0,d.ll)`coalesce(sum(${h.jobs.costUsd}), 0)`}).from(h.jobs).where(i(b)).groupBy(h.jobs.model).all()}function l(a=10,b=(0,g.Lf)(),c){return b.select().from(h.jobs).where(i(c)).orderBy((0,f.i)(h.jobs.costUsd)).limit(a).all()}function m(a=(0,g.Lf)(),b){let c=(0,d.ll)`strftime('%Y-%m-%d', ${h.jobs.startedAt}, 'unixepoch') = strftime('%Y-%m-%d', 'now')`,f=a.select({total:(0,d.ll)`coalesce(sum(${h.jobs.costUsd}), 0)`}).from(h.jobs).where((0,e.Uo)(c,i(b))).get();return f?.total??0}},63107:()=>{},63475:()=>{},63697:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>p,dynamic:()=>n,metadata:()=>o});var d=c(39747),e=c(58672),f=c.n(e),g=c(43453),h=c.n(g),i=c(89402),j=c(99168),k=c(24532),l=c(68464),m=c(78293);c(63475);let n="force-dynamic",o={title:"Drydock",description:"Autonomously process GitHub issues via Claude Code"};function p({children:a}){let b=0,c=0,e=!1;try{b=(0,k.dj)(),c=(0,l.zy)().length,e=(0,m.mt)().paused}catch{}return(0,d.jsx)("html",{lang:"en",className:`${f().variable} ${h().variable}`,suppressHydrationWarning:!0,children:(0,d.jsx)("body",{children:(0,d.jsx)(j.Providers,{children:(0,d.jsx)(i.AppShell,{adrPending:b,needsHuman:c,paused:e,children:a})})})})}},63787:()=>{},68464:(a,b,c)=>{"use strict";c.d(b,{Je:()=>k,L8:()=>i,Zc:()=>n,m:()=>m,uP:()=>h,zy:()=>j});var d=c(97337),e=c(37003),f=c(2937),g=c(93929);function h(a=(0,f.Lf)()){return a.select().from(g.repos).orderBy((0,d.i)(g.repos.createdAt)).all()}function i(a,b=(0,f.Lf)()){return b.select().from(g.repos).where((0,e.eq)(g.repos.id,a)).get()}function j(a=(0,f.Lf)()){return a.select().from(g.jobs).innerJoin(g.repos,(0,e.eq)(g.jobs.repoId,g.repos.id)).where((0,e.eq)(g.jobs.status,"needs_human")).orderBy((0,d.i)(g.jobs.finishedAt)).all().map(a=>({...a.jobs,repoName:a.repos.name}))}function k(a=(0,f.Lf)()){return h(a).map(b=>{let c=a.select().from(g.jobs).where((0,e.eq)(g.jobs.repoId,b.id)).orderBy((0,d.i)(g.jobs.createdAt)).all(),f=a=>c.filter(b=>a.includes(b.status)).length;return{...b,activeJobs:f(["queued","working","ci_running","retrying"]),queuedCount:f(["queued"]),workingCount:f(["working","ci_running","retrying"]),mergedCount:f(["merged"]),recentJobs:c.slice(0,5)}})}let l=["queued","working","ci_running","retrying"];function m(a,b=(0,f.Lf)()){let c=i(a,b);if(!c)return;let h=b.select().from(g.issues).where((0,e.eq)(g.issues.repoId,a)).orderBy((0,d.Y)(g.issues.priority),(0,d.Y)(g.issues.number)).all(),j=b.select().from(g.jobs).where((0,e.eq)(g.jobs.repoId,a)).orderBy((0,d.i)(g.jobs.createdAt)).all();return{repo:c,issues:h,activeJob:j.find(a=>l.includes(a.status)),recentJobs:j.slice(0,8)}}function n(a=(0,f.Lf)()){let b=a.select().from(g.jobs).all(),c=a=>b.filter(b=>a.includes(b.status)).length;return{repos:a.select().from(g.repos).all().length,queued:c(["queued"]),running:c(["working","ci_running","retrying"]),merged:c(["merged"]),needsHuman:c(["needs_human"])}}},69530:(a,b,c)=>{Promise.resolve().then(c.bind(c,36182)),Promise.resolve().then(c.bind(c,75922))},72388:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,74111,23)),Promise.resolve().then(c.t.bind(c,35598,23)),Promise.resolve().then(c.t.bind(c,77192,23)),Promise.resolve().then(c.t.bind(c,22047,23)),Promise.resolve().then(c.t.bind(c,99607,23)),Promise.resolve().then(c.t.bind(c,25241,23)),Promise.resolve().then(c.t.bind(c,60518,23)),Promise.resolve().then(c.t.bind(c,89871,23))},75922:(a,b,c)=>{"use strict";c.d(b,{Providers:()=>g});var d=c(37477),e=c(56556),f=c(4356);function g({children:a}){return(0,d.jsx)(e.N,{attribute:"class",defaultTheme:"light",enableSystem:!1,disableTransitionOnChange:!0,children:(0,d.jsx)(f.t,{children:a})})}},78233:(a,b,c)=>{"use strict";c.d(b,{$:()=>i});var d=c(37477),e=c(54848),f=c(2210);let g={default:"bg-primary text-primary-foreground shadow-xs hover-elevate active-elevate-2",secondary:"bg-secondary text-secondary-foreground hover-elevate active-elevate-2",outline:"border border-border bg-transparent shadow-xs hover-elevate active-elevate-2",destructive:"bg-destructive text-destructive-foreground shadow-xs hover-elevate active-elevate-2",ghost:"border border-transparent hover-elevate active-elevate-2"},h={default:"h-9 px-4 py-2 rounded-lg text-sm",sm:"h-8 px-3 rounded-md text-xs",lg:"h-10 px-8 rounded-lg text-sm",icon:"h-9 w-9 rounded-lg"},i=e.forwardRef(({className:a,variant:b="default",size:c="default",...e},i)=>(0,d.jsx)("button",{ref:i,className:(0,f.cn)("inline-flex items-center justify-center gap-2 whitespace-nowrap font-medium transition-colors","focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring","disabled:pointer-events-none disabled:opacity-50","[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",g[b],h[c],a),...e}));i.displayName="Button"},78293:(a,b,c)=>{"use strict";c.d(b,{mt:()=>k,Jf:()=>l,DA:()=>m});var d=c(37003),e=c(93774),f=c(2937),g=c(51026),h=c(93929);let i=["needs_human","job_failed","pr_opened","pr_merged","cost_limit","automation_paused"],j=e.Ik({paused:e.zM().default(!1),dailyCostLimitUsd:e.ai().nonnegative().default(10),pollIntervalSec:e.ai().int().positive().default(30),maxTurns:e.ai().int().positive().default(40),defaultModel:e.Yj().default("claude-opus-4-7"),defaultAgent:e.k5(["claude","codex"]).default("claude"),claudePath:e.Yj().default("claude"),codexPath:e.Yj().default("codex"),ghPath:e.Yj().default("gh"),maxParallelJobs:e.ai().int().positive().default(3),telegramBotToken:e.Yj().default(""),telegramChatId:e.Yj().default(""),slackWebhookUrl:e.Yj().default(""),smtpHost:e.Yj().default(""),smtpPort:e.ai().int().positive().default(587),smtpUser:e.Yj().default(""),smtpPass:e.Yj().default(""),emailFrom:e.Yj().default(""),emailTo:e.Yj().default(""),notifyEvents:e.YO(e.k5(i)).default([...i]),retentionDays:e.ai().int().positive().default(30)});function k(a=(0,f.Lf)()){let b=a.select().from(h.settings).where((0,d.eq)(h.settings.key,"global")).get();if(!b)return j.parse({});try{return j.parse(JSON.parse(b.value))}catch{return j.parse({})}}function l(a=(0,f.Lf)()){let b=k(a);return b.paused?{allowed:!1,reason:"paused"}:(0,g.Bt)(a)>=b.dailyCostLimitUsd?{allowed:!1,reason:"cost_limit"}:{allowed:!0}}function m(a,b=(0,f.Lf)()){let c=b.select().from(h.repos).where((0,d.eq)(h.repos.id,a)).get();return!c||(0,g.Bt)(b,a)>=c.dailyCostLimitUsd?{allowed:!1,reason:"repo_cost_limit"}:{allowed:!0}}},89402:(a,b,c)=>{"use strict";c.d(b,{AppShell:()=>d});let d=(0,c(37251).registerClientReference)(function(){throw Error("Attempted to call AppShell() from the server but AppShell is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/work/drydock/drydock/src/components/app-shell.tsx","AppShell")},93929:(a,b,c)=>{"use strict";c.r(b),c.d(b,{adrs:()=>n,deploymentHealingSessions:()=>u,followupIssues:()=>o,healingAttempts:()=>r,healingSessions:()=>q,issueSubtasks:()=>t,issues:()=>p,jobEvents:()=>m,jobs:()=>l,promptTemplates:()=>k,repos:()=>j,reviewFeedbackItems:()=>s,settings:()=>v});var d=c(90109),e=c(55215),f=c(38151),g=c(71126),h=c(72717),i=c(2049);let j=(0,e.D)("repos",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),path:(0,g.Qq)("path").notNull(),name:(0,g.Qq)("name").notNull(),defaultBranch:(0,g.Qq)("default_branch").notNull().default("main"),queueLabel:(0,g.Qq)("queue_label").notNull().default("drydock:queue"),workingLabel:(0,g.Qq)("working_label").notNull().default("drydock:working"),needsHumanLabel:(0,g.Qq)("needs_human_label").notNull().default("drydock:needs-human"),defaultModel:(0,g.Qq)("default_model").notNull().default("claude-opus-4-7"),agent:(0,g.Qq)("agent").notNull().default("claude"),platform:(0,g.Qq)("platform").notNull().default("github"),apiBaseUrl:(0,g.Qq)("api_base_url"),apiToken:(0,g.Qq)("api_token"),dailyCostLimitUsd:(0,h.x)("daily_cost_limit_usd").notNull().default(10),adrGating:(0,f.nd)("adr_gating",{mode:"boolean"}).notNull().default(!1),sequential:(0,f.nd)("sequential",{mode:"boolean"}).notNull().default(!0),autoTriageEnabled:(0,f.nd)("auto_triage_enabled",{mode:"boolean"}).notNull().default(!1),autoProcessEnabled:(0,f.nd)("auto_process_enabled",{mode:"boolean"}).notNull().default(!1),autoHealCi:(0,f.nd)("auto_heal_ci",{mode:"boolean"}).notNull().default(!1),autoReviewFeedback:(0,f.nd)("auto_review_feedback",{mode:"boolean"}).notNull().default(!1),autoResolveMergeConflicts:(0,f.nd)("auto_resolve_merge_conflicts",{mode:"boolean"}).notNull().default(!1),includeProgressReplies:(0,f.nd)("include_progress_replies",{mode:"boolean"}).notNull().default(!1),autoDecompose:(0,f.nd)("auto_decompose",{mode:"boolean"}).notNull().default(!1),autoHealDeployments:(0,f.nd)("auto_heal_deployments",{mode:"boolean"}).notNull().default(!1),deploymentPlatform:(0,g.Qq)("deployment_platform"),trustedReviewers:(0,g.Qq)("trusted_reviewers").notNull().default("[]"),ignoredBots:(0,g.Qq)("ignored_bots").notNull().default('["dependabot[bot]","github-actions[bot]","codecov[bot]"]'),readyLabels:(0,g.Qq)("ready_labels").notNull().default('["ready","ready-for-agent","ready-to-work"]'),blockingLabels:(0,g.Qq)("blocking_labels").notNull().default('["blocked","question","needs-human","needs-discussion","wontfix","duplicate","invalid"]'),autoLabelWhitelist:(0,g.Qq)("auto_label_whitelist").notNull().default('["bug","enhancement","documentation","ready"]'),priorityAuthors:(0,g.Qq)("priority_authors").notNull().default("[]"),minAuthorAssociation:(0,g.Qq)("min_author_association").notNull().default("approved"),maxAttempts:(0,f.nd)("max_attempts").notNull().default(3),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),k=(0,e.D)("prompt_templates",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").references(()=>j.id,{onDelete:"cascade"}),name:(0,g.Qq)("name").notNull(),content:(0,g.Qq)("content").notNull(),version:(0,f.nd)("version").notNull().default(1),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)}),l=(0,e.D)("jobs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),issueNumber:(0,f.nd)("issue_number").notNull(),status:(0,g.Qq)("status").notNull().default("queued"),branch:(0,g.Qq)("branch"),prNumber:(0,f.nd)("pr_number"),sessionId:(0,g.Qq)("session_id"),agent:(0,g.Qq)("agent").notNull().default("claude"),startedAt:(0,f.nd)("started_at"),finishedAt:(0,f.nd)("finished_at"),model:(0,g.Qq)("model"),maxTurns:(0,f.nd)("max_turns").notNull().default(40),totalInputTokens:(0,f.nd)("total_input_tokens").notNull().default(0),totalOutputTokens:(0,f.nd)("total_output_tokens").notNull().default(0),costUsd:(0,h.x)("cost_usd").notNull().default(0),ciRetryCount:(0,f.nd)("ci_retry_count").notNull().default(0),errorMessage:(0,g.Qq)("error_message"),attempts:(0,f.nd)("attempts").notNull().default(0),leaseToken:(0,g.Qq)("lease_token"),leaseExpiresAt:(0,f.nd)("lease_expires_at"),workerId:(0,g.Qq)("worker_id"),availableAt:(0,f.nd)("available_at"),dedupeKey:(0,g.Qq)("dedupe_key"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoIdx:(0,i.Pe)("jobs_repo_idx").on(a.repoId),statusIdx:(0,i.Pe)("jobs_status_idx").on(a.status),leaseIdx:(0,i.Pe)("jobs_lease_idx").on(a.leaseExpiresAt),dedupeActiveUnique:(0,i.GL)("jobs_dedupe_active_unique").on(a.dedupeKey).where((0,d.ll)`${a.dedupeKey} is not null and ${a.status} not in ('merged', 'aborted')`)})),m=(0,e.D)("job_events",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),ts:(0,f.nd)("ts").notNull().default((0,d.ll)`(unixepoch())`),type:(0,g.Qq)("type").notNull(),payload:(0,g.Qq)("payload").notNull().default("{}")},a=>({jobTsIdx:(0,i.Pe)("job_events_job_ts_idx").on(a.jobId,a.ts)})),n=(0,e.D)("adrs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").references(()=>l.id,{onDelete:"set null"}),repoId:(0,f.nd)("repo_id").references(()=>j.id,{onDelete:"cascade"}),filePath:(0,g.Qq)("file_path").notNull(),title:(0,g.Qq)("title").notNull(),status:(0,g.Qq)("status").notNull().default("pending_review"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),o=(0,e.D)("followup_issues",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").references(()=>l.id,{onDelete:"set null"}),ghIssueNumber:(0,f.nd)("gh_issue_number").notNull(),title:(0,g.Qq)("title").notNull(),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),p=(0,e.D)("issues",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),number:(0,f.nd)("number").notNull(),title:(0,g.Qq)("title").notNull(),labels:(0,g.Qq)("labels").notNull().default("[]"),state:(0,g.Qq)("state").notNull().default("open"),priority:(0,f.nd)("priority").notNull().default(0),triageHash:(0,g.Qq)("triage_hash"),triagedAt:(0,f.nd)("triaged_at"),decomposedHash:(0,g.Qq)("decomposed_hash"),syncedAt:(0,f.nd)("synced_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoNumberUnique:(0,i.GL)("issues_repo_number_unique").on(a.repoId,a.number),repoPriorityIdx:(0,i.Pe)("issues_repo_priority_idx").on(a.repoId,a.priority)})),q=(0,e.D)("healing_sessions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),headSha:(0,g.Qq)("head_sha").notNull(),status:(0,g.Qq)("status").notNull().default("triaging"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("healing_sessions_job_idx").on(a.jobId),prShaIdx:(0,i.Pe)("healing_sessions_pr_sha_idx").on(a.prNumber,a.headSha)})),r=(0,e.D)("healing_attempts",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),sessionId:(0,f.nd)("session_id").notNull().references(()=>q.id,{onDelete:"cascade"}),fingerprint:(0,g.Qq)("fingerprint").notNull(),category:(0,g.Qq)("category").notNull(),checkName:(0,g.Qq)("check_name").notNull(),status:(0,g.Qq)("status").notNull().default("repairing"),beforeSha:(0,g.Qq)("before_sha"),afterSha:(0,g.Qq)("after_sha"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({sessionIdx:(0,i.Pe)("healing_attempts_session_idx").on(a.sessionId),fingerprintIdx:(0,i.Pe)("healing_attempts_fingerprint_idx").on(a.sessionId,a.fingerprint)})),s=(0,e.D)("review_feedback_items",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),threadId:(0,g.Qq)("thread_id").notNull(),reviewer:(0,g.Qq)("reviewer").notNull(),classification:(0,g.Qq)("classification").notNull(),status:(0,g.Qq)("status").notNull().default("pending"),attempts:(0,f.nd)("attempts").notNull().default(0),detail:(0,g.Qq)("detail"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("review_feedback_job_idx").on(a.jobId),jobThreadUnique:(0,i.GL)("review_feedback_job_thread_unique").on(a.jobId,a.threadId)})),t=(0,e.D)("issue_subtasks",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),issueNumber:(0,f.nd)("issue_number").notNull(),ordinal:(0,f.nd)("ordinal").notNull(),title:(0,g.Qq)("title").notNull(),status:(0,g.Qq)("status").notNull().default("pending"),bodyHash:(0,g.Qq)("body_hash").notNull(),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({issueIdx:(0,i.Pe)("issue_subtasks_issue_idx").on(a.repoId,a.issueNumber),issueOrdinalUnique:(0,i.GL)("issue_subtasks_issue_ordinal_unique").on(a.repoId,a.issueNumber,a.ordinal)})),u=(0,e.D)("deployment_healing_sessions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),platform:(0,g.Qq)("platform").notNull(),commitSha:(0,g.Qq)("commit_sha").notNull(),status:(0,g.Qq)("status").notNull().default("monitoring"),logsExcerpt:(0,g.Qq)("logs_excerpt"),followupPrNumber:(0,f.nd)("followup_pr_number"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("deployment_healing_job_idx").on(a.jobId),jobShaUnique:(0,i.GL)("deployment_healing_job_sha_unique").on(a.jobId,a.commitSha)})),v=(0,e.D)("settings",{key:(0,g.Qq)("key").primaryKey(),value:(0,g.Qq)("value").notNull()})},96356:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,5381,23)),Promise.resolve().then(c.t.bind(c,45308,23)),Promise.resolve().then(c.t.bind(c,93298,23)),Promise.resolve().then(c.t.bind(c,98181,23)),Promise.resolve().then(c.t.bind(c,10689,23)),Promise.resolve().then(c.t.bind(c,86563,23)),Promise.resolve().then(c.t.bind(c,57548,23)),Promise.resolve().then(c.bind(c,9217))},99168:(a,b,c)=>{"use strict";c.d(b,{Providers:()=>d});let d=(0,c(37251).registerClientReference)(function(){throw Error("Attempted to call Providers() from the server but Providers is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/work/drydock/drydock/src/components/providers.tsx","Providers")}};
@@ -1 +0,0 @@
1
- exports.id=441,exports.ids=[441],exports.modules={1087:(a,b,c)=>{"use strict";var d=c(11131);c.o(d,"usePathname")&&c.d(b,{usePathname:function(){return d.usePathname}})},6409:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0});var d={formatUrl:function(){return h},formatWithValidation:function(){return j},urlObjectKeys:function(){return i}};for(var e in d)Object.defineProperty(b,e,{enumerable:!0,get:d[e]});let f=c(13354)._(c(62305)),g=/https?|ftp|gopher|file/;function h(a){let{auth:b,hostname:c}=a,d=a.protocol||"",e=a.pathname||"",h=a.hash||"",i=a.query||"",j=!1;b=b?encodeURIComponent(b).replace(/%3A/i,":")+"@":"",a.host?j=b+a.host:c&&(j=b+(~c.indexOf(":")?`[${c}]`:c),a.port&&(j+=":"+a.port)),i&&"object"==typeof i&&(i=String(f.urlQueryToSearchParams(i)));let k=a.search||i&&`?${i}`||"";return d&&!d.endsWith(":")&&(d+=":"),a.slashes||(!d||g.test(d))&&!1!==j?(j="//"+(j||""),e&&"/"!==e[0]&&(e="/"+e)):j||(j=""),h&&"#"!==h[0]&&(h="#"+h),k&&"?"!==k[0]&&(k="?"+k),e=e.replace(/[?#]/g,encodeURIComponent),k=k.replace("#","%23"),`${d}${j}${e}${k}${h}`}let i=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function j(a){return h(a)}},10093:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"pathHasPrefix",{enumerable:!0,get:function(){return e}});let d=c(67007);function e(a,b){if("string"!=typeof a)return!1;let{pathname:c}=(0,d.parsePath)(a);return c===b||c.startsWith(b+"/")}},18034:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"hasBasePath",{enumerable:!0,get:function(){return e}});let d=c(10093);function e(a){return(0,d.pathHasPrefix)(a,"")}("function"==typeof b.default||"object"==typeof b.default&&null!==b.default)&&void 0===b.default.__esModule&&(Object.defineProperty(b.default,"__esModule",{value:!0}),Object.assign(b.default,b),a.exports=b.default)},20820:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"addPathPrefix",{enumerable:!0,get:function(){return e}});let d=c(67007);function e(a,b){if(!a.startsWith("/")||!b)return a;let{pathname:c,query:e,hash:f}=(0,d.parsePath)(a);return`${b}${c}${e}${f}`}},35178:(a,b,c)=>{"use strict";c.d(b,{A:()=>d});let d=(0,c(46031).A)("circle-pause",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"10",x2:"10",y1:"15",y2:"9",key:"c1nkhi"}],["line",{x1:"14",x2:"14",y1:"15",y2:"9",key:"h65svq"}]])},37412:(a,b,c)=>{"use strict";c.d(b,{A:()=>d});let d=(0,c(46031).A)("moon",[["path",{d:"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401",key:"kfwtm"}]])},37561:(a,b,c)=>{"use strict";c.d(b,{A:()=>d});let d=(0,c(46031).A)("x",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]])},42117:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"addBasePath",{enumerable:!0,get:function(){return f}});let d=c(20820),e=c(48552);function f(a,b){return(0,e.normalizePathTrailingSlash)((0,d.addPathPrefix)(a,""))}("function"==typeof b.default||"object"==typeof b.default&&null!==b.default)&&void 0===b.default.__esModule&&(Object.defineProperty(b.default,"__esModule",{value:!0}),Object.assign(b.default,b),a.exports=b.default)},42700:(a,b,c)=>{"use strict";c.d(b,{A:()=>d});let d=(0,c(46031).A)("circle-check",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]])},43207:(a,b,c)=>{"use strict";c.d(b,{A:()=>d});let d=(0,c(46031).A)("sun",[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]])},43453:a=>{a.exports={style:{fontFamily:"'JetBrains Mono', 'JetBrains Mono Fallback'",fontStyle:"normal"},className:"__className_3c557b",variable:"__variable_3c557b"}},46031:(a,b,c)=>{"use strict";c.d(b,{A:()=>j});var d=c(54848);let e=(...a)=>a.filter((a,b,c)=>!!a&&""!==a.trim()&&c.indexOf(a)===b).join(" ").trim(),f=a=>{let b=a.replace(/^([A-Z])|[\s-_]+(\w)/g,(a,b,c)=>c?c.toUpperCase():b.toLowerCase());return b.charAt(0).toUpperCase()+b.slice(1)};var g={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let h=(0,d.createContext)({}),i=(0,d.forwardRef)(({color:a,size:b,strokeWidth:c,absoluteStrokeWidth:f,className:i="",children:j,iconNode:k,...l},m)=>{let{size:n=24,strokeWidth:o=2,absoluteStrokeWidth:p=!1,color:q="currentColor",className:r=""}=(0,d.useContext)(h)??{},s=f??p?24*Number(c??o)/Number(b??n):c??o;return(0,d.createElement)("svg",{ref:m,...g,width:b??n??g.width,height:b??n??g.height,stroke:a??q,strokeWidth:s,className:e("lucide",r,i),...!j&&!(a=>{for(let b in a)if(b.startsWith("aria-")||"role"===b||"title"===b)return!0;return!1})(l)&&{"aria-hidden":"true"},...l},[...k.map(([a,b])=>(0,d.createElement)(a,b)),...Array.isArray(j)?j:[j]])}),j=(a,b)=>{let c=(0,d.forwardRef)(({className:c,...g},h)=>(0,d.createElement)(i,{ref:h,iconNode:b,className:e(`lucide-${f(a).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}`,`lucide-${a}`,c),...g}));return c.displayName=f(a),c}},48552:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"normalizePathTrailingSlash",{enumerable:!0,get:function(){return f}});let d=c(78511),e=c(67007),f=a=>{if(!a.startsWith("/"))return a;let{pathname:b,query:c,hash:f}=(0,e.parsePath)(a);return`${(0,d.removeTrailingSlash)(b)}${c}${f}`};("function"==typeof b.default||"object"==typeof b.default&&null!==b.default)&&void 0===b.default.__esModule&&(Object.defineProperty(b.default,"__esModule",{value:!0}),Object.assign(b.default,b),a.exports=b.default)},51499:(a,b,c)=>{"use strict";c.d(b,{A:()=>d});let d=(0,c(46031).A)("info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]])},56556:(a,b,c)=>{"use strict";c.d(b,{D:()=>j,N:()=>k});var d=c(54848),e=(a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}},f=["light","dark"],g="(prefers-color-scheme: dark)",h=d.createContext(void 0),i={setTheme:a=>{},themes:[]},j=()=>{var a;return null!=(a=d.useContext(h))?a:i},k=a=>d.useContext(h)?d.createElement(d.Fragment,null,a.children):d.createElement(m,{...a}),l=["light","dark"],m=({forcedTheme:a,disableTransitionOnChange:b=!1,enableSystem:c=!0,enableColorScheme:e=!0,storageKey:i="theme",themes:j=l,defaultTheme:k=c?"system":"light",attribute:m="data-theme",value:r,children:s,nonce:t,scriptProps:u})=>{let[v,w]=d.useState(()=>o(i,k)),[x,y]=d.useState(()=>"system"===v?q():v),z=r?Object.values(r):j,A=d.useCallback(a=>{let d=a;if(!d)return;"system"===a&&c&&(d=q());let g=r?r[d]:d,h=b?p(t):null,i=document.documentElement,j=a=>{"class"===a?(i.classList.remove(...z),g&&i.classList.add(g)):a.startsWith("data-")&&(g?i.setAttribute(a,g):i.removeAttribute(a))};if(Array.isArray(m)?m.forEach(j):j(m),e){let a=f.includes(k)?k:null,b=f.includes(d)?d:a;i.style.colorScheme=b}null==h||h()},[t]),B=d.useCallback(a=>{let b="function"==typeof a?a(v):a;w(b);try{localStorage.setItem(i,b)}catch(a){}},[v]),C=d.useCallback(b=>{y(q(b)),"system"===v&&c&&!a&&A("system")},[v,a]);d.useEffect(()=>{let a=window.matchMedia(g);return a.addListener(C),C(a),()=>a.removeListener(C)},[C]),d.useEffect(()=>{let a=a=>{a.key===i&&(a.newValue?w(a.newValue):B(k))};return window.addEventListener("storage",a),()=>window.removeEventListener("storage",a)},[B]),d.useEffect(()=>{A(null!=a?a:v)},[a,v]);let D=d.useMemo(()=>({theme:v,setTheme:B,forcedTheme:a,resolvedTheme:"system"===v?x:v,themes:c?[...j,"system"]:j,systemTheme:c?x:void 0}),[v,B,a,x,c,j]);return d.createElement(h.Provider,{value:D},d.createElement(n,{forcedTheme:a,storageKey:i,attribute:m,enableSystem:c,enableColorScheme:e,defaultTheme:k,value:r,themes:j,nonce:t,scriptProps:u}),s)},n=d.memo(({forcedTheme:a,storageKey:b,attribute:c,enableSystem:f,enableColorScheme:g,defaultTheme:h,value:i,themes:j,nonce:k,scriptProps:l})=>{let m=JSON.stringify([c,b,h,a,j,i,f,g]).slice(1,-1);return d.createElement("script",{...l,suppressHydrationWarning:!0,nonce:k,dangerouslySetInnerHTML:{__html:`(${e.toString()})(${m})`}})}),o=(a,b)=>{},p=a=>{let b=document.createElement("style");return a&&b.setAttribute("nonce",a),b.appendChild(document.createTextNode("*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}")),document.head.appendChild(b),()=>{window.getComputedStyle(document.body),setTimeout(()=>{document.head.removeChild(b)},1)}},q=a=>(a||(a=window.matchMedia(g)),a.matches?"dark":"light")},58672:a=>{a.exports={style:{fontFamily:"'Inter', 'Inter Fallback'",fontStyle:"normal"},className:"__className_f367f3",variable:"__variable_f367f3"}},60372:(a,b,c)=>{"use strict";c.d(b,{A:()=>d});let d=(0,c(46031).A)("anchor",[["path",{d:"M12 6v16",key:"nqf5sj"}],["path",{d:"m19 13 2-1a9 9 0 0 1-18 0l2 1",key:"y7qv08"}],["path",{d:"M9 11h6",key:"1fldmi"}],["circle",{cx:"12",cy:"4",r:"2",key:"muu5ef"}]])},64018:(a,b)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"errorOnce",{enumerable:!0,get:function(){return c}});let c=a=>{}},67007:(a,b)=>{"use strict";function c(a){let b=a.indexOf("#"),c=a.indexOf("?"),d=c>-1&&(b<0||c<b);return d||b>-1?{pathname:a.substring(0,d?c:b),query:d?a.substring(c,b>-1?b:void 0):"",hash:b>-1?a.slice(b):""}:{pathname:a,query:"",hash:""}}Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"parsePath",{enumerable:!0,get:function(){return c}})},71416:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0});var d={default:function(){return p},useLinkStatus:function(){return r}};for(var e in d)Object.defineProperty(b,e,{enumerable:!0,get:d[e]});let f=c(13354),g=c(37477),h=f._(c(54848)),i=c(6409),j=c(55416),k=c(94268),l=c(19411),m=c(42117);c(94474),c(47240);let n=c(14640);c(92008);let o=c(32949);function p(a){var b,c;let d,e,f,[p,r]=(0,h.useOptimistic)(n.IDLE_LINK_STATUS),s=(0,h.useRef)(null),{href:t,as:u,children:v,prefetch:w=null,passHref:x,replace:y,shallow:z,scroll:A,onClick:B,onMouseEnter:C,onTouchStart:D,legacyBehavior:E=!1,onNavigate:F,transitionTypes:G,ref:H,unstable_dynamicOnHover:I,...J}=a;d=v,E&&("string"==typeof d||"number"==typeof d)&&(d=(0,g.jsx)("a",{children:d}));let K=h.default.useContext(j.AppRouterContext),L=!1!==w,M=!1!==w?null===(c=w)||"auto"===c?o.FetchStrategy.PPR:o.FetchStrategy.Full:o.FetchStrategy.PPR,N="string"==typeof(b=u||t)?b:(0,i.formatUrl)(b);if(E){if(d?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});e=h.default.Children.only(d)}let O=E?e&&"object"==typeof e&&e.ref:H,P=h.default.useCallback(a=>(null!==K&&(s.current=(0,n.mountLinkInstance)(a,N,K,M,L,r)),()=>{s.current&&((0,n.unmountLinkForCurrentNavigation)(s.current),s.current=null),(0,n.unmountPrefetchableInstance)(a)}),[L,N,K,M,r]),Q={ref:(0,k.useMergedRef)(P,O),onClick(a){E||"function"!=typeof B||B(a),E&&e.props&&"function"==typeof e.props.onClick&&e.props.onClick(a),K&&a.defaultPrevented},onMouseEnter(a){E||"function"!=typeof C||C(a),E&&e.props&&"function"==typeof e.props.onMouseEnter&&e.props.onMouseEnter(a),K&&L&&(0,n.onNavigationIntent)(a.currentTarget,!0===I)},onTouchStart:function(a){E||"function"!=typeof D||D(a),E&&e.props&&"function"==typeof e.props.onTouchStart&&e.props.onTouchStart(a),K&&L&&(0,n.onNavigationIntent)(a.currentTarget,!0===I)}};return(0,l.isAbsoluteUrl)(N)?Q.href=N:E&&!x&&("a"!==e.type||"href"in e.props)||(Q.href=(0,m.addBasePath)(N)),f=E?h.default.cloneElement(e,Q):(0,g.jsx)("a",{...J,...Q,children:d}),(0,g.jsx)(q.Provider,{value:p,children:f})}c(64018);let q=(0,h.createContext)(n.IDLE_LINK_STATUS),r=()=>(0,h.useContext)(q);("function"==typeof b.default||"object"==typeof b.default&&null!==b.default)&&void 0===b.default.__esModule&&(Object.defineProperty(b.default,"__esModule",{value:!0}),Object.assign(b.default,b),a.exports=b.default)},76335:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"default",{enumerable:!0,get:function(){return f}});let d=c(39747),e=c(6599);function f(){return(0,d.jsx)(e.HTTPAccessErrorFallback,{status:404,message:"This page could not be found."})}("function"==typeof b.default||"object"==typeof b.default&&null!==b.default)&&void 0===b.default.__esModule&&(Object.defineProperty(b.default,"__esModule",{value:!0}),Object.assign(b.default,b),a.exports=b.default)},78511:(a,b)=>{"use strict";function c(a){return a.replace(/\/$/,"")||"/"}Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"removeTrailingSlash",{enumerable:!0,get:function(){return c}})},92008:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"isLocalURL",{enumerable:!0,get:function(){return f}});let d=c(19411),e=c(18034);function f(a){if(!(0,d.isAbsoluteUrl)(a))return!0;try{let b=(0,d.getLocationOrigin)(),c=new URL(a,b);return c.origin===b&&(0,e.hasBasePath)(c.pathname)}catch(a){return!1}}},94268:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"useMergedRef",{enumerable:!0,get:function(){return e}});let d=c(54848);function e(a,b){let c=(0,d.useRef)(null),e=(0,d.useRef)(null);return(0,d.useCallback)(d=>{if(null===d){let a=c.current;a&&(c.current=null,a());let b=e.current;b&&(e.current=null,b())}else a&&(c.current=f(a,d)),b&&(e.current=f(b,d))},[a,b])}function f(a,b){if("function"!=typeof a)return a.current=b,()=>{a.current=null};{let c=a(b);return"function"==typeof c?c:()=>a(null)}}("function"==typeof b.default||"object"==typeof b.default&&null!==b.default)&&void 0===b.default.__esModule&&(Object.defineProperty(b.default,"__esModule",{value:!0}),Object.assign(b.default,b),a.exports=b.default)},95024:(a,b,c)=>{"use strict";c.d(b,{A:()=>d});let d=(0,c(46031).A)("circle-x",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]])}};
@@ -1 +0,0 @@
1
- "use strict";exports.id=633,exports.ids=[633],exports.modules={17233:(a,b,c)=>{c.d(b,{l:()=>e});var d=c(37477);function e({open:a,onClose:b,children:c}){return a?(0,d.jsx)("div",{className:"fixed inset-0 z-50 flex items-start justify-center overflow-y-auto bg-black/50 p-4 sm:p-8",onMouseDown:b,children:(0,d.jsx)("div",{role:"dialog","aria-modal":"true",className:"mt-8 w-full max-w-2xl rounded-xl border border-card-border bg-card p-5 shadow-lg",onMouseDown:a=>a.stopPropagation(),children:c})}):null}c(54848)},55710:(a,b,c)=>{let d;c.d(b,{Lf:()=>k});var e=c(73024),f=c(76760),g=c(87550),h=c.n(g),i=c(61609),j=c(84654);function k(){if(!d){var a;let b;":memory:"!==(a=process.env.DRYDOCK_DB??(0,f.resolve)(process.cwd(),"data/drydock.db"))&&(0,e.mkdirSync)((0,f.dirname)(a),{recursive:!0}),(b=new(h())(a)).pragma("journal_mode = WAL"),b.pragma("foreign_keys = ON"),function(a){let b,c=process.env.DRYDOCK_MIGRATIONS??(0,f.resolve)(process.cwd(),"drizzle");try{b=(0,e.readdirSync)(c).filter(a=>a.endsWith(".sql")).sort()}catch{return}a.exec("CREATE TABLE IF NOT EXISTS __migrations (name TEXT PRIMARY KEY)");let d=new Set(a.prepare("SELECT name FROM __migrations").all().map(a=>a.name)),g=a.prepare("INSERT INTO __migrations (name) VALUES (?)");for(let h of b){if(d.has(h))continue;let b=(0,e.readFileSync)((0,f.join)(c,h),"utf8");a.transaction(()=>{for(let c of b.split("--\x3e statement-breakpoint")){let b=c.trim();b&&a.exec(b)}g.run(h)})()}}(b),d=(0,i.f)(b,{schema:j}),Promise.all([c.e(579),c.e(753),c.e(706)]).then(c.bind(c,26706)).then(a=>a.startOrchestrator()).catch(a=>console.error("[orchestrator] bootstrap failed",a))}return d}},84654:(a,b,c)=>{c.r(b),c.d(b,{adrs:()=>n,deploymentHealingSessions:()=>u,followupIssues:()=>o,healingAttempts:()=>r,healingSessions:()=>q,issueSubtasks:()=>t,issues:()=>p,jobEvents:()=>m,jobs:()=>l,promptTemplates:()=>k,repos:()=>j,reviewFeedbackItems:()=>s,settings:()=>v});var d=c(94448),e=c(25356),f=c(95584),g=c(71139),h=c(73042),i=c(73126);let j=(0,e.D)("repos",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),path:(0,g.Qq)("path").notNull(),name:(0,g.Qq)("name").notNull(),defaultBranch:(0,g.Qq)("default_branch").notNull().default("main"),queueLabel:(0,g.Qq)("queue_label").notNull().default("drydock:queue"),workingLabel:(0,g.Qq)("working_label").notNull().default("drydock:working"),needsHumanLabel:(0,g.Qq)("needs_human_label").notNull().default("drydock:needs-human"),defaultModel:(0,g.Qq)("default_model").notNull().default("claude-opus-4-7"),agent:(0,g.Qq)("agent").notNull().default("claude"),platform:(0,g.Qq)("platform").notNull().default("github"),apiBaseUrl:(0,g.Qq)("api_base_url"),apiToken:(0,g.Qq)("api_token"),dailyCostLimitUsd:(0,h.x)("daily_cost_limit_usd").notNull().default(10),adrGating:(0,f.nd)("adr_gating",{mode:"boolean"}).notNull().default(!1),sequential:(0,f.nd)("sequential",{mode:"boolean"}).notNull().default(!0),autoTriageEnabled:(0,f.nd)("auto_triage_enabled",{mode:"boolean"}).notNull().default(!1),autoProcessEnabled:(0,f.nd)("auto_process_enabled",{mode:"boolean"}).notNull().default(!1),autoHealCi:(0,f.nd)("auto_heal_ci",{mode:"boolean"}).notNull().default(!1),autoReviewFeedback:(0,f.nd)("auto_review_feedback",{mode:"boolean"}).notNull().default(!1),autoResolveMergeConflicts:(0,f.nd)("auto_resolve_merge_conflicts",{mode:"boolean"}).notNull().default(!1),includeProgressReplies:(0,f.nd)("include_progress_replies",{mode:"boolean"}).notNull().default(!1),autoDecompose:(0,f.nd)("auto_decompose",{mode:"boolean"}).notNull().default(!1),autoHealDeployments:(0,f.nd)("auto_heal_deployments",{mode:"boolean"}).notNull().default(!1),deploymentPlatform:(0,g.Qq)("deployment_platform"),trustedReviewers:(0,g.Qq)("trusted_reviewers").notNull().default("[]"),ignoredBots:(0,g.Qq)("ignored_bots").notNull().default('["dependabot[bot]","github-actions[bot]","codecov[bot]"]'),readyLabels:(0,g.Qq)("ready_labels").notNull().default('["ready","ready-for-agent","ready-to-work"]'),blockingLabels:(0,g.Qq)("blocking_labels").notNull().default('["blocked","question","needs-human","needs-discussion","wontfix","duplicate","invalid"]'),autoLabelWhitelist:(0,g.Qq)("auto_label_whitelist").notNull().default('["bug","enhancement","documentation","ready"]'),priorityAuthors:(0,g.Qq)("priority_authors").notNull().default("[]"),minAuthorAssociation:(0,g.Qq)("min_author_association").notNull().default("approved"),maxAttempts:(0,f.nd)("max_attempts").notNull().default(3),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),k=(0,e.D)("prompt_templates",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").references(()=>j.id,{onDelete:"cascade"}),name:(0,g.Qq)("name").notNull(),content:(0,g.Qq)("content").notNull(),version:(0,f.nd)("version").notNull().default(1),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)}),l=(0,e.D)("jobs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),issueNumber:(0,f.nd)("issue_number").notNull(),status:(0,g.Qq)("status").notNull().default("queued"),branch:(0,g.Qq)("branch"),prNumber:(0,f.nd)("pr_number"),sessionId:(0,g.Qq)("session_id"),agent:(0,g.Qq)("agent").notNull().default("claude"),startedAt:(0,f.nd)("started_at"),finishedAt:(0,f.nd)("finished_at"),model:(0,g.Qq)("model"),maxTurns:(0,f.nd)("max_turns").notNull().default(40),totalInputTokens:(0,f.nd)("total_input_tokens").notNull().default(0),totalOutputTokens:(0,f.nd)("total_output_tokens").notNull().default(0),costUsd:(0,h.x)("cost_usd").notNull().default(0),ciRetryCount:(0,f.nd)("ci_retry_count").notNull().default(0),errorMessage:(0,g.Qq)("error_message"),attempts:(0,f.nd)("attempts").notNull().default(0),leaseToken:(0,g.Qq)("lease_token"),leaseExpiresAt:(0,f.nd)("lease_expires_at"),workerId:(0,g.Qq)("worker_id"),availableAt:(0,f.nd)("available_at"),dedupeKey:(0,g.Qq)("dedupe_key"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoIdx:(0,i.Pe)("jobs_repo_idx").on(a.repoId),statusIdx:(0,i.Pe)("jobs_status_idx").on(a.status),leaseIdx:(0,i.Pe)("jobs_lease_idx").on(a.leaseExpiresAt),dedupeActiveUnique:(0,i.GL)("jobs_dedupe_active_unique").on(a.dedupeKey).where((0,d.ll)`${a.dedupeKey} is not null and ${a.status} not in ('merged', 'aborted')`)})),m=(0,e.D)("job_events",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),ts:(0,f.nd)("ts").notNull().default((0,d.ll)`(unixepoch())`),type:(0,g.Qq)("type").notNull(),payload:(0,g.Qq)("payload").notNull().default("{}")},a=>({jobTsIdx:(0,i.Pe)("job_events_job_ts_idx").on(a.jobId,a.ts)})),n=(0,e.D)("adrs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").references(()=>l.id,{onDelete:"set null"}),repoId:(0,f.nd)("repo_id").references(()=>j.id,{onDelete:"cascade"}),filePath:(0,g.Qq)("file_path").notNull(),title:(0,g.Qq)("title").notNull(),status:(0,g.Qq)("status").notNull().default("pending_review"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),o=(0,e.D)("followup_issues",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").references(()=>l.id,{onDelete:"set null"}),ghIssueNumber:(0,f.nd)("gh_issue_number").notNull(),title:(0,g.Qq)("title").notNull(),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),p=(0,e.D)("issues",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),number:(0,f.nd)("number").notNull(),title:(0,g.Qq)("title").notNull(),labels:(0,g.Qq)("labels").notNull().default("[]"),state:(0,g.Qq)("state").notNull().default("open"),priority:(0,f.nd)("priority").notNull().default(0),triageHash:(0,g.Qq)("triage_hash"),triagedAt:(0,f.nd)("triaged_at"),decomposedHash:(0,g.Qq)("decomposed_hash"),syncedAt:(0,f.nd)("synced_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoNumberUnique:(0,i.GL)("issues_repo_number_unique").on(a.repoId,a.number),repoPriorityIdx:(0,i.Pe)("issues_repo_priority_idx").on(a.repoId,a.priority)})),q=(0,e.D)("healing_sessions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),headSha:(0,g.Qq)("head_sha").notNull(),status:(0,g.Qq)("status").notNull().default("triaging"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("healing_sessions_job_idx").on(a.jobId),prShaIdx:(0,i.Pe)("healing_sessions_pr_sha_idx").on(a.prNumber,a.headSha)})),r=(0,e.D)("healing_attempts",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),sessionId:(0,f.nd)("session_id").notNull().references(()=>q.id,{onDelete:"cascade"}),fingerprint:(0,g.Qq)("fingerprint").notNull(),category:(0,g.Qq)("category").notNull(),checkName:(0,g.Qq)("check_name").notNull(),status:(0,g.Qq)("status").notNull().default("repairing"),beforeSha:(0,g.Qq)("before_sha"),afterSha:(0,g.Qq)("after_sha"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({sessionIdx:(0,i.Pe)("healing_attempts_session_idx").on(a.sessionId),fingerprintIdx:(0,i.Pe)("healing_attempts_fingerprint_idx").on(a.sessionId,a.fingerprint)})),s=(0,e.D)("review_feedback_items",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),threadId:(0,g.Qq)("thread_id").notNull(),reviewer:(0,g.Qq)("reviewer").notNull(),classification:(0,g.Qq)("classification").notNull(),status:(0,g.Qq)("status").notNull().default("pending"),attempts:(0,f.nd)("attempts").notNull().default(0),detail:(0,g.Qq)("detail"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("review_feedback_job_idx").on(a.jobId),jobThreadUnique:(0,i.GL)("review_feedback_job_thread_unique").on(a.jobId,a.threadId)})),t=(0,e.D)("issue_subtasks",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),issueNumber:(0,f.nd)("issue_number").notNull(),ordinal:(0,f.nd)("ordinal").notNull(),title:(0,g.Qq)("title").notNull(),status:(0,g.Qq)("status").notNull().default("pending"),bodyHash:(0,g.Qq)("body_hash").notNull(),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({issueIdx:(0,i.Pe)("issue_subtasks_issue_idx").on(a.repoId,a.issueNumber),issueOrdinalUnique:(0,i.GL)("issue_subtasks_issue_ordinal_unique").on(a.repoId,a.issueNumber,a.ordinal)})),u=(0,e.D)("deployment_healing_sessions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),platform:(0,g.Qq)("platform").notNull(),commitSha:(0,g.Qq)("commit_sha").notNull(),status:(0,g.Qq)("status").notNull().default("monitoring"),logsExcerpt:(0,g.Qq)("logs_excerpt"),followupPrNumber:(0,f.nd)("followup_pr_number"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("deployment_healing_job_idx").on(a.jobId),jobShaUnique:(0,i.GL)("deployment_healing_job_sha_unique").on(a.jobId,a.commitSha)})),v=(0,e.D)("settings",{key:(0,g.Qq)("key").primaryKey(),value:(0,g.Qq)("value").notNull()})},98872:(a,b,c)=>{c.d(b,{T:()=>g});var d=c(37477),e=c(78233),f=c(17233);function g({open:a,onOpenChange:b,onConfirm:c,title:h,description:i,confirmLabel:j="Confirm",cancelLabel:k="Cancel",variant:l="default",pending:m=!1}){return(0,d.jsx)(f.l,{open:a,onClose:()=>b(!1),children:(0,d.jsxs)("div",{className:"space-y-4",children:[(0,d.jsxs)("div",{className:"space-y-1",children:[(0,d.jsx)("h2",{className:"text-base font-semibold",children:h}),i&&(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:i})]}),(0,d.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,d.jsx)(e.$,{variant:"outline",size:"sm",disabled:m,onClick:()=>b(!1),children:k}),(0,d.jsx)(e.$,{variant:"destructive"===l?"destructive":"default",size:"sm",disabled:m,onClick:()=>{c(),b(!1)},children:j})]})]})})}}};
@@ -1,8 +0,0 @@
1
- "use strict";exports.id=706,exports.ids=[706],exports.modules={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}},3481:(a,b,c)=>{c.d(b,{mt:()=>m,Jf:()=>o,DA:()=>p,DZ:()=>n});var d=c(54452),e=c(22579),f=c(55710),g=c(94448),h=c(84654);function i(a=(0,f.Lf)(),b){let c=(0,g.ll)`strftime('%Y-%m-%d', ${h.jobs.startedAt}, 'unixepoch') = strftime('%Y-%m-%d', 'now')`,e=a.select({total:(0,g.ll)`coalesce(sum(${h.jobs.costUsd}), 0)`}).from(h.jobs).where((0,d.Uo)(c,void 0===b?void 0:(0,g.ll)`${h.jobs.repoId} = ${b}`)).get();return e?.total??0}let j=["needs_human","job_failed","pr_opened","pr_merged","cost_limit","automation_paused"],k=e.Ik({paused:e.zM().default(!1),dailyCostLimitUsd:e.ai().nonnegative().default(10),pollIntervalSec:e.ai().int().positive().default(30),maxTurns:e.ai().int().positive().default(40),defaultModel:e.Yj().default("claude-opus-4-7"),defaultAgent:e.k5(["claude","codex"]).default("claude"),claudePath:e.Yj().default("claude"),codexPath:e.Yj().default("codex"),ghPath:e.Yj().default("gh"),maxParallelJobs:e.ai().int().positive().default(3),telegramBotToken:e.Yj().default(""),telegramChatId:e.Yj().default(""),slackWebhookUrl:e.Yj().default(""),smtpHost:e.Yj().default(""),smtpPort:e.ai().int().positive().default(587),smtpUser:e.Yj().default(""),smtpPass:e.Yj().default(""),emailFrom:e.Yj().default(""),emailTo:e.Yj().default(""),notifyEvents:e.YO(e.k5(j)).default([...j]),retentionDays:e.ai().int().positive().default(30)}),l="global";function m(a=(0,f.Lf)()){let b=a.select().from(h.settings).where((0,d.eq)(h.settings.key,l)).get();if(!b)return k.parse({});try{return k.parse(JSON.parse(b.value))}catch{return k.parse({})}}function n(a,b=(0,f.Lf)()){let c=k.parse({...m(b),...a}),e=JSON.stringify(c);return b.select().from(h.settings).where((0,d.eq)(h.settings.key,l)).get()?b.update(h.settings).set({value:e}).where((0,d.eq)(h.settings.key,l)).run():b.insert(h.settings).values({key:l,value:e}).run(),c}function o(a=(0,f.Lf)()){let b=m(a);return b.paused?{allowed:!1,reason:"paused"}:i(a)>=b.dailyCostLimitUsd?{allowed:!1,reason:"cost_limit"}:{allowed:!0}}function p(a,b=(0,f.Lf)()){let c=b.select().from(h.repos).where((0,d.eq)(h.repos.id,a)).get();return!c||i(b,a)>=c.dailyCostLimitUsd?{allowed:!1,reason:"repo_cost_limit"}:{allowed:!0}}},26706:(a,b,c)=>{let d,e,f;c.r(b),c.d(b,{clearAbort:()=>bC,gracefulShutdown:()=>bD,registerAbort:()=>bB,startOrchestrator:()=>bE});var g=c(54452),h=c(55710),i=c(94448),j=c(3481),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(40129),u=c(89508),v=c(57846),w=c(20210);let x=["blocked","wontfix","question","needs-human","needs-discussion"],y=[{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 z(a){let b=[],c=a.labels.map(a=>a.toLowerCase()).find(a=>x.includes(a));if(c)return{decision:"blocked",reasons:[`blocking label: ${c}`]};let d=`${a.title}
2
- ${a.body??""}`;for(let{label:a,re:c}of y)c.test(d)&&b.push(`${a} detected`);return b.length>0?{decision:"needs_review",reasons:b}:{decision:"approved",reasons:[]}}var A=c(57426);let B=new Set(["OWNER","MEMBER","COLLABORATOR"]);function C(a){try{let b=JSON.parse(a);return Array.isArray(b)?b.filter(a=>"string"==typeof a):[]}catch{return[]}}function D(a){return{autoTriageEnabled:a.autoTriageEnabled,autoProcessEnabled:a.autoProcessEnabled,autoHealCi:a.autoHealCi,autoReviewFeedback:a.autoReviewFeedback,autoResolveMergeConflicts:a.autoResolveMergeConflicts,includeProgressReplies:a.includeProgressReplies,autoDecompose:a.autoDecompose,autoHealDeployments:a.autoHealDeployments,deploymentPlatform:a.deploymentPlatform,readyLabels:C(a.readyLabels),blockingLabels:C(a.blockingLabels),autoLabelWhitelist:C(a.autoLabelWhitelist),priorityAuthors:C(a.priorityAuthors),trustedReviewers:C(a.trustedReviewers),ignoredBots:C(a.ignoredBots),minAuthorAssociation:"any"===a.minAuthorAssociation?"any":"approved",maxAttempts:a.maxAttempts}}function E(a,b){return"any"===a.minAuthorAssociation||null!=b&&B.has(b.toUpperCase())}let F=[{label:"bug",re:/\b(bug|crash|crashes|broken|error|exception|fails?|regression|defect)\b/i},{label:"enhancement",re:/\b(add|support|feature|implement|enhancement|would be nice|allow|introduce)\b/i},{label:"documentation",re:/\b(docs?|documentation|readme|typo|wording|clarify)\b/i}];function G(a,b,c,d){d.update(k.issues).set({triageHash:c,triagedAt:Math.floor(Date.now()/1e3)}).where((0,g.Uo)((0,g.eq)(k.issues.repoId,a),(0,g.eq)(k.issues.number,b))).run()}async function H(a,b,c,d=(0,h.Lf)()){let e=D(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(!E(e,c.authorAssociation))return G(a.id,c.number,f,d),{number:c.number,applied:[],reasons:["author not approved"],skipped:"author"};let j=await b.viewIssue(c.number),l=z({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}
3
- ${a.body}`,e=[];for(let{label:a,re:b}of F)c.has(a)&&b.test(d)&&!e.includes(a)&&e.push(a);return e}(j,e.autoLabelWhitelist);for(let a of n)m.push(`classified as ${a}`);if("approved"===l.decision){let a=e.readyLabels[0];a&&(n.push(a),m.push("safe and well-specified"))}else{let a=e.blockingLabels[0];a&&(n.push(a),m.push(...l.reasons.length?l.reasons:["flagged for human review"]))}let o=new Set([...e.autoLabelWhitelist,...e.readyLabels,...e.blockingLabels]),p=new Set(j.labels),q=[...new Set(n)].filter(a=>o.has(a)&&!p.has(a));if(q.length>0){for(let a of q)await b.ensureLabel(a);await b.addLabels(c.number,q);let e=q.map(a=>`\`${a}\``).join(", ");await b.commentIssue(c.number,`auto-triage: applied ${e} — reasons: ${m.join("; ")}.`),function(a,b,c,d){let e,f=d.select().from(k.issues).where((0,g.Uo)((0,g.eq)(k.issues.repoId,a),(0,g.eq)(k.issues.number,b))).get();if(!f)return;try{let a=JSON.parse(f.labels);e=Array.isArray(a)?a:[]}catch{e=[]}let h=[...e];for(let a of c)h.includes(a)||h.push(a);d.update(k.issues).set({labels:JSON.stringify(h)}).where((0,g.eq)(k.issues.id,f.id)).run()}(a.id,c.number,q,d)}return G(a.id,c.number,f,d),{number:c.number,applied:q,reasons:m}}async function I(a,b,c,d=(0,h.Lf)()){let e=[];for(let f of c)try{e.push(await H(a,b,f,d))}catch(b){console.error(`[triage] issue #${f.number} failed for ${a.name}`,b)}return e}let J={"claude-opus-4-7":{inputPerMTok:15,outputPerMTok:75},"claude-sonnet-4-5":{inputPerMTok:3,outputPerMTok:15},"claude-haiku-4-5":{inputPerMTok:1,outputPerMTok:5}},K=J["claude-sonnet-4-5"];var L=c(22579);let M=L.Ik({input_tokens:L.ai().optional(),output_tokens:L.ai().optional(),cache_creation_input_tokens:L.ai().optional(),cache_read_input_tokens:L.ai().optional()}).passthrough(),N=L.Ik({type:L.eu("system"),subtype:L.Yj().optional(),session_id:L.Yj().optional(),model:L.Yj().optional()}),O=L.Ik({type:L.eu("assistant"),message:L.Ik({role:L.eu("assistant"),content:L.YO(L.g1(L.Yj(),L.L5())),usage:M.optional()})}),P=L.Ik({type:L.eu("user"),message:L.Ik({role:L.eu("user"),content:L.YO(L.g1(L.Yj(),L.L5()))})}),Q=L.Ik({type:L.eu("result"),subtype:L.Yj().optional(),session_id:L.Yj().optional(),is_error:L.zM().optional(),total_cost_usd:L.ai().optional(),usage:M.optional()}),R=L.gM("type",[N,O,P,Q]);function S(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 T{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=function(a){var b;let c,d=a.trim();if(!d)return null;let e=JSON.parse(d);return c={type:(b=R.parse(e)).type,chunks:[],inputTokens:0,outputTokens:0,isError:!1,raw:b},"system"===b.type?(c.sessionId=b.session_id,c.model=b.model):"assistant"===b.type?(c.chunks=S(b.message.content),c.inputTokens=b.message.usage?.input_tokens??0,c.outputTokens=b.message.usage?.output_tokens??0):"user"===b.type?c.chunks=S(b.message.content):(c.sessionId=b.session_id,c.costUsd=b.total_cost_usd,c.inputTokens=b.usage?.input_tokens??0,c.outputTokens=b.usage?.output_tokens??0,c.isError=b.is_error??!1),c}(a);return b?(b.sessionId&&(this.sessionId=b.sessionId),b.model&&(this.model=b.model),this.totalInputTokens+=b.inputTokens,this.totalOutputTokens+=b.outputTokens,"result"===b.type&&void 0!==b.costUsd&&(this.costUsd=b.costUsd),b):null}constructor(){this.buffer="",this.totalInputTokens=0,this.totalOutputTokens=0,this.costUsd=0}}let U="gpt-5-codex",V={"gpt-5-codex":{inputPerMTok:1.25,outputPerMTok:10},"gpt-5":{inputPerMTok:1.25,outputPerMTok:10},"gpt-5-mini":{inputPerMTok:.25,outputPerMTok:2}},W=V[U],X=L.Ik({input_tokens:L.ai().optional(),cached_input_tokens:L.ai().optional(),output_tokens:L.ai().optional(),reasoning_output_tokens:L.ai().optional()}).passthrough(),Y=L.Ik({id:L.Yj().optional(),item_type:L.Yj().optional(),text:L.Yj().optional(),command:L.Yj().optional(),exit_code:L.ai().optional(),server:L.Yj().optional(),tool:L.Yj().optional()}).passthrough(),Z=L.Ik({type:L.Yj(),thread_id:L.Yj().optional(),usage:X.optional(),item:Y.optional()}).passthrough();class ${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=function(a){let b=a.trim();if(!b)return null;let c=JSON.parse(b);var d=Z.parse(c);let e={type:"assistant",chunks:[],inputTokens:0,outputTokens:0,isError:!1,raw:d};if("thread.started"===d.type)return{...e,type:"system",sessionId:d.thread_id};if("item.completed"===d.type&&d.item)return{...e,type:"assistant",chunks:function(a){let b=a.id??"";switch(a.item_type){case"assistant_message":case"reasoning":return a.text?[{kind:"text",text:a.text}]:[];case"command_execution":return[{kind:"tool_use",name:"command",id:b,input:{command:a.command,exit_code:a.exit_code}}];case"file_change":return[{kind:"tool_use",name:"edit",id:b,input:a}];case"mcp_tool_call":return[{kind:"tool_use",name:`${a.server??"mcp"}/${a.tool??"tool"}`,id:b,input:a}];default:return[]}}(d.item)};if("turn.completed"===d.type){let a=d.usage;return{...e,type:"result",inputTokens:a?.input_tokens??0,outputTokens:(a?.output_tokens??0)+(a?.reasoning_output_tokens??0)}}return"turn.failed"===d.type||"error"===d.type?{...e,type:"result",isError:!0}:null}(a);return b?(b.sessionId&&(this.sessionId=b.sessionId),this.totalInputTokens+=b.inputTokens,this.totalOutputTokens+=b.outputTokens,b):null}constructor(){this.buffer="",this.totalInputTokens=0,this.totalOutputTokens=0,this.costUsd=0}}let _={claude:{id:"claude",label:"Claude Code",defaultCommand:"claude",supportsResume:!0,resumeModel:"claude-haiku-4-5",resumeMaxTurns:15,defaultModel:"claude-opus-4-7",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"],createParser:()=>new T,estimateCost:function(a,b,c){let d=a?J[a]??K:K;return b/1e6*d.inputPerMTok+c/1e6*d.outputPerMTok}},codex:{id:"codex",label:"Codex CLI",defaultCommand:"codex",supportsResume:!0,resumeModel:U,resumeMaxTurns:15,defaultModel:U,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],createParser:()=>new $,estimateCost:function(a,b,c){let d=a?V[a]??W:W;return b/1e6*d.inputPerMTok+c/1e6*d.outputPerMTok}}},aa=["claude","codex"];function ab(a){return"string"==typeof a&&aa.includes(a)?_[a]:_.claude}var ac=c(68434),ad=c(76760);function ae(){return process.env.DRYDOCK_HOME??(0,ad.join)((0,o.homedir)(),".drydock")}function af(a){return a.replace(/[^a-zA-Z0-9._-]/g,"-")}class ag extends Error{}class ah{constructor(a=ac.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 ag(c.stderr.trim()||`git ${a[0]} failed`);return c.stdout}async prepare(a,b,c=0){let d=`drydock/issue-${c}-job-${b}`,e=(0,ad.join)(ae(),"worktrees",af(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,ad.join)(ae(),"worktrees",af(a.name),`fb-${af(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,ad.join)(ae(),"worktrees",af(a.name),`dh-${af(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){await this.git(["add","-A"],a.path),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 ai=c(31421);let aj=(a,b,c,d)=>{let e=(0,ai.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 ak=c(53944),al=c(34321),am=c(63480);class an{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,am.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 ao(){return e||(e=new an),e}function ap(a){return{chunks:a.chunks,costUsd:a.costUsd}}async function aq(a,b,c,d={}){let e=d.db??(0,h.Lf)(),f=d.runner??aj,i=d.broker??ao(),j=d.provider??ab(a.agent),l=d.command??j.defaultCommand,n=a.model??j.defaultModel,o=j.createParser();"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=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:ap(c)})},onStderr:b=>i.publish(a.id,{type:"error",payload:{stderr:b}})});bB(a.id,p.abort);let q=await p.done;for(let b of(bC(a.id),o.flush()))i.publish(a.id,{type:b.type,payload:ap(b)});let r=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:r}).where((0,g.eq)(k.jobs.id,a.id)).run(),{exitCode:q,sessionId:o.sessionId,costUsd:r,inputTokens:o.totalInputTokens,outputTokens:o.totalOutputTokens}}async function ar(a,b,c,d,e={}){let f=e.db??(0,h.Lf)(),i=e.runner??aj,j=e.broker??ao(),l=e.provider??ab(a.agent),m=e.command??l.defaultCommand,n=l.createParser(),o=(0,al.Xm)((0,al.yx)(a.repoId,ak._.ciFix,f),{CI_LOG:c}),p=i(m,(l.supportsResume?l.buildResumeArgs({prompt:o,sessionId:b,model:l.resumeModel,maxTurns:l.resumeMaxTurns}):null)??l.buildStartArgs({prompt:o,model:l.resumeModel,maxTurns:l.resumeMaxTurns}),d,{onStdout:b=>{for(let c of n.push(b))j.publish(a.id,{type:c.type,payload:{chunks:c.chunks}})},onStderr:b=>j.publish(a.id,{type:"error",payload:{stderr:b}})});bB(a.id,p.abort);let q=await p.done;for(let b of(bC(a.id),n.flush()))j.publish(a.id,{type:b.type,payload:{chunks:b.chunks}});let r=a.model??l.resumeModel,s=n.costUsd>0?n.costUsd:l.estimateCost(r,n.totalInputTokens,n.totalOutputTokens),t=f.select().from(k.jobs).where((0,g.eq)(k.jobs.id,a.id)).get();return f.update(k.jobs).set({sessionId:n.sessionId??b,totalInputTokens:(t?.totalInputTokens??0)+n.totalInputTokens,totalOutputTokens:(t?.totalOutputTokens??0)+n.totalOutputTokens,costUsd:(t?.costUsd??0)+s}).where((0,g.eq)(k.jobs.id,a.id)).run(),{exitCode:q,sessionId:n.sessionId??b,costUsd:s,inputTokens:n.totalInputTokens,outputTokens:n.totalOutputTokens}}var as=c(73024);let at=["vercel","railway"];function au(a){return a.exists??as.existsSync}class av{async detect(a){let b=au(a);return b((0,ad.join)(a.cwd,"railway.json"))||b((0,ad.join)(a.cwd,"railway.toml"))||b((0,ad.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 aw{async detect(a){let b=au(a);return b((0,ad.join)(a.cwd,"vercel.json"))||b((0,ad.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 ax=[new aw,new av];async function ay(a,b){if(b)return at.includes(b)?function(a){let b=ax.find(b=>b.id===a);if(!b)throw Error(`unsupported deployment platform: ${a}`);return b}(b):null;for(let b of ax)if(await b.detect(a))return b;return null}let az={monitoring:["healthy","failed","escalated"],failed:["repairing","escalated"],repairing:["repaired","escalated"],healthy:[],repaired:[],escalated:[]};class aA extends Error{constructor(a,b){super(`invalid deployment-healing transition: ${a} -> ${b}`)}}let aB={initialDelayMs:6e4,intervalMs:6e4,timeoutMs:12e5,monitorWindowMs:36e5,maxLogLines:200};function aC(){return Math.floor(Date.now()/1e3)}function aD(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(!az[f].includes(b))throw new aA(f,b);return d.update(k.deploymentHealingSessions).set({status:b,updatedAt:aC(),...c}).where((0,g.eq)(k.deploymentHealingSessions.id,a)).returning().get()}function aE(a,b){return{cwd:a.path,ref:b,run:ac.S}}async function aF(a={}){let b=a.db??(0,h.Lf)(),c=a.now??Date.now,d=a.budgets??aB;for(let e of(0,t.uP)(b))if(D(e).autoHealDeployments)try{let f=a.forgeFor?.(e)??(0,u.Ie)(e),g=a.adapterFor??(a=>ay(aE(a,null),a.deploymentPlatform)),h=await g(e);if(!h)continue;let i=a.openFixPr??aI;await aG(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 aG(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 aH(a,e,c,b,d)}catch(c){console.error(`[deploy-heal] session ${b.id} failed for ${a.name}`,c)}}}async function aH(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 aD(d.id,"escalated",{},l);let p=aE(a,d.commitSha),q="ready"===(i=await c.getStatus(p))?"ready":"error"===i?"error":"pending";if("ready"===q)return void aD(d.id,"healthy",{},l);if("pending"===q)return void function(a,b=(0,h.Lf)()){b.update(k.deploymentHealingSessions).set({updatedAt:aC()}).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=aD(d.id,"failed",{logsExcerpt:r||null},l);aD(d.id,"repairing",{},l);try{let c=await e.openFixPr(a,b,s,r);aD(d.id,"repaired",{followupPrNumber:c},l)}catch(a){console.error(`[deploy-heal] fix PR failed for session ${d.id}`,a),aD(d.id,"escalated",{},l)}}async function aI(a,b,c,d){let e,f=(0,h.Lf)(),g=ab(b.agent),i=(e=(0,j.mt)(f),"codex"===g.id?e.codexPath:e.claudePath),k=new ah,l=c.commitSha.slice(0,7),m=`drydock/deploy-fix-${b.id}-${l}`,n=(0,u.Ie)(a),o=await k.prepareForNewBranch(a,m,`${b.id}-${l}`);try{let e=await aq(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:f,provider:g,command:i});if(0!==e.exitCode)throw Error(`${g.label} exited non-zero`);return await k.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 k.remove(o,a.path)}catch(a){console.error(`[deploy-heal] worktree cleanup failed for job ${b.id}`,a)}}}let aJ=["resolved","failed","rejected","flagged"],aK={pending:["queued","rejected","flagged"],queued:["in_progress","flagged","rejected"],in_progress:["resolved","failed","flagged","queued"],resolved:[],failed:[],rejected:[],flagged:[]};class aL extends Error{constructor(a,b){super(`invalid feedback transition: ${a} -> ${b}`)}}let aM=/\b(out of scope|follow[- ]?up|separate pr|different pr|unrelated|won'?t fix|nevermind|never mind|ignore this)\b/i,aN=/\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 aO(a,b,c={},d=(0,h.Lf)()){let e=d.select().from(k.reviewFeedbackItems).where((0,g.eq)(k.reviewFeedbackItems.id,a)).get();if(!e)throw Error(`review feedback item ${a} not found`);var f=e.status;if(!aK[f].includes(b))throw new aL(f,b);return d.update(k.reviewFeedbackItems).set({status:b,detail:c.detail??e.detail,attempts:"in_progress"===b?e.attempts+1:e.attempts,updatedAt:Math.floor(Date.now()/1e3)}).where((0,g.eq)(k.reviewFeedbackItems.id,a)).returning().get()}let aP={maxItemsPerSweep:3,maxAttemptsPerItem:2};async function aQ(a,b,c){var d;let e=(d=b.id,`<!-- drydock:review-feedback:${d} -->`),f=`${c}
4
-
5
- ${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 aR(a,b,c){let d=c.db??(0,h.Lf)(),e=c.budgets??aP,f={processed:0,resolved:0,flagged:0,rejected:0,failed:0,skipped:0},i=await c.forge.listReviewThreads(b),j=0;for(let m of i){var l;if(m.isResolved){f.skipped++;continue}let i=m.comments[0];if(!i||!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)}(i.author,c.gate)){f.skipped++;continue}let n=function(a){let b=a.trim();return aM.test(b)?"out_of_scope":aN.test(b)?"actionable":b.includes("?")?"question":"actionable"}(i.body),o=function(a,b=(0,h.Lf)()){let c=function(a,b,c=(0,h.Lf)()){return c.select().from(k.reviewFeedbackItems).where((0,g.Uo)((0,g.eq)(k.reviewFeedbackItems.jobId,a),(0,g.eq)(k.reviewFeedbackItems.threadId,b))).get()}(a.jobId,a.threadId,b);return c||b.insert(k.reviewFeedbackItems).values({jobId:a.jobId,prNumber:a.prNumber,threadId:a.threadId,reviewer:a.reviewer,classification:a.classification}).returning().get()}({jobId:a,prNumber:b,threadId:m.id,reviewer:i.author,classification:n},d);if(l=o.status,aJ.includes(l)){f.skipped++;continue}if("pending"===o.status)try{await c.forge.reactToReviewComment(i.id,"EYES")}catch{}if("pending"===o.status){if("question"===n){o=aO(o.id,"flagged",{},d),await aQ(c.forge,m,"Drydock: this looks like a question rather than a change request, so it's flagged for a human reviewer."),f.flagged++,f.processed++;continue}if("out_of_scope"===n){o=aO(o.id,"rejected",{},d),await aQ(c.forge,m,"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(m.id),f.rejected++,f.processed++;continue}o=aO(o.id,"queued",{},d)}if("queued"===o.status){if(j>=e.maxItemsPerSweep)continue;if(o.attempts>=e.maxAttemptsPerItem){o=aO(o.id,"flagged",{},d),await aQ(c.forge,m,`Drydock: could not resolve this after ${o.attempts} attempt(s); flagging for a human.`),f.flagged++,f.processed++;continue}j++,o=aO(o.id,"in_progress",{},d),c.includeProgressReplies&&await aQ(c.forge,m,"Drydock: working on this now…");let a=await c.applyFeedback(o,m);f.processed++,a.ok?(aO(o.id,"resolved",{detail:a.detail},d),await aQ(c.forge,m,"Drydock: applied this change and pushed a commit. ✅"),await c.forge.resolveReviewThread(m.id),f.resolved++):o.attempts>=e.maxAttemptsPerItem?(aO(o.id,"failed",{detail:a.detail},d),await aQ(c.forge,m,`Drydock: could not apply this automatically (${a.detail??"no change produced"}); flagging for a human.`),f.failed++):aO(o.id,"queued",{detail:a.detail},d)}}return f}let aS=new Set(["ci_running","ci_failed","retrying","needs_human"]);function aT(a){return"function"==typeof a.listReviewThreads&&"function"==typeof a.replyToReviewThread&&"function"==typeof a.updateReviewComment&&"function"==typeof a.resolveReviewThread&&"function"==typeof a.reactToReviewComment}async function aU(a={}){let b=a.db??(0,h.Lf)(),c=a.processJob??aV;for(let d of(0,t.uP)(b))if(D(d).autoReviewFeedback)try{let e=a.forgeFor?.(d)??(0,u.Ie)(d);if(!aT(e))continue;for(let a of(0,m.N6)(d.id,b).filter(a=>null!=a.prNumber&&aS.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 aV(a,b,c){var d;let e;if(!aT(c)||null==b.prNumber)return;let f=(0,h.Lf)(),g=D(a),i=ab(b.agent),k=(e=(0,j.mt)(f),"codex"===i.id?e.codexPath:e.claudePath),l=(d={repo:a,job:b,worktrees:new ah,runSession:(a,b,c)=>aq(a,b,c,{db:f,provider:i,command:k}).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 aR(b.id,b.prNumber,{forge:c,db:f,gate:{trustedReviewers:g.trustedReviewers,ignoredBots:g.ignoredBots},includeProgressReplies:g.includeProgressReplies,applyFeedback:l})}var aW=c(2373),aX=c(71218),aY=c(74058);let 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=["healed","blocked","escalated","superseded"],a4=["blocked","escalated","superseded"],a5={triaging:["awaiting_slot",...a4],awaiting_slot:["repairing",...a4],repairing:["awaiting_ci",...a4],awaiting_ci:["verifying",...a4],verifying:["healed","cooldown",...a4],cooldown:["awaiting_slot",...a4],healed:[],blocked:[],escalated:[],superseded:[]};class a6 extends Error{constructor(a,b){super(`invalid healing transition: ${a} -> ${b}`)}}let a7={maxHealAttemptsPerSession:3,maxHealAttemptsPerFingerprint:2,cooldownMs:9e5,maxConcurrentHealingRuns:1,maxEvidenceLines:200},a8=["repairing","awaiting_ci","verifying"];function a9(a,b=(0,h.Lf)()){return b.select().from(k.healingSessions).where((0,g.eq)(k.healingSessions.id,a)).get()}function ba(a,b,c=(0,h.Lf)()){let d=a9(a,c);if(!d)throw Error(`healing session ${a} not found`);var e=d.status;if(!a5[e].includes(b))throw new a6(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 bb(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 bc=new Set(["FAILURE","ERROR","CANCELLED","TIMED_OUT","ACTION_REQUIRED"]),bd=new Set(["PENDING","QUEUED","IN_PROGRESS","WAITING","REQUESTED"]);function be(a){return 0===a.length?"pending":a.some(a=>bc.has(a.state.toUpperCase()))?"failed":a.some(a=>bd.has(a.state.toUpperCase()))?"pending":"passed"}let bf=a=>new Promise(b=>setTimeout(b,a));async function bg(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 bh(a,b,c){if(c.autoHeal)return bi(a,b,c,c.autoHeal);let d=c.db??(0,h.Lf)(),e=c.sleep??bf,f=c.pollMs??3e4,g=c.maxPolls??1/0,i=a,j=0;for(;j<g;){j++;let a=be(await c.gh.prChecks(b));if("pending"===a){await e(f);continue}if("passed"===a)return await c.gh.mergePr(b),(0,m.dk)(i.id,"merged",{prNumber:b},d);if((i=(0,m.dk)(i.id,"ci_failed",{prNumber:b},d)).ciRetryCount>=3)return bg(i,b,"CI failed 3 times.",c,d);if(!i.sessionId)return(0,m.yM)(i.id,"status",{reason:"missing session id, cannot resume for CI fix"},d),(0,m.dk)(i.id,"needs_human",{errorMessage:"CI failed but no session id to resume"},d);let g=i.sessionId;i=(0,m.dk)(i.id,"retrying",{ciRetryCount:i.ciRetryCount+1},d);let h=await c.gh.failedRunLog(b);await c.resumeSession(i,g,h),i=(0,m.dk)(i.id,"ci_running",{},d)}return(0,m.ax)(i.id,d)??i}async function bi(a,b,c,d){let e,f=c.db??(0,h.Lf)(),i=c.sleep??bf,j=c.pollMs??3e4,l=c.maxPolls??1/0,n=d.budgets??a7,o=d.now??Date.now,p=a,q=0;for(;q<l;){var r,s;q++;let a=await c.gh.prChecks(b),l=be(a);if("pending"===l){await i(j);continue}if("passed"===l){if(e){let a=await d.headSha(b);bb(e.attemptId,{status:"healed",afterSha:a},f),ba(e.sessionId,"verifying",f),ba(e.sessionId,"healed",f)}return await c.gh.mergePr(b),(0,m.dk)(p.id,"merged",{prNumber:b},f)}let t=a.filter(a=>bc.has(a.state.toUpperCase())),u=await d.headSha(b);if(e){let a=(r={beforeSha:e.beforeSha,afterSha:u,beforeFailingCount:e.beforeFailing,afterFailingCount:t.length}).afterSha===r.beforeSha?{verdict:"rejected",reason:"no change pushed (no new commit)"}:r.afterFailingCount>=r.beforeFailingCount?{verdict:"rejected",reason:"no measurable improvement in failing checks"}:0===r.afterFailingCount?{verdict:"healed",reason:"all checks green"}:{verdict:"progressed",reason:"fewer checks failing"};bb(e.attemptId,{status:a.verdict,afterSha:u},f);let d=e.sessionId;if(e=void 0,"rejected"===a.verdict)return ba(d,"verifying",f),ba(d,"escalated",f),bg(p,b,`CI auto-heal: ${a.reason}.`,c,f)}let v=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,a3.includes(f))||ba(a.id,"superseded",d)}let i=e.find(a=>a.headSha===c);return i?a9(i.id,d)??i:d.insert(k.healingSessions).values({jobId:a,prNumber:b,headSha:c}).returning().get()}(p.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=function(a,b=(0,h.Lf)()){return b.select().from(k.healingAttempts).where((0,g.eq)(k.healingAttempts.sessionId,a)).all()}(v.id,f),z=y.at(-1),A=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:x,attempts:y.map(a=>({fingerprint:a.fingerprint})),lastAttemptAt:z?1e3*z.createdAt:null,now:o(),activeRuns:function(a=(0,h.Lf)()){return a.select().from(k.healingSessions).all().filter(a=>a8.includes(a.status)).length}(f),budgets:n});switch(A.action){case"block":return"triaging"===v.status&&ba(v.id,"blocked",f),await c.gh.commentIssue(p.issueNumber,`CI auto-heal: ${A.reason} — not auto-fixable. Handing over to a human.`),(0,m.dk)(p.id,"needs_human",{errorMessage:`auto-heal blocked: ${A.reason}`.slice(0,500)},f);case"escalate":return"triaging"===v.status&&ba(v.id,"escalated",f),bg(p,b,`CI auto-heal: ${A.reason}.`,c,f);case"wait_slot":await i(j);continue;case"cooldown":await i(Math.min(A.waitMs,j));continue;case"repair":case"rerun":{let a=p.sessionId;if(!a)return"triaging"===v.status&&ba(v.id,"escalated",f),bg(p,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()}(v.id,A.target,u,f);if(ba(v.id,"awaiting_slot",f),ba(v.id,"repairing",f),p=(0,m.dk)(p.id,"ci_failed",{prNumber:b},f),p=(0,m.dk)(p.id,"retrying",{ciRetryCount:p.ciRetryCount+1},f),"repair"===A.action){let b=[`CI check "${A.target.checkName}" is failing on this PR.`,"Fix only this failure, then commit and push. Failure evidence:\n",(s=n.maxEvidenceLines,w.split("\n").slice(-s).join("\n"))].join("\n");await c.resumeSession(p,a,b)}ba(v.id,"awaiting_ci",f),p=(0,m.dk)(p.id,"ci_running",{},f),e={attemptId:d.id,sessionId:v.id,beforeSha:u,beforeFailing:t.length};continue}}}return(0,m.ax)(p.id,f)??p}var bj=c(26424);async function bk(a,b,c,d=(0,h.Lf)(),e={}){for(let f of c)try{let c=await b.viewIssue(f.number),g=await (0,aX.dv)(a,{number:c.number,title:c.title,body:c.body},d,{generate:e.generate});if(!g.skipped&&g.subtasks.length>=bj.WE){let a=(0,bj.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)}}async function bl(a,b={}){let c=b.db??(0,h.Lf)(),d=b.notify??((a,b)=>(0,aY.JD)(a,b,c)),e=await bm(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 bm(a,b,c){var d;let e,f,g=b.db??(0,h.Lf)(),i=(0,m.ax)(a,g);if(!i)throw Error(`job ${a} not found`);let k=(0,t.L8)(i.repoId,g);if(!k)throw Error(`repo ${i.repoId} not found`);"queued"===i.status&&(0,m.dk)(i.id,"working",{},g);let l=b.worktrees??new ah,n=(0,u.Ie)(k),o=ab(i.agent),p=(f=(0,j.mt)(g),"codex"===o.id?f.codexPath:f.claudePath),q=b.runSession??((a,b,c)=>aq(a,b,c,{db:g,provider:o,command:p})),r=b.createPr??(a=>n.createPr(a)),s=b.runBabysitter??((a,b)=>bh(a,b,{gh:n,db:g,resumeSession:(a,b,c)=>ar(a,b,c,k.path,{db:g,provider:o,command:p}).then(()=>void 0),autoHeal:k.autoHealCi?{headSha:a=>n.prHeadSha(a),provider:k.platform}:void 0}));try{e=await l.prepare(k,i.id,i.issueNumber),(0,m.yM)(i.id,"worktree",{path:e.path,branch:e.branch},g);let a=(0,al.Xm)((0,al.yx)(k.id,ak._.main,g),{ISSUE_NUM:i.issueNumber,BRANCH:e.branch,REPO_NAME:k.name});if(k.autoDecompose){let b=(0,aX.t0)(k.id,i.issueNumber,g);b.length>0&&(a+=(d=b.map(a=>({title:a.title,status:a.status})),0===d.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,bj.cp)(d)].join("\n")),function(a,b,c=(0,h.Lf)()){for(let d of(0,aX.t0)(a,b,c))"pending"===d.status&&(0,aX.ZY)(d.id,"in_progress",c)}(k.id,i.issueNumber,g))}let b=await q((0,m.ax)(i.id,g),a,e.path);if(0!==b.exitCode)return(0,m.dk)(i.id,"needs_human",{errorMessage:`${o.label} exited non-zero`},g);if(k.adrGating){let a=(0,aW.Pe)("pending_review",g,k.id);if(a.length>0)return(0,m.dk)(i.id,"needs_human",{errorMessage:`Blocked by ${a.length} pending ADR review(s).`},g)}await l.commitAndPush(e,`Fix #${i.issueNumber}`);let f=(0,A.ts)(k.id,g).find(a=>a.number===i.issueNumber)?.title??`Fix #${i.issueNumber}`,j=await r({head:e.branch,base:k.defaultBranch,title:f,body:`Closes #${i.issueNumber}`});(0,m.dk)(i.id,"ci_running",{branch:e.branch,prNumber:j},g),await c("pr_opened",`🔀 PR opened: ${k.id}#${i.issueNumber} (PR #${j}).`);let n=await s((0,m.ax)(i.id,g),j);return k.autoDecompose&&"merged"===n.status&&function(a,b,c=(0,h.Lf)()){for(let d of(0,aX.t0)(a,b,c))!function(a,b){let c=a.status;if("done"!==c&&"skipped"!==c){if("in_progress"===c)return(0,aX.ZY)(a.id,"done",b);(0,aX.ZY)(a.id,"in_progress",b),(0,aX.ZY)(a.id,"done",b)}}(d,c)}(k.id,i.issueNumber,g),n}catch(c){let a=c instanceof Error?c.message:String(c);(0,m.yM)(i.id,"error",{message:a},g);let b=(0,m.ax)(i.id,g);if(["working","ci_running","retrying"].includes(b.status))return(0,m.dk)(i.id,"needs_human",{errorMessage:a.slice(0,500)},g);return b}finally{if(e)try{await l.remove(e,k.path)}catch(a){console.error(`[run-job] worktree cleanup failed for job ${i.id}`,a)}}}let bn=!1,bo=new Set;function bp(a){let b=(0,as.openSync)(a,"wx");try{(0,as.writeSync)(b,JSON.stringify({pid:process.pid,ts:Date.now()}))}finally{(0,as.closeSync)(b)}}let bq={active:!1};function br(a,b,c,d){var e;let f,g=(f=(e={command:(0,j.mt)(d).claudePath,model:a.defaultModel,cwd:a.path}).runner??ac.S,async a=>{let b=await f(e.command,["-p",["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",e.model],e.cwd);if(0!==b.exitCode)return[];let c=b.stdout.match(/\[[\s\S]*\]/);if(!c)return[];try{let a=JSON.parse(c[0]);if(!Array.isArray(a))return[];return a.filter(a=>"string"==typeof a).map(a=>a.trim()).filter(Boolean)}catch{return[]}});return bk(a,b,c,d,{generate:g})}let bs=["needs_human","aborted"];async function bt(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&&!!E(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,[...bs]))).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 bu=["queued","working","ci_running","ci_failed","retrying"],bv=["working","ci_running","ci_failed","retrying"];async function bw(a={}){let b=a.db??(0,h.Lf)(),c=a.runJob??bl,d=(0,t.uP)(b),e=a.triage??I,f=a.decompose??br;for(let c of d)try{await (0,v.v)("low",async()=>{let d=a.forgeFor?.(c)??(0,u.Ie)(c),i=a.fetchIssues??(async(a,b)=>(await d.refreshRateLimit?.(),d.listAllIssues())),j=await i(c.path,c.queueLabel);(0,A.VK)(c.id,j,b);let l=D(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 bt(c,l,d,a,e,b);if(!f&&!i)continue;let j=z({number:a.number,title:a.title,labels:e});if("approved"===j.decision&&!function(a,b,c){return(0,m.i1)([...bu],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 w.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,bq,b);let o=(0,j.mt)(b).maxParallelJobs,s=r();for(;!bn&&(0,j.Jf)(b).allowed&&bo.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)([...bv],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;bo.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),bo.delete(f)})}let x=a.reviewFeedback??(a=>aU({db:a}));try{await (0,v.v)("low",()=>x(b))}catch(a){console.error("[driver] review-feedback sweep failed",a)}let y=a.deploymentHealing??(a=>aF({db:a}));try{await (0,v.v)("low",()=>y(b))}catch(a){console.error("[driver] deployment-healing sweep failed",a)}}let bx=!1,by=!1,bz=!1,bA=new Map;function bB(a,b){bA.set(a,b)}function bC(a){bA.delete(a)}async function bD(){for(let a of(bn=!0,bx=!1,f&&clearTimeout(f),f=void 0,await (0,l.CZ)().catch(a=>console.error("[orchestrator] drain notify failed",a)),bA.values()))a(5e3);bA.clear(),await function(a=3e4,b=100){let c=Date.now()+a;return new Promise(a=>{let d=()=>{if(0===bo.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 bE(){if(bz)return;if(bz=!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,ad.join)(ae(),"instance.lock");(0,as.mkdirSync)((0,ad.dirname)(a),{recursive:!0});try{return bp(a),!0}catch{}let b=!1;try{let{pid:c}=JSON.parse((0,as.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,as.unlinkSync)(a),bp(a),!0}catch{return!1}}()){let a,b;!function(a={}){if(bx)return;bx=!0;let b=a.tick??(()=>bw()),c=a.intervalMs??1e3*(0,j.mt)().pollIntervalSec,d=async()=>{if(bx){if(!by){by=!0;try{await b()}catch(a){console.error("[driver] tick failed",a)}finally{by=!1}}bx&&(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 bD(),process.exit(0)};process.once("SIGINT",a),process.once("SIGTERM",a)}},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}},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"}},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];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(3481);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)}}};