craig-cli 0.4.10 → 0.4.11
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
|
@@ -88,7 +88,7 @@ ${n.stdout.trimEnd()}`)}let y=o.join(`
|
|
|
88
88
|
`);return y.length>Ml?ge(t,"Diff is above the 500 KB inline preview limit.","too_large",t,y.length):y.includes("\0")?ge(t,"Binary diff preview is not available in Craig.","binary",t,y.length):{path:t,status:y.length>0?"ready":"empty",title:t,lines:y.length>0?y.split(`
|
|
89
89
|
`):["No diff for this file."],byteLength:y.length}}function Tn(e){let t=[],r=new Set;for(let s of e){let o=s.split("/");for(let m=0;m<o.length-1;m+=1){let y=o.slice(0,m+1).join("/");r.has(y)||(r.add(y),t.push({kind:"directory",path:y,depth:m,label:o[m]??y}))}t.push({kind:"file",path:s,depth:o.length-1,label:o.at(-1)??s})}return t}function Ze(e,t){return e&&t.includes(e)?e:t[0]??null}function Wl(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function Rn(e){return[...new Set(e.split(`
|
|
90
90
|
`).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,r)=>t.localeCompare(r))}function Nl(e,t){let r=us.resolve(e,t),s=us.resolve(e);if(r!==s&&!r.startsWith(`${s}${us.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return r}function jl(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function ge(e,t,r,s=null,o=null){return{path:s,status:r,title:e,lines:[t],byteLength:o}}_e();import{access as Hl}from"node:fs/promises";async function Cn(e,t){let r=await ie(e,t),s=await Ul(r.worktreePath),o={...r,status:"closed",cleanup:{...r.cleanup,preservedWorktree:s&&r.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null};return await re(e,o),o}async function Ul(e){try{return await Hl(e),!0}catch{return!1}}Ae();Ie();import Ut from"node:path";function Pn(e){switch(e.toLowerCase().split(".").pop()??""){case"ts":case"tsx":return"\u{F06E6} ";case"js":case"jsx":case"mjs":case"cjs":return"\u{F031E} ";case"json":case"jsonc":return"\u{F0871} ";case"md":case"mdx":return"\u{F0354} ";case"yaml":case"yml":return"\u{F0B10} ";case"sh":case"bash":case"zsh":return"\u{F018D} ";case"css":case"scss":case"sass":return"\u{F031C} ";case"html":case"htm":return"\u{F031D} ";case"py":return"\u{F0320} ";case"go":return"\u{F07D3} ";case"rs":return"\u{F1617} ";case"lock":return"\u{F033E} ";case"png":case"jpg":case"jpeg":case"gif":case"svg":case"webp":return"\u{F02E9} ";default:return"\u{F0214} "}}var In="\u{F024B} ",xn="\u{F0DCF} ",En="\u25CB",An="\uEA64",Dn="\uEAFE",Ln="\uEBDA",fs="\u25CB",ps="\u25CF",gs="\u2713",ms="\u2715";function Mn(e){switch(e.toLowerCase().split(".").pop()??""){case"ts":case"tsx":return"4fc1ff";case"js":case"jsx":case"mjs":case"cjs":return"f7df1e";case"json":case"jsonc":return"fbc02d";case"md":case"mdx":return"519aba";case"yaml":case"yml":return"e06c75";case"sh":case"bash":case"zsh":return"89e051";case"css":case"scss":case"sass":return"c792ea";case"html":case"htm":return"e06c75";case"py":return"3572a5";case"go":return"00add8";case"rs":return"dea584";case"lock":return"565f89";default:return}}Ae();kt();Ae();var ql=["tasks","center","inspector","actions"],Wn=["agent","terminal"],Nn=[],ne="inspection",Um=[...Wn,...Nn],jn=["commit","push","create-pr","refresh-checks","merge","close-task"],Kl=["refresh-checks","close-task"],Hn=["task","checks","pr","setup-run","actions","next-action"],Un=["diff","files","review"];function qn(e,t={}){let r=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,s=cd(e?.openInspectionKind)??r,o=mt(t);return{inputMode:dd(e?.inputMode),focusedRegion:od(e?.focusedRegion),selectedRepoId:ze(e?.selectedRepoId),selectedWorkspaceId:ze(e?.selectedWorkspaceId),selectedTaskId:ze(e?.selectedTaskId),selectedPtyTabId:ze(e?.selectedPtyTabId),selectedLeftItemId:kd(ze(e?.selectedTaskId)),activeTab:r?ne:ze(e?.activeTab)??"agent",preferredPtyTabKind:ld(e?.preferredPtyTabKind),inspectorSection:jt(e?.inspectorSection,Hn,"task"),inspectionMode:ad(e?.inspectionMode,r==="diff"?"diff":"files"),openInspectionKind:s,selectedFileTreePath:ze(e?.selectedFileTreePath),selectedFilePath:ze(e?.selectedFilePath),selectedDiffPath:ze(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,selectedActionId:jt(e?.selectedActionId,jn,"commit"),selectedProjectTargetId:null,selectedRunner:ud(e?.selectedRunner,o,it(t)),centerTabRunner:null,actionMessage:null,taskPromptInput:null,taskPromptError:null,workspaceBrowser:null,terminal:zl(),centerZoomed:!1}}function zl(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function Kn(e,t){return{...e??We(),selectedRepoId:t.selectedRepoId,selectedWorkspaceId:t.selectedWorkspaceId,selectedTaskId:t.selectedTaskId,selectedPtyTabId:t.selectedPtyTabId,inputMode:t.inputMode,focusedRegion:t.focusedRegion,activeTab:t.activeTab,preferredPtyTabKind:t.preferredPtyTabKind,inspectorSection:t.inspectorSection,inspectionMode:t.inspectionMode,openInspectionKind:t.openInspectionKind,selectedFileTreePath:t.selectedFileTreePath,selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath,collapsedFileTreePaths:t.collapsedFileTreePaths,selectedActionId:t.selectedActionId,selectedRunner:t.selectedRunner}}function pr(e,t,r={}){let s=_d(e,t),o=Zn(s),m=(o?.kind==="workspace"?t.workspaces?.find(k=>k.id===o.id)??null:null)??(o?.kind==="task"?t.workspaces?.find(k=>k.id===t.tasks.find(a=>a.id===o.id)?.workspaceId)??null:null)??t.workspaces?.find(k=>k.id===e.selectedWorkspaceId)??t.workspaces?.[0]??null,n=((o?.kind==="repo"?t.repos.find(k=>k.id===o.id)??null:o?.kind==="task"?t.repos.find(k=>k.id===t.tasks.find(a=>a.id===o.id)?.repoId)??null:null)??(m?.kind==="project"?t.repos.find(k=>k.id===e.selectedRepoId&&m.discoveredRepoIds?.includes(k.id))??null:null)??(m?.kind!=="project"?t.repos.find(k=>k.id===m?.primaryRepoId)??null:null)??t.repos.find(k=>k.id===e.selectedRepoId)??t.repos[0]??null)?.id??null,l=m?t.tasks.filter(k=>k.workspaceId===m.id):n?t.tasks.filter(k=>k.repoId===n):[],f=(o?.kind==="task"?l.find(k=>k.id===o.id)??null:null)??l.find(k=>k.id===e.selectedTaskId)??l[0]??null;return{...e,inputMode:r.resetInputMode?"control":e.inputMode,selectedLeftItemId:s,selectedWorkspaceId:m?.id??null,selectedRepoId:n,selectedTaskId:f?.id??null,...fd(f,e.activeTab,e.selectedPtyTabId),selectedFilePath:sd(e,t,f?.id??null),...pd(e,t,f?.id??null),selectedDiffPath:rd(e,t,f?.id??null),inspectorSection:jt(e.inspectorSection,Hn,"task")}}function zn(e,t,r={leftItemIds:[]}){if(e.inputMode==="terminal")return Vl(t)?G({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null},changed:!0,detachTerminal:!0}):G({state:e});if(t==="q"||t==="Q")return G({state:e,exit:!0});if(t==="ESCAPE")return G({state:{...e,actionMessage:null},changed:e.actionMessage!==null,pause:!0});if(t==="n"||t==="N")return G({state:{...e,focusedRegion:"tasks",actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0});if((t==="r"||t==="R")&&e.focusedRegion==="tasks"&&(ws(e.selectedLeftItemId)||ks(e.selectedLeftItemId)))return G({state:{...e,selectedRunner:bs(e.selectedRunner,r.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return On(e,1);if(t==="SHIFT_TAB"||t==="[")return On(e,-1);if(t==="z"||t==="Z")return G({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===ne?et(e,-1,r):Bn(e,-1,r);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===ne?et(e,1,r):Bn(e,1,r);if(t==="PAGE_UP")return et(e,-(r.pageRows??10),r);if(t==="PAGE_DOWN")return et(e,r.pageRows??10,r);if(t==="MOUSE_WHEEL_UP")return et(e,-3,r);if(t==="MOUSE_WHEEL_DOWN")return et(e,3,r);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let s=r.enabledRunnerIds??ce,o=e.centerTabRunner?s.indexOf(e.centerTabRunner):-1,m=o===s.length-1?null:s[o+1];return G({state:{...e,centerTabRunner:m,actionMessage:null},changed:!0})}if((t==="+"||t==="a"||t==="A"||t==="t"||t==="T")&&e.focusedRegion==="center"&&e.selectedTaskId){let s=hd(e,t);return G({state:{...e,preferredPtyTabKind:s,actionMessage:null},changed:!0,createPtyTab:!0,createPtyTabKind:s,createPtyTabRunner:s==="agent"?e.centerTabRunner:null})}if((t==="R"||t==="r")&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return G({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0});if((t==="X"||t==="x")&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return G({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if((t==="X"||t==="x")&&e.focusedRegion==="tasks"&&fr(e.selectedLeftItemId)&&e.selectedTaskId)return G({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if((t==="X"||t==="x")&&e.focusedRegion==="tasks"&&bd(e.selectedLeftItemId)&&e.selectedWorkspaceId)return G({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&Fn(e.activeTab,r.ptyTabIds??[]))return G({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return _s(e,-1,r.centerTabIds);if(e.focusedRegion==="inspector")return $n(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return _s(e,1,r.centerTabIds);if(e.focusedRegion==="inspector")return $n(e,1)}if(tt(t)){if(e.focusedRegion==="tasks"&&(ws(e.selectedLeftItemId)||ks(e.selectedLeftItemId))){let s=eo(e.selectedLeftItemId),o=to(e.selectedLeftItemId);return G({state:{...e,selectedRepoId:s??e.selectedRepoId,selectedWorkspaceId:o??e.selectedWorkspaceId,actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0})}if(e.focusedRegion==="tasks"&&e.selectedLeftItemId==="new-workspace")return G({state:{...e,actionMessage:null},changed:!0,openWorkspaceBrowser:!0});if(e.focusedRegion==="tasks"&&fr(e.selectedLeftItemId)&&e.selectedTaskId)return G({state:{...e,inputMode:"terminal",activeTab:e.selectedPtyTabId??e.activeTab,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&Fn(e.activeTab,r.ptyTabIds??[])&&e.selectedTaskId)return G({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:gr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===ne)return G({state:{...e,actionMessage:null},changed:!0,refreshInspection:!0});if(e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="files"){let s=e.selectedFileTreePath??e.selectedFilePath;if(s&&(r.fileTreeDirectoryIds??[]).includes(s))return G({state:Ql({...e,selectedFileTreePath:s}),changed:!0});let o=s&&(r.fileTreeFileIds??[]).includes(s)?s:e.selectedFilePath;return G({state:{...e,selectedFileTreePath:o,selectedFilePath:o,activeTab:ne,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}return e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="diff"?G({state:{...e,activeTab:ne,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.focusedRegion==="inspector"&&e.inspectionMode==="review"?e.selectedActionId==="refresh-checks"?G({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?G({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):G({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.focusedRegion!=="actions"?G({state:e}):e.selectedActionId==="create-pr"?G({state:{...e,actionMessage:null},changed:!0,syncPullRequest:!0}):e.selectedActionId==="refresh-checks"?G({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="merge"?G({state:{...e,actionMessage:null},changed:!0,mergeTask:!0}):e.selectedActionId==="close-task"?G({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):G({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return G({state:e})}function Ht(e,t){return{...e,terminal:t}}function Vn(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function Vl(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function tt(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
91
|
-
`}function Gn(e){return e.length===1&&e>=" "&&e!=="\x7F"}function Xn(e){return Yn(e)||gr(e)!==null}function Gl(e){return Nn.includes(e)}function Yn(e){return Wn.includes(e)}function Jn(e,t){return[...e?.ptyTabs.map(r=>r.id)??[],...t?.openInspectionKind?[ne]:[]]}var Xl=["tasks","center","inspector"];function On(e,t){return ur(e,"focusedRegion",Xl,t)}function _s(e,t,r){let s=ur(e,"activeTab",r&&r.length>0?r:md(e),t);return!s.changed||Gl(s.state.activeTab)?s:{...s,state:{...s.state,selectedPtyTabId:s.state.activeTab,preferredPtyTabKind:gr(s.state.activeTab)??s.state.preferredPtyTabKind}}}function Bn(e,t,r){if(e.focusedRegion==="tasks")return Yl(e,t,r.leftItemIds);if(e.focusedRegion==="center")return _s(e,t,r.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return Qn(e,t,r);if(e.inspectionMode==="diff"){let s=hr(e,"selectedDiffPath",r.diffPathIds??[],t,!0);return s.changed?{...s,state:{...s.state,activeTab:ne,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:s}return r.projectTargetIds?.length?hr(e,"selectedProjectTargetId",r.projectTargetIds,t):ur(e,"selectedActionId",Kl,t)}return ur(e,"selectedActionId",jn,t)}function Yl(e,t,r){let s=hr(e,"selectedLeftItemId",r,t);if(!s.changed)return s;let o=Zn(s.state.selectedLeftItemId);if(o?.kind==="workspace")return{...s,state:{...s.state,selectedWorkspaceId:o.id,selectedTaskId:null,selectedPtyTabId:null,selectedFilePath:null,selectedFileTreePath:null,selectedDiffPath:null,fileScrollOffset:0,diffScrollOffset:0},refreshInspection:!0};if(o?.kind==="task")return{...s,state:{...s.state,selectedTaskId:o.id,selectedFilePath:null,selectedFileTreePath:null,selectedDiffPath:null,fileScrollOffset:0,diffScrollOffset:0},refreshInspection:!0};if(o?.kind==="repo")return{...s,state:{...s.state,selectedRepoId:o.id,selectedTaskId:null,selectedPtyTabId:null,selectedFilePath:null,selectedFileTreePath:null,selectedDiffPath:null,fileScrollOffset:0,diffScrollOffset:0},refreshInspection:!0};let m=eo(s.state.selectedLeftItemId);if(m)return{...s,state:{...s.state,selectedRepoId:m}};let y=to(s.state.selectedLeftItemId);return y?{...s,state:{...s.state,selectedWorkspaceId:y}}:s}function et(e,t,r){if(t===0)return G({state:e});if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return Qn(e,t,r);if(e.inspectionMode==="diff"){let s=hr(e,"selectedDiffPath",r.diffPathIds??[],t,!0);return s.changed?{...s,state:{...s.state,diffScrollOffset:0}}:s}return G({state:e})}if(e.focusedRegion==="center"&&e.activeTab===ne){if(e.openInspectionKind==="file")return Zl(e,"fileScrollOffset",t,r.fileLineCount??0,r.pageRows);if(e.openInspectionKind==="diff")return ed(e,t,r)}return G({state:e})}function Jl(e,t){if(e.inspectionMode===t)return G({state:e});let r=t==="diff"?"diff":t==="files"?"file":e.openInspectionKind,s=t==="diff"||t==="files"?ne:e.activeTab;return G({state:{...e,inspectionMode:t,activeTab:s,openInspectionKind:r,fileScrollOffset:t==="files"?0:e.fileScrollOffset,diffScrollOffset:t==="diff"?0:e.diffScrollOffset,actionMessage:null},changed:!0,refreshInspection:!0})}function $n(e,t){return Jl(e,nd(e.inspectionMode,Un,t))}function Qn(e,t,r){let s=r.fileTreeRowIds&&r.fileTreeRowIds.length>0?r.fileTreeRowIds:r.filePathIds??[];if(s.length===0)return G({state:e});let o=e.selectedFileTreePath??e.selectedFilePath??s[0]??null,m=s.indexOf(o??""),y=Ve(m===-1?0:m+t,0,s.length-1),n=s[y]??null;if(n===e.selectedFileTreePath)return G({state:e});let l=n!==null&&(r.fileTreeFileIds??r.filePathIds??[]).includes(n);return G({state:{...e,selectedFileTreePath:n,selectedFilePath:l?n:e.selectedFilePath,activeTab:l?ne:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function Ql(e){if(!e.selectedFileTreePath)return e;let t=new Set(e.collapsedFileTreePaths);return t.has(e.selectedFileTreePath)?t.delete(e.selectedFileTreePath):t.add(e.selectedFileTreePath),{...e,collapsedFileTreePaths:[...t].sort((r,s)=>r.localeCompare(s)),actionMessage:null}}function Zl(e,t,r,s,o=10){let m=Math.max(0,s-Math.max(1,o)),y=Ve(e[t]+r,0,m);return y===e[t]?G({state:e}):G({state:{...e,[t]:y,actionMessage:null},changed:!0})}function ed(e,t,r){if(r.diffPathRanges&&r.diffPathRanges.length>0)return td(e,t,r);let s=r.diffLineCount??0,o=r.pageRows??10,m=Math.max(0,s-Math.max(1,o)),y=e.diffScrollOffset+t,n=r.diffPathIds??[];if(n.length===0||!e.selectedDiffPath){let k=Ve(y,0,m);return k===e.diffScrollOffset?G({state:e}):G({state:{...e,diffScrollOffset:k,actionMessage:null},changed:!0})}let l=n.indexOf(e.selectedDiffPath);if(l===-1){let k=Ve(y,0,m);return k===e.diffScrollOffset?G({state:e}):G({state:{...e,diffScrollOffset:k,actionMessage:null},changed:!0})}if(t>0&&y>m){let k=n[l+1]??null;return k?G({state:{...e,selectedDiffPath:k,activeTab:ne,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===m?G({state:e}):G({state:{...e,diffScrollOffset:m,actionMessage:null},changed:!0})}if(t<0&&y<0){let k=n[l-1]??null;return k?G({state:{...e,selectedDiffPath:k,activeTab:ne,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?G({state:e}):G({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let f=Ve(y,0,m);return f===e.diffScrollOffset?G({state:e}):G({state:{...e,diffScrollOffset:f,actionMessage:null},changed:!0})}function td(e,t,r){let s=r.diffLineCount??0,o=r.pageRows??10,m=Math.max(0,s-Math.max(1,o)),y=Ve(e.diffScrollOffset+t,0,m),n=id(r.diffPathRanges??[],y)??e.selectedDiffPath;return y===e.diffScrollOffset&&n===e.selectedDiffPath?G({state:e}):G({state:{...e,diffScrollOffset:y,selectedDiffPath:n,actionMessage:null},changed:!0})}function rd(e,t,r){return!t.inspection||t.inspection.taskId!==r||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function sd(e,t,r){return!t.inspection||t.inspection.taskId!==r||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function id(e,t){return e.find(r=>t>=r.start&&t<r.end)?.path??e.at(-1)?.path??null}function ur(e,t,r,s){let o=r.indexOf(e[t]),m=Ve(o+s,0,r.length-1),y=r[m];return!y||y===e[t]?G({state:e}):G({state:{...e,[t]:y,actionMessage:null},changed:!0})}function hr(e,t,r,s,o=!1){if(r.length===0)return G({state:e});let m=r.indexOf(e[t]??r[0]??""),y=Ve(m===-1?0:m+s,0,r.length-1),n=r[y]??null;return n===e[t]?G({state:e}):G({state:{...e,[t]:n,actionMessage:null},changed:!0,refreshInspection:o})}function nd(e,t,r){let s=t.indexOf(e);return t[Ve(s+r,0,t.length-1)]??e}function G(e){return{state:e.state,changed:e.changed??!1,exit:e.exit??!1,pause:e.pause??!1,attachTerminal:e.attachTerminal??!1,detachTerminal:e.detachTerminal??!1,beginTaskPrompt:e.beginTaskPrompt??!1,openWorkspaceBrowser:e.openWorkspaceBrowser??!1,createWorkspaceTask:e.createWorkspaceTask??!1,createPtyTab:e.createPtyTab??!1,createPtyTabKind:e.createPtyTabKind??null,createPtyTabRunner:e.createPtyTabRunner??null,closePtyTab:e.closePtyTab??!1,syncPullRequest:e.syncPullRequest??!1,refreshPullRequestChecks:e.refreshPullRequestChecks??!1,mergeTask:e.mergeTask??!1,closeTask:e.closeTask??!1,removeWorkspace:e.removeWorkspace??!1,refreshInspection:e.refreshInspection??!1}}function jt(e,t,r){return t.includes(e??"")?e:r}function od(e){return e==="tabs"?"center":jt(e,ql,"tasks")}function ad(e,t){return e==="checks"||e==="actions"||e==="review"?"review":jt(e,Un,t)}function cd(e){return e==="file"||e==="diff"?e:null}function ld(e){return e==="terminal"?"terminal":"agent"}function dd(e){return e==="terminal"?"terminal":"control"}function ud(e,t=[...ce],r="codex"){return e&&_t(e)&&t.includes(e)?e:r}function bs(e,t=ce){let r=t.length>0?t:ce,s=r.indexOf(e);return r[(s+1)%r.length]??r[0]??"codex"}function gr(e){let t=ce.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function hd(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":gr(e.activeTab)??e.preferredPtyTabKind}function fd(e,t,r){if(!e)return{activeTab:t===ne?t:"agent",selectedPtyTabId:null};let s=e.ptyTabs.find(n=>n.id===r)??null,o=e.selectedPtyTabId?e.ptyTabs.find(n=>n.id===e.selectedPtyTabId)??null:null,m=e.ptyTabs.find(n=>n.id===t)??null;if(m)return{activeTab:m.id,selectedPtyTabId:m.id};if(Yn(t)){let l=e.ptyTabs.find(f=>f.kind===t)??null??o??s??e.ptyTabs[0]??null;return{activeTab:l?.id??ne,selectedPtyTabId:l?.id??null}}if(t===ne)return{activeTab:ne,selectedPtyTabId:s?.id??o?.id??e.ptyTabs[0]?.id??null};let y=o??s??e.ptyTabs[0]??null;return{activeTab:y?.id??ne,selectedPtyTabId:y?.id??null}}function pd(e,t,r){if(!t.inspection||t.inspection.taskId!==r)return{selectedFileTreePath:e.selectedFileTreePath,collapsedFileTreePaths:e.collapsedFileTreePaths};let s=e.selectedFileTreePath??t.inspection.selectedFilePath,o=e.selectedFileTreePath===null&&e.collapsedFileTreePaths.length===0?gd(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:s,collapsedFileTreePaths:o}}function gd(e,t){let r=new Set;if(t){let s=t.split("/");for(let o=1;o<s.length;o+=1)r.add(s.slice(0,o).join("/"))}return e.filter(s=>s.kind==="directory"&&!s.path.includes("/")&&!r.has(s.path)).map(s=>s.path).sort((s,o)=>s.localeCompare(o))}function md(e){return[e.selectedPtyTabId,e.openInspectionKind?ne:null].filter(t=>typeof t=="string")}function Fn(e,t){return t.includes(e)}function _d(e,t){let r=wd(t);return e.selectedLeftItemId&&r.includes(e.selectedLeftItemId)?e.selectedLeftItemId:e.selectedWorkspaceId&&r.includes(`workspace:${e.selectedWorkspaceId}`)?`workspace:${e.selectedWorkspaceId}`:e.selectedTaskId&&r.includes(`task:${e.selectedTaskId}`)?`task:${e.selectedTaskId}`:e.selectedRepoId&&r.includes(`repo:${e.selectedRepoId}`)?`repo:${e.selectedRepoId}`:r[0]??null}function wd(e){let t=[];if(e.workspaces?.length)for(let r of e.workspaces){t.push(`workspace:${r.id}`),r.kind==="project"&&t.push(`new-task-workspace:${r.id}`);for(let s of e.tasks.filter(o=>o.workspaceId===r.id))t.push(`task:${s.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 Zn(e){return e?e.startsWith("workspace:")?{kind:"workspace",id:e.slice(10)}:e.startsWith("repo:")?{kind:"repo",id:e.slice(5)}:e.startsWith("task:")?{kind:"task",id:e.slice(5)}:null:null}function ze(e){return typeof e=="string"?e:null}function kd(e){return e?`task:${e}`:null}function fr(e){return typeof e=="string"&&e.startsWith("task:")}function ws(e){return typeof e=="string"&&e.startsWith("new-task:")}function ks(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function bd(e){return typeof e=="string"&&e.startsWith("workspace:")}function eo(e){return ws(e)?e.slice(9):null}function to(e){return ks(e)?e.slice(19):null}function Ve(e,t,r){return Math.min(r,Math.max(t,e))}var _r="empty",de={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function io(e,t){let r=Sd(t,e),s=t.repos.find(_=>_.id===e.selectedRepoId)??t.repos[0]??null,o=r?t.tasks.filter(_=>_.workspaceId===r.id):t.tasks,m=r?.kind==="project"?o:s?o.filter(_=>_.repoId===s.id):[],y=m.find(_=>_.id===e.selectedTaskId)??m[0]??null,n=y?.type==="project",l=eu(t.tasks),f=Cd(e,y),k=Rd(e,y,f),a=k.find(_=>_.id===f)??k[0]??{id:"agent",label:"CODEX"},w=t.inspection?.taskId===y?.id?t.inspection:null,c=s?.name??"no repo",g=y?Se(y.runner):Se(e.selectedRunner);return{inputMode:e.inputMode,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,terminal:e.terminal,footerText:e.workspaceBrowser!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK ${s?`[${s.name}]`:"[no repo]"} \xB7 ${Se(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${Se(e.selectedRunner)}] Enter create task Esc pause ? help`:fr(e.selectedLeftItemId)?"n new task Enter attach X close task Esc pause ? help":e.selectedLeftItemId?.startsWith("workspace:")?"n new task Enter select X remove workspace Esc pause ? help":"n new task Enter select Esc pause ? help":e.focusedRegion==="center"?y===null?"n new task Tab tasks Esc pause ? help":f===ne?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${Se(e.centerTabRunner??y?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?n?"\u2191\u2193 navigate targets R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?"\u2191\u2193 navigate Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:Ut.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${Ut.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:g,liveLabel:y?.status==="running"?"live":"idle"},leftTree:yd(e,t),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(_=>tu(_,l[_])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":a.label,taskId:e.workspaceBrowser?"new workspace":y?.id??"no task",repo:c,agent:g},centerTranscript:Td(f,e,s,y,e.workspaceBrowser,w,r),tabs:k,rightContext:Zd(s,y),rightInspection:Wd(e,y,w)}}function yd(e,t){let r=[{text:"WORKSPACES",muted:!0,focused:e.focusedRegion==="tasks"}];if(!t.workspaces)return vd(r,e,t.repos,t.tasks);let s=t.workspaces;if(s.length===0)r.push({text:"No workspaces registered.",indent:2,muted:!0});else for(let m of s){let y=e.selectedLeftItemId===`workspace:${m.id}`;r.push({id:`workspace:${m.id}`,text:`${m.kind==="project"?"\u25A6":"\u25BE"} ${m.name??m.id}`,selected:y,focused:y&&e.focusedRegion==="tasks"});let n=m.kind==="project"?m.discoveredRepoIds??[]:[m.primaryRepoId];if(m.kind==="project"){let f=`new-task-workspace:${m.id}`,k=e.selectedLeftItemId===f;r.push({id:f,text:`+ New Project Task [${Se(e.selectedRunner)}]`,indent:2,selected:k,focused:k&&e.focusedRegion==="tasks",muted:!k})}let l=t.tasks.filter(f=>f.workspaceId===m.id);if(l.length===0)r.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let f of l){let k=e.selectedLeftItemId===`task:${f.id}`,a=k?"\u25B8":"\u2022",w=f.title.length>28?`${f.title.slice(0,25)}\u2026`:f.title,c={id:`task:${f.id}`,taskId:f.id,text:`${a} ${w}`,indent:2,selected:k,focused:k&&e.focusedRegion==="tasks"},g=oo(f);g&&(c.prBadge=g),r.push(c)}if(m.kind==="repo"){let f=`new-task:${m.primaryRepoId}`,k=e.selectedLeftItemId===f;r.push({id:f,text:`+ New Task [${Se(e.selectedRunner)}]`,indent:2,selected:k,focused:k&&e.focusedRegion==="tasks",muted:!k})}else{r.push({text:` Repos (${n.length})`,indent:0,muted:!0});for(let f of n.slice(0,6)){let k=t.repos.find(a=>a.id===f);r.push({text:` \xB7 ${k?.name??f}`,indent:0,muted:!0})}n.length>6&&r.push({text:` \xB7 ${n.length-6} more`,indent:0,muted:!0})}}let o=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:o,focused:o&&e.focusedRegion==="tasks"}),r}function vd(e,t,r,s){if(r.length===0)e.push({text:"No repos registered.",indent:2,muted:!0});else for(let m of r){let y=t.selectedLeftItemId===`repo:${m.id}`;e.push({id:`repo:${m.id}`,text:`\u25BE ${m.name}`,selected:y,focused:y&&t.focusedRegion==="tasks"});let n=s.filter(k=>k.repoId===m.id);if(n.length===0)e.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let k of n){let a=t.selectedLeftItemId===`task:${k.id}`,w=a?"\u25B8":"\u2022",c=k.title.length>28?`${k.title.slice(0,25)}\u2026`:k.title,g={id:`task:${k.id}`,taskId:k.id,text:`${w} ${c}`,indent:2,selected:a,focused:a&&t.focusedRegion==="tasks"},_=oo(k);_&&(g.prBadge=_),e.push(g)}let l=`new-task:${m.id}`,f=t.selectedLeftItemId===l;e.push({id:l,text:`+ New Task [${Se(t.selectedRunner)}]`,indent:2,selected:f,focused:f&&t.focusedRegion==="tasks",muted:!f})}let o=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:o,focused:o&&t.focusedRegion==="tasks"}),e}function Sd(e,t){let r=e.workspaces??[];if(!e.workspaces)return null;let s=e.tasks.find(o=>o.id===t.selectedTaskId)??null;return s?r.find(o=>o.id===s.workspaceId)??null:t.selectedWorkspaceId?r.find(o=>o.id===t.selectedWorkspaceId)??null:r[0]??null}function Td(e,t,r,s,o,m=null,y=null){if(o){let l=o.entries.length===0?["No directories or git repos here."]:o.entries.map((f,k)=>{let a=k===o.selectedIndex?"\u25B8":" ",w=f.kind==="repo"?" [git repo]":"/";return`${a} ${f.name}${w}`});return Oe(["Browse for a workspace to register.",o.cwd,"",...l,"",o.error??"Use \u2191\u2193 to move, \u2192 or Enter to open, \u2190 to go up, Enter on a git repo to add it."])}if(!r)return Oe(["No repos registered yet.","","Run `craig repo add <path>` in command mode, then reopen the shell."]);if(!s){let l=y?.kind==="project",f=l?y.name??"this workspace":r.name,k=l?"Project Task":"Task";return Oe([`No tasks in ${f}.`,"",`Press n or choose + New ${k} to create one with ${Se(t.selectedRunner)}.`])}let n=s.ptyTabs.find(l=>l.id===e)??null;return n?n.kind==="agent"?Oe([`${n.title} tab ready for ${s.id}.`,"","Press Enter to attach this PTY-backed agent session.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):Oe([`${n.title} tab ready for ${s.id}.`,"","Press Enter to attach this plain task shell.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):e===ne&&t.openInspectionKind==="file"?xd(s,m,t.fileScrollOffset):e===ne&&t.openInspectionKind==="diff"?Ed(s,m,t.diffScrollOffset):s.ptyTabs.length===0&&!t.openInspectionKind?Oe(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):Oe(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function Rd(e,t,r){let s=t?.ptyTabs.map(m=>({id:m.id,label:Pd(m)}))??[];if(!t)return[{id:_r,label:"EMPTY",active:r===_r,focused:e.focusedRegion==="center"&&r===_r}];let o=e.openInspectionKind||r===ne?[{id:ne,label:Id(e)}]:[];return[...s,...o].map(m=>({...m,active:m.id===r,focused:e.focusedRegion==="center"&&m.id===r}))}function Cd(e,t){return t?t.ptyTabs.some(r=>r.id===e.activeTab)||e.activeTab===ne&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(r=>r.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??ne:e.selectedPtyTabId&&t.ptyTabs.some(r=>r.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??ne:_r}function Pd(e){return e.title.toUpperCase()}function Id(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,r=t?Ut.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${r} \u0394`:r}function xd(e,t,r){if(!e)return Oe(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return Oe(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let s=t.selectedFile,o=no(s.path??s.title);return[{text:s.title},{text:`${s.byteLength===null?"size unknown":`${s.byteLength} bytes`} \xB7 ${s.lines.length} lines \xB7 PgUp/PgDn or wheel scroll`,tone:"muted"},{text:""},...Ad(s.lines,r,o)]}function Ed(e,t,r){if(!e)return Oe(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return Oe(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let s=t.selectedDiff,o=no(s.path??s.title);return[{text:s.title},{text:`${t.diffPaths.length} changed files \xB7 ${s.lines.length} rows \xB7 PgUp/PgDn or wheel scroll`,tone:"muted"},{text:""},...Dd(s.lines,r,o)]}function Oe(e){return e.map(t=>({text:t}))}function Ad(e,t,r){let s=Math.max(3,String(e.length).length),o=Math.max(0,Math.min(t,Math.max(0,e.length-1)));return e.slice(o).map((m,y)=>{let n=o+y+1;return{text:`${`${String(n).padStart(s," ")} \u2502 `}${m}`,segments:[{text:String(n).padStart(s," "),style:{fg:de.lineNumber}},{text:" \u2502 ",style:{fg:de.gutter}},...ys(m,r)],tone:"default"}})}function Dd(e,t,r){let s=Ld(e),o=Math.max(0,Math.min(t,Math.max(0,s.length-1)));return s.slice(o).map(m=>Md(m,r))}function Ld(e){let t=[],r=0,s=0;for(let o of e){let m=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/.exec(o);if(m){r=Number.parseInt(m[1]??"0",10),s=Number.parseInt(m[2]??"0",10);continue}if(!(o.startsWith("diff --git")||o.startsWith("index ")||o.startsWith("+++ ")||o.startsWith("--- "))&&!(o==="staged"||o==="unstaged"||o==="untracked")){if(o.startsWith("-")&&!o.startsWith("---")){t.push({oldNumber:r,newNumber:null,marker:"-",text:o.slice(1),kind:"delete"}),r+=1;continue}if(o.startsWith("+")&&!o.startsWith("+++")){t.push({oldNumber:null,newNumber:s,marker:"+",text:o.slice(1),kind:"add"}),s+=1;continue}if(o.startsWith(" ")){if(r===0&&s===0)continue;t.push({oldNumber:r,newNumber:s,marker:" ",text:o.slice(1),kind:"context"}),r+=1,s+=1;continue}}}return t}function Md(e,t){let r=ro(e.oldNumber),s=ro(e.newNumber),o=e.kind==="delete"?r:s,m=e.kind==="delete"?{bg:"2a1111",fallbackFg:de.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:de.diffAdd}:null,y=`${o} \u2502 ${e.text}`,n=m?Bd(ys(e.text,t),m.bg,m.fallbackFg):ys(e.text,t),l=m?{fg:de.lineNumber,bg:m.bg}:{fg:de.lineNumber},f=m?{fg:de.gutter,bg:m.bg}:{fg:de.gutter};return{text:y,segments:[{text:o,style:l},{text:" \u2502 ",style:f},...n],fullBleed:m!==null}}function ro(e){return e===null?" ":String(e).padStart(4," ")}function no(e){let t=Ut.extname(e).toLowerCase();return[".ts",".tsx",".js",".jsx",".mjs",".cjs"].includes(t)?"javascript":[".json",".jsonc"].includes(t)?"json":[".md",".mdx"].includes(t)?"markdown":[".css",".scss"].includes(t)?"css":"plain"}function ys(e,t){return t==="diff"?Od(e):t==="markdown"?$d(e):t==="json"?vs(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?vs(e,/("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`(?:\\.|[^`\\])*`)|\/\/.*$|\/\*.*?\*\/|\b(const|let|var|function|return|if|else|for|while|class|interface|type|import|export|from|async|await|new|extends|implements|switch|case|break|continue|try|catch|throw|true|false|null|undefined)\b|-?\b\d+(?:\.\d+)?\b/g):[{text:e}]}function Od(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:de.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:de.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:de.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:de.diffMeta}}]:[{text:e}]}function Bd(e,t,r){return e.map(s=>({text:s.text,style:{...s.style??{fg:r},bg:t}}))}function $d(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:de.markup,bold:!0}}]:vs(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function vs(e,t){let r=[],s=0;for(let o of e.matchAll(t)){let m=o[0],y=o.index??0;y>s&&r.push({text:e.slice(s,y)}),r.push({text:m,style:Fd(m)}),s=y+m.length}return s<e.length&&r.push({text:e.slice(s)}),r.length>0?r:[{text:e}]}function Fd(e){return e.startsWith("//")||e.startsWith("/*")?{fg:de.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:de.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:de.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:de.markup}:{fg:de.keyword}}function Wd(e,t,r){let s=e.selectedProjectTargetId??t?.repoTargets?.[0]?.repoId??null,o=t?.type==="project"&&s?t.repoTargets?.find(n=>n.repoId===s)??null:null,m=t?.type==="project"?ao(t.repoTargets??[]):o?.pullRequest??t?.pullRequest??null,y=[Nd(e,m),{id:"mode-spacer",text:"",muted:!0}];return e.inspectionMode==="review"?{title:"",rows:[...y,...Hd(e,t)]}:e.inspectionMode==="files"?{title:"",rows:[...y,...Gd(e,r)]}:{title:"",rows:[...y,...Yd(e,r)]}}function Nd(e,t){let r=e.inspectionMode,s=[{label:"CHANGES",active:r==="diff"},{label:"FILES",active:r==="files"},{label:"REVIEW",active:r==="review"}],o=[];for(let l=0;l<s.length;l++){let f=s[l];l>0&&o.push({text:" "}),o.push({text:f.label,style:{fg:f.active?"7aa2f7":"565f89"}})}let m=Ss(t),y=Ts(t?.requiredChecks??null);return o.push({text:" "},m,{text:" "},y),{id:"inspection-mode",text:o.map(l=>l.text).join(""),segments:o}}function so(e){return[{text:" "},Ss(e),{text:" "},Ts(e.requiredChecks??null)]}function oo(e){if(e.type==="project"&&e.repoTargets?.length){let t=ao(e.repoTargets);return t?so(t):null}return e.pullRequest.number?so(e.pullRequest):null}function ao(e){let t=e.filter(s=>s.status==="ready"),r=t.map(s=>s.pullRequest).filter(s=>!!s.number);return r.length===0?null:{provider:"github",number:-1,url:null,baseBranch:null,headBranch:null,status:jd(r),mergeable:r.length===t.length&&r.every(s=>s.mergeable),mergeStateStatus:null,requiredChecks:r.flatMap(s=>s.requiredChecks),lastSyncedAt:r.map(s=>s.lastSyncedAt).filter(s=>!!s).sort().at(-1)??null,lastSyncedHeadSha:null}}function jd(e){return e.some(t=>t.status==="open")?"open":e.every(t=>t.status==="merged")?"merged":e.some(t=>t.status==="closed")?"closed":e[0]?.status??null}function Ss(e){return!e||!e.number?{text:En,style:{fg:"565f89"}}:e.status==="merged"?{text:Dn,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:Ln,style:{fg:"f7768e"}}:{text:An,style:{fg:"9ece6a"}}}function Ts(e){return!e||e.length===0?{text:fs,style:{fg:"565f89"}}:e.some(t=>t.status==="failed")?{text:ms,style:{fg:"f7768e"}}:e.every(t=>t.status==="success"||t.status==="skipped")?{text:gs,style:{fg:"9ece6a"}}:{text:ps,style:{fg:"e0af68"}}}function Hd(e,t){return t?t.type==="project"&&t.repoTargets?.length?Ud(e,t):co("pr",t.title,t.branch,t.pullRequest):[{id:"review-empty",text:"No task selected.",muted:!0}]}var mr=32;function Ud(e,t){let r=[],s=t.repoTargets??[],o=e.selectedProjectTargetId??s[0]?.repoId??null;for(let y of s){let n=o===y.repoId,l=e.focusedRegion==="inspector"&&n,f=y.repoId.startsWith("repo_")?y.repoId.slice(5):y.repoId;if(y.status!=="ready"){let a=y.failureReason?y.failureReason.slice(0,14):y.status,w=mr-a.length-1,c=f.length>w?f.slice(0,w-1)+"\u2026":f,g=mr-c.length-a.length;r.push({id:`project-review:${y.repoId}`,text:c+" ".repeat(Math.max(1,g))+a,selected:n,focused:l,muted:!0})}else{let k=Ss(y.pullRequest),a=Ts(y.pullRequest.requiredChecks),w=`${k.text} ${a.text}`,c=mr-w.length-1,g=f.length>c?f.slice(0,c-1)+"\u2026":f,_=mr-g.length-w.length,i=g+" ".repeat(Math.max(1,_));r.push({id:`project-review:${y.repoId}`,text:i+w,selected:n,focused:l,segments:[{text:i},{...k,text:k.text},{text:" "},{...a,text:a.text}]})}}let m=s.find(y=>y.repoId===o)??null;return m?.status==="ready"&&m.pullRequest.number&&(r.push({id:"target-detail-spacer",text:""}),r.push(...co("target",null,m.branch,m.pullRequest))),r}function co(e,t,r,s){let o=k=>`${e}-${k}`;if(!s.number)return[{id:o("no-pr"),text:r,muted:!0}];let m=[],y=`#${s.number} ${s.status??"open"}`;if(m.push(s.url?{id:o("pr-number"),text:`${y} Open in GitHub \u2197`,segments:[{text:y},{text:" Open in GitHub \u2197",style:{fg:"7aa2f7",underline:!0},href:s.url}]}:{id:o("pr-number"),text:y}),t){let k=t.length>34?`${t.slice(0,31)}\u2026`:t;m.push({id:o("pr-title"),text:k})}let n=s.baseBranch??"?",l=s.headBranch??r;m.push({id:o("pr-branches"),text:`\u2190 ${n} \u2192 ${l}`,muted:!0});let f=s.mergeable?"merge ready":s.mergeStateStatus?`merge ${s.mergeStateStatus}`:"merge unknown";return m.push({id:o("pr-meta"),text:`${f} \xB7 synced ${qd(s.lastSyncedAt)}`,muted:!0}),m.push({id:o("checks-spacer"),text:""}),m.push({id:o("checks-header"),text:"Checks",muted:!0}),s.requiredChecks.length?m.push(...s.requiredChecks.map(Kd)):m.push({id:o("checks-none"),text:s.number?"No GitHub checks reported.":"No checks \u2014 sync after creating a PR.",muted:!0}),m}function qd(e){if(!e)return"--";let t=Date.now()-new Date(e).getTime(),r=Math.floor(t/1e3);if(r<60)return`${r}s ago`;let s=Math.floor(r/60);if(s<60)return`${s}m ago`;let o=Math.floor(s/60);return o<24?`${o}h ago`:`${Math.floor(o/24)}d ago`}function Kd(e){let{icon:t,color:r}=zd(e.status),s=e.name.length>22?`${e.name.slice(0,21)}\u2026`:e.name;return{id:`pr-check:${e.name}`,text:`${t} ${s.padEnd(22," ")} ${Vd(e.status)}`,color:r,muted:!1}}function zd(e){switch(e){case"success":return{icon:gs,color:"9ece6a"};case"pending":return{icon:ps,color:"e0af68"};case"failed":return{icon:ms,color:"f7768e"};case"skipped":return{icon:fs,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function Vd(e){return e==="success"?"passing":e==="failed"?"failing":e}function Gd(e,t){if(!t)return[{id:"empty",text:"No file index. Select a task with local changes.",muted:!0}];if(t.error)return[{id:"error",text:t.error,muted:!0}];if(t.fileRows.length===0)return[{id:"empty",text:"No Git-visible files.",muted:!0}];let r=new Map(t.diffRows.map(m=>[m.path,m.status])),s=Xd(t.fileRows,e.collapsedFileTreePaths),o=e.selectedFileTreePath??t.selectedFilePath;return s.map(m=>{let y=m.kind==="file"?r.get(m.path):void 0,n=y==="A"?"9ece6a":y==="M"?"e0af68":y==="D"?"f7768e":y==="??"?"565f89":void 0,l=m.kind==="directory"?e.collapsedFileTreePaths.includes(m.path)?In:xn:Pn(m.label),f=m.kind==="file"?Mn(m.label):void 0,k=" ".repeat(m.depth),a=f?{text:l,style:{fg:f}}:{text:l},w=n?{text:m.label,style:{fg:n}}:{text:m.label},c=[{text:k},a,w];return{id:m.path,text:`${k}${l}${m.label}`,selected:m.path===o,focused:m.path===o&&e.focusedRegion==="inspector",muted:m.kind==="directory",segments:c}})}function Xd(e,t){let r=new Set(t);return e.filter(s=>{let o=s.path.split("/");for(let m=1;m<o.length;m+=1)if(r.has(o.slice(0,m).join("/")))return!1;return!0})}function Yd(e,t){if(!t)return[{id:"empty",text:"No task diff index.",muted:!0}];if(t.error)return[{id:"error",text:t.error,muted:!0}];if(t.diffRows.length===0)return[{id:"empty",text:t.filePaths.some(o=>o.startsWith("repo_"))?"No changes in project task worktrees. Edits in the original repos are outside this task.":"No local changes.",muted:!0}];if(Jd(t))return Qd(e,t);let r=[];for(let s of["branch","staged","unstaged","untracked"]){let o=t.diffRows.filter(m=>m.group===s);o.length!==0&&(r.push({id:s,text:s.toUpperCase(),muted:!0}),r.push(...o.map(m=>lo(m,e,t))))}return r}function Jd(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function Qd(e,t){let r=[],s=[...new Set(t.diffRows.map(o=>o.path.split("/")[0]).filter(o=>typeof o=="string"&&o.length>0))].sort();for(let o of s){let m=t.diffRows.filter(n=>n.path.startsWith(`${o}/`)),y=o.startsWith("repo_")?o.slice(5):o;r.push({id:`repo-diff:${o}`,text:y,muted:!0});for(let n of["branch","staged","unstaged","untracked"]){let l=m.filter(f=>f.group===n);l.length!==0&&(r.push({id:`repo-diff:${o}:${n}`,text:` ${n}`,muted:!0}),r.push(...l.map(f=>lo(f,e,t,o.length+1))))}}return r}function lo(e,t,r,s=0){let o=e.additions===null?"-":`+${e.additions}`,m=e.deletions===null?"-":`-${e.deletions}`,y=e.status==="A"||e.group==="untracked"?"9ece6a":e.status==="D"?"f7768e":"e0af68",n=s>0?e.path.slice(s):e.path;return{id:`${e.group}:${e.path}`,text:` ${e.status.padEnd(2," ")} ${n} ${o}/${m}`,selected:e.path===(t.selectedDiffPath??r.selectedDiffPath),focused:e.path===(t.selectedDiffPath??r.selectedDiffPath)&&t.focusedRegion==="inspector",color:y}}function Zd(e,t){return e?t?[{label:"Task",value:t.id},{label:"Repo",value:e.name},{label:"Agent",value:Se(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:Ut.basename(t.worktreePath)}]:[{label:"Repo",value:e.name},{label:"Branch",value:e.defaultBranch},{label:"Task",value:"none",mutedValue:!0}]:[{label:"Repo",value:"none",mutedValue:!0}]}function eu(e){return e.reduce((t,r)=>(t[r.runner]+=1,t),{codex:0,cursor:0,claude:0})}function tu(e,t){return{name:Se(e).toLowerCase(),health:t>0?1:0,count:String(t)}}var wr={width:120,height:36},Be={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function vt(e,t){return{width:Math.max(e??wr.width,wr.width),height:Math.max(t??wr.height,wr.height)}}import{spawn as Su}from"node:child_process";import{createHash as Tu}from"node:crypto";import{createServer as Ru,createConnection as vo}from"node:net";import{openSync as Cu}from"node:fs";import{mkdir as Pu,readFile as As,rm as gt,writeFile as Iu}from"node:fs/promises";import{tmpdir as xu}from"node:os";import St from"node:path";import{createRequire as du}from"node:module";var po=ba(ho(),1),ru=1e3,su=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function go(e){return new po.default.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:ru,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}})}function mo(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function Cs(e,t){return new Promise(r=>{e.write(t,r)})}function _o(e,t=0){let r=e.buffer.active,s=[],o=r.getNullCell(),m=r.baseY+r.cursorY,y=Math.max(0,r.baseY-t);for(let n=0;n<e.rows;n+=1){let l=r.getLine(y+n);if(!l){s.push({segments:[]});continue}let f=[];for(let k=0;k<e.cols;k+=1){let a=l.getCell(k,o);!a||a.getWidth()===0||f.push({text:a.getChars()||" ",style:ou(a,y+n===m&&k===r.cursorX)})}s.push({segments:iu(nu(f))})}return s}function iu(e){let t=[];for(let r of e){let s=t.at(-1);if(s&&lu(s.style,r.style)){s.text+=r.text;continue}let o={text:r.text};wo(r.style)||(o.style=r.style),t.push(o)}return t}function nu(e){let t=e.length;for(;t>0;){let r=e[t-1];if(!r||r.text!==" "||!wo(r.style))break;t-=1}return e.slice(0,t)}function ou(e,t){let r={},s=fo(e,"fg"),o=fo(e,"bg");return s&&(r.fg=s),o&&(r.bg=o),e.isBold()&&(r.bold=!0),e.isDim()&&(r.dim=!0),e.isItalic()&&(r.italic=!0),e.isUnderline()&&(r.underline=!0),(e.isInverse()||t)&&(r.inverse=!0),r}function fo(e,t){if(t==="fg"?e.isFgDefault():e.isBgDefault())return;let s=t==="fg"?e.isFgRGB():e.isBgRGB(),o=t==="fg"?e.getFgColor():e.getBgColor();return s?o.toString(16).padStart(6,"0"):su[o]??au(o)}function au(e){if(e>=16&&e<=231){let t=e-16,r=Math.floor(t/36),s=Math.floor(t%36/6),o=t%6;return[r,s,o].map(cu).map(m=>m.toString(16).padStart(2,"0")).join("")}if(e>=232&&e<=255){let t=8+(e-232)*10;return[t,t,t].map(r=>r.toString(16).padStart(2,"0")).join("")}return"e6e6e6"}function cu(e){return e===0?0:55+e*40}function lu(e,t){return Rs(e)===Rs(t)}function Rs(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function wo(e){return Rs(e)===""}var uu=du(import.meta.url),hu=/^CTRL_([A-Z])$/,fu="\x1B[6n",pu="\x1B[c",gu="\x1B[?u",mu={ENTER:"\r",KP_ENTER:"\r",TAB:" ",SHIFT_TAB:"\x1B[Z",BACK_TAB:"\x1B[Z",BACKSPACE:"\x7F",DELETE:"\x1B[3~",ESCAPE:"\x1B",UP:"\x1B[A",DOWN:"\x1B[B",RIGHT:"\x1B[C",LEFT:"\x1B[D",HOME:"\x1B[H",END:"\x1B[F",PAGE_UP:"\x1B[5~",PAGE_DOWN:"\x1B[6~",CTRL_C:"",CTRL_D:""},kr=class{sessions=new Map;shell;env;spawn;onUpdate;resolveSessionSpec;attachedTabId=null;constructor(t){this.shell=t.shell??process.env.SHELL??"/bin/zsh",this.env=t.env??process.env,this.spawn=t.spawn,this.onUpdate=t.onUpdate,this.resolveSessionSpec=t.resolveSessionSpec??(()=>({cwd:t.workspaceRoot,command:[]}))}ensureSession(t,r,s,o){let m=this.sessions.get(r);if(m)if(m.status!=="running")Ps(m),this.sessions.delete(r);else return this.attachedTabId=r,m.scrollbackLines=0,ko(m,s),this.getViewState(r);let y=this.createSession(t,r,s,o);return this.sessions.set(r,y),this.attachedTabId=r,this.getViewState(r)}write(t){let r=this.getAttachedSession();!r||r.status!=="running"||r.pty.write(t)}writeKey(t){let r=_u(t);r!==null&&this.write(r)}scrollViewport(t){let r=this.getAttachedSession();if(!r||t===0)return;let s=r.terminal.buffer.active.baseY;r.scrollbackLines=Math.max(0,Math.min(s,r.scrollbackLines-t))}resize(t){let r=this.getAttachedSession();r&&ko(r,t)}detach(){this.attachedTabId=null}disposeSession(t){let r=this.sessions.get(t);r&&(Ps(r),this.sessions.delete(t),this.attachedTabId===t&&(this.attachedTabId=null))}disposeAll(){for(let t of this.sessions.values())Ps(t);this.sessions.clear(),this.attachedTabId=null}getViewState(t){if(!t)return{status:"idle",rows:[],error:null,scrolledBack:!1};let r=this.sessions.get(t);return r?{status:r.status,rows:_o(r.terminal,r.scrollbackLines),error:r.error,scrolledBack:r.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}createSession(t,r,s,o){let m=this.spawn??ku().spawn,y=go(s),n=o??this.resolveSessionSpec(t,r),l=ct({...this.env,...n.env??{}}),{executable:f,args:k}=bu(this.shell,n.command,{cwd:n.cwd,env:l}),a=m(f,k,{name:"xterm-256color",cols:s.columns,rows:s.rows,cwd:n.cwd,env:yu(l)}),w={taskId:t,tabId:r,pty:a,terminal:y,status:"running",error:null,disposables:[],scrollbackLines:0};return w.disposables.push(a.onData(c=>{vu(a,c),Cs(w.terminal,c).then(()=>{this.onUpdate?.(w.tabId)})})),w.disposables.push(a.onExit(c=>{w.status="exited",Cs(w.terminal,`\r
|
|
91
|
+
`}function Gn(e){return e.length===1&&e>=" "&&e!=="\x7F"}function Xn(e){return Yn(e)||gr(e)!==null}function Gl(e){return Nn.includes(e)}function Yn(e){return Wn.includes(e)}function Jn(e,t){return[...e?.ptyTabs.map(r=>r.id)??[],...t?.openInspectionKind?[ne]:[]]}var Xl=["tasks","center","inspector"];function On(e,t){return ur(e,"focusedRegion",Xl,t)}function _s(e,t,r){let s=ur(e,"activeTab",r&&r.length>0?r:md(e),t);return!s.changed||Gl(s.state.activeTab)?s:{...s,state:{...s.state,selectedPtyTabId:s.state.activeTab,preferredPtyTabKind:gr(s.state.activeTab)??s.state.preferredPtyTabKind}}}function Bn(e,t,r){if(e.focusedRegion==="tasks")return Yl(e,t,r.leftItemIds);if(e.focusedRegion==="center")return _s(e,t,r.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return Qn(e,t,r);if(e.inspectionMode==="diff"){let s=hr(e,"selectedDiffPath",r.diffPathIds??[],t,!0);return s.changed?{...s,state:{...s.state,activeTab:ne,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:s}return r.projectTargetIds?.length?hr(e,"selectedProjectTargetId",r.projectTargetIds,t):ur(e,"selectedActionId",Kl,t)}return ur(e,"selectedActionId",jn,t)}function Yl(e,t,r){let s=hr(e,"selectedLeftItemId",r,t);if(!s.changed)return s;let o=Zn(s.state.selectedLeftItemId);if(o?.kind==="workspace")return{...s,state:{...s.state,selectedWorkspaceId:o.id,selectedTaskId:null,selectedPtyTabId:null,selectedFilePath:null,selectedFileTreePath:null,selectedDiffPath:null,fileScrollOffset:0,diffScrollOffset:0},refreshInspection:!0};if(o?.kind==="task")return{...s,state:{...s.state,selectedTaskId:o.id,selectedFilePath:null,selectedFileTreePath:null,selectedDiffPath:null,fileScrollOffset:0,diffScrollOffset:0},refreshInspection:!0};if(o?.kind==="repo")return{...s,state:{...s.state,selectedRepoId:o.id,selectedTaskId:null,selectedPtyTabId:null,selectedFilePath:null,selectedFileTreePath:null,selectedDiffPath:null,fileScrollOffset:0,diffScrollOffset:0},refreshInspection:!0};let m=eo(s.state.selectedLeftItemId);if(m)return{...s,state:{...s.state,selectedRepoId:m}};let y=to(s.state.selectedLeftItemId);return y?{...s,state:{...s.state,selectedWorkspaceId:y}}:s}function et(e,t,r){if(t===0)return G({state:e});if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return Qn(e,t,r);if(e.inspectionMode==="diff"){let s=hr(e,"selectedDiffPath",r.diffPathIds??[],t,!0);return s.changed?{...s,state:{...s.state,diffScrollOffset:0}}:s}return G({state:e})}if(e.focusedRegion==="center"&&e.activeTab===ne){if(e.openInspectionKind==="file")return Zl(e,"fileScrollOffset",t,r.fileLineCount??0,r.pageRows);if(e.openInspectionKind==="diff")return ed(e,t,r)}return G({state:e})}function Jl(e,t){if(e.inspectionMode===t)return G({state:e});let r=t==="diff"?"diff":t==="files"?"file":e.openInspectionKind,s=t==="diff"||t==="files"?ne:e.activeTab;return G({state:{...e,inspectionMode:t,activeTab:s,openInspectionKind:r,fileScrollOffset:t==="files"?0:e.fileScrollOffset,diffScrollOffset:t==="diff"?0:e.diffScrollOffset,actionMessage:null},changed:!0,refreshInspection:!0})}function $n(e,t){return Jl(e,nd(e.inspectionMode,Un,t))}function Qn(e,t,r){let s=r.fileTreeRowIds&&r.fileTreeRowIds.length>0?r.fileTreeRowIds:r.filePathIds??[];if(s.length===0)return G({state:e});let o=e.selectedFileTreePath??e.selectedFilePath??s[0]??null,m=s.indexOf(o??""),y=Ve(m===-1?0:m+t,0,s.length-1),n=s[y]??null;if(n===e.selectedFileTreePath)return G({state:e});let l=n!==null&&(r.fileTreeFileIds??r.filePathIds??[]).includes(n);return G({state:{...e,selectedFileTreePath:n,selectedFilePath:l?n:e.selectedFilePath,activeTab:l?ne:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function Ql(e){if(!e.selectedFileTreePath)return e;let t=new Set(e.collapsedFileTreePaths);return t.has(e.selectedFileTreePath)?t.delete(e.selectedFileTreePath):t.add(e.selectedFileTreePath),{...e,collapsedFileTreePaths:[...t].sort((r,s)=>r.localeCompare(s)),actionMessage:null}}function Zl(e,t,r,s,o=10){let m=Math.max(0,s-Math.max(1,o)),y=Ve(e[t]+r,0,m);return y===e[t]?G({state:e}):G({state:{...e,[t]:y,actionMessage:null},changed:!0})}function ed(e,t,r){if(r.diffPathRanges&&r.diffPathRanges.length>0)return td(e,t,r);let s=r.diffLineCount??0,o=r.pageRows??10,m=Math.max(0,s-Math.max(1,o)),y=e.diffScrollOffset+t,n=r.diffPathIds??[];if(n.length===0||!e.selectedDiffPath){let k=Ve(y,0,m);return k===e.diffScrollOffset?G({state:e}):G({state:{...e,diffScrollOffset:k,actionMessage:null},changed:!0})}let l=n.indexOf(e.selectedDiffPath);if(l===-1){let k=Ve(y,0,m);return k===e.diffScrollOffset?G({state:e}):G({state:{...e,diffScrollOffset:k,actionMessage:null},changed:!0})}if(t>0&&y>m){let k=n[l+1]??null;return k?G({state:{...e,selectedDiffPath:k,activeTab:ne,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===m?G({state:e}):G({state:{...e,diffScrollOffset:m,actionMessage:null},changed:!0})}if(t<0&&y<0){let k=n[l-1]??null;return k?G({state:{...e,selectedDiffPath:k,activeTab:ne,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?G({state:e}):G({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let f=Ve(y,0,m);return f===e.diffScrollOffset?G({state:e}):G({state:{...e,diffScrollOffset:f,actionMessage:null},changed:!0})}function td(e,t,r){let s=r.diffLineCount??0,o=r.pageRows??10,m=Math.max(0,s-Math.max(1,o)),y=Ve(e.diffScrollOffset+t,0,m),n=id(r.diffPathRanges??[],y)??e.selectedDiffPath;return y===e.diffScrollOffset&&n===e.selectedDiffPath?G({state:e}):G({state:{...e,diffScrollOffset:y,selectedDiffPath:n,actionMessage:null},changed:!0})}function rd(e,t,r){return!t.inspection||t.inspection.taskId!==r||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function sd(e,t,r){return!t.inspection||t.inspection.taskId!==r||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function id(e,t){return e.find(r=>t>=r.start&&t<r.end)?.path??e.at(-1)?.path??null}function ur(e,t,r,s){let o=r.indexOf(e[t]),m=Ve(o+s,0,r.length-1),y=r[m];return!y||y===e[t]?G({state:e}):G({state:{...e,[t]:y,actionMessage:null},changed:!0})}function hr(e,t,r,s,o=!1){if(r.length===0)return G({state:e});let m=r.indexOf(e[t]??r[0]??""),y=Ve(m===-1?0:m+s,0,r.length-1),n=r[y]??null;return n===e[t]?G({state:e}):G({state:{...e,[t]:n,actionMessage:null},changed:!0,refreshInspection:o})}function nd(e,t,r){let s=t.indexOf(e);return t[Ve(s+r,0,t.length-1)]??e}function G(e){return{state:e.state,changed:e.changed??!1,exit:e.exit??!1,pause:e.pause??!1,attachTerminal:e.attachTerminal??!1,detachTerminal:e.detachTerminal??!1,beginTaskPrompt:e.beginTaskPrompt??!1,openWorkspaceBrowser:e.openWorkspaceBrowser??!1,createWorkspaceTask:e.createWorkspaceTask??!1,createPtyTab:e.createPtyTab??!1,createPtyTabKind:e.createPtyTabKind??null,createPtyTabRunner:e.createPtyTabRunner??null,closePtyTab:e.closePtyTab??!1,syncPullRequest:e.syncPullRequest??!1,refreshPullRequestChecks:e.refreshPullRequestChecks??!1,mergeTask:e.mergeTask??!1,closeTask:e.closeTask??!1,removeWorkspace:e.removeWorkspace??!1,refreshInspection:e.refreshInspection??!1}}function jt(e,t,r){return t.includes(e??"")?e:r}function od(e){return e==="tabs"?"center":jt(e,ql,"tasks")}function ad(e,t){return e==="checks"||e==="actions"||e==="review"?"review":jt(e,Un,t)}function cd(e){return e==="file"||e==="diff"?e:null}function ld(e){return e==="terminal"?"terminal":"agent"}function dd(e){return e==="terminal"?"terminal":"control"}function ud(e,t=[...ce],r="codex"){return e&&_t(e)&&t.includes(e)?e:r}function bs(e,t=ce){let r=t.length>0?t:ce,s=r.indexOf(e);return r[(s+1)%r.length]??r[0]??"codex"}function gr(e){let t=ce.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function hd(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":gr(e.activeTab)??e.preferredPtyTabKind}function fd(e,t,r){if(!e)return{activeTab:t===ne?t:"agent",selectedPtyTabId:null};let s=e.ptyTabs.find(n=>n.id===r)??null,o=e.selectedPtyTabId?e.ptyTabs.find(n=>n.id===e.selectedPtyTabId)??null:null,m=e.ptyTabs.find(n=>n.id===t)??null;if(m)return{activeTab:m.id,selectedPtyTabId:m.id};if(Yn(t)){let l=e.ptyTabs.find(f=>f.kind===t)??null??o??s??e.ptyTabs[0]??null;return{activeTab:l?.id??ne,selectedPtyTabId:l?.id??null}}if(t===ne)return{activeTab:ne,selectedPtyTabId:s?.id??o?.id??e.ptyTabs[0]?.id??null};let y=o??s??e.ptyTabs[0]??null;return{activeTab:y?.id??ne,selectedPtyTabId:y?.id??null}}function pd(e,t,r){if(!t.inspection||t.inspection.taskId!==r)return{selectedFileTreePath:e.selectedFileTreePath,collapsedFileTreePaths:e.collapsedFileTreePaths};let s=e.selectedFileTreePath??t.inspection.selectedFilePath,o=e.selectedFileTreePath===null&&e.collapsedFileTreePaths.length===0?gd(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:s,collapsedFileTreePaths:o}}function gd(e,t){let r=new Set;if(t){let s=t.split("/");for(let o=1;o<s.length;o+=1)r.add(s.slice(0,o).join("/"))}return e.filter(s=>s.kind==="directory"&&!s.path.includes("/")&&!r.has(s.path)).map(s=>s.path).sort((s,o)=>s.localeCompare(o))}function md(e){return[e.selectedPtyTabId,e.openInspectionKind?ne:null].filter(t=>typeof t=="string")}function Fn(e,t){return t.includes(e)}function _d(e,t){let r=wd(t);return e.selectedLeftItemId&&r.includes(e.selectedLeftItemId)?e.selectedLeftItemId:e.selectedWorkspaceId&&r.includes(`workspace:${e.selectedWorkspaceId}`)?`workspace:${e.selectedWorkspaceId}`:e.selectedTaskId&&r.includes(`task:${e.selectedTaskId}`)?`task:${e.selectedTaskId}`:e.selectedRepoId&&r.includes(`repo:${e.selectedRepoId}`)?`repo:${e.selectedRepoId}`:r[0]??null}function wd(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 Zn(e){return e?e.startsWith("workspace:")?{kind:"workspace",id:e.slice(10)}:e.startsWith("repo:")?{kind:"repo",id:e.slice(5)}:e.startsWith("task:")?{kind:"task",id:e.slice(5)}:null:null}function ze(e){return typeof e=="string"?e:null}function kd(e){return e?`task:${e}`:null}function fr(e){return typeof e=="string"&&e.startsWith("task:")}function ws(e){return typeof e=="string"&&e.startsWith("new-task:")}function ks(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function bd(e){return typeof e=="string"&&e.startsWith("workspace:")}function eo(e){return ws(e)?e.slice(9):null}function to(e){return ks(e)?e.slice(19):null}function Ve(e,t,r){return Math.min(r,Math.max(t,e))}var _r="empty",de={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function io(e,t){let r=Sd(t,e),s=t.repos.find(_=>_.id===e.selectedRepoId)??t.repos[0]??null,o=r?t.tasks.filter(_=>_.workspaceId===r.id):t.tasks,m=r?.kind==="project"?o:s?o.filter(_=>_.repoId===s.id):[],y=m.find(_=>_.id===e.selectedTaskId)??m[0]??null,n=y?.type==="project",l=eu(t.tasks),f=Cd(e,y),k=Rd(e,y,f),a=k.find(_=>_.id===f)??k[0]??{id:"agent",label:"CODEX"},w=t.inspection?.taskId===y?.id?t.inspection:null,c=s?.name??"no repo",g=y?Se(y.runner):Se(e.selectedRunner);return{inputMode:e.inputMode,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,terminal:e.terminal,footerText:e.workspaceBrowser!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK ${s?`[${s.name}]`:"[no repo]"} \xB7 ${Se(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${Se(e.selectedRunner)}] Enter create task Esc pause ? help`:fr(e.selectedLeftItemId)?"n new task Enter attach X close task Esc pause ? help":e.selectedLeftItemId?.startsWith("workspace:")?"n new task Enter select X remove workspace Esc pause ? help":"n new task Enter select Esc pause ? help":e.focusedRegion==="center"?y===null?"n new task Tab tasks Esc pause ? help":f===ne?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${Se(e.centerTabRunner??y?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?n?"\u2191\u2193 navigate targets R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?"\u2191\u2193 navigate Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:Ut.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${Ut.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:g,liveLabel:y?.status==="running"?"live":"idle"},leftTree:yd(e,t),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(_=>tu(_,l[_])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":a.label,taskId:e.workspaceBrowser?"new workspace":y?.id??"no task",repo:c,agent:g},centerTranscript:Td(f,e,s,y,e.workspaceBrowser,w,r),tabs:k,rightContext:Zd(s,y),rightInspection:Wd(e,y,w)}}function yd(e,t){let r=[{text:"WORKSPACES",muted:!0,focused:e.focusedRegion==="tasks"}];if(!t.workspaces)return vd(r,e,t.repos,t.tasks);let s=t.workspaces;if(s.length===0)r.push({text:"No workspaces registered.",indent:2,muted:!0});else for(let m of s){let y=e.selectedLeftItemId===`workspace:${m.id}`;r.push({id:`workspace:${m.id}`,text:`${m.kind==="project"?"\u2261":"\u2013"} ${m.name??m.id}`,selected:y,focused:y&&e.focusedRegion==="tasks"});let n=m.kind==="project"?m.discoveredRepoIds??[]:[m.primaryRepoId],l=t.tasks.filter(f=>f.workspaceId===m.id);if(l.length===0)r.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let f of l){let k=e.selectedLeftItemId===`task:${f.id}`,a=k?"\u25B8":"\u2022",w=f.title.length>28?`${f.title.slice(0,25)}\u2026`:f.title,c={id:`task:${f.id}`,taskId:f.id,text:`${a} ${w}`,indent:2,selected:k,focused:k&&e.focusedRegion==="tasks"},g=oo(f);g&&(c.prBadge=g),r.push(c)}if(m.kind==="project"){let f=`new-task-workspace:${m.id}`,k=e.selectedLeftItemId===f;r.push({id:f,text:`+ New Project Task [${Se(e.selectedRunner)}]`,indent:2,selected:k,focused:k&&e.focusedRegion==="tasks",muted:!k})}if(m.kind==="repo"){let f=`new-task:${m.primaryRepoId}`,k=e.selectedLeftItemId===f;r.push({id:f,text:`+ New Task [${Se(e.selectedRunner)}]`,indent:2,selected:k,focused:k&&e.focusedRegion==="tasks",muted:!k})}else{r.push({text:` Repos (${n.length})`,indent:0,muted:!0});for(let f of n.slice(0,6)){let k=t.repos.find(a=>a.id===f);r.push({text:` \xB7 ${k?.name??f}`,indent:0,muted:!0})}n.length>6&&r.push({text:` \xB7 ${n.length-6} more`,indent:0,muted:!0})}}let o=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:o,focused:o&&e.focusedRegion==="tasks"}),r}function vd(e,t,r,s){if(r.length===0)e.push({text:"No repos registered.",indent:2,muted:!0});else for(let m of r){let y=t.selectedLeftItemId===`repo:${m.id}`;e.push({id:`repo:${m.id}`,text:`\u2013 ${m.name}`,selected:y,focused:y&&t.focusedRegion==="tasks"});let n=s.filter(k=>k.repoId===m.id);if(n.length===0)e.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let k of n){let a=t.selectedLeftItemId===`task:${k.id}`,w=a?"\u25B8":"\u2022",c=k.title.length>28?`${k.title.slice(0,25)}\u2026`:k.title,g={id:`task:${k.id}`,taskId:k.id,text:`${w} ${c}`,indent:2,selected:a,focused:a&&t.focusedRegion==="tasks"},_=oo(k);_&&(g.prBadge=_),e.push(g)}let l=`new-task:${m.id}`,f=t.selectedLeftItemId===l;e.push({id:l,text:`+ New Task [${Se(t.selectedRunner)}]`,indent:2,selected:f,focused:f&&t.focusedRegion==="tasks",muted:!f})}let o=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:o,focused:o&&t.focusedRegion==="tasks"}),e}function Sd(e,t){let r=e.workspaces??[];if(!e.workspaces)return null;let s=e.tasks.find(o=>o.id===t.selectedTaskId)??null;return s?r.find(o=>o.id===s.workspaceId)??null:t.selectedWorkspaceId?r.find(o=>o.id===t.selectedWorkspaceId)??null:r[0]??null}function Td(e,t,r,s,o,m=null,y=null){if(o){let l=o.entries.length===0?["No directories or git repos here."]:o.entries.map((f,k)=>{let a=k===o.selectedIndex?"\u25B8":" ",w=f.kind==="repo"?" [git repo]":"/";return`${a} ${f.name}${w}`});return Oe(["Browse for a workspace to register.",o.cwd,"",...l,"",o.error??"Use \u2191\u2193 to move, \u2192 or Enter to open, \u2190 to go up, Enter on a git repo to add it."])}if(!r)return Oe(["No repos registered yet.","","Run `craig repo add <path>` in command mode, then reopen the shell."]);if(!s){let l=y?.kind==="project",f=l?y.name??"this workspace":r.name,k=l?"Project Task":"Task";return Oe([`No tasks in ${f}.`,"",`Press n or choose + New ${k} to create one with ${Se(t.selectedRunner)}.`])}let n=s.ptyTabs.find(l=>l.id===e)??null;return n?n.kind==="agent"?Oe([`${n.title} tab ready for ${s.id}.`,"","Press Enter to attach this PTY-backed agent session.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):Oe([`${n.title} tab ready for ${s.id}.`,"","Press Enter to attach this plain task shell.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):e===ne&&t.openInspectionKind==="file"?xd(s,m,t.fileScrollOffset):e===ne&&t.openInspectionKind==="diff"?Ed(s,m,t.diffScrollOffset):s.ptyTabs.length===0&&!t.openInspectionKind?Oe(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):Oe(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function Rd(e,t,r){let s=t?.ptyTabs.map(m=>({id:m.id,label:Pd(m)}))??[];if(!t)return[{id:_r,label:"EMPTY",active:r===_r,focused:e.focusedRegion==="center"&&r===_r}];let o=e.openInspectionKind||r===ne?[{id:ne,label:Id(e)}]:[];return[...s,...o].map(m=>({...m,active:m.id===r,focused:e.focusedRegion==="center"&&m.id===r}))}function Cd(e,t){return t?t.ptyTabs.some(r=>r.id===e.activeTab)||e.activeTab===ne&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(r=>r.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??ne:e.selectedPtyTabId&&t.ptyTabs.some(r=>r.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??ne:_r}function Pd(e){return e.title.toUpperCase()}function Id(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,r=t?Ut.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${r} \u0394`:r}function xd(e,t,r){if(!e)return Oe(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return Oe(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let s=t.selectedFile,o=no(s.path??s.title);return[{text:s.title},{text:`${s.byteLength===null?"size unknown":`${s.byteLength} bytes`} \xB7 ${s.lines.length} lines \xB7 PgUp/PgDn or wheel scroll`,tone:"muted"},{text:""},...Ad(s.lines,r,o)]}function Ed(e,t,r){if(!e)return Oe(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return Oe(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let s=t.selectedDiff,o=no(s.path??s.title);return[{text:s.title},{text:`${t.diffPaths.length} changed files \xB7 ${s.lines.length} rows \xB7 PgUp/PgDn or wheel scroll`,tone:"muted"},{text:""},...Dd(s.lines,r,o)]}function Oe(e){return e.map(t=>({text:t}))}function Ad(e,t,r){let s=Math.max(3,String(e.length).length),o=Math.max(0,Math.min(t,Math.max(0,e.length-1)));return e.slice(o).map((m,y)=>{let n=o+y+1;return{text:`${`${String(n).padStart(s," ")} \u2502 `}${m}`,segments:[{text:String(n).padStart(s," "),style:{fg:de.lineNumber}},{text:" \u2502 ",style:{fg:de.gutter}},...ys(m,r)],tone:"default"}})}function Dd(e,t,r){let s=Ld(e),o=Math.max(0,Math.min(t,Math.max(0,s.length-1)));return s.slice(o).map(m=>Md(m,r))}function Ld(e){let t=[],r=0,s=0;for(let o of e){let m=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/.exec(o);if(m){r=Number.parseInt(m[1]??"0",10),s=Number.parseInt(m[2]??"0",10);continue}if(!(o.startsWith("diff --git")||o.startsWith("index ")||o.startsWith("+++ ")||o.startsWith("--- "))&&!(o==="staged"||o==="unstaged"||o==="untracked")){if(o.startsWith("-")&&!o.startsWith("---")){t.push({oldNumber:r,newNumber:null,marker:"-",text:o.slice(1),kind:"delete"}),r+=1;continue}if(o.startsWith("+")&&!o.startsWith("+++")){t.push({oldNumber:null,newNumber:s,marker:"+",text:o.slice(1),kind:"add"}),s+=1;continue}if(o.startsWith(" ")){if(r===0&&s===0)continue;t.push({oldNumber:r,newNumber:s,marker:" ",text:o.slice(1),kind:"context"}),r+=1,s+=1;continue}}}return t}function Md(e,t){let r=ro(e.oldNumber),s=ro(e.newNumber),o=e.kind==="delete"?r:s,m=e.kind==="delete"?{bg:"2a1111",fallbackFg:de.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:de.diffAdd}:null,y=`${o} \u2502 ${e.text}`,n=m?Bd(ys(e.text,t),m.bg,m.fallbackFg):ys(e.text,t),l=m?{fg:de.lineNumber,bg:m.bg}:{fg:de.lineNumber},f=m?{fg:de.gutter,bg:m.bg}:{fg:de.gutter};return{text:y,segments:[{text:o,style:l},{text:" \u2502 ",style:f},...n],fullBleed:m!==null}}function ro(e){return e===null?" ":String(e).padStart(4," ")}function no(e){let t=Ut.extname(e).toLowerCase();return[".ts",".tsx",".js",".jsx",".mjs",".cjs"].includes(t)?"javascript":[".json",".jsonc"].includes(t)?"json":[".md",".mdx"].includes(t)?"markdown":[".css",".scss"].includes(t)?"css":"plain"}function ys(e,t){return t==="diff"?Od(e):t==="markdown"?$d(e):t==="json"?vs(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?vs(e,/("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`(?:\\.|[^`\\])*`)|\/\/.*$|\/\*.*?\*\/|\b(const|let|var|function|return|if|else|for|while|class|interface|type|import|export|from|async|await|new|extends|implements|switch|case|break|continue|try|catch|throw|true|false|null|undefined)\b|-?\b\d+(?:\.\d+)?\b/g):[{text:e}]}function Od(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:de.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:de.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:de.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:de.diffMeta}}]:[{text:e}]}function Bd(e,t,r){return e.map(s=>({text:s.text,style:{...s.style??{fg:r},bg:t}}))}function $d(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:de.markup,bold:!0}}]:vs(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function vs(e,t){let r=[],s=0;for(let o of e.matchAll(t)){let m=o[0],y=o.index??0;y>s&&r.push({text:e.slice(s,y)}),r.push({text:m,style:Fd(m)}),s=y+m.length}return s<e.length&&r.push({text:e.slice(s)}),r.length>0?r:[{text:e}]}function Fd(e){return e.startsWith("//")||e.startsWith("/*")?{fg:de.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:de.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:de.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:de.markup}:{fg:de.keyword}}function Wd(e,t,r){let s=e.selectedProjectTargetId??t?.repoTargets?.[0]?.repoId??null,o=t?.type==="project"&&s?t.repoTargets?.find(n=>n.repoId===s)??null:null,m=t?.type==="project"?ao(t.repoTargets??[]):o?.pullRequest??t?.pullRequest??null,y=[Nd(e,m),{id:"mode-spacer",text:"",muted:!0}];return e.inspectionMode==="review"?{title:"",rows:[...y,...Hd(e,t)]}:e.inspectionMode==="files"?{title:"",rows:[...y,...Gd(e,r)]}:{title:"",rows:[...y,...Yd(e,r)]}}function Nd(e,t){let r=e.inspectionMode,s=[{label:"CHANGES",active:r==="diff"},{label:"FILES",active:r==="files"},{label:"REVIEW",active:r==="review"}],o=[];for(let l=0;l<s.length;l++){let f=s[l];l>0&&o.push({text:" "}),o.push({text:f.label,style:{fg:f.active?"7aa2f7":"565f89"}})}let m=Ss(t),y=Ts(t?.requiredChecks??null);return o.push({text:" "},m,{text:" "},y),{id:"inspection-mode",text:o.map(l=>l.text).join(""),segments:o}}function so(e){return[{text:" "},Ss(e),{text:" "},Ts(e.requiredChecks??null)]}function oo(e){if(e.type==="project"&&e.repoTargets?.length){let t=ao(e.repoTargets);return t?so(t):null}return e.pullRequest.number?so(e.pullRequest):null}function ao(e){let t=e.filter(s=>s.status==="ready"),r=t.map(s=>s.pullRequest).filter(s=>!!s.number);return r.length===0?null:{provider:"github",number:-1,url:null,baseBranch:null,headBranch:null,status:jd(r),mergeable:r.length===t.length&&r.every(s=>s.mergeable),mergeStateStatus:null,requiredChecks:r.flatMap(s=>s.requiredChecks),lastSyncedAt:r.map(s=>s.lastSyncedAt).filter(s=>!!s).sort().at(-1)??null,lastSyncedHeadSha:null}}function jd(e){return e.some(t=>t.status==="open")?"open":e.every(t=>t.status==="merged")?"merged":e.some(t=>t.status==="closed")?"closed":e[0]?.status??null}function Ss(e){return!e||!e.number?{text:En,style:{fg:"565f89"}}:e.status==="merged"?{text:Dn,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:Ln,style:{fg:"f7768e"}}:{text:An,style:{fg:"9ece6a"}}}function Ts(e){return!e||e.length===0?{text:fs,style:{fg:"565f89"}}:e.some(t=>t.status==="failed")?{text:ms,style:{fg:"f7768e"}}:e.every(t=>t.status==="success"||t.status==="skipped")?{text:gs,style:{fg:"9ece6a"}}:{text:ps,style:{fg:"e0af68"}}}function Hd(e,t){return t?t.type==="project"&&t.repoTargets?.length?Ud(e,t):co("pr",t.title,t.branch,t.pullRequest):[{id:"review-empty",text:"No task selected.",muted:!0}]}var mr=32;function Ud(e,t){let r=[],s=t.repoTargets??[],o=e.selectedProjectTargetId??s[0]?.repoId??null;for(let y of s){let n=o===y.repoId,l=e.focusedRegion==="inspector"&&n,f=y.repoId.startsWith("repo_")?y.repoId.slice(5):y.repoId;if(y.status!=="ready"){let a=y.failureReason?y.failureReason.slice(0,14):y.status,w=mr-a.length-1,c=f.length>w?f.slice(0,w-1)+"\u2026":f,g=mr-c.length-a.length;r.push({id:`project-review:${y.repoId}`,text:c+" ".repeat(Math.max(1,g))+a,selected:n,focused:l,muted:!0})}else{let k=Ss(y.pullRequest),a=Ts(y.pullRequest.requiredChecks),w=`${k.text} ${a.text}`,c=mr-w.length-1,g=f.length>c?f.slice(0,c-1)+"\u2026":f,_=mr-g.length-w.length,i=g+" ".repeat(Math.max(1,_));r.push({id:`project-review:${y.repoId}`,text:i+w,selected:n,focused:l,segments:[{text:i},{...k,text:k.text},{text:" "},{...a,text:a.text}]})}}let m=s.find(y=>y.repoId===o)??null;return m?.status==="ready"&&m.pullRequest.number&&(r.push({id:"target-detail-spacer",text:""}),r.push(...co("target",null,m.branch,m.pullRequest))),r}function co(e,t,r,s){let o=k=>`${e}-${k}`;if(!s.number)return[{id:o("no-pr"),text:r,muted:!0}];let m=[],y=`#${s.number} ${s.status??"open"}`;m.push(s.url?{id:o("pr-number"),text:`${y} Open in GitHub \u2197`,segments:[{text:y},{text:" Open in GitHub \u2197",style:{fg:"7aa2f7",underline:!0},href:s.url}]}:{id:o("pr-number"),text:y});let n=s.baseBranch??"?",l=s.headBranch??r;m.push({id:o("pr-branches"),text:`\u2190 ${n} \u2192 ${l}`,muted:!0});let f=s.mergeable?"merge ready":s.mergeStateStatus?`merge ${s.mergeStateStatus}`:"merge unknown";return m.push({id:o("pr-meta"),text:`${f} \xB7 synced ${qd(s.lastSyncedAt)}`,muted:!0}),m.push({id:o("checks-spacer"),text:""}),m.push({id:o("checks-header"),text:"Checks",muted:!0}),s.requiredChecks.length?m.push(...s.requiredChecks.map(Kd)):m.push({id:o("checks-none"),text:s.number?"No GitHub checks reported.":"No checks \u2014 sync after creating a PR.",muted:!0}),m}function qd(e){if(!e)return"--";let t=Date.now()-new Date(e).getTime(),r=Math.floor(t/1e3);if(r<60)return`${r}s ago`;let s=Math.floor(r/60);if(s<60)return`${s}m ago`;let o=Math.floor(s/60);return o<24?`${o}h ago`:`${Math.floor(o/24)}d ago`}function Kd(e){let{icon:t,color:r}=zd(e.status),s=e.name.length>22?`${e.name.slice(0,21)}\u2026`:e.name;return{id:`pr-check:${e.name}`,text:`${t} ${s.padEnd(22," ")} ${Vd(e.status)}`,color:r,muted:!1}}function zd(e){switch(e){case"success":return{icon:gs,color:"9ece6a"};case"pending":return{icon:ps,color:"e0af68"};case"failed":return{icon:ms,color:"f7768e"};case"skipped":return{icon:fs,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function Vd(e){return e==="success"?"passing":e==="failed"?"failing":e}function Gd(e,t){if(!t)return[{id:"empty",text:"No file index. Select a task with local changes.",muted:!0}];if(t.error)return[{id:"error",text:t.error,muted:!0}];if(t.fileRows.length===0)return[{id:"empty",text:"No Git-visible files.",muted:!0}];let r=new Map(t.diffRows.map(m=>[m.path,m.status])),s=Xd(t.fileRows,e.collapsedFileTreePaths),o=e.selectedFileTreePath??t.selectedFilePath;return s.map(m=>{let y=m.kind==="file"?r.get(m.path):void 0,n=y==="A"?"9ece6a":y==="M"?"e0af68":y==="D"?"f7768e":y==="??"?"565f89":void 0,l=m.kind==="directory"?e.collapsedFileTreePaths.includes(m.path)?In:xn:Pn(m.label),f=m.kind==="file"?Mn(m.label):void 0,k=" ".repeat(m.depth),a=f?{text:l,style:{fg:f}}:{text:l},w=n?{text:m.label,style:{fg:n}}:{text:m.label},c=[{text:k},a,w];return{id:m.path,text:`${k}${l}${m.label}`,selected:m.path===o,focused:m.path===o&&e.focusedRegion==="inspector",muted:m.kind==="directory",segments:c}})}function Xd(e,t){let r=new Set(t);return e.filter(s=>{let o=s.path.split("/");for(let m=1;m<o.length;m+=1)if(r.has(o.slice(0,m).join("/")))return!1;return!0})}function Yd(e,t){if(!t)return[{id:"empty",text:"No task diff index.",muted:!0}];if(t.error)return[{id:"error",text:t.error,muted:!0}];if(t.diffRows.length===0)return[{id:"empty",text:t.filePaths.some(o=>o.startsWith("repo_"))?"No changes in project task worktrees. Edits in the original repos are outside this task.":"No local changes.",muted:!0}];if(Jd(t))return Qd(e,t);let r=[];for(let s of["branch","staged","unstaged","untracked"]){let o=t.diffRows.filter(m=>m.group===s);o.length!==0&&(r.push({id:s,text:s.toUpperCase(),muted:!0}),r.push(...o.map(m=>lo(m,e,t))))}return r}function Jd(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function Qd(e,t){let r=[],s=[...new Set(t.diffRows.map(o=>o.path.split("/")[0]).filter(o=>typeof o=="string"&&o.length>0))].sort();for(let o of s){let m=t.diffRows.filter(n=>n.path.startsWith(`${o}/`)),y=o.startsWith("repo_")?o.slice(5):o;r.push({id:`repo-diff:${o}`,text:y,muted:!0});for(let n of["branch","staged","unstaged","untracked"]){let l=m.filter(f=>f.group===n);l.length!==0&&(r.push({id:`repo-diff:${o}:${n}`,text:` ${n}`,muted:!0}),r.push(...l.map(f=>lo(f,e,t,o.length+1))))}}return r}function lo(e,t,r,s=0){let o=e.additions===null?"-":`+${e.additions}`,m=e.deletions===null?"-":`-${e.deletions}`,y=e.status==="A"||e.group==="untracked"?"9ece6a":e.status==="D"?"f7768e":"e0af68",n=s>0?e.path.slice(s):e.path;return{id:`${e.group}:${e.path}`,text:` ${e.status.padEnd(2," ")} ${n} ${o}/${m}`,selected:e.path===(t.selectedDiffPath??r.selectedDiffPath),focused:e.path===(t.selectedDiffPath??r.selectedDiffPath)&&t.focusedRegion==="inspector",color:y}}function Zd(e,t){return e?t?[{label:"Task",value:t.id},{label:"Repo",value:e.name},{label:"Agent",value:Se(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:Ut.basename(t.worktreePath)}]:[{label:"Repo",value:e.name},{label:"Branch",value:e.defaultBranch},{label:"Task",value:"none",mutedValue:!0}]:[{label:"Repo",value:"none",mutedValue:!0}]}function eu(e){return e.reduce((t,r)=>(t[r.runner]+=1,t),{codex:0,cursor:0,claude:0})}function tu(e,t){return{name:Se(e).toLowerCase(),health:t>0?1:0,count:String(t)}}var wr={width:120,height:36},Be={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function vt(e,t){return{width:Math.max(e??wr.width,wr.width),height:Math.max(t??wr.height,wr.height)}}import{spawn as Su}from"node:child_process";import{createHash as Tu}from"node:crypto";import{createServer as Ru,createConnection as vo}from"node:net";import{openSync as Cu}from"node:fs";import{mkdir as Pu,readFile as As,rm as gt,writeFile as Iu}from"node:fs/promises";import{tmpdir as xu}from"node:os";import St from"node:path";import{createRequire as du}from"node:module";var po=ba(ho(),1),ru=1e3,su=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function go(e){return new po.default.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:ru,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}})}function mo(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function Cs(e,t){return new Promise(r=>{e.write(t,r)})}function _o(e,t=0){let r=e.buffer.active,s=[],o=r.getNullCell(),m=r.baseY+r.cursorY,y=Math.max(0,r.baseY-t);for(let n=0;n<e.rows;n+=1){let l=r.getLine(y+n);if(!l){s.push({segments:[]});continue}let f=[];for(let k=0;k<e.cols;k+=1){let a=l.getCell(k,o);!a||a.getWidth()===0||f.push({text:a.getChars()||" ",style:ou(a,y+n===m&&k===r.cursorX)})}s.push({segments:iu(nu(f))})}return s}function iu(e){let t=[];for(let r of e){let s=t.at(-1);if(s&&lu(s.style,r.style)){s.text+=r.text;continue}let o={text:r.text};wo(r.style)||(o.style=r.style),t.push(o)}return t}function nu(e){let t=e.length;for(;t>0;){let r=e[t-1];if(!r||r.text!==" "||!wo(r.style))break;t-=1}return e.slice(0,t)}function ou(e,t){let r={},s=fo(e,"fg"),o=fo(e,"bg");return s&&(r.fg=s),o&&(r.bg=o),e.isBold()&&(r.bold=!0),e.isDim()&&(r.dim=!0),e.isItalic()&&(r.italic=!0),e.isUnderline()&&(r.underline=!0),(e.isInverse()||t)&&(r.inverse=!0),r}function fo(e,t){if(t==="fg"?e.isFgDefault():e.isBgDefault())return;let s=t==="fg"?e.isFgRGB():e.isBgRGB(),o=t==="fg"?e.getFgColor():e.getBgColor();return s?o.toString(16).padStart(6,"0"):su[o]??au(o)}function au(e){if(e>=16&&e<=231){let t=e-16,r=Math.floor(t/36),s=Math.floor(t%36/6),o=t%6;return[r,s,o].map(cu).map(m=>m.toString(16).padStart(2,"0")).join("")}if(e>=232&&e<=255){let t=8+(e-232)*10;return[t,t,t].map(r=>r.toString(16).padStart(2,"0")).join("")}return"e6e6e6"}function cu(e){return e===0?0:55+e*40}function lu(e,t){return Rs(e)===Rs(t)}function Rs(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function wo(e){return Rs(e)===""}var uu=du(import.meta.url),hu=/^CTRL_([A-Z])$/,fu="\x1B[6n",pu="\x1B[c",gu="\x1B[?u",mu={ENTER:"\r",KP_ENTER:"\r",TAB:" ",SHIFT_TAB:"\x1B[Z",BACK_TAB:"\x1B[Z",BACKSPACE:"\x7F",DELETE:"\x1B[3~",ESCAPE:"\x1B",UP:"\x1B[A",DOWN:"\x1B[B",RIGHT:"\x1B[C",LEFT:"\x1B[D",HOME:"\x1B[H",END:"\x1B[F",PAGE_UP:"\x1B[5~",PAGE_DOWN:"\x1B[6~",CTRL_C:"",CTRL_D:""},kr=class{sessions=new Map;shell;env;spawn;onUpdate;resolveSessionSpec;attachedTabId=null;constructor(t){this.shell=t.shell??process.env.SHELL??"/bin/zsh",this.env=t.env??process.env,this.spawn=t.spawn,this.onUpdate=t.onUpdate,this.resolveSessionSpec=t.resolveSessionSpec??(()=>({cwd:t.workspaceRoot,command:[]}))}ensureSession(t,r,s,o){let m=this.sessions.get(r);if(m)if(m.status!=="running")Ps(m),this.sessions.delete(r);else return this.attachedTabId=r,m.scrollbackLines=0,ko(m,s),this.getViewState(r);let y=this.createSession(t,r,s,o);return this.sessions.set(r,y),this.attachedTabId=r,this.getViewState(r)}write(t){let r=this.getAttachedSession();!r||r.status!=="running"||r.pty.write(t)}writeKey(t){let r=_u(t);r!==null&&this.write(r)}scrollViewport(t){let r=this.getAttachedSession();if(!r||t===0)return;let s=r.terminal.buffer.active.baseY;r.scrollbackLines=Math.max(0,Math.min(s,r.scrollbackLines-t))}resize(t){let r=this.getAttachedSession();r&&ko(r,t)}detach(){this.attachedTabId=null}disposeSession(t){let r=this.sessions.get(t);r&&(Ps(r),this.sessions.delete(t),this.attachedTabId===t&&(this.attachedTabId=null))}disposeAll(){for(let t of this.sessions.values())Ps(t);this.sessions.clear(),this.attachedTabId=null}getViewState(t){if(!t)return{status:"idle",rows:[],error:null,scrolledBack:!1};let r=this.sessions.get(t);return r?{status:r.status,rows:_o(r.terminal,r.scrollbackLines),error:r.error,scrolledBack:r.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}createSession(t,r,s,o){let m=this.spawn??ku().spawn,y=go(s),n=o??this.resolveSessionSpec(t,r),l=ct({...this.env,...n.env??{}}),{executable:f,args:k}=bu(this.shell,n.command,{cwd:n.cwd,env:l}),a=m(f,k,{name:"xterm-256color",cols:s.columns,rows:s.rows,cwd:n.cwd,env:yu(l)}),w={taskId:t,tabId:r,pty:a,terminal:y,status:"running",error:null,disposables:[],scrollbackLines:0};return w.disposables.push(a.onData(c=>{vu(a,c),Cs(w.terminal,c).then(()=>{this.onUpdate?.(w.tabId)})})),w.disposables.push(a.onExit(c=>{w.status="exited",Cs(w.terminal,`\r
|
|
92
92
|
[process exited ${c.exitCode}]`).then(()=>{this.onUpdate?.(w.tabId)})})),w}getAttachedSession(){return this.attachedTabId?this.sessions.get(this.attachedTabId)??null:null}};function _u(e){if(e.length===1)return e;let t=mu[e];if(t!==void 0)return t;let r=hu.exec(e);return r?.[1]?String.fromCharCode(r[1].charCodeAt(0)-64):null}function ko(e,t){wu(e.pty,t),mo(e.terminal,t)}function Ps(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function wu(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function ku(){return uu("node-pty")}function bu(e,t,r){if(t.length===0)return{executable:e,args:[]};let o=`${[lt(t[0],r),...t.slice(1)].map(bo).join(" ")}; exec ${bo(e)} -l`;return{executable:e,args:["-lc",o]}}function bo(e){return`'${e.replaceAll("'","'\\''")}'`}function yu(e){let t={};for(let[r,s]of Object.entries(e))typeof s=="string"&&(t[r]=s);return t.TERM=t.TERM??"xterm-256color",t}function vu(e,t){for(let r=0;r<Is(t,fu);r+=1)e.write("\x1B[1;1R");for(let r=0;r<Is(t,pu);r+=1)e.write("\x1B[?1;2c");for(let r=0;r<Is(t,gu);r+=1)e.write("\x1B[?0u")}function Is(e,t){if(t.length===0)return 0;let r=0,s=e.indexOf(t);for(;s!==-1;)r+=1,s=e.indexOf(t,s+t.length);return r}var Ds=3;async function So(e){let t=Ls(e.paths);await Eu(t,e.paths,e.spawnDaemon);let r=await xo(t.socketPath),s=new xs(r,e);return await s.ready(),s}async function To(e,t={}){let r=Ls(e);await Pu(e.runtimeDir,{recursive:!0}),await gt(r.socketPath,{force:!0});let s=new Es(e,t),o=Ru(m=>s.handleConnection(m));await Bu(o,r.socketPath),await Iu(r.pidPath,String(process.pid),"utf8"),await new Promise(m=>{let y=()=>{s.closeClients(),o.close(()=>m())};s.onShutdown=y,process.once("SIGTERM",y),process.once("SIGINT",y)}),await gt(r.socketPath,{force:!0}),await gt(r.pidPath,{force:!0}),s.disposeAll()}async function Ro(e){let t=Ls(e);return await yr(t.socketPath)?(await Po(t.socketPath),!0):!1}var xs=class{constructor(t,r){this.socket=t;this.options=r,t.setEncoding("utf8"),t.on("data",s=>this.handleData(String(s))),t.on("error",s=>this.rejectAll(s instanceof Error?s:new Error(String(s)))),t.on("close",()=>{this.closed=!0,this.rejectAll(new Error("Craig PTY daemon connection closed."))})}socket;nextRequestId=1;pending=new Map;viewCache=new Map;attachedTabId=null;buffer="";closed=!1;options;async ready(){if((await this.send({type:"ping"})).protocolVersion!==Ds)throw new Error("Craig PTY daemon protocol mismatch.")}async ensureSession(t,r,s){let o=await this.send({type:"ensureSession",taskId:t,tabId:r,size:s,spec:this.options.resolveSessionSpec?.(t,r)??{cwd:this.options.workspaceRoot,command:[]}});this.attachedTabId=r;let m=o.view??{status:"idle",rows:[],error:null};return this.viewCache.set(r,m),m}async hydrateSessions(t){for(let r of t)try{let s=await this.send({type:"hydrateSession",tabId:r});s.view&&this.viewCache.set(r,s.view)}catch(s){let o=s instanceof Error?s.message:String(s);this.viewCache.set(r,{status:"failed",rows:[],error:o})}}write(t){this.send({type:"write",input:t}).catch(()=>{})}writeKey(t){this.send({type:"writeKey",key:t}).catch(()=>{})}scrollViewport(t){this.send({type:"scrollViewport",lines:t}).then(r=>{this.attachedTabId&&r.view&&this.viewCache.set(this.attachedTabId,r.view)}).catch(()=>{})}resize(t){this.send({type:"resize",size:t}).then(r=>{this.attachedTabId&&r.view&&this.viewCache.set(this.attachedTabId,r.view)}).catch(()=>{})}detach(){this.attachedTabId=null,this.send({type:"detach"}).catch(()=>{})}disposeSession(t){this.viewCache.delete(t),this.attachedTabId===t&&(this.attachedTabId=null),this.send({type:"disposeSession",tabId:t}).catch(()=>{})}disposeAll(){this.attachedTabId=null,!this.closed&&(this.socket.end(),this.closed=!0)}getViewState(t){return t?this.viewCache.get(t)??{status:"idle",rows:[],error:null,scrolledBack:!1}:{status:"idle",rows:[],error:null,scrolledBack:!1}}async requestShutdown(){await this.send({type:"shutdown"})}async send(t){if(this.closed)throw new Error("Craig PTY daemon connection is closed.");let r=this.nextRequestId;this.nextRequestId+=1;let s={...t,id:r},o=new Promise((y,n)=>{this.pending.set(r,{resolve:y,reject:n})});if(this.socket.destroyed)throw this.pending.delete(r),new Error("Craig PTY daemon connection is closed.");this.socket.write(`${JSON.stringify(s)}
|
|
93
93
|
`);let m=await o;if(!m.ok)throw new Error(m.error);return m}handleData(t){this.buffer+=t;let r=this.buffer.indexOf(`
|
|
94
94
|
`);for(;r!==-1;){let s=this.buffer.slice(0,r);this.buffer=this.buffer.slice(r+1),this.handleMessage(s),r=this.buffer.indexOf(`
|
|
@@ -104,7 +104,7 @@ ${m.slice(-2e3)}`:""}`)}async function Co(e){let t=await Ou(e).catch(()=>null);r
|
|
|
104
104
|
`)}function zu(e,t,r,s){let o=Qu(e.runners),m=1,y=e.leftTree.map(l=>Ju(l,t,s));return[...Pr(y,r-m),o]}function Vu(e,t,r,s){let o=e.tabs.find(a=>a.active)?.label??"AGENT",m=uh(e.tabs),y=`${" ".repeat(m)}${Ir("\u2500".repeat(o.length+1),s,se.panelMuted)}`,n=[`${Ir(e.centerHeader.tabLabel,s,se.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),l=e.tabs.find(a=>a.active)?.id??"agent",f=e.centerHeader.tabLabel==="BROWSER"||!Xn(l)?e.centerTranscript.map(a=>({...a})):Gu(e),k=[{text:Zu(e.tabs,s)},{text:y,tone:"muted"},{text:n},He(),...f];return Pr(k,r)}function Gu(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},He(),{text:e.terminal.error},He(),{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:Ko(s.segments),segments:s.segments,fullBleed:!0}))}function Xu(e,t,r,s){let o=e.rightInspection?Yu(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):Pr([{text:Fo("CONTEXT",e.focusedRegion==="tasks",s,se.panelBg)},He(),...e.rightContext.map(m=>eh(m,s)),...e.actionMessage?[He(),{text:e.actionMessage}]:[]],r);return Pr(o,r)}function Yu(e,t){let r=e.slice(0,2),s=e.slice(2),o=Math.max(0,t-r.length),m=s.findIndex(n=>n.focused||n.selected),y=m===-1?0:fh(m-Math.floor(o/2),0,Math.max(0,s.length-o));return[...r.map(n=>Ao(n)),...s.slice(y,y+o).map(n=>Ao(n))]}function Ao(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(" "),m=o===-1?e.text:e.text.slice(0,o),y=o===-1?"":e.text.slice(o);return{text:s,segments:[{text:t},{text:m,style:{fg:"7aa2f7"}},{text:y}],tone:r}}return e.color?{text:s,segments:[{text:t},{text:e.text,style:{fg:e.color}}],tone:r}:{text:s,tone:r}}function Ju(e,t,r){let s=" ".repeat(e.indent??0),o=e.accentDot?" \u25CF":"",m=e.status?` ${e.status}`:"",y=e.accentDot?` ${zo("\u25CF",r,e.selected?se.panelSelected:se.panelBg)}`:"",n=e.prBadge?e.prBadge.reduce((c,g)=>c+Ge(g.text),0):0,l=t-Ge(m)-Ge(o)-n,f=e.focused&&!e.selected?Fo(e.text,!0,r,se.panelBg):e.text,k=rt(`${s}${f}`,Math.max(0,l)),a=e.selected?"selected":e.muted?"muted":"default";if(e.prBadge){let c=[{text:`${k}${m}${y}`},...e.prBadge];return{text:`${k}${m}${e.prBadge.map(_=>_.text).join("")}`,segments:c,tone:a}}return{text:`${k}${m}${y}`,tone:a}}function Qu(e){let t=e.map(s=>{let o=s.health>=1,m=parseInt(s.count,10),y=m>1?` (${m})`:"";return{text:`${o?"\u25CF":"\u25CB"} ${s.name}${y}`,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:se.success.fg}}):r.push({text:o.text,style:{fg:se.panelMuted.fg}})}return{text:t.map(s=>s.text).join(" "),segments:r,tone:"muted"}}function Zu(e,t){return e.map(r=>r.active?Ir(r.label,t,se.panelBg):Vo(r.label,t,se.panelBg)).join(" ")}function eh(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?Vo(e.value,t,se.panelBg):e.value}`}}function Fo(e,t,r,s){return t?Ir(e,r,s):e}function Sr(e,t,r,s){let o=th(s,e.tone??"default"),m=rh(e,r,o);if(s==="left"){if(e.fullBleed)return he(rt(m,t),r,o);let n=t-Tr-Rr;if(e.rightAlign){let f=Ge(m),k=Math.max(0,n-f),a=`${" ".repeat(Tr)}${" ".repeat(k)}${m}${" ".repeat(Rr)}`;return he(a,r,o)}let l=`${" ".repeat(Tr)}${rt(m,n)}${" ".repeat(Rr)}`;return he(l,r,o)}return s==="center"&&e.fullBleed?sh(e,t,r,o):he(rt(` ${m}`,t),r,o)}function th(e,t){return t==="selected"||t==="focused"?se.panelSelected:t==="muted"?se.panelMuted:se.panelBg}function Pr(e,t){let r=e.slice(0,t);for(;r.length<t;)r.push(He());return r}function He(){return{text:""}}function rh(e,t,r){return e.segments?e.segments.map(s=>Wo(s,t,r)).join(""):e.text}function sh(e,t,r,s){let o=" ".repeat(Cr),m=Math.max(0,t-Cr*2);if(!e.segments)return he(`${o}${rt(e.text,m)}${o}`,r,s);let y=oh(e.segments,m),n=`${o}${y.map(l=>Wo(l,r,s)).join("")}${o}`;return he(n,r,s)}function Wo(e,t,r){let s=e.href?`${No(e.href)}${e.text}${Lo}`:ih(e.text);return!t||!e.style?s:`${qt(lh(e.style,r))}${dh(e.style)}${s}${Bs}${qt(r)}`}function ih(e){return e.replace(qu,t=>{let[r,s]=nh(t);return`${No(r)}${r}${Lo}${s}`})}function nh(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function No(e){return`\x1B]8;;${e}\x1B\\`}function oh(e,t){let r=ah(e,t);return ch(r,t)}function ah(e,t){let r=[],s=t;for(let o of e){if(s<=0)break;let m=Ge(o.text);if(m<=s){r.push(o),s-=m;continue}let y=Ho(o.text,s);y.length>0&&r.push({...o,text:y}),s=0}return r}function ch(e,t){let r=Ge(Ko(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 lh(e,t){let r=e.inverse?e.bg??t.bg:e.fg,s=e.inverse?e.fg??t.fg:e.bg,o={},m=r??t.fg,y=s??t.bg;return m&&(o.fg=m),y&&(o.bg=y),o}function dh(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 uh(e){let t=0;for(let r of e){if(r.active)return t;t+=r.label.length+3}return 0}function jo(e,t){let r=Math.max(0,t-Ge(e)),s=Math.floor(r/2),o=r-s;return`${" ".repeat(s)}${e}${" ".repeat(o)}`}function rt(e,t){let r=Ge(e);return r>=t?hh(e,t):e+" ".repeat(t-r)}function hh(e,t){if(t<=0)return"";if(Ge(e)<=t)return e;let r=qo(e);return Ho(r,Math.max(0,t-1))+"\u2026"}function Ge(e){let t=0;for(let r of Array.from(qo(e)))t+=Uo(r);return t}function Ho(e,t){let r="",s=0;for(let o of Array.from(e)){let m=Uo(o);if(s+m>t)break;r+=o,s+=m}return r}function Uo(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 fh(e,t,r){return Math.min(Math.max(e,t),r)}function qo(e){return e.replace(Uu,"").replace(ju,"")}function Ko(e){return e.map(t=>t.text).join("")}function he(e,t,r){if(!t)return e;let s=qt(r),o=e.replace(Hu,`${Bs}${s}`);return`${s}${o}${Bs}`}function qt(e){let t=[];return e.fg&&t.push(`38;2;${Do(e.fg).join(";")}`),e.bg&&t.push(`48;2;${Do(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function Do(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function zo(e,t,r){return Ws(e,t,se.success.fg,r)}function Ir(e,t,r){return Ws(e,t,se.accent.fg,r)}function Vo(e,t,r){return Ws(e,t,se.mutedfg.fg,r)}function Ws(e,t,r,s){if(!t)return e;let o=s.bg?{fg:r,bg:s.bg}:{fg:r};return`${qt(o)}${e}${qt(s)}`}Ae();var Ns=["Runners","Help"];function js(e,t){return ce.map(r=>{let s=be(r),o=e.runners?.[r]?.enabled!==!1,m=e.runners?.[r]?.path?.trim(),y=t.pathEdit?.runner===r?`${t.pathEdit.value}_`:m&&m.length>0?m:`default (${s.executable})`;return`${s.displayName} ${o?"enabled":"disabled"} ${y}`})}function Xo(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 Yo(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(Ns.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:Hs(t)?e===0?{kind:"runners"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function Jo(e,t,r,s){if(e.pathEdit)return ph({...e,pathEdit:e.pathEdit},t,r);let o=js(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 n=ce[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:n,value:t.runners?.[n]?.path??""}}}}if(!Hs(r))return{kind:"noop",state:e};let m=ce[e.menuIndex]??"codex",y=t.runners?.[m]?.enabled!==!1;return y&&s.length<=1?{kind:"render",state:{...e,message:"At least one runner must stay enabled."}}:{kind:"save",config:gh(t,m,!y),state:{...e,message:`${be(m).displayName} ${y?"disabled":"enabled"}.`}}}function ph(e,t,r){if(r==="ESCAPE")return{kind:"render",state:Go({...e,message:null})};if(r==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(Hs(r)){let s=e.pathEdit.runner,o=e.pathEdit.value.trim();return{kind:"save",config:mh(t,s,o.length>0?o:null),state:Go({...e,message:o.length>0?`${be(s).displayName} executable saved.`:`${be(s).displayName} executable reset to default.`})}}return _h(r)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${r}`}}}:{kind:"noop",state:e}}function gh(e,t,r){return{...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:r}}}}function mh(e,t,r){let s={...e.runners?.[t]??{},...r?{path:r}:{}};return r||delete s.path,{...e,runners:{...e.runners??{},[t]:s}}}function Go(e){let t={...e};return delete t.pathEdit,t}function Hs(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
105
105
|
`}function _h(e){return e.length===1&&e>=" "&&e!=="\x7F"}var yh=wh(import.meta.url),vh=yh("terminal-kit"),Sh=vh.terminal;async function ea(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),r=Ke(t);await yt(t);let s=await ye(r),o=mt(s),m=e.uiStateFile?await De({uiStateFile:e.uiStateFile}):null,y=Promise.resolve(),n=Promise.resolve(),l=await Kt(t,void 0,o),f=pr(qn(m,s),l);l=await Kt(t,f,o);let k=()=>{},a={workspaceRoot:t,onUpdate:()=>k(),resolveSessionSpec:(g,_)=>Ph(l,_,t)},w=e.ptyRuntime??await So({...a,paths:r}),c=g=>{if(!e.uiStateFile)return;m=Kn(m,g);let _=m;y=y.then(()=>Pe({uiStateFile:e.uiStateFile},_),()=>Pe({uiStateFile:e.uiStateFile},_)),y.catch(()=>{})};return new Promise(g=>{let _=e.terminal??Sh,i={mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:pr(f,l)},p=!1,h=!1,d=null,u=0,b=0,S=null,P=null,E=null,H=null,$=!1,D=0,x=!0,A=null,L=()=>{},z=w;k=()=>{i.mode==="main"&&(i={mode:"main",shell:X(i.shell)},E||(E=setTimeout(()=>{E=null,i.mode==="main"&&L()},50)))};function X(B){return Ht(B,z.getViewState(B.selectedPtyTabId))}function N(B){return X(Th(B,l))}function q(B){return l.tasks.find(O=>O.id===B.selectedTaskId)??null}async function v(){await z.hydrateSessions?.(l.tasks.flatMap(B=>B.ptyTabs.map(O=>O.id)))}function C(){v().catch(()=>{}).then(()=>{i.mode==="main"&&(i={mode:"main",shell:X(i.shell)},L())})}function T(B){let O=n.then(B,B);return n=O.then(()=>{},()=>{}),O}function R(B){let O=q(B),M=l.inspection,W=M&&M.taskId===O?.id?M:null,K=Rh(W?.fileRows??[],B.collapsedFileTreePaths);return{leftItemIds:Ch(l),centerTabIds:Jn(O,B),ptyTabIds:O?.ptyTabs.map(J=>J.id)??[],filePathIds:W?.filePaths??[],fileTreeRowIds:K.map(J=>J.path),fileTreeFileIds:K.filter(J=>J.kind==="file").map(J=>J.path),fileTreeDirectoryIds:K.filter(J=>J.kind==="directory").map(J=>J.path),diffPathIds:W?.diffPaths??[],diffPathRanges:[],fileLineCount:W?.selectedFile.lines.length??0,diffLineCount:W?.selectedDiff.lines.length??0,pageRows:Math.max(5,vt(_.width,_.height).height-Be.topRailHeight-9),enabledRunnerIds:o,projectTargetIds:O?.repoTargets?.map(J=>J.repoId)??[]}}async function F(B){await Qs(r,B),s=B,o=mt(s),l={...l,enabledRunnerIds:o},i.mode==="main"?i={mode:"main",shell:N({...i.shell,selectedRunner:o.includes(i.shell.selectedRunner)?i.shell.selectedRunner:it(s)})}:i={...i,shell:N({...i.shell,selectedRunner:o.includes(i.shell.selectedRunner)?i.shell.selectedRunner:it(s)})}}async function j(B){let O=B.selectedTaskId;O&&await T(async()=>{let M=await Ce(r,O);!M.ptyTabs.some(W=>W.id===B.activeTab)||M.selectedPtyTabId===B.activeTab||await re(r,{...M,selectedPtyTabId:B.activeTab})})}async function U(){let B=(i.mode==="main",i.shell);l=await Kt(t,B,o),i.mode==="main"?i={mode:"main",shell:N(i.shell)}:i={...i,shell:N(i.shell)}}async function V(B){let O=++D,M=ta(l.tasks,B),W=l.inspection,K;if(M&&W?.taskId===M.id){let J={selectedFilePath:B.selectedFilePath,selectedDiffPath:B.selectedDiffPath},ue=await mn(M,W,J);if(O!==D)return;K={...l,inspection:ue}}else if(K=await Kt(t,B,o),O!==D)return;l=K,i.mode==="main"&&(i={mode:"main",shell:N(i.shell)},c(i.shell),L())}async function te(B){let O=await Fh(B);i.mode==="main"&&(i={mode:"main",shell:N({...i.shell,workspaceBrowser:O,activeTab:i.shell.selectedPtyTabId??i.shell.activeTab,actionMessage:null})},L())}async function I(B){try{let O=N(B),M=q(O),W=O.selectedPtyTabId;if(M&&O.focusedRegion==="tasks"){let ue=M.ptyTabs.find(Ee=>Ee.kind==="agent")??null;ue?W=ue.id:(M=await Ks(M),await U(),W=M.selectedPtyTabId)}M&&!W&&(M=await Ks(M),await U(),W=M.selectedPtyTabId);let K=N({...O,activeTab:W??O.activeTab,selectedPtyTabId:W});if(!K.selectedTaskId||!W){i={mode:"main",shell:K},L();return}i={mode:"main",shell:Ht({...K,inputMode:"terminal"},z.getViewState(W))},c(i.shell);let J=await z.ensureSession(K.selectedTaskId,W,Us(vt(_.width,_.height)));h=qs(W),d=null,i={mode:"main",shell:Ht({...K,inputMode:"terminal"},J)},c(i.shell)}catch(O){let M=O instanceof Error?O.message:"Failed to start PTY.";B.selectedTaskId&&B.selectedPtyTabId&&qs(B.selectedPtyTabId)&&(await Z(B.selectedTaskId,M).catch(()=>{}),await U().catch(()=>{})),i={mode:"main",shell:Vn(N(B),M)},c(i.shell)}L()}async function Z(B,O){await T(async()=>{let M=await Ce(r,B);await re(r,{...M,status:M.status==="running"?"draft":M.status,runnerSession:{...M.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:O})})}async function Y(B,O,M){let W=N(B);if(!W.selectedTaskId)throw new Error("Select a task before creating a tab.");let K=await T(async()=>{let J=await Ce(r,W.selectedTaskId),ue=O??Eh(J,W.activeTab,W.preferredPtyTabKind),Ee=Qo(J,ue,M??void 0,s),Rt={...J,ptyTabs:[...J.ptyTabs,Ee],selectedPtyTabId:Ee.id};return await re(r,Rt),Rt});return await U(),N({...W,activeTab:K.selectedPtyTabId??W.activeTab,selectedPtyTabId:K.selectedPtyTabId,preferredPtyTabKind:K.ptyTabs.at(-1)?.kind??W.preferredPtyTabKind,focusedRegion:"center",actionMessage:`Created tab: ${K.ptyTabs.at(-1)?.title??"tab"}`})}async function ee(B){let O=N(B);if(!O.selectedTaskId)throw new Error("Select a task before closing a tab.");let{closedTab:M,nextSelectedTab:W}=await T(async()=>{let K=await Ce(r,O.selectedTaskId),J=K.ptyTabs.findIndex(Lr=>Lr.id===O.activeTab);if(J===-1)throw new Error("Only PTY tabs can be closed.");let ue=K.ptyTabs[J],Ee=K.ptyTabs.filter(Lr=>Lr.id!==ue.id),Rt=Ee[Math.min(J,Ee.length-1)]??Ee[J-1]??null;return await re(r,{...K,ptyTabs:Ee,selectedPtyTabId:Rt?.id??null}),{closedTab:ue,nextSelectedTab:Rt}});return z.disposeSession(M.id),await U(),N({...O,activeTab:W?.id??(O.openInspectionKind?"inspection":O.activeTab),selectedPtyTabId:W?.id??null,focusedRegion:"center",actionMessage:`Closed tab: ${M.title}`})}async function we(B){let O=N(B);if(!O.selectedTaskId)throw new Error("Select a task before creating or syncing a PR.");let M=await Mt(r,O.selectedTaskId,{watch:!1});await U();let W=M.disposition==="created"?"Created PR":M.disposition==="discovered"?"Discovered PR":"Synced PR";return N({...O,focusedRegion:"inspector",inspectionMode:"review",actionMessage:`${W}: #${M.prNumber} ${M.url}`})}async function ke(B){let O=N(B);if(!O.selectedTaskId)throw new Error("Select a task before refreshing PR checks.");let M=q(O),W;if(M?.type==="project"&&M.repoTargets?.length){let K=await es(r,O.selectedTaskId);await U();let J=K.synced+K.discovered+K.notFound;W=K.discovered>0?`Discovered ${K.discovered} PR${K.discovered!==1?"s":""} \xB7 ${K.synced} refreshed`:`Refreshed ${K.synced}/${J} targets`}else{let{disposition:K,task:J}=await ts(r,O.selectedTaskId);await U(),W=K==="not_found"?`No PR found for ${J.branch}`:K==="discovered"?`Discovered PR: #${J.pullRequest.number} ${J.pullRequest.url??""}`:`Refreshed checks: ${J.pullRequest.requiredChecks.length} reported`}return N({...O,focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:W})}async function Xe(){if($||i.mode!=="main")return;let B=i.shell.selectedTaskId,O=l.tasks;$=!0;try{let M=i.shell.actionMessage;for(let W of O)try{let K=W.type==="project"?!!W.repoTargets?.some(J=>J.pullRequest.number):!!W.pullRequest.number;if(W.type==="project"&&W.repoTargets?.length){let J=await es(r,W.id);W.id===B&&!K&&J.discovered>0&&(M=`Discovered ${J.discovered} PR${J.discovered!==1?"s":""}`)}else{let{disposition:J,task:ue}=await ts(r,W.id);W.id===B&&J==="discovered"&&!K&&(M=`Discovered PR: #${ue.pullRequest.number} ${ue.pullRequest.url??""}`)}}catch{}if(i.mode!=="main")return;l=await Kt(t,i.shell,o),i={mode:"main",shell:N({...i.shell,actionMessage:M})},L()}catch{}finally{$=!1}}async function xe(B){let O=N(B);if(!O.selectedTaskId)throw new Error("Select a task before merging a PR.");let M=await Ot(r,O.selectedTaskId,{preserveWorktree:!0});return await U(),N({...O,focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"merge",actionMessage:`Merged PR #${M.prNumber}; worktree preserved`})}async function Ue(B){let O=N(B);if(!O.selectedTaskId)throw new Error("Select a task before closing it.");let{taskBeforeClose:M,task:W}=await T(async()=>{let K=await Ce(r,O.selectedTaskId),J=await Cn(r,O.selectedTaskId);return{taskBeforeClose:K,task:J}});for(let K of M.ptyTabs)z.disposeSession(K.id);return await U(),N({...O,selectedActionId:"close-task",actionMessage:W.cleanup.preservedWorktree?`Archived task ${W.id}; worktree preserved`:`Archived task ${W.id}`})}async function st(B){let O=N(B);if(!O.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");if((await Ne(r,{workspaceId:O.selectedWorkspaceId,includeClosed:!0})).tasks.length>0)throw new Error(`Cannot remove workspace ${O.selectedWorkspaceId} while task records still reference it.`);await $t(r,O.selectedWorkspaceId);let W=await Ft(r,O.selectedWorkspaceId);return await U(),N({...O,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:`Removed workspace ${W.workspaceId}`})}async function Ks(B){let O=B.ptyTabs.find(K=>K.kind==="agent")??null;if(O){let K={...B,selectedPtyTabId:O.id};return await T(async()=>{let J=await Ce(r,B.id),ue=J.ptyTabs.find(Ee=>Ee.kind==="agent")??null;ue&&await re(r,{...J,selectedPtyTabId:ue.id})}),K}let M=Qo(B,"agent",void 0,s),W={...B,ptyTabs:[...B.ptyTabs,M],selectedPtyTabId:M.id};return await T(async()=>{let K=await Ce(r,B.id),J=K.ptyTabs.find(ue=>ue.kind==="agent")??null;if(J){await re(r,{...K,selectedPtyTabId:J.id});return}await re(r,{...K,ptyTabs:[...K.ptyTabs,M],selectedPtyTabId:M.id})}),W}L=()=>{sa();let B=vt(_.width,_.height),O=i.mode==="main"?$o(B,io(N(i.shell),l),{centerOnly:i.shell.centerZoomed}):i.variant==="boot"?Mo(B,{menuIndex:i.menuIndex,optionsMessage:i.optionsMessage}):i.variant==="pause"?Oo(B,{menuIndex:i.menuIndex,optionsMessage:i.optionsMessage}):i.variant==="options"?$s(B,{menuIndex:i.menuIndex,optionsMenuItems:Ns}):i.variant==="runners"?$s(B,{menuIndex:zt(i).menuIndex,optionsMenuItems:js(s,zt(i)),optionsMessage:Xo(zt(i)),optionsSubtitle:"Runners"}):Bo(B);x&&(_.moveTo(1,1),_.eraseDisplayBelow(),x=!1),_.noFormat(Dh(O)),_.hideCursor(!0)};function sa(){let B=i.mode==="main"&&i.shell.inputMode==="terminal"?"terminal":"control";B!==A&&(A=B,_.grabInput(B==="terminal"?{mouse:"button"}:!0))}let ia=()=>{process.stdout.off("resize",Xs),_.removeListener("key",zs),_.removeListener("unknown",Vs),_.removeListener("mouse",Gs),S&&(clearTimeout(S),S=null),P&&(clearTimeout(P),P=null),E&&(clearTimeout(E),E=null),H&&(clearInterval(H),H=null),z.disposeAll(),_.grabInput(!1),_.hideCursor(!1),_.fullscreen(!1)},Ar=B=>{ia(),g(B)},na=async()=>{if(i.mode!=="main"||p)return;let B=i.shell,O=B.taskPromptInput?.trim()??"";if(!B.selectedRepoId&&!B.selectedWorkspaceId){i={mode:"main",shell:N({...B,taskPromptError:"Select a workspace first."})},L();return}if(O.length===0){i={mode:"main",shell:N({...B,taskPromptError:"Task prompt cannot be empty."})},L();return}p=!0,i={mode:"main",shell:N({...B,actionMessage:`Creating ${B.selectedRunner} task in ${B.selectedWorkspaceId??B.selectedRepoId}...`})},L();let M=null;try{M=await Ah(r,B.selectedRepoId,B.selectedWorkspaceId,O,B.selectedRunner),await U();let W=N({...i.shell,selectedRepoId:M.repoId,selectedWorkspaceId:M.workspaceId,selectedTaskId:M.id,selectedPtyTabId:M.selectedPtyTabId,selectedLeftItemId:`task:${M.id}`,activeTab:M.selectedPtyTabId??"agent",inputMode:"terminal",taskPromptInput:null,taskPromptError:null,actionMessage:null}),K=await z.ensureSession(M.id,W.selectedPtyTabId??ra(M,"agent"),Us(vt(_.width,_.height)));h=qs(W.selectedPtyTabId),i={mode:"main",shell:Ht(W,K)},c(i.shell)}catch(W){W instanceof xr&&(M=W.task);let K=W instanceof Error?W.message:"Failed to create task.";M&&(await re(r,{...M,status:"draft",runnerSession:{...M.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:K}).catch(()=>{}),await U().catch(()=>{})),i={mode:"main",shell:N({...i.shell,inputMode:"control",selectedTaskId:M?.id??i.shell.selectedTaskId,selectedPtyTabId:M?.selectedPtyTabId??i.shell.selectedPtyTabId,selectedLeftItemId:M?`task:${M.id}`:i.shell.selectedLeftItemId,activeTab:M?.selectedPtyTabId??i.shell.activeTab,taskPromptInput:M?null:"",taskPromptError:K,actionMessage:null})}}finally{p=!1,L()}},oa=B=>{if(i.mode!=="main")return;let O=i.shell;if(O.taskPromptInput!==null){if(B==="ESCAPE"){i={mode:"main",shell:N({...O,taskPromptInput:null,taskPromptError:null,actionMessage:null})},L();return}if(tt(B)){na();return}if(B==="BACKSPACE"){i={mode:"main",shell:N({...O,taskPromptInput:O.taskPromptInput.slice(0,-1),taskPromptError:null})},L();return}if(B==="CTRL_R"){i={mode:"main",shell:N({...O,selectedRunner:bs(O.selectedRunner,o),taskPromptError:null})},L();return}Gn(B)&&(i={mode:"main",shell:N({...O,taskPromptInput:`${O.taskPromptInput}${B}`,taskPromptError:null})},L())}},aa=B=>{if(i.mode!=="main")return;let O=i.shell.workspaceBrowser;if(O){if(B==="ESCAPE"){i={mode:"main",shell:N({...i.shell,workspaceBrowser:null,actionMessage:null})},L();return}if(B==="UP"||B==="k"){i={mode:"main",shell:N({...i.shell,workspaceBrowser:{...O,selectedIndex:Math.max(0,O.selectedIndex-1),error:null}})},L();return}if(B==="DOWN"||B==="j"){let M=Math.max(0,O.entries.length-1);i={mode:"main",shell:N({...i.shell,workspaceBrowser:{...O,selectedIndex:Math.min(M,O.selectedIndex+1),error:null}})},L();return}if(B==="LEFT"||B==="h"){te(Tt.dirname(O.cwd)).catch(M=>{let W=M instanceof Error?M.message:"Failed to open parent directory.";i={mode:"main",shell:N({...i.shell,workspaceBrowser:{...O,error:W}})},L()});return}if(B==="RIGHT"||B==="l"||tt(B)){let M=O.entries[O.selectedIndex]??null;if(!M)return;if((B==="RIGHT"||B==="l")&&(M.kind==="directory"||M.kind==="repo")){te(M.path).catch(W=>{let K=W instanceof Error?W.message:"Failed to open directory.";i={mode:"main",shell:N({...i.shell,workspaceBrowser:{...O,error:K}})},L()});return}Bt(r,M.path).then(async W=>{await U();let K=W.repos[0]??null;i={mode:"main",shell:N({...i.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${W.workspace.id}`,selectedWorkspaceId:W.workspace.id,selectedRepoId:K?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${W.workspace.name??W.workspace.id}`})},c(i.shell),L()}).catch(W=>{let K=W instanceof Error?W.message:"Failed to add workspace.";i={mode:"main",shell:N({...i.shell,workspaceBrowser:{...O,error:K}})},L()})}}},zs=B=>{let O=typeof B=="string"?B:"";if(i.mode==="main"&&i.shell.taskPromptInput!==null){oa(O);return}if(i.mode==="main"&&i.shell.workspaceBrowser!==null){aa(O);return}if(i.mode==="main"){let M=zn(i.shell,O,R(i.shell));if(M.exit){Ar(0);return}if(M.detachTerminal){z.detach(),i={mode:"main",shell:N(M.state)},c(i.shell),L();return}if(i.shell.inputMode==="terminal"){if(M.changed){i={mode:"main",shell:N(M.state)},c(i.shell),L();return}if(h&&tt(O)){h=!1;return}h&&(h=!1),d=Mh(O)?{key:O,at:Date.now()}:null;let W=Oh(O,i.shell.terminal.scrolledBack??!1);if(W!==0){Dr(W);return}z.writeKey(O);return}if(O==="CTRL_C"){Ar(0);return}if(O==="?"&&i.shell.inputMode==="control"){i={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:i.shell},x=!0,L();return}if(M.pause){i={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:N(M.state)},x=!0,L();return}if(M.beginTaskPrompt){i={mode:"main",shell:N(M.state)},c(i.shell),L();return}if(M.openWorkspaceBrowser){te(t).catch(W=>{let K=W instanceof Error?W.message:"Failed to browse workspaces.";i={mode:"main",shell:N({...M.state,workspaceBrowser:{cwd:t,entries:[],selectedIndex:0,error:K}})},L()});return}if(M.createPtyTab){Y(M.state,M.createPtyTabKind,M.createPtyTabRunner).then(W=>{I(W)}).catch(W=>{let K=W instanceof Error?W.message:"Failed to create tab.";i={mode:"main",shell:N({...M.state,actionMessage:K})},L()});return}if(M.closePtyTab){ee(M.state).then(W=>{i={mode:"main",shell:W},c(i.shell),L()}).catch(W=>{let K=W instanceof Error?W.message:"Failed to close tab.";i={mode:"main",shell:N({...M.state,actionMessage:K})},L()});return}if(M.syncPullRequest){we(M.state).then(W=>{i={mode:"main",shell:W},c(i.shell),L()}).catch(W=>{let K=W instanceof Error?W.message:"Failed to create or sync PR.";i={mode:"main",shell:N({...M.state,actionMessage:K})},L()});return}if(M.refreshPullRequestChecks){ke(M.state).then(W=>{i={mode:"main",shell:W},c(i.shell),L()}).catch(W=>{let K=W instanceof Error?W.message:"Failed to refresh PR checks.";i={mode:"main",shell:N({...M.state,actionMessage:K})},L()});return}if(M.mergeTask){xe(M.state).then(W=>{i={mode:"main",shell:W},c(i.shell),L()}).catch(W=>{let K=W instanceof Error?W.message:"Failed to merge PR.";i={mode:"main",shell:N({...M.state,actionMessage:K})},L()});return}if(M.closeTask){Ue(M.state).then(W=>{i={mode:"main",shell:W},c(i.shell),L()}).catch(W=>{let K=W instanceof Error?W.message:"Failed to close task.";i={mode:"main",shell:N({...M.state,actionMessage:K})},L()});return}if(M.removeWorkspace){st(M.state).then(W=>{i={mode:"main",shell:W},c(i.shell),L()}).catch(W=>{let K=W instanceof Error?W.message:"Failed to remove workspace.";i={mode:"main",shell:N({...M.state,actionMessage:K})},L()});return}if(M.attachTerminal){I(M.state);return}if(M.refreshInspection){i={mode:"main",shell:N(M.state)},c(i.shell),L(),V(i.shell).catch(W=>{let K=W instanceof Error?W.message:"Failed to refresh inspection.";i={mode:"main",shell:N({...i.shell,actionMessage:K})},L()});return}M.changed&&(i={mode:"main",shell:N(M.state)},j(i.shell).catch(()=>{}),c(i.shell),L());return}if(i.variant==="help"){i.viaOptions&&i.parentVariant?i={mode:"overlay",variant:"options",menuIndex:1,optionsMessage:null,shell:i.shell,parentVariant:i.parentVariant}:i.parentVariant?i={mode:"overlay",variant:i.parentVariant,menuIndex:1,optionsMessage:null,shell:i.shell}:i={mode:"main",shell:N(i.shell)},x=!0,L();return}if(i.variant==="options"){ca(O);return}if(i.variant==="runners"){la(O);return}if(i.optionsMessage){(O==="ESCAPE"||tt(O))&&(i={...i,optionsMessage:null},L());return}if(O==="UP"||O==="k"){i={...i,menuIndex:Math.max(0,i.menuIndex-1)},L();return}if(O==="DOWN"||O==="j"){i={...i,menuIndex:Math.min(2,i.menuIndex+1)},L();return}if(O==="ESCAPE"){i.variant==="pause"&&(i={mode:"main",shell:N(i.shell)},x=!0,L());return}if(tt(O)){if(i.menuIndex===0){i={mode:"main",shell:N({...i.shell,inputMode:"control"})},x=!0,L(),C();return}if(i.menuIndex===1){let M=i.variant==="boot"||i.variant==="pause"?i.variant:void 0;i={mode:"overlay",variant:"options",menuIndex:0,optionsMessage:null,shell:i.shell,...M!==void 0?{parentVariant:M}:{}},x=!0,L();return}Ar(0)}};function ca(B){if(i.mode!=="overlay"||i.variant!=="options")return;let O=Yo(i.menuIndex,B);if(O.kind!=="noop"){if(O.kind==="render"){i={...i,menuIndex:O.menuIndex},L();return}if(O.kind==="back"){i.parentVariant&&(i={mode:"overlay",variant:i.parentVariant,menuIndex:1,optionsMessage:null,shell:i.shell},x=!0,L());return}if(O.kind==="help"){let M=i.parentVariant;i={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:i.shell,viaOptions:!0,...M!==void 0?{parentVariant:M}:{}},x=!0,L();return}if(O.kind==="runners"){let M=i.parentVariant;i={mode:"overlay",variant:"runners",menuIndex:0,optionsMessage:null,shell:i.shell,...M!==void 0?{parentVariant:M}:{}},x=!0,L()}}}function la(B){if(i.mode!=="overlay"||i.variant!=="runners")return;let O=Jo(zt(i),s,B,o);if(O.kind!=="noop"){if(O.kind==="back"){let M=i.parentVariant;i={mode:"overlay",variant:"options",menuIndex:0,optionsMessage:null,shell:i.shell,...M!==void 0?{parentVariant:M}:{}},x=!0,L();return}if(O.kind==="render"){i={...i,runnerOptions:O.state},L();return}F(O.config).then(()=>{i.mode!=="overlay"||i.variant!=="runners"||(i={...i,runnerOptions:O.state},L())}).catch(M=>{if(i.mode!=="overlay"||i.variant!=="runners")return;let W=M instanceof Error?M.message:"Failed to save runner option.";i={...i,runnerOptions:{...zt(i),message:W}},L()})}}let Vs=B=>{let O=Lh(B);if(i.mode!=="main"||i.shell.inputMode!=="terminal"||O.length===0)return;if(O.includes("")){z.detach(),h=!1,d=null,i={mode:"main",shell:N({...i.shell,inputMode:"control",actionMessage:null})},c(i.shell),L();return}let M=Bh(O);if(M!==0){Dr(M);return}if(h&&O!=="\r"&&O!==`
|
|
106
106
|
`&&O!==`\r
|
|
107
|
-
`&&(h=!1),$h(h,d,O)){h=!1;return}z.write(O)},Gs=B=>{if(i.mode!=="main")return;if(i.shell.inputMode==="control"){ua(Zo(B));return}let O=Zo(B);O!==0&&Dr(O)};function Dr(B){u+=B,!S&&(S=setTimeout(()=>{S=null;let O=u;u=0,O!==0&&(da(O),L())},16))}function da(B){z.scrollViewport(B),i={mode:"main",shell:X(i.shell)}}function ua(B){B!==0&&(b+=B,!P&&(P=setTimeout(()=>{P=null;let O=b;if(b=0,O===0||i.mode!=="main"||i.shell.inputMode!=="control")return;let M=et(i.shell,O,R(i.shell));if(M.changed){if(M.refreshInspection){i={mode:"main",shell:N(M.state)},c(i.shell),L(),V(i.shell).catch(W=>{let K=W instanceof Error?W.message:"Failed to refresh inspection.";i={mode:"main",shell:N({...i.shell,actionMessage:K})},L()});return}i={mode:"main",shell:N(M.state)},c(i.shell),L()}},16)))}let Xs=()=>{x=!0,i.mode==="main"&&i.shell.inputMode==="terminal"&&(z.resize(Us(vt(_.width,_.height))),i={mode:"main",shell:X(i.shell)}),L()};process.stdout.on("resize",Xs),_.grabInput(!0),A="control",_.hideCursor(!0),_.fullscreen(!0),_.on("key",zs),_.on("unknown",Vs),_.on("mouse",Gs),H=setInterval(()=>{Xe()},(s.github?.watchIntervalSeconds??5)*1e3),L()})}async function Kt(e,t,r){let s=Ke(e),[o,m,y]=await Promise.all([dt(s),Me(s),Ne(s)]),n=ta(y.tasks,t),l=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},f=n?await _n(n,l):null;return{workspaceRoot:e,workspaces:m.filter(k=>k.status==="active"),repos:o,tasks:y.tasks,inspection:f,...r?{enabledRunnerIds:r}:{}}}function ta(e,t){return t?.selectedTaskId?e.find(r=>r.id===t.selectedTaskId)??null:null}function Th(e,t){return pr(e,t)}function Rh(e,t){let r=new Set(t);return e.filter(s=>{let o=s.path.split("/");for(let m=1;m<o.length;m+=1)if(r.has(o.slice(0,m).join("/")))return!1;return!0})}function Ch(e){let t=[];if(e.workspaces?.length)for(let r of e.workspaces){t.push(`workspace:${r.id}`)
|
|
107
|
+
`&&(h=!1),$h(h,d,O)){h=!1;return}z.write(O)},Gs=B=>{if(i.mode!=="main")return;if(i.shell.inputMode==="control"){ua(Zo(B));return}let O=Zo(B);O!==0&&Dr(O)};function Dr(B){u+=B,!S&&(S=setTimeout(()=>{S=null;let O=u;u=0,O!==0&&(da(O),L())},16))}function da(B){z.scrollViewport(B),i={mode:"main",shell:X(i.shell)}}function ua(B){B!==0&&(b+=B,!P&&(P=setTimeout(()=>{P=null;let O=b;if(b=0,O===0||i.mode!=="main"||i.shell.inputMode!=="control")return;let M=et(i.shell,O,R(i.shell));if(M.changed){if(M.refreshInspection){i={mode:"main",shell:N(M.state)},c(i.shell),L(),V(i.shell).catch(W=>{let K=W instanceof Error?W.message:"Failed to refresh inspection.";i={mode:"main",shell:N({...i.shell,actionMessage:K})},L()});return}i={mode:"main",shell:N(M.state)},c(i.shell),L()}},16)))}let Xs=()=>{x=!0,i.mode==="main"&&i.shell.inputMode==="terminal"&&(z.resize(Us(vt(_.width,_.height))),i={mode:"main",shell:X(i.shell)}),L()};process.stdout.on("resize",Xs),_.grabInput(!0),A="control",_.hideCursor(!0),_.fullscreen(!0),_.on("key",zs),_.on("unknown",Vs),_.on("mouse",Gs),H=setInterval(()=>{Xe()},(s.github?.watchIntervalSeconds??5)*1e3),L()})}async function Kt(e,t,r){let s=Ke(e),[o,m,y]=await Promise.all([dt(s),Me(s),Ne(s)]),n=ta(y.tasks,t),l=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},f=n?await _n(n,l):null;return{workspaceRoot:e,workspaces:m.filter(k=>k.status==="active"),repos:o,tasks:y.tasks,inspection:f,...r?{enabledRunnerIds:r}:{}}}function ta(e,t){return t?.selectedTaskId?e.find(r=>r.id===t.selectedTaskId)??null:null}function Th(e,t){return pr(e,t)}function Rh(e,t){let r=new Set(t);return e.filter(s=>{let o=s.path.split("/");for(let m=1;m<o.length;m+=1)if(r.has(o.slice(0,m).join("/")))return!1;return!0})}function Ch(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 Ph(e,t,r){let s=e.tasks.find(n=>n.ptyTabs.some(l=>l.id===t))??null,o=s?.ptyTabs.find(n=>n.id===t)??null,m=s?.worktreePath??r,y=o?.kind==="agent"?xh(o):[];return s?.type==="project"?{cwd:m,command:y,env:{GIT_CEILING_DIRECTORIES:Ih(process.env.GIT_CEILING_DIRECTORIES,m)}}:{cwd:m,command:y}}function Ih(e,t){let r=(e??"").split(Tt.delimiter).filter(s=>s.length>0);return r.includes(t)?r.join(Tt.delimiter):[...r,t].join(Tt.delimiter)}function xh(e){return e.command.length>0?e.command:["codex"]}function zt(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Eh(e,t,r){return e.ptyTabs.find(s=>s.id===t)?.kind??r}function Qo(e,t,r,s={}){let o=r??e.runner,m=be(o),y=t==="agent"?m.defaultAgentTitle:"Terminal",n=t==="agent"&&r&&r!==e.runner?`${e.id}:${r}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(c=>c.id)),f=1,k=n;for(;l.has(k);)f+=1,k=`${n}-${f}`;let a=new Date().toISOString(),w=r&&r!==e.runner?r:void 0;return{id:k,kind:t,...w?{runner:w}:{},title:f===1?y:`${y} ${f}`,command:t==="agent"?me(o,void 0,s):[],createdAt:a,updatedAt:a}}async function Ah(e,t,r,s,o){let m=await ye(e);Vt(o,m);let y=r?await ir(e,r,s,{runner:o,config:m}):await At(e,t??"",s,{runner:o,config:m});try{let f=ct();await Q(lt(Or(o,m).executable,{cwd:y.repoRoot,env:f}),["--help"],{cwd:y.repoRoot,env:f})}catch(f){let k=f instanceof Error?f.message:"Failed to start runner.",a={...y.task,status:"draft",runnerSession:{...y.task.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:k};throw await re(e,a),new xr(k,a)}let n=ra(y.task,"agent"),l={...y.task,status:"running",selectedPtyTabId:n,runnerSession:{...y.task.runnerSession,startedAt:new Date().toISOString(),lastKnownState:"running"}};return await re(e,l),await Pe({uiStateFile:e.uiStateFile},{...await De({uiStateFile:e.uiStateFile})??We(),version:1,selectedRepoId:l.repoId,selectedWorkspaceId:l.workspaceId,selectedTaskId:l.id,selectedPtyTabId:l.selectedPtyTabId,inputMode:"control",focusedRegion:"center",activeTab:l.selectedPtyTabId??"agent",selectedActionId:"commit",updatedAt:new Date().toISOString()}),l}var xr=class extends Error{task;constructor(t,r){super(t),this.name="InteractiveTaskStartupError",this.task=r}};function ra(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 Us(e){return{columns:Math.max(20,e.width-Be.leftWidth-Be.rightWidth-Be.dividerWidth-Cr*2),rows:Math.max(5,e.height-Be.topRailHeight-5)}}function Dh(e){return e.split(`
|
|
108
108
|
`).map((t,r)=>`\x1B[${r+1};1H${t}`).join("")}function Lh(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function Mh(e){return e.length===1||tt(e)||e==="BACKSPACE"||e==="TAB"}function qs(e){return typeof e=="string"&&new RegExp(`:(?:agent|${ce.join("|")})(?:-\\d+)?$`).test(e)}function Oh(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 Zo(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function Bh(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 $h(e,t,r){return r.length===0?!1:e&&(r==="\r"||r===`
|
|
109
109
|
`||r===`\r
|
|
110
110
|
`)?!0:!t||Date.now()-t.at>=30?!1:r===t.key?!0:r.length<=4&&r.split("").every(s=>s===t.key)}async function Fh(e){let t=await kh(e,{withFileTypes:!0}),r=[];for(let s of t){if(!s.isDirectory())continue;let o=Tt.join(e,s.name);r.push({name:s.name,path:o,kind:await Wh(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 Wh(e){let t=Tt.join(e,".git");return await bh(t).catch(()=>null)!==null}function Er(){return process.cwd()}async function Nh(){try{if(process.argv[2]==="__craig-daemon"){let n=process.argv[3]??Er(),l=Ke(n);return await yt(n),await To(l),0}if(process.argv[2]==="__craig-daemon-shutdown"){let n=process.argv[3]??Er(),l=Ke(n);return await yt(n),await Ro(l),0}let e=Js(process.argv.slice(2)),t=Er(),r=Ke(t),s=await yt(t),o={paths:r};if(e.mode==="interactive")return await ea({uiStateFile:r.uiStateFile,workspaceRoot:r.workspaceRoot});if(!e.command)throw new Error("Command mode requires a command.");let m=await fn(e.command,o),y=pn(m);return y.length>0&&process.stdout.write(`${y}
|