@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1149],{297:(e,t,s)=>{"use strict";s.d(t,{m:()=>n});var a=s(5097);let n=(0,a.createServerReference)("40351ea90748f20b6ea53d3973d2f011d8331ea1fe",a.callServer,void 0,a.findSourceMapURL,"saveTemplateAction")},663:(e,t,s)=>{"use strict";s.d(t,{RepoWebhookPanel:()=>m});var a=s(515),n=s(8493),r=s(1171),l=s(6644),i=s(395),o=s(7217),d=s(7405),c=s(8479),u=s(4183);function m({repo:e}){let[t,s]=(0,r.useState)(e.webhookSecret??""),[h,p]=(0,r.useState)(!1),[x,g]=(0,r.useState)(`/api/webhooks/${e.id}`),[f,b]=(0,r.useTransition)(),[v,j]=(0,r.useState)(!1),{error:y}=(0,c.d)();(0,r.useEffect)(()=>{g(`${window.location.origin}/api/webhooks/${e.id}`)},[e.id]);let w=(e.webhookSecret??"").length>0,N="gitlab"===e.platform;function S(t){j(!1),b(async()=>{try{await (0,u.u)(e.id,{webhookSecret:t.trim()||null}),j(!0),setTimeout(()=>j(!1),1500)}catch(e){y("Failed to update webhook",e instanceof Error?e.message:String(e))}})}return(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,a.jsxs)("h3",{className:"flex items-center gap-2 text-sm font-semibold",children:[(0,a.jsx)(n.A,{className:"h-3.5 w-3.5 text-muted-foreground"})," Webhook sync"]}),(0,a.jsx)(l.E,{tone:w?"success":"neutral",children:w?"On":"Off"}),f&&(0,a.jsx)("span",{className:"text-xs text-muted-foreground",children:"Saving…"}),v&&(0,a.jsx)("span",{className:"text-xs text-success",children:"Saved"})]}),(0,a.jsx)(o.D,{label:"Shared secret",htmlFor:"webhook-secret",children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(d.p,{id:"webhook-secret",type:h?"text":"password",value:t,onChange:e=>s(e.target.value),onBlur:()=>{(t.trim()||null)!==(e.webhookSecret??null)&&S(t)},placeholder:"Set a secret to enable webhook delivery",className:"min-w-0 flex-1 font-mono"}),(0,a.jsx)(i.$,{type:"button",variant:"outline",size:"sm",onClick:()=>p(e=>!e),children:h?"Hide":"Show"}),(0,a.jsx)(i.$,{type:"button",variant:"outline",size:"sm",onClick:()=>{let e,t=(e=new Uint8Array(20),crypto.getRandomValues(e),Array.from(e,e=>e.toString(16).padStart(2,"0")).join(""));s(t),p(!0),S(t)},children:"Generate"}),w&&(0,a.jsx)(i.$,{type:"button",variant:"destructive",size:"sm",onClick:()=>{s(""),S("")},children:"Disable"})]})}),(0,a.jsx)(o.D,{label:"Payload URL",htmlFor:"webhook-url",children:(0,a.jsx)(d.p,{id:"webhook-url",readOnly:!0,value:x,onFocus:e=>e.currentTarget.select(),className:"font-mono text-xs"})}),(0,a.jsxs)("p",{className:"text-xs leading-relaxed text-muted-foreground",children:["Opt-in. Polling stays on as the default and continues unchanged whether or not webhooks are configured — the two paths share the same idempotent sync, so a change is never double-processed. Point a ",N?"GitLab":"GitHub"," webhook for"," ",(0,a.jsx)("em",{children:N?"issues, comments and pipelines":"Issues, Issue comments, Check suites, Check runs, Pull request reviews and Pull request review comments"})," ","at the payload URL above with"," ",N?(0,a.jsxs)(a.Fragment,{children:["this secret as the ",(0,a.jsx)("code",{className:"font-mono",children:"Secret token"})]}):(0,a.jsxs)(a.Fragment,{children:["this secret and content type ",(0,a.jsx)("code",{className:"font-mono",children:"application/json"})]}),". Issue events drive the sync. Finished check",N?" (pipeline)":""," events wake the CI babysitter, and review events trigger the review-feedback sweep, so merges and feedback land within seconds instead of at the next poll. Drydock binds"," ",(0,a.jsx)("code",{className:"font-mono",children:"127.0.0.1"}),", so expose the URL through a tunnel or forwarder (e.g. ",(0,a.jsx)("code",{className:"font-mono",children:"cloudflared"}),","," ",(0,a.jsx)("code",{className:"font-mono",children:"ngrok"}),") to receive deliveries. Each delivery is"," ",N?"token-verified":"HMAC-SHA256 signature-verified","; invalid or unsigned payloads are rejected."]})]})}},1024:(e,t,s)=>{"use strict";s.d(t,{Section:()=>o});var a=s(515),n=s(3798),r=s(1171),l=s(5832);let i={neutral:"bg-secondary text-muted-foreground",primary:"bg-primary/10 text-primary",success:"bg-success-muted text-success",warning:"bg-warning-muted text-warning",destructive:"bg-destructive/10 text-destructive"};function o({icon:e,title:t,description:s,defaultOpen:d=!0,right:c,collapsible:u=!0,children:m,tone:h="neutral",id:p}){let[x,g]=(0,r.useState)(d),f=(0,r.useId)(),b=()=>g(e=>!e),v=e&&(0,a.jsx)("span",{className:(0,l.cn)("flex h-8 w-8 shrink-0 items-center justify-center rounded-lg",i[h]),children:e}),j=(0,a.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,a.jsx)("h2",{className:"text-base font-semibold tracking-tight",children:t}),s&&(0,a.jsx)("p",{className:"text-sm text-muted-foreground",children:s})]});return(0,a.jsxs)("section",{id:p,className:"rounded-xl border border-card-border bg-card shadow-sm",children:[(0,a.jsxs)("div",{className:(0,l.cn)("flex items-center gap-3 p-4",!x&&"rounded-b-xl"),children:[u?(0,a.jsxs)("button",{type:"button",onClick:b,"aria-expanded":x,"aria-controls":f,className:"-m-1.5 flex min-w-0 flex-1 items-center gap-3 rounded-lg p-1.5 text-left hover-elevate focus-ring",children:[v,j]}):(0,a.jsxs)(a.Fragment,{children:[v,j]}),c&&(0,a.jsx)("div",{className:"flex items-center gap-2",children:c}),u&&(0,a.jsx)("button",{type:"button",onClick:b,"aria-label":x?"Collapse section":"Expand section","aria-expanded":x,"aria-controls":f,className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted-foreground hover-elevate focus-ring",children:(0,a.jsx)(n.A,{className:(0,l.cn)("h-[18px] w-[18px] transition-transform duration-200",x&&"rotate-180")})})]}),x&&(0,a.jsx)("div",{id:f,className:"dd-fade-up border-t border-card-border p-4 sm:p-5",children:m})]})}},1080:(e,t,s)=>{"use strict";s.d(t,{RepoPromptsSection:()=>C});var a=s(515),n=s(6188),r=s(8652),l=s(5595),i=s(592),o=s(6512),d=s(3164),c=s(742),u=s.n(c),m=s(1171),h=s(4783),p=s(6644),x=s(395),g=s(5897),f=s(9),b=s(8479),v=s(6615),j=s(297),y=s(5097);let w=(0,y.createServerReference)("6088db15317c3c87ffee58091f528b3f85324fdc10",y.callServer,void 0,y.findSourceMapURL,"deleteTemplateAction");var N=s(2801),S=s(5832);let k=[{id:"work",name:N._.main,title:"Work prompt",icon:n.A,desc:"Injected when the agent starts an issue."},{id:"triage",name:"triage",title:"Triage prompt",icon:r.A,desc:"Classifies and labels new issues."},{id:"review",name:"review-feedback",title:"Review-feedback prompt",icon:l.A,desc:"Runs when a trusted reviewer comments."},{id:"release",name:N._.release,title:"Release prompt",icon:i.A,desc:"Drives the manual agent-run release (issue #256)."}];function A({repo:e,stage:t}){let{success:s,error:n}=(0,b.d)(),[r,l]=(0,m.useState)("standard"),[i,d]=(0,m.useState)(""),[c,h]=(0,m.useState)(""),[y,N]=(0,m.useState)(!1),[S,k]=(0,m.useTransition)();(0,m.useEffect)(()=>{let s=!0;return(0,v.v)(e.id,t.name).then(e=>{s&&(d(e.content),h(e.content),l(e.hasRow?"custom":"standard"),N(!0))}).catch(e=>{s&&(n("Failed to load prompt",e instanceof Error?e.message:String(e)),N(!0))}),()=>{s=!1}},[e.id,t.name,n]);let C=c.trim()!==i.trim(),R=t.icon;return(0,a.jsxs)("div",{className:"rounded-lg border border-border p-4",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,a.jsx)("span",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-secondary text-muted-foreground",children:(0,a.jsx)(R,{className:"h-4 w-4"})}),(0,a.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("h4",{className:"text-sm font-semibold",children:t.title}),"standard"===r?(0,a.jsx)(p.E,{tone:"neutral",children:"Standard"}):(0,a.jsx)(p.E,{tone:"primary",children:"Custom"})]}),(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:t.desc})]}),(0,a.jsx)(g.I,{value:r,onChange:function(s){"custom"===s?l("custom"):k(async()=>{try{let s=await w(e.id,t.name);d(s.content),h(s.content),l("standard")}catch(e){n("Failed to revert to standard",e instanceof Error?e.message:String(e))}})},disabled:!y||S,options:[{value:"standard",label:"Standard"},{value:"custom",label:"Custom"}]})]}),"standard"===r?(0,a.jsxs)("div",{className:"mt-3 rounded-lg border border-dashed border-border bg-secondary/30 p-3",children:[(0,a.jsx)("p",{className:"whitespace-pre-wrap font-mono text-xs leading-relaxed text-muted-foreground",children:y?i:"Loading…"}),(0,a.jsxs)("p",{className:"mt-2 inline-flex items-center gap-1.5 text-[11px] text-muted-foreground",children:[(0,a.jsx)(o.A,{className:"h-3 w-3"})," Inherits the global default.",(0,a.jsx)(u(),{href:"/prompts",className:"text-primary hover:underline",children:"Edit the standard →"})]})]}):(0,a.jsxs)("div",{className:"mt-3",children:[(0,a.jsx)(f.T,{value:c,onChange:e=>h(e.target.value),rows:4,disabled:!y||S,className:"font-mono text-xs leading-relaxed"}),(0,a.jsxs)("div",{className:"mt-2 flex items-center justify-end gap-2",children:[(0,a.jsx)(x.$,{size:"sm",variant:"ghost",disabled:!C||S,onClick:()=>h(i),children:"Discard changes"}),(0,a.jsx)(x.$,{size:"sm",disabled:!C||S,onClick:function(){k(async()=>{try{await (0,j.m)({repoId:e.id,name:t.name,content:c}),d(c),s("Prompt saved",`${t.title} \xb7 ${e.name}`)}catch(e){n("Failed to save prompt",e instanceof Error?e.message:String(e))}})},children:"Save override"})]})]})]})}function C({repo:e,className:t}){return(0,a.jsxs)("div",{className:(0,S.cn)("flex flex-col gap-3",t),children:[(0,a.jsxs)(h.F,{tone:"info",icon:d.A,title:"Per-repo prompt overrides",children:["Each stage uses the global"," ",(0,a.jsx)(u(),{href:"/prompts",className:"font-medium text-primary hover:underline",children:"standard prompt"})," ","unless you switch it to ",(0,a.jsx)("span",{className:"font-medium",children:"Custom"})," here. Overrides apply only to ",e.name,"."]}),k.map(t=>(0,a.jsx)(A,{repo:e,stage:t},t.id))]})}},2381:(e,t,s)=>{"use strict";s.d(t,{IssueBoard:()=>es});var a=s(515),n=s(8777),r=s(2323),l=s(2116),i=s(5378),o=s(296),d=s(9564),c=s(2718),u=s(1528),m=s(6998),h=s(8652),p=s(1171),x=s(5437),g=s(4054),f=s(4847),b=s(9320),v=s(5595),j=s(7241),y=s(9754),w=s(4783),N=s(6644),S=s(395),k=s(9694),A=s(7901),C=s(9214),R=s(7217),L=s(7405),P=s(9),M=s(5097);let D=(0,M.createServerReference)("60a1fbb43a257356d756462cc2695ef6a6255ffca3",M.callServer,void 0,M.findSourceMapURL,"viewIssueAction"),$=(0,M.createServerReference)("602a76c2114d37037598ea9842b02d600951593481",M.callServer,void 0,M.findSourceMapURL,"listSubtasksAction"),I=(0,M.createServerReference)("70a43a0d282fbb085ace9c26454fbfcb7c9dae899a",M.callServer,void 0,M.findSourceMapURL,"setIssueStateAction"),E=(0,M.createServerReference)("7047ed536a730f858b9456d0892129275f533dcf2b",M.callServer,void 0,M.findSourceMapURL,"startIssueAction"),F=(0,M.createServerReference)("605133eb35c690a9a5271377efe20141db5c9471e5",M.callServer,void 0,M.findSourceMapURL,"removeFromQueueAction"),T=(0,M.createServerReference)("70a7d76e0a5018a9dc45b5ac117852ac9ecc20d8a0",M.callServer,void 0,M.findSourceMapURL,"addToQueueAction"),B=(0,M.createServerReference)("7037108719b68f9f245bacf60f67696c2006c90167",M.callServer,void 0,M.findSourceMapURL,"editIssueAction"),O=(0,M.createServerReference)("78c227ded2618103847f7c040946e7cd39f5c8278e",M.callServer,void 0,M.findSourceMapURL,"setIssueLabelsAction"),q=(0,M.createServerReference)("70683988929cc82de99b5bdec65d1a94dbc22dbddb",M.callServer,void 0,M.findSourceMapURL,"commentIssueAction");var z=s(1837);let U={pending:{label:"Pending",symbol:"○",tone:"neutral"},in_progress:{label:"In progress",symbol:"◐",tone:"primary"},done:{label:"Done",symbol:"✓",tone:"success"},skipped:{label:"Skipped",symbol:"⊘",tone:"neutral"},deferred:{label:"Deferred",symbol:"⏸",tone:"warning"}};function V({repoId:e,issueNumber:t,open:s,onClose:n,queueLabel:r,defaultModel:l,defaultAgent:i}){let[o,d]=(0,p.useState)(null),[c,u]=(0,p.useState)([]),[h,M]=(0,p.useState)(""),[H,G]=(0,p.useState)(""),[W,_]=(0,p.useState)(""),[J,Q]=(0,p.useState)(""),[Z,K]=(0,p.useState)(l),[X,Y]=(0,p.useState)(i),[ee,et]=(0,p.useState)(null),[es,ea]=(0,p.useState)(!1),[en,er]=(0,p.useTransition)();function el(){null!==t&&(D(e,t).then(d).catch(e=>et(e.message)),$(e,t).then(u).catch(()=>u([])))}function ei(t){o&&er(()=>{I(e,o.number,t).then(el).catch(e=>et(e.message))})}if((0,p.useEffect)(()=>{K(l),Y(i)},[l,i]),(0,p.useEffect)(()=>{s&&null!==t&&(et(null),d(null),u([]),D(e,t).then(e=>{d(e),M(e.title),G(e.body)}).catch(e=>et(e.message)),$(e,t).then(u).catch(()=>u([])))},[s,t,e]),null===t)return null;let eo=`issue-modal-title-${t}`;return(0,a.jsxs)(A.l,{open:s,onClose:n,labelledById:eo,children:[(0,a.jsxs)("span",{id:eo,className:"sr-only",children:["Issue #",t]}),ee&&(0,a.jsx)(w.F,{tone:"destructive",className:"mb-3",children:ee}),o?(0,a.jsxs)("div",{className:"space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)("span",{className:"text-xs font-mono text-muted-foreground tnum",children:["#",o.number]}),(0,a.jsx)(N.E,{status:o.state}),(0,a.jsx)(S.$,{size:"sm",variant:"outline",className:"ml-auto",disabled:en,onClick:()=>"open"===o.state?ea(!0):ei("open"),children:"open"===o.state?"Close issue":"Reopen issue"})]}),(0,a.jsxs)("div",{className:"rounded-xl border border-card-border bg-secondary/40 p-4",children:[(0,a.jsxs)("h3",{className:"mb-3 flex items-center gap-2 text-sm font-semibold",children:[(0,a.jsx)(x.A,{className:"h-3.5 w-3.5 text-muted-foreground"}),"Run settings"]}),(0,a.jsxs)("div",{className:"flex flex-wrap items-end gap-2",children:[(0,a.jsx)(R.D,{label:"Agent",htmlFor:"modal-agent-select",children:(0,a.jsx)(j.a,{id:"modal-agent-select",value:X,onChange:e=>{Y(e),K((0,z.VJ)(e))}})}),(0,a.jsx)(R.D,{label:"Model",htmlFor:"modal-model-select",children:(0,a.jsx)(y.o,{id:"modal-model-select",value:Z,onChange:K,agent:X})}),(0,a.jsxs)(S.$,{size:"sm",disabled:en,onClick:()=>er(()=>{E(e,o.number,{model:Z!==l?Z:void 0,agent:X!==i?X:void 0}).then(()=>n()).catch(e=>et(e.message))}),children:[(0,a.jsx)(g.A,{}),"Start job now"]}),o.labels.includes(r)?(0,a.jsx)(S.$,{size:"sm",variant:"outline",disabled:en,onClick:()=>er(()=>{F(e,o.number).then(el).catch(e=>et(e.message))}),children:"Dequeue"}):(0,a.jsx)(S.$,{size:"sm",variant:"outline",disabled:en,onClick:()=>er(()=>{T(e,o.number,{model:Z!==l?Z:void 0,agent:X!==i?X:void 0}).then(el).catch(e=>et(e.message))}),children:"Add to queue"})]}),Z!==l||X!==i?(0,a.jsxs)("p",{className:"mt-2 text-xs text-muted-foreground",children:["Override active — repo default:"," ",(0,a.jsx)("span",{className:"font-medium text-foreground",children:l})]}):null]}),(0,a.jsx)(L.p,{value:h,onChange:e=>M(e.target.value),className:"font-medium"}),(0,a.jsx)(P.T,{value:H,onChange:e=>G(e.target.value),rows:8}),(0,a.jsxs)(S.$,{size:"sm",disabled:en,onClick:()=>er(()=>{B(e,o.number,{title:h,body:H}).then(el).catch(e=>et(e.message))}),children:[(0,a.jsx)(f.A,{}),"Save changes"]}),(0,a.jsxs)("div",{children:[(0,a.jsxs)("h3",{className:"mb-2 flex items-center gap-2 text-sm font-semibold",children:[(0,a.jsx)(m.A,{className:"h-3.5 w-3.5 text-muted-foreground"}),"Labels"]}),(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5",children:[o.labels.map(t=>(0,a.jsx)("button",{type:"button",title:"Remove label",disabled:en,className:"rounded-md focus-ring disabled:opacity-50",onClick:()=>er(()=>{O(e,o.number,[],[t]).then(el).catch(e=>et(e.message))}),children:(0,a.jsxs)(N.E,{className:"cursor-pointer",children:[t," \xd7"]})},t)),(0,a.jsx)(L.p,{value:J,onChange:e=>Q(e.target.value),placeholder:"add label",className:"h-8 w-28 text-xs"}),(0,a.jsx)(S.$,{size:"sm",variant:"outline",disabled:en||!J.trim(),onClick:()=>er(()=>{O(e,o.number,[J.trim()],[]).then(()=>{Q(""),el()}).catch(e=>et(e.message))}),children:"Add"})]})]}),c.length>0&&(0,a.jsxs)("div",{children:[(0,a.jsxs)("h3",{className:"mb-2 flex items-center gap-2 text-sm font-semibold",children:[(0,a.jsx)(b.A,{className:"h-3.5 w-3.5 text-muted-foreground"}),"Subtasks (",c.filter(e=>"done"===e.status).length,"/",c.length,")"]}),(0,a.jsx)("ol",{className:"space-y-1.5",children:c.map(e=>{let t=U[e.status]??{label:e.status,symbol:"○",tone:"neutral"},s="done"===e.status||"skipped"===e.status;return(0,a.jsxs)("li",{className:"flex items-center gap-2 rounded-lg border border-card-border bg-secondary/40 px-3 py-1.5 text-sm",children:[(0,a.jsx)("span",{className:"text-muted-foreground","aria-hidden":!0,children:t.symbol}),(0,a.jsx)("span",{className:s?"text-muted-foreground line-through":"",children:e.title}),(0,a.jsx)("span",{className:"ml-auto",children:(0,a.jsx)(N.E,{tone:t.tone,children:t.label})})]},e.id)})})]}),(0,a.jsxs)("div",{children:[(0,a.jsxs)("h3",{className:"mb-2 flex items-center gap-2 text-sm font-semibold",children:[(0,a.jsx)(v.A,{className:"h-3.5 w-3.5 text-muted-foreground"}),"Comments"]}),(0,a.jsxs)("ul",{className:"space-y-2",children:[o.comments.map(e=>(0,a.jsxs)("li",{className:"rounded-lg border border-card-border bg-secondary/40 p-3 text-sm",children:[(0,a.jsxs)("p",{className:"text-xs text-muted-foreground",children:[(0,a.jsx)("span",{className:"font-medium text-foreground",children:e.author})," \xb7 ",e.createdAt]}),(0,a.jsx)("p",{className:"mt-1 whitespace-pre-wrap text-pretty",children:e.body})]},`${e.author}-${e.createdAt}`)),0===o.comments.length&&(0,a.jsx)("li",{children:(0,a.jsx)(C.p,{compact:!0,icon:v.A,title:"No comments yet",description:"Discussion from GitHub shows up here."})})]}),(0,a.jsx)(P.T,{value:W,onChange:e=>_(e.target.value),rows:3,placeholder:"Write a comment…",className:"mt-2"}),(0,a.jsx)(S.$,{size:"sm",className:"mt-2",disabled:en||!W.trim(),onClick:()=>er(()=>{q(e,o.number,W.trim()).then(()=>{_(""),el()}).catch(e=>et(e.message))}),children:"Comment"})]})]}):(0,a.jsx)("p",{className:"text-sm text-muted-foreground",children:"Loading…"}),o&&(0,a.jsx)(k.T,{open:es,onOpenChange:ea,onConfirm:()=>ei("closed"),title:"Close issue?",description:`This closes #${o.number} on GitHub.`,confirmLabel:"Close issue",variant:"destructive",pending:en})]})}var H=s(4148),G=s(8479),W=s(5172);let _=(0,M.createServerReference)("40e4e0566b5915a5c717b6a6a234d7f0b5e7ae8ab8",M.callServer,void 0,M.findSourceMapURL,"syncRepoIssuesAction"),J=(0,M.createServerReference)("60ffbfb54c1eedad8bdb1dadf09eba3a4563a1c4d7",M.callServer,void 0,M.findSourceMapURL,"reorderIssuesAction"),Q=(0,M.createServerReference)("6054a5f157537c63e0121c428d9e584ccb689168b5",M.callServer,void 0,M.findSourceMapURL,"bulkAddToQueueAction"),Z=(0,M.createServerReference)("609a8e9cdaef62b5521521ddb1ecdbc0eeda496910",M.callServer,void 0,M.findSourceMapURL,"bulkRemoveFromQueueAction"),K=(0,M.createServerReference)("70508bed778ffcbfb01bf813fdd5a53db7f95f1a48",M.callServer,void 0,M.findSourceMapURL,"bulkApplyLabelAction");var X=s(5832);function Y(e){try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function ee({issue:e,reorderable:t,queueLabel:s,queueIndex:d,queueSize:c,isDragging:u,isOver:m,isFlash:h,selected:p,pending:x,onToggleSelect:g,onOpen:f,onAddToQueue:b,onRemoveFromQueue:v,onMoveUp:j,onMoveDown:y,onDragStartRow:w,onDragEnterRow:k,onDragEndRow:A,onDropRow:C}){let R=Y(e.labels).filter(e=>e!==s),L=`issue-select-${e.number}`;return(0,a.jsxs)("div",{draggable:!0,onDragStart:t=>{w(),t.dataTransfer.effectAllowed="move";try{t.dataTransfer.setData("text/plain",String(e.number))}catch{}},onDragEnter:k,onDragOver:e=>e.preventDefault(),onDragEnd:A,onDrop:e=>{e.preventDefault(),e.stopPropagation(),C()},className:(0,X.cn)("issue-row group flex items-center gap-3 rounded-lg border border-transparent bg-card px-3 py-2.5 hover-elevate",u&&"opacity-40",m&&"ring-1 ring-primary/70",h&&"bg-success/[0.06] ring-1 ring-success/70"),children:[(0,a.jsx)(n.A,{"aria-hidden":!0,className:"h-[15px] w-[15px] shrink-0 cursor-grab text-muted-foreground/40 group-hover:text-muted-foreground active:cursor-grabbing"}),(0,a.jsx)(H.S,{id:L,checked:p,onChange:g,"aria-label":`Select #${e.number} for bulk actions`,className:"shrink-0"}),t&&(0,a.jsx)("span",{className:"flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-primary text-[11px] font-semibold tabular-nums text-primary-foreground",children:d+1}),(0,a.jsxs)("button",{type:"button",onClick:f,className:"flex min-w-0 flex-1 items-center gap-2 rounded-sm text-left focus-ring",children:[(0,a.jsxs)("span",{className:"shrink-0 font-mono text-xs text-muted-foreground",children:["#",e.number]}),(0,a.jsx)("span",{className:"truncate text-sm group-hover:text-foreground",children:e.title})]}),(0,a.jsxs)("div",{className:"hidden shrink-0 items-center gap-1.5 md:flex",children:[e.triagedAt&&(0,a.jsx)(W.m,{content:"Labels applied by auto-triage — see the issue comment for reasons",children:(0,a.jsx)(N.E,{tone:"primary",children:"auto-triaged"})}),R.slice(0,2).map(e=>(0,a.jsx)("span",{className:"rounded-md bg-secondary px-1.5 py-0.5 text-[11px] text-muted-foreground",children:e},e))]}),(0,a.jsx)("div",{className:"flex shrink-0 items-center gap-0.5",children:t?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(S.$,{type:"button",size:"icon-sm",variant:"ghost","aria-label":`Move #${e.number} up in queue`,disabled:0===d||x,onClick:j,className:"h-7 w-7",children:(0,a.jsx)(r.A,{})}),(0,a.jsx)(S.$,{type:"button",size:"icon-sm",variant:"ghost","aria-label":`Move #${e.number} down in queue`,disabled:d===c-1||x,onClick:y,className:"h-7 w-7",children:(0,a.jsx)(l.A,{})}),(0,a.jsx)(S.$,{type:"button",size:"icon-sm",variant:"ghost","aria-label":`Remove #${e.number} from queue`,disabled:x,onClick:v,className:"h-7 w-7 text-destructive hover:text-destructive",children:(0,a.jsx)(i.A,{})})]}):(0,a.jsx)(S.$,{type:"button",size:"icon-sm",variant:"ghost","aria-label":`Add #${e.number} to queue`,disabled:x,onClick:b,className:"h-7 w-7",children:(0,a.jsx)(o.A,{})})})]})}function et({zone:e,icon:t,title:s,count:n,hint:r,empty:l,emptyDrop:i,dropping:o,isEmpty:d,onDropZone:c,onClearOver:u,children:m}){return(0,a.jsxs)("div",{onDragOver:e=>{e.preventDefault(),e.currentTarget===e.target&&u()},onDrop:e=>{e.preventDefault(),c()},"data-zone":e,className:(0,X.cn)("rounded-xl border p-2 transition-colors",o?"border-dashed border-primary/45 bg-primary/[0.03]":"border-card-border"),children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 px-2 py-1.5",children:[(0,a.jsx)(t,{className:"h-3.5 w-3.5 text-muted-foreground"}),(0,a.jsx)("span",{className:"text-sm font-semibold",children:s}),(0,a.jsx)(N.E,{tone:"neutral",children:n}),(0,a.jsx)("span",{className:"ml-auto hidden text-xs text-muted-foreground sm:block",children:r})]}),d?(0,a.jsx)("div",{className:(0,X.cn)("m-1 rounded-lg border border-dashed px-3 py-6 text-center text-xs transition-colors",o?"border-primary/50 text-primary":"border-border text-muted-foreground"),children:o?i:l}):(0,a.jsx)("div",{className:"flex flex-col gap-0.5 p-1",children:m})]})}function es({repoId:e,queueLabel:t,initialIssues:s,pollIntervalSec:r,defaultModel:l,defaultAgent:o}){let[x,g]=(0,p.useState)(s),[f,b]=(0,p.useState)(""),[v,j]=(0,p.useState)(null),[y,w]=(0,p.useState)(null),[N,k]=(0,p.useState)(null),[A,C]=(0,p.useState)(null),[R,P]=(0,p.useState)(new Set),[M,D]=(0,p.useState)(""),[$,I]=(0,p.useTransition)(),[E,B]=(0,p.useState)(null),{success:O}=(0,G.d)();(0,p.useEffect)(()=>g(s),[s]),(0,p.useEffect)(()=>{let t=setInterval(()=>{_(e).then(g).catch(e=>B(e.message))},1e3*Math.max(10,r));return()=>clearInterval(t)},[e,r]);let q=e=>Y(e.labels).includes(t),z=e=>{let t=f.toLowerCase();return!t||e.title.toLowerCase().includes(t)||String(e.number).includes(t)||Y(e.labels).some(e=>e.toLowerCase().includes(t))},U=x.filter(e=>!q(e)&&z(e)),H=x.filter(e=>q(e)&&z(e));function W(){j(null),w(null)}function ea(){if(null===v)return;let t=x.find(e=>e.number===v),s=t?.title;W(),!t||q(t)||I(()=>{T(e,v).then(e=>{g(e),k(v),setTimeout(()=>k(e=>e===v?null:e),1200),O("Issue queued",`#${v} ${s??""}`.trim())}).catch(e=>B(e.message))})}function en(){if(null===v)return;let t=x.find(e=>e.number===v);W(),t&&q(t)&&I(()=>{F(e,t.number).then(g).catch(e=>B(e.message))})}function er(){P(new Set)}function el(e){let t=[...R];0!==t.length&&(B(null),I(()=>{e(t).then(e=>{g(e),er()}).catch(e=>B(e.message))}))}let ei=x.filter(q).map(e=>e.number),eo=null!==v;function ed(s,n){return(0,a.jsx)(ee,{issue:s,reorderable:n,queueLabel:t,queueIndex:ei.indexOf(s.number),queueSize:ei.length,isDragging:v===s.number,isOver:y===s.number&&null!==v&&v!==s.number,isFlash:N===s.number,selected:R.has(s.number),pending:$,onToggleSelect:()=>{var e;return e=s.number,void P(t=>{let s=new Set(t);return s.has(e)?s.delete(e):s.add(e),s})},onOpen:()=>C(s.number),onAddToQueue:()=>{var t;return t=s.number,void I(()=>{T(e,t).then(g).catch(e=>B(e.message))})},onRemoveFromQueue:()=>{var t;return t=s.number,void I(()=>{F(e,t).then(g).catch(e=>B(e.message))})},onMoveUp:()=>{let t;return t=function(e,t){let s=e.indexOf(t);if(s<=0)return e;let a=[...e],n=a[s-1];return a[s-1]=a[s],a[s]=n,a}(ei,s.number),void I(()=>{J(e,t).catch(e=>B(e.message))})},onMoveDown:()=>{let t;return t=function(e,t){let s=e.indexOf(t);if(-1===s||s===e.length-1)return e;let a=[...e],n=a[s+1];return a[s+1]=a[s],a[s]=n,a}(ei,s.number),void I(()=>{J(e,t).catch(e=>B(e.message))})},onDragStartRow:()=>j(s.number),onDragEnterRow:()=>w(s.number),onDragEndRow:W,onDropRow:()=>{let t;!(t=null===v?void 0:x.find(e=>e.number===v))?W():q(t)===n?n?function(t){if(W(),null===v||v===t)return;let s=x.find(e=>e.number===v);if(!s||!q(s))return;let a=function(e,t,s){if(t===s||!e.includes(t))return e;let a=e.filter(e=>e!==t),n=a.indexOf(s);return -1===n?e:(a.splice(n,0,t),a)}(x.filter(q).map(e=>e.number),v,t);I(()=>{J(e,a).catch(e=>B(e.message))})}(s.number):W():n?ea():en()}},s.number)}return(0,a.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,a.jsxs)("p",{className:"inline-flex items-center gap-1.5 text-xs text-muted-foreground",children:[(0,a.jsx)(n.A,{className:"h-3.5 w-3.5"})," Drag to set priority, or drop an issue into the queue to schedule it."]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)("div",{className:"relative w-full sm:w-56",children:[(0,a.jsx)(d.A,{className:"pointer-events-none absolute left-3 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground"}),(0,a.jsx)(L.p,{"aria-label":"Search issues by title or label",value:f,onChange:e=>b(e.target.value),placeholder:"Filter issues",className:"h-8 pl-8 text-xs"})]}),(0,a.jsxs)(S.$,{size:"sm",variant:"outline",disabled:$||0===U.length,onClick:function(){let t=U.map(e=>e.number);0!==t.length&&(B(null),I(()=>{Q(e,t).then(g).catch(e=>B(e.message))}))},children:[(0,a.jsx)(c.A,{className:"h-3.5 w-3.5"})," Queue all"]}),(0,a.jsxs)(S.$,{size:"sm",variant:"outline",disabled:$,onClick:function(){B(null),I(()=>{_(e).then(g).catch(e=>B(e.message))})},children:[(0,a.jsx)(u.A,{className:(0,X.cn)("h-3.5 w-3.5",$&&"dd-spin")}),$?"Syncing…":"Refresh"]})]})]}),E&&(0,a.jsx)("p",{role:"alert",className:"text-xs text-destructive",children:E}),R.size>0&&(0,a.jsxs)("div",{className:"dd-fade-up flex flex-wrap items-center gap-2 rounded-xl border border-primary/40 bg-primary/[0.04] p-2",children:[(0,a.jsxs)("span",{className:"px-1 text-sm font-medium",children:[R.size," selected"]}),(0,a.jsxs)(S.$,{size:"sm",variant:"outline",disabled:$,onClick:()=>el(t=>Q(e,t)),children:[(0,a.jsx)(c.A,{className:"h-3.5 w-3.5"})," Add to queue"]}),(0,a.jsxs)(S.$,{size:"sm",variant:"outline",disabled:$,onClick:()=>el(t=>Z(e,t)),children:[(0,a.jsx)(i.A,{className:"h-3.5 w-3.5"})," Remove from queue"]}),(0,a.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,a.jsx)(L.p,{"aria-label":"Label to apply to selected issues",value:M,onChange:e=>D(e.target.value),placeholder:"label…",className:"h-8 w-28 text-xs"}),(0,a.jsxs)(S.$,{size:"sm",variant:"outline",disabled:$||""===M.trim(),onClick:()=>{let t=M.trim();el(s=>K(e,s,t)),D("")},children:[(0,a.jsx)(m.A,{className:"h-3.5 w-3.5"})," Apply label"]})]}),(0,a.jsx)(S.$,{size:"sm",variant:"ghost",className:"ml-auto",disabled:$,onClick:er,children:"Clear"})]}),(0,a.jsx)(et,{zone:"queue",icon:c.A,title:"Queue",count:H.length,hint:"top = next to run",empty:"Nothing queued. Drag an issue up from the backlog, or use the + button.",emptyDrop:"Drop here",dropping:eo,onDropZone:ea,onClearOver:()=>w(null),isEmpty:0===H.length,children:H.map(e=>ed(e,!0))}),(0,a.jsx)(et,{zone:"backlog",icon:h.A,title:"Backlog \xb7 triage",count:U.length,hint:"drag up to schedule",empty:"Backlog is empty.",emptyDrop:"Drop here",dropping:eo,onDropZone:en,onClearOver:()=>w(null),isEmpty:0===U.length,children:U.map(e=>ed(e,!1))}),(0,a.jsx)(V,{repoId:e,issueNumber:A,open:null!==A,onClose:()=>C(null),queueLabel:t,defaultModel:l,defaultAgent:o})]})}},2801:(e,t,s)=>{"use strict";s.d(t,{_:()=>a});let a={main:"default",ciFix:"ci-fix",plan:"plan",limitResume:"limit-resume",turnResume:"turn-resume",humanResume:"human-resume",prFormat:"pr-format",release:"release"}},2836:(e,t,s)=>{"use strict";s.d(t,{Sparkline:()=>l});var a=s(515),n=s(1171),r=s(4497);function l({data:e,width:t=132,height:s=36,tone:i="chart-1",fill:o=!0,strokeWidth:d=1.75,average:c=!1}){let u=`sp${(0,n.useId)().replace(/:/g,"")}`;if(0===e.length)return null;let m=Math.min(...e),h=Math.max(...e)-m||1,p=e.length>1?t/(e.length-1):t,x=e.map((e,t)=>[t*p,s-3-(e-m)/h*(s-6)]),g=x.map((e,t)=>`${t?"L":"M"}${e[0].toFixed(1)} ${e[1].toFixed(1)}`).join(" "),f=`${g} L${t} ${s} L0 ${s} Z`,b=(0,r.U)(i),v=x[x.length-1]??[0,s-3],j=s-3-(e.reduce((e,t)=>e+t,0)/e.length-m)/h*(s-6);return(0,a.jsxs)("svg",{width:t,height:s,viewBox:`0 0 ${t} ${s}`,className:"overflow-visible","aria-hidden":"true",children:[o&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("defs",{children:(0,a.jsxs)("linearGradient",{id:u,x1:"0",y1:"0",x2:"0",y2:"1",children:[(0,a.jsx)("stop",{offset:"0%",stopColor:b,stopOpacity:"0.22"}),(0,a.jsx)("stop",{offset:"100%",stopColor:b,stopOpacity:"0"})]})}),(0,a.jsx)("path",{d:f,fill:`url(#${u})`})]}),c&&e.length>1&&(0,a.jsx)("line",{x1:0,x2:t,y1:j,y2:j,stroke:"hsl(var(--muted-foreground) / 0.45)",strokeWidth:1,strokeDasharray:"3 3"}),(0,a.jsx)("path",{d:g,fill:"none",stroke:b,strokeWidth:d,strokeLinecap:"round",strokeLinejoin:"round"}),(0,a.jsx)("circle",{cx:v[0],cy:v[1],r:2.5,fill:b})]})}},4183:(e,t,s)=>{"use strict";s.d(t,{u:()=>n});var a=s(5097);let n=(0,a.createServerReference)("600ab73aefdfa18cb73f40404e31cac1a432251128",a.callServer,void 0,a.findSourceMapURL,"updateRepoAction")},4497:(e,t,s)=>{"use strict";function a(e){return e?`hsl(var(--${e}))`:"hsl(var(--muted-foreground))"}s.d(t,{U:()=>a})},4602:(e,t,s)=>{Promise.resolve().then(s.bind(s,9290)),Promise.resolve().then(s.t.bind(s,742,23)),Promise.resolve().then(s.bind(s,2381)),Promise.resolve().then(s.bind(s,715)),Promise.resolve().then(s.bind(s,9079)),Promise.resolve().then(s.bind(s,1080)),Promise.resolve().then(s.bind(s,5362)),Promise.resolve().then(s.bind(s,4860)),Promise.resolve().then(s.bind(s,663)),Promise.resolve().then(s.bind(s,1024)),Promise.resolve().then(s.bind(s,2836))},4860:(e,t,s)=>{"use strict";s.d(t,{RepoSettingsBar:()=>v});var a=s(515),n=s(1765),r=s(7561),l=s(988),i=s(1171),o=s(7241),d=s(9754),c=s(7217),u=s(8379),m=s(7405),h=s(1059),p=s(8479),x=s(5172),g=s(1837),f=s(4183);function b({text:e,help:t}){return(0,a.jsxs)("span",{className:"flex items-center gap-1.5",children:[e,(0,a.jsx)(x.V,{content:t})]})}function v({repo:e,openrouter:t}){let[s,j]=(0,i.useState)(e.agent),[y,w]=(0,i.useState)(e.defaultModel),[N,S]=(0,i.useState)(e.dailyCostLimitUsd.toString()),[k,A]=(0,i.useState)(e.maxJobMinutes?.toString()??""),[C,R]=(0,i.useState)(e.maxCiWaitMinutes?.toString()??""),[L,P]=(0,i.useState)(e.mergeGateMinutes.toString()),[M,D]=(0,i.useState)(e.adrGating),[$,I]=(0,i.useState)(e.sequential),[E,F]=(0,i.useTransition)(),[T,B]=(0,i.useState)(!1),{error:O}=(0,p.d)();function q(t){B(!1),F(async()=>{try{await (0,f.u)(e.id,t),B(!0),setTimeout(()=>B(!1),1500)}catch(e){O("Failed to update repository",e instanceof Error?e.message:String(e))}})}function z(e,t){"maxJobMinutes"===e?A(t):R(t);let s=""===t?null:Number(t);(null===s||Number.isInteger(s)&&!(s<0))&&q({[e]:s})}return(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsx)(u.L,{icon:n.A,legend:"Agent & model",tone:"primary",description:"Which agent picks up issues in this repo, and the model it defaults to.",children:(0,a.jsxs)("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:[(0,a.jsx)(c.D,{label:(0,a.jsx)(b,{text:"Queue label",help:"Issues carrying this GitHub label enter the repo's processing queue."}),children:(0,a.jsx)("code",{className:"inline-flex h-9 w-fit max-w-full items-center truncate rounded-lg bg-secondary px-3 font-mono text-xs text-muted-foreground",children:e.queueLabel})}),(0,a.jsx)(c.D,{label:(0,a.jsx)(b,{text:"Agent",help:"CLI agent used for new jobs in this repo."}),htmlFor:"repo-agent-select",children:(0,a.jsx)(o.a,{id:"repo-agent-select",value:s,onChange:function(e){let s="openrouter"===e?t.defaultModel||(t.models[0]?.id??""):(0,g.VJ)(e);"openrouter"===e&&""===s?O("No synced OpenRouter models","Refresh the catalog in Settings first."):(j(e),w(s),q({agent:e,defaultModel:s}))},agents:t.enabled||"openrouter"===s?["claude","codex","openrouter"]:["claude","codex"]})}),(0,a.jsx)(c.D,{label:(0,a.jsx)(b,{text:"Model",help:"Default model for new jobs — switching agents resets it to that agent's default."}),htmlFor:"repo-model-select",children:(0,a.jsx)(d.o,{id:"repo-model-select",value:y,onChange:function(e){w(e),q({defaultModel:e})},agent:s,openrouterModels:t.models})})]})}),(0,a.jsx)(u.L,{icon:r.A,legend:"Limits & timing",tone:"warning",description:"Spend and runtime guardrails for jobs in this repo.",children:(0,a.jsxs)("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-4",children:[(0,a.jsx)(c.D,{label:(0,a.jsx)(b,{text:"Daily limit ($)",help:"Hard cap on agent spend per day for this repo. New jobs wait once the cap is hit. 0 = off (unlimited)."}),htmlFor:"repo-daily-limit",children:(0,a.jsx)(m.p,{id:"repo-daily-limit",type:"number",min:0,step:1,value:N,onChange:e=>{var t;let s;return S(t=e.target.value),s=Number(t),void(""!==t.trim()&&Number.isFinite(s)&&!(s<0)&&q({dailyCostLimitUsd:s}))}})}),(0,a.jsx)(c.D,{label:(0,a.jsx)(b,{text:"Max job minutes",help:"Abort jobs that run longer than this. Leave empty to use the global default."}),htmlFor:"repo-max-job-minutes",children:(0,a.jsx)(m.p,{id:"repo-max-job-minutes",type:"number",min:0,step:1,value:k,onChange:e=>z("maxJobMinutes",e.target.value),placeholder:"Global default"})}),(0,a.jsx)(c.D,{label:(0,a.jsx)(b,{text:"Max CI wait minutes",help:"How long to wait for CI before giving up. Leave empty to use the global default."}),htmlFor:"repo-max-ci-wait-minutes",children:(0,a.jsx)(m.p,{id:"repo-max-ci-wait-minutes",type:"number",min:0,step:1,value:C,onChange:e=>z("maxCiWaitMinutes",e.target.value),placeholder:"Global default"})}),(0,a.jsx)(c.D,{label:(0,a.jsx)(b,{text:"Merge gate minutes",help:"Hold the auto-merge after green CI so late bot or human reviews can land first. 0 merges immediately."}),htmlFor:"repo-merge-gate-minutes",children:(0,a.jsx)(m.p,{id:"repo-merge-gate-minutes",type:"number",min:0,step:1,value:L,onChange:e=>{var t;let s;return P(t=e.target.value),s=Number(t),void(""!==t&&Number.isInteger(s)&&!(s<0)&&q({mergeGateMinutes:s}))},placeholder:"0 = merge on green"})})]})}),(0,a.jsx)(u.L,{icon:l.A,legend:"Gates",description:"Checks that hold work before it lands.",children:(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-x-6 gap-y-3",children:[(0,a.jsxs)("span",{className:"flex items-center gap-2",children:[(0,a.jsxs)("label",{htmlFor:"repo-adr-gate",className:"flex items-center gap-2 text-sm",children:[(0,a.jsx)(h.d,{id:"repo-adr-gate",checked:M,onChange:function(e){D(e),q({adrGating:e})},"aria-label":"ADR gate"}),"ADR gate"]}),(0,a.jsx)(x.V,{content:"Hold the merge while ADRs await review — the job parks as needs-human until pending decisions are approved."})]}),(0,a.jsxs)("span",{className:"flex items-center gap-2",children:[(0,a.jsxs)("label",{htmlFor:"repo-sequential",className:"flex items-center gap-2 text-sm",children:[(0,a.jsx)(h.d,{id:"repo-sequential",checked:$,onChange:function(e){I(e),q({sequential:e})},"aria-label":"Sequential (wait for merge)"}),"Sequential"]}),(0,a.jsx)(x.V,{content:"Process one issue at a time — wait for the open PR to merge before starting the next job."})]}),(0,a.jsx)("span",{"aria-live":"polite",className:"ml-auto text-xs text-muted-foreground",children:E?"Saving…":T?"Saved":""})]})})]})}},5362:(e,t,s)=>{"use strict";s.d(t,{RepoReleasePanel:()=>v});var a=s(515),n=s(6998),r=s(1753),l=s(742),i=s.n(l),o=s(2235),d=s(1171),c=s(6644),u=s(395),m=s(9214),h=s(8479),p=s(5097);let x=(0,p.createServerReference)("40eb0cd08d486262bdc5adbc5edf1ea9dd7a068984",p.callServer,void 0,p.findSourceMapURL,"previewReleaseAction"),g=(0,p.createServerReference)("4017f4c60354ec828a2b4dc3e092cf89c175312713",p.callServer,void 0,p.findSourceMapURL,"publishReleaseAction"),f=(0,p.createServerReference)("402c2d333c4b3a3763cb53eca63ea7bfb346ebe744",p.callServer,void 0,p.findSourceMapURL,"startReleaseAction"),b={detected:"neutral",evaluating:"neutral",proposed:"primary",publishing:"warning",published:"success",skipped:"neutral",error:"destructive"};function v({repoId:e,initialRuns:t}){let[s,l]=(0,d.useState)(t),[p,j]=(0,d.useState)(null),[y,w]=(0,d.useTransition)(),{error:N,success:S,info:k}=(0,h.d)(),A=(0,o.useRouter)();return(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("h3",{className:"flex items-center gap-2 text-sm font-semibold",children:[(0,a.jsx)(n.A,{className:"h-3.5 w-3.5 text-muted-foreground"})," Releases"]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(u.$,{variant:"outline",size:"sm",onClick:function(){w(async()=>{try{j(await x(e))}catch(e){N("Preview failed",e instanceof Error?e.message:String(e))}})},disabled:y,children:"Preview"}),(0,a.jsx)(u.$,{variant:"outline",size:"sm",onClick:function(){w(async()=>{try{let t=await g(e);l(t),j(null);let s=t[0];s?.status==="published"?S("Release published",s.tag?`Cut ${s.tag}.`:"A release was cut."):s?.status==="skipped"?k("No release cut","No release was recommended for the latest changes."):s?.status==="error"?N("Publish failed",s.errorMessage??"The release run did not complete."):k("Release started",`Run is ${s?.status??"in progress"}.`)}catch(e){N("Publish failed",e instanceof Error?e.message:String(e))}})},disabled:y,children:"Publish release"}),(0,a.jsxs)(u.$,{size:"sm",onClick:function(){w(async()=>{try{let{jobId:t,runs:s}=await f(e);l(s),j(null),k("Release started","An agent is figuring out and running this repo's release."),A.push(`/jobs/${t}`)}catch(e){N("Release failed to start",e instanceof Error?e.message:String(e))}})},disabled:y,children:[(0,a.jsx)(r.A,{className:"h-3.5 w-3.5"})," Run release (agent)"]})]})]}),p&&(0,a.jsxs)("div",{className:"space-y-2 rounded-lg border border-card-border bg-secondary/30 p-3 text-sm",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,a.jsx)("span",{className:"font-medium",children:"Proposed:"}),(0,a.jsx)(c.E,{tone:"primary",children:p.candidateTag}),(0,a.jsxs)("span",{className:"text-xs text-muted-foreground",children:[p.fromTag?`from ${p.fromTag}`:"first release"," \xb7 ",p.bump," \xb7"," ",p.shouldRelease?"release recommended":"no release recommended"]})]}),(0,a.jsxs)("ul",{className:"flex flex-col gap-0.5 text-xs text-muted-foreground",children:[p.prs.map(e=>(0,a.jsxs)("li",{className:"truncate",children:[(0,a.jsxs)("span",{className:"font-mono",children:["#",e.number]})," ",e.title]},e.number)),0===p.prs.length&&(0,a.jsx)("li",{children:"No unreleased pull requests."})]})]}),0===s.length?(0,a.jsx)(m.p,{compact:!0,icon:n.A,title:"No release runs yet",description:"Preview or publish a release to cut one from your merged work."}):(0,a.jsx)("ul",{className:"flex flex-col gap-2",children:s.map(e=>(0,a.jsxs)("li",{className:"flex items-center gap-3 rounded-lg border border-border p-3",children:[(0,a.jsx)(n.A,{className:"h-3.5 w-3.5 shrink-0 text-success"}),e.tag?(0,a.jsx)("span",{className:"font-mono text-sm font-semibold",children:e.tag}):(0,a.jsx)("span",{className:"text-xs text-muted-foreground",children:e.mode}),e.tag&&(0,a.jsx)("span",{className:"text-xs text-muted-foreground",children:e.mode}),null!=e.triggerPrNumber&&(0,a.jsxs)("span",{className:"text-xs text-muted-foreground",children:["PR #",e.triggerPrNumber]}),null!=e.jobId&&(0,a.jsx)(i(),{href:`/jobs/${e.jobId}`,className:"text-xs text-primary underline-offset-2 hover:underline",children:"job log"}),(0,a.jsx)(c.E,{tone:b[e.status]??"neutral",children:e.status}),e.errorMessage&&(0,a.jsx)("span",{className:"ml-auto max-w-[40%] truncate text-xs text-destructive",title:e.errorMessage,children:e.errorMessage})]},e.id))})]})}},5897:(e,t,s)=>{"use strict";s.d(t,{I:()=>r});var a=s(515),n=s(5832);function r({value:e,onChange:t,options:s,size:l="default",disabled:i=!1}){return(0,a.jsx)("div",{className:(0,n.cn)("inline-flex items-center gap-0.5 rounded-lg border border-border bg-secondary/50 p-0.5","sm"===l&&"text-xs"),children:s.map(s=>(0,a.jsx)("button",{type:"button",disabled:i,onClick:()=>t(s.value),className:(0,n.cn)("rounded-md px-2.5 py-1 text-xs font-medium transition-colors focus-ring","disabled:cursor-not-allowed disabled:opacity-50",e===s.value?"bg-card text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"),children:s.label},s.value))})}},6615:(e,t,s)=>{"use strict";s.d(t,{v:()=>n});var a=s(5097);let n=(0,a.createServerReference)("60126324f0952a224a0ab7a0fd69c420f6b2e1e458",a.callServer,void 0,a.findSourceMapURL,"loadTemplateAction")},8379:(e,t,s)=>{"use strict";s.d(t,{L:()=>l});var a=s(515),n=s(5832);let r={neutral:"bg-secondary text-muted-foreground",primary:"bg-primary/10 text-primary",success:"bg-success-muted text-success",warning:"bg-warning-muted text-warning",destructive:"bg-destructive/10 text-destructive"};function l({icon:e,legend:t,description:s,tone:i="neutral",children:o}){return(0,a.jsxs)("fieldset",{className:"rounded-lg border border-border p-4",children:[(0,a.jsxs)("legend",{className:"flex items-center gap-2 px-1",children:[(0,a.jsx)("span",{className:(0,n.cn)("flex h-6 w-6 items-center justify-center rounded-md",r[i]),children:(0,a.jsx)(e,{className:"h-3.5 w-3.5"})}),(0,a.jsx)("span",{className:"text-sm font-semibold",children:t})]}),s&&(0,a.jsx)("p",{className:"mb-3 mt-1 text-xs text-muted-foreground",children:s}),(0,a.jsx)("div",{className:"flex flex-col gap-3",children:o})]})}},9079:(e,t,s)=>{"use strict";s.d(t,{RepoAutomationBar:()=>P});var a=s(515),n=s(988),r=s(8652),l=s(6188),i=s(5166),o=s(6998),d=s(2655),c=s(8334),u=s(5595),m=s(1171),h=s(7241),p=s(9754),x=s(4783),g=s(7217),f=s(8379),b=s(7405),v=s(8067),j=s(1059),y=s(9),w=s(8479),N=s(5172),S=s(1837),k=s(4183);function A(e){try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}}function C(e){return[...new Set(e.split(/[,\n]/).map(e=>e.trim()).filter(Boolean))]}function R({label:e,help:t,checked:s,onChange:n,children:r}){return(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,a.jsx)(j.d,{checked:s,onChange:n,"aria-label":e}),(0,a.jsx)("span",{className:"text-sm",children:e}),t&&(0,a.jsx)(N.V,{content:t})]}),s&&r&&(0,a.jsx)("div",{className:"dd-fade-up mt-3 grid gap-3 border-l-2 border-border pl-4 sm:grid-cols-2",children:r})]})}function L({label:e,value:t,onChange:s,onBlur:n,help:r}){return(0,a.jsx)(g.D,{label:(0,a.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:[e,r&&(0,a.jsx)(N.V,{content:r})]}),children:(0,a.jsx)(b.p,{value:t,onChange:e=>s(e.target.value),onBlur:n,placeholder:"comma-separated",className:"h-8 font-mono text-xs"})})}function P({repo:e}){let[t,s]=(0,m.useState)(e.autoTriageEnabled),[M,D]=(0,m.useState)(e.autoProcessEnabled),[$,I]=(0,m.useState)(e.autoHealCi),[E,F]=(0,m.useState)(e.mergeWithoutChecks),[T,B]=(0,m.useState)(e.autoReviewFeedback),[O,q]=(0,m.useState)(e.autoDecompose),[z,U]=(0,m.useState)(e.planFirst),[V,H]=(0,m.useState)(e.verifyPr),[G,W]=(0,m.useState)(e.autoPrAudit),[_,J]=(0,m.useState)(e.prAuditAgent??("openrouter"===e.agent?"claude":e.agent)),[Q,Z]=(0,m.useState)(e.prAuditModel??(e.prAuditAgent&&e.prAuditAgent!==e.agent?(0,S.VJ)(e.prAuditAgent):e.defaultModel)),[K,X]=(0,m.useState)(e.prAuditLanguage),[Y,ee]=(0,m.useState)(e.prAuditPostOnPr),[et,es]=(0,m.useState)(e.autoHealDeployments),[ea,en]=(0,m.useState)(e.releaseEnabled),[er,el]=(0,m.useState)(e.autoResolveMergeConflicts),[ei,eo]=(0,m.useState)(e.includeProgressReplies),[ed,ec]=(0,m.useState)(A(e.readyLabels).join(", ")),[eu,em]=(0,m.useState)(A(e.blockingLabels).join(", ")),[eh,ep]=(0,m.useState)(A(e.autoLabelWhitelist).join(", ")),[ex,eg]=(0,m.useState)(A(e.priorityAuthors).join(", ")),[ef,eb]=(0,m.useState)(A(e.trustedReviewers).join(", ")),[ev,ej]=(0,m.useState)(A(e.trustedBots).join(", ")),[ey,ew]=(0,m.useState)(A(e.ignoredBots).join(", ")),[eN,eS]=(0,m.useState)(e.minAuthorAssociation),[ek,eA]=(0,m.useState)(e.deploymentPlatform??""),[eC,eR]=(0,m.useState)(e.maxAttempts),[eL,eP]=(0,m.useState)(e.escalateModelOnRetry),[eM,eD]=(0,m.useState)("docker"===e.sandbox),[e$,eI]=(0,m.useState)(e.sandboxImage??""),[eE,eF]=(0,m.useState)(e.sandboxAllowNetwork),[eT,eB]=(0,m.useState)(e.sandboxCpus??""),[eO,eq]=(0,m.useState)(e.sandboxMemory??""),[ez,eU]=(0,m.useState)(e.adoptClaudeMem),[eV,eH]=(0,m.useState)(e.agentInstructions??""),[eG,eW]=(0,m.useTransition)(),[e_,eJ]=(0,m.useState)(!1),{error:eQ}=(0,w.d)();function eZ(t){eJ(!1),eW(async()=>{try{await (0,k.u)(e.id,t),eJ(!0),setTimeout(()=>eJ(!1),1500)}catch(e){eQ("Failed to update automation",e instanceof Error?e.message:String(e))}})}return(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsx)(x.F,{tone:"info",icon:n.A,title:"Bounded & configurable",children:"Most stages are off by default and consume paid agent usage; PR review-feedback is on by default and can be turned off below. Drydock auto-merges a PR only once its configured gates pass — and merging a PR with no automated checks at all requires the explicit opt-in below."}),(0,a.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[(0,a.jsx)(f.L,{icon:r.A,legend:"Triage",tone:"primary",description:"Classify and label brand-new issues.",children:(0,a.jsxs)(R,{label:"Auto-triage new issues",checked:t,onChange:e=>{s(e),eZ({autoTriageEnabled:e})},help:"Reads each new issue and applies whitelisted labels. Never processes — only classifies.",children:[(0,a.jsx)(L,{label:"Auto-label whitelist",value:eh,onChange:ep,onBlur:()=>eZ({autoLabelWhitelist:C(eh)}),help:"Triage may only apply labels from this list."}),(0,a.jsx)(g.D,{label:(0,a.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:["Act on authors",(0,a.jsx)(N.V,{content:"Restrict automation to issues from trusted authors."})]}),children:(0,a.jsxs)(v.l,{value:eN,onChange:e=>{let t=e.target.value;eS(t),eZ({minAuthorAssociation:t})},className:"h-8 text-xs",children:[(0,a.jsx)("option",{value:"approved",children:"Owners / members / collaborators"}),(0,a.jsx)("option",{value:"any",children:"Anyone (public participation)"})]})})]})}),(0,a.jsxs)(f.L,{icon:l.A,legend:"Processing",tone:"primary",description:"Turn ready issues into pull requests.",children:[(0,a.jsxs)(R,{label:"Auto-process ready issues",checked:M,onChange:e=>{D(e),eZ({autoProcessEnabled:e})},help:"Works issues that are ready and not blocked, opening a PR for each.",children:[(0,a.jsx)(L,{label:"Ready labels",value:ed,onChange:ec,onBlur:()=>eZ({readyLabels:C(ed)}),help:"Only issues carrying one of these labels are eligible."}),(0,a.jsx)(L,{label:"Blocking labels",value:eu,onChange:em,onBlur:()=>eZ({blockingLabels:C(eu)}),help:"Any of these labels holds an issue back."}),(0,a.jsx)(L,{label:"Priority authors",value:ex,onChange:eg,onBlur:()=>eZ({priorityAuthors:C(ex)}),help:"Issues from these authors jump the queue."}),(0,a.jsx)(g.D,{label:"Max attempts",children:(0,a.jsx)(b.p,{type:"number",min:1,value:eC,onChange:e=>eR(Number(e.target.value)),onBlur:()=>eZ({maxAttempts:eC}),className:"h-8 w-24 text-xs"})})]}),(0,a.jsx)(R,{label:"Escalate model on retry",checked:eL,onChange:e=>{eP(e),eZ({escalateModelOnRetry:e})},help:"When a failed job is requeued, the next attempt runs the next-stronger model in this agent's ladder (capped at the strongest). Each attempt is priced at the model it actually ran."}),(0,a.jsx)(R,{label:"Decompose large issues",checked:O,onChange:e=>{q(e),eZ({autoDecompose:e})},help:"Splits big issues into ordered, tracked subtasks before working them."}),(0,a.jsx)(R,{label:"Plan before implementing",checked:z,onChange:e=>{U(e),eZ({planFirst:e})},help:"A read-only planning pass before implementation; the plan is posted on the issue and embedded in the work prompt. Falls back to a normal run on failure."}),(0,a.jsx)(R,{label:"Verify PR satisfies issue",checked:V,onChange:e=>{H(e),eZ({verifyPr:e})},help:"A read-only pass after the PR opens that checks the diff against the issue and flags gaps. Never changes state on failure."}),(0,a.jsxs)(R,{label:"Audit PRs with an AI review",checked:G,onChange:e=>{W(e),eZ({autoPrAudit:e})},help:"A read-only, whole-PR review (Bugbot/CodeRabbit style) posted on the issue after the PR opens. Advisory only — it never merges, blocks, or edits anything.",children:[(0,a.jsx)(g.D,{label:(0,a.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:["Audit agent",(0,a.jsx)(N.V,{content:"CLI agent that runs the audit. Switching agents resets the audit model to that agent's default."})]}),children:(0,a.jsx)(h.a,{value:_,onChange:e=>{if("openrouter"===e)return;let t=(0,S.VJ)(e);J(e),Z(t),eZ({prAuditAgent:e,prAuditModel:t})},className:"h-8 text-xs"})}),(0,a.jsx)(g.D,{label:(0,a.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:["Audit model",(0,a.jsx)(N.V,{content:"Model used for the audit run."})]}),children:(0,a.jsx)(p.o,{value:Q,onChange:e=>{Z(e),eZ({prAuditModel:e})},agent:_,className:"h-8 text-xs"})}),(0,a.jsx)(g.D,{label:(0,a.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:["Review language",(0,a.jsx)(N.V,{content:"Language the review is written in (e.g. en, de, pt-BR). English is the default."})]}),children:(0,a.jsx)(b.p,{value:K,onChange:e=>X(e.target.value),onBlur:()=>{let e=K.trim()||"en";(X(e),/^[a-zA-Z]{2,8}(-[a-zA-Z0-9]{1,8})*$/.test(e))?eZ({prAuditLanguage:e}):eQ("Invalid review language",`"${e}" is not a language code — use a simple or BCP 47 code like en, de, or pt-BR.`)},placeholder:"en",className:"h-8 w-24 font-mono text-xs"})}),(0,a.jsxs)("div",{className:"flex items-center gap-2.5 self-end pb-1.5",children:[(0,a.jsx)(j.d,{checked:Y,onChange:e=>{ee(e),eZ({prAuditPostOnPr:e})},"aria-label":"Also comment on the PR"}),(0,a.jsx)("span",{className:"text-sm",children:"Also comment on the PR"}),(0,a.jsx)(N.V,{content:"Mirror the review on the pull request in addition to the issue."})]})]}),(0,a.jsxs)(R,{label:"Address PR review feedback",checked:T,onChange:e=>{B(e),eZ({autoReviewFeedback:e})},help:"Runs the mechanical iteration for trusted reviewers and allowlisted bots.",children:[(0,a.jsx)(L,{label:"Trusted reviewers",value:ef,onChange:eb,onBlur:()=>eZ({trustedReviewers:C(ef)}),help:"Only feedback from these reviewers is acted on."}),(0,a.jsx)(L,{label:"Trusted bots",value:ev,onChange:ej,onBlur:()=>eZ({trustedBots:C(ev)}),help:"Bot reviewers (e.g. cursor[bot]) whose findings are acted on. Bots not listed here are ignored."}),(0,a.jsx)(L,{label:"Ignored bots",value:ey,onChange:ew,onBlur:()=>eZ({ignoredBots:C(ey)}),help:"Review comments from these bots are always skipped, even if also listed as trusted."})]}),(0,a.jsx)(R,{label:"Repair trivial merge conflicts",checked:er,onChange:e=>{el(e),eZ({autoResolveMergeConflicts:e})},help:"Rebases and resolves mechanical conflicts; complex ones still escalate."})]}),(0,a.jsxs)(f.L,{icon:i.A,legend:"CI & deploy healing",tone:"warning",description:"Keep checks and deployments green.",children:[(0,a.jsx)(R,{label:"Auto-heal failing CI",checked:$,onChange:e=>{I(e),eZ({autoHealCi:e})},help:"Attempts bounded, verified fixes for failing CI. Never touches external or AI-review checks."}),(0,a.jsx)(R,{label:"Merge PRs with no CI checks",checked:E,onChange:e=>{F(e),eZ({mergeWithoutChecks:e})},help:"For repos with manual-only or review-bot-only CI. After the merge-gate settle window, merges a PR that reports no checks at all — with NO automated verification. Leave off unless this repo truly has no automated CI."}),(0,a.jsx)(R,{label:"Heal failed deployments",checked:et,onChange:e=>{es(e),eZ({autoHealDeployments:e})},help:"Monitors a merged PR's deployment and, on failure, opens a follow-up fix PR with the captured logs.",children:(0,a.jsx)(g.D,{label:"Deployment platform",children:(0,a.jsxs)(v.l,{value:ek,onChange:e=>{let t=e.target.value;eA(t),eZ({deploymentPlatform:t||null})},className:"h-8 text-xs",children:[(0,a.jsx)("option",{value:"",children:"Auto-detect"}),(0,a.jsx)("option",{value:"vercel",children:"Vercel"}),(0,a.jsx)("option",{value:"railway",children:"Railway"})]})})})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsx)(f.L,{icon:o.A,legend:"Releases",tone:"success",description:"Cut releases from merged work.",children:(0,a.jsx)(R,{label:"Manage releases",checked:ea,onChange:e=>{en(e),eZ({releaseEnabled:e})},help:"Evaluates merged PRs since the last tag, picks the semver bump, and publishes — gated by a global kill-switch and fully previewable."})}),(0,a.jsx)(f.L,{icon:d.A,legend:"Sandbox",tone:"warning",description:"Isolate agent execution in a container.",children:(0,a.jsxs)(R,{label:"Run the agent in a container",checked:eM,onChange:e=>{eD(e),eZ({sandbox:e?"docker":"none"})},help:"Runs this repo's agent sessions inside a container with the worktree bind-mounted as the only writable host path. Requires Docker or Podman on the host and an image that carries the agent CLI plus the repo's toolchain (devcontainer.json image is used if present). Git push still happens on the host.",children:[(0,a.jsx)(g.D,{label:(0,a.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:["Image override",(0,a.jsx)(N.V,{content:"Container image to run in. Leave blank to use the repo's devcontainer.json image, else the global default image from Settings."})]}),children:(0,a.jsx)(b.p,{value:e$,onChange:e=>eI(e.target.value),onBlur:()=>eZ({sandboxImage:e$.trim()||null}),placeholder:"devcontainer / global default",className:"h-8 font-mono text-xs"})}),(0,a.jsx)(g.D,{label:(0,a.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:["Resource caps",(0,a.jsx)(N.V,{content:"Optional --cpus and --memory limits (e.g. 2 and 4g). Leave blank for no limit."})]}),children:(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(b.p,{value:eT,onChange:e=>eB(e.target.value),onBlur:()=>{let e=eT.trim();e&&!/^\d+(\.\d+)?$/.test(e)?eQ("Invalid CPU limit","Use a positive number like 0.5, 1, or 2."):eZ({sandboxCpus:e||null})},placeholder:"cpus",className:"h-8 w-20 font-mono text-xs"}),(0,a.jsx)(b.p,{value:eO,onChange:e=>eq(e.target.value),onBlur:()=>{let e=eO.trim();e&&!/^\d+(\.\d+)?\s*[bkmg]?$/i.test(e)?eQ("Invalid memory limit","Use a value like 512m, 2g, or 4096."):eZ({sandboxMemory:e||null})},placeholder:"memory",className:"h-8 w-24 font-mono text-xs"})]})}),(0,a.jsxs)("div",{className:"flex items-center gap-2.5 self-end pb-1.5 sm:col-span-2",children:[(0,a.jsx)(j.d,{checked:eE,onChange:e=>{eF(e),eZ({sandboxAllowNetwork:e})},"aria-label":"Allow network access"}),(0,a.jsx)("span",{className:"text-sm",children:"Allow network access"}),(0,a.jsx)(N.V,{content:"Off (default) runs the container with --network none. Turn on only if the toolchain must fetch dependencies during the run."})]})]})}),(0,a.jsx)(f.L,{icon:c.A,legend:"Memory",description:"Carry agent memory back to the parent project.",children:(0,a.jsx)(R,{label:"Adopt claude-mem memory on cleanup",checked:ez,onChange:e=>{eU(e),eZ({adoptClaudeMem:e})},help:"Requires the claude-mem plugin. Before a job's throwaway worktree is removed, runs claude-mem's adoption so a merged job's memory is consolidated into the parent project instead of being stranded in a per-worktree bucket. Best-effort: skipped silently if claude-mem is not installed."})}),(0,a.jsx)(f.L,{icon:u.A,legend:"Notifications",description:"How Drydock talks back on the issue.",children:(0,a.jsx)(R,{label:"Post progress replies",checked:ei,onChange:e=>{eo(e),eZ({includeProgressReplies:e})},help:"Comments status updates on the issue as the job advances."})})]})]}),(0,a.jsx)(g.D,{label:"Agent instructions",hint:(0,a.jsxs)(a.Fragment,{children:["Optional. Appended to the work prompt as a dedicated section — coding conventions, “always run pnpm test”, “don’t touch legacy/”, preferred PR style. Max ",4e3," characters; empty leaves the prompt unchanged."]}),children:(0,a.jsx)(y.T,{value:eV,maxLength:4e3,rows:3,onChange:e=>eH(e.target.value),onBlur:()=>eZ({agentInstructions:eV.trim()||null}),placeholder:"Per-repo guidance injected into the work prompt…",className:"font-mono text-xs"})}),(0,a.jsx)("div",{"aria-live":"polite",className:"h-4 text-xs text-muted-foreground",children:eG?"Saving…":e_?"Saved":""})]})}}},e=>{e.O(0,[9843,8264,8745,6634,3433,8382,3894,9655,4234,7358],()=>e(e.s=4602)),_N_E=e.O()}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4662],{395:(e,t,a)=>{"use strict";a.d(t,{$:()=>i});var s=a(515),r=a(1171),n=a(5832);let l={default:"bg-primary text-primary-foreground shadow-sm hover-elevate active-elevate-2",secondary:"bg-secondary text-secondary-foreground hover-elevate active-elevate-2",outline:"border border-border bg-transparent shadow-sm hover-elevate active-elevate-2",destructive:"bg-destructive text-destructive-foreground shadow-sm hover-elevate active-elevate-2",ghost:"border border-transparent hover-elevate active-elevate-2",success:"bg-success text-white shadow-sm hover-elevate active-elevate-2"},o={default:"h-9 px-4 py-2 rounded-lg text-sm",sm:"h-8 px-3 rounded-md text-xs",lg:"h-10 px-6 rounded-lg text-sm",icon:"h-9 w-9 rounded-lg","icon-sm":"h-8 w-8 rounded-md"},i=r.forwardRef(({className:e,variant:t="default",size:a="default",type:r="button",...i},d)=>(0,s.jsx)("button",{ref:d,type:r,className:(0,n.cn)("inline-flex items-center justify-center gap-2 whitespace-nowrap font-medium transition-colors focus-ring","disabled:pointer-events-none disabled:opacity-50","[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",l[t],o[a],e),...i}));i.displayName="Button"},1528:(e,t,a)=>{"use strict";a.d(t,{A:()=>s});let s=(0,a(1330).A)("refresh-cw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]])},2655:(e,t,a)=>{"use strict";a.d(t,{A:()=>s});let s=(0,a(1330).A)("container",[["path",{d:"M22 7.7c0-.6-.4-1.2-.8-1.5l-6.3-3.9a1.72 1.72 0 0 0-1.7 0l-10.3 6c-.5.2-.9.8-.9 1.4v6.6c0 .5.4 1.2.8 1.5l6.3 3.9a1.72 1.72 0 0 0 1.7 0l10.3-6c.5-.3.9-1 .9-1.5Z",key:"1t2lqe"}],["path",{d:"M10 21.9V14L2.1 9.1",key:"o7czzq"}],["path",{d:"m10 14 11.9-6.9",key:"zm5e20"}],["path",{d:"M14 19.8v-8.1",key:"159ecu"}],["path",{d:"M18 17.5V9.4",key:"11uown"}]])},3123:(e,t,a)=>{"use strict";a.d(t,{$:()=>r});var s=a(5097);let r=(0,s.createServerReference)("40000b4b84e28d5ae3c149ab9bea206d1cb6c08e36",s.callServer,void 0,s.findSourceMapURL,"togglePauseAction")},3798:(e,t,a)=>{"use strict";a.d(t,{A:()=>s});let s=(0,a(1330).A)("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]])},4266:(e,t,a)=>{"use strict";a.d(t,{A:()=>s});let s=(0,a(1330).A)("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]])},5529:(e,t,a)=>{"use strict";a.d(t,{Wu:()=>d,ZB:()=>i,Zp:()=>l,aR:()=>o});var s=a(515),r=a(5832);let n={none:"",sm:"p-4",default:"p-5",lg:"p-6"};function l({className:e,pad:t,hover:a,...o}){return(0,s.jsx)("div",{className:(0,r.cn)("rounded-xl border border-card-border bg-card text-card-foreground shadow-sm",a&&"hover-elevate transition-shadow hover:shadow-md",t&&n[t],e),...o})}function o({className:e,...t}){return(0,s.jsx)("div",{className:(0,r.cn)("flex flex-col gap-1.5 p-5",e),...t})}function i({className:e,...t}){return(0,s.jsx)("h3",{className:(0,r.cn)("text-base font-semibold leading-none tracking-tight",e),...t})}function d({className:e,...t}){return(0,s.jsx)("div",{className:(0,r.cn)("p-5 pt-0",e),...t})}},5662:(e,t,a)=>{"use strict";a.d(t,{A:()=>s});let s=(0,a(1330).A)("octagon-alert",[["path",{d:"M12 16h.01",key:"1drbdi"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M15.312 2a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586l-4.688-4.688A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2z",key:"1fd625"}]])},5832:(e,t,a)=>{"use strict";function s(...e){return e.filter(Boolean).join(" ")}function r(e){if(!e)return"no activity";let t=Math.floor(Date.now()/1e3)-e;return t<60?"just now":t<3600?`${Math.floor(t/60)}m ago`:t<86400?`${Math.floor(t/3600)}h ago`:t<604800?`${Math.floor(t/86400)}d ago`:new Date(1e3*e).toLocaleDateString()}function n(e){if(e>=3600){let t=Math.floor(e/3600),a=Math.round(e%3600/60);return a>0?`${t}h ${a}m`:`${t}h`}return e>=60?`${Math.floor(e/60)}m ${e%60}s`:`${e}s`}function l(e,t=2){return`$${e.toFixed(t)}`}a.d(t,{KW:()=>r,UK:()=>l,a3:()=>n,cn:()=>s})},7671:(e,t,a)=>{Promise.resolve().then(a.bind(a,9290)),Promise.resolve().then(a.t.bind(a,742,23)),Promise.resolve().then(a.bind(a,8650))},8108:(e,t,a)=>{"use strict";a.d(t,{A:()=>s});let s=(0,a(1330).A)("loader-circle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]])},8479:(e,t,a)=>{"use strict";a.d(t,{t:()=>m,d:()=>h});var s=a(515),r=a(8131),n=a(6003),l=a(6512),o=a(5378),i=a(1171);function d(e){return"error"===e?"assertive":"polite"}var c=a(5832);let u=(0,i.createContext)(null);function m({children:e}){let[t,a]=(0,i.useState)([]),r=(0,i.useCallback)(e=>{a(t=>t.filter(t=>t.id!==e))},[]),n=(0,i.useCallback)(e=>{let t=Date.now()+Math.random(),s={id:t,title:e.title,description:e.description,variant:e.variant??"info",href:e.href};a(e=>[...e,s]),setTimeout(()=>r(t),5e3)},[r]),l=(0,i.useMemo)(()=>({toast:n,success:(e,t)=>n({title:e,description:t,variant:"success"}),error:(e,t)=>n({title:e,description:t,variant:"error"}),info:(e,t)=>n({title:e,description:t,variant:"info"})}),[n]);return(0,s.jsxs)(u.Provider,{value:l,children:[e,(0,s.jsx)(f,{toasts:t,onDismiss:r})]})}function h(){let e=(0,i.useContext)(u);if(!e)throw Error("useToast must be used within a ToastProvider");return e}let x={success:r.A,error:n.A,info:l.A},p={success:{icon:"text-success",bar:"bg-success"},error:{icon:"text-destructive",bar:"bg-destructive"},info:{icon:"text-primary",bar:"bg-primary"}};function g({toast:e,onDismiss:t}){let a=x[e.variant],r=p[e.variant];return(0,s.jsxs)("div",{className:"dd-toast dd-toast-in pointer-events-auto relative flex items-start gap-3 overflow-hidden rounded-xl border border-card-border bg-card p-3.5 shadow-lg",children:[(0,s.jsx)(a,{className:(0,c.cn)("mt-0.5 h-[18px] w-[18px] shrink-0",r.icon)}),(0,s.jsxs)("div",{className:"min-w-0 flex-1",children:[e.href?(0,s.jsx)("a",{href:e.href,className:"text-sm font-medium underline-offset-2 hover:underline",children:e.title}):(0,s.jsx)("p",{className:"text-sm font-medium",children:e.title}),e.description&&(0,s.jsx)("p",{className:"mt-0.5 text-xs text-muted-foreground",children:e.description})]}),(0,s.jsx)("button",{type:"button","aria-label":"Dismiss notification",onClick:()=>t(e.id),className:"shrink-0 rounded-md p-0.5 text-muted-foreground hover-elevate",children:(0,s.jsx)(o.A,{className:"h-3.5 w-3.5"})}),(0,s.jsx)("span",{className:(0,c.cn)("dd-toast-progress absolute bottom-0 left-0 h-0.5 w-full",r.bar),style:{animationDuration:"5000ms"}})]})}function f({toasts:e,onDismiss:t}){let a=e.filter(e=>"assertive"===d(e.variant)),r=e.filter(e=>"polite"===d(e.variant));return(0,s.jsxs)("div",{className:"pointer-events-none fixed bottom-4 right-4 z-[60] flex w-full max-w-sm flex-col gap-2",children:[(0,s.jsx)("div",{role:"alert","aria-live":"assertive","aria-atomic":"false",className:"flex flex-col gap-2",children:a.map(e=>(0,s.jsx)(g,{toast:e,onDismiss:t},e.id))}),(0,s.jsx)("div",{"aria-live":"polite","aria-atomic":"false",className:"flex flex-col gap-2",children:r.map(e=>(0,s.jsx)(g,{toast:e,onDismiss:t},e.id))})]})}},8650:(e,t,a)=>{"use strict";a.d(t,{SettingsForm:()=>O});var s=a(515),r=a(5662),n=a(1330);let l=(0,n.A)("zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),o=(0,n.A)("terminal",[["path",{d:"M12 19h8",key:"baeox8"}],["path",{d:"m4 17 6-6-6-6",key:"1yngyt"}]]);var i=a(2655);let d=(0,n.A)("bell",[["path",{d:"M10.268 21a2 2 0 0 0 3.464 0",key:"vwvbt9"}],["path",{d:"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326",key:"11g9vi"}]]),c=(0,n.A)("globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]),u=(0,n.A)("plug-zap",[["path",{d:"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z",key:"goz73y"}],["path",{d:"m2 22 3-3",key:"19mgm9"}],["path",{d:"M7.5 13.5 10 11",key:"7xgeeb"}],["path",{d:"M10.5 16.5 13 14",key:"10btkg"}],["path",{d:"m18 3-4 4h6l-4 4",key:"16psg9"}]]);var m=a(1528);let h=(0,n.A)("archive",[["rect",{width:"20",height:"5",x:"2",y:"3",rx:"1",key:"1wp1u1"}],["path",{d:"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8",key:"1s80jp"}],["path",{d:"M10 12h4",key:"a56b0p"}]]);var x=a(8762),p=a(2235),g=a(1171),f=a(7241),b=a(9754),v=a(4783),j=a(395),y=a(5529),N=a(4148),w=a(7217),k=a(7405),C=a(8067),A=a(598),M=a(1059),D=a(8479);let S=["needs_human","job_failed","pr_opened","pr_merged","release_published","cost_limit","claude_limit","codex_limit","openrouter_limit","auth_expired","automation_paused"],R={needs_human:"Job needs human",job_failed:"Job aborted or failed",pr_opened:"Pull request opened",pr_merged:"Pull request merged",release_published:"Release published",cost_limit:"Daily cost limit reached",claude_limit:"Claude usage limit reached or cleared",codex_limit:"Codex usage limit reached or cleared",openrouter_limit:"OpenRouter limit reached or cleared",auth_expired:"Credentials expired or restored",automation_paused:"Automation paused or draining"};var P=a(5097);let _=(0,P.createServerReference)("4036ea31e7e76d9ed4abb3d277306f5d53ed4f7432",P.callServer,void 0,P.findSourceMapURL,"testOpenRouterConnectionAction"),T=(0,P.createServerReference)("409564d3de62f628e18708a10990c69b1344786a55",P.callServer,void 0,P.findSourceMapURL,"refreshOpenRouterCatalogAction");var L=a(3123);let E=(0,P.createServerReference)("40e798a082ede38293e3636950eb02a1cb2ba49149",P.callServer,void 0,P.findSourceMapURL,"saveSettingsAction"),$=(0,P.createServerReference)("005c29168158919ad4ebdef049c32f2af73de865a5",P.callServer,void 0,P.findSourceMapURL,"sendTestNotificationAction");function O({initial:e,openrouter:t}){let[a,n]=(0,g.useState)(e),[P,U]=(0,g.useTransition)(),[z,I]=(0,g.useTransition)(),[F,H]=(0,g.useTransition)(),[W,Z]=(0,g.useTransition)(),q=(0,p.useRouter)(),{success:J,error:K,info:B}=(0,D.d)(),V=(e,t)=>{n(a=>({...a,[e]:t}))};return(0,s.jsxs)("div",{className:"flex flex-col gap-4",children:[a.paused&&(0,s.jsx)(v.F,{tone:"warning",icon:r.A,title:"Global kill-switch is on",children:"All automation is suspended across every repository. Manual runs still work."}),(0,s.jsxs)(y.Zp,{pad:"lg",children:[(0,s.jsxs)("div",{className:"mb-4 flex items-center gap-3",children:[(0,s.jsx)("span",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-primary",children:(0,s.jsx)(l,{className:"h-4 w-4"})}),(0,s.jsxs)("div",{children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:"Automation & limits"}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"One switch to halt everything, plus how aggressively the dock works."})]})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between gap-4 rounded-lg border border-border p-3",children:[(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("p",{className:"text-sm font-medium text-foreground",children:"Global kill-switch"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"Immediately pause all triage, processing, healing and releases."})]}),(0,s.jsx)(M.d,{checked:a.paused,disabled:F,onChange:e=>{V("paused",e),H(async()=>{try{await (0,L.$)(e),B(e?"Automation suspended":"Automation resumed")}catch(t){V("paused",!e),K("Failed to toggle automation",t instanceof Error?t.message:String(t))}})},"aria-label":"Global kill-switch"})]}),(0,s.jsxs)("div",{className:"flex items-center justify-between gap-4 rounded-lg border border-border p-3",children:[(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("p",{className:"text-sm font-medium text-foreground",children:"Release management"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"Let the dock tag and publish releases automatically."})]}),(0,s.jsx)(M.d,{checked:a.releaseManagementEnabled,onChange:e=>V("releaseManagementEnabled",e),"aria-label":"Release management"})]}),(0,s.jsxs)("div",{className:"flex items-center justify-between gap-4 rounded-lg border border-border p-3",children:[(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("p",{className:"text-sm font-medium text-foreground",children:"Auto-wait on Claude usage limits"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"Park jobs when the Claude quota is exhausted and resume them automatically once it resets, instead of paging you."})]}),(0,s.jsx)(M.d,{checked:a.claudeLimitAutoWait,onChange:e=>V("claudeLimitAutoWait",e),"aria-label":"Auto-wait on Claude usage limits"})]}),(0,s.jsxs)("div",{className:"flex items-center justify-between gap-4 rounded-lg border border-border p-3",children:[(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("p",{className:"text-sm font-medium text-foreground",children:"Auto-wait on Codex usage limits"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"Park jobs when the Codex quota or rate limit is exhausted and resume them automatically once capacity returns, instead of paging you."})]}),(0,s.jsx)(M.d,{checked:a.codexLimitAutoWait,onChange:e=>V("codexLimitAutoWait",e),"aria-label":"Auto-wait on Codex usage limits"})]}),(0,s.jsxs)("div",{className:"flex items-center justify-between gap-4 rounded-lg border border-border p-3",children:[(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("p",{className:"text-sm font-medium text-foreground",children:"Auto-resume on turn budget"}),(0,s.jsxs)("p",{className:"text-xs text-muted-foreground",children:["When a job exhausts a positive ",(0,s.jsx)("code",{children:"max turns"})," budget, resume it to continue the work (a few times) instead of parking it in needs-human. Only applies when a turn budget is set."]})]}),(0,s.jsx)(M.d,{checked:a.maxTurnsAutoResume,onChange:e=>V("maxTurnsAutoResume",e),"aria-label":"Auto-resume on turn budget"})]}),(0,s.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:[(0,s.jsx)(w.D,{label:"Poll interval (s)",hint:"How often to check for new issues.",children:(0,s.jsx)(k.p,{type:"number",value:a.pollIntervalSec,onChange:e=>V("pollIntervalSec",Number(e.target.value))})}),(0,s.jsx)(w.D,{label:"Concurrent jobs",hint:"Max runs in flight at once.",children:(0,s.jsx)(k.p,{type:"number",value:a.maxParallelJobs,onChange:e=>V("maxParallelJobs",Number(e.target.value))})}),(0,s.jsx)(w.D,{label:"Daily cost limit (USD)",hint:"Stops new runs once reached today. 0 disables the daily budget (unlimited).",children:(0,s.jsx)(k.p,{type:"number",min:"0",step:"0.5",value:a.dailyCostLimitUsd,onChange:e=>V("dailyCostLimitUsd",Number(e.target.value))})}),(0,s.jsx)(w.D,{label:"Max turns",hint:"Hard cap on agent turns per job. 0 = unlimited.",children:(0,s.jsx)(k.p,{type:"number",min:"0",value:a.maxTurns,onChange:e=>V("maxTurns",Number(e.target.value))})}),(0,s.jsx)(w.D,{label:"Max job minutes",hint:"Abort a run after this wall-clock time.",children:(0,s.jsx)(k.p,{type:"number",value:a.maxJobMinutes,onChange:e=>V("maxJobMinutes",Number(e.target.value))})}),(0,s.jsx)(w.D,{label:"Max CI wait (min)",hint:"How long to wait for CI before giving up.",children:(0,s.jsx)(k.p,{type:"number",value:a.maxCiWaitMinutes,onChange:e=>V("maxCiWaitMinutes",Number(e.target.value))})}),(0,s.jsx)(w.D,{label:"Max job cost (USD)",hint:"0 disables the per-job cost cap.",children:(0,s.jsx)(k.p,{type:"number",min:"0",step:"0.01",value:a.maxJobCostUsd,onChange:e=>V("maxJobCostUsd",Number(e.target.value))})}),(0,s.jsx)(w.D,{label:"Default agent",hint:"Used when a repo has none set.",children:(0,s.jsx)(f.a,{value:a.defaultAgent,onChange:e=>{"openrouter"!==e&&V("defaultAgent",e)}})}),(0,s.jsx)(w.D,{label:"Default model",hint:"Used when a repo has none set.",children:(0,s.jsx)(b.o,{value:a.defaultModel,onChange:e=>V("defaultModel",e),agent:a.defaultAgent})})]})]})]}),(0,s.jsxs)(y.Zp,{pad:"lg",children:[(0,s.jsxs)("div",{className:"mb-4 flex items-center gap-3",children:[(0,s.jsx)("span",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-secondary text-muted-foreground",children:(0,s.jsx)(o,{className:"h-4 w-4"})}),(0,s.jsxs)("div",{children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:"Execution paths"}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"Where to find the CLIs the dock shells out to."})]})]}),(0,s.jsxs)("div",{className:"grid gap-4 sm:grid-cols-3",children:[(0,s.jsx)(w.D,{label:"claude CLI path",children:(0,s.jsx)(k.p,{value:a.claudePath,onChange:e=>V("claudePath",e.target.value),spellCheck:!1})}),(0,s.jsx)(w.D,{label:"codex CLI path",children:(0,s.jsx)(k.p,{value:a.codexPath,onChange:e=>V("codexPath",e.target.value),spellCheck:!1})}),(0,s.jsx)(w.D,{label:"gh CLI path",children:(0,s.jsx)(k.p,{value:a.ghPath,onChange:e=>V("ghPath",e.target.value),spellCheck:!1})})]})]}),(0,s.jsxs)(y.Zp,{pad:"lg",children:[(0,s.jsxs)("div",{className:"mb-4 flex items-center gap-3",children:[(0,s.jsx)("span",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-primary",children:(0,s.jsx)(i.A,{className:"h-4 w-4"})}),(0,s.jsxs)("div",{children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:"Sandboxed execution"}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"Defaults for repos that run the agent inside a container. Enable it per repo from the repo's automation panel."})]})]}),(0,s.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2",children:[(0,s.jsx)(w.D,{label:"Default container image",hint:"Used when a sandboxed repo names no image and has no devcontainer.json. Must carry the agent CLI plus the repo's toolchain.",children:(0,s.jsx)(k.p,{value:a.sandboxDefaultImage,onChange:e=>V("sandboxDefaultImage",e.target.value),spellCheck:!1,className:"font-mono text-sm"})}),(0,s.jsx)(w.D,{label:"Container runtime",hint:"“Auto” probes docker, then podman.",children:(0,s.jsxs)(C.l,{value:a.containerRuntime,onChange:e=>V("containerRuntime",e.target.value),children:[(0,s.jsx)("option",{value:"auto",children:"Auto-detect (docker → podman)"}),(0,s.jsx)("option",{value:"docker",children:"Docker"}),(0,s.jsx)("option",{value:"podman",children:"Podman"})]})})]})]}),(0,s.jsxs)(y.Zp,{pad:"lg",children:[(0,s.jsxs)("div",{className:"mb-4 flex items-center gap-3",children:[(0,s.jsx)("span",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-primary",children:(0,s.jsx)(d,{className:"h-4 w-4"})}),(0,s.jsxs)("div",{children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:"Notification channels"}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"Configure one or more channels, then send yourself a test."})]})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between gap-4 rounded-lg border border-border p-3",children:[(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("p",{className:"text-sm font-medium text-foreground",children:"Needs-human sound"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"Play a short sound in an open dashboard tab the moment a job parks and needs you. Honors your browser's autoplay policy — it sounds after your first interaction."})]}),(0,s.jsx)(M.d,{checked:a.needsHumanSoundEnabled,onChange:e=>V("needsHumanSoundEnabled",e),"aria-label":"Needs-human sound"})]}),(0,s.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2",children:[(0,s.jsx)(w.D,{label:"Telegram bot token",hint:"Leave empty to disable Telegram.",children:(0,s.jsx)(k.p,{value:a.telegramBotToken,onChange:e=>V("telegramBotToken",e.target.value),autoComplete:"off",spellCheck:!1})}),(0,s.jsx)(w.D,{label:"Telegram chat ID",children:(0,s.jsx)(k.p,{value:a.telegramChatId,onChange:e=>V("telegramChatId",e.target.value),spellCheck:!1})})]}),(0,s.jsx)("div",{className:"grid gap-4",children:(0,s.jsx)(w.D,{label:"Slack incoming webhook URL",hint:"Leave empty to disable Slack.",children:(0,s.jsx)(k.p,{value:a.slackWebhookUrl,onChange:e=>V("slackWebhookUrl",e.target.value),spellCheck:!1})})}),(0,s.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2",children:[(0,s.jsx)(w.D,{label:"SMTP host",hint:"Leave empty to disable email.",children:(0,s.jsx)(k.p,{value:a.smtpHost,onChange:e=>V("smtpHost",e.target.value)})}),(0,s.jsx)(w.D,{label:"SMTP port",children:(0,s.jsx)(k.p,{type:"number",value:a.smtpPort,onChange:e=>V("smtpPort",Number(e.target.value))})}),(0,s.jsx)(w.D,{label:"SMTP username",children:(0,s.jsx)(k.p,{value:a.smtpUser,onChange:e=>V("smtpUser",e.target.value),autoComplete:"off"})}),(0,s.jsx)(w.D,{label:"SMTP password",children:(0,s.jsx)(k.p,{type:"password",value:a.smtpPass,onChange:e=>V("smtpPass",e.target.value),autoComplete:"new-password"})}),(0,s.jsx)(w.D,{label:"From address",children:(0,s.jsx)(k.p,{type:"email",value:a.emailFrom,onChange:e=>V("emailFrom",e.target.value),placeholder:"drydock@example.com"})}),(0,s.jsx)(w.D,{label:"To address",children:(0,s.jsx)(k.p,{type:"email",value:a.emailTo,onChange:e=>V("emailTo",e.target.value),placeholder:"you@example.com"})})]}),(0,s.jsx)(w.D,{label:"Notify me about",children:(0,s.jsx)("div",{className:"grid gap-2.5 sm:grid-cols-2",children:S.map(e=>(0,s.jsxs)("label",{htmlFor:`notify-${e}`,className:"flex cursor-pointer items-center gap-2.5 text-sm text-foreground",children:[(0,s.jsx)(N.S,{id:`notify-${e}`,checked:a.notifyEvents.includes(e),onChange:t=>V("notifyEvents",t?[...a.notifyEvents,e]:a.notifyEvents.filter(t=>t!==e)),"aria-label":R[e]}),R[e]]},e))})})]})]}),(0,s.jsxs)(y.Zp,{pad:"lg",children:[(0,s.jsxs)("div",{className:"mb-4 flex items-center gap-3",children:[(0,s.jsx)("span",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-primary",children:(0,s.jsx)(c,{className:"h-4 w-4"})}),(0,s.jsxs)("div",{children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:"OpenRouter"}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"Optional API backend with an auto-syncing model catalog, including free models."})]})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between gap-4 rounded-lg border border-border p-3",children:[(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("p",{className:"text-sm font-medium text-foreground",children:"Enable OpenRouter"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"Adds OpenRouter-hosted models as a selectable agent per repository. Repository code is sent to OpenRouter and its upstream model providers."})]}),(0,s.jsx)(M.d,{checked:a.openrouterEnabled,onChange:e=>V("openrouterEnabled",e),"aria-label":"Enable OpenRouter"})]}),(0,s.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2",children:[(0,s.jsx)(w.D,{label:"API key",hint:"Stored locally; DRYDOCK_OPENROUTER_API_KEY overrides it. Never logged.",children:(0,s.jsx)(k.p,{type:"password",autoComplete:"off",placeholder:"sk-or-v1-…",value:a.openrouterApiKey,onChange:e=>V("openrouterApiKey",e.target.value)})}),(0,s.jsx)(w.D,{label:"Catalog refresh (hours)",hint:"Minimum 0.25 (15 minutes).",children:(0,s.jsx)(k.p,{type:"number",min:"0.25",step:"0.25",value:a.openrouterCatalogRefreshHours,onChange:e=>{let t=Number(e.target.value);Number.isFinite(t)&&!(t<.25)&&V("openrouterCatalogRefreshHours",t)}})}),(0,s.jsx)(w.D,{label:"Default model",hint:"Used when a repo or job has none set.",children:(0,s.jsx)(b.o,{agent:"openrouter",openrouterModels:t.models,value:a.openrouterDefaultModel,onChange:e=>V("openrouterDefaultModel",e)})}),(0,s.jsx)(w.D,{label:"App attribution",hint:"Optional HTTP-Referer / X-Title headers.",children:(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)(k.p,{placeholder:"https://your-site.example",value:a.openrouterSiteUrl,onChange:e=>V("openrouterSiteUrl",e.target.value)}),(0,s.jsx)(k.p,{placeholder:"App name",value:a.openrouterAppName,onChange:e=>V("openrouterAppName",e.target.value)})]})})]}),(0,s.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between gap-4 rounded-lg border border-border p-3",children:[(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("p",{className:"text-sm font-medium text-foreground",children:"Free models only"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"Restrict every OpenRouter run to zero-cost catalog models."})]}),(0,s.jsx)(M.d,{checked:a.openrouterFreeModelsOnly,onChange:e=>V("openrouterFreeModelsOnly",e),"aria-label":"Free models only"})]}),(0,s.jsxs)("div",{className:"flex items-center justify-between gap-4 rounded-lg border border-border p-3",children:[(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("p",{className:"text-sm font-medium text-foreground",children:"Auto-wait on limits"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"Park jobs on OpenRouter 429s and resume them once the window resets."})]}),(0,s.jsx)(M.d,{checked:a.openrouterLimitAutoWait,onChange:e=>V("openrouterLimitAutoWait",e),"aria-label":"Auto-wait on OpenRouter limits"})]})]}),a.openrouterEnabled&&t.stale&&(0,s.jsx)(v.F,{tone:"warning",icon:r.A,title:"Model catalog is stale",children:t.lastError?`The last sync failed: ${t.lastError}. Pickers keep using the last-good snapshot.`:"The catalog has not synced recently. Pickers keep using the last-good snapshot."}),(0,s.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:t.modelCount>0?`${t.modelCount} models synced${t.lastSuccessAt?` \xb7 last sync ${new Date(1e3*t.lastSuccessAt).toLocaleString()}`:""}`:"No models synced yet."}),(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsxs)(j.$,{variant:"outline",onClick:()=>Z(async()=>{try{await E(a);let e=await _();e.ok?J("OpenRouter connection OK"):K("OpenRouter connection failed",e.error)}catch(e){K("OpenRouter connection failed",e instanceof Error?e.message:String(e))}}),disabled:W,children:[W?(0,s.jsx)(A.y,{size:16}):(0,s.jsx)(u,{className:"h-4 w-4"}),"Test connection"]}),(0,s.jsxs)(j.$,{variant:"outline",onClick:()=>Z(async()=>{try{await E(a);let e=await T();e.ok?(J(`Catalog refreshed — ${e.modelCount} models synced`),q.refresh()):K("Catalog refresh failed",e.error)}catch(e){K("Catalog refresh failed",e instanceof Error?e.message:String(e))}}),disabled:W,children:[W?(0,s.jsx)(A.y,{size:16}):(0,s.jsx)(m.A,{className:"h-4 w-4"}),"Refresh models"]})]})]})]})]}),(0,s.jsxs)(y.Zp,{pad:"lg",children:[(0,s.jsxs)("div",{className:"mb-4 flex items-center gap-3",children:[(0,s.jsx)("span",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-secondary text-muted-foreground",children:(0,s.jsx)(h,{className:"h-4 w-4"})}),(0,s.jsxs)("div",{children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:"Retention"}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"How long to keep job logs before they are pruned."})]})]}),(0,s.jsx)("div",{className:"grid gap-4 sm:grid-cols-3",children:(0,s.jsx)(w.D,{label:"Log retention (days)",hint:"Older job logs are deleted automatically.",children:(0,s.jsx)(k.p,{type:"number",value:a.retentionDays,onChange:e=>V("retentionDays",Number(e.target.value))})})})]}),(0,s.jsxs)("div",{className:"flex flex-wrap items-center justify-end gap-2",children:[(0,s.jsxs)(j.$,{variant:"outline",onClick:()=>I(async()=>{try{await E(a);let e=await $();if(0===e.length)return void K("No channels configured","Save a channel before sending a test.");let t=e.filter(e=>!e.ok);0===t.length?J(`Test sent to ${e.map(e=>e.channel).join(", ")}`):K("Some channels failed",t.map(e=>`${e.channel}: ${e.error??"unknown error"}`).join("; "))}catch(e){K("Failed to send test",e instanceof Error?e.message:String(e))}}),disabled:z,children:[z?(0,s.jsx)(A.y,{size:16}):(0,s.jsx)(x.A,{className:"h-4 w-4"}),z?"Sending…":"Send test notification"]}),(0,s.jsxs)(j.$,{onClick:()=>U(async()=>{try{await E(a),J("Settings saved")}catch(e){K("Failed to save settings",e instanceof Error?e.message:String(e))}}),disabled:P,children:[P&&(0,s.jsx)(A.y,{size:16}),P?"Saving…":"Save changes"]})]})]})}},8762:(e,t,a)=>{"use strict";a.d(t,{A:()=>s});let s=(0,a(1330).A)("send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]])}},e=>{e.O(0,[9843,8264,8382,9655,4234,7358],()=>e(e.s=7671)),_N_E=e.O()}]);
|
package/README.md
CHANGED
|
@@ -291,10 +291,16 @@ queued issue runs the whole pipeline — queue → implement → commit → PR
|
|
|
291
291
|
feedback → merge — with no toggles to flip. New repos default `autoTriageEnabled`,
|
|
292
292
|
`autoProcessEnabled`, `autoHealCi`, `autoResolveMergeConflicts`, `autoDecompose`,
|
|
293
293
|
`verifyPr`, `autoReviewFeedback` and `autoPrAudit` **on**, and there is **no daily cost
|
|
294
|
-
ceiling** by default, with
|
|
295
|
-
`
|
|
296
|
-
|
|
297
|
-
|
|
294
|
+
ceiling** by default, with an unlimited turn budget and a generous time budget
|
|
295
|
+
(`dailyCostLimitUsd = 0`, `maxTurns = 0` (unlimited), `maxJobMinutes = 120`; set
|
|
296
|
+
`maxTurns` to a positive value to cap turns per job). When a positive turn budget _is_
|
|
297
|
+
set and a session hits it, Drydock recognises the `error_max_turns` abort and — with
|
|
298
|
+
`maxTurnsAutoResume` **on** (default) — resumes the session to continue the work (bounded
|
|
299
|
+
retries) instead of parking it in `needs_human`; either way the escalation reads a clear
|
|
300
|
+
"turn budget (N) reached" rather than a generic "exited non-zero" ([issue #277]). Release
|
|
301
|
+
management stays **off** — cutting a release is hard to reverse and is triggered manually.
|
|
302
|
+
|
|
303
|
+
[issue #277]: https://github.com/NilsR0711/drydock/issues/277
|
|
298
304
|
|
|
299
305
|
> ⚠️ **Spend trade-off.** With auto-merge on and no cost ceiling, a new repo can incur
|
|
300
306
|
> **unbounded API spend on its first run** — including on prompt-injected or low-quality
|
|
@@ -319,7 +325,7 @@ Drydock is configured at runtime from the **Settings** page and per-repo control
|
|
|
319
325
|
¹ A source checkout (`pnpm dev`/`pnpm start`) defaults `DRYDOCK_DB` to `data/drydock.db` in the
|
|
320
326
|
project; the `drydock` launcher defaults it to `~/.drydock/drydock.db`.
|
|
321
327
|
|
|
322
|
-
**Settings (global):** pause switch · release management kill-switch (master on/off for the opt-in release pipeline) · daily cost limit (0 = off / unlimited) · max job cost (per-job USD ceiling that aborts a runaway session mid-stream; 0 = off) · log retention (days) · max job minutes (per-agent session timeout) · max CI wait minutes (how long the babysitter waits for checks to settle before escalating to needs-human) · auto-wait on Claude and Codex provider limits (per-agent toggles: park jobs hit by usage/rate limits or overloads and resume them automatically when the window resets; default on) · `claude`/`gh` CLI paths · OpenRouter backend (enable switch, API key, catalog refresh interval, default model, free-models-only policy, attribution headers, limit auto-wait, plus test-connection and refresh-models actions) · notification channels (Telegram / Slack / email) and per-event opt-in.
|
|
328
|
+
**Settings (global):** pause switch · release management kill-switch (master on/off for the opt-in release pipeline) · daily cost limit (0 = off / unlimited) · max job cost (per-job USD ceiling that aborts a runaway session mid-stream; 0 = off) · log retention (days) · max job minutes (per-agent session timeout) · max CI wait minutes (how long the babysitter waits for checks to settle before escalating to needs-human) · auto-wait on Claude and Codex provider limits (per-agent toggles: park jobs hit by usage/rate limits or overloads and resume them automatically when the window resets; default on) · auto-resume on turn budget (resume a session that exhausts a positive `maxTurns` budget to continue its work, bounded, instead of escalating; default on) · `claude`/`gh` CLI paths · OpenRouter backend (enable switch, API key, catalog refresh interval, default model, free-models-only policy, attribution headers, limit auto-wait, plus test-connection and refresh-models actions) · notification channels (Telegram / Slack / email) and per-event opt-in.
|
|
323
329
|
**Per repo:** platform (GitHub / GitLab, with base URL + token for GitLab) · agent (`claude`, `codex`, or `openrouter` once enabled) · default model (validated against the synced catalog for OpenRouter) · serial vs. parallel processing · queue label (default `drydock:queue`) · optional job/CI timeout overrides.
|
|
324
330
|
|
|
325
331
|
## Screens
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ALTER TABLE `repos` ADD COLUMN `adopt_claude_mem` integer NOT NULL DEFAULT 0;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nilsr0711/drydock",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Local-first tool that autonomously turns GitHub issues into pull requests via the Claude CLI, startable from the terminal with `npx @nilsr0711/drydock`.",
|
|
6
6
|
"keywords": [
|