@nilsr0711/drydock 0.1.8 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +4 -4
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/adrs/page.js +2 -2
- package/.next/standalone/.next/server/app/adrs/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/adrs/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/analytics/page.js +1 -1
- package/.next/standalone/.next/server/app/analytics/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/analytics/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/control/shutdown/route.js +1 -1
- package/.next/standalone/.next/server/app/api/control/shutdown/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cost/export/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/health/route.js +1 -1
- package/.next/standalone/.next/server/app/api/health/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/sse/dashboard/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/sse/jobs/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/webhooks/[repoId]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/webhooks/[repoId]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/costs/page.js +1 -1
- package/.next/standalone/.next/server/app/costs/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/costs/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/jobs/[id]/page.js +3 -3
- package/.next/standalone/.next/server/app/jobs/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/jobs/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/jobs/page.js +2 -2
- package/.next/standalone/.next/server/app/jobs/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/jobs/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/needs-human/page.js +2 -2
- package/.next/standalone/.next/server/app/needs-human/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/needs-human/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/page.js +2 -2
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/prompts/page.js +2 -2
- package/.next/standalone/.next/server/app/prompts/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/prompts/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/repos/[id]/page.js +2 -2
- package/.next/standalone/.next/server/app/repos/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/repos/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page.js +2 -2
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +4 -4
- package/.next/standalone/.next/server/chunks/152.js +3 -0
- package/.next/standalone/.next/server/chunks/304.js +1 -1
- package/.next/standalone/.next/server/chunks/387.js +14 -14
- package/.next/standalone/.next/server/chunks/40.js +1 -1
- package/.next/standalone/.next/server/chunks/475.js +19 -0
- package/.next/standalone/.next/server/chunks/50.js +1 -0
- package/.next/standalone/.next/server/chunks/521.js +1 -1
- package/.next/standalone/.next/server/chunks/614.js +2 -2
- package/.next/standalone/.next/server/chunks/668.js +1 -0
- package/.next/standalone/.next/server/chunks/786.js +1 -1
- package/.next/standalone/.next/server/chunks/908.js +1 -1
- package/.next/standalone/.next/server/chunks/{685.js → 944.js} +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/6634-74f0b66587b57037.js +1 -0
- package/.next/standalone/.next/static/chunks/8382-5201fc3dd1f64e60.js +1 -0
- package/.next/standalone/.next/static/chunks/app/adrs/page-ca11e90e9404af90.js +1 -0
- package/.next/standalone/.next/static/chunks/app/jobs/[id]/page-dfb41b4785fd7cbb.js +1 -0
- package/.next/{static/chunks/app/layout-402d4ab34259b89b.js → standalone/.next/static/chunks/app/layout-134301ff0a9b828d.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/needs-human/page-569fc0e6aefc7677.js +1 -0
- package/.next/standalone/.next/static/chunks/app/page-504585be128c823c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/prompts/page-c6bf6a4c782035ac.js +1 -0
- package/.next/standalone/.next/static/chunks/app/repos/[id]/page-c0c4531c2af46526.js +1 -0
- package/.next/standalone/.next/static/chunks/app/settings/page-84a44ab52a0ff49d.js +1 -0
- package/.next/standalone/drizzle/0036_adopt_claude_mem.sql +1 -0
- package/.next/standalone/mcp-server.cjs +304 -81
- package/.next/standalone/package.json +1 -1
- package/.next/static/chunks/6634-74f0b66587b57037.js +1 -0
- package/.next/static/chunks/8382-5201fc3dd1f64e60.js +1 -0
- package/.next/static/chunks/app/adrs/page-ca11e90e9404af90.js +1 -0
- package/.next/static/chunks/app/jobs/[id]/page-dfb41b4785fd7cbb.js +1 -0
- package/.next/{standalone/.next/static/chunks/app/layout-402d4ab34259b89b.js → static/chunks/app/layout-134301ff0a9b828d.js} +1 -1
- package/.next/static/chunks/app/needs-human/page-569fc0e6aefc7677.js +1 -0
- package/.next/static/chunks/app/page-504585be128c823c.js +1 -0
- package/.next/static/chunks/app/prompts/page-c6bf6a4c782035ac.js +1 -0
- package/.next/static/chunks/app/repos/[id]/page-c0c4531c2af46526.js +1 -0
- package/.next/static/chunks/app/settings/page-84a44ab52a0ff49d.js +1 -0
- package/README.md +11 -5
- package/drizzle/0036_adopt_claude_mem.sql +1 -0
- package/package.json +1 -1
- package/.next/standalone/.next/server/chunks/99.js +0 -21
- package/.next/standalone/.next/static/chunks/1298-0d60333e56ac8b2c.js +0 -1
- package/.next/standalone/.next/static/chunks/app/adrs/page-0c221fc18d1e89af.js +0 -1
- package/.next/standalone/.next/static/chunks/app/jobs/[id]/page-6ef8bc39b5181817.js +0 -1
- package/.next/standalone/.next/static/chunks/app/needs-human/page-b69ac22856c0a0b1.js +0 -1
- package/.next/standalone/.next/static/chunks/app/page-ccefa99d40734a8c.js +0 -1
- package/.next/standalone/.next/static/chunks/app/prompts/page-bcd1063eb5d64aa5.js +0 -1
- package/.next/standalone/.next/static/chunks/app/repos/[id]/page-2bd4b35a0b28042e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/settings/page-13a04ecac139b74c.js +0 -1
- package/.next/static/chunks/1298-0d60333e56ac8b2c.js +0 -1
- package/.next/static/chunks/app/adrs/page-0c221fc18d1e89af.js +0 -1
- package/.next/static/chunks/app/jobs/[id]/page-6ef8bc39b5181817.js +0 -1
- package/.next/static/chunks/app/needs-human/page-b69ac22856c0a0b1.js +0 -1
- package/.next/static/chunks/app/page-ccefa99d40734a8c.js +0 -1
- package/.next/static/chunks/app/prompts/page-bcd1063eb5d64aa5.js +0 -1
- package/.next/static/chunks/app/repos/[id]/page-2bd4b35a0b28042e.js +0 -1
- package/.next/static/chunks/app/settings/page-13a04ecac139b74c.js +0 -1
- /package/.next/standalone/.next/static/{qSEvPCWIslg9lcxt6XQhl → gBXyOslZ8CoJrAVnOEHDm}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{qSEvPCWIslg9lcxt6XQhl → gBXyOslZ8CoJrAVnOEHDm}/_ssgManifest.js +0 -0
- /package/.next/static/{qSEvPCWIslg9lcxt6XQhl → gBXyOslZ8CoJrAVnOEHDm}/_buildManifest.js +0 -0
- /package/.next/static/{qSEvPCWIslg9lcxt6XQhl → gBXyOslZ8CoJrAVnOEHDm}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=40,exports.ids=[40],exports.modules={11183:(a,b,c)=>{c.d(b,{oW:()=>z,$p:()=>y,VL:()=>B,u3:()=>A});var d=c(14565),e=c(89642),f=c(26370);let g="main";async function h(a,b,c){try{let d=await a("git",["-C",b,...c]);if(0!==d.exitCode)return null;return d.stdout.trim()||null}catch{return null}}async function i(a,b=f.Sx){let c=await h(b,a,["symbolic-ref","--short","refs/remotes/origin/HEAD"]);if(c){let a=c.replace(/^origin\//,"");if(a)return a}let d=await h(b,a,["rev-parse","--abbrev-ref","HEAD"]);return d&&"HEAD"!==d?d:g}async function j(a,b=f.Sx){let c=a.defaultBranch?.trim();return c||i(a.path,b)}var k=c(88162),l=c(79241),m=c(67055),n=c(95310),o=c(92958),p=c(51769),q=c(20200),r=c(3061),s=c(70040),t=c(16719),u=c(41575);function v(a){return m.YO(m.Yj()).default(()=>JSON.parse(a)).transform(a=>JSON.stringify(a))}let w=m.Ik({path:m.Yj().min(1,"path is required"),name:m.Yj().min(1,"name is required"),defaultBranch:m.Yj().min(1).default("main"),queueLabel:m.Yj().min(1).default("drydock:queue"),workingLabel:m.Yj().min(1).default("drydock:working"),needsHumanLabel:m.Yj().min(1).default("drydock:needs-human"),defaultModel:m.Yj().min(1).default("claude-opus-4-8"),agent:m.k5(["claude","codex","openrouter"]).default("claude"),platform:m.k5(["github","gitlab"]).default("github"),apiBaseUrl:m.Yj().refine(a=>""===a||(0,p.g)(a),{message:"apiBaseUrl must be an absolute http(s) URL"}).nullish(),apiToken:m.Yj().nullish(),dailyCostLimitUsd:m.ai().nonnegative().default(0),adrGating:m.zM().default(!1),sequential:m.zM().default(!0),autoTriageEnabled:m.zM().default(!0),autoProcessEnabled:m.zM().default(!0),autoHealCi:m.zM().default(!0),autoReviewFeedback:m.zM().default(!0),autoResolveMergeConflicts:m.zM().default(!0),includeProgressReplies:m.zM().default(!1),autoDecompose:m.zM().default(!0),planFirst:m.zM().default(!1),verifyPr:m.zM().default(!0),autoHealDeployments:m.zM().default(!1),releaseEnabled:m.zM().default(!1),deploymentPlatform:m.k5(["vercel","railway"]).nullish(),readyLabels:v('["ready","ready-for-agent","ready-to-work"]'),blockingLabels:v('["blocked","question","needs-human","needs-discussion","wontfix","duplicate","invalid"]'),autoLabelWhitelist:v('["bug","enhancement","documentation","ready"]'),priorityAuthors:v("[]"),trustedReviewers:v("[]"),trustedBots:v('["cursor[bot]","coderabbitai[bot]"]'),ignoredBots:v('["dependabot[bot]","github-actions[bot]","codecov[bot]"]'),minAuthorAssociation:m.k5(["approved","any"]).default("approved"),maxAttempts:m.ai().int().positive().default(3),maxJobMinutes:m.ai().int().nonnegative().nullish(),maxCiWaitMinutes:m.ai().int().nonnegative().nullish(),mergeGateMinutes:m.ai().int().nonnegative().default(0),mergeWithoutChecks:m.zM().default(!1),maxJobCostUsd:m.ai().nonnegative().nullish(),agentInstructions:m.Yj().max(t.v).nullish(),webhookSecret:m.Yj().nullish(),autoPrAudit:m.zM().default(!0),prAuditAgent:m.k5(["claude","codex"]).nullish(),prAuditModel:m.Yj().min(1).refine(q.WM,{message:"unknown model id"}).nullish(),prAuditLanguage:m.Yj().regex(/^[a-zA-Z]{2,8}(-[a-zA-Z0-9]{1,8})*$/,{message:"prAuditLanguage must be a simple or BCP 47 language code"}).default("en"),prAuditPostOnPr:m.zM().default(!1),escalateModelOnRetry:m.zM().default(!1),sandbox:m.k5(["none","docker"]).default("none"),sandboxImage:m.Yj().nullish(),sandboxAllowNetwork:m.zM().default(!1),sandboxCpus:m.Yj().nullish(),sandboxMemory:m.Yj().nullish()});function x(a,b,c){if("openrouter"===a){let a=(0,r.Hi)(b,c);if(!a||!(0,r.fj)(a))throw Error(`OpenRouter model "${b}" is not in the synced catalog (or no longer available) — refresh the catalog in Settings or pick a different model`);if((0,u.mt)(c).openrouterFreeModelsOnly&&!a.isFree)throw Error(`OpenRouter model "${b}" is not free and the free-models-only policy is enabled`);return}if(!(0,q.WM)(b))throw Error("unknown model id")}async function y(a){return a.trim()?i(a):g}async function z(a){let b=await j(a),c=function(a,b=(0,n.Lf)()){let c=w.parse(a);return x(c.agent,c.defaultModel,b),b.insert(o.repos).values(c).returning().get()}({...a,defaultBranch:b});return(0,e.revalidatePath)("/"),(0,k.ej)(),c}async function A(a,b){let c=function(a,b,c=(0,n.Lf)()){let d,e=Object.fromEntries(Object.entries(w.partial().parse(b)).filter(([a])=>a in b&&void 0!==b[a]));if(void 0!==e.agent||void 0!==e.defaultModel){if(!(d=c.select().from(o.repos).where((0,l.eq)(o.repos.id,a)).get()))throw Error(`repo ${a} not found`);x(e.agent??d.agent,e.defaultModel??d.defaultModel,c)}if(0===Object.keys(e).length){if(!(d??=c.select().from(o.repos).where((0,l.eq)(o.repos.id,a)).get()))throw Error(`repo ${a} not found`);return d}let f=c.update(o.repos).set(e).where((0,l.eq)(o.repos.id,a)).returning().get();if(!f)throw Error(`repo ${a} not found`);return f}(a,b);return(0,e.revalidatePath)("/"),(0,e.revalidatePath)(`/repos/${a}`),(0,k.ej)(),c}async function B(a){!function(a,b=(0,n.Lf)()){b.transaction(()=>{let c=b.select({id:o.jobs.id}).from(o.jobs).where((0,l.Uo)((0,l.eq)(o.jobs.repoId,a),(0,l.KL)(o.jobs.status,[...s.kl]))).all();if(c.length>0)throw Error(`Cannot remove this repository: ${c.length} job(s) are still active. Abort or finish them first.`);b.delete(o.repos).where((0,l.eq)(o.repos.id,a)).run()})}(a),(0,e.revalidatePath)("/"),(0,k.ej)()}(0,c(13897).D)([y,z,A,B]),(0,d.A)(y,"
|
|
1
|
+
"use strict";exports.id=40,exports.ids=[40],exports.modules={11183:(a,b,c)=>{c.d(b,{oW:()=>z,$p:()=>y,VL:()=>B,u3:()=>A});var d=c(14565),e=c(89642),f=c(26370);let g="main";async function h(a,b,c){try{let d=await a("git",["-C",b,...c]);if(0!==d.exitCode)return null;return d.stdout.trim()||null}catch{return null}}async function i(a,b=f.Sx){let c=await h(b,a,["symbolic-ref","--short","refs/remotes/origin/HEAD"]);if(c){let a=c.replace(/^origin\//,"");if(a)return a}let d=await h(b,a,["rev-parse","--abbrev-ref","HEAD"]);return d&&"HEAD"!==d?d:g}async function j(a,b=f.Sx){let c=a.defaultBranch?.trim();return c||i(a.path,b)}var k=c(88162),l=c(79241),m=c(67055),n=c(95310),o=c(92958),p=c(51769),q=c(20200),r=c(3061),s=c(70040),t=c(16719),u=c(41575);function v(a){return m.YO(m.Yj()).default(()=>JSON.parse(a)).transform(a=>JSON.stringify(a))}let w=m.Ik({path:m.Yj().min(1,"path is required"),name:m.Yj().min(1,"name is required"),defaultBranch:m.Yj().min(1).default("main"),queueLabel:m.Yj().min(1).default("drydock:queue"),workingLabel:m.Yj().min(1).default("drydock:working"),needsHumanLabel:m.Yj().min(1).default("drydock:needs-human"),defaultModel:m.Yj().min(1).default("claude-opus-4-8"),agent:m.k5(["claude","codex","openrouter"]).default("claude"),platform:m.k5(["github","gitlab"]).default("github"),apiBaseUrl:m.Yj().refine(a=>""===a||(0,p.g)(a),{message:"apiBaseUrl must be an absolute http(s) URL"}).nullish(),apiToken:m.Yj().nullish(),dailyCostLimitUsd:m.ai().nonnegative().default(0),adrGating:m.zM().default(!1),sequential:m.zM().default(!0),autoTriageEnabled:m.zM().default(!0),autoProcessEnabled:m.zM().default(!0),autoHealCi:m.zM().default(!0),autoReviewFeedback:m.zM().default(!0),autoResolveMergeConflicts:m.zM().default(!0),includeProgressReplies:m.zM().default(!1),autoDecompose:m.zM().default(!0),planFirst:m.zM().default(!1),verifyPr:m.zM().default(!0),autoHealDeployments:m.zM().default(!1),releaseEnabled:m.zM().default(!1),deploymentPlatform:m.k5(["vercel","railway"]).nullish(),readyLabels:v('["ready","ready-for-agent","ready-to-work"]'),blockingLabels:v('["blocked","question","needs-human","needs-discussion","wontfix","duplicate","invalid"]'),autoLabelWhitelist:v('["bug","enhancement","documentation","ready"]'),priorityAuthors:v("[]"),trustedReviewers:v("[]"),trustedBots:v('["cursor[bot]","coderabbitai[bot]"]'),ignoredBots:v('["dependabot[bot]","github-actions[bot]","codecov[bot]"]'),minAuthorAssociation:m.k5(["approved","any"]).default("approved"),maxAttempts:m.ai().int().positive().default(3),maxJobMinutes:m.ai().int().nonnegative().nullish(),maxCiWaitMinutes:m.ai().int().nonnegative().nullish(),mergeGateMinutes:m.ai().int().nonnegative().default(0),mergeWithoutChecks:m.zM().default(!1),maxJobCostUsd:m.ai().nonnegative().nullish(),agentInstructions:m.Yj().max(t.v).nullish(),webhookSecret:m.Yj().nullish(),autoPrAudit:m.zM().default(!0),prAuditAgent:m.k5(["claude","codex"]).nullish(),prAuditModel:m.Yj().min(1).refine(q.WM,{message:"unknown model id"}).nullish(),prAuditLanguage:m.Yj().regex(/^[a-zA-Z]{2,8}(-[a-zA-Z0-9]{1,8})*$/,{message:"prAuditLanguage must be a simple or BCP 47 language code"}).default("en"),prAuditPostOnPr:m.zM().default(!1),escalateModelOnRetry:m.zM().default(!1),sandbox:m.k5(["none","docker"]).default("none"),sandboxImage:m.Yj().nullish(),sandboxAllowNetwork:m.zM().default(!1),sandboxCpus:m.Yj().nullish(),sandboxMemory:m.Yj().nullish(),adoptClaudeMem:m.zM().default(!1)});function x(a,b,c){if("openrouter"===a){let a=(0,r.Hi)(b,c);if(!a||!(0,r.fj)(a))throw Error(`OpenRouter model "${b}" is not in the synced catalog (or no longer available) — refresh the catalog in Settings or pick a different model`);if((0,u.mt)(c).openrouterFreeModelsOnly&&!a.isFree)throw Error(`OpenRouter model "${b}" is not free and the free-models-only policy is enabled`);return}if(!(0,q.WM)(b))throw Error("unknown model id")}async function y(a){return a.trim()?i(a):g}async function z(a){let b=await j(a),c=function(a,b=(0,n.Lf)()){let c=w.parse(a);return x(c.agent,c.defaultModel,b),b.insert(o.repos).values(c).returning().get()}({...a,defaultBranch:b});return(0,e.revalidatePath)("/"),(0,k.ej)(),c}async function A(a,b){let c=function(a,b,c=(0,n.Lf)()){let d,e=Object.fromEntries(Object.entries(w.partial().parse(b)).filter(([a])=>a in b&&void 0!==b[a]));if(void 0!==e.agent||void 0!==e.defaultModel){if(!(d=c.select().from(o.repos).where((0,l.eq)(o.repos.id,a)).get()))throw Error(`repo ${a} not found`);x(e.agent??d.agent,e.defaultModel??d.defaultModel,c)}if(0===Object.keys(e).length){if(!(d??=c.select().from(o.repos).where((0,l.eq)(o.repos.id,a)).get()))throw Error(`repo ${a} not found`);return d}let f=c.update(o.repos).set(e).where((0,l.eq)(o.repos.id,a)).returning().get();if(!f)throw Error(`repo ${a} not found`);return f}(a,b);return(0,e.revalidatePath)("/"),(0,e.revalidatePath)(`/repos/${a}`),(0,k.ej)(),c}async function B(a){!function(a,b=(0,n.Lf)()){b.transaction(()=>{let c=b.select({id:o.jobs.id}).from(o.jobs).where((0,l.Uo)((0,l.eq)(o.jobs.repoId,a),(0,l.KL)(o.jobs.status,[...s.kl]))).all();if(c.length>0)throw Error(`Cannot remove this repository: ${c.length} job(s) are still active. Abort or finish them first.`);b.delete(o.repos).where((0,l.eq)(o.repos.id,a)).run()})}(a),(0,e.revalidatePath)("/"),(0,k.ej)()}(0,c(13897).D)([y,z,A,B]),(0,d.A)(y,"40328ee6b94d3714897e8dc923d8ac524f3b739202",null),(0,d.A)(z,"40aee73460344615dd6abf795f8eee1a3244be843e",null),(0,d.A)(A,"600ab73aefdfa18cb73f40404e31cac1a432251128",null),(0,d.A)(B,"4054080db167d1cf1abb31c2d68ee13cfd3f079979",null)},22096:(a,b,c)=>{c.d(b,{A:()=>d});let d=(0,c(71859).A)("plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]])},37756:(a,b,c)=>{c.d(b,{A:()=>d});let d=(0,c(71859).A)("inbox",[["polyline",{points:"22 12 16 12 14 15 10 15 8 12 2 12",key:"o97t9d"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}]])},40104:(a,b,c)=>{c.d(b,{Sparkline:()=>g});var d=c(27905),e=c(35924),f=c(62507);function g({data:a,width:b=132,height:c=36,tone:h="chart-1",fill:i=!0,strokeWidth:j=1.75,average:k=!1}){let l=`sp${(0,e.useId)().replace(/:/g,"")}`;if(0===a.length)return null;let m=Math.min(...a),n=Math.max(...a)-m||1,o=a.length>1?b/(a.length-1):b,p=a.map((a,b)=>[b*o,c-3-(a-m)/n*(c-6)]),q=p.map((a,b)=>`${b?"L":"M"}${a[0].toFixed(1)} ${a[1].toFixed(1)}`).join(" "),r=`${q} L${b} ${c} L0 ${c} Z`,s=(0,f.U)(h),t=p[p.length-1]??[0,c-3],u=c-3-(a.reduce((a,b)=>a+b,0)/a.length-m)/n*(c-6);return(0,d.jsxs)("svg",{width:b,height:c,viewBox:`0 0 ${b} ${c}`,className:"overflow-visible","aria-hidden":"true",children:[i&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("defs",{children:(0,d.jsxs)("linearGradient",{id:l,x1:"0",y1:"0",x2:"0",y2:"1",children:[(0,d.jsx)("stop",{offset:"0%",stopColor:s,stopOpacity:"0.22"}),(0,d.jsx)("stop",{offset:"100%",stopColor:s,stopOpacity:"0"})]})}),(0,d.jsx)("path",{d:r,fill:`url(#${l})`})]}),k&&a.length>1&&(0,d.jsx)("line",{x1:0,x2:b,y1:u,y2:u,stroke:"hsl(var(--muted-foreground) / 0.45)",strokeWidth:1,strokeDasharray:"3 3"}),(0,d.jsx)("path",{d:q,fill:"none",stroke:s,strokeWidth:j,strokeLinecap:"round",strokeLinejoin:"round"}),(0,d.jsx)("circle",{cx:t[0],cy:t[1],r:2.5,fill:s})]})}},62507:(a,b,c)=>{c.d(b,{U:()=>d});function d(a){return a?`hsl(var(--${a}))`:"hsl(var(--muted-foreground))"}}};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";exports.id=475,exports.ids=[475],exports.modules={1065:(a,b,c)=>{c.d(b,{ND:()=>s,RD:()=>q,TG:()=>h,_M:()=>k,mL:()=>j});var d=c(73024),e=c(48161),f=c(76760),g=c(77597);function h(){return process.env.DRYDOCK_HOME??(0,f.join)((0,e.homedir)(),".drydock")}function i(a){return a.replace(/[^a-zA-Z0-9._-]/g,"-")}function j(a,b){let c=b?b.normalize("NFKD").replace(/\p{Diacritic}/gu,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,50).replace(/-+$/g,""):"";return c?`issue-${a}-${c}`:`issue-${a}`}function k(a){return(0,f.join)(h(),"worktrees",i(a))}let l="claude|anthropic|codex|openai|chatgpt|copilot|gemini|cursor|devin",m=RegExp(`^(?:co-authored-by:.*\\b(?:${l})\\b|🤖?\\s*generated (?:with|by)\\b.*\\b(?:${l})\\b)`,"i");function n(a){return a.split("\n").filter(a=>!m.test(a.trim())).join("\n").replace(/\n{3,}/g,"\n\n").replace(/\s+$/,"")}function o(a){return""===a.trim()?"chore: update":a}class p extends Error{}class q extends p{constructor(){super("nothing to commit")}}let r=new Map;class s{constructor(a=g.Sx){this.run=a}withRepoLock(a,b){let c=(r.get(a)??Promise.resolve()).then(b,b);return r.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 p(c.stderr.trim()||`git ${a[0]} failed`);return c.stdout}async prepare(a,b,c=0,e=`issue-${c}`){let g=`drydock/${e}-job-${b}`,h=(0,f.join)(k(a.name),`job-${b}`),i=await this.withRepoLock(a.path,async()=>(await this.git(["-C",a.path,"worktree","remove","--force",h]).catch(()=>void 0),(0,d.rmSync)(h,{recursive:!0,force:!0}),await this.git(["-C",a.path,"worktree","prune"]).catch(()=>void 0),await this.git(["-C",a.path,"branch","-D",g]).catch(()=>void 0),await this.git(["-C",a.path,"worktree","add","-b",g,h,a.defaultBranch]),this.resolveBase(a.path,g)));return{path:h,branch:g,base:i}}async prepareForBranch(a,b,c){let d=(0,f.join)(k(a.name),`fb-${i(c)}`),e=await this.withRepoLock(a.path,async()=>(await this.git(["-C",a.path,"fetch","origin",b]),await this.git(["-C",a.path,"worktree","add",d,b]),this.resolveBase(a.path,b)));return{path:d,branch:b,base:e}}async prepareResume(a,b,c){let e=(0,f.join)(k(a.name),`job-${b}`),g=await this.withRepoLock(a.path,async()=>(await this.git(["-C",a.path,"worktree","remove","--force",e]).catch(()=>void 0),(0,d.rmSync)(e,{recursive:!0,force:!0}),await this.git(["-C",a.path,"worktree","prune"]).catch(()=>void 0),await this.git(["-C",a.path,"branch","-D",c]).catch(()=>void 0),await this.git(["-C",a.path,"fetch","origin",c]),await this.git(["-C",a.path,"worktree","add","-B",c,e,`origin/${c}`]),this.resolveBase(a.path,c)));return{path:e,branch:c,base:g}}async prepareForNewBranch(a,b,c){let d=(0,f.join)(k(a.name),`dh-${i(c)}`),e=await this.withRepoLock(a.path,async()=>(await this.git(["-C",a.path,"worktree","add","-b",b,d,a.defaultBranch]),this.resolveBase(a.path,b)));return{path:d,branch:b,base:e}}async resolveBase(a,b){return(await this.git(["-C",a,"rev-parse",b])).trim()}async hasNewCommits(a){return!!a.base&&Number.parseInt((await this.git(["rev-list","--count",`${a.base}..HEAD`],a.path)).trim()||"0",10)>0}async stageForPush(a,b){return(await this.git(["add","-A"],a.path),""!==(await this.git(["status","--porcelain"],a.path)).trim())?(await this.git(["commit","-m",o(n(b))],a.path),!0):this.hasNewCommits(a)}async commitAndPush(a,b){if(!await this.stageForPush(a,b))throw new q;await this.stripAttributionFromHistory(a),await this.git(["push","-u","origin",a.branch],a.path)}async commitAndPushForHuman(a,b){return!!await this.stageForPush(a,b)&&(await this.stripAttributionFromHistory(a),await this.git(["push","-u","origin",a.branch],a.path),!0)}async stripAttributionFromHistory(a){if(!a.base)return;let b=(await this.git(["rev-list","--reverse",`${a.base}..HEAD`],a.path)).trim();if(!b)return;let c=b.split("\n"),d=[],e=!1;for(let b of c){let c=(await this.git(["log","-1","--format=%B",b],a.path)).replace(/\s+$/,""),f=n(c);d.push({sha:b,original:c,cleaned:f}),f!==c&&(e=!0)}if(e)for(let b of(await this.git(["reset","--hard",a.base],a.path),d))await this.git(["cherry-pick",b.sha],a.path),b.cleaned!==b.original&&await this.git(["commit","--amend","-m",o(b.cleaned)],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"])})}}},9617:(a,b,c)=>{let d;c.d(b,{Ix:()=>u,Ym:()=>q,_$:()=>p,jQ:()=>r,m:()=>n,pp:()=>t,sV:()=>m,wL:()=>s});var e=c(77598),f=c(48161),g=c(97496),h=c(84232),i=c(2025),j=c(64537),k=c(2412),l=c(52479);let m=3e4,n=1e4,o=()=>Math.floor(Date.now()/1e3);function p(){return d||(d=`${(0,f.hostname)()}#${process.pid}`),d}function q(a={},b=(0,i.Lf)()){let{repoIds:c,excludeAgents:d}=a;if(c&&0===c.length)return;let f=a.leaseMs??m,l=a.worker??p(),n=a.now??o();return b.transaction(a=>{let b=a.select({job:j.jobs}).from(j.jobs).leftJoin(j.issues,(0,g.Uo)((0,g.eq)(j.issues.repoId,j.jobs.repoId),(0,g.eq)(j.issues.number,j.jobs.issueNumber))).where((0,g.Uo)((0,g.eq)(j.jobs.status,"queued"),(0,g.or)((0,g.kZ)(j.jobs.availableAt),(0,g.wJ)(j.jobs.availableAt,n)),c?(0,g.RV)(j.jobs.repoId,c):void 0,d&&d.length>0?(0,g.KL)(j.jobs.agent,d):void 0)).orderBy((0,h.ll)`COALESCE(${j.issues.priority}, 1e9)`,j.jobs.createdAt).get()?.job;if(b)return(0,k.dk)(b.id,"working",{leaseToken:(0,e.randomUUID)(),leaseExpiresAt:n+Math.ceil(f/1e3),workerId:l,attempts:b.attempts+1,availableAt:null},a)})}function r(a,b,c={},d=(0,i.Lf)()){let e=c.leaseMs??m,f=c.now??o();return d.update(j.jobs).set({leaseExpiresAt:f+Math.ceil(e/1e3)}).where((0,g.Uo)((0,g.eq)(j.jobs.id,a),(0,g.eq)(j.jobs.leaseToken,b),(0,g.eq)(j.jobs.status,"working"))).run().changes>0}function s(a,b,c=(0,i.Lf)()){return c.update(j.jobs).set({leaseToken:null,leaseExpiresAt:null,workerId:null}).where((0,g.Uo)((0,g.eq)(j.jobs.id,a),(0,g.eq)(j.jobs.leaseToken,b))).run().changes>0}function t(a={},b=(0,i.Lf)()){let c=a.now??o(),d=a.expiredBefore,e=void 0===d?void 0:(0,g.or)((0,g.kZ)(j.jobs.leaseExpiresAt),(0,g.wJ)(j.jobs.leaseExpiresAt,d)),f=b.select().from(j.jobs).where((0,g.Uo)((0,g.eq)(j.jobs.status,"working"),e)).all();for(let a of f)b.update(j.jobs).set({status:"queued",leaseToken:null,leaseExpiresAt:null,workerId:null,availableAt:c+function(a,b=5,c=300){return a<=0?0:Math.min(b*2**(a-1),c)}(a.attempts)}).where((0,g.eq)(j.jobs.id,a.id)).run(),(0,k.yM)(a.id,"status",{from:"working",to:"queued",reason:"lease_expired"},b);return f.length}function u(a,b=(0,i.Lf)()){let c=a.dedupeKey??`${a.repoId}:${a.issueNumber}`;if(!b.select({id:j.jobs.id}).from(j.jobs).where((0,g.Uo)((0,g.eq)(j.jobs.dedupeKey,c),(0,g.KL)(j.jobs.status,[...l.kl]))).get())try{return(0,k._S)({...a,dedupeKey:c},b)}catch(a){if(a instanceof Error&&"string"==typeof a.code&&"SQLITE_CONSTRAINT_UNIQUE"===a.code)return;throw a}}},16544:(a,b,c)=>{c.d(b,{A:()=>f,i:()=>g});let d=new Set(["OWNER","MEMBER","COLLABORATOR"]);function e(a){try{let b=JSON.parse(a);return Array.isArray(b)?b.filter(a=>"string"==typeof a):[]}catch{return[]}}function f(a){return{autoTriageEnabled:a.autoTriageEnabled,autoProcessEnabled:a.autoProcessEnabled,autoHealCi:a.autoHealCi,autoReviewFeedback:a.autoReviewFeedback,mergeWithoutChecks:a.mergeWithoutChecks,autoResolveMergeConflicts:a.autoResolveMergeConflicts,includeProgressReplies:a.includeProgressReplies,autoDecompose:a.autoDecompose,planFirst:a.planFirst,verifyPr:a.verifyPr,autoHealDeployments:a.autoHealDeployments,releaseEnabled:a.releaseEnabled,deploymentPlatform:a.deploymentPlatform,readyLabels:e(a.readyLabels),blockingLabels:e(a.blockingLabels),autoLabelWhitelist:e(a.autoLabelWhitelist),priorityAuthors:e(a.priorityAuthors),trustedReviewers:e(a.trustedReviewers),trustedBots:e(a.trustedBots),ignoredBots:e(a.ignoredBots),minAuthorAssociation:"any"===a.minAuthorAssociation?"any":"approved",maxAttempts:a.maxAttempts,sandbox:"docker"===a.sandbox?"docker":"none",sandboxImage:a.sandboxImage,sandboxAllowNetwork:a.sandboxAllowNetwork,sandboxCpus:a.sandboxCpus,sandboxMemory:a.sandboxMemory}}function g(a,b){return"any"===a.minAuthorAssociation||null!=b&&d.has(b.toUpperCase())}},27630:(a,b,c)=>{c.d(b,{V:()=>A,n:()=>B});var d=c(97496),e=c(84232),f=c(51214),g=c(20203),h=c(2025),i=c(64537),j=c(94534),k=c(26287),l=c(29668),m=c(48733),n=c(2412),o=c(7611),p=c(5079),q=c(96356);function r(a,b){return!b.timedOut&&!b.costExceeded&&"error_max_turns"===a.resultSubtype}function s(a,b,c,d){let e=(0,o.nc)(a.id,d);if(e)return c.publish(b.id,{type:"error",payload:{stderr:`session not started: ${a.label} is limit-blocked (${e.kind}) until ${new Date(1e3*e.blockedUntil).toISOString()}`}}),{exitCode:-3,costUsd:0,inputTokens:0,outputTokens:0,timedOut:!1,costExceeded:!1,maxTurnsReached:!1,limit:{agent:a.id,kind:e.kind,resetAt:e.blockedUntil,rawSnippet:e.rawSnippet,latched:!0}}}function t(a,b,c,d){if(!d.timedOut&&!d.costExceeded&&(0!==d.exitCode||b.resultIsError))return a.classifyFailure?.({exitCode:d.exitCode,stderr:c,resultText:b.resultText,resultIsError:b.resultIsError})}function u(a,b,c){let d=Math.floor(Date.now()/1e3),e=(0,f.qE)(b.rateLimit,d);e&&(0,p.IP)(a.id,e,c);let g=a.captureUsage?.(b);g&&(0,p.Cx)(g,c,d)}function v(a,b){let c=()=>{},d=!1;return{tripped:new Promise(a=>{c=a}),observe(){!d&&b()>=a&&(d=!0,c())}}}function w(a,b={}){let{timeoutMs:c,costTripped:d}=b,e=b.graceMs??5e3,f=!!c&&c>0;return f||d?new Promise(b=>{let g,h=!1,i=!1,j=a=>{h||(h=!0,b(a))},k=b=>{let c;if(i)return;i=!0,g&&clearTimeout(g),a.abort();let d=new Promise(a=>{c=setTimeout(a,e),c.unref?.()});Promise.race([a.done,d]).then(()=>{clearTimeout(c),j(b)})};f&&(g=setTimeout(()=>{k({exitCode:-1,timedOut:!0,costExceeded:!1})},c),g.unref?.()),d?.then(()=>{k({exitCode:-2,timedOut:!1,costExceeded:!0})}),a.done.then(a=>{i||(g&&clearTimeout(g),j({exitCode:a,timedOut:!1,costExceeded:!1}))})}):a.done.then(a=>({exitCode:a,timedOut:!1,costExceeded:!1}))}let x={costUsd:0,inputTokens:0,outputTokens:0};function y(a,b){let c=a.select().from(i.jobs).where((0,d.eq)(i.jobs.id,b)).get();return{costUsd:c?.costUsd??0,inputTokens:c?.totalInputTokens??0,outputTokens:c?.totalOutputTokens??0}}function z(a,b){return{chunks:a.chunks,costUsd:b.costUsd,inputTokens:b.inputTokens,outputTokens:b.outputTokens}}async function A(a,b,f,k={}){let l=k.db??(0,h.Lf)(),o=k.runner??j.g,p=k.broker??(0,m.k)(),B=k.provider??(0,g.X$)(a.agent);if("http"===B.kind){let{runOpenRouterJobSession:d}=await c.e(908).then(c.bind(c,17908));return d(a,b,f,{db:l,broker:k.broker,timeoutMs:k.timeoutMs,costCapUsd:k.costCapUsd,sideSession:k.sideSession,fetchImpl:k.fetchImpl,toolExecutor:k.toolExecutor})}let C=k.command??B.defaultCommand,D=a.model??B.defaultModel,E=B.createParser();E.onParseError=b=>p.publish(a.id,{type:"parse_error",payload:b});let F=s(B,a,p,l);if(F)return F;k.sideSession||("working"!==a.status?(0,n.dk)(a.id,"working",{model:D},l):l.update(i.jobs).set({model:D}).where((0,d.eq)(i.jobs.id,a.id)).run());let G=()=>E.costUsd>0?E.costUsd:B.estimateCost(D,E.totalInputTokens,E.totalOutputTokens,E.totalCacheCreationInputTokens,E.totalCacheReadInputTokens),H=k.costCapUsd&&k.costCapUsd>0?v(k.costCapUsd,G):void 0,I=k.sideSession?y(l,a.id):x,J=()=>({costUsd:I.costUsd+G(),inputTokens:I.inputTokens+E.totalInputTokens,outputTokens:I.outputTokens+E.totalOutputTokens}),K=B.buildStartArgs({prompt:b,model:D,maxTurns:a.maxTurns,bypassPermissions:k.bypassPermissions}),L="",M=o(C,K,f,{onStdout:b=>{for(let c of E.push(b))p.publish(a.id,{type:c.type,payload:z(c,J())});H?.observe()},onStderr:b=>{L=(L+b).slice(-16384),p.publish(a.id,{type:"error",payload:{stderr:b}})}});(0,q.registerAbort)(a.id,M.abort);let{exitCode:N,timedOut:O,costExceeded:P}=await w(M,{timeoutMs:k.timeoutMs,costTripped:H?.tripped,graceMs:k.graceMs});(0,q.clearAbort)(a.id);let Q=O||P?void 0:M.spawnError;for(let b of(O&&p.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${k.timeoutMs}ms`}}),P&&p.publish(a.id,{type:"error",payload:{stderr:`session aborted: per-job cost limit of $${k.costCapUsd} reached`}}),E.flush()))p.publish(a.id,{type:b.type,payload:z(b,J())});let R=E.costUsd>0?E.costUsd:B.estimateCost(D,E.totalInputTokens,E.totalOutputTokens,E.totalCacheCreationInputTokens,E.totalCacheReadInputTokens);return k.sideSession?l.update(i.jobs).set({totalInputTokens:(0,e.ll)`coalesce(${i.jobs.totalInputTokens}, 0) + ${E.totalInputTokens}`,totalOutputTokens:(0,e.ll)`coalesce(${i.jobs.totalOutputTokens}, 0) + ${E.totalOutputTokens}`,costUsd:(0,e.ll)`coalesce(${i.jobs.costUsd}, 0) + ${R}`}).where((0,d.eq)(i.jobs.id,a.id)).run():l.update(i.jobs).set({sessionId:E.sessionId,totalInputTokens:E.totalInputTokens,totalOutputTokens:E.totalOutputTokens,costUsd:R}).where((0,d.eq)(i.jobs.id,a.id)).run(),u(B,E,l),{exitCode:N,sessionId:E.sessionId,costUsd:R,inputTokens:E.totalInputTokens,outputTokens:E.totalOutputTokens,timedOut:O,costExceeded:P,maxTurnsReached:r(E,{timedOut:O,costExceeded:P}),spawnError:Q,limit:t(B,E,L,{exitCode:N,timedOut:O,costExceeded:P})}}async function B(a,b,e,f,n={}){let o=n.db??(0,h.Lf)(),p=n.runner??j.g,x=n.broker??(0,m.k)(),A=n.provider??(0,g.X$)(a.agent),C=n.resumePrompt??(0,l.Xm)((0,l.yx)(a.repoId,k._.ciFix,o),{CI_LOG:e});if("http"===A.kind){let{runOpenRouterJobSession:b}=await c.e(908).then(c.bind(c,17908));return b(a,C,f,{db:o,broker:n.broker,timeoutMs:n.timeoutMs,costCapUsd:n.costCapUsd,sideSession:n.sideSession,additive:!0,maxTurns:n.resumeMaxTurns??A.resumeMaxTurns,fetchImpl:n.fetchImpl,toolExecutor:n.toolExecutor})}let D=n.command??A.defaultCommand,E=n.resumeModel??A.resumeModel,F=n.resumeMaxTurns??A.resumeMaxTurns,G=A.createParser();G.onParseError=b=>x.publish(a.id,{type:"parse_error",payload:b});let H=s(A,a,x,o);if(H)return{...H,sessionId:b};let I=y(o,a.id),J=()=>{let a=G.costUsd>0?G.costUsd:A.estimateCost(E,G.totalInputTokens,G.totalOutputTokens,G.totalCacheCreationInputTokens,G.totalCacheReadInputTokens);return I.costUsd+a},K=n.costCapUsd&&n.costCapUsd>0?v(n.costCapUsd,J):void 0,L=()=>({costUsd:J(),inputTokens:I.inputTokens+G.totalInputTokens,outputTokens:I.outputTokens+G.totalOutputTokens}),M=(A.supportsResume?A.buildResumeArgs({prompt:C,sessionId:b,model:E,maxTurns:F,bypassPermissions:n.bypassPermissions}):null)??A.buildStartArgs({prompt:C,model:E,maxTurns:F,bypassPermissions:n.bypassPermissions}),N="",O=p(D,M,f,{onStdout:b=>{for(let c of G.push(b))x.publish(a.id,{type:c.type,payload:z(c,L())});K?.observe()},onStderr:b=>{N=(N+b).slice(-16384),x.publish(a.id,{type:"error",payload:{stderr:b}})}});(0,q.registerAbort)(a.id,O.abort);let{exitCode:P,timedOut:Q,costExceeded:R}=await w(O,{timeoutMs:n.timeoutMs,costTripped:K?.tripped,graceMs:n.graceMs});(0,q.clearAbort)(a.id);let S=Q||R?void 0:O.spawnError;for(let b of(Q&&x.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${n.timeoutMs}ms`}}),R&&x.publish(a.id,{type:"error",payload:{stderr:`session aborted: per-job cost limit of $${n.costCapUsd} reached`}}),G.flush()))x.publish(a.id,{type:b.type,payload:z(b,L())});let T=G.costUsd>0?G.costUsd:A.estimateCost(E,G.totalInputTokens,G.totalOutputTokens,G.totalCacheCreationInputTokens,G.totalCacheReadInputTokens),U=o.select().from(i.jobs).where((0,d.eq)(i.jobs.id,a.id)).get();return o.update(i.jobs).set({sessionId:G.sessionId??b,totalInputTokens:(U?.totalInputTokens??0)+G.totalInputTokens,totalOutputTokens:(U?.totalOutputTokens??0)+G.totalOutputTokens,costUsd:(U?.costUsd??0)+T}).where((0,d.eq)(i.jobs.id,a.id)).run(),u(A,G,o),{exitCode:P,sessionId:G.sessionId??b,costUsd:T,inputTokens:G.totalInputTokens,outputTokens:G.totalOutputTokens,timedOut:Q,costExceeded:R,maxTurnsReached:r(G,{timedOut:Q,costExceeded:R}),spawnError:S,limit:t(A,G,N,{exitCode:P,timedOut:Q,costExceeded:R})}}},35494:(a,b,c)=>{c.d(b,{$J:()=>n,DS:()=>t,Hb:()=>s,IZ:()=>i,JY:()=>m,Pn:()=>k,_1:()=>x,f1:()=>v,i2:()=>l,jQ:()=>j});var d=c(73024),e=c(76760),f=c(1065);let g=!1,h=new Set;function i(a){g=a}function j(){return g}function k(a){h.add(a)}function l(a){h.delete(a)}function m(){return h.size}function n(a=3e4,b=100){let c=Date.now()+a;return new Promise(a=>{let d=()=>{if(0===h.size||Date.now()>=c)return a();setTimeout(d,b)};d()})}function o(){return(0,e.join)((0,f.TG)(),"instance.lock")}function p(a){try{return process.kill(a,0),!0}catch{return!1}}function q(a){try{var b;let c,e,f,g;return b=(0,d.readFileSync)(a,"utf8"),e=(c=JSON.parse(b)).pid,f="number"==typeof e&&Number.isInteger(e)&&e>0?e:null,g=c.ts,{pid:f,ts:"number"==typeof g&&Number.isFinite(g)?g:null}}catch{return{pid:null,ts:null}}}function r(a){let b=(0,d.openSync)(a,"wx");try{(0,d.writeSync)(b,JSON.stringify({pid:process.pid,ts:Date.now()}))}finally{(0,d.closeSync)(b)}}function s(){let{pid:a,ts:b}=q(o()),c=null!==b&&Date.now()-b<=9e4,d=null!==a&&c&&p(a);return{held:d,pid:a,self:d&&a===process.pid}}function t(){let a=o();(0,d.mkdirSync)((0,e.dirname)(a),{recursive:!0});try{return r(a),!0}catch{}if(!function(a,b){let{pid:c,ts:d}=a;return!(null!==c&&c!==process.pid&&p(c))||null===d||b-d>9e4}(q(a),Date.now()))return!1;try{return(0,d.unlinkSync)(a),r(a),!0}catch{return!1}}let u=null;function v(a=3e4){w(),u=setInterval(()=>{!function(){let a=o();if(q(a).pid!==process.pid)return!1;let b=`${a}.${process.pid}.tmp`;try{if((0,d.writeFileSync)(b,JSON.stringify({pid:process.pid,ts:Date.now()})),q(a).pid!==process.pid)return(0,d.unlinkSync)(b),!1;return(0,d.renameSync)(b,a),!0}catch{try{(0,d.unlinkSync)(b)}catch{}return!1}}()&&w()},a),u.unref?.()}function w(){u&&(clearInterval(u),u=null)}function x(){w();let a=o();if(q(a).pid===process.pid)try{(0,d.unlinkSync)(a)}catch{}}},41947:(a,b,c)=>{c.d(b,{m:()=>e});var d=c(74644);function e(a,b){if("http"===a.kind)return a.id;let c=(0,d.mt)(b);return"codex"===a.id?c.codexPath:c.claudePath}},44769:(a,b,c)=>{c.d(b,{t:()=>d});function d(a){let b=process.env.DRYDOCK_OPENROUTER_API_KEY?.trim();return b||a.openrouterApiKey}},48036:(a,b,c)=>{c.d(b,{Pe:()=>g,dj:()=>h});var d=c(97496),e=c(2025),f=c(64537);function g(a,b=(0,e.Lf)(),c){let h=[];return a&&h.push((0,d.eq)(f.adrs.status,a)),void 0!==c&&h.push((0,d.eq)(f.adrs.repoId,c)),(h.length?b.select().from(f.adrs).where((0,d.Uo)(...h)).all():b.select().from(f.adrs).all()).sort((a,b)=>b.createdAt-a.createdAt)}function h(a=(0,e.Lf)()){return a.select().from(f.adrs).where((0,d.eq)(f.adrs.status,"pending_review")).all().length}},48733:(a,b,c)=>{let d;c.d(b,{k:()=>k});var e=c(97496),f=c(14694),g=c(2025),h=c(64537),i=c(14543);class j{constructor(a=(0,g.Lf)()){this.db=a,this.subs=new Map}subscribe(a,b){let c=this.subs.get(a);c||(c=new Set,this.subs.set(a,c)),c.add(b)}unsubscribe(a,b){let c=this.subs.get(a);c&&(c.delete(b),0===c.size&&this.subs.delete(a))}subscriberCount(a){return this.subs.get(a)?.size??0}publish(a,b){let c,d=(0,i.f)(JSON.stringify(b.payload??{}));try{c=JSON.parse(d)}catch{c={error:"unparseable event payload"}}let e=this.db.insert(h.jobEvents).values({jobId:a,type:b.type,payload:d}).returning().get(),f=this.subs.get(a);if(f)for(let b of[...f])try{b.send({id:e.id,type:e.type,payload:c})}catch{this.unsubscribe(a,b)}return e}replay(a,b=200,c){return void 0!==c?this.db.select().from(h.jobEvents).where((0,e.Uo)((0,e.eq)(h.jobEvents.jobId,a),(0,e.gt)(h.jobEvents.id,c))).orderBy(h.jobEvents.ts,h.jobEvents.id).limit(b).all():this.db.select().from(h.jobEvents).where((0,e.eq)(h.jobEvents.jobId,a)).orderBy((0,f.i)(h.jobEvents.ts),(0,f.i)(h.jobEvents.id)).limit(b).all().reverse()}}function k(){return d||(d=new j),d}},52484:(a,b,c)=>{c.d(b,{dC:()=>f,rN:()=>e});let d=new Set;function e(a){return b=>new Promise(c=>{let e={repoId:a.repoId,prNumber:a.prNumber,wake:b=>{d.delete(e),clearTimeout(f);try{a.onNudge?.(b)}catch{}c()}},f=setTimeout(()=>{d.delete(e),c()},b);f.unref?.(),d.add(e)})}function f(a,b,c){let e=[...d].filter(c=>c.repoId===a&&(0===b.length||b.includes(c.prNumber)));for(let a of e)a.wake(c);return e.length}},52819:(a,b,c)=>{c.d(b,{CZ:()=>j,PH:()=>f,RQ:()=>h,mW:()=>i});var d=c(2025),e=c(76373);async function f(a,b,c=(0,d.Lf)(),g=e.QD){a?b.active||(b.active=!0,await (0,e.JD)("cost_limit","\uD83D\uDCB8 Daily cost limit reached — new jobs are paused until the budget resets.",c,g)):b.active=!1}let g={claude:{event:"claude_limit",blocked:"⏳ Claude usage limit reached — Claude jobs are parked until the quota resets.",cleared:"▶️ Claude quota available again — parked jobs are resuming."},codex:{event:"codex_limit",blocked:"⏳ Codex usage limit reached — Codex jobs are parked until the quota resets.",cleared:"▶️ Codex capacity available again — parked jobs are resuming."},openrouter:{event:"openrouter_limit",blocked:"⏳ OpenRouter limit reached — OpenRouter jobs are parked until the window resets.",cleared:"▶️ OpenRouter available again — parked jobs are resuming."}};async function h(a,b,c,f=(0,d.Lf)(),i=e.QD){let j=g[a];if(b){if(c.active)return;c.active=!0,await (0,e.JD)(j.event,j.blocked,f,i)}else{if(!c.active)return;c.active=!1,await (0,e.JD)(j.event,j.cleared,f,i)}}async function i(a,b,c=(0,d.Lf)(),f=e.QD){if(a.length>0){if(b.active)return;b.active=!0;let d=a.map(a=>`${a.label}: ${a.message}`).join("; ");await (0,e.JD)("auth_expired",`🔑 Credential check failed — new jobs are paused until auth is restored. ${d}`,c,f)}else{if(!b.active)return;b.active=!1,await (0,e.JD)("auth_expired","\uD83D\uDD11 Credentials restored — the queue is resuming.",c,f)}}async function j(a=(0,d.Lf)(),b=e.QD){await (0,e.JD)("automation_paused","\uD83C\uDF19 Automation draining — finishing in-flight jobs, then shutting down.",a,b)}},59144:(a,b,c)=>{c.d(b,{MQ:()=>h,kf:()=>e,mU:()=>f,rr:()=>g});let d=/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/;function e(a){let b=d.exec(a.trim());return b?{major:Number(b[1]),minor:Number(b[2]),patch:Number(b[3]),prerelease:b[4]??null}:null}function f(a,b){var c,d;let f=e(a),g=e(b);if(!f||!g)throw Error(`cannot compare versions: "${a}" vs "${b}"`);return f.major!==g.major?f.major-g.major:f.minor!==g.minor?f.minor-g.minor:f.patch!==g.patch?f.patch-g.patch:(c=f.prerelease,c===(d=g.prerelease)?0:null===c?1:null===d||c<d?-1:1)}function g(a,b){let c=e(a);if(!c)throw Error(`cannot bump unparseable version: "${a}"`);let{major:d,minor:f,patch:g}=c;return"major"===b?`${d+1}.0.0`:"minor"===b?`${d}.${f+1}.0`:`${d}.${f}.${g+1}`}function h(a,b){return!!e(a)&&!!e(b)&&f(a,b)>0}},62907:(a,b,c)=>{c.d(b,{L4:()=>F,Yr:()=>H});var d=c(20203),e=c(2025),f=c(54304),g=c(24978),h=c(1065),i=c(64417),j=c(75818),k=c(16544),l=c(41947),m=c(27630),n=c(2412),o=c(7611),p=c(97496),q=c(64537);let r=["resolved","failed","rejected","flagged"],s={pending:["queued","rejected","flagged"],queued:["in_progress","flagged","rejected"],in_progress:["resolved","failed","flagged","queued"],resolved:[],failed:[],rejected:[],flagged:[]};class t extends Error{constructor(a,b){super(`invalid feedback transition: ${a} -> ${b}`)}}function u(a){return a.toLowerCase().replace(/\[bot\]$/,"")}let v=/\b(out of scope|follow[- ]?up|separate pr|different pr|unrelated|won'?t fix|nevermind|never mind|ignore this)\b/i,w=/\b(please|change|rename|fix|add|remove|delete|use|extract|refactor|move|replace|guard|handle|update|simplify|inline|should be|consider|nit)\b/i;function x(a,b,c={},d=(0,e.Lf)()){let f=d.select().from(q.reviewFeedbackItems).where((0,p.eq)(q.reviewFeedbackItems.id,a)).get();if(!f)throw Error(`review feedback item ${a} not found`);var g=f.status;if(!s[g].includes(b))throw new t(g,b);return d.update(q.reviewFeedbackItems).set({status:b,detail:c.detail??f.detail,attempts:"in_progress"===b?f.attempts+1:f.attempts,updatedAt:Math.floor(Date.now()/1e3)}).where((0,p.eq)(q.reviewFeedbackItems.id,a)).returning().get()}let y={maxItemsPerSweep:3,maxAttemptsPerItem:2};async function z(a,b,c){var d;let e=(d=b.id,`<!-- drydock:review-feedback:${d} -->`),f=`${c}
|
|
2
|
+
|
|
3
|
+
${e}`,g=b.comments.find(a=>a.body.includes(e));g?await a.updateReviewComment(g.id,f):await a.replyToReviewThread(b.id,f)}async function A(a,b,c){let d=c.db??(0,e.Lf)(),f=c.budgets??y,g={processed:0,resolved:0,flagged:0,rejected:0,failed:0,skipped:0},h=await c.forge.listReviewThreads(b),i=0;for(let k of h){var j;if(k.isResolved){g.skipped++;continue}let h=k.comments[0];if(!h||!function(a,b,c={}){let d=a.toLowerCase();if(c.isBot||d.endsWith("[bot]")){let c=u(a);return!b.ignoredBots.some(a=>u(a)===c)&&b.trustedBots.some(a=>u(a)===c)}return!b.ignoredBots.some(a=>a.toLowerCase()===d)&&b.trustedReviewers.some(a=>a.toLowerCase()===d)}(h.author,c.gate,{isBot:h.authorIsBot})){g.skipped++;continue}let l=function(a){let b=a.trim();return v.test(b)?"out_of_scope":w.test(b)?"actionable":b.includes("?")?"question":"actionable"}(h.body),m=function(a,b=(0,e.Lf)()){let c=function(a,b,c=(0,e.Lf)()){return c.select().from(q.reviewFeedbackItems).where((0,p.Uo)((0,p.eq)(q.reviewFeedbackItems.jobId,a),(0,p.eq)(q.reviewFeedbackItems.threadId,b))).get()}(a.jobId,a.threadId,b);return c||b.insert(q.reviewFeedbackItems).values({jobId:a.jobId,prNumber:a.prNumber,threadId:a.threadId,reviewer:a.reviewer,classification:a.classification}).returning().get()}({jobId:a,prNumber:b,threadId:k.id,reviewer:h.author,classification:l},d);if(j=m.status,r.includes(j)){g.skipped++;continue}if("in_progress"===m.status&&(m=x(m.id,"queued",{},d)),"pending"===m.status)try{await c.forge.reactToReviewComment(h.id,"EYES")}catch{}if("pending"===m.status){if("question"===l){m=x(m.id,"flagged",{},d),await z(c.forge,k,"Drydock: this looks like a question rather than a change request, so it's flagged for a human reviewer."),g.flagged++,g.processed++;continue}if("out_of_scope"===l){m=x(m.id,"rejected",{},d),await z(c.forge,k,"Drydock: treating this as out of scope for this PR — please open a follow-up issue if it should be tracked."),await c.forge.resolveReviewThread(k.id),g.rejected++,g.processed++;continue}m=x(m.id,"queued",{},d)}if("queued"===m.status){let a;if(i>=f.maxItemsPerSweep)continue;if(m.attempts>=f.maxAttemptsPerItem){m=x(m.id,"flagged",{},d),await z(c.forge,k,`Drydock: could not resolve this after ${m.attempts} attempt(s); flagging for a human.`),g.flagged++,g.processed++;continue}i++,m=x(m.id,"in_progress",{},d),c.includeProgressReplies&&await z(c.forge,k,"Drydock: working on this now…");try{a=await c.applyFeedback(m,k)}catch(b){a={ok:!1,detail:b instanceof Error?b.message:String(b)}}g.processed++,a.ok?(x(m.id,"resolved",{detail:a.detail},d),await z(c.forge,k,"Drydock: applied this change and pushed a commit. ✅"),await c.forge.resolveReviewThread(k.id),g.resolved++):m.attempts>=f.maxAttemptsPerItem?(x(m.id,"failed",{detail:a.detail},d),await z(c.forge,k,`Drydock: could not apply this automatically (${a.detail??"no change produced"}); flagging for a human.`),g.failed++):x(m.id,"queued",{detail:a.detail},d)}}return g}let B=new Set(["ci_running","ci_failed","retrying","needs_human"]);function C(a){return"function"==typeof a.listReviewThreads&&"function"==typeof a.replyToReviewThread&&"function"==typeof a.updateReviewComment&&"function"==typeof a.resolveReviewThread&&"function"==typeof a.reactToReviewComment}async function D(a={}){let b=a.db??(0,e.Lf)(),c=a.processJob??I;for(let d of(0,f.uP)(b))if((null==a.repoId||d.id===a.repoId)&&(0,k.A)(d).autoReviewFeedback)try{let e=a.forgeFor?.(d)??(0,g.Ie)(d);if(!C(e))continue;for(let a of(0,n.N6)(d.id,b).filter(a=>null!=a.prNumber&&B.has(a.status)&&!(0,o.nc)(a.agent,b)))try{await c(d,a,e)}catch(b){(0,j.v)(`[review-feedback] job ${a.id} failed for ${d.name}`,b)}}catch(a){(0,j.v)(`[review-feedback] sweep failed for ${d.name}`,a)}}let E=Promise.resolve();function F(a={}){let b=E.then(()=>D(a));return E=b.catch(()=>{}),b}let G=new Map;function H(a,b=2e3){let c=G.get(a);c&&clearTimeout(c);let d=setTimeout(()=>{G.delete(a),(0,i.v)("low",()=>F({repoId:a})).catch(b=>{(0,j.v)(`[webhook] review-feedback sweep failed for repo ${a}`,b)})},b);d.unref?.(),G.set(a,d)}async function I(a,b,c){var f;if(!C(c)||null==b.prNumber)return;let g=(0,e.Lf)(),i=(0,k.A)(a),n=(0,d.X$)(b.agent),o=(0,l.m)(n,g),p=(f={repo:a,job:b,worktrees:new h.ND,runSession:(a,b,c)=>(0,m.V)(a,b,c,{db:g,provider:n,command:o,sideSession:!0}).then(a=>({exitCode:a.exitCode}))},async(a,b)=>{if(!f.job.branch)return{ok:!1,detail:"job has no branch"};let c=await f.worktrees.prepareForBranch(f.repo,f.job.branch,`${f.job.id}-${b.id}`);try{let a,d,e=await f.runSession(f.job,(a=b.comments[0],d=b.path?`${b.path}${b.line?`:${b.line}`:""}`:"this PR",[`A reviewer left this comment on ${d} of the current pull request:`,"",(a?.body??"").trim(),"\nMake only the change this comment asks for. Do not address anything else.\nWhen done, ensure the working tree builds and tests pass, then stop — the\ncommit and push are handled for you."].join("\n")),c.path);if(0!==e.exitCode)return{ok:!1,detail:"agent exited non-zero"};try{await f.worktrees.commitAndPush(c,`Address review feedback on ${b.path??"PR"}`)}catch{return{ok:!1,detail:"no change produced"}}return{ok:!0}}finally{try{await f.worktrees.remove(c,f.repo.path)}catch(a){(0,j.v)(`[review-feedback] worktree cleanup failed for job ${f.job.id}`,a)}}});await A(b.id,b.prNumber,{forge:c,db:g,gate:{trustedReviewers:i.trustedReviewers,trustedBots:i.trustedBots,ignoredBots:i.ignoredBots},includeProgressReplies:i.includeProgressReplies,applyFeedback:p})}},70793:(a,b,c)=>{c.d(b,{T9:()=>h,U9:()=>g});var d=c(26557),e=c(27544),f=c(84232);function g(a){return(0,f.ll)`count(${a||f.ll.raw("*")})`.mapWith(Number)}function h(a){return(0,f.ll)`max(${a})`.mapWith((0,e.is)(a,d.V)?a:String)}},76373:(a,b,c)=>{c.d(b,{JD:()=>h,QD:()=>j});var d=c(2025),e=c(14543),f=c(74644);let g=[{id:"telegram",isConfigured:a=>!!(a.telegramBotToken&&a.telegramChatId),send:(a,b,c)=>c.postJson(`https://api.telegram.org/bot${b.telegramBotToken}/sendMessage`,{chat_id:b.telegramChatId,text:a})},{id:"slack",isConfigured:a=>!!a.slackWebhookUrl,send:(a,b,c)=>c.postJson(b.slackWebhookUrl,{text:a})},{id:"email",isConfigured:a=>!!(a.smtpHost&&a.emailFrom&&a.emailTo),send:(a,b,c)=>c.sendMail({to:b.emailTo,from:b.emailFrom,subject:"Drydock notification",text:a},{host:b.smtpHost,port:b.smtpPort,user:b.smtpUser,pass:b.smtpPass})}];async function h(a,b,c=(0,d.Lf)(),e=j){var k,l;let m=(0,f.mt)(c);if(!m.notifyEvents.includes(a))return;let n=g.filter(a=>a.isConfigured(m));0!==n.length&&await (k=i(n,b,m,e),l=()=>console.error(`[notify] dispatch for ${a} exceeded 5000ms; continuing in background`),new Promise(a=>{let b=setTimeout(()=>{l(),a()},5e3);b.unref?.();let c=()=>{clearTimeout(b),a()};k.then(c,c)}))}async function i(a,b,c,d){for(let f of a)try{await f.send(b,c,d)}catch(a){console.error(`[notify] ${f.id} delivery failed`,(0,e.f)(String(a)))}}let j={postJson:async(a,b)=>{let c=await fetch(a,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(b),signal:AbortSignal.timeout(1e4)});if(!c.ok)throw Error(`HTTP ${c.status}`)},sendMail:async(a,b)=>{let d=(await c.e(689).then(c.t.bind(c,93689,19))).createTransport({host:b.host,port:b.port,secure:465===b.port,auth:b.user?{user:b.user,pass:b.pass}:void 0,connectionTimeout:1e4,greetingTimeout:1e4,socketTimeout:1e4});await d.sendMail(a)}}},87105:(a,b,c)=>{c.d(b,{D:()=>d});let d=async(a,b)=>{let c=await fetch(a,{method:b?.method??"GET",headers:b?.headers,body:b?.body,redirect:"manual"}),d=await c.text(),e={};return c.headers.forEach((a,b)=>{e[b.toLowerCase()]=a}),{status:c.status,ok:c.ok,body:d,headers:e}}},89405:(a,b,c)=>{let d,e;c.d(b,{Bd:()=>cl,tn:()=>cm,py:()=>cn});var f=c(97496),g=c(20203),h=c(2025),i=c(54304),j=c(64537),k=c(24978),l=c(64417),m=c(91549);let n=["blocked","wontfix","question","needs-human","needs-discussion"],o=[{label:"destructive command",re:/\brm\s+-rf\b|\bdrop\s+table\b|\bgit\s+push\s+--force\b|disable\s+auth/i},{label:"secret material",re:/\bapi[_-]?key\b|\bpassword\b|\bsecret\b|\.env\b|\bsk-[a-z0-9]/i},{label:"exfiltration",re:/\bcurl\b|\bwget\b|webhook|pastebin/i},{label:"privileged area",re:/\bauth(entication|orization)?\b|\bpayment|\bbilling\b|\bdeploy|\bsecurity\b|\bci\/cd\b/i}];function p(a){let b=[],c=a.labels.map(a=>a.toLowerCase()).find(a=>n.includes(a));if(c)return{decision:"blocked",reasons:[`blocking label: ${c}`]};let d=`${a.title}
|
|
4
|
+
${a.body??""}`;for(let{label:a,re:c}of o)c.test(d)&&b.push(`${a} detected`);return b.length>0?{decision:"needs_review",reasons:b}:{decision:"approved",reasons:[]}}var q=c(24421),r=c(75818),s=c(16544);let t=[{label:"bug",re:/\b(bug|crash|crashes|broken|error|exception|fails?|regression|defect)\b/i},{label:"enhancement",re:/\b(add|support|feature|implement|enhancement|would be nice|allow|introduce)\b/i},{label:"documentation",re:/\b(docs?|documentation|readme|typo|wording|clarify)\b/i}];function u(a,b,c,d){d.update(j.issues).set({triageHash:c,triagedAt:Math.floor(Date.now()/1e3)}).where((0,f.Uo)((0,f.eq)(j.issues.repoId,a),(0,f.eq)(j.issues.number,b))).run()}async function v(a,b,c,d=(0,h.Lf)()){let e=(0,s.A)(a),g=function(a){let b=JSON.stringify([a.title,a.labels.map(a=>a.name).sort()]),c=5381;for(let a=0;a<b.length;a++)c=(c<<5)+c+b.charCodeAt(a)|0;return(c>>>0).toString(16)}(c),i=d.select().from(j.issues).where((0,f.Uo)((0,f.eq)(j.issues.repoId,a.id),(0,f.eq)(j.issues.number,c.number))).get();if(i?.triagedAt&&i.triageHash===g)return{number:c.number,applied:[],reasons:[],skipped:"unchanged"};if(!(0,s.i)(e,c.authorAssociation))return u(a.id,c.number,g,d),{number:c.number,applied:[],reasons:["author not approved"],skipped:"author"};let k=await b.viewIssue(c.number),l=p({number:k.number,title:k.title,body:k.body,labels:k.labels}),m=[],n=function(a,b){let c=new Set(b),d=`${a.title}
|
|
5
|
+
${a.body}`,e=[];for(let{label:a,re:b}of t)c.has(a)&&b.test(d)&&!e.includes(a)&&e.push(a);return e}(k,e.autoLabelWhitelist);for(let a of n)m.push(`classified as ${a}`);if("approved"===l.decision){let a=e.readyLabels[0];a&&(n.push(a),m.push("safe and well-specified"))}else{let a=e.blockingLabels[0];a&&(n.push(a),m.push(...l.reasons.length?l.reasons:["flagged for human review"]))}let o=new Set([...e.autoLabelWhitelist,...e.readyLabels,...e.blockingLabels]),r=new Set(k.labels),w=[...new Set(n)].filter(a=>o.has(a)&&!r.has(a));if(w.length>0){for(let a of w)await b.ensureLabel(a);await b.addLabels(c.number,w);let e=w.map(a=>`\`${a}\``).join(", ");await b.commentIssue(c.number,`auto-triage: applied ${e} — reasons: ${m.join("; ")}.`),(0,q.sp)(a.id,c.number,w,[],d)}return u(a.id,c.number,g,d),{number:c.number,applied:w,reasons:m}}async function w(a,b,c,d=(0,h.Lf)()){let e=[];for(let f of c)try{e.push(await v(a,b,f,d))}catch(b){(0,r.v)(`[triage] issue #${f.number} failed for ${a.name}`,b)}return e}var x=c(52819),y=c(74340),z=c(44769),A=c(74644),B=c(41947),C=c(2412);let D={color:"d73a4a",description:"Drydock parked this issue; needs a human"};function E(a){return`<!-- drydock:needs-human:${a} -->`}async function F(a,b,c,d=(0,h.Lf)()){try{await c.ensureLabel(a.needsHumanLabel,D)}catch(a){(0,r.v)(`[needs-human] failed to ensure needs-human label on #${b}`,a)}try{await c.addLabels(b,[a.needsHumanLabel])}catch(a){(0,r.v)(`[needs-human] failed to add needs-human label on #${b}`,a)}try{await c.removeLabels(b,[a.queueLabel]),(0,q.nc)(a.id,b,a.queueLabel,!1,d)}catch(a){(0,r.v)(`[needs-human] failed to drop queue label on #${b}`,a)}}async function G(a,b,c,d){let e,f=E(c),g=(e=d.trim()||"review required",[E(c),`⚠️ **Drydock needs a human.** Job \`#${c}\` was parked and removed from the queue.`,"",`**Reason:** ${e}`,"\nFind it under **Needs human** in your Drydock dashboard, then requeue it once the blocker is cleared."].join("\n"));if(a.listIssueComments&&a.updateIssueComment)try{let c=(await a.listIssueComments(b)).find(a=>a.body.includes(f));if(c)return void await a.updateIssueComment(b,c.id,g)}catch(a){(0,r.v)(`[needs-human] comment upsert degraded to a fresh post on #${b}`,a)}await a.commentIssue(b,g)}async function H(a,b={}){let c=b.db??(0,h.Lf)(),d=(0,i.L8)(a.repoId,c);if(!d)return void(0,r.v)(`[needs-human] repo ${a.repoId} not found for job ${a.id}; skipping announce`);let e=b.forge??(0,k.Ie)(d);await F(d,a.issueNumber,e,c);try{await G(e,a.issueNumber,a.id,a.errorMessage??"")}catch(b){(0,r.v)(`[needs-human] failed to comment on #${a.issueNumber}`,b)}}var I=c(52479);let J="janitor",K=new Set(["ci_running","ci_failed","retrying"]);function L(a){return a?.startsWith("drydock/")??!1}async function M(a,b,c,d){if("function"!=typeof c.deleteBranch)return;let e=function(a,b){let c=b.select({jobId:j.jobEvents.jobId,payload:j.jobEvents.payload}).from(j.jobEvents).innerJoin(j.jobs,(0,f.eq)(j.jobEvents.jobId,j.jobs.id)).where((0,f.Uo)((0,f.eq)(j.jobEvents.type,J),(0,f.eq)(j.jobs.repoId,a))).all(),d=new Set;for(let a of c)try{"branch_deleted"===JSON.parse(a.payload??"{}").action&&d.add(a.jobId)}catch{}return d}(a,d),g=new Set(b.filter(a=>!["merged","released","aborted"].includes(a.status)).map(a=>a.branch).filter(L));for(let a of b.filter(a=>"merged"===a.status&&null!==a.prNumber&&L(a.branch)&&!e.has(a.id)&&!g.has(a.branch))){let b=a.branch;try{await c.deleteBranch(b),(0,C.yM)(a.id,J,{action:"branch_deleted",branch:b},d)}catch(c){(0,r.v)(`[janitor] branch delete failed for job ${a.id} (${b})`,c)}}}async function N(a,b,c,d){if("function"==typeof c.prMergeState)for(let e of b.filter(a=>K.has(a.status)&&null!==a.prNumber&&L(a.branch))){let b=e.prNumber;try{let f=await c.prMergeState(b);"behind"===f&&"function"==typeof c.updatePrBranch?(await c.updatePrBranch(b),(0,C.yM)(e.id,J,{action:"branch_updated",prNumber:b},d)):"conflicted"===f&&await O(a,e,b,c,d)}catch(a){(0,r.v)(`[janitor] PR refresh failed for job ${e.id} (PR #${b})`,a)}}}async function O(a,b,c,d,e){let f=`rebase needed: conflicts with ${a.defaultBranch}`;try{await d.commentIssue(b.issueNumber,`⚠️ PR #${c} conflicts with \`${a.defaultBranch}\` — a rebase is needed. Parking job #${b.id} for a human.`)}catch(a){(0,r.v)(`[janitor] conflict comment failed for job ${b.id}`,a)}try{let g=(0,C.ax)(b.id,e);if(!g||!K.has(g.status))return;(0,C.yM)(b.id,"status",{reason:"merge_conflict",prNumber:c},e),(0,C.dk)(b.id,"needs_human",{errorMessage:f},e),await F(a,b.issueNumber,d,e)}catch(a){if(!(a instanceof I.xh))throw a}}async function P(a={}){let b=a.db??(0,h.Lf)();for(let c of(0,i.uP)(b))try{let d=a.forgeFor?.(c)??(0,k.Ie)(c),e=(0,C.N6)(c.id,b);await M(c.id,e,d,b),await N(c,e,d,b)}catch(a){(0,r.v)(`[janitor] sweep failed for ${c.name}`,a)}}var Q=c(61408),R=c(77597);async function S(a,b={}){let c=b.command??a.defaultCommand,d=b.runner??R.Sx;try{let{stdout:b,exitCode:e}=await d(c,["--version"]);if(0===e)return{agent:a.id,installed:!0,version:b.trim()};return{agent:a.id,installed:!1,message:`${a.label} CLI '${c}' exited ${e} on --version. Check the installation or the CLI path in settings.`}}catch{return{agent:a.id,installed:!1,message:`${a.label} CLI '${c}' not found. Install it or set the correct CLI path in settings.`}}}var T=c(87105),U=c(25480),V=c(14543),W=c(93612);let X={kind:"ok"},Y={kind:"unknown"};function Z(a,b,c){return{kind:"failed",failure:{target:a,label:b,message:c}}}function $(a){return(0,V.f)(a.trim()).slice(0,200)}async function _(a){let b=a.db??(0,h.Lf)(),c={runner:a.runner??R.Sx,http:a.http??T.D,fetchImpl:a.fetchImpl??fetch,governor:a.governor??m.og,now:a.now??Date.now,probeTimeoutMs:a.probeTimeoutMs??3e4},d=(0,A.mt)(b),e=function(a,b,c,d){let e=[];a.some(a=>"gitlab"!==a.platform)&&e.push({id:"github",probe:async()=>{if(!d.governor.decide("core","low").allowed)return Y;try{let a=await d.runner(b.ghPath,["auth","status"],void 0,{timeoutMs:d.probeTimeoutMs});if(0===a.exitCode)return X;let c=$(a.stderr||a.stdout);return Z("github","GitHub CLI auth",`\`${b.ghPath} auth status\` exited ${a.exitCode}${c?`: ${c}`:""}. Re-authenticate with \`gh auth login\`.`)}catch(a){if(a instanceof Error&&/timed out/i.test(a.message))return Y;return Z("github","GitHub CLI auth",`GitHub CLI '${b.ghPath}' could not be probed: ${$(String(a))}`)}}});let f=new Map;for(let b of a){if("gitlab"!==b.platform||!b.apiBaseUrl||!b.apiToken)continue;let a=b.apiBaseUrl.trim().replace(/\/+$/,"");!a||f.has(a)||f.set(a,b.apiToken)}for(let[a,b]of f)e.push(function(a,b,c){let d=`gitlab:${a}`,e=a;try{e=new URL(a).host}catch{}let f=`GitLab (${e})`;return{id:d,probe:async()=>{let g=`${a}/api/v4/user`;try{(0,U.sM)(g,{allowPrivate:(0,U.gT)()})}catch(a){return(0,r.v)(`[watchdog] gitlab probe skipped for ${e}`,a),Y}try{var h,i;let a=await (h=c.http(g,{headers:{"PRIVATE-TOKEN":b}}),i=c.probeTimeoutMs,new Promise((a,b)=>{let c=setTimeout(()=>b(Error(`probe timed out after ${i}ms`)),i);c.unref?.(),h.then(b=>{clearTimeout(c),a(b)},a=>{clearTimeout(c),b(a)})}));if(401===a.status||403===a.status)return Z(d,f,`GitLab rejected the access token (HTTP ${a.status}). Update the token in the repo's forge settings.`);if(a.ok)return X;return Y}catch{return Y}}}}(a,b,d));let h=new Set;for(let b of a)(0,g.TU)(b.agent)&&h.add(b.agent);for(let a of h)e.push(function(a,b,c,d){let e=`agent:${a}`,f=(0,g.X$)(a);return"openrouter"===a?{id:e,probe:async()=>{let a=(0,z.t)(b);if(!a)return Z(e,"OpenRouter API key","No OpenRouter API key is configured — set it in settings or via DRYDOCK_OPENROUTER_API_KEY.");let c=await (0,W.lw)(a,d.fetchImpl);return c.ok?X:/HTTP 40[13]\b/.test(c.error)?Z(e,"OpenRouter API key",`OpenRouter rejected the API key (${$(c.error)}). Update the key in settings.`):Y}}:{id:e,probe:async()=>{let a=await S(f,{command:(0,B.m)(f,c),runner:(a,b,c,e)=>d.runner(a,b,c,{timeoutMs:d.probeTimeoutMs,...e})});return a.installed?X:Z(e,`${f.label} CLI`,a.message??"CLI probe failed.")}}}(a,b,c,d));return e}((0,i.uP)(b),d,b,c),f=(0,Q.iC)(b),j=new Map((f?.failures??[]).map(a=>[a.target,a])),k=[];for(let{id:a,outcome:b}of(await Promise.all(e.map(async a=>{try{return{id:a.id,outcome:await a.probe()}}catch(b){return(0,r.v)(`[watchdog] credential probe for ${a.id} failed`,b),{id:a.id,outcome:Y}}}))))if("failed"===b.kind)k.push(b.failure);else if("unknown"===b.kind){let b=j.get(a);b&&k.push(b)}let l={checkedAt:Math.floor(c.now()/1e3),failures:k};return(0,Q.z8)(l,b),l}let aa=!1;async function ab(a={}){if(!aa){aa=!0,d=(a.now??Date.now)();try{return await _(a)}finally{aa=!1}}}var ac=c(1065),ad=c(27630),ae=c(73024);let af=["vercel","railway"];function ag(a){return a.exists??ae.existsSync}var ah=c(76760);class ai{async detect(a){let b=ag(a);return b((0,ah.join)(a.cwd,"railway.json"))||b((0,ah.join)(a.cwd,"railway.toml"))||b((0,ah.join)(a.cwd,".railway"))}async getStatus(a){let b=await a.run("railway",["status"],a.cwd);return function(a,b){if(0!==b)return"not_found";let c=a.toLowerCase();return/\bfailed\b|\bcrashed\b|\berror\b/.test(c)?"error":/\bsuccess\b|\bdeployed\b|\bready\b/.test(c)?"ready":/\bbuilding\b/.test(c)?"building":/\bdeploying\b|\binitializing\b|\bqueued\b/.test(c)?"deploying":"not_found"}(b.stdout,b.exitCode)}async getLogs(a){let b=await a.run("railway",["logs"],a.cwd);return[b.stdout,b.stderr].filter(Boolean).join("\n").trim()}constructor(){this.id="railway",this.label="Railway"}}function aj(a){return a?["list","--meta",`githubCommitSha=${a}`]:["list"]}class ak{async detect(a){let b=ag(a);return b((0,ah.join)(a.cwd,"vercel.json"))||b((0,ah.join)(a.cwd,".vercel"))}async getStatus(a){let b=await a.run("vercel",aj(a.ref),a.cwd);return function(a,b){if(0!==b)return"not_found";let c=a.split("\n").map(a=>a.trim()).filter(Boolean).find(a=>/●|ready|error|building|queued|initializing/i.test(a.replace(/https?:\/\/\S+/g," ")));if(!c)return"not_found";let d=c.replace(/https?:\/\/\S+/g," ").toLowerCase();return/\berror\b|\bfailed\b|canceled/.test(d)?"error":/\bready\b/.test(d)?"ready":/\bbuilding\b/.test(d)?"building":/\bqueued\b|initializing|deploying/.test(d)?"deploying":"not_found"}(b.stdout,b.exitCode)}async getLogs(a){let b=null;if(a.ref){var c;let d=await a.run("vercel",aj(a.ref),a.cwd);0===d.exitCode&&(c=d.stdout,b=c.match(/https?:\/\/\S+/)?.[0]??null)}let d=b?["inspect","--logs",b]:["logs"],e=await a.run("vercel",d,a.cwd);return[e.stdout,e.stderr].filter(Boolean).join("\n").trim()}constructor(){this.id="vercel",this.label="Vercel"}}let al=[new ak,new ai];async function am(a,b){if(b)return af.includes(b)?function(a){let b=al.find(b=>b.id===a);if(!b)throw Error(`unsupported deployment platform: ${a}`);return b}(b):null;for(let b of al)if(await b.detect(a))return b;return null}var an=c(64080);function ao(a,b){return{cwd:a.path,ref:b,run:R.Sx}}async function ap(a={}){let b=a.db??(0,h.Lf)(),c=a.now??Date.now,d=a.budgets??an.ad;for(let e of(0,i.uP)(b))if((0,s.A)(e).autoHealDeployments)try{let f=a.forgeFor?.(e)??(0,k.Ie)(e),g=a.adapterFor??(a=>am(ao(a,null),a.deploymentPlatform)),h=await g(e);if(!h)continue;let i=a.openFixPr??as;await aq(e,f,h,{db:b,now:c,budgets:d,openFixPr:i})}catch(a){(0,r.v)(`[deploy-heal] sweep failed for ${e.name}`,a)}}async function aq(a,b,c,d){let{db:e,now:f,budgets:g}=d,h=(0,C.N6)(a.id,e);for(let a of h){let d;if("merged"!==a.status||null==a.prNumber)continue;let h=(a.finishedAt??a.createdAt)*1e3;if(!(f()-h>g.monitorWindowMs)){try{d=await b.prMergeCommitSha?.(a.prNumber)??await b.prHeadSha(a.prNumber)}catch(b){(0,r.v)(`[deploy-heal] merged sha lookup failed for job ${a.id}`,b);continue}(0,an.SR)(a.id,d,e)||(0,an.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 ar(a,e,c,b,d)}catch(c){(0,r.v)(`[deploy-heal] session ${b.id} failed for ${a.name}`,c)}}}async function ar(a,b,c,d,e){let{db:f,now:g,budgets:h}=e,i=(0,an.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,an.X)(d.id,"escalated",{},f);let j=ao(a,d.commitSha),k=(0,an.eV)(await c.getStatus(j));if("ready"===k)return void(0,an.X)(d.id,"healthy",{},f);if("pending"===k)return void(0,an.LR)(d.id,f);let l=(await c.getLogs(j).catch(()=>"")).split("\n").slice(-h.maxLogLines).join("\n").trim(),m=(0,an.X)(d.id,"failed",{logsExcerpt:l||null},f);(0,an.X)(d.id,"repairing",{},f);try{let c=await e.openFixPr(a,b,m,l);(0,an.X)(d.id,"repaired",{followupPrNumber:c},f)}catch(a){(0,r.v)(`[deploy-heal] fix PR failed for session ${d.id}`,a),(0,an.X)(d.id,"escalated",{},f)}}async function as(a,b,c,d){let e=(0,h.Lf)(),f=(0,g.X$)(b.agent),i=(0,B.m)(f,e),j=new ac.ND,l=c.commitSha.slice(0,7),m=`drydock/deploy-fix-${b.id}-${l}`,n=(0,k.Ie)(a),o=await j.prepareForNewBranch(a,m,`${b.id}-${l}`);try{let g=await (0,ad.V)(b,[`The deployment of the merged pull request #${c.prNumber} failed on`,`${c.platform} (commit ${c.commitSha.slice(0,7)}).`,"\nDeployment logs:\n```",d||"(no logs captured)","```\n\nDiagnose the deployment failure and make the minimal change that fixes it.\nEnsure the project builds and tests pass, then stop — the commit, push, and\npull request are handled for you."].join("\n"),o.path,{db:e,provider:f,command:i,sideSession:!0});if(0!==g.exitCode)throw Error(`${f.label} exited non-zero`);return await j.commitAndPush(o,`Fix failed ${c.platform} deployment for PR #${c.prNumber}`),n.createPr({head:m,base:a.defaultBranch,title:`Fix failed ${c.platform} deployment (PR #${c.prNumber})`,body:`The deployment for #${c.prNumber} (commit ${l}) failed. This PR addresses the deployment failure.`})}finally{try{await j.remove(o,a.path)}catch(a){(0,r.v)(`[deploy-heal] worktree cleanup failed for job ${b.id}`,a)}}}var at=c(7611),au=c(9617),av=c(76373),aw=c(8804),ax=c(51455),ay=c(48161),az=c(29980),aA=c(59144);let aB=az.Ik({release:az.zM(),bump:az.k5(["patch","minor","major"]),title:az.Yj().default(""),notes:az.Yj().default("")});var aC=c(98887);async function aD(a){if("http"===a.provider.kind){let{runOpenRouterOneShot:b}=await c.e(528).then(c.bind(c,59528));return b({model:a.model,prompt:a.prompt,repoId:a.repoId,type:a.type,timeoutMs:a.timeoutMs,db:a.db,fetchImpl:a.fetchImpl})}let b=a.runner??R.Sx,d=a.db??(0,h.Lf)(),e=void 0!==a.timeoutMs?{timeoutMs:a.timeoutMs}:void 0,f=a.provider.buildStreamOneShotArgs({prompt:a.prompt,model:a.model});if(null===f){let c=a.provider.buildOneShotArgs({prompt:a.prompt,model:a.model}),d=e?await b(a.command,c,a.cwd,e):await b(a.command,c,a.cwd);return{text:d.stdout,exitCode:d.exitCode,costUsd:0,stderr:d.stderr}}let g=e?await b(a.command,f,a.cwd,e):await b(a.command,f,a.cwd),i=new aC.KO,k=[...i.push(g.stdout),...i.flush()],l=[];for(let a of k)for(let b of a.chunks)"text"===b.kind&&l.push(b.text);let m=l.join(""),n=i.costUsd>0?i.costUsd:0;return n>0&&void 0!==a.repoId&&d.insert(j.oneShotCosts).values({repoId:a.repoId,type:a.type,costUsd:n,inputTokens:i.totalInputTokens,outputTokens:i.totalOutputTokens}).run(),{text:m,exitCode:g.exitCode,costUsd:n,stderr:g.stderr}}async function aE(a){var b;let c,d=await a.listReleases(),e=function(a){let b=null;for(let c of a)(0,aA.kf)(c)&&(null===b||(0,aA.mU)(c,b)>0)&&(b=c);return b}(d.map(a=>a.tagName)),f=e?d.find(a=>a.tagName===e)?.createdAt??null:null;return{fromTag:e,releases:d,prs:(b=(await a.listMergedPrs(100)).map(a=>({number:a.number,title:a.title,labels:a.labels,mergedAt:a.mergedAt})),c=null===f?null:Date.parse(f),b.filter(a=>{let b=Date.parse(a.mergedAt);return!Number.isNaN(b)&&(null===c||b>c)}).sort((a,b)=>a.number-b.number))}}async function aF(a,b){let c=b.db??(0,h.Lf)(),d=(0,aw.tm)(a,c);if(!d)throw Error(`release run ${a} not found`);let e=d.mode;(0,aw.Cq)(a,"evaluating",{},c);try{var f;let{fromTag:g,releases:h,prs:i}=await aE(b.forge);if("manual"===e&&0===i.length&&!d.tag)return(0,aw.Cq)(a,"skipped",{fromTag:g},c);let j=await b.generate({fromTag:g,prs:i});if("auto"===e&&!j)return(0,aw.Cq)(a,"error",{errorMessage:"release evaluation failed"},c);if("auto"===e&&j&&!j.release)return(0,aw.Cq)(a,"skipped",{fromTag:g},c);let k=function(a,b,c){let d="manual"===a?"patch":b?.bump??"patch",e=b?.title?.trim()??"";return{bump:d,title:e,notes:b?.notes?.trim()||(0===c.length?"No changes since the last release.":c.map(a=>`- #${a.number} ${a.title}`).join("\n"))}}(e,j,i),l=d.tag??(f=k.bump,`v${(0,aA.rr)(g??"0.0.0",f)}`);if((0,aw.Cq)(a,"proposed",{bump:k.bump,fromTag:g,tag:l,title:k.title||l,notes:k.notes,prNumbers:i.map(a=>a.number)},c),h.some(a=>a.tagName===l))return(0,aw.Cq)(a,"publishing",{},c),(0,aw.Cq)(a,"published",{},c);return(0,aw.Cq)(a,"publishing",{},c),await b.forge.createRelease({tag:l,title:k.title||l,notes:k.notes,target:b.repo.defaultBranch}),(0,aw.Cq)(a,"published",{},c)}catch(f){let b=f instanceof Error?f.message:String(f),d=(0,aw.tm)(a,c),e=d?.status??"evaluating";if("evaluating"===e||"proposed"===e||"publishing"===e)return(0,aw.Cq)(a,"error",{errorMessage:b.slice(0,500)},c);return(0,aw.tm)(a,c)}}async function aG(a,b){let c=await (0,ax.mkdtemp)((0,ah.join)((0,ay.tmpdir)(),"drydock-release-"));try{var d;let e,f=(e=(d={provider:a.provider,command:a.command,model:a.model,cwd:c,runner:a.runner}).timeoutMs??18e4,async a=>{try{let b,c,f,{text:g,exitCode:h}=await aD({provider:d.provider,command:d.command,model:d.model,cwd:d.cwd,prompt:(c=(b=a.prs.slice(0,200)).length>0?b.map(a=>{let b=a.labels.length>0?` [${a.labels.join(", ")}]`:"";return`- #${a.number} ${a.title}${b}`}).join("\n"):"(no merged pull requests)",["You are deciding whether to cut a new software release. Given the most\nrecent release and the pull requests merged since then, decide whether a\nrelease is warranted, which semantic-version bump it should be, and write\nconcise Markdown release notes.\n",a.fromTag?`The most recent release is ${a.fromTag}.`:"There is no prior release (this would be the first).","\n## Pull requests merged since the last release\n",c,'\n## How to choose the bump\n\n- "major": incompatible / breaking changes.\n- "minor": new, backwards-compatible features.\n- "patch": backwards-compatible bug fixes or internal-only changes.\n\n## Response format\n\nRespond with ONLY a JSON object (no prose, no code fences) of the shape:\n\n{"release": <true|false>, "bump": "patch"|"minor"|"major",\n "title": "<short release title>", "notes": "<Markdown release notes>"}\n\nSet "release" to false when the changes do not warrant a release yet (e.g.\nonly docs/CI tweaks). When false, the other fields are ignored.'].join("\n")),repoId:d.repoId,type:"release",timeoutMs:e,runner:d.runner,db:d.db});if(0!==h)return null;let i=g.match(/\{[\s\S]*\}/);if(!i)return null;try{f=JSON.parse(i[0])}catch{return null}let j=aB.safeParse(f);return j.success?j.data:null}catch{return null}});return await b(f)}finally{try{await (0,ax.rm)(c,{recursive:!0,force:!0})}catch{}}}async function aH(a={}){let b=a.db??(0,h.Lf)();if(!(0,A.mt)(b).releaseManagementEnabled)return;let c=a.now??Date.now,d=a.windowMs??36e5,e=a.notify??((a,c)=>(0,av.JD)(a,c,b));for(let f of(0,i.uP)(b))if((0,s.A)(f).releaseEnabled)try{let h=a.forgeFor?.(f)??(0,k.Ie)(f),i="function"==typeof h.listReleases&&"function"==typeof h.listMergedPrs&&"function"==typeof h.createRelease?h:null;if(!i)continue;let j=a.generatorFor?.(f)??function(a,b){let c=(0,g.X$)(a.agent),d=(0,B.m)(c,b),e=a.defaultModel;return a=>aG({provider:c,command:d,model:e},b=>b(a))}(f,b);await aI(f,h,i,j,{db:b,now:c,windowMs:d,notify:e})}catch(a){(0,r.v)(`[release] sweep failed for ${f.name}`,a)}}async function aI(a,b,c,d,e){let{db:f,now:g,windowMs:h}=e;for(let i of(0,C.N6)(a.id,f)){if("merged"!==i.status||null==i.prNumber)continue;let f=(i.finishedAt??i.createdAt)*1e3;if(!(g()-f>h))try{await aJ(a,i,b,c,d,e)}catch(b){(0,r.v)(`[release] job ${i.id} failed for ${a.name}`,b)}}}async function aJ(a,b,c,d,e,f){let{db:g,notify:h}=f,i=b.prNumber,j=(0,aw.$J)(a.id,i,g);if(j&&"detected"!==j.status)return;let k=await c.prHeadSha(i),l=(0,aw.v0)({repoId:a.id,mode:"auto",triggerPrNumber:i,triggerSha:k},g);if("detected"!==l.status)return;let m=await aF(l.id,{repo:a,forge:d,db:g,generate:e});"published"===m.status&&m.tag&&await h("release_published",`🚀 Released ${a.name} ${m.tag}.`)}var aK=c(62907),aL=c(48036),aM=c(14694);let aN={pending:["in_progress","skipped","deferred"],in_progress:["done","skipped","deferred"],deferred:["pending","in_progress","skipped"],done:[],skipped:[]};class aO extends Error{constructor(a,b){super(`invalid subtask transition: ${a} -> ${b}`)}}let aP=/^\s*[-*]\s*\[[ xX]\]\s+(.+?)\s*$/,aQ=/^\s*#*\s*(Bug\s+\d+\s*(?:[—:-])\s*.+?)\s*$/;async function aR(a,b={}){let c=function(a){let b=function(a){let b=[];for(let c of a.split("\n")){let a=c.match(aP);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(aQ);a?.[1]&&b.push(a[1].trim())}return b}(a);return c.length>=2?c:[]}(a.body);if(c.length>=2)return{titles:c,source:"heuristic"};if(b.generate)try{let c=(await b.generate(a)).map(a=>a.trim()).filter(Boolean);if(c.length>=2)return{titles:c,source:"agent"}}catch(b){if(b instanceof at.vu)throw b;(0,r.v)(`[decompose] agent fallback failed for issue #${a.number}`,b)}return{titles:[],source:"none"}}function aS(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 aT(a,b,c=(0,h.Lf)()){return c.select().from(j.issueSubtasks).where((0,f.Uo)((0,f.eq)(j.issueSubtasks.repoId,a),(0,f.eq)(j.issueSubtasks.issueNumber,b))).orderBy((0,aM.Y)(j.issueSubtasks.ordinal)).all()}function aU(a,b,c=(0,h.Lf)()){let d=c.select().from(j.issueSubtasks).where((0,f.eq)(j.issueSubtasks.id,a)).get();if(!d)throw Error(`subtask ${a} not found`);var e=d.status;if(!aN[e].includes(b))throw new aO(e,b);return c.update(j.issueSubtasks).set({status:b}).where((0,f.eq)(j.issueSubtasks.id,a)).returning().get()}async function aV(a,b,c=(0,h.Lf)(),d={}){var e,g,i,k;let l=function(a){let b=5381;for(let c=0;c<a.length;c++)b=(b<<5)+b+a.charCodeAt(c)|0;return(b>>>0).toString(16)}(b.body);if(e=a.id,g=b.number,c.select({h:j.issues.decomposedHash}).from(j.issues).where((0,f.Uo)((0,f.eq)(j.issues.repoId,e),(0,f.eq)(j.issues.number,g))).get()?.h===l)return{subtasks:aT(a.id,b.number,c),source:"none",skipped:!0};let{titles:m,source:n}=await aR(b,{generate:d.generate}),o=function(a,b,c,d,e=(0,h.Lf)()){return e.transaction(e=>(e.delete(j.issueSubtasks).where((0,f.Uo)((0,f.eq)(j.issueSubtasks.repoId,a),(0,f.eq)(j.issueSubtasks.issueNumber,b))).run(),c.forEach((c,f)=>{e.insert(j.issueSubtasks).values({repoId:a,issueNumber:b,ordinal:f,title:c,bodyHash:d}).run()}),e.select().from(j.issueSubtasks).where((0,f.Uo)((0,f.eq)(j.issueSubtasks.repoId,a),(0,f.eq)(j.issueSubtasks.issueNumber,b))).orderBy((0,aM.Y)(j.issueSubtasks.ordinal)).all()))}(a.id,b.number,m,l,c);return i=a.id,k=b.number,c.update(j.issues).set({decomposedHash:l}).where((0,f.Uo)((0,f.eq)(j.issues.repoId,i),(0,f.eq)(j.issues.number,k))).run(),{subtasks:o,source:n,skipped:!1}}var aW=c(26287),aX=c(29668);function aY(a){return a?.trim()||null}async function aZ(a={}){let b=a.runner??R.Sx,c=a.preferred??"auto",d="auto"===c?["docker","podman"]:[c];for(let a of d)try{let{exitCode:c}=await b(a,["--version"]);if(0===c)return{runtime:a}}catch{}let e=d.join(" / ");return{runtime:null,message:`No usable container runtime found (tried ${e}). Install Docker or Podman, or disable sandboxed execution for this repo.`}}var a$=c(94534);function a_(a){try{return(0,ae.readFileSync)(a,"utf8")}catch{return null}}async function a0(a){var b;let c,d,e=a.deps??{},f=e.detect??(a=>aZ({preferred:a})),g=await f(a.preferredRuntime);if(null===g.runtime)return{ok:!1,reason:g.message};let h=function(a,b,c){if(a.imageOverride)return a.imageOverride;let d=function(a,b){for(let c of[(0,ah.join)(a,".devcontainer","devcontainer.json"),(0,ah.join)(a,".devcontainer.json")]){let a=b.readFileText(c);if(null!=a)try{let b=JSON.parse(a.replace(/\/\*[\s\S]*?\*\//g,"").replace(/(^|[^:])\/\/.*$/gm,"$1").replace(/,\s*([}\]])/g,"$1"));if("string"==typeof b.image&&b.image.trim())return b.image.trim()}catch{}}return null}(b,c);return d||aY(a.defaultImage)}(a.config,a.worktreePath,{readFileText:e.readFileText??a_});if(!h)return{ok:!1,reason:"Sandboxed execution is enabled but no container image could be resolved. Set a per-repo sandbox image, add a devcontainer.json, or set a global default image in settings."};let i=(c=(function(a,b){switch(a){case"codex":return[{host:(0,ah.join)(b,".codex"),container:"/root/.codex"}];case"openrouter":return[];default:return[{host:(0,ah.join)(b,".claude"),container:"/root/.claude"},{host:(0,ah.join)(b,".claude.json"),container:"/root/.claude.json"}]}})((b={agent:a.agent,home:e.home??(0,ay.homedir)(),env:e.env??process.env,exists:e.exists??ae.existsSync}).agent,b.home).filter(a=>b.exists(a.host)),d=[],b.env.GH_TOKEN?.trim()?d.push("GH_TOKEN"):b.env.GITHUB_TOKEN?.trim()&&d.push("GITHUB_TOKEN"),{mounts:c,env:d});return{ok:!0,session:{runner:function(a,b={}){let c=b.baseRunner??a$.g,d=b.cleanup??R.Sx;return(b,e,f,g)=>{let h=function(a,b,c){let d=["run","--rm","--init","--name",a.containerName,"-v",`${a.hostPath}:${a.workdir}`,"-w",a.workdir];for(let b of(a.allowNetwork||d.push("--network","none"),a.cpus&&d.push("--cpus",a.cpus),a.memory&&d.push("--memory",a.memory),a.mounts))d.push("-v",`${b.host}:${b.container}:ro`);for(let b of a.env)d.push("-e",b);return d.push(a.image,b,...c),{cmd:a.runtime,args:d}}(a,b,e),i=c(h.cmd,h.args,f,g);return{done:i.done,get spawnError(){return i.spawnError},abort:b=>{i.abort(b);try{d(a.runtime,["rm","-f",a.containerName]).catch(b=>(0,r.v)(`[sandbox] failed to remove container ${a.containerName}`,b))}catch(b){(0,r.v)(`[sandbox] failed to remove container ${a.containerName}`,b)}}}}}({runtime:g.runtime,image:h,workdir:"/workspace",hostPath:a.worktreePath,containerName:`drydock-job-${a.jobId}`,allowNetwork:a.config.allowNetwork,cpus:a.config.cpus,memory:a.config.memory,mounts:i.mounts,env:i.env},{baseRunner:e.baseRunner,cleanup:e.cleanup}),command:a.inContainerCommand}}}let a1=["usage_limit","rate_limit","overloaded"],a2=new Set(["CANCELLED","ACTION_REQUIRED"]),a3=new Set(["TIMED_OUT"]),a4=/\b(ai|claude|codex|copilot|gpt|llm)\b.*\breview\b|\breview\b.*\b(ai|bot)\b/i,a5=/\bcancell?ed\b|\bsecret\b|\b(rate.?limit|secondary rate)\b|\b5\d\d\b|\b(401|403|unauthorized|forbidden)\b|service unavailable/i,a6=/\b(time(d)?.?out|timeout|intermittent|flak(y|e)|econnreset|etimedout|esockettimedout)\b/i,a7=/\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,a8=[{kind:"type",re:/\berror TS\d{2,5}\b|\bTS\d{2,5}:|\bType error:|is not assignable to/i},{kind:"dependency",re:/\bnpm ERR!|\bERR_PNPM|\bERESOLVE\b|unmet peer|peer dep|frozen lockfile|out of date lockfile|cannot find module '/i},{kind:"lint",re:/\bbiome\b|\beslint\b|\bprettier\b|\blint\/[a-z]|@typescript-eslint\/|formatter would have/i},{kind:"test",re:/\bFAIL\b|✕|✗|✖|●|\bAssertionError\b|expect\(|Expected:|Received:|\bTests?:\s|\d+ failed/i},{kind:"build",re:/failed to compile|module not found|compilation (failed|error)|\bcompile error\b|cannot compile/i},{kind:"timeout",re:/\btimed out\b|\btimeout\b|exceeded \d+\s?ms/i},{kind:"flaky",re:/\bECONNRESET\b|\bETIMEDOUT\b|\bESOCKETTIMEDOUT\b|intermittent|\bflak(y|e)\b/i}];function a9(a,b){if(0===a.length)return{kind:"unknown",evidence:""};let c=a.split("\n"),d=function(a){for(let{kind:b,re:c}of a8)if(c.test(a))return b;return"unknown"}(a);if("unknown"===d)return{kind:d,evidence:c.slice(-b).join("\n")};let e=a8.find(a=>a.kind===d),f=e?c.findIndex(a=>e.re.test(a)):-1;if(f<0)return{kind:d,evidence:c.slice(-b).join("\n")};let g=Math.max(0,f-3);return{kind:d,evidence:c.slice(g,g+b).join("\n")}}let ba={test:"A test is failing. Identify the failing test(s) from the evidence and fix the underlying code so they pass. Do not delete or skip tests, and do not weaken assertions to go green.",type:"A type error is failing the check. Fix the reported type error(s) properly — correct the types; do not silence them with `any` or `@ts-ignore`.",lint:"A lint/format check is failing. Fix the reported rule violations. Prefer the autofix (e.g. `npx biome check --write`) and resolve anything it cannot fix by hand.",build:"The build/compile step failed. Fix the compilation error(s) shown below (e.g. a broken import or unresolved module).",dependency:"A dependency step failed. Resolve the dependency problem below — a missing or incompatible package, or an out-of-date lockfile. Update package.json and the lockfile together.",timeout:"A check timed out. If a change in this branch introduced a hang or a slow path, fix it; otherwise make the affected code complete within the time budget.",flaky:"A check failed on what looks like an intermittent/network error. If the branch made the code fragile to this, harden it; otherwise the failure may not be code-related.",unknown:"A CI check is failing. Diagnose the failure from the evidence below and fix it."};var bb=c(34666);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?"none":a.some(a=>bc.has(a.state.toUpperCase()))?"failed":a.some(a=>bd.has(a.state.toUpperCase()))?"pending":"passed"}function bf(a){return a.timedOut?"CI-fix session timed out":a.costExceeded?"per-job cost limit reached during the CI fix":a.spawnError?`CI-fix session failed to start: ${a.spawnError.message}`:0!==a.exitCode?"CI-fix session exited non-zero":a.settledExternally?"job was settled externally during the CI fix":a.noChanges?"CI-fix session produced no changes":null}function bg(a,b){return()=>!!(0,at.nc)(a.agent,b)}function bh(a,b,c,d){let e=c.limit;if(!e)return null;if("auth"===e.kind||"billing"===e.kind){let c="auth"===e.kind?"authentication":"billing",f=`CI fix blocked by a provider ${c} error: ${e.rawSnippet}`.slice(0,500);return(0,C.yM)(a.id,"status",{reason:f,prNumber:b},d),{job:(0,C.dk)(a.id,"needs_human",{errorMessage:f},d),done:!0}}return a1.includes(e.kind)&&(0,at.$q)(e.agent,d)?(e.latched||(0,at.H_)(e,d),(0,C.yM)(a.id,"status",{reason:`${e.agent}_${e.kind} during CI fix`,prNumber:b},d),{job:(0,C.dk)(a.id,"ci_running",{ciRetryCount:Math.max(0,a.ciRetryCount-1)},d),done:!1}):null}function bi(a,b){let c;return{start:()=>!(a<=0)&&void 0===c&&(c=b(),!0),open:()=>a>0&&void 0!==c&&b()-c<a,reset(){c=void 0}}}let bj=a=>new Promise(b=>setTimeout(b,a)),bk=new Set(["ci_running","ci_failed","retrying"]);function bl(a,b){let c=(0,C.ax)(a,b);if(!(!c||bk.has(c.status)))return c}async function bm(a,b,c,d,e){await d.gh.commentIssue(a.issueNumber,`${c} Handing over to a human.`);let f=await d.gh.createIssue(`Follow-up: CI keeps failing for issue #${a.issueNumber}`,`Job ${a.id} could not be auto-healed on PR #${b}. ${c}`);return e.insert(j.followupIssues).values({jobId:a.id,ghIssueNumber:f,title:`Follow-up for #${a.issueNumber}`}).run(),(0,C.dk)(a.id,"needs_human",{errorMessage:c.slice(0,500)},e)}async function bn(a,b,c,d,e,f="checks stayed pending"){let g=Math.round(c/6e4),h=`CI did not complete in time (${f} for over ${g} min on PR #${b}).`;return await d.gh.commentIssue(a.issueNumber,`${h} Handing over to a human.`),(0,C.yM)(a.id,"status",{reason:"ci wait budget exceeded",prNumber:b},e),(0,C.dk)(a.id,"needs_human",{errorMessage:h.slice(0,500)},e)}async function bo(a,b,c){if(c.autoHeal)return bp(a,b,c,c.autoHeal);let d=c.db??(0,h.Lf)(),e=c.sleep??bj,f=c.pollMs??3e4,g=c.maxPolls??1/0,i=c.ciWaitMs??1/0,j=c.now??Date.now,k=j()+i,l=bi(c.mergeGateMs??0,j),m=bi(Math.max(c.mergeGateMs??0,f),j),n=c.limitBlocked??bg(a,d),o=!1,p=a,q=0;for(;q<g;){q++;let a=bl(p.id,d);if(a)return a;let g=be(await c.gh.prChecks(b));if("pending"===g){if(l.reset(),m.reset(),j()>=k)return bn(p,b,i,c,d);await e(f);continue}if("none"===g&&!c.mergeWithoutChecks){if(l.reset(),m.reset(),j()>=k)return bn(p,b,i,c,d,"no CI checks were reported");await e(f);continue}if("none"===g){if(l.reset(),m.start()&&(0,C.yM)(p.id,"status",{reason:"no CI checks reported; settling before an unverified merge",prNumber:b},d),m.open()){if(j()>=k)return bn(p,b,i,c,d,"no CI checks were reported");await e(f);continue}let a=bl(p.id,d);if(a)return a;return(0,C.yM)(p.id,"status",{reason:"merging without CI verification (no checks reported)",prNumber:b},d),await c.gh.mergePr(b),(0,C.dk)(p.id,"merged",{prNumber:b},d)}if("passed"===g){if(m.reset(),l.start()&&(0,C.yM)(p.id,"status",{reason:"merge gate: CI green, waiting for late reviews",prNumber:b},d),l.open()){await e(f);continue}let a=bl(p.id,d);if(a)return a;return await c.gh.mergePr(b),(0,C.dk)(p.id,"merged",{prNumber:b},d)}if(l.reset(),m.reset(),n()){if(j()>=k)return bn(p,b,i,c,d,"the provider usage limit blocked the CI fix");o||((0,C.yM)(p.id,"status",{reason:"ci fix deferred: provider limit latched",prNumber:b},d),o=!0),await e(f);continue}if(o=!1,(p=(0,C.dk)(p.id,"ci_failed",{prNumber:b},d)).ciRetryCount>=3)return bm(p,b,"CI failed 3 times.",c,d);if(!p.sessionId)return(0,C.yM)(p.id,"status",{reason:"missing session id, cannot resume for CI fix"},d),(0,C.dk)(p.id,"needs_human",{errorMessage:"CI failed but no session id to resume"},d);let h=p.sessionId;p=(0,C.dk)(p.id,"retrying",{ciRetryCount:p.ciRetryCount+1},d);let{evidence:r}=a9(await c.gh.failedRunLog(b),200),s=await c.resumeSession(p,h,r),t=bh(p,b,s,d);if(t){if(p=t.job,t.done)return p;continue}let u=bf(s);if(u)return(0,C.yM)(p.id,"status",{reason:u,prNumber:b},d),(0,C.dk)(p.id,"needs_human",{errorMessage:u},d);(0,at._x)(p.agent,d),p=(0,C.dk)(p.id,"ci_running",{},d)}return(0,C.ax)(p.id,d)??p}async function bp(a,b,c,d){let e,f=c.db??(0,h.Lf)(),g=c.sleep??bj,i=c.pollMs??3e4,j=c.maxPolls??1/0,k=d.budgets??bb.op,l=c.now??d.now??Date.now,m=c.ciWaitMs??1/0,n=l()+m,o=bi(c.mergeGateMs??0,l),p=bi(Math.max(c.mergeGateMs??0,i),l),q=c.limitBlocked??bg(a,f),r=a,s=0;for(;s<j;){s++;let a=bl(r.id,f);if(a)return e&&(0,bb.rh)(e.sessionId,"superseded",f),a;let h=await c.gh.prChecks(b),j=be(h);if("pending"===j){if(o.reset(),p.reset(),l()>=n)return e&&(0,bb.rh)(e.sessionId,"escalated",f),bn(r,b,m,c,f);await g(i);continue}if("none"===j&&!c.mergeWithoutChecks){if(o.reset(),p.reset(),l()>=n)return e&&(0,bb.rh)(e.sessionId,"escalated",f),bn(r,b,m,c,f,"no CI checks were reported");await g(i);continue}if("none"===j){if(o.reset(),p.start()&&(0,C.yM)(r.id,"status",{reason:"no CI checks reported; settling before an unverified merge",prNumber:b},f),p.open()){if(l()>=n)return e&&(0,bb.rh)(e.sessionId,"escalated",f),bn(r,b,m,c,f,"no CI checks were reported");await g(i);continue}let a=bl(r.id,f);if(a)return e&&(0,bb.rh)(e.sessionId,"superseded",f),a;return e&&(0,bb.rh)(e.sessionId,"superseded",f),(0,C.yM)(r.id,"status",{reason:"merging without CI verification (no checks reported)",prNumber:b},f),await c.gh.mergePr(b),(0,C.dk)(r.id,"merged",{prNumber:b},f)}if("passed"===j){if(p.reset(),o.start()&&(0,C.yM)(r.id,"status",{reason:"merge gate: CI green, waiting for late reviews",prNumber:b},f),o.open()){await g(i);continue}let a=bl(r.id,f);if(a)return e&&(0,bb.rh)(e.sessionId,"superseded",f),a;if(e){let a=await d.headSha(b);(0,bb.Az)(e.attemptId,{status:"healed",afterSha:a},f),(0,bb.Yv)(e.sessionId,"verifying",f),(0,bb.Yv)(e.sessionId,"healed",f)}return await c.gh.mergePr(b),(0,C.dk)(r.id,"merged",{prNumber:b},f)}o.reset(),p.reset();let t=h.filter(a=>bc.has(a.state.toUpperCase())),u=await d.headSha(b);if(e){let a="rerun"===e.kind?(0,bb.sk)({beforeFailingCount:e.beforeFailing,afterFailingCount:t.length}):(0,bb.I0)({beforeSha:e.beforeSha,afterSha:u,beforeFailingCount:e.beforeFailing,afterFailingCount:t.length});(0,bb.Az)(e.attemptId,{status:a.verdict,afterSha:u},f);let d=e.sessionId;if(e=void 0,"rejected"===a.verdict)return(0,bb.Yv)(d,"verifying",f),(0,bb.Yv)(d,"escalated",f),bm(r,b,`CI auto-heal: ${a.reason}.`,c,f);(0,bb.Yv)(d,"verifying",f),(0,bb.Yv)(d,"cooldown",f)}if(q()){if(l()>=n)return bn(r,b,m,c,f,"the provider usage limit blocked auto-heal");await g(i);continue}let v=(0,bb.dT)(r.id,b,u,f),w=await c.gh.failedRunLog(b),x=t.map(a=>(function(a,b,c=""){var d,e;let f,g,h=(d=b.name,e=b.state??"",f=e.toUpperCase(),g=`${d}
|
|
6
|
+
${c}`,a2.has(f)||a4.test(d)||a5.test(g)?"blocked_external":a3.has(f)||a6.test(g)?"flaky_or_ambiguous":a7.test(g)?"healable_in_branch":"unknown");return{checkName:b.name,category:h,fingerprint:`${a}:${h}:${b.name.trim().toLowerCase().replace(/\s+/g," ")}`}})(d.provider,a,w)),y=(0,bb.VJ)(v.id,f),z=y.at(-1),A=(0,bb.ZM)({failures:x,attempts:y.map(a=>({fingerprint:a.fingerprint})),lastAttemptAt:z?1e3*z.createdAt:null,now:l(),activeRuns:(0,bb.Bz)(f),budgets:k});switch(A.action){case"block":return(0,bb.rh)(v.id,"blocked",f),await c.gh.commentIssue(r.issueNumber,`CI auto-heal: ${A.reason} — not auto-fixable. Handing over to a human.`),(0,C.dk)(r.id,"needs_human",{errorMessage:`auto-heal blocked: ${A.reason}`.slice(0,500)},f);case"escalate":return(0,bb.rh)(v.id,"escalated",f),bm(r,b,`CI auto-heal: ${A.reason}.`,c,f);case"wait_slot":if(l()>=n)return(0,bb.rh)(v.id,"escalated",f),bn(r,b,m,c,f,"auto-heal waited for a free healing slot");await g(i);continue;case"cooldown":if(l()>=n)return(0,bb.rh)(v.id,"escalated",f),bn(r,b,m,c,f,"auto-heal waited out its cooldown");await g(Math.min(A.waitMs,i));continue;case"repair":{let a=r.sessionId;if(!a)return(0,bb.rh)(v.id,"escalated",f),bm(r,b,"CI failed but no session id to resume.",c,f);let d=(0,bb.Z7)(v.id,A.target,u,f);(0,bb.Yv)(v.id,"awaiting_slot",f),(0,bb.Yv)(v.id,"repairing",f);let g=null;try{r=(0,C.dk)(r.id,"ci_failed",{prNumber:b},f),r=(0,C.dk)(r.id,"retrying",{ciRetryCount:r.ciRetryCount+1},f);let e=function(a){let{kind:b,evidence:c}=a9(a.log,a.maxLines);return[`CI check "${a.checkName}" is failing on this PR.`,ba[b],"Fix only this failure, then commit and push. Failure evidence:\n",c].join("\n")}({checkName:A.target.checkName,log:w,maxLines:k.maxEvidenceLines}),h=await c.resumeSession(r,a,e),i=bh(r,b,h,f);if(i){if((0,bb.kb)(d.id,f),(0,bb.rh)(v.id,i.done?"escalated":"superseded",f),r=i.job,i.done)return r;continue}(g=bf(h))||((0,at._x)(r.agent,f),(0,bb.Yv)(v.id,"awaiting_ci",f),r=(0,C.dk)(r.id,"ci_running",{},f))}catch(a){throw(0,bb.rh)(v.id,"escalated",f),a}if(g)return(0,bb.Az)(d.id,{status:"rejected",afterSha:null},f),(0,bb.rh)(v.id,"escalated",f),bm(r,b,`CI auto-heal: ${g}.`,c,f);e={attemptId:d.id,sessionId:v.id,beforeSha:u,beforeFailing:t.length,kind:"repair"};continue}case"rerun":{if(!await c.gh.reRunFailedChecks?.(b))return(0,bb.rh)(v.id,"escalated",f),bm(r,b,`CI auto-heal: flaky check "${A.target.checkName}" requires a manual re-run (this forge cannot re-run failed checks).`,c,f);let a=(0,bb.Z7)(v.id,A.target,u,f);(0,bb.Yv)(v.id,"awaiting_slot",f),(0,bb.Yv)(v.id,"awaiting_ci",f),(0,C.yM)(r.id,"status",{reason:"auto-heal re-ran flaky check",checkName:A.target.checkName,prNumber:b},f),e={attemptId:a.id,sessionId:v.id,beforeSha:u,beforeFailing:t.length,kind:"rerun"};continue}}}return(0,C.ax)(r.id,f)??r}function bq(a,b){let c=a.split(".").map(a=>Number.parseInt(a,10)||0),d=b.split(".").map(a=>Number.parseInt(a,10)||0);for(let a=0;a<Math.max(c.length,d.length);a++){let b=(d[a]??0)-(c[a]??0);if(0!==b)return b}return b.localeCompare(a)}function br(a=process.env.CLAUDE_CONFIG_DIR??(0,ah.join)((0,ay.homedir)(),".claude")){let b=[],c=process.env.CLAUDE_PLUGIN_ROOT??process.env.PLUGIN_ROOT;c&&b.push(c);let d=(0,ah.join)(a,"plugins","cache","thedotmack","claude-mem");if((0,ae.existsSync)(d)){let a=[];try{a=(0,ae.readdirSync)(d,{withFileTypes:!0}).filter(a=>a.isDirectory()&&/^\d/.test(a.name)).map(a=>a.name).sort(bq)}catch{a=[]}for(let c of a)b.push((0,ah.join)(d,c))}for(let c of(b.push((0,ah.join)(a,"plugins","marketplaces","thedotmack","plugin")),b)){let a=(0,ae.existsSync)((0,ah.join)(c,"plugin","scripts"))?(0,ah.join)(c,"plugin"):c;if((0,ae.existsSync)((0,ah.join)(a,"scripts","bun-runner.js"))&&(0,ae.existsSync)((0,ah.join)(a,"scripts","worker-service.cjs")))return a}return null}async function bs(a,b={}){let c=b.resolvePlugin??br,d=b.run??R.Sx;try{let e=c(b.configDir);if(!e)return void(0,r.v)(`[claude-mem] adoption skipped for ${a.branch}: plugin not installed`);let f=[(0,ah.join)(e,"scripts","bun-runner.js"),(0,ah.join)(e,"scripts","worker-service.cjs"),"adopt","--branch",a.branch,"--cwd",a.cwd],g=await d("node",f,a.cwd,{timeoutMs:b.timeoutMs??6e4});0!==g.exitCode&&(0,r.v)(`[claude-mem] adoption for ${a.branch} exited ${g.exitCode}: ${g.stderr.trim()}`)}catch(b){(0,r.v)(`[claude-mem] adoption failed for ${a.branch}`,b)}}let bt=(0,ah.join)(".drydock","FOLLOWUPS.md"),bu=/^##\s+(.*)$/;function bv(a){let b=function(a){let b;try{b=(0,ae.readFileSync)((0,ah.join)(a,bt),"utf8")}catch{return[]}return function(a){let b=[],c=new Set,d=null,e=[],f=()=>{if(null!==d){if(""!==d&&!c.has(d)&&b.length<20){c.add(d);let a=e.join("\n").trim(),f=a.length>6e4?`${a.slice(0,6e4)}
|
|
7
|
+
… (truncated)`:a;b.push({title:d,body:f})}d=null,e=[]}};for(let b of a.split("\n")){let a=b.match(bu);a?(f(),d=(a[1]??"").trim().slice(0,300)):null!==d&&e.push(b)}return f(),b}(b)}(a);return(0,ae.rmSync)((0,ah.join)(a,bt),{force:!0}),b}function bw(a,b){if(a.length<=b)return a;let c=a.length-b;return`${a.slice(0,b)}
|
|
8
|
+
…[truncated ${c} chars]`}let bx=az.Ik({ordinal:az.ai().int().nonnegative(),status:az.k5(["done","pending","deferred"]),reason:az.Yj().default("")}),by=az.Ik({summary:az.Yj().default(""),verdicts:az.YO(bx).default([])}),bz=["blocker","major","minor","nit","praise"],bA=az.Ik({severity:az.k5(bz),title:az.Yj().default(""),body:az.Yj().default(""),path:az.Yj().optional(),line:az.ai().int().nonnegative().optional(),suggestion:az.Yj().optional()}),bB=az.Ik({summary:az.Yj().default(""),recommendation:az.k5(["approve","request_changes","comment"]),findings:az.YO(bA).default([]),issueCoverage:az.Ik({met:az.YO(az.Yj()).default([]),missing:az.YO(az.Yj()).default([])}).default({met:[],missing:[]})});function bC(a){return`<!-- drydock:pr-audit:${a} -->`}let bD={blocker:"⛔",major:"\uD83D\uDD34",minor:"\uD83D\uDFE1",nit:"\uD83D\uDD35",praise:"\uD83C\uDF89"},bE={approve:"✅ approve",request_changes:"\uD83D\uDED1 request changes",comment:"\uD83D\uDCAC comment"};function bF(a){return[bC(a.jobId),"",`### 🔍 Drydock PR audit (${a.agent}/${a.model}, ${a.language})`,""]}var bG=c(58543);async function bH(a,b,c,d){if(a.listIssueComments&&a.updateIssueComment)try{let e=(await a.listIssueComments(b)).find(a=>a.body.includes(c));if(e)return await a.updateIssueComment(b,e.id,d),"updated"}catch(a){(0,r.v)(`[pr-audit] comment upsert degraded to a fresh post on #${b}`,a)}return await a.commentIssue(b,d),"created"}async function bI(a,b){try{return await a()}catch(a){return(0,r.v)("[pr-audit] best-effort read failed, using fallback",a),b}}async function bJ(a){var b;let c,d,e,f,i,{job:j,prNumber:k,repo:l,forge:m,db:n}=a,o=(e=(d=(0,g.TU)(l.agent)?l.agent:g.kz)===l.agent,f=(0,g.TU)(l.prAuditAgent)?l.prAuditAgent:d,i=l.prAuditModel??(e&&f===d?l.defaultModel:(0,bG.VJ)(f)),{agent:f,model:i,language:l.prAuditLanguage||"en"}),p={jobId:j.id,agent:o.agent,model:o.model,language:o.language};try{let d;if((0,A.mt)(n).paused)return(0,C.yM)(j.id,"pr_audit_skipped",{reason:"paused"},n),null;(0,C.yM)(j.id,"pr_audit_started",{...p,prNumber:k},n);let e=await bI(()=>m.prDiff(k),"");if(!e.trim())return(0,C.yM)(j.id,"pr_audit_failed",{reason:"empty diff",prNumber:k},n),null;let[f,i]=await Promise.all([bI(()=>m.prChecks(k),[]),bI(()=>m.viewIssue(j.issueNumber),null)]),q=aT(l.id,j.issueNumber,n),r={issueNumber:j.issueNumber,issueTitle:i?.title??`Issue #${j.issueNumber}`,issueBody:i?.body??"",subtasks:q.map(a=>({ordinal:a.ordinal,title:a.title})),prNumber:k,branch:j.branch,diff:e,checks:f.map(a=>({name:a.name,state:a.state})),language:o.language},s=a.generate;if(!s){let d;c=await (0,ax.mkdtemp)((0,ah.join)((0,ay.tmpdir)(),"drydock-pr-audit-"));let e=(0,g.X$)(o.agent);d=(b={provider:e,command:(0,B.m)(e,n),model:o.model,cwd:c,repoId:l.id,db:n,runner:a.runner}).timeoutMs??36e4,s=async a=>{let c,e,f,g;try{var i,j;let g,h,k;({text:c,exitCode:e,stderr:f}=await aD({provider:b.provider,command:b.command,model:b.model,cwd:b.cwd,prompt:(g=bw(a.issueBody.trim(),6e3),h=bw(a.diff.trim(),48e3),k=function(a){let b=a.trim();if(!b)return"English";try{return new Intl.DisplayNames(["en"],{type:"language"}).of(b)??b}catch{return b}}(a.language),["You are performing a READ-ONLY pull request audit. Do NOT edit files, run\ncommands, or make any changes. Review the full diff like a senior code\nreviewer (in the spirit of Bugbot/CodeRabbit) across these dimensions:\n\n1. Correctness — logic bugs, race conditions, error handling gaps\n2. Security — injection, authz, secrets, unsafe defaults (no CVE speculation)\n3. Tests — missing coverage for changed behavior\n4. API / compatibility — breaking changes, migration needs\n5. Maintainability — complexity, naming, duplication\n6. Issue fit — does the diff actually address the linked issue and subtasks\n",`## Issue #${a.issueNumber}: ${a.issueTitle}`,"",g,"\n## Subtasks\n",0===(i=a.subtasks).length?"This issue has no tracked subtasks; judge the issue as a whole.":i.map(a=>`- [ordinal ${a.ordinal}] ${a.title}`).join("\n"),"",`## Pull request #${a.prNumber}${a.branch?` (branch ${a.branch})`:""}`,"\n## CI results\n",0===(j=a.checks).length?"No CI results available.":j.map(a=>`- ${a.name}: ${a.state}`).join("\n"),"\n## Diff\n\n```diff",h,'```\n\n## Response format\n\nRespond with ONLY a JSON object (no prose outside it) of the shape:\n\n{"summary": "<one or two sentence overall assessment>",\n "recommendation": "approve"|"request_changes"|"comment",\n "findings": [{"severity": "blocker"|"major"|"minor"|"nit"|"praise",\n "title": "<short title>", "body": "<explanation>",\n "path": "<file path, optional>", "line": <number, optional>,\n "suggestion": "<suggested fix, optional>"}],\n "issueCoverage": {"met": ["<criterion>"], "missing": ["<criterion>"]}}\n\nReport only findings you are confident about; an empty findings list is a\nvalid answer for a clean diff. This review is advisory: do not gate, merge,\nor approve anything yourself.\n\nWrite all human-readable text (summary, titles, bodies, suggestions,',`coverage entries) in ${k}.`].join("\n")),repoId:b.repoId,type:"pr_audit",timeoutMs:d,runner:b.runner,db:b.db}))}catch{return null}if(0!==e){let a=b.provider.classifyFailure?.({exitCode:e,stderr:f,resultText:c});if(a&&a1.includes(a.kind)){let c=b.db??(0,h.Lf)();if((0,at.$q)(b.provider.id,c))throw(0,at.H_)(a,c),new at.vu(a)}return null}let k=c.match(/\{[\s\S]*\}/);if(!k)return null;try{g=JSON.parse(k[0])}catch{return null}let l=bB.safeParse(g);return l.success?l.data:null}}try{d=await s(r)}catch(a){if(a instanceof at.vu)return(0,C.yM)(j.id,"pr_audit_failed",{reason:"provider limit",kind:a.info.kind,agent:a.info.agent},n),null;throw a}let t=bC(j.id);if(!d){let a,b=((a=bF(p)).push("The audit run failed: the agent returned no parseable review (timeout, non-zero exit, or invalid JSON).",""),a.push("Job state is unchanged; re-run the audit from the job page to retry."),a.join("\n"));return await bH(m,j.issueNumber,t,(0,V.f)(b)),(0,C.yM)(j.id,"pr_audit_failed",{reason:"unparseable output",prNumber:k},n),null}let u=(0,V.f)(function(a,b){let c=bF(b);c.push(`**Recommendation:** ${bE[a.recommendation]}`,""),a.summary.trim()&&c.push(a.summary.trim(),"");let d=new Map(bz.map((a,b)=>[a,b])),e=[...a.findings].sort((a,b)=>(d.get(a.severity)??99)-(d.get(b.severity)??99));if(0===e.length)c.push("No findings — the diff looks clean across all review dimensions.","");else{for(let a of(c.push(`#### Findings (${e.length})`,""),e.slice(0,30)))c.push(function(a){let b=a.path?` — \`${a.path}${void 0!==a.line?`:${a.line}`:""}\``:"",c=[`- ${bD[a.severity]} **[${a.severity}] ${a.title}**${b}`];return a.body.trim()&&c.push(` ${a.body.trim().replace(/\n/g,"\n ")}`),a.suggestion?.trim()&&c.push(` Suggested fix: ${a.suggestion.trim().replace(/\n/g,"\n ")}`),c.join("\n")}(a));let a=e.length-30;a>0&&c.push("",`_…and ${a} more finding${1===a?"":"s"} omitted._`),c.push("")}let{met:f,missing:g}=a.issueCoverage;if(f.length>0||g.length>0){for(let a of(c.push("#### Issue coverage",""),f))c.push(`- [x] ${a}`);for(let a of g)c.push(`- [ ] ${a}`);c.push("")}return b.truncated&&(c.push("_Note: the diff and/or issue body was truncated to fit the audit context;_"),c.push("_this is a partial review of an oversized PR._","")),c.push("---"),c.push("_This audit is advisory only; it never merges, blocks, or edits anything._"),c.join("\n")}(d,{...p,truncated:r.diff.trim().length>48e3||r.issueBody.trim().length>6e3}));return await bH(m,j.issueNumber,t,u),l.prAuditPostOnPr&&m.commentPr&&await bI(()=>m.commentPr?.(k,u)??Promise.resolve(),void 0),(0,C.yM)(j.id,"pr_audit_completed",{recommendation:d.recommendation,findings:d.findings.length,blockers:d.findings.filter(a=>"blocker"===a.severity).length,prNumber:k},n),d}catch(a){return(0,r.v)(`[pr-audit] audit pass failed for ${l.name}#${j.issueNumber}`,a),(0,C.yM)(j.id,"pr_audit_failed",{reason:a instanceof Error?a.message.slice(0,300):String(a)},n),null}finally{if(c)try{await (0,ax.rm)(c,{recursive:!0,force:!0})}catch{}}}let bK=(0,ah.join)(".drydock","PR.md");function bL(a){let b=function(a){let b;try{b=(0,ae.readFileSync)((0,ah.join)(a,bK),"utf8")}catch{return null}let c=b.split("\n"),d=0;for(;d<c.length&&""===(c[d]??"").trim();)d++;if(d>=c.length)return null;let e=(c[d]??"").trim().slice(0,300);if(""===e)return null;let f=c.slice(d+1).join("\n").trim();return{title:e,body:f.length>6e4?`${f.slice(0,6e4)}
|
|
9
|
+
… (truncated)`:f}}(a);return(0,ae.rmSync)((0,ah.join)(a,bK),{force:!0}),b}var bM=c(52484);let bN=(0,ah.join)(".drydock","QUESTIONS.md");function bO(a){let b=function(a){let b,c;try{b=(0,ae.readFileSync)((0,ah.join)(a,bN),"utf8")}catch{return null}return""===(c=b.trim())?null:c.length>6e4?`${c.slice(0,6e4)}
|
|
10
|
+
… (truncated)`:c}(a);return(0,ae.rmSync)((0,ah.join)(a,bN),{force:!0}),b}let bP=(0,ah.join)(".drydock","RELEASE.md"),bQ=/^tag:\s*(\S+)\s*$/i,bR=/^v?\d+\.\d+\.\d+/;function bS(a){let b=function(a){let b;try{b=(0,ae.readFileSync)((0,ah.join)(a,bP),"utf8")}catch{return null}return function(a){let b=null,c=[];for(let d of a.split("\n")){let a=d.match(bQ);if(a&&null===b){b=a[1]??null;continue}c.push(d)}let d=0;for(;d<c.length&&""===(c[d]??"").trim();)d++;if(d>=c.length)return b?{tag:b,title:b,notes:""}:null;let e=(c[d]??"").trim().slice(0,300);if(""===e)return null;null===b&&bR.test(e)&&(b=e);let f=c.slice(d+1).join("\n").trim();return{tag:b,title:e,notes:f.length>6e4?`${f.slice(0,6e4)}
|
|
11
|
+
… (truncated)`:f}}(b)}(a);return(0,ae.rmSync)((0,ah.join)(a,bP),{force:!0}),b}async function bT(a,b={},c=(a,c)=>(0,av.JD)(a,c,b.db??(0,h.Lf)())){let d,e=b.db??(0,h.Lf)(),f=(0,C.ax)(a,e);if(!f)throw Error(`job ${a} not found`);let j=(0,i.L8)(f.repoId,e);if(!j)throw Error(`repo ${f.repoId} not found`);let k=(0,aw.Oe)(a,e)??(0,aw.v0)({repoId:j.id,mode:"agent",jobId:a},e);"queued"===f.status&&(0,C.dk)(f.id,"working",{},e);let l=b.worktrees??new ac.ND,m=(0,g.X$)(f.agent),n=(0,B.m)(m,e),o=(0,A.mt)(e),p=j.maxJobMinutes??o.maxJobMinutes,q=6e4*p,s=j.maxJobCostUsd??o.maxJobCostUsd,t=b.runSession??((a,b,c,d)=>(0,ad.V)(a,b,c,{db:e,provider:m,command:n,timeoutMs:q,costCapUsd:s,bypassPermissions:d})),u=b.consumeQuestions??bO,v=b.consumeReleaseMetadata??bS;("detected"===k.status||"error"===k.status)&&(0,aw.Cq)(k.id,"evaluating",{},e);let w=b=>{let c=(0,aw.Oe)(a,e),d=c?.status??"evaluating";("evaluating"===d||"proposed"===d||"publishing"===d)&&(0,aw.Cq)(k.id,"error",{errorMessage:b.slice(0,500)},e)};try{var x,y;d=await l.prepare(j,f.id,0,"release"),(0,C.yM)(f.id,"worktree",{path:d.path,branch:d.branch},e);let a=(0,aX.Xm)((0,aX.yx)(j.id,aW._.release,e),{REPO_NAME:j.name,BRANCH:d.branch,DEFAULT_BRANCH:j.defaultBranch}),b=await t((0,C.ax)(f.id,e),a,d.path,!0),g=(0,C.ax)(f.id,e);if("aborted"===g.status)return w("release aborted"),g;if("interrupted"===g.status)return g;let h=(x=b,y={provider:m.label,maxJobMinutes:p,maxJobCostUsd:s,command:n},x.timedOut?`${y.provider} timed out after ${y.maxJobMinutes} minutes`:x.costExceeded?`per-job cost limit of $${y.maxJobCostUsd} reached`:x.spawnError?`failed to start ${y.command}: ${x.spawnError.message}`:x.limit?`${y.provider} unavailable (${x.limit.kind}): ${x.limit.rawSnippet??"limit reached"}`:0!==x.exitCode?`${y.provider} exited non-zero`:void 0);if(h)return w(h),(0,C.dk)(f.id,"needs_human",{errorMessage:h.slice(0,500)},e);(0,at._x)(m.id,e);let i=u(d.path);if(i)return(0,C.yM)(f.id,"status",{reason:"agent has open questions",questions:i},e),w("agent parked open questions for a human"),(0,C.dk)(f.id,"needs_human",{errorMessage:"agent has open questions",branch:d.branch},e);let o=v(d.path);(0,aw.Dg)(k.id,{tag:o?.tag??null,title:o?.title??null,notes:o?.notes??null},e);let q=(0,C.dk)(f.id,"released",{branch:d.branch},e);return await c("release_published",`🚀 Release done: ${j.name}${o?.tag?` (${o.tag})`:""}.`),q}catch(c){let a=c instanceof Error?c.message:String(c);(0,C.yM)(f.id,"error",{message:a},e),w(a);let b=(0,C.ax)(f.id,e);if("working"===b.status)return(0,C.dk)(f.id,"needs_human",{errorMessage:a.slice(0,500)},e);return b}finally{if(d)try{await l.remove(d,j.path)}catch(a){(0,r.v)(`[release-job] worktree cleanup failed for job ${f.id}`,a)}}}async function bU(a,b,c,d=(0,h.Lf)(),e={}){for(let f of c)try{let c=await b.viewIssue(f.number),g=await aV(a,{number:c.number,title:c.title,body:c.body},d,{generate:e.generate});if(!g.skipped&&g.subtasks.length>=2){let a=aS(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:
|
|
12
|
+
|
|
13
|
+
${a}`)}}catch(b){if(b instanceof at.vu)throw b;(0,r.v)(`[subtasks] decomposition failed for ${a.name}#${f.number}`,b)}}function bV(a,b,c=(0,h.Lf)()){for(let d of aT(a,b,c))"pending"===d.status&&aU(d.id,"in_progress",c)}function bW(a,b,c=(0,h.Lf)()){for(let d of aT(a,b,c))"in_progress"===d.status&&(aU(d.id,"deferred",c),aU(d.id,"pending",c))}async function bX(a){let b,{job:c,prNumber:d,repo:e,forge:f,db:g,provider:i,command:j,model:k}=a;try{let m=await f.prDiff(d);if(!m.trim())return null;let n=await f.viewIssue(c.issueNumber),o=aT(e.id,c.issueNumber,g),p={issueNumber:c.issueNumber,issueTitle:n.title,issueBody:n.body,subtasks:o.map(a=>({ordinal:a.ordinal,title:a.title})),diff:m},q=a.generate;if(!q){var l;let c;b=await (0,ax.mkdtemp)((0,ah.join)((0,ay.tmpdir)(),"drydock-verify-")),c=(l={provider:i,command:j,model:k,cwd:b,repoId:e.id,db:g,runner:a.runner}).timeoutMs??18e4,q=async a=>{try{var b;let d,e,f,{text:g,exitCode:h}=await aD({provider:l.provider,command:l.command,model:l.model,cwd:l.cwd,prompt:(d=bw(a.issueBody.trim(),6e3),e=bw(a.diff.trim(),24e3),["You are performing a READ-ONLY verification pass. Do NOT edit files, run\ncommands, or make any changes. Given a GitHub issue, its subtasks, and the\ndiff of a pull request that claims to address it, judge whether the diff\nactually satisfies each subtask (or, if there are none, the issue overall).\n",`## Issue #${a.issueNumber}: ${a.issueTitle}`,"",d,"\n## Subtasks\n",0===(b=a.subtasks).length?"This issue has no tracked subtasks; verify the issue as a whole.":b.map(a=>`- [ordinal ${a.ordinal}] ${a.title}`).join("\n"),"\n## Pull request diff\n\n```diff",e,'```\n\n## Response format\n\nRespond with ONLY a JSON object (no prose, no code fences) of the shape:\n\n{"summary": "<one or two sentence overall assessment>",\n "verdicts": [{"ordinal": <number>, "status": "done"|"pending"|"deferred",\n "reason": "<short justification>"}]}\n\nInclude one verdict per subtask ordinal above. If there are no subtasks,\nreturn a single verdict with ordinal 0 for the issue as a whole. Use\n"done" when the diff fully satisfies it, "pending" when it is unmet or only\npartially addressed, and "deferred" when it is intentionally out of scope.'].join("\n")),repoId:l.repoId,type:"verify",timeoutMs:c,runner:l.runner,db:l.db});if(0!==h)return null;let i=g.match(/\{[\s\S]*\}/);if(!i)return null;try{f=JSON.parse(i[0])}catch{return null}let j=by.safeParse(f);return j.success?j.data:null}catch{return null}}}let r=await q(p);if(!r)return(0,C.yM)(c.id,"verification",{ok:!1},g),null;let s=function(a,b,c,d=(0,h.Lf)()){let e=new Map(aT(a,b,d).map(a=>[a.ordinal,a])),f=0,g=0,i=[];for(let a of c.verdicts){let b=e.get(a.ordinal);if(b)if("done"===a.status)!function(a,b){let c=a.status;if("done"!==c&&"skipped"!==c)try{if("in_progress"===c)return void aU(a.id,"done",b);aU(a.id,"in_progress",b),aU(a.id,"done",b)}catch{}}(b,d),f+=1;else if("deferred"===a.status)try{aU(b.id,"deferred",d),g+=1}catch{}else i.push(b.title)}return{done:f,deferred:g,pendingTitles:i}}(e.id,c.issueNumber,r,g);return await f.commentIssue(c.issueNumber,(0,V.f)(function(a,b){let c=[`🔎 Drydock post-PR verification`,""];if(a.summary.trim()&&c.push(a.summary.trim(),""),b.pendingTitles.length>0)for(let a of(c.push("Subtasks still pending:"),b.pendingTitles))c.push(`- ${a}`);else c.push("All tracked subtasks appear satisfied by the diff.");return c.join("\n")}(r,s))),(0,C.yM)(c.id,"verification",{ok:!0,summary:r.summary,done:s.done,deferred:s.deferred,pending:s.pendingTitles.length},g),r}catch(a){return(0,r.v)(`[verify] verification pass failed for ${e.name}#${c.issueNumber}`,a),null}finally{if(b)try{await (0,ax.rm)(b,{recursive:!0,force:!0})}catch{}}}function bY(a,b){return a.length>b?`${a.slice(0,b)}
|
|
14
|
+
… (truncated)`:a}async function bZ(a,b,c,d){if(0===a.length)return[];let e=new Map(d.select().from(j.followupIssues).where((0,f.eq)(j.followupIssues.jobId,b)).all().map(a=>[a.title,a.ghIssueNumber])),g=[];for(let{title:f,body:h}of a){let a,i=e.get(f);if(void 0!==i){g.push(i);continue}try{a=await c(f,h)}catch(a){(0,r.v)(`[run-job] follow-up issue filing failed for job ${b}: ${f}`,a);continue}g.push(a),e.set(f,a);try{d.insert(j.followupIssues).values({jobId:b,ghIssueNumber:a,title:f}).run()}catch(c){(0,r.v)(`[run-job] follow-up issue recording failed for job ${b}: #${a}`,c)}}return g}function b$(a,b){let[c,d]="codex"===b?["OpenAI","Codex"]:"openrouter"===b?["OpenRouter","OpenRouter"]:["Anthropic","Claude"];switch(a){case"rate_limit":return`${c} API rate limit hit — waiting for the window to clear`;case"overloaded":return`${c} API overloaded — waiting before retrying`;default:return`${d} usage limit reached — waiting for the quota to reset`}}async function b_(a,b={}){let c=b.db??(0,h.Lf)(),d=b.notify??((a,b)=>(0,av.JD)(a,b,c)),e=(0,C.ax)(a,c);if(e?.kind==="release")return bT(a,{db:c},d);let f=await b0(a,b,d);if("merged"===f.status)await d("pr_merged",`✅ Merged: ${f.repoId}#${f.issueNumber} (PR #${f.prNumber}).`);else if("needs_human"===f.status){let a=b.announceNeedsHuman??(a=>H(a,{db:c}));await a(f),await d("needs_human",`⚠️ Needs human: ${f.repoId}#${f.issueNumber} — ${f.errorMessage??"review required"}.`)}else"aborted"===f.status&&await d("job_failed",`🛑 Aborted: ${f.repoId}#${f.issueNumber} — ${f.errorMessage??"job aborted"}.`);return f}async function b0(a,b,c){let d,e=b.db??(0,h.Lf)(),l=(0,C.ax)(a,e);if(!l)throw Error(`job ${a} not found`);let m=(0,i.L8)(l.repoId,e);if(!m)throw Error(`repo ${l.repoId} not found`);"queued"===l.status&&(0,C.dk)(l.id,"working",{},e);let n=b.worktrees??new ac.ND,o=(0,k.Ie)(m),p=(0,g.X$)(l.agent),s=(0,B.m)(p,e),t=(0,A.mt)(e),u=m.maxJobMinutes??t.maxJobMinutes,v=6e4*u,w=(m.maxCiWaitMinutes??t.maxCiWaitMinutes)*6e4,x=m.maxJobCostUsd??t.maxJobCostUsd,y={mode:"docker"===m.sandbox?"docker":"none",imageOverride:aY(m.sandboxImage),defaultImage:t.sandboxDefaultImage,allowNetwork:!!m.sandboxAllowNetwork,cpus:aY(m.sandboxCpus),memory:aY(m.sandboxMemory)},z="docker"===y.mode&&"http"!==p.kind,D=b.prepareSandbox??a0,E={command:s},F=b.runSession??((a,b,c)=>(0,ad.V)(a,b,c,{db:e,provider:p,command:E.command,runner:E.runner,timeoutMs:v,costCapUsd:x})),G=b.createPr??(a=>o.createPr(a)),H=b.runPlan??((a,b,c)=>aD({provider:p,command:s,model:a.model??m.defaultModel,cwd:c,prompt:b,repoId:m.id,type:"plan",timeoutMs:v,db:e}).then(a=>({text:a.text,exitCode:a.exitCode}))),J=b.commentIssue??((a,b)=>o.commentIssue(a,b)),K=b.createIssue??((a,b)=>o.createIssue(a,b)),L=b.viewIssue??(a=>o.viewIssue(a).then(a=>({title:a.title,body:a.body}))),M=b.consumePrMetadata??bL,N=b.consumeQuestions??bO,O=b.consumeFollowups??bv,P=b.markNeedsHuman??(a=>(0,q.$l)(m.id,a,e)),Q=b.adoptClaudeMem??bs,R=(a,b,c)=>{if(!a.sessionId)throw Error(`job ${a.id} has no session id to resume`);return(0,ad.n)(a,a.sessionId,"",c,{db:e,provider:p,command:E.command,runner:E.runner,timeoutMs:v,costCapUsd:x,resumePrompt:b,resumeModel:a.model??m.defaultModel,resumeMaxTurns:a.maxTurns})},S=b.resumeLimitSession??R,T=b.resumeInstructionSession??R,U=async a=>{let b=a.latched?a.resetAt??Math.floor(Date.now()/1e3)+60:(0,at.H_)(a,e).latch.blockedUntil;(0,C.yM)(l.id,"status",{reason:`${a.agent}_${a.kind}`,blockedUntil:b,snippet:a.rawSnippet},e),m.autoDecompose&&bW(m.id,l.issueNumber,e);let c=(0,C.dk)(l.id,"waiting_limit",{errorMessage:b$(a.kind,a.agent),availableAt:b,limitKind:a.kind},e);try{let c=new Date(1e3*b).toISOString().slice(0,16).replace("T"," ");await J(l.issueNumber,`⏳ Drydock paused this job: ${b$(a.kind,a.agent)}. It will retry automatically (next attempt around ${c} UTC).`)}catch(a){(0,r.v)(`[run-job] limit-park comment failed for job ${l.id}`,a)}return c},V=!1,W=async()=>{if(d)try{if(!await n.commitAndPushForHuman(d,`wip: park #${l.issueNumber} for human review`))return;return V=!0,d.branch}catch(a){(0,r.v)(`[run-job] failed to push preserved worktree for job ${l.id}`,a),V=!0;return}},X=async a=>{m.autoDecompose&&bW(m.id,l.issueNumber,e);let b=await W(),c={errorMessage:a.slice(0,500)};return b&&(c.branch=b),(0,C.dk)(l.id,"needs_human",c,e)},Y=b.runBabysitter??((a,b)=>{var c;return bo(a,b,{gh:o,db:e,ciWaitMs:w,mergeGateMs:6e4*m.mergeGateMinutes,mergeWithoutChecks:m.mergeWithoutChecks,sleep:(0,bM.rN)({repoId:m.id,prNumber:b,onNudge:a=>(0,C.yM)(l.id,"status",{reason:`woken by webhook: ${a}`,prNumber:b},e)}),resumeSession:(c={worktrees:n,worktree:()=>d,settled:()=>{let a=(0,C.ax)(l.id,e);return!a||"aborted"===a.status||"interrupted"===a.status},resume:(a,b,c,d)=>(0,ad.n)(a,b,c,d,{db:e,provider:p,command:E.command,runner:E.runner,timeoutMs:v,costCapUsd:x})},async(a,b,d)=>{let e=c.worktree();if(!e)throw Error(`job ${a.id} has no live worktree to resume in`);let f=await c.resume(a,b,d,e.path),g={exitCode:f.exitCode,timedOut:f.timedOut,costExceeded:f.costExceeded,spawnError:f.spawnError,limit:f.limit};if(bf(g))return g;if(c.settled?.())return{...g,settledExternally:!0};try{await c.worktrees.commitAndPush(e,`Fix CI for #${a.issueNumber}`)}catch(a){if(a instanceof ac.RD)return{...g,noChanges:!0};throw a}return g}),autoHeal:m.autoHealCi?{headSha:a=>o.prHeadSha(a),provider:m.platform}:void 0})}),Z=b.verify??((a,b)=>bX({job:a,prNumber:b,repo:m,forge:o,db:e,provider:p,command:s,model:a.model??m.defaultModel}).then(()=>void 0)),$=b.audit??((a,b)=>bJ({job:a,prNumber:b,repo:m,forge:o,db:e}).then(()=>void 0));try{let a,b=l.humanInstruction,g=!!b&&!!l.sessionId&&p.supportsResume,i=!!b&&!!l.branch,k=(0,ac.mL)(l.issueNumber,(0,q.us)(m.id,l.issueNumber,e));if(d=i?await n.prepareResume(m,l.id,l.branch):await n.prepare(m,l.id,l.issueNumber,k),(0,C.yM)(l.id,"worktree",{path:d.path,branch:d.branch},e),z){let a=await D({config:y,worktreePath:d.path,jobId:l.id,agent:p.id,inContainerCommand:p.defaultCommand,preferredRuntime:t.containerRuntime});if(!a.ok)return await X(`Sandbox preflight failed: ${a.reason}`);E.runner=a.session.runner,E.command=a.session.command,(0,C.yM)(l.id,"status",{reason:`sandboxed execution (${y.mode})`},e)}let o=!!l.limitKind&&!!l.sessionId&&p.supportsResume;l.humanInstruction&&e.update(j.jobs).set({humanInstruction:null}).where((0,f.eq)(j.jobs.id,l.id)).run(),l.limitKind&&e.update(j.jobs).set({limitKind:null}).where((0,f.eq)(j.jobs.id,l.id)).run();let v=async a=>{var c,d;let g,h,i=(0,aX.XZ)(m.id,aW._.main,e);e.update(j.jobs).set({implementPromptVersion:i.version}).where((0,f.eq)(j.jobs.id,l.id)).run();let k={title:"",body:""};try{k=await L(l.issueNumber)}catch(a){(0,r.v)(`[run-job] failed to fetch issue #${l.issueNumber} for job ${l.id}`,a)}let n=bY(k.title,500),o=bY(k.body,2e4),p=(0,aX.Xm)(i.content,{ISSUE_NUM:l.issueNumber,BRANCH:a.branch,REPO_NAME:m.name,ISSUE_TITLE:n,ISSUE_BODY:o,PR_FORMAT:(0,aX.yx)(m.id,aW._.prFormat,e)});if(m.autoDecompose){let a=aT(m.id,l.issueNumber,e);a.length>0&&(p+=(c=a.map(a=>({title:a.title,status:a.status})),0===c.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",aS(c)].join("\n")),bV(m.id,l.issueNumber,e))}if(p+=(d=m.agentInstructions,(g=d?.trim())?["\n\n## Repository-specific agent instructions\n\nThe operator of this repository has provided the following instructions. Follow them\nin addition to the task above, unless they conflict with explicit safety constraints:\n",g.slice(0,4e3)].join("\n"):""),b&&(p+=(h=b.trim())?["\n\n## Human guidance\nA human reviewed where this job got stuck and gave the following instruction.\nFollow it to get unblocked:\n",bY(h,4e3)].join("\n"):""),m.planFirst){let b=(0,aX.Xm)((0,aX.yx)(m.id,aW._.plan,e),{ISSUE_NUM:l.issueNumber,BRANCH:a.branch,REPO_NAME:m.name,ISSUE_TITLE:n,ISSUE_BODY:o});try{let c=await H((0,C.ax)(l.id,e),b,a.path),d=c.text.trim();if(0===c.exitCode&&d.length>0){let a;(0,C.yM)(l.id,"status",{reason:"plan stage complete"},e),p+=(a=d.trim())?["\n\n## Implementation plan\nFollow this plan unless the code contradicts it:\n",a.length>1e4?`${a.slice(0,1e4)}
|
|
15
|
+
… (truncated)`:a].join("\n"):"";try{await J(l.issueNumber,`**Implementation plan** (job ${l.id}):
|
|
16
|
+
|
|
17
|
+
${d}`)}catch(a){(0,r.v)(`[run-job] plan comment failed for job ${l.id}`,a)}}else(0,C.yM)(l.id,"status",{reason:"plan stage failed, continuing without a plan",exitCode:c.exitCode},e)}catch(a){(0,r.v)(`[run-job] plan stage failed for job ${l.id}`,a),(0,C.yM)(l.id,"status",{reason:"plan stage failed, continuing without a plan"},e)}}return F((0,C.ax)(l.id,e),p,a.path)};if(g){(0,C.yM)(l.id,"status",{reason:"resuming session with human instruction",sessionId:l.sessionId},e),m.autoDecompose&&bV(m.id,l.issueNumber,e);let c=(0,aX.Xm)((0,aX.yx)(m.id,aW._.humanResume,e),{ISSUE_NUM:l.issueNumber,BRANCH:d.branch,REPO_NAME:m.name,INSTRUCTION:bY(b,4e3),PR_FORMAT:(0,aX.yx)(m.id,aW._.prFormat,e)});a=await T((0,C.ax)(l.id,e),c,d.path)}else if(o){(0,C.yM)(l.id,"status",{reason:"resuming session after provider limit",sessionId:l.sessionId},e),m.autoDecompose&&bV(m.id,l.issueNumber,e);let b=(0,aX.Xm)((0,aX.yx)(m.id,aW._.limitResume,e),{ISSUE_NUM:l.issueNumber,BRANCH:d.branch,REPO_NAME:m.name,PR_FORMAT:(0,aX.yx)(m.id,aW._.prFormat,e)});a=await S((0,C.ax)(l.id,e),b,d.path)}else a=await v(d);let w=(0,C.ax)(l.id,e);if("aborted"===w.status||"interrupted"===w.status)return m.autoDecompose&&bW(m.id,l.issueNumber,e),w;let B=0;for(;a.maxTurnsReached&&(0,A.mt)(e).maxTurnsAutoResume&&a.sessionId&&p.supportsResume&&B<3;){B+=1,(0,C.yM)(l.id,"status",{reason:`turn budget (${l.maxTurns}) reached, resuming`,attempt:B,sessionId:a.sessionId},e),m.autoDecompose&&bV(m.id,l.issueNumber,e);let b=(0,aX.Xm)((0,aX.yx)(m.id,aW._.turnResume,e),{ISSUE_NUM:l.issueNumber,BRANCH:d.branch,REPO_NAME:m.name,PR_FORMAT:(0,aX.yx)(m.id,aW._.prFormat,e)});a=await S((0,C.ax)(l.id,e),b,d.path);let c=(0,C.ax)(l.id,e);if("aborted"===c.status||"interrupted"===c.status)return m.autoDecompose&&bW(m.id,l.issueNumber,e),c}if(a.timedOut)return await X(`${p.label} timed out after ${u} minutes`);if(a.costExceeded)return await X(`per-job cost limit of $${x} reached`);if(a.spawnError)return await X(`failed to start ${s}: ${a.spawnError.message}`);if(a.limit){let b=a.limit;if("auth"===b.kind||"billing"===b.kind){let a="auth"===b.kind?"authentication":"billing";return await X(`${p.label} ${a} error: ${b.rawSnippet}`)}if(!(0,at.$q)(p.id,e))return await X(`${b$(b.kind,b.agent)} (auto-wait is disabled)`);return await U(b)}if(a.maxTurnsReached)return await X(`turn budget (${l.maxTurns}) reached`);if(0!==a.exitCode)return await X(`${p.label} exited non-zero`);(0,at._x)(p.id,e);let I=O(d.path),Q=N(d.path);if(Q){m.autoDecompose&&bW(m.id,l.issueNumber,e);try{await n.commitAndPush(d,`Partial work for #${l.issueNumber} (parked for review)`)}catch(a){if(!(a instanceof ac.RD))throw a}try{await J(l.issueNumber,`🙋 Drydock needs a human decision before continuing on #${l.issueNumber}:
|
|
18
|
+
|
|
19
|
+
${Q}`)}catch(a){(0,r.v)(`[run-job] questions comment failed for job ${l.id}`,a)}try{await P(l.issueNumber)}catch(a){(0,r.v)(`[run-job] needs-human label failed for job ${l.id}`,a)}return(0,C.dk)(l.id,"needs_human",{errorMessage:"agent has open questions",branch:d.branch},e)}if(m.adrGating){let a=(0,aL.Pe)("pending_review",e,m.id);if(a.length>0)return await X(`Blocked by ${a.length} pending ADR review(s).`)}let R=M(d.path),V=R?.title??`Fix #${l.issueNumber}`;try{await n.commitAndPush(d,V)}catch(a){if(a instanceof ac.RD)return await X("Agent produced no changes");throw a}let W=R?.title??(0,q.ts)(m.id,e).find(a=>a.number===l.issueNumber)?.title??`Fix #${l.issueNumber}`,_=await bZ(I,l.id,K,e),aa=`Closes #${l.issueNumber}`,ab=_.length>0?`Spun off: ${_.map(a=>`#${a}`).join(", ")}`:"",ad=[R?.body,aa,ab].filter(Boolean).join("\n\n"),ae=await G({head:d.branch,base:m.defaultBranch,title:W,body:ad});if((0,C.dk)(l.id,"ci_running",{branch:d.branch,prNumber:ae},e),await c("pr_opened",`🔀 PR opened: ${m.id}#${l.issueNumber} (PR #${ae}).`),m.verifyPr)try{await Z((0,C.ax)(l.id,e),ae)}catch(b){let a=b instanceof Error?b.message:String(b);(0,C.yM)(l.id,"error",{message:`verification pass failed: ${a}`},e)}if(m.autoPrAudit)try{await $((0,C.ax)(l.id,e),ae)}catch(b){let a=b instanceof Error?b.message:String(b);(0,C.yM)(l.id,"error",{message:`pr audit failed: ${a}`},e)}let af=await Y((0,C.ax)(l.id,e),ae);return m.autoDecompose&&("merged"===af.status?!function(a,b,c=(0,h.Lf)()){for(let d of aT(a,b,c))!function(a,b){let c=a.status;if("done"!==c&&"skipped"!==c){if("in_progress"===c)return aU(a.id,"done",b);aU(a.id,"in_progress",b),aU(a.id,"done",b)}}(d,c)}(m.id,l.issueNumber,e):bW(m.id,l.issueNumber,e)),af}catch(c){let a=c instanceof Error?c.message:String(c);(0,C.yM)(l.id,"error",{message:a},e);let b=(0,C.ax)(l.id,e);if(["working","ci_running","ci_failed","retrying"].includes(b.status)){m.autoDecompose&&bW(m.id,l.issueNumber,e);let b=await W();try{let c={errorMessage:a.slice(0,500)};return b&&(c.branch=b),(0,C.dk)(l.id,"needs_human",c,e)}catch(b){if(!(b instanceof I.xh))throw b;(0,r.v)(`[run-job] job ${l.id} settled concurrently during failure handling`,b);let a=(0,C.ax)(l.id,e);return"needs_human"!==a.status&&(V=!1),a}}return b}finally{if(d&&!V){if(m.adoptClaudeMem)try{await Q({branch:d.branch,cwd:d.path})}catch(a){(0,r.v)(`[run-job] claude-mem adoption failed for job ${l.id}`,a)}try{await n.remove(d,m.path)}catch(a){(0,r.v)(`[run-job] worktree cleanup failed for job ${l.id}`,a)}}}}var b1=c(35494),b2=c(96356);let b3={active:!1},b4={active:!1},b5={claude:{active:!1},codex:{active:!1},openrouter:{active:!1}};function b6(a,b,c,d,e={}){var f;let i=(0,g.X$)(a.agent),j=(f={provider:i,command:(0,B.m)(i,d),model:a.defaultModel,cwd:a.path,db:d,runner:e.runner},async a=>{let{text:b,exitCode:c,stderr:d}=await aD({provider:f.provider,command:f.command,model:f.model,cwd:f.cwd,prompt:["Break the following GitHub issue into an ordered list of independent subtasks\nthat can each be implemented and reviewed on their own.\n",`Title: ${a.title}`,"",a.body.trim(),"\nRespond with ONLY a JSON array of short subtask title strings, in the order\nthey should be done. If the issue is a single coherent task that should not\nbe split, respond with an empty array []."].join("\n"),repoId:f.repoId,type:"decompose",runner:f.runner,db:f.db});if(0!==c){let a=f.provider.classifyFailure?.({exitCode:c,stderr:d,resultText:b});if(a&&a1.includes(a.kind)){let b=f.db??(0,h.Lf)();if((0,at.$q)(f.provider.id,b))throw(0,at.H_)(a,b),new at.vu(a)}return[]}let e=b.match(/\[[\s\S]*\]/);if(!e)return[];try{let a=JSON.parse(e[0]);if(!Array.isArray(a))return[];return a.filter(a=>"string"==typeof a).map(a=>a.trim()).filter(Boolean)}catch{return[]}});return bU(a,b,c,d,{generate:j})}let b7={color:"d73a4a",description:"Drydock needs a human before automating this issue"},b8=["needs_human","aborted"];async function b9(a,b,c,d,e,g){var h,i;let k=e.some(a=>b.readyLabels.includes(a)),l=e.some(a=>b.blockingLabels.includes(a));return!!k&&!l&&!!(0,s.i)(b,d.authorAssociation)&&(h=a.id,i=d.number,!(g.select().from(j.jobs).where((0,f.Uo)((0,f.eq)(j.jobs.repoId,h),(0,f.eq)(j.jobs.issueNumber,i),(0,f.RV)(j.jobs.status,[...b8]))).all().length>=b.maxAttempts)||(e.includes(a.needsHumanLabel)||(await c.ensureLabel(a.needsHumanLabel,b7),await c.addLabels(d.number,[a.needsHumanLabel])),!1))}async function ca(a,b,c,d,e){if(d.includes(a.needsHumanLabel))return;await b.ensureLabel(a.needsHumanLabel,b7),await b.addLabels(c.number,[a.needsHumanLabel]);let f=e.length>0?e.join("; "):"flagged for human review";await b.commentIssue(c.number,`⏸️ Held for human review before automated work — ${f}. Remove the \`${a.needsHumanLabel}\` label or use "Start now" to proceed.`)}let cb=I.RH.filter(a=>!I.kl.includes(a)),cc=["working","ci_running","ci_failed","retrying","waiting_limit"];async function cd(a,b,c,d){let e="codex"===a?"Codex capacity":"openrouter"===a?"OpenRouter window":"Claude quota";for(let f of(0,C.i1)(["waiting_limit"],d).filter(b=>b.agent===a)){try{(0,C.dk)(f.id,"queued",{availableAt:null,errorMessage:null},d),(0,C.yM)(f.id,"status",{reason:`${a}_limit_cleared`},d)}catch(a){(0,r.v)(`[driver] limit requeue failed for job ${f.id}`,a);continue}let g=b.find(a=>a.id===f.repoId);if(g)try{let a=c.forgeFor?.(g)??(0,k.Ie)(g);await a.commentIssue(f.issueNumber,`▶️ ${e} available again — resuming job #${f.id}.`)}catch(a){(0,r.v)(`[driver] limit-resume comment failed for job ${f.id}`,a)}}}async function ce(a={}){let b=a.db??(0,h.Lf)(),c=a.runJob??b_,e=(0,i.uP)(b),n=a.triage??w,o=a.decompose??b6;for(let c of e)try{await (0,l.v)("low",async()=>{let d=a.forgeFor?.(c)??(0,k.Ie)(c),e=a.fetchIssues??(async(a,b)=>(await d.refreshRateLimit?.(),d.listAllIssues())),g=await e(c.path,c.queueLabel);(0,q.VK)(c.id,g,b);let h=b.select().from(j.issues).where((0,f.eq)(j.issues.repoId,c.id)).all(),i=new Map(h.map(a=>[a.number,a])),l=(0,s.A)(c);if(l.autoTriageEnabled&&await n(c,d,g,b),l.autoDecompose&&!(0,at.nc)(c.agent,b)){let a=g.filter(a=>{let b=a.labels.map(a=>a.name);return b.includes(c.queueLabel)||b.some(a=>l.readyLabels.includes(a))});if(a.length>0)try{await o(c,d,a,b)}catch(a){(0,r.v)(`[driver] decomposition sweep failed for ${c.name}`,a)}}for(let a of g){var m,t;let e=a.labels.map(a=>a.name),g=e.includes(c.queueLabel),h=!!l.autoProcessEnabled&&await b9(c,l,d,a,e,b);if(!g&&!h)continue;let k=p({number:a.number,title:a.title,labels:e});if("blocked"===k.decision)continue;if("needs_review"===k.decision&&!g){await ca(c,d,a,e,k.reasons);continue}if(function(a,b,c){return(0,C.i1)([...cb],a).some(a=>a.repoId===b&&a.issueNumber===c)}(b,c.id,a.number))continue;h&&a.author&&l.priorityAuthors.includes(a.author)&&(m=c.id,t=a.number,b.update(j.issues).set({priority:-1}).where((0,f.Uo)((0,f.eq)(j.issues.repoId,m),(0,f.eq)(j.issues.number,t))).run());let n=i.get(a.number);(0,au.Ix)({repoId:c.id,issueNumber:a.number,model:n?.modelOverride??c.defaultModel,agent:n?.agentOverride??c.agent},b)}})}catch(a){a instanceof m.OE?console.debug(`[driver] ${c.name} sweep yielded: ${a.message}`):(0,r.v)(`[driver] issue sync failed for ${c.name}`,a)}(0,x.PH)("cost_limit"===(0,A.Jf)(b).reason,b3,b),(0,x.mW)((0,Q.DB)(b),b4,b);try{if(function(a=Date.now()){return!aa&&(void 0===d||a-d>=9e5)}()){let c=a.credentialProbe??(a=>ab({db:a}));Promise.resolve(c(b)).catch(a=>(0,r.v)("[driver] credential probe round failed",a))}}catch(a){(0,r.v)("[driver] credential watchdog sweep failed",a)}(0,au.pp)({expiredBefore:Math.floor(Date.now()/1e3)},b);try{let a=(0,b2.reconcileExternalAborts)(b);a.length>0&&console.log(`[driver] aborted ${a.length} externally-aborted job(s)`)}catch(a){(0,r.v)("[driver] external-abort reconcile failed",a)}let t=[];for(let c of g.FD){let d=(0,at.nc)(c,b);if((0,x.RQ)(c,!!d,b5[c],b),d){t.push(c);continue}try{await cd(c,e,a,b)}catch(a){(0,r.v)(`[driver] ${c} limit-parked job resume sweep failed`,a)}}let u=t.length>0?t:void 0,v=(0,A.mt)(b).maxParallelJobs,z=(0,au._$)();for(;!(0,b1.jQ)()&&(0,A.Jf)(b).allowed&&(0,b1.JY)()<v;){let a=e.filter(a=>(0,A.DA)(a.id,b).allowed).filter(a=>!(a.sequential&&function(a,b){return(0,C.i1)([...cc],a).some(a=>a.repoId===b)}(b,a.id))).map(a=>a.id);if(0===a.length)break;let d=(0,au.Ym)({repoIds:a,worker:z,leaseMs:au.sV,excludeAgents:u},b);if(!d)break;let f=d.id,g=d.leaseToken;(0,b1.Pn)(f);let h=setInterval(()=>{try{(0,au.jQ)(f,g,{},b)}catch(a){(0,r.v)(`[driver] heartbeat failed for job ${f}`,a)}},au.m);h.unref?.(),c(f).catch(a=>(0,r.v)(`[driver] job ${f} failed`,a)).finally(()=>{clearInterval(h),(0,au.wL)(f,g,b),(0,b1.i2)(f)})}let B=a.reviewFeedback??(a=>(0,aK.L4)({db:a}));try{await (0,l.v)("low",()=>B(b))}catch(a){(0,r.v)("[driver] review-feedback sweep failed",a)}let D=a.deploymentHealing??(a=>ap({db:a}));try{await (0,l.v)("low",()=>D(b))}catch(a){(0,r.v)("[driver] deployment-healing sweep failed",a)}let E=a.releaseManagement??(a=>aH({db:a}));try{await (0,l.v)("low",()=>E(b))}catch(a){(0,r.v)("[driver] release-management sweep failed",a)}let F=a.branchJanitor??(a=>P({db:a}));try{await (0,l.v)("low",()=>F(b))}catch(a){(0,r.v)("[driver] branch-janitor sweep failed",a)}try{let c=(0,A.mt)(b);if(c.openrouterEnabled&&(0,y.Mf)({db:b,refreshHours:c.openrouterCatalogRefreshHours})){let c=a.openrouterCatalogSync??cg;Promise.resolve(c(b)).catch(a=>(0,r.v)("[driver] openrouter catalog sync failed",a))}}catch(a){(0,r.v)("[driver] openrouter catalog sweep failed",a)}}let cf=!1;async function cg(a){if(!cf){cf=!0;try{let b=(0,A.mt)(a);await (0,y.yd)({db:a,apiKey:(0,z.t)(b)||void 0})}finally{cf=!1}}}let ch=!1,ci=!1,cj=null,ck=null;function cl(){return{running:ch,lastTickAt:cj,intervalMs:ck}}function cm(a={}){if(ch)return;ch=!0;let b=a.tick??(()=>ce()),c=a.intervalMs??1e3*(0,A.mt)().pollIntervalSec;ck=c;let d=async()=>{if(ch){if(!ci){ci=!0,cj=Date.now();try{await b()}catch(a){(0,r.v)("[driver] tick failed",a)}finally{ci=!1}}ch&&(e=setTimeout(d,c))}};d()}function cn(){ch=!1,e&&clearTimeout(e),e=void 0}},93612:(a,b,c)=>{c.d(b,{Sv:()=>f,lw:()=>e,x8:()=>k});var d=c(29980);async function e(a,b=fetch){let c=new AbortController,d=setTimeout(()=>c.abort(),1e4);d.unref?.();try{let d=await b("https://openrouter.ai/api/v1/key",{headers:{Authorization:`Bearer ${a}`},signal:c.signal});if(d.ok)return{ok:!0};let e=(await d.text().catch(()=>"")).slice(0,200);return{ok:!1,error:`OpenRouter HTTP ${d.status}: ${e}`}}catch(a){if(c.signal.aborted)return{ok:!1,error:"OpenRouter key probe timed out after 10000ms"};return{ok:!1,error:a instanceof Error?a.message:String(a)}}finally{clearTimeout(d)}}class f extends Error{constructor(a,b,c){super(`OpenRouter HTTP ${a}: ${b}`),this.status=a,this.body=b,this.retryAfterMs=c,this.name="OpenRouterHttpError"}}let g=d.Ik({index:d.ai(),id:d.Yj().optional(),function:d.Ik({name:d.Yj().optional(),arguments:d.Yj().optional()}).optional()}),h=d.Ik({choices:d.YO(d.Ik({delta:d.Ik({content:d.Yj().nullish(),tool_calls:d.YO(g).optional()}).passthrough().optional(),finish_reason:d.Yj().nullish()})).optional(),usage:d.Ik({prompt_tokens:d.ai().optional(),completion_tokens:d.ai().optional(),cost:d.ai().nullish()}).passthrough().nullish(),error:d.Ik({code:d.KC([d.ai(),d.Yj()]).nullish(),message:d.Yj().optional()}).passthrough().optional()});function i(a){return"assistant"===a.role&&a.toolCalls?.length?{role:"assistant",content:a.content||null,tool_calls:a.toolCalls.map(a=>({id:a.id,type:"function",function:{name:a.name,arguments:a.arguments}}))}:"tool"===a.role?{role:"tool",tool_call_id:a.toolCallId,content:a.content}:{role:a.role,content:a.content}}async function*j(a){let b=a.getReader(),c=new TextDecoder,d="";try{for(;;){let{done:a,value:e}=await b.read();if(a)break;let f=(d+=c.decode(e,{stream:!0})).indexOf("\n");for(;f>=0;)yield d.slice(0,f).replace(/\r$/,""),f=(d=d.slice(f+1)).indexOf("\n")}(d+=c.decode())&&(yield d)}finally{b.releaseLock()}}async function k(a){let b=a.fetchImpl??fetch,c={Authorization:`Bearer ${a.apiKey}`,"Content-Type":"application/json"};a.siteUrl&&(c["HTTP-Referer"]=a.siteUrl),a.appName&&(c["X-Title"]=a.appName);let d={model:a.model,messages:a.messages.map(i),stream:!0,usage:{include:!0}};a.tools?.length&&(d.tools=a.tools.map(a=>({type:"function",function:{name:a.name,description:a.description,parameters:a.parameters}}))),void 0!==a.maxTokens&&(d.max_tokens=a.maxTokens);let e=await b("https://openrouter.ai/api/v1/chat/completions",{method:"POST",headers:c,body:JSON.stringify(d),signal:a.signal});if(!e.ok){let a=(await e.text().catch(()=>"")).slice(0,2e3);throw new f(e.status,a,function(a){if(!a)return;if(/^\d+$/.test(a))return 1e3*Number(a);let b=Date.parse(a);if(Number.isNaN(b))return;let c=b-Date.now();return c>0?c:void 0}(e.headers.get("retry-after")))}if(!e.body)throw new f(e.status,"response had no body");let g="",k=null,l=!1,m={promptTokens:0,completionTokens:0,costUsd:0},n=new Map;for await(let b of j(e.body)){let c;if(!b||b.startsWith(":")||!b.startsWith("data:"))continue;let d=b.slice(5).trim();if("[DONE]"===d){l=!0;break}try{c=h.parse(JSON.parse(d))}catch{continue}if(c.error)throw new f("number"==typeof c.error.code?c.error.code:500,c.error.message??"stream error");let e=c.choices?.[0];for(let b of(e?.delta?.content&&(g+=e.delta.content,a.onTextDelta?.(e.delta.content)),e?.delta?.tool_calls??[])){let a=n.get(b.index)??{id:"",name:"",argumentParts:[]};b.id&&(a.id=b.id),b.function?.name&&(a.name=b.function.name),b.function?.arguments&&a.argumentParts.push(b.function.arguments),n.set(b.index,a)}e?.finish_reason&&(k=e.finish_reason),c.usage&&(m.promptTokens=c.usage.prompt_tokens??m.promptTokens,m.completionTokens=c.usage.completion_tokens??m.completionTokens,m.costUsd=c.usage.cost??m.costUsd)}if(!l&&null===k)throw new f(502,"OpenRouter stream ended before completion");return{text:g,toolCalls:[...n.entries()].sort(([a],[b])=>a-b).map(([,a])=>({id:a.id,name:a.name,arguments:a.argumentParts.join("")})),finishReason:k,usage:m}}},94534:(a,b,c)=>{c.d(b,{g:()=>f});var d=c(31421),e=c(77597);let f=(a,b,c,f)=>{let g,h=(0,d.spawn)(a,b,{cwd:c,env:process.env,detached:e.l9,stdio:["ignore","pipe","pipe"]});h.stdout?.setEncoding("utf8"),h.stderr?.setEncoding("utf8"),h.stdout?.on("data",a=>f.onStdout(a)),h.stderr?.on("data",a=>f.onStderr?.(a));let i=!1,j={done:new Promise(a=>{h.on("close",(b,c)=>{g&&clearTimeout(g),a(b??+!!c)}),h.on("error",b=>{j.spawnError=b,a(1)})}),abort:(a=5e3)=>{i||(i=!0,(0,e.g8)(h,"SIGTERM"),g=setTimeout(()=>(0,e.g8)(h,"SIGKILL"),a),g.unref?.())}};return j}},96356:(a,b,c)=>{c.r(b),c.d(b,{abortAllJobs:()=>H,abortJob:()=>F,clearAbort:()=>E,gracefulShutdown:()=>I,reconcileExternalAborts:()=>G,registerAbort:()=>D,startOrchestrator:()=>J});var d=c(97496),e=c(2025),f=c(84232),g=c(74644),h=c(64537),i=c(75818),j=c(52819),k=c(2412),l=c(9617);let m=["ci_running","ci_failed","retrying"];var n=c(89405),o=c(35494),p=c(73024),q=c(76760),r=c(54304),s=c(77597),t=c(1065),u=c(52479);let v=/^job-(\d+)$/,w=/^fb-(\d+)-/,x=/^dh-(\d+)-/;async function y(a={}){let b=a.db??(0,e.Lf)(),c=a.run??s.Sx,f=function(a){let b=a.select({id:h.jobs.id,status:h.jobs.status}).from(h.jobs).all(),c=new Set;for(let a of b)u.kl.includes(a.status)||c.add(a.id);return c}(b),g=0;for(let a of(0,r.uP)(b)){let e;await c("git",["-C",a.path,"worktree","prune"]).catch(()=>void 0);let j=(0,t._M)(a.name);try{e=(0,p.readdirSync)(j,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name)}catch{continue}for(let k of e){let e=v.exec(k)??w.exec(k)??x.exec(k);if(!e)continue;let l=Number(e[1]);if(f.has(l)||function(a,b){let c=b.select({status:h.jobs.status}).from(h.jobs).where((0,d.eq)(h.jobs.id,a)).get();return void 0!==c&&!u.kl.includes(c.status)}(l,b))continue;let m=(0,q.join)(j,k);await c("git",["-C",a.path,"worktree","remove","--force",m]).catch(()=>void 0);try{(0,p.rmSync)(m,{recursive:!0,force:!0}),g++}catch(a){(0,i.v)(`[worktree-reaper] failed to remove ${m}`,a)}}}return g}let z=!1,A=Symbol.for("drydock.orchestrator.abort-handles"),B=globalThis;B[A]??=new Map;let C=B[A];function D(a,b){C.set(a,b)}function E(a){C.delete(a)}function F(a,b=5e3){let c=C.get(a);return"function"==typeof c&&(c(b),C.delete(a),!0)}function G(a=(0,e.Lf)()){let b=[];for(let c of[...C.keys()])try{(0,k.ax)(c,a)?.status==="aborted"&&F(c)&&b.push(c)}catch(a){(0,i.v)(`[orchestrator] external-abort kill failed for job ${c}`,a)}return b}function H(a=5e3){let b=[...C.keys()];for(let b of C.values())b(a);return C.clear(),b}async function I(){(0,o.IZ)(!0),(0,n.py)(),await (0,j.CZ)().catch(a=>(0,i.v)("[orchestrator] drain notify failed",a)),H(5e3),await (0,o.$J)(8e3);try{let a=(0,e.Lf)();for(let b of a.select().from(h.jobs).where((0,d.RV)(h.jobs.status,["working","ci_running","ci_failed","retrying"])).all())try{(0,k.dk)(b.id,"interrupted",{},a)}catch(a){(0,i.v)(`[orchestrator] shutdown transition failed for job ${b.id}`,a)}}catch(a){(0,i.v)("[orchestrator] shutdown DB update failed",a)}(0,o._1)()}function J(){if(z)return;if(z=!0,!process.env.VITEST)if((0,o.DS)()){(0,o.f1)();try{let{requeued:a,interrupted:b}=function(a=(0,e.Lf)()){return{requeued:(0,l.pp)({},a),interrupted:function(a=(0,e.Lf)()){let b=a.select().from(h.jobs).where((0,d.RV)(h.jobs.status,m)).all();for(let c of b)a.update(h.jobs).set({status:"interrupted"}).where((0,d.eq)(h.jobs.id,c.id)).run(),(0,k.yM)(c.id,"status",{from:c.status,to:"interrupted",reason:"recovery"},a);return b.length}(a)}}();a>0&&console.log(`[orchestrator] requeued ${a} orphaned job(s)`),b>0&&console.log(`[orchestrator] recovered ${b} interrupted job(s)`)}catch(a){(0,i.v)("[orchestrator] recovery failed",a)}y().then(a=>{a>0&&console.log(`[orchestrator] reaped ${a} orphaned worktree(s)`)}).catch(a=>(0,i.v)("[orchestrator] worktree reap failed",a)).finally(()=>{let a,b;(0,n.tn)(),(a=()=>{try{let{jobEventsDeleted:a}=function(a=(0,e.Lf)(),b={}){let c=b.days??(0,g.mt)(a).retentionDays,i=b.vacuum??!0,j=Math.floor((b.now?.getTime()??Date.now())/1e3)-86400*c,k=a.select({id:h.jobs.id}).from(h.jobs).where((0,d.Uo)((0,d.Pe)(h.jobs.finishedAt),(0,d.lt)(h.jobs.finishedAt,j))),l=a.delete(h.jobEvents).where((0,d.RV)(h.jobEvents.jobId,k)).run().changes;return i&&a.run((0,f.ll)`VACUUM`),{jobEventsDeleted:l,vacuumed:i,cutoff:j}}((0,e.Lf)());a>0&&console.log(`[orchestrator] pruned ${a} job event(s)`)}catch(a){(0,i.v)("[orchestrator] prune sweep failed",a)}})(),b=setInterval(a,864e5),b.unref?.()})}else console.warn("[orchestrator] another instance holds the lock; driver loop not started");let a=async a=>{console.log(`[orchestrator] ${a} received, shutting down gracefully`),await I(),process.exit(0)};process.once("SIGINT",a),process.once("SIGTERM",a)}}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";exports.id=50,exports.ids=[50],exports.modules={24652:(a,b,c)=>{c.d(b,{m:()=>e});var d=c(23581);let e=(0,d.createServerReference)("40351ea90748f20b6ea53d3973d2f011d8331ea1fe",d.callServer,void 0,d.findSourceMapURL,"saveTemplateAction")},35264:(a,b,c)=>{c.d(b,{A:()=>d});let d=(0,c(30285).A)("file-text",[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]])},46019:(a,b,c)=>{c.d(b,{EY:()=>h,PS:()=>j,mg:()=>g,vV:()=>i});var d=c(14565),e=c(89642),f=c(24845);async function g(a){let b=(0,f.AI)(a);return(0,e.revalidatePath)("/prompts"),b}async function h(a,b){return(0,f.I7)(a,b),(0,e.revalidatePath)("/prompts"),{content:(0,f.yx)(a,b)}}async function i(a,b){return{content:(0,f.yx)(a,b),versions:(0,f.yO)(a,b).map(a=>({version:a.version,updatedAt:a.updatedAt,content:a.content})),hasRow:!!(0,f.F1)(a,b)}}async function j(a,b,c){let d=(0,f.HF)(a,b,c);return d?{version:d.version,content:d.content,updatedAt:d.updatedAt}:null}(0,c(13897).D)([g,h,i,j]),(0,d.A)(g,"40351ea90748f20b6ea53d3973d2f011d8331ea1fe",null),(0,d.A)(h,"6088db15317c3c87ffee58091f528b3f85324fdc10",null),(0,d.A)(i,"60126324f0952a224a0ab7a0fd69c420f6b2e1e458",null),(0,d.A)(j,"708f3339743f91b1814f6ec7737c0a8b08d4136dde",null)},50059:(a,b,c)=>{c.d(b,{A:()=>d});let d=(0,c(71859).A)("save",[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]])},53550:(a,b,c)=>{c.d(b,{v:()=>e});var d=c(23581);let e=(0,d.createServerReference)("60126324f0952a224a0ab7a0fd69c420f6b2e1e458",d.callServer,void 0,d.findSourceMapURL,"loadTemplateAction")},53985:(a,b,c)=>{c.d(b,{_:()=>d});let d={main:"default",ciFix:"ci-fix",plan:"plan",limitResume:"limit-resume",turnResume:"turn-resume",humanResume:"human-resume",prFormat:"pr-format",release:"release"}},60009:(a,b,c)=>{c.d(b,{I:()=>f});var d=c(27905),e=c(5270);function f({value:a,onChange:b,options:c,size:g="default",disabled:h=!1}){return(0,d.jsx)("div",{className:(0,e.cn)("inline-flex items-center gap-0.5 rounded-lg border border-border bg-secondary/50 p-0.5","sm"===g&&"text-xs"),children:c.map(c=>(0,d.jsx)("button",{type:"button",disabled:h,onClick:()=>b(c.value),className:(0,e.cn)("rounded-md px-2.5 py-1 text-xs font-medium transition-colors focus-ring","disabled:cursor-not-allowed disabled:opacity-50",a===c.value?"bg-card text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:c.label},c.value))})}}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
exports.id=521,exports.ids=[521],exports.modules={2025:(a,b,c)=>{"use strict";let d,e;c.d(b,{Lf:()=>n});var f=c(73024),g=c(76760),h=c(87550),i=c.n(h),j=c(15640),k=c(75818),l=c(64537);let m=/^PRAGMA\s+foreign_keys\s*=/i;function n(){if(e)throw e;if(!d){let a=process.env.DRYDOCK_DB??(0,g.resolve)(process.cwd(),"data/drydock.db");try{d=function(a){":memory:"!==a&&(0,f.mkdirSync)((0,g.dirname)(a),{recursive:!0});let b=new(i())(a);try{return b.pragma("journal_mode = WAL"),b.pragma("foreign_keys = ON"),!function(a){let b,c=process.env.DRYDOCK_MIGRATIONS??(0,g.resolve)(process.cwd(),"drizzle");try{b=(0,f.readdirSync)(c).filter(a=>a.endsWith(".sql")).sort()}catch{return}a.exec("CREATE TABLE IF NOT EXISTS __migrations (name TEXT PRIMARY KEY)");let d=new Set(a.prepare("SELECT name FROM __migrations").all().map(a=>a.name)),e=a.prepare("INSERT INTO __migrations (name) VALUES (?)");for(let h of b){if(d.has(h))continue;let b=(0,f.readFileSync)((0,g.join)(c,h),"utf8");a.pragma("foreign_keys = OFF");try{a.transaction(()=>{for(let c of b.split("--\x3e statement-breakpoint")){let b=c.trim();!b||m.test(b)||a.exec(b)}let c=a.pragma("foreign_key_check");if(c.length>0)throw Error(`migration ${h} would leave ${c.length} foreign key violation(s); rolled back`);e.run(h)})()}finally{a.pragma("foreign_keys = ON")}}}(b),(0,j.f)(b,{schema:l})}catch(a){throw b.close(),a}}(a)}catch(a){throw e=a instanceof Error?a:Error(String(a))}Promise.all([c.e(980),c.e(304),c.e(83),c.e(99)]).then(c.bind(c,96356)).then(a=>a.startOrchestrator()).catch(a=>(0,k.v)("[orchestrator] bootstrap failed",a))}return d}},14543:(a,b,c)=>{"use strict";c.d(b,{f:()=>f});let d="[REDACTED]",e=[/\bgh[pousr]_[A-Za-z0-9]{36,}\b/g,/\bgithub_pat_[A-Za-z0-9_]{50,}\b/g,/\bglpat-[A-Za-z0-9_-]{20,}\b/g,/(Bearer )[A-Za-z0-9._~+/-]+=*/g,/(https?:\/\/)[^\s/@:"\\]+:[^\s/@"\\]+(?=@)/g,/(PRIVATE-TOKEN:\s*)[^\s"\\]+/gi,/(Basic )[A-Za-z0-9+/]+=*/g,/\b(?:AKIA|ASIA|AGPA|AIDA|ANPA|AROA)[0-9A-Z]{16}\b/g,/\bsk-ant-[A-Za-z0-9_-]{20,}\b/g,/\bsk-(?:proj-)?[A-Za-z0-9_-]{20,}\b/g,/\d{8,10}:[A-Za-z0-9_-]{35}\b/g];function f(a){let b=a;for(let a of e)b=b.replace(a,(a,b)=>"string"==typeof b?`${b}${d}`:d);return b}},53759:()=>{},64537:(a,b,c)=>{"use strict";c.r(b),c.d(b,{adrs:()=>n,deploymentHealingSessions:()=>u,followupIssues:()=>o,healingAttempts:()=>r,healingSessions:()=>q,issueSubtasks:()=>t,issues:()=>p,jobEvents:()=>m,jobs:()=>l,oneShotCosts:()=>y,openrouterModels:()=>z,prQuestions:()=>v,promptTemplates:()=>k,releaseRuns:()=>w,repos:()=>j,reviewFeedbackItems:()=>s,settings:()=>x});var d=c(84232),e=c(83387),f=c(31622),g=c(21813),h=c(58382),i=c(96312);let j=(0,e.D)("repos",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),path:(0,g.Qq)("path").notNull(),name:(0,g.Qq)("name").notNull(),defaultBranch:(0,g.Qq)("default_branch").notNull().default("main"),queueLabel:(0,g.Qq)("queue_label").notNull().default("drydock:queue"),workingLabel:(0,g.Qq)("working_label").notNull().default("drydock:working"),needsHumanLabel:(0,g.Qq)("needs_human_label").notNull().default("drydock:needs-human"),defaultModel:(0,g.Qq)("default_model").notNull().default("claude-opus-4-8"),agent:(0,g.Qq)("agent").notNull().default("claude"),platform:(0,g.Qq)("platform").notNull().default("github"),apiBaseUrl:(0,g.Qq)("api_base_url"),apiToken:(0,g.Qq)("api_token"),dailyCostLimitUsd:(0,h.x)("daily_cost_limit_usd").notNull().default(0),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(!0),autoProcessEnabled:(0,f.nd)("auto_process_enabled",{mode:"boolean"}).notNull().default(!0),autoHealCi:(0,f.nd)("auto_heal_ci",{mode:"boolean"}).notNull().default(!0),autoReviewFeedback:(0,f.nd)("auto_review_feedback",{mode:"boolean"}).notNull().default(!0),autoResolveMergeConflicts:(0,f.nd)("auto_resolve_merge_conflicts",{mode:"boolean"}).notNull().default(!0),includeProgressReplies:(0,f.nd)("include_progress_replies",{mode:"boolean"}).notNull().default(!1),autoDecompose:(0,f.nd)("auto_decompose",{mode:"boolean"}).notNull().default(!0),planFirst:(0,f.nd)("plan_first",{mode:"boolean"}).notNull().default(!1),verifyPr:(0,f.nd)("verify_pr",{mode:"boolean"}).notNull().default(!0),autoHealDeployments:(0,f.nd)("auto_heal_deployments",{mode:"boolean"}).notNull().default(!1),deploymentPlatform:(0,g.Qq)("deployment_platform"),trustedReviewers:(0,g.Qq)("trusted_reviewers").notNull().default("[]"),trustedBots:(0,g.Qq)("trusted_bots").notNull().default('["cursor[bot]","coderabbitai[bot]"]'),ignoredBots:(0,g.Qq)("ignored_bots").notNull().default('["dependabot[bot]","github-actions[bot]","codecov[bot]"]'),readyLabels:(0,g.Qq)("ready_labels").notNull().default('["ready","ready-for-agent","ready-to-work"]'),blockingLabels:(0,g.Qq)("blocking_labels").notNull().default('["blocked","question","needs-human","needs-discussion","wontfix","duplicate","invalid"]'),autoLabelWhitelist:(0,g.Qq)("auto_label_whitelist").notNull().default('["bug","enhancement","documentation","ready"]'),priorityAuthors:(0,g.Qq)("priority_authors").notNull().default("[]"),minAuthorAssociation:(0,g.Qq)("min_author_association").notNull().default("approved"),maxAttempts:(0,f.nd)("max_attempts").notNull().default(3),maxJobMinutes:(0,f.nd)("max_job_minutes"),maxCiWaitMinutes:(0,f.nd)("max_ci_wait_minutes"),mergeGateMinutes:(0,f.nd)("merge_gate_minutes").notNull().default(0),mergeWithoutChecks:(0,f.nd)("merge_without_checks",{mode:"boolean"}).notNull().default(!1),maxJobCostUsd:(0,h.x)("max_job_cost_usd"),agentInstructions:(0,g.Qq)("agent_instructions"),releaseEnabled:(0,f.nd)("release_enabled",{mode:"boolean"}).notNull().default(!1),webhookSecret:(0,g.Qq)("webhook_secret"),autoPrAudit:(0,f.nd)("auto_pr_audit",{mode:"boolean"}).notNull().default(!0),prAuditAgent:(0,g.Qq)("pr_audit_agent"),prAuditModel:(0,g.Qq)("pr_audit_model"),prAuditLanguage:(0,g.Qq)("pr_audit_language").notNull().default("en"),prAuditPostOnPr:(0,f.nd)("pr_audit_post_on_pr",{mode:"boolean"}).notNull().default(!1),escalateModelOnRetry:(0,f.nd)("escalate_model_on_retry",{mode:"boolean"}).notNull().default(!1),sandbox:(0,g.Qq)("sandbox").notNull().default("none"),sandboxImage:(0,g.Qq)("sandbox_image"),sandboxAllowNetwork:(0,f.nd)("sandbox_allow_network",{mode:"boolean"}).notNull().default(!1),sandboxCpus:(0,g.Qq)("sandbox_cpus"),sandboxMemory:(0,g.Qq)("sandbox_memory"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),k=(0,e.D)("prompt_templates",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").references(()=>j.id,{onDelete:"cascade"}),name:(0,g.Qq)("name").notNull(),content:(0,g.Qq)("content").notNull(),version:(0,f.nd)("version").notNull().default(1),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)}),l=(0,e.D)("jobs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),kind:(0,g.Qq)("kind").notNull().default("issue"),issueNumber:(0,f.nd)("issue_number").notNull(),status:(0,g.Qq)("status").notNull().default("queued"),branch:(0,g.Qq)("branch"),prNumber:(0,f.nd)("pr_number"),sessionId:(0,g.Qq)("session_id"),agent:(0,g.Qq)("agent").notNull().default("claude"),startedAt:(0,f.nd)("started_at"),finishedAt:(0,f.nd)("finished_at"),model:(0,g.Qq)("model"),implementPromptVersion:(0,f.nd)("implement_prompt_version"),maxTurns:(0,f.nd)("max_turns").notNull().default(40),totalInputTokens:(0,f.nd)("total_input_tokens").notNull().default(0),totalOutputTokens:(0,f.nd)("total_output_tokens").notNull().default(0),costUsd:(0,h.x)("cost_usd").notNull().default(0),ciRetryCount:(0,f.nd)("ci_retry_count").notNull().default(0),errorMessage:(0,g.Qq)("error_message"),limitKind:(0,g.Qq)("limit_kind"),humanInstruction:(0,g.Qq)("human_instruction"),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', 'released', 'aborted')`)})),m=(0,e.D)("job_events",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),ts:(0,f.nd)("ts").notNull().default((0,d.ll)`(unixepoch())`),type:(0,g.Qq)("type").notNull(),payload:(0,g.Qq)("payload").notNull().default("{}")},a=>({jobTsIdx:(0,i.Pe)("job_events_job_ts_idx").on(a.jobId,a.ts)})),n=(0,e.D)("adrs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").references(()=>l.id,{onDelete:"set null"}),repoId:(0,f.nd)("repo_id").references(()=>j.id,{onDelete:"cascade"}),filePath:(0,g.Qq)("file_path").notNull(),title:(0,g.Qq)("title").notNull(),status:(0,g.Qq)("status").notNull().default("pending_review"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),o=(0,e.D)("followup_issues",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").references(()=>l.id,{onDelete:"set null"}),ghIssueNumber:(0,f.nd)("gh_issue_number").notNull(),title:(0,g.Qq)("title").notNull(),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),p=(0,e.D)("issues",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),number:(0,f.nd)("number").notNull(),title:(0,g.Qq)("title").notNull(),labels:(0,g.Qq)("labels").notNull().default("[]"),state:(0,g.Qq)("state").notNull().default("open"),priority:(0,f.nd)("priority").notNull().default(0),triageHash:(0,g.Qq)("triage_hash"),triagedAt:(0,f.nd)("triaged_at"),decomposedHash:(0,g.Qq)("decomposed_hash"),modelOverride:(0,g.Qq)("model_override"),agentOverride:(0,g.Qq)("agent_override"),syncedAt:(0,f.nd)("synced_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoNumberUnique:(0,i.GL)("issues_repo_number_unique").on(a.repoId,a.number),repoPriorityIdx:(0,i.Pe)("issues_repo_priority_idx").on(a.repoId,a.priority)})),q=(0,e.D)("healing_sessions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),headSha:(0,g.Qq)("head_sha").notNull(),status:(0,g.Qq)("status").notNull().default("triaging"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("healing_sessions_job_idx").on(a.jobId),prShaIdx:(0,i.Pe)("healing_sessions_pr_sha_idx").on(a.prNumber,a.headSha)})),r=(0,e.D)("healing_attempts",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),sessionId:(0,f.nd)("session_id").notNull().references(()=>q.id,{onDelete:"cascade"}),fingerprint:(0,g.Qq)("fingerprint").notNull(),category:(0,g.Qq)("category").notNull(),checkName:(0,g.Qq)("check_name").notNull(),status:(0,g.Qq)("status").notNull().default("repairing"),beforeSha:(0,g.Qq)("before_sha"),afterSha:(0,g.Qq)("after_sha"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({sessionIdx:(0,i.Pe)("healing_attempts_session_idx").on(a.sessionId),fingerprintIdx:(0,i.Pe)("healing_attempts_fingerprint_idx").on(a.sessionId,a.fingerprint)})),s=(0,e.D)("review_feedback_items",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),threadId:(0,g.Qq)("thread_id").notNull(),reviewer:(0,g.Qq)("reviewer").notNull(),classification:(0,g.Qq)("classification").notNull(),status:(0,g.Qq)("status").notNull().default("pending"),attempts:(0,f.nd)("attempts").notNull().default(0),detail:(0,g.Qq)("detail"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("review_feedback_job_idx").on(a.jobId),jobThreadUnique:(0,i.GL)("review_feedback_job_thread_unique").on(a.jobId,a.threadId)})),t=(0,e.D)("issue_subtasks",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),issueNumber:(0,f.nd)("issue_number").notNull(),ordinal:(0,f.nd)("ordinal").notNull(),title:(0,g.Qq)("title").notNull(),status:(0,g.Qq)("status").notNull().default("pending"),bodyHash:(0,g.Qq)("body_hash").notNull(),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({issueIdx:(0,i.Pe)("issue_subtasks_issue_idx").on(a.repoId,a.issueNumber),issueOrdinalUnique:(0,i.GL)("issue_subtasks_issue_ordinal_unique").on(a.repoId,a.issueNumber,a.ordinal)})),u=(0,e.D)("deployment_healing_sessions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),platform:(0,g.Qq)("platform").notNull(),commitSha:(0,g.Qq)("commit_sha").notNull(),status:(0,g.Qq)("status").notNull().default("monitoring"),logsExcerpt:(0,g.Qq)("logs_excerpt"),followupPrNumber:(0,f.nd)("followup_pr_number"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("deployment_healing_job_idx").on(a.jobId),jobShaUnique:(0,i.GL)("deployment_healing_job_sha_unique").on(a.jobId,a.commitSha)})),v=(0,e.D)("pr_questions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),question:(0,g.Qq)("question").notNull(),answer:(0,g.Qq)("answer"),status:(0,g.Qq)("status").notNull().default("answering"),errorMessage:(0,g.Qq)("error_message"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("pr_questions_job_idx").on(a.jobId)})),w=(0,e.D)("release_runs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),mode:(0,g.Qq)("mode").notNull().default("auto"),jobId:(0,f.nd)("job_id").references(()=>l.id,{onDelete:"set null"}),triggerPrNumber:(0,f.nd)("trigger_pr_number"),triggerSha:(0,g.Qq)("trigger_sha"),status:(0,g.Qq)("status").notNull().default("detected"),bump:(0,g.Qq)("bump"),fromTag:(0,g.Qq)("from_tag"),tag:(0,g.Qq)("tag"),title:(0,g.Qq)("title"),notes:(0,g.Qq)("notes"),prNumbers:(0,g.Qq)("pr_numbers").notNull().default("[]"),errorMessage:(0,g.Qq)("error_message"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoIdx:(0,i.Pe)("release_runs_repo_idx").on(a.repoId),triggerUnique:(0,i.GL)("release_runs_trigger_unique").on(a.repoId,a.triggerSha).where((0,d.ll)`${a.triggerSha} is not null`)})),x=(0,e.D)("settings",{key:(0,g.Qq)("key").primaryKey(),value:(0,g.Qq)("value").notNull()}),y=(0,e.D)("one_shot_costs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),type:(0,g.Qq)("type").notNull(),costUsd:(0,h.x)("cost_usd").notNull().default(0),inputTokens:(0,f.nd)("input_tokens").notNull().default(0),outputTokens:(0,f.nd)("output_tokens").notNull().default(0),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoIdx:(0,i.Pe)("one_shot_costs_repo_idx").on(a.repoId)})),z=(0,e.D)("openrouter_models",{id:(0,g.Qq)("id").primaryKey(),name:(0,g.Qq)("name").notNull(),description:(0,g.Qq)("description").notNull().default(""),contextLength:(0,f.nd)("context_length").notNull().default(0),promptCostPerToken:(0,h.x)("prompt_cost_per_token").notNull().default(0),completionCostPerToken:(0,h.x)("completion_cost_per_token").notNull().default(0),supportedParameters:(0,g.Qq)("supported_parameters").notNull().default("[]"),expirationDate:(0,f.nd)("expiration_date"),isFree:(0,f.nd)("is_free",{mode:"boolean"}).notNull().default(!1),supportsTools:(0,f.nd)("supports_tools",{mode:"boolean"}).notNull().default(!1),removedAt:(0,f.nd)("removed_at"),syncedAt:(0,f.nd)("synced_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({freeIdx:(0,i.Pe)("openrouter_models_free_idx").on(a.isFree),removedIdx:(0,i.Pe)("openrouter_models_removed_idx").on(a.removedAt)}))},71911:()=>{},75818:(a,b,c)=>{"use strict";c.d(b,{v:()=>f});var d=c(14543);function e(a){if(a instanceof Error)return(0,d.f)(a.stack??`${a.name}: ${a.message}`);if("string"==typeof a)return(0,d.f)(a);try{return(0,d.f)(JSON.stringify(a))}catch{return(0,d.f)(String(a))}}function f(...a){console.error(...a.map(e))}}};
|
|
1
|
+
exports.id=521,exports.ids=[521],exports.modules={2025:(a,b,c)=>{"use strict";let d,e;c.d(b,{Lf:()=>n});var f=c(73024),g=c(76760),h=c(87550),i=c.n(h),j=c(15640),k=c(75818),l=c(64537);let m=/^PRAGMA\s+foreign_keys\s*=/i;function n(){if(e)throw e;if(!d){let a=process.env.DRYDOCK_DB??(0,g.resolve)(process.cwd(),"data/drydock.db");try{d=function(a){":memory:"!==a&&(0,f.mkdirSync)((0,g.dirname)(a),{recursive:!0});let b=new(i())(a);try{return b.pragma("journal_mode = WAL"),b.pragma("foreign_keys = ON"),!function(a){let b,c=process.env.DRYDOCK_MIGRATIONS??(0,g.resolve)(process.cwd(),"drizzle");try{b=(0,f.readdirSync)(c).filter(a=>a.endsWith(".sql")).sort()}catch{return}a.exec("CREATE TABLE IF NOT EXISTS __migrations (name TEXT PRIMARY KEY)");let d=new Set(a.prepare("SELECT name FROM __migrations").all().map(a=>a.name)),e=a.prepare("INSERT INTO __migrations (name) VALUES (?)");for(let h of b){if(d.has(h))continue;let b=(0,f.readFileSync)((0,g.join)(c,h),"utf8");a.pragma("foreign_keys = OFF");try{a.transaction(()=>{for(let c of b.split("--\x3e statement-breakpoint")){let b=c.trim();!b||m.test(b)||a.exec(b)}let c=a.pragma("foreign_key_check");if(c.length>0)throw Error(`migration ${h} would leave ${c.length} foreign key violation(s); rolled back`);e.run(h)})()}finally{a.pragma("foreign_keys = ON")}}}(b),(0,j.f)(b,{schema:l})}catch(a){throw b.close(),a}}(a)}catch(a){throw e=a instanceof Error?a:Error(String(a))}Promise.all([c.e(980),c.e(304),c.e(152),c.e(83),c.e(668),c.e(475)]).then(c.bind(c,96356)).then(a=>a.startOrchestrator()).catch(a=>(0,k.v)("[orchestrator] bootstrap failed",a))}return d}},14543:(a,b,c)=>{"use strict";c.d(b,{f:()=>f});let d="[REDACTED]",e=[/\bgh[pousr]_[A-Za-z0-9]{36,}\b/g,/\bgithub_pat_[A-Za-z0-9_]{50,}\b/g,/\bglpat-[A-Za-z0-9_-]{20,}\b/g,/(Bearer )[A-Za-z0-9._~+/-]+=*/g,/(https?:\/\/)[^\s/@:"\\]+:[^\s/@"\\]+(?=@)/g,/(PRIVATE-TOKEN:\s*)[^\s"\\]+/gi,/(Basic )[A-Za-z0-9+/]+=*/g,/\b(?:AKIA|ASIA|AGPA|AIDA|ANPA|AROA)[0-9A-Z]{16}\b/g,/\bsk-ant-[A-Za-z0-9_-]{20,}\b/g,/\bsk-(?:proj-)?[A-Za-z0-9_-]{20,}\b/g,/\d{8,10}:[A-Za-z0-9_-]{35}\b/g];function f(a){let b=a;for(let a of e)b=b.replace(a,(a,b)=>"string"==typeof b?`${b}${d}`:d);return b}},53759:()=>{},64537:(a,b,c)=>{"use strict";c.r(b),c.d(b,{adrs:()=>n,deploymentHealingSessions:()=>u,followupIssues:()=>o,healingAttempts:()=>r,healingSessions:()=>q,issueSubtasks:()=>t,issues:()=>p,jobEvents:()=>m,jobs:()=>l,oneShotCosts:()=>y,openrouterModels:()=>z,prQuestions:()=>v,promptTemplates:()=>k,releaseRuns:()=>w,repos:()=>j,reviewFeedbackItems:()=>s,settings:()=>x});var d=c(84232),e=c(83387),f=c(31622),g=c(21813),h=c(58382),i=c(96312);let j=(0,e.D)("repos",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),path:(0,g.Qq)("path").notNull(),name:(0,g.Qq)("name").notNull(),defaultBranch:(0,g.Qq)("default_branch").notNull().default("main"),queueLabel:(0,g.Qq)("queue_label").notNull().default("drydock:queue"),workingLabel:(0,g.Qq)("working_label").notNull().default("drydock:working"),needsHumanLabel:(0,g.Qq)("needs_human_label").notNull().default("drydock:needs-human"),defaultModel:(0,g.Qq)("default_model").notNull().default("claude-opus-4-8"),agent:(0,g.Qq)("agent").notNull().default("claude"),platform:(0,g.Qq)("platform").notNull().default("github"),apiBaseUrl:(0,g.Qq)("api_base_url"),apiToken:(0,g.Qq)("api_token"),dailyCostLimitUsd:(0,h.x)("daily_cost_limit_usd").notNull().default(0),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(!0),autoProcessEnabled:(0,f.nd)("auto_process_enabled",{mode:"boolean"}).notNull().default(!0),autoHealCi:(0,f.nd)("auto_heal_ci",{mode:"boolean"}).notNull().default(!0),autoReviewFeedback:(0,f.nd)("auto_review_feedback",{mode:"boolean"}).notNull().default(!0),autoResolveMergeConflicts:(0,f.nd)("auto_resolve_merge_conflicts",{mode:"boolean"}).notNull().default(!0),includeProgressReplies:(0,f.nd)("include_progress_replies",{mode:"boolean"}).notNull().default(!1),autoDecompose:(0,f.nd)("auto_decompose",{mode:"boolean"}).notNull().default(!0),planFirst:(0,f.nd)("plan_first",{mode:"boolean"}).notNull().default(!1),verifyPr:(0,f.nd)("verify_pr",{mode:"boolean"}).notNull().default(!0),autoHealDeployments:(0,f.nd)("auto_heal_deployments",{mode:"boolean"}).notNull().default(!1),deploymentPlatform:(0,g.Qq)("deployment_platform"),trustedReviewers:(0,g.Qq)("trusted_reviewers").notNull().default("[]"),trustedBots:(0,g.Qq)("trusted_bots").notNull().default('["cursor[bot]","coderabbitai[bot]"]'),ignoredBots:(0,g.Qq)("ignored_bots").notNull().default('["dependabot[bot]","github-actions[bot]","codecov[bot]"]'),readyLabels:(0,g.Qq)("ready_labels").notNull().default('["ready","ready-for-agent","ready-to-work"]'),blockingLabels:(0,g.Qq)("blocking_labels").notNull().default('["blocked","question","needs-human","needs-discussion","wontfix","duplicate","invalid"]'),autoLabelWhitelist:(0,g.Qq)("auto_label_whitelist").notNull().default('["bug","enhancement","documentation","ready"]'),priorityAuthors:(0,g.Qq)("priority_authors").notNull().default("[]"),minAuthorAssociation:(0,g.Qq)("min_author_association").notNull().default("approved"),maxAttempts:(0,f.nd)("max_attempts").notNull().default(3),maxJobMinutes:(0,f.nd)("max_job_minutes"),maxCiWaitMinutes:(0,f.nd)("max_ci_wait_minutes"),mergeGateMinutes:(0,f.nd)("merge_gate_minutes").notNull().default(0),mergeWithoutChecks:(0,f.nd)("merge_without_checks",{mode:"boolean"}).notNull().default(!1),maxJobCostUsd:(0,h.x)("max_job_cost_usd"),agentInstructions:(0,g.Qq)("agent_instructions"),releaseEnabled:(0,f.nd)("release_enabled",{mode:"boolean"}).notNull().default(!1),webhookSecret:(0,g.Qq)("webhook_secret"),autoPrAudit:(0,f.nd)("auto_pr_audit",{mode:"boolean"}).notNull().default(!0),prAuditAgent:(0,g.Qq)("pr_audit_agent"),prAuditModel:(0,g.Qq)("pr_audit_model"),prAuditLanguage:(0,g.Qq)("pr_audit_language").notNull().default("en"),prAuditPostOnPr:(0,f.nd)("pr_audit_post_on_pr",{mode:"boolean"}).notNull().default(!1),escalateModelOnRetry:(0,f.nd)("escalate_model_on_retry",{mode:"boolean"}).notNull().default(!1),sandbox:(0,g.Qq)("sandbox").notNull().default("none"),sandboxImage:(0,g.Qq)("sandbox_image"),sandboxAllowNetwork:(0,f.nd)("sandbox_allow_network",{mode:"boolean"}).notNull().default(!1),sandboxCpus:(0,g.Qq)("sandbox_cpus"),sandboxMemory:(0,g.Qq)("sandbox_memory"),adoptClaudeMem:(0,f.nd)("adopt_claude_mem",{mode:"boolean"}).notNull().default(!1),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"}),kind:(0,g.Qq)("kind").notNull().default("issue"),issueNumber:(0,f.nd)("issue_number").notNull(),status:(0,g.Qq)("status").notNull().default("queued"),branch:(0,g.Qq)("branch"),prNumber:(0,f.nd)("pr_number"),sessionId:(0,g.Qq)("session_id"),agent:(0,g.Qq)("agent").notNull().default("claude"),startedAt:(0,f.nd)("started_at"),finishedAt:(0,f.nd)("finished_at"),model:(0,g.Qq)("model"),implementPromptVersion:(0,f.nd)("implement_prompt_version"),maxTurns:(0,f.nd)("max_turns").notNull().default(40),totalInputTokens:(0,f.nd)("total_input_tokens").notNull().default(0),totalOutputTokens:(0,f.nd)("total_output_tokens").notNull().default(0),costUsd:(0,h.x)("cost_usd").notNull().default(0),ciRetryCount:(0,f.nd)("ci_retry_count").notNull().default(0),errorMessage:(0,g.Qq)("error_message"),limitKind:(0,g.Qq)("limit_kind"),humanInstruction:(0,g.Qq)("human_instruction"),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', 'released', 'aborted')`)})),m=(0,e.D)("job_events",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),ts:(0,f.nd)("ts").notNull().default((0,d.ll)`(unixepoch())`),type:(0,g.Qq)("type").notNull(),payload:(0,g.Qq)("payload").notNull().default("{}")},a=>({jobTsIdx:(0,i.Pe)("job_events_job_ts_idx").on(a.jobId,a.ts)})),n=(0,e.D)("adrs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").references(()=>l.id,{onDelete:"set null"}),repoId:(0,f.nd)("repo_id").references(()=>j.id,{onDelete:"cascade"}),filePath:(0,g.Qq)("file_path").notNull(),title:(0,g.Qq)("title").notNull(),status:(0,g.Qq)("status").notNull().default("pending_review"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),o=(0,e.D)("followup_issues",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").references(()=>l.id,{onDelete:"set null"}),ghIssueNumber:(0,f.nd)("gh_issue_number").notNull(),title:(0,g.Qq)("title").notNull(),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)}),p=(0,e.D)("issues",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),number:(0,f.nd)("number").notNull(),title:(0,g.Qq)("title").notNull(),labels:(0,g.Qq)("labels").notNull().default("[]"),state:(0,g.Qq)("state").notNull().default("open"),priority:(0,f.nd)("priority").notNull().default(0),triageHash:(0,g.Qq)("triage_hash"),triagedAt:(0,f.nd)("triaged_at"),decomposedHash:(0,g.Qq)("decomposed_hash"),modelOverride:(0,g.Qq)("model_override"),agentOverride:(0,g.Qq)("agent_override"),syncedAt:(0,f.nd)("synced_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoNumberUnique:(0,i.GL)("issues_repo_number_unique").on(a.repoId,a.number),repoPriorityIdx:(0,i.Pe)("issues_repo_priority_idx").on(a.repoId,a.priority)})),q=(0,e.D)("healing_sessions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),headSha:(0,g.Qq)("head_sha").notNull(),status:(0,g.Qq)("status").notNull().default("triaging"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("healing_sessions_job_idx").on(a.jobId),prShaIdx:(0,i.Pe)("healing_sessions_pr_sha_idx").on(a.prNumber,a.headSha)})),r=(0,e.D)("healing_attempts",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),sessionId:(0,f.nd)("session_id").notNull().references(()=>q.id,{onDelete:"cascade"}),fingerprint:(0,g.Qq)("fingerprint").notNull(),category:(0,g.Qq)("category").notNull(),checkName:(0,g.Qq)("check_name").notNull(),status:(0,g.Qq)("status").notNull().default("repairing"),beforeSha:(0,g.Qq)("before_sha"),afterSha:(0,g.Qq)("after_sha"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({sessionIdx:(0,i.Pe)("healing_attempts_session_idx").on(a.sessionId),fingerprintIdx:(0,i.Pe)("healing_attempts_fingerprint_idx").on(a.sessionId,a.fingerprint)})),s=(0,e.D)("review_feedback_items",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),threadId:(0,g.Qq)("thread_id").notNull(),reviewer:(0,g.Qq)("reviewer").notNull(),classification:(0,g.Qq)("classification").notNull(),status:(0,g.Qq)("status").notNull().default("pending"),attempts:(0,f.nd)("attempts").notNull().default(0),detail:(0,g.Qq)("detail"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("review_feedback_job_idx").on(a.jobId),jobThreadUnique:(0,i.GL)("review_feedback_job_thread_unique").on(a.jobId,a.threadId)})),t=(0,e.D)("issue_subtasks",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),issueNumber:(0,f.nd)("issue_number").notNull(),ordinal:(0,f.nd)("ordinal").notNull(),title:(0,g.Qq)("title").notNull(),status:(0,g.Qq)("status").notNull().default("pending"),bodyHash:(0,g.Qq)("body_hash").notNull(),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({issueIdx:(0,i.Pe)("issue_subtasks_issue_idx").on(a.repoId,a.issueNumber),issueOrdinalUnique:(0,i.GL)("issue_subtasks_issue_ordinal_unique").on(a.repoId,a.issueNumber,a.ordinal)})),u=(0,e.D)("deployment_healing_sessions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),platform:(0,g.Qq)("platform").notNull(),commitSha:(0,g.Qq)("commit_sha").notNull(),status:(0,g.Qq)("status").notNull().default("monitoring"),logsExcerpt:(0,g.Qq)("logs_excerpt"),followupPrNumber:(0,f.nd)("followup_pr_number"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("deployment_healing_job_idx").on(a.jobId),jobShaUnique:(0,i.GL)("deployment_healing_job_sha_unique").on(a.jobId,a.commitSha)})),v=(0,e.D)("pr_questions",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),jobId:(0,f.nd)("job_id").notNull().references(()=>l.id,{onDelete:"cascade"}),prNumber:(0,f.nd)("pr_number").notNull(),question:(0,g.Qq)("question").notNull(),answer:(0,g.Qq)("answer"),status:(0,g.Qq)("status").notNull().default("answering"),errorMessage:(0,g.Qq)("error_message"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({jobIdx:(0,i.Pe)("pr_questions_job_idx").on(a.jobId)})),w=(0,e.D)("release_runs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),mode:(0,g.Qq)("mode").notNull().default("auto"),jobId:(0,f.nd)("job_id").references(()=>l.id,{onDelete:"set null"}),triggerPrNumber:(0,f.nd)("trigger_pr_number"),triggerSha:(0,g.Qq)("trigger_sha"),status:(0,g.Qq)("status").notNull().default("detected"),bump:(0,g.Qq)("bump"),fromTag:(0,g.Qq)("from_tag"),tag:(0,g.Qq)("tag"),title:(0,g.Qq)("title"),notes:(0,g.Qq)("notes"),prNumbers:(0,g.Qq)("pr_numbers").notNull().default("[]"),errorMessage:(0,g.Qq)("error_message"),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`),updatedAt:(0,f.nd)("updated_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoIdx:(0,i.Pe)("release_runs_repo_idx").on(a.repoId),triggerUnique:(0,i.GL)("release_runs_trigger_unique").on(a.repoId,a.triggerSha).where((0,d.ll)`${a.triggerSha} is not null`)})),x=(0,e.D)("settings",{key:(0,g.Qq)("key").primaryKey(),value:(0,g.Qq)("value").notNull()}),y=(0,e.D)("one_shot_costs",{id:(0,f.nd)("id").primaryKey({autoIncrement:!0}),repoId:(0,f.nd)("repo_id").notNull().references(()=>j.id,{onDelete:"cascade"}),type:(0,g.Qq)("type").notNull(),costUsd:(0,h.x)("cost_usd").notNull().default(0),inputTokens:(0,f.nd)("input_tokens").notNull().default(0),outputTokens:(0,f.nd)("output_tokens").notNull().default(0),createdAt:(0,f.nd)("created_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({repoIdx:(0,i.Pe)("one_shot_costs_repo_idx").on(a.repoId)})),z=(0,e.D)("openrouter_models",{id:(0,g.Qq)("id").primaryKey(),name:(0,g.Qq)("name").notNull(),description:(0,g.Qq)("description").notNull().default(""),contextLength:(0,f.nd)("context_length").notNull().default(0),promptCostPerToken:(0,h.x)("prompt_cost_per_token").notNull().default(0),completionCostPerToken:(0,h.x)("completion_cost_per_token").notNull().default(0),supportedParameters:(0,g.Qq)("supported_parameters").notNull().default("[]"),expirationDate:(0,f.nd)("expiration_date"),isFree:(0,f.nd)("is_free",{mode:"boolean"}).notNull().default(!1),supportsTools:(0,f.nd)("supports_tools",{mode:"boolean"}).notNull().default(!1),removedAt:(0,f.nd)("removed_at"),syncedAt:(0,f.nd)("synced_at").notNull().default((0,d.ll)`(unixepoch())`)},a=>({freeIdx:(0,i.Pe)("openrouter_models_free_idx").on(a.isFree),removedIdx:(0,i.Pe)("openrouter_models_removed_idx").on(a.removedAt)}))},71911:()=>{},75818:(a,b,c)=>{"use strict";c.d(b,{v:()=>f});var d=c(14543);function e(a){if(a instanceof Error)return(0,d.f)(a.stack??`${a.name}: ${a.message}`);if("string"==typeof a)return(0,d.f)(a);try{return(0,d.f)(JSON.stringify(a))}catch{return(0,d.f)(String(a))}}function f(...a){console.error(...a.map(e))}}};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
"use strict";exports.id=614,exports.ids=[614],exports.modules={12614:(a,b,c)=>{c.d(b,{runOpenRouterJobSession:()=>F});var d=c(79241),e=c(97095),f=c(51541),g=c(95310),h=c(74929),i=c(92958),j=c(5501),k=c(40900),l=c(
|
|
1
|
+
"use strict";exports.id=614,exports.ids=[614],exports.modules={12614:(a,b,c)=>{c.d(b,{runOpenRouterJobSession:()=>F});var d=c(79241),e=c(97095),f=c(51541),g=c(95310),h=c(74929),i=c(92958),j=c(5501),k=c(40900),l=c(1338),m=c(41575),n=c(29218),o=c(3061),p=c(84637),q=c(52166),r=c(31421),s=c(51455),t=c(76760),u=c.n(t),v=c(67055);let w=[{name:"read_file",description:"Read a UTF-8 text file from the worktree. The path is relative to the repository root. Long files are truncated.",parameters:{type:"object",properties:{path:{type:"string",description:"File path relative to the repository root."}},required:["path"]}},{name:"write_file",description:"Create or overwrite a UTF-8 text file in the worktree, creating parent directories as needed. The path is relative to the repository root.",parameters:{type:"object",properties:{path:{type:"string",description:"File path relative to the repository root."},content:{type:"string",description:"The full new file content."}},required:["path","content"]}},{name:"list_dir",description:"List the entries of a directory in the worktree. Directories are suffixed with '/'. Defaults to the repository root.",parameters:{type:"object",properties:{path:{type:"string",description:"Directory path relative to the repository root (default: '.')."}}}},{name:"run_command",description:"Run a shell command in the worktree (tests, linters, builds, git status — but never commit or push). Returns the exit code with stdout/stderr, truncated when long.",parameters:{type:"object",properties:{command:{type:"string",description:"The shell command to run."},timeout_seconds:{type:"number",description:"Optional timeout in seconds (default 120, max 600)."}},required:["command"]}}],x=v.Ik({path:v.Yj().min(1)}),y=v.Ik({path:v.Yj().min(1),content:v.Yj()}),z=v.Ik({path:v.Yj().min(1).default(".")}),A=v.Ik({command:v.Yj().min(1),timeout_seconds:v.ai().positive().max(600).optional()});function B(a,b){let c=u().resolve(a),d=u().resolve(c,b);if(d!==c&&!d.startsWith(c+u().sep))throw Error(`path escapes the worktree: ${b}`);return d}function C(a,b){return a.length<=b?a:`${a.slice(0,b)}
|
|
2
2
|
… [truncated ${a.length-b} characters]`}let D={PATH:process.env.PATH??"",HOME:process.env.HOME??"",TMPDIR:process.env.TMPDIR,TEMP:process.env.TEMP,TMP:process.env.TMP,LANG:process.env.LANG,NODE_ENV:"production"},E=async(a,b,c)=>{let d;try{d=""===a.arguments.trim()?{}:JSON.parse(a.arguments)}catch{return{content:`malformed JSON arguments for ${a.name}`,isError:!0}}try{switch(a.name){case"read_file":{let{path:a}=x.parse(d),c=await (0,s.readFile)(B(b,a),"utf8");return{content:C(c,48e3),isError:!1}}case"write_file":{let{path:a,content:c}=y.parse(d),e=B(b,a);return await (0,s.mkdir)(u().dirname(e),{recursive:!0}),await (0,s.writeFile)(e,c,"utf8"),{content:`wrote ${c.length} characters to ${a}`,isError:!1}}case"list_dir":{let{path:a}=z.parse(d),c=await (0,s.readdir)(B(b,a),{withFileTypes:!0}),e=c.slice(0,500).map(a=>a.isDirectory()?`${a.name}/`:a.name);return c.length>500&&e.push(`… [${c.length-500} more entries]`),{content:e.join("\n"),isError:!1}}case"run_command":{var e;let{command:a,timeout_seconds:f}=A.parse(d);if(c?.timeoutMs!==void 0&&c.timeoutMs<=0)return{content:"command skipped: session budget exhausted",isError:!0};let g=c?.timeoutMs!==void 0?Math.max(1,Math.ceil(c.timeoutMs/1e3)):1/0,h=Math.min(f??120,g),i=await (e=c?.signal,new Promise(c=>{(0,r.exec)(a,{cwd:b,env:D,timeout:1e3*h,killSignal:"SIGKILL",maxBuffer:8388608,signal:e},(a,b,d)=>{let f=null!==a&&!0===a.killed,g=e?.aborted===!0,h=null===a?0:a.code??1;c({exitCode:"number"==typeof h?h:1,stdout:String(b),stderr:String(d),timedOut:f||g})})})),j=C(`exit code: ${i.exitCode}
|
|
3
3
|
stdout:
|
|
4
4
|
${i.stdout}
|
|
5
5
|
stderr:
|
|
6
6
|
${i.stderr}`,24e3);if(i.timedOut)return{content:`command timed out after ${h}s
|
|
7
|
-
${j}`,isError:!0};return{content:j,isError:0!==i.exitCode}}default:return{content:`unknown tool: ${a.name}`,isError:!0}}}catch(a){return{content:a instanceof Error?a.message:String(a),isError:!0}}};async function F(a,b,c,r={}){let s,t,u=r.db??(0,g.Lf)(),v=r.broker??(0,n.k)(),x=(0,m.mt)(u),y=r.toolExecutor??E,z=(0,h.L8)(a.repoId,u),A=a.model??z?.defaultModel??x.openrouterDefaultModel,B={costUsd:0,inputTokens:0,outputTokens:0,timedOut:!1,costExceeded:!1},C=(0,k.nc)("openrouter",u);if(C)return v.publish(a.id,{type:"error",payload:{stderr:`session not started: OpenRouter is limit-blocked (${C.kind}) until ${new Date(1e3*C.blockedUntil).toISOString()}`}}),{exitCode:-3,...B,limit:{agent:"openrouter",kind:C.kind,resetAt:C.blockedUntil,rawSnippet:C.rawSnippet,latched:!0}};let D=function(a,b,c,d){if(!c.openrouterEnabled)return{message:"OpenRouter backend is disabled — enable it in Settings before use"};if(!(0,q.t)(c))return{message:"no OpenRouter API key configured — set it in Settings or via DRYDOCK_OPENROUTER_API_KEY"};if(!b)return{message:`job ${a.id} has no OpenRouter model — set one on the job, the repo, or settings.openrouterDefaultModel`};let e=(0,o.Hi)(b,d);return e&&(0,o.fj)(e)?e.supportsTools?c.openrouterFreeModelsOnly&&!e.isFree?{message:`OpenRouter model "${b}" is not free and the free-models-only policy is enabled`}:null:{message:`OpenRouter model "${b}" does not support tools — implementation sessions need a tool-capable model`}:{message:`OpenRouter model "${b}" is not in the synced catalog (or no longer available) — refresh the catalog in Settings or pick a different model`}}(a,A,x,u);if(D)return v.publish(a.id,{type:"error",payload:{stderr:D.message}}),{exitCode:1,...B,spawnError:Error(D.message)};r.sideSession||r.additive||("working"!==a.status?(0,j.dk)(a.id,"working",{model:A},u):u.update(i.jobs).set({model:A}).where((0,d.eq)(i.jobs.id,a.id)).run());let G=r.maxTurns??a.maxTurns,H=(0,q.t)(x),I=[{role:"system",content:"You are Drydock's autonomous coding agent working inside a git worktree; all tool paths are relative to the repository root. Make the requested changes by reading and writing files and running commands (tests, linters, builds). Do not commit, push, branch, or open pull requests — the orchestrator handles all git operations after you finish. When the task is complete, reply with a short summary of what you changed."},{role:"user",content:b}],J=r.timeoutMs&&r.timeoutMs>0?Date.now()+r.timeoutMs:1/0,K=new AbortController;(0,l.registerAbort)(a.id,()=>K.abort()),Number.isFinite(J)&&r.timeoutMs&&(s=setTimeout(()=>K.abort(),r.timeoutMs),s.unref?.());let L=r.sideSession||r.additive?u.select().from(i.jobs).where((0,d.eq)(i.jobs.id,a.id)).get()??null:null,M=L?.totalInputTokens??0,N=L?.totalOutputTokens??0,O=L?.costUsd??0,P=0,Q=0,R=0,S=0,T=!1,U=!1;try{let b=0;for(;;){if(J-Date.now()<=0){T=!0,S=-1,v.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${r.timeoutMs}ms`}});break}if(K.signal.aborted){S=1,v.publish(a.id,{type:"error",payload:{stderr:"session aborted"}});break}if(G>0&&b>=G){S=1,v.publish(a.id,{type:"error",payload:{stderr:`OpenRouter session exhausted its ${G}-turn budget`}});break}b+=1;let d=await (0,p.x8)({apiKey:H,model:A,messages:I,tools:w,siteUrl:x.openrouterSiteUrl||void 0,appName:x.openrouterAppName||void 0,fetchImpl:r.fetchImpl,signal:K.signal});Q+=d.usage.promptTokens,R+=d.usage.completionTokens,P+=d.usage.costUsd>0?d.usage.costUsd:(0,o.hz)(A,d.usage.promptTokens,d.usage.completionTokens,u);let e=[];for(let a of(d.text&&e.push({kind:"text",text:d.text}),d.toolCalls)){let b=a.arguments;try{b=JSON.parse(a.arguments)}catch{}e.push({kind:"tool_use",name:a.name,id:a.id,input:b})}if(e.length>0&&v.publish(a.id,{type:"assistant",payload:{chunks:e,costUsd:O+P,inputTokens:M+Q,outputTokens:N+R}}),r.costCapUsd&&r.costCapUsd>0&&P>=r.costCapUsd){U=!0,S=-2,v.publish(a.id,{type:"error",payload:{stderr:`session aborted: per-job cost limit of $${r.costCapUsd} reached`}});break}if("tool_calls"!==d.finishReason||0===d.toolCalls.length)break;for(let b of(I.push({role:"assistant",content:d.text,toolCalls:d.toolCalls}),d.toolCalls)){let d=await y(b,c,{signal:K.signal,timeoutMs:Number.isFinite(J)?Math.max(1,J-Date.now()):void 0});if(K.signal.aborted){I.push({role:"tool",content:"ERROR: session aborted",toolCallId:b.id});break}v.publish(a.id,{type:"user",payload:{chunks:[{kind:"tool_result",toolUseId:b.id,isError:d.isError}]}}),I.push({role:"tool",content:d.isError?`ERROR: ${d.content}`:d.content,toolCallId:b.id})}}}catch(b){K.signal.aborted&&J<=Date.now()?(T=!0,S=-1,v.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${r.timeoutMs}ms`}})):b instanceof p.Sv?(S=1,t=(0,f.t)(b),v.publish(a.id,{type:"error",payload:{stderr:b.message.slice(0,2e3)}})):(S=1,v.publish(a.id,{type:"error",payload:{stderr:b instanceof Error?b.message:String(b)}}))}finally{s&&clearTimeout(s),(0,l.clearAbort)(a.id)}return r.sideSession||r.additive?u.update(i.jobs).set({totalInputTokens:(0,e.ll)`coalesce(${i.jobs.totalInputTokens}, 0) + ${Q}`,totalOutputTokens:(0,e.ll)`coalesce(${i.jobs.totalOutputTokens}, 0) + ${R}`,costUsd:(0,e.ll)`coalesce(${i.jobs.costUsd}, 0) + ${P}`}).where((0,d.eq)(i.jobs.id,a.id)).run():u.update(i.jobs).set({totalInputTokens:Q,totalOutputTokens:R,costUsd:P}).where((0,d.eq)(i.jobs.id,a.id)).run(),{exitCode:S,costUsd:P,inputTokens:Q,outputTokens:R,timedOut:T,costExceeded:U,limit:t}}}};
|
|
7
|
+
${j}`,isError:!0};return{content:j,isError:0!==i.exitCode}}default:return{content:`unknown tool: ${a.name}`,isError:!0}}}catch(a){return{content:a instanceof Error?a.message:String(a),isError:!0}}};async function F(a,b,c,r={}){let s,t,u=r.db??(0,g.Lf)(),v=r.broker??(0,n.k)(),x=(0,m.mt)(u),y=r.toolExecutor??E,z=(0,h.L8)(a.repoId,u),A=a.model??z?.defaultModel??x.openrouterDefaultModel,B={costUsd:0,inputTokens:0,outputTokens:0,timedOut:!1,costExceeded:!1,maxTurnsReached:!1},C=(0,k.nc)("openrouter",u);if(C)return v.publish(a.id,{type:"error",payload:{stderr:`session not started: OpenRouter is limit-blocked (${C.kind}) until ${new Date(1e3*C.blockedUntil).toISOString()}`}}),{exitCode:-3,...B,limit:{agent:"openrouter",kind:C.kind,resetAt:C.blockedUntil,rawSnippet:C.rawSnippet,latched:!0}};let D=function(a,b,c,d){if(!c.openrouterEnabled)return{message:"OpenRouter backend is disabled — enable it in Settings before use"};if(!(0,q.t)(c))return{message:"no OpenRouter API key configured — set it in Settings or via DRYDOCK_OPENROUTER_API_KEY"};if(!b)return{message:`job ${a.id} has no OpenRouter model — set one on the job, the repo, or settings.openrouterDefaultModel`};let e=(0,o.Hi)(b,d);return e&&(0,o.fj)(e)?e.supportsTools?c.openrouterFreeModelsOnly&&!e.isFree?{message:`OpenRouter model "${b}" is not free and the free-models-only policy is enabled`}:null:{message:`OpenRouter model "${b}" does not support tools — implementation sessions need a tool-capable model`}:{message:`OpenRouter model "${b}" is not in the synced catalog (or no longer available) — refresh the catalog in Settings or pick a different model`}}(a,A,x,u);if(D)return v.publish(a.id,{type:"error",payload:{stderr:D.message}}),{exitCode:1,...B,spawnError:Error(D.message)};r.sideSession||r.additive||("working"!==a.status?(0,j.dk)(a.id,"working",{model:A},u):u.update(i.jobs).set({model:A}).where((0,d.eq)(i.jobs.id,a.id)).run());let G=r.maxTurns??a.maxTurns,H=(0,q.t)(x),I=[{role:"system",content:"You are Drydock's autonomous coding agent working inside a git worktree; all tool paths are relative to the repository root. Make the requested changes by reading and writing files and running commands (tests, linters, builds). Do not commit, push, branch, or open pull requests — the orchestrator handles all git operations after you finish. When the task is complete, reply with a short summary of what you changed."},{role:"user",content:b}],J=r.timeoutMs&&r.timeoutMs>0?Date.now()+r.timeoutMs:1/0,K=new AbortController;(0,l.registerAbort)(a.id,()=>K.abort()),Number.isFinite(J)&&r.timeoutMs&&(s=setTimeout(()=>K.abort(),r.timeoutMs),s.unref?.());let L=r.sideSession||r.additive?u.select().from(i.jobs).where((0,d.eq)(i.jobs.id,a.id)).get()??null:null,M=L?.totalInputTokens??0,N=L?.totalOutputTokens??0,O=L?.costUsd??0,P=0,Q=0,R=0,S=0,T=!1,U=!1;try{let b=0;for(;;){if(J-Date.now()<=0){T=!0,S=-1,v.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${r.timeoutMs}ms`}});break}if(K.signal.aborted){S=1,v.publish(a.id,{type:"error",payload:{stderr:"session aborted"}});break}if(G>0&&b>=G){S=1,v.publish(a.id,{type:"error",payload:{stderr:`OpenRouter session exhausted its ${G}-turn budget`}});break}b+=1;let d=await (0,p.x8)({apiKey:H,model:A,messages:I,tools:w,siteUrl:x.openrouterSiteUrl||void 0,appName:x.openrouterAppName||void 0,fetchImpl:r.fetchImpl,signal:K.signal});Q+=d.usage.promptTokens,R+=d.usage.completionTokens,P+=d.usage.costUsd>0?d.usage.costUsd:(0,o.hz)(A,d.usage.promptTokens,d.usage.completionTokens,u);let e=[];for(let a of(d.text&&e.push({kind:"text",text:d.text}),d.toolCalls)){let b=a.arguments;try{b=JSON.parse(a.arguments)}catch{}e.push({kind:"tool_use",name:a.name,id:a.id,input:b})}if(e.length>0&&v.publish(a.id,{type:"assistant",payload:{chunks:e,costUsd:O+P,inputTokens:M+Q,outputTokens:N+R}}),r.costCapUsd&&r.costCapUsd>0&&P>=r.costCapUsd){U=!0,S=-2,v.publish(a.id,{type:"error",payload:{stderr:`session aborted: per-job cost limit of $${r.costCapUsd} reached`}});break}if("tool_calls"!==d.finishReason||0===d.toolCalls.length)break;for(let b of(I.push({role:"assistant",content:d.text,toolCalls:d.toolCalls}),d.toolCalls)){let d=await y(b,c,{signal:K.signal,timeoutMs:Number.isFinite(J)?Math.max(1,J-Date.now()):void 0});if(K.signal.aborted){I.push({role:"tool",content:"ERROR: session aborted",toolCallId:b.id});break}v.publish(a.id,{type:"user",payload:{chunks:[{kind:"tool_result",toolUseId:b.id,isError:d.isError}]}}),I.push({role:"tool",content:d.isError?`ERROR: ${d.content}`:d.content,toolCallId:b.id})}}}catch(b){K.signal.aborted&&J<=Date.now()?(T=!0,S=-1,v.publish(a.id,{type:"error",payload:{stderr:`session timed out after ${r.timeoutMs}ms`}})):b instanceof p.Sv?(S=1,t=(0,f.t)(b),v.publish(a.id,{type:"error",payload:{stderr:b.message.slice(0,2e3)}})):(S=1,v.publish(a.id,{type:"error",payload:{stderr:b instanceof Error?b.message:String(b)}}))}finally{s&&clearTimeout(s),(0,l.clearAbort)(a.id)}return r.sideSession||r.additive?u.update(i.jobs).set({totalInputTokens:(0,e.ll)`coalesce(${i.jobs.totalInputTokens}, 0) + ${Q}`,totalOutputTokens:(0,e.ll)`coalesce(${i.jobs.totalOutputTokens}, 0) + ${R}`,costUsd:(0,e.ll)`coalesce(${i.jobs.costUsd}, 0) + ${P}`}).where((0,d.eq)(i.jobs.id,a.id)).run():u.update(i.jobs).set({totalInputTokens:Q,totalOutputTokens:R,costUsd:P}).where((0,d.eq)(i.jobs.id,a.id)).run(),{exitCode:S,costUsd:P,inputTokens:Q,outputTokens:R,timedOut:T,costExceeded:U,maxTurnsReached:!1,limit:t}}}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";exports.id=668,exports.ids=[668],exports.modules={26287:(a,b,c)=>{c.d(b,{E:()=>e,_:()=>d});let d={main:"default",ciFix:"ci-fix",plan:"plan",limitResume:"limit-resume",turnResume:"turn-resume",humanResume:"human-resume",prFormat:"pr-format",release:"release"},e={default:'You are a senior engineer working on GitHub issue #$ISSUE_NUM in the\nrepository "$REPO_NAME". You are on branch "$BRANCH". Implement the change the\nissue asks for to a professional, production-ready standard.\n\nIssue title: $ISSUE_TITLE\n\nIssue body:\n$ISSUE_BODY\n\nRead the context before you change anything. Skim the repo\'s `CLAUDE.md`,\n`AGENTS.md`, and `README` (whichever exist), the code next to what you are\ntouching, and any similar existing implementation. Match the surrounding\ncode\'s conventions — its naming, structure, error handling, and test style —\nrather than imposing your own.\n\nWork test-first. Write a failing test that captures the requirement, then\nimplement the minimal code to make it green, then refactor while it stays\ngreen. For a bug, first add a test that reproduces it (red), then fix it.\nCover the happy path, the edge cases, and the error cases. Never weaken,\ndisable, or delete a test to make the suite pass.\n\nUpdate the docs when behaviour, APIs, or configuration change — but only when\nthere is something to update, and following the repo\'s existing docs\nconventions. Do not churn docs gratuitously.\n\nVerify before you finish. Run the repo\'s tests, typecheck, lint, and build,\nand do not finish on a red signal: fix what you broke. If a check is genuinely\nblocked by something only a human can decide, use the `.drydock/QUESTIONS.md`\nchannel below rather than leaving the change broken.\n\nKeep the change minimal and reversible, and scoped to the issue. Never weaken\nauthentication, security, or tests to make something pass; if the issue seems\nto require that, stop and ask via `.drydock/QUESTIONS.md`.\n\nKeep the change focused. Split your work into focused, thematic commits as\nyou go: group changes by concern and give each commit a clear Conventional\nCommit subject (`type(scope): summary`). Do not dump everything into one\nmega-commit. Never add AI attribution to a commit: no `Co-Authored-By` trailer\nnaming an assistant, no `Generated with Claude Code` line, and no mention of\nthe tool or model anywhere in the message. Do not push or open a pull request\nyourself; Drydock pushes the branch and opens the PR, committing any changes\nyou leave uncommitted.\n\nBefore you finish, write a file `.drydock/PR.md` describing the change for the\npull request. The first line is a Conventional Commit subject (used as the\ncommit message and PR title), then a blank line, then a body in this format:\n\n$PR_FORMAT\n\nDrydock reads this file, appends `Closes #$ISSUE_NUM` to the body, and removes\nthe file — do not commit it.\n\nIf — and only if — you hit a decision that a human must make and you genuinely\ncannot proceed, write your open questions to `.drydock/QUESTIONS.md` instead of\nguessing. Commit any partial, safe work first; do not commit that file. Drydock\nthen preserves your branch, hands the questions to a human, and parks the job\ninstead of opening a PR. Use this only for true blockers — not for routine\nchoices you can reasonably make yourself.\n\nWhenever you consciously leave something out of scope ("this should be a\nseparate issue / follow-up / different PR"), append a follow-up to\n`.drydock/FOLLOWUPS.md` instead of only noting it in the PR. Use a `## ` heading\nper item: the heading is a clear Conventional-style issue title, and the lines\nbelow it are the body — context, rationale, and acceptance criteria. Drydock\nopens a real issue for each, links them from the PR, and removes the file — do\nnot commit it.',"ci-fix":"CI failed. Diagnose the root cause from the log below and fix it at the\nsource — keep the change minimal and focused on the failure. Re-run the\nrelevant check (tests, typecheck, lint, or build) to confirm it is green\nbefore finishing. Do not delete, skip, weaken, or disable tests, and do not\nloosen types or lint rules just to silence the failure.\n\nFailed CI log:\n$CI_LOG",plan:'You are working on GitHub issue #$ISSUE_NUM in the repository "$REPO_NAME".\n\nIssue title: $ISSUE_TITLE\n\nIssue body:\n$ISSUE_BODY\n\nDo not change any files. First read the repo\'s conventions (`CLAUDE.md`/\n`AGENTS.md` if present) and the existing patterns near the code you would\ntouch. Then produce a concise, step-by-step implementation plan for the issue:\nthe files to touch, the change in each, the order to make them, the tests to\nwrite first (test-driven), and how to verify the result (tests, typecheck,\nlint, build). Reply with the plan only — no preamble.',"limit-resume":'Your previous session on issue #$ISSUE_NUM in "$REPO_NAME" was interrupted by a usage limit.\nYou are resuming in a fresh checkout of branch "$BRANCH"; any uncommitted changes from the\ninterrupted session are gone. Re-apply whatever is missing and finish implementing the issue.\nFollow the repo\'s conventions (`CLAUDE.md`/`AGENTS.md`, neighbouring code) and keep working\ntest-first: a failing test that captures the requirement, then the code to make it green.\nBefore you finish, verify: run the repo\'s tests, typecheck, lint, and build, and do not\nfinish on a red signal. Never weaken or delete a test to make the suite pass.\nKeep the change focused. Split your work into focused, thematic commits, each with a clear\nConventional Commit subject (`type(scope): summary`) grouped by concern — not one mega-commit.\nNever add AI attribution to a commit: no `Co-Authored-By` trailer naming an assistant, no\n`Generated with Claude Code` line, and no mention of the tool or model in the message.\nDo not push or open a pull request yourself; Drydock pushes and opens the PR, committing\nanything you leave uncommitted.\nBefore finishing, write `.drydock/PR.md`: first line a Conventional Commit subject (used as\nthe commit message and PR title), then a blank line, then a body in this format:\n\n$PR_FORMAT\n\nDrydock appends `Closes #$ISSUE_NUM` and removes the file — do not commit it.',"turn-resume":'Your previous session on issue #$ISSUE_NUM in "$REPO_NAME" was paused because it reached its\nturn budget. You are resuming on branch "$BRANCH" with your conversation context and any\nuncommitted edits from the interrupted session still in place — just continue from where you\nleft off and finish implementing the issue. Follow the repo\'s conventions (`CLAUDE.md`/\n`AGENTS.md`, neighbouring code) and keep working test-first: a failing test that captures the\nrequirement, then the code to make it green. Before you finish, verify: run the repo\'s tests,\ntypecheck, lint, and build, and do not finish on a red signal. Never weaken or delete a test\nto make the suite pass. Keep the change focused. Split your work into focused, thematic\ncommits, each with a clear Conventional Commit subject (`type(scope): summary`) grouped by\nconcern — not one mega-commit. Never add AI attribution to a commit: no `Co-Authored-By`\ntrailer naming an assistant, no `Generated with Claude Code` line, and no mention of the tool\nor model in the message. Do not push or open a pull request yourself; Drydock pushes and opens\nthe PR, committing anything you leave uncommitted.\nBefore finishing, write `.drydock/PR.md`: first line a Conventional Commit subject (used as\nthe commit message and PR title), then a blank line, then a body in this format:\n\n$PR_FORMAT\n\nDrydock appends `Closes #$ISSUE_NUM` and removes the file — do not commit it.',"human-resume":'Your previous session on issue #$ISSUE_NUM in "$REPO_NAME" was paused for a human to review.\nA human has looked at where you got stuck and given you this instruction:\n\n$INSTRUCTION\n\nYou are resuming on branch "$BRANCH" with your prior commits intact. Follow the instruction\nabove to get unblocked and finish implementing the issue. Keep the change focused. You may\ncommit your work or leave it uncommitted — either is fine. Do not push or open a pull request\nyourself; Drydock commits, pushes, and opens the PR.\nBefore finishing, write `.drydock/PR.md`: first line a Conventional Commit subject (used as\nthe commit message and PR title), then a blank line, then a body in this format:\n\n$PR_FORMAT\n\nDrydock appends `Closes #$ISSUE_NUM` and removes the file — do not commit it.',release:'You are cutting a release for the repository "$REPO_NAME". You are in a clean\ncheckout on the throwaway branch "$BRANCH" (cut from "$DEFAULT_BRANCH"). You have\nfull shell access: git, gh, and the repo\'s tooling are available and already\nauthenticated. Whatever you do not push or trigger yourself is discarded.\n\nGoal: discover how THIS repository releases and perform that release end-to-end.\n\n1. Investigate the release mechanism. Read the CI workflows (.github/workflows),\n package.json scripts, release-please / changesets / semantic-release config,\n CHANGELOG, and the prior tags (`git tag`, `gh release list`). Determine how a\n release is normally cut here — e.g. a release-please `workflow_dispatch`, an\n `npm publish`, a tag + GitHub Release, or a changelog + tag convention.\n2. Determine the correct next version from the conventional-commit history and\n the existing tags. Do not guess a magnitude you cannot justify.\n3. Perform the release the way the repo expects: trigger the workflow, push the\n tag, open the release PR, or run the publish — using gh/git/the repo\'s own\n scripts. Prefer the repo\'s established path over inventing a new one.\n4. Verify the release actually started or completed (the workflow run, the tag,\n the GitHub Release, or the published package) before you finish. If\n verification shows the release failed or is incomplete, explain what went\n wrong in `.drydock/QUESTIONS.md` and stop rather than reporting success.\n\nWhen done, write a short `.drydock/RELEASE.md` in either form: start with a\n`Tag: <tag>` line (e.g. `Tag: v1.4.0`) followed by the release title, OR make the\nfirst line a version-looking title (e.g. `v1.4.0`) that doubles as the tag. Then a\nblank line, then notes on what you did. Do not commit this file — Drydock reads it\nto record the run, then removes it.\n\nIf — and only if — you are unsure how this repo releases, what version to cut, or\nwhether it is safe to proceed, do NOT guess: write your open questions to\n`.drydock/QUESTIONS.md` and stop without releasing. Drydock hands them to a human\nand parks the run. A botched release is far worse than a deferred one.',"pr-format":'A one-paragraph **TL;DR** summarising the change in plain language, then:\n\n## Problem\nWhat was wrong or missing, and why it mattered.\n\n## Solution\nWhat you changed and the key decisions behind it.\n\n## Tests\nWhat you added or ran to verify the change.\n\n## Risks\nAnything reviewers should watch for, or "None".'}},29668:(a,b,c)=>{c.d(b,{F1:()=>l,yO:()=>o,Xm:()=>k,XZ:()=>m,yx:()=>n});var d=c(97496),e=c(14694),f=c(29980),g=c(2025),h=c(64537),i=c(26287);let j=["$ISSUE_NUM","$ISSUE_TITLE","$ISSUE_BODY","$BRANCH","$REPO_NAME","$CI_LOG","$PR_FORMAT","$INSTRUCTION","$DEFAULT_BRANCH"];function k(a,b){let c={$ISSUE_NUM:void 0!==b.ISSUE_NUM?String(b.ISSUE_NUM):"$ISSUE_NUM",$ISSUE_TITLE:b.ISSUE_TITLE??"$ISSUE_TITLE",$ISSUE_BODY:b.ISSUE_BODY??"$ISSUE_BODY",$BRANCH:b.BRANCH??"$BRANCH",$REPO_NAME:b.REPO_NAME??"$REPO_NAME",$CI_LOG:b.CI_LOG??"$CI_LOG",$PR_FORMAT:b.PR_FORMAT??"$PR_FORMAT",$INSTRUCTION:b.INSTRUCTION??"$INSTRUCTION",$DEFAULT_BRANCH:b.DEFAULT_BRANCH??"$DEFAULT_BRANCH"},d=a;for(let a of[...j].sort((a,b)=>b.length-a.length))d=d.split(a).join(c[a]??a);return d}function l(a,b,c=(0,g.Lf)()){return c.select().from(h.promptTemplates).where((0,d.Uo)((0,d.eq)(h.promptTemplates.repoId,a),(0,d.eq)(h.promptTemplates.name,b))).orderBy((0,e.i)(h.promptTemplates.version)).get()}function m(a,b,c=(0,g.Lf)()){let d=l(a,b,c);return d?{content:d.content,version:d.version}:{content:i.E[b]??"",version:null}}function n(a,b,c=(0,g.Lf)()){return m(a,b,c).content}function o(a,b,c=(0,g.Lf)()){return c.select().from(h.promptTemplates).where((0,d.Uo)((0,d.eq)(h.promptTemplates.repoId,a),(0,d.eq)(h.promptTemplates.name,b))).orderBy((0,e.i)(h.promptTemplates.version)).all()}f.Ik({repoId:f.ai().int().positive(),name:f.Yj().min(1),content:f.Yj()})}};
|