craig-cli 0.5.4 → 0.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +2 -2
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -174,10 +174,10 @@ ${p.slice(-2e3)}`:""}`)}async function qo(e){let t=await _h(e).catch(()=>null);r
|
|
|
174
174
|
`)}catch{}}function Go(e){try{return process.kill(e,0),!0}catch{return!1}}function $s(e){return new Promise(t=>setTimeout(t,e))}function bh(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var kh=[" \u2584\u2588\u2588\u2588\u2588\u2584 \u2588\u2588\u2580\u2588\u2588\u2588 \u2584\u2584\u2584 \u2588\u2588\u2593 \u2584\u2588\u2588\u2588\u2588"," \u2592\u2588\u2588\u2580 \u2580\u2588 \u2593\u2588\u2588 \u2592 \u2588\u2588\u2592\u2592\u2588\u2588\u2588\u2588\u2584 \u2593\u2588\u2588\u2592 \u2588\u2588\u2592 \u2580\u2588\u2592"," \u2592\u2593\u2588 \u2584 \u2593\u2588\u2588 \u2591\u2584\u2588 \u2592\u2592\u2588\u2588 \u2580\u2588\u2584 \u2592\u2588\u2588\u2592\u2592\u2588\u2588\u2591\u2584\u2584\u2584\u2591"," \u2592\u2593\u2593\u2584 \u2584\u2588\u2588\u2592\u2592\u2588\u2588\u2580\u2580\u2588\u2584 \u2591\u2588\u2588\u2584\u2584\u2584\u2584\u2588\u2588 \u2591\u2588\u2588\u2591\u2591\u2593\u2588 \u2588\u2588\u2593"," \u2592 \u2593\u2588\u2588\u2588\u2580 \u2591\u2591\u2588\u2588\u2593 \u2592\u2588\u2588\u2592 \u2593\u2588 \u2593\u2588\u2588\u2592\u2591\u2588\u2588\u2591\u2591\u2592\u2593\u2588\u2588\u2588\u2580\u2592"," \u2591 \u2591\u2592 \u2592 \u2591\u2591 \u2592\u2593 \u2591\u2592\u2593\u2591 \u2592\u2592 \u2593\u2592\u2588\u2591\u2591\u2593 \u2591\u2592 \u2592"," \u2591 \u2592 \u2591\u2592 \u2591 \u2592\u2591 \u2592 \u2592\u2592 \u2591 \u2592 \u2591 \u2591 \u2591"," \u2591 \u2591\u2591 \u2591 \u2591 \u2592 \u2592 \u2591\u2591 \u2591 \u2591"," \u2591 \u2591 \u2591 \u2591 \u2591 \u2591 \u2591"," \u2591"];function Fs(){return[...kh]}var yh=["Start","Options","Exit"],vh=["Resume","Options","Exit"],Tr=2,Rr=2,Pr=2,Sh=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),Th=new RegExp("\x1B\\[(?:0)?m","g"),Rh=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),Ph=/https?:\/\/[^\s<>"']+/g,Ns="\x1B[0m",Qo="\x1B]8;;\x1B\\",re={panelBg:{bg:"0a0a0a",fg:"c0caf5"},panelMuted:{bg:"0a0a0a",fg:"565f89"},panelSelected:{bg:"1a1b26",fg:"c0caf5"},panelFocused:{bg:"1a1b26",fg:"7aa2f7"},divider:{bg:"0a0a0a",fg:"292e42"},rail:{bg:"0a0a0a",fg:"c0caf5"},overlay:{bg:"06060f",fg:"565f89"},overlayTitle:{bg:"06060f",fg:"565f89"},overlayLogo:{bg:"06060f",fg:"9ece6a"},overlaySubtitle:{bg:"06060f",fg:"41a6b5"},overlayMenuSelected:{bg:"06060f",fg:"7aa2f7"},accent:{fg:"7aa2f7"},success:{fg:"9ece6a"},pending:{fg:"e0af68"},error:{fg:"f7768e"},mutedfg:{fg:"565f89"},disabled:{fg:"3b4261"}};function Jo(e,t={}){return js(e,{subtitle:"crAIg is that you?",menuItems:yh,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function Zo(e,t={}){return js(e,{subtitle:"Control mode is paused.",menuItems:vh,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}var vr=[" GLOBAL CENTER PANEL INSPECTOR"," ? help \u2190\u2192 / hl switch tab \u2191\u2193 / jk navigate"," Esc pause / back + new tab \u2190\u2192 / hl switch mode"," Tab cycle panels a codex tab R sync PR"," q quit t terminal tab R sync PR"," x close tab X close task"," TASKS Enter attach PTY X close task"," \u2191\u2193 / jk navigate"," n new task TERMINAL MODE"," Enter attach Ctrl+] return to control mode"," Wheel / PgUp / PgDn scroll",""," Press Esc to return."],Ch=["Help"];function Ws(e,t={}){return js(e,{subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??Ch,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function ea(e,t={}){let r=t.color??!0,s=re.overlay,o=new Array(e.height).fill(le(" ".repeat(e.width),r,s)),p=Fs(),k=Math.max(1,Math.floor((e.height-p.length-2-vr.length)/2));for(let _=0;_<p.length&&!(k+_>=e.height);_+=1)o[k+_]=le(na(p[_]??"",e.width),r,re.overlayLogo);let i=Math.max(...vr.map(_=>_.length)),c=Math.max(0,Math.floor((e.width-i)/2)),d=k+p.length+2;for(let _=0;_<vr.length;_+=1){let a=d+_;if(a>=e.height)break;let b=vr[_]??"";o[a]=le(Xe(" ".repeat(c)+b,e.width),r,s)}return o.join(`
|
|
175
175
|
`)}function ta(e,t,r={}){let s=r.color??!0,o=Be.leftWidth,p=Be.rightWidth,k=Be.dividerWidth,i=r.centerOnly??!1,c=i?e.width:e.width-o-p-k*2,d=e.height-Be.topRailHeight-1,_=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,a=le(Xe(_,e.width),s,re.rail),b=xh(t,o-Tr-Rr,d,s),l=Eh(t,c,d,s),m=Dh(t,p,d,s),w=t.inputMode==="terminal",n=[];for(let u=0;u<d;u+=1){if(i){n.push(Sr(l[u]??qe(),c,s,"center"));continue}let h=Sr(b[u]??qe(),o,s,"left"),y=le("\u2502",s,re.divider),T=Sr(l[u]??qe(),c,s,"center"),C=le("\u2502",s,re.divider),x=Sr(m[u]??qe(),p,s,"right");n.push(`${h}${y}${T}${C}${x}`)}let g=w||t.modalInput?re.panelBg:re.panelMuted,f=Ih(t.footerText,t.footerToast,e.width,s,g);return[a,...n,f].join(`
|
|
176
176
|
`)}function Ih(e,t,r,s,o){let p=` ${e}`;if(!t)return le(Xe(p,r),s,o);let k=`\u2713 ${t}`,i=ke(k),c=ke(p),d=Math.max(1,r-c-i-2),_=c+d+i+2>r?Hs(p,Math.max(0,r-i-3)):p,a=Math.max(1,r-ke(_)-i-2),b=`${_}${" ".repeat(a)}${Ht(k,s,o)} `;return le(Xe(b,r),s,o)}function js(e,t){let r=new Array(e.height).fill(le(" ".repeat(e.width),t.color,re.overlay)),s=Fs(),o=Math.max(...t.menuItems.map(d=>d.length)),p=t.menuItems.map((d,_)=>`${_===t.menuIndex?">":" "} ${d.padEnd(o)}`),k=t.optionsMessage?["",t.optionsMessage]:[],i=[...s,"",t.subtitle,"",...p,...k],c=Math.max(1,Math.floor((e.height-i.length)/2));for(let d=0;d<i.length;d+=1){let _=na(i[d]??"",e.width);if(d<s.length){r[c+d]=le(_,t.color,re.overlayLogo);continue}if(d===s.length+1){r[c+d]=le(_,t.color,re.overlaySubtitle);continue}let a=d-(s.length+3),l=a>=0&&a<t.menuItems.length&&a===t.menuIndex?re.overlayMenuSelected:re.overlay;r[c+d]=le(_,t.color,l)}if(t.versionText){let d=t.updateText?" (update available)":"",_=`${t.versionText}${d} `,a=" ".repeat(Math.max(0,e.width-ke(_)));r[e.height-1]=le(`${a}${xr(_,t.color,re.overlay)}`,t.color,re.overlay)}return r.join(`
|
|
177
|
-
`)}function xh(e,t,r,s){let o=Oh(e.runners),p=1,k=e.leftTree.map(c=>Mh(c,t,s));return[...Cr(k,r-p),o]}function Eh(e,t,r,s){let o=e.tabs.find(u=>u.active)?.label??"AGENT",p=Gh(e.tabs),k=e.inputMode==="terminal"?re.success:re.panelMuted,i=`${" ".repeat(p)}${Ir("\u2500".repeat(o.length+1),s,k)}`,c=[`${Ir(e.centerHeader.tabLabel,s,re.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),d=e.tabs.find(u=>u.active)?.id??"agent",_=e.centerHeader.tabLabel==="BROWSER"||!ao(d)?e.centerTranscript.map(u=>({...u})):Ah(e),a=Bh(e.tabs,s,e.focusedRegion==="center"),b=" engaged ",l=b.length+2,m=e.inputMode==="terminal"?`${xr(b,s,re.panelBg)}${Ht("\u25CF",s,re.panelBg)} `:"",w=t-2,n=e.inputMode==="terminal"?" ".repeat(Math.max(0,w-ke(a)-l)):"",f=[{text:e.inputMode==="terminal"?`${a}${n}${m}`:a},{text:i,tone:"muted"},{text:c},qe(),..._];return Cr(f,r)}function Ah(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},qe(),{text:e.terminal.error},qe(),{text:"Fix the native dependency setup, then re-enter terminal mode."}];let t=e.tabs.find(s=>s.active)?.id??"",r=t==="agent"||/:agent(?:-\d+)?$/.test(t)?"agent":"terminal";return e.terminal.rows.length===0?[{text:`Press Enter on the ${r.toUpperCase()} tab to attach a PTY.`}]:e.terminal.rows.map(s=>({text:aa(s.segments),segments:s.segments,fullBleed:!0}))}function Dh(e,t,r,s){let o=e.rightInspection?Lh(e.actionMessage?[...e.rightInspection.rows.slice(0,2),{id:"action-message",text:e.actionMessage},{id:"action-message-spacer",text:""},...e.rightInspection.rows.slice(2)]:e.rightInspection.rows,r):Cr([{text:"CONTEXT"},qe(),...e.rightContext.map(p=>$h(p,s)),...e.actionMessage?[qe(),{text:e.actionMessage}]:[]],r);return Cr(o,r)}function Lh(e,t){let r=e.slice(0,2),s=e.slice(2),o=Math.max(0,t-r.length),p=s.findIndex(i=>i.focused||i.selected),k=p===-1?0:Yh(p-Math.floor(o/2),0,Math.max(0,s.length-o));return[...r.map(i=>Xo(i)),...s.slice(k,k+o).map(i=>Xo(i))]}function Xo(e){let t=e.focused?"\u25B8 ":e.selected?"\u2022 ":" ",r=e.focused||e.selected?"selected":e.muted?"muted":"default",s=`${t}${e.text}`;if(e.segments)return{text:s,segments:[{text:t},...e.segments],tone:r};if(e.accentPrefix&&!e.muted){let o=e.text.indexOf(" "),p=o===-1?e.text:e.text.slice(0,o),k=o===-1?"":e.text.slice(o);return{text:s,segments:[{text:t},{text:p,style:{fg:"7aa2f7"}},{text:k}],tone:r}}return e.color?{text:s,segments:[{text:t},{text:e.text,style:{fg:e.color}}],tone:r}:{text:s,tone:r}}function Mh(e,t,r){let s=" ".repeat(e.indent??0),o=e.accentDot?" \u25CF":"",p=e.status?` ${e.status}`:"",k=e.accentDot?` ${Ht("\u25CF",r,e.selected?re.panelSelected:re.panelBg)}`:"",i=e.prBadge?e.prBadge.reduce((l,m)=>l+ke(m.text),0):0,c=t-ke(p)-ke(o)-i,d=e.selected?e.text:e.focused?Ht(e.text,r,re.panelBg):e.panelHeader?Ir(e.text,r,re.panelMuted):e.text,_=Xe(`${s}${d}`,Math.max(0,c)),a=e.selected?"selected":e.muted?"muted":"default";if(e.prBadge){let l=[{text:`${_}${p}${k}`},...e.prBadge];return{text:`${_}${p}${e.prBadge.map(w=>w.text).join("")}`,segments:l,tone:a}}return{text:`${_}${p}${k}`,tone:a}}function Oh(e){let t=e.map(s=>{let o=s.health>=1,p=parseInt(s.count,10),k=p>1?` (${p})`:"";return{text:`${o?"\u25CF":"\u25CB"} ${s.name}${k}`,active:o}}),r=[];for(let s=0;s<t.length;s++){let o=t[s];s>0&&r.push({text:" "}),o.active?r.push({text:o.text,style:{fg:re.success.fg}}):r.push({text:o.text,style:{fg:re.panelMuted.fg}})}return{text:t.map(s=>s.text).join(" "),segments:r,tone:"muted"}}function Bh(e,t,r){return e.map(s=>s.active?r?Ht(s.label,t,re.panelBg):Ir(s.label,t,re.panelBg):xr(s.label,t,re.panelBg)).join(" ")}function $h(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?xr(e.value,t,re.panelBg):e.value}`}}function Sr(e,t,r,s){let o=Fh(s,e.tone??"default"),p=Nh(e,r,o);if(s==="left"){if(e.fullBleed)return le(Xe(p,t),r,o);let i=t-Tr-Rr;if(e.rightAlign){let d=ke(p),_=Math.max(0,i-d),a=`${" ".repeat(Tr)}${" ".repeat(_)}${p}${" ".repeat(Rr)}`;return le(a,r,o)}let c=`${" ".repeat(Tr)}${Xe(p,i)}${" ".repeat(Rr)}`;return le(c,r,o)}return s==="center"&&e.fullBleed?Wh(e,t,r,o):le(Xe(` ${p}`,t),r,o)}function Fh(e,t){return t==="selected"||t==="focused"?re.panelSelected:t==="muted"?re.panelMuted:re.panelBg}function Cr(e,t){let r=e.slice(0,t);for(;r.length<t;)r.push(qe());return r}function qe(){return{text:""}}function Nh(e,t,r){return e.segments?e.segments.map(s=>ra(s,t,r)).join(""):e.text}function Wh(e,t,r,s){let o=" ".repeat(Pr),p=Math.max(0,t-Pr*2);if(!e.segments)return le(`${o}${Xe(e.text,p)}${o}`,r,s);let k=Uh(e.segments,p),i=`${o}${k.map(c=>ra(c,r,s)).join("")}${o}`;return le(i,r,s)}function ra(e,t,r){let s=e.href?`${sa(e.href)}${e.text}${Qo}`:jh(e.text);return!t||!e.style?s:`${jt(Vh(e.style,r))}${zh(e.style)}${s}${Ns}${jt(r)}`}function jh(e){return e.replace(Ph,t=>{let[r,s]=Hh(t);return`${sa(r)}${r}${Qo}${s}`})}function Hh(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function sa(e){return`\x1B]8;;${e}\x1B\\`}function Uh(e,t){let r=qh(e,t);return Kh(r,t)}function qh(e,t){let r=[],s=t;for(let o of e){if(s<=0)break;let p=ke(o.text);if(p<=s){r.push(o),s-=p;continue}let k=Hs(o.text,s);k.length>0&&r.push({...o,text:k}),s=0}return r}function Kh(e,t){let r=ke(aa(e));if(r>=t)return e;let s=e.at(-1)?.style;return s?.bg?[...e,{text:" ".repeat(t-r),style:s}]:[...e,{text:" ".repeat(t-r)}]}function Vh(e,t){let r=e.inverse?e.bg??t.bg:e.fg,s=e.inverse?e.fg??t.fg:e.bg,o={},p=r??t.fg,k=s??t.bg;return p&&(o.fg=p),k&&(o.bg=k),o}function zh(e){let t=[];return e.bold&&t.push("1"),e.dim&&t.push("2"),e.italic&&t.push("3"),e.underline&&t.push("4"),t.length>0?`\x1B[${t.join(";")}m`:""}function Gh(e){let t=0;for(let r of e){if(r.active)return t;t+=r.label.length+3}return 0}function na(e,t){let r=Math.max(0,t-ke(e)),s=Math.floor(r/2),o=r-s;return`${" ".repeat(s)}${e}${" ".repeat(o)}`}function Xe(e,t){let r=ke(e);return r>=t?Xh(e,t):e+" ".repeat(t-r)}function Xh(e,t){if(t<=0)return"";if(ke(e)<=t)return e;let r=oa(e);return Hs(r,Math.max(0,t-1))+"\u2026"}function ke(e){let t=0;for(let r of Array.from(oa(e)))t+=ia(r);return t}function Hs(e,t){let r="",s=0;for(let o of Array.from(e)){let p=ia(o);if(s+p>t)break;r+=o,s+=p}return r}function ia(e){let t=e.codePointAt(0);return t===void 0||t===0||t<32||t>=127&&t<160||t>=768&&t<=879||t>=6832&&t<=6911||t>=7616&&t<=7679||t>=8400&&t<=8447||t>=65024&&t<=65039?0:t>=4352&&(t<=4447||t===9001||t===9002||t>=11904&&t<=42191&&t!==12351||t>=44032&&t<=55203||t>=63744&&t<=64255||t>=65040&&t<=65049||t>=65072&&t<=65135||t>=65280&&t<=65376||t>=65504&&t<=65510||t>=127744&&t<=129791||t>=131072&&t<=262141)?2:1}function Yh(e,t,r){return Math.min(Math.max(e,t),r)}function oa(e){return e.replace(Rh,"").replace(Sh,"")}function aa(e){return e.map(t=>t.text).join("")}function le(e,t,r){if(!t)return e;let s=jt(r),o=e.replace(Th,`${Ns}${s}`);return`${s}${o}${Ns}`}function jt(e){let t=[];return e.fg&&t.push(`38;2;${Yo(e.fg).join(";")}`),e.bg&&t.push(`48;2;${Yo(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function Yo(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function Ht(e,t,r){return Us(e,t,re.success.fg,r)}function Ir(e,t,r){return Us(e,t,re.accent.fg,r)}function xr(e,t,r){return Us(e,t,re.mutedfg.fg,r)}function Us(e,t,r,s){if(!t)return e;let o=s.bg?{fg:r,bg:s.bg}:{fg:r};return`${jt(o)}${e}${jt(s)}`}var Qh="https://registry.npmjs.org/craig-cli/latest";var Er=null;function qs(){try{return"0.5.4"}catch{return"unknown"}}async function ca(){let e=qs(),t=Date.now();if(Er&&t-Er.cachedAt<36e5)return Er.result;let r=null;try{let o=await fetch(Qh,{signal:AbortSignal.timeout(5e3)});o.ok&&(r=(await o.json()).version??null)}catch{}let s={current:e,latest:r,updateAvailable:r!==null&&r!==e&&Jh(r,e)};return Er={result:s,cachedAt:t},s}function Jh(e,t){let r=d=>d.split(".").map(Number),[s=0,o=0,p=0]=r(e),[k=0,i=0,c=0]=r(t);return s!==k?s>k:o!==i?o>i:p>c}Ae();var Ks=["Runners","Help"];function Vs(e,t){return de.map(r=>{let s=ye(r),o=e.runners?.[r]?.enabled!==!1,p=e.runners?.[r]?.path?.trim(),k=t.pathEdit?.runner===r?`${t.pathEdit.value}_`:p&&p.length>0?p:`default (${s.executable})`;return`${s.displayName} ${o?"enabled":"disabled"} ${k}`})}function da(e){return e.message?e.message:e.pathEdit?"Type an executable path. Enter saves. Empty resets to default. Esc cancels.":"Enter toggles. E edits the executable path."}function ua(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(Ks.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:zs(t)?e===0?{kind:"runners"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function ha(e,t,r,s){if(e.pathEdit)return Zh({...e,pathEdit:e.pathEdit},t,r);let o=Vs(t,e).length;if(r==="UP"||r==="k")return{kind:"render",state:{...e,menuIndex:Math.max(0,e.menuIndex-1),message:null}};if(r==="DOWN"||r==="j")return{kind:"render",state:{...e,menuIndex:Math.min(o-1,e.menuIndex+1),message:null}};if(r==="ESCAPE")return{kind:"back",state:e};if(r==="e"){let i=de[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:i,value:t.runners?.[i]?.path??""}}}}if(!zs(r))return{kind:"noop",state:e};let p=de[e.menuIndex]??"codex",k=t.runners?.[p]?.enabled!==!1;return k&&s.length<=1?{kind:"render",state:{...e,message:"At least one runner must stay enabled."}}:{kind:"save",config:ef(t,p,!k),state:{...e,message:`${ye(p).displayName} ${k?"disabled":"enabled"}.`}}}function Zh(e,t,r){if(r==="ESCAPE")return{kind:"render",state:la({...e,message:null})};if(r==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(zs(r)){let s=e.pathEdit.runner,o=e.pathEdit.value.trim();return{kind:"save",config:tf(t,s,o.length>0?o:null),state:la({...e,message:o.length>0?`${ye(s).displayName} executable saved.`:`${ye(s).displayName} executable reset to default.`})}}return rf(r)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${r}`}}}:{kind:"noop",state:e}}function ef(e,t,r){return{...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:r}}}}function tf(e,t,r){let s={...e.runners?.[t]??{},...r?{path:r}:{}};return r||delete s.path,{...e,runners:{...e.runners??{},[t]:s}}}function la(e){let t={...e};return delete t.pathEdit,t}function zs(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
177
|
+
`)}function xh(e,t,r,s){let o=Oh(e.runners),p=1,k=e.leftTree.map(c=>Mh(c,t,s));return[...Cr(k,r-p),o]}function Eh(e,t,r,s){let o=e.tabs.find(u=>u.active)?.label??"AGENT",p=Gh(e.tabs),k=e.inputMode==="terminal"?re.success:re.panelMuted,i=`${" ".repeat(p)}${Ir("\u2500".repeat(o.length+1),s,k)}`,c=[`${Ir(e.centerHeader.tabLabel,s,re.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),d=e.tabs.find(u=>u.active)?.id??"agent",_=e.centerHeader.tabLabel==="BROWSER"||!ao(d)?e.centerTranscript.map(u=>({...u})):Ah(e),a=Bh(e.tabs,s,e.focusedRegion==="center"),b=" engaged ",l=b.length+2,m=e.inputMode==="terminal"?`${xr(b,s,re.panelBg)}${Ht("\u25CF",s,re.panelBg)} `:"",w=t-2,n=e.inputMode==="terminal"?" ".repeat(Math.max(0,w-ke(a)-l)):"",f=[{text:e.inputMode==="terminal"?`${a}${n}${m}`:a},{text:i,tone:"muted"},{text:c},qe(),..._];return Cr(f,r)}function Ah(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},qe(),{text:e.terminal.error},qe(),{text:"Fix the native dependency setup, then re-enter terminal mode."}];let t=e.tabs.find(s=>s.active)?.id??"",r=t==="agent"||/:agent(?:-\d+)?$/.test(t)?"agent":"terminal";return e.terminal.rows.length===0?[{text:`Press Enter on the ${r.toUpperCase()} tab to attach a PTY.`}]:e.terminal.rows.map(s=>({text:aa(s.segments),segments:s.segments,fullBleed:!0}))}function Dh(e,t,r,s){let o=e.rightInspection?Lh(e.actionMessage?[...e.rightInspection.rows.slice(0,2),{id:"action-message",text:e.actionMessage},{id:"action-message-spacer",text:""},...e.rightInspection.rows.slice(2)]:e.rightInspection.rows,r):Cr([{text:"CONTEXT"},qe(),...e.rightContext.map(p=>$h(p,s)),...e.actionMessage?[qe(),{text:e.actionMessage}]:[]],r);return Cr(o,r)}function Lh(e,t){let r=e.slice(0,2),s=e.slice(2),o=Math.max(0,t-r.length),p=s.findIndex(i=>i.focused||i.selected),k=p===-1?0:Yh(p-Math.floor(o/2),0,Math.max(0,s.length-o));return[...r.map(i=>Xo(i)),...s.slice(k,k+o).map(i=>Xo(i))]}function Xo(e){let t=e.focused?"\u25B8 ":e.selected?"\u2022 ":" ",r=e.focused||e.selected?"selected":e.muted?"muted":"default",s=`${t}${e.text}`;if(e.segments)return{text:s,segments:[{text:t},...e.segments],tone:r};if(e.accentPrefix&&!e.muted){let o=e.text.indexOf(" "),p=o===-1?e.text:e.text.slice(0,o),k=o===-1?"":e.text.slice(o);return{text:s,segments:[{text:t},{text:p,style:{fg:"7aa2f7"}},{text:k}],tone:r}}return e.color?{text:s,segments:[{text:t},{text:e.text,style:{fg:e.color}}],tone:r}:{text:s,tone:r}}function Mh(e,t,r){let s=" ".repeat(e.indent??0),o=e.accentDot?" \u25CF":"",p=e.status?` ${e.status}`:"",k=e.accentDot?` ${Ht("\u25CF",r,e.selected?re.panelSelected:re.panelBg)}`:"",i=e.prBadge?e.prBadge.reduce((l,m)=>l+ke(m.text),0):0,c=t-ke(p)-ke(o)-i,d=e.selected?e.text:e.focused?Ht(e.text,r,re.panelBg):e.panelHeader?Ir(e.text,r,re.panelMuted):e.text,_=Xe(`${s}${d}`,Math.max(0,c)),a=e.selected?"selected":e.muted?"muted":"default";if(e.prBadge){let l=[{text:`${_}${p}${k}`},...e.prBadge];return{text:`${_}${p}${e.prBadge.map(w=>w.text).join("")}`,segments:l,tone:a}}return{text:`${_}${p}${k}`,tone:a}}function Oh(e){let t=e.map(s=>{let o=s.health>=1,p=parseInt(s.count,10),k=p>1?` (${p})`:"";return{text:`${o?"\u25CF":"\u25CB"} ${s.name}${k}`,active:o}}),r=[];for(let s=0;s<t.length;s++){let o=t[s];s>0&&r.push({text:" "}),o.active?r.push({text:o.text,style:{fg:re.success.fg}}):r.push({text:o.text,style:{fg:re.panelMuted.fg}})}return{text:t.map(s=>s.text).join(" "),segments:r,tone:"muted"}}function Bh(e,t,r){return e.map(s=>s.active?r?Ht(s.label,t,re.panelBg):Ir(s.label,t,re.panelBg):xr(s.label,t,re.panelBg)).join(" ")}function $h(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?xr(e.value,t,re.panelBg):e.value}`}}function Sr(e,t,r,s){let o=Fh(s,e.tone??"default"),p=Nh(e,r,o);if(s==="left"){if(e.fullBleed)return le(Xe(p,t),r,o);let i=t-Tr-Rr;if(e.rightAlign){let d=ke(p),_=Math.max(0,i-d),a=`${" ".repeat(Tr)}${" ".repeat(_)}${p}${" ".repeat(Rr)}`;return le(a,r,o)}let c=`${" ".repeat(Tr)}${Xe(p,i)}${" ".repeat(Rr)}`;return le(c,r,o)}return s==="center"&&e.fullBleed?Wh(e,t,r,o):le(Xe(` ${p}`,t),r,o)}function Fh(e,t){return t==="selected"||t==="focused"?re.panelSelected:t==="muted"?re.panelMuted:re.panelBg}function Cr(e,t){let r=e.slice(0,t);for(;r.length<t;)r.push(qe());return r}function qe(){return{text:""}}function Nh(e,t,r){return e.segments?e.segments.map(s=>ra(s,t,r)).join(""):e.text}function Wh(e,t,r,s){let o=" ".repeat(Pr),p=Math.max(0,t-Pr*2);if(!e.segments)return le(`${o}${Xe(e.text,p)}${o}`,r,s);let k=Uh(e.segments,p),i=`${o}${k.map(c=>ra(c,r,s)).join("")}${o}`;return le(i,r,s)}function ra(e,t,r){let s=e.href?`${sa(e.href)}${e.text}${Qo}`:jh(e.text);return!t||!e.style?s:`${jt(Vh(e.style,r))}${zh(e.style)}${s}${Ns}${jt(r)}`}function jh(e){return e.replace(Ph,t=>{let[r,s]=Hh(t);return`${sa(r)}${r}${Qo}${s}`})}function Hh(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function sa(e){return`\x1B]8;;${e}\x1B\\`}function Uh(e,t){let r=qh(e,t);return Kh(r,t)}function qh(e,t){let r=[],s=t;for(let o of e){if(s<=0)break;let p=ke(o.text);if(p<=s){r.push(o),s-=p;continue}let k=Hs(o.text,s);k.length>0&&r.push({...o,text:k}),s=0}return r}function Kh(e,t){let r=ke(aa(e));if(r>=t)return e;let s=e.at(-1)?.style;return s?.bg?[...e,{text:" ".repeat(t-r),style:s}]:[...e,{text:" ".repeat(t-r)}]}function Vh(e,t){let r=e.inverse?e.bg??t.bg:e.fg,s=e.inverse?e.fg??t.fg:e.bg,o={},p=r??t.fg,k=s??t.bg;return p&&(o.fg=p),k&&(o.bg=k),o}function zh(e){let t=[];return e.bold&&t.push("1"),e.dim&&t.push("2"),e.italic&&t.push("3"),e.underline&&t.push("4"),t.length>0?`\x1B[${t.join(";")}m`:""}function Gh(e){let t=0;for(let r of e){if(r.active)return t;t+=r.label.length+3}return 0}function na(e,t){let r=Math.max(0,t-ke(e)),s=Math.floor(r/2),o=r-s;return`${" ".repeat(s)}${e}${" ".repeat(o)}`}function Xe(e,t){let r=ke(e);return r>=t?Xh(e,t):e+" ".repeat(t-r)}function Xh(e,t){if(t<=0)return"";if(ke(e)<=t)return e;let r=oa(e);return Hs(r,Math.max(0,t-1))+"\u2026"}function ke(e){let t=0;for(let r of Array.from(oa(e)))t+=ia(r);return t}function Hs(e,t){let r="",s=0;for(let o of Array.from(e)){let p=ia(o);if(s+p>t)break;r+=o,s+=p}return r}function ia(e){let t=e.codePointAt(0);return t===void 0||t===0||t<32||t>=127&&t<160||t>=768&&t<=879||t>=6832&&t<=6911||t>=7616&&t<=7679||t>=8400&&t<=8447||t>=65024&&t<=65039?0:t>=4352&&(t<=4447||t===9001||t===9002||t>=11904&&t<=42191&&t!==12351||t>=44032&&t<=55203||t>=63744&&t<=64255||t>=65040&&t<=65049||t>=65072&&t<=65135||t>=65280&&t<=65376||t>=65504&&t<=65510||t>=127744&&t<=129791||t>=131072&&t<=262141)?2:1}function Yh(e,t,r){return Math.min(Math.max(e,t),r)}function oa(e){return e.replace(Rh,"").replace(Sh,"")}function aa(e){return e.map(t=>t.text).join("")}function le(e,t,r){if(!t)return e;let s=jt(r),o=e.replace(Th,`${Ns}${s}`);return`${s}${o}${Ns}`}function jt(e){let t=[];return e.fg&&t.push(`38;2;${Yo(e.fg).join(";")}`),e.bg&&t.push(`48;2;${Yo(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function Yo(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function Ht(e,t,r){return Us(e,t,re.success.fg,r)}function Ir(e,t,r){return Us(e,t,re.accent.fg,r)}function xr(e,t,r){return Us(e,t,re.mutedfg.fg,r)}function Us(e,t,r,s){if(!t)return e;let o=s.bg?{fg:r,bg:s.bg}:{fg:r};return`${jt(o)}${e}${jt(s)}`}var Qh="https://registry.npmjs.org/craig-cli/latest";var Er=null;function qs(){try{return"0.5.5"}catch{return"unknown"}}async function ca(){let e=qs(),t=Date.now();if(Er&&t-Er.cachedAt<36e5)return Er.result;let r=null;try{let o=await fetch(Qh,{signal:AbortSignal.timeout(5e3)});o.ok&&(r=(await o.json()).version??null)}catch{}let s={current:e,latest:r,updateAvailable:r!==null&&r!==e&&Jh(r,e)};return Er={result:s,cachedAt:t},s}function Jh(e,t){let r=d=>d.split(".").map(Number),[s=0,o=0,p=0]=r(e),[k=0,i=0,c=0]=r(t);return s!==k?s>k:o!==i?o>i:p>c}Ae();var Ks=["Runners","Help"];function Vs(e,t){return de.map(r=>{let s=ye(r),o=e.runners?.[r]?.enabled!==!1,p=e.runners?.[r]?.path?.trim(),k=t.pathEdit?.runner===r?`${t.pathEdit.value}_`:p&&p.length>0?p:`default (${s.executable})`;return`${s.displayName} ${o?"enabled":"disabled"} ${k}`})}function da(e){return e.message?e.message:e.pathEdit?"Type an executable path. Enter saves. Empty resets to default. Esc cancels.":"Enter toggles. E edits the executable path."}function ua(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(Ks.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:zs(t)?e===0?{kind:"runners"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function ha(e,t,r,s){if(e.pathEdit)return Zh({...e,pathEdit:e.pathEdit},t,r);let o=Vs(t,e).length;if(r==="UP"||r==="k")return{kind:"render",state:{...e,menuIndex:Math.max(0,e.menuIndex-1),message:null}};if(r==="DOWN"||r==="j")return{kind:"render",state:{...e,menuIndex:Math.min(o-1,e.menuIndex+1),message:null}};if(r==="ESCAPE")return{kind:"back",state:e};if(r==="e"){let i=de[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:i,value:t.runners?.[i]?.path??""}}}}if(!zs(r))return{kind:"noop",state:e};let p=de[e.menuIndex]??"codex",k=t.runners?.[p]?.enabled!==!1;return k&&s.length<=1?{kind:"render",state:{...e,message:"At least one runner must stay enabled."}}:{kind:"save",config:ef(t,p,!k),state:{...e,message:`${ye(p).displayName} ${k?"disabled":"enabled"}.`}}}function Zh(e,t,r){if(r==="ESCAPE")return{kind:"render",state:la({...e,message:null})};if(r==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(zs(r)){let s=e.pathEdit.runner,o=e.pathEdit.value.trim();return{kind:"save",config:tf(t,s,o.length>0?o:null),state:la({...e,message:o.length>0?`${ye(s).displayName} executable saved.`:`${ye(s).displayName} executable reset to default.`})}}return rf(r)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${r}`}}}:{kind:"noop",state:e}}function ef(e,t,r){return{...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:r}}}}function tf(e,t,r){let s={...e.runners?.[t]??{},...r?{path:r}:{}};return r||delete s.path,{...e,runners:{...e.runners??{},[t]:s}}}function la(e){let t={...e};return delete t.pathEdit,t}function zs(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
178
178
|
`}function rf(e){return e.length===1&&e>=" "&&e!=="\x7F"}var af=sf(import.meta.url),cf=af("terminal-kit"),lf=cf.terminal;async function ga(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),r=Ve(t);await kt(t);let s=await Ne(r),o=pt(s),p=e.uiStateFile?await De({uiStateFile:e.uiStateFile}):null,k=Promise.resolve(),i=Promise.resolve(),c=await Ut(t,void 0,o),d=gr(ro(p,s),c);c=await Ut(t,d,o);let _=()=>{},a={workspaceRoot:t,onUpdate:()=>_(),resolveSessionSpec:(m,w)=>ff(c,w,t)},b=e.ptyRuntime??await jo({...a,paths:r}),l=m=>{if(!e.uiStateFile)return;p=so(p,m);let w=p;k=k.then(()=>Pe({uiStateFile:e.uiStateFile},w),()=>Pe({uiStateFile:e.uiStateFile},w)),k.catch(()=>{})};return new Promise(m=>{let w=e.terminal??lf,n={mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:gr(d,c)},g=!1,f=!1,u=null,h=0,y=0,T=null,C=null,x=null,N=null,B=null,D=!1,A=`Craig v${qs()}`,E=null,q=0,K=!0,Y=null,F=()=>{},H=b;_=()=>{n.mode==="main"&&(n={mode:"main",shell:v(n.shell)},x||(x=setTimeout(()=>{x=null,n.mode==="main"&&F()},50)))};function v(M){return Nt(M,H.getViewState(P(M)))}function P(M){let L=R(M);return L?L.ptyTabs.some(O=>O.id===M.activeTab)?M.activeTab:M.activeTab==="agent"||M.activeTab==="terminal"?L.ptyTabs.find(O=>O.kind===M.activeTab)?.id??M.selectedPtyTabId:M.selectedPtyTabId:M.selectedPtyTabId}function S(M){return v(df(M,c))}function R(M){return c.tasks.find(L=>L.id===M.selectedTaskId)??null}async function $(){let M=c.tasks.flatMap(L=>L.ptyTabs.map(O=>O.id));await H.pruneStale?.(M),await H.hydrateSessions?.(M)}function W(){$().catch(()=>{}).then(()=>{n.mode==="main"&&(n={mode:"main",shell:S(n.shell)},F())})}function U(M,L){return N&&(clearTimeout(N),N=null),L?(N=setTimeout(()=>{N=null,!(n.mode!=="main"||n.shell.footerToast!==L)&&(n={mode:"main",shell:S({...n.shell,footerToast:null})},F())},3e3),{...M,footerToast:L}):{...M,footerToast:null}}function V(M){let L=i.then(M,M);return i=L.then(()=>{},()=>{}),L}function te(M){let L=R(M),O=c.inspection,j=O&&O.taskId===L?.id?O:null,G=uf(j?.fileRows??[],M.collapsedFileTreePaths);return{leftItemIds:hf(c),centerTabIds:lo(L,M),ptyTabIds:L?.ptyTabs.map(Z=>Z.id)??[],filePathIds:j?.filePaths??[],fileTreeRowIds:G.map(Z=>Z.path),fileTreeFileIds:G.filter(Z=>Z.kind==="file").map(Z=>Z.path),fileTreeDirectoryIds:G.filter(Z=>Z.kind==="directory").map(Z=>Z.path),diffPathIds:j?.diffPaths??[],diffPathRanges:[],fileLineCount:j?.selectedFile.lines.length??0,diffLineCount:j?.selectedDiff.lines.length??0,reviewRowCount:Ro(M,L),pageRows:Math.max(5,ht(w.width,w.height).height-Be.topRailHeight-9),enabledRunnerIds:o,projectTargetIds:L?.repoTargets?.map(Z=>Z.repoId)??[]}}async function I(M){await nn(r,M),s=M,o=pt(s),c={...c,enabledRunnerIds:o},n.mode==="main"?n={mode:"main",shell:S({...n.shell,selectedRunner:o.includes(n.shell.selectedRunner)?n.shell.selectedRunner:st(s)})}:n={...n,shell:S({...n.shell,selectedRunner:o.includes(n.shell.selectedRunner)?n.shell.selectedRunner:st(s)})}}async function Q(M){let L=M.selectedTaskId;L&&await V(async()=>{let O=await he(r,L);!O.ptyTabs.some(j=>j.id===M.activeTab)||O.selectedPtyTabId===M.activeTab||await se(r,{...O,selectedPtyTabId:M.activeTab})})}async function z(){let M=(n.mode==="main",n.shell);c=await Ut(t,M,o),n.mode==="main"?n={mode:"main",shell:S(n.shell)}:n={...n,shell:S(n.shell)}}async function J(M){let L=++q,O=ma(c.tasks,M),j=c.inspection,G;if(O&&j?.taskId===O.id){let Z={selectedFilePath:M.selectedFilePath,selectedDiffPath:M.selectedDiffPath},ce=await Ii(O,j,Z);if(L!==q)return;G={...c,inspection:ce}}else if(G=await Ut(t,M,o),L!==q)return;c=G,n.mode==="main"&&(n={mode:"main",shell:S(n.shell)},l(n.shell),F())}async function ge(M){let L=await Rf(M);n.mode==="main"&&(n={mode:"main",shell:S({...n.shell,workspaceBrowser:L,activeTab:n.shell.selectedPtyTabId??n.shell.activeTab,actionMessage:null})},F())}async function _e(M){try{let L=S(M),O=R(L),j=L.selectedPtyTabId;if(O&&L.focusedRegion==="tasks"){let ce=O.ptyTabs.find(Ee=>Ee.kind==="agent")??null;ce?j=ce.id:(O=await Xs(O),await z(),j=O.selectedPtyTabId)}O&&!j&&(O=await Xs(O),await z(),j=O.selectedPtyTabId);let G=S({...L,activeTab:j??L.activeTab,selectedPtyTabId:j,focusedRegion:j?"center":L.focusedRegion});if(!G.selectedTaskId||!j){n={mode:"main",shell:G},F();return}n={mode:"main",shell:Nt({...G,inputMode:"terminal"},H.getViewState(j))},l(n.shell);let Z=await H.ensureSession(G.selectedTaskId,j,Ar(ht(w.width,w.height)));f=Gs(j),u=null,n={mode:"main",shell:Nt({...G,inputMode:"terminal"},Z)},l(n.shell)}catch(L){let O=L instanceof Error?L.message:"Failed to start PTY.";M.selectedTaskId&&M.selectedPtyTabId&&Gs(M.selectedPtyTabId)&&(await Ye(M.selectedTaskId,O).catch(()=>{}),await z().catch(()=>{})),n={mode:"main",shell:io(S(M),O)},l(n.shell)}F()}async function Ye(M,L){await V(async()=>{let O=await he(r,M);await se(r,{...O,status:O.status==="running"?"draft":O.status,runnerSession:{...O.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:L})})}async function xe(M,L,O){let j=S(M);if(!j.selectedTaskId)throw new Error("Select a task before creating a tab.");let G=await V(async()=>{let Z=await he(r,j.selectedTaskId),ce=L??mf(Z,j.activeTab,j.preferredPtyTabKind),Ee=fa(Z,ce,O??void 0,s),St={...Z,ptyTabs:[...Z.ptyTabs,Ee],selectedPtyTabId:Ee.id};return await se(r,St),St});return await z(),S({...j,activeTab:G.selectedPtyTabId??j.activeTab,selectedPtyTabId:G.selectedPtyTabId,preferredPtyTabKind:G.ptyTabs.at(-1)?.kind??j.preferredPtyTabKind,focusedRegion:"center",actionMessage:`Created tab: ${G.ptyTabs.at(-1)?.title??"tab"}`})}async function Ke(M){let L=S(M);if(!L.selectedTaskId)throw new Error("Select a task before closing a tab.");let{closedTab:O,nextSelectedTab:j}=await V(async()=>{let G=await he(r,L.selectedTaskId),Z=G.ptyTabs.findIndex(Br=>Br.id===L.activeTab);if(Z===-1)throw new Error("Only PTY tabs can be closed.");let ce=G.ptyTabs[Z],Ee=G.ptyTabs.filter(Br=>Br.id!==ce.id),St=Ee[Math.min(Z,Ee.length-1)]??Ee[Z-1]??null;return await se(r,{...G,ptyTabs:Ee,selectedPtyTabId:St?.id??null}),{closedTab:ce,nextSelectedTab:St}});return H.disposeSession(O.id),await z(),S({...L,activeTab:j?.id??(L.openInspectionKind?"inspection":L.activeTab),selectedPtyTabId:j?.id??null,focusedRegion:"center",actionMessage:`Closed tab: ${O.title}`})}async function rt(M){let L=S(M);if(!L.selectedTaskId)throw new Error("Select a task before refreshing PR checks.");let O=R(L),j=null,G=null;if(O?.type==="project"&&O.repoTargets?.length){let Z=await ar(r,L.selectedTaskId);await z();let ce=Z.synced+Z.discovered+Z.notFound;G=`Refreshed ${Z.synced}/${ce} targets`}else{let{disposition:Z,task:ce}=await ss(r,L.selectedTaskId);await z(),j=Z==="not_found"?`No PR found for ${ce.branch}`:null,Z!=="not_found"&&(G=`Refreshed checks: ${pe(ce)?.requiredChecks.length??0} reported`)}return S({...U(L,G),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:j})}async function wa(){if(D||n.mode!=="main")return;let M=c.tasks;D=!0;try{if(await ci(r,M),n.mode!=="main")return;c=await Ut(t,n.shell,o),n={mode:"main",shell:S(n.shell)},F()}catch{}finally{D=!1}}async function ba(M){let L=S(M);if(!L.selectedTaskId)throw new Error("Select a task before closing it.");let{taskBeforeClose:O,task:j}=await V(async()=>{let G=await he(r,L.selectedTaskId),Z=await Fi(r,L.selectedTaskId);return{taskBeforeClose:G,task:Z}});for(let G of O.ptyTabs)H.disposeSession(G.id);return await z(),S({...L,selectedActionId:"close-task",actionMessage:j.cleanup.preservedWorktree?`Archived task ${j.id}; worktree preserved`:`Archived task ${j.id}`})}async function ka(M){let L=S(M);if(!L.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");if((await He(r,{workspaceId:L.selectedWorkspaceId,includeClosed:!0})).tasks.length>0)throw new Error(`Cannot remove workspace ${L.selectedWorkspaceId} while task records still reference it.`);await Lt(r,L.selectedWorkspaceId);let j=await Mt(r,L.selectedWorkspaceId);return await z(),S({...L,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:`Removed workspace ${j.workspaceId}`})}async function Xs(M){let L=M.ptyTabs.find(G=>G.kind==="agent")??null;if(L){let G={...M,selectedPtyTabId:L.id};return await V(async()=>{let Z=await he(r,M.id),ce=Z.ptyTabs.find(Ee=>Ee.kind==="agent")??null;ce&&await se(r,{...Z,selectedPtyTabId:ce.id})}),G}let O=fa(M,"agent",void 0,s),j={...M,ptyTabs:[...M.ptyTabs,O],selectedPtyTabId:O.id};return await V(async()=>{let G=await he(r,M.id),Z=G.ptyTabs.find(ce=>ce.kind==="agent")??null;if(Z){await se(r,{...G,selectedPtyTabId:Z.id});return}await se(r,{...G,ptyTabs:[...G.ptyTabs,O],selectedPtyTabId:O.id})}),j}F=()=>{ya();let M=ht(w.width,w.height),L=n.mode==="main"?ta(M,wo(S(n.shell),c),{centerOnly:n.shell.centerZoomed}):n.variant==="boot"?Jo(M,{menuIndex:n.menuIndex,optionsMessage:n.optionsMessage,versionText:A,updateText:E}):n.variant==="pause"?Zo(M,{menuIndex:n.menuIndex,optionsMessage:n.optionsMessage,versionText:A,updateText:E}):n.variant==="options"?Ws(M,{menuIndex:n.menuIndex,optionsMenuItems:Ks}):n.variant==="runners"?Ws(M,{menuIndex:qt(n).menuIndex,optionsMenuItems:Vs(s,qt(n)),optionsMessage:da(qt(n)),optionsSubtitle:"Runners"}):ea(M);K&&(w.moveTo(1,1),w.eraseDisplayBelow(),K=!1),w.noFormat(wf(L)),w.hideCursor(!0)};function ya(){let M=n.mode==="main"&&n.shell.inputMode==="terminal"?"terminal":"control";M!==Y&&(Y=M,w.grabInput(M==="terminal"?{mouse:"button"}:!0))}let va=()=>{process.stdout.off("resize",en),process.off("SIGCONT",tn),w.removeListener("key",Ys),w.removeListener("unknown",Qs),w.removeListener("mouse",Js),T&&(clearTimeout(T),T=null),C&&(clearTimeout(C),C=null),x&&(clearTimeout(x),x=null),N&&(clearTimeout(N),N=null),B&&(clearInterval(B),B=null),H.disposeAll(),w.grabInput(!1),w.hideCursor(!1),w.fullscreen(!1)},Mr=M=>{va(),m(M)},Sa=async()=>{if(n.mode!=="main"||g)return;let M=n.shell,L=M.taskPromptInput?.trim()??"";if(!M.selectedRepoId&&!M.selectedWorkspaceId){n={mode:"main",shell:S({...M,taskPromptError:"Select a workspace first."})},F();return}if(L.length===0){n={mode:"main",shell:S({...M,taskPromptError:"Task prompt cannot be empty."})},F();return}g=!0,n={mode:"main",shell:S({...M,actionMessage:`Creating ${M.selectedRunner} task in ${M.selectedWorkspaceId??M.selectedRepoId}...`})},F();let O=null;try{O=await _f(r,M.selectedRepoId,M.selectedWorkspaceId,L,M.selectedRunner),await z();let j=S({...n.shell,selectedRepoId:O.repoId,selectedWorkspaceId:O.workspaceId,selectedTaskId:O.id,selectedPtyTabId:O.selectedPtyTabId,selectedLeftItemId:`task:${O.id}`,activeTab:O.selectedPtyTabId??"agent",inputMode:"terminal",focusedRegion:"center",taskPromptInput:null,taskPromptError:null,actionMessage:null}),G=await H.ensureSession(O.id,j.selectedPtyTabId??_a(O,"agent"),Ar(ht(w.width,w.height)));f=Gs(j.selectedPtyTabId),n={mode:"main",shell:Nt(j,G)},l(n.shell)}catch(j){j instanceof Dr&&(O=j.task);let G=j instanceof Error?j.message:"Failed to create task.";O&&(await se(r,{...O,status:"draft",runnerSession:{...O.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:G}).catch(()=>{}),await z().catch(()=>{})),n={mode:"main",shell:S({...n.shell,inputMode:"control",selectedTaskId:O?.id??n.shell.selectedTaskId,selectedPtyTabId:O?.selectedPtyTabId??n.shell.selectedPtyTabId,selectedLeftItemId:O?`task:${O.id}`:n.shell.selectedLeftItemId,activeTab:O?.selectedPtyTabId??n.shell.activeTab,taskPromptInput:O?null:"",taskPromptError:G,actionMessage:null})}}finally{g=!1,F()}},Ta=M=>{if(n.mode!=="main")return;let L=n.shell;if(L.taskPromptInput!==null){if(M==="ESCAPE"){n={mode:"main",shell:S({...L,taskPromptInput:null,taskPromptError:null,actionMessage:null})},F();return}if(tt(M)){Sa();return}if(M==="BACKSPACE"){n={mode:"main",shell:S({...L,taskPromptInput:L.taskPromptInput.slice(0,-1),taskPromptError:null})},F();return}if(M==="CTRL_R"){n={mode:"main",shell:S({...L,selectedRunner:Ss(L.selectedRunner,o),taskPromptError:null})},F();return}oo(M)&&(n={mode:"main",shell:S({...L,taskPromptInput:`${L.taskPromptInput}${M}`,taskPromptError:null})},F())}},Ra=M=>{if(n.mode!=="main")return;let L=n.shell.workspaceBrowser;if(L){if(M==="ESCAPE"){n={mode:"main",shell:S({...n.shell,workspaceBrowser:null,actionMessage:null})},F();return}if(M==="UP"||M==="k"){n={mode:"main",shell:S({...n.shell,workspaceBrowser:{...L,selectedIndex:Math.max(0,L.selectedIndex-1),error:null}})},F();return}if(M==="DOWN"||M==="j"){let O=Math.max(0,L.entries.length-1);n={mode:"main",shell:S({...n.shell,workspaceBrowser:{...L,selectedIndex:Math.min(O,L.selectedIndex+1),error:null}})},F();return}if(M==="LEFT"||M==="h"){ge(vt.dirname(L.cwd)).catch(O=>{let j=O instanceof Error?O.message:"Failed to open parent directory.";n={mode:"main",shell:S({...n.shell,workspaceBrowser:{...L,error:j}})},F()});return}if(M==="RIGHT"||M==="l"||tt(M)){let O=L.entries[L.selectedIndex]??null;if(!O)return;if((M==="RIGHT"||M==="l")&&(O.kind==="directory"||O.kind==="repo")){ge(O.path).catch(j=>{let G=j instanceof Error?j.message:"Failed to open directory.";n={mode:"main",shell:S({...n.shell,workspaceBrowser:{...L,error:G}})},F()});return}Dt(r,O.path).then(async j=>{await z();let G=j.repos[0]??null;n={mode:"main",shell:S({...n.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${j.workspace.id}`,selectedWorkspaceId:j.workspace.id,selectedRepoId:G?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${j.workspace.name??j.workspace.id}`})},l(n.shell),F()}).catch(j=>{let G=j instanceof Error?j.message:"Failed to add workspace.";n={mode:"main",shell:S({...n.shell,workspaceBrowser:{...L,error:G}})},F()})}}},Ys=M=>{let L=typeof M=="string"?M:"";if(n.mode==="main"&&n.shell.taskPromptInput!==null){Ta(L);return}if(n.mode==="main"&&n.shell.workspaceBrowser!==null){Ra(L);return}if(n.mode==="main"){let O=no(n.shell,L,te(n.shell));if(O.exit){Mr(0);return}if(O.detachTerminal){H.detach(),n={mode:"main",shell:S(O.state)},l(n.shell),F();return}if(n.shell.inputMode==="terminal"){if(O.changed){n={mode:"main",shell:S(O.state)},l(n.shell),F();return}if(f&&tt(L)){f=!1;return}f&&(f=!1),u=kf(L)?{key:L,at:Date.now()}:null;let j=yf(L,n.shell.terminal.scrolledBack??!1);if(j!==0){Or(j);return}H.writeKey(L);return}if(L==="CTRL_C"){Mr(0);return}if(L==="?"&&n.shell.inputMode==="control"){n={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:n.shell},K=!0,F();return}if(O.pause){n={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:S(O.state)},K=!0,F();return}if(O.beginTaskPrompt){n={mode:"main",shell:S(O.state)},l(n.shell),F();return}if(O.openWorkspaceBrowser){ge(t).catch(j=>{let G=j instanceof Error?j.message:"Failed to browse workspaces.";n={mode:"main",shell:S({...O.state,workspaceBrowser:{cwd:t,entries:[],selectedIndex:0,error:G}})},F()});return}if(O.createPtyTab){xe(O.state,O.createPtyTabKind,O.createPtyTabRunner).then(j=>{_e(j)}).catch(j=>{let G=j instanceof Error?j.message:"Failed to create tab.";n={mode:"main",shell:S({...O.state,actionMessage:G})},F()});return}if(O.closePtyTab){Ke(O.state).then(j=>{n={mode:"main",shell:j},l(n.shell),F()}).catch(j=>{let G=j instanceof Error?j.message:"Failed to close tab.";n={mode:"main",shell:S({...O.state,actionMessage:G})},F()});return}if(O.refreshPullRequestChecks){rt(O.state).then(j=>{n={mode:"main",shell:j},l(n.shell),F()}).catch(j=>{let G=j instanceof Error?j.message:"Failed to refresh PR checks.";n={mode:"main",shell:S({...O.state,actionMessage:G})},F()});return}if(O.closeTask){ba(O.state).then(j=>{n={mode:"main",shell:j},l(n.shell),F()}).catch(j=>{let G=j instanceof Error?j.message:"Failed to close task.";n={mode:"main",shell:S({...O.state,actionMessage:G})},F()});return}if(O.removeWorkspace){ka(O.state).then(j=>{n={mode:"main",shell:j},l(n.shell),F()}).catch(j=>{let G=j instanceof Error?j.message:"Failed to remove workspace.";n={mode:"main",shell:S({...O.state,actionMessage:G})},F()});return}if(O.attachTerminal){_e(O.state);return}if(O.refreshInspection){n={mode:"main",shell:S(O.state)},l(n.shell),F(),J(n.shell).catch(j=>{let G=j instanceof Error?j.message:"Failed to refresh inspection.";n={mode:"main",shell:S({...n.shell,actionMessage:G})},F()});return}O.changed&&(n={mode:"main",shell:S(O.state)},Q(n.shell).catch(()=>{}),l(n.shell),F());return}if(n.variant==="help"){n.viaOptions&&n.parentVariant?n={mode:"overlay",variant:"options",menuIndex:1,optionsMessage:null,shell:n.shell,parentVariant:n.parentVariant}:n.parentVariant?n={mode:"overlay",variant:n.parentVariant,menuIndex:1,optionsMessage:null,shell:n.shell}:n={mode:"main",shell:S(n.shell)},K=!0,F();return}if(n.variant==="options"){Pa(L);return}if(n.variant==="runners"){Ca(L);return}if(n.optionsMessage){(L==="ESCAPE"||tt(L))&&(n={...n,optionsMessage:null},F());return}if(L==="UP"||L==="k"){n={...n,menuIndex:Math.max(0,n.menuIndex-1)},F();return}if(L==="DOWN"||L==="j"){n={...n,menuIndex:Math.min(2,n.menuIndex+1)},F();return}if(L==="ESCAPE"){n.variant==="pause"&&(n={mode:"main",shell:S(n.shell)},K=!0,F());return}if(tt(L)){if(n.menuIndex===0){n={mode:"main",shell:S({...n.shell,inputMode:"control"})},K=!0,F(),W();return}if(n.menuIndex===1){let O=n.variant==="boot"||n.variant==="pause"?n.variant:void 0;n={mode:"overlay",variant:"options",menuIndex:0,optionsMessage:null,shell:n.shell,...O!==void 0?{parentVariant:O}:{}},K=!0,F();return}Mr(0)}};function Pa(M){if(n.mode!=="overlay"||n.variant!=="options")return;let L=ua(n.menuIndex,M);if(L.kind!=="noop"){if(L.kind==="render"){n={...n,menuIndex:L.menuIndex},F();return}if(L.kind==="back"){n.parentVariant&&(n={mode:"overlay",variant:n.parentVariant,menuIndex:1,optionsMessage:null,shell:n.shell},K=!0,F());return}if(L.kind==="help"){let O=n.parentVariant;n={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:n.shell,viaOptions:!0,...O!==void 0?{parentVariant:O}:{}},K=!0,F();return}if(L.kind==="runners"){let O=n.parentVariant;n={mode:"overlay",variant:"runners",menuIndex:0,optionsMessage:null,shell:n.shell,...O!==void 0?{parentVariant:O}:{}},K=!0,F()}}}function Ca(M){if(n.mode!=="overlay"||n.variant!=="runners")return;let L=ha(qt(n),s,M,o);if(L.kind!=="noop"){if(L.kind==="back"){let O=n.parentVariant;n={mode:"overlay",variant:"options",menuIndex:0,optionsMessage:null,shell:n.shell,...O!==void 0?{parentVariant:O}:{}},K=!0,F();return}if(L.kind==="render"){n={...n,runnerOptions:L.state},F();return}I(L.config).then(()=>{n.mode!=="overlay"||n.variant!=="runners"||(n={...n,runnerOptions:L.state},F())}).catch(O=>{if(n.mode!=="overlay"||n.variant!=="runners")return;let j=O instanceof Error?O.message:"Failed to save runner option.";n={...n,runnerOptions:{...qt(n),message:j}},F()})}}let Qs=M=>{let L=bf(M);if(n.mode!=="main"||n.shell.inputMode!=="terminal"||L.length===0)return;if(L.includes("")){H.detach(),f=!1,u=null,n={mode:"main",shell:S({...n.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},l(n.shell),F();return}let O=vf(L);if(O!==0){Or(O);return}let j=Sf(L);if(j){f=!1,u={key:j,at:Date.now()},H.writeKey(j);return}if(f&&L!=="\r"&&L!==`
|
|
179
179
|
`&&L!==`\r
|
|
180
|
-
`&&(f=!1),Tf(f,u,L)){f=!1;return}H.write(L)},Js=M=>{if(n.mode!=="main")return;if(n.shell.inputMode==="control"){xa(pa(M));return}let L=pa(M);L!==0&&Or(L)};function Or(M){h+=M,!T&&(T=setTimeout(()=>{T=null;let L=h;h=0,L!==0&&(Ia(L),F())},16))}function Ia(M){H.scrollViewport(M),n={mode:"main",shell:v(n.shell)}}function Zs(){K=!0,w.fullscreen(!0)}function xa(M){M!==0&&(y+=M,!C&&(C=setTimeout(()=>{C=null;let L=y;if(y=0,L===0||n.mode!=="main"||n.shell.inputMode!=="control")return;let O=et(n.shell,L,te(n.shell));if(O.changed){if(O.refreshInspection){n={mode:"main",shell:S(O.state)},l(n.shell),F(),J(n.shell).catch(j=>{let G=j instanceof Error?j.message:"Failed to refresh inspection.";n={mode:"main",shell:S({...n.shell,actionMessage:G})},F()});return}n={mode:"main",shell:S(O.state)},l(n.shell),F()}},16)))}let en=()=>{Zs(),n.mode==="main"&&n.shell.inputMode==="terminal"&&(H.resize(Ar(ht(w.width,w.height))),n={mode:"main",shell:v(n.shell)}),F()},tn=()=>{Zs(),n.mode==="main"&&n.shell.inputMode==="terminal"&&(H.resize(Ar(ht(w.width,w.height))),n={mode:"main",shell:v(n.shell)}),F()};process.stdout.on("resize",en),process.on("SIGCONT",tn),w.grabInput(!0),Y="control",w.hideCursor(!0),w.fullscreen(!0),w.on("key",Ys),w.on("unknown",Qs),w.on("mouse",Js),B=setInterval(()=>{wa()},(s.github?.watchIntervalSeconds??5)*1e3),ca().then(M=>{M.updateAvailable&&M.latest&&(E=`Update available: v${M.latest}`,F())}),F()})}async function Ut(e,t,r){let s=Ve(e),[o,p,k]=await Promise.all([lt(s),Me(s),He(s)]),i=ma(k.tasks,t),c=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},d=i?await xi(i,c):null;return{workspaceRoot:e,workspaces:p.filter(_=>_.status==="active"),repos:o,tasks:k.tasks,inspection:d,...r?{enabledRunnerIds:r}:{}}}function ma(e,t){return t?.selectedTaskId?e.find(r=>r.id===t.selectedTaskId)??null:null}function df(e,t){return gr(e,t)}function uf(e,t){let r=new Set(t);return e.filter(s=>{let o=s.path.split("/");for(let p=1;p<o.length;p+=1)if(r.has(o.slice(0,p).join("/")))return!1;return!0})}function hf(e){let t=[];if(e.workspaces?.length)for(let r of e.workspaces){t.push(`workspace:${r.id}`);for(let s of e.tasks.filter(o=>o.workspaceId===r.id))t.push(`task:${s.id}`);r.kind==="project"&&t.push(`new-task-workspace:${r.id}`),r.kind==="repo"&&t.push(`new-task:${r.primaryRepoId}`)}else for(let r of e.repos){t.push(`repo:${r.id}`);for(let s of e.tasks.filter(o=>o.repoId===r.id))t.push(`task:${s.id}`);t.push(`new-task:${r.id}`)}return t.push("new-workspace"),t}function ff(e,t,r){let s=e.tasks.find(i=>i.ptyTabs.some(c=>c.id===t))??null,o=s?.ptyTabs.find(i=>i.id===t)??null,p=s?.worktreePath??r,k=o?.kind==="agent"?gf(o):[];return s?.type==="project"?{cwd:p,command:k,env:{GIT_CEILING_DIRECTORIES:pf(process.env.GIT_CEILING_DIRECTORIES,p)}}:{cwd:p,command:k}}function pf(e,t){let r=(e??"").split(vt.delimiter).filter(s=>s.length>0);return r.includes(t)?r.join(vt.delimiter):[...r,t].join(vt.delimiter)}function gf(e){return e.command.length>0?e.command:["codex"]}function qt(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function mf(e,t,r){return e.ptyTabs.find(s=>s.id===t)?.kind??r}function fa(e,t,r,s={}){let o=r??e.runner,p=ye(o),k=t==="agent"?p.defaultAgentTitle:"Terminal",i=t==="agent"&&r&&r!==e.runner?`${e.id}:${r}`:`${e.id}:${t}`,c=new Set(e.ptyTabs.map(l=>l.id)),d=1,_=i;for(;c.has(_);)d+=1,_=`${i}-${d}`;let a=new Date().toISOString(),b=r&&r!==e.runner?r:void 0;return{id:_,kind:t,...b?{runner:b}:{},title:d===1?k:`${k} ${d}`,command:t==="agent"?we(o,void 0,s):[],createdAt:a,updatedAt:a}}async function _f(e,t,r,s,o){let p=await Ne(e);Kt(o,p);let k=r?await tr(e,r,s,{runner:o,config:p}):await It(e,t??"",s,{runner:o,config:p});try{let d=at();await ee(ct(Fr(o,p).executable,{cwd:k.repoRoot,env:d}),["--help"],{cwd:k.repoRoot,env:d})}catch(d){let _=d instanceof Error?d.message:"Failed to start runner.",a={...k.task,status:"draft",runnerSession:{...k.task.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:_};throw await se(e,a),new Dr(_,a)}let i=_a(k.task,"agent"),c={...k.task,status:"running",selectedPtyTabId:i,runnerSession:{...k.task.runnerSession,startedAt:new Date().toISOString(),lastKnownState:"running"}};return await se(e,c),await Pe({uiStateFile:e.uiStateFile},{...await De({uiStateFile:e.uiStateFile})??je(),version:1,selectedRepoId:c.repoId,selectedWorkspaceId:c.workspaceId,selectedTaskId:c.id,selectedPtyTabId:c.selectedPtyTabId,inputMode:"control",focusedRegion:"center",activeTab:c.selectedPtyTabId??"agent",selectedActionId:"commit",updatedAt:new Date().toISOString()}),c}var Dr=class extends Error{task;constructor(t,r){super(t),this.name="InteractiveTaskStartupError",this.task=r}};function _a(e,t){let r=e.ptyTabs.find(s=>s.kind===t);if(!r)throw new Error(`Task ${e.id} is missing its ${t} PTY tab.`);return r.id}function Ar(e){return{columns:Math.max(20,e.width-Be.leftWidth-Be.rightWidth-Be.dividerWidth-Pr*2),rows:Math.max(5,e.height-Be.topRailHeight-5)}}function wf(e){return e.split(`
|
|
180
|
+
`&&(f=!1),Tf(f,u,L)){f=!1;return}H.write(L)},Js=M=>{if(n.mode!=="main")return;if(n.shell.inputMode==="control"){xa(pa(M));return}let L=pa(M);L!==0&&Or(L)};function Or(M){h+=M,!T&&(T=setTimeout(()=>{T=null;let L=h;h=0,L!==0&&(Ia(L),F())},16))}function Ia(M){H.scrollViewport(M),n={mode:"main",shell:v(n.shell)}}function Zs(){K=!0,w.fullscreen(!0)}function xa(M){M!==0&&(y+=M,!C&&(C=setTimeout(()=>{C=null;let L=y;if(y=0,L===0||n.mode!=="main"||n.shell.inputMode!=="control")return;let O=et(n.shell,L,te(n.shell));if(O.changed){if(O.refreshInspection){n={mode:"main",shell:S(O.state)},l(n.shell),F(),J(n.shell).catch(j=>{let G=j instanceof Error?j.message:"Failed to refresh inspection.";n={mode:"main",shell:S({...n.shell,actionMessage:G})},F()});return}n={mode:"main",shell:S(O.state)},l(n.shell),F()}},16)))}let en=()=>{Zs(),n.mode==="main"&&n.shell.inputMode==="terminal"&&(H.resize(Ar(ht(w.width,w.height))),n={mode:"main",shell:v(n.shell)}),F()},tn=()=>{Zs(),n.mode==="main"&&n.shell.inputMode==="terminal"&&(H.resize(Ar(ht(w.width,w.height))),n={mode:"main",shell:v(n.shell)}),F()};process.stdout.on("resize",en),process.on("SIGCONT",tn),w.grabInput(!0),Y="control",w.hideCursor(!0),w.fullscreen(!0),w.on("key",Ys),w.on("unknown",Qs),w.on("mouse",Js),B=setInterval(()=>{wa()},(s.github?.watchIntervalSeconds??5)*1e3),ca().then(M=>{M.updateAvailable&&M.latest&&(E=`Update available: v${M.latest}`,F())}),$().catch(()=>{}),F()})}async function Ut(e,t,r){let s=Ve(e),[o,p,k]=await Promise.all([lt(s),Me(s),He(s)]),i=ma(k.tasks,t),c=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},d=i?await xi(i,c):null;return{workspaceRoot:e,workspaces:p.filter(_=>_.status==="active"),repos:o,tasks:k.tasks,inspection:d,...r?{enabledRunnerIds:r}:{}}}function ma(e,t){return t?.selectedTaskId?e.find(r=>r.id===t.selectedTaskId)??null:null}function df(e,t){return gr(e,t)}function uf(e,t){let r=new Set(t);return e.filter(s=>{let o=s.path.split("/");for(let p=1;p<o.length;p+=1)if(r.has(o.slice(0,p).join("/")))return!1;return!0})}function hf(e){let t=[];if(e.workspaces?.length)for(let r of e.workspaces){t.push(`workspace:${r.id}`);for(let s of e.tasks.filter(o=>o.workspaceId===r.id))t.push(`task:${s.id}`);r.kind==="project"&&t.push(`new-task-workspace:${r.id}`),r.kind==="repo"&&t.push(`new-task:${r.primaryRepoId}`)}else for(let r of e.repos){t.push(`repo:${r.id}`);for(let s of e.tasks.filter(o=>o.repoId===r.id))t.push(`task:${s.id}`);t.push(`new-task:${r.id}`)}return t.push("new-workspace"),t}function ff(e,t,r){let s=e.tasks.find(i=>i.ptyTabs.some(c=>c.id===t))??null,o=s?.ptyTabs.find(i=>i.id===t)??null,p=s?.worktreePath??r,k=o?.kind==="agent"?gf(o):[];return s?.type==="project"?{cwd:p,command:k,env:{GIT_CEILING_DIRECTORIES:pf(process.env.GIT_CEILING_DIRECTORIES,p)}}:{cwd:p,command:k}}function pf(e,t){let r=(e??"").split(vt.delimiter).filter(s=>s.length>0);return r.includes(t)?r.join(vt.delimiter):[...r,t].join(vt.delimiter)}function gf(e){return e.command.length>0?e.command:["codex"]}function qt(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function mf(e,t,r){return e.ptyTabs.find(s=>s.id===t)?.kind??r}function fa(e,t,r,s={}){let o=r??e.runner,p=ye(o),k=t==="agent"?p.defaultAgentTitle:"Terminal",i=t==="agent"&&r&&r!==e.runner?`${e.id}:${r}`:`${e.id}:${t}`,c=new Set(e.ptyTabs.map(l=>l.id)),d=1,_=i;for(;c.has(_);)d+=1,_=`${i}-${d}`;let a=new Date().toISOString(),b=r&&r!==e.runner?r:void 0;return{id:_,kind:t,...b?{runner:b}:{},title:d===1?k:`${k} ${d}`,command:t==="agent"?we(o,void 0,s):[],createdAt:a,updatedAt:a}}async function _f(e,t,r,s,o){let p=await Ne(e);Kt(o,p);let k=r?await tr(e,r,s,{runner:o,config:p}):await It(e,t??"",s,{runner:o,config:p});try{let d=at();await ee(ct(Fr(o,p).executable,{cwd:k.repoRoot,env:d}),["--help"],{cwd:k.repoRoot,env:d})}catch(d){let _=d instanceof Error?d.message:"Failed to start runner.",a={...k.task,status:"draft",runnerSession:{...k.task.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:_};throw await se(e,a),new Dr(_,a)}let i=_a(k.task,"agent"),c={...k.task,status:"running",selectedPtyTabId:i,runnerSession:{...k.task.runnerSession,startedAt:new Date().toISOString(),lastKnownState:"running"}};return await se(e,c),await Pe({uiStateFile:e.uiStateFile},{...await De({uiStateFile:e.uiStateFile})??je(),version:1,selectedRepoId:c.repoId,selectedWorkspaceId:c.workspaceId,selectedTaskId:c.id,selectedPtyTabId:c.selectedPtyTabId,inputMode:"control",focusedRegion:"center",activeTab:c.selectedPtyTabId??"agent",selectedActionId:"commit",updatedAt:new Date().toISOString()}),c}var Dr=class extends Error{task;constructor(t,r){super(t),this.name="InteractiveTaskStartupError",this.task=r}};function _a(e,t){let r=e.ptyTabs.find(s=>s.kind===t);if(!r)throw new Error(`Task ${e.id} is missing its ${t} PTY tab.`);return r.id}function Ar(e){return{columns:Math.max(20,e.width-Be.leftWidth-Be.rightWidth-Be.dividerWidth-Pr*2),rows:Math.max(5,e.height-Be.topRailHeight-5)}}function wf(e){return e.split(`
|
|
181
181
|
`).map((t,r)=>`\x1B[${r+1};1H${t}`).join("")}function bf(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function kf(e){return e.length===1||tt(e)||e==="BACKSPACE"||e==="TAB"}function Gs(e){return typeof e=="string"&&new RegExp(`:(?:agent|${de.join("|")})(?:-\\d+)?$`).test(e)}function yf(e,t){return e==="UP"&&t?-3:e==="DOWN"&&t?3:e==="PAGE_UP"?-5:e==="PAGE_DOWN"?5:e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function pa(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function vf(e){let t=new RegExp("\x1B\\[<(\\d+);\\d+;\\d+[mM]").exec(e);if(!t?.[1])return 0;let r=Number.parseInt(t[1],10);return r===64?-3:r===65?3:0}function Sf(e){return e==="\x1B[13;2u"?"SHIFT_ENTER":null}function Tf(e,t,r){return r.length===0?!1:e&&(r==="\r"||r===`
|
|
182
182
|
`||r===`\r
|
|
183
183
|
`)?!0:!t||Date.now()-t.at>=30?!1:r===t.key?!0:r.length<=4&&r.split("").every(s=>s===t.key)}async function Rf(e){let t=await nf(e,{withFileTypes:!0}),r=[];for(let s of t){if(!s.isDirectory())continue;let o=vt.join(e,s.name);r.push({name:s.name,path:o,kind:await Pf(o)?"repo":"directory"})}return r.sort((s,o)=>s.kind!==o.kind?s.kind==="repo"?-1:1:s.name.localeCompare(o.name)),{cwd:e,entries:r,selectedIndex:0,error:null}}async function Pf(e){let t=vt.join(e,".git");return await of(t).catch(()=>null)!==null}function Lr(){return process.cwd()}async function Cf(){try{if(process.argv[2]==="__craig-daemon"){let i=process.argv[3]??Lr(),c=Ve(i);return await kt(i),await Ho(c),0}if(process.argv[2]==="__craig-daemon-shutdown"){let i=process.argv[3]??Lr(),c=Ve(i);return await kt(i),await Uo(c),0}let e=sn(process.argv.slice(2)),t=Lr(),r=Ve(t),s=await kt(t),o={paths:r};if(e.mode==="interactive")return await ga({uiStateFile:r.uiStateFile,workspaceRoot:r.workspaceRoot});if(!e.command)throw new Error("Command mode requires a command.");let p=await Ri(e.command,o),k=Pi(p);return k.length>0&&process.stdout.write(`${k}
|