craig-cli 0.6.9 → 0.7.0
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 +52 -52
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`;await s.writeFile(o,"utf8"),await s.sync(),await s.close(),await Ha(r,e)}catch(o){throw await s.close().catch(()=>{}),await za(r,{force:!0}).catch(()=>{}),o}}var ke=ge(()=>{"use strict"});import{readFile as tc}from"node:fs/promises";async function re(e){let t=await tc(e.indexFile,"utf8"),n=JSON.parse(t);return $n(n,e.workspaceRoot,e.indexFile)}async function _e(e,t){let n={...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()};await W(e.indexFile,n)}function $n(e,t,n){if(!nc(e))throw new Error(`Craig index at ${n} is invalid. Remove or repair the file before rerunning Craig.`);if(e.workspaceRoot!==t)throw new Error(`Craig index at ${n} belongs to ${e.workspaceRoot}, not ${t}. Remove or repair the file before rerunning Craig.`);return e}function nc(e){if(typeof e!="object"||e===null)return!1;let t=e;return t.version===2&&typeof t.workspaceRoot=="string"&&Array.isArray(t.repoIds)&&t.repoIds.every(n=>typeof n=="string")&&Array.isArray(t.workspaceIds)&&t.workspaceIds.every(n=>typeof n=="string")&&Array.isArray(t.taskIds)&&t.taskIds.every(n=>typeof n=="string")&&Array.isArray(t.jobIds)&&t.jobIds.every(n=>typeof n=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"}var Be=ge(()=>{"use strict";ke()});import{readFile as rc}from"node:fs/promises";async function _(e,t){let n=await rc(Dn(e,t),"utf8"),r=JSON.parse(n);return sc(r,Dn(e,t))}async function E(e,t){let n={...t,updatedAt:new Date().toISOString()};await W(Dn(e,t.id),n)}async function Mn(e,t){let n=await re(e);n.taskIds.includes(t)||await _e(e,{...n,taskIds:[...n.taskIds,t]})}function Dn(e,t){return`${e.tasksDir}/${t}.json`}function sc(e,t){let n=oc(e);if(!ac(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n}function oc(e){if(typeof e!="object"||e===null)return e;let t=e;return{...t,runner:Ln(t.runner),repoId:typeof t.repoId=="string"?t.repoId:"legacy_repo",workspaceId:typeof t.workspaceId=="string"?t.workspaceId:"legacy_workspace",sessionId:typeof t.sessionId=="string"||t.sessionId===null?t.sessionId:null,selectedPtyTabId:typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null?t.selectedPtyTabId:null,linkedRepoIds:Array.isArray(t.linkedRepoIds)?t.linkedRepoIds.filter(n=>typeof n=="string"):[],ptyTabs:dc(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:cc(t.repoTargets),runnerSession:t.runnerSession??ic(t),checks:wc(t),lastCommit:t.lastCommit??null,prs:kc(t),artifacts:Pc(t),cleanup:bc(t)}}function ic(e){if(typeof e.title!="string")return null;let t=Ln(e.runner);return{command:Y(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}}function ac(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.id=="string"&&typeof t.title=="string"&&typeof t.slug=="string"&&(t.type==="repo"||t.type==="project")&&typeof t.status=="string"&&Je(t.runner??"")&&typeof t.repoId=="string"&&typeof t.workspaceId=="string"&&(typeof t.sessionId=="string"||t.sessionId===null)&&(typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null)&&Array.isArray(t.linkedRepoIds)&&t.linkedRepoIds.every(n=>typeof n=="string")&&typeof t.repoRoot=="string"&&typeof t.worktreePath=="string"&&typeof t.branch=="string"&&ss(t.ptyTabs)&&(t.bundlePath===void 0||t.bundlePath===null||typeof t.bundlePath=="string")&&(t.selectedRepoTargetId===void 0||t.selectedRepoTargetId===null||typeof t.selectedRepoTargetId=="string")&&(t.repoTargets===void 0||lc(t.repoTargets))&&fc(t.runnerSession)&&pc(t.prompt)&&os(t.checks)&&is(t.lastCommit)&&gc(t.prs)&&hc(t.artifacts)&&cs(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"}function cc(e){if(Array.isArray(e))return e.filter(rs)}function lc(e){return Array.isArray(e)&&e.every(rs)}function rs(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.repoId=="string"&&typeof t.branch=="string"&&typeof t.repoRoot=="string"&&typeof t.worktreePath=="string"&&(t.status==="ready"||t.status==="unavailable"||t.status==="merged"||t.status==="closed")&&(typeof t.failureReason=="string"||t.failureReason===null)&&os(t.checks)&&is(t.lastCommit)&&as(t.pullRequest)&&cs(t.cleanup)}function dc(e){if(ss(e.ptyTabs))return e.ptyTabs;if(typeof e.id!="string"||typeof e.title!="string")return[];let t=typeof e.updatedAt=="string"?e.updatedAt:new Date().toISOString();return uc(e.id,e.title,t,Ln(e.runner))}function uc(e,t,n,r){let s=Z(r);return[{id:`${e}:agent`,kind:"agent",title:s.defaultAgentTitle,command:Y(r),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]}function Ln(e){return e&&Je(e)?e:"codex"}function ss(e){return Array.isArray(e)&&e.every(t=>typeof t=="object"&&t!==null&&typeof t.id=="string"&&(t.kind==="agent"||t.kind==="terminal")&&typeof t.title=="string"&&Array.isArray(t.command)&&t.command.every(n=>typeof n=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string")}function fc(e){return typeof e=="object"&&e!==null&&Array.isArray(e.command)&&e.command.every(t=>typeof t=="string")&&(typeof e.pid=="number"||e.pid===null)&&(typeof e.startedAt=="string"||e.startedAt===null)&&(e.lastKnownState==="starting"||e.lastKnownState==="running"||e.lastKnownState==="exited"||e.lastKnownState==="failed")&&(typeof e.exitCode=="number"||e.exitCode===null)&&(typeof e.exitedAt=="string"||e.exitedAt===null)}function pc(e){return typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string"}function os(e){return typeof e=="object"&&e!==null&&typeof e.source=="object"&&e.source!==null&&e.source.type==="repo_config"&&typeof e.source.path=="string"&&(typeof e.lastRunAt=="string"||e.lastRunAt===null)&&(e.status==="not_run"||e.status==="running"||e.status==="passed"||e.status==="failed")&&Array.isArray(e.commands)&&e.commands.every(t=>typeof t=="string")&&Array.isArray(e.results)&&e.results.every(t=>typeof t=="object"&&t!==null&&typeof t.command=="string"&&typeof t.startedAt=="string"&&typeof t.finishedAt=="string"&&typeof t.exitCode=="number")}function is(e){return e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string"}function as(e){return typeof e=="object"&&e!==null&&e.provider==="github"&&mc(e.requiredChecks)}function mc(e){return Array.isArray(e)&&e.every(t=>typeof t=="object"&&t!==null&&typeof t.name=="string"&&(t.status==="pending"||t.status==="success"||t.status==="failed"||t.status==="skipped"||t.status==="unknown")&&(typeof t.conclusion=="string"||t.conclusion===null))}function gc(e){return Array.isArray(e)&&e.every(as)}function hc(e){return typeof e=="object"&&e!==null&&(typeof e.logPath=="string"||e.logPath===null)&&(typeof e.checkSummaryPath=="string"||e.checkSummaryPath===null)&&(typeof e.prDraftPath=="string"||e.prDraftPath===null)&&(typeof e.prStatusPath=="string"||e.prStatusPath===null)}function cs(e){return typeof e=="object"&&e!==null&&(typeof e.paneClosedAt=="string"||e.paneClosedAt===null)&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null)}function wc(e){return e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]}}function kc(e){if(Array.isArray(e.prs))return e.prs.map(Rc);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:ls(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:ds(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]}function Rc(e){let t=e??{};return{provider:"github",owner:t.owner??null,repo:t.repo??null,number:typeof t.number=="number"?t.number:null,url:t.url??null,title:t.title??null,status:ls(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:Tc(t.reviewDecision),requiredChecks:ds(t.requiredChecks),comments:yc(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}}function ls(e){return e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null}function Tc(e){return e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null}function yc(e){return Array.isArray(e)?e.flatMap(t=>{if(typeof t!="object"||t===null)return[];let n=t;return typeof n.body!="string"||!n.body.trim()?[]:[{author:typeof n.author=="string"?n.author:null,body:n.body,createdAt:typeof n.createdAt=="string"?n.createdAt:null,url:typeof n.url=="string"?n.url:null}]}):[]}function ds(e){return Array.isArray(e)?e.map(t=>({...t,status:t.status==="pending"||t.status==="success"||t.status==="failed"||t.status==="skipped"||t.status==="unknown"?t.status:"unknown",conclusion:t.conclusion??null})):[]}function Pc(e){let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}}function bc(e){return e.cleanup??{paneClosedAt:null,worktreeRemovedAt:null,preservedWorktree:!1,warning:null}}var se=ge(()=>{"use strict";ke();Be();le()});import{readFile as Ic}from"node:fs/promises";async function de(e){try{let t=await Ic(e.uiStateFile,"utf8"),n=JSON.parse(t);return Sc(n,e.uiStateFile)}catch(t){if(xc(t))return null;throw t}}async function oe(e,t){await W(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function Re(){return{version:1,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null,selectedPtyTabId:null,inputMode:"control",focusedRegion:"tasks",activeTab:"agent",inspectorSection:"task",inspectionMode:"files",openInspectionKind:null,selectedFileTreePath:null,selectedFilePath:null,selectedDiffPath:null,collapsedFileTreePaths:[],selectedActionId:"commit",updatedAt:new Date().toISOString()}}function Sc(e,t){if(typeof e!="object"||e===null||e.version!==1||!(e.selectedRepoId===null||typeof e.selectedRepoId=="string")||!(e.selectedWorkspaceId===null||typeof e.selectedWorkspaceId=="string")||!(e.selectedTaskId===null||typeof e.selectedTaskId=="string")||!(e.selectedPtyTabId===void 0||e.selectedPtyTabId===null||typeof e.selectedPtyTabId=="string")||!Xe(e,"inputMode")||!Xe(e,"focusedRegion")||!Xe(e,"activeTab")||!Xe(e,"inspectorSection")||!Xe(e,"inspectionMode")||!$t(e,"openInspectionKind")||!$t(e,"selectedFileTreePath")||!$t(e,"selectedFilePath")||!$t(e,"selectedDiffPath")||!Cc(e,"collapsedFileTreePaths")||!Xe(e,"selectedActionId")||typeof e.updatedAt!="string")throw new Error(`Craig UI state at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return e}function Xe(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function $t(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function Cc(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function xc(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var Ze=ge(()=>{"use strict";ke()});import{execFile as vc}from"node:child_process";import{promisify as Ec}from"node:util";async function x(e,t,n={}){try{let r=await us(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(fs(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function D(e,t,n={}){try{let r=await us(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(fs(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function fs(e){return e instanceof Error}var us,ie=ge(()=>{"use strict";us=Ec(vc)});import{readFile as Gc,readdir as Hc,rm as zc}from"node:fs/promises";import Ps from"node:path";async function ue(e,t){let n=await Gc(Lt(e,t),"utf8"),r=JSON.parse(n);return Yc(r,Lt(e,t))}async function Ot(e,t){await W(Lt(e,t.id),{...t,updatedAt:new Date().toISOString()})}async function Ke(e){let t=await Hc(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>ue(e,Ps.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))}async function bs(e,t){await zc(Lt(e,t),{force:!0})}function Lt(e,t){return Ps.join(e.reposDir,`${t}.json`)}function Yc(e,t){if(typeof e!="object"||e===null||typeof e.id!="string"||typeof e.name!="string"||typeof e.rootPath!="string"||typeof e.defaultBranch!="string"||typeof e.createdAt!="string"||typeof e.updatedAt!="string")throw new Error(`Craig repo record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return e}var Ve=ge(()=>{"use strict";ke()});import{readFile as Jc,readdir as Qc,rm as Xc}from"node:fs/promises";import Is from"node:path";async function lt(e,t){let n=await Jc(jt(e,t),"utf8"),r=JSON.parse(n);return Zc(r,jt(e,t))}async function et(e,t){await W(jt(e,t.id),{...t,updatedAt:new Date().toISOString()})}async function fe(e){let t=await Qc(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>lt(e,Is.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))}async function Ss(e,t){await Xc(jt(e,t),{force:!0})}function jt(e,t){return Is.join(e.workspacesDir,`${t}.json`)}function Zc(e,t){let n=el(e);if(typeof n!="object"||n===null||typeof n.id!="string"||n.kind!=="repo"&&n.kind!=="project"||typeof n.name!="string"||typeof n.rootPath!="string"||typeof n.primaryRepoId!="string"||typeof n.branch!="string"||n.status!=="active"&&n.status!=="archived"||!Array.isArray(n.linkedRepoIds)||!(n.linkedRepoIds??[]).every(r=>typeof r=="string")||!(n.repoId===void 0||typeof n.repoId=="string")||!Array.isArray(n.discoveredRepoIds)||!(n.discoveredRepoIds??[]).every(r=>typeof r=="string")||!(n.archivedAt===null||typeof n.archivedAt=="string")||typeof n.createdAt!="string"||typeof n.updatedAt!="string")throw new Error(`Craig workspace record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n}function el(e){if(typeof e!="object"||e===null)return e;let t=e,n=t.repoId??t.primaryRepoId;return{...t,kind:t.kind??"repo",name:t.name??n??t.id,rootPath:t.rootPath??"",primaryRepoId:t.primaryRepoId??n??"",repoId:t.kind==="project"?t.repoId:n,discoveredRepoIds:Array.isArray(t.discoveredRepoIds)?t.discoveredRepoIds.filter(r=>typeof r=="string"):t.kind==="project"?[]:n?[n]:[],linkedRepoIds:Array.isArray(t.linkedRepoIds)?t.linkedRepoIds.filter(r=>typeof r=="string"):[]}}var dt=ge(()=>{"use strict";ke()});async function Te(e,t){let n=await re(e),r=[],s=[];await Promise.all(n.taskIds.map(async c=>{try{r.push(await _(e,c))}catch(l){if(cl(l)){s.push(c);return}throw l}}));let i=(t?.includeClosed?r:r.filter(c=>c.status!=="closed")).filter(c=>!(t?.workspaceId&&c.workspaceId!==t.workspaceId||t?.repoId&&c.repoId!==t.repoId&&!(c.repoTargets??[]).some(l=>l.repoId===t.repoId)));return i.sort((c,l)=>c.id.localeCompare(l.id)),s.sort(),{kind:"listTasks",tasks:i,missingTaskIds:s,repoId:t?.repoId??null}}function cl(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var pt=ge(()=>{"use strict";Be();se()});var ho={};Fa(ho,{addWorkspace:()=>ht,archiveWorkspace:()=>wt,listWorkspaces:()=>tr,removeWorkspace:()=>kt,removeWorkspaceRecord:()=>Ht,restoreWorkspace:()=>nr});import{readdir as Gl,realpath as ao,stat as Hl}from"node:fs/promises";import De from"node:path";async function ht(e,t){let n=De.resolve(e.workspaceRoot,t);if(!(await Hl(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await po(n)?zl(e,n):Yl(e,n)}async function tr(e,t){return{kind:"listWorkspaces",workspaces:(await fe(e)).filter(r=>r.status===(t.archived?"archived":"active")),archivedOnly:t.archived}}async function wt(e,t){let r={...await lt(e,t),status:"archived",archivedAt:new Date().toISOString()};return await et(e,r),await go(e,t),{kind:"archiveWorkspace",workspaceId:r.id,status:r.status,branch:r.branch}}async function nr(e,t){let r={...await lt(e,t),status:"active",archivedAt:null};await et(e,r);let s=await de({uiStateFile:e.uiStateFile})??null;return await oe({uiStateFile:e.uiStateFile},{...s??Re(),selectedWorkspaceId:r.id,selectedRepoId:r.kind==="project"?r.discoveredRepoIds?.[0]??null:r.primaryRepoId,selectedTaskId:null}),{kind:"restoreWorkspace",workspaceId:r.id,status:r.status,branch:r.branch}}async function kt(e,t){let n=await lt(e,t),r=await Te(e,{workspaceId:t,includeClosed:!0});if(n.status==="active")throw new Error(`Cannot remove workspace ${t} while it is active. Archive it first.`);if(r.tasks.length>0)throw new Error(`Cannot remove workspace ${t} while task records still reference it.`);return await Ht(e,t),await go(e,t),{kind:"removeWorkspace",workspaceId:n.id,rootPath:n.rootPath??""}}async function zl(e,t){let n=await mo(t),r=await Ke(e),s=r.find(h=>h.rootPath===t)??null,o=s?lo(s,n):co(r,t,n),i=`workspace_${o.id}`,l=(await fe(e)).find(h=>h.id===i)??null,d=new Date().toISOString(),f=l??{id:i,kind:"repo",name:o.name,rootPath:t,primaryRepoId:o.id,repoId:o.id,discoveredRepoIds:[o.id],branch:n,status:"active",linkedRepoIds:[],archivedAt:null,createdAt:d,updatedAt:d};return await Ot(e,o),l||await et(e,f),await uo(e,{repoIds:[o.id],workspaceIds:[f.id]}),await fo(e,f,o.id),{kind:"createWorkspace",workspace:f,repos:[o],created:!l}}async function Yl(e,t){let n=await Jl(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await fe(e),s=Xl(r,De.basename(t)),o=r.find(d=>d.kind==="project"&&d.rootPath===t)??null,i=new Date().toISOString(),c=n.map(d=>d.id),l=o?{...o,discoveredRepoIds:c,primaryRepoId:c[0]??o.primaryRepoId,status:"active",archivedAt:null}:{id:s,kind:"project",name:De.basename(t),rootPath:t,primaryRepoId:c[0]??"",discoveredRepoIds:c,branch:"project",status:"active",linkedRepoIds:c,archivedAt:null,createdAt:i,updatedAt:i};return await Promise.all(n.map(d=>Ot(e,d))),await et(e,l),await uo(e,{repoIds:c,workspaceIds:[l.id]}),await fo(e,l,c[0]??null),{kind:"createWorkspace",workspace:l,repos:n,created:!o}}async function Jl(e,t){let n=await Gl(t,{withFileTypes:!0}),r=await Ke(e),s=[];for(let o of n){if(!o.isDirectory()||o.name.startsWith("."))continue;let i=De.join(t,o.name);if(!await po(i))continue;let c=r.find(d=>d.rootPath===i)??s.find(d=>d.rootPath===i),l=await mo(i);s.push(c?lo(c,l):co([...r,...s],i,l))}return s.sort((o,i)=>o.name.localeCompare(i.name)||o.id.localeCompare(i.id))}function co(e,t,n){let r=new Date().toISOString();return{id:Ql(e,De.basename(t)),name:De.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}}function lo(e,t){return e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()}}function Ql(e,t){let n=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"repo",r=`repo_${n}`,s=2;for(;e.some(o=>o.id===r);)r=`repo_${n}_${s}`,s+=1;return r}function Xl(e,t){let n=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"workspace",r=`workspace_${n}`,s=2;for(;e.some(o=>o.id===r);)r=`workspace_${n}_${s}`,s+=1;return r}async function uo(e,t){let n=await re(e);await _e(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})}async function fo(e,t,n){await oe({uiStateFile:e.uiStateFile},{...await de({uiStateFile:e.uiStateFile})??Re(),selectedRepoId:n,selectedWorkspaceId:t.id,selectedTaskId:null})}async function po(e){try{let n=(await x("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([ao(n).catch(()=>De.resolve(n)),ao(e).catch(()=>De.resolve(e))]);return r===s}catch{return!1}}async function mo(e){let t=await D("git",["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"],{cwd:e}),n=t.stdout.trim().replace(/^origin\//,"");if(t.exitCode===0&&n.length>0)return n;for(let o of["main","master","trunk"])if((await D("git",["show-ref","--verify","--quiet",`refs/heads/${o}`],{cwd:e})).exitCode===0)return o;let s=(await x("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"}async function Ht(e,t){await Ss(e,t);let n=await re(e);await _e(e,{...n,workspaceIds:n.workspaceIds.filter(r=>r!==t)})}async function go(e,t){let n=await de({uiStateFile:e.uiStateFile});!n||n.selectedWorkspaceId!==t||await oe({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}var Rt=ge(()=>{"use strict";Be();Ve();dt();Ze();ie();pt()});le();function es(e){let t=[...e];for(;t[0]==="--";)t.shift();if(t.length===0)return{mode:"interactive"};if(t.length>=3&&t[0]==="repo"&&t[1]==="add"){let n=t.slice(2).join(" ").trim();if(n.length===0)throw new Error(`Repo path cannot be empty.
|
|
2
|
+
var Ha=Object.defineProperty;var ge=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var za=(e,t)=>{for(var n in t)Ha(e,n,{get:t[n],enumerable:!0})};function ee(e){return Ya[e]}function An(e,t={}){let n=ee(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}}function Ye(e={}){return W.filter(t=>e.runners?.[t]?.enabled!==!1)}function Ne(e={}){let t=Ye(e);if(t.length===0)throw new Error("No runners are enabled. Enable at least one runner in .craig/config.json.");return t.includes("codex")?"codex":t[0]}function $t(e,t={}){if(t.runners?.[e]?.enabled===!1)throw new Error(`Runner "${e}" is disabled in .craig/config.json.`)}function Qe(e){return W.includes(e)}function ns(e){if(!e||e.length===0)return"codex";if(!Qe(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${W.join(", ")}.`);return e}function se(e){return ee(e).displayName}function Y(e,t,n={}){let r=[An(e,n).executable];return t&&t.length>0&&r.push(t),r}var W,Ya,de=ge(()=>{"use strict";W=["codex","cursor","claude"],Ya={codex:{id:"codex",displayName:"Codex",executable:"codex",defaultAgentTitle:"Codex"},cursor:{id:"cursor",displayName:"Cursor",executable:"cursor-agent",defaultAgentTitle:"Cursor"},claude:{id:"claude",displayName:"Claude",executable:"claude",defaultAgentTitle:"Claude"}}});import{randomUUID as nc}from"node:crypto";import{open as rc,readFile as am,rename as sc,rm as oc}from"node:fs/promises";import $n from"node:path";async function _(e,t){let n=$n.dirname(e),r=$n.join(n,`.${$n.basename(e)}.${process.pid}.${Date.now()}.${nc()}.tmp`),s=await rc(r,"w");try{let o=`${JSON.stringify(t,null,2)}
|
|
3
|
+
`;await s.writeFile(o,"utf8"),await s.sync(),await s.close(),await sc(r,e)}catch(o){throw await s.close().catch(()=>{}),await oc(r,{force:!0}).catch(()=>{}),o}}var ke=ge(()=>{"use strict"});import{readFile as fc}from"node:fs/promises";async function oe(e){let t=await fc(e.indexFile,"utf8"),n=JSON.parse(t);return Ln(n,e.workspaceRoot,e.indexFile)}async function _e(e,t){let n={...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()};await _(e.indexFile,n)}function Ln(e,t,n){if(!pc(e))throw new Error(`Craig index at ${n} is invalid. Remove or repair the file before rerunning Craig.`);if(e.workspaceRoot!==t)throw new Error(`Craig index at ${n} belongs to ${e.workspaceRoot}, not ${t}. Remove or repair the file before rerunning Craig.`);return e}function pc(e){if(typeof e!="object"||e===null)return!1;let t=e;return t.version===2&&typeof t.workspaceRoot=="string"&&Array.isArray(t.repoIds)&&t.repoIds.every(n=>typeof n=="string")&&Array.isArray(t.workspaceIds)&&t.workspaceIds.every(n=>typeof n=="string")&&Array.isArray(t.taskIds)&&t.taskIds.every(n=>typeof n=="string")&&Array.isArray(t.jobIds)&&t.jobIds.every(n=>typeof n=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"}var Be=ge(()=>{"use strict";ke()});import{readFile as mc}from"node:fs/promises";async function B(e,t){let n=await mc(Mn(e,t),"utf8"),r=JSON.parse(n);return gc(r,Mn(e,t))}async function E(e,t){let n={...t,updatedAt:new Date().toISOString()};await _(Mn(e,t.id),n)}async function On(e,t){let n=await oe(e);n.taskIds.includes(t)||await _e(e,{...n,taskIds:[...n.taskIds,t]})}function Mn(e,t){return`${e.tasksDir}/${t}.json`}function gc(e,t){let n=hc(e);if(!kc(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n}function hc(e){if(typeof e!="object"||e===null)return e;let t=e;return{...t,runner:Fn(t.runner),repoId:typeof t.repoId=="string"?t.repoId:"legacy_repo",workspaceId:typeof t.workspaceId=="string"?t.workspaceId:"legacy_workspace",sessionId:typeof t.sessionId=="string"||t.sessionId===null?t.sessionId:null,selectedPtyTabId:typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null?t.selectedPtyTabId:null,linkedRepoIds:Array.isArray(t.linkedRepoIds)?t.linkedRepoIds.filter(n=>typeof n=="string"):[],ptyTabs:yc(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:Rc(t.repoTargets),runnerSession:t.runnerSession??wc(t),checks:vc(t),lastCommit:t.lastCommit??null,prs:Ec(t),artifacts:Lc(t),cleanup:Mc(t)}}function wc(e){if(typeof e.title!="string")return null;let t=Fn(e.runner);return{command:Y(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}}function kc(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.id=="string"&&typeof t.title=="string"&&typeof t.slug=="string"&&(t.type==="repo"||t.type==="project")&&typeof t.status=="string"&&Qe(t.runner??"")&&typeof t.repoId=="string"&&typeof t.workspaceId=="string"&&(typeof t.sessionId=="string"||t.sessionId===null)&&(typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null)&&Array.isArray(t.linkedRepoIds)&&t.linkedRepoIds.every(n=>typeof n=="string")&&typeof t.repoRoot=="string"&&typeof t.worktreePath=="string"&&typeof t.branch=="string"&&as(t.ptyTabs)&&(t.bundlePath===void 0||t.bundlePath===null||typeof t.bundlePath=="string")&&(t.selectedRepoTargetId===void 0||t.selectedRepoTargetId===null||typeof t.selectedRepoTargetId=="string")&&(t.repoTargets===void 0||Tc(t.repoTargets))&&bc(t.runnerSession)&&Sc(t.prompt)&&cs(t.checks)&&ls(t.lastCommit)&&Cc(t.prs)&&xc(t.artifacts)&&us(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"}function Rc(e){if(Array.isArray(e))return e.filter(is)}function Tc(e){return Array.isArray(e)&&e.every(is)}function is(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.repoId=="string"&&typeof t.branch=="string"&&typeof t.repoRoot=="string"&&typeof t.worktreePath=="string"&&(t.status==="ready"||t.status==="unavailable"||t.status==="merged"||t.status==="closed")&&(typeof t.failureReason=="string"||t.failureReason===null)&&cs(t.checks)&&ls(t.lastCommit)&&ds(t.pullRequest)&&us(t.cleanup)}function yc(e){if(as(e.ptyTabs))return e.ptyTabs;if(typeof e.id!="string"||typeof e.title!="string")return[];let t=typeof e.updatedAt=="string"?e.updatedAt:new Date().toISOString();return Pc(e.id,e.title,t,Fn(e.runner))}function Pc(e,t,n,r){let s=ee(r);return[{id:`${e}:agent`,kind:"agent",title:s.defaultAgentTitle,command:Y(r),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]}function Fn(e){return e&&Qe(e)?e:"codex"}function as(e){return Array.isArray(e)&&e.every(t=>typeof t=="object"&&t!==null&&typeof t.id=="string"&&(t.kind==="agent"||t.kind==="terminal")&&typeof t.title=="string"&&Array.isArray(t.command)&&t.command.every(n=>typeof n=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string")}function bc(e){return typeof e=="object"&&e!==null&&Array.isArray(e.command)&&e.command.every(t=>typeof t=="string")&&(typeof e.pid=="number"||e.pid===null)&&(typeof e.startedAt=="string"||e.startedAt===null)&&(e.lastKnownState==="starting"||e.lastKnownState==="running"||e.lastKnownState==="exited"||e.lastKnownState==="failed")&&(typeof e.exitCode=="number"||e.exitCode===null)&&(typeof e.exitedAt=="string"||e.exitedAt===null)}function Sc(e){return typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string"}function cs(e){return typeof e=="object"&&e!==null&&typeof e.source=="object"&&e.source!==null&&e.source.type==="repo_config"&&typeof e.source.path=="string"&&(typeof e.lastRunAt=="string"||e.lastRunAt===null)&&(e.status==="not_run"||e.status==="running"||e.status==="passed"||e.status==="failed")&&Array.isArray(e.commands)&&e.commands.every(t=>typeof t=="string")&&Array.isArray(e.results)&&e.results.every(t=>typeof t=="object"&&t!==null&&typeof t.command=="string"&&typeof t.startedAt=="string"&&typeof t.finishedAt=="string"&&typeof t.exitCode=="number")}function ls(e){return e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string"}function ds(e){return typeof e=="object"&&e!==null&&e.provider==="github"&&Ic(e.requiredChecks)}function Ic(e){return Array.isArray(e)&&e.every(t=>typeof t=="object"&&t!==null&&typeof t.name=="string"&&(t.status==="pending"||t.status==="success"||t.status==="failed"||t.status==="skipped"||t.status==="unknown")&&(typeof t.conclusion=="string"||t.conclusion===null))}function Cc(e){return Array.isArray(e)&&e.every(ds)}function xc(e){return typeof e=="object"&&e!==null&&(typeof e.logPath=="string"||e.logPath===null)&&(typeof e.checkSummaryPath=="string"||e.checkSummaryPath===null)&&(typeof e.prDraftPath=="string"||e.prDraftPath===null)&&(typeof e.prStatusPath=="string"||e.prStatusPath===null)}function us(e){return typeof e=="object"&&e!==null&&(typeof e.paneClosedAt=="string"||e.paneClosedAt===null)&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null)}function vc(e){return e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]}}function Ec(e){if(Array.isArray(e.prs))return e.prs.map(Ac);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:fs(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:ps(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]}function Ac(e){let t=e??{};return{provider:"github",owner:t.owner??null,repo:t.repo??null,number:typeof t.number=="number"?t.number:null,url:t.url??null,title:t.title??null,status:fs(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:$c(t.reviewDecision),requiredChecks:ps(t.requiredChecks),comments:Dc(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}}function fs(e){return e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null}function $c(e){return e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null}function Dc(e){return Array.isArray(e)?e.flatMap(t=>{if(typeof t!="object"||t===null)return[];let n=t;return typeof n.body!="string"||!n.body.trim()?[]:[{author:typeof n.author=="string"?n.author:null,body:n.body,createdAt:typeof n.createdAt=="string"?n.createdAt:null,url:typeof n.url=="string"?n.url:null}]}):[]}function ps(e){return Array.isArray(e)?e.map(t=>({...t,status:t.status==="pending"||t.status==="success"||t.status==="failed"||t.status==="skipped"||t.status==="unknown"?t.status:"unknown",conclusion:t.conclusion??null})):[]}function Lc(e){let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}}function Mc(e){return e.cleanup??{paneClosedAt:null,worktreeRemovedAt:null,preservedWorktree:!1,warning:null}}var ie=ge(()=>{"use strict";ke();Be();de()});import{readFile as Oc}from"node:fs/promises";async function ue(e){try{let t=await Oc(e.uiStateFile,"utf8"),n=JSON.parse(t);return Fc(n,e.uiStateFile)}catch(t){if(Nc(t))return null;throw t}}async function ae(e,t){await _(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function Re(){return{version:1,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null,selectedPtyTabId:null,inputMode:"control",focusedRegion:"tasks",activeTab:"agent",inspectorSection:"task",inspectionMode:"files",openInspectionKind:null,selectedFileTreePath:null,selectedFilePath:null,selectedDiffPath:null,collapsedFileTreePaths:[],selectedActionId:"commit",updatedAt:new Date().toISOString()}}function Fc(e,t){if(typeof e!="object"||e===null||e.version!==1||!(e.selectedRepoId===null||typeof e.selectedRepoId=="string")||!(e.selectedWorkspaceId===null||typeof e.selectedWorkspaceId=="string")||!(e.selectedTaskId===null||typeof e.selectedTaskId=="string")||!(e.selectedPtyTabId===void 0||e.selectedPtyTabId===null||typeof e.selectedPtyTabId=="string")||!Xe(e,"inputMode")||!Xe(e,"focusedRegion")||!Xe(e,"activeTab")||!Xe(e,"inspectorSection")||!Xe(e,"inspectionMode")||!Dt(e,"openInspectionKind")||!Dt(e,"selectedFileTreePath")||!Dt(e,"selectedFilePath")||!Dt(e,"selectedDiffPath")||!jc(e,"collapsedFileTreePaths")||!Xe(e,"selectedActionId")||typeof e.updatedAt!="string")throw new Error(`Craig UI state at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return e}function Xe(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function Dt(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function jc(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function Nc(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var Ze=ge(()=>{"use strict";ke()});import{execFile as Wc}from"node:child_process";import{promisify as _c}from"node:util";async function C(e,t,n={}){try{let r=await ms(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(gs(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function L(e,t,n={}){try{let r=await ms(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(gs(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function gs(e){return e instanceof Error}var ms,ce=ge(()=>{"use strict";ms=_c(Wc)});import{readFile as nl,readdir as rl,rm as sl}from"node:fs/promises";import Is from"node:path";async function fe(e,t){let n=await nl(Ot(e,t),"utf8"),r=JSON.parse(n);return ol(r,Ot(e,t))}async function Ft(e,t){await _(Ot(e,t.id),{...t,updatedAt:new Date().toISOString()})}async function Ke(e){let t=await rl(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>fe(e,Is.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))}async function Cs(e,t){await sl(Ot(e,t),{force:!0})}function Ot(e,t){return Is.join(e.reposDir,`${t}.json`)}function ol(e,t){if(typeof e!="object"||e===null||typeof e.id!="string"||typeof e.name!="string"||typeof e.rootPath!="string"||typeof e.defaultBranch!="string"||typeof e.createdAt!="string"||typeof e.updatedAt!="string")throw new Error(`Craig repo record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return e}var Ve=ge(()=>{"use strict";ke()});import{readFile as il,readdir as al,rm as cl}from"node:fs/promises";import xs from"node:path";async function dt(e,t){let n=await il(jt(e,t),"utf8"),r=JSON.parse(n);return ll(r,jt(e,t))}async function et(e,t){await _(jt(e,t.id),{...t,updatedAt:new Date().toISOString()})}async function pe(e){let t=await al(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>dt(e,xs.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))}async function vs(e,t){await cl(jt(e,t),{force:!0})}function jt(e,t){return xs.join(e.workspacesDir,`${t}.json`)}function ll(e,t){let n=dl(e);if(typeof n!="object"||n===null||typeof n.id!="string"||n.kind!=="repo"&&n.kind!=="project"||typeof n.name!="string"||typeof n.rootPath!="string"||typeof n.primaryRepoId!="string"||typeof n.branch!="string"||n.status!=="active"&&n.status!=="archived"||!Array.isArray(n.linkedRepoIds)||!(n.linkedRepoIds??[]).every(r=>typeof r=="string")||!(n.repoId===void 0||typeof n.repoId=="string")||!Array.isArray(n.discoveredRepoIds)||!(n.discoveredRepoIds??[]).every(r=>typeof r=="string")||!(n.archivedAt===null||typeof n.archivedAt=="string")||typeof n.createdAt!="string"||typeof n.updatedAt!="string")throw new Error(`Craig workspace record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n}function dl(e){if(typeof e!="object"||e===null)return e;let t=e,n=t.repoId??t.primaryRepoId;return{...t,kind:t.kind??"repo",name:t.name??n??t.id,rootPath:t.rootPath??"",primaryRepoId:t.primaryRepoId??n??"",repoId:t.kind==="project"?t.repoId:n,discoveredRepoIds:Array.isArray(t.discoveredRepoIds)?t.discoveredRepoIds.filter(r=>typeof r=="string"):t.kind==="project"?[]:n?[n]:[],linkedRepoIds:Array.isArray(t.linkedRepoIds)?t.linkedRepoIds.filter(r=>typeof r=="string"):[]}}var ut=ge(()=>{"use strict";ke()});async function Te(e,t){let n=await oe(e),r=[],s=[];await Promise.all(n.taskIds.map(async c=>{try{r.push(await B(e,c))}catch(l){if(kl(l)){s.push(c);return}throw l}}));let i=(t?.includeClosed?r:r.filter(c=>c.status!=="closed")).filter(c=>!(t?.workspaceId&&c.workspaceId!==t.workspaceId||t?.repoId&&c.repoId!==t.repoId&&!(c.repoTargets??[]).some(l=>l.repoId===t.repoId)));return i.sort((c,l)=>c.id.localeCompare(l.id)),s.sort(),{kind:"listTasks",tasks:i,missingTaskIds:s,repoId:t?.repoId??null}}function kl(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var mt=ge(()=>{"use strict";Be();ie()});var Ro={};za(Ro,{addWorkspace:()=>wt,archiveWorkspace:()=>kt,listWorkspaces:()=>sr,removeWorkspace:()=>Rt,removeWorkspaceRecord:()=>zt,restoreWorkspace:()=>or});import{readdir as nd,realpath as uo,stat as rd}from"node:fs/promises";import Le from"node:path";async function wt(e,t){let n=Le.resolve(e.workspaceRoot,t);if(!(await rd(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await ho(n)?sd(e,n):od(e,n)}async function sr(e,t){return{kind:"listWorkspaces",workspaces:(await pe(e)).filter(r=>r.status===(t.archived?"archived":"active")),archivedOnly:t.archived}}async function kt(e,t){let r={...await dt(e,t),status:"archived",archivedAt:new Date().toISOString()};return await et(e,r),await ko(e,t),{kind:"archiveWorkspace",workspaceId:r.id,status:r.status,branch:r.branch}}async function or(e,t){let r={...await dt(e,t),status:"active",archivedAt:null};await et(e,r);let s=await ue({uiStateFile:e.uiStateFile})??null;return await ae({uiStateFile:e.uiStateFile},{...s??Re(),selectedWorkspaceId:r.id,selectedRepoId:r.kind==="project"?r.discoveredRepoIds?.[0]??null:r.primaryRepoId,selectedTaskId:null}),{kind:"restoreWorkspace",workspaceId:r.id,status:r.status,branch:r.branch}}async function Rt(e,t){let n=await dt(e,t),r=await Te(e,{workspaceId:t,includeClosed:!0});if(n.status==="active")throw new Error(`Cannot remove workspace ${t} while it is active. Archive it first.`);if(r.tasks.length>0)throw new Error(`Cannot remove workspace ${t} while task records still reference it.`);return await zt(e,t),await ko(e,t),{kind:"removeWorkspace",workspaceId:n.id,rootPath:n.rootPath??""}}async function sd(e,t){let n=await wo(t),r=await Ke(e),s=r.find(g=>g.rootPath===t)??null,o=s?po(s,n):fo(r,t,n),i=`workspace_${o.id}`,l=(await pe(e)).find(g=>g.id===i)??null,d=new Date().toISOString(),f=l??{id:i,kind:"repo",name:o.name,rootPath:t,primaryRepoId:o.id,repoId:o.id,discoveredRepoIds:[o.id],branch:n,status:"active",linkedRepoIds:[],archivedAt:null,createdAt:d,updatedAt:d};return await Ft(e,o),l||await et(e,f),await mo(e,{repoIds:[o.id],workspaceIds:[f.id]}),await go(e,f,o.id),{kind:"createWorkspace",workspace:f,repos:[o],created:!l}}async function od(e,t){let n=await id(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await pe(e),s=cd(r,Le.basename(t)),o=r.find(d=>d.kind==="project"&&d.rootPath===t)??null,i=new Date().toISOString(),c=n.map(d=>d.id),l=o?{...o,discoveredRepoIds:c,primaryRepoId:c[0]??o.primaryRepoId,status:"active",archivedAt:null}:{id:s,kind:"project",name:Le.basename(t),rootPath:t,primaryRepoId:c[0]??"",discoveredRepoIds:c,branch:"project",status:"active",linkedRepoIds:c,archivedAt:null,createdAt:i,updatedAt:i};return await Promise.all(n.map(d=>Ft(e,d))),await et(e,l),await mo(e,{repoIds:c,workspaceIds:[l.id]}),await go(e,l,c[0]??null),{kind:"createWorkspace",workspace:l,repos:n,created:!o}}async function id(e,t){let n=await nd(t,{withFileTypes:!0}),r=await Ke(e),s=[];for(let o of n){if(!o.isDirectory()||o.name.startsWith("."))continue;let i=Le.join(t,o.name);if(!await ho(i))continue;let c=r.find(d=>d.rootPath===i)??s.find(d=>d.rootPath===i),l=await wo(i);s.push(c?po(c,l):fo([...r,...s],i,l))}return s.sort((o,i)=>o.name.localeCompare(i.name)||o.id.localeCompare(i.id))}function fo(e,t,n){let r=new Date().toISOString();return{id:ad(e,Le.basename(t)),name:Le.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}}function po(e,t){return e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()}}function ad(e,t){let n=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"repo",r=`repo_${n}`,s=2;for(;e.some(o=>o.id===r);)r=`repo_${n}_${s}`,s+=1;return r}function cd(e,t){let n=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"workspace",r=`workspace_${n}`,s=2;for(;e.some(o=>o.id===r);)r=`workspace_${n}_${s}`,s+=1;return r}async function mo(e,t){let n=await oe(e);await _e(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})}async function go(e,t,n){await ae({uiStateFile:e.uiStateFile},{...await ue({uiStateFile:e.uiStateFile})??Re(),selectedRepoId:n,selectedWorkspaceId:t.id,selectedTaskId:null})}async function ho(e){try{let n=(await C("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([uo(n).catch(()=>Le.resolve(n)),uo(e).catch(()=>Le.resolve(e))]);return r===s}catch{return!1}}async function wo(e){let t=await L("git",["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"],{cwd:e}),n=t.stdout.trim().replace(/^origin\//,"");if(t.exitCode===0&&n.length>0)return n;for(let o of["main","master","trunk"])if((await L("git",["show-ref","--verify","--quiet",`refs/heads/${o}`],{cwd:e})).exitCode===0)return o;let s=(await C("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"}async function zt(e,t){await vs(e,t);let n=await oe(e);await _e(e,{...n,workspaceIds:n.workspaceIds.filter(r=>r!==t)})}async function ko(e,t){let n=await ue({uiStateFile:e.uiStateFile});!n||n.selectedWorkspaceId!==t||await ae({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}var Tt=ge(()=>{"use strict";Be();Ve();ut();Ze();ce();mt()});de();function rs(e){let t=[...e];for(;t[0]==="--";)t.shift();if(t.length===0)return{mode:"interactive"};if(t.length>=3&&t[0]==="repo"&&t[1]==="add"){let n=t.slice(2).join(" ").trim();if(n.length===0)throw new Error(`Repo path cannot be empty.
|
|
4
4
|
|
|
5
|
-
`+
|
|
5
|
+
`+Q());return{mode:"command",command:{kind:"addRepo",path:n}}}if(t.length>=3&&t[0]==="workspace"&&t[1]==="add"){let n=t.slice(2).join(" ").trim();if(n.length===0)throw new Error(`Workspace path cannot be empty.
|
|
6
6
|
|
|
7
|
-
`+
|
|
7
|
+
`+Q());return{mode:"command",command:{kind:"addWorkspace",path:n}}}if(t.length===2&&t[0]==="repo"&&t[1]==="list")return{mode:"command",command:{kind:"listRepos"}};if(t.length===3&&t[0]==="repo"&&t[1]==="remove")return{mode:"command",command:{kind:"removeRepo",repoId:t[2].trim()}};if(t.length>=2&&t.length<=3&&t[0]==="workspace"&&t[1]==="list"){let n=t[2]==="--archived";if(t.length===3&&!n)throw new Error(`Unsupported command: ${t.join(" ")}
|
|
8
8
|
|
|
9
|
-
${
|
|
9
|
+
${Q()}`);return{mode:"command",command:{kind:"listWorkspaces",archived:n}}}if(t.length===3&&t[0]==="workspace"&&t[1]==="archive")return{mode:"command",command:{kind:"archiveWorkspace",workspaceId:t[2].trim()}};if(t.length===3&&t[0]==="workspace"&&t[1]==="restore")return{mode:"command",command:{kind:"restoreWorkspace",workspaceId:t[2].trim()}};if(t.length===3&&t[0]==="workspace"&&t[1]==="remove")return{mode:"command",command:{kind:"removeWorkspace",workspaceId:t[2].trim()}};if(t.length>=2&&t[0]==="task"&&t[1]==="new"){let n=t.indexOf("--repo"),r=t.indexOf("--workspace"),s=t.indexOf("--runner");if(n===-1&&r===-1)throw new Error(`Task creation now requires '--repo <repo-id>' or '--workspace <workspace-id>'.
|
|
10
10
|
|
|
11
|
-
`+
|
|
11
|
+
`+Q());if(n!==-1&&r!==-1)throw new Error(`Task creation accepts either '--repo' or '--workspace', not both.
|
|
12
12
|
|
|
13
|
-
`+
|
|
13
|
+
`+Q());let o=n===-1?void 0:t[n+1]?.trim()??"",i=r===-1?void 0:t[r+1]?.trim()??"",c=s===-1?void 0:ns(t[s+1]?.trim()??""),d=t.filter((f,g)=>g>1&&g!==n&&g!==n+1&&g!==r&&g!==r+1&&g!==s&&g!==s+1).join(" ").trim();if(o!==void 0&&o.length===0)throw new Error(`Repo id cannot be empty.
|
|
14
14
|
|
|
15
|
-
`+
|
|
15
|
+
`+Q());if(i!==void 0&&i.length===0)throw new Error(`Workspace id cannot be empty.
|
|
16
16
|
|
|
17
|
-
`+
|
|
17
|
+
`+Q());if(d.length===0)throw new Error(`Task prompt cannot be empty.
|
|
18
18
|
|
|
19
|
-
`+
|
|
19
|
+
`+Q());return{mode:"command",command:{kind:"createTask",...o?{repoId:o}:{},...i?{workspaceId:i}:{},prompt:d,...c?{runner:c}:{}}}}if(t.length>=2&&t.length<=4&&t[0]==="task"&&t[1]==="list"){if(t.length===2)return{mode:"command",command:{kind:"listTasks"}};if(t.length===4&&t[2]==="--repo")return{mode:"command",command:{kind:"listTasks",repoId:t[3].trim()}};throw new Error(`Unsupported command: ${t.join(" ")}
|
|
20
20
|
|
|
21
|
-
${
|
|
21
|
+
${Q()}`)}if(t.length===3&&t[0]==="task"&&t[1]==="attach")return{mode:"command",command:{kind:"attachTask",taskId:he(t[2])}};if(t.length===3&&t[0]==="task"&&t[1]==="show")return{mode:"command",command:{kind:"showTask",taskId:he(t[2])}};if(t.length===3&&t[0]==="task"&&t[1]==="logs")return{mode:"command",command:{kind:"streamTaskLogs",taskId:he(t[2])}};if(t.length===3&&t[0]==="task"&&t[1]==="diff")return{mode:"command",command:{kind:"showTaskDiff",taskId:he(t[2])}};if(t.length===3&&t[0]==="task"&&t[1]==="focus")return{mode:"command",command:{kind:"focusTask",taskId:he(t[2])}};if(t.length===3&&t[0]==="task"&&t[1]==="open")return{mode:"command",command:{kind:"openTask",taskId:he(t[2])}};if(t.length===3&&t[0]==="task"&&t[1]==="check")return{mode:"command",command:{kind:"runChecks",taskId:he(t[2])}};if(t.length===3&&t[0]==="task"&&t[1]==="commit")return{mode:"command",command:{kind:"commitTask",taskId:he(t[2])}};if(t.length===4&&t[0]==="link"&&t[1]==="add")return{mode:"command",command:{kind:"addTaskLink",taskId:he(t[2]),repoId:Qa(t[3])}};if(t.length===3&&t[0]==="link"&&t[1]==="list")return{mode:"command",command:{kind:"listTaskLinks",taskId:he(t[2])}};throw new Error(`Unsupported command: ${t.join(" ")}
|
|
22
22
|
|
|
23
|
-
${
|
|
23
|
+
${Q()}`)}function Q(){return["Craig commands:"," craig Show the Craig phase 0 placeholder"," craig repo add Register a repo in the current Craig workspace"," craig workspace add <path> Register a repo or parent-directory workspace"," craig repo list List registered repos"," craig repo remove Remove a registered repo"," craig workspace list List active workspaces"," craig workspace list --archived List archived workspaces"," craig workspace archive Archive a workspace"," craig workspace restore Restore an archived workspace"," craig workspace remove Remove an archived workspace"," craig task new --repo <repo-id> [--runner codex|cursor|claude] <prompt> Create a new Craig repo task"," craig task new --workspace <workspace-id> [--runner codex|cursor|claude] <prompt> Create a new Craig workspace task"," craig task list [--repo <repo-id>] List known Craig tasks"," craig task show Show details for a Craig task"," craig task logs Stream Craig-managed logs for a task"," craig task diff Show the current worktree diff for a task"," craig task attach Attach to a live task session"," craig task focus Focus the tmux pane for a task"," craig task open Open the task worktree or print its path"," craig task check Run configured checks for a task"," craig task commit Commit all task worktree changes"," craig link add Add a linked repo to a task"," craig link list List linked repos for a task"].join(`
|
|
24
24
|
`)}function he(e){let t=e.trim();if(t.length===0)throw new Error(`Task id cannot be empty.
|
|
25
25
|
|
|
26
|
-
${
|
|
26
|
+
${Q()}`);return t}function Qa(e){let t=e.trim();if(t.length===0)throw new Error(`Repo id cannot be empty.
|
|
27
27
|
|
|
28
|
-
${
|
|
29
|
-
`,"utf8")}function ns(e,t){if(typeof e!="object"||e===null)throw new Error(`Craig config at ${t} is invalid. Expected a JSON object.`);let n=e;if(n.runners!==void 0){if(typeof n.runners!="object"||n.runners===null||Array.isArray(n.runners))throw new Error(`Craig config at ${t} is invalid. "runners" must be an object.`);for(let[r,s]of Object.entries(n.runners)){if(!N.includes(r))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" is not supported. Expected one of: ${N.join(", ")}.`);if(typeof s!="object"||s===null||Array.isArray(s))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" must be an object.`);let o=s;if(o.enabled!==void 0&&typeof o.enabled!="boolean")throw new Error(`Craig config at ${t} is invalid. "runners.${r}.enabled" must be a boolean.`);if(o.path!==void 0&&(typeof o.path!="string"||o.path.trim().length===0))throw new Error(`Craig config at ${t} is invalid. "runners.${r}.path" must be a non-empty string.`)}}if(n.checks!==void 0&&(typeof n.checks!="object"||n.checks===null||!Array.isArray(n.checks.commands)||!n.checks.commands.every(r=>typeof r=="string")))throw new Error(`Craig config at ${t} is invalid. "checks.commands" must be an array of strings.`);if(n.open!==void 0&&(typeof n.open!="object"||n.open===null||!Array.isArray(n.open.command)||!n.open.command.every(r=>typeof r=="string")))throw new Error(`Craig config at ${t} is invalid. "open.command" must be an array of strings.`);if(n.github!==void 0){if(typeof n.github!="object"||n.github===null)throw new Error(`Craig config at ${t} is invalid. "github" must be an object.`);if(n.github.mergeMethod!==void 0&&n.github.mergeMethod!=="merge"&&n.github.mergeMethod!=="rebase"&&n.github.mergeMethod!=="squash")throw new Error(`Craig config at ${t} is invalid. "github.mergeMethod" must be "merge", "rebase", or "squash".`);if(n.github.watchIntervalSeconds!==void 0&&(!Number.isInteger(n.github.watchIntervalSeconds)||n.github.watchIntervalSeconds<=0))throw new Error(`Craig config at ${t} is invalid. "github.watchIntervalSeconds" must be a positive integer.`)}return n}function Ka(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}ke();import{readFile as Ya,readdir as Xp,rm as Zp}from"node:fs/promises";import Ja from"node:path";async function Qe(e,t){let n=await Ya(An(e,t),"utf8"),r=JSON.parse(n);return Qa(r,An(e,t))}async function We(e,t){await W(An(e,t.id),{...t,updatedAt:new Date().toISOString()})}function An(e,t){return Ja.join(e.sessionsDir,`${t}.json`)}function Qa(e,t){let n=ec(e);if(typeof n!="object"||n===null||typeof n.id!="string"||typeof n.taskId!="string"||typeof n.repoId!="string"||typeof n.workspaceId!="string"||n.substrate!=="tmux"||typeof n.sessionName!="string"||typeof n.paneId!="string"||!(n.windowTarget===null||typeof n.windowTarget=="string")||typeof n.worktreePath!="string"||!(n.logPath===null||typeof n.logPath=="string")||!Array.isArray(n.command)||!n.command.every(r=>typeof r=="string")||!["starting","running","exited","failed"].includes(n.status)||!(n.startedAt===null||typeof n.startedAt=="string")||!(n.exitedAt===null||typeof n.exitedAt=="string")||!(n.exitCode===null||typeof n.exitCode=="number")||!(n.lastAttachedAt===null||typeof n.lastAttachedAt=="string")||!Za(n.attach)||!Xa(n.snapshot)||typeof n.createdAt!="string"||typeof n.updatedAt!="string")throw new Error(`Craig session record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n}function Xa(e){return e===null||typeof e=="object"&&e!==null&&typeof e.paneId=="string"&&(typeof e.windowTarget=="string"||e.windowTarget===null)&&typeof e.alive=="boolean"&&typeof e.capturedAt=="string"}function Za(e){return typeof e=="object"&&e!==null&&e.detachChord==="ctrl+]"&&(e.lastSize===null||typeof e.lastSize=="object"&&e.lastSize!==null&&typeof e.lastSize.columns=="number"&&typeof e.lastSize.rows=="number")}function ec(e){let t=typeof e=="object"&&e!==null?e:{};return{id:t.id??"",taskId:t.taskId??"",repoId:t.repoId??"",workspaceId:t.workspaceId??"",substrate:t.substrate??"tmux",sessionName:t.sessionName??"",paneId:t.paneId??"",windowTarget:typeof t.windowTarget=="string"?t.windowTarget:null,worktreePath:t.worktreePath??"",logPath:typeof t.logPath=="string"?t.logPath:null,command:Array.isArray(t.command)?t.command.filter(n=>typeof n=="string"):[],status:t.status??"starting",startedAt:typeof t.startedAt=="string"?t.startedAt:null,exitedAt:typeof t.exitedAt=="string"?t.exitedAt:null,exitCode:typeof t.exitCode=="number"?t.exitCode:null,lastAttachedAt:typeof t.lastAttachedAt=="string"?t.lastAttachedAt:null,attach:{detachChord:"ctrl+]",lastSize:typeof t.attach=="object"&&t.attach!==null&&t.attach.lastSize&&typeof t.attach.lastSize.columns=="number"&&typeof t.attach.lastSize.rows=="number"?t.attach.lastSize:null},snapshot:t.snapshot&&typeof t.snapshot=="object"?{paneId:typeof t.snapshot.paneId=="string"?t.snapshot.paneId:t.paneId??"",windowTarget:typeof t.snapshot.windowTarget=="string"?t.snapshot.windowTarget:null,alive:!!t.snapshot.alive,capturedAt:typeof t.snapshot.capturedAt=="string"?t.snapshot.capturedAt:new Date().toISOString()}:null,createdAt:t.createdAt??"",updatedAt:t.updatedAt??""}}se();Ze();ie();function Dt(e){return`'${e.replace(/'/g,"'\\''")}'`}import{accessSync as Ac,constants as $c}from"node:fs";import{homedir as ps}from"node:os";import $e from"node:path";var Dc=[$e.join(ps(),".local","bin"),$e.join(ps(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function gs(e=process.env){return Lc([...(e.PATH??"").split($e.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:Dc])}function qe(e=process.env){return{...e,PATH:gs(e).join($e.delimiter)}}function Mc(e,t={}){if(e.includes($e.sep)){let n=$e.isAbsolute(e)?e:$e.resolve(t.cwd??process.cwd(),e);return ms(n)?n:null}for(let n of gs(t.env)){let r=$e.join(n,e);if(ms(r))return r}return null}function Ue(e,t={}){let n=Mc(e,t);if(n)return n;throw new Error(`Command not found: ${e}. Install it or add its directory to PATH. Craig also checks ~/.local/bin, /opt/homebrew/bin, and /usr/local/bin.`)}function ms(e){try{return Ac(e,$c.X_OK),!0}catch{return!1}}function Lc(e){return[...new Set(e)]}le();ie();import{spawn as Oc}from"node:child_process";import{createHash as jc}from"node:crypto";import Fc from"node:path";var Nc="craig";async function hs(e,t,n){let r=On(e,t),s=_c(),o=await x("tmux",["new-session","-d","-P","-F","#{session_name} #{window_id} #{pane_id}","-s",r,"-n","runner",...s,"-c",n],{cwd:e}),i=qc(o.stdout);return await Wc(e,r),i}async function Wc(e,t){let n=[["set-option","-t",t,"status","off"],["set-option","-t",t,"detach-on-destroy","off"],["set-window-option","-t",t,"pane-border-status","off"],["set-window-option","-t",t,"aggressive-resize","on"]];for(let r of n)await x("tmux",r,{cwd:e})}async function ws(e,t,n){await x("tmux",["resize-window","-t",t,"-x",`${n.columns}`,"-y",`${n.rows}`],{cwd:e})}async function ks(e,t,n){await x("tmux",["send-keys","-t",e,t,"C-m"],{cwd:n})}async function Rs(e,t,n){await x("tmux",["pipe-pane","-o","-t",e,`cat >> ${Dt(t)}`],{cwd:n})}async function Mt(e,t,n,r){let s=r??Ts(e);if(n?await x("tmux",["select-window","-t",n],{cwd:e}):await x("tmux",["select-window","-t",t],{cwd:e}),await x("tmux",["select-pane","-t",t],{cwd:e}),process.env.TMUX){await x("tmux",["switch-client","-t",s],{cwd:e});return}await Kc(e,["attach-session","-t",s])}function Ts(e){let n=Fc.basename(e).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"repo",r=jc("sha1").update(e).digest("hex").slice(0,8);return`${Nc}-${n}-${r}`}function On(e,t){return`${Ts(e)}-${t.toLowerCase()}`}function _c(){let e=Bc();return e?["-x",`${e.columns}`,"-y",`${e.rows}`]:[]}function Bc(){let e=[process.stdout,process.stderr,process.stdin];for(let t of e){let n="columns"in t?t.columns:void 0,r="rows"in t?t.rows:void 0;if(typeof n=="number"&&n>0&&typeof r=="number"&&r>0)return{columns:n,rows:r}}return null}function qc(e){let t=Uc(e);if(t.length<3)throw new Error("tmux did not return the expected session, window, and pane targets for the Craig task session.");return{sessionName:t[0],windowTarget:t[1],paneId:t[2]}}function Uc(e){return e.split(/\s+/).map(t=>t.trim()).filter(t=>t.length>0)}async function Kc(e,t){await new Promise((n,r)=>{let s=Oc("tmux",t,{cwd:e,stdio:"inherit"});s.on("error",r),s.on("exit",o=>{if(o===0){n();return}r(new Error(`tmux ${t.join(" ")} failed with exit code ${o??"unknown"}.`))})})}var jn={async prepare(e,t){let n=e.runnerSession.command[0]??Y(e.runner)[0],r=qe();await x(Ue(n,{cwd:t.repoRoot,env:r}),["--help"],{cwd:t.repoRoot,env:r})},async launch(e,t){let n=e.runnerSession.command.length>0?e.runnerSession.command:Y(e.runner,e.prompt.value),r=Ue(n[0],{cwd:e.worktreePath,env:qe()});await ks(t.session.paneId,[r,...n.slice(1)].map(s=>Dt(s)).join(" "),t.repoRoot)},async status(e){return e.runnerSession.lastKnownState},async stop(){},async collectArtifacts(){}};le();ie();var ct={async create(e,t){let n=await hs(t.repoRoot,t.taskId,t.worktreePath);t.logPath&&await Rs(n.paneId,t.logPath,t.repoRoot);let r=await ys({paneId:n.paneId,windowTarget:n.windowTarget,alive:!0}),s={id:t.sessionId,taskId:t.taskId,repoId:t.repoId,workspaceId:t.workspaceId,substrate:"tmux",sessionName:n.sessionName||On(t.repoRoot,t.taskId),paneId:n.paneId,windowTarget:n.windowTarget,worktreePath:t.worktreePath,logPath:t.logPath,command:t.command,status:"starting",startedAt:null,exitedAt:null,exitCode:null,lastAttachedAt:null,attach:{detachChord:"ctrl+]",lastSize:null},snapshot:r,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return await We(e,s),s},async attach(e,t,n){let r=await ct.snapshot(t,n);if(!r.alive)throw new Error(`Session ${t.id} is no longer live and cannot be attached.`);await Mt(n,t.paneId,t.windowTarget,t.sessionName);let s={...t,status:"running",lastAttachedAt:new Date().toISOString(),snapshot:r};return await We(e,s),s},async resize(e,t,n,r){await ws(r,t.sessionName,n);let s={...t,attach:{...t.attach,lastSize:n}};return await We(e,s),s},async write(){throw new Error("Direct session writes are owned by the terminal bridge.")},async read(){throw new Error("Direct session reads are owned by the terminal bridge.")},async terminate(e,t,n){let r={...t,status:"failed",exitedAt:new Date().toISOString(),snapshot:{...t.snapshot??{paneId:t.paneId,windowTarget:t.windowTarget,alive:!1,capturedAt:new Date().toISOString()},alive:!1,capturedAt:new Date().toISOString()},command:(n.length>0,t.command)};return await We(e,r),r},async snapshot(e,t){return Vc(e,t)}};async function Vc(e,t){let n=await D("tmux",["list-panes","-F","#{pane_id}","-t",e.paneId],{cwd:t});return ys({paneId:e.paneId,windowTarget:e.windowTarget,alive:n.exitCode===0&&n.stdout.split(/\s+/).some(r=>r.trim()===e.paneId)})}async function ys(e){return{paneId:e.paneId,windowTarget:e.windowTarget,alive:e.alive,capturedAt:new Date().toISOString()}}Ve();se();dt();import{mkdir as ut,rm as nl,writeFile as Nt}from"node:fs/promises";import $ from"node:path";ie();async function Cs(e,t){let n=await D("git",["show-ref","--verify","--quiet",`refs/heads/${t}`],{cwd:e});if(n.exitCode===0)return!0;if(n.exitCode===1)return!1;throw new Error(n.stderr.trim()||n.stdout.trim()||"Unable to check git branch state.")}async function Fn(e,t,n,r="main"){let s=r.trim()||"main";if((await D("git",["show-ref","--verify","--quiet",`refs/heads/${s}`],{cwd:e})).exitCode!==0)throw new Error(`Base branch '${s}' does not exist locally.`);let i=await tl(e,s);await x("git",["worktree","add","-b",t,n,i],{cwd:e})}async function tl(e,t){return(await D("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await D("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await D("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t}async function Ft(e){let t=await D("git",["status","--short"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"Unable to inspect git status.");return t.stdout.trim().length>0}async function xs(e){await x("git",["add","-A"],{cwd:e})}async function vs(e,t){await x("git",["commit","-m",t],{cwd:e})}async function Es(e){let t=await x("git",["show","-s","--format=%H%n%s","HEAD"],{cwd:e}),[n="",r=""]=t.stdout.trim().split(`
|
|
30
|
-
`);if(!n||!r)throw new Error("Unable to read git HEAD commit metadata.");return{sha:n,message:r}}
|
|
28
|
+
${Q()}`);return t}import Bs from"node:path";de();import{mkdir as Ja,readFile as Xa,writeFile as Za}from"node:fs/promises";import ec from"node:path";async function we(e){try{let t=await Xa(e.configFile,"utf8"),n=JSON.parse(t);return os(n,e.configFile)}catch(t){if(tc(t))return{};throw t instanceof SyntaxError?new Error(`Craig config at ${e.configFile} is malformed. Remove or repair the file before rerunning Craig.`):t}}async function ss(e,t){os(t,e.configFile),await Ja(ec.dirname(e.configFile),{recursive:!0}),await Za(e.configFile,`${JSON.stringify(t,null,2)}
|
|
29
|
+
`,"utf8")}function os(e,t){if(typeof e!="object"||e===null)throw new Error(`Craig config at ${t} is invalid. Expected a JSON object.`);let n=e;if(n.runners!==void 0){if(typeof n.runners!="object"||n.runners===null||Array.isArray(n.runners))throw new Error(`Craig config at ${t} is invalid. "runners" must be an object.`);for(let[r,s]of Object.entries(n.runners)){if(!W.includes(r))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" is not supported. Expected one of: ${W.join(", ")}.`);if(typeof s!="object"||s===null||Array.isArray(s))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" must be an object.`);let o=s;if(o.enabled!==void 0&&typeof o.enabled!="boolean")throw new Error(`Craig config at ${t} is invalid. "runners.${r}.enabled" must be a boolean.`);if(o.path!==void 0&&(typeof o.path!="string"||o.path.trim().length===0))throw new Error(`Craig config at ${t} is invalid. "runners.${r}.path" must be a non-empty string.`)}}if(n.checks!==void 0&&(typeof n.checks!="object"||n.checks===null||!Array.isArray(n.checks.commands)||!n.checks.commands.every(r=>typeof r=="string")))throw new Error(`Craig config at ${t} is invalid. "checks.commands" must be an array of strings.`);if(n.open!==void 0&&(typeof n.open!="object"||n.open===null||!Array.isArray(n.open.command)||!n.open.command.every(r=>typeof r=="string")))throw new Error(`Craig config at ${t} is invalid. "open.command" must be an array of strings.`);if(n.github!==void 0){if(typeof n.github!="object"||n.github===null)throw new Error(`Craig config at ${t} is invalid. "github" must be an object.`);if(n.github.mergeMethod!==void 0&&n.github.mergeMethod!=="merge"&&n.github.mergeMethod!=="rebase"&&n.github.mergeMethod!=="squash")throw new Error(`Craig config at ${t} is invalid. "github.mergeMethod" must be "merge", "rebase", or "squash".`);if(n.github.watchIntervalSeconds!==void 0&&(!Number.isInteger(n.github.watchIntervalSeconds)||n.github.watchIntervalSeconds<=0))throw new Error(`Craig config at ${t} is invalid. "github.watchIntervalSeconds" must be a positive integer.`)}return n}function tc(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}ke();import{readFile as ic,readdir as um,rm as fm}from"node:fs/promises";import ac from"node:path";async function Je(e,t){let n=await ic(Dn(e,t),"utf8"),r=JSON.parse(n);return cc(r,Dn(e,t))}async function We(e,t){await _(Dn(e,t.id),{...t,updatedAt:new Date().toISOString()})}function Dn(e,t){return ac.join(e.sessionsDir,`${t}.json`)}function cc(e,t){let n=uc(e);if(typeof n!="object"||n===null||typeof n.id!="string"||typeof n.taskId!="string"||typeof n.repoId!="string"||typeof n.workspaceId!="string"||n.substrate!=="tmux"||typeof n.sessionName!="string"||typeof n.paneId!="string"||!(n.windowTarget===null||typeof n.windowTarget=="string")||typeof n.worktreePath!="string"||!(n.logPath===null||typeof n.logPath=="string")||!Array.isArray(n.command)||!n.command.every(r=>typeof r=="string")||!["starting","running","exited","failed"].includes(n.status)||!(n.startedAt===null||typeof n.startedAt=="string")||!(n.exitedAt===null||typeof n.exitedAt=="string")||!(n.exitCode===null||typeof n.exitCode=="number")||!(n.lastAttachedAt===null||typeof n.lastAttachedAt=="string")||!dc(n.attach)||!lc(n.snapshot)||typeof n.createdAt!="string"||typeof n.updatedAt!="string")throw new Error(`Craig session record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n}function lc(e){return e===null||typeof e=="object"&&e!==null&&typeof e.paneId=="string"&&(typeof e.windowTarget=="string"||e.windowTarget===null)&&typeof e.alive=="boolean"&&typeof e.capturedAt=="string"}function dc(e){return typeof e=="object"&&e!==null&&e.detachChord==="ctrl+]"&&(e.lastSize===null||typeof e.lastSize=="object"&&e.lastSize!==null&&typeof e.lastSize.columns=="number"&&typeof e.lastSize.rows=="number")}function uc(e){let t=typeof e=="object"&&e!==null?e:{};return{id:t.id??"",taskId:t.taskId??"",repoId:t.repoId??"",workspaceId:t.workspaceId??"",substrate:t.substrate??"tmux",sessionName:t.sessionName??"",paneId:t.paneId??"",windowTarget:typeof t.windowTarget=="string"?t.windowTarget:null,worktreePath:t.worktreePath??"",logPath:typeof t.logPath=="string"?t.logPath:null,command:Array.isArray(t.command)?t.command.filter(n=>typeof n=="string"):[],status:t.status??"starting",startedAt:typeof t.startedAt=="string"?t.startedAt:null,exitedAt:typeof t.exitedAt=="string"?t.exitedAt:null,exitCode:typeof t.exitCode=="number"?t.exitCode:null,lastAttachedAt:typeof t.lastAttachedAt=="string"?t.lastAttachedAt:null,attach:{detachChord:"ctrl+]",lastSize:typeof t.attach=="object"&&t.attach!==null&&t.attach.lastSize&&typeof t.attach.lastSize.columns=="number"&&typeof t.attach.lastSize.rows=="number"?t.attach.lastSize:null},snapshot:t.snapshot&&typeof t.snapshot=="object"?{paneId:typeof t.snapshot.paneId=="string"?t.snapshot.paneId:t.paneId??"",windowTarget:typeof t.snapshot.windowTarget=="string"?t.snapshot.windowTarget:null,alive:!!t.snapshot.alive,capturedAt:typeof t.snapshot.capturedAt=="string"?t.snapshot.capturedAt:new Date().toISOString()}:null,createdAt:t.createdAt??"",updatedAt:t.updatedAt??""}}ie();Ze();ce();function Lt(e){return`'${e.replace(/'/g,"'\\''")}'`}import{accessSync as Bc,constants as qc}from"node:fs";import{homedir as hs}from"node:os";import De from"node:path";var Uc=[De.join(hs(),".local","bin"),De.join(hs(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function ks(e=process.env){return Kc([...(e.PATH??"").split(De.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:Uc])}function qe(e=process.env){return{...e,PATH:ks(e).join(De.delimiter)}}function jn(e,t={}){if(e.includes(De.sep)){let n=De.isAbsolute(e)?e:De.resolve(t.cwd??process.cwd(),e);return ws(n)?n:null}for(let n of ks(t.env)){let r=De.join(n,e);if(ws(r))return r}return null}function Ue(e,t={}){let n=jn(e,t);if(n)return n;throw new Error(`Command not found: ${e}. Install it or add its directory to PATH. Craig also checks ~/.local/bin, /opt/homebrew/bin, and /usr/local/bin.`)}function ws(e){try{return Bc(e,qc.X_OK),!0}catch{return!1}}function Kc(e){return[...new Set(e)]}de();ce();import{spawn as Vc}from"node:child_process";import{createHash as Gc}from"node:crypto";import Hc from"node:path";var zc="craig";async function Rs(e,t,n){let r=Nn(e,t),s=Qc(),o=await C("tmux",["new-session","-d","-P","-F","#{session_name} #{window_id} #{pane_id}","-s",r,"-n","runner",...s,"-c",n],{cwd:e}),i=Xc(o.stdout);return await Yc(e,r),i}async function Yc(e,t){let n=[["set-option","-t",t,"status","off"],["set-option","-t",t,"detach-on-destroy","off"],["set-window-option","-t",t,"pane-border-status","off"],["set-window-option","-t",t,"aggressive-resize","on"]];for(let r of n)await C("tmux",r,{cwd:e})}async function Ts(e,t,n){await C("tmux",["resize-window","-t",t,"-x",`${n.columns}`,"-y",`${n.rows}`],{cwd:e})}async function ys(e,t,n){await C("tmux",["send-keys","-t",e,t,"C-m"],{cwd:n})}async function Ps(e,t,n){await C("tmux",["pipe-pane","-o","-t",e,`cat >> ${Lt(t)}`],{cwd:n})}async function Mt(e,t,n,r){let s=r??bs(e);if(n?await C("tmux",["select-window","-t",n],{cwd:e}):await C("tmux",["select-window","-t",t],{cwd:e}),await C("tmux",["select-pane","-t",t],{cwd:e}),process.env.TMUX){await C("tmux",["switch-client","-t",s],{cwd:e});return}await el(e,["attach-session","-t",s])}function bs(e){let n=Hc.basename(e).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"repo",r=Gc("sha1").update(e).digest("hex").slice(0,8);return`${zc}-${n}-${r}`}function Nn(e,t){return`${bs(e)}-${t.toLowerCase()}`}function Qc(){let e=Jc();return e?["-x",`${e.columns}`,"-y",`${e.rows}`]:[]}function Jc(){let e=[process.stdout,process.stderr,process.stdin];for(let t of e){let n="columns"in t?t.columns:void 0,r="rows"in t?t.rows:void 0;if(typeof n=="number"&&n>0&&typeof r=="number"&&r>0)return{columns:n,rows:r}}return null}function Xc(e){let t=Zc(e);if(t.length<3)throw new Error("tmux did not return the expected session, window, and pane targets for the Craig task session.");return{sessionName:t[0],windowTarget:t[1],paneId:t[2]}}function Zc(e){return e.split(/\s+/).map(t=>t.trim()).filter(t=>t.length>0)}async function el(e,t){await new Promise((n,r)=>{let s=Vc("tmux",t,{cwd:e,stdio:"inherit"});s.on("error",r),s.on("exit",o=>{if(o===0){n();return}r(new Error(`tmux ${t.join(" ")} failed with exit code ${o??"unknown"}.`))})})}var Wn={async prepare(e,t){let n=e.runnerSession.command[0]??Y(e.runner)[0],r=qe();await C(Ue(n,{cwd:t.repoRoot,env:r}),["--help"],{cwd:t.repoRoot,env:r})},async launch(e,t){let n=e.runnerSession.command.length>0?e.runnerSession.command:Y(e.runner,e.prompt.value),r=Ue(n[0],{cwd:e.worktreePath,env:qe()});await ys(t.session.paneId,[r,...n.slice(1)].map(s=>Lt(s)).join(" "),t.repoRoot)},async status(e){return e.runnerSession.lastKnownState},async stop(){},async collectArtifacts(){}};de();ce();var lt={async create(e,t){let n=await Rs(t.repoRoot,t.taskId,t.worktreePath);t.logPath&&await Ps(n.paneId,t.logPath,t.repoRoot);let r=await Ss({paneId:n.paneId,windowTarget:n.windowTarget,alive:!0}),s={id:t.sessionId,taskId:t.taskId,repoId:t.repoId,workspaceId:t.workspaceId,substrate:"tmux",sessionName:n.sessionName||Nn(t.repoRoot,t.taskId),paneId:n.paneId,windowTarget:n.windowTarget,worktreePath:t.worktreePath,logPath:t.logPath,command:t.command,status:"starting",startedAt:null,exitedAt:null,exitCode:null,lastAttachedAt:null,attach:{detachChord:"ctrl+]",lastSize:null},snapshot:r,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return await We(e,s),s},async attach(e,t,n){let r=await lt.snapshot(t,n);if(!r.alive)throw new Error(`Session ${t.id} is no longer live and cannot be attached.`);await Mt(n,t.paneId,t.windowTarget,t.sessionName);let s={...t,status:"running",lastAttachedAt:new Date().toISOString(),snapshot:r};return await We(e,s),s},async resize(e,t,n,r){await Ts(r,t.sessionName,n);let s={...t,attach:{...t.attach,lastSize:n}};return await We(e,s),s},async write(){throw new Error("Direct session writes are owned by the terminal bridge.")},async read(){throw new Error("Direct session reads are owned by the terminal bridge.")},async terminate(e,t,n){let r={...t,status:"failed",exitedAt:new Date().toISOString(),snapshot:{...t.snapshot??{paneId:t.paneId,windowTarget:t.windowTarget,alive:!1,capturedAt:new Date().toISOString()},alive:!1,capturedAt:new Date().toISOString()},command:(n.length>0,t.command)};return await We(e,r),r},async snapshot(e,t){return tl(e,t)}};async function tl(e,t){let n=await L("tmux",["list-panes","-F","#{pane_id}","-t",e.paneId],{cwd:t});return Ss({paneId:e.paneId,windowTarget:e.windowTarget,alive:n.exitCode===0&&n.stdout.split(/\s+/).some(r=>r.trim()===e.paneId)})}async function Ss(e){return{paneId:e.paneId,windowTarget:e.windowTarget,alive:e.alive,capturedAt:new Date().toISOString()}}Ve();ie();ut();import{mkdir as ft,rm as fl,writeFile as Wt}from"node:fs/promises";import D from"node:path";ce();async function Es(e,t){let n=await L("git",["show-ref","--verify","--quiet",`refs/heads/${t}`],{cwd:e});if(n.exitCode===0)return!0;if(n.exitCode===1)return!1;throw new Error(n.stderr.trim()||n.stdout.trim()||"Unable to check git branch state.")}async function _n(e,t,n,r="main"){let s=r.trim()||"main";if((await L("git",["show-ref","--verify","--quiet",`refs/heads/${s}`],{cwd:e})).exitCode!==0)throw new Error(`Base branch '${s}' does not exist locally.`);let i=await ul(e,s);await C("git",["worktree","add","-b",t,n,i],{cwd:e})}async function ul(e,t){return(await L("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await L("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await L("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t}async function Nt(e){let t=await L("git",["status","--short"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"Unable to inspect git status.");return t.stdout.trim().length>0}async function As(e){await C("git",["add","-A"],{cwd:e})}async function $s(e,t){await C("git",["commit","-m",t],{cwd:e})}async function Ds(e){let t=await C("git",["show","-s","--format=%H%n%s","HEAD"],{cwd:e}),[n="",r=""]=t.stdout.trim().split(`
|
|
30
|
+
`);if(!n||!r)throw new Error("Unable to read git HEAD commit metadata.");return{sha:n,message:r}}de();Be();async function Ls(e,t){let n=await oe(e),r=Os(new Date),s=Fs(n.taskIds,r);for(;;){let o=`task_${r}_${String(s).padStart(2,"0")}`,i=`craig/${o}`;if(!await Es(t,i))return o;s+=1}}async function Ms(e){let t=await oe(e),n=Os(new Date),r=Fs(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`}function Os(e){let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}${n}${r}`}function Fs(e,t){let n=e.filter(r=>r.startsWith(`task_${t}_`)).map(r=>Number.parseInt(r.slice(-2),10)).filter(r=>Number.isInteger(r));return n.length===0?1:Math.max(...n)+1}var Ns=["AGENTS","md"].join(".");async function pt(e,t,n,r={}){let s=await fe(e,t),o=await wl(e,s.id),i=await Ls(e,s.rootPath),c=r.sessionId??null,l=`craig/${i}`,d=D.join(e.worktreesDir,s.id,i),f=D.join(e.logsDir,`${i}.log`),g=D.join(e.artifactsDir,i);await ft(D.dirname(d),{recursive:!0}),await ft(g,{recursive:!0}),await Wt(f,"","utf8");let R=pl(e,{taskId:i,repoId:s.id,workspaceId:o.id,sessionId:c,repoRoot:s.rootPath,prompt:n,runner:r.runner??"codex",config:r.config??{},branch:l,worktreePath:d});return await E(e,R),await On(e,i),await _n(s.rootPath,l,d,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,sessionId:c,workspaceId:o.id,task:R}}async function Bt(e,t,n,r={}){let s=(await pe(e)).find(v=>v.id===t&&v.status==="active");if(!s)throw new Error(`Workspace ${t} does not exist or is archived.`);if(s.kind!=="project"){if(!s.primaryRepoId)throw new Error(`Workspace ${t} is not task-capable.`);let v=await pt(e,s.primaryRepoId,n,r);return{...v,bundlePath:v.task.worktreePath,repoTargets:[]}}let o=s.discoveredRepoIds??[];if(o.length===0)throw new Error(`Project workspace ${t} has no discovered repos.`);let i=await Ms(e),c=new Date().toISOString(),l=r.runner??"codex",d=r.sessionId??null,f=`craig/${i}`,g=D.join(e.craigDir,"task-bundles",i),R=D.join(e.logsDir,`${i}.log`),k=D.join(e.artifactsDir,i);await ft(g,{recursive:!0}),await ft(k,{recursive:!0}),await Wt(R,"","utf8");let I=await Promise.all(o.map(v=>fe(e,v))),T=gl(I),a=await Promise.all(I.map(v=>ml(e,v,i,f,D.join(g,T.get(v.id))))),V=a.find(v=>v.status==="ready")??a[0];if(!a.some(v=>v.status==="ready"))throw await fl(g,{recursive:!0,force:!0}),new Error(`No project repo targets could be provisioned for ${t}: ${a.map(v=>`${v.repoId}: ${v.failureReason??"unknown error"}`).join("; ")}`);await Wt(D.join(g,"manifest.json"),JSON.stringify({taskId:i,workspaceId:t,prompt:n,repos:a.map(v=>({repoId:v.repoId,repoName:I.find(Z=>Z.id===v.repoId)?.name??v.repoId,path:D.relative(g,v.worktreePath),status:v.status,worktreePath:v.worktreePath,failureReason:v.failureReason}))},null,2),"utf8"),await Wt(D.join(g,Ns),hl({taskId:i,workspaceId:t,prompt:n,repos:I,repoTargets:a,bundlePath:g}),"utf8");let j=Ws(i,n,c,l,r.config??{}),N={id:i,title:n,slug:_s(n),type:"project",status:"draft",runner:l,repoId:V.repoId,workspaceId:s.id,sessionId:d,selectedPtyTabId:j[0]?.id??null,linkedRepoIds:o.filter(v=>v!==V.repoId),repoRoot:g,worktreePath:g,branch:f,bundlePath:g,selectedRepoTargetId:V.repoId,repoTargets:a,ptyTabs:j,runnerSession:{command:Y(l,n,r.config??{}),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:n},checks:V.checks,lastCommit:null,prs:[],artifacts:{logPath:D.relative(e.workspaceRoot,R),checkSummaryPath:D.relative(e.workspaceRoot,D.join(k,"check-summary.json")),prDraftPath:null,prStatusPath:D.relative(e.workspaceRoot,D.join(k,"pr-status.json"))},cleanup:_t(),lastFailureReason:a.every(v=>v.status==="unavailable")?"No project repo targets could be provisioned.":null,createdAt:c,updatedAt:c};return await E(e,N),await On(e,i),{repoId:V.repoId,repoRoot:g,sessionId:d,workspaceId:s.id,task:N,bundlePath:g,repoTargets:a}}function Ws(e,t,n,r="codex",s={}){let o=ee(r);return[{id:`${e}:agent`,kind:"agent",title:o.defaultAgentTitle,command:Y(r,void 0,s),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]}function pl(e,t){let n=new Date().toISOString(),r=Ws(t.taskId,t.prompt,n,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:_s(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,sessionId:t.sessionId,selectedPtyTabId:r[0]?.id??null,linkedRepoIds:[],repoRoot:t.repoRoot,worktreePath:t.worktreePath,branch:t.branch,ptyTabs:r,runnerSession:{command:Y(t.runner,t.prompt,t.config),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:t.prompt},checks:{...Bn(D.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:D.relative(e.workspaceRoot,D.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:D.relative(e.workspaceRoot,D.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:D.relative(e.workspaceRoot,D.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:_t(),lastFailureReason:null,createdAt:n,updatedAt:n}}async function ml(e,t,n,r,s){await ft(D.dirname(s),{recursive:!0});try{return await _n(t.rootPath,r,s,t.defaultBranch),{repoId:t.id,branch:r,repoRoot:t.rootPath,worktreePath:s,status:"ready",failureReason:null,checks:Bn(D.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:js(),cleanup:_t()}}catch(o){return{repoId:t.id,branch:r,repoRoot:t.rootPath,worktreePath:s,status:"unavailable",failureReason:o instanceof Error?o.message:"Failed to create worktree.",checks:Bn(D.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:js(),cleanup:_t()}}}function gl(e){let t=new Set(["manifest.json",Ns]),n=new Map;for(let r of e){let s=t.has(r.name)?`${r.name}-repo`:r.name,o=s,i=2;for(;t.has(o);)o=`${s}-${i}`,i+=1;t.add(o),n.set(r.id,o)}return n}function hl(e){let t=new Map(e.repos.map(r=>[r.id,r.name])),n=e.repoTargets.map(r=>{let s=t.get(r.repoId)??r.repoId,o=D.relative(e.bundlePath,r.worktreePath),i=r.status==="ready"?"ready":`unavailable: ${r.failureReason??"unknown error"}`;return`- \`${o}/\` - ${s} (${r.repoId}, ${i})`}).join(`
|
|
31
31
|
`);return["# Craig Project Task Bundle","","This directory is a Craig project task bundle. Repo work must happen inside the child repo worktrees listed below.","","Run repo Git commands from a repo worktree directory, not from the bundle root. Use `manifest.json` as the machine-readable source of truth for this bundle.","",`Task: \`${e.taskId}\``,`Workspace: \`${e.workspaceId}\``,`Prompt: ${e.prompt}`,"","## Repo Worktrees","",n,""].join(`
|
|
32
|
-
`)}function
|
|
32
|
+
`)}function Bn(e){return{source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}}function js(){return{provider:"github",number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null}}function _t(){return{paneClosedAt:null,worktreeRemovedAt:null,preservedWorktree:!1,warning:null}}async function wl(e,t){let r=(await pe(e)).find(s=>s.kind!=="project"&&s.primaryRepoId===t&&s.status==="active");if(!r)throw new Error(`Repo ${t} does not have an active workspace.`);return r}function _s(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-")}async function qs(e,t,n,r={}){let s=n.trim(),o=await we(e),i=r.runner??Ne(o);if($t(i,o),t.trim().length===0)throw new Error(r.workspaceId?"Workspace id cannot be empty.":"Repo id cannot be empty.");if(s.length===0)throw new Error("Task prompt cannot be empty.");let c=r.workspaceId?await Bt(e,r.workspaceId,s,{runner:i,config:o}):await pt(e,t,s,{runner:i,config:o}),l=c.task,d=Y(i,s,o),f=`session_${l.id}`,g=l.artifacts.logPath?Bs.resolve(e.workspaceRoot,l.artifacts.logPath):Bs.join(e.logsDir,`${l.id}.log`);try{await Wn.prepare(l,{repoRoot:c.repoRoot});let R=await lt.create(e,{sessionId:f,taskId:l.id,repoId:c.repoId,workspaceId:c.workspaceId,repoRoot:c.repoRoot,worktreePath:l.worktreePath,logPath:g,command:d});await Wn.launch(l,{repoRoot:c.repoRoot,session:R});let k=new Date().toISOString();R={...R,status:"running",startedAt:k,command:d};let I={...l,status:"running",runner:i,sessionId:R.id,selectedPtyTabId:l.selectedPtyTabId,runnerSession:{command:R.command,pid:null,startedAt:k,lastKnownState:"running",exitCode:null,exitedAt:null}};return await E(e,I),await We(e,R),await ae({uiStateFile:e.uiStateFile},{...await ue({uiStateFile:e.uiStateFile})??Re(),selectedRepoId:I.repoId,selectedWorkspaceId:I.workspaceId,selectedTaskId:I.id,selectedPtyTabId:I.selectedPtyTabId}),{kind:"createTask",taskId:I.id,repoId:I.repoId,workspaceId:I.workspaceId,sessionId:R.id,status:I.status,branch:I.branch,worktreePath:I.worktreePath,runner:I.runner}}catch(R){let k={...l,sessionId:null,status:"draft",runnerSession:{...l.runnerSession,lastKnownState:"failed"},lastFailureReason:R instanceof Error?R.message:"Unknown Craig error"};throw await E(e,k),R}}mt();Ve();ie();import{access as Bl}from"node:fs/promises";import no from"node:path";ke();ie();import{mkdir as Rl,readFile as Og,writeFile as Fg}from"node:fs/promises";import Tl from"node:path";ce();import Us from"node:path";function qt(e,t){return t?Us.isAbsolute(t)?t:Us.join(e.repoRoot,t):null}function K(e){return e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null}function Vt(e){return e.status==="merged"||e.status==="closed"}function Ks(e,t){let n=e.prs.findIndex(s=>s.number!==null&&s.number===t.number),r=n>=0?e.prs.map((s,o)=>o===n?t:s):[...e.prs,t];return{...e,prs:r}}var Vs=3,yl=1e3,Pl=1e4;async function gt(e){let t=await L("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")}async function Kn(e,t){let n=K(t),r=n?.number?String(n.number):t.branch,s=await C("gh",Kt(r),{cwd:t.worktreePath}),o=JSON.parse(s.stdout);return Gn(e,t,o,n)}async function Vn(e,t){let n=await L("gh",Kt(t.branch),{cwd:t.worktreePath});if(n.exitCode!==0)return{discovered:!1,task:t};let r=JSON.parse(n.stdout);return{discovered:!0,task:await Gn(e,t,r,null)}}async function Hs(e){let t=await L("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:Al(t.stdout.trim())}async function zs(e,t,n){if(n.length===0)return[];let r=$l(n),s=await bl(e,["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`]),i=JSON.parse(s.stdout).data?.repository??{};return n.map((c,l)=>{let d=i[`item${l}`],f=Dl(d);return{id:c.id,found:f!==null,view:f}})}async function bl(e,t){let n;for(let r=0;r<=Vs;r+=1)try{return await C("gh",t,{cwd:e})}catch(s){if(n=s,r===Vs||!Sl(s))throw s;await Cl(Il(r))}throw n}function Sl(e){let t=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase();return t.includes("rate limit")||t.includes("secondary rate limit")||t.includes("abuse detection")||t.includes("api rate limit exceeded")||t.includes("you have exceeded")}function Il(e){let t=Number(process.env.CRAIG_GH_RATE_LIMIT_RETRY_BASE_MS)||yl,n=Math.min(t*2**e,Pl),r=Math.floor(Math.random()*Math.max(1,Math.floor(n*.25)));return n+r}function Cl(e){return new Promise(t=>setTimeout(t,e))}async function ht(e,t,n){let r=n.pullRequest.number?String(n.pullRequest.number):n.branch;if(n.pullRequest.number){let i=await C("gh",Kt(r),{cwd:n.worktreePath}),c=Un(JSON.parse(i.stdout));return n.pullRequest=c,await qn(e,t,n.repoId,c),"synced"}let s=await L("gh",Kt(r),{cwd:n.worktreePath});if(s.exitCode!==0)return"not_found";let o=Un(JSON.parse(s.stdout));return n.pullRequest=o,await qn(e,t,n.repoId,o),"discovered"}async function Ys(e,t,n){return Gn(e,t,n,K(t))}async function Qs(e,t,n,r){return qn(e,t,n,Un(r))}async function Js(e,t){let n=qt(e,t.artifacts.prStatusPath);n&&(await Rl(Tl.dirname(n),{recursive:!0}),await _(n,{taskId:t.id,prs:t.prs}))}function xl(e){return e.mergeable&&!vl(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped")}function vl(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function El(e){if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return xl(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"}function Kt(e){return["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"]}function Al(e){let t=e.replace(/\.git$/,""),n=t.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)$/);if(n?.[1]&&n[2])return{owner:n[1],name:n[2]};let r=t.match(/^git@github\.com:([^/]+)\/([^/]+)$/);if(r?.[1]&&r[2])return{owner:r[1],name:r[2]};let s=t.match(/^ssh:\/\/git@github\.com\/([^/]+)\/([^/]+)$/);return s?.[1]&&s[2]?{owner:s[1],name:s[2]}:null}function $l(e){return`
|
|
33
33
|
query CraigPullRequestBatch($owner: String!, $name: String!) {
|
|
34
34
|
repository(owner: $owner, name: $name) {
|
|
35
35
|
${e.map((n,r)=>{let s=`item${r}`;return n.mode==="number"?`${s}: pullRequest(number: ${Number(n.selector)}) { ...PrFields }`:`${s}: pullRequests(headRefName: ${JSON.stringify(n.selector)}, states: OPEN, first: 1, orderBy: { field: UPDATED_AT, direction: DESC }) { nodes { ...PrFields } }`}).join(`
|
|
@@ -108,58 +108,58 @@ fragment PrFields on PullRequest {
|
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
|
-
`}function
|
|
111
|
+
`}function Dl(e){if(!e||typeof e!="object")return null;let t="nodes"in e?e.nodes?.[0]??null:e;if(!t||typeof t!="object")return null;let n=t,r=n.statusCheckRollup?.contexts?.nodes??n.commits?.nodes?.[0]?.commit?.statusCheckRollup?.contexts?.nodes??[];return{number:n.number,url:n.url,baseRefName:n.baseRefName,headRefName:n.headRefName,headRefOid:n.headRefOid??null,state:n.state,isDraft:n.isDraft??!1,title:n.title??null,createdAt:n.createdAt??null,updatedAt:n.updatedAt??null,mergedAt:n.mergedAt??null,mergeable:n.mergeable,mergeStateStatus:n.mergeStateStatus,reviewDecision:n.reviewDecision??null,statusCheckRollup:r,comments:n.comments?.nodes??[]}}async function Gn(e,t,n,r){let s=Ll(n,r),o=Ks(t,s),i=El(o.prs),c={...o,status:i};await Js(e,c);let l=await B(e,t.id),d=l.status==="closed"?l.status:i,f=Ks({...l,status:d},s);return await E(e,f),f}async function qn(e,t,n,r){let s=await B(e,t.id),o=(s.repoTargets??t.repoTargets??[]).map(c=>c.repoId===n?{...c,pullRequest:r}:c),i={...s,repoTargets:o};return await E(e,i),i}function Ll(e,t){let n=e.isDraft??!1,r=Ml(e.state,n);return{provider:"github",owner:t?.owner??null,repo:t?.repo??null,number:e.number,url:e.url,title:e.title??t?.title??null,status:r,draft:n,baseBranch:e.baseRefName,headBranch:e.headRefName,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:Zs(e.reviewDecision??null),requiredChecks:Xs(e.statusCheckRollup),comments:eo(e.comments),createdAt:e.createdAt??t?.createdAt??null,updatedAt:e.updatedAt??t?.updatedAt??null,mergedAt:e.mergedAt??t?.mergedAt??null,lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function Un(e){return{provider:"github",number:e.number,url:e.url,baseBranch:e.baseRefName,headBranch:e.headRefName,status:Ol(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:Zs(e.reviewDecision??null),requiredChecks:Xs(e.statusCheckRollup),comments:eo(e.comments),lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function Ml(e,t){return t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null}function Ol(e){return e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null}function Xs(e){let t=e.map(r=>Fl(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||jl(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))}function Fl(e){if(typeof e!="object"||e===null)return null;let t=e,n=t.name??t.context,r=t.state??t.status??t.conclusion;return n?{name:n,status:to(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:Nl(t)}:null}function jl(e,t){return e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):Ut(e)&&!Ut(t)?!0:!Ut(e)&&Ut(t)?!1:Gs(t.status)>=Gs(e.status)}function Ut(e){return e.conclusion?.toUpperCase()==="CANCELLED"}function Gs(e){switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}}function Nl(e){let t=e.completedAt??e.startedAt??e.createdAt??null;if(!t)return null;let n=new Date(t).getTime();return Number.isFinite(n)?n:null}function Zs(e){return e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null}function eo(e){let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(Wl).filter(n=>n!==null).slice(-4):[]}function Wl(e){if(typeof e!="object"||e===null)return null;let t=e,n=_l(t.bodyText??t.body??"");return n?{author:typeof t.author=="string"?t.author:t.author?.login??null,body:n,createdAt:t.createdAt??null,url:t.url??null}:null}function _l(e){return e.replace(/\s+/g," ").trim()}function to(e,t){let n=e?.toUpperCase()??null,r=t?.toUpperCase()??null;return r==="SKIPPED"||n==="SKIPPED"?"skipped":n==="SUCCESS"||r==="SUCCESS"||r==="NEUTRAL"?"success":n==="PENDING"||n==="EXPECTED"||n==="IN_PROGRESS"||n==="QUEUED"||n==="REQUESTED"||n==="WAITING"?"pending":n==="FAILURE"||n==="FAILED"||n==="ERROR"||n==="TIMED_OUT"||n==="CANCELLED"||n==="ACTION_REQUIRED"||n==="STARTUP_FAILURE"||r==="FAILURE"||r==="FAILED"||r==="ERROR"||r==="TIMED_OUT"||r==="CANCELLED"||r==="ACTION_REQUIRED"||r==="STARTUP_FAILURE"?"failed":n==="COMPLETED"&&r===null?"unknown":n==="COMPLETED"&&r!==null?to(r,r):"unknown"}async function M(e,t){try{return await B(e,t)}catch(n){throw Gl(n)?new Error(`Craig task "${t}" was not found.`):n}}async function le(e){if(!await Hn(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)}function zn(e,t){return t.artifacts.logPath?no.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:no.join(e.workspaceRoot,t.artifacts.logPath):null}async function ro(e,t){let n=await Hn(t.worktreePath),r=zn(e,t),s=r?await Hn(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:ql(t),lastCommitSummary:Ul(t),prSummary:Kl(t),cleanupSummary:Vl(t)}}async function Hn(e){try{return await Bl(e),!0}catch{return!1}}function ql(e){let t=e.checks.commands.length,n=t===1?"command":"commands",r=e.checks.lastRunAt?` at ${e.checks.lastRunAt}`:"";return`${e.checks.status} (${t} ${n})${r}`}function Ul(e){return e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed"}function Kl(e){if(e.type==="project"&&e.repoTargets?.length){let s=e.repoTargets.filter(l=>l.pullRequest.number);if(s.length===0)return"not linked";let o=s.map(l=>` ${l.repoId} #${l.pullRequest.number} ${l.pullRequest.status??"unknown"}`),i=s.reduce((l,d)=>{let f=d.pullRequest.status??"unknown";return l[f]=(l[f]??0)+1,l},{}),c=Object.entries(i).map(([l,d])=>`${d} ${l}`).join(", ");return`${s.length} PR${s.length!==1?"s":""} (${c})
|
|
112
112
|
${o.join(`
|
|
113
|
-
`)}`}let t=K(e);if(!t?.number||!t.url)return"not linked";let n=t.requiredChecks.length,r=n===1?"check":"checks";return`#${t.number} ${t.status??"unknown"} mergeable=${t.mergeable} mergeState=${t.mergeStateStatus??"unknown"} (${n} ${r})`}function
|
|
113
|
+
`)}`}let t=K(e);if(!t?.number||!t.url)return"not linked";let n=t.requiredChecks.length,r=n===1?"check":"checks";return`#${t.number} ${t.status??"unknown"} mergeable=${t.mergeable} mergeState=${t.mergeStateStatus??"unknown"} (${n} ${r})`}function Vl(e){return e.status!=="merged"?"not merged":e.cleanup.warning?`warning: ${e.cleanup.warning}`:e.cleanup.preservedWorktree?"preserved worktree":e.cleanup.worktreeRemovedAt?`worktree removed at ${e.cleanup.worktreeRemovedAt}`:"cleanup pending"}function Gl(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}async function so(e,t){let n=await M(e,t);if(!n.sessionId)throw new Error(`Task ${n.id} does not have a Craig session to attach.`);let[r,s]=await Promise.all([fe(e,n.repoId),Je(e,n.sessionId)]),o=await lt.attach(e,s,r.rootPath);return{kind:"attachTask",taskId:n.id,sessionId:o.id,disposition:"attached"}}ie();async function io(e,t){let n=await M(e,t),r=K(n);return r?.number?(await gt(n.worktreePath),Vt(r)?(await Vn(e,n)).task:Kn(e,n)):n}async function Ht(e,t){let n=await M(e,t),r=(n.repoTargets??[]).filter(i=>i.status==="ready"),s={synced:0,discovered:0,notFound:0};for(let i of r){await gt(i.worktreePath);let c=i.pullRequest.number?await ht(e,n,i):await ht(e,n,i).catch(()=>"not_found");s[c==="not_found"?"notFound":c]++}let o=await B(e,n.id);return o.status!=="closed"&&(o.status=co(o),await E(e,o)),s}async function ao(e,t){let n=new Map,r=new Map;for(let s of t){let o=Yn(n,s);if(s.type==="project"&&s.repoTargets?.length){for(let d of s.repoTargets.filter(f=>f.status==="ready")){let f={id:`${s.id}:${d.repoId}`,task:s,targetRepoId:d.repoId,worktreePath:d.worktreePath,selector:d.pullRequest.number?String(d.pullRequest.number):d.branch,mode:d.pullRequest.number?"number":"head"};await oo(r,f).catch(async()=>{try{let g=d.pullRequest.number?await ht(e,s,d):await ht(e,s,d).catch(()=>"not_found");Gt(o,g,d.pullRequest.number??null,d.pullRequest.url??null)}catch{}})}continue}let i=K(s),c=i?.number&&!Vt(i),l={id:s.id,task:s,worktreePath:s.worktreePath,selector:c?String(i.number):s.branch,mode:c?"number":"head"};await oo(r,l).catch(async()=>{try{let{disposition:d,task:f}=await Qn(e,s.id),g=K(f);Gt(o,d,g?.number??null,g?.url??null)}catch{}})}for(let s of r.values())try{await gt(s.worktreePath);let o=await zs(s.worktreePath,s.repository,s.items),i=new Map(o.map(c=>[c.id,c]));for(let c of s.items){let l=Yn(n,c.task),d=i.get(c.id);if(!d?.found||!d.view){Gt(l,"not_found",null,null);continue}c.targetRepoId?await Qs(e,c.task,c.targetRepoId,d.view):await Ys(e,c.task,d.view),Gt(l,c.mode==="number"?"synced":"discovered",d.view.number,d.view.url)}}catch{}for(let s of t.filter(o=>o.type==="project"&&o.repoTargets?.length)){let o=await B(e,s.id);o.status!=="closed"&&(o.status=co(o),await E(e,o))}return t.map(s=>Yn(n,s))}async function Qn(e,t){let n=await M(e,t);await le(n),await gt(n.worktreePath);let r=K(n);if(r?.number&&!Vt(r))return{disposition:"synced",task:await Kn(e,n)};let s=await Vn(e,n);return{disposition:s.discovered?"discovered":"not_found",task:s.task}}function co(e){let t=(e.repoTargets??[]).filter(r=>r.status==="ready"),n=t.map(r=>r.pullRequest).filter(r=>!!r.number);return n.length===0?e.status:n.every(r=>r.status==="merged")?"merged":n.length===t.length&&n.every(Hl)?"merge_ready":n.some(r=>r.status==="open")?"pr_open":"checked"}async function oo(e,t){let n=await Hs(t.worktreePath);if(!n)throw new Error("GitHub repository remote could not be parsed.");let r=`${n.owner}/${n.name}`,s=e.get(r);if(s){s.items.push(t);return}e.set(r,{worktreePath:t.worktreePath,repository:n,items:[t]})}function Yn(e,t){let n=e.get(t.id);if(n)return n;let r={taskId:t.id,synced:0,discovered:0,notFound:0,hadPr:t.type==="project"?!!t.repoTargets?.some(s=>s.pullRequest.number):!!K(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,r),r}function Gt(e,t,n,r){if(t==="synced"){e.synced+=1;return}if(t==="discovered"){e.discovered+=1,e.firstDiscoveredPrNumber??=n,e.firstDiscoveredPrUrl??=r;return}e.notFound+=1}function Hl(e){return e.mergeable&&e.reviewDecision!=="REVIEW_REQUIRED"&&e.reviewDecision!=="CHANGES_REQUESTED"&&e.mergeStateStatus!=="REVIEW_REQUIRED"&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped")}async function Jn(e,t){let n=await M(e,t);try{n.type==="project"&&n.repoTargets?.length?(await Ht(e,t),n=await M(e,t)):n.prs.some(o=>o.number)&&(n=await io(e,t))}catch{}let r=await ro(e,n),s=n.sessionId?await Je(e,n.sessionId).catch(()=>null):null;return{kind:"showTask",task:n,inspection:r,session:s}}import{access as zl}from"node:fs/promises";async function Xn(e,t){let n=await M(e,t),r=zn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await zl(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}}ce();async function Zn(e,t){let n=await M(e,t);if(await le(n),(await C("git",["status","--short"],{cwd:n.worktreePath})).stdout.trim().length===0)return{kind:"showTaskDiff",taskId:n.id,diffText:"",isEmpty:!0};let s=await Yl(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}}async function Yl(e){let t=[],n=await C("git",["diff","--stat","--patch","HEAD"],{cwd:e});n.stdout.trim().length>0&&t.push(n.stdout.trimEnd());let r=await Ql(e);for(let s of r){let o=await L("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(o.stdout.trimEnd())}return t.join(`
|
|
114
114
|
|
|
115
|
-
`)}async function
|
|
116
|
-
`).map(n=>n.trim()).filter(n=>n.length>0)}async function
|
|
115
|
+
`)}async function Ql(e){return(await C("git",["ls-files","--others","--exclude-standard"],{cwd:e})).stdout.split(`
|
|
116
|
+
`).map(n=>n.trim()).filter(n=>n.length>0)}async function er(e,t){let n=await M(e,t);if(!n.sessionId)throw new Error(`Task ${n.id} does not have a Craig session.`);let r=await Je(e,n.sessionId).catch(s=>{throw Jl(s)?new Error(`Task ${n.id} does not have a Craig session.`):s});if(!r.paneId)throw new Error(`Task ${n.id} does not have a tmux target.`);return await Mt(e.repoRoot,r.paneId,r.windowTarget,r.sessionName),{kind:"focusTask",taskId:n.id,tmuxTarget:r.paneId}}function Jl(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}import{spawn as Xl}from"node:child_process";async function tr(e,t){let n=await M(e,t);await le(n);let s=(await we(e)).open?.command??[];if(s.length===0)return{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!1,command:null};let o=[...s,n.worktreePath];return await Zl(o,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:o}}async function Zl(e,t){await new Promise((n,r)=>{let[s,...o]=e,i=Xl(s,o,{cwd:t,stdio:"inherit"});i.on("error",r),i.on("exit",c=>{if(c===0){n();return}r(new Error(`${e.join(" ")} failed with exit code ${c??"unknown"}.`))})})}ke();import{mkdir as ed}from"node:fs/promises";import td from"node:path";ie();ce();async function nr(e,t){let n=await M(e,t);if(await le(n),n.status==="draft"||n.status==="merged")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);if(n.status==="running"&&await Nt(n.worktreePath)&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);let s=(await we(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);n.checks.status="running",n.checks.commands=[...s],n.checks.results=[],await E(e,n);let o=[];for(let i of s){let c=new Date().toISOString(),l=await L("sh",["-lc",i],{cwd:n.worktreePath}),d=new Date().toISOString(),f=l.exitCode??1;if(o.push({command:i,startedAt:c,finishedAt:d,exitCode:f}),f!==0)return n.checks.results=o,n.checks.status="failed",n.checks.lastRunAt=d,n.status="review",n.lastFailureReason=l.stderr.trim()||l.stdout.trim()||`Check command failed: ${i}`,await lo(e,n),await E(e,n),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}return n.checks.results=o,n.checks.status="passed",n.checks.lastRunAt=new Date().toISOString(),n.status="checked",n.lastFailureReason=null,await lo(e,n),await E(e,n),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}}async function lo(e,t){let n=qt(e,t.artifacts.checkSummaryPath);n&&(await ed(td.dirname(n),{recursive:!0}),await _(n,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))}ie();async function rr(e,t){let n=await M(e,t);await le(n);let r=await Nt(n.worktreePath);if(n.status==="running"&&r&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot commit from status "${n.status}".`);if(!r)throw new Error(`Task ${n.id} has no uncommitted diff to commit.`);let s=n.prompt.value.trim();await As(n.worktreePath),await $s(n.worktreePath,s);let o=await Ds(n.worktreePath);return n.lastCommit={sha:o.sha,message:o.message,committedAt:new Date().toISOString()},n.lastFailureReason=null,await E(e,n),{kind:"commitTask",taskId:n.id,status:n.status,commitSha:o.sha,message:o.message}}Be();Ve();ut();Ze();mt();Tt();ce();import ld from"node:path";import{stat as dd}from"node:fs/promises";async function To(e,t){let n=ld.resolve(e.workspaceRoot,t);if(!(await dd(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await Promise.resolve().then(()=>(Tt(),Ro)).then(({addWorkspace:i})=>i(e,t)),o=s.repos[0];if(!o||s.workspace.kind==="project")throw new Error(`Repo path is not a git repository: ${n}`);return{kind:"createRepo",repo:o,workspaceId:s.workspace.id,created:s.created}}async function yo(e){return{kind:"listRepos",repos:await Ke(e)}}async function Po(e,t){let n=await fe(e,t),s=(await pe(e)).filter(d=>d.primaryRepoId===t),o=s.filter(d=>d.status==="active"),i=await Te(e,{repoId:t});if(o.length>0)throw new Error(`Cannot remove repo ${t} while active workspace records still reference it.`);if(i.tasks.length>0)throw new Error(`Cannot remove repo ${t} while task records still reference it.`);await Promise.all(s.map(d=>zt(e,d.id))),await Cs(e,t);let c=await oe(e);await _e(e,{...c,repoIds:c.repoIds.filter(d=>d!==t)});let l=await ue({uiStateFile:e.uiStateFile});return l?.selectedRepoId===t&&await ae({uiStateFile:e.uiStateFile},{...l,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}),{kind:"removeRepo",repoId:n.id,rootPath:n.rootPath}}Ve();ie();async function bo(e,t,n){let[r,s]=await Promise.all([M(e,t),fe(e,n)]);if(r.repoId===s.id)throw new Error(`Repo ${s.id} is already the primary repo for task ${r.id}.`);let o=r.linkedRepoIds.includes(s.id)?r.linkedRepoIds:[...r.linkedRepoIds,s.id];return await E(e,{...r,linkedRepoIds:o}),{kind:"addTaskLink",taskId:r.id,repoId:s.id,linkedRepoIds:o}}async function So(e,t){let n=await M(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>fe(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}}Tt();async function Io(e,t){switch(e.kind){case"addWorkspace":return wt(t.paths,e.path);case"addRepo":return To(t.paths,e.path);case"listRepos":return yo(t.paths);case"removeRepo":return Po(t.paths,e.repoId);case"listWorkspaces":return sr(t.paths,{archived:e.archived});case"archiveWorkspace":return kt(t.paths,e.workspaceId);case"restoreWorkspace":return or(t.paths,e.workspaceId);case"removeWorkspace":return Rt(t.paths,e.workspaceId);case"createTask":return qs(t.paths,e.repoId??e.workspaceId??"",e.prompt,{...e.runner?{runner:e.runner}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}});case"listTasks":return e.repoId||e.workspaceId?Te(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):Te(t.paths);case"attachTask":return so(t.paths,e.taskId);case"addTaskLink":return bo(t.paths,e.taskId,e.repoId);case"listTaskLinks":return So(t.paths,e.taskId);case"refreshInteractiveState":throw new Error("Interactive refresh should be handled by the interactive app.");case"showTask":return Jn(t.paths,e.taskId);case"showSelectedTask":return Jn(t.paths,Ge(t,"show"));case"streamTaskLogs":return Xn(t.paths,e.taskId);case"streamSelectedTaskLogs":return Xn(t.paths,Ge(t,"logs"));case"showTaskDiff":return Zn(t.paths,e.taskId);case"showSelectedTaskDiff":return Zn(t.paths,Ge(t,"diff"));case"focusTask":return er(t.paths,e.taskId);case"focusSelectedTask":return er(t.paths,Ge(t,"focus"));case"openTask":return tr(t.paths,e.taskId);case"openSelectedTask":return tr(t.paths,Ge(t,"open"));case"runChecks":return nr(t.paths,e.taskId);case"runSelectedTaskChecks":return nr(t.paths,Ge(t,"check"));case"commitTask":return rr(t.paths,e.taskId);case"commitSelectedTask":return rr(t.paths,Ge(t,"commit"));case"help":return{kind:"help",text:Q()};case"exit":return{kind:"exit"};default:return ud(e)}}function ud(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function Ge(e,t){if(e.selectedTaskId)return e.selectedTaskId;throw new Error(`No task selected. Create a task with 'task new --repo <repo-id> <prompt>' or use '${t} <id>'.`)}ke();import{mkdir as ye,readFile as fd}from"node:fs/promises";import J from"node:path";function Ce(e){let t=J.join(e,".craig");return{workspaceRoot:e,repoRoot:e,craigDir:t,indexFile:J.join(t,"index.json"),reposDir:J.join(t,"repos"),workspacesDir:J.join(t,"workspaces"),sessionsDir:J.join(t,"sessions"),runtimeDir:J.join(t,"runtime"),uiStateFile:J.join(t,"runtime","ui-state.json"),tasksDir:J.join(t,"tasks"),jobsDir:J.join(t,"jobs"),logsDir:J.join(t,"logs"),errorLogFile:J.join(t,"logs","errors.log"),artifactsDir:J.join(t,"artifacts"),worktreesDir:J.join(t,"worktrees"),configFile:J.join(t,"config.json")}}Be();async function tt(e){let t=Ce(e);await ye(t.craigDir,{recursive:!0}),await Promise.all([ye(t.reposDir,{recursive:!0}),ye(t.workspacesDir,{recursive:!0}),ye(t.sessionsDir,{recursive:!0}),ye(t.runtimeDir,{recursive:!0}),ye(t.tasksDir,{recursive:!0}),ye(t.jobsDir,{recursive:!0}),ye(t.logsDir,{recursive:!0}),ye(t.artifactsDir,{recursive:!0}),ye(t.worktreesDir,{recursive:!0})]);try{let s=await fd(t.indexFile,"utf8"),o=JSON.parse(s);return Ln(o,e,t.indexFile)}catch(s){if(!pd(s))throw s instanceof SyntaxError?new Error(`Craig index at ${t.indexFile} is malformed. Remove or repair the file before rerunning Craig.`):s}let n=new Date().toISOString(),r={version:2,workspaceRoot:e,repoIds:[],workspaceIds:[],taskIds:[],jobIds:[],createdAt:n,updatedAt:n};return await _(t.indexFile,r),r}function pd(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}function Co(e){switch(e.kind){case"createWorkspace":return[`${e.created?"Registered":"Updated"} ${e.workspace.kind??"repo"} workspace ${e.workspace.id}`,`Path: ${e.workspace.rootPath??""}`,`Repos: ${e.repos.map(t=>t.id).join(", ")}`].join(`
|
|
117
117
|
`);case"createRepo":return[`${e.created?"Registered":"Already registered"} repo ${e.repo.id}`,`Path: ${e.repo.rootPath}`,`Branch: ${e.repo.defaultBranch}`,`Workspace: ${e.workspaceId}`].join(`
|
|
118
118
|
`);case"listRepos":return e.repos.length===0?"No repos registered yet. Use 'craig repo add <path>'.":["ID NAME BRANCH PATH",...e.repos.map(t=>`${t.id} ${t.name} ${t.defaultBranch} ${t.rootPath}`)].join(`
|
|
119
119
|
`);case"removeRepo":return`Removed repo ${e.repoId} (${e.rootPath})`;case"listWorkspaces":return e.workspaces.length===0?e.archivedOnly?"No archived workspaces.":"No active workspaces yet. Register one with 'craig workspace add <path>'.":["ID KIND STATUS REPOS PATH",...e.workspaces.map(t=>`${t.id} ${t.kind??"repo"} ${t.status} ${(t.discoveredRepoIds??[t.primaryRepoId]).join(",")} ${t.rootPath??""}`)].join(`
|
|
120
120
|
`);case"archiveWorkspace":return`Archived workspace ${e.workspaceId} on branch ${e.branch}`;case"restoreWorkspace":return`Restored workspace ${e.workspaceId} on branch ${e.branch}`;case"removeWorkspace":return`Removed workspace ${e.workspaceId} (${e.rootPath})`;case"createTask":return[`Created task ${e.taskId}`,`Repo: ${e.repoId}`,`Workspace: ${e.workspaceId}`,`Session: ${e.sessionId}`,`Status: ${e.status}`,`Branch: ${e.branch}`,`Worktree: ${e.worktreePath}`,`Runner: ${e.runner}`].join(`
|
|
121
121
|
`);case"attachTask":return`Attached to task ${e.taskId} via session ${e.sessionId}`;case"addTaskLink":return`Linked repo ${e.repoId} to task ${e.taskId}: ${e.linkedRepoIds.join(", ")}`;case"listTaskLinks":return e.repos.length===0?`Task ${e.taskId} has no linked repos.`:["ID NAME BRANCH PATH",...e.repos.map(t=>`${t.id} ${t.name} ${t.defaultBranch} ${t.rootPath}`)].join(`
|
|
122
|
-
`);case"help":return e.text;case"exit":return"";case"listTasks":return e.tasks.length===0?`No Craig tasks yet. Use 'task new --repo <repo-id> <prompt>' to create one.${e.missingTaskIds.length>0?` (${e.missingTaskIds.length} referenced task file(s) missing from .craig/tasks)`:""}`:["ID REPO STATUS CHECKS PR TITLE",...e.tasks.map(t=>`${t.id} ${t.repoId} ${t.status} ${
|
|
123
|
-
`);case"showTask":return[`${e.task.id}: ${e.task.title}`,`Status: ${e.task.status}`,`Runner: ${e.task.runner}`,`Repo: ${e.task.repoId}`,`Workspace: ${e.task.workspaceId}`,`Branch: ${e.task.branch}`,`Worktree: ${e.task.worktreePath}`,`Session: ${e.task.sessionId??"<missing>"}`,`tmux: ${e.session?.paneId??"<missing>"}`,`Linked repos: ${e.task.linkedRepoIds.length>0?e.task.linkedRepoIds.join(", "):"none"}`,`Prompt: ${e.task.prompt.source} ${JSON.stringify(e.task.prompt.value)}`,`Runner command: ${e.inspection.runnerCommandText||"<none>"}`,`Runner state: ${e.task.runnerSession.lastKnownState}`,`Started: ${e.task.runnerSession.startedAt??"not started"}`,`Exited: ${e.task.runnerSession.exitedAt??"still running"}`,`Checks: ${e.inspection.checksSummary}`,`Last commit: ${e.inspection.lastCommitSummary}`,`PR: ${e.inspection.prSummary}`,`Cleanup: ${e.inspection.cleanupSummary}`,...
|
|
122
|
+
`);case"help":return e.text;case"exit":return"";case"listTasks":return e.tasks.length===0?`No Craig tasks yet. Use 'task new --repo <repo-id> <prompt>' to create one.${e.missingTaskIds.length>0?` (${e.missingTaskIds.length} referenced task file(s) missing from .craig/tasks)`:""}`:["ID REPO STATUS CHECKS PR TITLE",...e.tasks.map(t=>`${t.id} ${t.repoId} ${t.status} ${hd(t)} ${wd(t)} ${t.title}`)].join(`
|
|
123
|
+
`);case"showTask":return[`${e.task.id}: ${e.task.title}`,`Status: ${e.task.status}`,`Runner: ${e.task.runner}`,`Repo: ${e.task.repoId}`,`Workspace: ${e.task.workspaceId}`,`Branch: ${e.task.branch}`,`Worktree: ${e.task.worktreePath}`,`Session: ${e.task.sessionId??"<missing>"}`,`tmux: ${e.session?.paneId??"<missing>"}`,`Linked repos: ${e.task.linkedRepoIds.length>0?e.task.linkedRepoIds.join(", "):"none"}`,`Prompt: ${e.task.prompt.source} ${JSON.stringify(e.task.prompt.value)}`,`Runner command: ${e.inspection.runnerCommandText||"<none>"}`,`Runner state: ${e.task.runnerSession.lastKnownState}`,`Started: ${e.task.runnerSession.startedAt??"not started"}`,`Exited: ${e.task.runnerSession.exitedAt??"still running"}`,`Checks: ${e.inspection.checksSummary}`,`Last commit: ${e.inspection.lastCommitSummary}`,`PR: ${e.inspection.prSummary}`,`Cleanup: ${e.inspection.cleanupSummary}`,...md(e)].join(`
|
|
124
124
|
`);case"streamTaskLogs":return`Streaming logs for ${e.taskId} from ${e.logPath}`;case"showTaskDiff":return e.isEmpty?`Task ${e.taskId} has no uncommitted diff.`:e.diffText;case"focusTask":return`Focused task ${e.taskId} on ${e.tmuxTarget}`;case"openTask":return e.launched?`Opened task ${e.taskId} at ${e.worktreePath}`:e.worktreePath;case"runChecks":return`Checks ${e.status} for ${e.taskId}: ${e.commands.join(", ")}`;case"commitTask":return[`Committed task ${e.taskId}`,`Status: ${e.status}`,`Commit: ${e.commitSha}`,`Message: ${e.message}`].join(`
|
|
125
|
-
`);default:return
|
|
126
|
-
`).filter(s=>s.length>0);return{path:e.errorLogFile,lines:r.slice(Math.max(0,r.length-t)),empty:r.length===0}}catch(n){if(
|
|
125
|
+
`);default:return gd(e)}}function md(e){let t=[];return e.inspection.worktreeExists||e.task.status==="merged"&&!e.task.cleanup.preservedWorktree&&e.task.cleanup.worktreeRemovedAt||t.push(`Warning: worktree is missing at ${e.task.worktreePath}`),e.task.cleanup.warning&&!(e.task.status==="merged"&&!e.task.cleanup.worktreeRemovedAt)&&t.push(`Cleanup warning: ${e.task.cleanup.warning}`),e.task.artifacts.logPath&&!e.inspection.logExists&&t.push(`Warning: log file is missing at ${e.task.artifacts.logPath}`),e.inspection.recentFailureReason&&t.push(`Last failure: ${e.inspection.recentFailureReason}`),t}function gd(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function hd(e){return e.checks.status}function wd(e){if(e.type==="project"&&e.repoTargets?.length){let n=e.repoTargets.filter(s=>s.pullRequest.number);if(n.length===0)return"-";let r=n.reduce((s,o)=>{let i=o.pullRequest.status??"unknown";return s[i]=(s[i]??0)+1,s},{});return Object.entries(r).map(([s,o])=>`${o} ${s}`).join(", ")}let t=e.prs[0];return t?.number?`#${t.number}:${t.status??"unknown"}`:"-"}Ve();ut();Ze();import{createRequire as Cp}from"node:module";import{readdir as xp,stat as vp}from"node:fs/promises";import ot from"node:path";ie();mt();import{appendFile as kd,mkdir as Rd,readFile as Td}from"node:fs/promises";import yd from"node:path";var Pd=80;async function bd(e,t){await Rd(yd.dirname(e.errorLogFile),{recursive:!0}),await kd(e.errorLogFile,Sd(t),"utf8")}async function ir(e,t){try{await bd(e,t)}catch{}}async function xo(e,t=Pd){try{let r=(await Td(e.errorLogFile,"utf8")).trimEnd().split(`
|
|
126
|
+
`).filter(s=>s.length>0);return{path:e.errorLogFile,lines:r.slice(Math.max(0,r.length-t)),empty:r.length===0}}catch(n){if(Id(n))return{path:e.errorLogFile,lines:[],empty:!0};throw n}}function Sd(e){let n=[`[${new Date().toISOString()}] ${e.context}`,`message: ${e.message}`];return e.details&&e.details.trim().length>0&&(n.push("details:"),n.push(...e.details.trimEnd().split(`
|
|
127
127
|
`).map(r=>` ${r}`))),`${n.join(`
|
|
128
128
|
`)}
|
|
129
129
|
|
|
130
|
-
`}function
|
|
131
|
-
`).map(t=>t.trim()).filter(t=>t.length>0).map(t=>{let[n="M",...r]=t.split(" ");return{status:n,path:r.at(-1)??""}}).filter(t=>t.path.length>0)}function
|
|
132
|
-
`)){let r=n.trim();if(!r)continue;let[s="-",o="-",...i]=r.split(" "),c=i.join(" ");c&&t.set(c,{additions:s==="-"?null:Number(s),deletions:o==="-"?null:Number(o)})}return t}async function
|
|
133
|
-
`),byteLength:s.byteLength}}catch(r){let s=r instanceof Error?r.message:"Unable to read file.";return z(t,s,"missing",t,null)}}async function
|
|
134
|
-
${l.stdout.trimEnd()}`)}}if(o.includes("staged")){let c=await
|
|
135
|
-
${c.stdout.trimEnd()}`)}if(o.includes("unstaged")){let c=await
|
|
136
|
-
${c.stdout.trimEnd()}`)}if(o.includes("untracked")){let c=await
|
|
130
|
+
`}function Id(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}Tt();ce();import{readFile as Cd,stat as xd}from"node:fs/promises";import ar from"node:path";var vd=200*1024,Ed=500*1024,Yt="100000";async function Eo(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return Ad(e,t,n);try{let r=Me(n.selectedFilePath??null,t.filePaths),s=Me(n.selectedDiffPath??null,t.diffPaths),o=s?await yt(e.worktreePath):null,[i,c]=await Promise.all([Jt(e.worktreePath,r),s?cr(e.worktreePath,s,t.diffRows,o):Promise.resolve(z("No diff selected","No local changes found.","empty"))]),l=s?{[s]:c}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:l,selectedFile:i,selectedDiff:c,error:null}}catch(r){let s=r instanceof Error?r.message:"Unable to inspect task worktree.";return{...t,error:s}}}async function Ad(e,t,n){let r=Me(n.selectedFilePath??null,t.filePaths),s=Me(n.selectedDiffPath??null,t.diffPaths),[o,i]=await Promise.all([$o(e,r),(async()=>{if(!s)return z("No diff selected","No local changes found.","empty");let l=Qt(e,s),d=l?await yt(l.target.worktreePath).catch(()=>null):null;return Do(e,s,t.diffRows,d)})()]),c=s?{[s]:i}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:c,selectedFile:o,selectedDiff:i}}async function Ao(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return $d(e,t);try{await le(e);let n=await yt(e.worktreePath),[r,s]=await Promise.all([Lo(e.worktreePath),Mo(e.worktreePath,n)]),o=[...new Set(s.map(g=>g.path))],i=Me(t.selectedFilePath??null,r),c=Me(t.selectedDiffPath??null,o),[l,d]=await Promise.all([Jt(e.worktreePath,i),c?cr(e.worktreePath,c,s,n):Promise.resolve(z("No diff selected","No local changes found.","empty"))]),f=c?{[c]:d}:{};return{taskId:e.id,fileRows:jo(r),filePaths:r,diffRows:s,diffPaths:o,diffContents:f,selectedFilePath:i,selectedDiffPath:c,selectedFile:l,selectedDiff:d,error:null}}catch(n){let r=n instanceof Error?n.message:"Unable to inspect task worktree.";return{taskId:e.id,fileRows:[],filePaths:[],diffRows:[],diffPaths:[],diffContents:{},selectedFilePath:null,selectedDiffPath:null,selectedFile:z("Files unavailable",r,"error"),selectedDiff:z("Diff unavailable",r,"error"),error:r}}}async function $d(e,t){let n=(e.repoTargets??[]).filter(R=>R.status==="ready"),r=await Promise.all(n.map(async R=>{let k=await yt(R.worktreePath).catch(()=>null),[I,T]=await Promise.all([Lo(R.worktreePath).catch(()=>[]),Mo(R.worktreePath,k).catch(()=>[])]);return{target:R,baseRef:k,targetFiles:I,targetDiffRows:T}})),s=[],o=[];for(let{target:R,targetFiles:k,targetDiffRows:I}of r)s.push(...k.map(T=>`${R.repoId}/${T}`)),o.push(...I.map(T=>({...T,path:`${R.repoId}/${T.path}`})));let i=[...new Set(o.map(R=>R.path))].sort(),c=Me(t.selectedFilePath??null,s),l=Me(t.selectedDiffPath??null,i),[d,f]=await Promise.all([$o(e,c),(async()=>{if(!l)return z("No diff selected","No local changes found.","empty");let R=Qt(e,l),k=R?r.find(I=>I.target.repoId===R.target.repoId):null;return Do(e,l,o,k?.baseRef??null)})()]),g=l?{[l]:f}:{};return{taskId:e.id,fileRows:jo(s),filePaths:s,diffRows:o,diffPaths:i,diffContents:g,selectedFilePath:c,selectedDiffPath:l,selectedFile:d,selectedDiff:f,error:null}}async function $o(e,t){let n=Qt(e,t);if(!n)return z("No file selected","No Git-visible files found.","empty");let r=await Jt(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function Do(e,t,n,r=null){let s=Qt(e,t);return s?{...await cr(s.target.worktreePath,s.relativePath,n.filter(i=>i.path.startsWith(`${s.target.repoId}/`)).map(i=>({...i,path:i.path.slice(s.target.repoId.length+1)})),r),path:t,title:t}:z(t,"Repo target is unavailable.","error",t)}function Qt(e,t){if(!t)return null;let[n,...r]=t.split("/"),s=r.join("/"),o=(e.repoTargets??[]).find(i=>i.repoId===n&&i.status==="ready")??null;return!o||s.length===0?null:{target:o,relativePath:s}}async function Lo(e){let t=await C("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return No(t.stdout)}async function Mo(e,t){let[n,r,s,o]=await Promise.all([Dd(e,t),vo(e,"staged"),vo(e,"unstaged"),Ld(e)]);return[...n,...r,...s,...o]}async function Dd(e,t){if(!t)return[];let[n,r]=await Promise.all([C("git",["diff","--name-status",`${t}...HEAD`],{cwd:e}),C("git",["diff","--numstat",`${t}...HEAD`],{cwd:e})]),s=Oo(n.stdout),o=Fo(r.stdout);return s.map(i=>{let c=o.get(i.path)??{additions:null,deletions:null};return{group:"branch",path:i.path,status:i.status,additions:c.additions,deletions:c.deletions}}).sort((i,c)=>i.path.localeCompare(c.path))}async function vo(e,t){let n=t==="staged"?["diff","--cached"]:["diff"],[r,s]=await Promise.all([C("git",[...n,"--name-status"],{cwd:e}),C("git",[...n,"--numstat"],{cwd:e})]),o=Oo(r.stdout),i=Fo(s.stdout);return o.map(c=>{let l=i.get(c.path)??{additions:null,deletions:null};return{group:t,path:c.path,status:c.status,additions:l.additions,deletions:l.deletions}}).sort((c,l)=>c.path.localeCompare(l.path))}async function Ld(e){let t=await C("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=No(t.stdout);return await Promise.all(n.map(async s=>{let o=await Jt(e,s),i=o.status==="ready"?Md(o.lines):null;return{group:"untracked",path:s,status:"A",additions:i,deletions:0}}))}function Oo(e){return e.split(`
|
|
131
|
+
`).map(t=>t.trim()).filter(t=>t.length>0).map(t=>{let[n="M",...r]=t.split(" ");return{status:n,path:r.at(-1)??""}}).filter(t=>t.path.length>0)}function Fo(e){let t=new Map;for(let n of e.split(`
|
|
132
|
+
`)){let r=n.trim();if(!r)continue;let[s="-",o="-",...i]=r.split(" "),c=i.join(" ");c&&t.set(c,{additions:s==="-"?null:Number(s),deletions:o==="-"?null:Number(o)})}return t}async function yt(e){return(await L("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await L("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function Jt(e,t){if(!t)return z("No file selected","No Git-visible files found.","empty");let n=Od(e,t);try{let r=await xd(n);if(r.size>vd)return z(t,`File is ${r.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,r.size);let s=await Cd(n);return Fd(s)?z(t,"Binary file preview is not available in Craig.","binary",t,s.byteLength):{path:t,status:"ready",title:t,lines:s.toString("utf8").split(`
|
|
133
|
+
`),byteLength:s.byteLength}}catch(r){let s=r instanceof Error?r.message:"Unable to read file.";return z(t,s,"missing",t,null)}}async function cr(e,t,n,r=null){if(!t)return z("No diff selected","No local changes found.","empty");let s=[],o=n.filter(c=>c.path===t).map(c=>c.group);if(o.includes("branch")){let c=r??await yt(e);if(c){let l=await C("git",["diff","--stat","--patch",`--unified=${Yt}`,`${c}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
|
|
134
|
+
${l.stdout.trimEnd()}`)}}if(o.includes("staged")){let c=await C("git",["diff","--cached","--stat","--patch",`--unified=${Yt}`,"--",t],{cwd:e});c.stdout.trim().length>0&&s.push(`staged
|
|
135
|
+
${c.stdout.trimEnd()}`)}if(o.includes("unstaged")){let c=await C("git",["diff","--stat","--patch",`--unified=${Yt}`,"--",t],{cwd:e});c.stdout.trim().length>0&&s.push(`unstaged
|
|
136
|
+
${c.stdout.trimEnd()}`)}if(o.includes("untracked")){let c=await L("git",["diff","--no-index","--stat","--patch",`--unified=${Yt}`,"--","/dev/null",t],{cwd:e});c.stdout.trim().length>0&&s.push(`untracked
|
|
137
137
|
${c.stdout.trimEnd()}`)}let i=s.join(`
|
|
138
138
|
|
|
139
|
-
`);return i.length>
|
|
140
|
-
`):["No diff for this file."],byteLength:i.length}}function
|
|
141
|
-
`).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function Sd(e,t){let n=sr.resolve(e,t),r=sr.resolve(e);if(n!==r&&!n.startsWith(`${r}${sr.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function Cd(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function z(e,t,n,r=null,s=null){return{path:r,status:n,title:e,lines:[t],byteLength:s}}se();import{access as xd}from"node:fs/promises";async function jo(e,t){let n=await M(e,t),r=await vd(n.worktreePath),s={...n,status:"closed",cleanup:{...n.cleanup,preservedWorktree:r&&n.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null};return await E(e,s),s}async function vd(e){try{return await xd(e),!0}catch{return!1}}le();ie();import bt from"node:path";function Fo(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 No="\u{F024B} ",Wo="\u{F0DCF} ",_o="\u25CB",ir="\uEA64",Bo="\uEAFE",qo="\uEBDA",ar="\u25CB",cr="\u25CF",lr="\u2713",dr="\u2715";function Uo(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}}le();Ze();le();var Ed=["tasks","center","inspector","actions"],Yo=["agent","terminal"],Jo=[],A="inspection",Ew=[...Yo,...Jo],Qo=["commit","push","refresh-checks","close-task"],Ad=["refresh-checks","close-task"],Xo=["task","checks","pr","setup-run","actions","next-action"],Zo=["diff","files","review"];function ei(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=Gd(e?.openInspectionKind)??n,s=Ye(t);return{inputMode:zd(e?.inputMode),focusedRegion:Kd(e?.focusedRegion),selectedRepoId:Ie(e?.selectedRepoId),selectedWorkspaceId:Ie(e?.selectedWorkspaceId),selectedTaskId:Ie(e?.selectedTaskId),selectedPtyTabId:Ie(e?.selectedPtyTabId),selectedLeftItemId:ru(Ie(e?.selectedTaskId)),activeTab:n?A:Ie(e?.activeTab)??"agent",preferredPtyTabKind:Hd(e?.preferredPtyTabKind),inspectorSection:yt(e?.inspectorSection,Xo,"task"),inspectionMode:Vd(e?.inspectionMode,n==="diff"?"diff":"files"),openInspectionKind:r,selectedFileTreePath:Ie(e?.selectedFileTreePath),selectedFilePath:Ie(e?.selectedFilePath),selectedDiffPath:Ie(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:yt(e?.selectedActionId,Qo,"commit"),selectedProjectTargetId:null,selectedRunner:Yd(e?.selectedRunner,s,Ne(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptInput:null,taskPromptError:null,workspaceBrowser:null,terminal:$d(),centerZoomed:!1}}function $d(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function ti(e,t){return{...e??Re(),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 en(e,t,n={}){let r=tu(e,t),s=li(r),o=(s?.kind==="workspace"?t.workspaces?.find(f=>f.id===s.id)??null:null)??(s?.kind==="task"?t.workspaces?.find(f=>f.id===t.tasks.find(h=>h.id===s.id)?.workspaceId)??null:null)??t.workspaces?.find(f=>f.id===e.selectedWorkspaceId)??t.workspaces?.[0]??null,c=((s?.kind==="repo"?t.repos.find(f=>f.id===s.id)??null:s?.kind==="task"?t.repos.find(f=>f.id===t.tasks.find(h=>h.id===s.id)?.repoId)??null:null)??(o?.kind==="project"?t.repos.find(f=>f.id===e.selectedRepoId&&o.discoveredRepoIds?.includes(f.id))??null:null)??(o?.kind!=="project"?t.repos.find(f=>f.id===o?.primaryRepoId)??null:null)??t.repos.find(f=>f.id===e.selectedRepoId)??t.repos[0]??null)?.id??null,l=o?t.tasks.filter(f=>f.workspaceId===o.id):c?t.tasks.filter(f=>f.repoId===c):[],d=(s?.kind==="task"?l.find(f=>f.id===s.id)??null:null)??l.find(f=>f.id===e.selectedTaskId)??l[0]??null;return{...e,inputMode:n.resetInputMode?"control":e.inputMode,selectedLeftItemId:r,selectedWorkspaceId:o?.id??null,selectedRepoId:c,selectedTaskId:d?.id??null,...Qd(d,e.activeTab,e.selectedPtyTabId),selectedFilePath:Bd(e,t,d?.id??null),...Xd(e,t,d?.id??null),selectedDiffPath:_d(e,t,d?.id??null),inspectorSection:yt(e.inspectorSection,Xo,"task")}}function ni(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return Dd(t)?b({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):b({state:e});if(t==="q"||t==="Q")return b({state:e,exit:!0});if(t==="ESCAPE")return b({state:{...e,actionMessage:null},changed:e.actionMessage!==null,pause:!0});if(t==="n"||t==="N")return b({state:{...e,focusedRegion:"tasks",actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0});if((t==="r"||t==="R")&&e.focusedRegion==="tasks"&&(fr(e.selectedLeftItemId)||pr(e.selectedLeftItemId)))return b({state:{...e,selectedRunner:mr(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return Ko(e,1);if(t==="SHIFT_TAB"||t==="[")return Ko(e,-1);if(t==="z"||t==="Z")return b({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===A?Le(e,-1,n):Vo(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===A?Le(e,1,n):Vo(e,1,n);if(t==="PAGE_UP")return Le(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return Le(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return Le(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return Le(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??N,s=e.centerTabRunner?r.indexOf(e.centerTabRunner):-1,o=s===r.length-1?null:r[s+1];return b({state:{...e,centerTabRunner:o,actionMessage:null},changed:!0})}if((t==="+"||t==="a"||t==="A"||t==="t"||t==="T")&&e.focusedRegion==="center"&&e.selectedTaskId){let r=Jd(e,t);return b({state:{...e,preferredPtyTabKind:r,actionMessage:null},changed:!0,createPtyTab:!0,createPtyTabKind:r,createPtyTabRunner:r==="agent"?e.centerTabRunner:null})}if((t==="R"||t==="r")&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return b({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0});if((t==="X"||t==="x")&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return b({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if((t==="X"||t==="x")&&e.focusedRegion==="tasks"&&Zt(e.selectedLeftItemId)&&e.selectedTaskId)return b({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if((t==="X"||t==="x")&&e.focusedRegion==="tasks"&&su(e.selectedLeftItemId)&&e.selectedWorkspaceId)return b({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&zo(e.activeTab,n.ptyTabIds??[]))return b({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return ur(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return Go(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return ur(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return Go(e,1)}if(Ce(t)){if(e.focusedRegion==="tasks"&&(fr(e.selectedLeftItemId)||pr(e.selectedLeftItemId))){let r=di(e.selectedLeftItemId),s=ui(e.selectedLeftItemId);return b({state:{...e,selectedRepoId:r??e.selectedRepoId,selectedWorkspaceId:s??e.selectedWorkspaceId,actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0})}if(e.focusedRegion==="tasks"&&e.selectedLeftItemId==="new-workspace")return b({state:{...e,actionMessage:null},changed:!0,openWorkspaceBrowser:!0});if(e.focusedRegion==="tasks"&&Zt(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return b({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:Pt(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&zo(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return b({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:Pt(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===A)return b({state:{...e,actionMessage:null},changed:!0,refreshInspection:!0});if(e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="files"){let r=e.selectedFileTreePath??e.selectedFilePath;if(r&&(n.fileTreeDirectoryIds??[]).includes(r))return b({state:Fd({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return b({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:A,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}return e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="diff"?b({state:{...e,activeTab:A,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.focusedRegion==="inspector"&&e.inspectionMode==="review"?e.selectedActionId==="refresh-checks"?b({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?b({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):b({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.focusedRegion!=="actions"?b({state:e}):e.selectedActionId==="refresh-checks"?b({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?b({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):b({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return b({state:e})}function He(e,t){return{...e,terminal:t}}function ri(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function Dd(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function Ce(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
142
|
-
`}function si(e){return e.length===1&&e>=" "&&e!=="\x7F"}function oi(e){return ii(e)||Pt(e)!==null}function Md(e){return Jo.includes(e)}function ii(e){return Yo.includes(e)}function ai(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[A]:[]]}var Ld=["tasks","center","inspector"];function Ko(e,t){return Qt(e,"focusedRegion",Ld,t)}function ur(e,t,n){let r=Qt(e,"activeTab",n&&n.length>0?n:eu(e),t);return!r.changed||Md(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:Pt(r.state.activeTab)??r.state.preferredPtyTabKind}}}function Vo(e,t,n){if(e.focusedRegion==="tasks")return Od(e,t,n.leftItemIds);if(e.focusedRegion==="center")return ur(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return ci(e,t,n);if(e.inspectionMode==="diff"){let r=Xt(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:A,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:r}if(n.projectTargetIds?.length){let r=Xt(e,"selectedProjectTargetId",n.projectTargetIds,t);return r.changed?{...r,state:{...r.state,reviewScrollOffset:0}}:r}return Qt(e,"selectedActionId",Ad,t)}return Qt(e,"selectedActionId",Qo,t)}function Od(e,t,n){let r=Xt(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=li(r.state.selectedLeftItemId);if(s?.kind==="workspace")return{...r,state:{...r.state,selectedWorkspaceId:s.id,selectedTaskId:null,selectedPtyTabId:null,selectedFilePath:null,selectedFileTreePath:null,selectedDiffPath:null,fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0},refreshInspection:!0};if(s?.kind==="task")return{...r,state:{...r.state,selectedTaskId:s.id,selectedFilePath:null,selectedFileTreePath:null,selectedDiffPath:null,fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0},refreshInspection:!0};if(s?.kind==="repo")return{...r,state:{...r.state,selectedRepoId:s.id,selectedTaskId:null,selectedPtyTabId:null,selectedFilePath:null,selectedFileTreePath:null,selectedDiffPath:null,fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0},refreshInspection:!0};let o=di(r.state.selectedLeftItemId);if(o)return{...r,state:{...r.state,selectedRepoId:o}};let i=ui(r.state.selectedLeftItemId);return i?{...r,state:{...r.state,selectedWorkspaceId:i}}:r}function Le(e,t,n){if(t===0)return b({state:e});if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return ci(e,t,n);if(e.inspectionMode==="diff"){let r=Xt(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,diffScrollOffset:0}}:r}return e.inspectionMode==="review"?Ho(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):b({state:e})}if(e.focusedRegion==="center"&&e.activeTab===A){if(e.openInspectionKind==="file")return Ho(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return Nd(e,t,n)}return b({state:e})}function jd(e,t){if(e.inspectionMode===t)return b({state:e});let n=t==="diff"?"diff":t==="files"?"file":e.openInspectionKind,r=t==="diff"||t==="files"?A:e.activeTab;return b({state:{...e,inspectionMode:t,activeTab:r,openInspectionKind:n,fileScrollOffset:t==="files"?0:e.fileScrollOffset,diffScrollOffset:t==="diff"?0:e.diffScrollOffset,reviewScrollOffset:t==="review"?0:e.reviewScrollOffset,actionMessage:null},changed:!0,refreshInspection:!0})}function Go(e,t){return jd(e,Ud(e.inspectionMode,Zo,t))}function ci(e,t,n){let r=n.fileTreeRowIds&&n.fileTreeRowIds.length>0?n.fileTreeRowIds:n.filePathIds??[];if(r.length===0)return b({state:e});let s=e.selectedFileTreePath??e.selectedFilePath??r[0]??null,o=r.indexOf(s??""),i=Se(o===-1?0:o+t,0,r.length-1),c=r[i]??null;if(c===e.selectedFileTreePath)return b({state:e});let l=c!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(c);return b({state:{...e,selectedFileTreePath:c,selectedFilePath:l?c:e.selectedFilePath,activeTab:l?A:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function Fd(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((n,r)=>n.localeCompare(r)),actionMessage:null}}function Ho(e,t,n,r,s=10){let o=Math.max(0,r-Math.max(1,s)),i=Se(e[t]+n,0,o);return i===e[t]?b({state:e}):b({state:{...e,[t]:i,actionMessage:null},changed:!0})}function Nd(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return Wd(e,t,n);let r=n.diffLineCount??0,s=n.pageRows??10,o=Math.max(0,r-Math.max(1,s)),i=e.diffScrollOffset+t,c=n.diffPathIds??[];if(c.length===0||!e.selectedDiffPath){let f=Se(i,0,o);return f===e.diffScrollOffset?b({state:e}):b({state:{...e,diffScrollOffset:f,actionMessage:null},changed:!0})}let l=c.indexOf(e.selectedDiffPath);if(l===-1){let f=Se(i,0,o);return f===e.diffScrollOffset?b({state:e}):b({state:{...e,diffScrollOffset:f,actionMessage:null},changed:!0})}if(t>0&&i>o){let f=c[l+1]??null;return f?b({state:{...e,selectedDiffPath:f,activeTab:A,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===o?b({state:e}):b({state:{...e,diffScrollOffset:o,actionMessage:null},changed:!0})}if(t<0&&i<0){let f=c[l-1]??null;return f?b({state:{...e,selectedDiffPath:f,activeTab:A,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?b({state:e}):b({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let d=Se(i,0,o);return d===e.diffScrollOffset?b({state:e}):b({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}function Wd(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,o=Math.max(0,r-Math.max(1,s)),i=Se(e.diffScrollOffset+t,0,o),c=qd(n.diffPathRanges??[],i)??e.selectedDiffPath;return i===e.diffScrollOffset&&c===e.selectedDiffPath?b({state:e}):b({state:{...e,diffScrollOffset:i,selectedDiffPath:c,actionMessage:null},changed:!0})}function _d(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function Bd(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function qd(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function Qt(e,t,n,r){let s=n.indexOf(e[t]),o=Se(s+r,0,n.length-1),i=n[o];return!i||i===e[t]?b({state:e}):b({state:{...e,[t]:i,actionMessage:null},changed:!0})}function Xt(e,t,n,r,s=!1){if(n.length===0)return b({state:e});let o=n.indexOf(e[t]??n[0]??""),i=Se(o===-1?0:o+r,0,n.length-1),c=n[i]??null;return c===e[t]?b({state:e}):b({state:{...e,[t]:c,actionMessage:null},changed:!0,refreshInspection:s})}function Ud(e,t,n){let r=t.indexOf(e);return t[Se(r+n,0,t.length-1)]??e}function b(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,refreshPullRequestChecks:e.refreshPullRequestChecks??!1,closeTask:e.closeTask??!1,removeWorkspace:e.removeWorkspace??!1,refreshInspection:e.refreshInspection??!1}}function yt(e,t,n){return t.includes(e??"")?e:n}function Kd(e){return e==="tabs"?"center":yt(e,Ed,"tasks")}function Vd(e,t){return e==="checks"||e==="actions"||e==="review"?"review":yt(e,Zo,t)}function Gd(e){return e==="file"||e==="diff"?e:null}function Hd(e){return e==="terminal"?"terminal":"agent"}function zd(e){return e==="terminal"?"terminal":"control"}function Yd(e,t=[...N],n="codex"){return e&&Je(e)&&t.includes(e)?e:n}function mr(e,t=N){let n=t.length>0?t:N,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function Pt(e){let t=N.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function Jd(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Pt(e.activeTab)??e.preferredPtyTabKind}function Qd(e,t,n){if(!e)return{activeTab:t===A?t:"agent",selectedPtyTabId:null};let r=e.ptyTabs.find(c=>c.id===n)??null,s=e.selectedPtyTabId?e.ptyTabs.find(c=>c.id===e.selectedPtyTabId)??null:null,o=e.ptyTabs.find(c=>c.id===t)??null;if(o)return{activeTab:o.id,selectedPtyTabId:o.id};if(ii(t)){let l=e.ptyTabs.find(d=>d.kind===t)??null??s??r??e.ptyTabs[0]??null;return{activeTab:l?.id??A,selectedPtyTabId:l?.id??null}}if(t===A)return{activeTab:A,selectedPtyTabId:r?.id??s?.id??e.ptyTabs[0]?.id??null};let i=s??r??e.ptyTabs[0]??null;return{activeTab:i?.id??A,selectedPtyTabId:i?.id??null}}function Xd(e,t,n){if(!t.inspection||t.inspection.taskId!==n)return{selectedFileTreePath:e.selectedFileTreePath,collapsedFileTreePaths:e.collapsedFileTreePaths};let r=e.selectedFileTreePath??t.inspection.selectedFilePath,s=e.selectedFileTreePath===null&&e.collapsedFileTreePaths.length===0?Zd(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function Zd(e,t){let n=new Set;if(t){let r=t.split("/");for(let s=1;s<r.length;s+=1)n.add(r.slice(0,s).join("/"))}return e.filter(r=>r.kind==="directory"&&!r.path.includes("/")&&!n.has(r.path)).map(r=>r.path).sort((r,s)=>r.localeCompare(s))}function eu(e){return[e.selectedPtyTabId,e.openInspectionKind?A:null].filter(t=>typeof t=="string")}function zo(e,t){return t.includes(e)}function tu(e,t){let n=nu(t);return e.selectedLeftItemId&&n.includes(e.selectedLeftItemId)?e.selectedLeftItemId:e.selectedWorkspaceId&&n.includes(`workspace:${e.selectedWorkspaceId}`)?`workspace:${e.selectedWorkspaceId}`:e.selectedTaskId&&n.includes(`task:${e.selectedTaskId}`)?`task:${e.selectedTaskId}`:e.selectedRepoId&&n.includes(`repo:${e.selectedRepoId}`)?`repo:${e.selectedRepoId}`:n[0]??null}function nu(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let r of e.tasks.filter(s=>s.workspaceId===n.id))t.push(`task:${r.id}`);n.kind==="project"&&t.push(`new-task-workspace:${n.id}`),n.kind==="repo"&&t.push(`new-task:${n.primaryRepoId}`)}else for(let n of e.repos){t.push(`repo:${n.id}`);for(let r of e.tasks.filter(s=>s.repoId===n.id))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function li(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 Ie(e){return typeof e=="string"?e:null}function ru(e){return e?`task:${e}`:null}function Zt(e){return typeof e=="string"&&e.startsWith("task:")}function fr(e){return typeof e=="string"&&e.startsWith("new-task:")}function pr(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function su(e){return typeof e=="string"&&e.startsWith("workspace:")}function di(e){return fr(e)?e.slice(9):null}function ui(e){return pr(e)?e.slice(19):null}function Se(e,t,n){return Math.min(n,Math.max(t,e))}var nn="empty",B={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function gi(e,t){let n=au(t,e),r=t.repos.find(T=>T.id===e.selectedRepoId)??t.repos[0]??null,s=n?t.tasks.filter(T=>T.workspaceId===n.id):t.tasks,o=n?.kind==="project"?s:r?s.filter(T=>T.repoId===r.id):[],i=o.find(T=>T.id===e.selectedTaskId)??o[0]??null,c=i?.type==="project",l=Uu(t.tasks),d=du(e,i),f=lu(e,i,d),h=f.find(T=>T.id===d)??f[0]??{id:"agent",label:"CODEX"},R=t.inspection?.taskId===i?.id?t.inspection:null,k=r?.name??"no repo",I=i?ne(i.runner):ne(e.selectedRunner);return{inputMode:e.inputMode,modalInput:e.taskPromptInput!==null||e.workspaceBrowser!==null,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,footerToast:e.footerToast,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 ${r?`[${r.name}]`:"[no repo]"} \xB7 ${ne(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 [${ne(e.selectedRunner)}] Enter create task Esc pause ? help`:Zt(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"?i===null?"n new task Tab tasks Esc pause ? help":d===A?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${ne(e.centerTabRunner??i?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?c?"\u2191\u2193 targets Wheel/PgUp/PgDn scroll R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"Wheel/PgUp/PgDn scroll 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:bt.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${bt.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:I},leftTree:ou(e,t),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(T=>Ku(T,l[T])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":h.label,taskId:e.workspaceBrowser?"new workspace":i?.id??"no task",repo:k,agent:I},centerTranscript:cu(d,e,r,i,e.workspaceBrowser,R,n),tabs:f,rightContext:qu(r,i),rightInspection:bu(e,i,R)}}function ou(e,t){let n=[{text:"WORKSPACES",muted:!0,panelHeader:!0,focused:e.focusedRegion==="tasks"}];if(!t.workspaces)return iu(n,e,t.repos,t.tasks);let r=t.workspaces;if(r.length===0)n.push({text:"No workspaces registered.",indent:2,muted:!0});else for(let o of r){let i=e.selectedLeftItemId===`workspace:${o.id}`;n.push({id:`workspace:${o.id}`,text:`${o.kind==="project"?"\u2261":"\u2013"} ${o.name??o.id}`,selected:i,focused:i&&e.focusedRegion==="tasks"});let c=o.kind==="project"?o.discoveredRepoIds??[]:[o.primaryRepoId],l=t.tasks.filter(d=>d.workspaceId===o.id);if(l.length===0)n.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let d of l){let f=e.selectedLeftItemId===`task:${d.id}`,h=f?"\u25B8":"\u2022",R=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,k={id:`task:${d.id}`,taskId:d.id,text:`${h} ${R}`,indent:2,selected:f,focused:f&&e.focusedRegion==="tasks"},I=wi(d);I&&(k.prBadge=I),n.push(k)}if(o.kind==="project"){let d=`new-task-workspace:${o.id}`,f=e.selectedLeftItemId===d;n.push({id:d,text:`+ New Project Task [${ne(e.selectedRunner)}]`,indent:2,selected:f,focused:f&&e.focusedRegion==="tasks",muted:!f})}if(o.kind==="repo"){let d=`new-task:${o.primaryRepoId}`,f=e.selectedLeftItemId===d;n.push({id:d,text:`+ New Task [${ne(e.selectedRunner)}]`,indent:2,selected:f,focused:f&&e.focusedRegion==="tasks",muted:!f})}else{n.push({text:` Repos (${c.length})`,indent:0,muted:!0});for(let d of c.slice(0,6)){let f=t.repos.find(h=>h.id===d);n.push({text:` \xB7 ${f?.name??d}`,indent:0,muted:!0})}c.length>6&&n.push({text:` \xB7 ${c.length-6} more`,indent:0,muted:!0})}}let s=e.selectedLeftItemId==="new-workspace";return n.push({text:"",muted:!0}),n.push({id:"new-workspace",text:"+ New Workspace",selected:s,focused:s&&e.focusedRegion==="tasks"}),n}function iu(e,t,n,r){if(n.length===0)e.push({text:"No repos registered.",indent:2,muted:!0});else for(let o of n){let i=t.selectedLeftItemId===`repo:${o.id}`;e.push({id:`repo:${o.id}`,text:`\u2013 ${o.name}`,selected:i,focused:i&&t.focusedRegion==="tasks"});let c=r.filter(f=>f.repoId===o.id);if(c.length===0)e.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let f of c){let h=t.selectedLeftItemId===`task:${f.id}`,R=h?"\u25B8":"\u2022",k=f.title.length>28?`${f.title.slice(0,25)}\u2026`:f.title,I={id:`task:${f.id}`,taskId:f.id,text:`${R} ${k}`,indent:2,selected:h,focused:h&&t.focusedRegion==="tasks"},T=wi(f);T&&(I.prBadge=T),e.push(I)}let l=`new-task:${o.id}`,d=t.selectedLeftItemId===l;e.push({id:l,text:`+ New Task [${ne(t.selectedRunner)}]`,indent:2,selected:d,focused:d&&t.focusedRegion==="tasks",muted:!d})}let s=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:s,focused:s&&t.focusedRegion==="tasks"}),e}function au(e,t){let n=e.workspaces??[];if(!e.workspaces)return null;let r=e.tasks.find(s=>s.id===t.selectedTaskId)??null;return r?n.find(s=>s.id===r.workspaceId)??null:t.selectedWorkspaceId?n.find(s=>s.id===t.selectedWorkspaceId)??null:n[0]??null}function cu(e,t,n,r,s,o=null,i=null){if(s){let l=s.entries.length===0?["No directories or git repos here."]:s.entries.map((d,f)=>{let h=f===s.selectedIndex?"\u25B8":" ",R=d.kind==="repo"?" [git repo]":"/";return`${h} ${d.name}${R}`});return pe(["Browse for a workspace to register.",s.cwd,"",...l,"",s.error??"Use \u2191\u2193 to move, \u2192 or Enter to open, \u2190 to go up, Enter on a git repo to add it."])}if(!n)return pe(["No repos registered yet.","","Run `craig repo add <path>` in command mode, then reopen the shell."]);if(!r){let l=i?.kind==="project",d=l?i.name??"this workspace":n.name,f=l?"Project Task":"Task";return pe([`No tasks in ${d}.`,"",`Press n or choose + New ${f} to create one with ${ne(t.selectedRunner)}.`])}let c=r.ptyTabs.find(l=>l.id===e)??null;return c?c.kind==="agent"?pe([`${c.title} tab ready for ${r.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."]):pe([`${c.title} tab ready for ${r.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===A&&t.openInspectionKind==="file"?pu(r,o,t.fileScrollOffset):e===A&&t.openInspectionKind==="diff"?mu(r,o,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?pe(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):pe(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function lu(e,t,n){let r=t?.ptyTabs.map(o=>({id:o.id,label:uu(o)}))??[];if(!t)return[{id:nn,label:"EMPTY",active:n===nn,focused:e.focusedRegion==="center"&&n===nn}];let s=e.openInspectionKind||n===A?[{id:A,label:fu(e)}]:[];return[...r,...s].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function du(e,t){return t?t.ptyTabs.some(n=>n.id===e.activeTab)||e.activeTab===A&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??A:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??A:nn}function uu(e){return e.title.toUpperCase()}function fu(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?bt.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function pu(e,t,n){if(!e)return pe(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return pe(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=hi(r.path??r.title);return[{text:r.title},{text:`${r.byteLength===null?"size unknown":`${r.byteLength} bytes`} \xB7 ${r.lines.length} lines \xB7 PgUp/PgDn or wheel scroll`,tone:"muted"},{text:""},...gu(r.lines,n,s)]}function mu(e,t,n){if(!e)return pe(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return pe(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=hi(r.path??r.title);return[{text:r.title},{text:`${t.diffPaths.length} changed files \xB7 ${r.lines.length} rows \xB7 PgUp/PgDn or wheel scroll`,tone:"muted"},{text:""},...hu(r.lines,n,s)]}function pe(e){return e.map(t=>({text:t}))}function gu(e,t,n){let r=Math.max(3,String(e.length).length),s=Math.max(0,Math.min(t,Math.max(0,e.length-1)));return e.slice(s).map((o,i)=>{let c=s+i+1;return{text:`${`${String(c).padStart(r," ")} \u2502 `}${o}`,segments:[{text:String(c).padStart(r," "),style:{fg:B.lineNumber}},{text:" \u2502 ",style:{fg:B.gutter}},...gr(o,n)],tone:"default"}})}function hu(e,t,n){let r=wu(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(o=>ku(o,n))}function wu(e){let t=[],n=0,r=0;for(let s of e){let o=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/.exec(s);if(o){n=Number.parseInt(o[1]??"0",10),r=Number.parseInt(o[2]??"0",10);continue}if(!(s.startsWith("diff --git")||s.startsWith("index ")||s.startsWith("+++ ")||s.startsWith("--- "))&&!(s==="staged"||s==="unstaged"||s==="untracked")){if(s.startsWith("-")&&!s.startsWith("---")){t.push({oldNumber:n,newNumber:null,marker:"-",text:s.slice(1),kind:"delete"}),n+=1;continue}if(s.startsWith("+")&&!s.startsWith("+++")){t.push({oldNumber:null,newNumber:r,marker:"+",text:s.slice(1),kind:"add"}),r+=1;continue}if(s.startsWith(" ")){if(n===0&&r===0)continue;t.push({oldNumber:n,newNumber:r,marker:" ",text:s.slice(1),kind:"context"}),n+=1,r+=1;continue}}}return t}function ku(e,t){let n=fi(e.oldNumber),r=fi(e.newNumber),s=e.kind==="delete"?n:r,o=e.kind==="delete"?{bg:"2a1111",fallbackFg:B.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:B.diffAdd}:null,i=`${s} \u2502 ${e.text}`,c=o?Tu(gr(e.text,t),o.bg,o.fallbackFg):gr(e.text,t),l=o?{fg:B.lineNumber,bg:o.bg}:{fg:B.lineNumber},d=o?{fg:B.gutter,bg:o.bg}:{fg:B.gutter};return{text:i,segments:[{text:s,style:l},{text:" \u2502 ",style:d},...c],fullBleed:o!==null}}function fi(e){return e===null?" ":String(e).padStart(4," ")}function hi(e){let t=bt.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 gr(e,t){return t==="diff"?Ru(e):t==="markdown"?yu(e):t==="json"?hr(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?hr(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 Ru(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:B.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:B.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:B.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:B.diffMeta}}]:[{text:e}]}function Tu(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function yu(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:B.markup,bold:!0}}]:hr(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function hr(e,t){let n=[],r=0;for(let s of e.matchAll(t)){let o=s[0],i=s.index??0;i>r&&n.push({text:e.slice(r,i)}),n.push({text:o,style:Pu(o)}),r=i+o.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function Pu(e){return e.startsWith("//")||e.startsWith("/*")?{fg:B.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:B.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:B.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:B.markup}:{fg:B.keyword}}function bu(e,t,n){let r=e.selectedProjectTargetId??t?.repoTargets?.[0]?.repoId??null,s=t?.type==="project"&&r?t.repoTargets?.find(c=>c.repoId===r)??null:null,o=t?.type==="project"?ki(t.repoTargets??[]):s?.pullRequest??(t?K(t):null),i=[Iu(e,o),{id:"mode-spacer",text:"",muted:!0}];return e.inspectionMode==="review"?{title:"",rows:[...i,...yi(e,t)]}:e.inspectionMode==="files"?{title:"",rows:[...i,...Fu(e,n)]}:{title:"",rows:[...i,...Wu(e,n)]}}function Iu(e,t){let n=e.inspectionMode,r=[{label:"CHANGES",active:n==="diff"},{label:"FILES",active:n==="files"},{label:"REVIEW",active:n==="review"}],s=[];for(let l=0;l<r.length;l++){let d=r[l];l>0&&s.push({text:" "});let f=d.active?e.focusedRegion==="inspector"||e.focusedRegion==="actions"?"9ece6a":"7aa2f7":"565f89";s.push({text:d.label,style:{fg:f}})}let o=wr(t),i=kr(t);return s.push({text:" "},o,{text:" "},i),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function pi(e){return[{text:" "},wr(e),{text:" "},kr(e)]}function wi(e){if(e.type==="project"&&e.repoTargets?.length){let n=ki(e.repoTargets);return n?pi(n):null}let t=K(e);return t?.number?pi(t):null}function ki(e){let t=e.filter(s=>s.status==="ready"),n=t.map(s=>s.pullRequest).filter(s=>!!s.number);if(n.length===0)return null;let r=Cu(n);return{number:-1,status:Su(n),draft:n.some(s=>s.draft),mergeable:n.length===t.length&&n.every(s=>s.mergeable),mergeStateStatus:null,reviewDecision:n.some(s=>s.reviewDecision==="CHANGES_REQUESTED")?"CHANGES_REQUESTED":n.some(s=>s.reviewDecision==="REVIEW_REQUIRED")?"REVIEW_REQUIRED":n.every(s=>s.reviewDecision==="APPROVED")?"APPROVED":null,requiredChecks:n.flatMap(s=>s.requiredChecks),aggregateReadiness:r}}function Su(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 Cu(e){let t=e.map(n=>Ri(n));return t.some(n=>n==="failed")?"failed":t.some(n=>n==="pending")?"pending":t.length>0&&t.every(n=>n==="success")?"success":"none"}function wr(e){return!e||!e.number?{text:_o,style:{fg:"565f89"}}:e.status==="merged"?{text:Bo,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:qo,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:ir,style:{fg:"565f89"}}:{text:ir,style:{fg:"9ece6a"}}}function kr(e){return e?.aggregateReadiness?mi(e.aggregateReadiness):mi(Ri(e))}function mi(e){return e==="failed"?{text:dr,style:{fg:"f7768e"}}:e==="pending"?{text:cr,style:{fg:"e0af68"}}:e==="success"?{text:lr,style:{fg:"9ece6a"}}:{text:ar,style:{fg:"565f89"}}}function Ri(e){let t=e?.requiredChecks??null;return e?.status==="merged"?"success":e?.status==="closed"||!e?.number||!t||t.length===0?"none":t.some(n=>n.status==="failed")||e.reviewDecision==="CHANGES_REQUESTED"?"failed":t.every(n=>n.status==="success"||n.status==="skipped")?Ti(e)?"failed":xu(e)?"success":"pending":"pending"}function xu(e){return!!(e.mergeable&&!e.draft&&!Ti(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function Ti(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function yi(e,t){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return vu(e,t);let n=K(t),r=bi("pr",t.branch,n??{number:null,url:null,baseBranch:null,headBranch:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,lastSyncedAt:null,requiredChecks:[],comments:[]}),s=t.prs.filter(o=>o!==n&&(o.status==="merged"||o.status==="closed")).length;return s>0&&r.push({id:"pr-history",text:`+ ${s} previous PR${s!==1?"s":""}`,muted:!0}),Eu(r,e)}var tn=32;function vu(e,t){let n=[],r=t.repoTargets??[],s=e.selectedProjectTargetId??r[0]?.repoId??null;for(let i of r){let c=s===i.repoId,l=e.focusedRegion==="inspector"&&c,d=i.repoId.startsWith("repo_")?i.repoId.slice(5):i.repoId;if(i.status!=="ready"){let h=i.failureReason?i.failureReason.slice(0,14):i.status,R=tn-h.length-1,k=d.length>R?d.slice(0,R-1)+"\u2026":d,I=tn-k.length-h.length;n.push({id:`project-review:${i.repoId}`,text:k+" ".repeat(Math.max(1,I))+h,selected:c,focused:l,muted:!0})}else{let f=wr(i.pullRequest),h=kr(i.pullRequest),R=`${f.text} ${h.text}`,k=tn-R.length-1,I=d.length>k?d.slice(0,k-1)+"\u2026":d,T=tn-I.length-R.length,a=I+" ".repeat(Math.max(1,T));n.push({id:`project-review:${i.repoId}`,text:a+R,selected:c,focused:l,segments:[{text:a},{...f,text:f.text},{text:" "},{...h,text:h.text}]})}}let o=r.find(i=>i.repoId===s)??null;return o?.status==="ready"&&o.pullRequest.number&&(n.push({id:"target-detail-spacer",text:""}),n.push(...bi("target",o.branch,o.pullRequest))),n}function Pi(e,t){return yi(e,t).length}function bi(e,t,n){let r=h=>`${e}-${h}`;if(!n.number)return[{id:r("no-pr"),text:t,muted:!0}];let s=[],o=`#${n.number}`;s.push(n.url?{id:r("pr-number"),text:`${o} Open in GitHub \u2197`,segments:[{text:o},{text:" Open in GitHub \u2197",style:{fg:"7aa2f7",underline:!0},href:n.url}]}:{id:r("pr-number"),text:o});let i=n.baseBranch??"?",c=n.headBranch??t;s.push({id:r("pr-branches"),text:`${i} \u2192 ${c}`,muted:!0});let l=Au(n.reviewDecision,n.mergeStateStatus),d=l&&l!=="review approved"?"merge blocked":n.mergeable?"merge ready":n.mergeStateStatus?`merge ${n.mergeStateStatus}`:"merge unknown";l?s.push({id:r("pr-merge"),text:`${d} \xB7 ${l}`,muted:!0,segments:[{text:d},{text:" \xB7 "},{text:l,style:{fg:$u(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:d,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${Ii(n.lastSyncedAt)}`,muted:!0}),s.push({id:r("checks-spacer"),text:""}),s.push({id:r("checks-header"),text:"Checks"}),n.requiredChecks.length?s.push(...n.requiredChecks.map(Du)):s.push({id:r("checks-none"),text:n.number?"No GitHub checks reported.":"No checks \u2014 sync after creating a PR.",muted:!0});let f=n.comments??[];return f.length>0&&(s.push({id:r("comments-spacer"),text:""}),s.push({id:r("comments-header"),text:`Review comments (${f.length})`}),s.push(...f.slice(-4).flatMap((h,R)=>Mu(h,r(`comment:${R}`))))),s}function Eu(e,t){if(t.focusedRegion!=="inspector"||t.inspectionMode!=="review"||e.length===0)return e;let n=Math.max(0,Math.min(t.reviewScrollOffset,e.length-1));return e.map((r,s)=>({...r,selected:t.reviewScrollOffset===0&&r.selected||s===n,focused:t.reviewScrollOffset===0&&r.focused||s===n}))}function Au(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function $u(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function Ii(e){if(!e)return"--";let t=Date.now()-new Date(e).getTime(),n=Math.floor(t/1e3);if(n<60)return`${n}s ago`;let r=Math.floor(n/60);if(r<60)return`${r}m ago`;let s=Math.floor(r/60);return s<24?`${s}h ago`:`${Math.floor(s/24)}d ago`}function Du(e){let{icon:t,color:n}=Ou(e.status),r=e.name.length>16?`${e.name.slice(0,15)}\u2026`:e.name;return{id:`pr-check:${e.name}`,text:`${t} ${r.padEnd(16," ")} ${ju(e.status)}`,color:n,muted:!1}}function Mu(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${Ii(e.createdAt)}`:"",s=Lu(e.body,30),o=s.slice(0,4),i=o.length<s.length,c=[{id:`${t}:author`,text:`${n}${r}`,muted:!0},...o.map((l,d)=>({id:`${t}:body:${d}`,text:` ${i&&d===o.length-1?`${l}\u2026`:l}`,muted:!0}))];return c.push({id:`${t}:spacer`,text:"",muted:!0}),c}function Lu(e,t){let n=e.split(/\s+/).filter(Boolean);if(n.length===0)return[];let r=[],s="";for(let o of n){if(!s){s=o;continue}`${s} ${o}`.length<=t?s=`${s} ${o}`:(r.push(s),s=o)}return s&&r.push(s),r}function Ou(e){switch(e){case"success":return{icon:lr,color:"9ece6a"};case"pending":return{icon:cr,color:"e0af68"};case"failed":return{icon:dr,color:"f7768e"};case"skipped":return{icon:ar,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function ju(e){return e==="success"?"passing":e==="failed"?"failing":e}function Fu(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 n=new Map(t.diffRows.map(o=>[o.path,o.status])),r=Nu(t.fileRows,e.collapsedFileTreePaths),s=e.selectedFileTreePath??t.selectedFilePath;return r.map(o=>{let i=o.kind==="file"?n.get(o.path):void 0,c=i==="A"?"9ece6a":i==="M"?"e0af68":i==="D"?"f7768e":i==="??"?"565f89":void 0,l=o.kind==="directory"?e.collapsedFileTreePaths.includes(o.path)?No:Wo:Fo(o.label),d=o.kind==="file"?Uo(o.label):void 0,f=" ".repeat(o.depth),h=d?{text:l,style:{fg:d}}:{text:l},R=c?{text:o.label,style:{fg:c}}:{text:o.label},k=[{text:f},h,R];return{id:o.path,text:`${f}${l}${o.label}`,selected:o.path===s,focused:o.path===s&&e.focusedRegion==="inspector",muted:o.kind==="directory",segments:k}})}function Nu(e,t){let n=new Set(t);return e.filter(r=>{let s=r.path.split("/");for(let o=1;o<s.length;o+=1)if(n.has(s.slice(0,o).join("/")))return!1;return!0})}function Wu(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(s=>s.startsWith("repo_"))?"No changes in project task worktrees. Edits in the original repos are outside this task.":"No local changes.",muted:!0}];if(_u(t))return Bu(e,t);let n=[];for(let r of["branch","staged","unstaged","untracked"]){let s=t.diffRows.filter(o=>o.group===r);s.length!==0&&(n.push({id:r,text:r.toUpperCase(),muted:!0}),n.push(...s.map(o=>Si(o,e,t))))}return n}function _u(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function Bu(e,t){let n=[],r=[...new Set(t.diffRows.map(s=>s.path.split("/")[0]).filter(s=>typeof s=="string"&&s.length>0))].sort();for(let s of r){let o=t.diffRows.filter(c=>c.path.startsWith(`${s}/`)),i=s.startsWith("repo_")?s.slice(5):s;n.push({id:`repo-diff:${s}`,text:i,muted:!0});for(let c of["branch","staged","unstaged","untracked"]){let l=o.filter(d=>d.group===c);l.length!==0&&(n.push({id:`repo-diff:${s}:${c}`,text:` ${c}`,muted:!0}),n.push(...l.map(d=>Si(d,e,t,s.length+1))))}}return n}function Si(e,t,n,r=0){let s=e.additions===null?"-":`+${e.additions}`,o=e.deletions===null?"-":`-${e.deletions}`,i=e.status==="A"||e.group==="untracked"?"9ece6a":e.status==="D"?"f7768e":"e0af68",c=r>0?e.path.slice(r):e.path;return{id:`${e.group}:${e.path}`,text:` ${e.status.padEnd(2," ")} ${c} ${s}/${o}`,selected:e.path===(t.selectedDiffPath??n.selectedDiffPath),focused:e.path===(t.selectedDiffPath??n.selectedDiffPath)&&t.focusedRegion==="inspector",color:i}}function qu(e,t){return e?t?[{label:"Task",value:t.id},{label:"Repo",value:e.name},{label:"Agent",value:ne(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:bt.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 Uu(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0})}function Ku(e,t){return{name:ne(e).toLowerCase(),health:t>0?1:0,count:String(t)}}var rn={width:120,height:36},me={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function Oe(e,t){return{width:Math.max(e??rn.width,rn.width),height:Math.max(t??rn.height,rn.height)}}import{spawn as mf}from"node:child_process";import{createHash as gf}from"node:crypto";import{createServer as hf,createConnection as Li}from"node:net";import{openSync as wf}from"node:fs";import{mkdir as kf,readFile as Sr,rm as ze,writeFile as Rf}from"node:fs/promises";import{tmpdir as Tf}from"node:os";import nt from"node:path";import{createRequire as ef}from"node:module";import Vu from"@xterm/headless";var Gu=1e3,Hu=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function xi(e){return new Vu.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:Gu,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}})}function vi(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function Tr(e,t){return new Promise(n=>{e.write(t,n)})}function Ei(e,t=0){let n=e.buffer.active,r=[],s=n.getNullCell(),o=n.baseY+n.cursorY,i=Math.max(0,n.baseY-t);for(let c=0;c<e.rows;c+=1){let l=n.getLine(i+c);if(!l){r.push({segments:[]});continue}let d=[];for(let f=0;f<e.cols;f+=1){let h=l.getCell(f,s);!h||h.getWidth()===0||d.push({text:h.getChars()||" ",style:Ju(h,i+c===o&&f===n.cursorX)})}r.push({segments:zu(Yu(d))})}return r}function zu(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&Zu(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};Ai(n.style)||(s.style=n.style),t.push(s)}return t}function Yu(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||!Ai(n.style))break;t-=1}return e.slice(0,t)}function Ju(e,t){let n={},r=Ci(e,"fg"),s=Ci(e,"bg");return r&&(n.fg=r),s&&(n.bg=s),e.isBold()&&(n.bold=!0),e.isDim()&&(n.dim=!0),e.isItalic()&&(n.italic=!0),e.isUnderline()&&(n.underline=!0),(e.isInverse()||t)&&(n.inverse=!0),n}function Ci(e,t){if(t==="fg"?e.isFgDefault():e.isBgDefault())return;let r=t==="fg"?e.isFgRGB():e.isBgRGB(),s=t==="fg"?e.getFgColor():e.getBgColor();return r?s.toString(16).padStart(6,"0"):Hu[s]??Qu(s)}function Qu(e){if(e>=16&&e<=231){let t=e-16,n=Math.floor(t/36),r=Math.floor(t%36/6),s=t%6;return[n,r,s].map(Xu).map(o=>o.toString(16).padStart(2,"0")).join("")}if(e>=232&&e<=255){let t=8+(e-232)*10;return[t,t,t].map(n=>n.toString(16).padStart(2,"0")).join("")}return"e6e6e6"}function Xu(e){return e===0?0:55+e*40}function Zu(e,t){return Rr(e)===Rr(t)}function Rr(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function Ai(e){return Rr(e)===""}var tf=ef(import.meta.url),nf=/^CTRL_([A-Z])$/,rf="\x1B[6n",sf="\x1B[c",of="\x1B[?u",af={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
|
|
143
|
-
`,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:""},
|
|
144
|
-
[process exited ${k.exitCode}]`).then(()=>{this.onUpdate?.(R.tabId)})})),R}getAttachedSession(){return this.attachedTabId?this.sessions.get(this.attachedTabId)??null:null}};function
|
|
139
|
+
`);return i.length>Ed?z(t,"Diff is above the 500 KB inline preview limit.","too_large",t,i.length):i.includes("\0")?z(t,"Binary diff preview is not available in Craig.","binary",t,i.length):{path:t,status:i.length>0?"ready":"empty",title:t,lines:i.length>0?i.split(`
|
|
140
|
+
`):["No diff for this file."],byteLength:i.length}}function jo(e){let t=[],n=new Set;for(let r of e){let s=r.split("/");for(let o=0;o<s.length-1;o+=1){let i=s.slice(0,o+1).join("/");n.has(i)||(n.add(i),t.push({kind:"directory",path:i,depth:o,label:s[o]??i}))}t.push({kind:"file",path:r,depth:s.length-1,label:s.at(-1)??r})}return t}function Me(e,t){return e&&t.includes(e)?e:t[0]??null}function Md(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function No(e){return[...new Set(e.split(`
|
|
141
|
+
`).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function Od(e,t){let n=ar.resolve(e,t),r=ar.resolve(e);if(n!==r&&!n.startsWith(`${r}${ar.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function Fd(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function z(e,t,n,r=null,s=null){return{path:r,status:n,title:e,lines:[t],byteLength:s}}ie();import{access as jd}from"node:fs/promises";async function Wo(e,t){let n=await M(e,t),r=await Nd(n.worktreePath),s={...n,status:"closed",cleanup:{...n.cleanup,preservedWorktree:r&&n.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null};return await E(e,s),s}async function Nd(e){try{return await jd(e),!0}catch{return!1}}de();ce();import St from"node:path";function _o(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 Bo="\u{F024B} ",qo="\u{F0DCF} ",Uo="\u25CB",lr="\uEA64",Ko="\uEAFE",Vo="\uEBDA",dr="\u25CB",ur="\u25CF",fr="\u2713",pr="\u2715";function Go(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}}de();Ze();de();var Wd=["tasks","center","inspector","actions"],ti=["agent","terminal"],ni=[],$="inspection",qw=[...ti,...ni],ri=["commit","push","refresh-checks","close-task"],_d=["refresh-checks","close-task"],si=["task","checks","pr","setup-run","actions","next-action"],oi=["diff","files","review"];function ii(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=ru(e?.openInspectionKind)??n,s=Ye(t);return{inputMode:ou(e?.inputMode),focusedRegion:tu(e?.focusedRegion),selectedRepoId:xe(e?.selectedRepoId),selectedWorkspaceId:xe(e?.selectedWorkspaceId),selectedTaskId:xe(e?.selectedTaskId),selectedPtyTabId:xe(e?.selectedPtyTabId),selectedLeftItemId:mu(xe(e?.selectedTaskId)),activeTab:n?$:xe(e?.activeTab)??"agent",preferredPtyTabKind:su(e?.preferredPtyTabKind),inspectorSection:Pt(e?.inspectorSection,si,"task"),inspectionMode:nu(e?.inspectionMode,n==="diff"?"diff":"files"),openInspectionKind:r,selectedFileTreePath:xe(e?.selectedFileTreePath),selectedFilePath:xe(e?.selectedFilePath),selectedDiffPath:xe(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:Pt(e?.selectedActionId,ri,"commit"),selectedProjectTargetId:null,selectedRunner:iu(e?.selectedRunner,s,Ne(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptInput:null,taskPromptError:null,workspaceBrowser:null,fileSearchQuery:null,terminal:Bd(),centerZoomed:!1}}function Bd(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function ai(e,t){return{...e??Re(),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 tn(e,t,n={}){let r=fu(e,t),s=gi(r),o=(s?.kind==="workspace"?t.workspaces?.find(f=>f.id===s.id)??null:null)??(s?.kind==="task"?t.workspaces?.find(f=>f.id===t.tasks.find(g=>g.id===s.id)?.workspaceId)??null:null)??t.workspaces?.find(f=>f.id===e.selectedWorkspaceId)??t.workspaces?.[0]??null,c=((s?.kind==="repo"?t.repos.find(f=>f.id===s.id)??null:s?.kind==="task"?t.repos.find(f=>f.id===t.tasks.find(g=>g.id===s.id)?.repoId)??null:null)??(o?.kind==="project"?t.repos.find(f=>f.id===e.selectedRepoId&&o.discoveredRepoIds?.includes(f.id))??null:null)??(o?.kind!=="project"?t.repos.find(f=>f.id===o?.primaryRepoId)??null:null)??t.repos.find(f=>f.id===e.selectedRepoId)??t.repos[0]??null)?.id??null,l=o?t.tasks.filter(f=>f.workspaceId===o.id):c?t.tasks.filter(f=>f.repoId===c):[],d=(s?.kind==="task"?l.find(f=>f.id===s.id)??null:null)??l.find(f=>f.id===e.selectedTaskId)??l[0]??null;return{...e,inputMode:n.resetInputMode?"control":e.inputMode,selectedLeftItemId:r,selectedWorkspaceId:o?.id??null,selectedRepoId:c,selectedTaskId:d?.id??null,...cu(d,e.activeTab,e.selectedPtyTabId),selectedFilePath:Xd(e,t,d?.id??null),...lu(e,t,d?.id??null),selectedDiffPath:Jd(e,t,d?.id??null),inspectorSection:Pt(e.inspectorSection,si,"task")}}function ci(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return qd(t)?P({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):P({state:e});if(e.fileSearchQuery!==null)return Hd(e,t,n);if(t==="q"||t==="Q")return P({state:e,exit:!0});if(t==="ESCAPE")return P({state:{...e,actionMessage:null},changed:e.actionMessage!==null,pause:!0});if(t==="/"&&e.focusedRegion==="inspector"&&e.inspectionMode==="files")return P({state:{...e,fileSearchQuery:"",actionMessage:null},changed:!0});if(t==="n"||t==="N")return P({state:{...e,focusedRegion:"tasks",actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0});if((t==="r"||t==="R")&&e.focusedRegion==="tasks"&&(gr(e.selectedLeftItemId)||hr(e.selectedLeftItemId)))return P({state:{...e,selectedRunner:kr(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return Ho(e,1);if(t==="SHIFT_TAB"||t==="[")return Ho(e,-1);if(t==="z"||t==="Z")return P({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===$?Oe(e,-1,n):zo(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===$?Oe(e,1,n):zo(e,1,n);if(t==="PAGE_UP")return Oe(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return Oe(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return Oe(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return Oe(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??W,s=e.centerTabRunner?r.indexOf(e.centerTabRunner):-1,o=s===r.length-1?null:r[s+1];return P({state:{...e,centerTabRunner:o,actionMessage:null},changed:!0})}if((t==="+"||t==="a"||t==="A"||t==="t"||t==="T")&&e.focusedRegion==="center"&&e.selectedTaskId){let r=au(e,t);return P({state:{...e,preferredPtyTabKind:r,actionMessage:null},changed:!0,createPtyTab:!0,createPtyTabKind:r,createPtyTabRunner:r==="agent"?e.centerTabRunner:null})}if((t==="R"||t==="r")&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return P({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0});if((t==="X"||t==="x")&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return P({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if((t==="X"||t==="x")&&e.focusedRegion==="tasks"&&en(e.selectedLeftItemId)&&e.selectedTaskId)return P({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if((t==="X"||t==="x")&&e.focusedRegion==="tasks"&&gu(e.selectedLeftItemId)&&e.selectedWorkspaceId)return P({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&ei(e.activeTab,n.ptyTabIds??[]))return P({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return mr(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return Yo(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return mr(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return Yo(e,1)}if(be(t)){if(e.focusedRegion==="tasks"&&(gr(e.selectedLeftItemId)||hr(e.selectedLeftItemId))){let r=hi(e.selectedLeftItemId),s=wi(e.selectedLeftItemId);return P({state:{...e,selectedRepoId:r??e.selectedRepoId,selectedWorkspaceId:s??e.selectedWorkspaceId,actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0})}if(e.focusedRegion==="tasks"&&e.selectedLeftItemId==="new-workspace")return P({state:{...e,actionMessage:null},changed:!0,openWorkspaceBrowser:!0});if(e.focusedRegion==="tasks"&&en(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return P({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:bt(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&ei(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return P({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:bt(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===$)return P({state:{...e,actionMessage:null},changed:!0,refreshInspection:!0});if(e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="files"){let r=e.selectedFileTreePath??e.selectedFilePath;if(r&&(n.fileTreeDirectoryIds??[]).includes(r))return P({state:zd({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return P({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:$,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}return e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="diff"?P({state:{...e,activeTab:$,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.focusedRegion==="inspector"&&e.inspectionMode==="review"?e.selectedActionId==="refresh-checks"?P({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?P({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):P({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.focusedRegion!=="actions"?P({state:e}):e.selectedActionId==="refresh-checks"?P({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?P({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):P({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return P({state:e})}function He(e,t){return{...e,terminal:t}}function li(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function qd(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function be(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
142
|
+
`}function nn(e){return e.length===1&&e>=" "&&e!=="\x7F"}function di(e){return ui(e)||bt(e)!==null}function Ud(e){return ni.includes(e)}function ui(e){return ti.includes(e)}function fi(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[$]:[]]}var Kd=["tasks","center","inspector"];function Ho(e,t){return Xt(e,"focusedRegion",Kd,t)}function mr(e,t,n){let r=Xt(e,"activeTab",n&&n.length>0?n:uu(e),t);return!r.changed||Ud(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:bt(r.state.activeTab)??r.state.preferredPtyTabKind}}}function zo(e,t,n){if(e.focusedRegion==="tasks")return Vd(e,t,n.leftItemIds);if(e.focusedRegion==="center")return mr(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return mi(e,t,n);if(e.inspectionMode==="diff"){let r=Zt(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:$,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:r}if(n.projectTargetIds?.length){let r=Zt(e,"selectedProjectTargetId",n.projectTargetIds,t);return r.changed?{...r,state:{...r.state,reviewScrollOffset:0}}:r}return Xt(e,"selectedActionId",_d,t)}return Xt(e,"selectedActionId",ri,t)}function Vd(e,t,n){let r=Zt(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=gi(r.state.selectedLeftItemId);if(s?.kind==="workspace")return{...r,state:{...r.state,selectedWorkspaceId:s.id,selectedTaskId:null,selectedPtyTabId:null,selectedFilePath:null,selectedFileTreePath:null,selectedDiffPath:null,fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0},refreshInspection:!0};if(s?.kind==="task")return{...r,state:{...r.state,selectedTaskId:s.id,selectedFilePath:null,selectedFileTreePath:null,selectedDiffPath:null,fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0},refreshInspection:!0};if(s?.kind==="repo")return{...r,state:{...r.state,selectedRepoId:s.id,selectedTaskId:null,selectedPtyTabId:null,selectedFilePath:null,selectedFileTreePath:null,selectedDiffPath:null,fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0},refreshInspection:!0};let o=hi(r.state.selectedLeftItemId);if(o)return{...r,state:{...r.state,selectedRepoId:o}};let i=wi(r.state.selectedLeftItemId);return i?{...r,state:{...r.state,selectedWorkspaceId:i}}:r}function Oe(e,t,n){if(t===0)return P({state:e});if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return mi(e,t,n);if(e.inspectionMode==="diff"){let r=Zt(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,diffScrollOffset:0}}:r}return e.inspectionMode==="review"?Zo(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):P({state:e})}if(e.focusedRegion==="center"&&e.activeTab===$){if(e.openInspectionKind==="file")return Zo(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return Yd(e,t,n)}return P({state:e})}function Gd(e,t){if(e.inspectionMode===t)return P({state:e});let n=t==="diff"?"diff":t==="files"?"file":e.openInspectionKind,r=t==="diff"||t==="files"?$:e.activeTab;return P({state:{...e,inspectionMode:t,activeTab:r,openInspectionKind:n,fileScrollOffset:t==="files"?0:e.fileScrollOffset,diffScrollOffset:t==="diff"?0:e.diffScrollOffset,reviewScrollOffset:t==="review"?0:e.reviewScrollOffset,actionMessage:null},changed:!0,refreshInspection:!0})}function Yo(e,t){return Gd(e,eu(e.inspectionMode,oi,t))}function Hd(e,t,n){let r=e.fileSearchQuery??"";if(t==="ESCAPE")return P({state:{...e,fileSearchQuery:null,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return Jo(e,-1,n);if(t==="DOWN"||t==="j")return Jo(e,1,n);if(be(t)){let s=e.selectedFilePath??wr(r,n.filePathIds??[])[0]??null;return P(s?{state:{...e,fileSearchQuery:null,selectedFileTreePath:s,selectedFilePath:s,activeTab:$,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}:{state:e})}return t==="BACKSPACE"?Qo(e,r.slice(0,-1),n):nn(t)?Qo(e,`${r}${t}`,n):P({state:e})}function Qo(e,t,n){let s=wr(t,n.filePathIds??[])[0]??e.selectedFilePath;return P({state:{...e,fileSearchQuery:t,selectedFileTreePath:s,selectedFilePath:s,actionMessage:null},changed:!0})}function Jo(e,t,n){let r=wr(e.fileSearchQuery,n.filePathIds??[]);if(r.length===0)return P({state:e});let s=r.indexOf(e.selectedFilePath??""),o=Pe(s===-1?0:s+t,0,r.length-1),i=r[o]??null;return i===e.selectedFilePath?P({state:e}):P({state:{...e,selectedFileTreePath:i,selectedFilePath:i,actionMessage:null},changed:!0})}function wr(e,t){let n=(e??"").trim().toLowerCase();return n?t.filter(r=>r.toLowerCase().includes(n)||pi(r).toLowerCase().includes(n)).sort((r,s)=>Xo(r,n)-Xo(s,n)||r.localeCompare(s)):t}function Xo(e,t){let n=e.toLowerCase(),r=pi(e).toLowerCase();return r===t?0:r.startsWith(t)?1:r.includes(t)?2:n.startsWith(t)?3:4}function pi(e){return e.split("/").at(-1)??e}function mi(e,t,n){let r=n.fileTreeRowIds&&n.fileTreeRowIds.length>0?n.fileTreeRowIds:n.filePathIds??[];if(r.length===0)return P({state:e});let s=e.selectedFileTreePath??e.selectedFilePath??r[0]??null,o=r.indexOf(s??""),i=Pe(o===-1?0:o+t,0,r.length-1),c=r[i]??null;if(c===e.selectedFileTreePath)return P({state:e});let l=c!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(c);return P({state:{...e,selectedFileTreePath:c,selectedFilePath:l?c:e.selectedFilePath,activeTab:l?$:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function zd(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((n,r)=>n.localeCompare(r)),actionMessage:null}}function Zo(e,t,n,r,s=10){let o=Math.max(0,r-Math.max(1,s)),i=Pe(e[t]+n,0,o);return i===e[t]?P({state:e}):P({state:{...e,[t]:i,actionMessage:null},changed:!0})}function Yd(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return Qd(e,t,n);let r=n.diffLineCount??0,s=n.pageRows??10,o=Math.max(0,r-Math.max(1,s)),i=e.diffScrollOffset+t,c=n.diffPathIds??[];if(c.length===0||!e.selectedDiffPath){let f=Pe(i,0,o);return f===e.diffScrollOffset?P({state:e}):P({state:{...e,diffScrollOffset:f,actionMessage:null},changed:!0})}let l=c.indexOf(e.selectedDiffPath);if(l===-1){let f=Pe(i,0,o);return f===e.diffScrollOffset?P({state:e}):P({state:{...e,diffScrollOffset:f,actionMessage:null},changed:!0})}if(t>0&&i>o){let f=c[l+1]??null;return f?P({state:{...e,selectedDiffPath:f,activeTab:$,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===o?P({state:e}):P({state:{...e,diffScrollOffset:o,actionMessage:null},changed:!0})}if(t<0&&i<0){let f=c[l-1]??null;return f?P({state:{...e,selectedDiffPath:f,activeTab:$,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?P({state:e}):P({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let d=Pe(i,0,o);return d===e.diffScrollOffset?P({state:e}):P({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}function Qd(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,o=Math.max(0,r-Math.max(1,s)),i=Pe(e.diffScrollOffset+t,0,o),c=Zd(n.diffPathRanges??[],i)??e.selectedDiffPath;return i===e.diffScrollOffset&&c===e.selectedDiffPath?P({state:e}):P({state:{...e,diffScrollOffset:i,selectedDiffPath:c,actionMessage:null},changed:!0})}function Jd(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function Xd(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function Zd(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function Xt(e,t,n,r){let s=n.indexOf(e[t]),o=Pe(s+r,0,n.length-1),i=n[o];return!i||i===e[t]?P({state:e}):P({state:{...e,[t]:i,actionMessage:null},changed:!0})}function Zt(e,t,n,r,s=!1){if(n.length===0)return P({state:e});let o=n.indexOf(e[t]??n[0]??""),i=Pe(o===-1?0:o+r,0,n.length-1),c=n[i]??null;return c===e[t]?P({state:e}):P({state:{...e,[t]:c,actionMessage:null},changed:!0,refreshInspection:s})}function eu(e,t,n){let r=t.indexOf(e);return t[Pe(r+n,0,t.length-1)]??e}function P(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,refreshPullRequestChecks:e.refreshPullRequestChecks??!1,closeTask:e.closeTask??!1,removeWorkspace:e.removeWorkspace??!1,refreshInspection:e.refreshInspection??!1}}function Pt(e,t,n){return t.includes(e??"")?e:n}function tu(e){return e==="tabs"?"center":Pt(e,Wd,"tasks")}function nu(e,t){return e==="checks"||e==="actions"||e==="review"?"review":Pt(e,oi,t)}function ru(e){return e==="file"||e==="diff"?e:null}function su(e){return e==="terminal"?"terminal":"agent"}function ou(e){return e==="terminal"?"terminal":"control"}function iu(e,t=[...W],n="codex"){return e&&Qe(e)&&t.includes(e)?e:n}function kr(e,t=W){let n=t.length>0?t:W,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function bt(e){let t=W.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function au(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":bt(e.activeTab)??e.preferredPtyTabKind}function cu(e,t,n){if(!e)return{activeTab:t===$?t:"agent",selectedPtyTabId:null};let r=e.ptyTabs.find(c=>c.id===n)??null,s=e.selectedPtyTabId?e.ptyTabs.find(c=>c.id===e.selectedPtyTabId)??null:null,o=e.ptyTabs.find(c=>c.id===t)??null;if(o)return{activeTab:o.id,selectedPtyTabId:o.id};if(ui(t)){let l=e.ptyTabs.find(d=>d.kind===t)??null??s??r??e.ptyTabs[0]??null;return{activeTab:l?.id??$,selectedPtyTabId:l?.id??null}}if(t===$)return{activeTab:$,selectedPtyTabId:r?.id??s?.id??e.ptyTabs[0]?.id??null};let i=s??r??e.ptyTabs[0]??null;return{activeTab:i?.id??$,selectedPtyTabId:i?.id??null}}function lu(e,t,n){if(!t.inspection||t.inspection.taskId!==n)return{selectedFileTreePath:e.selectedFileTreePath,collapsedFileTreePaths:e.collapsedFileTreePaths};let r=e.selectedFileTreePath??t.inspection.selectedFilePath,s=e.selectedFileTreePath===null&&e.collapsedFileTreePaths.length===0?du(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function du(e,t){let n=new Set;if(t){let r=t.split("/");for(let s=1;s<r.length;s+=1)n.add(r.slice(0,s).join("/"))}return e.filter(r=>r.kind==="directory"&&!r.path.includes("/")&&!n.has(r.path)).map(r=>r.path).sort((r,s)=>r.localeCompare(s))}function uu(e){return[e.selectedPtyTabId,e.openInspectionKind?$:null].filter(t=>typeof t=="string")}function ei(e,t){return t.includes(e)}function fu(e,t){let n=pu(t);return e.selectedLeftItemId&&n.includes(e.selectedLeftItemId)?e.selectedLeftItemId:e.selectedWorkspaceId&&n.includes(`workspace:${e.selectedWorkspaceId}`)?`workspace:${e.selectedWorkspaceId}`:e.selectedTaskId&&n.includes(`task:${e.selectedTaskId}`)?`task:${e.selectedTaskId}`:e.selectedRepoId&&n.includes(`repo:${e.selectedRepoId}`)?`repo:${e.selectedRepoId}`:n[0]??null}function pu(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let r of e.tasks.filter(s=>s.workspaceId===n.id))t.push(`task:${r.id}`);n.kind==="project"&&t.push(`new-task-workspace:${n.id}`),n.kind==="repo"&&t.push(`new-task:${n.primaryRepoId}`)}else for(let n of e.repos){t.push(`repo:${n.id}`);for(let r of e.tasks.filter(s=>s.repoId===n.id))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function gi(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 xe(e){return typeof e=="string"?e:null}function mu(e){return e?`task:${e}`:null}function en(e){return typeof e=="string"&&e.startsWith("task:")}function gr(e){return typeof e=="string"&&e.startsWith("new-task:")}function hr(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function gu(e){return typeof e=="string"&&e.startsWith("workspace:")}function hi(e){return gr(e)?e.slice(9):null}function wi(e){return hr(e)?e.slice(19):null}function Pe(e,t,n){return Math.min(n,Math.max(t,e))}var sn="empty",q={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function bi(e,t){let n=ku(t,e),r=t.repos.find(T=>T.id===e.selectedRepoId)??t.repos[0]??null,s=n?t.tasks.filter(T=>T.workspaceId===n.id):t.tasks,o=n?.kind==="project"?s:r?s.filter(T=>T.repoId===r.id):[],i=o.find(T=>T.id===e.selectedTaskId)??o[0]??null,c=i?.type==="project",l=nf(t.tasks),d=yu(e,i),f=Tu(e,i,d),g=f.find(T=>T.id===d)??f[0]??{id:"agent",label:"CODEX"},R=t.inspection?.taskId===i?.id?t.inspection:null,k=r?.name??"no repo",I=i?se(i.runner):se(e.selectedRunner);return{inputMode:e.inputMode,modalInput:e.taskPromptInput!==null||e.workspaceBrowser!==null,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,footerToast:e.footerToast,terminal:e.terminal,footerText:e.workspaceBrowser!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} / search \u2191\u2193 move \u2192 open \u2190 up Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK ${r?`[${r.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`:en(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"?i===null?"n new task Tab tasks Esc pause ? help":d===$?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${se(e.centerTabRunner??i?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?c?"\u2191\u2193 targets Wheel/PgUp/PgDn scroll R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"Wheel/PgUp/PgDn scroll R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?"/ search \u2191\u2193 navigate Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:St.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${St.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:I},leftTree:hu(e,t),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(T=>rf(T,l[T])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":g.label,taskId:e.workspaceBrowser?"new workspace":i?.id??"no task",repo:k,agent:I},centerTranscript:Ru(d,e,r,i,e.workspaceBrowser,R,n),tabs:f,rightContext:tf(r,i),rightInspection:Mu(e,i,R)}}function hu(e,t){let n=[{text:"WORKSPACES",muted:!0,panelHeader:!0,focused:e.focusedRegion==="tasks"}];if(!t.workspaces)return wu(n,e,t.repos,t.tasks);let r=t.workspaces;if(r.length===0)n.push({text:"No workspaces registered.",indent:2,muted:!0});else for(let o of r){let i=e.selectedLeftItemId===`workspace:${o.id}`;n.push({id:`workspace:${o.id}`,text:`${o.kind==="project"?"\u2261":"\u2013"} ${o.name??o.id}`,selected:i,focused:i&&e.focusedRegion==="tasks"});let c=o.kind==="project"?o.discoveredRepoIds??[]:[o.primaryRepoId],l=t.tasks.filter(d=>d.workspaceId===o.id);if(l.length===0)n.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let d of l){let f=e.selectedLeftItemId===`task:${d.id}`,g=f?"\u25B8":"\u2022",R=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,k={id:`task:${d.id}`,taskId:d.id,text:`${g} ${R}`,indent:2,selected:f,focused:f&&e.focusedRegion==="tasks"},I=Ii(d);I&&(k.prBadge=I),n.push(k)}if(o.kind==="project"){let d=`new-task-workspace:${o.id}`,f=e.selectedLeftItemId===d;n.push({id:d,text:`+ New Project Task [${se(e.selectedRunner)}]`,indent:2,selected:f,focused:f&&e.focusedRegion==="tasks",muted:!f})}if(o.kind==="repo"){let d=`new-task:${o.primaryRepoId}`,f=e.selectedLeftItemId===d;n.push({id:d,text:`+ New Task [${se(e.selectedRunner)}]`,indent:2,selected:f,focused:f&&e.focusedRegion==="tasks",muted:!f})}else{n.push({text:` Repos (${c.length})`,indent:0,muted:!0});for(let d of c.slice(0,6)){let f=t.repos.find(g=>g.id===d);n.push({text:` \xB7 ${f?.name??d}`,indent:0,muted:!0})}c.length>6&&n.push({text:` \xB7 ${c.length-6} more`,indent:0,muted:!0})}}let s=e.selectedLeftItemId==="new-workspace";return n.push({text:"",muted:!0}),n.push({id:"new-workspace",text:"+ New Workspace",selected:s,focused:s&&e.focusedRegion==="tasks"}),n}function wu(e,t,n,r){if(n.length===0)e.push({text:"No repos registered.",indent:2,muted:!0});else for(let o of n){let i=t.selectedLeftItemId===`repo:${o.id}`;e.push({id:`repo:${o.id}`,text:`\u2013 ${o.name}`,selected:i,focused:i&&t.focusedRegion==="tasks"});let c=r.filter(f=>f.repoId===o.id);if(c.length===0)e.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let f of c){let g=t.selectedLeftItemId===`task:${f.id}`,R=g?"\u25B8":"\u2022",k=f.title.length>28?`${f.title.slice(0,25)}\u2026`:f.title,I={id:`task:${f.id}`,taskId:f.id,text:`${R} ${k}`,indent:2,selected:g,focused:g&&t.focusedRegion==="tasks"},T=Ii(f);T&&(I.prBadge=T),e.push(I)}let l=`new-task:${o.id}`,d=t.selectedLeftItemId===l;e.push({id:l,text:`+ New Task [${se(t.selectedRunner)}]`,indent:2,selected:d,focused:d&&t.focusedRegion==="tasks",muted:!d})}let s=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:s,focused:s&&t.focusedRegion==="tasks"}),e}function ku(e,t){let n=e.workspaces??[];if(!e.workspaces)return null;let r=e.tasks.find(s=>s.id===t.selectedTaskId)??null;return r?n.find(s=>s.id===r.workspaceId)??null:t.selectedWorkspaceId?n.find(s=>s.id===t.selectedWorkspaceId)??null:n[0]??null}function Ru(e,t,n,r,s,o=null,i=null){if(s){let l=Ju(s),d=s.query!==null?`Search: ${s.query}`:"",f=l.length===0?[{text:"No directories or git repos here.",tone:"muted"}]:l.map((g,R)=>{let k=R===s.selectedIndex?"\u25B8":" ",I=g.kind==="repo"?" [git repo]":"/";return{text:`${k} ${g.name}${I}`,tone:R===s.selectedIndex?"selected":"default"}});return[{text:"Browse for a workspace to register."},{text:s.cwd,tone:"muted"},{text:d,tone:"muted"},{text:""},...f,{text:""},{text:s.error??"Use / to search, \u2191\u2193 to move, \u2192 or Enter to open, \u2190 to go up, Enter on a git repo to add it.",tone:s.error?"default":"muted"}]}if(!n)return Se(["No repos registered yet.","","Run `craig repo add <path>` in command mode, then reopen the shell."]);if(!r){let l=i?.kind==="project",d=l?i.name??"this workspace":n.name,f=l?"Project Task":"Task";return Se([`No tasks in ${d}.`,"",`Press n or choose + New ${f} to create one with ${se(t.selectedRunner)}.`])}let c=r.ptyTabs.find(l=>l.id===e)??null;return c?c.kind==="agent"?Se([`${c.title} tab ready for ${r.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."]):Se([`${c.title} tab ready for ${r.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===$&&t.openInspectionKind==="file"?Su(r,o,t.fileScrollOffset):e===$&&t.openInspectionKind==="diff"?Iu(r,o,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?Se(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):Se(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function Tu(e,t,n){let r=t?.ptyTabs.map(o=>({id:o.id,label:Pu(o)}))??[];if(!t)return[{id:sn,label:"EMPTY",active:n===sn,focused:e.focusedRegion==="center"&&n===sn}];let s=e.openInspectionKind||n===$?[{id:$,label:bu(e)}]:[];return[...r,...s].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function yu(e,t){return t?t.ptyTabs.some(n=>n.id===e.activeTab)||e.activeTab===$&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??$:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??$:sn}function Pu(e){return e.title.toUpperCase()}function bu(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?St.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function Su(e,t,n){if(!e)return Se(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return Se(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=Si(r.path??r.title);return[{text:r.title},{text:`${r.byteLength===null?"size unknown":`${r.byteLength} bytes`} \xB7 ${r.lines.length} lines \xB7 PgUp/PgDn or wheel scroll`,tone:"muted"},{text:""},...Cu(r.lines,n,s)]}function Iu(e,t,n){if(!e)return Se(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return Se(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=Si(r.path??r.title);return[{text:r.title},{text:`${t.diffPaths.length} changed files \xB7 ${r.lines.length} rows \xB7 PgUp/PgDn or wheel scroll`,tone:"muted"},{text:""},...xu(r.lines,n,s)]}function Se(e){return e.map(t=>({text:t}))}function Cu(e,t,n){let r=Math.max(3,String(e.length).length),s=Math.max(0,Math.min(t,Math.max(0,e.length-1)));return e.slice(s).map((o,i)=>{let c=s+i+1;return{text:`${`${String(c).padStart(r," ")} \u2502 `}${o}`,segments:[{text:String(c).padStart(r," "),style:{fg:q.lineNumber}},{text:" \u2502 ",style:{fg:q.gutter}},...Rr(o,n)],tone:"default"}})}function xu(e,t,n){let r=vu(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(o=>Eu(o,n))}function vu(e){let t=[],n=0,r=0;for(let s of e){let o=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/.exec(s);if(o){n=Number.parseInt(o[1]??"0",10),r=Number.parseInt(o[2]??"0",10);continue}if(!(s.startsWith("diff --git")||s.startsWith("index ")||s.startsWith("+++ ")||s.startsWith("--- "))&&!(s==="staged"||s==="unstaged"||s==="untracked")){if(s.startsWith("-")&&!s.startsWith("---")){t.push({oldNumber:n,newNumber:null,marker:"-",text:s.slice(1),kind:"delete"}),n+=1;continue}if(s.startsWith("+")&&!s.startsWith("+++")){t.push({oldNumber:null,newNumber:r,marker:"+",text:s.slice(1),kind:"add"}),r+=1;continue}if(s.startsWith(" ")){if(n===0&&r===0)continue;t.push({oldNumber:n,newNumber:r,marker:" ",text:s.slice(1),kind:"context"}),n+=1,r+=1;continue}}}return t}function Eu(e,t){let n=ki(e.oldNumber),r=ki(e.newNumber),s=e.kind==="delete"?n:r,o=e.kind==="delete"?{bg:"2a1111",fallbackFg:q.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:q.diffAdd}:null,i=`${s} \u2502 ${e.text}`,c=o?$u(Rr(e.text,t),o.bg,o.fallbackFg):Rr(e.text,t),l=o?{fg:q.lineNumber,bg:o.bg}:{fg:q.lineNumber},d=o?{fg:q.gutter,bg:o.bg}:{fg:q.gutter};return{text:i,segments:[{text:s,style:l},{text:" \u2502 ",style:d},...c],fullBleed:o!==null}}function ki(e){return e===null?" ":String(e).padStart(4," ")}function Si(e){let t=St.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 Rr(e,t){return t==="diff"?Au(e):t==="markdown"?Du(e):t==="json"?Tr(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?Tr(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 Au(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:q.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:q.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:q.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:q.diffMeta}}]:[{text:e}]}function $u(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function Du(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:q.markup,bold:!0}}]:Tr(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function Tr(e,t){let n=[],r=0;for(let s of e.matchAll(t)){let o=s[0],i=s.index??0;i>r&&n.push({text:e.slice(r,i)}),n.push({text:o,style:Lu(o)}),r=i+o.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function Lu(e){return e.startsWith("//")||e.startsWith("/*")?{fg:q.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:q.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:q.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:q.markup}:{fg:q.keyword}}function Mu(e,t,n){let r=e.selectedProjectTargetId??t?.repoTargets?.[0]?.repoId??null,s=t?.type==="project"&&r?t.repoTargets?.find(c=>c.repoId===r)??null:null,o=t?.type==="project"?Ci(t.repoTargets??[]):s?.pullRequest??(t?K(t):null),i=[Ou(e,o),{id:"mode-spacer",text:"",muted:!0}];return e.inspectionMode==="review"?{title:"",rows:[...i,...Ei(e,t)]}:e.inspectionMode==="files"?{title:"",rows:[...i,...zu(e,n)]}:{title:"",rows:[...i,...Xu(e,n)]}}function Ou(e,t){let n=e.inspectionMode,r=[{label:"CHANGES",active:n==="diff"},{label:"FILES",active:n==="files"},{label:"REVIEW",active:n==="review"}],s=[];for(let l=0;l<r.length;l++){let d=r[l];l>0&&s.push({text:" "});let f=d.active?e.focusedRegion==="inspector"||e.focusedRegion==="actions"?"9ece6a":"7aa2f7":"565f89";s.push({text:d.label,style:{fg:f}})}let o=yr(t),i=Pr(t);return s.push({text:" "},o,{text:" "},i),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function Ri(e){return[{text:" "},yr(e),{text:" "},Pr(e)]}function Ii(e){if(e.type==="project"&&e.repoTargets?.length){let n=Ci(e.repoTargets);return n?Ri(n):null}let t=K(e);return t?.number?Ri(t):null}function Ci(e){let t=e.filter(s=>s.status==="ready"),n=t.map(s=>s.pullRequest).filter(s=>!!s.number);if(n.length===0)return null;let r=ju(n);return{number:-1,status:Fu(n),draft:n.some(s=>s.draft),mergeable:n.length===t.length&&n.every(s=>s.mergeable),mergeStateStatus:null,reviewDecision:n.some(s=>s.reviewDecision==="CHANGES_REQUESTED")?"CHANGES_REQUESTED":n.some(s=>s.reviewDecision==="REVIEW_REQUIRED")?"REVIEW_REQUIRED":n.every(s=>s.reviewDecision==="APPROVED")?"APPROVED":null,requiredChecks:n.flatMap(s=>s.requiredChecks),aggregateReadiness:r}}function Fu(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 ju(e){let t=e.map(n=>xi(n));return t.some(n=>n==="failed")?"failed":t.some(n=>n==="pending")?"pending":t.length>0&&t.every(n=>n==="success")?"success":"none"}function yr(e){return!e||!e.number?{text:Uo,style:{fg:"565f89"}}:e.status==="merged"?{text:Ko,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:Vo,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:lr,style:{fg:"565f89"}}:{text:lr,style:{fg:"9ece6a"}}}function Pr(e){return e?.aggregateReadiness?Ti(e.aggregateReadiness):Ti(xi(e))}function Ti(e){return e==="failed"?{text:pr,style:{fg:"f7768e"}}:e==="pending"?{text:ur,style:{fg:"e0af68"}}:e==="success"?{text:fr,style:{fg:"9ece6a"}}:{text:dr,style:{fg:"565f89"}}}function xi(e){let t=e?.requiredChecks??null;return e?.status==="merged"?"success":e?.status==="closed"||!e?.number||!t||t.length===0?"none":t.some(n=>n.status==="failed")||e.reviewDecision==="CHANGES_REQUESTED"?"failed":t.every(n=>n.status==="success"||n.status==="skipped")?vi(e)?"failed":Nu(e)?"success":"pending":"pending"}function Nu(e){return!!(e.mergeable&&!e.draft&&!vi(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function vi(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function Ei(e,t){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return Wu(e,t);let n=K(t),r=$i("pr",t.branch,n??{number:null,url:null,baseBranch:null,headBranch:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,lastSyncedAt:null,requiredChecks:[],comments:[]}),s=t.prs.filter(o=>o!==n&&(o.status==="merged"||o.status==="closed")).length;return s>0&&r.push({id:"pr-history",text:`+ ${s} previous PR${s!==1?"s":""}`,muted:!0}),_u(r,e)}var rn=32;function Wu(e,t){let n=[],r=t.repoTargets??[],s=e.selectedProjectTargetId??r[0]?.repoId??null;for(let i of r){let c=s===i.repoId,l=e.focusedRegion==="inspector"&&c,d=i.repoId.startsWith("repo_")?i.repoId.slice(5):i.repoId;if(i.status!=="ready"){let g=i.failureReason?i.failureReason.slice(0,14):i.status,R=rn-g.length-1,k=d.length>R?d.slice(0,R-1)+"\u2026":d,I=rn-k.length-g.length;n.push({id:`project-review:${i.repoId}`,text:k+" ".repeat(Math.max(1,I))+g,selected:c,focused:l,muted:!0})}else{let f=yr(i.pullRequest),g=Pr(i.pullRequest),R=`${f.text} ${g.text}`,k=rn-R.length-1,I=d.length>k?d.slice(0,k-1)+"\u2026":d,T=rn-I.length-R.length,a=I+" ".repeat(Math.max(1,T));n.push({id:`project-review:${i.repoId}`,text:a+R,selected:c,focused:l,segments:[{text:a},{...f,text:f.text},{text:" "},{...g,text:g.text}]})}}let o=r.find(i=>i.repoId===s)??null;return o?.status==="ready"&&o.pullRequest.number&&(n.push({id:"target-detail-spacer",text:""}),n.push(...$i("target",o.branch,o.pullRequest))),n}function Ai(e,t){return Ei(e,t).length}function $i(e,t,n){let r=g=>`${e}-${g}`;if(!n.number)return[{id:r("no-pr"),text:t,muted:!0}];let s=[],o=`#${n.number}`;s.push(n.url?{id:r("pr-number"),text:`${o} Open in GitHub \u2197`,segments:[{text:o},{text:" Open in GitHub \u2197",style:{fg:"7aa2f7",underline:!0},href:n.url}]}:{id:r("pr-number"),text:o});let i=n.baseBranch??"?",c=n.headBranch??t;s.push({id:r("pr-branches"),text:`${i} \u2192 ${c}`,muted:!0});let l=Bu(n.reviewDecision,n.mergeStateStatus),d=l&&l!=="review approved"?"merge blocked":n.mergeable?"merge ready":n.mergeStateStatus?`merge ${n.mergeStateStatus}`:"merge unknown";l?s.push({id:r("pr-merge"),text:`${d} \xB7 ${l}`,muted:!0,segments:[{text:d},{text:" \xB7 "},{text:l,style:{fg:qu(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:d,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${Di(n.lastSyncedAt)}`,muted:!0}),s.push({id:r("checks-spacer"),text:""}),s.push({id:r("checks-header"),text:"Checks"}),n.requiredChecks.length?s.push(...n.requiredChecks.map(Uu)):s.push({id:r("checks-none"),text:n.number?"No GitHub checks reported.":"No checks \u2014 sync after creating a PR.",muted:!0});let f=n.comments??[];return f.length>0&&(s.push({id:r("comments-spacer"),text:""}),s.push({id:r("comments-header"),text:`Review comments (${f.length})`}),s.push(...f.slice(-4).flatMap((g,R)=>Ku(g,r(`comment:${R}`))))),s}function _u(e,t){if(t.focusedRegion!=="inspector"||t.inspectionMode!=="review"||e.length===0)return e;let n=Math.max(0,Math.min(t.reviewScrollOffset,e.length-1));return e.map((r,s)=>({...r,selected:t.reviewScrollOffset===0&&r.selected||s===n,focused:t.reviewScrollOffset===0&&r.focused||s===n}))}function Bu(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function qu(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function Di(e){if(!e)return"--";let t=Date.now()-new Date(e).getTime(),n=Math.floor(t/1e3);if(n<60)return`${n}s ago`;let r=Math.floor(n/60);if(r<60)return`${r}m ago`;let s=Math.floor(r/60);return s<24?`${s}h ago`:`${Math.floor(s/24)}d ago`}function Uu(e){let{icon:t,color:n}=Gu(e.status),r=e.name.length>16?`${e.name.slice(0,15)}\u2026`:e.name;return{id:`pr-check:${e.name}`,text:`${t} ${r.padEnd(16," ")} ${Hu(e.status)}`,color:n,muted:!1}}function Ku(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${Di(e.createdAt)}`:"",s=Vu(e.body,30),o=s.slice(0,4),i=o.length<s.length,c=[{id:`${t}:author`,text:`${n}${r}`,muted:!0},...o.map((l,d)=>({id:`${t}:body:${d}`,text:` ${i&&d===o.length-1?`${l}\u2026`:l}`,muted:!0}))];return c.push({id:`${t}:spacer`,text:"",muted:!0}),c}function Vu(e,t){let n=e.split(/\s+/).filter(Boolean);if(n.length===0)return[];let r=[],s="";for(let o of n){if(!s){s=o;continue}`${s} ${o}`.length<=t?s=`${s} ${o}`:(r.push(s),s=o)}return s&&r.push(s),r}function Gu(e){switch(e){case"success":return{icon:fr,color:"9ece6a"};case"pending":return{icon:ur,color:"e0af68"};case"failed":return{icon:pr,color:"f7768e"};case"skipped":return{icon:dr,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function Hu(e){return e==="success"?"passing":e==="failed"?"failing":e}function zu(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 n=new Map(t.diffRows.map(c=>[c.path,c.status])),r=e.fileSearchQuery!==null,s=r?Qu(t.fileRows,e.fileSearchQuery??""):Yu(t.fileRows,e.collapsedFileTreePaths),o=e.selectedFileTreePath??t.selectedFilePath,i=s.map(c=>{let l=c.kind==="file"?n.get(c.path):void 0,d=l==="A"?"9ece6a":l==="M"?"e0af68":l==="D"?"f7768e":l==="??"?"565f89":void 0,f=c.kind==="directory"?e.collapsedFileTreePaths.includes(c.path)?Bo:qo:_o(c.label),g=c.kind==="file"?Go(c.label):void 0,R=r?"":" ".repeat(c.depth),k=r&&c.kind==="file"?c.path:c.label,a=[{text:R},g?{text:f,style:{fg:g}}:{text:f},d?{text:k,style:{fg:d}}:{text:k}];return{id:c.path,text:`${R}${f}${k}`,selected:c.path===o,focused:c.path===o&&e.focusedRegion==="inspector",muted:!r&&c.kind==="directory",segments:a}});return[{id:"file-search",text:r?`Search: ${e.fileSearchQuery}`:"",muted:!0},...r&&i.length===0?[{id:"file-search-empty",text:"No matching files.",muted:!0}]:i]}function Yu(e,t){let n=new Set(t);return e.filter(r=>{let s=r.path.split("/");for(let o=1;o<s.length;o+=1)if(n.has(s.slice(0,o).join("/")))return!1;return!0})}function Qu(e,t){let n=t.trim().toLowerCase(),r=e.filter(s=>s.kind==="file");return n?r.filter(s=>s.path.toLowerCase().includes(n)||s.label.toLowerCase().includes(n)).sort((s,o)=>yi(s,n)-yi(o,n)||s.path.localeCompare(o.path)):r}function yi(e,t){let n=e.path.toLowerCase(),r=e.label.toLowerCase();return r===t?0:r.startsWith(t)?1:r.includes(t)?2:n.startsWith(t)?3:4}function Ju(e){let t=(e.query??"").trim().toLowerCase();return t?e.entries.filter(n=>n.name.toLowerCase().includes(t)||n.path.toLowerCase().includes(t)).sort((n,r)=>Pi(n,t)-Pi(r,t)||n.name.localeCompare(r.name)):e.entries}function Pi(e,t){let n=e.name.toLowerCase(),r=e.path.toLowerCase();return e.kind==="repo"&&n===t?0:e.kind==="repo"&&n.startsWith(t)?1:n===t?2:n.startsWith(t)?3:n.includes(t)?4:r.startsWith(t)?5:6}function Xu(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(s=>s.startsWith("repo_"))?"No changes in project task worktrees. Edits in the original repos are outside this task.":"No local changes.",muted:!0}];if(Zu(t))return ef(e,t);let n=[];for(let r of["branch","staged","unstaged","untracked"]){let s=t.diffRows.filter(o=>o.group===r);s.length!==0&&(n.push({id:r,text:r.toUpperCase(),muted:!0}),n.push(...s.map(o=>Li(o,e,t))))}return n}function Zu(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function ef(e,t){let n=[],r=[...new Set(t.diffRows.map(s=>s.path.split("/")[0]).filter(s=>typeof s=="string"&&s.length>0))].sort();for(let s of r){let o=t.diffRows.filter(c=>c.path.startsWith(`${s}/`)),i=s.startsWith("repo_")?s.slice(5):s;n.push({id:`repo-diff:${s}`,text:i,muted:!0});for(let c of["branch","staged","unstaged","untracked"]){let l=o.filter(d=>d.group===c);l.length!==0&&(n.push({id:`repo-diff:${s}:${c}`,text:` ${c}`,muted:!0}),n.push(...l.map(d=>Li(d,e,t,s.length+1))))}}return n}function Li(e,t,n,r=0){let s=e.additions===null?"-":`+${e.additions}`,o=e.deletions===null?"-":`-${e.deletions}`,i=e.status==="A"||e.group==="untracked"?"9ece6a":e.status==="D"?"f7768e":"e0af68",c=r>0?e.path.slice(r):e.path;return{id:`${e.group}:${e.path}`,text:` ${e.status.padEnd(2," ")} ${c} ${s}/${o}`,selected:e.path===(t.selectedDiffPath??n.selectedDiffPath),focused:e.path===(t.selectedDiffPath??n.selectedDiffPath)&&t.focusedRegion==="inspector",color:i}}function tf(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:St.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 nf(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0})}function rf(e,t){return{name:se(e).toLowerCase(),health:t>0?1:0,count:String(t)}}var on={width:120,height:36},me={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function Fe(e,t){return{width:Math.max(e??on.width,on.width),height:Math.max(t??on.height,on.height)}}import{spawn as xf}from"node:child_process";import{createHash as vf}from"node:crypto";import{createServer as Ef,createConnection as qi}from"node:net";import{openSync as Af}from"node:fs";import{mkdir as $f,readFile as Er,rm as ze,writeFile as Df}from"node:fs/promises";import{tmpdir as Lf}from"node:os";import nt from"node:path";import{createRequire as mf}from"node:module";import sf from"@xterm/headless";var of=1e3,af=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function Oi(e){return new sf.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:of,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}})}function Fi(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function Sr(e,t){return new Promise(n=>{e.write(t,n)})}function ji(e,t=0){let n=e.buffer.active,r=[],s=n.getNullCell(),o=n.baseY+n.cursorY,i=Math.max(0,n.baseY-t);for(let c=0;c<e.rows;c+=1){let l=n.getLine(i+c);if(!l){r.push({segments:[]});continue}let d=[];for(let f=0;f<e.cols;f+=1){let g=l.getCell(f,s);!g||g.getWidth()===0||d.push({text:g.getChars()||" ",style:df(g,i+c===o&&f===n.cursorX)})}r.push({segments:cf(lf(d))})}return r}function cf(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&pf(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};Ni(n.style)||(s.style=n.style),t.push(s)}return t}function lf(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||!Ni(n.style))break;t-=1}return e.slice(0,t)}function df(e,t){let n={},r=Mi(e,"fg"),s=Mi(e,"bg");return r&&(n.fg=r),s&&(n.bg=s),e.isBold()&&(n.bold=!0),e.isDim()&&(n.dim=!0),e.isItalic()&&(n.italic=!0),e.isUnderline()&&(n.underline=!0),(e.isInverse()||t)&&(n.inverse=!0),n}function Mi(e,t){if(t==="fg"?e.isFgDefault():e.isBgDefault())return;let r=t==="fg"?e.isFgRGB():e.isBgRGB(),s=t==="fg"?e.getFgColor():e.getBgColor();return r?s.toString(16).padStart(6,"0"):af[s]??uf(s)}function uf(e){if(e>=16&&e<=231){let t=e-16,n=Math.floor(t/36),r=Math.floor(t%36/6),s=t%6;return[n,r,s].map(ff).map(o=>o.toString(16).padStart(2,"0")).join("")}if(e>=232&&e<=255){let t=8+(e-232)*10;return[t,t,t].map(n=>n.toString(16).padStart(2,"0")).join("")}return"e6e6e6"}function ff(e){return e===0?0:55+e*40}function pf(e,t){return br(e)===br(t)}function br(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function Ni(e){return br(e)===""}var gf=mf(import.meta.url),hf=/^CTRL_([A-Z])$/,wf="\x1B[6n",kf="\x1B[c",Rf="\x1B[?u",Tf={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
|
|
143
|
+
`,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:""},an=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,n,r,s){let o=this.sessions.get(n);if(o)if(o.status!=="running")Ir(o),this.sessions.delete(n);else return this.attachedTabId=n,o.scrollbackLines=0,Wi(o,r),this.getViewState(n);let i=this.createSession(t,n,r,s);return this.sessions.set(n,i),this.attachedTabId=n,this.getViewState(n)}write(t){let n=this.getAttachedSession();!n||n.status!=="running"||n.pty.write(t)}writeKey(t){let n=yf(t);n!==null&&this.write(n)}scrollViewport(t){let n=this.getAttachedSession();if(!n||t===0)return;let r=n.terminal.buffer.active.baseY;n.scrollbackLines=Math.max(0,Math.min(r,n.scrollbackLines-t))}resize(t){let n=this.getAttachedSession();n&&Wi(n,t)}detach(){this.attachedTabId=null}sessionTabIds(){return[...this.sessions.keys()]}disposeSession(t){let n=this.sessions.get(t);n&&(Ir(n),this.sessions.delete(t),this.attachedTabId===t&&(this.attachedTabId=null))}disposeAll(){for(let t of this.sessions.values())Ir(t);this.sessions.clear(),this.attachedTabId=null}getViewState(t){if(!t)return{status:"idle",rows:[],error:null,scrolledBack:!1};let n=this.sessions.get(t);return n?{status:n.status,rows:ji(n.terminal,n.scrollbackLines),error:n.error,scrolledBack:n.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}createSession(t,n,r,s){let o=this.spawn??bf().spawn,i=Oi(r),c=s??this.resolveSessionSpec(t,n),l=qe({...this.env,...c.env??{}}),{executable:d,args:f}=Sf(this.shell,c.command,{cwd:c.cwd,env:l}),g=o(d,f,{name:"xterm-256color",cols:r.columns,rows:r.rows,cwd:c.cwd,env:If(l)}),R={taskId:t,tabId:n,pty:g,terminal:i,status:"running",error:null,disposables:[],scrollbackLines:0};return R.disposables.push(g.onData(k=>{Cf(g,k),Sr(R.terminal,k).then(()=>{this.onUpdate?.(R.tabId)})})),R.disposables.push(g.onExit(k=>{R.status="exited",Sr(R.terminal,`\r
|
|
144
|
+
[process exited ${k.exitCode}]`).then(()=>{this.onUpdate?.(R.tabId)})})),R}getAttachedSession(){return this.attachedTabId?this.sessions.get(this.attachedTabId)??null:null}};function yf(e){if(e.length===1)return e;let t=Tf[e];if(t!==void 0)return t;let n=hf.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function Wi(e,t){Pf(e.pty,t),Fi(e.terminal,t)}function Ir(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function Pf(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function bf(){return gf("node-pty")}function Sf(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[Ue(t[0],n),...t.slice(1)].map(_i).join(" ")}; exec ${_i(e)} -l`;return{executable:e,args:["-lc",s]}}function _i(e){return`'${e.replaceAll("'","'\\''")}'`}function If(e){let t={};for(let[n,r]of Object.entries(e))typeof r=="string"&&(t[n]=r);return t.TERM=t.TERM??"xterm-256color",t}function Cf(e,t){for(let n=0;n<Cr(t,wf);n+=1)e.write("\x1B[1;1R");for(let n=0;n<Cr(t,kf);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<Cr(t,Rf);n+=1)e.write("\x1B[?0u")}function Cr(e,t){if(t.length===0)return 0;let n=0,r=e.indexOf(t);for(;r!==-1;)n+=1,r=e.indexOf(t,r+t.length);return n}var Ar=3;async function Ui(e){let t=$r(e.paths);await Mf(t,e.paths,e.spawnDaemon);let n=await Yi(t.socketPath),r=new xr(n,e);return await r.ready(),r}async function Ki(e,t={}){let n=$r(e);await $f(e.runtimeDir,{recursive:!0}),await ze(n.socketPath,{force:!0});let r=new vr(e,t),s=Ef(o=>r.handleConnection(o));await _f(s,n.socketPath),await Df(n.pidPath,String(process.pid),"utf8"),await new Promise(o=>{let i=()=>{r.closeClients(),s.close(()=>o())};r.onShutdown=i,process.once("SIGTERM",i),process.once("SIGINT",i)}),await ze(n.socketPath,{force:!0}),await ze(n.pidPath,{force:!0}),r.disposeAll()}async function Vi(e){let t=$r(e);return await ln(t.socketPath)?(await Hi(t.socketPath),!0):!1}var xr=class{constructor(t,n){this.socket=t;this.options=n,t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),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!==Ar)throw new Error("Craig PTY daemon protocol mismatch.")}async ensureSession(t,n,r){let s=await this.send({type:"ensureSession",taskId:t,tabId:n,size:r,spec:this.options.resolveSessionSpec?.(t,n)??{cwd:this.options.workspaceRoot,command:[]}});this.attachedTabId=n;let o=s.view??{status:"idle",rows:[],error:null};return this.viewCache.set(n,o),o}async hydrateSessions(t){for(let n of t)try{let r=await this.send({type:"hydrateSession",tabId:n});r.view&&this.viewCache.set(n,r.view)}catch(r){let s=r instanceof Error?r.message:String(r);this.viewCache.set(n,{status:"failed",rows:[],error:s})}}async pruneStale(t){await this.send({type:"pruneStale",keepTabIds:t})}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(n=>{this.attachedTabId&&n.view&&this.viewCache.set(this.attachedTabId,n.view)}).catch(()=>{})}resize(t){this.send({type:"resize",size:t}).then(n=>{this.attachedTabId&&n.view&&this.viewCache.set(this.attachedTabId,n.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 n=this.nextRequestId;this.nextRequestId+=1;let r={...t,id:n},s=new Promise((i,c)=>{this.pending.set(n,{resolve:i,reject:c})});if(this.socket.destroyed)throw this.pending.delete(n),new Error("Craig PTY daemon connection is closed.");this.socket.write(`${JSON.stringify(r)}
|
|
145
145
|
`);let o=await s;if(!o.ok)throw new Error(o.error);return o}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
|
|
146
146
|
`);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
|
|
147
|
-
`)}}handleMessage(t){if(t.trim().length===0)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n){let r=this.pending.get(n.id);if(!r)return;this.pending.delete(n.id),r.resolve(n);return}n.type==="update"&&(n.tabId&&this.viewCache.set(n.tabId,n.view),this.options.onUpdate?.(n.tabId??""))}rejectAll(t){for(let n of this.pending.values())n.reject(t);this.pending.clear()}},
|
|
147
|
+
`)}}handleMessage(t){if(t.trim().length===0)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n){let r=this.pending.get(n.id);if(!r)return;this.pending.delete(n.id),r.resolve(n);return}n.type==="update"&&(n.tabId&&this.viewCache.set(n.tabId,n.view),this.options.onUpdate?.(n.tabId??""))}rejectAll(t){for(let n of this.pending.values())n.reject(t);this.pending.clear()}},vr=class{onShutdown=null;clients=new Set;runtime;attachedTabId=null;constructor(t,n){this.runtime=new an({...n,workspaceRoot:t.workspaceRoot,onUpdate:r=>this.broadcastUpdate(r)})}handleConnection(t){let n="";this.clients.add(t),t.setEncoding("utf8"),t.on("data",r=>{n+=String(r);let s=n.indexOf(`
|
|
148
148
|
`);for(;s!==-1;){let o=n.slice(0,s);n=n.slice(s+1),this.handleLine(t,o),s=n.indexOf(`
|
|
149
|
-
`)}}),t.on("close",()=>this.clients.delete(t)),t.on("error",()=>this.clients.delete(t))}disposeAll(){this.runtime.disposeAll()}closeClients(){for(let t of this.clients)t.destroy();this.clients.clear()}async handleLine(t,n){if(n.trim().length===0)return;let r;try{r=JSON.parse(n)}catch{
|
|
150
|
-
${o.slice(-2e3)}`:""}`)}async function
|
|
149
|
+
`)}}),t.on("close",()=>this.clients.delete(t)),t.on("error",()=>this.clients.delete(t))}disposeAll(){this.runtime.disposeAll()}closeClients(){for(let t of this.clients)t.destroy();this.clients.clear()}async handleLine(t,n){if(n.trim().length===0)return;let r;try{r=JSON.parse(n)}catch{cn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=this.handleRequest(r);cn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion:Ar}:{},...s?{view:s}:{}})}catch(s){let o=s instanceof Error?s.message:String(s);cn(t,{id:r.id,ok:!1,error:o})}}handleRequest(t){switch(t.type){case"ping":return null;case"ensureSession":return this.attachedTabId=t.tabId,this.runtime.ensureSession(t.taskId,t.tabId,t.size,t.spec);case"hydrateSession":return this.runtime.getViewState(t.tabId);case"write":return this.runtime.write(t.input),null;case"writeKey":return this.runtime.writeKey(t.key),null;case"scrollViewport":return this.runtime.scrollViewport(t.lines),this.runtime.getViewState(this.attachedTabId);case"resize":return this.runtime.resize(t.size),this.runtime.getViewState(this.attachedTabId);case"detach":return this.runtime.detach(),this.attachedTabId=null,null;case"disposeSession":return this.runtime.disposeSession(t.tabId),this.attachedTabId===t.tabId&&(this.attachedTabId=null),null;case"pruneStale":{let n=new Set(t.keepTabIds);for(let r of this.runtime.sessionTabIds())n.has(r)||(this.runtime.disposeSession(r),this.attachedTabId===r&&(this.attachedTabId=null));return null}case"getViewState":return this.runtime.getViewState(t.tabId);case"shutdown":return setTimeout(()=>this.onShutdown?.(),0),null;default:return Bf(t)}}broadcastUpdate(t){let n=this.runtime.getViewState(t);for(let r of this.clients)cn(r,{type:"update",tabId:t,view:n})}};function $r(e){let t=vf("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:nt.join(Lf(),`craig-${t}.sock`),pidPath:nt.join(e.runtimeDir,"pty-daemon.pid")}}async function Mf(e,t,n){if(await Of(e.socketPath,1e3))return;await ln(e.socketPath)&&(await Hi(e.socketPath),await Bi(e.socketPath,1e3)),await ln(e.socketPath)&&(await Nf(e),await Bi(e.socketPath,1e3)),await jf(e);let r=t.workspaceRoot;if(n)n(r);else{let{command:i,args:c}=Ff(r),l=Af(nt.join(t.runtimeDir,"pty-daemon.log"),"a");xf(i,c,{cwd:r,detached:!0,stdio:["ignore",l,l],env:process.env}).unref()}let s=Date.now();for(;Date.now()-s<5e3;){if(await Gi(e.socketPath))return;await Dr(50)}let o=await Er(nt.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
|
|
150
|
+
${o.slice(-2e3)}`:""}`)}async function Gi(e){let t=await Wf(e).catch(()=>null);return t?.ok===!0&&t.protocolVersion===Ar}async function Of(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await Gi(e))return!0;await Dr(50)}return!1}function Ff(e){let t=process.argv[1];if(t?.endsWith(".ts")){let r=nt.resolve(nt.dirname(t),"..","node_modules",".bin","tsx");return{command:jn("tsx")??r,args:[t,"__craig-daemon",e]}}let n=process.argv.slice(1);return{command:process.execPath,args:[...process.execArgv,...n,"__craig-daemon",e]}}async function jf(e){let t=await Er(e.pidPath,"utf8").catch(()=>null);if(t){let n=Number(t.trim());if(Number.isInteger(n)&&n>0&&Qi(n))return}await ze(e.socketPath,{force:!0}),await ze(e.pidPath,{force:!0})}async function ln(e){let t=await Yi(e).catch(()=>null);return t?(t.end(),!0):!1}async function Hi(e){await zi(e,{id:1,type:"shutdown"}).catch(()=>null)}async function Nf(e){let t=await Er(e.pidPath,"utf8").catch(()=>null),n=Number(t?.trim());if(!Number.isInteger(n)||n<=0||!Qi(n)){await ze(e.socketPath,{force:!0});return}try{process.kill(n,"SIGTERM")}catch{await ze(e.socketPath,{force:!0})}}async function Wf(e){return zi(e,{id:1,type:"ping"})}function zi(e,t){return new Promise((n,r)=>{let s=qi(e),o="",i=setTimeout(()=>{s.destroy(),r(new Error("Craig PTY daemon request timed out."))},500),c=()=>clearTimeout(i);s.setEncoding("utf8"),s.once("connect",()=>s.write(`${JSON.stringify(t)}
|
|
151
151
|
`)),s.once("error",l=>{c(),r(l)}),s.on("data",l=>{o+=String(l);let d=o.indexOf(`
|
|
152
|
-
`);if(d===-1)return;let f=o.slice(0,d);c(),s.end();try{n(JSON.parse(f))}catch(
|
|
153
|
-
`)}catch{}}function
|
|
154
|
-
`)}function
|
|
155
|
-
`)}function
|
|
156
|
-
`)}function
|
|
157
|
-
`)}function Nf(e,t,n,r){let s=Kf(e.runners),o=1,i=e.leftTree.map(l=>Uf(l,t,r));return[...It(i,n-o),s]}function Wf(e,t,n,r){let s=t-2,o=e.tabs.find(C=>C.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:rp(e.tabs),c=e.inputMode==="terminal"?s:o.length+1,l="\u2500".repeat(Math.max(0,c)),d=`${" ".repeat(i)}${e.inputMode==="terminal"?rt(l,r,v.panelBg):pn(l,r,v.panelMuted)}`,f=[`${pn(e.centerHeader.tabLabel,r,v.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),h=e.tabs.find(C=>C.active)?.id??"agent",R=e.centerHeader.tabLabel==="BROWSER"||!oi(h)?e.centerTranscript.map(C=>({...C})):_f(e),k=Vf(e.tabs,r,e.focusedRegion==="center"),I=" engaged ",T=I.length+2,a=e.inputMode==="terminal"?rt(`${I}\u25CF `,r,v.panelBg):"",V=e.inputMode==="terminal"?" ".repeat(Math.max(0,s-X(k)-T)):"",q=[{text:e.inputMode==="terminal"?`${k}${V}${a}`:k},{text:d,tone:"muted"},{text:f},ee(),...R];return It(q,n)}function _f(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},ee(),{text:e.terminal.error},ee(),{text:"Fix the native dependency setup, then re-enter terminal mode."}];let t=e.tabs.find(r=>r.active)?.id??"",n=t==="agent"||/:agent(?:-\d+)?$/.test(t)?"agent":"terminal";return e.terminal.rows.length===0?[{text:`Press Enter on the ${n.toUpperCase()} tab to attach a PTY.`}]:e.terminal.rows.map(r=>({text:na(r.segments),segments:r.segments,fullBleed:!0}))}function Bf(e,t,n,r){let s=e.rightInspection?qf(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,n):It([{text:"CONTEXT"},ee(),...e.rightContext.map(o=>Gf(o,r)),...e.actionMessage?[ee(),{text:e.actionMessage}]:[]],n);return It(s,n)}function qf(e,t){let n=e.slice(0,2),r=e.slice(2),s=Math.max(0,t-n.length),o=r.findIndex(c=>c.focused||c.selected),i=o===-1?0:op(o-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(c=>Ui(c)),...r.slice(i,i+s).map(c=>Ui(c))]}function Ui(e){let t=e.focused?"\u25B8 ":e.selected?"\u2022 ":" ",n=e.focused||e.selected?"selected":e.muted?"muted":"default",r=`${t}${e.text}`;if(e.segments)return{text:r,segments:[{text:t},...e.segments],tone:n};if(e.accentPrefix&&!e.muted){let s=e.text.indexOf(" "),o=s===-1?e.text:e.text.slice(0,s),i=s===-1?"":e.text.slice(s);return{text:r,segments:[{text:t},{text:o,style:{fg:"7aa2f7"}},{text:i}],tone:n}}return e.color?{text:r,segments:[{text:t},{text:e.text,style:{fg:e.color}}],tone:n}:{text:r,tone:n}}function Uf(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",o=e.status?` ${e.status}`:"",i=e.accentDot?` ${rt("\u25CF",n,e.selected?v.panelSelected:v.panelBg)}`:"",c=e.prBadge?e.prBadge.reduce((k,I)=>k+X(I.text),0):0,l=t-X(o)-X(s)-c,d=e.selected?e.text:e.focused?rt(e.text,n,v.panelBg):e.panelHeader?pn(e.text,n,v.panelMuted):e.text,f=Pe(`${r}${d}`,Math.max(0,l)),h=e.selected?"selected":e.muted?"muted":"default";if(e.prBadge){let k=[{text:`${f}${o}${i}`},...e.prBadge];return{text:`${f}${o}${e.prBadge.map(T=>T.text).join("")}`,segments:k,tone:h}}return{text:`${f}${o}${i}`,tone:h}}function Kf(e){let t=e.map(r=>{let s=r.health>=1,o=parseInt(r.count,10),i=o>1?` (${o})`:"";return{text:`${s?"\u25CF":"\u25CB"} ${r.name}${i}`,active:s}}),n=[];for(let r=0;r<t.length;r++){let s=t[r];r>0&&n.push({text:" "}),s.active?n.push({text:s.text,style:{fg:v.success.fg}}):n.push({text:s.text,style:{fg:v.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function Vf(e,t,n){return e.map(r=>r.active?n?rt(r.label,t,v.panelBg):pn(r.label,t,v.panelBg):Mr(r.label,t,v.panelBg)).join(" ")}function Gf(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?Mr(e.value,t,v.panelBg):e.value}`}}function ln(e,t,n,r){let s=Hf(r,e.tone??"default"),o=zf(e,n,s);if(r==="left"){if(e.fullBleed)return O(Pe(o,t),n,s);let c=t-dn-un;if(e.rightAlign){let d=X(o),f=Math.max(0,c-d),h=`${" ".repeat(dn)}${" ".repeat(f)}${o}${" ".repeat(un)}`;return O(h,n,s)}let l=`${" ".repeat(dn)}${Pe(o,c)}${" ".repeat(un)}`;return O(l,n,s)}return r==="center"&&e.fullBleed?Yf(e,t,n,s):O(Pe(` ${o}`,t),n,s)}function Hf(e,t){return t==="selected"||t==="focused"?v.panelSelected:t==="muted"?v.panelMuted:v.panelBg}function It(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(ee());return n}function ee(){return{text:""}}function zf(e,t,n){return e.segments?e.segments.map(r=>Qi(r,t,n)).join(""):e.text}function Yf(e,t,n,r){let s=" ".repeat(fn),o=Math.max(0,t-fn*2);if(!e.segments)return O(`${s}${Pe(e.text,o)}${s}`,n,r);let i=Xf(e.segments,o),c=`${s}${i.map(l=>Qi(l,n,r)).join("")}${s}`;return O(c,n,r)}function Qi(e,t,n){let r=e.href?`${Xi(e.href)}${e.text}${Vi}`:Jf(e.text);return!t||!e.style?r:`${St(tp(e.style,n))}${np(e.style)}${r}${Ar}${St(n)}`}function Jf(e){return e.replace(Of,t=>{let[n,r]=Qf(t);return`${Xi(n)}${n}${Vi}${r}`})}function Qf(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function Xi(e){return`\x1B]8;;${e}\x1B\\`}function Xf(e,t){let n=Zf(e,t);return ep(n,t)}function Zf(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let o=X(s.text);if(o<=r){n.push(s),r-=o;continue}let i=mn(s.text,r);i.length>0&&n.push({...s,text:i}),r=0}return n}function ep(e,t){let n=X(na(e));if(n>=t)return e;let r=e.at(-1)?.style;return r?.bg?[...e,{text:" ".repeat(t-n),style:r}]:[...e,{text:" ".repeat(t-n)}]}function tp(e,t){let n=e.inverse?e.bg??t.bg:e.fg,r=e.inverse?e.fg??t.fg:e.bg,s={},o=n??t.fg,i=r??t.bg;return o&&(s.fg=o),i&&(s.bg=i),s}function np(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 rp(e){let t=0;for(let n of e){if(n.active)return t;t+=n.label.length+3}return 0}function Zi(e,t){let n=Math.max(0,t-X(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function Pe(e,t){let n=X(e);return n>=t?sp(e,t):e+" ".repeat(t-n)}function sp(e,t){if(t<=0)return"";if(X(e)<=t)return e;let n=ta(e);return mn(n,Math.max(0,t-1))+"\u2026"}function X(e){let t=0;for(let n of Array.from(ta(e)))t+=ea(n);return t}function mn(e,t){let n="",r=0;for(let s of Array.from(e)){let o=ea(s);if(r+o>t)break;n+=s,r+=o}return n}function ea(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 op(e,t,n){return Math.min(Math.max(e,t),n)}function ta(e){return e.replace(Lf,"").replace(Df,"")}function na(e){return e.map(t=>t.text).join("")}function O(e,t,n){if(!t)return e;let r=St(n),s=e.replace(Mf,`${Ar}${r}`);return`${r}${s}${Ar}`}function St(e){let t=[];return e.fg&&t.push(`38;2;${Ki(e.fg).join(";")}`),e.bg&&t.push(`48;2;${Ki(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function Ki(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function rt(e,t,n){return gn(e,t,v.success.fg,n)}function ip(e,t,n){return gn(e,t,v.error.fg,n)}function pn(e,t,n){return gn(e,t,v.accent.fg,n)}function Mr(e,t,n){return gn(e,t,v.mutedfg.fg,n)}function gn(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${St(s)}${e}${St(r)}`}var ap="https://registry.npmjs.org/craig-cli/latest";var hn=null;function Lr(){try{return"0.6.9"}catch{return"unknown"}}async function ra(){let e=Lr(),t=Date.now();if(hn&&t-hn.cachedAt<36e5)return hn.result;let n=null;try{let s=await fetch(ap,{signal:AbortSignal.timeout(5e3)});s.ok&&(n=(await s.json()).version??null)}catch{}let r={current:e,latest:n,updateAvailable:n!==null&&n!==e&&cp(n,e)};return hn={result:r,cachedAt:t},r}function cp(e,t){let n=d=>d.split(".").map(Number),[r=0,s=0,o=0]=n(e),[i=0,c=0,l=0]=n(t);return r!==i?r>i:s!==c?s>c:o>l}le();var Or=["Runners","Error Log","Help"];function jr(e,t){return N.map(n=>{let r=Z(n),s=e.runners?.[n]?.enabled!==!1,o=e.runners?.[n]?.path?.trim(),i=t.pathEdit?.runner===n?`${t.pathEdit.value}_`:o&&o.length>0?o:`default (${r.executable})`;return`${r.displayName} ${s?"enabled":"disabled"} ${i}`})}function oa(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 ia(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(Or.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:Fr(t)?e===0?{kind:"runners"}:e===1?{kind:"error-log"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function aa(e,t,n,r){if(e.pathEdit)return lp({...e,pathEdit:e.pathEdit},t,n);let s=jr(t,e).length;if(n==="UP"||n==="k")return{kind:"render",state:{...e,menuIndex:Math.max(0,e.menuIndex-1),message:null}};if(n==="DOWN"||n==="j")return{kind:"render",state:{...e,menuIndex:Math.min(s-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(n==="e"){let c=N[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:c,value:t.runners?.[c]?.path??""}}}}if(!Fr(n))return{kind:"noop",state:e};let o=N[e.menuIndex]??"codex",i=t.runners?.[o]?.enabled!==!1;return i&&r.length<=1?{kind:"render",state:{...e,message:"At least one runner must stay enabled."}}:{kind:"save",config:dp(t,o,!i),state:{...e,message:`${Z(o).displayName} ${i?"disabled":"enabled"}.`}}}function lp(e,t,n){if(n==="ESCAPE")return{kind:"render",state:sa({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(Fr(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save",config:up(t,r,s.length>0?s:null),state:sa({...e,message:s.length>0?`${Z(r).displayName} executable saved.`:`${Z(r).displayName} executable reset to default.`})}}return fp(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function dp(e,t,n){return{...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}}}function up(e,t,n){let r={...e.runners?.[t]??{},...n?{path:n}:{}};return n||delete r.path,{...e,runners:{...e.runners??{},[t]:r}}}function sa(e){let t={...e};return delete t.pathEdit,t}function Fr(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
158
|
-
`}function fp(e){return e.length===1&&e>=" "&&e!=="\x7F"}var hp=pp(import.meta.url),wp=hp("terminal-kit"),kp=wp.terminal;async function da(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=be(t);await tt(t);let r=await we(n),s=Ye(r),o=e.uiStateFile?await de({uiStateFile:e.uiStateFile}):null,i=Promise.resolve(),c=Promise.resolve(),l=await Ct(t,void 0,s),d=en(ei(o,r),l);l=await Ct(t,d,s);let f=()=>{},h={workspaceRoot:t,onUpdate:()=>f(),resolveSessionSpec:(I,T)=>Pp(l,T,t)},R=e.ptyRuntime??await Oi({...h,paths:n}),k=I=>{if(!e.uiStateFile)return;o=ti(o,I);let T=o;i=i.then(()=>oe({uiStateFile:e.uiStateFile},T),()=>oe({uiStateFile:e.uiStateFile},T)),i.catch(()=>{})};return new Promise(I=>{let T=e.terminal??kp,a={mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:en(d,l)},V=!1,F=!1,q=null,C=0,je=0,xe=null,ve=null,Ee=null,Ae=null,Et=null,Rn=!1,Tn=null,Wr=`Craig v${Lr()}`,yn=null,Pn=0,G=!0,bn=null,y=()=>{},j=R;f=()=>{a.mode==="main"&&(a={mode:"main",shell:ot(a.shell)},Ee||(Ee=setTimeout(()=>{Ee=null,a.mode==="main"&&y()},50)))};function ot(m){return He(m,j.getViewState(_r(m)))}function _r(m){let u=it(m);return u?u.ptyTabs.some(p=>p.id===m.activeTab)?m.activeTab:m.activeTab==="agent"||m.activeTab==="terminal"?u.ptyTabs.find(p=>p.kind===m.activeTab)?.id??m.selectedPtyTabId:m.selectedPtyTabId:m.selectedPtyTabId}function P(m){return ot(Rp(m,l))}function it(m){return l.tasks.find(u=>u.id===m.selectedTaskId)??null}async function Br(){let m=l.tasks.flatMap(u=>u.ptyTabs.map(p=>p.id));await j.pruneStale?.(m),await j.hydrateSessions?.(m)}function pa(){Br().catch(()=>{}).then(()=>{a.mode==="main"&&(a={mode:"main",shell:P(a.shell)},y())})}async function ma(m){let u=P(m),p=it(u),g=_r(u);if(!p||!g||!p.ptyTabs.some(L=>L.id===g))return u;let w=j.getViewState(g);if(w.status!=="idle"||w.rows.length>0||w.error)return He(u,w);let S=await j.ensureSession(p.id,g,vt(Oe(T.width,T.height)));return He({...u,inputMode:"control"},S)}function qr(m,u){return Ae&&(clearTimeout(Ae),Ae=null),u?(Ae=setTimeout(()=>{Ae=null,!(a.mode!=="main"||a.shell.footerToast!==u)&&(a={mode:"main",shell:P({...a.shell,footerToast:null})},y())},3e3),{...m,footerToast:u}):{...m,footerToast:null}}function ga(m,u){return qr(m,u?{tone:"success",message:u}:null)}function U(m,u,p){let g=u instanceof Error?u.message:p,w=u instanceof Error?u.stack??u.message:String(u);return rr(n,{context:m,message:g,details:w}),g}function H(m,u){return qr(m,{tone:"error",message:u})}function Fe(m){let u=c.then(m,m);return c=u.then(()=>{},()=>{}),u}function Ur(m){let u=it(m),p=l.inspection,g=p&&p.taskId===u?.id?p:null,w=Tp(g?.fileRows??[],m.collapsedFileTreePaths);return{leftItemIds:yp(l),centerTabIds:ai(u,m),ptyTabIds:u?.ptyTabs.map(S=>S.id)??[],filePathIds:g?.filePaths??[],fileTreeRowIds:w.map(S=>S.path),fileTreeFileIds:w.filter(S=>S.kind==="file").map(S=>S.path),fileTreeDirectoryIds:w.filter(S=>S.kind==="directory").map(S=>S.path),diffPathIds:g?.diffPaths??[],diffPathRanges:[],fileLineCount:g?.selectedFile.lines.length??0,diffLineCount:g?.selectedDiff.lines.length??0,reviewRowCount:Pi(m,u),pageRows:Math.max(5,Oe(T.width,T.height).height-me.topRailHeight-9),enabledRunnerIds:s,projectTargetIds:u?.repoTargets?.map(S=>S.repoId)??[]}}async function ha(m){await ts(n,m),r=m,s=Ye(r),l={...l,enabledRunnerIds:s},a.mode==="main"?a={mode:"main",shell:P({...a.shell,selectedRunner:s.includes(a.shell.selectedRunner)?a.shell.selectedRunner:Ne(r)})}:a={...a,shell:P({...a.shell,selectedRunner:s.includes(a.shell.selectedRunner)?a.shell.selectedRunner:Ne(r)})}}async function wa(m){let u=m.selectedTaskId;u&&await Fe(async()=>{let p=await _(n,u);!p.ptyTabs.some(g=>g.id===m.activeTab)||p.selectedPtyTabId===m.activeTab||await E(n,{...p,selectedPtyTabId:m.activeTab})})}async function te(){let m=(a.mode==="main",a.shell);l=await Ct(t,m,s),a.mode==="main"?a={mode:"main",shell:P(a.shell)}:a={...a,shell:P(a.shell)}}async function Kr(m){let u=++Pn,p=ua(l.tasks,m),g=l.inspection,w;if(p&&g?.taskId===p.id){let S={selectedFilePath:m.selectedFilePath,selectedDiffPath:m.selectedDiffPath},L=await Co(p,g,S);if(u!==Pn)return;w={...l,inspection:L}}else if(w=await Ct(t,m,s),u!==Pn)return;l=w,a.mode==="main"&&(a={mode:"main",shell:P(a.shell)},k(a.shell),y())}async function In(m){let u=await Lp(m);a.mode==="main"&&(a={mode:"main",shell:P({...a.shell,workspaceBrowser:u,activeTab:a.shell.selectedPtyTabId??a.shell.activeTab,actionMessage:null})},y())}async function Vr(m){try{let u=P(m),p=it(u),g=u.selectedPtyTabId;if(p&&u.focusedRegion==="tasks"){let L=p.ptyTabs.find(ce=>ce.kind==="agent")??null;L?g=L.id:(p=await Gr(p),await te(),g=p.selectedPtyTabId)}p&&!g&&(p=await Gr(p),await te(),g=p.selectedPtyTabId);let w=P({...u,activeTab:g??u.activeTab,selectedPtyTabId:g,focusedRegion:g?"center":u.focusedRegion});if(!w.selectedTaskId||!g){a={mode:"main",shell:w},y();return}a={mode:"main",shell:He({...w,inputMode:"terminal"},j.getViewState(g))},k(a.shell);let S=await j.ensureSession(w.selectedTaskId,g,vt(Oe(T.width,T.height)));F=Nr(g),q=null,a={mode:"main",shell:He({...w,inputMode:"terminal"},S)},k(a.shell)}catch(u){let p=U("attach PTY",u,"Failed to start PTY.");m.selectedTaskId&&m.selectedPtyTabId&&Nr(m.selectedPtyTabId)&&(await ka(m.selectedTaskId,p).catch(()=>{}),await te().catch(()=>{})),a={mode:"main",shell:H(ri(P(m),p),p)},k(a.shell)}y()}async function ka(m,u){await Fe(async()=>{let p=await _(n,m);await E(n,{...p,status:p.status==="running"?"draft":p.status,runnerSession:{...p.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:u})})}async function Ra(m,u,p){let g=P(m);if(!g.selectedTaskId)throw new Error("Select a task before creating a tab.");let w=await Fe(async()=>{let S=await _(n,g.selectedTaskId),L=u??Sp(S,g.activeTab,g.preferredPtyTabKind),ce=ca(S,L,p??void 0,r),at={...S,ptyTabs:[...S.ptyTabs,ce],selectedPtyTabId:ce.id};return await E(n,at),at});return await te(),P({...g,activeTab:w.selectedPtyTabId??g.activeTab,selectedPtyTabId:w.selectedPtyTabId,preferredPtyTabKind:w.ptyTabs.at(-1)?.kind??g.preferredPtyTabKind,focusedRegion:"center",actionMessage:`Created tab: ${w.ptyTabs.at(-1)?.title??"tab"}`})}async function Ta(m){let u=P(m);if(!u.selectedTaskId)throw new Error("Select a task before closing a tab.");let{closedTab:p,nextSelectedTab:g}=await Fe(async()=>{let w=await _(n,u.selectedTaskId),S=w.ptyTabs.findIndex(xn=>xn.id===u.activeTab);if(S===-1)throw new Error("Only PTY tabs can be closed.");let L=w.ptyTabs[S],ce=w.ptyTabs.filter(xn=>xn.id!==L.id),at=ce[Math.min(S,ce.length-1)]??ce[S-1]??null;return await E(n,{...w,ptyTabs:ce,selectedPtyTabId:at?.id??null}),{closedTab:L,nextSelectedTab:at}});return j.disposeSession(p.id),await te(),P({...u,activeTab:g?.id??(u.openInspectionKind?"inspection":u.activeTab),selectedPtyTabId:g?.id??null,focusedRegion:"center",actionMessage:`Closed tab: ${p.title}`})}async function ya(m){let u=P(m);if(!u.selectedTaskId)throw new Error("Select a task before refreshing PR checks.");let p=it(u),g=null,w=null;if(p?.type==="project"&&p.repoTargets?.length){let S=await Gt(n,u.selectedTaskId);await te();let L=S.synced+S.discovered+S.notFound;w=`Refreshed ${S.synced}/${L} targets`}else{let{disposition:S,task:L}=await Hn(n,u.selectedTaskId);await te(),g=S==="not_found"?`No PR found for ${L.branch}`:null,S!=="not_found"&&(w=`Refreshed checks: ${K(L)?.requiredChecks.length??0} reported`)}return P({...ga(u,w),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:g})}async function Pa(){if(Rn||a.mode!=="main")return;let m=l.tasks;Rn=!0;try{if(await so(n,m),Tn=null,a.mode!=="main")return;l=await Ct(t,a.shell,s),a={mode:"main",shell:P(a.shell)},y()}catch(u){let p=u instanceof Error?u.message:"Background PR discovery failed.";p!==Tn&&(Tn=p,rr(n,{context:"background PR polling",message:p,details:u instanceof Error?u.stack??u.message:String(u)}))}finally{Rn=!1}}async function ba(m){let u=P(m);if(!u.selectedTaskId)throw new Error("Select a task before closing it.");let{taskBeforeClose:p,task:g}=await Fe(async()=>{let w=await _(n,u.selectedTaskId),S=await jo(n,u.selectedTaskId);return{taskBeforeClose:w,task:S}});for(let w of p.ptyTabs)j.disposeSession(w.id);return await te(),P({...u,selectedActionId:"close-task",actionMessage:g.cleanup.preservedWorktree?`Archived task ${g.id}; worktree preserved`:`Archived task ${g.id}`})}async function Ia(m){let u=P(m);if(!u.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");if((await Te(n,{workspaceId:u.selectedWorkspaceId,includeClosed:!0})).tasks.length>0)throw new Error(`Cannot remove workspace ${u.selectedWorkspaceId} while task records still reference it.`);await wt(n,u.selectedWorkspaceId);let g=await kt(n,u.selectedWorkspaceId);return await te(),P({...u,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:`Removed workspace ${g.workspaceId}`})}async function Gr(m){let u=m.ptyTabs.find(w=>w.kind==="agent")??null;if(u){let w={...m,selectedPtyTabId:u.id};return await Fe(async()=>{let S=await _(n,m.id),L=S.ptyTabs.find(ce=>ce.kind==="agent")??null;L&&await E(n,{...S,selectedPtyTabId:L.id})}),w}let p=ca(m,"agent",void 0,r),g={...m,ptyTabs:[...m.ptyTabs,p],selectedPtyTabId:p.id};return await Fe(async()=>{let w=await _(n,m.id),S=w.ptyTabs.find(L=>L.kind==="agent")??null;if(S){await E(n,{...w,selectedPtyTabId:S.id});return}await E(n,{...w,ptyTabs:[...w.ptyTabs,p],selectedPtyTabId:p.id})}),g}y=()=>{Sa();let m=Oe(T.width,T.height),u=a.mode==="main"?Ji(m,gi(P(a.shell),l),{centerOnly:a.shell.centerZoomed}):a.variant==="boot"?Gi(m,{menuIndex:a.menuIndex,optionsMessage:a.optionsMessage,versionText:Wr,updateText:yn}):a.variant==="pause"?Hi(m,{menuIndex:a.menuIndex,optionsMessage:a.optionsMessage,versionText:Wr,updateText:yn}):a.variant==="options"?$r(m,{menuIndex:a.menuIndex,optionsMenuItems:Or}):a.variant==="runners"?$r(m,{menuIndex:xt(a).menuIndex,optionsMenuItems:jr(r,xt(a)),optionsMessage:oa(xt(a)),optionsSubtitle:"Runners"}):a.variant==="error-log"?Yi(m,{errorLogPath:a.errorLog?.path??n.errorLogFile,errorLogLines:a.errorLog?.lines??[]}):zi(m);G&&(T.moveTo(1,1),T.eraseDisplayBelow(),G=!1),T.noFormat(xp(u)),T.hideCursor(!0)};function Sa(){let m=a.mode==="main"&&a.shell.inputMode==="terminal"?"terminal":"control";m!==bn&&(bn=m,T.grabInput(m==="terminal"?{mouse:"button"}:!0))}let Ca=()=>{process.stdout.off("resize",Qr),process.off("SIGCONT",Xr),T.removeListener("key",Hr),T.removeListener("unknown",zr),T.removeListener("mouse",Yr),xe&&(clearTimeout(xe),xe=null),ve&&(clearTimeout(ve),ve=null),Ee&&(clearTimeout(Ee),Ee=null),Ae&&(clearTimeout(Ae),Ae=null),Et&&(clearInterval(Et),Et=null),j.disposeAll(),T.grabInput(!1),T.hideCursor(!1),T.fullscreen(!1)},Sn=m=>{Ca(),I(m)},xa=async()=>{if(a.mode!=="main"||V)return;let m=a.shell,u=m.taskPromptInput?.trim()??"";if(!m.selectedRepoId&&!m.selectedWorkspaceId){a={mode:"main",shell:P({...m,taskPromptError:"Select a workspace first."})},y();return}if(u.length===0){a={mode:"main",shell:P({...m,taskPromptError:"Task prompt cannot be empty."})},y();return}V=!0,a={mode:"main",shell:P({...m,actionMessage:`Creating ${m.selectedRunner} task in ${m.selectedWorkspaceId??m.selectedRepoId}...`})},y();let p=null;try{p=await Cp(n,m.selectedRepoId,m.selectedWorkspaceId,u,m.selectedRunner),await te();let g=P({...a.shell,selectedRepoId:p.repoId,selectedWorkspaceId:p.workspaceId,selectedTaskId:p.id,selectedPtyTabId:p.selectedPtyTabId,selectedLeftItemId:`task:${p.id}`,activeTab:p.selectedPtyTabId??"agent",inputMode:"terminal",focusedRegion:"center",taskPromptInput:null,taskPromptError:null,actionMessage:null}),w=await j.ensureSession(p.id,g.selectedPtyTabId??fa(p,"agent"),vt(Oe(T.width,T.height)));F=Nr(g.selectedPtyTabId),a={mode:"main",shell:He(g,w)},k(a.shell)}catch(g){g instanceof wn&&(p=g.task);let w=U("create task",g,"Failed to create task.");p&&(await E(n,{...p,status:"draft",runnerSession:{...p.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:w}).catch(()=>{}),await te().catch(()=>{})),a={mode:"main",shell:H(P({...a.shell,inputMode:"control",selectedTaskId:p?.id??a.shell.selectedTaskId,selectedPtyTabId:p?.selectedPtyTabId??a.shell.selectedPtyTabId,selectedLeftItemId:p?`task:${p.id}`:a.shell.selectedLeftItemId,activeTab:p?.selectedPtyTabId??a.shell.activeTab,taskPromptInput:p?null:"",taskPromptError:w,actionMessage:null}),w)}}finally{V=!1,y()}},va=m=>{if(a.mode!=="main")return;let u=a.shell;if(u.taskPromptInput!==null){if(m==="ESCAPE"){a={mode:"main",shell:P({...u,taskPromptInput:null,taskPromptError:null,actionMessage:null})},y();return}if(Ce(m)){xa();return}if(m==="BACKSPACE"){a={mode:"main",shell:P({...u,taskPromptInput:u.taskPromptInput.slice(0,-1),taskPromptError:null})},y();return}if(m==="CTRL_R"){a={mode:"main",shell:P({...u,selectedRunner:mr(u.selectedRunner,s),taskPromptError:null})},y();return}si(m)&&(a={mode:"main",shell:P({...u,taskPromptInput:`${u.taskPromptInput}${m}`,taskPromptError:null})},y())}},Ea=m=>{if(a.mode!=="main")return;let u=a.shell.workspaceBrowser;if(u){if(m==="ESCAPE"){a={mode:"main",shell:P({...a.shell,workspaceBrowser:null,actionMessage:null})},y();return}if(m==="UP"||m==="k"){a={mode:"main",shell:P({...a.shell,workspaceBrowser:{...u,selectedIndex:Math.max(0,u.selectedIndex-1),error:null}})},y();return}if(m==="DOWN"||m==="j"){let p=Math.max(0,u.entries.length-1);a={mode:"main",shell:P({...a.shell,workspaceBrowser:{...u,selectedIndex:Math.min(p,u.selectedIndex+1),error:null}})},y();return}if(m==="LEFT"||m==="h"){In(st.dirname(u.cwd)).catch(p=>{let g=U("open parent workspace directory",p,"Failed to open parent directory.");a={mode:"main",shell:H(P({...a.shell,workspaceBrowser:{...u,error:g}}),g)},y()});return}if(m==="RIGHT"||m==="l"||Ce(m)){let p=u.entries[u.selectedIndex]??null;if(!p)return;if((m==="RIGHT"||m==="l")&&(p.kind==="directory"||p.kind==="repo")){In(p.path).catch(g=>{let w=U("open workspace directory",g,"Failed to open directory.");a={mode:"main",shell:H(P({...a.shell,workspaceBrowser:{...u,error:w}}),w)},y()});return}ht(n,p.path).then(async g=>{await te();let w=g.repos[0]??null;a={mode:"main",shell:P({...a.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${g.workspace.id}`,selectedWorkspaceId:g.workspace.id,selectedRepoId:w?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${g.workspace.name??g.workspace.id}`})},k(a.shell),y()}).catch(g=>{let w=U("add workspace",g,"Failed to add workspace.");a={mode:"main",shell:H(P({...a.shell,workspaceBrowser:{...u,error:w}}),w)},y()})}}},Hr=m=>{let u=typeof m=="string"?m:"";if(a.mode==="main"&&a.shell.taskPromptInput!==null){va(u);return}if(a.mode==="main"&&a.shell.workspaceBrowser!==null){Ea(u);return}if(a.mode==="main"){let p=ni(a.shell,u,Ur(a.shell));if(p.exit){Sn(0);return}if(p.detachTerminal){j.detach(),a={mode:"main",shell:P(p.state)},k(a.shell),y();return}if(a.shell.inputMode==="terminal"){if(p.changed){a={mode:"main",shell:P(p.state)},k(a.shell),y();return}if(F&&Ce(u)){F=!1;return}F&&(F=!1),q=Ep(u)?{key:u,at:Date.now()}:null;let g=Ap(u,a.shell.terminal.scrolledBack??!1);if(g!==0){Cn(g);return}j.writeKey(u);return}if(u==="CTRL_C"){Sn(0);return}if(u==="?"&&a.shell.inputMode==="control"){a={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:a.shell},G=!0,y();return}if(p.pause){a={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:P(p.state)},G=!0,y();return}if(p.beginTaskPrompt){a={mode:"main",shell:P(p.state)},k(a.shell),y();return}if(p.openWorkspaceBrowser){In(t).catch(g=>{let w=U("browse workspaces",g,"Failed to browse workspaces.");a={mode:"main",shell:H(P({...p.state,workspaceBrowser:{cwd:t,entries:[],selectedIndex:0,error:w}}),w)},y()});return}if(p.createPtyTab){Ra(p.state,p.createPtyTabKind,p.createPtyTabRunner).then(g=>{Vr(g)}).catch(g=>{let w=U("create PTY tab",g,"Failed to create tab.");a={mode:"main",shell:H(P({...p.state,actionMessage:w}),w)},y()});return}if(p.closePtyTab){Ta(p.state).then(g=>{a={mode:"main",shell:g},k(a.shell),y()}).catch(g=>{let w=U("close PTY tab",g,"Failed to close tab.");a={mode:"main",shell:H(P({...p.state,actionMessage:w}),w)},y()});return}if(p.refreshPullRequestChecks){ya(p.state).then(g=>{a={mode:"main",shell:g},k(a.shell),y()}).catch(g=>{let w=U("refresh PR checks",g,"Failed to refresh PR checks.");a={mode:"main",shell:H(P({...p.state,actionMessage:w}),w)},y()});return}if(p.closeTask){ba(p.state).then(g=>{a={mode:"main",shell:g},k(a.shell),y()}).catch(g=>{let w=U("close task",g,"Failed to close task.");a={mode:"main",shell:H(P({...p.state,actionMessage:w}),w)},y()});return}if(p.removeWorkspace){Ia(p.state).then(g=>{a={mode:"main",shell:g},k(a.shell),y()}).catch(g=>{let w=U("remove workspace",g,"Failed to remove workspace.");a={mode:"main",shell:H(P({...p.state,actionMessage:w}),w)},y()});return}if(p.attachTerminal){Vr(p.state);return}if(p.refreshInspection){a={mode:"main",shell:P(p.state)},k(a.shell),y(),Kr(a.shell).catch(g=>{let w=U("refresh inspection",g,"Failed to refresh inspection.");a={mode:"main",shell:H(P({...a.shell,actionMessage:w}),w)},y()});return}p.changed&&(a={mode:"main",shell:P(p.state)},wa(a.shell).catch(()=>{}),k(a.shell),y());return}if(a.variant==="help"){a.viaOptions&&a.parentVariant?a={mode:"overlay",variant:"options",menuIndex:2,optionsMessage:null,shell:a.shell,parentVariant:a.parentVariant}:a.parentVariant?a={mode:"overlay",variant:a.parentVariant,menuIndex:1,optionsMessage:null,shell:a.shell}:a={mode:"main",shell:P(a.shell)},G=!0,y();return}if(a.variant==="options"){Aa(u);return}if(a.variant==="runners"){Da(u);return}if(a.variant==="error-log"){if(u==="ESCAPE"||Ce(u)){let p=a.parentVariant;a={mode:"overlay",variant:"options",menuIndex:1,optionsMessage:null,shell:a.shell,...p!==void 0?{parentVariant:p}:{}},G=!0,y()}return}if(a.optionsMessage){(u==="ESCAPE"||Ce(u))&&(a={...a,optionsMessage:null},y());return}if(u==="UP"||u==="k"){a={...a,menuIndex:Math.max(0,a.menuIndex-1)},y();return}if(u==="DOWN"||u==="j"){a={...a,menuIndex:Math.min(2,a.menuIndex+1)},y();return}if(u==="ESCAPE"){a.variant==="pause"&&(a={mode:"main",shell:P(a.shell)},G=!0,y());return}if(Ce(u)){if(a.menuIndex===0){let p=a.variant==="boot";a={mode:"main",shell:P({...a.shell,inputMode:"control"})},G=!0,y(),p?Oa.then(()=>{if(a.mode!=="main")return;let g=a.shell;ma(g).then(w=>{a.mode!=="main"||a.shell!==g||(a={mode:"main",shell:w},k(a.shell),y())}).catch(w=>{if(a.mode!=="main"||a.shell!==g)return;let S=U("warm selected PTY",w,"Failed to start selected PTY.");a={mode:"main",shell:H(P(a.shell),S)},k(a.shell),y()})}):pa();return}if(a.menuIndex===1){let p=a.variant==="boot"||a.variant==="pause"?a.variant:void 0;a={mode:"overlay",variant:"options",menuIndex:0,optionsMessage:null,shell:a.shell,...p!==void 0?{parentVariant:p}:{}},G=!0,y();return}Sn(0)}};function Aa(m){if(a.mode!=="overlay"||a.variant!=="options")return;let u=ia(a.menuIndex,m);if(u.kind!=="noop"){if(u.kind==="render"){a={...a,menuIndex:u.menuIndex},y();return}if(u.kind==="back"){a.parentVariant&&(a={mode:"overlay",variant:a.parentVariant,menuIndex:1,optionsMessage:null,shell:a.shell},G=!0,y());return}if(u.kind==="help"){let p=a.parentVariant;a={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:a.shell,viaOptions:!0,...p!==void 0?{parentVariant:p}:{}},G=!0,y();return}if(u.kind==="runners"){let p=a.parentVariant;a={mode:"overlay",variant:"runners",menuIndex:0,optionsMessage:null,shell:a.shell,...p!==void 0?{parentVariant:p}:{}},G=!0,y();return}if(u.kind==="error-log"){let p=a.parentVariant;$a(p)}}}async function $a(m){let u;try{u=await Io(n)}catch(p){let g=U("open error log",p,"Failed to read Craig error log.");u={path:n.errorLogFile,lines:[`Unable to read error log: ${g}`],empty:!1}}a.mode==="overlay"&&(a={mode:"overlay",variant:"error-log",menuIndex:0,optionsMessage:null,shell:a.shell,errorLog:u,...m!==void 0?{parentVariant:m}:{}},G=!0,y())}function Da(m){if(a.mode!=="overlay"||a.variant!=="runners")return;let u=aa(xt(a),r,m,s);if(u.kind!=="noop"){if(u.kind==="back"){let p=a.parentVariant;a={mode:"overlay",variant:"options",menuIndex:0,optionsMessage:null,shell:a.shell,...p!==void 0?{parentVariant:p}:{}},G=!0,y();return}if(u.kind==="render"){a={...a,runnerOptions:u.state},y();return}ha(u.config).then(()=>{a.mode!=="overlay"||a.variant!=="runners"||(a={...a,runnerOptions:u.state},y())}).catch(p=>{if(a.mode!=="overlay"||a.variant!=="runners")return;let g=U("save runner option",p,"Failed to save runner option."),w=H(P(a.shell),g);a={...a,shell:w,runnerOptions:{...xt(a),message:g}},y()})}}let zr=m=>{let u=vp(m);if(a.mode!=="main"||a.shell.inputMode!=="terminal"||u.length===0)return;if(u.includes("")){j.detach(),F=!1,q=null,a={mode:"main",shell:P({...a.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},k(a.shell),y();return}let p=$p(u);if(p!==0){Cn(p);return}let g=Dp(u);if(g){F=!1,q={key:g,at:Date.now()},j.writeKey(g);return}if(F&&u!=="\r"&&u!==`
|
|
152
|
+
`);if(d===-1)return;let f=o.slice(0,d);c(),s.end();try{n(JSON.parse(f))}catch(g){r(g instanceof Error?g:new Error(String(g)))}}),s.once("close",()=>c())})}async function Bi(e,t){let n=Date.now();for(;Date.now()-n<t;){if(!await ln(e))return;await Dr(50)}}function Yi(e){return new Promise((t,n)=>{let r=qi(e);r.once("connect",()=>t(r)),r.once("error",n)})}function _f(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,n)})}function cn(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
|
|
153
|
+
`)}catch{}}function Qi(e){try{return process.kill(e,0),!0}catch{return!1}}function Dr(e){return new Promise(t=>setTimeout(t,e))}function Bf(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}import mk from"picocolors";var qf=[" \u2584\u2588\u2588\u2588\u2588\u2584 \u2588\u2588\u2580\u2588\u2588\u2588 \u2584\u2584\u2584 \u2588\u2588\u2593 \u2584\u2588\u2588\u2588\u2588"," \u2592\u2588\u2588\u2580 \u2580\u2588 \u2593\u2588\u2588 \u2592 \u2588\u2588\u2592\u2592\u2588\u2588\u2588\u2588\u2584 \u2593\u2588\u2588\u2592 \u2588\u2588\u2592 \u2580\u2588\u2592"," \u2592\u2593\u2588 \u2584 \u2593\u2588\u2588 \u2591\u2584\u2588 \u2592\u2592\u2588\u2588 \u2580\u2588\u2584 \u2592\u2588\u2588\u2592\u2592\u2588\u2588\u2591\u2584\u2584\u2584\u2591"," \u2592\u2593\u2593\u2584 \u2584\u2588\u2588\u2592\u2592\u2588\u2588\u2580\u2580\u2588\u2584 \u2591\u2588\u2588\u2584\u2584\u2584\u2584\u2588\u2588 \u2591\u2588\u2588\u2591\u2591\u2593\u2588 \u2588\u2588\u2593"," \u2592 \u2593\u2588\u2588\u2588\u2580 \u2591\u2591\u2588\u2588\u2593 \u2592\u2588\u2588\u2592 \u2593\u2588 \u2593\u2588\u2588\u2592\u2591\u2588\u2588\u2591\u2591\u2592\u2593\u2588\u2588\u2588\u2580\u2592"," \u2591 \u2591\u2592 \u2592 \u2591\u2591 \u2592\u2593 \u2591\u2592\u2593\u2591 \u2592\u2592 \u2593\u2592\u2588\u2591\u2591\u2593 \u2591\u2592 \u2592"," \u2591 \u2592 \u2591\u2592 \u2591 \u2592\u2591 \u2592 \u2592\u2592 \u2591 \u2592 \u2591 \u2591 \u2591"," \u2591 \u2591\u2591 \u2591 \u2591 \u2592 \u2592 \u2591\u2591 \u2591 \u2591"," \u2591 \u2591 \u2591 \u2591 \u2591 \u2591 \u2591"," \u2591"];function Lr(){return[...qf]}var Uf=["Start","Options","Exit"],Kf=["Resume","Options","Exit"],fn=2,pn=2,mn=2,Vf=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),Gf=new RegExp("\x1B\\[(?:0)?m","g"),Hf=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),zf=/https?:\/\/[^\s<>"']+/g,Mr="\x1B[0m",Zi="\x1B]8;;\x1B\\",x={panelBg:{bg:"0a0a0a",fg:"c0caf5"},panelMuted:{bg:"0a0a0a",fg:"565f89"},panelSelected:{bg:"1a1b26",fg:"c0caf5"},panelFocused:{bg:"1a1b26",fg:"7aa2f7"},divider:{bg:"0a0a0a",fg:"292e42"},rail:{bg:"0a0a0a",fg:"c0caf5"},overlay:{bg:"06060f",fg:"565f89"},overlayTitle:{bg:"06060f",fg:"565f89"},overlayLogo:{bg:"06060f",fg:"9ece6a"},overlaySubtitle:{bg:"06060f",fg:"41a6b5"},overlayMenuSelected:{bg:"06060f",fg:"7aa2f7"},accent:{fg:"7aa2f7"},success:{fg:"9ece6a"},pending:{fg:"e0af68"},error:{fg:"f7768e"},mutedfg:{fg:"565f89"},disabled:{fg:"3b4261"}};function ea(e,t={}){return Fr(e,{subtitle:"crAIg is that you?",menuItems:Uf,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function ta(e,t={}){return Fr(e,{subtitle:"Control mode is paused.",menuItems:Kf,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}var dn=[" GLOBAL CENTER PANEL INSPECTOR"," ? help \u2190\u2192 / hl switch tab \u2191\u2193 / jk navigate"," Esc pause / back + new tab \u2190\u2192 / hl switch mode"," Tab cycle panels a codex tab R sync PR"," q quit t terminal tab R sync PR"," x close tab X close task"," TASKS Enter attach PTY X close task"," \u2191\u2193 / jk navigate"," n new task TERMINAL MODE"," Enter attach Ctrl+] return to control mode"," Wheel / PgUp / PgDn scroll",""," Press Esc to return."],Yf=["Help"];function Or(e,t={}){return Fr(e,{subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??Yf,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function na(e,t={}){let n=t.color??!0,r=x.overlay,s=new Array(e.height).fill(O(" ".repeat(e.width),n,r)),o=Lr(),i=Math.max(1,Math.floor((e.height-o.length-2-dn.length)/2));for(let f=0;f<o.length&&!(i+f>=e.height);f+=1)s[i+f]=O(aa(o[f]??"",e.width),n,x.overlayLogo);let c=Math.max(...dn.map(f=>f.length)),l=Math.max(0,Math.floor((e.width-c)/2)),d=i+o.length+2;for(let f=0;f<dn.length;f+=1){let g=d+f;if(g>=e.height)break;let R=dn[f]??"";s[g]=O(Ie(" ".repeat(l)+R,e.width),n,r)}return s.join(`
|
|
154
|
+
`)}function ra(e,t={}){let n=t.color??!0,r=x.overlay,s=new Array(e.height).fill(O(" ".repeat(e.width),n,r)),o="Error Log",i=t.errorLogPath??"",c=t.errorLogLines??[],l=Math.max(20,e.width-8),d=Math.max(0,Math.floor((e.width-l)/2)),f=[{text:o,tone:"selected"},{text:i,tone:"muted"},te(),...c.length>0?c.map(k=>({text:k})):[{text:"No Craig errors have been logged.",tone:"muted"}],te(),{text:"Esc returns to Options.",tone:"muted"}],g=rt(f,e.height-2),R=Math.max(1,Math.floor((e.height-g.length)/2));for(let k=0;k<g.length;k+=1){let I=R+k;if(I>=e.height)break;let T=g[k]??te(),a=`${" ".repeat(d)}${hn(T.text,l)}`,V=T.tone==="selected"?x.overlayMenuSelected:T.tone==="muted"?x.overlay:x.panelBg;s[I]=O(Ie(a,e.width),n,V)}return s.join(`
|
|
155
|
+
`)}function sa(e,t,n={}){let r=n.color??!0,s=me.leftWidth,o=me.rightWidth,i=me.dividerWidth,c=n.centerOnly??!1,l=c?e.width:e.width-s-o-i*2,d=e.height-me.topRailHeight-1,f=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,g=O(Ie(f,e.width),r,x.rail),R=Jf(t,s-fn-pn,d,r),k=Xf(t,l,d,r),I=ep(t,o,d,r),T=t.inputMode==="terminal",a=[];for(let N=0;N<d;N+=1){if(c){a.push(un(k[N]??te(),l,r,"center"));continue}let v=un(R[N]??te(),s,r,"left"),Z=O("\u2502",r,x.divider),ve=un(k[N]??te(),l,r,"center"),Ee=O("\u2502",r,x.divider),Ae=un(I[N]??te(),o,r,"right");a.push(`${v}${Z}${ve}${Ee}${Ae}`)}let V=T||t.modalInput?x.panelBg:x.panelMuted,j=Qf(t.footerText,t.footerToast,e.width,r,V);return[g,...a,j].join(`
|
|
156
|
+
`)}function Qf(e,t,n,r,s){let o=` ${e}`;if(!t)return O(Ie(o,n),r,s);let i=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,c=X(i),l=X(o),d=Math.max(1,n-l-c-2),f=l+d+c+2>n?hn(o,Math.max(0,n-c-3)):o,g=Math.max(1,n-X(f)-c-2),R=t.tone==="error"?Rp(i,r,s):st(i,r,s),k=`${f}${" ".repeat(g)}${R} `;return O(Ie(k,n),r,s)}function Fr(e,t){let n=new Array(e.height).fill(O(" ".repeat(e.width),t.color,x.overlay)),r=Lr(),s=Math.max(...t.menuItems.map(d=>d.length)),o=t.menuItems.map((d,f)=>`${f===t.menuIndex?">":" "} ${d.padEnd(s)}`),i=t.optionsMessage?["",t.optionsMessage]:[],c=[...r,"",t.subtitle,"",...o,...i],l=Math.max(1,Math.floor((e.height-c.length)/2));for(let d=0;d<c.length;d+=1){let f=aa(c[d]??"",e.width);if(d<r.length){n[l+d]=O(f,t.color,x.overlayLogo);continue}if(d===r.length+1){n[l+d]=O(f,t.color,x.overlaySubtitle);continue}let g=d-(r.length+3),k=g>=0&&g<t.menuItems.length&&g===t.menuIndex?x.overlayMenuSelected:x.overlay;n[l+d]=O(f,t.color,k)}if(t.versionText){let d=t.updateText?" (update available)":"",f=`${t.versionText}${d} `,g=" ".repeat(Math.max(0,e.width-X(f)));n[e.height-1]=O(`${g}${jr(f,t.color,x.overlay)}`,t.color,x.overlay)}return n.join(`
|
|
157
|
+
`)}function Jf(e,t,n,r){let s=rp(e.runners),o=1,i=e.leftTree.map(l=>np(l,t,r));return[...rt(i,n-o),s]}function Xf(e,t,n,r){let s=t-2,o=e.tabs.find(Z=>Z.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:wp(e.tabs),c=e.inputMode==="terminal"?s:o.length+1,l="\u2500".repeat(Math.max(0,c)),d=`${" ".repeat(i)}${e.inputMode==="terminal"?st(l,r,x.panelBg):gn(l,r,x.panelMuted)}`,f=[`${gn(e.centerHeader.tabLabel,r,x.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),g=e.tabs.find(Z=>Z.active)?.id??"agent",R=e.centerHeader.tabLabel==="BROWSER"||!di(g)?e.centerTranscript.map(Z=>({...Z})):Zf(e),k=sp(e.tabs,r,e.focusedRegion==="center"),I=" engaged ",T=I.length+2,a=e.inputMode==="terminal"?st(`${I}\u25CF `,r,x.panelBg):"",V=e.inputMode==="terminal"?" ".repeat(Math.max(0,s-X(k)-T)):"",N=[{text:e.inputMode==="terminal"?`${k}${V}${a}`:k},{text:d,tone:"muted"},{text:f},te()],v=Math.max(0,n-N.length);return[...N,...ap(R,v)]}function Zf(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},te(),{text:e.terminal.error},te(),{text:"Fix the native dependency setup, then re-enter terminal mode."}];let t=e.tabs.find(r=>r.active)?.id??"",n=t==="agent"||/:agent(?:-\d+)?$/.test(t)?"agent":"terminal";return e.terminal.rows.length===0?[{text:`Press Enter on the ${n.toUpperCase()} tab to attach a PTY.`}]:e.terminal.rows.map(r=>({text:ua(r.segments),segments:r.segments,fullBleed:!0}))}function ep(e,t,n,r){let s=e.rightInspection?tp(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,n):rt([{text:"CONTEXT"},te(),...e.rightContext.map(o=>op(o,r)),...e.actionMessage?[te(),{text:e.actionMessage}]:[]],n);return rt(s,n)}function tp(e,t){let n=e.slice(0,2),r=e.slice(2),s=Math.max(0,t-n.length),o=r.findIndex(c=>c.focused||c.selected),i=o===-1?0:la(o-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(c=>Ji(c)),...r.slice(i,i+s).map(c=>Ji(c))]}function Ji(e){let t=e.focused?"\u25B8 ":e.selected?"\u2022 ":" ",n=e.focused||e.selected?"selected":e.muted?"muted":"default",r=`${t}${e.text}`;if(e.segments)return{text:r,segments:[{text:t},...e.segments],tone:n};if(e.accentPrefix&&!e.muted){let s=e.text.indexOf(" "),o=s===-1?e.text:e.text.slice(0,s),i=s===-1?"":e.text.slice(s);return{text:r,segments:[{text:t},{text:o,style:{fg:"7aa2f7"}},{text:i}],tone:n}}return e.color?{text:r,segments:[{text:t},{text:e.text,style:{fg:e.color}}],tone:n}:{text:r,tone:n}}function np(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",o=e.status?` ${e.status}`:"",i=e.accentDot?` ${st("\u25CF",n,e.selected?x.panelSelected:x.panelBg)}`:"",c=e.prBadge?e.prBadge.reduce((k,I)=>k+X(I.text),0):0,l=t-X(o)-X(s)-c,d=e.selected?e.text:e.focused?st(e.text,n,x.panelBg):e.panelHeader?gn(e.text,n,x.panelMuted):e.text,f=Ie(`${r}${d}`,Math.max(0,l)),g=e.selected?"selected":e.muted?"muted":"default";if(e.prBadge){let k=[{text:`${f}${o}${i}`},...e.prBadge];return{text:`${f}${o}${e.prBadge.map(T=>T.text).join("")}`,segments:k,tone:g}}return{text:`${f}${o}${i}`,tone:g}}function rp(e){let t=e.map(r=>{let s=r.health>=1,o=parseInt(r.count,10),i=o>1?` (${o})`:"";return{text:`${s?"\u25CF":"\u25CB"} ${r.name}${i}`,active:s}}),n=[];for(let r=0;r<t.length;r++){let s=t[r];r>0&&n.push({text:" "}),s.active?n.push({text:s.text,style:{fg:x.success.fg}}):n.push({text:s.text,style:{fg:x.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function sp(e,t,n){return e.map(r=>r.active?n?st(r.label,t,x.panelBg):gn(r.label,t,x.panelBg):jr(r.label,t,x.panelBg)).join(" ")}function op(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?jr(e.value,t,x.panelBg):e.value}`}}function un(e,t,n,r){let s=ip(r,e.tone??"default"),o=cp(e,n,s);if(r==="left"){if(e.fullBleed)return O(Ie(o,t),n,s);let c=t-fn-pn;if(e.rightAlign){let d=X(o),f=Math.max(0,c-d),g=`${" ".repeat(fn)}${" ".repeat(f)}${o}${" ".repeat(pn)}`;return O(g,n,s)}let l=`${" ".repeat(fn)}${Ie(o,c)}${" ".repeat(pn)}`;return O(l,n,s)}return r==="center"&&e.fullBleed?lp(e,t,n,s):O(Ie(` ${o}`,t),n,s)}function ip(e,t){return t==="selected"||t==="focused"?x.panelSelected:t==="muted"?x.panelMuted:x.panelBg}function rt(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(te());return n}function ap(e,t){let n=e.findIndex(s=>s.tone==="selected"||s.tone==="focused");if(n===-1||e.length<=t)return rt(e,t);let r=la(n-Math.floor(t/2),0,Math.max(0,e.length-t));return rt(e.slice(r),t)}function te(){return{text:""}}function cp(e,t,n){return e.segments?e.segments.map(r=>oa(r,t,n)).join(""):e.text}function lp(e,t,n,r){let s=" ".repeat(mn),o=Math.max(0,t-mn*2);if(!e.segments)return O(`${s}${Ie(e.text,o)}${s}`,n,r);let i=fp(e.segments,o),c=`${s}${i.map(l=>oa(l,n,r)).join("")}${s}`;return O(c,n,r)}function oa(e,t,n){let r=e.href?`${ia(e.href)}${e.text}${Zi}`:dp(e.text);return!t||!e.style?r:`${It(gp(e.style,n))}${hp(e.style)}${r}${Mr}${It(n)}`}function dp(e){return e.replace(zf,t=>{let[n,r]=up(t);return`${ia(n)}${n}${Zi}${r}`})}function up(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function ia(e){return`\x1B]8;;${e}\x1B\\`}function fp(e,t){let n=pp(e,t);return mp(n,t)}function pp(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let o=X(s.text);if(o<=r){n.push(s),r-=o;continue}let i=hn(s.text,r);i.length>0&&n.push({...s,text:i}),r=0}return n}function mp(e,t){let n=X(ua(e));if(n>=t)return e;let r=e.at(-1)?.style;return r?.bg?[...e,{text:" ".repeat(t-n),style:r}]:[...e,{text:" ".repeat(t-n)}]}function gp(e,t){let n=e.inverse?e.bg??t.bg:e.fg,r=e.inverse?e.fg??t.fg:e.bg,s={},o=n??t.fg,i=r??t.bg;return o&&(s.fg=o),i&&(s.bg=i),s}function hp(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 wp(e){let t=0;for(let n of e){if(n.active)return t;t+=n.label.length+3}return 0}function aa(e,t){let n=Math.max(0,t-X(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function Ie(e,t){let n=X(e);return n>=t?kp(e,t):e+" ".repeat(t-n)}function kp(e,t){if(t<=0)return"";if(X(e)<=t)return e;let n=da(e);return hn(n,Math.max(0,t-1))+"\u2026"}function X(e){let t=0;for(let n of Array.from(da(e)))t+=ca(n);return t}function hn(e,t){let n="",r=0;for(let s of Array.from(e)){let o=ca(s);if(r+o>t)break;n+=s,r+=o}return n}function ca(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 la(e,t,n){return Math.min(Math.max(e,t),n)}function da(e){return e.replace(Hf,"").replace(Vf,"")}function ua(e){return e.map(t=>t.text).join("")}function O(e,t,n){if(!t)return e;let r=It(n),s=e.replace(Gf,`${Mr}${r}`);return`${r}${s}${Mr}`}function It(e){let t=[];return e.fg&&t.push(`38;2;${Xi(e.fg).join(";")}`),e.bg&&t.push(`48;2;${Xi(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function Xi(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function st(e,t,n){return wn(e,t,x.success.fg,n)}function Rp(e,t,n){return wn(e,t,x.error.fg,n)}function gn(e,t,n){return wn(e,t,x.accent.fg,n)}function jr(e,t,n){return wn(e,t,x.mutedfg.fg,n)}function wn(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${It(s)}${e}${It(r)}`}var Tp="https://registry.npmjs.org/craig-cli/latest";var kn=null;function Nr(){try{return"0.7.0"}catch{return"unknown"}}async function fa(){let e=Nr(),t=Date.now();if(kn&&t-kn.cachedAt<36e5)return kn.result;let n=null;try{let s=await fetch(Tp,{signal:AbortSignal.timeout(5e3)});s.ok&&(n=(await s.json()).version??null)}catch{}let r={current:e,latest:n,updateAvailable:n!==null&&n!==e&&yp(n,e)};return kn={result:r,cachedAt:t},r}function yp(e,t){let n=d=>d.split(".").map(Number),[r=0,s=0,o=0]=n(e),[i=0,c=0,l=0]=n(t);return r!==i?r>i:s!==c?s>c:o>l}de();var Wr=["Runners","Error Log","Help"];function _r(e,t){return W.map(n=>{let r=ee(n),s=e.runners?.[n]?.enabled!==!1,o=e.runners?.[n]?.path?.trim(),i=t.pathEdit?.runner===n?`${t.pathEdit.value}_`:o&&o.length>0?o:`default (${r.executable})`;return`${r.displayName} ${s?"enabled":"disabled"} ${i}`})}function ma(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 ga(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(Wr.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:Br(t)?e===0?{kind:"runners"}:e===1?{kind:"error-log"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function ha(e,t,n,r){if(e.pathEdit)return Pp({...e,pathEdit:e.pathEdit},t,n);let s=_r(t,e).length;if(n==="UP"||n==="k")return{kind:"render",state:{...e,menuIndex:Math.max(0,e.menuIndex-1),message:null}};if(n==="DOWN"||n==="j")return{kind:"render",state:{...e,menuIndex:Math.min(s-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(n==="e"){let c=W[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:c,value:t.runners?.[c]?.path??""}}}}if(!Br(n))return{kind:"noop",state:e};let o=W[e.menuIndex]??"codex",i=t.runners?.[o]?.enabled!==!1;return i&&r.length<=1?{kind:"render",state:{...e,message:"At least one runner must stay enabled."}}:{kind:"save",config:bp(t,o,!i),state:{...e,message:`${ee(o).displayName} ${i?"disabled":"enabled"}.`}}}function Pp(e,t,n){if(n==="ESCAPE")return{kind:"render",state:pa({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(Br(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save",config:Sp(t,r,s.length>0?s:null),state:pa({...e,message:s.length>0?`${ee(r).displayName} executable saved.`:`${ee(r).displayName} executable reset to default.`})}}return Ip(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function bp(e,t,n){return{...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}}}function Sp(e,t,n){let r={...e.runners?.[t]??{},...n?{path:n}:{}};return n||delete r.path,{...e,runners:{...e.runners??{},[t]:r}}}function pa(e){let t={...e};return delete t.pathEdit,t}function Br(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
158
|
+
`}function Ip(e){return e.length===1&&e>=" "&&e!=="\x7F"}var Ep=Cp(import.meta.url),Ap=Ep("terminal-kit"),$p=Ap.terminal;async function ya(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=Ce(t);await tt(t);let r=await we(n),s=Ye(r),o=e.uiStateFile?await ue({uiStateFile:e.uiStateFile}):null,i=Promise.resolve(),c=Promise.resolve(),l=await Ct(t,void 0,s),d=tn(ii(o,r),l);l=await Ct(t,d,s);let f=()=>{},g={workspaceRoot:t,onUpdate:()=>f(),resolveSessionSpec:(I,T)=>Op(l,T,t)},R=e.ptyRuntime??await Ui({...g,paths:n}),k=I=>{if(!e.uiStateFile)return;o=ai(o,I);let T=o;i=i.then(()=>ae({uiStateFile:e.uiStateFile},T),()=>ae({uiStateFile:e.uiStateFile},T)),i.catch(()=>{})};return new Promise(I=>{let T=e.terminal??$p,a={mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:tn(d,l)},V=!1,j=!1,N=null,v=0,Z=0,ve=null,Ee=null,Ae=null,$e=null,Et=null,yn=!1,Pn=null,Ur=`Craig v${Nr()}`,bn=null,Sn=0,G=!0,In=null,y=()=>{},F=R;f=()=>{a.mode==="main"&&(a={mode:"main",shell:it(a.shell)},Ae||(Ae=setTimeout(()=>{Ae=null,a.mode==="main"&&y()},50)))};function it(p){return He(p,F.getViewState(Kr(p)))}function Kr(p){let u=at(p);return u?u.ptyTabs.some(m=>m.id===p.activeTab)?p.activeTab:p.activeTab==="agent"||p.activeTab==="terminal"?u.ptyTabs.find(m=>m.kind===p.activeTab)?.id??p.selectedPtyTabId:p.selectedPtyTabId:p.selectedPtyTabId}function b(p){return it(Dp(p,l))}function at(p){return l.tasks.find(u=>u.id===p.selectedTaskId)??null}async function Vr(){let p=l.tasks.flatMap(u=>u.ptyTabs.map(m=>m.id));await F.pruneStale?.(p),await F.hydrateSessions?.(p)}function Sa(){Vr().catch(()=>{}).then(()=>{a.mode==="main"&&(a={mode:"main",shell:b(a.shell)},y())})}async function Ia(p){let u=b(p),m=at(u),h=Kr(u);if(!m||!h||!m.ptyTabs.some(A=>A.id===h))return u;let w=F.getViewState(h);if(w.status!=="idle"||w.rows.length>0||w.error)return He(u,w);let S=await F.ensureSession(m.id,h,vt(Fe(T.width,T.height)));return He({...u,inputMode:"control"},S)}function Gr(p,u){return $e&&(clearTimeout($e),$e=null),u?($e=setTimeout(()=>{$e=null,!(a.mode!=="main"||a.shell.footerToast!==u)&&(a={mode:"main",shell:b({...a.shell,footerToast:null})},y())},3e3),{...p,footerToast:u}):{...p,footerToast:null}}function Ca(p,u){return Gr(p,u?{tone:"success",message:u}:null)}function U(p,u,m){let h=u instanceof Error?u.message:m,w=u instanceof Error?u.stack??u.message:String(u);return ir(n,{context:p,message:h,details:w}),h}function H(p,u){return Gr(p,{tone:"error",message:u})}function je(p){let u=c.then(p,p);return c=u.then(()=>{},()=>{}),u}function At(p){let u=at(p),m=l.inspection,h=m&&m.taskId===u?.id?m:null,w=Lp(h?.fileRows??[],p.collapsedFileTreePaths);return{leftItemIds:Mp(l),centerTabIds:fi(u,p),ptyTabIds:u?.ptyTabs.map(S=>S.id)??[],filePathIds:h?.filePaths??[],fileTreeRowIds:w.map(S=>S.path),fileTreeFileIds:w.filter(S=>S.kind==="file").map(S=>S.path),fileTreeDirectoryIds:w.filter(S=>S.kind==="directory").map(S=>S.path),diffPathIds:h?.diffPaths??[],diffPathRanges:[],fileLineCount:h?.selectedFile.lines.length??0,diffLineCount:h?.selectedDiff.lines.length??0,reviewRowCount:Ai(p,u),pageRows:Math.max(5,Fe(T.width,T.height).height-me.topRailHeight-9),enabledRunnerIds:s,projectTargetIds:u?.repoTargets?.map(S=>S.repoId)??[]}}async function xa(p){await ss(n,p),r=p,s=Ye(r),l={...l,enabledRunnerIds:s},a.mode==="main"?a={mode:"main",shell:b({...a.shell,selectedRunner:s.includes(a.shell.selectedRunner)?a.shell.selectedRunner:Ne(r)})}:a={...a,shell:b({...a.shell,selectedRunner:s.includes(a.shell.selectedRunner)?a.shell.selectedRunner:Ne(r)})}}async function va(p){let u=p.selectedTaskId;u&&await je(async()=>{let m=await B(n,u);!m.ptyTabs.some(h=>h.id===p.activeTab)||m.selectedPtyTabId===p.activeTab||await E(n,{...m,selectedPtyTabId:p.activeTab})})}async function ne(){let p=(a.mode==="main",a.shell);l=await Ct(t,p,s),a.mode==="main"?a={mode:"main",shell:b(a.shell)}:a={...a,shell:b(a.shell)}}async function Hr(p){let u=++Sn,m=Pa(l.tasks,p),h=l.inspection,w;if(m&&h?.taskId===m.id){let S={selectedFilePath:p.selectedFilePath,selectedDiffPath:p.selectedDiffPath},A=await Eo(m,h,S);if(u!==Sn)return;w={...l,inspection:A}}else if(w=await Ct(t,p,s),u!==Sn)return;l=w,a.mode==="main"&&(a={mode:"main",shell:b(a.shell)},k(a.shell),y())}async function Cn(p){let u=await Hp(p);a.mode==="main"&&(a={mode:"main",shell:b({...a.shell,workspaceBrowser:u,activeTab:a.shell.selectedPtyTabId??a.shell.activeTab,actionMessage:null})},y())}async function zr(p){try{let u=b(p),m=at(u),h=u.selectedPtyTabId;if(m&&u.focusedRegion==="tasks"){let A=m.ptyTabs.find(re=>re.kind==="agent")??null;A?h=A.id:(m=await Yr(m),await ne(),h=m.selectedPtyTabId)}m&&!h&&(m=await Yr(m),await ne(),h=m.selectedPtyTabId);let w=b({...u,activeTab:h??u.activeTab,selectedPtyTabId:h,focusedRegion:h?"center":u.focusedRegion});if(!w.selectedTaskId||!h){a={mode:"main",shell:w},y();return}a={mode:"main",shell:He({...w,inputMode:"terminal"},F.getViewState(h))},k(a.shell);let S=await F.ensureSession(w.selectedTaskId,h,vt(Fe(T.width,T.height)));j=qr(h),N=null,a={mode:"main",shell:He({...w,inputMode:"terminal"},S)},k(a.shell)}catch(u){let m=U("attach PTY",u,"Failed to start PTY.");p.selectedTaskId&&p.selectedPtyTabId&&qr(p.selectedPtyTabId)&&(await Ea(p.selectedTaskId,m).catch(()=>{}),await ne().catch(()=>{})),a={mode:"main",shell:H(li(b(p),m),m)},k(a.shell)}y()}async function Ea(p,u){await je(async()=>{let m=await B(n,p);await E(n,{...m,status:m.status==="running"?"draft":m.status,runnerSession:{...m.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:u})})}async function Aa(p,u,m){let h=b(p);if(!h.selectedTaskId)throw new Error("Select a task before creating a tab.");let w=await je(async()=>{let S=await B(n,h.selectedTaskId),A=u??Np(S,h.activeTab,h.preferredPtyTabKind),re=wa(S,A,m??void 0,r),ct={...S,ptyTabs:[...S.ptyTabs,re],selectedPtyTabId:re.id};return await E(n,ct),ct});return await ne(),b({...h,activeTab:w.selectedPtyTabId??h.activeTab,selectedPtyTabId:w.selectedPtyTabId,preferredPtyTabKind:w.ptyTabs.at(-1)?.kind??h.preferredPtyTabKind,focusedRegion:"center",actionMessage:`Created tab: ${w.ptyTabs.at(-1)?.title??"tab"}`})}async function $a(p){let u=b(p);if(!u.selectedTaskId)throw new Error("Select a task before closing a tab.");let{closedTab:m,nextSelectedTab:h}=await je(async()=>{let w=await B(n,u.selectedTaskId),S=w.ptyTabs.findIndex(En=>En.id===u.activeTab);if(S===-1)throw new Error("Only PTY tabs can be closed.");let A=w.ptyTabs[S],re=w.ptyTabs.filter(En=>En.id!==A.id),ct=re[Math.min(S,re.length-1)]??re[S-1]??null;return await E(n,{...w,ptyTabs:re,selectedPtyTabId:ct?.id??null}),{closedTab:A,nextSelectedTab:ct}});return F.disposeSession(m.id),await ne(),b({...u,activeTab:h?.id??(u.openInspectionKind?"inspection":u.activeTab),selectedPtyTabId:h?.id??null,focusedRegion:"center",actionMessage:`Closed tab: ${m.title}`})}async function Da(p){let u=b(p);if(!u.selectedTaskId)throw new Error("Select a task before refreshing PR checks.");let m=at(u),h=null,w=null;if(m?.type==="project"&&m.repoTargets?.length){let S=await Ht(n,u.selectedTaskId);await ne();let A=S.synced+S.discovered+S.notFound;w=`Refreshed ${S.synced}/${A} targets`}else{let{disposition:S,task:A}=await Qn(n,u.selectedTaskId);await ne(),h=S==="not_found"?`No PR found for ${A.branch}`:null,S!=="not_found"&&(w=`Refreshed checks: ${K(A)?.requiredChecks.length??0} reported`)}return b({...Ca(u,w),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:h})}async function La(){if(yn||a.mode!=="main")return;let p=l.tasks;yn=!0;try{if(await ao(n,p),Pn=null,a.mode!=="main")return;l=await Ct(t,a.shell,s),a={mode:"main",shell:b(a.shell)},y()}catch(u){let m=u instanceof Error?u.message:"Background PR discovery failed.";m!==Pn&&(Pn=m,ir(n,{context:"background PR polling",message:m,details:u instanceof Error?u.stack??u.message:String(u)}))}finally{yn=!1}}async function Ma(p){let u=b(p);if(!u.selectedTaskId)throw new Error("Select a task before closing it.");let{taskBeforeClose:m,task:h}=await je(async()=>{let w=await B(n,u.selectedTaskId),S=await Wo(n,u.selectedTaskId);return{taskBeforeClose:w,task:S}});for(let w of m.ptyTabs)F.disposeSession(w.id);return await ne(),b({...u,selectedActionId:"close-task",actionMessage:h.cleanup.preservedWorktree?`Archived task ${h.id}; worktree preserved`:`Archived task ${h.id}`})}async function Oa(p){let u=b(p);if(!u.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");if((await Te(n,{workspaceId:u.selectedWorkspaceId,includeClosed:!0})).tasks.length>0)throw new Error(`Cannot remove workspace ${u.selectedWorkspaceId} while task records still reference it.`);await kt(n,u.selectedWorkspaceId);let h=await Rt(n,u.selectedWorkspaceId);return await ne(),b({...u,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:`Removed workspace ${h.workspaceId}`})}async function Yr(p){let u=p.ptyTabs.find(w=>w.kind==="agent")??null;if(u){let w={...p,selectedPtyTabId:u.id};return await je(async()=>{let S=await B(n,p.id),A=S.ptyTabs.find(re=>re.kind==="agent")??null;A&&await E(n,{...S,selectedPtyTabId:A.id})}),w}let m=wa(p,"agent",void 0,r),h={...p,ptyTabs:[...p.ptyTabs,m],selectedPtyTabId:m.id};return await je(async()=>{let w=await B(n,p.id),S=w.ptyTabs.find(A=>A.kind==="agent")??null;if(S){await E(n,{...w,selectedPtyTabId:S.id});return}await E(n,{...w,ptyTabs:[...w.ptyTabs,m],selectedPtyTabId:m.id})}),h}y=()=>{Fa();let p=Fe(T.width,T.height),u=a.mode==="main"?sa(p,bi(b(a.shell),l),{centerOnly:a.shell.centerZoomed}):a.variant==="boot"?ea(p,{menuIndex:a.menuIndex,optionsMessage:a.optionsMessage,versionText:Ur,updateText:bn}):a.variant==="pause"?ta(p,{menuIndex:a.menuIndex,optionsMessage:a.optionsMessage,versionText:Ur,updateText:bn}):a.variant==="options"?Or(p,{menuIndex:a.menuIndex,optionsMenuItems:Wr}):a.variant==="runners"?Or(p,{menuIndex:xt(a).menuIndex,optionsMenuItems:_r(r,xt(a)),optionsMessage:ma(xt(a)),optionsSubtitle:"Runners"}):a.variant==="error-log"?ra(p,{errorLogPath:a.errorLog?.path??n.errorLogFile,errorLogLines:a.errorLog?.lines??[]}):na(p);G&&(T.moveTo(1,1),T.eraseDisplayBelow(),G=!1),T.noFormat(_p(u)),T.hideCursor(!0)};function Fa(){let p=a.mode==="main"&&a.shell.inputMode==="terminal"?"terminal":"control";p!==In&&(In=p,T.grabInput(p==="terminal"?{mouse:"button"}:!0))}let ja=()=>{process.stdout.off("resize",es),process.off("SIGCONT",ts),T.removeListener("key",Qr),T.removeListener("unknown",Jr),T.removeListener("mouse",Xr),ve&&(clearTimeout(ve),ve=null),Ee&&(clearTimeout(Ee),Ee=null),Ae&&(clearTimeout(Ae),Ae=null),$e&&(clearTimeout($e),$e=null),Et&&(clearInterval(Et),Et=null),F.disposeAll(),T.grabInput(!1),T.hideCursor(!1),T.fullscreen(!1)},xn=p=>{ja(),I(p)},Na=async()=>{if(a.mode!=="main"||V)return;let p=a.shell,u=p.taskPromptInput?.trim()??"";if(!p.selectedRepoId&&!p.selectedWorkspaceId){a={mode:"main",shell:b({...p,taskPromptError:"Select a workspace first."})},y();return}if(u.length===0){a={mode:"main",shell:b({...p,taskPromptError:"Task prompt cannot be empty."})},y();return}V=!0,a={mode:"main",shell:b({...p,actionMessage:`Creating ${p.selectedRunner} task in ${p.selectedWorkspaceId??p.selectedRepoId}...`})},y();let m=null;try{m=await Wp(n,p.selectedRepoId,p.selectedWorkspaceId,u,p.selectedRunner),await ne();let h=b({...a.shell,selectedRepoId:m.repoId,selectedWorkspaceId:m.workspaceId,selectedTaskId:m.id,selectedPtyTabId:m.selectedPtyTabId,selectedLeftItemId:`task:${m.id}`,activeTab:m.selectedPtyTabId??"agent",inputMode:"terminal",focusedRegion:"center",taskPromptInput:null,taskPromptError:null,actionMessage:null}),w=await F.ensureSession(m.id,h.selectedPtyTabId??ba(m,"agent"),vt(Fe(T.width,T.height)));j=qr(h.selectedPtyTabId),a={mode:"main",shell:He(h,w)},k(a.shell)}catch(h){h instanceof Rn&&(m=h.task);let w=U("create task",h,"Failed to create task.");m&&(await E(n,{...m,status:"draft",runnerSession:{...m.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:w}).catch(()=>{}),await ne().catch(()=>{})),a={mode:"main",shell:H(b({...a.shell,inputMode:"control",selectedTaskId:m?.id??a.shell.selectedTaskId,selectedPtyTabId:m?.selectedPtyTabId??a.shell.selectedPtyTabId,selectedLeftItemId:m?`task:${m.id}`:a.shell.selectedLeftItemId,activeTab:m?.selectedPtyTabId??a.shell.activeTab,taskPromptInput:m?null:"",taskPromptError:w,actionMessage:null}),w)}}finally{V=!1,y()}},Wa=p=>{if(a.mode!=="main")return;let u=a.shell;if(u.taskPromptInput!==null){if(p==="ESCAPE"){a={mode:"main",shell:b({...u,taskPromptInput:null,taskPromptError:null,actionMessage:null})},y();return}if(be(p)){Na();return}if(p==="BACKSPACE"){a={mode:"main",shell:b({...u,taskPromptInput:u.taskPromptInput.slice(0,-1),taskPromptError:null})},y();return}if(p==="CTRL_R"){a={mode:"main",shell:b({...u,selectedRunner:kr(u.selectedRunner,s),taskPromptError:null})},y();return}nn(p)&&(a={mode:"main",shell:b({...u,taskPromptInput:`${u.taskPromptInput}${p}`,taskPromptError:null})},y())}},_a=p=>{if(a.mode!=="main")return;let u=a.shell.workspaceBrowser;if(!u)return;if(p==="ESCAPE"){if(u.query!==null){a={mode:"main",shell:b({...a.shell,workspaceBrowser:{...u,query:null,selectedIndex:0,error:null}})},y();return}a={mode:"main",shell:b({...a.shell,workspaceBrowser:null,actionMessage:null})},y();return}let m=w=>{let S=Ra(u),A=Math.max(0,S.length-1);a={mode:"main",shell:b({...a.shell,workspaceBrowser:{...u,selectedIndex:Math.max(0,Math.min(A,u.selectedIndex+w)),error:null}})},y()};if(p==="/"&&u.query===null){a={mode:"main",shell:b({...a.shell,workspaceBrowser:{...u,query:"",selectedIndex:0,error:null}})},y();return}if(u.query!==null&&p==="BACKSPACE"){let w=u.query.slice(0,-1);a={mode:"main",shell:b({...a.shell,workspaceBrowser:{...u,query:w,selectedIndex:0,error:null}})},y();return}if(u.query!==null&&nn(p)){let w=`${u.query}${p}`;a={mode:"main",shell:b({...a.shell,workspaceBrowser:{...u,query:w,selectedIndex:0,error:null}})},y();return}let h=Ra(u);if(p==="UP"||p==="k"){m(-1);return}if(p==="DOWN"||p==="j"){m(1);return}if(p==="PAGE_UP"){m(-At(a.shell).pageRows);return}if(p==="PAGE_DOWN"){m(At(a.shell).pageRows);return}if(p==="MOUSE_WHEEL_UP"){m(-3);return}if(p==="MOUSE_WHEEL_DOWN"){m(3);return}if(p==="LEFT"||p==="h"){Cn(ot.dirname(u.cwd)).catch(w=>{let S=U("open parent workspace directory",w,"Failed to open parent directory.");a={mode:"main",shell:H(b({...a.shell,workspaceBrowser:{...u,error:S}}),S)},y()});return}if(p==="RIGHT"||p==="l"||be(p)){let w=h[u.selectedIndex]??null;if(!w)return;if((p==="RIGHT"||p==="l")&&(w.kind==="directory"||w.kind==="repo")){Cn(w.path).catch(S=>{let A=U("open workspace directory",S,"Failed to open directory.");a={mode:"main",shell:H(b({...a.shell,workspaceBrowser:{...u,error:A}}),A)},y()});return}wt(n,w.path).then(async S=>{await ne();let A=S.repos[0]??null;a={mode:"main",shell:b({...a.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${S.workspace.id}`,selectedWorkspaceId:S.workspace.id,selectedRepoId:A?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${S.workspace.name??S.workspace.id}`})},k(a.shell),y()}).catch(S=>{let A=U("add workspace",S,"Failed to add workspace.");a={mode:"main",shell:H(b({...a.shell,workspaceBrowser:{...u,error:A}}),A)},y()})}},Qr=p=>{let u=typeof p=="string"?p:"";if(a.mode==="main"&&a.shell.taskPromptInput!==null){Wa(u);return}if(a.mode==="main"&&a.shell.workspaceBrowser!==null){_a(u);return}if(a.mode==="main"){let m=ci(a.shell,u,At(a.shell));if(m.exit){xn(0);return}if(m.detachTerminal){F.detach(),a={mode:"main",shell:b(m.state)},k(a.shell),y();return}if(a.shell.inputMode==="terminal"){if(m.changed){a={mode:"main",shell:b(m.state)},k(a.shell),y();return}if(j&&be(u)){j=!1;return}j&&(j=!1),N=qp(u)?{key:u,at:Date.now()}:null;let h=Up(u,a.shell.terminal.scrolledBack??!1);if(h!==0){vn(h);return}F.writeKey(u);return}if(u==="CTRL_C"){xn(0);return}if(u==="?"&&a.shell.inputMode==="control"){a={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:a.shell},G=!0,y();return}if(m.pause){a={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:b(m.state)},G=!0,y();return}if(m.beginTaskPrompt){a={mode:"main",shell:b(m.state)},k(a.shell),y();return}if(m.openWorkspaceBrowser){Cn(t).catch(h=>{let w=U("browse workspaces",h,"Failed to browse workspaces.");a={mode:"main",shell:H(b({...m.state,workspaceBrowser:{cwd:t,entries:[],selectedIndex:0,query:null,error:w}}),w)},y()});return}if(m.createPtyTab){Aa(m.state,m.createPtyTabKind,m.createPtyTabRunner).then(h=>{zr(h)}).catch(h=>{let w=U("create PTY tab",h,"Failed to create tab.");a={mode:"main",shell:H(b({...m.state,actionMessage:w}),w)},y()});return}if(m.closePtyTab){$a(m.state).then(h=>{a={mode:"main",shell:h},k(a.shell),y()}).catch(h=>{let w=U("close PTY tab",h,"Failed to close tab.");a={mode:"main",shell:H(b({...m.state,actionMessage:w}),w)},y()});return}if(m.refreshPullRequestChecks){Da(m.state).then(h=>{a={mode:"main",shell:h},k(a.shell),y()}).catch(h=>{let w=U("refresh PR checks",h,"Failed to refresh PR checks.");a={mode:"main",shell:H(b({...m.state,actionMessage:w}),w)},y()});return}if(m.closeTask){Ma(m.state).then(h=>{a={mode:"main",shell:h},k(a.shell),y()}).catch(h=>{let w=U("close task",h,"Failed to close task.");a={mode:"main",shell:H(b({...m.state,actionMessage:w}),w)},y()});return}if(m.removeWorkspace){Oa(m.state).then(h=>{a={mode:"main",shell:h},k(a.shell),y()}).catch(h=>{let w=U("remove workspace",h,"Failed to remove workspace.");a={mode:"main",shell:H(b({...m.state,actionMessage:w}),w)},y()});return}if(m.attachTerminal){zr(m.state);return}if(m.refreshInspection){a={mode:"main",shell:b(m.state)},k(a.shell),y(),Hr(a.shell).catch(h=>{let w=U("refresh inspection",h,"Failed to refresh inspection.");a={mode:"main",shell:H(b({...a.shell,actionMessage:w}),w)},y()});return}m.changed&&(a={mode:"main",shell:b(m.state)},va(a.shell).catch(()=>{}),k(a.shell),y());return}if(a.variant==="help"){a.viaOptions&&a.parentVariant?a={mode:"overlay",variant:"options",menuIndex:2,optionsMessage:null,shell:a.shell,parentVariant:a.parentVariant}:a.parentVariant?a={mode:"overlay",variant:a.parentVariant,menuIndex:1,optionsMessage:null,shell:a.shell}:a={mode:"main",shell:b(a.shell)},G=!0,y();return}if(a.variant==="options"){Ba(u);return}if(a.variant==="runners"){Ua(u);return}if(a.variant==="error-log"){if(u==="ESCAPE"||be(u)){let m=a.parentVariant;a={mode:"overlay",variant:"options",menuIndex:1,optionsMessage:null,shell:a.shell,...m!==void 0?{parentVariant:m}:{}},G=!0,y()}return}if(a.optionsMessage){(u==="ESCAPE"||be(u))&&(a={...a,optionsMessage:null},y());return}if(u==="UP"||u==="k"){a={...a,menuIndex:Math.max(0,a.menuIndex-1)},y();return}if(u==="DOWN"||u==="j"){a={...a,menuIndex:Math.min(2,a.menuIndex+1)},y();return}if(u==="ESCAPE"){a.variant==="pause"&&(a={mode:"main",shell:b(a.shell)},G=!0,y());return}if(be(u)){if(a.menuIndex===0){let m=a.variant==="boot";a={mode:"main",shell:b({...a.shell,inputMode:"control"})},G=!0,y(),m?Ga.then(()=>{if(a.mode!=="main")return;let h=a.shell;Ia(h).then(w=>{a.mode!=="main"||a.shell!==h||(a={mode:"main",shell:w},k(a.shell),y())}).catch(w=>{if(a.mode!=="main"||a.shell!==h)return;let S=U("warm selected PTY",w,"Failed to start selected PTY.");a={mode:"main",shell:H(b(a.shell),S)},k(a.shell),y()})}):Sa();return}if(a.menuIndex===1){let m=a.variant==="boot"||a.variant==="pause"?a.variant:void 0;a={mode:"overlay",variant:"options",menuIndex:0,optionsMessage:null,shell:a.shell,...m!==void 0?{parentVariant:m}:{}},G=!0,y();return}xn(0)}};function Ba(p){if(a.mode!=="overlay"||a.variant!=="options")return;let u=ga(a.menuIndex,p);if(u.kind!=="noop"){if(u.kind==="render"){a={...a,menuIndex:u.menuIndex},y();return}if(u.kind==="back"){a.parentVariant&&(a={mode:"overlay",variant:a.parentVariant,menuIndex:1,optionsMessage:null,shell:a.shell},G=!0,y());return}if(u.kind==="help"){let m=a.parentVariant;a={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:a.shell,viaOptions:!0,...m!==void 0?{parentVariant:m}:{}},G=!0,y();return}if(u.kind==="runners"){let m=a.parentVariant;a={mode:"overlay",variant:"runners",menuIndex:0,optionsMessage:null,shell:a.shell,...m!==void 0?{parentVariant:m}:{}},G=!0,y();return}if(u.kind==="error-log"){let m=a.parentVariant;qa(m)}}}async function qa(p){let u;try{u=await xo(n)}catch(m){let h=U("open error log",m,"Failed to read Craig error log.");u={path:n.errorLogFile,lines:[`Unable to read error log: ${h}`],empty:!1}}a.mode==="overlay"&&(a={mode:"overlay",variant:"error-log",menuIndex:0,optionsMessage:null,shell:a.shell,errorLog:u,...p!==void 0?{parentVariant:p}:{}},G=!0,y())}function Ua(p){if(a.mode!=="overlay"||a.variant!=="runners")return;let u=ha(xt(a),r,p,s);if(u.kind!=="noop"){if(u.kind==="back"){let m=a.parentVariant;a={mode:"overlay",variant:"options",menuIndex:0,optionsMessage:null,shell:a.shell,...m!==void 0?{parentVariant:m}:{}},G=!0,y();return}if(u.kind==="render"){a={...a,runnerOptions:u.state},y();return}xa(u.config).then(()=>{a.mode!=="overlay"||a.variant!=="runners"||(a={...a,runnerOptions:u.state},y())}).catch(m=>{if(a.mode!=="overlay"||a.variant!=="runners")return;let h=U("save runner option",m,"Failed to save runner option."),w=H(b(a.shell),h);a={...a,shell:w,runnerOptions:{...xt(a),message:h}},y()})}}let Jr=p=>{let u=Bp(p);if(a.mode!=="main"||a.shell.inputMode!=="terminal"||u.length===0)return;if(u.includes("")){F.detach(),j=!1,N=null,a={mode:"main",shell:b({...a.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},k(a.shell),y();return}let m=Kp(u);if(m!==0){vn(m);return}let h=Vp(u);if(h){j=!1,N={key:h,at:Date.now()},F.writeKey(h);return}if(j&&u!=="\r"&&u!==`
|
|
159
159
|
`&&u!==`\r
|
|
160
|
-
`&&(
|
|
161
|
-
`).map((t,n)=>`\x1B[${n+1};1H${t}`).join("")}function
|
|
160
|
+
`&&(j=!1),Gp(j,N,u)){j=!1;return}F.write(u)},Xr=p=>{if(a.mode!=="main")return;if(a.shell.inputMode==="control"){Va(ka(p));return}let u=ka(p);u!==0&&vn(u)};function vn(p){v+=p,!ve&&(ve=setTimeout(()=>{ve=null;let u=v;v=0,u!==0&&(Ka(u),y())},16))}function Ka(p){F.scrollViewport(p),a={mode:"main",shell:it(a.shell)}}function Zr(){G=!0,T.fullscreen(!0)}function Va(p){p!==0&&(Z+=p,!Ee&&(Ee=setTimeout(()=>{Ee=null;let u=Z;if(Z=0,u===0||a.mode!=="main"||a.shell.inputMode!=="control")return;let m=Oe(a.shell,u,At(a.shell));if(m.changed){if(m.refreshInspection){a={mode:"main",shell:b(m.state)},k(a.shell),y(),Hr(a.shell).catch(h=>{let w=U("refresh inspection",h,"Failed to refresh inspection.");a={mode:"main",shell:H(b({...a.shell,actionMessage:w}),w)},y()});return}a={mode:"main",shell:b(m.state)},k(a.shell),y()}},16)))}let es=()=>{Zr(),a.mode==="main"&&a.shell.inputMode==="terminal"&&(F.resize(vt(Fe(T.width,T.height))),a={mode:"main",shell:it(a.shell)}),y()},ts=()=>{Zr(),a.mode==="main"&&a.shell.inputMode==="terminal"&&(F.resize(vt(Fe(T.width,T.height))),a={mode:"main",shell:it(a.shell)}),y()};process.stdout.on("resize",es),process.on("SIGCONT",ts),T.grabInput(!0),In="control",T.hideCursor(!0),T.fullscreen(!0),T.on("key",Qr),T.on("unknown",Jr),T.on("mouse",Xr),Et=setInterval(()=>{La()},(r.github?.watchIntervalSeconds??5)*1e3),fa().then(p=>{p.updateAvailable&&p.latest&&(bn=`Update available: v${p.latest}`,y())});let Ga=Vr().catch(()=>{});y()})}async function Ct(e,t,n){let r=Ce(e),[s,o,i]=await Promise.all([Ke(r),pe(r),Te(r)]),c=Pa(i.tasks,t),l=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},d=c?await Ao(c,l):null;return{workspaceRoot:e,workspaces:o.filter(f=>f.status==="active"),repos:s,tasks:i.tasks,inspection:d,...n?{enabledRunnerIds:n}:{}}}function Pa(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function Dp(e,t){return tn(e,t)}function Lp(e,t){let n=new Set(t);return e.filter(r=>{let s=r.path.split("/");for(let o=1;o<s.length;o+=1)if(n.has(s.slice(0,o).join("/")))return!1;return!0})}function Mp(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let r of e.tasks.filter(s=>s.workspaceId===n.id))t.push(`task:${r.id}`);n.kind==="project"&&t.push(`new-task-workspace:${n.id}`),n.kind==="repo"&&t.push(`new-task:${n.primaryRepoId}`)}else for(let n of e.repos){t.push(`repo:${n.id}`);for(let r of e.tasks.filter(s=>s.repoId===n.id))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function Op(e,t,n){let r=e.tasks.find(c=>c.ptyTabs.some(l=>l.id===t))??null,s=r?.ptyTabs.find(c=>c.id===t)??null,o=r?.worktreePath??n,i=s?.kind==="agent"?jp(s):[];return r?.type==="project"?{cwd:o,command:i,env:{GIT_CEILING_DIRECTORIES:Fp(process.env.GIT_CEILING_DIRECTORIES,o)}}:{cwd:o,command:i}}function Fp(e,t){let n=(e??"").split(ot.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(ot.delimiter):[...n,t].join(ot.delimiter)}function jp(e){return e.command.length>0?e.command:["codex"]}function xt(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Np(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function wa(e,t,n,r={}){let s=n??e.runner,o=ee(s),i=t==="agent"?o.defaultAgentTitle:"Terminal",c=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(k=>k.id)),d=1,f=c;for(;l.has(f);)d+=1,f=`${c}-${d}`;let g=new Date().toISOString(),R=n&&n!==e.runner?n:void 0;return{id:f,kind:t,...R?{runner:R}:{},title:d===1?i:`${i} ${d}`,command:t==="agent"?Y(s,void 0,r):[],createdAt:g,updatedAt:g}}async function Wp(e,t,n,r,s){let o=await we(e);$t(s,o);let i=n?await Bt(e,n,r,{runner:s,config:o}):await pt(e,t??"",r,{runner:s,config:o});try{let d=qe();await C(Ue(An(s,o).executable,{cwd:i.repoRoot,env:d}),["--help"],{cwd:i.repoRoot,env:d})}catch(d){let f=d instanceof Error?d.message:"Failed to start runner.",g={...i.task,status:"draft",runnerSession:{...i.task.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:f};throw await E(e,g),new Rn(f,g)}let c=ba(i.task,"agent"),l={...i.task,status:"running",selectedPtyTabId:c,runnerSession:{...i.task.runnerSession,startedAt:new Date().toISOString(),lastKnownState:"running"}};return await E(e,l),await ae({uiStateFile:e.uiStateFile},{...await ue({uiStateFile:e.uiStateFile})??Re(),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 Rn=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}};function ba(e,t){let n=e.ptyTabs.find(r=>r.kind===t);if(!n)throw new Error(`Task ${e.id} is missing its ${t} PTY tab.`);return n.id}function vt(e){return{columns:Math.max(20,e.width-me.leftWidth-me.rightWidth-me.dividerWidth-mn*2),rows:Math.max(5,e.height-me.topRailHeight-5)}}function _p(e){return e.split(`
|
|
161
|
+
`).map((t,n)=>`\x1B[${n+1};1H${t}`).join("")}function Bp(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function qp(e){return e.length===1||be(e)||e==="BACKSPACE"||e==="TAB"}function qr(e){return typeof e=="string"&&new RegExp(`:(?:agent|${W.join("|")})(?:-\\d+)?$`).test(e)}function Up(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 ka(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function Kp(e){let t=new RegExp("\x1B\\[<(\\d+);\\d+;\\d+[mM]").exec(e);if(!t?.[1])return 0;let n=Number.parseInt(t[1],10);return n===64?-3:n===65?3:0}function Vp(e){return e==="\x1B[13;2u"?"SHIFT_ENTER":null}function Gp(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
|
|
162
162
|
`||n===`\r
|
|
163
|
-
`)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}async function
|
|
163
|
+
`)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}async function Hp(e){let t=await xp(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=ot.join(e,r.name);n.push({name:r.name,path:s,kind:await zp(s)?"repo":"directory"})}return n.sort((r,s)=>r.kind!==s.kind?r.kind==="repo"?-1:1:r.name.localeCompare(s.name)),{cwd:e,entries:n,selectedIndex:0,query:null,error:null}}function Ra(e){let t=(e.query??"").trim().toLowerCase();return t?e.entries.filter(n=>n.name.toLowerCase().includes(t)||n.path.toLowerCase().includes(t)).sort((n,r)=>Ta(n,t)-Ta(r,t)||n.name.localeCompare(r.name)):e.entries}function Ta(e,t){let n=e.name.toLowerCase(),r=e.path.toLowerCase();return e.kind==="repo"&&n===t?0:e.kind==="repo"&&n.startsWith(t)?1:n===t?2:n.startsWith(t)?3:n.includes(t)?4:r.startsWith(t)?5:6}async function zp(e){let t=ot.join(e,".git");return await vp(t).catch(()=>null)!==null}function Tn(){return process.cwd()}async function Yp(){try{if(process.argv[2]==="__craig-daemon"){let c=process.argv[3]??Tn(),l=Ce(c);return await tt(c),await Ki(l),0}if(process.argv[2]==="__craig-daemon-shutdown"){let c=process.argv[3]??Tn(),l=Ce(c);return await tt(c),await Vi(l),0}let e=rs(process.argv.slice(2)),t=Tn(),n=Ce(t),r=await tt(t),s={paths:n};if(e.mode==="interactive")return await ya({uiStateFile:n.uiStateFile,workspaceRoot:n.workspaceRoot});if(!e.command)throw new Error("Command mode requires a command.");let o=await Io(e.command,s),i=Co(o);return i.length>0&&process.stdout.write(`${i}
|
|
164
164
|
`),0}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
|
|
165
|
-
`),1}}var
|
|
165
|
+
`),1}}var Qp=await Yp();process.exit(Qp);
|