craig-cli 0.13.0 → 0.13.2

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.
Files changed (3) hide show
  1. package/README.md +33 -1
  2. package/dist/cli.js +205 -68
  3. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -1,23 +1,25 @@
1
1
  #!/usr/bin/env node
2
- var Tp=Object.defineProperty;var xr=(e,t)=>{for(var r in t)Tp(e,r,{get:t[r],enumerable:!0})};import Y from"node:path";function ne(e){let t=Y.join(e,".craig");return{workspaceRoot:e,repoRoot:e,craigDir:t,indexFile:Y.join(t,"index.json"),reposDir:Y.join(t,"repos"),workspacesDir:Y.join(t,"workspaces"),sessionsDir:Y.join(t,"sessions"),runtimeDir:Y.join(t,"runtime"),uiStateFile:Y.join(t,"runtime","ui-state.json"),tasksDir:Y.join(t,"tasks"),jobsDir:Y.join(t,"jobs"),commandsDir:Y.join(t,"commands"),eventsDir:Y.join(t,"events"),orchestrationDir:Y.join(t,"orchestration"),logsDir:Y.join(t,"logs"),errorLogFile:Y.join(t,"logs","errors.log"),artifactsDir:Y.join(t,"artifacts"),worktreesDir:Y.join(t,"worktrees"),configFile:Y.join(t,"config.json")}}import{readFile as Cp}from"node:fs/promises";import{randomUUID as Rp}from"node:crypto";import{open as bp,readFile as Pp,rename as Sp,rm as vp}from"node:fs/promises";import Hn from"node:path";async function L(e,t){let r=Hn.dirname(e),n=Hn.join(r,`.${Hn.basename(e)}.${process.pid}.${Date.now()}.${Rp()}.tmp`),s=await bp(n,"w");try{let i=`${JSON.stringify(t,null,2)}
3
- `;await s.writeFile(i,"utf8"),await s.sync(),await s.close(),await Sp(n,e)}catch(i){throw await s.close().catch(()=>{}),await vp(n,{force:!0}).catch(()=>{}),i}}async function Dr(e){try{let t=await Pp(e,"utf8");return JSON.parse(t)}catch(t){if(Ip(t))return null;throw t}}function Ip(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}async function Rt(e){try{let t=await Cp(e.uiStateFile,"utf8"),r=JSON.parse(t);return Ap(r,e.uiStateFile)}catch(t){if(xp(t))return null;throw t}}async function We(e,t){await L(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function $r(){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 Ap(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")||!Tt(e,"inputMode")||!Tt(e,"focusedRegion")||!Tt(e,"activeTab")||!Tt(e,"inspectorSection")||!Tt(e,"inspectionMode")||!Or(e,"openInspectionKind")||!Or(e,"selectedFileTreePath")||!Or(e,"selectedFilePath")||!Or(e,"selectedDiffPath")||!Ep(e,"collapsedFileTreePaths")||!Tt(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 Tt(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function Or(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function Ep(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(r=>typeof r=="string"))}function xp(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var zn={};xr(zn,{RUNNER_IDS:()=>_,assertEnabled:()=>Qo,buildCommand:()=>ta,getConfiguredProfile:()=>Mr,getDefault:()=>Xo,getDisplayName:()=>ea,getEnabled:()=>Nr,getProfile:()=>bt,isRunnerType:()=>Lr,parse:()=>Zo,setRunnerEnabled:()=>ra,setRunnerPath:()=>na});var _=["codex","cursor","claude"];var Jo={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"}};var bt=e=>Jo[e];var Mr=(e,t={})=>{let r=bt(e),n=t.runners?.[e]?.path?.trim();return{...r,executable:n&&n.length>0?n:r.executable}};var Nr=(e={})=>_.filter(t=>e.runners?.[t]?.enabled!==!1);var Xo=(e={})=>{let t=Nr(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]};var Qo=(e,t={})=>{if(t.runners?.[e]?.enabled===!1)throw new Error(`Runner "${e}" is disabled in .craig/config.json.`)};var Lr=e=>_.includes(e);var Zo=e=>{if(!e||e.length===0)return"codex";if(!Lr(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${_.join(", ")}.`);return e};var ea=e=>bt(e).displayName;var ta=(e,t,r={})=>{let n=[Mr(e,r).executable];return t&&t.length>0&&n.push(t),n};var ra=(e,t,r)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:r}}});var na=(e,t,r)=>{let n=e.runners?.[t]??{},{path:s,...i}=n;return{...e,runners:{...e.runners??{},[t]:r!=null?{...n,path:r}:i}}};var Yn={};xr(Yn,{PREVIEW_FEATURE_IDS:()=>ge,isEnabled:()=>sa,setEnabled:()=>ia});var ge=["agentActivityIndicators","agentOrchestration"];function sa(e,t){return e.previews?.[t]===!0}function ia(e,t,r){return{...e,previews:{...e.previews,[t]:r}}}import{mkdir as Dp,readFile as Op,writeFile as $p}from"node:fs/promises";import Mp from"node:path";var Np=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",oa=async e=>{try{return await Op(e,"utf8")}catch(t){if(Np(t))return null;throw t}},aa=async(e,t)=>{await Dp(Mp.dirname(e),{recursive:!0}),await $p(e,t,"utf8")};var _r=(e,t)=>{if(typeof e!="object"||e===null)throw new Error(`Craig config at ${t} is invalid. Expected a JSON object.`);let r=e;if(r.runners!==void 0){if(typeof r.runners!="object"||r.runners===null||Array.isArray(r.runners))throw new Error(`Craig config at ${t} is invalid. "runners" must be an object.`);for(let[n,s]of Object.entries(r.runners)){if(!_.includes(n))throw new Error(`Craig config at ${t} is invalid. "runners.${n}" is not supported. Expected one of: ${_.join(", ")}.`);if(typeof s!="object"||s===null||Array.isArray(s))throw new Error(`Craig config at ${t} is invalid. "runners.${n}" must be an object.`);let i=s;if(i.enabled!==void 0&&typeof i.enabled!="boolean")throw new Error(`Craig config at ${t} is invalid. "runners.${n}.enabled" must be a boolean.`);if(i.path!==void 0&&(typeof i.path!="string"||i.path.trim().length===0))throw new Error(`Craig config at ${t} is invalid. "runners.${n}.path" must be a non-empty string.`)}}if(r.checks!==void 0&&(typeof r.checks!="object"||r.checks===null||!Array.isArray(r.checks.commands)||!r.checks.commands.every(n=>typeof n=="string")))throw new Error(`Craig config at ${t} is invalid. "checks.commands" must be an array of strings.`);if(r.open!==void 0&&(typeof r.open!="object"||r.open===null||!Array.isArray(r.open.command)||!r.open.command.every(n=>typeof n=="string")))throw new Error(`Craig config at ${t} is invalid. "open.command" must be an array of strings.`);if(r.github!==void 0){if(typeof r.github!="object"||r.github===null)throw new Error(`Craig config at ${t} is invalid. "github" must be an object.`);if(r.github.mergeMethod!==void 0&&r.github.mergeMethod!=="merge"&&r.github.mergeMethod!=="rebase"&&r.github.mergeMethod!=="squash")throw new Error(`Craig config at ${t} is invalid. "github.mergeMethod" must be "merge", "rebase", or "squash".`);if(r.github.watchIntervalSeconds!==void 0&&(!Number.isInteger(r.github.watchIntervalSeconds)||r.github.watchIntervalSeconds<=0))throw new Error(`Craig config at ${t} is invalid. "github.watchIntervalSeconds" must be a positive integer.`)}if(r.previews!==void 0){if(typeof r.previews!="object"||r.previews===null||Array.isArray(r.previews))throw new Error(`Craig config at ${t} is invalid. "previews" must be an object.`);for(let[n,s]of Object.entries(r.previews)){if(n!=="incrementalCenterPane"&&!ge.includes(n))throw new Error(`Craig config at ${t} is invalid. "previews.${n}" is not supported. Expected one of: ${ge.join(", ")}.`);if(typeof s!="boolean")throw new Error(`Craig config at ${t} is invalid. "previews.${n}" must be a boolean.`)}}return r};var Jn=async(e,t={readConfigFile:oa})=>{let r=await t.readConfigFile(e.configFile);if(!r)return{};if(r.trimStart()[0]!=="{")throw new Error(`Craig config at ${e.configFile} is malformed. Remove or repair the file before rerunning Craig.`);let n;try{n=JSON.parse(r)}catch{throw new Error(`Craig config at ${e.configFile} is malformed. Remove or repair the file before rerunning Craig.`)}return _r(n,e.configFile)};var Xn=async(e,t,r={writeConfigFile:aa})=>{_r(t,e.configFile),await r.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
4
- `)};var Qn={};xr(Qn,{checkForUpdate:()=>la,getCurrent:()=>jr});var jr=()=>{try{return"0.13.0"}catch{return"unknown"}};var Lp="https://registry.npmjs.org/craig-cli/latest",_p=3600*1e3,jp={value:null},Fp=(e,t)=>{let r=c=>c.split(".").map(Number),[n=0,s=0,i=0]=r(e),[o=0,a=0,l=0]=r(t);return n!==o?n>o:s!==a?s>a:i>l},la=async(e={fetch:globalThis.fetch,getCurrent:jr,cache:jp})=>{let t=e.getCurrent(),r=Date.now();if(e.cache.value&&r-e.cache.value.cachedAt<_p)return e.cache.value.result;let n=null;try{let i=await e.fetch(Lp,{signal:AbortSignal.timeout(5e3)});i.ok&&(n=(await i.json()).version??null)}catch{}let s={current:t,latest:n,updateAvailable:n!==null&&n!==t&&Fp(n,t)};return e.cache.value={result:s,cachedAt:r},s};var k={load:Jn,save:Xn,previews:Yn,runners:zn,version:Qn};var ca={CLI_USAGE:2,INPUT_REQUIRED:2,WORKSPACE_CONTEXT_NOT_FOUND:3,WORKSPACE_CONTEXT_INVALID:4,WORKSPACE_NOT_FOUND:3,WORKSPACE_RECORD_INVALID:2,TASK_CONTEXT_NOT_FOUND:3,TASK_CONTEXT_AMBIGUOUS:4,TASK_CONTEXT_CONFLICT:4,TASK_NOT_FOUND:3,TASK_RECORD_INVALID:2,REPO_NOT_FOUND:3,REPO_RECORD_INVALID:2,PR_REPOSITORY_MISMATCH:4,PR_BRANCH_MISMATCH:4,EXTERNAL_DEPENDENCY_FAILED:5,OPERATION_TIMEOUT:6,OPERATION_CANCELLED:6,EVENT_CURSOR_INVALID:2,EVENT_CURSOR_EXPIRED:4,EVENT_JOURNAL_CORRUPT:2,COMMAND_NOT_FOUND:3,COMMAND_RECORD_INVALID:2,COMMAND_STATE_CONFLICT:4,PARTIAL_RESULT:7,INTERNAL_ERROR:1},g=class extends Error{code;exitCode;retryable;details;constructor(t,r,n){super(r,n.cause===void 0?void 0:{cause:n.cause}),this.name="CraigError",this.code=t,this.exitCode=ca[t],this.retryable=n.retryable??!1,this.details=n.details??{}}};function Zn(e){return e instanceof g?e:new g("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as Wp,mkdir as qp,readFile as Up}from"node:fs/promises";import Bp from"node:path";var da=80,es=async(e,t)=>{await qp(Bp.dirname(e.errorLogFile),{recursive:!0}),await Wp(e.errorLogFile,Vp(t),"utf8")},ua=async(e,t)=>{try{await es(e,t)}catch{}},ts=async(e,t=da)=>{try{let n=(await Up(e.errorLogFile,"utf8")).trimEnd().split(`
5
- `).filter(s=>s.length>0);return{path:e.errorLogFile,lines:n.slice(Math.max(0,n.length-t)),empty:n.length===0}}catch(r){if(Kp(r))return{path:e.errorLogFile,lines:[],empty:!0};throw r}},pa=async(e,t=da)=>ts(e,t);function Vp(e){let r=[`[${new Date().toISOString()}] ${e.context}`,`message: ${e.message}`];return e.details&&e.details.trim().length>0&&(r.push("details:"),r.push(...e.details.trimEnd().split(`
6
- `).map(n=>` ${n}`))),`${r.join(`
2
+ var Vg=Object.defineProperty;var ds=(e,t)=>{for(var n in t)Vg(e,n,{get:t[n],enumerable:!0})};import ce from"node:path";function Te(e){let t=ce.join(e,".craig");return{workspaceRoot:e,repoRoot:e,craigDir:t,indexFile:ce.join(t,"index.json"),reposDir:ce.join(t,"repos"),workspacesDir:ce.join(t,"workspaces"),sessionsDir:ce.join(t,"sessions"),runtimeDir:ce.join(t,"runtime"),uiStateFile:ce.join(t,"runtime","ui-state.json"),tasksDir:ce.join(t,"tasks"),jobsDir:ce.join(t,"jobs"),commandsDir:ce.join(t,"commands"),eventsDir:ce.join(t,"events"),orchestrationDir:ce.join(t,"orchestration"),logsDir:ce.join(t,"logs"),errorLogFile:ce.join(t,"logs","errors.log"),artifactsDir:ce.join(t,"artifacts"),worktreesDir:ce.join(t,"worktrees"),configFile:ce.join(t,"config.json")}}import Uf from"node:path";import{readFile as Zg}from"node:fs/promises";import{randomUUID as Gg}from"node:crypto";import{chmod as Hg,open as zg,readFile as Yg,rename as Jg,rm as Xg}from"node:fs/promises";import po from"node:path";async function U(e,t,n={}){let r=po.dirname(e),s=po.join(r,`.${po.basename(e)}.${process.pid}.${Date.now()}.${Gg()}.tmp`),i=await zg(s,"w",n.mode);try{let o=`${JSON.stringify(t,null,2)}
3
+ `;await i.writeFile(o,"utf8"),await i.sync(),await i.close(),await Jg(s,e),n.mode!==void 0&&await Hg(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await Xg(s,{force:!0}).catch(()=>{}),o}}async function us(e){try{let t=await Yg(e,"utf8");return JSON.parse(t)}catch(t){if(Qg(t))return null;throw t}}function Qg(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}async function bn(e){try{let t=await Zg(e.uiStateFile,"utf8"),n=JSON.parse(t);return ey(n,e.uiStateFile)}catch(t){if(ny(t))return null;throw t}}async function vt(e,t){await U(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function fs(){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 ey(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")||!Tn(e,"inputMode")||!Tn(e,"focusedRegion")||!Tn(e,"activeTab")||!Tn(e,"inspectorSection")||!Tn(e,"inspectionMode")||!ps(e,"openInspectionKind")||!ps(e,"selectedFileTreePath")||!ps(e,"selectedFilePath")||!ps(e,"selectedDiffPath")||!ty(e,"collapsedFileTreePaths")||!Tn(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 Tn(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function ps(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function ty(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function ny(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var fo={};ds(fo,{RUNNER_IDS:()=>J,assertEnabled:()=>fd,buildCommand:()=>gd,getConfiguredProfile:()=>ms,getDefault:()=>pd,getDisplayName:()=>hd,getEnabled:()=>hs,getProfile:()=>Rn,isRunnerType:()=>gs,parse:()=>md,setRunnerEnabled:()=>yd,setRunnerPath:()=>wd});var J=["codex","cursor","claude"];var ud={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"}};var Rn=e=>ud[e];var ms=(e,t={})=>{let n=Rn(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}};var hs=(e={})=>J.filter(t=>e.runners?.[t]?.enabled!==!1);var pd=(e={})=>{let t=hs(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]};var fd=(e,t={})=>{if(t.runners?.[e]?.enabled===!1)throw new Error(`Runner "${e}" is disabled in .craig/config.json.`)};var gs=e=>J.includes(e);var md=e=>{if(!e||e.length===0)return"codex";if(!gs(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${J.join(", ")}.`);return e};var hd=e=>Rn(e).displayName;var gd=(e,t,n={})=>{let r=[ms(e,n).executable];return t&&t.length>0&&r.push(t),r};var yd=(e,t,n)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}});var wd=(e,t,n)=>{let r=e.runners?.[t]??{},{path:s,...i}=r;return{...e,runners:{...e.runners??{},[t]:n!=null?{...r,path:n}:i}}};var mo={};ds(mo,{PREVIEW_FEATURE_IDS:()=>Me,isEnabled:()=>kd,setEnabled:()=>Td});var Me=["agentActivityIndicators","agentOrchestration"];function kd(e,t){return e.previews?.[t]===!0}function Td(e,t,n){return{...e,previews:{...e.previews,[t]:n}}}import{mkdir as ry,readFile as sy,writeFile as iy}from"node:fs/promises";import oy from"node:path";var ay=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",bd=async e=>{try{return await sy(e,"utf8")}catch(t){if(ay(t))return null;throw t}},Rd=async(e,t)=>{await ry(oy.dirname(e),{recursive:!0}),await iy(e,t,"utf8")};var ys=(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(!J.includes(r))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" is not supported. Expected one of: ${J.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 i=s;if(i.enabled!==void 0&&typeof i.enabled!="boolean")throw new Error(`Craig config at ${t} is invalid. "runners.${r}.enabled" must be a boolean.`);if(i.path!==void 0&&(typeof i.path!="string"||i.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.`)}if(n.previews!==void 0){if(typeof n.previews!="object"||n.previews===null||Array.isArray(n.previews))throw new Error(`Craig config at ${t} is invalid. "previews" must be an object.`);for(let[r,s]of Object.entries(n.previews)){if(r!=="incrementalCenterPane"&&!Me.includes(r))throw new Error(`Craig config at ${t} is invalid. "previews.${r}" is not supported. Expected one of: ${Me.join(", ")}.`);if(typeof s!="boolean")throw new Error(`Craig config at ${t} is invalid. "previews.${r}" must be a boolean.`)}}return n};var ho=async(e,t={readConfigFile:bd})=>{let n=await t.readConfigFile(e.configFile);if(!n)return{};if(n.trimStart()[0]!=="{")throw new Error(`Craig config at ${e.configFile} is malformed. Remove or repair the file before rerunning Craig.`);let r;try{r=JSON.parse(n)}catch{throw new Error(`Craig config at ${e.configFile} is malformed. Remove or repair the file before rerunning Craig.`)}return ys(r,e.configFile)};var go=async(e,t,n={writeConfigFile:Rd})=>{ys(t,e.configFile),await n.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
4
+ `)};var yo={};ds(yo,{checkForUpdate:()=>Sd,getCurrent:()=>ws});var ws=()=>{try{return"0.13.2"}catch{return"unknown"}};var ly="https://registry.npmjs.org/craig-cli/latest",cy=3600*1e3,dy={value:null},uy=(e,t)=>{let n=c=>c.split(".").map(Number),[r=0,s=0,i=0]=n(e),[o=0,a=0,l=0]=n(t);return r!==o?r>o:s!==a?s>a:i>l},Sd=async(e={fetch:globalThis.fetch,getCurrent:ws,cache:dy})=>{let t=e.getCurrent(),n=Date.now();if(e.cache.value&&n-e.cache.value.cachedAt<cy)return e.cache.value.result;let r=null;try{let i=await e.fetch(ly,{signal:AbortSignal.timeout(5e3)});i.ok&&(r=(await i.json()).version??null)}catch{}let s={current:t,latest:r,updateAvailable:r!==null&&r!==t&&uy(r,t)};return e.cache.value={result:s,cachedAt:n},s};var k={load:ho,save:go,previews:mo,runners:fo,version:yo};var Pd={CLI_USAGE:2,INPUT_REQUIRED:2,WORKSPACE_CONTEXT_NOT_FOUND:3,WORKSPACE_CONTEXT_INVALID:4,WORKSPACE_NOT_FOUND:3,WORKSPACE_RECORD_INVALID:2,TASK_CONTEXT_NOT_FOUND:3,TASK_CONTEXT_AMBIGUOUS:4,TASK_CONTEXT_CONFLICT:4,TASK_NOT_FOUND:3,TASK_RECORD_INVALID:2,REPO_NOT_FOUND:3,REPO_RECORD_INVALID:2,PR_REPOSITORY_MISMATCH:4,PR_BRANCH_MISMATCH:4,EXTERNAL_DEPENDENCY_FAILED:5,OPERATION_TIMEOUT:6,OPERATION_CANCELLED:6,EVENT_CURSOR_INVALID:2,EVENT_CURSOR_EXPIRED:4,EVENT_JOURNAL_CORRUPT:2,COMMAND_NOT_FOUND:3,COMMAND_RECORD_INVALID:2,COMMAND_STATE_CONFLICT:4,CAPABILITY_NOT_FOUND:3,CAPABILITY_RECORD_INVALID:2,CAPABILITY_DENIED:4,DELEGATION_LIMIT_EXCEEDED:4,SWARM_DEFINITION_INVALID:2,SWARM_INPUT_INVALID:2,PARTIAL_RESULT:7,INTERNAL_ERROR:1},y=class extends Error{code;exitCode;retryable;details;constructor(t,n,r){super(n,r.cause===void 0?void 0:{cause:r.cause}),this.name="CraigError",this.code=t,this.exitCode=Pd[t],this.retryable=r.retryable??!1,this.details=r.details??{}}};function wo(e){return e instanceof y?e:new y("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as py,mkdir as fy,readFile as my}from"node:fs/promises";import hy from"node:path";var Id=80,ko=async(e,t)=>{await fy(hy.dirname(e.errorLogFile),{recursive:!0}),await py(e.errorLogFile,gy(t),"utf8")},vd=async(e,t)=>{try{await ko(e,t)}catch{}},To=async(e,t=Id)=>{try{let r=(await my(e.errorLogFile,"utf8")).trimEnd().split(`
5
+ `).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(yy(n))return{path:e.errorLogFile,lines:[],empty:!0};throw n}},Cd=async(e,t=Id)=>To(e,t);function gy(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(`
6
+ `).map(r=>` ${r}`))),`${n.join(`
7
7
  `)}
8
8
 
9
- `}function Kp(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var Se={appendErrorLog:es,appendErrorLogBestEffort:ua,readErrorLog:ts,readRecentErrorLines:pa};function ka(e){let{commandTokens:t,options:r,help:n}=Hp(e);if(n)return fa({kind:"help"},r);if(t.length===0)return{mode:"interactive",options:r};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":zt(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:ha(o,"Repo path")};break;case"repo:list":zt(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:Z(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:ha(o,"Workspace path")};break;case"workspace:list":a=zp(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:Z(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:Z(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:Z(o,"Workspace id")};break;case"task:new":a=Jp(o);break;case"task:list":a=Yp(o);break;case"task:current":zt(o,"task current"),a={kind:"currentTask"};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:Z(o,"Task id")};break;case"task:pr":a=Xp(o);break;case"task:wait":a=sm(o);break;case"agent:list":zt(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=em(o);break;case"agent:send":a=tm(o);break;case"command:show":a={kind:"showPromptCommand",commandId:Z(o,"Command id")};break;case"command:list":zt(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:Z(o,"Command id")};break;case"command:wait":a=rm(o);break;case"events:list":a=ma(o,!1);break;case"events:watch":a=ma(o,!0);break;case"task:attach":a={kind:"attachTask",taskId:Z(o,"Task id")};break;case"task:logs":a={kind:"streamTaskLogs",taskId:Z(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:Z(o,"Task id")};break;case"task:focus":a={kind:"focusTask",taskId:Z(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:Z(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:Z(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:Z(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:wa(o,0,"Task id"),repoId:wa(o,1,"Repo id")},Ta(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:Z(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw S(`Unsupported command: ${t.join(" ")}`)}return fa(a,r)}function ya(e){let t=e[0]==="--"?e.slice(1):e,r=!0;for(let n of t){if(n==="--"){r=!1;continue}if(r&&n==="--json")return!0}return!1}function Gp(e){return{addWorkspace:"workspace.add",addRepo:"repo.add",listRepos:"repo.list",removeRepo:"repo.remove",listWorkspaces:"workspace.list",archiveWorkspace:"workspace.archive",restoreWorkspace:"workspace.restore",removeWorkspace:"workspace.remove",createTask:"task.new",listTasks:"task.list",currentTask:"task.current",showTask:"task.show",showCurrentTask:"task.show",showTaskPr:"task.pr.show",discoverTaskPr:"task.pr.discover",linkTaskPr:"task.pr.link",refreshTaskPr:"task.pr.refresh",unlinkTaskPr:"task.pr.unlink",listAgents:"agent.list",showAgentStatus:"agent.status",sendAgentPrompt:"agent.send",showPromptCommand:"command.show",listPromptCommands:"command.list",cancelPromptCommand:"command.cancel",waitPromptCommand:"command.wait",waitTask:"task.wait",listEvents:"events.list",watchEvents:"events.watch",attachTask:"task.attach",addTaskLink:"link.add",listTaskLinks:"link.list",refreshInteractiveState:"interactive.refresh",showSelectedTask:"task.show",streamTaskLogs:"task.logs",streamSelectedTaskLogs:"task.logs",showTaskDiff:"task.diff",showSelectedTaskDiff:"task.diff",focusTask:"task.focus",focusSelectedTask:"task.focus",openTask:"task.open",openSelectedTask:"task.open",runChecks:"task.check",runSelectedTaskChecks:"task.check",commitTask:"task.commit",commitSelectedTask:"task.commit",showContext:"context.show",help:"help",exit:"exit"}[e.kind]}function rs(){return["Craig commands:"," craig [--workspace-root <path>] [--task <id>] [--json] [--no-input] <command>"," craig context show Show resolved workspace, task, and agent-tab context"," craig repo add <path> 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 <id> Remove a registered repo"," craig workspace list [--archived] List workspaces"," craig workspace archive <id> Archive a workspace"," craig workspace restore <id> Restore an archived workspace"," craig workspace remove <id> Remove an archived workspace"," craig task new --repo <repo-id> [--runner codex|cursor|claude] <prompt>"," craig task new --workspace <workspace-id> [--runner codex|cursor|claude] <prompt>"," craig task list [--repo <repo-id>] List known Craig tasks"," craig task current Show the task resolved from flags, environment, or cwd"," craig task show [<id>] Show task details; omit id to use resolved context"," craig task pr show [<id>] [--repo <repo-id>]"," craig task pr discover [<id>] [--repo <repo-id>]"," craig task pr link [<id>] --pr <url|number> [--repo <repo-id>]"," craig task pr refresh [<id>] [--repo <repo-id>]"," craig task pr unlink [<id>] --pr <url|number> [--repo <repo-id>]"," craig agent list [--task <task-id>] List agent-tab and task roll-up states"," craig agent status [--task <task-id>] [--tab <tab-id>] Show agent state details"," craig agent send --task <task-id> [--tab <tab-id>] (--prompt <text> | --prompt-file <path> | --stdin)"," [--delivery when-ready|immediate] [--timeout <duration>] [--idempotency-key <key>]"," craig command show <command-id> Show a durable prompt command"," craig command list [--task <task-id>] List durable prompt commands"," craig command cancel <command-id> Cancel a queued prompt command"," craig command wait <command-id> [--state <states>] [--timeout <duration>]"," craig task wait [<id>] --state <states> [--tab <tab-id>] [--timeout <duration>]"," craig events list [--task <task-id>] [--type <glob>] [--after <cursor>] --json"," craig events watch [--task <task-id>] [--type <glob>] [--after <cursor>] [--format jsonl]"," craig task logs <id> Stream Craig-managed logs for a task"," craig task diff <id> Show the current worktree diff for a task"," craig task attach <id> Attach to a live task session"," craig task focus <id> Focus the tmux pane for a task"," craig task open <id> Open the task worktree or print its path"," craig task check <id> Run configured checks for a task"," craig task commit <id> Commit all task worktree changes"," craig link add <task-id> <repo-id> Add a linked repo to a task"," craig link list <task-id> List linked repos for a task"].join(`
10
- `)}function Hp(e){let t=[...e];t[0]==="--"&&t.shift();let r=[],n={json:!1,noInput:!1},s=new Set,i=!1,o=!0;for(let a=0;a<t.length;a+=1){let l=t[a];if(l==="--"){o=!1,r.push(l);continue}if(!o||!ga(l)){r.push(l);continue}if(s.has(l))throw S(`Global option ${l} may only be provided once.`);if(s.add(l),l==="--json"){n.json=!0;continue}if(l==="--no-input"){n.noInput=!0;continue}if(l==="--help"||l==="-h"){i=!0;continue}let c=t[a+1];if(c===void 0||c==="--"||ga(c))throw S(`Global option ${l} requires a value.`);a+=1,l==="--workspace-root"?n.workspaceRoot=j(c,"Workspace root"):n.taskId=j(c,"Task id")}return{commandTokens:r,options:n,help:i}}function zp(e){if(e.length===0)return{kind:"listWorkspaces",archived:!1};if(e.length===1&&e[0]==="--archived")return{kind:"listWorkspaces",archived:!0};throw S(`Unsupported command: workspace list ${e.join(" ")}`)}function Yp(e){if(e.length===0)return{kind:"listTasks"};if(e.length===2&&e[0]==="--repo")return{kind:"listTasks",repoId:j(e[1],"Repo id")};throw S(`Unsupported command: task list ${e.join(" ")}`)}function Jp(e){let t,r,n,s=[],i=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){i=!1;continue}if(!i||!["--repo","--workspace","--runner"].includes(l)){if(i&&l.startsWith("--"))throw S(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw S(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw S("Task option --repo may only be provided once.");t=j(c,"Repo id")}else if(l==="--workspace"){if(r!==void 0)throw S("Task option --workspace may only be provided once.");r=j(c,"Workspace id")}else{if(n!==void 0)throw S("Task option --runner may only be provided once.");try{n=k.runners.parse(c)}catch(d){throw S(d instanceof Error?d.message:"Unsupported runner.")}}}if(!t&&!r)throw S("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&r)throw S("Task creation accepts either '--repo' or '--workspace', not both.");let o=j(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...r?{workspaceId:r}:{},...n?{runner:n}:{},prompt:o}}function Xp(e){let[t,...r]=e;if(!["show","discover","link","refresh","unlink"].includes(t??""))throw S(`Unsupported command: task pr ${e.join(" ")}`);let n,s,i;for(let a=0;a<r.length;a+=1){let l=r[a];if(l!=="--repo"&&l!=="--pr"){if(l.startsWith("--"))throw S(`Unsupported task pr ${t} option: ${l}`);if(n!==void 0)throw S(`task pr ${t} accepts at most one task id.`);n=j(l,"Task id");continue}let c=r[a+1];if(c===void 0||c==="--")throw S(`Task PR option ${l} requires a value.`);if(a+=1,l==="--repo"){if(s!==void 0)throw S("Task PR option --repo may only be provided once.");s=j(c,"Repo id")}else{if(i!==void 0)throw S("Task PR option --pr may only be provided once.");i=j(c,"Pull request selector")}}if((t==="link"||t==="unlink")&&i===void 0)throw S(`task pr ${t} requires --pr <url|number>.`);if(t!=="link"&&t!=="unlink"&&i!==void 0)throw S(`task pr ${t} does not accept --pr.`);let o={...n?{taskId:n}:{},...s?{repoId:s}:{}};switch(t){case"show":return{kind:"showTaskPr",...o};case"discover":return{kind:"discoverTaskPr",...o};case"link":return{kind:"linkTaskPr",...o,pullRequest:i};case"refresh":return{kind:"refreshTaskPr",...o};case"unlink":return{kind:"unlinkTaskPr",...o,pullRequest:i};default:throw S(`Unsupported command: task pr ${e.join(" ")}`)}}var ns=300*1e3,Qp=new Set(["idle","working","ready","error"]),Zp=new Set(["queued","delivering","delivered","failed","cancelled"]);function em(e){if(e.length===0)return{kind:"showAgentStatus"};if(e.length===2&&e[0]==="--tab")return{kind:"showAgentStatus",tabId:j(e[1],"Agent tab id")};throw S(`Unsupported command: agent status ${e.join(" ")}`)}function tm(e){let t,r,n="when-ready",s=ns,i,o=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--prompt","--prompt-file","--stdin","--tab","--delivery","--timeout","--idempotency-key"].includes(l))throw S(`Unsupported agent send option: ${l}`);if(o.has(l))throw S(`Agent send option ${l} may only be provided once.`);if(o.add(l),l==="--stdin"){if(t)throw S("Agent send accepts exactly one prompt source.");t={source:"stdin"};continue}let c=e[a+1];if(c===void 0||c.startsWith("--"))throw S(`Agent send option ${l} requires a value.`);if(a+=1,l==="--prompt"||l==="--prompt-file"){if(t)throw S("Agent send accepts exactly one prompt source.");t=l==="--prompt"?{source:"inline",text:j(c,"Prompt")}:{source:"file",path:j(c,"Prompt file")}}else if(l==="--tab")r=j(c,"Agent tab id");else if(l==="--delivery"){if(c!=="when-ready"&&c!=="immediate")throw S('Agent send delivery must be "when-ready" or "immediate".');n=c}else l==="--timeout"?s=ss(c):i=j(c,"Idempotency key")}if(!t)throw S("Agent send requires --prompt, --prompt-file, or --stdin.");return{kind:"sendAgentPrompt",prompt:t,delivery:n,timeoutMs:s,...r?{tabId:r}:{},...i?{idempotencyKey:i}:{}}}function rm(e){let t=j(e[0]??"","Command id"),r,n=ns,s=new Set;for(let i=1;i<e.length;i+=1){let o=e[i];if(o!=="--state"&&o!=="--timeout")throw S(`Unsupported command wait option: ${o}`);if(s.has(o))throw S(`Command wait option ${o} may only be provided once.`);s.add(o);let a=e[i+1];if(a===void 0||a.startsWith("--"))throw S(`Command wait option ${o} requires a value.`);i+=1,o==="--state"?r=nm(a):n=ss(a)}return{kind:"waitPromptCommand",commandId:t,...r?{states:r}:{},timeoutMs:n}}function nm(e){let t=e.split(",").map(r=>r.trim()).filter(Boolean);if(t.length===0||t.some(r=>!Zp.has(r)))throw S(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function ma(e,t){let r,n,s="human",i=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--type","--after","--format"].includes(l))throw S(`Unsupported events ${t?"watch":"list"} option: ${l}`);if(!t&&l==="--format")throw S("--format is supported only by events watch.");if(i.has(l))throw S(`Events option ${l} may only be provided once.`);i.add(l);let c=e[a+1];if(c===void 0||c.startsWith("--"))throw S(`Events option ${l} requires a value.`);if(a+=1,l==="--type")r=j(c,"Event type glob");else if(l==="--after")n=j(c,"Event cursor");else if(c==="jsonl")s="jsonl";else throw S('Events watch format must be "jsonl".')}let o={...r?{typeGlob:r}:{},...n?{after:n}:{}};return t?{kind:"watchEvents",...o,format:s}:{kind:"listEvents",...o}}function sm(e){let t,r,n,s=ns,i=new Set;for(let o=0;o<e.length;o+=1){let a=e[o];if(!["--state","--tab","--timeout"].includes(a)){if(a.startsWith("--"))throw S(`Unsupported task wait option: ${a}`);if(t!==void 0)throw S("task wait accepts at most one task id.");t=j(a,"Task id");continue}if(i.has(a))throw S(`Task wait option ${a} may only be provided once.`);i.add(a);let l=e[o+1];if(l===void 0||l.startsWith("--"))throw S(`Task wait option ${a} requires a value.`);o+=1,a==="--state"?r=im(l):a==="--tab"?n=j(l,"Agent tab id"):s=ss(l)}if(!r)throw S("task wait requires --state <idle|working|ready|error>[,...].");return{kind:"waitTask",...t?{taskId:t}:{},states:r,...n?{tabId:n}:{},timeoutMs:s}}function im(e){let t=e.split(",").map(r=>r.trim()).filter(Boolean);if(t.length===0||t.some(r=>!Qp.has(r)))throw S(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function ss(e){let t=/^(\d+)(ms|s|m|h)$/.exec(e.trim());if(!t)throw S(`Invalid duration "${e}". Use values such as 500ms, 30s, 5m, or 1h.`);let r=Number(t[1]),n={ms:1,s:1e3,m:6e4,h:36e5}[t[2]],s=r*n;if(!Number.isSafeInteger(s))throw S(`Duration "${e}" is too large.`);return s}function fa(e,t){return{mode:"command",command:e,commandName:Gp(e),options:t}}function ga(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function zt(e,t){Ta(e,0,t)}function Ta(e,t,r){if(e.length!==t)throw S(`Command ${r} received an unexpected number of arguments.`)}function Z(e,t){if(e.length!==1)throw S(`${t} is required and must be provided once.`);return j(e[0],t)}function ha(e,t){return j(e.join(" "),t)}function wa(e,t,r){return j(e[t]??"",r)}function j(e,t){let r=e.trim();if(r.length===0)throw S(`${t} cannot be empty.`);return r}function S(e){return new g("CLI_USAGE",`${e}
9
+ `}function yy(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var it={appendErrorLog:ko,appendErrorLogBestEffort:vd,readErrorLog:To,readRecentErrorLines:Cd};function Dd(e){let{commandTokens:t,options:n,help:r}=ky(e);if(r)return Ed({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":ar(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:xd(o,"Repo path")};break;case"repo:list":ar(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:ae(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:xd(o,"Workspace path")};break;case"workspace:list":a=Ty(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:ae(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:ae(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:ae(o,"Workspace id")};break;case"task:new":a=Ry(o);break;case"task:create-child":a=Sy(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:ae(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:ae(o,"Task id")}};break;case"task:list":a=by(o);break;case"task:current":ar(o,"task current"),a={kind:"currentTask"};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:ae(o,"Task id")};break;case"task:pr":a=Py(o);break;case"task:wait":a=xy(o);break;case"agent:list":ar(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=Cy(o);break;case"agent:send":a=Ay(o);break;case"command:show":a={kind:"showPromptCommand",commandId:ae(o,"Command id")};break;case"command:list":ar(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:ae(o,"Command id")};break;case"command:wait":a=Ey(o);break;case"events:list":a=Ad(o,!1);break;case"events:watch":a=Ad(o,!0);break;case"swarm:validate":a={kind:"validateSwarm",file:ae(o,"Swarm file")};break;case"swarm:plan":a=$y(o);break;case"task:attach":a={kind:"attachTask",taskId:ae(o,"Task id")};break;case"task:logs":a={kind:"streamTaskLogs",taskId:ae(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:ae(o,"Task id")};break;case"task:focus":a={kind:"focusTask",taskId:ae(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:ae(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:ae(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:ae(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:$d(o,0,"Task id"),repoId:$d(o,1,"Repo id")},_d(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:ae(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw A(`Unsupported command: ${t.join(" ")}`)}return Ed(a,n)}function Nd(e){let t=e[0]==="--"?e.slice(1):e,n=!0;for(let r of t){if(r==="--"){n=!1;continue}if(n&&r==="--json")return!0}return!1}function wy(e){return{addWorkspace:"workspace.add",addRepo:"repo.add",listRepos:"repo.list",removeRepo:"repo.remove",listWorkspaces:"workspace.list",archiveWorkspace:"workspace.archive",restoreWorkspace:"workspace.restore",removeWorkspace:"workspace.remove",createTask:"task.new",createChildTask:"task.create-child",listTaskChildren:"task.children",cancelTaskTree:"task.cancel-tree",validateSwarm:"swarm.validate",planSwarm:"swarm.plan",listTasks:"task.list",currentTask:"task.current",showTask:"task.show",showCurrentTask:"task.show",showTaskPr:"task.pr.show",discoverTaskPr:"task.pr.discover",linkTaskPr:"task.pr.link",refreshTaskPr:"task.pr.refresh",unlinkTaskPr:"task.pr.unlink",listAgents:"agent.list",showAgentStatus:"agent.status",sendAgentPrompt:"agent.send",showPromptCommand:"command.show",listPromptCommands:"command.list",cancelPromptCommand:"command.cancel",waitPromptCommand:"command.wait",waitTask:"task.wait",listEvents:"events.list",watchEvents:"events.watch",attachTask:"task.attach",addTaskLink:"link.add",listTaskLinks:"link.list",refreshInteractiveState:"interactive.refresh",showSelectedTask:"task.show",streamTaskLogs:"task.logs",streamSelectedTaskLogs:"task.logs",showTaskDiff:"task.diff",showSelectedTaskDiff:"task.diff",focusTask:"task.focus",focusSelectedTask:"task.focus",openTask:"task.open",openSelectedTask:"task.open",runChecks:"task.check",runSelectedTaskChecks:"task.check",commitTask:"task.commit",commitSelectedTask:"task.commit",showContext:"context.show",help:"help",exit:"exit"}[e.kind]}function bo(){return["Craig commands:"," craig [--workspace-root <path>] [--task <id>] [--json] [--no-input] <command>"," craig context show Show resolved workspace, task, and agent-tab context"," craig repo add <path> 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 <id> Remove a registered repo"," craig workspace list [--archived] List workspaces"," craig workspace archive <id> Archive a workspace"," craig workspace restore <id> Restore an archived workspace"," craig workspace remove <id> Remove an archived workspace"," craig task new --repo <repo-id> [--runner codex|cursor|claude] <prompt>"," craig task new --workspace <workspace-id> [--runner codex|cursor|claude] <prompt>"," craig task create-child --parent <task-id> --repo <repo-id> [--runner codex|cursor|claude] [--idempotency-key <key>] <prompt>"," craig task children [<task-id>] List direct child tasks"," craig task cancel-tree [<task-id>] Cancel a task and all descendants"," craig task list [--repo <repo-id>] List known Craig tasks"," craig task current Show the task resolved from flags, environment, or cwd"," craig task show [<id>] Show task details; omit id to use resolved context"," craig task pr show [<id>] [--repo <repo-id>]"," craig task pr discover [<id>] [--repo <repo-id>]"," craig task pr link [<id>] --pr <url|number> [--repo <repo-id>]"," craig task pr refresh [<id>] [--repo <repo-id>]"," craig task pr unlink [<id>] --pr <url|number> [--repo <repo-id>]"," craig agent list [--task <task-id>] List agent-tab and task roll-up states"," craig agent status [--task <task-id>] [--tab <tab-id>] Show agent state details"," craig agent send --task <task-id> [--tab <tab-id>] (--prompt <text> | --prompt-file <path> | --stdin)"," [--delivery when-ready|immediate] [--timeout <duration>] [--idempotency-key <key>]"," craig command show <command-id> Show a durable prompt command"," craig command list [--task <task-id>] List durable prompt commands"," craig command cancel <command-id> Cancel a queued prompt command"," craig command wait <command-id> [--state <states>] [--timeout <duration>]"," craig task wait [<id>] --state <states> [--tab <tab-id>] [--timeout <duration>]"," craig events list [--task <task-id>] [--type <glob>] [--after <cursor>] --json"," craig events watch [--task <task-id>] [--type <glob>] [--after <cursor>] [--format jsonl]"," craig swarm validate <file> Validate a versioned swarm YAML definition"," craig swarm plan <file> [--input key=value] Build a deterministic, side-effect-free plan"," craig task logs <id> Stream Craig-managed logs for a task"," craig task diff <id> Show the current worktree diff for a task"," craig task attach <id> Attach to a live task session"," craig task focus <id> Focus the tmux pane for a task"," craig task open <id> Open the task worktree or print its path"," craig task check <id> Run configured checks for a task"," craig task commit <id> Commit all task worktree changes"," craig link add <task-id> <repo-id> Add a linked repo to a task"," craig link list <task-id> List linked repos for a task"].join(`
10
+ `)}function ky(e){let t=[...e];t[0]==="--"&&t.shift();let n=[],r={json:!1,noInput:!1},s=new Set,i=!1,o=!0;for(let a=0;a<t.length;a+=1){let l=t[a];if(l==="--"){o=!1,n.push(l);continue}if(!o||!Od(l)){n.push(l);continue}if(s.has(l))throw A(`Global option ${l} may only be provided once.`);if(s.add(l),l==="--json"){r.json=!0;continue}if(l==="--no-input"){r.noInput=!0;continue}if(l==="--help"||l==="-h"){i=!0;continue}let c=t[a+1];if(c===void 0||c==="--"||Od(c))throw A(`Global option ${l} requires a value.`);a+=1,l==="--workspace-root"?r.workspaceRoot=V(c,"Workspace root"):r.taskId=V(c,"Task id")}return{commandTokens:n,options:r,help:i}}function Ty(e){if(e.length===0)return{kind:"listWorkspaces",archived:!1};if(e.length===1&&e[0]==="--archived")return{kind:"listWorkspaces",archived:!0};throw A(`Unsupported command: workspace list ${e.join(" ")}`)}function by(e){if(e.length===0)return{kind:"listTasks"};if(e.length===2&&e[0]==="--repo")return{kind:"listTasks",repoId:V(e[1],"Repo id")};throw A(`Unsupported command: task list ${e.join(" ")}`)}function Ry(e){let t,n,r,s=[],i=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){i=!1;continue}if(!i||!["--repo","--workspace","--runner"].includes(l)){if(i&&l.startsWith("--"))throw A(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw A(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw A("Task option --repo may only be provided once.");t=V(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw A("Task option --workspace may only be provided once.");n=V(c,"Workspace id")}else{if(r!==void 0)throw A("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(u){throw A(u instanceof Error?u.message:"Unsupported runner.")}}}if(!t&&!n)throw A("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw A("Task creation accepts either '--repo' or '--workspace', not both.");let o=V(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function Sy(e){let t,n,r,s,i=[],o=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){o=!1;continue}if(!o||!["--parent","--repo","--runner","--idempotency-key"].includes(l)){if(o&&l.startsWith("--"))throw A(`Unsupported task create-child option: ${l}`);i.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw A(`Task option ${l} requires a value.`);if(a+=1,l==="--parent"){if(t)throw A("Task option --parent may only be provided once.");t=V(c,"Parent task id")}else if(l==="--repo"){if(n)throw A("Task option --repo may only be provided once.");n=V(c,"Repo id")}else if(l==="--runner"){if(r)throw A("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(u){throw A(u instanceof Error?u.message:"Unsupported runner.")}}else{if(s)throw A("Task option --idempotency-key may only be provided once.");s=V(c,"Idempotency key")}}if(!n)throw A("Child task creation requires '--repo <repo-id>'.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},repoId:n,prompt:V(i.join(" "),"Child task prompt"),...r?{runner:r}:{},...s?{idempotencyKey:s}:{}}}function Py(e){let[t,...n]=e;if(!["show","discover","link","refresh","unlink"].includes(t??""))throw A(`Unsupported command: task pr ${e.join(" ")}`);let r,s,i;for(let a=0;a<n.length;a+=1){let l=n[a];if(l!=="--repo"&&l!=="--pr"){if(l.startsWith("--"))throw A(`Unsupported task pr ${t} option: ${l}`);if(r!==void 0)throw A(`task pr ${t} accepts at most one task id.`);r=V(l,"Task id");continue}let c=n[a+1];if(c===void 0||c==="--")throw A(`Task PR option ${l} requires a value.`);if(a+=1,l==="--repo"){if(s!==void 0)throw A("Task PR option --repo may only be provided once.");s=V(c,"Repo id")}else{if(i!==void 0)throw A("Task PR option --pr may only be provided once.");i=V(c,"Pull request selector")}}if((t==="link"||t==="unlink")&&i===void 0)throw A(`task pr ${t} requires --pr <url|number>.`);if(t!=="link"&&t!=="unlink"&&i!==void 0)throw A(`task pr ${t} does not accept --pr.`);let o={...r?{taskId:r}:{},...s?{repoId:s}:{}};switch(t){case"show":return{kind:"showTaskPr",...o};case"discover":return{kind:"discoverTaskPr",...o};case"link":return{kind:"linkTaskPr",...o,pullRequest:i};case"refresh":return{kind:"refreshTaskPr",...o};case"unlink":return{kind:"unlinkTaskPr",...o,pullRequest:i};default:throw A(`Unsupported command: task pr ${e.join(" ")}`)}}var Ro=300*1e3,Iy=new Set(["idle","working","ready","error"]),vy=new Set(["queued","delivering","delivered","failed","cancelled"]);function Cy(e){if(e.length===0)return{kind:"showAgentStatus"};if(e.length===2&&e[0]==="--tab")return{kind:"showAgentStatus",tabId:V(e[1],"Agent tab id")};throw A(`Unsupported command: agent status ${e.join(" ")}`)}function Ay(e){let t,n,r="when-ready",s=Ro,i,o=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--prompt","--prompt-file","--stdin","--tab","--delivery","--timeout","--idempotency-key"].includes(l))throw A(`Unsupported agent send option: ${l}`);if(o.has(l))throw A(`Agent send option ${l} may only be provided once.`);if(o.add(l),l==="--stdin"){if(t)throw A("Agent send accepts exactly one prompt source.");t={source:"stdin"};continue}let c=e[a+1];if(c===void 0||c.startsWith("--"))throw A(`Agent send option ${l} requires a value.`);if(a+=1,l==="--prompt"||l==="--prompt-file"){if(t)throw A("Agent send accepts exactly one prompt source.");t=l==="--prompt"?{source:"inline",text:V(c,"Prompt")}:{source:"file",path:V(c,"Prompt file")}}else if(l==="--tab")n=V(c,"Agent tab id");else if(l==="--delivery"){if(c!=="when-ready"&&c!=="immediate")throw A('Agent send delivery must be "when-ready" or "immediate".');r=c}else l==="--timeout"?s=So(c):i=V(c,"Idempotency key")}if(!t)throw A("Agent send requires --prompt, --prompt-file, or --stdin.");return{kind:"sendAgentPrompt",prompt:t,delivery:r,timeoutMs:s,...n?{tabId:n}:{},...i?{idempotencyKey:i}:{}}}function Ey(e){let t=V(e[0]??"","Command id"),n,r=Ro,s=new Set;for(let i=1;i<e.length;i+=1){let o=e[i];if(o!=="--state"&&o!=="--timeout")throw A(`Unsupported command wait option: ${o}`);if(s.has(o))throw A(`Command wait option ${o} may only be provided once.`);s.add(o);let a=e[i+1];if(a===void 0||a.startsWith("--"))throw A(`Command wait option ${o} requires a value.`);i+=1,o==="--state"?n=Oy(a):r=So(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function Oy(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!vy.has(n)))throw A(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function Ad(e,t){let n,r,s="human",i=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--type","--after","--format"].includes(l))throw A(`Unsupported events ${t?"watch":"list"} option: ${l}`);if(!t&&l==="--format")throw A("--format is supported only by events watch.");if(i.has(l))throw A(`Events option ${l} may only be provided once.`);i.add(l);let c=e[a+1];if(c===void 0||c.startsWith("--"))throw A(`Events option ${l} requires a value.`);if(a+=1,l==="--type")n=V(c,"Event type glob");else if(l==="--after")r=V(c,"Event cursor");else if(c==="jsonl")s="jsonl";else throw A('Events watch format must be "jsonl".')}let o={...n?{typeGlob:n}:{},...r?{after:r}:{}};return t?{kind:"watchEvents",...o,format:s}:{kind:"listEvents",...o}}function xy(e){let t,n,r,s=Ro,i=new Set;for(let o=0;o<e.length;o+=1){let a=e[o];if(!["--state","--tab","--timeout"].includes(a)){if(a.startsWith("--"))throw A(`Unsupported task wait option: ${a}`);if(t!==void 0)throw A("task wait accepts at most one task id.");t=V(a,"Task id");continue}if(i.has(a))throw A(`Task wait option ${a} may only be provided once.`);i.add(a);let l=e[o+1];if(l===void 0||l.startsWith("--"))throw A(`Task wait option ${a} requires a value.`);o+=1,a==="--state"?n=Dy(l):a==="--tab"?r=V(l,"Agent tab id"):s=So(l)}if(!n)throw A("task wait requires --state <idle|working|ready|error>[,...].");return{kind:"waitTask",...t?{taskId:t}:{},states:n,...r?{tabId:r}:{},timeoutMs:s}}function $y(e){let t,n={};for(let r=0;r<e.length;r+=1){let s=e[r];if(s!=="--input"){if(s.startsWith("--"))throw A(`Unsupported swarm plan option: ${s}`);if(t!==void 0)throw A("swarm plan accepts exactly one definition file.");t=V(s,"Swarm file");continue}let i=e[r+1];if(i===void 0||i.startsWith("--"))throw A("Swarm plan option --input requires key=value.");r+=1;let o=i.indexOf("=");if(o<1)throw A(`Invalid swarm input "${i}". Use key=value.`);let a=V(i.slice(0,o),"Swarm input name");if(Object.hasOwn(n,a))throw A(`Swarm input "${a}" may only be provided once.`);n[a]=i.slice(o+1)}if(!t)throw A("swarm plan requires a definition file.");return{kind:"planSwarm",file:t,inputs:n}}function Dy(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Iy.has(n)))throw A(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function So(e){let t=/^(\d+)(ms|s|m|h)$/.exec(e.trim());if(!t)throw A(`Invalid duration "${e}". Use values such as 500ms, 30s, 5m, or 1h.`);let n=Number(t[1]),r={ms:1,s:1e3,m:6e4,h:36e5}[t[2]],s=n*r;if(!Number.isSafeInteger(s))throw A(`Duration "${e}" is too large.`);return s}function Ed(e,t){return{mode:"command",command:e,commandName:wy(e),options:t}}function Od(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function ar(e,t){_d(e,0,t)}function _d(e,t,n){if(e.length!==t)throw A(`Command ${n} received an unexpected number of arguments.`)}function ae(e,t){if(e.length!==1)throw A(`${t} is required and must be provided once.`);return V(e[0],t)}function xd(e,t){return V(e.join(" "),t)}function $d(e,t,n){return V(e[t]??"",n)}function V(e,t){let n=e.trim();if(n.length===0)throw A(`${t} cannot be empty.`);return n}function A(e){return new y("CLI_USAGE",`${e}
11
11
 
12
- ${rs()}`,{})}var pe=(e,t)=>{let r=is(e);if(!am(r))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return r},is=e=>{if(typeof e!="object"||e===null)return e;let t=e;return{...t,runner:os(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(r=>typeof r=="string"):[],ptyTabs:dm(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:lm(t.repoTargets),runnerSession:t.runnerSession??om(t),checks:wm(t),lastCommit:t.lastCommit??null,prs:km(t),artifacts:bm(t),cleanup:Pm(t)}},om=e=>{if(typeof e.title!="string")return null;let t=os(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},am=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"&&k.runners.isRunnerType(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(r=>typeof r=="string")&&typeof t.repoRoot=="string"&&typeof t.worktreePath=="string"&&typeof t.branch=="string"&&ba(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||cm(t.repoTargets))&&pm(t.runnerSession)&&mm(t.prompt)&&Pa(t.checks)&&Sa(t.lastCommit)&&gm(t.prs)&&hm(t.artifacts)&&Ia(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},lm=e=>{if(Array.isArray(e))return e.filter(Ra)},cm=e=>Array.isArray(e)&&e.every(Ra),Ra=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)&&Pa(t.checks)&&Sa(t.lastCommit)&&va(t.pullRequest)&&Ia(t.cleanup)},dm=e=>{if(ba(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 um(e.id,e.title,t,os(e.runner))},um=(e,t,r,n)=>{let s=k.runners.getProfile(n);return[{id:`${e}:agent`,kind:"agent",title:s.defaultAgentTitle,command:k.runners.buildCommand(n),createdAt:r,updatedAt:r},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:r,updatedAt:r}]},os=e=>e&&k.runners.isRunnerType(e)?e:"codex",ba=e=>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(r=>typeof r=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"),pm=e=>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),mm=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",Pa=e=>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"),Sa=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",va=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&fm(e.requiredChecks),fm=e=>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)),gm=e=>Array.isArray(e)&&e.every(va),hm=e=>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),Ia=e=>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),wm=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},km=e=>{if(Array.isArray(e.prs))return e.prs.map(ym);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:Ca(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:Aa(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},ym=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:Ca(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:Tm(t.reviewDecision),requiredChecks:Aa(t.requiredChecks),comments:Rm(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},Ca=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,Tm=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Rm=e=>Array.isArray(e)?e.flatMap(t=>{if(typeof t!="object"||t===null)return[];let r=t;return typeof r.body!="string"||!r.body.trim()?[]:[{author:typeof r.author=="string"?r.author:null,body:r.body,createdAt:typeof r.createdAt=="string"?r.createdAt:null,url:typeof r.url=="string"?r.url:null}]}):[],Aa=e=>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})):[],bm=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},Pm=e=>e.cleanup??{paneClosedAt:null,worktreeRemovedAt:null,preservedWorktree:!1,warning:null};import{readFile as lf}from"node:fs/promises";import{readFile as Sm,readdir as vm,rm as Im}from"node:fs/promises";import Ea from"node:path";var as=(e,t)=>Ea.join(e.workspacesDir,`${t}.json`),Cm=e=>{if(typeof e!="object"||e===null)return e;let t=e,r=t.repoId??t.primaryRepoId;return{...t,kind:t.kind??"repo",name:t.name??r??t.id,rootPath:t.rootPath??"",primaryRepoId:t.primaryRepoId??r??"",repoId:t.kind==="project"?t.repoId:r,discoveredRepoIds:Array.isArray(t.discoveredRepoIds)?t.discoveredRepoIds.filter(n=>typeof n=="string"):t.kind==="project"?[]:r?[r]:[],linkedRepoIds:Array.isArray(t.linkedRepoIds)?t.linkedRepoIds.filter(n=>typeof n=="string"):[]}},xa=(e,t)=>{let r=Cm(e);if(typeof r!="object"||r===null||typeof r.id!="string"||r.kind!=="repo"&&r.kind!=="project"||typeof r.name!="string"||typeof r.rootPath!="string"||typeof r.primaryRepoId!="string"||typeof r.branch!="string"||r.status!=="active"&&r.status!=="archived"||!Array.isArray(r.linkedRepoIds)||!(r.linkedRepoIds??[]).every(n=>typeof n=="string")||!(r.repoId===void 0||typeof r.repoId=="string")||!Array.isArray(r.discoveredRepoIds)||!(r.discoveredRepoIds??[]).every(n=>typeof n=="string")||!(r.archivedAt===null||typeof r.archivedAt=="string")||typeof r.createdAt!="string"||typeof r.updatedAt!="string")throw new Error(`Craig workspace record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return r},nt=async(e,t)=>{let r=as(e,t);try{let n=await Sm(r,"utf8");return xa(JSON.parse(n),r)}catch(n){throw Am(n)?new g("WORKSPACE_NOT_FOUND",`Craig workspace "${t}" was not found.`,{details:{workspaceId:t}}):n instanceof SyntaxError||n instanceof Error&&n.message.startsWith("Craig workspace record at ")?new g("WORKSPACE_RECORD_INVALID",n instanceof Error?n.message:`Craig workspace "${t}" is invalid.`,{details:{workspaceId:t},cause:n}):n}},st=async(e,t)=>{await L(as(e,t.id),{...t,updatedAt:new Date().toISOString()})},ae=async e=>{let t=await vm(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(n=>n.isFile()&&n.name.endsWith(".json")).map(n=>nt(e,Ea.basename(n.name,".json"))))).sort((n,s)=>n.id.localeCompare(s.id))},Da=async(e,t)=>{await Im(as(e,t),{force:!0})},Am=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as Em,readdir as xm,rm as Dm}from"node:fs/promises";import Oa from"node:path";var ls=(e,t)=>Oa.join(e.reposDir,`${t}.json`),$a=(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},me=async(e,t)=>{let r=ls(e,t);try{let n=await Em(r,"utf8");return $a(JSON.parse(n),r)}catch(n){throw Om(n)?new g("REPO_NOT_FOUND",`Craig repo "${t}" was not found.`,{details:{repoId:t}}):n instanceof SyntaxError||n instanceof Error&&n.message.startsWith("Craig repo record at ")?new g("REPO_RECORD_INVALID",n instanceof Error?n.message:`Craig repo "${t}" is invalid.`,{details:{repoId:t},cause:n}):n}},cs=async(e,t)=>{await L(ls(e,t.id),{...t,updatedAt:new Date().toISOString()})},Yt=async e=>{let t=await xm(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(n=>n.isFile()&&n.name.endsWith(".json")).map(n=>me(e,Oa.basename(n.name,".json"))))).sort((n,s)=>n.name.localeCompare(s.name)||n.id.localeCompare(s.id))},Ma=async(e,t)=>{await Dm(ls(e,t),{force:!0})},Om=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as $m}from"node:fs/promises";var Mm=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(r=>typeof r=="string")&&Array.isArray(t.workspaceIds)&&t.workspaceIds.every(r=>typeof r=="string")&&Array.isArray(t.taskIds)&&t.taskIds.every(r=>typeof r=="string")&&Array.isArray(t.jobIds)&&t.jobIds.every(r=>typeof r=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Pt=(e,t,r)=>{if(!Mm(e))throw new Error(`Craig index at ${r} is invalid. Remove or repair the file before rerunning Craig.`);if(e.workspaceRoot!==t)throw new Error(`Craig index at ${r} belongs to ${e.workspaceRoot}, not ${t}. Remove or repair the file before rerunning Craig.`);return e},se=async e=>{let t=await $m(e.indexFile,"utf8");return Pt(JSON.parse(t),e.workspaceRoot,e.indexFile)},ve=async(e,t)=>{await L(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as Fm,stat as Wm}from"node:fs/promises";import vt from"node:path";import{realpath as _a}from"node:fs/promises";import Fr from"node:path";import{execFile as Nm}from"node:child_process";import{promisify as Lm}from"node:util";var Na=Lm(Nm);async function C(e,t,r={}){try{let n=await Na(e,t,{cwd:r.cwd,env:r.env});return{stdout:n.stdout,stderr:n.stderr}}catch(n){if(La(n)){let s=n.stderr?.trim()||n.stdout?.trim()||n.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw n}}async function $(e,t,r={}){try{let n=await Na(e,t,{cwd:r.cwd,env:r.env});return{stdout:n.stdout,stderr:n.stderr,exitCode:0}}catch(n){if(La(n))return{stdout:n.stdout??"",stderr:n.stderr??"",exitCode:typeof n.code=="number"?n.code:null};throw n}}function La(e){return e instanceof Error}var ds=async e=>{try{let r=(await C("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[n,s]=await Promise.all([_a(r).catch(()=>Fr.resolve(r)),_a(e).catch(()=>Fr.resolve(e))]);return n===s}catch{return!1}},us=async e=>{let t=await $("git",["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"],{cwd:e}),r=t.stdout.trim().replace(/^origin\//,"");if(t.exitCode===0&&r.length>0)return r;for(let i of["main","master","trunk"])if((await $("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await C("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},ja=async e=>{let t=await $("git",["rev-parse","--path-format=absolute","--git-common-dir"],{cwd:e}),r=t.stdout.trim();if(t.exitCode!==0||r.length===0)return null;let n=Fr.resolve(e,r);return Fr.dirname(n)};import{mkdir as le,readFile as _m}from"node:fs/promises";var jm=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",St=async e=>{let t=ne(e);await le(t.craigDir,{recursive:!0}),await Promise.all([le(t.reposDir,{recursive:!0}),le(t.workspacesDir,{recursive:!0}),le(t.sessionsDir,{recursive:!0}),le(t.runtimeDir,{recursive:!0}),le(t.tasksDir,{recursive:!0}),le(t.jobsDir,{recursive:!0}),le(t.commandsDir,{recursive:!0}),le(t.eventsDir,{recursive:!0}),le(t.orchestrationDir,{recursive:!0}),le(t.logsDir,{recursive:!0}),le(t.artifactsDir,{recursive:!0}),le(t.worktreesDir,{recursive:!0})]);try{let s=await _m(t.indexFile,"utf8"),i=JSON.parse(s);return Pt(i,e,t.indexFile)}catch(s){if(!jm(s))throw s instanceof SyntaxError?new Error(`Craig index at ${t.indexFile} is malformed. Remove or repair the file before rerunning Craig.`):s}let r=new Date().toISOString(),n={version:2,workspaceRoot:e,repoIds:[],workspaceIds:[],taskIds:[],jobIds:[],createdAt:r,updatedAt:r};return await L(t.indexFile,n),n};var Fa=(e,t,r)=>{let n=new Date().toISOString();return{id:qm(e,vt.basename(t)),name:vt.basename(t),rootPath:t,defaultBranch:r,createdAt:n,updatedAt:n}},Wa=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},qm=(e,t)=>{let r=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"repo",n=`repo_${r}`,s=2;for(;e.some(i=>i.id===n);)n=`repo_${r}_${s}`,s+=1;return n},Um=(e,t)=>{let r=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"workspace",n=`workspace_${r}`,s=2;for(;e.some(i=>i.id===n);)n=`workspace_${r}_${s}`,s+=1;return n},qa=async(e,t)=>{let r=await se(e);await ve(e,{...r,repoIds:[...new Set([...r.repoIds,...t.repoIds])],workspaceIds:[...new Set([...r.workspaceIds,...t.workspaceIds])]})},Bm=async(e,t)=>{let r=await Fm(t,{withFileTypes:!0}),n=await Yt(e),s=[];for(let i of r){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=vt.join(t,i.name);if(!await ds(o))continue;let a=n.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await us(o);s.push(a?Wa(a,l):Fa([...n,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},Vm=async(e,t)=>{let r=await us(t),n=await Yt(e),s=n.find(u=>u.rootPath===t)??null,i=s?Wa(s,r):Fa(n,t,r),o=`workspace_${i.id}`,l=(await ae(e)).find(u=>u.id===o)??null,c=new Date().toISOString(),d=l??{id:o,kind:"repo",name:i.name,rootPath:t,primaryRepoId:i.id,repoId:i.id,discoveredRepoIds:[i.id],branch:r,status:"active",linkedRepoIds:[],archivedAt:null,createdAt:c,updatedAt:c};return await cs(e,i),l||await st(e,d),await qa(e,{repoIds:[i.id],workspaceIds:[d.id]}),{kind:"createWorkspace",workspace:d,repos:[i],created:!l}},Km=async(e,t)=>{let r=await Bm(e,t);if(r.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let n=await ae(e),s=Um(n,vt.basename(t)),i=n.find(c=>c.kind==="project"&&c.rootPath===t)??null,o=new Date().toISOString(),a=r.map(c=>c.id),l=i?{...i,discoveredRepoIds:a,primaryRepoId:a[0]??i.primaryRepoId,status:"active",archivedAt:null}:{id:s,kind:"project",name:vt.basename(t),rootPath:t,primaryRepoId:a[0]??"",discoveredRepoIds:a,branch:"project",status:"active",linkedRepoIds:a,archivedAt:null,createdAt:o,updatedAt:o};return await Promise.all(r.map(c=>cs(e,c))),await st(e,l),await qa(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:r,created:!i}},Jt=async(e,t)=>{await St(e.workspaceRoot);let r=vt.resolve(e.workspaceRoot,t);if(!(await Wm(r).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${r}`);return await ds(r)?Vm(e,r):Km(e,r)};var ps=async(e,t,r={listWorkspaceRecords:ae,ensureCraigState:St})=>(await r.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await r.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var ms=async(e,t,r={readWorkspace:nt,writeWorkspace:st})=>{let s={...await r.readWorkspace(e,t),status:"archived",archivedAt:new Date().toISOString()};return await r.writeWorkspace(e,s),{kind:"archiveWorkspace",workspaceId:s.id,status:s.status,branch:s.branch}};var fs=async(e,t)=>{let n={...await nt(e,t),status:"active",archivedAt:null};await st(e,n);let s=n.kind==="project"?n.discoveredRepoIds?.[0]??null:n.primaryRepoId;return{kind:"restoreWorkspace",workspaceId:n.id,status:n.status,branch:n.branch,primaryRepoId:s}};var it=async(e,t,r={deleteWorkspace:Da,readCraigIndex:se,writeCraigIndex:ve})=>{await r.deleteWorkspace(e,t);let n=await r.readCraigIndex(e);await r.writeCraigIndex(e,{...n,workspaceIds:n.workspaceIds.filter(s=>s!==t)})};var gs=async(e,t,r)=>{let n=await nt(e,t),s=await r.listTasks(e,{workspaceId:t,includeClosed:!0});if(n.status==="active")throw new Error(`Cannot remove workspace ${t} while it is active. Archive it first.`);if(s.tasks.length>0)throw new Error(`Cannot remove workspace ${t} while task records still reference it.`);return await it(e,t),{kind:"removeWorkspace",workspaceId:n.id,rootPath:n.rootPath??""}};import{readFile as Gm,realpath as Va,stat as Hm}from"node:fs/promises";import Wr from"node:path";async function hs(e){let t=await Ga(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return Ua(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return Ua(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let r=await Ba(t);if(r)return{workspaceRoot:r,source:"ancestor",initialized:!0};let n=await ja(t);if(n){let s=await Ba(n);if(s)return{workspaceRoot:s,source:"git_common_dir",initialized:!0}}if(e.allowUninitializedCwd)return{workspaceRoot:t,source:"cwd",initialized:!1};throw new g("WORKSPACE_CONTEXT_NOT_FOUND",`No Craig workspace was found from ${t}. Use --workspace-root <path> or run Craig inside an initialized workspace.`,{details:{cwd:t}})}async function Ua(e,t,r,n){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await Ga(Wr.resolve(r,e),s),o=await Ka(i);if(o)return{workspaceRoot:o,source:t,initialized:!0};if(n)return{workspaceRoot:i,source:t,initialized:!1};throw new g("WORKSPACE_CONTEXT_NOT_FOUND",`${s} ${i} is not an initialized Craig workspace.`,{details:{workspaceRoot:i,source:t}})}async function Ba(e){let t=e;for(;;){let r=await Ka(t);if(r)return r;let n=Wr.dirname(t);if(n===t)return null;t=n}}async function Ka(e){let t=ne(e);try{let r=await Gm(t.indexFile,"utf8"),n=JSON.parse(r),s=typeof n=="object"&&n!==null&&"workspaceRoot"in n&&typeof n.workspaceRoot=="string"?n.workspaceRoot:e,i=Pt(n,s,t.indexFile);if(await Va(i.workspaceRoot).catch(()=>Wr.resolve(i.workspaceRoot))!==e)throw new Error(`Craig index at ${t.indexFile} belongs to ${i.workspaceRoot}, not ${e}. Remove or repair the file before rerunning Craig.`);return i.workspaceRoot}catch(r){if(zm(r))return null;throw r instanceof g?r:new g("WORKSPACE_CONTEXT_INVALID",r instanceof Error?r.message:`Craig workspace at ${e} is invalid.`,{details:{workspaceRoot:e},cause:r})}}async function Ga(e,t){let r=Wr.resolve(e);try{if(!(await Hm(r)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${r} is not a directory.`,{details:{path:r}});return await Va(r)}catch(n){throw n instanceof g?n:new g("WORKSPACE_CONTEXT_NOT_FOUND",`${t} ${r} does not exist or cannot be read.`,{details:{path:r},cause:n})}}function zm(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var ws={};xr(ws,{addRepo:()=>Ha,listRegisteredRepos:()=>za,removeRepo:()=>Ya});import Ym from"node:path";import{stat as Jm}from"node:fs/promises";var Ha=async(e,t)=>{let r=Ym.resolve(e.workspaceRoot,t);if(!(await Jm(r).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${r}`);let s=await Jt(e,t),i=s.repos[0];if(!i||s.workspace.kind==="project")throw new Error(`Repo path is not a git repository: ${r}`);return{kind:"createRepo",repo:i,workspaceId:s.workspace.id,created:s.created}};var za=async(e,t={listRepos:Yt,ensureCraigState:St})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var Ya=async(e,t,r)=>{let n=await me(e,t),i=(await ae(e)).filter(c=>c.primaryRepoId===t),o=i.filter(c=>c.status==="active"),a=await r.listTasks(e,{repoId:t});if(o.length>0)throw new Error(`Cannot remove repo ${t} while active workspace records still reference it.`);if(a.tasks.length>0)throw new Error(`Cannot remove repo ${t} while task records still reference it.`);await Promise.all(i.map(c=>it(e,c.id))),await Ma(e,t);let l=await se(e);return await ve(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:n.id,rootPath:n.rootPath}};var X={addWorkspace:Jt,listWorkspaces:ps,archiveWorkspace:ms,restoreWorkspace:fs,removeWorkspace:gs,removeWorkspaceRecord:it,resolveContext:hs,repos:ws};import{mkdir as Ja,readFile as Xm,rm as Ur,stat as Qm,writeFile as Zm}from"node:fs/promises";import qr from"node:path";var ef=25,tf=3e4,rf=5e3;async function qe(e,t,r){let n=qr.join(e.runtimeDir,"task-locks"),s=qr.join(n,`${t}.lock`);await Ja(n,{recursive:!0});let i=Date.now();for(;;)try{await Ja(s);try{await Zm(qr.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await Ur(s,{recursive:!0,force:!0}),o}break}catch(o){if(!of(o))throw o;if(await nf(s))continue;if(Date.now()-i>=tf)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await af(ef)}try{return await r()}finally{await Ur(s,{recursive:!0,force:!0})}}async function nf(e){let t=await Xm(qr.join(e,"owner.json"),"utf8").then(n=>JSON.parse(n)).catch(()=>null);if(t&&typeof t.pid=="number")return sf(t.pid)?!1:(await Ur(e,{recursive:!0,force:!0}),!0);let r=await Qm(e).catch(()=>null);return!r||Date.now()-r.mtimeMs<rf?!1:(await Ur(e,{recursive:!0,force:!0}),!0)}function sf(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var of=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",af=e=>new Promise(t=>setTimeout(t,e));var Ie=async(e,t)=>{let r=await lf(Br(e,t),"utf8");return JSON.parse(r)},Xt=async(e,t)=>{let r=await Ie(e,t);return pe(r,Br(e,t))},Ce=async(e,t)=>{let r=Xa(t);await L(Br(e,t.id),r)},x=async(e,t,r)=>qe(e,t,async()=>{let n=await Xt(e,t),s=await r(n);if(s.id!==t)throw new Error(`Task mutation cannot change task id ${t} to ${s.id}.`);let i=Xa(s);return await L(Br(e,t),i),i}),ks=async(e,t)=>{let r=await se(e);r.taskIds.includes(t)||await ve(e,{...r,taskIds:[...r.taskIds,t]})},Br=(e,t)=>`${e.tasksDir}/${t}.json`,Xa=e=>({...e,updatedAt:new Date().toISOString()});var E=e=>e.prs.length===0?null:[...e.prs].reverse().find(r=>r.status!=="merged"&&r.status!=="closed")??e.prs[e.prs.length-1]??null,Ue=e=>e.status==="merged"||e.status==="closed",Ae=(e,t)=>{let r=e.prs.findIndex(s=>It(s,t)),n=r>=0?e.prs.map((s,i)=>i===r?t:s):[...e.prs,t];return{...e,prs:n}},It=(e,t)=>e.number===null||t.number===null||e.number!==t.number?!1:!e.owner||!e.repo||!t.owner||!t.repo?!0:e.owner.toLowerCase()===t.owner.toLowerCase()&&e.repo.toLowerCase()===t.repo.toLowerCase(),ot=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(r=>r.status!=="merged"&&r.status!=="closed")??e[e.length-1];return Kr(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},Kr=e=>e.mergeable&&!cf(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),cf=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",ys=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),Ee=(e,t,r)=>{let n=e.isDraft??!1,s=df(e.state,n);return{provider:"github",owner:r?.owner??t?.owner??null,repo:r?.name??t?.repo??null,number:e.number,url:e.url,title:e.title??t?.title??null,status:s,draft:n,baseBranch:e.baseRefName,headBranch:e.headRefName,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:uf(e.reviewDecision??null),requiredChecks:Ts(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:gf(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}},df=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,uf=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Ts=e=>{let t=e.map(n=>pf(n)).filter(n=>n!==null),r=new Map;for(let n of t){let s=r.get(n.name);(!s||mf(s,n))&&r.set(n.name,n)}return[...r.values()].map(n=>({name:n.name,status:n.status,conclusion:n.conclusion}))},pf=e=>{if(typeof e!="object"||e===null)return null;let t=e,r=t.name??t.context,n=t.state??t.status??t.conclusion;return r?{name:r,status:Za(n??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:ff(t)}:null},mf=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):Vr(e)&&!Vr(t)?!0:!Vr(e)&&Vr(t)?!1:Qa(t.status)>=Qa(e.status),Vr=e=>e.conclusion?.toUpperCase()==="CANCELLED",Qa=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},ff=e=>{let t=e.completedAt??e.startedAt??e.createdAt??null;if(!t)return null;let r=new Date(t).getTime();return Number.isFinite(r)?r:null},gf=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(hf).filter(r=>r!==null).slice(-4):[]},hf=e=>{if(typeof e!="object"||e===null)return null;let t=e,r=wf(t.bodyText??t.body??"");return r?{author:typeof t.author=="string"?t.author:t.author?.login??null,body:r,createdAt:t.createdAt??null,url:t.url??null}:null},wf=e=>e.replace(/\s+/g," ").trim(),Za=(e,t)=>{let r=e?.toUpperCase()??null,n=t?.toUpperCase()??null;return n==="SKIPPED"||r==="SKIPPED"?"skipped":r==="SUCCESS"||n==="SUCCESS"||n==="NEUTRAL"?"success":r==="PENDING"||r==="EXPECTED"||r==="IN_PROGRESS"||r==="QUEUED"||r==="REQUESTED"||r==="WAITING"?"pending":r==="FAILURE"||r==="FAILED"||r==="ERROR"||r==="TIMED_OUT"||r==="CANCELLED"||r==="ACTION_REQUIRED"||r==="STARTUP_FAILURE"||n==="FAILURE"||n==="FAILED"||n==="ERROR"||n==="TIMED_OUT"||n==="CANCELLED"||n==="ACTION_REQUIRED"||n==="STARTUP_FAILURE"?"failed":r==="COMPLETED"&&n===null?"unknown":r==="COMPLETED"&&n!==null?Za(n,n):"unknown"};var fe=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as kf}from"node:fs/promises";import el from"node:path";var A=async(e,t,r={readRawTask:Ie,validateTaskRecord:pe})=>{try{let n=await r.readRawTask(e,t);return r.validateTaskRecord(n,`${e.tasksDir}/${t}.json`)}catch(n){throw Pf(n)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):Sf(n)?new g("TASK_RECORD_INVALID",n instanceof Error?n.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:n}):n}},J=async e=>{if(!await Rs(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Ct=(e,t)=>t.artifacts.logPath?el.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:el.join(e.workspaceRoot,t.artifacts.logPath):null,Qt=async(e,t)=>{let r=await Rs(t.worktreePath),n=Ct(e,t),s=n?await Rs(n):!1;return{worktreeExists:r,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:yf(t),lastCommitSummary:Tf(t),prSummary:Rf(t),cleanupSummary:bf(t)}},Rs=async e=>{try{return await kf(e),!0}catch{return!1}},yf=e=>{let t=e.checks.commands.length,r=t===1?"command":"commands",n=e.checks.lastRunAt?` at ${e.checks.lastRunAt}`:"";return`${e.checks.status} (${t} ${r})${n}`},Tf=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",Rf=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 i=s.map(l=>` ${l.repoId} #${l.pullRequest.number} ${l.pullRequest.status??"unknown"}`),o=s.reduce((l,c)=>{let d=c.pullRequest.status??"unknown";return l[d]=(l[d]??0)+1,l},{}),a=Object.entries(o).map(([l,c])=>`${c} ${l}`).join(", ");return`${s.length} PR${s.length!==1?"s":""} (${a})
12
+ ${bo()}`,{})}var $e=(e,t)=>{let n=Po(e);if(!_y(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},Po=e=>{if(typeof e!="object"||e===null)return e;let t=e;return{...t,runner:Io(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"):[],parentTaskId:typeof t.parentTaskId=="string"||t.parentTaskId===null?t.parentTaskId:null,rootTaskId:typeof t.rootTaskId=="string"?t.rootTaskId:t.id,delegationDepth:Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0?t.delegationDepth:0,delegationIdempotencyKey:typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null?t.delegationIdempotencyKey:null,swarmRunId:typeof t.swarmRunId=="string"||t.swarmRunId===null?t.swarmRunId:null,swarmStepId:typeof t.swarmStepId=="string"||t.swarmStepId===null?t.swarmStepId:null,ptyTabs:jy(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:Ly(t.repoTargets),runnerSession:t.runnerSession??Ny(t),checks:Vy(t),lastCommit:t.lastCommit??null,prs:Gy(t),artifacts:Jy(t),cleanup:Xy(t)}},Ny=e=>{if(typeof e.title!="string")return null;let t=Io(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},_y=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"&&k.runners.isRunnerType(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.parentTaskId=="string"||t.parentTaskId===null)&&typeof t.rootTaskId=="string"&&Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0&&(typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null)&&(typeof t.swarmRunId=="string"||t.swarmRunId===null)&&(typeof t.swarmStepId=="string"||t.swarmStepId===null)&&typeof t.repoRoot=="string"&&typeof t.worktreePath=="string"&&typeof t.branch=="string"&&Md(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||My(t.repoTargets))&&qy(t.runnerSession)&&Wy(t.prompt)&&jd(t.checks)&&Fd(t.lastCommit)&&Uy(t.prs)&&Ky(t.artifacts)&&Wd(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Ly=e=>{if(Array.isArray(e))return e.filter(Ld)},My=e=>Array.isArray(e)&&e.every(Ld),Ld=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)&&jd(t.checks)&&Fd(t.lastCommit)&&qd(t.pullRequest)&&Wd(t.cleanup)},jy=e=>{if(Md(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 Fy(e.id,e.title,t,Io(e.runner))},Fy=(e,t,n,r)=>{let s=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",title:s.defaultAgentTitle,command:k.runners.buildCommand(r),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},Io=e=>e&&k.runners.isRunnerType(e)?e:"codex",Md=e=>Array.isArray(e)&&e.every(t=>typeof t=="object"&&t!==null&&typeof t.id=="string"&&(t.kind==="agent"||t.kind==="terminal")&&(t.capabilityId===void 0||typeof t.capabilityId=="string")&&typeof t.title=="string"&&Array.isArray(t.command)&&t.command.every(n=>typeof n=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"),qy=e=>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),Wy=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",jd=e=>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"),Fd=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",qd=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&By(e.requiredChecks),By=e=>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)),Uy=e=>Array.isArray(e)&&e.every(qd),Ky=e=>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),Wd=e=>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),Vy=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},Gy=e=>{if(Array.isArray(e.prs))return e.prs.map(Hy);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:Bd(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:Ud(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},Hy=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:Bd(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:zy(t.reviewDecision),requiredChecks:Ud(t.requiredChecks),comments:Yy(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},Bd=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,zy=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Yy=e=>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}]}):[],Ud=e=>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})):[],Jy=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},Xy=e=>e.cleanup??{paneClosedAt:null,worktreeRemovedAt:null,preservedWorktree:!1,warning:null};import{readFile as _w}from"node:fs/promises";import{readFile as Qy,readdir as Zy,rm as ew}from"node:fs/promises";import Kd from"node:path";var vo=(e,t)=>Kd.join(e.workspacesDir,`${t}.json`),tw=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"):[]}},Vd=(e,t)=>{let n=tw(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},Xt=async(e,t)=>{let n=vo(e,t);try{let r=await Qy(n,"utf8");return Vd(JSON.parse(r),n)}catch(r){throw nw(r)?new y("WORKSPACE_NOT_FOUND",`Craig workspace "${t}" was not found.`,{details:{workspaceId:t}}):r instanceof SyntaxError||r instanceof Error&&r.message.startsWith("Craig workspace record at ")?new y("WORKSPACE_RECORD_INVALID",r instanceof Error?r.message:`Craig workspace "${t}" is invalid.`,{details:{workspaceId:t},cause:r}):r}},Qt=async(e,t)=>{await U(vo(e,t.id),{...t,updatedAt:new Date().toISOString()})},Ie=async e=>{let t=await Zy(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>Xt(e,Kd.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},Gd=async(e,t)=>{await ew(vo(e,t),{force:!0})},nw=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as rw,readdir as sw,rm as iw}from"node:fs/promises";import Hd from"node:path";var Co=(e,t)=>Hd.join(e.reposDir,`${t}.json`),zd=(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},De=async(e,t)=>{let n=Co(e,t);try{let r=await rw(n,"utf8");return zd(JSON.parse(r),n)}catch(r){throw ow(r)?new y("REPO_NOT_FOUND",`Craig repo "${t}" was not found.`,{details:{repoId:t}}):r instanceof SyntaxError||r instanceof Error&&r.message.startsWith("Craig repo record at ")?new y("REPO_RECORD_INVALID",r instanceof Error?r.message:`Craig repo "${t}" is invalid.`,{details:{repoId:t},cause:r}):r}},Ao=async(e,t)=>{await U(Co(e,t.id),{...t,updatedAt:new Date().toISOString()})},lr=async e=>{let t=await sw(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>De(e,Hd.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},Yd=async(e,t)=>{await iw(Co(e,t),{force:!0})},ow=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as aw}from"node:fs/promises";var lw=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"},Sn=(e,t,n)=>{if(!lw(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},be=async e=>{let t=await aw(e.indexFile,"utf8");return Sn(JSON.parse(t),e.workspaceRoot,e.indexFile)},ot=async(e,t)=>{await U(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as fw,stat as mw}from"node:fs/promises";import In from"node:path";import{realpath as Qd}from"node:fs/promises";import ks from"node:path";import{execFile as cw}from"node:child_process";import{promisify as dw}from"node:util";var Jd=dw(cw);async function L(e,t,n={}){try{let r=await Jd(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(Xd(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function G(e,t,n={}){try{let r=await Jd(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(Xd(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function Xd(e){return e instanceof Error}var Eo=async e=>{try{let n=(await L("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([Qd(n).catch(()=>ks.resolve(n)),Qd(e).catch(()=>ks.resolve(e))]);return r===s}catch{return!1}},Oo=async e=>{let t=await G("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 i of["main","master","trunk"])if((await G("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await L("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},Zd=async e=>{let t=await G("git",["rev-parse","--path-format=absolute","--git-common-dir"],{cwd:e}),n=t.stdout.trim();if(t.exitCode!==0||n.length===0)return null;let r=ks.resolve(e,n);return ks.dirname(r)};import{mkdir as ve,readFile as uw}from"node:fs/promises";var pw=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Pn=async e=>{let t=Te(e);await ve(t.craigDir,{recursive:!0}),await Promise.all([ve(t.reposDir,{recursive:!0}),ve(t.workspacesDir,{recursive:!0}),ve(t.sessionsDir,{recursive:!0}),ve(t.runtimeDir,{recursive:!0}),ve(t.tasksDir,{recursive:!0}),ve(t.jobsDir,{recursive:!0}),ve(t.commandsDir,{recursive:!0}),ve(t.eventsDir,{recursive:!0}),ve(t.orchestrationDir,{recursive:!0}),ve(t.logsDir,{recursive:!0}),ve(t.artifactsDir,{recursive:!0}),ve(t.worktreesDir,{recursive:!0})]);try{let s=await uw(t.indexFile,"utf8"),i=JSON.parse(s);return Sn(i,e,t.indexFile)}catch(s){if(!pw(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 U(t.indexFile,r),r};var eu=(e,t,n)=>{let r=new Date().toISOString();return{id:hw(e,In.basename(t)),name:In.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},tu=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},hw=(e,t)=>{let n=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"repo",r=`repo_${n}`,s=2;for(;e.some(i=>i.id===r);)r=`repo_${n}_${s}`,s+=1;return r},gw=(e,t)=>{let n=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"workspace",r=`workspace_${n}`,s=2;for(;e.some(i=>i.id===r);)r=`workspace_${n}_${s}`,s+=1;return r},nu=async(e,t)=>{let n=await be(e);await ot(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},yw=async(e,t)=>{let n=await fw(t,{withFileTypes:!0}),r=await lr(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=In.join(t,i.name);if(!await Eo(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await Oo(o);s.push(a?tu(a,l):eu([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},ww=async(e,t)=>{let n=await Oo(t),r=await lr(e),s=r.find(d=>d.rootPath===t)??null,i=s?tu(s,n):eu(r,t,n),o=`workspace_${i.id}`,l=(await Ie(e)).find(d=>d.id===o)??null,c=new Date().toISOString(),u=l??{id:o,kind:"repo",name:i.name,rootPath:t,primaryRepoId:i.id,repoId:i.id,discoveredRepoIds:[i.id],branch:n,status:"active",linkedRepoIds:[],archivedAt:null,createdAt:c,updatedAt:c};return await Ao(e,i),l||await Qt(e,u),await nu(e,{repoIds:[i.id],workspaceIds:[u.id]}),{kind:"createWorkspace",workspace:u,repos:[i],created:!l}},kw=async(e,t)=>{let n=await yw(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await Ie(e),s=gw(r,In.basename(t)),i=r.find(c=>c.kind==="project"&&c.rootPath===t)??null,o=new Date().toISOString(),a=n.map(c=>c.id),l=i?{...i,discoveredRepoIds:a,primaryRepoId:a[0]??i.primaryRepoId,status:"active",archivedAt:null}:{id:s,kind:"project",name:In.basename(t),rootPath:t,primaryRepoId:a[0]??"",discoveredRepoIds:a,branch:"project",status:"active",linkedRepoIds:a,archivedAt:null,createdAt:o,updatedAt:o};return await Promise.all(n.map(c=>Ao(e,c))),await Qt(e,l),await nu(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},cr=async(e,t)=>{await Pn(e.workspaceRoot);let n=In.resolve(e.workspaceRoot,t);if(!(await mw(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await Eo(n)?ww(e,n):kw(e,n)};var xo=async(e,t,n={listWorkspaceRecords:Ie,ensureCraigState:Pn})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var $o=async(e,t,n={readWorkspace:Xt,writeWorkspace:Qt})=>{let s={...await n.readWorkspace(e,t),status:"archived",archivedAt:new Date().toISOString()};return await n.writeWorkspace(e,s),{kind:"archiveWorkspace",workspaceId:s.id,status:s.status,branch:s.branch}};var Do=async(e,t)=>{let r={...await Xt(e,t),status:"active",archivedAt:null};await Qt(e,r);let s=r.kind==="project"?r.discoveredRepoIds?.[0]??null:r.primaryRepoId;return{kind:"restoreWorkspace",workspaceId:r.id,status:r.status,branch:r.branch,primaryRepoId:s}};var Zt=async(e,t,n={deleteWorkspace:Gd,readCraigIndex:be,writeCraigIndex:ot})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var No=async(e,t,n)=>{let r=await Xt(e,t),s=await n.listTasks(e,{workspaceId:t,includeClosed:!0});if(r.status==="active")throw new Error(`Cannot remove workspace ${t} while it is active. Archive it first.`);if(s.tasks.length>0)throw new Error(`Cannot remove workspace ${t} while task records still reference it.`);return await Zt(e,t),{kind:"removeWorkspace",workspaceId:r.id,rootPath:r.rootPath??""}};import{readFile as Tw,realpath as iu,stat as bw}from"node:fs/promises";import Ts from"node:path";async function _o(e){let t=await au(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return ru(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return ru(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await su(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await Zd(t);if(r){let s=await su(r);if(s)return{workspaceRoot:s,source:"git_common_dir",initialized:!0}}if(e.allowUninitializedCwd)return{workspaceRoot:t,source:"cwd",initialized:!1};throw new y("WORKSPACE_CONTEXT_NOT_FOUND",`No Craig workspace was found from ${t}. Use --workspace-root <path> or run Craig inside an initialized workspace.`,{details:{cwd:t}})}async function ru(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await au(Ts.resolve(n,e),s),o=await ou(i);if(o)return{workspaceRoot:o,source:t,initialized:!0};if(r)return{workspaceRoot:i,source:t,initialized:!1};throw new y("WORKSPACE_CONTEXT_NOT_FOUND",`${s} ${i} is not an initialized Craig workspace.`,{details:{workspaceRoot:i,source:t}})}async function su(e){let t=e;for(;;){let n=await ou(t);if(n)return n;let r=Ts.dirname(t);if(r===t)return null;t=r}}async function ou(e){let t=Te(e);try{let n=await Tw(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Sn(r,s,t.indexFile);if(await iu(i.workspaceRoot).catch(()=>Ts.resolve(i.workspaceRoot))!==e)throw new Error(`Craig index at ${t.indexFile} belongs to ${i.workspaceRoot}, not ${e}. Remove or repair the file before rerunning Craig.`);return i.workspaceRoot}catch(n){if(Rw(n))return null;throw n instanceof y?n:new y("WORKSPACE_CONTEXT_INVALID",n instanceof Error?n.message:`Craig workspace at ${e} is invalid.`,{details:{workspaceRoot:e},cause:n})}}async function au(e,t){let n=Ts.resolve(e);try{if(!(await bw(n)).isDirectory())throw new y("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await iu(n)}catch(r){throw r instanceof y?r:new y("WORKSPACE_CONTEXT_NOT_FOUND",`${t} ${n} does not exist or cannot be read.`,{details:{path:n},cause:r})}}function Rw(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var Lo={};ds(Lo,{addRepo:()=>lu,listRegisteredRepos:()=>cu,removeRepo:()=>du});import Sw from"node:path";import{stat as Pw}from"node:fs/promises";var lu=async(e,t)=>{let n=Sw.resolve(e.workspaceRoot,t);if(!(await Pw(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await cr(e,t),i=s.repos[0];if(!i||s.workspace.kind==="project")throw new Error(`Repo path is not a git repository: ${n}`);return{kind:"createRepo",repo:i,workspaceId:s.workspace.id,created:s.created}};var cu=async(e,t={listRepos:lr,ensureCraigState:Pn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var du=async(e,t,n)=>{let r=await De(e,t),i=(await Ie(e)).filter(c=>c.primaryRepoId===t),o=i.filter(c=>c.status==="active"),a=await n.listTasks(e,{repoId:t});if(o.length>0)throw new Error(`Cannot remove repo ${t} while active workspace records still reference it.`);if(a.tasks.length>0)throw new Error(`Cannot remove repo ${t} while task records still reference it.`);await Promise.all(i.map(c=>Zt(e,c.id))),await Yd(e,t);let l=await be(e);return await ot(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var fe={addWorkspace:cr,listWorkspaces:xo,archiveWorkspace:$o,restoreWorkspace:Do,removeWorkspace:No,removeWorkspaceRecord:Zt,resolveContext:_o,repos:Lo};import{mkdir as uu,readFile as Iw,rm as Rs,stat as vw,writeFile as Cw}from"node:fs/promises";import bs from"node:path";var Aw=25,Ew=3e4,Ow=5e3;async function Ct(e,t,n){let r=bs.join(e.runtimeDir,"task-locks"),s=bs.join(r,`${t}.lock`);await uu(r,{recursive:!0});let i=Date.now();for(;;)try{await uu(s);try{await Cw(bs.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await Rs(s,{recursive:!0,force:!0}),o}break}catch(o){if(!Dw(o))throw o;if(await xw(s))continue;if(Date.now()-i>=Ew)throw new y("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await Nw(Aw)}try{return await n()}finally{await Rs(s,{recursive:!0,force:!0})}}async function xw(e){let t=await Iw(bs.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return $w(t.pid)?!1:(await Rs(e,{recursive:!0,force:!0}),!0);let n=await vw(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<Ow?!1:(await Rs(e,{recursive:!0,force:!0}),!0)}function $w(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var Dw=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Nw=e=>new Promise(t=>setTimeout(t,e));var at=async(e,t)=>{let n=await _w(Ss(e,t),"utf8");return JSON.parse(n)},dr=async(e,t)=>{let n=await at(e,t);return $e(n,Ss(e,t))},lt=async(e,t)=>{let n=pu(t);await U(Ss(e,t.id),n)},q=async(e,t,n)=>Ct(e,t,async()=>{let r=await dr(e,t),s=await n(r);if(s.id!==t)throw new Error(`Task mutation cannot change task id ${t} to ${s.id}.`);let i=pu(s);return await U(Ss(e,t),i),i}),Mo=async(e,t)=>{let n=await be(e);n.taskIds.includes(t)||await ot(e,{...n,taskIds:[...n.taskIds,t]})},Ss=(e,t)=>`${e.tasksDir}/${t}.json`,pu=e=>({...e,updatedAt:new Date().toISOString()});var B=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,At=e=>e.status==="merged"||e.status==="closed",ct=(e,t)=>{let n=e.prs.findIndex(s=>vn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},vn=(e,t)=>e.number===null||t.number===null||e.number!==t.number?!1:!e.owner||!e.repo||!t.owner||!t.repo?!0:e.owner.toLowerCase()===t.owner.toLowerCase()&&e.repo.toLowerCase()===t.repo.toLowerCase(),en=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return Is(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},Is=e=>e.mergeable&&!Lw(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),Lw=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",jo=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),dt=(e,t,n)=>{let r=e.isDraft??!1,s=Mw(e.state,r);return{provider:"github",owner:n?.owner??t?.owner??null,repo:n?.name??t?.repo??null,number:e.number,url:e.url,title:e.title??t?.title??null,status:s,draft:r,baseBranch:e.baseRefName,headBranch:e.headRefName,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:jw(e.reviewDecision??null),requiredChecks:Fo(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:Bw(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}},Mw=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,jw=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Fo=e=>{let t=e.map(r=>Fw(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||qw(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},Fw=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:mu(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:Ww(t)}:null},qw=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):Ps(e)&&!Ps(t)?!0:!Ps(e)&&Ps(t)?!1:fu(t.status)>=fu(e.status),Ps=e=>e.conclusion?.toUpperCase()==="CANCELLED",fu=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},Ww=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},Bw=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(Uw).filter(n=>n!==null).slice(-4):[]},Uw=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=Kw(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},Kw=e=>e.replace(/\s+/g," ").trim(),mu=(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?mu(r,r):"unknown"};var Ne=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as Vw}from"node:fs/promises";import hu from"node:path";var M=async(e,t,n={readRawTask:at,validateTaskRecord:$e})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw Jw(r)?new y("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):Xw(r)?new y("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},de=async e=>{if(!await qo(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Cn=(e,t)=>t.artifacts.logPath?hu.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:hu.join(e.workspaceRoot,t.artifacts.logPath):null,ur=async(e,t)=>{let n=await qo(t.worktreePath),r=Cn(e,t),s=r?await qo(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:Gw(t),lastCommitSummary:Hw(t),prSummary:zw(t),cleanupSummary:Yw(t)}},qo=async e=>{try{return await Vw(e),!0}catch{return!1}},Gw=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}`},Hw=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",zw=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 i=s.map(l=>` ${l.repoId} #${l.pullRequest.number} ${l.pullRequest.status??"unknown"}`),o=s.reduce((l,c)=>{let u=c.pullRequest.status??"unknown";return l[u]=(l[u]??0)+1,l},{}),a=Object.entries(o).map(([l,c])=>`${c} ${l}`).join(", ");return`${s.length} PR${s.length!==1?"s":""} (${a})
13
13
  ${i.join(`
14
- `)}`}let t=E(e);if(!t?.number||!t.url)return"not linked";let r=t.requiredChecks.length,n=r===1?"check":"checks";return`#${t.number} ${t.status??"unknown"} mergeable=${t.mergeable} mergeState=${t.mergeStateStatus??"unknown"} (${r} ${n})`},bf=e=>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",Pf=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Sf=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var tl=async(e,t)=>{let r=await $("git",["show-ref","--verify","--quiet",`refs/heads/${t}`],{cwd:e});if(r.exitCode===0)return!0;if(r.exitCode===1)return!1;throw new Error(r.stderr.trim()||r.stdout.trim()||"Unable to check git branch state.")},bs=async(e,t,r,n="main")=>{let s=n.trim()||"main";if((await $("git",["show-ref","--verify","--quiet",`refs/heads/${s}`],{cwd:e})).exitCode!==0)throw new Error(`Base branch '${s}' does not exist locally.`);let o=await vf(e,s);await C("git",["worktree","add","-b",t,r,o],{cwd:e})},vf=async(e,t)=>(await $("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await $("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await $("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t,Gr=async e=>{let t=await $("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},rl=async e=>{await C("git",["add","-A"],{cwd:e})},nl=async(e,t)=>{await C("git",["commit","-m",t],{cwd:e})},sl=async e=>{let t=await C("git",["show","-s","--format=%H%n%s","HEAD"],{cwd:e}),[r="",n=""]=t.stdout.trim().split(`
15
- `);if(!r||!n)throw new Error("Unable to read git HEAD commit metadata.");return{sha:r,message:n}},il=async e=>{let t=await $("git",["branch","--show-current"],{cwd:e});if(t.exitCode!==0)return null;let r=t.stdout.trim();return r.length>0?r:null};var ol=async(e,t)=>{await C("git",["worktree","remove","--force",t],{cwd:e})};var Ps=async e=>At(e,e.repoRoot),At=async(e,t)=>{let r=await se(e),n=al(new Date),s=ll(r.taskIds,n);for(;;){let i=`task_${n}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await tl(t,o))return i;s+=1}},Zt=async e=>{let t=await se(e),r=al(new Date),n=ll(t.taskIds,r);return`task_${r}_${String(n).padStart(2,"0")}`},al=e=>{let t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0");return`${t}${r}${n}`},ll=(e,t)=>{let r=e.filter(n=>n.startsWith(`task_${t}_`)).map(n=>Number.parseInt(n.slice(-2),10)).filter(n=>Number.isInteger(n));return r.length===0?1:Math.max(...r)+1};var er=async(e,t,r={readRawTask:Ie,validateTaskRecord:pe})=>{let n=await se(e),s=[],i=[];await Promise.all(n.taskIds.map(async l=>{try{let c=await r.readRawTask(e,l);s.push(r.validateTaskRecord(c,`${e.tasksDir}/${l}.json`))}catch(c){if(If(c)){i.push(l);return}throw c}}));let a=(t?.includeClosed?s:s.filter(l=>l.status!=="closed")).filter(l=>!(t?.workspaceId&&l.workspaceId!==t.workspaceId||t?.repoId&&l.repoId!==t.repoId&&!(l.repoTargets??[]).some(c=>c.repoId===t.repoId)));return a.sort((l,c)=>l.id.localeCompare(c.id)),i.sort(),{kind:"listTasks",tasks:a,missingTaskIds:i,repoId:t?.repoId??null}},If=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var cl=["merge_ready","pr_open","checked","review","running","draft"],Ss=e=>[...e].sort((t,r)=>t.id.localeCompare(r.id)),vs=(e,t)=>t&&e.some(n=>n.id===t)?t:e.length===0?null:[...e].sort(Cf)[0]?.id??null,Cf=(e,t)=>{let r=dl(e.status),n=dl(t.status);return r!==n?r-n:t.updatedAt.localeCompare(e.updatedAt)},dl=e=>{let t=cl.indexOf(e);return t>=0?t:cl.length};import ul from"node:path";var at=(e,t)=>t?ul.isAbsolute(t)?t:ul.join(e.repoRoot,t):null;import{mkdir as tr,rm as Af,writeFile as Hr}from"node:fs/promises";import M from"node:path";var ml=["AGENTS","md"].join("."),Et=async(e,t,r,n={})=>{let s=await me(e,t),[i,o]=await Promise.all([$f(e,s.id),At(e,s.rootPath)]),a=n.sessionId??null,l=`craig/${o}`,c=M.join(e.worktreesDir,s.id,o),d=M.join(e.logsDir,`${o}.log`),u=M.join(e.artifactsDir,o);await Promise.all([tr(M.dirname(c),{recursive:!0}),tr(u,{recursive:!0}),Hr(d,"","utf8")]);let f=Ef(e,{taskId:o,repoId:s.id,workspaceId:i.id,sessionId:a,repoRoot:s.rootPath,prompt:r,runner:n.runner??"codex",config:n.config??{},branch:l,worktreePath:c});return await Ce(e,f),await ks(e,o),await bs(s.rootPath,l,c,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,sessionId:a,workspaceId:i.id,task:f}},rr=async(e,t,r,n={})=>{let s=(await ae(e)).find(I=>I.id===t&&I.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 I=await Et(e,s.primaryRepoId,r,n);return{...I,bundlePath:I.task.worktreePath,repoTargets:[]}}let i=s.discoveredRepoIds??[];if(i.length===0)throw new Error(`Project workspace ${t} has no discovered repos.`);let o=await Zt(e),a=new Date().toISOString(),l=n.runner??"codex",c=n.sessionId??null,d=`craig/${o}`,u=M.join(e.craigDir,"task-bundles",o),f=M.join(e.logsDir,`${o}.log`),h=M.join(e.artifactsDir,o);await tr(u,{recursive:!0}),await tr(h,{recursive:!0}),await Hr(f,"","utf8");let p=await Promise.all(i.map(I=>me(e,I))),w=Df(p),b=await Promise.all(p.map(I=>xf(e,I,o,d,M.join(u,w.get(I.id))))),O=b.find(I=>I.status==="ready")??b[0];if(!b.some(I=>I.status==="ready"))throw await Af(u,{recursive:!0,force:!0}),new Error(`No project repo targets could be provisioned for ${t}: ${b.map(I=>`${I.repoId}: ${I.failureReason??"unknown error"}`).join("; ")}`);await Hr(M.join(u,"manifest.json"),JSON.stringify({taskId:o,workspaceId:t,prompt:r,repos:b.map(I=>({repoId:I.repoId,repoName:p.find(re=>re.id===I.repoId)?.name??I.repoId,path:M.relative(u,I.worktreePath),status:I.status,worktreePath:I.worktreePath,failureReason:I.failureReason}))},null,2),"utf8"),await Hr(M.join(u,ml),Of({taskId:o,workspaceId:t,prompt:r,repos:p,repoTargets:b,bundlePath:u}),"utf8");let q=nr(o,r,a,l,n.config??{}),U={id:o,title:r,slug:fl(r),type:"project",status:"draft",runner:l,repoId:O.repoId,workspaceId:s.id,sessionId:c,selectedPtyTabId:q[0]?.id??null,linkedRepoIds:i.filter(I=>I!==O.repoId),repoRoot:u,worktreePath:u,branch:d,bundlePath:u,selectedRepoTargetId:O.repoId,repoTargets:b,ptyTabs:q,runnerSession:{command:k.runners.buildCommand(l,r,n.config??{}),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:r},checks:O.checks,lastCommit:null,prs:[],artifacts:{logPath:M.relative(e.workspaceRoot,f),checkSummaryPath:M.relative(e.workspaceRoot,M.join(h,"check-summary.json")),prDraftPath:null,prStatusPath:M.relative(e.workspaceRoot,M.join(h,"pr-status.json"))},cleanup:zr(),lastFailureReason:b.every(I=>I.status==="unavailable")?"No project repo targets could be provisioned.":null,createdAt:a,updatedAt:a};return await Ce(e,U),await ks(e,o),{repoId:O.repoId,repoRoot:u,sessionId:c,workspaceId:s.id,task:U,bundlePath:u,repoTargets:b}},nr=(e,t,r,n="codex",s={})=>{let i=k.runners.getProfile(n);return[{id:`${e}:agent`,kind:"agent",title:i.defaultAgentTitle,command:k.runners.buildCommand(n,void 0,s),createdAt:r,updatedAt:r},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:r,updatedAt:r}]},Ef=(e,t)=>{let r=new Date().toISOString(),n=nr(t.taskId,t.prompt,r,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:fl(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,sessionId:t.sessionId,selectedPtyTabId:n[0]?.id??null,linkedRepoIds:[],repoRoot:t.repoRoot,worktreePath:t.worktreePath,branch:t.branch,ptyTabs:n,runnerSession:{command:k.runners.buildCommand(t.runner,t.prompt,t.config),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:t.prompt},checks:{...Is(M.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:M.relative(e.workspaceRoot,M.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:M.relative(e.workspaceRoot,M.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:M.relative(e.workspaceRoot,M.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:zr(),lastFailureReason:null,createdAt:r,updatedAt:r}},xf=async(e,t,r,n,s)=>{await tr(M.dirname(s),{recursive:!0});try{return await bs(t.rootPath,n,s,t.defaultBranch),{repoId:t.id,branch:n,repoRoot:t.rootPath,worktreePath:s,status:"ready",failureReason:null,checks:Is(M.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:pl(),cleanup:zr()}}catch(i){return{repoId:t.id,branch:n,repoRoot:t.rootPath,worktreePath:s,status:"unavailable",failureReason:i instanceof Error?i.message:"Failed to create worktree.",checks:Is(M.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:pl(),cleanup:zr()}}},Df=e=>{let t=new Set(["manifest.json",ml]),r=new Map;for(let n of e){let s=t.has(n.name)?`${n.name}-repo`:n.name,i=s,o=2;for(;t.has(i);)i=`${s}-${o}`,o+=1;t.add(i),r.set(n.id,i)}return r},Of=e=>{let t=new Map(e.repos.map(n=>[n.id,n.name])),r=e.repoTargets.map(n=>{let s=t.get(n.repoId)??n.repoId,i=M.relative(e.bundlePath,n.worktreePath),o=n.status==="ready"?"ready":`unavailable: ${n.failureReason??"unknown error"}`;return`- \`${i}/\` - ${s} (${n.repoId}, ${o})`}).join(`
16
- `);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","",r,""].join(`
17
- `)},Is=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),pl=()=>({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}),zr=()=>({paneClosedAt:null,worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),$f=async(e,t)=>{let n=(await ae(e)).find(s=>s.kind!=="project"&&s.primaryRepoId===t&&s.status==="active");if(!n)throw new Error(`Repo ${t} does not have an active workspace.`);return n},fl=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");import vl from"node:path";import{readFile as Mf,rm as av}from"node:fs/promises";import Nf from"node:path";var Be=async(e,t)=>{let r=await Mf(Cs(e,t),"utf8"),n=JSON.parse(r);return Lf(n,Cs(e,t))},lt=async(e,t)=>{await L(Cs(e,t.id),{...t,updatedAt:new Date().toISOString()})};var Cs=(e,t)=>Nf.join(e.sessionsDir,`${t}.json`);function Lf(e,t){let r=Ff(e);if(typeof r!="object"||r===null||typeof r.id!="string"||typeof r.taskId!="string"||typeof r.repoId!="string"||typeof r.workspaceId!="string"||r.substrate!=="tmux"||typeof r.sessionName!="string"||typeof r.paneId!="string"||!(r.windowTarget===null||typeof r.windowTarget=="string")||typeof r.worktreePath!="string"||!(r.logPath===null||typeof r.logPath=="string")||!Array.isArray(r.command)||!r.command.every(n=>typeof n=="string")||!["starting","running","exited","failed"].includes(r.status)||!(r.startedAt===null||typeof r.startedAt=="string")||!(r.exitedAt===null||typeof r.exitedAt=="string")||!(r.exitCode===null||typeof r.exitCode=="number")||!(r.lastAttachedAt===null||typeof r.lastAttachedAt=="string")||!jf(r.attach)||!_f(r.snapshot)||typeof r.createdAt!="string"||typeof r.updatedAt!="string")throw new Error(`Craig session record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return r}function _f(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 jf(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 Ff(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(r=>typeof r=="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??""}}import{spawn as Wf}from"node:child_process";import{createHash as qf}from"node:crypto";import Uf from"node:path";function Yr(e){return`'${e.replace(/'/g,"'\\''")}'`}var Bf="craig",gl=async(e,t,r)=>{let n=As(e,t),s=Kf(),i=await C("tmux",["new-session","-d","-P","-F","#{session_name} #{window_id} #{pane_id}","-s",n,"-n","runner",...s,"-c",r],{cwd:e}),o=Hf(i.stdout);return await Vf(e,n),o};var Vf=async(e,t)=>{let r=[["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 n of r)await C("tmux",n,{cwd:e})},hl=async(e,t,r)=>{await C("tmux",["resize-window","-t",t,"-x",`${r.columns}`,"-y",`${r.rows}`],{cwd:e})},wl=async(e,t,r)=>{await C("tmux",["send-keys","-t",e,t,"C-m"],{cwd:r})};var kl=async(e,t,r)=>{await C("tmux",["pipe-pane","-o","-t",e,`cat >> ${Yr(t)}`],{cwd:r})},Jr=async(e,t,r,n)=>{let s=n??Tl(e);if(r?await C("tmux",["select-window","-t",r],{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 Yf(e,["attach-session","-t",s])};var yl=async(e,t)=>{await C("tmux",["kill-session","-t",t],{cwd:e})};var Tl=e=>{let r=Uf.basename(e).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"repo",n=qf("sha1").update(e).digest("hex").slice(0,8);return`${Bf}-${r}-${n}`},As=(e,t)=>`${Tl(e)}-${t.toLowerCase()}`,Kf=()=>{let e=Gf();return e?["-x",`${e.columns}`,"-y",`${e.rows}`]:[]},Gf=()=>{let e=[process.stdout,process.stderr,process.stdin];for(let t of e){let r="columns"in t?t.columns:void 0,n="rows"in t?t.rows:void 0;if(typeof r=="number"&&r>0&&typeof n=="number"&&n>0)return{columns:r,rows:n}}return null},Hf=e=>{let t=zf(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]}},zf=e=>e.split(/\s+/).map(t=>t.trim()).filter(t=>t.length>0),Yf=async(e,t)=>{await new Promise((r,n)=>{let s=Wf("tmux",t,{cwd:e,stdio:"inherit"});s.on("error",n),s.on("exit",i=>{if(i===0){r();return}n(new Error(`tmux ${t.join(" ")} failed with exit code ${i??"unknown"}.`))})})};import{accessSync as Jf,constants as Xf}from"node:fs";import{homedir as Rl}from"node:os";import Ve from"node:path";var Qf=[Ve.join(Rl(),".local","bin"),Ve.join(Rl(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function Pl(e=process.env){return Zf([...(e.PATH??"").split(Ve.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:Qf])}function ct(e=process.env){return{...e,PATH:Pl(e).join(Ve.delimiter)}}function Es(e,t={}){if(e.includes(Ve.sep)){let r=Ve.isAbsolute(e)?e:Ve.resolve(t.cwd??process.cwd(),e);return bl(r)?r:null}for(let r of Pl(t.env)){let n=Ve.join(r,e);if(bl(n))return n}return null}function dt(e,t={}){let r=Es(e,t);if(r)return r;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 bl(e){try{return Jf(e,Xf.X_OK),!0}catch{return!1}}function Zf(e){return[...new Set(e)]}var sr={async create(e,t){let r=await gl(t.repoRoot,t.taskId,t.worktreePath);t.logPath&&await kl(r.paneId,t.logPath,t.repoRoot);let n=await Sl({paneId:r.paneId,windowTarget:r.windowTarget,alive:!0}),s={id:t.sessionId,taskId:t.taskId,repoId:t.repoId,workspaceId:t.workspaceId,substrate:"tmux",sessionName:r.sessionName||As(t.repoRoot,t.taskId),paneId:r.paneId,windowTarget:r.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:n,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return await lt(e,s),s},async attach(e,t,r){let n=await sr.snapshot(t,r);if(!n.alive)throw new Error(`Session ${t.id} is no longer live and cannot be attached.`);await Jr(r,t.paneId,t.windowTarget,t.sessionName);let s={...t,status:"running",lastAttachedAt:new Date().toISOString(),snapshot:n};return await lt(e,s),s},async resize(e,t,r,n){await hl(n,t.sessionName,r);let s={...t,attach:{...t.attach,lastSize:r}};return await lt(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,r){let n={...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:t.command};return await lt(e,n),n},async snapshot(e,t){return eg(e,t)}},xs={async prepare(e,t){let n=e.runnerSession.command[0],s=ct();dt(n,{cwd:t.repoRoot,env:s})},async launch(e,t){let r=e.runnerSession.command,n=dt(r[0],{cwd:e.worktreePath,env:ct()});await wl(t.session.paneId,[n,...r.slice(1)].map(s=>Yr(s)).join(" "),t.repoRoot)},async status(e){return e.runnerSession.lastKnownState},async stop(){},async collectArtifacts(){}},eg=async(e,t)=>{let r=await $("tmux",["list-panes","-F","#{pane_id}","-t",e.paneId],{cwd:t});return Sl({paneId:e.paneId,windowTarget:e.windowTarget,alive:r.exitCode===0&&r.stdout.split(/\s+/).some(n=>n.trim()===e.paneId)})},Sl=async e=>({paneId:e.paneId,windowTarget:e.windowTarget,alive:e.alive,capturedAt:new Date().toISOString()});var Ds=async(e,t,r,n={})=>{let s=r.trim(),i=await k.load(e),o=n.runner??k.runners.getDefault(i);if(k.runners.assertEnabled(o,i),t.trim().length===0)throw new Error(n.workspaceId?"Workspace id cannot be empty.":"Repo id cannot be empty.");if(s.length===0)throw new Error("Task prompt cannot be empty.");let a=n.workspaceId?await rr(e,n.workspaceId,s,{runner:o,config:i}):await Et(e,t,s,{runner:o,config:i}),l=a.task,c=k.runners.buildCommand(o,s,i),d=`session_${l.id}`,u=l.artifacts.logPath?vl.resolve(e.workspaceRoot,l.artifacts.logPath):vl.join(e.logsDir,`${l.id}.log`);try{await xs.prepare(l,{repoRoot:a.repoRoot});let f=await sr.create(e,{sessionId:d,taskId:l.id,repoId:a.repoId,workspaceId:a.workspaceId,repoRoot:a.repoRoot,worktreePath:l.worktreePath,logPath:u,command:c});await xs.launch(l,{repoRoot:a.repoRoot,session:f});let h=new Date().toISOString();f={...f,status:"running",startedAt:h,command:c};let p=await x(e,l.id,w=>({...w,status:"running",runner:o,sessionId:f.id,selectedPtyTabId:w.selectedPtyTabId,runnerSession:{command:f.command,pid:null,startedAt:h,lastKnownState:"running",exitCode:null,exitedAt:null}}));return await lt(e,f),{kind:"createTask",taskId:p.id,repoId:p.repoId,workspaceId:p.workspaceId,sessionId:f.id,status:p.status,branch:p.branch,worktreePath:p.worktreePath,runner:p.runner}}catch(f){throw await x(e,l.id,h=>({...h,sessionId:null,status:"draft",runnerSession:{...h.runnerSession,lastKnownState:"failed"},lastFailureReason:f instanceof Error?f.message:"Unknown Craig error"})),f}};import{mkdir as ig}from"node:fs/promises";import og from"node:path";var xe=async e=>{let t=await $("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var Il=async(e,t,r)=>{let n=r==="merge"?"--merge":r==="rebase"?"--rebase":"--squash";await C("gh",["pr","merge",String(t),n,"--delete-branch=false"],{cwd:e})},xt=async(e,t)=>{let r=await C("gh",Os(e),{cwd:t});return JSON.parse(r.stdout)},Dt=async(e,t)=>{let r=await $("gh",Os(e),{cwd:t});if(r.exitCode===0)return JSON.parse(r.stdout);let n=r.stderr.trim()||r.stdout.trim();if(El(n))return null;throw new Error(n||`GitHub CLI failed while discovering a pull request for ${e}.`)},Cl=async(e,t)=>{let r=await $("gh",Os(e),{cwd:t});if(r.exitCode===0)return JSON.parse(r.stdout);let n=r.stderr.trim()||r.stdout.trim();if(El(n))return null;throw new Error(n||`GitHub CLI failed while discovering a pull request for ${e}.`)},Al=async(e,t,r)=>{if(r.length===0)return[];let n=ng(r),s;try{s=await C("gh",["api","graphql","-f",`query=${n}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw tg(a)?new fe(a instanceof Error?a.message:String(a)):a}let o=JSON.parse(s.stdout).data?.repository??{};return r.map((a,l)=>{let c=o[`item${l}`],d=sg(c);return{id:a.id,found:d!==null,view:d}})},Xr=async e=>{let t=await $("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:rg(t.stdout.trim())},Ke=e=>{let t=e.trim().match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/([1-9]\d*)(?:[/?#].*)?$/);return!t?.[1]||!t[2]||!t[3]?null:{owner:t[1],name:t[2],number:Number(t[3])}},tg=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")},El=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},Os=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],rg=e=>{let t=e.replace(/\.git$/,""),r=t.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)$/);if(r?.[1]&&r[2])return{owner:r[1],name:r[2]};let n=t.match(/^git@github\.com:([^/]+)\/([^/]+)$/);if(n?.[1]&&n[2])return{owner:n[1],name:n[2]};let s=t.match(/^ssh:\/\/git@github\.com\/([^/]+)\/([^/]+)$/);return s?.[1]&&s[2]?{owner:s[1],name:s[2]}:null},ng=e=>`
14
+ `)}`}let t=B(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})`},Yw=e=>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",Jw=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Xw=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var gu=async(e,t)=>{let n=await G("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.")},Wo=async(e,t,n,r="main")=>{let s=r.trim()||"main";if((await G("git",["show-ref","--verify","--quiet",`refs/heads/${s}`],{cwd:e})).exitCode!==0)throw new Error(`Base branch '${s}' does not exist locally.`);let o=await Qw(e,s);await L("git",["worktree","add","-b",t,n,o],{cwd:e})},Qw=async(e,t)=>(await G("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await G("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await G("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t,vs=async e=>{let t=await G("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},yu=async e=>{await L("git",["add","-A"],{cwd:e})},wu=async(e,t)=>{await L("git",["commit","-m",t],{cwd:e})},ku=async e=>{let t=await L("git",["show","-s","--format=%H%n%s","HEAD"],{cwd:e}),[n="",r=""]=t.stdout.trim().split(`
15
+ `);if(!n||!r)throw new Error("Unable to read git HEAD commit metadata.");return{sha:n,message:r}},Tu=async e=>{let t=await G("git",["branch","--show-current"],{cwd:e});if(t.exitCode!==0)return null;let n=t.stdout.trim();return n.length>0?n:null};var bu=async(e,t)=>{await L("git",["worktree","remove","--force",t],{cwd:e})};var Bo=async e=>An(e,e.repoRoot),An=async(e,t)=>{let n=await be(e),r=Ru(new Date),s=Su(n.taskIds,r);for(;;){let i=`task_${r}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await gu(t,o))return i;s+=1}},pr=async e=>{let t=await be(e),n=Ru(new Date),r=Su(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`},Ru=e=>{let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}${n}${r}`},Su=(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 fr=async(e,t,n={readRawTask:at,validateTaskRecord:$e})=>{let r=await be(e),s=[],i=[];await Promise.all(r.taskIds.map(async l=>{try{let c=await n.readRawTask(e,l);s.push(n.validateTaskRecord(c,`${e.tasksDir}/${l}.json`))}catch(c){if(Zw(c)){i.push(l);return}throw c}}));let a=(t?.includeClosed?s:s.filter(l=>l.status!=="closed")).filter(l=>!(t?.workspaceId&&l.workspaceId!==t.workspaceId||t?.repoId&&l.repoId!==t.repoId&&!(l.repoTargets??[]).some(c=>c.repoId===t.repoId)));return a.sort((l,c)=>l.id.localeCompare(c.id)),i.sort(),{kind:"listTasks",tasks:a,missingTaskIds:i,repoId:t?.repoId??null}},Zw=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var Pu=["merge_ready","pr_open","checked","review","running","draft"],Uo=e=>[...e].sort((t,n)=>t.id.localeCompare(n.id)),Ko=(e,t)=>t&&e.some(r=>r.id===t)?t:e.length===0?null:[...e].sort(ek)[0]?.id??null,ek=(e,t)=>{let n=Iu(e.status),r=Iu(t.status);return n!==r?n-r:t.updatedAt.localeCompare(e.updatedAt)},Iu=e=>{let t=Pu.indexOf(e);return t>=0?t:Pu.length};import vu from"node:path";var tn=(e,t)=>t?vu.isAbsolute(t)?t:vu.join(e.repoRoot,t):null;import{randomUUID as tk}from"node:crypto";import{mkdir as mr,rm as nk,writeFile as Cs}from"node:fs/promises";import H from"node:path";var Au=["AGENTS","md"].join("."),En=async(e,t,n,r={})=>{let s=await De(e,t),[i,o]=await Promise.all([ak(e,s.id),An(e,s.rootPath)]),a=r.sessionId??null,l=`craig/${o}`,c=H.join(e.worktreesDir,s.id,o),u=H.join(e.logsDir,`${o}.log`),d=H.join(e.artifactsDir,o);await Promise.all([mr(H.dirname(c),{recursive:!0}),mr(d,{recursive:!0}),Cs(u,"","utf8")]);let p=rk(e,{taskId:o,repoId:s.id,workspaceId:i.id,sessionId:a,repoRoot:s.rootPath,prompt:n,runner:r.runner??"codex",config:r.config??{},branch:l,worktreePath:c,...r.lineage?{lineage:r.lineage}:{}});return await lt(e,p),await Mo(e,o),await Wo(s.rootPath,l,c,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,sessionId:a,workspaceId:i.id,task:p}},hr=async(e,t,n,r={})=>{let s=(await Ie(e)).find(b=>b.id===t&&b.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 b=await En(e,s.primaryRepoId,n,r);return{...b,bundlePath:b.task.worktreePath,repoTargets:[]}}let i=s.discoveredRepoIds??[];if(i.length===0)throw new Error(`Project workspace ${t} has no discovered repos.`);let o=await pr(e),a=new Date().toISOString(),l=r.runner??"codex",c=r.sessionId??null,u=`craig/${o}`,d=H.join(e.craigDir,"task-bundles",o),p=H.join(e.logsDir,`${o}.log`),h=H.join(e.artifactsDir,o);await mr(d,{recursive:!0}),await mr(h,{recursive:!0}),await Cs(p,"","utf8");let f=await Promise.all(i.map(b=>De(e,b))),m=ik(f),g=await Promise.all(f.map(b=>sk(e,b,o,u,H.join(d,m.get(b.id))))),T=g.find(b=>b.status==="ready")??g[0];if(!g.some(b=>b.status==="ready"))throw await nk(d,{recursive:!0,force:!0}),new Error(`No project repo targets could be provisioned for ${t}: ${g.map(b=>`${b.repoId}: ${b.failureReason??"unknown error"}`).join("; ")}`);await Cs(H.join(d,"manifest.json"),JSON.stringify({taskId:o,workspaceId:t,prompt:n,repos:g.map(b=>({repoId:b.repoId,repoName:f.find(x=>x.id===b.repoId)?.name??b.repoId,path:H.relative(d,b.worktreePath),status:b.status,worktreePath:b.worktreePath,failureReason:b.failureReason}))},null,2),"utf8"),await Cs(H.join(d,Au),ok({taskId:o,workspaceId:t,prompt:n,repos:f,repoTargets:g,bundlePath:d}),"utf8");let R=gr(o,n,a,l,r.config??{}),I={id:o,title:n,slug:Ou(n),type:"project",status:"draft",runner:l,repoId:T.repoId,workspaceId:s.id,sessionId:c,selectedPtyTabId:R[0]?.id??null,linkedRepoIds:i.filter(b=>b!==T.repoId),...Eu(o,r.lineage),repoRoot:d,worktreePath:d,branch:u,bundlePath:d,selectedRepoTargetId:T.repoId,repoTargets:g,ptyTabs:R,runnerSession:{command:k.runners.buildCommand(l,n,r.config??{}),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:n},checks:T.checks,lastCommit:null,prs:[],artifacts:{logPath:H.relative(e.workspaceRoot,p),checkSummaryPath:H.relative(e.workspaceRoot,H.join(h,"check-summary.json")),prDraftPath:null,prStatusPath:H.relative(e.workspaceRoot,H.join(h,"pr-status.json"))},cleanup:As(),lastFailureReason:g.every(b=>b.status==="unavailable")?"No project repo targets could be provisioned.":null,createdAt:a,updatedAt:a};return await lt(e,I),await Mo(e,o),{repoId:T.repoId,repoRoot:d,sessionId:c,workspaceId:s.id,task:I,bundlePath:d,repoTargets:g}},gr=(e,t,n,r="codex",s={})=>{let i=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",...s.previews?.agentOrchestration?{capabilityId:`capability_${tk()}`}:{},title:i.defaultAgentTitle,command:k.runners.buildCommand(r,void 0,s),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},rk=(e,t)=>{let n=new Date().toISOString(),r=gr(t.taskId,t.prompt,n,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:Ou(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,sessionId:t.sessionId,selectedPtyTabId:r[0]?.id??null,linkedRepoIds:[],...Eu(t.taskId,t.lineage),repoRoot:t.repoRoot,worktreePath:t.worktreePath,branch:t.branch,ptyTabs:r,runnerSession:{command:k.runners.buildCommand(t.runner,t.prompt,t.config),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:t.prompt},checks:{...Vo(H.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:H.relative(e.workspaceRoot,H.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:H.relative(e.workspaceRoot,H.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:H.relative(e.workspaceRoot,H.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:As(),lastFailureReason:null,createdAt:n,updatedAt:n}},sk=async(e,t,n,r,s)=>{await mr(H.dirname(s),{recursive:!0});try{return await Wo(t.rootPath,r,s,t.defaultBranch),{repoId:t.id,branch:r,repoRoot:t.rootPath,worktreePath:s,status:"ready",failureReason:null,checks:Vo(H.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Cu(),cleanup:As()}}catch(i){return{repoId:t.id,branch:r,repoRoot:t.rootPath,worktreePath:s,status:"unavailable",failureReason:i instanceof Error?i.message:"Failed to create worktree.",checks:Vo(H.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Cu(),cleanup:As()}}},ik=e=>{let t=new Set(["manifest.json",Au]),n=new Map;for(let r of e){let s=t.has(r.name)?`${r.name}-repo`:r.name,i=s,o=2;for(;t.has(i);)i=`${s}-${o}`,o+=1;t.add(i),n.set(r.id,i)}return n},ok=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,i=H.relative(e.bundlePath,r.worktreePath),o=r.status==="ready"?"ready":`unavailable: ${r.failureReason??"unknown error"}`;return`- \`${i}/\` - ${s} (${r.repoId}, ${o})`}).join(`
16
+ `);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(`
17
+ `)},Vo=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),Cu=()=>({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}),As=()=>({paneClosedAt:null,worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),Eu=(e,t)=>({parentTaskId:t?.parentTaskId??null,rootTaskId:t?.rootTaskId??e,delegationDepth:t?.delegationDepth??0,delegationIdempotencyKey:t?.delegationIdempotencyKey??null,swarmRunId:t?.swarmRunId??null,swarmStepId:t?.swarmStepId??null}),ak=async(e,t)=>{let r=(await Ie(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},Ou=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");import Wu from"node:path";import{readFile as lk,rm as cO}from"node:fs/promises";import ck from"node:path";var Et=async(e,t)=>{let n=await lk(Go(e,t),"utf8"),r=JSON.parse(n);return dk(r,Go(e,t))},nn=async(e,t)=>{await U(Go(e,t.id),{...t,updatedAt:new Date().toISOString()})};var Go=(e,t)=>ck.join(e.sessionsDir,`${t}.json`);function dk(e,t){let n=fk(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")||!pk(n.attach)||!uk(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 uk(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 pk(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 fk(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??""}}import{randomUUID as Ak}from"node:crypto";import{mkdir as Ek,rm as Ok,writeFile as xk}from"node:fs/promises";import Yo from"node:path";import{spawn as mk}from"node:child_process";import{createHash as hk}from"node:crypto";import gk from"node:path";function rn(e){return`'${e.replace(/'/g,"'\\''")}'`}var yk="craig",xu=async(e,t,n)=>{let r=Ho(e,t),s=kk(),i=await L("tmux",["new-session","-d","-P","-F","#{session_name} #{window_id} #{pane_id}","-s",r,"-n","runner",...s,"-c",n],{cwd:e}),o=bk(i.stdout);return await wk(e,r),o};var wk=async(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 L("tmux",r,{cwd:e})},$u=async(e,t,n)=>{await L("tmux",["resize-window","-t",t,"-x",`${n.columns}`,"-y",`${n.rows}`],{cwd:e})},Du=async(e,t,n)=>{await L("tmux",["send-keys","-t",e,t,"C-m"],{cwd:n})};var Nu=async(e,t,n)=>{await L("tmux",["pipe-pane","-o","-t",e,`cat >> ${rn(t)}`],{cwd:n})},Es=async(e,t,n,r)=>{let s=r??Lu(e);if(n?await L("tmux",["select-window","-t",n],{cwd:e}):await L("tmux",["select-window","-t",t],{cwd:e}),await L("tmux",["select-pane","-t",t],{cwd:e}),process.env.TMUX){await L("tmux",["switch-client","-t",s],{cwd:e});return}await Sk(e,["attach-session","-t",s])};var _u=async(e,t)=>{await L("tmux",["kill-session","-t",t],{cwd:e})};var Lu=e=>{let n=gk.basename(e).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"repo",r=hk("sha1").update(e).digest("hex").slice(0,8);return`${yk}-${n}-${r}`},Ho=(e,t)=>`${Lu(e)}-${t.toLowerCase()}`,kk=()=>{let e=Tk();return e?["-x",`${e.columns}`,"-y",`${e.rows}`]:[]},Tk=()=>{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},bk=e=>{let t=Rk(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]}},Rk=e=>e.split(/\s+/).map(t=>t.trim()).filter(t=>t.length>0),Sk=async(e,t)=>{await new Promise((n,r)=>{let s=mk("tmux",t,{cwd:e,stdio:"inherit"});s.on("error",r),s.on("exit",i=>{if(i===0){n();return}r(new Error(`tmux ${t.join(" ")} failed with exit code ${i??"unknown"}.`))})})};import{accessSync as Pk,constants as Ik}from"node:fs";import{homedir as Mu}from"node:os";import Ot from"node:path";var vk=[Ot.join(Mu(),".local","bin"),Ot.join(Mu(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function Fu(e=process.env){return Ck([...(e.PATH??"").split(Ot.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:vk])}function sn(e=process.env){return{...e,PATH:Fu(e).join(Ot.delimiter)}}function zo(e,t={}){if(e.includes(Ot.sep)){let n=Ot.isAbsolute(e)?e:Ot.resolve(t.cwd??process.cwd(),e);return ju(n)?n:null}for(let n of Fu(t.env)){let r=Ot.join(n,e);if(ju(r))return r}return null}function on(e,t={}){let n=zo(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 ju(e){try{return Pk(e,Ik.X_OK),!0}catch{return!1}}function Ck(e){return[...new Set(e)]}var yr={async create(e,t){let n=await xu(t.repoRoot,t.taskId,t.worktreePath);t.logPath&&await Nu(n.paneId,t.logPath,t.repoRoot);let r=await qu({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||Ho(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 nn(e,s),s},async attach(e,t,n){let r=await yr.snapshot(t,n);if(!r.alive)throw new Error(`Session ${t.id} is no longer live and cannot be attached.`);await Es(n,t.paneId,t.windowTarget,t.sessionName);let s={...t,status:"running",lastAttachedAt:new Date().toISOString(),snapshot:r};return await nn(e,s),s},async resize(e,t,n,r){await $u(r,t.sessionName,n);let s={...t,attach:{...t.attach,lastSize:n}};return await nn(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:t.command};return await nn(e,r),r},async snapshot(e,t){return Dk(e,t)}},Jo={async prepare(e,t){let r=e.runnerSession.command[0],s=sn();on(r,{cwd:t.repoRoot,env:s})},async launch(e,t){let n=e.runnerSession.command,r=on(n[0],{cwd:e.worktreePath,env:sn()}),s=Object.keys(t.environment??{}).length>0?await $k(t.session,t.environment):null,i=[r,...n.slice(1)].map(a=>rn(a)).join(" "),o=s?`. ${rn(s)} && rm -f ${rn(s)} && exec ${i}`:`exec ${i}`;try{await Du(t.session.paneId,o,t.repoRoot)}catch(a){throw s&&await Ok(s,{force:!0}).catch(()=>{}),a}},async status(e){return e.runnerSession.lastKnownState},async stop(){},async collectArtifacts(){}};async function $k(e,t){let n=Yo.join(Yo.dirname(e.logPath??e.worktreePath),".launch-environment");await Ek(n,{recursive:!0,mode:448});let r=Yo.join(n,`${e.id}.${Ak()}.sh`),s=Object.entries(t).map(([i,o])=>{if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(i))throw new Error(`Invalid launch environment variable name: ${i}`);return`export ${i}=${rn(o)}`}).join(`
18
+ `);return await xk(r,`${s}
19
+ `,{encoding:"utf8",mode:384,flag:"wx"}),r}var Dk=async(e,t)=>{let n=await G("tmux",["list-panes","-F","#{pane_id}","-t",e.paneId],{cwd:t});return qu({paneId:e.paneId,windowTarget:e.windowTarget,alive:n.exitCode===0&&n.stdout.split(/\s+/).some(r=>r.trim()===e.paneId)})},qu=async e=>({paneId:e.paneId,windowTarget:e.windowTarget,alive:e.alive,capturedAt:new Date().toISOString()});var Xo=async(e,t,n,r={})=>{let s=n.trim(),i=await k.load(e),o=r.runner??k.runners.getDefault(i);if(k.runners.assertEnabled(o,i),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 a=r.workspaceId?await hr(e,r.workspaceId,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}):await En(e,t,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}),l=a.task,c=k.runners.buildCommand(o,s,i),u=`session_${l.id}`,d=l.artifacts.logPath?Wu.resolve(e.workspaceRoot,l.artifacts.logPath):Wu.join(e.logsDir,`${l.id}.log`);try{let p=await r.onProvisioned?.(l);await Jo.prepare(l,{repoRoot:a.repoRoot});let h=await yr.create(e,{sessionId:u,taskId:l.id,repoId:a.repoId,workspaceId:a.workspaceId,repoRoot:a.repoRoot,worktreePath:l.worktreePath,logPath:d,command:c});await Jo.launch(l,{repoRoot:a.repoRoot,session:h,...p?{environment:p}:{}});let f=new Date().toISOString();h={...h,status:"running",startedAt:f,command:c};let m=await q(e,l.id,g=>({...g,status:"running",runner:o,sessionId:h.id,selectedPtyTabId:g.selectedPtyTabId,runnerSession:{command:h.command,pid:null,startedAt:f,lastKnownState:"running",exitCode:null,exitedAt:null}}));return await nn(e,h),{kind:"createTask",taskId:m.id,repoId:m.repoId,workspaceId:m.workspaceId,sessionId:h.id,status:m.status,branch:m.branch,worktreePath:m.worktreePath,runner:m.runner}}catch(p){throw await q(e,l.id,h=>({...h,sessionId:null,status:"draft",runnerSession:{...h.runnerSession,lastKnownState:"failed"},lastFailureReason:p instanceof Error?p.message:"Unknown Craig error"})),p}};import{mkdir as jk}from"node:fs/promises";import Fk from"node:path";var ut=async e=>{let t=await G("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var Bu=async(e,t,n)=>{let r=n==="merge"?"--merge":n==="rebase"?"--rebase":"--squash";await L("gh",["pr","merge",String(t),r,"--delete-branch=false"],{cwd:e})},On=async(e,t)=>{let n=await L("gh",Qo(e),{cwd:t});return JSON.parse(n.stdout)},xn=async(e,t)=>{let n=await G("gh",Qo(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Vu(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Uu=async(e,t)=>{let n=await G("gh",Qo(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Vu(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Ku=async(e,t,n)=>{if(n.length===0)return[];let r=Lk(n),s;try{s=await L("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw Nk(a)?new Ne(a instanceof Error?a.message:String(a)):a}let o=JSON.parse(s.stdout).data?.repository??{};return n.map((a,l)=>{let c=o[`item${l}`],u=Mk(c);return{id:a.id,found:u!==null,view:u}})},Os=async e=>{let t=await G("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:_k(t.stdout.trim())},xt=e=>{let t=e.trim().match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/([1-9]\d*)(?:[/?#].*)?$/);return!t?.[1]||!t[2]||!t[3]?null:{owner:t[1],name:t[2],number:Number(t[3])}},Nk=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")},Vu=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},Qo=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],_k=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},Lk=e=>`
18
20
  query CraigPullRequestBatch($owner: String!, $name: String!) {
19
21
  repository(owner: $owner, name: $name) {
20
- ${e.map((r,n)=>{let s=`item${n}`;return r.mode==="number"?`${s}: pullRequest(number: ${Number(r.selector)}) { ...PrFields }`:`${s}: pullRequests(headRefName: ${JSON.stringify(r.selector)}, states: OPEN, first: 1, orderBy: { field: UPDATED_AT, direction: DESC }) { nodes { ...PrFields } }`}).join(`
22
+ ${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(`
21
23
  `)}
22
24
  }
23
25
  }
@@ -68,71 +70,206 @@ fragment PrFields on PullRequest {
68
70
  }
69
71
  }
70
72
  }
71
- `,sg=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 r=t,n=r.statusCheckRollup?.contexts?.nodes??[];return{number:r.number,url:r.url,baseRefName:r.baseRefName,headRefName:r.headRefName,headRefOid:r.headRefOid??null,state:r.state,isDraft:r.isDraft??!1,title:r.title??null,createdAt:r.createdAt??null,updatedAt:r.updatedAt??null,mergedAt:r.mergedAt??null,mergeable:r.mergeable,mergeStateStatus:r.mergeStateStatus,reviewDecision:r.reviewDecision??null,statusCheckRollup:n,comments:r.comments?.nodes??[]}};var ut=async(e,t)=>{let r=at(e,t.artifacts.prStatusPath);r&&(await ig(og.dirname(r),{recursive:!0}),await L(r,{taskId:t.id,prs:t.prs}))},ir=async(e,t,r={writeTask:Ce,writePrStatusArtifact:ut})=>{await r.writeTask(e,t);try{await r.writePrStatusArtifact(e,t)}catch(n){throw new g("PARTIAL_RESULT",`Task ${t.id} was updated, but its PR status artifact could not be written.`,{retryable:!0,details:{taskId:t.id},cause:n})}return t},or=async(e,t,r,n,s={readRawTask:Ie,validateTaskRecord:pe,writeTask:Ce,writePrStatusArtifact:ut,withTaskLock:qe})=>s.withTaskLock(e,t.id,async()=>{let i=await s.readRawTask(e,t.id),o=s.validateTaskRecord(i,`${e.tasksDir}/${t.id}.json`),a=o.prs.find(f=>n?.number!==null&&f.number===n?.number)??n,l=Ee(r,a),c=Ae(o,l),d=o.status==="closed"?o.status:ot(c.prs),u={...c,status:d};return ir(e,u,s)}),ar=async(e,t)=>{let r=E(t),n=r?.number?String(r.number):t.branch,s=await xt(n,t.worktreePath);return or(e,t,s,r)},lr=async(e,t)=>{for(let r of await $s(t)){let n=await Dt(r,t.worktreePath);if(!n)continue;return{discovered:!0,task:await or(e,t,n,null)}}return{discovered:!1,task:t}},$s=async e=>{let t=await il(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(r=>!!r))]};async function cr(e,t,r,n){return qe(e,t,async()=>{let s=await A(e,t);if(!s.repoTargets?.find(h=>h.repoId===r))throw new Error(`Project task ${t} has no repo target ${r}.`);let o=Ke(n.url),a=s.prs.find(h=>o?It(h,{owner:o.owner,repo:o.name,number:n.number}):h.number===n.number)??null,l=Ee(n,a,o??void 0),c=ag(n),d=Ae(s,l),u={...d,repoTargets:(d.repoTargets??[]).map(h=>h.repoId===r?{...h,pullRequest:c}:h)},f={...u,status:u.status==="closed"?u.status:Ms(u)};return ir(e,f)})}function ag(e){let t=Ke(e.url);return{provider:"github",owner:t?.owner??null,repo:t?.name??null,number:e.number,url:e.url,baseBranch:e.baseRefName,headBranch:e.headRefName,status:lg(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:cg(e.reviewDecision??null),requiredChecks:Ts(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function Ms(e){let t=(e.repoTargets??[]).filter(n=>n.status==="ready"),r=t.map(n=>n.pullRequest).filter(n=>n.number!==null);return r.length===0?"checked":r.every(n=>n.status==="merged")?"merged":r.length===t.length&&r.every(n=>n.mergeable&&n.reviewDecision!=="REVIEW_REQUIRED"&&n.reviewDecision!=="CHANGES_REQUESTED"&&n.mergeStateStatus!=="REVIEW_REQUIRED"&&n.requiredChecks.length>0&&n.requiredChecks.every(s=>s.status==="success"||s.status==="skipped"))?"merge_ready":r.some(n=>n.status==="open")?"pr_open":"checked"}var lg=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,cg=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null;var Ot=async(e,t,r)=>{let n=r.pullRequest.number?String(r.pullRequest.number):r.branch;if(r.pullRequest.number){let i=await xt(n,r.worktreePath);return await cr(e,t.id,r.repoId,i),"synced"}let s=await Dt(n,r.worktreePath);return s?(await cr(e,t.id,r.repoId,s),"discovered"):"not_found"};var dr=async(e,t)=>{let r=await A(e,t),n=E(r);return n?.number?(await xe(r.worktreePath),Ue(n)?(await lr(e,r)).task:ar(e,r)):r},Ls=async(e,t)=>{let r=await A(e,t);if(r.type==="project"&&r.repoTargets?.length)return await $t(e,t),A(e,t);let n=E(r);if(await J(r),await xe(r.worktreePath),!n?.number||Ue(n)){let i=await lr(e,r);if(!i.discovered&&!n?.number)throw new Error(`No PR found for ${r.branch}.`);return i.task}return await ar(e,r)},$t=async(e,t)=>{let r=await A(e,t),n=(r.repoTargets??[]).filter(i=>i.status==="ready"),s={synced:0,discovered:0,notFound:0};for(let i of n){await xe(i.worktreePath);let o=i.pullRequest.number?await Ot(e,r,i):await Ot(e,r,i).catch(()=>"not_found");s[o==="not_found"?"notFound":o]++}return s},_s=async(e,t)=>{let r=new Map,n=new Map,s=[];for(let i of t){let o=Ns(r,i);if(i.type==="project"&&i.repoTargets?.length){for(let u of i.repoTargets.filter(f=>f.status==="ready")){let f={id:`${i.id}:${u.repoId}`,task:i,targetRepoId:u.repoId,worktreePath:u.worktreePath,selector:u.pullRequest.number?String(u.pullRequest.number):u.branch,mode:u.pullRequest.number?"number":"head",fallbackSelectors:[]};await xl(n,f).catch(async()=>{try{await xe(u.worktreePath);let h=u.pullRequest.number?await Ot(e,i,u):await Ot(e,i,u);Qr(o,h,u.pullRequest.number??null,u.pullRequest.url??null)}catch(h){if(h instanceof fe)throw h;s.push(h)}})}continue}let a=E(i),l=a?.number&&!Ue(a),c=l?[]:await $s(i),d={id:i.id,task:i,worktreePath:i.worktreePath,selector:l?String(a.number):c[0]??i.branch,mode:l?"number":"head",fallbackSelectors:l?[]:c.slice(1)};await xl(n,d).catch(async()=>{try{let{disposition:u,task:f}=await Zr(e,i.id),h=E(f);Qr(o,u,h?.number??null,h?.url??null)}catch(u){if(u instanceof fe)throw u;s.push(u)}})}for(let i of n.values())try{await xe(i.worktreePath);let o=await Al(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=Ns(r,l.task),u=a.get(l.id)?.view??await dg(i.worktreePath,l);if(!u){Qr(c,"not_found",null,null);continue}if(l.targetRepoId)await cr(e,l.task.id,l.targetRepoId,u);else{let f=await Ie(e,l.task.id),h=pe(f,`${e.tasksDir}/${l.task.id}.json`);await or(e,h,u,l.mode==="number"?E(h):null)}Qr(c,l.mode==="number"?"synced":"discovered",u.number,u.url)}}catch(o){if(o instanceof fe)throw o;s.push(o)}return ug(s),t.map(i=>Ns(r,i))},Zr=async(e,t)=>{let r=await A(e,t);await J(r),await xe(r.worktreePath);let n=E(r);if(n?.number&&!Ue(n))return{disposition:"synced",task:await ar(e,r)};let s=await lr(e,r);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},dg=async(e,t)=>{if(t.mode!=="head")return null;for(let r of t.fallbackSelectors){let n=await Dt(r,e);if(n)return n}return null},xl=async(e,t)=>{let r=await Xr(t.worktreePath);if(!r)throw new Error("GitHub repository remote could not be parsed.");let n=`${r.owner}/${r.name}`,s=e.get(n);if(s){s.items.push(t);return}e.set(n,{worktreePath:t.worktreePath,repository:r,items:[t]})},Ns=(e,t)=>{let r=e.get(t.id);if(r)return r;let n={taskId:t.id,synced:0,discovered:0,notFound:0,hadPr:t.type==="project"?!!t.repoTargets?.some(s=>s.pullRequest.number):!!E(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,n),n},Qr=(e,t,r,n)=>{if(t==="synced"){e.synced+=1;return}if(t==="discovered"){e.discovered+=1,e.firstDiscoveredPrNumber??=r,e.firstDiscoveredPrUrl??=n;return}e.notFound+=1},ug=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var js=async(e,t)=>{let r=await A(e,t);try{r.type==="project"&&r.repoTargets?.length?(await $t(e,t),r=await A(e,t)):r.prs.some(i=>i.number)&&(r=await dr(e,t))}catch{}let n=await Qt(e,r),s=r.sessionId?await Be(e,r.sessionId).catch(()=>null):null;return{kind:"showTask",task:r,inspection:n,session:s}};var Fs=async(e,t)=>{let r=await A(e,t);if(await J(r),(await C("git",["status","--short"],{cwd:r.worktreePath})).stdout.trim().length===0)return{kind:"showTaskDiff",taskId:r.id,diffText:"",isEmpty:!0};let s=await pg(r.worktreePath);return{kind:"showTaskDiff",taskId:r.id,diffText:s,isEmpty:!1}},pg=async e=>{let t=[],r=await C("git",["diff","--stat","--patch","HEAD"],{cwd:e});r.stdout.trim().length>0&&t.push(r.stdout.trimEnd());let n=await mg(e);for(let s of n){let i=await $("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(i.stdout.trimEnd())}return t.join(`
73
+ `,Mk=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??[];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??[]}};var an=async(e,t)=>{let n=tn(e,t.artifacts.prStatusPath);n&&(await jk(Fk.dirname(n),{recursive:!0}),await U(n,{taskId:t.id,prs:t.prs}))},wr=async(e,t,n={writeTask:lt,writePrStatusArtifact:an})=>{await n.writeTask(e,t);try{await n.writePrStatusArtifact(e,t)}catch(r){throw new y("PARTIAL_RESULT",`Task ${t.id} was updated, but its PR status artifact could not be written.`,{retryable:!0,details:{taskId:t.id},cause:r})}return t},kr=async(e,t,n,r,s={readRawTask:at,validateTaskRecord:$e,writeTask:lt,writePrStatusArtifact:an,withTaskLock:Ct})=>s.withTaskLock(e,t.id,async()=>{let i=await s.readRawTask(e,t.id),o=s.validateTaskRecord(i,`${e.tasksDir}/${t.id}.json`),a=o.prs.find(p=>r?.number!==null&&p.number===r?.number)??r,l=dt(n,a),c=ct(o,l),u=o.status==="closed"?o.status:en(c.prs),d={...c,status:u};return wr(e,d,s)}),Tr=async(e,t)=>{let n=B(t),r=n?.number?String(n.number):t.branch,s=await On(r,t.worktreePath);return kr(e,t,s,n)},br=async(e,t)=>{for(let n of await Zo(t)){let r=await xn(n,t.worktreePath);if(!r)continue;return{discovered:!0,task:await kr(e,t,r,null)}}return{discovered:!1,task:t}},Zo=async e=>{let t=await Tu(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(n=>!!n))]};async function Rr(e,t,n,r){return Ct(e,t,async()=>{let s=await M(e,t);if(!s.repoTargets?.find(h=>h.repoId===n))throw new Error(`Project task ${t} has no repo target ${n}.`);let o=xt(r.url),a=s.prs.find(h=>o?vn(h,{owner:o.owner,repo:o.name,number:r.number}):h.number===r.number)??null,l=dt(r,a,o??void 0),c=qk(r),u=ct(s,l),d={...u,repoTargets:(u.repoTargets??[]).map(h=>h.repoId===n?{...h,pullRequest:c}:h)},p={...d,status:d.status==="closed"?d.status:ea(d)};return wr(e,p)})}function qk(e){let t=xt(e.url);return{provider:"github",owner:t?.owner??null,repo:t?.name??null,number:e.number,url:e.url,baseBranch:e.baseRefName,headBranch:e.headRefName,status:Wk(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:Bk(e.reviewDecision??null),requiredChecks:Fo(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function ea(e){let t=(e.repoTargets??[]).filter(r=>r.status==="ready"),n=t.map(r=>r.pullRequest).filter(r=>r.number!==null);return n.length===0?"checked":n.every(r=>r.status==="merged")?"merged":n.length===t.length&&n.every(r=>r.mergeable&&r.reviewDecision!=="REVIEW_REQUIRED"&&r.reviewDecision!=="CHANGES_REQUESTED"&&r.mergeStateStatus!=="REVIEW_REQUIRED"&&r.requiredChecks.length>0&&r.requiredChecks.every(s=>s.status==="success"||s.status==="skipped"))?"merge_ready":n.some(r=>r.status==="open")?"pr_open":"checked"}var Wk=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,Bk=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null;var $n=async(e,t,n)=>{let r=n.pullRequest.number?String(n.pullRequest.number):n.branch;if(n.pullRequest.number){let i=await On(r,n.worktreePath);return await Rr(e,t.id,n.repoId,i),"synced"}let s=await xn(r,n.worktreePath);return s?(await Rr(e,t.id,n.repoId,s),"discovered"):"not_found"};var Sr=async(e,t)=>{let n=await M(e,t),r=B(n);return r?.number?(await ut(n.worktreePath),At(r)?(await br(e,n)).task:Tr(e,n)):n},na=async(e,t)=>{let n=await M(e,t);if(n.type==="project"&&n.repoTargets?.length)return await Dn(e,t),M(e,t);let r=B(n);if(await de(n),await ut(n.worktreePath),!r?.number||At(r)){let i=await br(e,n);if(!i.discovered&&!r?.number)throw new Error(`No PR found for ${n.branch}.`);return i.task}return await Tr(e,n)},Dn=async(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 ut(i.worktreePath);let o=i.pullRequest.number?await $n(e,n,i):await $n(e,n,i).catch(()=>"not_found");s[o==="not_found"?"notFound":o]++}return s},ra=async(e,t)=>{let n=new Map,r=new Map,s=[];for(let i of t){let o=ta(n,i);if(i.type==="project"&&i.repoTargets?.length){for(let d of i.repoTargets.filter(p=>p.status==="ready")){let p={id:`${i.id}:${d.repoId}`,task:i,targetRepoId:d.repoId,worktreePath:d.worktreePath,selector:d.pullRequest.number?String(d.pullRequest.number):d.branch,mode:d.pullRequest.number?"number":"head",fallbackSelectors:[]};await Gu(r,p).catch(async()=>{try{await ut(d.worktreePath);let h=d.pullRequest.number?await $n(e,i,d):await $n(e,i,d);xs(o,h,d.pullRequest.number??null,d.pullRequest.url??null)}catch(h){if(h instanceof Ne)throw h;s.push(h)}})}continue}let a=B(i),l=a?.number&&!At(a),c=l?[]:await Zo(i),u={id:i.id,task:i,worktreePath:i.worktreePath,selector:l?String(a.number):c[0]??i.branch,mode:l?"number":"head",fallbackSelectors:l?[]:c.slice(1)};await Gu(r,u).catch(async()=>{try{let{disposition:d,task:p}=await $s(e,i.id),h=B(p);xs(o,d,h?.number??null,h?.url??null)}catch(d){if(d instanceof Ne)throw d;s.push(d)}})}for(let i of r.values())try{await ut(i.worktreePath);let o=await Ku(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=ta(n,l.task),d=a.get(l.id)?.view??await Uk(i.worktreePath,l);if(!d){xs(c,"not_found",null,null);continue}if(l.targetRepoId)await Rr(e,l.task.id,l.targetRepoId,d);else{let p=await at(e,l.task.id),h=$e(p,`${e.tasksDir}/${l.task.id}.json`);await kr(e,h,d,l.mode==="number"?B(h):null)}xs(c,l.mode==="number"?"synced":"discovered",d.number,d.url)}}catch(o){if(o instanceof Ne)throw o;s.push(o)}return Kk(s),t.map(i=>ta(n,i))},$s=async(e,t)=>{let n=await M(e,t);await de(n),await ut(n.worktreePath);let r=B(n);if(r?.number&&!At(r))return{disposition:"synced",task:await Tr(e,n)};let s=await br(e,n);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},Uk=async(e,t)=>{if(t.mode!=="head")return null;for(let n of t.fallbackSelectors){let r=await xn(n,e);if(r)return r}return null},Gu=async(e,t)=>{let n=await Os(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]})},ta=(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):!!B(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,r),r},xs=(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},Kk=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var sa=async(e,t)=>{let n=await M(e,t);try{n.type==="project"&&n.repoTargets?.length?(await Dn(e,t),n=await M(e,t)):n.prs.some(i=>i.number)&&(n=await Sr(e,t))}catch{}let r=await ur(e,n),s=n.sessionId?await Et(e,n.sessionId).catch(()=>null):null;return{kind:"showTask",task:n,inspection:r,session:s}};var ia=async(e,t)=>{let n=await M(e,t);if(await de(n),(await L("git",["status","--short"],{cwd:n.worktreePath})).stdout.trim().length===0)return{kind:"showTaskDiff",taskId:n.id,diffText:"",isEmpty:!0};let s=await Vk(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}},Vk=async e=>{let t=[],n=await L("git",["diff","--stat","--patch","HEAD"],{cwd:e});n.stdout.trim().length>0&&t.push(n.stdout.trimEnd());let r=await Gk(e);for(let s of r){let i=await G("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(i.stdout.trimEnd())}return t.join(`
72
74
 
73
- `)},mg=async e=>(await C("git",["ls-files","--others","--exclude-standard"],{cwd:e})).stdout.split(`
74
- `).map(r=>r.trim()).filter(r=>r.length>0);import{spawn as fg}from"node:child_process";import{access as gg}from"node:fs/promises";var Ws=async(e,t)=>{let r=await A(e,t),n=Ct(e,r);if(!n)throw new Error(`Task ${r.id} does not have a Craig-managed log path.`);try{await gg(n)}catch{throw new Error(`Task ${r.id} log file does not exist yet at ${n}.`)}return{kind:"streamTaskLogs",taskId:r.id,logPath:n}},qs=async e=>{await new Promise((t,r)=>{let n=!1,s=fg("tail",["-n","+1","-f",e],{stdio:"inherit"}),i=()=>{n=!0,s.kill("SIGINT")};process.on("SIGINT",i),s.on("error",a=>{o(),r(a)}),s.on("exit",(a,l)=>{if(o(),n||l==="SIGINT"){t();return}if(a===0){t();return}r(new Error(`tail -n +1 -f ${e} failed with exit code ${a??"unknown"}.`))});function o(){process.off("SIGINT",i)}})};import{mkdir as hg}from"node:fs/promises";import wg from"node:path";var Us=async(e,t)=>{let r=await A(e,t);if(await J(r),r.status==="draft"||r.status==="merged")throw new Error(`Task ${r.id} cannot run checks from status "${r.status}".`);if(r.status==="running"&&await Gr(r.worktreePath)&&(r.status="review"),r.status!=="review"&&r.status!=="checked")throw new Error(`Task ${r.id} cannot run checks from status "${r.status}".`);let s=(await k.load(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);await x(e,r.id,a=>({...a,status:a.status==="running"?r.status:a.status,checks:{...a.checks,status:"running",commands:[...s],results:[]}}));let i=[];for(let a of s){let l=new Date().toISOString(),c=await $("sh",["-lc",a],{cwd:r.worktreePath}),d=new Date().toISOString(),u=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:d,exitCode:u}),u!==0){let f=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,h=await x(e,r.id,p=>({...p,status:"review",checks:{...p.checks,results:i,status:"failed",lastRunAt:d},lastFailureReason:f}));return await Dl(e,h),{kind:"runChecks",taskId:r.id,status:"failed",commands:s}}}let o=await x(e,r.id,a=>({...a,status:a.status==="review"||a.status==="checked"?"checked":a.status,checks:{...a.checks,results:i,status:"passed",lastRunAt:new Date().toISOString()},lastFailureReason:null}));return await Dl(e,o),{kind:"runChecks",taskId:r.id,status:"passed",commands:s}},Dl=async(e,t)=>{let r=at(e,t.artifacts.checkSummaryPath);r&&(await hg(wg.dirname(r),{recursive:!0}),await L(r,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))};var Bs=async(e,t)=>{let r=await A(e,t);await J(r);let n=await Gr(r.worktreePath);if(r.status==="running"&&n&&(r.status="review"),r.status!=="review"&&r.status!=="checked")throw new Error(`Task ${r.id} cannot commit from status "${r.status}".`);if(!n)throw new Error(`Task ${r.id} has no uncommitted diff to commit.`);let s=r.prompt.value.trim();await rl(r.worktreePath),await nl(r.worktreePath,s);let i=await sl(r.worktreePath),o=new Date().toISOString(),a=await x(e,r.id,l=>({...l,status:l.status==="running"?r.status:l.status,lastCommit:{sha:i.sha,message:i.message,committedAt:o},lastFailureReason:null}));return{kind:"commitTask",taskId:r.id,status:a.status,commitSha:i.sha,message:i.message}};import{access as kg}from"node:fs/promises";var Vs=async(e,t)=>{let r=await A(e,t),n=await yg(r.worktreePath);return x(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:n&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},yg=async e=>{try{return await kg(e),!0}catch{return!1}};var Ks=async(e,t,r)=>{let n=[],s=null,i=null;try{if(t.sessionId){let o=await Be(e,t.sessionId);await yl(e.repoRoot,o.sessionName),s=new Date().toISOString()}}catch(o){n.push(o instanceof Error?o.message:"Failed to close tmux session.")}if(!r.preserveWorktree)try{await ol(e.repoRoot,t.worktreePath),i=new Date().toISOString()}catch(o){n.push(o instanceof Error?o.message:"Failed to remove worktree.")}await x(e,t.id,o=>({...o,cleanup:{...o.cleanup,paneClosedAt:s??o.cleanup.paneClosedAt,worktreeRemovedAt:i??o.cleanup.worktreeRemovedAt,preservedWorktree:r.preserveWorktree,warning:n.length>0?n.join(" "):null}}))};var Gs=async(e,t,r)=>{let n=await me(e,r),s=await x(e,t,i=>{if(i.repoId===n.id)throw new Error(`Repo ${n.id} is already the primary repo for task ${i.id}.`);return{...i,linkedRepoIds:i.linkedRepoIds.includes(n.id)?i.linkedRepoIds:[...i.linkedRepoIds,n.id]}});return{kind:"addTaskLink",taskId:s.id,repoId:n.id,linkedRepoIds:s.linkedRepoIds}},Hs=async(e,t)=>{let r=await A(e,t),n=await Promise.all(r.linkedRepoIds.map(s=>me(e,s)));return{kind:"listTaskLinks",taskId:r.id,repos:n}};var zs=async(e,t)=>{let r=await A(e,t);if(!r.sessionId)throw new Error(`Task ${r.id} does not have a Craig session to attach.`);let[n,s]=await Promise.all([me(e,r.repoId),Be(e,r.sessionId)]),i=await sr.attach(e,s,n.rootPath);return{kind:"attachTask",taskId:r.id,sessionId:i.id,disposition:"attached"}};var Ys=async(e,t)=>{let r=await A(e,t);if(!r.sessionId)throw new Error(`Task ${r.id} does not have a Craig session.`);let n=await Be(e,r.sessionId).catch(s=>{throw Tg(s)?new Error(`Task ${r.id} does not have a Craig session.`):s});if(!n.paneId)throw new Error(`Task ${r.id} does not have a tmux target.`);return await Jr(e.repoRoot,n.paneId,n.windowTarget,n.sessionName),{kind:"focusTask",taskId:r.id,tmuxTarget:n.paneId}},Tg=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";import{spawn as Rg}from"node:child_process";var Js=async(e,t)=>{let r=await A(e,t);await J(r);let s=(await k.load(e)).open?.command??[];if(s.length===0)return{kind:"openTask",taskId:r.id,worktreePath:r.worktreePath,launched:!1,command:null};let i=[...s,r.worktreePath];return await bg(i,e.repoRoot),{kind:"openTask",taskId:r.id,worktreePath:r.worktreePath,launched:!0,command:i}},bg=async(e,t)=>{await new Promise((r,n)=>{let[s,...i]=e,o=Rg(s,i,{cwd:t,stdio:"inherit"});o.on("error",n),o.on("exit",a=>{if(a===0){r();return}n(new Error(`${e.join(" ")} failed with exit code ${a??"unknown"}.`))})})};var Xs=async(e,t,r)=>{await x(e,t,n=>({...n,status:n.status==="running"?"draft":n.status,runnerSession:{...n.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:r}))},Qs=async(e,t,r)=>x(e,t,n=>({...n,status:"draft",runnerSession:{...n.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:r})),Zs=async(e,t)=>x(e,t,r=>{let n=r.ptyTabs.find(s=>s.kind==="agent");if(!n)throw new Error(`Task ${t} is missing its agent PTY tab.`);return{...r,status:"running",selectedPtyTabId:n.id,runnerSession:{...r.runnerSession,startedAt:new Date().toISOString(),lastKnownState:"running"}}});import{realpath as $l}from"node:fs/promises";import ur from"node:path";async function ti(e,t){if(t.explicitTaskId!==void 0){let l=await Ol(e,t.explicitTaskId,"explicit");return ei(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await Ol(e,t.environmentTaskId,"environment");return ei(l,"environment",t.environmentAgentTabId)}let r=await $l(t.cwd).catch(()=>ur.resolve(t.cwd)),n=await er(e,{includeClosed:!0}),i=(await Promise.all(n.tasks.map(async l=>({task:l,matches:await Sg(l,r)})))).filter(l=>l.matches).map(l=>l.task),o=[...new Map(i.map(l=>[l.id,l])).values()];if(o.length>1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Multiple Craig tasks match ${r}: ${o.map(l=>l.id).join(", ")}. Use --task <id>.`,{details:{cwd:r,taskIds:o.map(l=>l.id)}});let a=o[0];if(a)return ei(a,"cwd",t.environmentAgentTabId);if(t.environmentAgentTabId!==void 0)throw new g("TASK_CONTEXT_CONFLICT",`CRAIG_AGENT_TAB_ID is set to ${t.environmentAgentTabId}, but no task context could be resolved.`,{details:{agentTabId:t.environmentAgentTabId}});if(t.required)throw new g("TASK_CONTEXT_NOT_FOUND",`No Craig task was found from ${r}. Use --task <id> or run the command inside a task worktree.`,{details:{cwd:r}});return null}async function Ol(e,t,r){try{return await A(e,t)}catch(n){throw!(n instanceof g)||n.code!=="TASK_NOT_FOUND"?n:new g("TASK_CONTEXT_NOT_FOUND",`Craig task "${t}" from ${r==="explicit"?"--task":"CRAIG_TASK_ID"} was not found.`,{details:{taskId:t,source:r},cause:n})}}function ei(e,t,r){let n=r??null;if(n!==null){let s=e.ptyTabs.find(i=>i.id===n);if(!s||s.kind!=="agent")throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${n} does not belong to Craig task ${e.id}.`,{details:{taskId:e.id,agentTabId:n}})}return{task:e,source:t,agentTabId:n}}function Pg(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function Sg(e,t){return(await Promise.all(Pg(e).map(n=>$l(n).catch(()=>ur.resolve(n))))).some(n=>vg(n,t))}function vg(e,t){let r=ur.relative(ur.resolve(e),t);return r===""||!r.startsWith("..")&&!ur.isAbsolute(r)}var ri=async(e,t,r="merge",n)=>{let s=await A(e,t),i=n??E(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await Il(s.worktreePath,i,r)};var pr={readTask:A,writeTask:Ce,withTaskLock:qe,ensureGhAuthenticated:xe,fetchPrView:xt,discoverPrView:Cl,getGitHubRepositoryLocator:Xr,writePrStatusArtifact:ut};async function si(e,t,r,n=pr){let s=await n.readTask(e,t),i=await Cg(s,r,n);return Ge(s,i,"showTaskPr","shown",[])}async function ii(e,t,r,n=pr){return n.withTaskLock(e,t,async()=>{let s=await n.readTask(e,t),i=await di(s,r,null,n);await ui(i,n);let o=await tn(`discover a pull request for ${i.branch}`,()=>n.discoverPrView(i.branch,i.worktreePath));if(!o)return Ge(s,i,"discoverTaskPr","not_found",[]);pi(o,i);let a=rn(s,i,o.number),l=await mi(e,s,i,o,n);return Ge(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function oi(e,t,r,n,s=pr){let i=ci(r);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await di(o,n,i.repository,s);Nl(i.repository,a),await ui(a,s);let l=await tn(`fetch pull request ${r}`,()=>s.fetchPrView(r,a.worktreePath));Ag(l,i),pi(l,a);let c=rn(o,a,l.number),d=fi(o,a),u=d&&!It(d,{owner:a.repository.owner,repo:a.repository.name,number:l.number})&&d.status!=="closed"&&d.status!=="merged"?[`Pull request #${l.number} becomes active; #${d.number} remains in task history.`]:[],f=await mi(e,o,a,l,s);return Ge(f,a,"linkTaskPr",c?"unchanged":"linked",u)})}async function Ig(e,t,r,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw Mt(e,t);let o=e.prs.find(a=>a.number===r.number)??E(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await en(o,e.worktreePath,e.repoId,n),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw Mt(e,t);let a=Ml(o.pullRequest),l=e.prs.find(c=>c.number===r.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&Te({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await en(l,o.worktreePath,t,n),projectTarget:o}}if(!r.repository)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for a numeric pull request selector.`,{details:{taskId:e.id,pullRequestNumber:r.number}});let s=r.repository,i=[];for(let o of e.repoTargets??[]){let a=o.pullRequest.owner&&o.pullRequest.repo&&Te({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===r.number&&c.owner&&c.repo&&Te({owner:c.owner,name:c.repo},s)&&(!c.headBranch||c.headBranch===o.branch));(a||l)&&i.push({repoId:o.repoId,branch:o.branch,worktreePath:o.worktreePath,repository:s,projectTarget:o})}if(i.length!==1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${r.repository.owner}/${r.repository.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:r.repository.owner,repo:r.repository.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function ai(e,t,r,n=pr){return n.withTaskLock(e,t,async()=>{let s=await n.readTask(e,t),i=await di(s,r,null,n),o=fi(s,i);if(!o?.number)return Ge(s,i,"refreshTaskPr","not_found",[]);await ui(i,n);let a=await tn(`refresh pull request #${o.number}`,()=>n.fetchPrView(String(o.number),i.worktreePath));pi(a,i);let l=await mi(e,s,i,a,n);return Ge(l,i,"refreshTaskPr","synced",[])})}async function li(e,t,r,n,s=pr){let i=ci(r);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Ig(o,n,i,s);if(Nl(i.repository,a),!rn(o,a,i.number))return Ge(o,a,"unlinkTaskPr","unchanged",[]);let c=Eg(o,a,i.number),d=await _l(e,c,s);return Ge(d,a,"unlinkTaskPr","unlinked",[])})}function ci(e){let t=e.trim(),r=Ke(t);if(r)return{number:r.number,repository:r};if(/^[1-9]\d*$/.test(t))return{number:Number(t),repository:null};throw new g("CLI_USAGE",`Invalid pull request selector "${e}". Use a GitHub pull request URL or positive number.`,{details:{selector:e}})}async function di(e,t,r,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw Mt(e,t);return ni(e.repoId,e.branch,e.worktreePath,null,n)}let s=e.repoTargets??[];if(t){let o=s.find(a=>a.repoId===t);if(!o)throw Mt(e,t);return ni(o.repoId,o.branch,o.worktreePath,o,n)}if(!r)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for pull request commands.`,{details:{taskId:e.id,repoIds:s.map(o=>o.repoId)}});let i=[];for(let o of s){let a=await ni(o.repoId,o.branch,o.worktreePath,o,n).catch(l=>{if(l instanceof g&&l.code==="EXTERNAL_DEPENDENCY_FAILED"&&l.message.includes("does not have a supported GitHub origin remote"))return null;throw l});a&&Te(a.repository,r)&&i.push(a)}if(i.length!==1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${r.owner}/${r.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:r.owner,repo:r.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function Cg(e,t,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw Mt(e,t);let s=E(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await en(s,e.worktreePath,e.repoId,r),projectTarget:null}}if(!t)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for pull request commands.`,{details:{taskId:e.id,repoIds:(e.repoTargets??[]).map(s=>s.repoId)}});let n=e.repoTargets?.find(s=>s.repoId===t);if(!n)throw Mt(e,t);return{repoId:t,branch:n.branch,worktreePath:n.worktreePath,repository:await en(n.pullRequest,n.worktreePath,t,r),projectTarget:n}}async function en(e,t,r,n){let s=Ml(e);return s||(await n.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:r})}function Ml(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Ke(e.url):null}async function ni(e,t,r,n,s){let i=await s.getGitHubRepositoryLocator(r);if(!i)throw new g("EXTERNAL_DEPENDENCY_FAILED",`Repo ${e} does not have a supported GitHub origin remote.`,{details:{repoId:e,worktreePath:r}});return{repoId:e,branch:t,worktreePath:r,repository:i,projectTarget:n}}async function ui(e,t){await tn("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function tn(e,t){try{return await t()}catch(r){throw r instanceof g?r:new g("EXTERNAL_DEPENDENCY_FAILED",`Failed to ${e}: ${r instanceof Error?r.message:String(r)}`,{retryable:!0,cause:r})}}function Nl(e,t){if(e&&!Te(e,t.repository))throw Ll(e,t)}function Ag(e,t){let r=Ke(e.url);if(!r||r.number!==t.number)throw new g("TASK_CONTEXT_CONFLICT",`GitHub returned ${e.url} for pull request selector #${t.number}.`,{details:{selectorNumber:t.number,returnedUrl:e.url}});if(t.repository&&!Te(t.repository,r))throw new g("PR_REPOSITORY_MISMATCH",`GitHub returned a pull request from ${r.owner}/${r.name}, not ${t.repository.owner}/${t.repository.name}.`,{details:{selectorRepository:t.repository,returnedRepository:r}})}function pi(e,t){let r=Ke(e.url);if(!r||!Te(r,t.repository))throw Ll(r,t);if(e.headRefName!==t.branch)throw new g("PR_BRANCH_MISMATCH",`Pull request #${e.number} uses head branch ${e.headRefName}, not task branch ${t.branch}.`,{details:{repoId:t.repoId,pullRequestNumber:e.number,expectedBranch:t.branch,actualBranch:e.headRefName}})}function Ll(e,t){return new g("PR_REPOSITORY_MISMATCH",`Pull request repository ${e?`${e.owner}/${e.name}`:"is invalid"} does not match task repo ${t.repository.owner}/${t.repository.name}.`,{details:{repoId:t.repoId,expectedOwner:t.repository.owner,expectedRepo:t.repository.name,actualOwner:e?.owner??null,actualRepo:e?.name??null}})}function Mt(e,t){return new g("TASK_CONTEXT_CONFLICT",`Repo ${t} is not a target of task ${e.id}.`,{details:{taskId:e.id,repoId:t}})}function Te(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function mi(e,t,r,n,s){let i=rn(t,r,n.number),o=Ee(n,i,r.repository),a=Ae(t,o);return r.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===r.repoId?{...l,pullRequest:Wl(o)}:l)}),_l(e,a,s)}function Eg(e,t,r){let n=e.prs.filter(i=>!Fl(i,t,r)),s={...e,prs:n};if(t.projectTarget?.pullRequest.number===r){let i=jl(n.filter(o=>o.owner&&o.repo&&Te({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?Wl(i):Dg(t.repository)}:o)}}return s}async function _l(e,t,r){let n=t.status==="closed"?t.status:t.type==="project"?Ms(t):ot(t.prs),s={...t,status:n};return ir(e,s,r)}function rn(e,t,r){return gi(e,t).find(n=>Fl(n,t,r))??null}function fi(e,t){if(!t.projectTarget)return E(e);let r=gi(e,t);return jl(r)}function jl(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function gi(e,t){if(!t.projectTarget)return e.prs;let r=e.prs.filter(i=>i.owner&&i.repo&&Te({owner:i.owner,name:i.repo},t.repository)),n=e.repoTargets?.find(i=>i.repoId===t.repoId),s=n?.pullRequest.number?xg(n.pullRequest,t.repository):null;return s&&!r.some(i=>It(i,s))?[...r,s]:r}function Fl(e,t,r){return e.number!==r?!1:!e.owner||!e.repo||Te({owner:e.owner,name:e.repo},t.repository)}function Ge(e,t,r,n,s){let i=gi(e,t);return{kind:r,taskId:e.id,repoId:t.repoId,disposition:n,pullRequests:i,primaryPullRequest:fi(e,t),warnings:s}}function Wl(e){return{provider:"github",owner:e.owner,repo:e.repo,number:e.number,url:e.url,baseBranch:e.baseBranch,headBranch:e.headBranch,status:e.status==="draft"?"open":e.status,draft:e.draft,mergeable:e.mergeable,mergeStateStatus:e.mergeStateStatus,reviewDecision:e.reviewDecision??null,requiredChecks:e.requiredChecks,comments:e.comments??[],lastSyncedAt:e.lastSyncedAt,lastSyncedHeadSha:e.lastSyncedHeadSha}}function xg(e,t){return{provider:"github",owner:e.owner??t.owner,repo:e.repo??t.name,number:e.number,url:e.url,title:null,status:e.draft?"draft":e.status,draft:e.draft??!1,baseBranch:e.baseBranch,headBranch:e.headBranch,mergeable:e.mergeable,mergeStateStatus:e.mergeStateStatus,reviewDecision:e.reviewDecision??null,requiredChecks:e.requiredChecks,comments:e.comments??[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:e.lastSyncedAt,lastSyncedHeadSha:e.lastSyncedHeadSha}}function Dg(e){return{provider:"github",owner:e.owner,repo:e.name,number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null}}var P={listTasks:er,getTask:A,provisionTask:Et,provisionProjectTask:rr,createTask:Ds,showTask:js,showTaskDiff:Fs,prepareTaskLogs:Ws,streamTaskLogs:qs,runChecks:Us,commitTask:Bs,closeTask:Vs,cleanupTask:Ks,addTaskLink:Gs,listTaskLinks:Hs,sortTasksForDisplay:Ss,resolveSelectedTaskId:vs,allocateTaskId:Ps,allocateTaskIdForRepo:At,allocateProjectTaskId:Zt,createDefaultTaskPtyTabs:nr,assertTaskWorktreeExists:J,resolveTaskLogPath:Ct,buildTaskInspection:Qt,resolveArtifactPath:at,attachTask:zs,focusTask:Ys,openTask:Js,markRunnerFailed:Xs,recordStartupFailure:Qs,markTaskStarted:Zs,resolveContext:ti,prs:{refresh:dr,refreshChecks:Ls,discoverOrRefresh:Zr,discoverOrRefreshAll:$t,discoverOrRefreshMany:_s,show:si,discover:ii,link:oi,refreshAssociation:ai,unlink:li,merge:ri,getPrimaryPr:E,isPrTerminal:Ue,isMergeReady:Kr,deriveTaskStatus:ot,upsertPr:Ae,normalizePr:Ee,summarizeRequiredChecks:ys,writePrStatusArtifact:ut}};var ql={idle:0,working:1,ready:2,error:3};function De(e,t,r,n="idle"){let s=t.find(i=>i.tabId===e);return s?s.sessionState==="failed"||s.sessionState==="exited"&&s.exitCode!==0?"error":s.sessionState==="exited"?"ready":r-s.lastActivityAt<5e3?"working":"ready":n}function He(e,t,r,n){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return De(t,r,n,i)}function Nt(e,t,r){let n="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=He(e,s.id,t,r);ql[i]>ql[n]&&(n=i)}return n}function nn(e,t,r){return e.some(n=>n.ptyTabs.some(s=>s.kind==="agent"&&De(s.id,t,r)==="working"))}function Re(e,t,r){let n=e.flatMap(i=>i.ptyTabs.filter(o=>o.kind==="agent").map(o=>{let a=t.find(c=>c.tabId===o.id),l=He(i,o.id,t,r);return{taskId:i.id,tabId:o.id,title:o.title,runner:o.runner??i.runner,state:l,sessionState:a?.sessionState??null,lastActivityAt:a?.lastActivityAt??null,exitCode:a?.exitCode??null,error:a?.error??(l==="error"?i.lastFailureReason??null:null)}})),s=e.map(i=>({taskId:i.id,state:Nt(i,t,r),agentTabIds:n.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:n,tasks:s}}async function hi(e,t,r){let n=r.now??Date.now;if(r.tabId&&!e.ptyTabs.some(l=>l.kind==="agent"&&l.id===r.tabId))throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${r.tabId} does not belong to task ${e.id}.`,{details:{taskId:e.id,tabId:r.tabId}});let s=0,i=null,o=t.subscribe(()=>{s+=1,i?.()}),a=n()+r.timeoutMs;try{for(;;){let l=n(),c=Re([e],t.getSnapshots(),l),d=r.tabId?c.agents.find(h=>h.tabId===r.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(r.states.includes(d))return{kind:"waitTask",taskId:e.id,tabId:r.tabId??null,state:d,matchedStates:[...r.states],observedAt:new Date(l).toISOString()};if(r.signal?.aborted)throw Ul(e.id);let u=a-n();if(u<=0)throw Og(e.id,r.states,r.timeoutMs);let f=s;await new Promise((h,p)=>{let w=()=>{clearTimeout(O),r.signal?.removeEventListener("abort",b),h()},b=()=>{clearTimeout(O),p(Ul(e.id))},O=setTimeout(w,u);i=w,r.signal?.addEventListener("abort",b,{once:!0}),s!==f&&i()}),i=null}}finally{o()}}var Og=(e,t,r)=>new g("OPERATION_TIMEOUT",`Timed out after ${r}ms waiting for task ${e} agent state ${t.join(",")}.`,{retryable:!0,details:{taskId:e,states:t,timeoutMs:r}}),Ul=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as Ng}from"node:net";import{createHash as $g}from"node:crypto";import{tmpdir as Mg}from"node:os";import Bl from"node:path";var Lt=9;function ze(e){let t=$g("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:Bl.join(Mg(),`craig-${t}.sock`),pidPath:Bl.join(e.runtimeDir,"pty-daemon.pid")}}async function Vl(e){let t=null;try{let r=await Lg(ze(e.paths).socketPath);return t=new ki(r,e),await t.ready(),t}catch{return t?.close(),null}}var ki=class{constructor(t,r){this.socket=t;this.options=r;t.setEncoding("utf8"),t.on("data",n=>this.handleData(String(n))),t.on("error",n=>this.rejectAll(n instanceof Error?n:new Error(String(n)))),t.on("close",()=>this.handleClose())}socket;options;pending=new Map;snapshots=new Map;revisionByTabId=new Map;nextRequestId=1;revision=0;buffer="";closed=!1;async ready(){if((await this.send({type:"ping"})).protocolVersion!==Lt)throw new Error("Craig PTY daemon protocol mismatch.");await this.send({type:"setActivityEnabled",enabled:!0});let r=this.revision,n=await this.send({type:"getActivitySnapshots"});this.replaceSnapshots(n.activities??[],r)}getSnapshots(){return[...this.snapshots.values()]}close(){this.closed||(this.closed=!0,this.socket.end(),this.rejectAll(new Error("Craig PTY daemon activity connection closed.")))}async send(t){if(this.closed||this.socket.destroyed)throw new Error("Craig PTY daemon activity connection is closed.");let r=this.nextRequestId++,n=new Promise((i,o)=>{this.pending.set(r,{resolve:i,reject:o})});this.socket.write(`${JSON.stringify({...t,id:r})}
75
- `);let s=await n;if(!s.ok)throw new Error(s.error);return s}handleData(t){this.buffer+=t;let r=this.buffer.indexOf(`
76
- `);for(;r!==-1;){let n=this.buffer.slice(0,r);this.buffer=this.buffer.slice(r+1),this.handleMessage(n),r=this.buffer.indexOf(`
77
- `)}}handleMessage(t){if(t.trim().length===0)return;let r;try{r=JSON.parse(t)}catch{return}if("id"in r){let n=this.pending.get(r.id);if(!n)return;this.pending.delete(r.id),n.resolve(r);return}r.type==="activity"?(this.recordSnapshot(r.snapshot),this.options.onActivity?.(r.snapshot)):r.type==="activityRemoved"&&(this.removeSnapshot(r.tabId),this.options.onActivityRemoved?.(r.tabId))}replaceSnapshots(t,r){let n=new Map;for(let[s,i]of this.revisionByTabId)i>r&&n.set(s,this.snapshots.get(s)??null);this.snapshots.clear();for(let s of t)this.snapshots.set(s.tabId,s);for(let[s,i]of n)i?this.snapshots.set(s,i):this.snapshots.delete(s)}recordSnapshot(t){this.revision+=1,this.revisionByTabId.set(t.tabId,this.revision),this.snapshots.set(t.tabId,t)}removeSnapshot(t){this.revision+=1,this.revisionByTabId.set(t,this.revision),this.snapshots.delete(t)}handleClose(){if(this.closed)return;this.closed=!0;let t=new Error("Craig PTY daemon connection closed.");this.rejectAll(t);for(let r of this.snapshots.values()){if(r.sessionState!=="running")continue;let n={...r,sessionState:"failed",lastActivityAt:Date.now(),error:t.message};this.recordSnapshot(n),this.options.onActivity?.(n)}this.options.onDaemonClose?.()}rejectAll(t){for(let r of this.pending.values())r.reject(t);this.pending.clear()}};function Lg(e){return new Promise((t,r)=>{let n=Ng(e);n.once("connect",()=>t(n)),n.once("error",r)})}var Ti={openObserver:Gl,listTasks:e=>P.listTasks(e),getTask:(e,t)=>P.getTask(e,t),now:Date.now};async function _g(e,t,r=Ti){let n=await Kl(e,t,r),s=await r.openObserver(e);try{return{kind:"listAgents",...Re(n,s.getSnapshots(),r.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function jg(e,t,r=Ti){let n=await Kl(e,t.taskId,r),s=await r.openObserver(e);try{let i=Re(n,s.getSnapshots(),r.now()),o=t.tabId?i.agents.filter(l=>l.tabId===t.tabId):i.agents;if(t.tabId&&o.length===0)throw new g("TASK_CONTEXT_NOT_FOUND",`Agent tab ${t.tabId} was not found${t.taskId?` in task ${t.taskId}`:""}.`,{details:{taskId:t.taskId??null,tabId:t.tabId}});let a=new Set(o.map(l=>l.taskId));return{kind:"showAgentStatus",agents:o,tasks:t.tabId?i.tasks.filter(l=>a.has(l.taskId)):i.tasks,daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function Fg(e,t,r,n=Ti){let s=await n.getTask(e,t),i=await n.openObserver(e);try{return await hi(s,i,{...r,now:n.now})}finally{i.close()}}async function Kl(e,t,r){return t?[await r.getTask(e,t)]:(await r.listTasks(e)).tasks}async function Gl(e){return yi.open(e)}async function Wg(e){return Gl(e)}var yi=class e{listeners=new Set;snapshots=new Map;client=null;reconnectTimer=null;reconnectDelayMs=250;closed=!1;paths;constructor(t){this.paths=t}static async open(t){let r=new e(t);return await r.connect(),r}get daemonAvailable(){return this.client!==null}getSnapshots(){return[...this.snapshots.values()]}subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}close(){this.closed=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.client?.close(),this.client=null}async connect(){if(this.closed)return;let t=await Vl({paths:this.paths,onActivity:r=>{this.snapshots.set(r.tabId,r),this.notify()},onActivityRemoved:r=>{this.snapshots.delete(r),this.notify()},onDaemonClose:()=>{this.client=null,this.notify(),this.scheduleReconnect()}});if(this.closed){t?.close();return}if(this.client=t,t){this.reconnectDelayMs=250,this.snapshots.clear();for(let r of t.getSnapshots())this.snapshots.set(r.tabId,r);this.notify()}else this.scheduleReconnect()}scheduleReconnect(){if(this.closed||this.reconnectTimer)return;let t=this.reconnectDelayMs;this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,1e3),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},t)}notify(){for(let t of this.listeners)t()}},Oe={listAgents:_g,showAgentStatus:jg,waitForTask:Fg,openObserver:Wg};import{randomUUID as Xg}from"node:crypto";import{mkdir as Xl,open as Si,readdir as Ql,readFile as on,rm as Qg,stat as Zg}from"node:fs/promises";import vi from"node:path";import{mkdir as Hl,readFile as qg,rm as sn,stat as Ug,writeFile as Bg}from"node:fs/promises";import Ri from"node:path";var Vg=20,Kg=3e4,Gg=5e3;async function zl(e,t){let r=Ri.join(e.runtimeDir,"event-journal.lock");await Hl(e.runtimeDir,{recursive:!0});let n=Date.now();for(;;)try{await Hl(r);try{await Bg(Ri.join(r,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await sn(r,{recursive:!0,force:!0}),s}break}catch(s){if(!Yg(s))throw s;if(await Hg(r))continue;if(Date.now()-n>=Kg)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await Jg(Vg)}try{return await t()}finally{await sn(r,{recursive:!0,force:!0})}}async function Hg(e){let t=await qg(Ri.join(e,"owner.json"),"utf8").then(n=>JSON.parse(n)).catch(()=>null);if(t&&typeof t.pid=="number")return zg(t.pid)?!1:(await sn(e,{recursive:!0,force:!0}),!0);let r=await Ug(e).catch(()=>null);return!r||Date.now()-r.mtimeMs<Gg?!1:(await sn(e,{recursive:!0,force:!0}),!0)}function zg(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var Yg=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Jg=e=>new Promise(t=>setTimeout(t,e));var eh=256*1024,th=16,rh=64*1024;async function jt(e,t,r={}){let n=Pi(r.maxSegmentBytes??eh,"Event journal segment size"),s=Pi(r.maxSegments??th,"Event journal retention"),i=Pi(r.maxRecordBytes??rh,"Event record size");return zl(e,async()=>{await Xl(e.eventsDir,{recursive:!0}),await ah(e);let o=await Ii(e),a=t.id??Xg(),l=o.events.find(b=>b.id===a);if(l)return l;let c=(o.events.at(-1)?.sequence??0)+1,d={schemaVersion:1,id:a,sequence:c,workspaceId:t.workspaceId??null,taskId:t.taskId??null,agentTabId:t.agentTabId??null,commandId:t.commandId??null,swarmRunId:t.swarmRunId??null,swarmStepId:t.swarmStepId??null,type:t.type,occurredAt:t.occurredAt??new Date().toISOString(),actor:t.actor,data:dh(t.data)},u=`${JSON.stringify(d)}
78
- `;if(Buffer.byteLength(u)>i)throw new g("CLI_USAGE",`Event record exceeds the ${i}-byte limit.`,{details:{eventType:t.type,maxRecordBytes:i}});let h=(await an(e)).at(-1),p=!h||await nh(h.path,u,n);if(p&&(h={name:Jl(c),path:vi.join(e.eventsDir,Jl(c)),startSequence:c}),!h)throw new g("INTERNAL_ERROR","Failed to select an event journal segment.",{});let w=await Si(h.path,"a");try{await w.writeFile(u,"utf8"),await w.sync()}finally{await w.close()}return p&&await tc(e.eventsDir),await sh(e,s),d})}async function mr(e,t={}){let r=await Ii(e),n=lh(r.events,t.after,r.earliestSequence,r.events.at(-1)?.sequence??null),s=t.typeGlob?ch(t.typeGlob):null,i=r.events.filter(l=>l.sequence>n&&(!t.taskId||l.taskId===t.taskId)&&(!s||s.test(l.type))),o=r.events.at(-1)?.sequence??null,a=r.events.filter(l=>l.sequence>n).at(-1);return{kind:"listEvents",events:i,cursor:{after:a?.id??t.after??null,sequence:a?.sequence??n,earliestAvailableSequence:r.earliestSequence,latestSequence:o}}}async function Zl(e){return(await Ii(e)).events}async function Ii(e){await Xl(e.eventsDir,{recursive:!0});let t=await an(e),r=[],n=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await on(i.path,"utf8"),a=s===t.length-1,l=o.split(`
75
+ `)},Gk=async e=>(await L("git",["ls-files","--others","--exclude-standard"],{cwd:e})).stdout.split(`
76
+ `).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as Hk}from"node:child_process";import{access as zk}from"node:fs/promises";var oa=async(e,t)=>{let n=await M(e,t),r=Cn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await zk(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},aa=async e=>{await new Promise((t,n)=>{let r=!1,s=Hk("tail",["-n","+1","-f",e],{stdio:"inherit"}),i=()=>{r=!0,s.kill("SIGINT")};process.on("SIGINT",i),s.on("error",a=>{o(),n(a)}),s.on("exit",(a,l)=>{if(o(),r||l==="SIGINT"){t();return}if(a===0){t();return}n(new Error(`tail -n +1 -f ${e} failed with exit code ${a??"unknown"}.`))});function o(){process.off("SIGINT",i)}})};import{mkdir as Yk}from"node:fs/promises";import Jk from"node:path";var la=async(e,t)=>{let n=await M(e,t);if(await de(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 vs(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 k.load(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);await q(e,n.id,a=>({...a,status:a.status==="running"?n.status:a.status,checks:{...a.checks,status:"running",commands:[...s],results:[]}}));let i=[];for(let a of s){let l=new Date().toISOString(),c=await G("sh",["-lc",a],{cwd:n.worktreePath}),u=new Date().toISOString(),d=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:u,exitCode:d}),d!==0){let p=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,h=await q(e,n.id,f=>({...f,status:"review",checks:{...f.checks,results:i,status:"failed",lastRunAt:u},lastFailureReason:p}));return await Hu(e,h),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await q(e,n.id,a=>({...a,status:a.status==="review"||a.status==="checked"?"checked":a.status,checks:{...a.checks,results:i,status:"passed",lastRunAt:new Date().toISOString()},lastFailureReason:null}));return await Hu(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},Hu=async(e,t)=>{let n=tn(e,t.artifacts.checkSummaryPath);n&&(await Yk(Jk.dirname(n),{recursive:!0}),await U(n,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))};var ca=async(e,t)=>{let n=await M(e,t);await de(n);let r=await vs(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 yu(n.worktreePath),await wu(n.worktreePath,s);let i=await ku(n.worktreePath),o=new Date().toISOString(),a=await q(e,n.id,l=>({...l,status:l.status==="running"?n.status:l.status,lastCommit:{sha:i.sha,message:i.message,committedAt:o},lastFailureReason:null}));return{kind:"commitTask",taskId:n.id,status:a.status,commitSha:i.sha,message:i.message}};import{access as Xk}from"node:fs/promises";var da=async(e,t)=>{let n=await M(e,t),r=await Qk(n.worktreePath);return q(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},Qk=async e=>{try{return await Xk(e),!0}catch{return!1}};var ua=async(e,t,n)=>{let r=[],s=null,i=null;try{if(t.sessionId){let o=await Et(e,t.sessionId);await _u(e.repoRoot,o.sessionName),s=new Date().toISOString()}}catch(o){r.push(o instanceof Error?o.message:"Failed to close tmux session.")}if(!n.preserveWorktree)try{await bu(e.repoRoot,t.worktreePath),i=new Date().toISOString()}catch(o){r.push(o instanceof Error?o.message:"Failed to remove worktree.")}await q(e,t.id,o=>({...o,cleanup:{...o.cleanup,paneClosedAt:s??o.cleanup.paneClosedAt,worktreeRemovedAt:i??o.cleanup.worktreeRemovedAt,preservedWorktree:n.preserveWorktree,warning:r.length>0?r.join(" "):null}}))};var pa=async(e,t,n)=>{let r=await De(e,n),s=await q(e,t,i=>{if(i.repoId===r.id)throw new Error(`Repo ${r.id} is already the primary repo for task ${i.id}.`);return{...i,linkedRepoIds:i.linkedRepoIds.includes(r.id)?i.linkedRepoIds:[...i.linkedRepoIds,r.id]}});return{kind:"addTaskLink",taskId:s.id,repoId:r.id,linkedRepoIds:s.linkedRepoIds}},fa=async(e,t)=>{let n=await M(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>De(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};var ma=async(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([De(e,n.repoId),Et(e,n.sessionId)]),i=await yr.attach(e,s,r.rootPath);return{kind:"attachTask",taskId:n.id,sessionId:i.id,disposition:"attached"}};var ha=async(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 Et(e,n.sessionId).catch(s=>{throw Zk(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 Es(e.repoRoot,r.paneId,r.windowTarget,r.sessionName),{kind:"focusTask",taskId:n.id,tmuxTarget:r.paneId}},Zk=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";import{spawn as eT}from"node:child_process";var ga=async(e,t)=>{let n=await M(e,t);await de(n);let s=(await k.load(e)).open?.command??[];if(s.length===0)return{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!1,command:null};let i=[...s,n.worktreePath];return await tT(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},tT=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=eT(s,i,{cwd:t,stdio:"inherit"});o.on("error",r),o.on("exit",a=>{if(a===0){n();return}r(new Error(`${e.join(" ")} failed with exit code ${a??"unknown"}.`))})})};var ya=async(e,t,n)=>{await q(e,t,r=>({...r,status:r.status==="running"?"draft":r.status,runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n}))},wa=async(e,t,n)=>q(e,t,r=>({...r,status:"draft",runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n})),ka=async(e,t)=>q(e,t,n=>{let r=n.ptyTabs.find(s=>s.kind==="agent");if(!r)throw new Error(`Task ${t} is missing its agent PTY tab.`);return{...n,status:"running",selectedPtyTabId:r.id,runnerSession:{...n.runnerSession,startedAt:new Date().toISOString(),lastKnownState:"running"}}});import{realpath as Yu}from"node:fs/promises";import Pr from"node:path";async function ba(e,t){if(t.explicitTaskId!==void 0){let l=await zu(e,t.explicitTaskId,"explicit");return Ta(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await zu(e,t.environmentTaskId,"environment");return Ta(l,"environment",t.environmentAgentTabId)}let n=await Yu(t.cwd).catch(()=>Pr.resolve(t.cwd)),r=await fr(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await rT(l,n)})))).filter(l=>l.matches).map(l=>l.task),o=[...new Map(i.map(l=>[l.id,l])).values()];if(o.length>1)throw new y("TASK_CONTEXT_AMBIGUOUS",`Multiple Craig tasks match ${n}: ${o.map(l=>l.id).join(", ")}. Use --task <id>.`,{details:{cwd:n,taskIds:o.map(l=>l.id)}});let a=o[0];if(a)return Ta(a,"cwd",t.environmentAgentTabId);if(t.environmentAgentTabId!==void 0)throw new y("TASK_CONTEXT_CONFLICT",`CRAIG_AGENT_TAB_ID is set to ${t.environmentAgentTabId}, but no task context could be resolved.`,{details:{agentTabId:t.environmentAgentTabId}});if(t.required)throw new y("TASK_CONTEXT_NOT_FOUND",`No Craig task was found from ${n}. Use --task <id> or run the command inside a task worktree.`,{details:{cwd:n}});return null}async function zu(e,t,n){try{return await M(e,t)}catch(r){throw!(r instanceof y)||r.code!=="TASK_NOT_FOUND"?r:new y("TASK_CONTEXT_NOT_FOUND",`Craig task "${t}" from ${n==="explicit"?"--task":"CRAIG_TASK_ID"} was not found.`,{details:{taskId:t,source:n},cause:r})}}function Ta(e,t,n){let r=n??null;if(r!==null){let s=e.ptyTabs.find(i=>i.id===r);if(!s||s.kind!=="agent")throw new y("TASK_CONTEXT_CONFLICT",`Agent tab ${r} does not belong to Craig task ${e.id}.`,{details:{taskId:e.id,agentTabId:r}})}return{task:e,source:t,agentTabId:r}}function nT(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function rT(e,t){return(await Promise.all(nT(e).map(r=>Yu(r).catch(()=>Pr.resolve(r))))).some(r=>sT(r,t))}function sT(e,t){let n=Pr.relative(Pr.resolve(e),t);return n===""||!n.startsWith("..")&&!Pr.isAbsolute(n)}var Ra=async(e,t,n="merge",r)=>{let s=await M(e,t),i=r??B(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await Bu(s.worktreePath,i,n)};var Ir={readTask:M,writeTask:lt,withTaskLock:Ct,ensureGhAuthenticated:ut,fetchPrView:On,discoverPrView:Uu,getGitHubRepositoryLocator:Os,writePrStatusArtifact:an};async function Pa(e,t,n,r=Ir){let s=await r.readTask(e,t),i=await oT(s,n,r);return $t(s,i,"showTaskPr","shown",[])}async function Ia(e,t,n,r=Ir){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Oa(s,n,null,r);await xa(i,r);let o=await Ns(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return $t(s,i,"discoverTaskPr","not_found",[]);$a(o,i);let a=_s(s,i,o.number),l=await Da(e,s,i,o,r);return $t(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function va(e,t,n,r,s=Ir){let i=Ea(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Oa(o,r,i.repository,s);Xu(i.repository,a),await xa(a,s);let l=await Ns(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));aT(l,i),$a(l,a);let c=_s(o,a,l.number),u=Na(o,a),d=u&&!vn(u,{owner:a.repository.owner,repo:a.repository.name,number:l.number})&&u.status!=="closed"&&u.status!=="merged"?[`Pull request #${l.number} becomes active; #${u.number} remains in task history.`]:[],p=await Da(e,o,a,l,s);return $t(p,a,"linkTaskPr",c?"unchanged":"linked",d)})}async function iT(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw Nn(e,t);let o=e.prs.find(a=>a.number===n.number)??B(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await Ds(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw Nn(e,t);let a=Ju(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&Je({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await Ds(l,o.worktreePath,t,r),projectTarget:o}}if(!n.repository)throw new y("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for a numeric pull request selector.`,{details:{taskId:e.id,pullRequestNumber:n.number}});let s=n.repository,i=[];for(let o of e.repoTargets??[]){let a=o.pullRequest.owner&&o.pullRequest.repo&&Je({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&Je({owner:c.owner,name:c.repo},s)&&(!c.headBranch||c.headBranch===o.branch));(a||l)&&i.push({repoId:o.repoId,branch:o.branch,worktreePath:o.worktreePath,repository:s,projectTarget:o})}if(i.length!==1)throw new y("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.repository.owner}/${n.repository.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.repository.owner,repo:n.repository.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function Ca(e,t,n,r=Ir){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Oa(s,n,null,r),o=Na(s,i);if(!o?.number)return $t(s,i,"refreshTaskPr","not_found",[]);await xa(i,r);let a=await Ns(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));$a(a,i);let l=await Da(e,s,i,a,r);return $t(l,i,"refreshTaskPr","synced",[])})}async function Aa(e,t,n,r,s=Ir){let i=Ea(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await iT(o,r,i,s);if(Xu(i.repository,a),!_s(o,a,i.number))return $t(o,a,"unlinkTaskPr","unchanged",[]);let c=lT(o,a,i.number),u=await Zu(e,c,s);return $t(u,a,"unlinkTaskPr","unlinked",[])})}function Ea(e){let t=e.trim(),n=xt(t);if(n)return{number:n.number,repository:n};if(/^[1-9]\d*$/.test(t))return{number:Number(t),repository:null};throw new y("CLI_USAGE",`Invalid pull request selector "${e}". Use a GitHub pull request URL or positive number.`,{details:{selector:e}})}async function Oa(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw Nn(e,t);return Sa(e.repoId,e.branch,e.worktreePath,null,r)}let s=e.repoTargets??[];if(t){let o=s.find(a=>a.repoId===t);if(!o)throw Nn(e,t);return Sa(o.repoId,o.branch,o.worktreePath,o,r)}if(!n)throw new y("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for pull request commands.`,{details:{taskId:e.id,repoIds:s.map(o=>o.repoId)}});let i=[];for(let o of s){let a=await Sa(o.repoId,o.branch,o.worktreePath,o,r).catch(l=>{if(l instanceof y&&l.code==="EXTERNAL_DEPENDENCY_FAILED"&&l.message.includes("does not have a supported GitHub origin remote"))return null;throw l});a&&Je(a.repository,n)&&i.push(a)}if(i.length!==1)throw new y("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.owner}/${n.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.owner,repo:n.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function oT(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw Nn(e,t);let s=B(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await Ds(s,e.worktreePath,e.repoId,n),projectTarget:null}}if(!t)throw new y("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for pull request commands.`,{details:{taskId:e.id,repoIds:(e.repoTargets??[]).map(s=>s.repoId)}});let r=e.repoTargets?.find(s=>s.repoId===t);if(!r)throw Nn(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await Ds(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function Ds(e,t,n,r){let s=Ju(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function Ju(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?xt(e.url):null}async function Sa(e,t,n,r,s){let i=await s.getGitHubRepositoryLocator(n);if(!i)throw new y("EXTERNAL_DEPENDENCY_FAILED",`Repo ${e} does not have a supported GitHub origin remote.`,{details:{repoId:e,worktreePath:n}});return{repoId:e,branch:t,worktreePath:n,repository:i,projectTarget:r}}async function xa(e,t){await Ns("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function Ns(e,t){try{return await t()}catch(n){throw n instanceof y?n:new y("EXTERNAL_DEPENDENCY_FAILED",`Failed to ${e}: ${n instanceof Error?n.message:String(n)}`,{retryable:!0,cause:n})}}function Xu(e,t){if(e&&!Je(e,t.repository))throw Qu(e,t)}function aT(e,t){let n=xt(e.url);if(!n||n.number!==t.number)throw new y("TASK_CONTEXT_CONFLICT",`GitHub returned ${e.url} for pull request selector #${t.number}.`,{details:{selectorNumber:t.number,returnedUrl:e.url}});if(t.repository&&!Je(t.repository,n))throw new y("PR_REPOSITORY_MISMATCH",`GitHub returned a pull request from ${n.owner}/${n.name}, not ${t.repository.owner}/${t.repository.name}.`,{details:{selectorRepository:t.repository,returnedRepository:n}})}function $a(e,t){let n=xt(e.url);if(!n||!Je(n,t.repository))throw Qu(n,t);if(e.headRefName!==t.branch)throw new y("PR_BRANCH_MISMATCH",`Pull request #${e.number} uses head branch ${e.headRefName}, not task branch ${t.branch}.`,{details:{repoId:t.repoId,pullRequestNumber:e.number,expectedBranch:t.branch,actualBranch:e.headRefName}})}function Qu(e,t){return new y("PR_REPOSITORY_MISMATCH",`Pull request repository ${e?`${e.owner}/${e.name}`:"is invalid"} does not match task repo ${t.repository.owner}/${t.repository.name}.`,{details:{repoId:t.repoId,expectedOwner:t.repository.owner,expectedRepo:t.repository.name,actualOwner:e?.owner??null,actualRepo:e?.name??null}})}function Nn(e,t){return new y("TASK_CONTEXT_CONFLICT",`Repo ${t} is not a target of task ${e.id}.`,{details:{taskId:e.id,repoId:t}})}function Je(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function Da(e,t,n,r,s){let i=_s(t,n,r.number),o=dt(r,i,n.repository),a=ct(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:np(o)}:l)}),Zu(e,a,s)}function lT(e,t,n){let r=e.prs.filter(i=>!tp(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=ep(r.filter(o=>o.owner&&o.repo&&Je({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?np(i):dT(t.repository)}:o)}}return s}async function Zu(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?ea(t):en(t.prs),s={...t,status:r};return wr(e,s,n)}function _s(e,t,n){return _a(e,t).find(r=>tp(r,t,n))??null}function Na(e,t){if(!t.projectTarget)return B(e);let n=_a(e,t);return ep(n)}function ep(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function _a(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&Je({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?cT(r.pullRequest,t.repository):null;return s&&!n.some(i=>vn(i,s))?[...n,s]:n}function tp(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||Je({owner:e.owner,name:e.repo},t.repository)}function $t(e,t,n,r,s){let i=_a(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:Na(e,t),warnings:s}}function np(e){return{provider:"github",owner:e.owner,repo:e.repo,number:e.number,url:e.url,baseBranch:e.baseBranch,headBranch:e.headBranch,status:e.status==="draft"?"open":e.status,draft:e.draft,mergeable:e.mergeable,mergeStateStatus:e.mergeStateStatus,reviewDecision:e.reviewDecision??null,requiredChecks:e.requiredChecks,comments:e.comments??[],lastSyncedAt:e.lastSyncedAt,lastSyncedHeadSha:e.lastSyncedHeadSha}}function cT(e,t){return{provider:"github",owner:e.owner??t.owner,repo:e.repo??t.name,number:e.number,url:e.url,title:null,status:e.draft?"draft":e.status,draft:e.draft??!1,baseBranch:e.baseBranch,headBranch:e.headBranch,mergeable:e.mergeable,mergeStateStatus:e.mergeStateStatus,reviewDecision:e.reviewDecision??null,requiredChecks:e.requiredChecks,comments:e.comments??[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:e.lastSyncedAt,lastSyncedHeadSha:e.lastSyncedHeadSha}}function dT(e){return{provider:"github",owner:e.owner,repo:e.name,number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null}}var P={listTasks:fr,getTask:M,provisionTask:En,provisionProjectTask:hr,createTask:Xo,showTask:sa,showTaskDiff:ia,prepareTaskLogs:oa,streamTaskLogs:aa,runChecks:la,commitTask:ca,closeTask:da,cleanupTask:ua,addTaskLink:pa,listTaskLinks:fa,sortTasksForDisplay:Uo,resolveSelectedTaskId:Ko,allocateTaskId:Bo,allocateTaskIdForRepo:An,allocateProjectTaskId:pr,createDefaultTaskPtyTabs:gr,assertTaskWorktreeExists:de,resolveTaskLogPath:Cn,buildTaskInspection:ur,resolveArtifactPath:tn,attachTask:ma,focusTask:ha,openTask:ga,markRunnerFailed:ya,recordStartupFailure:wa,markTaskStarted:ka,resolveContext:ba,prs:{refresh:Sr,refreshChecks:na,discoverOrRefresh:$s,discoverOrRefreshAll:Dn,discoverOrRefreshMany:ra,show:Pa,discover:Ia,link:va,refreshAssociation:Ca,unlink:Aa,merge:Ra,getPrimaryPr:B,isPrTerminal:At,isMergeReady:Is,deriveTaskStatus:en,upsertPr:ct,normalizePr:dt,summarizeRequiredChecks:jo,writePrStatusArtifact:an}};var rp={idle:0,working:1,ready:2,error:3};function pt(e,t,n,r="idle"){let s=t.find(i=>i.tabId===e);return s?s.sessionState==="failed"||s.sessionState==="exited"&&s.exitCode!==0?"error":s.sessionState==="exited"?"ready":n-s.lastActivityAt<5e3?"working":"ready":r}function Dt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return pt(t,n,r,i)}function _n(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=Dt(e,s.id,t,n);rp[i]>rp[r]&&(r=i)}return r}function Ls(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&pt(s.id,t,n)==="working"))}function Xe(e,t,n){let r=e.flatMap(i=>i.ptyTabs.filter(o=>o.kind==="agent").map(o=>{let a=t.find(c=>c.tabId===o.id),l=Dt(i,o.id,t,n);return{taskId:i.id,tabId:o.id,title:o.title,runner:o.runner??i.runner,state:l,sessionState:a?.sessionState??null,lastActivityAt:a?.lastActivityAt??null,exitCode:a?.exitCode??null,error:a?.error??(l==="error"?i.lastFailureReason??null:null)}})),s=e.map(i=>({taskId:i.id,state:_n(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function La(e,t,n){let r=n.now??Date.now;if(n.tabId&&!e.ptyTabs.some(l=>l.kind==="agent"&&l.id===n.tabId))throw new y("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${e.id}.`,{details:{taskId:e.id,tabId:n.tabId}});let s=0,i=null,o=t.subscribe(()=>{s+=1,i?.()}),a=r()+n.timeoutMs;try{for(;;){let l=r(),c=Xe([e],t.getSnapshots(),l),u=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(u))return{kind:"waitTask",taskId:e.id,tabId:n.tabId??null,state:u,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw sp(e.id);let d=a-r();if(d<=0)throw uT(e.id,n.states,n.timeoutMs);let p=s;await new Promise((h,f)=>{let m=()=>{clearTimeout(T),n.signal?.removeEventListener("abort",g),h()},g=()=>{clearTimeout(T),f(sp(e.id))},T=setTimeout(m,d);i=m,n.signal?.addEventListener("abort",g,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var uT=(e,t,n)=>new y("OPERATION_TIMEOUT",`Timed out after ${n}ms waiting for task ${e} agent state ${t.join(",")}.`,{retryable:!0,details:{taskId:e,states:t,timeoutMs:n}}),sp=e=>new y("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as mT}from"node:net";import{createHash as pT}from"node:crypto";import{tmpdir as fT}from"node:os";import ip from"node:path";var ln=9;function ft(e){let t=pT("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:ip.join(fT(),`craig-${t}.sock`),pidPath:ip.join(e.runtimeDir,"pty-daemon.pid")}}async function op(e){let t=null;try{let n=await hT(ft(e.paths).socketPath);return t=new ja(n,e),await t.ready(),t}catch{return t?.close(),null}}var ja=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.handleClose())}socket;options;pending=new Map;snapshots=new Map;revisionByTabId=new Map;nextRequestId=1;revision=0;buffer="";closed=!1;async ready(){if((await this.send({type:"ping"})).protocolVersion!==ln)throw new Error("Craig PTY daemon protocol mismatch.");await this.send({type:"setActivityEnabled",enabled:!0});let n=this.revision,r=await this.send({type:"getActivitySnapshots"});this.replaceSnapshots(r.activities??[],n)}getSnapshots(){return[...this.snapshots.values()]}close(){this.closed||(this.closed=!0,this.socket.end(),this.rejectAll(new Error("Craig PTY daemon activity connection closed.")))}async send(t){if(this.closed||this.socket.destroyed)throw new Error("Craig PTY daemon activity connection is closed.");let n=this.nextRequestId++,r=new Promise((i,o)=>{this.pending.set(n,{resolve:i,reject:o})});this.socket.write(`${JSON.stringify({...t,id:n})}
77
+ `);let s=await r;if(!s.ok)throw new Error(s.error);return s}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
78
+ `);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
79
+ `)}}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==="activity"?(this.recordSnapshot(n.snapshot),this.options.onActivity?.(n.snapshot)):n.type==="activityRemoved"&&(this.removeSnapshot(n.tabId),this.options.onActivityRemoved?.(n.tabId))}replaceSnapshots(t,n){let r=new Map;for(let[s,i]of this.revisionByTabId)i>n&&r.set(s,this.snapshots.get(s)??null);this.snapshots.clear();for(let s of t)this.snapshots.set(s.tabId,s);for(let[s,i]of r)i?this.snapshots.set(s,i):this.snapshots.delete(s)}recordSnapshot(t){this.revision+=1,this.revisionByTabId.set(t.tabId,this.revision),this.snapshots.set(t.tabId,t)}removeSnapshot(t){this.revision+=1,this.revisionByTabId.set(t,this.revision),this.snapshots.delete(t)}handleClose(){if(this.closed)return;this.closed=!0;let t=new Error("Craig PTY daemon connection closed.");this.rejectAll(t);for(let n of this.snapshots.values()){if(n.sessionState!=="running")continue;let r={...n,sessionState:"failed",lastActivityAt:Date.now(),error:t.message};this.recordSnapshot(r),this.options.onActivity?.(r)}this.options.onDaemonClose?.()}rejectAll(t){for(let n of this.pending.values())n.reject(t);this.pending.clear()}};function hT(e){return new Promise((t,n)=>{let r=mT(e);r.once("connect",()=>t(r)),r.once("error",n)})}var qa={openObserver:lp,listTasks:e=>P.listTasks(e),getTask:(e,t)=>P.getTask(e,t),now:Date.now};async function gT(e,t,n=qa){let r=await ap(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...Xe(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function yT(e,t,n=qa){let r=await ap(e,t.taskId,n),s=await n.openObserver(e);try{let i=Xe(r,s.getSnapshots(),n.now()),o=t.tabId?i.agents.filter(l=>l.tabId===t.tabId):i.agents;if(t.tabId&&o.length===0)throw new y("TASK_CONTEXT_NOT_FOUND",`Agent tab ${t.tabId} was not found${t.taskId?` in task ${t.taskId}`:""}.`,{details:{taskId:t.taskId??null,tabId:t.tabId}});let a=new Set(o.map(l=>l.taskId));return{kind:"showAgentStatus",agents:o,tasks:t.tabId?i.tasks.filter(l=>a.has(l.taskId)):i.tasks,daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function wT(e,t,n,r=qa){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await La(s,i,{...n,now:r.now})}finally{i.close()}}async function ap(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function lp(e){return Fa.open(e)}async function kT(e){return lp(e)}var Fa=class e{listeners=new Set;snapshots=new Map;client=null;reconnectTimer=null;reconnectDelayMs=250;closed=!1;paths;constructor(t){this.paths=t}static async open(t){let n=new e(t);return await n.connect(),n}get daemonAvailable(){return this.client!==null}getSnapshots(){return[...this.snapshots.values()]}subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}close(){this.closed=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.client?.close(),this.client=null}async connect(){if(this.closed)return;let t=await op({paths:this.paths,onActivity:n=>{this.snapshots.set(n.tabId,n),this.notify()},onActivityRemoved:n=>{this.snapshots.delete(n),this.notify()},onDaemonClose:()=>{this.client=null,this.notify(),this.scheduleReconnect()}});if(this.closed){t?.close();return}if(this.client=t,t){this.reconnectDelayMs=250,this.snapshots.clear();for(let n of t.getSnapshots())this.snapshots.set(n.tabId,n);this.notify()}else this.scheduleReconnect()}scheduleReconnect(){if(this.closed||this.reconnectTimer)return;let t=this.reconnectDelayMs;this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,1e3),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},t)}notify(){for(let t of this.listeners)t()}},mt={listAgents:gT,showAgentStatus:yT,waitForTask:wT,openObserver:kT};import{randomUUID as OT}from"node:crypto";import{mkdir as fp,open as Ka,readdir as mp,readFile as js,rm as xT,stat as $T}from"node:fs/promises";import Va from"node:path";import{mkdir as cp,readFile as TT,rm as Ms,stat as bT,writeFile as RT}from"node:fs/promises";import Wa from"node:path";var ST=20,PT=3e4,IT=5e3;async function dp(e,t){let n=Wa.join(e.runtimeDir,"event-journal.lock");await cp(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await cp(n);try{await RT(Wa.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Ms(n,{recursive:!0,force:!0}),s}break}catch(s){if(!AT(s))throw s;if(await vT(n))continue;if(Date.now()-r>=PT)throw new y("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await ET(ST)}try{return await t()}finally{await Ms(n,{recursive:!0,force:!0})}}async function vT(e){let t=await TT(Wa.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return CT(t.pid)?!1:(await Ms(e,{recursive:!0,force:!0}),!0);let n=await bT(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<IT?!1:(await Ms(e,{recursive:!0,force:!0}),!0)}function CT(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var AT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",ET=e=>new Promise(t=>setTimeout(t,e));var DT=256*1024,NT=16,_T=64*1024;async function ht(e,t,n={}){let r=Ua(n.maxSegmentBytes??DT,"Event journal segment size"),s=Ua(n.maxSegments??NT,"Event journal retention"),i=Ua(n.maxRecordBytes??_T,"Event record size");return dp(e,async()=>{await fp(e.eventsDir,{recursive:!0}),await qT(e);let o=await Ga(e),a=t.id??OT(),l=o.events.find(g=>g.id===a);if(l)return l;let c=(o.events.at(-1)?.sequence??0)+1,u={schemaVersion:1,id:a,sequence:c,workspaceId:t.workspaceId??null,taskId:t.taskId??null,agentTabId:t.agentTabId??null,commandId:t.commandId??null,swarmRunId:t.swarmRunId??null,swarmStepId:t.swarmStepId??null,type:t.type,occurredAt:t.occurredAt??new Date().toISOString(),actor:t.actor,data:UT(t.data)},d=`${JSON.stringify(u)}
80
+ `;if(Buffer.byteLength(d)>i)throw new y("CLI_USAGE",`Event record exceeds the ${i}-byte limit.`,{details:{eventType:t.type,maxRecordBytes:i}});let h=(await Fs(e)).at(-1),f=!h||await LT(h.path,d,r);if(f&&(h={name:pp(c),path:Va.join(e.eventsDir,pp(c)),startSequence:c}),!h)throw new y("INTERNAL_ERROR","Failed to select an event journal segment.",{});let m=await Ka(h.path,"a");try{await m.writeFile(d,"utf8"),await m.sync()}finally{await m.close()}return f&&await yp(e.eventsDir),await MT(e,s),u})}async function vr(e,t={}){let n=await Ga(e),r=WT(n.events,t.after,n.earliestSequence,n.events.at(-1)?.sequence??null),s=t.typeGlob?BT(t.typeGlob):null,i=n.events.filter(l=>l.sequence>r&&(!t.taskId||l.taskId===t.taskId)&&(!s||s.test(l.type))),o=n.events.at(-1)?.sequence??null,a=n.events.filter(l=>l.sequence>r).at(-1);return{kind:"listEvents",events:i,cursor:{after:a?.id??t.after??null,sequence:a?.sequence??r,earliestAvailableSequence:n.earliestSequence,latestSequence:o}}}async function hp(e){return(await Ga(e)).events}async function Ga(e){await fp(e.eventsDir,{recursive:!0});let t=await Fs(e),n=[],r=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await js(i.path,"utf8"),a=s===t.length-1,l=o.split(`
79
81
  `);if(o.endsWith(`
80
- `))l.pop();else{if(!a)throw Ye(i.name,"segment has a truncated tail");l.pop()}for(let c=0;c<l.length;c+=1){let d=l[c];if(d.length===0)throw Ye(i.name,`empty record at line ${c+1}`);let u;try{u=JSON.parse(d)}catch{throw Ye(i.name,`invalid JSON at line ${c+1}`)}let f=uh(u,i.name,c+1);if(c===0&&f.sequence!==i.startSequence)throw Ye(i.name,`first record sequence ${f.sequence} does not match segment name`);if(n.has(f.id))throw Ye(i.name,`duplicate event id ${f.id}`);n.add(f.id);let h=r.at(-1);if(h&&f.sequence!==h.sequence+1)throw Ye(i.name,`non-monotonic sequence ${f.sequence} after ${h.sequence}`);r.push(f)}}return{events:r,earliestSequence:r[0]?.sequence??null}}async function an(e){return(await Ql(e.eventsDir).catch(r=>{if(ec(r))return[];throw r})).flatMap(r=>{let n=/^segment-(\d{16})\.jsonl$/.exec(r);return n?[{name:r,path:vi.join(e.eventsDir,r),startSequence:Number(n[1])}]:[]}).sort((r,n)=>r.startSequence-n.startSequence)}async function nh(e,t,r){let n=await Zg(e).catch(()=>null);return n!==null&&n.size>0&&n.size+Buffer.byteLength(t)>r}async function sh(e,t){let r=await an(e),n=Math.max(0,r.length-t),s=await ih(e);if(s===null)return;for(let o=0;o<n;o+=1)if(await oh(r[o].path,s)){n=o;break}let i=r.slice(0,n);for(let o of i)await Qg(o.path,{force:!0});i.length>0&&await tc(e.eventsDir)}async function ih(e){let t=await Ql(e.commandsDir).catch(n=>{if(ec(n))return[];throw n}),r=new Set;for(let n of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await on(vi.join(e.commandsDir,n),"utf8"));typeof s.id=="string"&&(s.state==="queued"||s.state==="delivering")&&r.add(s.id)}catch{return null}return r}async function oh(e,t){if(t.size===0)return!1;let r=await on(e,"utf8");for(let n of r.split(`
81
- `))if(n)try{let s=JSON.parse(n);if(typeof s.commandId=="string"&&t.has(s.commandId))return!0}catch{return!0}return!1}async function ah(e){let t=(await an(e)).at(-1);if(!t)return;let r=await on(t.path);if(r.length===0||r[r.length-1]===10)return;let n=r.lastIndexOf(10),s=await Si(t.path,"r+");try{await s.truncate(n+1),await s.sync()}finally{await s.close()}}function lh(e,t,r,n){if(t===void 0)return 0;if(/^\d+$/.test(t)){let i=Number(t);if(!Number.isSafeInteger(i)||n===null&&i!==0||n!==null&&i>n)throw bi(t);return Yl(t,i,r),i}let s=e.find(i=>i.id===t);if(!s)throw r!==null&&r>1?new g("EVENT_CURSOR_EXPIRED",`Event cursor ${t} has expired.`,{details:{cursor:t,earliestAvailableSequence:r,resumeAfter:r-1}}):bi(t);return Yl(t,s.sequence,r),s.sequence}function Yl(e,t,r){if(r!==null&&t<r-1)throw new g("EVENT_CURSOR_EXPIRED",`Event cursor ${e} has expired.`,{details:{cursor:e,earliestAvailableSequence:r,resumeAfter:r-1}})}function ch(e){if(e.length===0||e.length>256)throw new g("CLI_USAGE","Event type glob must contain between 1 and 256 characters.",{});let t=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replaceAll("*",".*");return new RegExp(`^${t}$`)}function dh(e){let t=JSON.stringify(e,(r,n)=>/prompt|token|secret|password|authorization|capability/i.test(r)?"[REDACTED]":n);return t===void 0?null:JSON.parse(t)}function uh(e,t,r){if(typeof e!="object"||e===null||Array.isArray(e))throw Ye(t,`record at line ${r} is not an object`);let n=e;if(n.schemaVersion!==1||typeof n.id!="string"||n.id.length===0||n.id.length>256||!Number.isSafeInteger(n.sequence)||(n.sequence??0)<1||typeof n.type!="string"||n.type.length===0||n.type.length>256||typeof n.occurredAt!="string"||!Number.isFinite(Date.parse(n.occurredAt))||!_t(n.workspaceId)||!_t(n.taskId)||!_t(n.agentTabId)||!_t(n.commandId)||!_t(n.swarmRunId)||!_t(n.swarmStepId)||!ph(n.actor)||!("data"in n))throw Ye(t,`record at line ${r} has an invalid schema`);return n}function ph(e){if(typeof e!="object"||e===null||Array.isArray(e)||!("type"in e))return!1;let t=e;return t.type==="human"?(t.source==="cli"||t.source==="tui")&&Number.isInteger(t.processId):t.type==="agent"?typeof t.taskId=="string"&&typeof t.agentTabId=="string"&&typeof t.capabilityId=="string":t.type==="system"&&(t.component==="orchestration-supervisor"||t.component==="heartbeat")}var _t=e=>e===null||typeof e=="string",Jl=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,Ye=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),bi=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),ec=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Pi(e,t){if(!Number.isSafeInteger(e)||e<1)throw new g("CLI_USAGE",`${t} must be a positive integer.`,{details:{value:e}});return e}async function tc(e){let t=await Si(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as sc,readdir as Ph,readFile as ic}from"node:fs/promises";import oc from"node:path";import{mkdir as rc,readFile as mh,rm as ln,stat as fh,writeFile as gh}from"node:fs/promises";import Ci from"node:path";var hh=20,wh=3e4,kh=5e3;async function Ai(e,t){let r=Ci.join(e.runtimeDir,"command-store.lock");await rc(e.runtimeDir,{recursive:!0});let n=Date.now();for(;;)try{await rc(r);try{await gh(Ci.join(r,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await ln(r,{recursive:!0,force:!0}),s}break}catch(s){if(!Rh(s))throw s;if(await yh(r))continue;if(Date.now()-n>=wh)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await bh(hh)}try{return await t()}finally{await ln(r,{recursive:!0,force:!0})}}async function yh(e){let t=await mh(Ci.join(e,"owner.json"),"utf8").then(n=>JSON.parse(n)).catch(()=>null);if(t&&typeof t.pid=="number")return Th(t.pid)?!1:(await ln(e,{recursive:!0,force:!0}),!0);let r=await fh(e).catch(()=>null);return!r||Date.now()-r.mtimeMs<kh?!1:(await ln(e,{recursive:!0,force:!0}),!0)}function Th(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var Rh=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",bh=e=>new Promise(t=>setTimeout(t,e));async function un(e,t){Ei(t);try{let r=JSON.parse(await ic(fr(e,t),"utf8"));return lc(r,fr(e,t),t)}catch(r){throw Ch(r)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):r instanceof SyntaxError?dn(t,fr(e,t),r):r}}async function $e(e){await sc(e.commandsDir,{recursive:!0});let t=await Ph(e.commandsDir),r=[];for(let n of t.filter(s=>s.endsWith(".json")).sort()){let s=oc.join(e.commandsDir,n);try{r.push(lc(JSON.parse(await ic(s,"utf8")),s,n.slice(0,-5)))}catch(i){throw i instanceof g?i:dn(n.slice(0,-5),s,i)}}return r.sort((n,s)=>n.createdAt.localeCompare(s.createdAt)||n.id.localeCompare(s.id))}async function ac(e,t){return Ei(t.id),Ai(e,async()=>{await sc(e.commandsDir,{recursive:!0});let r=await $e(e);if(t.idempotencyKey){let n=r.find(s=>s.idempotencyKey===t.idempotencyKey);if(n){if(!Sh(n,t))throw new g("COMMAND_STATE_CONFLICT",`Idempotency key "${t.idempotencyKey}" is already used by command ${n.id}.`,{details:{commandId:n.id,idempotencyKey:t.idempotencyKey}});return{command:n,created:!1}}}return await L(fr(e,t.id),t),{command:t,created:!0}})}async function gr(e,t,r){return Ei(t),Ai(e,async()=>{let n=await un(e,t),s=r(n);if(s.id!==n.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await L(fr(e,t),s),s})}function Sh(e,t){return e.taskId===t.taskId&&e.agentTabId===t.agentTabId&&e.prompt.source===t.prompt.source&&e.prompt.text===t.prompt.text&&e.delivery===t.delivery&&e.timeoutMs===t.timeoutMs}function lc(e,t,r){if(!cn(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw dn("unknown",t);let n=e.id,s=["queued","delivering","delivered","failed","cancelled"];if(n!==r||e.idempotencyKey!==null&&(typeof e.idempotencyKey!="string"||e.idempotencyKey.length>256)||typeof e.taskId!="string"||e.taskId.length===0||typeof e.agentTabId!="string"||e.agentTabId.length===0||!cn(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!Ih(e.prompt.text)||!["when-ready","immediate"].includes(String(e.delivery))||!s.includes(e.state)||!Number.isInteger(e.attempts)||Number(e.attempts)<0||!Number.isInteger(e.timeoutMs)||Number(e.timeoutMs)<=0||Number(e.timeoutMs)>864e5||!Ft(e.expiresAt)||!Ft(e.createdAt)||!Ft(e.updatedAt)||e.deliveryStartedAt!==null&&!Ft(e.deliveryStartedAt)||e.deliveredAt!==null&&!Ft(e.deliveredAt)||e.cancelledAt!==null&&!Ft(e.cancelledAt)||e.cancelledBy!==null&&!nc(e.cancelledBy)||!nc(e.actor)||!vh(e.lastError)||e.state==="delivered"!=(e.deliveredAt!==null)||e.state==="failed"!=(e.lastError!==null)||Number(e.attempts)>0!=(e.deliveryStartedAt!==null)||e.state==="cancelled"!=(e.cancelledAt!==null&&e.cancelledBy!==null))throw dn(n,t);return e}function nc(e){return!cn(e)||typeof e.type!="string"?!1:e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component))}function vh(e){return e===null||cn(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var fr=(e,t)=>oc.join(e.commandsDir,`${t}.json`),Ei=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},Ft=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),Ih=e=>e.trim().length>0&&Buffer.byteLength(e)<=32*1024&&![...e].some(t=>{let r=t.charCodeAt(0);return r<=8||r>=11&&r<=31||r>=127&&r<=159}),cn=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ch=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",dn=(e,t,r)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...r?{cause:r}:{}});function cc(e,t=new Date){return pn(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function dc(e,t=new Date){return e.state==="delivered"?e:(pn(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function uc(e,t,r=new Date){return e.state==="failed"?e:(pn(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:r.toISOString()})}function pc(e,t,r=new Date){return e.state==="cancelled"?e:(pn(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:r.toISOString(),cancelledBy:t,updatedAt:r.toISOString()})}function pn(e,t,r){if(!t.includes(e.state))throw new g("COMMAND_STATE_CONFLICT",`Cannot ${r} command ${e.id} while it is ${e.state}.`,{details:{commandId:e.id,state:e.state,allowedStates:t}})}import{randomUUID as Ah}from"node:crypto";var xi=32*1024,mc=1440*60*1e3,Di=256,Eh=["delivered","failed","cancelled"],Oi={type:"system",component:"orchestration-supervisor"};async function xh(e,t){if(jh(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>mc)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:mc}});if(t.idempotencyKey!==void 0&&t.idempotencyKey!==null&&t.idempotencyKey.trim().length===0)throw new g("CLI_USAGE","Idempotency key cannot be empty.",{});if((t.idempotencyKey?.length??0)>Di)throw new g("CLI_USAGE",`Idempotency key exceeds ${Di} characters.`,{details:{maxIdempotencyKeyLength:Di}});let r=t.now??new Date,n={schemaVersion:1,id:t.id??`command_${Ah()}`,idempotencyKey:t.idempotencyKey?.trim()||null,taskId:t.taskId,agentTabId:t.agentTabId,prompt:t.prompt,delivery:t.delivery,state:"queued",attempts:0,timeoutMs:t.timeoutMs,expiresAt:new Date(r.getTime()+t.timeoutMs).toISOString(),lastError:null,actor:t.actor,createdAt:r.toISOString(),updatedAt:r.toISOString(),deliveryStartedAt:null,deliveredAt:null,cancelledAt:null,cancelledBy:null},s=await ac(e,n);if(s.created)try{await pt(e,s.command,"command.queued")}catch(i){throw fc(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function Dh(e,t){return{kind:"showPromptCommand",command:await un(e,t)}}async function Oh(e,t){let r=await $e(e);return{kind:"listPromptCommands",commands:t?r.filter(n=>n.taskId===t):r}}async function $h(e,t,r){let n=!1,s=await gr(e,t,i=>{if(i.state==="cancelled")return i;let o=pc(i,r??i.actor);return n=!0,o});if(n)try{await pt(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw fc(s,i)}return{kind:"cancelPromptCommand",command:s,changed:n}}async function Mh(e,t){let r=await gr(e,t,n=>cc(n));return await pt(e,r,"command.delivering",Oi),r}async function Nh(e,t){let r=await gr(e,t,n=>dc(n));return await pt(e,r,"command.delivered",Oi),r}async function Lh(e,t,r){let n=await gr(e,t,s=>uc(s,r));return await pt(e,n,"command.failed",Oi),n}async function _h(e,t,r){let n=[...r.states??Eh],s=Date.now()+r.timeoutMs;for(;;){let i=await un(e,t);if(n.includes(i.state))return{kind:"waitPromptCommand",command:i,matchedStates:n};if(r.signal?.aborted)throw new g("OPERATION_CANCELLED",`Cancelled while waiting for command ${t}.`,{retryable:!0,details:{commandId:t,cancelled:!0}});let o=s-Date.now();if(o<=0)throw new g("OPERATION_TIMEOUT",`Timed out after ${r.timeoutMs}ms waiting for command ${t}.`,{retryable:!0,details:{commandId:t,states:n,timeoutMs:r.timeoutMs}});await Fh(Math.min(r.pollIntervalMs??100,o),r.signal)}}function jh(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>xi)throw new g("CLI_USAGE",`Prompt exceeds the ${xi}-byte limit.`,{details:{maxPromptBytes:xi,promptBytes:t}});if([...e].some(r=>{let n=r.charCodeAt(0);return n<=8||n>=11&&n<=31||n>=127&&n<=159}))throw new g("CLI_USAGE","Prompt contains unsupported control characters.",{})}async function pt(e,t,r,n=t.actor){await jt(e,{id:`${t.id}:${r}`,taskId:t.taskId,agentTabId:t.agentTabId,commandId:t.id,type:r,occurredAt:r==="command.queued"?t.createdAt:r==="command.delivering"?t.deliveryStartedAt??t.updatedAt:r==="command.delivered"?t.deliveredAt??t.updatedAt:r==="command.cancelled"?t.cancelledAt??t.updatedAt:t.updatedAt,actor:n,data:{state:t.state,delivery:t.delivery,attempts:t.attempts,errorCode:t.lastError?.code??null,deliveryUncertain:t.lastError?.deliveryUncertain??!1}})}function Fh(e,t){return t?.aborted?Promise.resolve():new Promise(r=>{let n=()=>{clearTimeout(s),t?.removeEventListener("abort",n),r()},s=setTimeout(n,e);t?.addEventListener("abort",n,{once:!0})})}var fc=(e,t)=>new g("PARTIAL_RESULT",`Command ${e.id} was persisted as ${e.state}, but its event could not be appended.`,{retryable:!0,details:{commandId:e.id,durableState:e.state},cause:t}),ie={create:xh,show:Dh,list:Oh,cancel:$h,wait:_h,beginDelivery:Mh,completeDelivery:Nh,fail:Lh};import{createHash as gc}from"node:crypto";import Wh from"node:path";import{mkdir as qh}from"node:fs/promises";var $i={type:"system",component:"heartbeat"};async function Je(e,t={}){await qh(e.orchestrationDir,{recursive:!0});let[r,n,s,i]=await Promise.all([P.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):Oe.listAgents(e),Zl(e),zh(e)]),o=n??Re(r.tasks.filter(p=>p.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=Hh(i),l=a!==i,c=[],d=Mi(s.filter(Gh),p=>p.taskId),u=Mi(s.filter(p=>p.type.startsWith("task.pr.")),p=>p.taskId),f=Mi(s.filter(p=>p.type==="agent.state.changed"),p=>p.agentTabId);for(let p of r.tasks){let w=Uh(p),b=d.get(p.id),O=Li(b?.data)??a.tasks[p.id]??null,q=b?.id??a.tasks[p.id]?.eventId??null;if(O?.signature!==w.signature){let de=O?p.status==="closed"&&O?.status!=="closed"?"task.closed":"task.updated":"task.created",ye=await jt(e,{id:Ni(de,p.id,w.signature),type:de,taskId:p.id,workspaceId:p.workspaceId||null,occurredAt:p.updatedAt,actor:$i,data:{...w,changedFields:O?Vh(O,w):[]}});c.push(ye),q=ye.id}a.tasks[p.id]={...w,eventId:q};let U=Kh(p.prs),I=u.get(p.id),re=Li(I?.data)??a.pullRequests[p.id]??null,je=I?.id??a.pullRequests[p.id]?.eventId??null;if((re||U.associations.length>0)&&re?.signature!==U.signature){let de=Array.isArray(re?.associations)?re.associations.length:0,ye=U.associations.length>de?"task.pr.linked":U.associations.length<de?"task.pr.unlinked":"task.pr.refreshed",m=await jt(e,{id:Ni(ye,p.id,U.signature),type:ye,taskId:p.id,workspaceId:p.workspaceId||null,occurredAt:p.updatedAt,actor:$i,data:U});c.push(m),je=m.id}a.pullRequests[p.id]={...U,eventId:je}}let h=new Map(o.tasks.map(p=>[p.taskId,p.state]));for(let p of o.agents){let w=f.get(p.tabId),b=Li(w?.data)??a.agents[p.tabId]??null;if(b?.state===p.state){a.agents[p.tabId]={state:p.state,eventId:w?.id??a.agents[p.tabId]?.eventId??null};continue}let O=[w?.id??a.agents[p.tabId]?.eventId??"initial",p.state,p.sessionState??"none",p.lastActivityAt??"none",p.exitCode??"none",p.error??"none"].join(":"),q=await jt(e,{id:Ni("agent.state.changed",p.tabId,O),type:"agent.state.changed",taskId:p.taskId,agentTabId:p.tabId,actor:$i,data:{previousState:typeof b?.state=="string"?b.state:null,state:p.state,taskState:h.get(p.taskId)??"idle",sessionState:p.sessionState,lastActivityAt:p.lastActivityAt,exitCode:p.exitCode,error:p.error}});c.push(q),a.agents[p.tabId]={state:p.state,eventId:q.id}}return(c.length>0||l)&&await L(wc(e),a),c}function Uh(e){let t={status:e.status,title:e.title,runner:e.runner,branch:e.branch,lastCommitSha:e.lastCommit?.sha??null,checksStatus:e.checks.status,checksLastRunAt:e.checks.lastRunAt,sourceUpdatedAt:e.updatedAt,agentTabIds:e.ptyTabs.filter(r=>r.kind==="agent").map(r=>r.id)};return{...t,signature:hc(t)}}var Bh=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function Vh(e,t){return Bh.filter(r=>JSON.stringify(e[r])!==JSON.stringify(t[r]))}function Kh(e){let t=e.map(r=>({provider:r.provider,owner:r.owner,repo:r.repo,number:r.number,url:r.url,status:r.status,draft:r.draft,headBranch:r.headBranch,lastSyncedAt:r.lastSyncedAt,lastSyncedHeadSha:r.lastSyncedHeadSha}));return{associations:t,signature:hc(t)}}function Mi(e,t){let r=new Map;for(let n of e){let s=t(n);s&&r.set(s,n)}return r}var Gh=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",hc=e=>gc("sha256").update(JSON.stringify(e)).digest("hex"),Ni=(...e)=>gc("sha256").update(e.join("\0")).digest("hex"),Li=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,wc=e=>Wh.join(e.orchestrationDir,"event-reconciliation.json");function Hh(e){return e?.schemaVersion===1&&typeof e.tasks=="object"&&e.tasks!==null&&typeof e.pullRequests=="object"&&e.pullRequests!==null&&typeof e.agents=="object"&&e.agents!==null?e:{schemaVersion:1,tasks:{},pullRequests:{},agents:{}}}async function zh(e){try{return await Dr(wc(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function Yh(e,t){return await _i(e),await Je(e),mr(e,t)}async function Jh(e,t,r){await _i(e);let n=await Oe.openObserver(e);try{let s=t.after,i=0,o=0;for(;!r.signal?.aborted;){await Je(e,{agentObserver:n});let a=await mr(e,{...t,...s?{after:s}:{}});for(let l of a.events)r.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,r.signal?.aborted)break;await kc(r.pollIntervalMs??250,r.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:r.signal?.aborted??!1}}finally{n.close()}}async function Xh(e,t,r){await _i(e);let n=await P.getTask(e,t);if(r.tabId&&!n.ptyTabs.some(i=>i.kind==="agent"&&i.id===r.tabId))throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${r.tabId} does not belong to task ${t}.`,{details:{taskId:t,tabId:r.tabId}});let s=await Oe.openObserver(e);try{await Je(e,{agentObserver:s});let o=(await mr(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+r.timeoutMs;for(;;){let l=Date.now(),c=Re([n],s.getSnapshots(),l),d=r.tabId?c.agents.find(h=>h.tabId===r.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(r.states.includes(d))return{kind:"waitTask",taskId:t,tabId:r.tabId??null,state:d,matchedStates:[...r.states],observedAt:new Date(l).toISOString()};if(r.signal?.aborted)throw Zh(t);let u=a-Date.now();if(u<=0)throw Qh(t,r.states,r.timeoutMs);await Je(e,{agentObserver:s}),o=(await mr(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await kc(Math.min(250,u),r.signal)}}finally{s.close()}}async function _i(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Event orchestration is a feature preview. Enable agentOrchestration before using events commands.",{details:{preview:"agentOrchestration"}})}function kc(e,t){return t?.aborted?Promise.resolve():new Promise(r=>{let n=()=>{clearTimeout(s),t?.removeEventListener("abort",n),r()},s=setTimeout(n,e);t?.addEventListener("abort",n,{once:!0})})}var Qh=(e,t,r)=>new g("OPERATION_TIMEOUT",`Timed out after ${r}ms waiting for task ${e} agent state ${t.join(",")}.`,{retryable:!0,details:{taskId:e,states:t,timeoutMs:r}}),Zh=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),mn={list:Yh,watch:Jh,waitForTaskState:Xh,reconcile:Je};import{readFile as nw}from"node:fs/promises";import{createConnection as ew}from"node:net";async function hr(e){let t=await rw(ze(e).socketPath).catch(()=>null);if(!t)return!1;try{return(await yc(t,{type:"ping"})).protocolVersion!==Lt?!1:(await yc(t,{type:"wakeOrchestration"}),!0)}catch{return!1}finally{t.end()}}var tw=1;function yc(e,t){let r=tw++;return new Promise((n,s)=>{let i="",o=setTimeout(()=>s(new Error("Craig PTY daemon request timed out.")),1e3),a=c=>{i+=String(c);let d=i.indexOf(`
82
- `);if(d===-1)return;l();let u=JSON.parse(i.slice(0,d));u.ok?n(u):s(new Error(u.error??"Craig PTY daemon request failed."))},l=()=>{clearTimeout(o),e.off("data",a)};e.on("data",a),e.write(`${JSON.stringify({...t,id:r})}
83
- `)})}function rw(e){return new Promise((t,r)=>{let n=ew(e);n.once("connect",()=>t(n)),n.once("error",r)})}async function sw(e,t){await dw(e);let r=await P.getTask(e,t.taskId);if(r.status==="closed")throw new g("COMMAND_STATE_CONFLICT",`Task ${r.id} is ${r.status} and cannot receive prompts.`,{details:{taskId:r.id,taskStatus:r.status}});let n=r.ptyTabs.filter(a=>a.kind==="agent"),s=t.tabId?n.find(a=>a.id===t.tabId):n[0];if(!s)throw new g("TASK_CONTEXT_CONFLICT",t.tabId?`Agent tab ${t.tabId} does not belong to task ${r.id}.`:`Task ${r.id} has no agent tab.`,{details:{taskId:r.id,tabId:t.tabId??null}});let i=await cw(t.prompt,t.readStdin),o;try{o=await ie.create(e,{taskId:r.id,agentTabId:s.id,prompt:i,delivery:t.delivery,timeoutMs:t.timeoutMs,idempotencyKey:t.idempotencyKey??null,actor:{type:"human",source:"cli",processId:process.pid}})}catch(a){throw await hr(e),a}return await hr(e),o}async function iw(e,t){return ie.show(e,t)}async function ow(e,t){return ie.list(e,t)}async function aw(e,t){let r;try{r=await ie.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(n){throw await hr(e),n}return await hr(e),r}async function lw(e,t,r){return ie.wait(e,t,r)}async function cw(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await nw(e.path,"utf8")}}catch(r){throw new g("CLI_USAGE",`Unable to read prompt file ${e.path}.`,{details:{promptFile:e.path},cause:r})}if(!t)throw new g("INPUT_REQUIRED","Prompt input from stdin is unavailable.",{});return{source:"stdin",text:await t()}}async function dw(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Prompt dispatch is a feature preview. Enable agentOrchestration before sending prompts.",{details:{preview:"agentOrchestration"}})}var Wt={send:sw,show:iw,list:ow,cancel:aw,wait:lw};async function Tc(e,t){switch(e.kind){case"addWorkspace":{let r=await X.addWorkspace(t.paths,e.path),n=r.workspace.kind==="project"?r.workspace.discoveredRepoIds?.[0]??null:r.repos[0]?.id??null;return await ji(t.paths,r.workspace.id,n),r}case"addRepo":{let r=await X.repos.addRepo(t.paths,e.path);return await ji(t.paths,r.workspaceId,r.repo.id),r}case"listRepos":return X.repos.listRegisteredRepos(t.paths);case"removeRepo":{let r=await Rt({uiStateFile:t.paths.uiStateFile}),n=r?.selectedWorkspaceId?(await ae(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await X.repos.removeRepo(t.paths,e.repoId,{listTasks:P.listTasks});if(r){let i=n.includes(r.selectedWorkspaceId??""),o=r.selectedRepoId===e.repoId;i?await We({uiStateFile:t.paths.uiStateFile},{...r,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await We({uiStateFile:t.paths.uiStateFile},{...r,selectedRepoId:null})}return s}case"listWorkspaces":return X.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let r=await X.archiveWorkspace(t.paths,e.workspaceId);return await uw(t.paths,e.workspaceId),r}case"restoreWorkspace":{let r=await X.restoreWorkspace(t.paths,e.workspaceId);return await ji(t.paths,e.workspaceId,r.primaryRepoId),r}case"removeWorkspace":return X.removeWorkspace(t.paths,e.workspaceId,{listTasks:P.listTasks});case"createTask":return P.createTask(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?P.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):P.listTasks(t.paths);case"currentTask":{let r=Fi(t);return{kind:"currentTask",task:r.task,context:{source:r.source,agentTabId:r.agentTabId}}}case"attachTask":return P.attachTask(t.paths,e.taskId);case"addTaskLink":return P.addTaskLink(t.paths,e.taskId,e.repoId);case"listTaskLinks":return P.listTaskLinks(t.paths,e.taskId);case"refreshInteractiveState":throw new Error("Interactive refresh should be handled by the interactive app.");case"showTask":return P.showTask(t.paths,e.taskId);case"showCurrentTask":return P.showTask(t.paths,Fi(t).task.id);case"showTaskPr":return P.prs.show(t.paths,ft(e.taskId,t),e.repoId);case"discoverTaskPr":return P.prs.discover(t.paths,ft(e.taskId,t),e.repoId);case"linkTaskPr":return P.prs.link(t.paths,ft(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return P.prs.refreshAssociation(t.paths,ft(e.taskId,t),e.repoId);case"unlinkTaskPr":return P.prs.unlink(t.paths,ft(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return Oe.listAgents(t.paths,e.taskId);case"showAgentStatus":return Oe.showAgentStatus(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.tabId?{tabId:e.tabId}:{}});case"waitTask":{let r={states:e.states,timeoutMs:e.timeoutMs,...e.tabId?{tabId:e.tabId}:{},...t.signal?{signal:t.signal}:{}},n=ft(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?mn.waitForTaskState(t.paths,n,r):Oe.waitForTask(t.paths,n,r)}case"listEvents":return mn.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return mn.watch(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}},{onEvent:t.emitEvent??(()=>{}),...t.signal?{signal:t.signal}:{}});case"sendAgentPrompt":return Wt.send(t.paths,{taskId:ft(e.taskId,t),...e.tabId?{tabId:e.tabId}:t.taskContext?.agentTabId?{tabId:t.taskContext.agentTabId}:{},prompt:e.prompt,delivery:e.delivery,timeoutMs:e.timeoutMs,...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.readStdin?{readStdin:t.readStdin}:{}});case"showPromptCommand":return Wt.show(t.paths,e.commandId);case"listPromptCommands":return Wt.list(t.paths,e.taskId);case"cancelPromptCommand":return Wt.cancel(t.paths,e.commandId);case"waitPromptCommand":return Wt.wait(t.paths,e.commandId,{...e.states?{states:e.states}:{},timeoutMs:e.timeoutMs,...t.signal?{signal:t.signal}:{}});case"showSelectedTask":return P.showTask(t.paths,mt(t,"show"));case"streamTaskLogs":return P.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return P.prepareTaskLogs(t.paths,mt(t,"logs"));case"showTaskDiff":return P.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return P.showTaskDiff(t.paths,mt(t,"diff"));case"focusTask":return P.focusTask(t.paths,e.taskId);case"focusSelectedTask":return P.focusTask(t.paths,mt(t,"focus"));case"openTask":return P.openTask(t.paths,e.taskId);case"openSelectedTask":return P.openTask(t.paths,mt(t,"open"));case"runChecks":return P.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return P.runChecks(t.paths,mt(t,"check"));case"commitTask":return P.commitTask(t.paths,e.taskId);case"commitSelectedTask":return P.commitTask(t.paths,mt(t,"commit"));case"showContext":{let r=mw(t);return{kind:"showContext",workspace:{root:r.workspaceRoot,source:r.source,initialized:r.initialized},task:t.taskContext?{id:t.taskContext.task.id,source:t.taskContext.source,agentTabId:t.taskContext.agentTabId}:null}}case"help":return{kind:"help",text:rs()};case"exit":return{kind:"exit"};default:return pw(e)}}async function ji(e,t,r){let n=await Rt({uiStateFile:e.uiStateFile})??$r();await We({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:t,selectedRepoId:r,selectedTaskId:null})}async function uw(e,t){let r=await Rt({uiStateFile:e.uiStateFile});r?.selectedWorkspaceId===t&&await We({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function pw(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function mt(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>'.`)}function Fi(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function ft(e,t){return e??Fi(t).task.id}function mw(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Rc(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(`
82
+ `))l.pop();else{if(!a)throw Nt(i.name,"segment has a truncated tail");l.pop()}for(let c=0;c<l.length;c+=1){let u=l[c];if(u.length===0)throw Nt(i.name,`empty record at line ${c+1}`);let d;try{d=JSON.parse(u)}catch{throw Nt(i.name,`invalid JSON at line ${c+1}`)}let p=KT(d,i.name,c+1);if(c===0&&p.sequence!==i.startSequence)throw Nt(i.name,`first record sequence ${p.sequence} does not match segment name`);if(r.has(p.id))throw Nt(i.name,`duplicate event id ${p.id}`);r.add(p.id);let h=n.at(-1);if(h&&p.sequence!==h.sequence+1)throw Nt(i.name,`non-monotonic sequence ${p.sequence} after ${h.sequence}`);n.push(p)}}return{events:n,earliestSequence:n[0]?.sequence??null}}async function Fs(e){return(await mp(e.eventsDir).catch(n=>{if(gp(n))return[];throw n})).flatMap(n=>{let r=/^segment-(\d{16})\.jsonl$/.exec(n);return r?[{name:n,path:Va.join(e.eventsDir,n),startSequence:Number(r[1])}]:[]}).sort((n,r)=>n.startSequence-r.startSequence)}async function LT(e,t,n){let r=await $T(e).catch(()=>null);return r!==null&&r.size>0&&r.size+Buffer.byteLength(t)>n}async function MT(e,t){let n=await Fs(e),r=Math.max(0,n.length-t),s=await jT(e);if(s===null)return;for(let o=0;o<r;o+=1)if(await FT(n[o].path,s)){r=o;break}let i=n.slice(0,r);for(let o of i)await xT(o.path,{force:!0});i.length>0&&await yp(e.eventsDir)}async function jT(e){let t=await mp(e.commandsDir).catch(r=>{if(gp(r))return[];throw r}),n=new Set;for(let r of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await js(Va.join(e.commandsDir,r),"utf8"));typeof s.id=="string"&&(s.state==="queued"||s.state==="delivering")&&n.add(s.id)}catch{return null}return n}async function FT(e,t){if(t.size===0)return!1;let n=await js(e,"utf8");for(let r of n.split(`
83
+ `))if(r)try{let s=JSON.parse(r);if(typeof s.commandId=="string"&&t.has(s.commandId))return!0}catch{return!0}return!1}async function qT(e){let t=(await Fs(e)).at(-1);if(!t)return;let n=await js(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await Ka(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function WT(e,t,n,r){if(t===void 0)return 0;if(/^\d+$/.test(t)){let i=Number(t);if(!Number.isSafeInteger(i)||r===null&&i!==0||r!==null&&i>r)throw Ba(t);return up(t,i,n),i}let s=e.find(i=>i.id===t);if(!s)throw n!==null&&n>1?new y("EVENT_CURSOR_EXPIRED",`Event cursor ${t} has expired.`,{details:{cursor:t,earliestAvailableSequence:n,resumeAfter:n-1}}):Ba(t);return up(t,s.sequence,n),s.sequence}function up(e,t,n){if(n!==null&&t<n-1)throw new y("EVENT_CURSOR_EXPIRED",`Event cursor ${e} has expired.`,{details:{cursor:e,earliestAvailableSequence:n,resumeAfter:n-1}})}function BT(e){if(e.length===0||e.length>256)throw new y("CLI_USAGE","Event type glob must contain between 1 and 256 characters.",{});let t=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replaceAll("*",".*");return new RegExp(`^${t}$`)}function UT(e){let t=JSON.stringify(e,(n,r)=>/prompt|token|secret|password|authorization|capability/i.test(n)?"[REDACTED]":r);return t===void 0?null:JSON.parse(t)}function KT(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw Nt(t,`record at line ${n} is not an object`);let r=e;if(r.schemaVersion!==1||typeof r.id!="string"||r.id.length===0||r.id.length>256||!Number.isSafeInteger(r.sequence)||(r.sequence??0)<1||typeof r.type!="string"||r.type.length===0||r.type.length>256||typeof r.occurredAt!="string"||!Number.isFinite(Date.parse(r.occurredAt))||!Ln(r.workspaceId)||!Ln(r.taskId)||!Ln(r.agentTabId)||!Ln(r.commandId)||!Ln(r.swarmRunId)||!Ln(r.swarmStepId)||!VT(r.actor)||!("data"in r))throw Nt(t,`record at line ${n} has an invalid schema`);return r}function VT(e){if(typeof e!="object"||e===null||Array.isArray(e)||!("type"in e))return!1;let t=e;return t.type==="human"?(t.source==="cli"||t.source==="tui")&&Number.isInteger(t.processId):t.type==="agent"?typeof t.taskId=="string"&&typeof t.agentTabId=="string"&&typeof t.capabilityId=="string":t.type==="system"&&(t.component==="orchestration-supervisor"||t.component==="heartbeat")}var Ln=e=>e===null||typeof e=="string",pp=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,Nt=(e,t)=>new y("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),Ba=e=>new y("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),gp=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Ua(e,t){if(!Number.isSafeInteger(e)||e<1)throw new y("CLI_USAGE",`${t} must be a positive integer.`,{details:{value:e}});return e}async function yp(e){let t=await Ka(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as Tp,readdir as nb,readFile as bp}from"node:fs/promises";import Rp from"node:path";import{mkdir as wp,readFile as GT,rm as qs,stat as HT,writeFile as zT}from"node:fs/promises";import Ha from"node:path";var YT=20,JT=3e4,XT=5e3;async function za(e,t){let n=Ha.join(e.runtimeDir,"command-store.lock");await wp(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await wp(n);try{await zT(Ha.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await qs(n,{recursive:!0,force:!0}),s}break}catch(s){if(!eb(s))throw s;if(await QT(n))continue;if(Date.now()-r>=JT)throw new y("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await tb(YT)}try{return await t()}finally{await qs(n,{recursive:!0,force:!0})}}async function QT(e){let t=await GT(Ha.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return ZT(t.pid)?!1:(await qs(e,{recursive:!0,force:!0}),!0);let n=await HT(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<XT?!1:(await qs(e,{recursive:!0,force:!0}),!0)}function ZT(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var eb=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",tb=e=>new Promise(t=>setTimeout(t,e));async function Us(e,t){Ya(t);try{let n=JSON.parse(await bp(Cr(e,t),"utf8"));return Pp(n,Cr(e,t),t)}catch(n){throw ob(n)?new y("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?Bs(t,Cr(e,t),n):n}}async function gt(e){await Tp(e.commandsDir,{recursive:!0});let t=await nb(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=Rp.join(e.commandsDir,r);try{n.push(Pp(JSON.parse(await bp(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof y?i:Bs(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function Sp(e,t){return Ya(t.id),za(e,async()=>{await Tp(e.commandsDir,{recursive:!0});let n=await gt(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!rb(r,t))throw new y("COMMAND_STATE_CONFLICT",`Idempotency key "${t.idempotencyKey}" is already used by command ${r.id}.`,{details:{commandId:r.id,idempotencyKey:t.idempotencyKey}});return{command:r,created:!1}}}return await U(Cr(e,t.id),t),{command:t,created:!0}})}async function Ar(e,t,n){return Ya(t),za(e,async()=>{let r=await Us(e,t),s=n(r);if(s.id!==r.id)throw new y("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await U(Cr(e,t),s),s})}function rb(e,t){return e.taskId===t.taskId&&e.agentTabId===t.agentTabId&&e.prompt.source===t.prompt.source&&e.prompt.text===t.prompt.text&&e.delivery===t.delivery&&e.timeoutMs===t.timeoutMs}function Pp(e,t,n){if(!Ws(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw Bs("unknown",t);let r=e.id,s=["queued","delivering","delivered","failed","cancelled"];if(r!==n||e.idempotencyKey!==null&&(typeof e.idempotencyKey!="string"||e.idempotencyKey.length>256)||typeof e.taskId!="string"||e.taskId.length===0||typeof e.agentTabId!="string"||e.agentTabId.length===0||!Ws(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!ib(e.prompt.text)||!["when-ready","immediate"].includes(String(e.delivery))||!s.includes(e.state)||!Number.isInteger(e.attempts)||Number(e.attempts)<0||!Number.isInteger(e.timeoutMs)||Number(e.timeoutMs)<=0||Number(e.timeoutMs)>864e5||!Mn(e.expiresAt)||!Mn(e.createdAt)||!Mn(e.updatedAt)||e.deliveryStartedAt!==null&&!Mn(e.deliveryStartedAt)||e.deliveredAt!==null&&!Mn(e.deliveredAt)||e.cancelledAt!==null&&!Mn(e.cancelledAt)||e.cancelledBy!==null&&!kp(e.cancelledBy)||!kp(e.actor)||!sb(e.lastError)||e.state==="delivered"!=(e.deliveredAt!==null)||e.state==="failed"!=(e.lastError!==null)||Number(e.attempts)>0!=(e.deliveryStartedAt!==null)||e.state==="cancelled"!=(e.cancelledAt!==null&&e.cancelledBy!==null))throw Bs(r,t);return e}function kp(e){return!Ws(e)||typeof e.type!="string"?!1:e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component))}function sb(e){return e===null||Ws(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var Cr=(e,t)=>Rp.join(e.commandsDir,`${t}.json`),Ya=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new y("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},Mn=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),ib=e=>e.trim().length>0&&Buffer.byteLength(e)<=32*1024&&![...e].some(t=>{let n=t.charCodeAt(0);return n<=8||n>=11&&n<=31||n>=127&&n<=159}),Ws=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),ob=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",Bs=(e,t,n)=>new y("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function Ip(e,t=new Date){return Ks(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function vp(e,t=new Date){return e.state==="delivered"?e:(Ks(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function Cp(e,t,n=new Date){return e.state==="failed"?e:(Ks(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function Ap(e,t,n=new Date){return e.state==="cancelled"?e:(Ks(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function Ks(e,t,n){if(!t.includes(e.state))throw new y("COMMAND_STATE_CONFLICT",`Cannot ${n} command ${e.id} while it is ${e.state}.`,{details:{commandId:e.id,state:e.state,allowedStates:t}})}import{randomUUID as ab}from"node:crypto";var Ja=32*1024,Ep=1440*60*1e3,Xa=256,lb=["delivered","failed","cancelled"],Qa={type:"system",component:"orchestration-supervisor"};async function cb(e,t){if(yb(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>Ep)throw new y("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:Ep}});if(t.idempotencyKey!==void 0&&t.idempotencyKey!==null&&t.idempotencyKey.trim().length===0)throw new y("CLI_USAGE","Idempotency key cannot be empty.",{});if((t.idempotencyKey?.length??0)>Xa)throw new y("CLI_USAGE",`Idempotency key exceeds ${Xa} characters.`,{details:{maxIdempotencyKeyLength:Xa}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${ab()}`,idempotencyKey:t.idempotencyKey?.trim()||null,taskId:t.taskId,agentTabId:t.agentTabId,prompt:t.prompt,delivery:t.delivery,state:"queued",attempts:0,timeoutMs:t.timeoutMs,expiresAt:new Date(n.getTime()+t.timeoutMs).toISOString(),lastError:null,actor:t.actor,createdAt:n.toISOString(),updatedAt:n.toISOString(),deliveryStartedAt:null,deliveredAt:null,cancelledAt:null,cancelledBy:null},s=await Sp(e,r);if(s.created)try{await cn(e,s.command,"command.queued")}catch(i){throw Op(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function db(e,t){return{kind:"showPromptCommand",command:await Us(e,t)}}async function ub(e,t){let n=await gt(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function pb(e,t,n){let r=!1,s=await Ar(e,t,i=>{if(i.state==="cancelled")return i;let o=Ap(i,n??i.actor);return r=!0,o});if(r)try{await cn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw Op(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function fb(e,t){let n=await Ar(e,t,r=>Ip(r));return await cn(e,n,"command.delivering",Qa),n}async function mb(e,t){let n=await Ar(e,t,r=>vp(r));return await cn(e,n,"command.delivered",Qa),n}async function hb(e,t,n){let r=await Ar(e,t,s=>Cp(s,n));return await cn(e,r,"command.failed",Qa),r}async function gb(e,t,n){let r=[...n.states??lb],s=Date.now()+n.timeoutMs;for(;;){let i=await Us(e,t);if(r.includes(i.state))return{kind:"waitPromptCommand",command:i,matchedStates:r};if(n.signal?.aborted)throw new y("OPERATION_CANCELLED",`Cancelled while waiting for command ${t}.`,{retryable:!0,details:{commandId:t,cancelled:!0}});let o=s-Date.now();if(o<=0)throw new y("OPERATION_TIMEOUT",`Timed out after ${n.timeoutMs}ms waiting for command ${t}.`,{retryable:!0,details:{commandId:t,states:r,timeoutMs:n.timeoutMs}});await wb(Math.min(n.pollIntervalMs??100,o),n.signal)}}function yb(e){if(e.trim().length===0)throw new y("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>Ja)throw new y("CLI_USAGE",`Prompt exceeds the ${Ja}-byte limit.`,{details:{maxPromptBytes:Ja,promptBytes:t}});if([...e].some(n=>{let r=n.charCodeAt(0);return r<=8||r>=11&&r<=31||r>=127&&r<=159}))throw new y("CLI_USAGE","Prompt contains unsupported control characters.",{})}async function cn(e,t,n,r=t.actor){await ht(e,{id:`${t.id}:${n}`,taskId:t.taskId,agentTabId:t.agentTabId,commandId:t.id,type:n,occurredAt:n==="command.queued"?t.createdAt:n==="command.delivering"?t.deliveryStartedAt??t.updatedAt:n==="command.delivered"?t.deliveredAt??t.updatedAt:n==="command.cancelled"?t.cancelledAt??t.updatedAt:t.updatedAt,actor:r,data:{state:t.state,delivery:t.delivery,attempts:t.attempts,errorCode:t.lastError?.code??null,deliveryUncertain:t.lastError?.deliveryUncertain??!1}})}function wb(e,t){return t?.aborted?Promise.resolve():new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var Op=(e,t)=>new y("PARTIAL_RESULT",`Command ${e.id} was persisted as ${e.state}, but its event could not be appended.`,{retryable:!0,details:{commandId:e.id,durableState:e.state},cause:t}),Re={create:cb,show:db,list:ub,cancel:pb,wait:gb,beginDelivery:fb,completeDelivery:mb,fail:hb};import{randomUUID as $p,timingSafeEqual as kb}from"node:crypto";import{mkdir as Tb,readFile as bb,readdir as Rb}from"node:fs/promises";import Dp from"node:path";var Sb=10080*60*1e3,Pb={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024};async function _t(e,t,n={type:"system",component:"orchestration-supervisor"}){let r=t.ptyTabs.find(i=>i.kind==="agent");if(!r)return{};let s=null;if(await Tb(nl(e),{recursive:!0,mode:448}),await q(e,t.id,async i=>{let o=i.ptyTabs.find(u=>u.id===r.id&&u.kind==="agent");if(!o)throw new y("CAPABILITY_DENIED",`Agent tab ${r.id} no longer exists.`,{});let a=o.capabilityId??`capability_${$p()}`,l=await Vs(e,a);if(l&&(l.taskId!==i.id||l.agentTabId!==o.id))throw new y("CAPABILITY_DENIED",`Capability ${a} is bound to another agent.`,{details:{capabilityId:a,taskId:i.id,agentTabId:o.id}});return s=(l??await Ib(e,a,i.id,o.id,n)).token,o.capabilityId?i:{...i,ptyTabs:i.ptyTabs.map(u=>u.id===o.id?{...u,capabilityId:a}:u)}}),!s)throw new y("INTERNAL_ERROR",`Failed to issue a capability for ${r.id}.`,{});return{CRAIG_AGENT_CAPABILITY:s}}async function Ib(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${$p()}`,taskId:n,agentTabId:r,allowedCommandFamilies:["task.create-child","task.children","task.cancel-tree"],targetPolicy:"children-only",limits:{...Pb},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+Sb).toISOString(),revokedAt:null,revokedBy:null};return await U(rl(e,o.id),o,{mode:384}),o}async function Er(e,t,n,r){let s=await Cb(e,t);return s.revokedAt&&dn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&dn(s.id,"expired"),s.allowedCommandFamilies.includes(n)||dn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await vb(e,s.taskId,r)&&dn(s.id,`target task ${r} is outside the capability task subtree`),{capability:s,actor:{type:"agent",taskId:s.taskId,agentTabId:s.agentTabId,capabilityId:s.id}}}async function vb(e,t,n){if(t===n)return!0;let r=(await P.listTasks(e,{includeClosed:!0})).tasks,s=new Map(r.map(a=>[a.id,a])),i=s.get(n),o=new Set;for(;i?.parentTaskId&&!o.has(i.id);){if(i.parentTaskId===t)return!0;o.add(i.id),i=s.get(i.parentTaskId)}return!1}async function Np(e,t,n){let r=await Vs(e,t);r&&(r.revokedAt||await U(rl(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function tl(e,t,n){let r=await Rb(nl(e)).catch(i=>_p(i)?[]:Promise.reject(i)),s=[];for(let i of r){let o=/^(capability_[A-Za-z0-9-]+)\.json$/.exec(i);if(!o)continue;let a=await Vs(e,o[1]);!a||!t.has(a.taskId)||(await Np(e,a.id,n),s.push(a.id))}return s}async function Cb(e,t){let n=t.indexOf("."),r=n>0?t.slice(0,n):"";/^capability_[A-Za-z0-9-]+$/.test(r)||dn("<redacted>","token is invalid");let s=await Vs(e,r);if(!s)throw new y("CAPABILITY_NOT_FOUND",`Craig capability "${r}" was not found.`,{details:{capabilityId:r}});let i=Buffer.from(s.token),o=Buffer.from(t);return(i.length!==o.length||!kb(i,o))&&dn(r,"token is invalid"),s}async function Vs(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||dn(t,"identifier is invalid");try{let n=JSON.parse(await bb(rl(e,t),"utf8"));if(!Ab(n,t))throw new y("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(_p(n))return null;throw n}}function Ab(e,t){if(!el(e)||e.schemaVersion!==1||e.id!==t)return!1;let n=e.limits;return typeof e.token=="string"&&e.token.startsWith(`${t}.`)&&e.token.length>t.length+1&&typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&Array.isArray(e.allowedCommandFamilies)&&e.allowedCommandFamilies.every(r=>["task.create-child","task.children","task.cancel-tree"].includes(String(r)))&&e.targetPolicy==="children-only"&&el(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&Za(e.createdAt)&&Za(e.expiresAt)&&xp(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||Za(e.revokedAt)&&xp(e.revokedBy))}function xp(e){return el(e)?e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component)):!1}function dn(e,t){throw new y("CAPABILITY_DENIED",`Craig capability ${e} was denied: ${t}.`,{details:{capabilityId:e,reason:t}})}var nl=e=>Dp.join(e.orchestrationDir,"capabilities"),rl=(e,t)=>Dp.join(nl(e),`${t}.json`),el=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Za=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),_p=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as Lp,readFile as Eb,rm as sl,stat as Ob,writeFile as xb}from"node:fs/promises";import il from"node:path";var $b=20,Db=3e4,Nb=5e3;async function ol(e,t){let n=il.join(e.runtimeDir,"delegation.lock");await Lp(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Lp(n);try{await xb(il.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await sl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!Mb(s))throw s;if(await _b(n))continue;if(Date.now()-r>=Db)throw new y("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,$b))}try{return await t()}finally{await sl(n,{recursive:!0,force:!0})}}async function _b(e){let t=await Eb(il.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&Lb(t.pid))return!1;let n=await Ob(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<Nb?!1:(await sl(e,{recursive:!0,force:!0}),!0)}function Lb(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var Mb=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var jb={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function al(e,t,n,r={}){let s=await k.load(e);return k.previews.isEnabled(s,"agentOrchestration")?P.createTask(e,t,n,{...r,onProvisioned:async i=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:i.id,CRAIG_AGENT_TAB_ID:i.ptyTabs.find(o=>o.kind==="agent")?.id??"",...await _t(e,i,{type:"human",source:"cli",processId:process.pid})})}):P.createTask(e,t,n,r)}async function ll(e,t){return ol(e,async()=>{let n=await P.getTask(e,t.parentTaskId),r=t.capabilityId?await Er(e,t.capabilityId,"task.create-child",n.id):null,s=r?.actor??{type:"human",source:"cli",processId:process.pid},i=r?.capability.limits??jb,o=t.prompt.trim();if(o.length===0)throw new y("CLI_USAGE","Child task prompt cannot be empty.",{});if(Buffer.byteLength(o)>i.maxPromptBytes&&Gs("prompt bytes",i.maxPromptBytes),n.delegationDepth+1>i.maxDepth&&Gs("delegation depth",i.maxDepth),!new Set([n.repoId,...n.linkedRepoIds,...(n.repoTargets??[]).map(f=>f.repoId)]).has(t.repoId))throw new y("CAPABILITY_DENIED",`Repo ${t.repoId} is outside parent task ${n.id}.`,{details:{parentTaskId:n.id,repoId:t.repoId}});let c=(await P.listTasks(e,{includeClosed:!0})).tasks.filter(f=>f.parentTaskId===n.id),u=t.idempotencyKey?.trim()||null;if(u){if(u.length>256)throw new y("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let f=c.find(m=>m.delegationIdempotencyKey===u);if(f){if(f.repoId!==t.repoId||f.prompt.value!==o||t.runner&&f.runner!==t.runner)throw new y("COMMAND_STATE_CONFLICT",`Idempotency key "${u}" is already used by child ${f.id}.`,{details:{idempotencyKey:u,taskId:f.id}});return Mp(f,!0)}}c.length>=i.maxChildren&&Gs("children",i.maxChildren),c.filter(f=>f.status!=="closed"&&f.status!=="merged").length>=i.maxConcurrentChildren&&Gs("concurrent children",i.maxConcurrentChildren);let p=await P.createTask(e,t.repoId,o,{...t.runner?{runner:t.runner}:{},lineage:{parentTaskId:n.id,rootTaskId:n.rootTaskId,delegationDepth:n.delegationDepth+1,delegationIdempotencyKey:u,swarmRunId:n.swarmRunId,swarmStepId:null},onProvisioned:async f=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:f.id,CRAIG_AGENT_TAB_ID:f.ptyTabs.find(m=>m.kind==="agent")?.id??"",...await _t(e,f,s)})}),h=await P.getTask(e,p.taskId);try{await ht(e,{workspaceId:h.workspaceId,taskId:h.id,agentTabId:s.type==="agent"?s.agentTabId:null,type:"task.child.created",actor:s,data:{parentTaskId:n.id,rootTaskId:h.rootTaskId,delegationDepth:h.delegationDepth}})}catch(f){throw new y("PARTIAL_RESULT",`Child ${h.id} was created, but its audit event could not be recorded.`,{details:{taskId:h.id,parentTaskId:n.id,persisted:!0},cause:f})}return Mp(h,!1)})}async function cl(e,t,n){n&&await Er(e,n,"task.children",t),await P.getTask(e,t);let r=(await P.listTasks(e,{includeClosed:!0})).tasks.filter(s=>s.parentTaskId===t).sort((s,i)=>s.id.localeCompare(i.id));return{kind:"listTaskChildren",taskId:t,children:r}}async function dl(e,t,n){return ol(e,async()=>{let s=(n?await Er(e,n,"task.cancel-tree",t):null)?.actor??{type:"human",source:"cli",processId:process.pid};await P.getTask(e,t);let i=(await P.listTasks(e,{includeClosed:!0})).tasks,o=new Map(i.map(f=>[f.id,f])),a=new Map;for(let f of i)f.parentTaskId&&a.set(f.parentTaskId,[...a.get(f.parentTaskId)??[],f]);let l=[],c=new Set,u=f=>{if(c.has(f))throw new y("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${f}.`,{details:{taskId:f,rootTaskId:t}});let m=o.get(f);if(m){c.add(f),l.push(m);for(let g of(a.get(f)??[]).sort((T,R)=>T.id.localeCompare(R.id)))u(g.id)}};u(t);let d=[],p=[],h=[];try{await tl(e,new Set(l.map(f=>f.id)),s)}catch{h.push(...l.map(f=>f.id))}for(let f of l){let m=f.status;if(m==="closed"){d.push({taskId:f.id,previousStatus:m,status:"closed",disposition:"already-closed"});continue}await P.cleanupTask(e,f,{preserveWorktree:!0});let g=await P.closeTask(e,f.id);d.push({taskId:f.id,previousStatus:m,status:g.status,disposition:"cancelled"});try{await ht(e,{workspaceId:f.workspaceId,taskId:f.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:m}})}catch{p.push(f.id)}}if(p.length>0||h.length>0)throw new y("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:d,auditFailures:p,revocationFailures:h,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:d}})}function Mp(e,t){return{kind:"createChildTask",taskId:e.id,parentTaskId:e.parentTaskId,rootTaskId:e.rootTaskId,delegationDepth:e.delegationDepth,repoId:e.repoId,workspaceId:e.workspaceId,sessionId:e.sessionId,status:e.status,branch:e.branch,worktreePath:e.worktreePath,runner:e.runner,idempotentReplay:t}}function Gs(e,t){throw new y("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var Hs=Symbol.for("yaml.alias"),zs=Symbol.for("yaml.document"),je=Symbol.for("yaml.map"),ul=Symbol.for("yaml.pair"),Ce=Symbol.for("yaml.scalar"),yt=Symbol.for("yaml.seq"),ye=Symbol.for("yaml.node.type"),Ae=e=>!!e&&typeof e=="object"&&e[ye]===Hs,Qe=e=>!!e&&typeof e=="object"&&e[ye]===zs,Fe=e=>!!e&&typeof e=="object"&&e[ye]===je,j=e=>!!e&&typeof e=="object"&&e[ye]===ul,N=e=>!!e&&typeof e=="object"&&e[ye]===Ce,qe=e=>!!e&&typeof e=="object"&&e[ye]===yt;function W(e){if(e&&typeof e=="object")switch(e[ye]){case je:case yt:return!0}return!1}function F(e){if(e&&typeof e=="object")switch(e[ye]){case Hs:case je:case Ce:case yt:return!0}return!1}var Ys=e=>(N(e)||W(e))&&!!e.anchor;var Se=Symbol("break visit"),jp=Symbol("skip children"),Ze=Symbol("remove node");function _e(e,t){let n=Fp(t);Qe(e)?jn(null,e.contents,n,Object.freeze([e]))===Ze&&(e.contents=null):jn(null,e,n,Object.freeze([]))}_e.BREAK=Se;_e.SKIP=jp;_e.REMOVE=Ze;function jn(e,t,n,r){let s=qp(e,t,n,r);if(F(s)||j(s))return Wp(e,r,s),jn(e,s,n,r);if(typeof s!="symbol"){if(W(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=jn(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Se)return Se;o===Ze&&(t.items.splice(i,1),i-=1)}}}else if(j(t)){r=Object.freeze(r.concat(t));let i=jn("key",t.key,n,r);if(i===Se)return Se;i===Ze&&(t.key=null);let o=jn("value",t.value,n,r);if(o===Se)return Se;o===Ze&&(t.value=null)}}return s}async function Js(e,t){let n=Fp(t);Qe(e)?await Fn(null,e.contents,n,Object.freeze([e]))===Ze&&(e.contents=null):await Fn(null,e,n,Object.freeze([]))}Js.BREAK=Se;Js.SKIP=jp;Js.REMOVE=Ze;async function Fn(e,t,n,r){let s=await qp(e,t,n,r);if(F(s)||j(s))return Wp(e,r,s),Fn(e,s,n,r);if(typeof s!="symbol"){if(W(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=await Fn(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Se)return Se;o===Ze&&(t.items.splice(i,1),i-=1)}}}else if(j(t)){r=Object.freeze(r.concat(t));let i=await Fn("key",t.key,n,r);if(i===Se)return Se;i===Ze&&(t.key=null);let o=await Fn("value",t.value,n,r);if(o===Se)return Se;o===Ze&&(t.value=null)}}return s}function Fp(e){return typeof e=="object"&&(e.Collection||e.Node||e.Value)?Object.assign({Alias:e.Node,Map:e.Node,Scalar:e.Node,Seq:e.Node},e.Value&&{Map:e.Value,Scalar:e.Value,Seq:e.Value},e.Collection&&{Map:e.Collection,Seq:e.Collection},e):e}function qp(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(Fe(t))return n.Map?.(e,t,r);if(qe(t))return n.Seq?.(e,t,r);if(j(t))return n.Pair?.(e,t,r);if(N(t))return n.Scalar?.(e,t,r);if(Ae(t))return n.Alias?.(e,t,r)}function Wp(e,t,n){let r=t[t.length-1];if(W(r))r.items[e]=n;else if(j(r))e==="key"?r.key=n:r.value=n;else if(Qe(r))r.contents=n;else{let s=Ae(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var Fb={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},qb=e=>e.replace(/[!,[\]{}]/g,t=>Fb[t]),et=class e{constructor(t,n){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},e.defaultYaml,t),this.tags=Object.assign({},e.defaultTags,n)}clone(){let t=new e(this.yaml,this.tags);return t.docStart=this.docStart,t}atDocument(){let t=new e(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:e.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},e.defaultTags);break}return t}add(t,n){this.atNextDocument&&(this.yaml={explicit:e.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},e.defaultTags),this.atNextDocument=!1);let r=t.trim().split(/[ \t]+/),s=r.shift();switch(s){case"%TAG":{if(r.length!==2&&(n(0,"%TAG directive should contain exactly two parts"),r.length<2))return!1;let[i,o]=r;return this.tags[i]=o,!0}case"%YAML":{if(this.yaml.explicit=!0,r.length!==1)return n(0,"%YAML directive should contain exactly one part"),!1;let[i]=r;if(i==="1.1"||i==="1.2")return this.yaml.version=i,!0;{let o=/^\d+\.\d+$/.test(i);return n(6,`Unsupported YAML version ${i}`,o),!1}}default:return n(0,`Unknown directive ${s}`,!0),!1}}tagName(t,n){if(t==="!")return"!";if(t[0]!=="!")return n(`Not a valid tag: ${t}`),null;if(t[1]==="<"){let o=t.slice(2,-1);return o==="!"||o==="!!"?(n(`Verbatim tags aren't resolved, so ${t} is invalid.`),null):(t[t.length-1]!==">"&&n("Verbatim tags must end with a >"),o)}let[,r,s]=t.match(/^(.*!)([^!]*)$/s);s||n(`The ${t} tag has no suffix`);let i=this.tags[r];if(i)try{return i+decodeURIComponent(s)}catch(o){return n(String(o)),null}return r==="!"?t:(n(`Could not resolve tag: ${t}`),null)}tagString(t){for(let[n,r]of Object.entries(this.tags))if(t.startsWith(r))return n+qb(t.substring(r.length));return t[0]==="!"?t:`!<${t}>`}toString(t){let n=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],r=Object.entries(this.tags),s;if(t&&r.length>0&&F(t.contents)){let i={};_e(t.contents,(o,a)=>{F(a)&&a.tag&&(i[a.tag]=!0)}),s=Object.keys(i)}else s=[];for(let[i,o]of r)i==="!!"&&o==="tag:yaml.org,2002:"||(!t||s.some(a=>a.startsWith(o)))&&n.push(`%TAG ${i} ${o}`);return n.join(`
84
+ `)}};et.defaultYaml={explicit:!1,version:"1.2"};et.defaultTags={"!!":"tag:yaml.org,2002:"};function Xs(e){if(/[\x00-\x19\s,[\]{}]/.test(e)){let n=`Anchor must not contain whitespace or control characters: ${JSON.stringify(e)}`;throw new Error(n)}return!0}function pl(e){let t=new Set;return _e(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function fl(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function Bp(e,t){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=pl(e));let o=fl(t,s);return s.add(o),o},setAnchors:()=>{for(let i of n){let o=r.get(i);if(typeof o=="object"&&o.anchor&&(N(o.node)||W(o.node)))o.node.anchor=o.anchor;else{let a=new Error("Failed to resolve repeated object (this should not happen)");throw a.source=i,a}}},sourceObjects:r}}function Lt(e,t,n,r){if(r&&typeof r=="object")if(Array.isArray(r))for(let s=0,i=r.length;s<i;++s){let o=r[s],a=Lt(e,r,String(s),o);a===void 0?delete r[s]:a!==o&&(r[s]=a)}else if(r instanceof Map)for(let s of Array.from(r.keys())){let i=r.get(s),o=Lt(e,r,s,i);o===void 0?r.delete(s):o!==i&&r.set(s,o)}else if(r instanceof Set)for(let s of Array.from(r)){let i=Lt(e,r,s,s);i===void 0?r.delete(s):i!==s&&(r.delete(s),r.add(i))}else for(let[s,i]of Object.entries(r)){let o=Lt(e,r,s,i);o===void 0?delete r[s]:o!==i&&(r[s]=o)}return e.call(t,n,r)}function ie(e,t,n){if(Array.isArray(e))return e.map((r,s)=>ie(r,String(s),n));if(e&&typeof e.toJSON=="function"){if(!n||!Ys(e))return e.toJSON(t,n);let r={aliasCount:0,count:1,res:void 0};n.anchors.set(e,r),n.onCreate=i=>{r.res=i,delete n.onCreate};let s=e.toJSON(t,n);return n.onCreate&&n.onCreate(s),s}return typeof e=="bigint"&&!n?.keep?Number(e):e}var Mt=class{constructor(t){Object.defineProperty(this,ye,{value:t})}clone(){let t=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(t.range=this.range.slice()),t}toJS(t,{mapAsMap:n,maxAliasCount:r,onAnchor:s,reviver:i}={}){if(!Qe(t))throw new TypeError("A document argument is required");let o={anchors:new Map,doc:t,keep:!0,mapAsMap:n===!0,mapKeyWarned:!1,maxAliasCount:typeof r=="number"?r:100},a=ie(this,"",o);if(typeof s=="function")for(let{count:l,res:c}of o.anchors.values())s(c,l);return typeof i=="function"?Lt(i,{"":a},"",a):a}};var wt=class extends Mt{constructor(t){super(Hs),this.source=t,Object.defineProperty(this,"tag",{set(){throw new Error("Alias nodes cannot have tags")}})}resolve(t,n){if(n?.maxAliasCount===0)throw new ReferenceError("Alias resolution is disabled");let r;n?.aliasResolveCache?r=n.aliasResolveCache:(r=[],_e(t,{Node:(i,o)=>{(Ae(o)||Ys(o))&&r.push(o)}}),n&&(n.aliasResolveCache=r));let s;for(let i of r){if(i===this)break;i.anchor===this.source&&(s=i)}return s}toJSON(t,n){if(!n)return{source:this.source};let{anchors:r,doc:s,maxAliasCount:i}=n,o=this.resolve(s,n);if(!o){let l=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(l)}let a=r.get(o);if(a||(ie(o,null,n),a=r.get(o)),a?.res===void 0){let l="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(l)}if(i>=0&&(a.count+=1,a.aliasCount===0&&(a.aliasCount=Qs(s,o,r)),a.count*a.aliasCount>i)){let l="Excessive alias count indicates a resource exhaustion attack";throw new ReferenceError(l)}return a.res}toString(t,n,r){let s=`*${this.source}`;if(t){if(Xs(this.source),t.options.verifyAliasOrder&&!t.anchors.has(this.source)){let i=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new Error(i)}if(t.implicitKey)return`${s} `}return s}};function Qs(e,t,n){if(Ae(t)){let r=t.resolve(e),s=n&&r&&n.get(r);return s?s.count*s.aliasCount:0}else if(W(t)){let r=0;for(let s of t.items){let i=Qs(e,s,n);i>r&&(r=i)}return r}else if(j(t)){let r=Qs(e,t.key,n),s=Qs(e,t.value,n);return Math.max(r,s)}return 1}var Zs=e=>!e||typeof e!="function"&&typeof e!="object",O=class extends Mt{constructor(t){super(Ce),this.value=t}toJSON(t,n){return n?.keep?this.value:ie(this.value,t,n)}toString(){return String(this.value)}};O.BLOCK_FOLDED="BLOCK_FOLDED";O.BLOCK_LITERAL="BLOCK_LITERAL";O.PLAIN="PLAIN";O.QUOTE_DOUBLE="QUOTE_DOUBLE";O.QUOTE_SINGLE="QUOTE_SINGLE";var Wb="tag:yaml.org,2002:";function Bb(e,t,n){if(t){let r=n.filter(i=>i.tag===t),s=r.find(i=>!i.format)??r[0];if(!s)throw new Error(`Tag ${t} not found`);return s}return n.find(r=>r.identify?.(e)&&!r.format)}function kt(e,t,n){if(Qe(e)&&(e=e.contents),F(e))return e;if(j(e)){let d=n.schema[je].createNode?.(n.schema,null,n);return d.items.push(e),d}(e instanceof String||e instanceof Number||e instanceof Boolean||typeof BigInt<"u"&&e instanceof BigInt)&&(e=e.valueOf());let{aliasDuplicateObjects:r,onAnchor:s,onTagObj:i,schema:o,sourceObjects:a}=n,l;if(r&&e&&typeof e=="object"){if(l=a.get(e),l)return l.anchor??(l.anchor=s(e)),new wt(l.anchor);l={anchor:null,node:null},a.set(e,l)}t?.startsWith("!!")&&(t=Wb+t.slice(2));let c=Bb(e,t,o.tags);if(!c){if(e&&typeof e.toJSON=="function"&&(e=e.toJSON()),!e||typeof e!="object"){let d=new O(e);return l&&(l.node=d),d}c=e instanceof Map?o[je]:Symbol.iterator in Object(e)?o[yt]:o[je]}i&&(i(c),delete n.onTagObj);let u=c?.createNode?c.createNode(n.schema,e,n):typeof c?.nodeClass?.from=="function"?c.nodeClass.from(n.schema,e,n):new O(e);return t?u.tag=t:c.default||(u.tag=c.tag),l&&(l.node=u),u}function Or(e,t,n){let r=n;for(let s=t.length-1;s>=0;--s){let i=t[s];if(typeof i=="number"&&Number.isInteger(i)&&i>=0){let o=[];o[i]=r,r=o}else r=new Map([[i,r]])}return kt(r,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:e,sourceObjects:new Map})}var Wn=e=>e==null||typeof e=="object"&&!!e[Symbol.iterator]().next().done,qn=class extends Mt{constructor(t,n){super(t),Object.defineProperty(this,"schema",{value:n,configurable:!0,enumerable:!1,writable:!0})}clone(t){let n=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return t&&(n.schema=t),n.items=n.items.map(r=>F(r)||j(r)?r.clone(t):r),this.range&&(n.range=this.range.slice()),n}addIn(t,n){if(Wn(t))this.add(n);else{let[r,...s]=t,i=this.get(r,!0);if(W(i))i.addIn(s,n);else if(i===void 0&&this.schema)this.set(r,Or(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}deleteIn(t){let[n,...r]=t;if(r.length===0)return this.delete(n);let s=this.get(n,!0);if(W(s))return s.deleteIn(r);throw new Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}getIn(t,n){let[r,...s]=t,i=this.get(r,!0);return s.length===0?!n&&N(i)?i.value:i:W(i)?i.getIn(s,n):void 0}hasAllNullValues(t){return this.items.every(n=>{if(!j(n))return!1;let r=n.value;return r==null||t&&N(r)&&r.value==null&&!r.commentBefore&&!r.comment&&!r.tag})}hasIn(t){let[n,...r]=t;if(r.length===0)return this.has(n);let s=this.get(n,!0);return W(s)?s.hasIn(r):!1}setIn(t,n){let[r,...s]=t;if(s.length===0)this.set(r,n);else{let i=this.get(r,!0);if(W(i))i.setIn(s,n);else if(i===void 0&&this.schema)this.set(r,Or(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};var Up=e=>e.replace(/^(?!$)(?: $)?/gm,"#");function Le(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var tt=(e,t,n)=>e.endsWith(`
85
+ `)?Le(n,t):n.includes(`
86
+ `)?`
87
+ `+Le(n,t):(e.endsWith(" ")?"":" ")+n;var ml="flow",ei="block",xr="quoted";function $r(e,t,n="flow",{indentAtStart:r,lineWidth:s=80,minContentWidth:i=20,onFold:o,onOverflow:a}={}){if(!s||s<0)return e;s<i&&(i=0);let l=Math.max(1+i,1+s-t.length);if(e.length<=l)return e;let c=[],u={},d=s-t.length;typeof r=="number"&&(r>s-Math.max(2,i)?c.push(0):d=s-r);let p,h,f=!1,m=-1,g=-1,T=-1;n===ei&&(m=Kp(e,m,t.length),m!==-1&&(d=m+l));for(let I;I=e[m+=1];){if(n===xr&&I==="\\"){switch(g=m,e[m+1]){case"x":m+=3;break;case"u":m+=5;break;case"U":m+=9;break;default:m+=1}T=m}if(I===`
88
+ `)n===ei&&(m=Kp(e,m,t.length)),d=m+t.length+l,p=void 0;else{if(I===" "&&h&&h!==" "&&h!==`
89
+ `&&h!==" "){let b=e[m+1];b&&b!==" "&&b!==`
90
+ `&&b!==" "&&(p=m)}if(m>=d)if(p)c.push(p),d=p+l,p=void 0;else if(n===xr){for(;h===" "||h===" ";)h=I,I=e[m+=1],f=!0;let b=m>T+1?m-2:g-1;if(u[b])return e;c.push(b),u[b]=!0,d=b+l,p=void 0}else f=!0}h=I}if(f&&a&&a(),c.length===0)return e;o&&o();let R=e.slice(0,c[0]);for(let I=0;I<c.length;++I){let b=c[I],x=c[I+1]||e.length;b===0?R=`
91
+ ${t}${e.slice(0,x)}`:(n===xr&&u[b]&&(R+=`${e[b]}\\`),R+=`
92
+ ${t}${e.slice(b+1,x)}`)}return R}function Kp(e,t,n){let r=t,s=t+1,i=e[s];for(;i===" "||i===" ";)if(t<s+n)i=e[++t];else{do i=e[++t];while(i&&i!==`
93
+ `);r=t,s=t+1,i=e[s]}return r}var ni=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),ri=e=>/^(%|---|\.\.\.)/m.test(e);function Ub(e,t,n){if(!t||t<0)return!1;let r=t-n,s=e.length;if(s<=r)return!1;for(let i=0,o=0;i<s;++i)if(e[i]===`
94
+ `){if(i-o>r)return!0;if(o=i+1,s-o<=r)return!1}return!0}function Dr(e,t){let n=JSON.stringify(e);if(t.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=t,s=t.options.doubleQuotedMinMultiLineLength,i=t.indent||(ri(e)?" ":""),o="",a=0;for(let l=0,c=n[l];c;c=n[++l])if(c===" "&&n[l+1]==="\\"&&n[l+2]==="n"&&(o+=n.slice(a,l)+"\\ ",l+=1,a=l,c="\\"),c==="\\")switch(n[l+1]){case"u":{o+=n.slice(a,l);let u=n.substr(l+2,4);switch(u){case"0000":o+="\\0";break;case"0007":o+="\\a";break;case"000b":o+="\\v";break;case"001b":o+="\\e";break;case"0085":o+="\\N";break;case"00a0":o+="\\_";break;case"2028":o+="\\L";break;case"2029":o+="\\P";break;default:u.substr(0,2)==="00"?o+="\\x"+u.substr(2):o+=n.substr(l,6)}l+=5,a=l+1}break;case"n":if(r||n[l+2]==='"'||n.length<s)l+=1;else{for(o+=n.slice(a,l)+`
95
+
96
+ `;n[l+2]==="\\"&&n[l+3]==="n"&&n[l+4]!=='"';)o+=`
97
+ `,l+=2;o+=i,n[l+2]===" "&&(o+="\\"),l+=1,a=l+1}break;default:l+=1}return o=a?o+n.slice(a):n,r?o:$r(o,i,xr,ni(t,!1))}function hl(e,t){if(t.options.singleQuote===!1||t.implicitKey&&e.includes(`
98
+ `)||/[ \t]\n|\n[ \t]/.test(e))return Dr(e,t);let n=t.indent||(ri(e)?" ":""),r="'"+e.replace(/'/g,"''").replace(/\n+/g,`$&
99
+ ${n}`)+"'";return t.implicitKey?r:$r(r,n,ml,ni(t,!1))}function Bn(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=Dr;else{let s=e.includes('"'),i=e.includes("'");s&&!i?r=hl:i&&!s?r=Dr:r=n?hl:Dr}return r(e,t)}var gl;try{gl=new RegExp(`(^|(?<!
100
+ ))
101
+ +(?!
102
+ |$)`,"g")}catch{gl=/\n+(?!\n|$)/g}function ti({comment:e,type:t,value:n},r,s,i){let{blockQuote:o,commentString:a,lineWidth:l}=r.options;if(!o||/\n[\t ]+$/.test(n))return Bn(n,r);let c=r.indent||(r.forceBlockIndent||ri(n)?" ":""),u=o==="literal"?!0:o==="folded"||t===O.BLOCK_FOLDED?!1:t===O.BLOCK_LITERAL?!0:!Ub(n,l,c.length);if(!n)return u?`|
103
+ `:`>
104
+ `;let d,p;for(p=n.length;p>0;--p){let x=n[p-1];if(x!==`
105
+ `&&x!==" "&&x!==" ")break}let h=n.substring(p),f=h.indexOf(`
106
+ `);f===-1?d="-":n===h||f!==h.length-1?(d="+",i&&i()):d="",h&&(n=n.slice(0,-h.length),h[h.length-1]===`
107
+ `&&(h=h.slice(0,-1)),h=h.replace(gl,`$&${c}`));let m=!1,g,T=-1;for(g=0;g<n.length;++g){let x=n[g];if(x===" ")m=!0;else if(x===`
108
+ `)T=g;else break}let R=n.substring(0,T<g?T+1:g);R&&(n=n.substring(R.length),R=R.replace(/\n+/g,`$&${c}`));let b=(m?c?"2":"1":"")+d;if(e&&(b+=" "+a(e.replace(/ ?[\r\n]+/g," ")),s&&s()),!u){let x=n.replace(/\n+/g,`
109
+ $&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),$=!1,_=ni(r,!0);o!=="folded"&&t!==O.BLOCK_FOLDED&&(_.onOverflow=()=>{$=!0});let v=$r(`${R}${x}${h}`,c,ei,_);if(!$)return`>${b}
110
+ ${c}${v}`}return n=n.replace(/\n+/g,`$&${c}`),`|${b}
111
+ ${c}${R}${n}${h}`}function Kb(e,t,n,r){let{type:s,value:i}=e,{actualString:o,implicitKey:a,indent:l,indentStep:c,inFlow:u}=t;if(a&&i.includes(`
112
+ `)||u&&/[[\]{},]/.test(i))return Bn(i,t);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(i))return a||u||!i.includes(`
113
+ `)?Bn(i,t):ti(e,t,n,r);if(!a&&!u&&s!==O.PLAIN&&i.includes(`
114
+ `))return ti(e,t,n,r);if(ri(i)){if(l==="")return t.forceBlockIndent=!0,ti(e,t,n,r);if(a&&l===c)return Bn(i,t)}let d=i.replace(/\n+/g,`$&
115
+ ${l}`);if(o){let p=m=>m.default&&m.tag!=="tag:yaml.org,2002:str"&&m.test?.test(d),{compat:h,tags:f}=t.doc.schema;if(f.some(p)||h?.some(p))return Bn(i,t)}return a?d:$r(d,l,ml,ni(t,!1))}function un(e,t,n,r){let{implicitKey:s,inFlow:i}=t,o=typeof e.value=="string"?e:Object.assign({},e,{value:String(e.value)}),{type:a}=e;a!==O.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(o.value)&&(a=O.QUOTE_DOUBLE);let l=u=>{switch(u){case O.BLOCK_FOLDED:case O.BLOCK_LITERAL:return s||i?Bn(o.value,t):ti(o,t,n,r);case O.QUOTE_DOUBLE:return Dr(o.value,t);case O.QUOTE_SINGLE:return hl(o.value,t);case O.PLAIN:return Kb(o,t,n,r);default:return null}},c=l(a);if(c===null){let{defaultKeyType:u,defaultStringType:d}=t.options,p=s&&u||d;if(c=l(p),c===null)throw new Error(`Unsupported default string type ${p}`)}return c}function si(e,t){let n=Object.assign({blockQuote:!0,commentString:Up,defaultKeyType:null,defaultStringType:"PLAIN",directives:null,doubleQuotedAsJSON:!1,doubleQuotedMinMultiLineLength:40,falseStr:"false",flowCollectionPadding:!0,indentSeq:!0,lineWidth:80,minContentWidth:20,nullStr:"null",simpleKeys:!1,singleQuote:null,trailingComma:!1,trueStr:"true",verifyAliasOrder:!0},e.schema.toStringOptions,t),r;switch(n.collectionStyle){case"block":r=!1;break;case"flow":r=!0;break;default:r=null}return{anchors:new Set,doc:e,flowCollectionPadding:n.flowCollectionPadding?" ":"",indent:"",indentStep:typeof n.indent=="number"?" ".repeat(n.indent):" ",inFlow:r,options:n}}function Vb(e,t){if(t.tag){let s=e.filter(i=>i.tag===t.tag);if(s.length>0)return s.find(i=>i.format===t.format)??s[0]}let n,r;if(N(t)){r=t.value;let s=e.filter(i=>i.identify?.(r));if(s.length>1){let i=s.filter(o=>o.test);i.length>0&&(s=i)}n=s.find(i=>i.format===t.format)??s.find(i=>!i.format)}else r=t,n=e.find(s=>s.nodeClass&&r instanceof s.nodeClass);if(!n){let s=r?.constructor?.name??(r===null?"null":typeof r);throw new Error(`Tag not resolved for ${s} value`)}return n}function Gb(e,t,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(N(e)||W(e))&&e.anchor;i&&Xs(i)&&(n.add(i),s.push(`&${i}`));let o=e.tag??(t.default?null:t.tag);return o&&s.push(r.directives.tagString(o)),s.join(" ")}function Tt(e,t,n,r){if(j(e))return e.toString(t,n,r);if(Ae(e)){if(t.doc.directives)return e.toString(t);if(t.resolvedAliases?.has(e))throw new TypeError("Cannot stringify circular structure without alias nodes");t.resolvedAliases?t.resolvedAliases.add(e):t.resolvedAliases=new Set([e]),e=e.resolve(t.doc)}let s,i=F(e)?e:t.doc.createNode(e,{onTagObj:l=>s=l});s??(s=Vb(t.doc.schema.tags,i));let o=Gb(i,s,t);o.length>0&&(t.indentAtStart=(t.indentAtStart??0)+o.length+1);let a=typeof s.stringify=="function"?s.stringify(i,t,n,r):N(i)?un(i,t,n,r):i.toString(t,n,r);return o?N(i)||a[0]==="{"||a[0]==="["?`${o} ${a}`:`${o}
116
+ ${t.indent}${a}`:a}function Vp({key:e,value:t},n,r,s){let{allNullValues:i,doc:o,indent:a,indentStep:l,options:{commentString:c,indentSeq:u,simpleKeys:d}}=n,p=F(e)&&e.comment||null;if(d){if(p)throw new Error("With simple keys, key nodes cannot have comments");if(W(e)||!F(e)&&typeof e=="object"){let _="With simple keys, collection cannot be used as a key value";throw new Error(_)}}let h=!d&&(!e||p&&t==null&&!n.inFlow||W(e)||(N(e)?e.type===O.BLOCK_FOLDED||e.type===O.BLOCK_LITERAL:typeof e=="object"));n=Object.assign({},n,{allNullValues:!1,implicitKey:!h&&(d||!i),indent:a+l});let f=!1,m=!1,g=Tt(e,n,()=>f=!0,()=>m=!0);if(!h&&!n.inFlow&&g.length>1024){if(d)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");h=!0}if(n.inFlow){if(i||t==null)return f&&r&&r(),g===""?"?":h?`? ${g}`:g}else if(i&&!d||t==null&&h)return g=`? ${g}`,p&&!f?g+=tt(g,n.indent,c(p)):m&&s&&s(),g;f&&(p=null),h?(p&&(g+=tt(g,n.indent,c(p))),g=`? ${g}
117
+ ${a}:`):(g=`${g}:`,p&&(g+=tt(g,n.indent,c(p))));let T,R,I;F(t)?(T=!!t.spaceBefore,R=t.commentBefore,I=t.comment):(T=!1,R=null,I=null,t&&typeof t=="object"&&(t=o.createNode(t))),n.implicitKey=!1,!h&&!p&&N(t)&&(n.indentAtStart=g.length+1),m=!1,!u&&l.length>=2&&!n.inFlow&&!h&&qe(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let b=!1,x=Tt(t,n,()=>b=!0,()=>m=!0),$=" ";if(p||T||R){if($=T?`
118
+ `:"",R){let _=c(R);$+=`
119
+ ${Le(_,n.indent)}`}x===""&&!n.inFlow?$===`
120
+ `&&I&&($=`
121
+
122
+ `):$+=`
123
+ ${n.indent}`}else if(!h&&W(t)){let _=x[0],v=x.indexOf(`
124
+ `),w=v!==-1,ue=n.inFlow??t.flow??t.items.length===0;if(w||!ue){let pe=!1;if(w&&(_==="&"||_==="!")){let z=x.indexOf(" ");_==="&"&&z!==-1&&z<v&&x[z+1]==="!"&&(z=x.indexOf(" ",z+1)),(z===-1||v<z)&&(pe=!0)}pe||($=`
125
+ ${n.indent}`)}}else(x===""||x[0]===`
126
+ `)&&($="");return g+=$+x,n.inFlow?b&&r&&r():I&&!b?g+=tt(g,n.indent,c(I)):m&&s&&s(),g}function yl(e,t){(e==="debug"||e==="warn")&&console.warn(t)}var ii="<<",We={identify:e=>e===ii||typeof e=="symbol"&&e.description===ii,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new O(Symbol(ii)),{addToJSMap:kl}),stringify:()=>ii},Gp=(e,t)=>(We.identify(t)||N(t)&&(!t.type||t.type===O.PLAIN)&&We.identify(t.value))&&e?.doc.schema.tags.some(n=>n.tag===We.tag&&n.default);function kl(e,t,n){let r=Hp(e,n);if(qe(r))for(let s of r.items)wl(e,t,s);else if(Array.isArray(r))for(let s of r)wl(e,t,s);else wl(e,t,r)}function wl(e,t,n){let r=Hp(e,n);if(!Fe(r))throw new Error("Merge sources must be maps or map aliases");let s=r.toJSON(null,e,Map);for(let[i,o]of s)t instanceof Map?t.has(i)||t.set(i,o):t instanceof Set?t.add(i):Object.prototype.hasOwnProperty.call(t,i)||Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0});return t}function Hp(e,t){return e&&Ae(t)?t.resolve(e.doc,e):t}function oi(e,t,{key:n,value:r}){if(F(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(Gp(e,n))kl(e,t,r);else{let s=ie(n,"",e);if(t instanceof Map)t.set(s,ie(r,s,e));else if(t instanceof Set)t.add(s);else{let i=Hb(n,s,e),o=ie(r,i,e);i in t?Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0}):t[i]=o}}return t}function Hb(e,t,n){if(t===null)return"";if(typeof t!="object")return String(t);if(F(e)&&n?.doc){let r=si(n.doc,{});r.anchors=new Set;for(let i of n.anchors.keys())r.anchors.add(i.anchor);r.inFlow=!0,r.inStringifyKey=!0;let s=e.toString(r);if(!n.mapKeyWarned){let i=JSON.stringify(s);i.length>40&&(i=i.substring(0,36)+'..."'),yl(n.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${i}. Set mapAsMap: true to use object keys.`),n.mapKeyWarned=!0}return s}return JSON.stringify(t)}function Un(e,t,n){let r=kt(e,void 0,n),s=kt(t,void 0,n);return new X(r,s)}var X=class e{constructor(t,n=null){Object.defineProperty(this,ye,{value:ul}),this.key=t,this.value=n}clone(t){let{key:n,value:r}=this;return F(n)&&(n=n.clone(t)),F(r)&&(r=r.clone(t)),new e(n,r)}toJSON(t,n){let r=n?.mapAsMap?new Map:{};return oi(n,r,this)}toString(t,n,r){return t?.doc?Vp(this,t,n,r):JSON.stringify(this)}};function li(e,t,n){return(t.inFlow??e.flow?Yb:zb)(e,t,n)}function zb({comment:e,items:t},n,{blockItemPrefix:r,flowChars:s,itemIndent:i,onChompKeep:o,onComment:a}){let{indent:l,options:{commentString:c}}=n,u=Object.assign({},n,{indent:i,type:null}),d=!1,p=[];for(let f=0;f<t.length;++f){let m=t[f],g=null;if(F(m))!d&&m.spaceBefore&&p.push(""),ai(n,p,m.commentBefore,d),m.comment&&(g=m.comment);else if(j(m)){let R=F(m.key)?m.key:null;R&&(!d&&R.spaceBefore&&p.push(""),ai(n,p,R.commentBefore,d))}d=!1;let T=Tt(m,u,()=>g=null,()=>d=!0);g&&(T+=tt(T,i,c(g))),d&&g&&(d=!1),p.push(r+T)}let h;if(p.length===0)h=s.start+s.end;else{h=p[0];for(let f=1;f<p.length;++f){let m=p[f];h+=m?`
127
+ ${l}${m}`:`
128
+ `}}return e?(h+=`
129
+ `+Le(c(e),l),a&&a()):d&&o&&o(),h}function Yb({items:e},t,{flowChars:n,itemIndent:r}){let{indent:s,indentStep:i,flowCollectionPadding:o,options:{commentString:a}}=t;r+=i;let l=Object.assign({},t,{indent:r,inFlow:!0,type:null}),c=!1,u=0,d=[];for(let f=0;f<e.length;++f){let m=e[f],g=null;if(F(m))m.spaceBefore&&d.push(""),ai(t,d,m.commentBefore,!1),m.comment&&(g=m.comment);else if(j(m)){let R=F(m.key)?m.key:null;R&&(R.spaceBefore&&d.push(""),ai(t,d,R.commentBefore,!1),R.comment&&(c=!0));let I=F(m.value)?m.value:null;I?(I.comment&&(g=I.comment),I.commentBefore&&(c=!0)):m.value==null&&R?.comment&&(g=R.comment)}g&&(c=!0);let T=Tt(m,l,()=>g=null);c||(c=d.length>u||T.includes(`
130
+ `)),f<e.length-1?T+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=d.reduce((R,I)=>R+I.length+2,2)+(T.length+2)>t.options.lineWidth)),c&&(T+=",")),g&&(T+=tt(T,r,a(g))),d.push(T),u=d.length}let{start:p,end:h}=n;if(d.length===0)return p+h;if(!c){let f=d.reduce((m,g)=>m+g.length+2,2);c=t.options.lineWidth>0&&f>t.options.lineWidth}if(c){let f=p;for(let m of d)f+=m?`
131
+ ${i}${s}${m}`:`
132
+ `;return`${f}
133
+ ${s}${h}`}else return`${p}${o}${d.join(" ")}${o}${h}`}function ai({indent:e,options:{commentString:t}},n,r,s){if(r&&s&&(r=r.replace(/^\n+/,"")),r){let i=Le(t(r),e);n.push(i.trimStart())}}function jt(e,t){let n=N(t)?t.value:t;for(let r of e)if(j(r)&&(r.key===t||r.key===n||N(r.key)&&r.key.value===n))return r}var ee=class extends qn{static get tagName(){return"tag:yaml.org,2002:map"}constructor(t){super(je,t),this.items=[]}static from(t,n,r){let{keepUndefined:s,replacer:i}=r,o=new this(t),a=(l,c)=>{if(typeof i=="function")c=i.call(n,l,c);else if(Array.isArray(i)&&!i.includes(l))return;(c!==void 0||s)&&o.items.push(Un(l,c,r))};if(n instanceof Map)for(let[l,c]of n)a(l,c);else if(n&&typeof n=="object")for(let l of Object.keys(n))a(l,n[l]);return typeof t.sortMapEntries=="function"&&o.items.sort(t.sortMapEntries),o}add(t,n){let r;j(t)?r=t:!t||typeof t!="object"||!("key"in t)?r=new X(t,t?.value):r=new X(t.key,t.value);let s=jt(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);N(s.value)&&Zs(r.value)?s.value.value=r.value:s.value=r.value}else if(i){let o=this.items.findIndex(a=>i(r,a)<0);o===-1?this.items.push(r):this.items.splice(o,0,r)}else this.items.push(r)}delete(t){let n=jt(this.items,t);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(t,n){let s=jt(this.items,t)?.value;return(!n&&N(s)?s.value:s)??void 0}has(t){return!!jt(this.items,t)}set(t,n){this.add(new X(t,n),!0)}toJSON(t,n,r){let s=r?new r:n?.mapAsMap?new Map:{};n?.onCreate&&n.onCreate(s);for(let i of this.items)oi(n,s,i);return s}toString(t,n,r){if(!t)return JSON.stringify(this);for(let s of this.items)if(!j(s))throw new Error(`Map items must all be pairs; found ${JSON.stringify(s)} instead`);return!t.allNullValues&&this.hasAllNullValues(!1)&&(t=Object.assign({},t,{allNullValues:!0})),li(this,t,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:t.indent||"",onChompKeep:r,onComment:n})}};var Be={collection:"map",default:!0,nodeClass:ee,tag:"tag:yaml.org,2002:map",resolve(e,t){return Fe(e)||t("Expected a mapping for this tag"),e},createNode:(e,t,n)=>ee.from(e,t,n)};var me=class extends qn{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(t){super(yt,t),this.items=[]}add(t){this.items.push(t)}delete(t){let n=ci(t);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(t,n){let r=ci(t);if(typeof r!="number")return;let s=this.items[r];return!n&&N(s)?s.value:s}has(t){let n=ci(t);return typeof n=="number"&&n<this.items.length}set(t,n){let r=ci(t);if(typeof r!="number")throw new Error(`Expected a valid index, not ${t}.`);let s=this.items[r];N(s)&&Zs(n)?s.value=n:this.items[r]=n}toJSON(t,n){let r=[];n?.onCreate&&n.onCreate(r);let s=0;for(let i of this.items)r.push(ie(i,String(s++),n));return r}toString(t,n,r){return t?li(this,t,{blockItemPrefix:"- ",flowChars:{start:"[",end:"]"},itemIndent:(t.indent||"")+" ",onChompKeep:r,onComment:n}):JSON.stringify(this)}static from(t,n,r){let{replacer:s}=r,i=new this(t);if(n&&Symbol.iterator in Object(n)){let o=0;for(let a of n){if(typeof s=="function"){let l=n instanceof Set?a:String(o++);a=s.call(n,l,a)}i.items.push(kt(a,void 0,r))}}return i}};function ci(e){let t=N(e)?e.value:e;return t&&typeof t=="string"&&(t=Number(t)),typeof t=="number"&&Number.isInteger(t)&&t>=0?t:null}var Ue={collection:"seq",default:!0,nodeClass:me,tag:"tag:yaml.org,2002:seq",resolve(e,t){return qe(e)||t("Expected a sequence for this tag"),e},createNode:(e,t,n)=>me.from(e,t,n)};var Ft={identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify(e,t,n,r){return t=Object.assign({actualString:!0},t),un(e,t,n,r)}};var pn={identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new O(null),stringify:({source:e},t)=>typeof e=="string"&&pn.test.test(e)?e:t.options.nullStr};var Nr={identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:e=>new O(e[0]==="t"||e[0]==="T"),stringify({source:e,value:t},n){if(e&&Nr.test.test(e)){let r=e[0]==="t"||e[0]==="T";if(t===r)return e}return t?n.options.trueStr:n.options.falseStr}};function he({format:e,minFractionDigits:t,tag:n,value:r}){if(typeof r=="bigint")return String(r);let s=typeof r=="number"?r:Number(r);if(!isFinite(s))return isNaN(s)?".nan":s<0?"-.inf":".inf";let i=Object.is(r,-0)?"-0":JSON.stringify(r);if(!e&&t&&(!n||n==="tag:yaml.org,2002:float")&&/^-?\d/.test(i)&&!i.includes("e")){let o=i.indexOf(".");o<0&&(o=i.length,i+=".");let a=t-(i.length-o-1);for(;a-- >0;)i+="0"}return i}var di={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:e=>e.slice(-3).toLowerCase()==="nan"?NaN:e[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:he},ui={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:e=>parseFloat(e),stringify(e){let t=Number(e.value);return isFinite(t)?t.toExponential():he(e)}},pi={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(e){let t=new O(parseFloat(e)),n=e.indexOf(".");return n!==-1&&e[e.length-1]==="0"&&(t.minFractionDigits=e.length-n-1),t},stringify:he};var fi=e=>typeof e=="bigint"||Number.isInteger(e),Tl=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function zp(e,t,n){let{value:r}=e;return fi(r)&&r>=0?n+r.toString(t):he(e)}var mi={identify:e=>fi(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(e,t,n)=>Tl(e,2,8,n),stringify:e=>zp(e,8,"0o")},hi={identify:fi,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>Tl(e,0,10,n),stringify:he},gi={identify:e=>fi(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>Tl(e,2,16,n),stringify:e=>zp(e,16,"0x")};var Yp=[Be,Ue,Ft,pn,Nr,mi,hi,gi,di,ui,pi];function Jp(e){return typeof e=="bigint"||Number.isInteger(e)}var yi=({value:e})=>JSON.stringify(e),Jb=[{identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify:yi},{identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:yi},{identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:e=>e==="true",stringify:yi},{identify:Jp,default:!0,tag:"tag:yaml.org,2002:int",test:/^-?(?:0|[1-9][0-9]*)$/,resolve:(e,t,{intAsBigInt:n})=>n?BigInt(e):parseInt(e,10),stringify:({value:e})=>Jp(e)?e.toString():JSON.stringify(e)},{identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:e=>parseFloat(e),stringify:yi}],Xb={default:!0,tag:"",test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}},Xp=[Be,Ue].concat(Jb,Xb);var _r={identify:e=>e instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(e,t){if(typeof atob=="function"){let n=atob(e.replace(/[\n\r]/g,"")),r=new Uint8Array(n.length);for(let s=0;s<n.length;++s)r[s]=n.charCodeAt(s);return r}else return t("This environment does not support reading binary tags; either Buffer or atob is required"),e},stringify({comment:e,type:t,value:n},r,s,i){if(!n)return"";let o=n,a;if(typeof btoa=="function"){let l="";for(let c=0;c<o.length;++c)l+=String.fromCharCode(o[c]);a=btoa(l)}else throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required");if(t??(t=O.BLOCK_LITERAL),t!==O.QUOTE_DOUBLE){let l=Math.max(r.options.lineWidth-r.indent.length,r.options.minContentWidth),c=Math.ceil(a.length/l),u=new Array(c);for(let d=0,p=0;d<c;++d,p+=l)u[d]=a.substr(p,l);a=u.join(t===O.BLOCK_LITERAL?`
134
+ `:" ")}return un({comment:e,type:t,value:a},r,s,i)}};function bl(e,t){if(qe(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!j(r)){if(Fe(r)){r.items.length>1&&t("Each pair must have its own sequence indicator");let s=r.items[0]||new X(new O(null));if(r.commentBefore&&(s.key.commentBefore=s.key.commentBefore?`${r.commentBefore}
135
+ ${s.key.commentBefore}`:r.commentBefore),r.comment){let i=s.value??s.key;i.comment=i.comment?`${r.comment}
136
+ ${i.comment}`:r.comment}r=s}e.items[n]=j(r)?r:new X(r)}}else t("Expected a sequence for this tag");return e}function Rl(e,t,n){let{replacer:r}=n,s=new me(e);s.tag="tag:yaml.org,2002:pairs";let i=0;if(t&&Symbol.iterator in Object(t))for(let o of t){typeof r=="function"&&(o=r.call(t,String(i++),o));let a,l;if(Array.isArray(o))if(o.length===2)a=o[0],l=o[1];else throw new TypeError(`Expected [key, value] tuple: ${o}`);else if(o&&o instanceof Object){let c=Object.keys(o);if(c.length===1)a=c[0],l=o[a];else throw new TypeError(`Expected tuple with one key, not ${c.length} keys`)}else a=o;s.items.push(Un(a,l,n))}return s}var Lr={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:bl,createNode:Rl};var Kn=class e extends me{constructor(){super(),this.add=ee.prototype.add.bind(this),this.delete=ee.prototype.delete.bind(this),this.get=ee.prototype.get.bind(this),this.has=ee.prototype.has.bind(this),this.set=ee.prototype.set.bind(this),this.tag=e.tag}toJSON(t,n){if(!n)return super.toJSON(t);let r=new Map;n?.onCreate&&n.onCreate(r);for(let s of this.items){let i,o;if(j(s)?(i=ie(s.key,"",n),o=ie(s.value,i,n)):i=ie(s,"",n),r.has(i))throw new Error("Ordered maps must not include duplicate keys");r.set(i,o)}return r}static from(t,n,r){let s=Rl(t,n,r),i=new this;return i.items=s.items,i}};Kn.tag="tag:yaml.org,2002:omap";var Mr={collection:"seq",identify:e=>e instanceof Map,nodeClass:Kn,default:!1,tag:"tag:yaml.org,2002:omap",resolve(e,t){let n=bl(e,t),r=[];for(let{key:s}of n.items)N(s)&&(r.includes(s.value)?t(`Ordered maps must not include duplicate keys: ${s.value}`):r.push(s.value));return Object.assign(new Kn,n)},createNode:(e,t,n)=>Kn.from(e,t,n)};function Qp({value:e,source:t},n){return t&&(e?Sl:Pl).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}var Sl={identify:e=>e===!0,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new O(!0),stringify:Qp},Pl={identify:e=>e===!1,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new O(!1),stringify:Qp};var Zp={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:e=>e.slice(-3).toLowerCase()==="nan"?NaN:e[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:he},ef={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:e=>parseFloat(e.replace(/_/g,"")),stringify(e){let t=Number(e.value);return isFinite(t)?t.toExponential():he(e)}},tf={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(e){let t=new O(parseFloat(e.replace(/_/g,""))),n=e.indexOf(".");if(n!==-1){let r=e.substring(n+1).replace(/_/g,"");r[r.length-1]==="0"&&(t.minFractionDigits=r.length)}return t},stringify:he};var jr=e=>typeof e=="bigint"||Number.isInteger(e);function wi(e,t,n,{intAsBigInt:r}){let s=e[0];if((s==="-"||s==="+")&&(t+=1),e=e.substring(t).replace(/_/g,""),r){switch(n){case 2:e=`0b${e}`;break;case 8:e=`0o${e}`;break;case 16:e=`0x${e}`;break}let o=BigInt(e);return s==="-"?BigInt(-1)*o:o}let i=parseInt(e,n);return s==="-"?-1*i:i}function Il(e,t,n){let{value:r}=e;if(jr(r)){let s=r.toString(t);return r<0?"-"+n+s.substr(1):n+s}return he(e)}var nf={identify:jr,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>wi(e,2,2,n),stringify:e=>Il(e,2,"0b")},rf={identify:jr,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>wi(e,1,8,n),stringify:e=>Il(e,8,"0")},sf={identify:jr,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>wi(e,0,10,n),stringify:he},of={identify:jr,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>wi(e,2,16,n),stringify:e=>Il(e,16,"0x")};var Vn=class e extends ee{constructor(t){super(t),this.tag=e.tag}add(t){let n;j(t)?n=t:t&&typeof t=="object"&&"key"in t&&"value"in t&&t.value===null?n=new X(t.key,null):n=new X(t,null),jt(this.items,n.key)||this.items.push(n)}get(t,n){let r=jt(this.items,t);return!n&&j(r)?N(r.key)?r.key.value:r.key:r}set(t,n){if(typeof n!="boolean")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof n}`);let r=jt(this.items,t);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new X(t))}toJSON(t,n){return super.toJSON(t,n,Set)}toString(t,n,r){if(!t)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},t,{allNullValues:!0}),n,r);throw new Error("Set items must all have null values")}static from(t,n,r){let{replacer:s}=r,i=new this(t);if(n&&Symbol.iterator in Object(n))for(let o of n)typeof s=="function"&&(o=s.call(n,o,o)),i.items.push(Un(o,null,r));return i}};Vn.tag="tag:yaml.org,2002:set";var Fr={collection:"map",identify:e=>e instanceof Set,nodeClass:Vn,default:!1,tag:"tag:yaml.org,2002:set",createNode:(e,t,n)=>Vn.from(e,t,n),resolve(e,t){if(Fe(e)){if(e.hasAllNullValues(!0))return Object.assign(new Vn,e);t("Set items must all have null values")}else t("Expected a mapping for this tag");return e}};function vl(e,t){let n=e[0],r=n==="-"||n==="+"?e.substring(1):e,s=o=>t?BigInt(o):Number(o),i=r.replace(/_/g,"").split(":").reduce((o,a)=>o*s(60)+s(a),s(0));return n==="-"?s(-1)*i:i}function af(e){let{value:t}=e,n=o=>o;if(typeof t=="bigint")n=o=>BigInt(o);else if(isNaN(t)||!isFinite(t))return he(e);let r="";t<0&&(r="-",t*=n(-1));let s=n(60),i=[t%s];return t<60?i.unshift(0):(t=(t-i[0])/s,i.unshift(t%s),t>=60&&(t=(t-i[0])/s,i.unshift(t))),r+i.map(o=>String(o).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}var ki={identify:e=>typeof e=="bigint"||Number.isInteger(e),default:!0,tag:"tag:yaml.org,2002:int",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:(e,t,{intAsBigInt:n})=>vl(e,n),stringify:af},Ti={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,resolve:e=>vl(e,!1),stringify:af},Gn={identify:e=>e instanceof Date,default:!0,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(e){let t=e.match(Gn.test);if(!t)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,n,r,s,i,o,a]=t.map(Number),l=t[7]?Number((t[7]+"00").substr(1,3)):0,c=Date.UTC(n,r-1,s,i||0,o||0,a||0,l),u=t[8];if(u&&u!=="Z"){let d=vl(u,!1);Math.abs(d)<30&&(d*=60),c-=6e4*d}return new Date(c)},stringify:({value:e})=>e?.toISOString().replace(/(T00:00:00)?\.000Z$/,"")??""};var Cl=[Be,Ue,Ft,pn,Sl,Pl,nf,rf,sf,of,Zp,ef,tf,_r,We,Mr,Lr,Fr,ki,Ti,Gn];var lf=new Map([["core",Yp],["failsafe",[Be,Ue,Ft]],["json",Xp],["yaml11",Cl],["yaml-1.1",Cl]]),cf={binary:_r,bool:Nr,float:pi,floatExp:ui,floatNaN:di,floatTime:Ti,int:hi,intHex:gi,intOct:mi,intTime:ki,map:Be,merge:We,null:pn,omap:Mr,pairs:Lr,seq:Ue,set:Fr,timestamp:Gn},df={"tag:yaml.org,2002:binary":_r,"tag:yaml.org,2002:merge":We,"tag:yaml.org,2002:omap":Mr,"tag:yaml.org,2002:pairs":Lr,"tag:yaml.org,2002:set":Fr,"tag:yaml.org,2002:timestamp":Gn};function bi(e,t,n){let r=lf.get(t);if(r&&!e)return n&&!r.includes(We)?r.concat(We):r.slice();let s=r;if(!s)if(Array.isArray(e))s=[];else{let i=Array.from(lf.keys()).filter(o=>o!=="yaml11").map(o=>JSON.stringify(o)).join(", ");throw new Error(`Unknown schema "${t}"; use one of ${i} or define customTags array`)}if(Array.isArray(e))for(let i of e)s=s.concat(i);else typeof e=="function"&&(s=e(s.slice()));return n&&(s=s.concat(We)),s.reduce((i,o)=>{let a=typeof o=="string"?cf[o]:o;if(!a){let l=JSON.stringify(o),c=Object.keys(cf).map(u=>JSON.stringify(u)).join(", ");throw new Error(`Unknown custom tag ${l}; use one of ${c}`)}return i.includes(a)||i.push(a),i},[])}var Qb=(e,t)=>e.key<t.key?-1:e.key>t.key?1:0,qr=class e{constructor({compat:t,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(t)?bi(t,"compat"):t?bi(null,t):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?df:{},this.tags=bi(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,je,{value:Be}),Object.defineProperty(this,Ce,{value:Ft}),Object.defineProperty(this,yt,{value:Ue}),this.sortMapEntries=typeof o=="function"?o:o===!0?Qb:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function uf(e,t){let n=[],r=t.directives===!0;if(t.directives!==!1&&e.directives){let l=e.directives.toString(e);l?(n.push(l),r=!0):e.directives.docStart&&(r=!0)}r&&n.push("---");let s=si(e,t),{commentString:i}=s.options;if(e.commentBefore){n.length!==1&&n.unshift("");let l=i(e.commentBefore);n.unshift(Le(l,""))}let o=!1,a=null;if(e.contents){if(F(e.contents)){if(e.contents.spaceBefore&&r&&n.push(""),e.contents.commentBefore){let u=i(e.contents.commentBefore);n.push(Le(u,""))}s.forceBlockIndent=!!e.comment,a=e.contents.comment}let l=a?void 0:()=>o=!0,c=Tt(e.contents,s,()=>a=null,l);a&&(c+=tt(c,"",i(a))),(c[0]==="|"||c[0]===">")&&n[n.length-1]==="---"?n[n.length-1]=`--- ${c}`:n.push(c)}else n.push(Tt(e.contents,s));if(e.directives?.docEnd)if(e.comment){let l=i(e.comment);l.includes(`
137
+ `)?(n.push("..."),n.push(Le(l,""))):n.push(`... ${l}`)}else n.push("...");else{let l=e.comment;l&&o&&(l=l.replace(/^\n+/,"")),l&&((!o||a)&&n[n.length-1]!==""&&n.push(""),n.push(Le(i(l),"")))}return n.join(`
138
+ `)+`
139
+ `}var qt=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,ye,{value:zs});let s=null;typeof n=="function"||Array.isArray(n)?s=n:r===void 0&&n&&(r=n,n=void 0);let i=Object.assign({intAsBigInt:!1,keepSourceTokens:!1,logLevel:"warn",prettyErrors:!0,strict:!0,stringKeys:!1,uniqueKeys:!0,version:"1.2"},r);this.options=i;let{version:o}=i;r?._directives?(this.directives=r._directives.atDocument(),this.directives.yaml.explicit&&(o=this.directives.yaml.version)):this.directives=new et({version:o}),this.setSchema(o,r),this.contents=t===void 0?null:this.createNode(t,s,r)}clone(){let t=Object.create(e.prototype,{[ye]:{value:zs}});return t.commentBefore=this.commentBefore,t.comment=this.comment,t.errors=this.errors.slice(),t.warnings=this.warnings.slice(),t.options=Object.assign({},this.options),this.directives&&(t.directives=this.directives.clone()),t.schema=this.schema.clone(),t.contents=F(this.contents)?this.contents.clone(t.schema):this.contents,this.range&&(t.range=this.range.slice()),t}add(t){Hn(this.contents)&&this.contents.add(t)}addIn(t,n){Hn(this.contents)&&this.contents.addIn(t,n)}createAlias(t,n){if(!t.anchor){let r=pl(this);t.anchor=!n||r.has(n)?fl(n||"a",r):n}return new wt(t.anchor)}createNode(t,n,r){let s;if(typeof n=="function")t=n.call({"":t},"",t),s=n;else if(Array.isArray(n)){let g=R=>typeof R=="number"||R instanceof String||R instanceof Number,T=n.filter(g).map(String);T.length>0&&(n=n.concat(T)),s=n}else r===void 0&&n&&(r=n,n=void 0);let{aliasDuplicateObjects:i,anchorPrefix:o,flow:a,keepUndefined:l,onTagObj:c,tag:u}=r??{},{onAnchor:d,setAnchors:p,sourceObjects:h}=Bp(this,o||"a"),f={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:d,onTagObj:c,replacer:s,schema:this.schema,sourceObjects:h},m=kt(t,u,f);return a&&W(m)&&(m.flow=!0),p(),m}createPair(t,n,r={}){let s=this.createNode(t,null,r),i=this.createNode(n,null,r);return new X(s,i)}delete(t){return Hn(this.contents)?this.contents.delete(t):!1}deleteIn(t){return Wn(t)?this.contents==null?!1:(this.contents=null,!0):Hn(this.contents)?this.contents.deleteIn(t):!1}get(t,n){return W(this.contents)?this.contents.get(t,n):void 0}getIn(t,n){return Wn(t)?!n&&N(this.contents)?this.contents.value:this.contents:W(this.contents)?this.contents.getIn(t,n):void 0}has(t){return W(this.contents)?this.contents.has(t):!1}hasIn(t){return Wn(t)?this.contents!==void 0:W(this.contents)?this.contents.hasIn(t):!1}set(t,n){this.contents==null?this.contents=Or(this.schema,[t],n):Hn(this.contents)&&this.contents.set(t,n)}setIn(t,n){Wn(t)?this.contents=n:this.contents==null?this.contents=Or(this.schema,Array.from(t),n):Hn(this.contents)&&this.contents.setIn(t,n)}setSchema(t,n={}){typeof t=="number"&&(t=String(t));let r;switch(t){case"1.1":this.directives?this.directives.yaml.version="1.1":this.directives=new et({version:"1.1"}),r={resolveKnownTags:!1,schema:"yaml-1.1"};break;case"1.2":case"next":this.directives?this.directives.yaml.version=t:this.directives=new et({version:t}),r={resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,r=null;break;default:{let s=JSON.stringify(t);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${s}`)}}if(n.schema instanceof Object)this.schema=n.schema;else if(r)this.schema=new qr(Object.assign(r,n));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:t,jsonArg:n,mapAsMap:r,maxAliasCount:s,onAnchor:i,reviver:o}={}){let a={anchors:new Map,doc:this,keep:!t,mapAsMap:r===!0,mapKeyWarned:!1,maxAliasCount:typeof s=="number"?s:100},l=ie(this.contents,n??"",a);if(typeof i=="function")for(let{count:c,res:u}of a.anchors.values())i(u,c);return typeof o=="function"?Lt(o,{"":l},"",l):l}toJSON(t,n){return this.toJS({json:!0,jsonArg:t,mapAsMap:!1,onAnchor:n})}toString(t={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in t&&(!Number.isInteger(t.indent)||Number(t.indent)<=0)){let n=JSON.stringify(t.indent);throw new Error(`"indent" option must be a positive integer, not ${n}`)}return uf(this,t)}};function Hn(e){if(W(e))return!0;throw new Error("Expected a YAML collection as document contents")}var Wr=class extends Error{constructor(t,n,r,s){super(),this.name=t,this.code=r,this.message=s,this.pos=n}},Ke=class extends Wr{constructor(t,n,r){super("YAMLParseError",t,n,r)}},Br=class extends Wr{constructor(t,n,r){super("YAMLWarning",t,n,r)}},Al=(e,t)=>n=>{if(n.pos[0]===-1)return;n.linePos=n.pos.map(a=>t.linePos(a));let{line:r,col:s}=n.linePos[0];n.message+=` at line ${r}, column ${s}`;let i=s-1,o=e.substring(t.lineStarts[r-1],t.lineStarts[r]).replace(/[\n\r]+$/,"");if(i>=60&&o.length>80){let a=Math.min(i-39,o.length-79);o="\u2026"+o.substring(a),i-=a-1}if(o.length>80&&(o=o.substring(0,79)+"\u2026"),r>1&&/^ *$/.test(o.substring(0,i))){let a=e.substring(t.lineStarts[r-2],t.lineStarts[r-1]);a.length>80&&(a=a.substring(0,79)+`\u2026
140
+ `),o=a+o}if(/[^ ]/.test(o)){let a=1,l=n.linePos[1];l?.line===r&&l.col>s&&(a=Math.max(1,Math.min(l.col-s,80-i)));let c=" ".repeat(i)+"^".repeat(a);n.message+=`:
141
+
142
+ ${o}
143
+ ${c}
144
+ `}};function nt(e,{flow:t,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let l=!1,c=a,u=a,d="",p="",h=!1,f=!1,m=null,g=null,T=null,R=null,I=null,b=null,x=null;for(let v of e)switch(f&&(v.type!=="space"&&v.type!=="newline"&&v.type!=="comma"&&i(v.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),f=!1),m&&(c&&v.type!=="comment"&&v.type!=="newline"&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),m=null),v.type){case"space":!t&&(n!=="doc-start"||r?.type!=="flow-collection")&&v.source.includes(" ")&&(m=v),u=!0;break;case"comment":{u||i(v,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let w=v.source.substring(1)||" ";d?d+=p+w:d=w,p="",c=!1;break}case"newline":c?d?d+=v.source:(!b||n!=="seq-item-ind")&&(l=!0):p+=v.source,c=!0,h=!0,(g||T)&&(R=v),u=!0;break;case"anchor":g&&i(v,"MULTIPLE_ANCHORS","A node can have at most one anchor"),v.source.endsWith(":")&&i(v.offset+v.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),g=v,x??(x=v.offset),c=!1,u=!1,f=!0;break;case"tag":{T&&i(v,"MULTIPLE_TAGS","A node can have at most one tag"),T=v,x??(x=v.offset),c=!1,u=!1,f=!0;break}case n:(g||T)&&i(v,"BAD_PROP_ORDER",`Anchors and tags must be after the ${v.source} indicator`),b&&i(v,"UNEXPECTED_TOKEN",`Unexpected ${v.source} in ${t??"collection"}`),b=v,c=n==="seq-item-ind"||n==="explicit-key-ind",u=!1;break;case"comma":if(t){I&&i(v,"UNEXPECTED_TOKEN",`Unexpected , in ${t}`),I=v,c=!1,u=!1;break}default:i(v,"UNEXPECTED_TOKEN",`Unexpected ${v.type} token`),c=!1,u=!1}let $=e[e.length-1],_=$?$.offset+$.source.length:s;return f&&r&&r.type!=="space"&&r.type!=="newline"&&r.type!=="comma"&&(r.type!=="scalar"||r.source!=="")&&i(r.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),m&&(c&&m.indent<=o||r?.type==="block-map"||r?.type==="block-seq")&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:I,found:b,spaceBefore:l,comment:d,hasNewline:h,anchor:g,tag:T,newlineAfterProp:R,end:_,start:x??_}}function Wt(e){if(!e)return null;switch(e.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(e.source.includes(`
145
+ `))return!0;if(e.end){for(let t of e.end)if(t.type==="newline")return!0}return!1;case"flow-collection":for(let t of e.items){for(let n of t.start)if(n.type==="newline")return!0;if(t.sep){for(let n of t.sep)if(n.type==="newline")return!0}if(Wt(t.key)||Wt(t.value))return!0}return!1;default:return!0}}function Ur(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&Wt(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function Ri(e,t,n){let{uniqueKeys:r}=e.options;if(r===!1)return!1;let s=typeof r=="function"?r:(i,o)=>i===o||N(i)&&N(o)&&i.value===o.value;return t.some(i=>s(i.key,n))}var pf="All mapping items must start at the same column";function ff({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??ee,a=new o(n.schema);n.atRoot&&(n.atRoot=!1);let l=r.offset,c=null;for(let u of r.items){let{start:d,key:p,sep:h,value:f}=u,m=nt(d,{indicator:"explicit-key-ind",next:p??h?.[0],offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0}),g=!m.found;if(g){if(p&&(p.type==="block-seq"?s(l,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in p&&p.indent!==r.indent&&s(l,"BAD_INDENT",pf)),!m.anchor&&!m.tag&&!h){c=m.end,m.comment&&(a.comment?a.comment+=`
146
+ `+m.comment:a.comment=m.comment);continue}(m.newlineAfterProp||Wt(p))&&s(p??d[d.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else m.found?.indent!==r.indent&&s(l,"BAD_INDENT",pf);n.atKey=!0;let T=m.end,R=p?e(n,p,m,s):t(n,T,d,null,m,s);n.schema.compat&&Ur(r.indent,p,s),n.atKey=!1,Ri(n,a.items,R)&&s(T,"DUPLICATE_KEY","Map keys must be unique");let I=nt(h??[],{indicator:"map-value-ind",next:f,offset:R.range[2],onError:s,parentIndent:r.indent,startOnNewline:!p||p.type==="block-scalar"});if(l=I.end,I.found){g&&(f?.type==="block-map"&&!I.hasNewline&&s(l,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),n.options.strict&&m.start<I.found.offset-1024&&s(R.range,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit block mapping key"));let b=f?e(n,f,I,s):t(n,l,h,null,I,s);n.schema.compat&&Ur(r.indent,f,s),l=b.range[2];let x=new X(R,b);n.options.keepSourceTokens&&(x.srcToken=u),a.items.push(x)}else{g&&s(R.range,"MISSING_CHAR","Implicit map keys need to be followed by map values"),I.comment&&(R.comment?R.comment+=`
147
+ `+I.comment:R.comment=I.comment);let b=new X(R);n.options.keepSourceTokens&&(b.srcToken=u),a.items.push(b)}}return c&&c<l&&s(c,"IMPOSSIBLE","Map comment with trailing content"),a.range=[r.offset,l,c??l],a}function mf({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??me,a=new o(n.schema);n.atRoot&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let l=r.offset,c=null;for(let{start:u,value:d}of r.items){let p=nt(u,{indicator:"seq-item-ind",next:d,offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0});if(!p.found)if(p.anchor||p.tag||d)d?.type==="block-seq"?s(p.end,"BAD_INDENT","All sequence items must start at the same column"):s(l,"MISSING_CHAR","Sequence item without - indicator");else{c=p.end,p.comment&&(a.comment=p.comment);continue}let h=d?e(n,d,p,s):t(n,p.end,u,null,p,s);n.schema.compat&&Ur(r.indent,d,s),l=h.range[2],a.items.push(h)}return a.range=[r.offset,l,c??l],a}function rt(e,t,n,r){let s="";if(e){let i=!1,o="";for(let a of e){let{source:l,type:c}=a;switch(c){case"space":i=!0;break;case"comment":{n&&!i&&r(a,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let u=l.substring(1)||" ";s?s+=o+u:s=u,o="";break}case"newline":s&&(o+=l),i=!0;break;default:r(a,"UNEXPECTED_TOKEN",`Unexpected ${c} at node end`)}t+=l.length}}return{comment:s,offset:t}}var El="Block collections are not allowed within flow collections",Ol=e=>e&&(e.type==="block-map"||e.type==="block-seq");function hf({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",l=i?.nodeClass??(o?ee:me),c=new l(n.schema);c.flow=!0;let u=n.atRoot;u&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let d=r.offset+r.start.source.length;for(let g=0;g<r.items.length;++g){let T=r.items[g],{start:R,key:I,sep:b,value:x}=T,$=nt(R,{flow:a,indicator:"explicit-key-ind",next:I??b?.[0],offset:d,onError:s,parentIndent:r.indent,startOnNewline:!1});if(!$.found){if(!$.anchor&&!$.tag&&!b&&!x){g===0&&$.comma?s($.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`):g<r.items.length-1&&s($.start,"UNEXPECTED_TOKEN",`Unexpected empty item in ${a}`),$.comment&&(c.comment?c.comment+=`
148
+ `+$.comment:c.comment=$.comment),d=$.end;continue}!o&&n.options.strict&&Wt(I)&&s(I,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line")}if(g===0)$.comma&&s($.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`);else if($.comma||s($.start,"MISSING_CHAR",`Missing , between ${a} items`),$.comment){let _="";e:for(let v of R)switch(v.type){case"comma":case"space":break;case"comment":_=v.source.substring(1);break e;default:break e}if(_){let v=c.items[c.items.length-1];j(v)&&(v=v.value??v.key),v.comment?v.comment+=`
149
+ `+_:v.comment=_,$.comment=$.comment.substring(_.length+1)}}if(!o&&!b&&!$.found){let _=x?e(n,x,$,s):t(n,$.end,b,null,$,s);c.items.push(_),d=_.range[2],Ol(x)&&s(_.range,"BLOCK_IN_FLOW",El)}else{n.atKey=!0;let _=$.end,v=I?e(n,I,$,s):t(n,_,R,null,$,s);Ol(I)&&s(v.range,"BLOCK_IN_FLOW",El),n.atKey=!1;let w=nt(b??[],{flow:a,indicator:"map-value-ind",next:x,offset:v.range[2],onError:s,parentIndent:r.indent,startOnNewline:!1});if(w.found){if(!o&&!$.found&&n.options.strict){if(b)for(let z of b){if(z===w.found)break;if(z.type==="newline"){s(z,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}$.start<w.found.offset-1024&&s(w.found,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit flow sequence key")}}else x&&("source"in x&&x.source?.[0]===":"?s(x,"MISSING_CHAR",`Missing space after : in ${a}`):s(w.start,"MISSING_CHAR",`Missing , or : between ${a} items`));let ue=x?e(n,x,w,s):w.found?t(n,w.end,b,null,w,s):null;ue?Ol(x)&&s(ue.range,"BLOCK_IN_FLOW",El):w.comment&&(v.comment?v.comment+=`
150
+ `+w.comment:v.comment=w.comment);let pe=new X(v,ue);if(n.options.keepSourceTokens&&(pe.srcToken=T),o){let z=c;Ri(n,z.items,v)&&s(_,"DUPLICATE_KEY","Map keys must be unique"),z.items.push(pe)}else{let z=new ee(n.schema);z.flow=!0,z.items.push(pe);let Jt=(ue??v).range;z.range=[v.range[0],Jt[1],Jt[2]],c.items.push(z)}d=ue?ue.range[2]:w.end}}let p=o?"}":"]",[h,...f]=r.end,m=d;if(h?.source===p)m=h.offset+h.source.length;else{let g=a[0].toUpperCase()+a.substring(1),T=u?`${g} must end with a ${p}`:`${g} in block collection must be sufficiently indented and end with a ${p}`;s(d,u?"MISSING_CHAR":"BAD_INDENT",T),h&&h.source.length!==1&&f.unshift(h)}if(f.length>0){let g=rt(f,m,n.options.strict,s);g.comment&&(c.comment?c.comment+=`
151
+ `+g.comment:c.comment=g.comment),c.range=[r.offset,m,g.offset]}else c.range=[r.offset,m,m];return c}function xl(e,t,n,r,s,i){let o=n.type==="block-map"?ff(e,t,n,r,i):n.type==="block-seq"?mf(e,t,n,r,i):hf(e,t,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function gf(e,t,n,r,s){let i=r.tag,o=i?t.directives.tagName(i.source,p=>s(i,"TAG_RESOLVE_FAILED",p)):null;if(n.type==="block-seq"){let{anchor:p,newlineAfterProp:h}=r,f=p&&i?p.offset>i.offset?p:i:p??i;f&&(!h||h.offset<f.offset)&&s(f,"MISSING_CHAR","Missing newline after block sequence props")}let a=n.type==="block-map"?"map":n.type==="block-seq"?"seq":n.start.source==="{"?"map":"seq";if(!i||!o||o==="!"||o===ee.tagName&&a==="map"||o===me.tagName&&a==="seq")return xl(e,t,n,s,o);let l=t.schema.tags.find(p=>p.tag===o&&p.collection===a);if(!l){let p=t.schema.knownTags[o];if(p?.collection===a)t.schema.tags.push(Object.assign({},p,{default:!1})),l=p;else return p?s(i,"BAD_COLLECTION_TYPE",`${p.tag} used for ${a} collection, but expects ${p.collection??"scalar"}`,!0):s(i,"TAG_RESOLVE_FAILED",`Unresolved tag: ${o}`,!0),xl(e,t,n,s,o)}let c=xl(e,t,n,s,o,l),u=l.resolve?.(c,p=>s(i,"TAG_RESOLVE_FAILED",p),t.options)??c,d=F(u)?u:new O(u);return d.range=c.range,d.tag=o,l?.format&&(d.format=l.format),d}function $l(e,t,n){let r=t.offset,s=Zb(t,e.options.strict,n);if(!s)return{value:"",type:null,comment:"",range:[r,r,r]};let i=s.mode===">"?O.BLOCK_FOLDED:O.BLOCK_LITERAL,o=t.source?eR(t.source):[],a=o.length;for(let m=o.length-1;m>=0;--m){let g=o[m][1];if(g===""||g==="\r")a=m;else break}if(a===0){let m=s.chomp==="+"&&o.length>0?`
152
+ `.repeat(Math.max(1,o.length-1)):"",g=r+s.length;return t.source&&(g+=t.source.length),{value:m,type:i,comment:s.comment,range:[r,g,g]}}let l=t.indent+s.indent,c=t.offset+s.length,u=0;for(let m=0;m<a;++m){let[g,T]=o[m];if(T===""||T==="\r")s.indent===0&&g.length>l&&(l=g.length);else{g.length<l&&n(c+g.length,"MISSING_CHAR","Block scalars with more-indented leading empty lines must use an explicit indentation indicator"),s.indent===0&&(l=g.length),u=m,l===0&&!e.atRoot&&n(c,"BAD_INDENT","Block scalar values in collections must be indented");break}c+=g.length+T.length+1}for(let m=o.length-1;m>=a;--m)o[m][0].length>l&&(a=m+1);let d="",p="",h=!1;for(let m=0;m<u;++m)d+=o[m][0].slice(l)+`
153
+ `;for(let m=u;m<a;++m){let[g,T]=o[m];c+=g.length+T.length+1;let R=T[T.length-1]==="\r";if(R&&(T=T.slice(0,-1)),T&&g.length<l){let b=`Block scalar lines must not be less indented than their ${s.indent?"explicit indentation indicator":"first line"}`;n(c-T.length-(R?2:1),"BAD_INDENT",b),g=""}i===O.BLOCK_LITERAL?(d+=p+g.slice(l)+T,p=`
154
+ `):g.length>l||T[0]===" "?(p===" "?p=`
155
+ `:!h&&p===`
156
+ `&&(p=`
157
+
158
+ `),d+=p+g.slice(l)+T,p=`
159
+ `,h=!0):T===""?p===`
160
+ `?d+=`
161
+ `:p=`
162
+ `:(d+=p+T,p=" ",h=!1)}switch(s.chomp){case"-":break;case"+":for(let m=a;m<o.length;++m)d+=`
163
+ `+o[m][0].slice(l);d[d.length-1]!==`
164
+ `&&(d+=`
165
+ `);break;default:d+=`
166
+ `}let f=r+s.length+t.source.length;return{value:d,type:i,comment:s.comment,range:[r,f,f]}}function Zb({offset:e,props:t},n,r){if(t[0].type!=="block-scalar-header")return r(t[0],"IMPOSSIBLE","Block scalar header not found"),null;let{source:s}=t[0],i=s[0],o=0,a="",l=-1;for(let p=1;p<s.length;++p){let h=s[p];if(!a&&(h==="-"||h==="+"))a=h;else{let f=Number(h);!o&&f?o=f:l===-1&&(l=e+p)}}l!==-1&&r(l,"UNEXPECTED_TOKEN",`Block scalar header includes extra characters: ${s}`);let c=!1,u="",d=s.length;for(let p=1;p<t.length;++p){let h=t[p];switch(h.type){case"space":c=!0;case"newline":d+=h.source.length;break;case"comment":n&&!c&&r(h,"MISSING_CHAR","Comments must be separated from other tokens by white space characters"),d+=h.source.length,u=h.source.substring(1);break;case"error":r(h,"UNEXPECTED_TOKEN",h.message),d+=h.source.length;break;default:{let f=`Unexpected token in block scalar header: ${h.type}`;r(h,"UNEXPECTED_TOKEN",f);let m=h.source;m&&typeof m=="string"&&(d+=m.length)}}}return{mode:i,indent:o,chomp:a,comment:u,length:d}}function eR(e){let t=e.split(/\n( *)/),n=t[0],r=n.match(/^( *)/),i=[r?.[1]?[r[1],n.slice(r[1].length)]:["",n]];for(let o=1;o<t.length;o+=2)i.push([t[o],t[o+1]]);return i}function Dl(e,t,n){let{offset:r,type:s,source:i,end:o}=e,a,l,c=(p,h,f)=>n(r+p,h,f);switch(s){case"scalar":a=O.PLAIN,l=tR(i,c);break;case"single-quoted-scalar":a=O.QUOTE_SINGLE,l=nR(i,c);break;case"double-quoted-scalar":a=O.QUOTE_DOUBLE,l=rR(i,c);break;default:return n(e,"UNEXPECTED_TOKEN",`Expected a flow scalar value, but found: ${s}`),{value:"",type:null,comment:"",range:[r,r+i.length,r+i.length]}}let u=r+i.length,d=rt(o,u,t,n);return{value:l,type:a,comment:d.comment,range:[r,u,d.offset]}}function tR(e,t){let n="";switch(e[0]){case" ":n="a tab character";break;case",":n="flow indicator character ,";break;case"%":n="directive indicator character %";break;case"|":case">":{n=`block scalar indicator ${e[0]}`;break}case"@":case"`":{n=`reserved character ${e[0]}`;break}}return n&&t(0,"BAD_SCALAR_START",`Plain value cannot start with ${n}`),yf(e)}function nR(e,t){return(e[e.length-1]!=="'"||e.length===1)&&t(e.length,"MISSING_CHAR","Missing closing 'quote"),yf(e.slice(1,-1)).replace(/''/g,"'")}function yf(e){let t,n;try{t=new RegExp(`(.*?)(?<![ ])[ ]*\r?
167
+ `,"sy"),n=new RegExp(`[ ]*(.*?)(?:(?<![ ])[ ]*)?\r?
168
+ `,"sy")}catch{t=/(.*?)[ \t]*\r?\n/sy,n=/[ \t]*(.*?)[ \t]*\r?\n/sy}let r=t.exec(e);if(!r)return e;let s=r[1],i=" ",o=t.lastIndex;for(n.lastIndex=o;r=n.exec(e);)r[1]===""?i===`
169
+ `?s+=i:i=`
170
+ `:(s+=i+r[1],i=" "),o=n.lastIndex;let a=/[ \t]*(.*)/sy;return a.lastIndex=o,r=a.exec(e),s+i+(r?.[1]??"")}function rR(e,t){let n="";for(let r=1;r<e.length-1;++r){let s=e[r];if(!(s==="\r"&&e[r+1]===`
171
+ `))if(s===`
172
+ `){let{fold:i,offset:o}=sR(e,r);n+=i,r=o}else if(s==="\\"){let i=e[++r],o=iR[i];if(o)n+=o;else if(i===`
173
+ `)for(i=e[r+1];i===" "||i===" ";)i=e[++r+1];else if(i==="\r"&&e[r+1]===`
174
+ `)for(i=e[++r+1];i===" "||i===" ";)i=e[++r+1];else if(i==="x"||i==="u"||i==="U"){let a=i==="x"?2:i==="u"?4:8;n+=oR(e,r+1,a,t),r+=a}else{let a=e.substr(r-1,2);t(r-1,"BAD_DQ_ESCAPE",`Invalid escape sequence ${a}`),n+=a}}else if(s===" "||s===" "){let i=r,o=e[r+1];for(;o===" "||o===" ";)o=e[++r+1];o!==`
175
+ `&&!(o==="\r"&&e[r+2]===`
176
+ `)&&(n+=r>i?e.slice(i,r+1):s)}else n+=s}return(e[e.length-1]!=='"'||e.length===1)&&t(e.length,"MISSING_CHAR",'Missing closing "quote'),n}function sR(e,t){let n="",r=e[t+1];for(;(r===" "||r===" "||r===`
177
+ `||r==="\r")&&!(r==="\r"&&e[t+2]!==`
178
+ `);)r===`
179
+ `&&(n+=`
180
+ `),t+=1,r=e[t+1];return n||(n=" "),{fold:n,offset:t}}var iR={0:"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:`
181
+ `,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function oR(e,t,n,r){let s=e.substr(t,n),o=s.length===n&&/^[0-9a-fA-F]+$/.test(s)?parseInt(s,16):NaN;try{return String.fromCodePoint(o)}catch{let a=e.substr(t-2,n+2);return r(t-2,"BAD_DQ_ESCAPE",`Invalid escape sequence ${a}`),a}}function Nl(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?$l(e,t,r):Dl(t,e.options.strict,r),l=n?e.directives.tagName(n.source,d=>r(n,"TAG_RESOLVE_FAILED",d)):null,c;e.options.stringKeys&&e.atKey?c=e.schema[Ce]:l?c=aR(e.schema,s,l,n,r):t.type==="scalar"?c=lR(e,s,t,r):c=e.schema[Ce];let u;try{let d=c.resolve(s,p=>r(n??t,"TAG_RESOLVE_FAILED",p),e.options);u=N(d)?d:new O(d)}catch(d){let p=d instanceof Error?d.message:String(d);r(n??t,"TAG_RESOLVE_FAILED",p),u=new O(s)}return u.range=a,u.source=s,i&&(u.type=i),l&&(u.tag=l),c.format&&(u.format=c.format),o&&(u.comment=o),u}function aR(e,t,n,r,s){if(n==="!")return e[Ce];let i=[];for(let a of e.tags)if(!a.collection&&a.tag===n)if(a.default&&a.test)i.push(a);else return a;for(let a of i)if(a.test?.test(t))return a;let o=e.knownTags[n];return o&&!o.collection?(e.tags.push(Object.assign({},o,{default:!1,test:void 0})),o):(s(r,"TAG_RESOLVE_FAILED",`Unresolved tag: ${n}`,n!=="tag:yaml.org,2002:str"),e[Ce])}function lR({atKey:e,directives:t,schema:n},r,s,i){let o=n.tags.find(a=>(a.default===!0||e&&a.default==="key")&&a.test?.test(r))||n[Ce];if(n.compat){let a=n.compat.find(l=>l.default&&l.test?.test(r))??n[Ce];if(o.tag!==a.tag){let l=t.tagString(o.tag),c=t.tagString(a.tag),u=`Value may be parsed as either ${l} or ${c}`;i(s,"TAG_RESOLVE_FAILED",u,!0)}}return o}function wf(e,t,n){if(t){n??(n=t.length);for(let r=n-1;r>=0;--r){let s=t[r];switch(s.type){case"space":case"comment":case"newline":e-=s.source.length;continue}for(s=t[++r];s?.type==="space";)e+=s.source.length,s=t[++r];break}}return e}var cR={composeNode:_l,composeEmptyNode:Si};function _l(e,t,n,r){let s=e.atKey,{spaceBefore:i,comment:o,anchor:a,tag:l}=n,c,u=!0;switch(t.type){case"alias":c=dR(e,t,r),(a||l)&&r(t,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":c=Nl(e,t,l,r),a&&(c.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{c=gf(cR,e,t,n,r),a&&(c.anchor=a.source.substring(1))}catch(d){let p=d instanceof Error?d.message:String(d);r(t,"RESOURCE_EXHAUSTION",p)}break;default:{let d=t.type==="error"?t.message:`Unsupported token (type: ${t.type})`;r(t,"UNEXPECTED_TOKEN",d),u=!1}}return c??(c=Si(e,t.offset,void 0,null,n,r)),a&&c.anchor===""&&r(a,"BAD_ALIAS","Anchor cannot be an empty string"),s&&e.options.stringKeys&&(!N(c)||typeof c.value!="string"||c.tag&&c.tag!=="tag:yaml.org,2002:str")&&r(l??t,"NON_STRING_KEY","With stringKeys, all keys must be strings"),i&&(c.spaceBefore=!0),o&&(t.type==="scalar"&&t.source===""?c.comment=o:c.commentBefore=o),e.options.keepSourceTokens&&u&&(c.srcToken=t),c}function Si(e,t,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:l},c){let u={type:"scalar",offset:wf(t,n,r),indent:-1,source:""},d=Nl(e,u,a,c);return o&&(d.anchor=o.source.substring(1),d.anchor===""&&c(o,"BAD_ALIAS","Anchor cannot be an empty string")),s&&(d.spaceBefore=!0),i&&(d.comment=i,d.range[2]=l),d}function dR({options:e},{offset:t,source:n,end:r},s){let i=new wt(n.substring(1));i.source===""&&s(t,"BAD_ALIAS","Alias cannot be an empty string"),i.source.endsWith(":")&&s(t+n.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let o=t+n.length,a=rt(r,o,e.strict,s);return i.range=[t,o,a.offset],a.comment&&(i.comment=a.comment),i}function kf(e,t,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:t},e),l=new qt(void 0,a),c={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},u=nt(r,{indicator:"doc-start",next:s??i?.[0],offset:n,onError:o,parentIndent:0,startOnNewline:!0});u.found&&(l.directives.docStart=!0,s&&(s.type==="block-map"||s.type==="block-seq")&&!u.hasNewline&&o(u.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),l.contents=s?_l(c,s,u,o):Si(c,u.end,r,null,u,o);let d=l.contents.range[2],p=rt(i,d,!1,o);return p.comment&&(l.comment=p.comment),l.range=[n,d,p.offset],l}function Kr(e){if(typeof e=="number")return[e,e+1];if(Array.isArray(e))return e.length===2?e:[e[0],e[1]];let{offset:t,source:n}=e;return[t,t+(typeof n=="string"?n.length:1)]}function Tf(e){let t="",n=!1,r=!1;for(let s=0;s<e.length;++s){let i=e[s];switch(i[0]){case"#":t+=(t===""?"":r?`
182
+
183
+ `:`
184
+ `)+(i.substring(1)||" "),n=!0,r=!1;break;case"%":e[s+1]?.[0]!=="#"&&(s+=1),n=!1;break;default:n||(r=!0),n=!1}}return{comment:t,afterEmptyLine:r}}var Vr=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=Kr(n);i?this.warnings.push(new Br(o,r,s)):this.errors.push(new Ke(o,r,s))},this.directives=new et({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=Tf(this.prelude);if(r){let i=t.contents;if(n)t.comment=t.comment?`${t.comment}
185
+ ${r}`:r;else if(s||t.directives.docStart||!i)t.commentBefore=r;else if(W(i)&&!i.flow&&i.items.length>0){let o=i.items[0];j(o)&&(o=o.key);let a=o.commentBefore;o.commentBefore=a?`${r}
186
+ ${a}`:r}else{let o=i.commentBefore;i.commentBefore=o?`${r}
187
+ ${o}`:r}}if(n){for(let i=0;i<this.errors.length;++i)t.errors.push(this.errors[i]);for(let i=0;i<this.warnings.length;++i)t.warnings.push(this.warnings[i])}else t.errors=this.errors,t.warnings=this.warnings;this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:Tf(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(t,n=!1,r=-1){for(let s of t)yield*this.next(s);yield*this.end(n,r)}*next(t){switch(t.type){case"directive":this.directives.add(t.source,(n,r,s)=>{let i=Kr(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=kf(this.options,this.directives,t,this.onError);this.atDirectives&&!n.directives.docStart&&this.onError(t,"MISSING_CHAR","Missing directives-end/doc-start indicator line"),this.decorate(n,!1),this.doc&&(yield this.doc),this.doc=n,this.atDirectives=!1;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(t.source);break;case"error":{let n=t.source?`${t.message}: ${JSON.stringify(t.source)}`:t.message,r=new Ke(Kr(t),"UNEXPECTED_TOKEN",n);this.atDirectives||!this.doc?this.errors.push(r):this.doc.errors.push(r);break}case"doc-end":{if(!this.doc){let r="Unexpected doc-end without preceding document";this.errors.push(new Ke(Kr(t),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=rt(t.end,t.offset+t.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),n.comment){let r=this.doc.comment;this.doc.comment=r?`${r}
188
+ ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.push(new Ke(Kr(t),"UNEXPECTED_TOKEN",`Unsupported token ${t.type}`))}}*end(t=!1,n=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(t){let r=Object.assign({_directives:this.directives},this.options),s=new qt(void 0,r);this.atDirectives&&this.onError(n,"MISSING_CHAR","Missing directives-end indicator line"),s.range=[0,n,n],this.decorate(s,!1),yield s}}};var Ll=Symbol("break visit"),uR=Symbol("skip children"),bf=Symbol("remove item");function fn(e,t){"type"in e&&e.type==="document"&&(e={start:e.start,value:e.value}),Rf(Object.freeze([]),e,t)}fn.BREAK=Ll;fn.SKIP=uR;fn.REMOVE=bf;fn.itemAtPath=(e,t)=>{let n=e;for(let[r,s]of t){let i=n?.[r];if(i&&"items"in i)n=i.items[s];else return}return n};fn.parentCollection=(e,t)=>{let n=fn.itemAtPath(e,t.slice(0,-1)),r=t[t.length-1][0],s=n?.[r];if(s&&"items"in s)return s;throw new Error("Parent collection not found")};function Rf(e,t,n){let r=n(t,e);if(typeof r=="symbol")return r;for(let s of["key","value"]){let i=t[s];if(i&&"items"in i){for(let o=0;o<i.items.length;++o){let a=Rf(Object.freeze(e.concat([[s,o]])),i.items[o],n);if(typeof a=="number")o=a-1;else{if(a===Ll)return Ll;a===bf&&(i.items.splice(o,1),o-=1)}}typeof r=="function"&&s==="key"&&(r=r(t,e))}}return typeof r=="function"?r(t,e):r}var Ml="\uFEFF",jl="",Fl="",Pi="";function Sf(e){switch(e){case Ml:return"byte-order-mark";case jl:return"doc-mode";case Fl:return"flow-error-end";case Pi:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case`
189
+ `:case`\r
190
+ `:return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(e[0]){case" ":case" ":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}function Ve(e){switch(e){case void 0:case" ":case`
191
+ `:case"\r":case" ":return!0;default:return!1}}var Pf=new Set("0123456789ABCDEFabcdef"),fR=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),Ii=new Set(",[]{}"),mR=new Set(` ,[]{}
192
+ \r `),ql=e=>!e||mR.has(e),Gr=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(t,n=!1){if(t){if(typeof t!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+t:t,this.lineEndPos=null}this.atEnd=!n;let r=this.next??"stream";for(;r&&(n||this.hasChars(1));)r=yield*this.parseNext(r)}atLineEnd(){let t=this.pos,n=this.buffer[t];for(;n===" "||n===" ";)n=this.buffer[++t];return!n||n==="#"||n===`
193
+ `?!0:n==="\r"?this.buffer[t+1]===`
194
+ `:!1}charAt(t){return this.buffer[this.pos+t]}continueScalar(t){let n=this.buffer[t];if(this.indentNext>0){let r=0;for(;n===" ";)n=this.buffer[++r+t];if(n==="\r"){let s=this.buffer[r+t+1];if(s===`
195
+ `||!s&&!this.atEnd)return t+r+1}return n===`
196
+ `||r>=this.indentNext||!n&&!this.atEnd?t+r:-1}if(n==="-"||n==="."){let r=this.buffer.substr(t,3);if((r==="---"||r==="...")&&Ve(this.buffer[t+3]))return-1}return t}getLine(){let t=this.lineEndPos;return(typeof t!="number"||t!==-1&&t<this.pos)&&(t=this.buffer.indexOf(`
197
+ `,this.pos),this.lineEndPos=t),t===-1?this.atEnd?this.buffer.substring(this.pos):null:(this.buffer[t-1]==="\r"&&(t-=1),this.buffer.substring(this.pos,t))}hasChars(t){return this.pos+t<=this.buffer.length}setNext(t){return this.buffer=this.buffer.substring(this.pos),this.pos=0,this.lineEndPos=null,this.next=t,null}peek(t){return this.buffer.substr(this.pos,t)}*parseNext(t){switch(t){case"stream":return yield*this.parseStream();case"line-start":return yield*this.parseLineStart();case"block-start":return yield*this.parseBlockStart();case"doc":return yield*this.parseDocument();case"flow":return yield*this.parseFlowCollection();case"quoted-scalar":return yield*this.parseQuotedScalar();case"block-scalar":return yield*this.parseBlockScalar();case"plain-scalar":return yield*this.parsePlainScalar()}}*parseStream(){let t=this.getLine();if(t===null)return this.setNext("stream");if(t[0]===Ml&&(yield*this.pushCount(1),t=t.substring(1)),t[0]==="%"){let n=t.length,r=t.indexOf("#");for(;r!==-1;){let i=t[r-1];if(i===" "||i===" "){n=r-1;break}else r=t.indexOf("#",r+1)}for(;;){let i=t[n-1];if(i===" "||i===" ")n-=1;else break}let s=(yield*this.pushCount(n))+(yield*this.pushSpaces(!0));return yield*this.pushCount(t.length-s),this.pushNewline(),"stream"}if(this.atLineEnd()){let n=yield*this.pushSpaces(!0);return yield*this.pushCount(t.length-n),yield*this.pushNewline(),"stream"}return yield jl,yield*this.parseLineStart()}*parseLineStart(){let t=this.charAt(0);if(!t&&!this.atEnd)return this.setNext("line-start");if(t==="-"||t==="."){if(!this.atEnd&&!this.hasChars(4))return this.setNext("line-start");let n=this.peek(3);if((n==="---"||n==="...")&&Ve(this.charAt(3)))return yield*this.pushCount(3),this.indentValue=0,this.indentNext=0,n==="---"?"doc":"stream"}return this.indentValue=yield*this.pushSpaces(!1),this.indentNext>this.indentValue&&!Ve(this.charAt(1))&&(this.indentNext=this.indentValue),yield*this.parseBlockStart()}*parseBlockStart(){let[t,n]=this.peek(2);if(!n&&!this.atEnd)return this.setNext("block-start");if((t==="-"||t==="?"||t===":")&&Ve(n)){let r=(yield*this.pushCount(1))+(yield*this.pushSpaces(!0));return this.indentNext=this.indentValue+1,this.indentValue+=r,"block-start"}return"doc"}*parseDocument(){yield*this.pushSpaces(!0);let t=this.getLine();if(t===null)return this.setNext("doc");let n=yield*this.pushIndicators();switch(t[n]){case"#":yield*this.pushCount(t.length-n);case void 0:return yield*this.pushNewline(),yield*this.parseLineStart();case"{":case"[":return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*this.pushCount(1),"doc";case"*":return yield*this.pushUntil(ql),"doc";case'"':case"'":return yield*this.parseQuotedScalar();case"|":case">":return n+=yield*this.parseBlockScalarHeader(),n+=yield*this.pushSpaces(!0),yield*this.pushCount(t.length-n),yield*this.pushNewline(),yield*this.parseBlockScalar();default:return yield*this.parsePlainScalar()}}*parseFlowCollection(){let t,n,r=-1;do t=yield*this.pushNewline(),t>0?(n=yield*this.pushSpaces(!1),this.indentValue=r=n):n=0,n+=yield*this.pushSpaces(!0);while(t+n>0);let s=this.getLine();if(s===null)return this.setNext("flow");if((r!==-1&&r<this.indentNext&&s[0]!=="#"||r===0&&(s.startsWith("---")||s.startsWith("..."))&&Ve(s[3]))&&!(r===this.indentNext-1&&this.flowLevel===1&&(s[0]==="]"||s[0]==="}")))return this.flowLevel=0,yield Fl,yield*this.parseLineStart();let i=0;for(;s[i]===",";)i+=yield*this.pushCount(1),i+=yield*this.pushSpaces(!0),this.flowKey=!1;switch(i+=yield*this.pushIndicators(),s[i]){case void 0:return"flow";case"#":return yield*this.pushCount(s.length-i),"flow";case"{":case"[":return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel+=1,"flow";case"}":case"]":return yield*this.pushCount(1),this.flowKey=!0,this.flowLevel-=1,this.flowLevel?"flow":"doc";case"*":return yield*this.pushUntil(ql),"flow";case'"':case"'":return this.flowKey=!0,yield*this.parseQuotedScalar();case":":{let o=this.charAt(1);if(this.flowKey||Ve(o)||o===",")return this.flowKey=!1,yield*this.pushCount(1),yield*this.pushSpaces(!0),"flow"}default:return this.flowKey=!1,yield*this.parsePlainScalar()}}*parseQuotedScalar(){let t=this.charAt(0),n=this.buffer.indexOf(t,this.pos+1);if(t==="'")for(;n!==-1&&this.buffer[n+1]==="'";)n=this.buffer.indexOf("'",n+2);else for(;n!==-1;){let i=0;for(;this.buffer[n-1-i]==="\\";)i+=1;if(i%2===0)break;n=this.buffer.indexOf('"',n+1)}let r=this.buffer.substring(0,n),s=r.indexOf(`
198
+ `,this.pos);if(s!==-1){for(;s!==-1;){let i=this.continueScalar(s+1);if(i===-1)break;s=r.indexOf(`
199
+ `,i)}s!==-1&&(n=s-(r[s-1]==="\r"?2:1))}if(n===-1){if(!this.atEnd)return this.setNext("quoted-scalar");n=this.buffer.length}return yield*this.pushToIndex(n+1,!1),this.flowLevel?"flow":"doc"}*parseBlockScalarHeader(){this.blockScalarIndent=-1,this.blockScalarKeep=!1;let t=this.pos;for(;;){let n=this.buffer[++t];if(n==="+")this.blockScalarKeep=!0;else if(n>"0"&&n<="9")this.blockScalarIndent=Number(n)-1;else if(n!=="-")break}return yield*this.pushUntil(n=>Ve(n)||n==="#")}*parseBlockScalar(){let t=this.pos-1,n=0,r;e:for(let i=this.pos;r=this.buffer[i];++i)switch(r){case" ":n+=1;break;case`
200
+ `:t=i,n=0;break;case"\r":{let o=this.buffer[i+1];if(!o&&!this.atEnd)return this.setNext("block-scalar");if(o===`
201
+ `)break}default:break e}if(!r&&!this.atEnd)return this.setNext("block-scalar");if(n>=this.indentNext){this.blockScalarIndent===-1?this.indentNext=n:this.indentNext=this.blockScalarIndent+(this.indentNext===0?1:this.indentNext);do{let i=this.continueScalar(t+1);if(i===-1)break;t=this.buffer.indexOf(`
202
+ `,i)}while(t!==-1);if(t===-1){if(!this.atEnd)return this.setNext("block-scalar");t=this.buffer.length}}let s=t+1;for(r=this.buffer[s];r===" ";)r=this.buffer[++s];if(r===" "){for(;r===" "||r===" "||r==="\r"||r===`
203
+ `;)r=this.buffer[++s];t=s-1}else if(!this.blockScalarKeep)do{let i=t-1,o=this.buffer[i];o==="\r"&&(o=this.buffer[--i]);let a=i;for(;o===" ";)o=this.buffer[--i];if(o===`
204
+ `&&i>=this.pos&&i+1+n>a)t=i;else break}while(!0);return yield Pi,yield*this.pushToIndex(t+1,!0),yield*this.parseLineStart()}*parsePlainScalar(){let t=this.flowLevel>0,n=this.pos-1,r=this.pos-1,s;for(;s=this.buffer[++r];)if(s===":"){let i=this.buffer[r+1];if(Ve(i)||t&&Ii.has(i))break;n=r}else if(Ve(s)){let i=this.buffer[r+1];if(s==="\r"&&(i===`
205
+ `?(r+=1,s=`
206
+ `,i=this.buffer[r+1]):n=r),i==="#"||t&&Ii.has(i))break;if(s===`
207
+ `){let o=this.continueScalar(r+1);if(o===-1)break;r=Math.max(r,o-2)}}else{if(t&&Ii.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield Pi,yield*this.pushToIndex(n+1,!0),t?"flow":"doc")}*pushCount(t){return t>0?(yield this.buffer.substr(this.pos,t),this.pos+=t,t):0}*pushToIndex(t,n){let r=this.buffer.slice(this.pos,t);return r?(yield r,this.pos+=r.length,r.length):(n&&(yield""),0)}*pushIndicators(){let t=0;e:for(;;){switch(this.charAt(0)){case"!":t+=yield*this.pushTag(),t+=yield*this.pushSpaces(!0);continue e;case"&":t+=yield*this.pushUntil(ql),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(Ve(r)||n&&Ii.has(r)){n?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,t+=yield*this.pushCount(1),t+=yield*this.pushSpaces(!0);continue e}}}break e}return t}*pushTag(){if(this.charAt(1)==="<"){let t=this.pos+2,n=this.buffer[t];for(;!Ve(n)&&n!==">";)n=this.buffer[++t];return yield*this.pushToIndex(n===">"?t+1:t,!1)}else{let t=this.pos+1,n=this.buffer[t];for(;n;)if(fR.has(n))n=this.buffer[++t];else if(n==="%"&&Pf.has(this.buffer[t+1])&&Pf.has(this.buffer[t+2]))n=this.buffer[t+=3];else break;return yield*this.pushToIndex(t,!1)}}*pushNewline(){let t=this.buffer[this.pos];return t===`
208
+ `?yield*this.pushCount(1):t==="\r"&&this.charAt(1)===`
209
+ `?yield*this.pushCount(2):0}*pushSpaces(t){let n=this.pos-1,r;do r=this.buffer[++n];while(r===" "||t&&r===" ");let s=n-this.pos;return s>0&&(yield this.buffer.substr(this.pos,s),this.pos=n),s}*pushUntil(t){let n=this.pos,r=this.buffer[n];for(;!t(r);)r=this.buffer[++n];return yield*this.pushToIndex(n,!1)}};var Hr=class{constructor(){this.lineStarts=[],this.addNewLine=t=>this.lineStarts.push(t),this.linePos=t=>{let n=0,r=this.lineStarts.length;for(;n<r;){let i=n+r>>1;this.lineStarts[i]<t?n=i+1:r=i}if(this.lineStarts[n]===t)return{line:n+1,col:1};if(n===0)return{line:0,col:t};let s=this.lineStarts[n-1];return{line:n,col:t-s+1}}}};function Bt(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function If(e){for(let t=0;t<e.length;++t)switch(e[t].type){case"space":case"comment":case"newline":break;default:return t}return-1}function Cf(e){switch(e?.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"flow-collection":return!0;default:return!1}}function vi(e){switch(e.type){case"document":return e.start;case"block-map":{let t=e.items[e.items.length-1];return t.sep??t.start}case"block-seq":return e.items[e.items.length-1].start;default:return[]}}function zn(e){if(e.length===0)return[];let t=e.length;e:for(;--t>=0;)switch(e[t].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break e}for(;e[++t]?.type==="space";);return e.splice(t,e.length)}function Ci(e,t){if(t.length<1e5)Array.prototype.push.apply(e,t);else for(let n=0;n<t.length;++n)e.push(t[n])}function vf(e){if(e.start.type==="flow-seq-start")for(let t of e.items)t.sep&&!t.value&&!Bt(t.start,"explicit-key-ind")&&!Bt(t.sep,"map-value-ind")&&(t.key&&(t.value=t.key),delete t.key,Cf(t.value)?t.value.end?Ci(t.value.end,t.sep):t.value.end=t.sep:Ci(t.start,t.sep),delete t.sep)}var zr=class{constructor(t){this.atNewLine=!0,this.atScalar=!1,this.indent=0,this.offset=0,this.onKeyLine=!1,this.stack=[],this.source="",this.type="",this.lexer=new Gr,this.onNewLine=t}*parse(t,n=!1){this.onNewLine&&this.offset===0&&this.onNewLine(0);for(let r of this.lexer.lex(t,n))yield*this.next(r);n||(yield*this.end())}*next(t){if(this.source=t,this.atScalar){this.atScalar=!1,yield*this.step(),this.offset+=t.length;return}let n=Sf(t);if(n)if(n==="scalar")this.atNewLine=!1,this.atScalar=!0,this.type="scalar";else{switch(this.type=n,yield*this.step(),n){case"newline":this.atNewLine=!0,this.indent=0,this.onNewLine&&this.onNewLine(this.offset+t.length);break;case"space":this.atNewLine&&t[0]===" "&&(this.indent+=t.length);break;case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":this.atNewLine&&(this.indent+=t.length);break;case"doc-mode":case"flow-error-end":return;default:this.atNewLine=!1}this.offset+=t.length}else{let r=`Not a YAML token: ${t}`;yield*this.pop({type:"error",offset:this.offset,message:r,source:t}),this.offset+=t.length}}*end(){for(;this.stack.length>0;)yield*this.pop()}get sourceToken(){return{type:this.type,offset:this.offset,indent:this.indent,source:this.source}}*step(){let t=this.peek(1);if(this.type==="doc-end"&&t?.type!=="doc-end"){for(;this.stack.length>0;)yield*this.pop();this.stack.push({type:"doc-end",offset:this.offset,source:this.source});return}if(!t)return yield*this.stream();switch(t.type){case"document":return yield*this.document(t);case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yield*this.scalar(t);case"block-scalar":return yield*this.blockScalar(t);case"block-map":return yield*this.blockMap(t);case"block-seq":return yield*this.blockSequence(t);case"flow-collection":return yield*this.flowCollection(t);case"doc-end":return yield*this.documentEnd(t)}yield*this.pop()}peek(t){return this.stack[this.stack.length-t]}*pop(t){let n=t??this.stack.pop();if(!n)yield{type:"error",offset:this.offset,source:"",message:"Tried to pop an empty stack"};else if(this.stack.length===0)yield n;else{let r=this.peek(1);switch(n.type==="block-scalar"?n.indent="indent"in r?r.indent:0:n.type==="flow-collection"&&r.type==="document"&&(n.indent=0),n.type==="flow-collection"&&vf(n),r.type){case"document":r.value=n;break;case"block-scalar":r.props.push(n);break;case"block-map":{let s=r.items[r.items.length-1];if(s.value){r.items.push({start:[],key:n,sep:[]}),this.onKeyLine=!0;return}else if(s.sep)s.value=n;else{Object.assign(s,{key:n,sep:[]}),this.onKeyLine=!s.explicitKey;return}break}case"block-seq":{let s=r.items[r.items.length-1];s.value?r.items.push({start:[],value:n}):s.value=n;break}case"flow-collection":{let s=r.items[r.items.length-1];!s||s.value?r.items.push({start:[],key:n,sep:[]}):s.sep?s.value=n:Object.assign(s,{key:n,sep:[]});return}default:yield*this.pop(),yield*this.pop(n)}if((r.type==="document"||r.type==="block-map"||r.type==="block-seq")&&(n.type==="block-map"||n.type==="block-seq")){let s=n.items[n.items.length-1];s&&!s.sep&&!s.value&&s.start.length>0&&If(s.start)===-1&&(n.indent===0||s.start.every(i=>i.type!=="comment"||i.indent<n.indent))&&(r.type==="document"?r.end=s.start:r.items.push({start:s.start}),n.items.splice(-1,1))}}}*stream(){switch(this.type){case"directive-line":yield{type:"directive",offset:this.offset,source:this.source};return;case"byte-order-mark":case"space":case"comment":case"newline":yield this.sourceToken;return;case"doc-mode":case"doc-start":{let t={type:"document",offset:this.offset,start:[]};this.type==="doc-start"&&t.start.push(this.sourceToken),this.stack.push(t);return}}yield{type:"error",offset:this.offset,message:`Unexpected ${this.type} token in YAML stream`,source:this.source}}*document(t){if(t.value)return yield*this.lineEnd(t);switch(this.type){case"doc-start":{If(t.start)!==-1?(yield*this.pop(),yield*this.step()):t.start.push(this.sourceToken);return}case"anchor":case"tag":case"space":case"comment":case"newline":t.start.push(this.sourceToken);return}let n=this.startBlockValue(t);n?this.stack.push(n):yield{type:"error",offset:this.offset,message:`Unexpected ${this.type} token in YAML document`,source:this.source}}*scalar(t){if(this.type==="map-value-ind"){let n=vi(this.peek(2)),r=zn(n),s;t.end?(s=t.end,s.push(this.sourceToken),delete t.end):s=[this.sourceToken];let i={type:"block-map",offset:t.offset,indent:t.indent,items:[{start:r,key:t,sep:s}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=i}else yield*this.lineEnd(t)}*blockScalar(t){switch(this.type){case"space":case"comment":case"newline":t.props.push(this.sourceToken);return;case"scalar":if(t.source=this.source,this.atNewLine=!0,this.indent=0,this.onNewLine){let n=this.source.indexOf(`
210
+ `)+1;for(;n!==0;)this.onNewLine(this.offset+n),n=this.source.indexOf(`
211
+ `,n)+1}yield*this.pop();break;default:yield*this.pop(),yield*this.step()}}*blockMap(t){let n=t.items[t.items.length-1];switch(this.type){case"newline":if(this.onKeyLine=!1,n.value){let r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):t.items.push({start:[this.sourceToken]})}else n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)t.items.push({start:[this.sourceToken]});else if(n.sep)n.sep.push(this.sourceToken);else{if(this.atIndentedComment(n.start,t.indent)){let s=t.items[t.items.length-2]?.value?.end;if(Array.isArray(s)){Ci(s,n.start),s.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return}if(this.indent>=t.indent){let r=!this.onKeyLine&&this.indent===t.indent,s=r&&(n.sep||n.explicitKey)&&this.type!=="seq-item-ind",i=[];if(s&&n.sep&&!n.value){let o=[];for(let a=0;a<n.sep.length;++a){let l=n.sep[a];switch(l.type){case"newline":o.push(a);break;case"space":break;case"comment":l.indent>t.indent&&(o.length=0);break;default:o.length=0}}o.length>=2&&(i=n.sep.splice(o[1]))}switch(this.type){case"anchor":case"tag":s||n.value?(i.push(this.sourceToken),t.items.push({start:i}),this.onKeyLine=!0):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"explicit-key-ind":!n.sep&&!n.explicitKey?(n.start.push(this.sourceToken),n.explicitKey=!0):s||n.value?(i.push(this.sourceToken),t.items.push({start:i,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(n.explicitKey)if(n.sep)if(n.value)t.items.push({start:[],key:null,sep:[this.sourceToken]});else if(Bt(n.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]});else if(Cf(n.key)&&!Bt(n.sep,"newline")){let o=zn(n.start),a=n.key,l=n.sep;l.push(this.sourceToken),delete n.key,delete n.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:a,sep:l}]})}else i.length>0?n.sep=n.sep.concat(i,this.sourceToken):n.sep.push(this.sourceToken);else if(Bt(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=zn(n.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]})}else n.sep?n.value||s?t.items.push({start:i,key:null,sep:[this.sourceToken]}):Bt(n.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let o=this.flowScalar(this.type);s||n.value?(t.items.push({start:i,key:o,sep:[]}),this.onKeyLine=!0):n.sep?this.stack.push(o):(Object.assign(n,{key:o,sep:[]}),this.onKeyLine=!0);return}default:{let o=this.startBlockValue(t);if(o){if(o.type==="block-seq"){if(!n.explicitKey&&n.sep&&!Bt(n.sep,"newline")){yield*this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source});return}}else r&&t.items.push({start:i});this.stack.push(o);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(t){let n=t.items[t.items.length-1];switch(this.type){case"newline":if(n.value){let r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):t.items.push({start:[this.sourceToken]})}else n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)t.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(n.start,t.indent)){let s=t.items[t.items.length-2]?.value?.end;if(Array.isArray(s)){Ci(s,n.start),s.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return;case"anchor":case"tag":if(n.value||this.indent<=t.indent)break;n.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==t.indent)break;n.value||Bt(n.start,"seq-item-ind")?t.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return}if(this.indent>t.indent){let r=this.startBlockValue(t);if(r){this.stack.push(r);return}}yield*this.pop(),yield*this.step()}*flowCollection(t){let n=t.items[t.items.length-1];if(this.type==="flow-error-end"){let r;do yield*this.pop(),r=this.peek(1);while(r?.type==="flow-collection")}else if(t.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!n||n.sep?t.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return;case"map-value-ind":!n||n.value?t.items.push({start:[],key:null,sep:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!n||n.value?t.items.push({start:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let s=this.flowScalar(this.type);!n||n.value?t.items.push({start:[],key:s,sep:[]}):n.sep?this.stack.push(s):Object.assign(n,{key:s,sep:[]});return}case"flow-map-end":case"flow-seq-end":t.end.push(this.sourceToken);return}let r=this.startBlockValue(t);r?this.stack.push(r):(yield*this.pop(),yield*this.step())}else{let r=this.peek(2);if(r.type==="block-map"&&(this.type==="map-value-ind"&&r.indent===t.indent||this.type==="newline"&&!r.items[r.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type==="map-value-ind"&&r.type!=="flow-collection"){let s=vi(r),i=zn(s);vf(t);let o=t.end.splice(1,t.end.length);o.push(this.sourceToken);let a={type:"block-map",offset:t.offset,indent:t.indent,items:[{start:i,key:t,sep:o}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=a}else yield*this.lineEnd(t)}}flowScalar(t){if(this.onNewLine){let n=this.source.indexOf(`
212
+ `)+1;for(;n!==0;)this.onNewLine(this.offset+n),n=this.source.indexOf(`
213
+ `,n)+1}return{type:t,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(t){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let n=vi(t),r=zn(n);return r.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let n=vi(t),r=zn(n);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(t,n){return this.type!=="comment"||this.indent<=n?!1:t.every(r=>r.type==="newline"||r.type==="space")}*documentEnd(t){this.type!=="doc-mode"&&(t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(t){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;default:t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};function hR(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new Hr||null,prettyErrors:t}}function Wl(e,t={}){let{lineCounter:n,prettyErrors:r}=hR(t),s=new zr(n?.addNewLine),i=new Vr(t),o=null;for(let a of i.compose(s.parse(e),!0,e.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new Ke(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(Al(e,n)),o.warnings.forEach(Al(e,n))),o}var Yr=1024*1024;function Bl(e,t){Buffer.byteLength(e)>Yr&&Ai(t,[`Definition exceeds ${Yr} bytes.`]);let n=Wl(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];_e(n,(i,o)=>{Ae(o)&&r.push("YAML aliases are not supported."),typeof o=="object"&&o!==null&&"anchor"in o&&typeof o.anchor=="string"&&r.push("YAML anchors are not supported.")});let s=[...n.errors.map(i=>i.message),...n.warnings.map(i=>i.message),...r];s.length>0&&Ai(t,s),n.contents===null&&Ai(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){Ai(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function Ai(e,t){throw new y("SWARM_DEFINITION_INVALID",`Swarm definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}import{createHash as yR}from"node:crypto";var Yn=/^[a-z][a-z0-9_-]{0,63}$/,Af=/\$\{\{\s*([^{}]+?)\s*\}\}/g,Ef=32,Of=128,wR=16,kR=32,TR=10080*60*1e3,Jn=32*1024,xf=16;function Vl(e,t){let n=[],r=Ee(e,"$",n);Ge(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=xR(r.name,"$.name",n),i=RR(r.limits,n),o=SR(r.inputs,n),a=PR(r.steps,n);a.length>Of&&n.push(`$.steps may contain at most ${Of} steps.`),a.filter(d=>d.kind==="agent"&&d.createChild).length>i.maxTasks&&n.push("$.steps creates more child tasks than limits.max_tasks allows.");let l=new Set(a.map(d=>d.id));for(let d of a)for(let p of d.needs)l.has(p)||n.push(`$.steps.${d.id}.needs references missing step "${p}".`),p===d.id&&n.push(`$.steps.${d.id}.needs cannot reference itself.`);let c=CR(a,n);c&&AR(a,o,c.ancestors,n),n.length>0&&NR(t,n);let u={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:u,hash:yR("sha256").update(Kl(u)).digest("hex"),order:c.order,waves:bR(c.waves,i.maxConcurrency)}}function bR(e,t){return e.flatMap(n=>{let r=[];for(let s=0;s<n.length;s+=t)r.push(n.slice(s,s+t));return r})}function RR(e,t){let n=Ee(e,"$.limits",t);Ge(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=$f(n.max_concurrency,"$.limits.max_concurrency",1,wR,t),s=$f(n.max_tasks,"$.limits.max_tasks",1,kR,t),i=_f(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function SR(e,t){if(e===void 0)return{};let n=Ee(e,"$.inputs",t),r=Object.entries(n);r.length>Ef&&t.push(`$.inputs may contain at most ${Ef} inputs.`);let s={};for(let[i,o]of r){Yn.test(i)||t.push(`$.inputs key "${i}" must match ${Yn}.`);let a=Ee(o,`$.inputs.${i}`,t);Ge(a,["type","required","default"],`$.inputs.${i}`,t);let l=DR(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:$R(a.required,`$.inputs.${i}.required`,t);c&&a.default!==void 0&&t.push(`$.inputs.${i} cannot be required and have a default.`),a.default!==void 0&&!Df(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&Df(a.default,l)?{defaultValue:a.default}:{}}}return s}function PR(e,t){let n=Ee(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{Yn.test(s)||t.push(`$.steps key "${s}" must match ${Yn}.`);let o=Ee(i,`$.steps.${s}`,t),a=Nf(o.needs,`$.steps.${s}.needs`,t);return new Set(a).size!==a.length&&t.push(`$.steps.${s}.needs cannot contain duplicates.`),o.human_review!==void 0?vR(s,o,a,t):IR(s,o,a,t)})}function IR(e,t,n,r){Ge(t,["needs","task","create_child","agent","prompt","output"],`$.steps.${e}`,r);let s=t.task!==void 0,i=t.create_child!==void 0;s===i&&r.push(`$.steps.${e} must define exactly one of task or create_child.`);let o=s?Ut(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let d=Ee(t.create_child,`$.steps.${e}.create_child`,r);Ge(d,["repo"],`$.steps.${e}.create_child`,r),a={repo:Ut(d.repo,`$.steps.${e}.create_child.repo`,r)}}let l;if(t.agent!==void 0){let d=Ee(t.agent,`$.steps.${e}.agent`,r);if(Ge(d,["runner"],`$.steps.${e}.agent`,r),d.runner!==void 0)try{l=k.runners.parse(Ut(d.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=Ut(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>Jn&&r.push(`$.steps.${e}.prompt exceeds ${Jn} bytes.`);let u;if(t.output!==void 0){let d=Ee(t.output,`$.steps.${e}.output`,r);Ge(d,["schema"],`$.steps.${e}.output`,r),u=Ul(d.schema,`$.steps.${e}.output.schema`,r,0)}return{kind:"agent",id:e,needs:n,prompt:c,...o!==void 0?{task:o}:{},...a?{createChild:a}:{},...l?{runner:l}:{},...u?{outputSchema:u}:{}}}function vR(e,t,n,r){Ge(t,["needs","human_review"],`$.steps.${e}`,r);let s=Ee(t.human_review,`$.steps.${e}.human_review`,r);Ge(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=Ee(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);Ge(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=Ut(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:Ut(s.title,`$.steps.${e}.human_review.title`,r),summary:Ut(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:_f(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function Ul(e,t,n,r){if(r>xf)return n.push(`${t} exceeds the maximum schema depth of ${xf}.`),{};let s=Ee(e,t,n);Ge(s,["type","properties","required","items","enum","additionalProperties","description"],t,n);let i=["object","array","string","number","integer","boolean","null"];if((typeof s.type!="string"||!i.includes(s.type))&&n.push(`${t}.type is unsupported.`),s.required!==void 0&&Nf(s.required,`${t}.required`,n),s.enum!==void 0&&(!Array.isArray(s.enum)||s.enum.length===0)&&n.push(`${t}.enum must be a non-empty array.`),s.additionalProperties!==void 0&&typeof s.additionalProperties!="boolean"&&n.push(`${t}.additionalProperties must be a boolean.`),s.properties!==void 0){let o=Ee(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))Ul(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&Ul(s.items,`${t}.items`,n,r+1),s}function CR(e,t){let n=new Set(e.map(d=>d.id));if(e.some(d=>d.needs.some(p=>!n.has(p))))return null;let r=new Map(e.map((d,p)=>[d.id,p])),s=new Map(e.map(d=>[d.id,d.needs.length])),i=new Map;for(let d of e)for(let p of d.needs)i.set(p,[...i.get(p)??[],d.id]);let o=e.filter(d=>d.needs.length===0).map(d=>d.id),a=[],l=[];for(;o.length>0;){o.sort((h,f)=>r.get(h)-r.get(f));let d=o;l.push(d),a.push(...d);let p=[];for(let h of d)for(let f of i.get(h)??[]){let m=s.get(f)-1;s.set(f,m),m===0&&p.push(f)}o=p}if(a.length!==e.length)return t.push("$.steps must form an acyclic graph."),null;let c=new Map(e.map(d=>[d.id,d])),u=new Map;for(let d of a){let p=new Set;for(let h of c.get(d).needs){p.add(h);for(let f of u.get(h)??[])p.add(f)}u.set(d,p)}return{order:a,waves:l,ancestors:u}}function AR(e,t,n,r){let s=new Map(e.map(i=>[i.id,i]));for(let i of e){let o=i.kind==="agent"?[i.task,i.createChild?.repo,i.prompt]:[i.title,i.summary,i.feedbackTask];for(let a of o){if(a===void 0)continue;let l=[...a.matchAll(Af)],c=a.replace(Af,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let u of l)ER(u[1].trim(),i,t,n,s,r)}}}function ER(e,t,n,r,s,i){let o=/^inputs\.([a-z][a-z0-9_-]{0,63})$/.exec(e);if(o){n[o[1]]||i.push(`$.steps.${t.id} references undeclared input "${o[1]}".`);return}let a=/^steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)$/.exec(e);if(!a){i.push(`$.steps.${t.id} contains unsupported reference "${e}".`);return}let l=a[1];if(!(r.get(t.id)?.has(l)??!1)){i.push(`$.steps.${t.id} references step "${l}" without depending on it.`);return}let c=s.get(l);!c||c.kind!=="agent"?i.push(`$.steps.${t.id} references an output from non-agent step "${l}".`):a[2].startsWith("output")&&!c.outputSchema?i.push(`$.steps.${t.id} references output from step "${l}" without a declared output schema.`):a[2].startsWith("output.")&&c.outputSchema&&OR(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function OR(e,t,n,r,s){let i=r;for(let o of n){if(i.type!=="object"){s.push(`$.steps.${e} references output path "${n.join(".")}" not declared by step "${t}".`);return}if(!Ei(i.properties)){i.additionalProperties===!1&&s.push(`$.steps.${e} references output path "${n.join(".")}" not declared by step "${t}".`);return}if(!Object.hasOwn(i.properties,o)){s.push(`$.steps.${e} references output path "${n.join(".")}" not declared by step "${t}".`);return}let a=i.properties[o];if(!Ei(a))return;i=a}}function Kl(e){return Array.isArray(e)?`[${e.map(Kl).join(",")}]`:Ei(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Kl(e[t])}`).join(",")}}`:JSON.stringify(e)}function Ee(e,t,n){return Ei(e)?e:(n.push(`${t} must be an object.`),{})}function Ge(e,t,n,r){let s=new Set(t);for(let i of Object.keys(e))s.has(i)||r.push(`${n}.${i} is not supported.`)}function xR(e,t,n){let r=Ut(e,t,n);return Yn.test(r)||n.push(`${t} must match ${Yn}.`),r}function Ut(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function Nf(e,t,n){return e===void 0?[]:!Array.isArray(e)||e.some(r=>typeof r!="string"||r.length===0)?(n.push(`${t} must be an array of non-empty strings.`),[]):e}function $f(e,t,n,r,s){return Number.isInteger(e)&&Number(e)>=n&&Number(e)<=r?Number(e):(s.push(`${t} must be an integer from ${n} through ${r}.`),n)}function $R(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function DR(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function Df(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function _f(e,t,n){if(typeof e!="string")return n.push(`${t} must be a duration such as 30m, 2h, or 1d.`),1;let r=/^(\d+)(ms|s|m|h|d)$/.exec(e);if(!r)return n.push(`${t} must be a duration such as 30m, 2h, or 1d.`),1;let s={ms:1,s:1e3,m:6e4,h:36e5,d:864e5},i=Number(r[1])*s[r[2]];return!Number.isSafeInteger(i)||i<1||i>TR?(n.push(`${t} must be between 1ms and 7d.`),1):i}function NR(e,t){throw new y("SWARM_DEFINITION_INVALID",`Swarm definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var Ei=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as _R,stat as LR}from"node:fs/promises";var MR=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function Gl(e){let t=await Lf(e);return{kind:"validateSwarm",schemaVersion:1,valid:!0,file:e,definitionHash:t.hash,name:t.definition.name,inputNames:Object.keys(t.definition.inputs),stepCount:t.definition.steps.length,order:t.order,limits:t.definition.limits}}async function Hl(e,t){let n=await Lf(e),r=jR(n.definition.inputs,t),s=new Map(n.waves.flatMap((a,l)=>a.map(c=>[c,l]))),i=new Map(n.definition.steps.map(a=>[a.id,a])),o=n.order.map(a=>{let l=i.get(a);return l.kind==="human_review"?{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:null,runner:null,prompt:null,outputSchema:null,review:{title:Xn(l.title,r,`$.steps.${a}.human_review.title`),summary:Xn(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?Xn(l.feedbackTask,r,`$.steps.${a}.human_review.feedback_target.task`):null,timeoutMs:l.timeoutMs??n.definition.limits.timeoutMs}}:{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:l.task?{type:"task",task:Xn(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",repo:Xn(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)},runner:l.runner??null,prompt:WR(l.prompt,r,a),outputSchema:l.outputSchema??null,review:null}});return{kind:"planSwarm",schemaVersion:1,file:e,definitionHash:n.hash,name:n.definition.name,inputs:r,limits:n.definition.limits,order:n.order,waves:n.waves,steps:o,mutations:[]}}async function Lf(e){let t;try{let n=await LR(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>Yr)throw new Error(`Definition exceeds ${Yr} bytes.`);t=await _R(e,"utf8")}catch(n){throw new y("SWARM_DEFINITION_INVALID",`Swarm definition ${e} could not be read.`,{details:{file:e},cause:n})}return Vl(Bl(t,e),e)}function jR(e,t){let n=[];for(let s of Object.keys(t))e[s]||n.push(`Input "${s}" is not declared.`);let r={};for(let[s,i]of Object.entries(e)){let o=t[s];o!==void 0?r[s]=FR(o,i.type,s,n):i.defaultValue!==void 0?r[s]=i.defaultValue:i.required&&n.push(`Required input "${s}" was not provided.`)}if(n.length>0)throw new y("SWARM_INPUT_INVALID","Swarm inputs are invalid.",{details:{issues:n}});return r}function FR(e,t,n,r){if(t==="string")return e;if(t==="number"){if(e.trim().length===0)return r.push(`Input "${n}" must be a finite number.`),0;let s=Number(e);return Number.isFinite(s)?s:(r.push(`Input "${n}" must be a finite number.`),0)}return e==="true"?!0:(e==="false"||r.push(`Input "${n}" must be true or false.`),!1)}function qR(e,t){return e.replace(MR,(n,r)=>{if(!Object.hasOwn(t,r))throw new y("SWARM_INPUT_INVALID",`Input "${r}" is required by a template but has no value.`,{details:{input:r}});return String(t[r])})}function Xn(e,t,n){let r=qR(e,t);if(r.trim().length===0)throw new y("SWARM_INPUT_INVALID",`Resolved ${n} must be a non-empty string.`,{details:{location:n}});return r}function WR(e,t,n){let r=`$.steps.${n}.prompt`,s=Xn(e,t,r);if(Buffer.byteLength(s)>Jn)throw new y("SWARM_INPUT_INVALID",`Resolved ${r} exceeds ${Jn} bytes.`,{details:{location:r,maxBytes:Jn}});return s}import{createHash as Mf}from"node:crypto";import BR from"node:path";import{mkdir as UR}from"node:fs/promises";var zl={type:"system",component:"heartbeat"};async function Kt(e,t={}){await UR(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([P.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):mt.listAgents(e),hp(e),JR(e)]),o=r??Xe(n.tasks.filter(f=>f.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=YR(i),l=a!==i,c=[],u=Yl(s.filter(zR),f=>f.taskId),d=Yl(s.filter(f=>f.type.startsWith("task.pr.")),f=>f.taskId),p=Yl(s.filter(f=>f.type==="agent.state.changed"),f=>f.agentTabId);for(let f of n.tasks){let m=KR(f),g=u.get(f.id),T=Xl(g?.data)??a.tasks[f.id]??null,R=g?.id??a.tasks[f.id]?.eventId??null;if(T?.signature!==m.signature){let _=T?f.status==="closed"&&T?.status!=="closed"?"task.closed":"task.updated":"task.created",v=await ht(e,{id:Jl(_,f.id,m.signature),type:_,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:zl,data:{...m,changedFields:T?GR(T,m):[]}});c.push(v),R=v.id}a.tasks[f.id]={...m,eventId:R};let I=HR(f.prs),b=d.get(f.id),x=Xl(b?.data)??a.pullRequests[f.id]??null,$=b?.id??a.pullRequests[f.id]?.eventId??null;if((x||I.associations.length>0)&&x?.signature!==I.signature){let _=Array.isArray(x?.associations)?x.associations.length:0,v=I.associations.length>_?"task.pr.linked":I.associations.length<_?"task.pr.unlinked":"task.pr.refreshed",w=await ht(e,{id:Jl(v,f.id,I.signature),type:v,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:zl,data:I});c.push(w),$=w.id}a.pullRequests[f.id]={...I,eventId:$}}let h=new Map(o.tasks.map(f=>[f.taskId,f.state]));for(let f of o.agents){let m=p.get(f.tabId),g=Xl(m?.data)??a.agents[f.tabId]??null;if(g?.state===f.state){a.agents[f.tabId]={state:f.state,eventId:m?.id??a.agents[f.tabId]?.eventId??null};continue}let T=[m?.id??a.agents[f.tabId]?.eventId??"initial",f.state,f.sessionState??"none",f.lastActivityAt??"none",f.exitCode??"none",f.error??"none"].join(":"),R=await ht(e,{id:Jl("agent.state.changed",f.tabId,T),type:"agent.state.changed",taskId:f.taskId,agentTabId:f.tabId,actor:zl,data:{previousState:typeof g?.state=="string"?g.state:null,state:f.state,taskState:h.get(f.taskId)??"idle",sessionState:f.sessionState,lastActivityAt:f.lastActivityAt,exitCode:f.exitCode,error:f.error}});c.push(R),a.agents[f.tabId]={state:f.state,eventId:R.id}}return(c.length>0||l)&&await U(Ff(e),a),c}function KR(e){let t={status:e.status,title:e.title,runner:e.runner,branch:e.branch,lastCommitSha:e.lastCommit?.sha??null,checksStatus:e.checks.status,checksLastRunAt:e.checks.lastRunAt,sourceUpdatedAt:e.updatedAt,agentTabIds:e.ptyTabs.filter(n=>n.kind==="agent").map(n=>n.id)};return{...t,signature:jf(t)}}var VR=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function GR(e,t){return VR.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function HR(e){let t=e.map(n=>({provider:n.provider,owner:n.owner,repo:n.repo,number:n.number,url:n.url,status:n.status,draft:n.draft,headBranch:n.headBranch,lastSyncedAt:n.lastSyncedAt,lastSyncedHeadSha:n.lastSyncedHeadSha}));return{associations:t,signature:jf(t)}}function Yl(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var zR=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",jf=e=>Mf("sha256").update(JSON.stringify(e)).digest("hex"),Jl=(...e)=>Mf("sha256").update(e.join("\0")).digest("hex"),Xl=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,Ff=e=>BR.join(e.orchestrationDir,"event-reconciliation.json");function YR(e){return e?.schemaVersion===1&&typeof e.tasks=="object"&&e.tasks!==null&&typeof e.pullRequests=="object"&&e.pullRequests!==null&&typeof e.agents=="object"&&e.agents!==null?e:{schemaVersion:1,tasks:{},pullRequests:{},agents:{}}}async function JR(e){try{return await us(Ff(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function XR(e,t){return await Ql(e),await Kt(e),vr(e,t)}async function QR(e,t,n){await Ql(e);let r=await mt.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await Kt(e,{agentObserver:r});let a=await vr(e,{...t,...s?{after:s}:{}});for(let l of a.events)n.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,n.signal?.aborted)break;await qf(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function ZR(e,t,n){await Ql(e);let r=await P.getTask(e,t);if(n.tabId&&!r.ptyTabs.some(i=>i.kind==="agent"&&i.id===n.tabId))throw new y("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${t}.`,{details:{taskId:t,tabId:n.tabId}});let s=await mt.openObserver(e);try{await Kt(e,{agentObserver:s});let o=(await vr(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=Xe([r],s.getSnapshots(),l),u=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(u))return{kind:"waitTask",taskId:t,tabId:n.tabId??null,state:u,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw tS(t);let d=a-Date.now();if(d<=0)throw eS(t,n.states,n.timeoutMs);await Kt(e,{agentObserver:s}),o=(await vr(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await qf(Math.min(250,d),n.signal)}}finally{s.close()}}async function Ql(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new y("CLI_USAGE","Event orchestration is a feature preview. Enable agentOrchestration before using events commands.",{details:{preview:"agentOrchestration"}})}function qf(e,t){return t?.aborted?Promise.resolve():new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var eS=(e,t,n)=>new y("OPERATION_TIMEOUT",`Timed out after ${n}ms waiting for task ${e} agent state ${t.join(",")}.`,{retryable:!0,details:{taskId:e,states:t,timeoutMs:n}}),tS=e=>new y("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),Oi={list:XR,watch:QR,waitForTaskState:ZR,reconcile:Kt};import{readFile as sS}from"node:fs/promises";import{createConnection as nS}from"node:net";async function Jr(e){let t=await Wf(ft(e).socketPath).catch(()=>null);if(!t)return!1;try{return(await xi(t,{type:"ping"})).protocolVersion!==ln?!1:(await xi(t,{type:"wakeOrchestration"}),!0)}catch{return!1}finally{t.end()}}async function Zl(e,t){if(t.length===0)return!0;let n=await Wf(ft(e).socketPath).catch(()=>null);if(!n)return!1;try{if((await xi(n,{type:"ping"})).protocolVersion!==ln)return!1;for(let s of t)await xi(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}var rS=1;function xi(e,t){let n=rS++;return new Promise((r,s)=>{let i="",o=setTimeout(()=>s(new Error("Craig PTY daemon request timed out.")),1e3),a=c=>{i+=String(c);let u=i.indexOf(`
214
+ `);if(u===-1)return;l();let d=JSON.parse(i.slice(0,u));d.ok?r(d):s(new Error(d.error??"Craig PTY daemon request failed."))},l=()=>{clearTimeout(o),e.off("data",a)};e.on("data",a),e.write(`${JSON.stringify({...t,id:n})}
215
+ `)})}function Wf(e){return new Promise((t,n)=>{let r=nS(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function iS(e,t){await uS(e);let n=await P.getTask(e,t.taskId);if(n.status==="closed")throw new y("COMMAND_STATE_CONFLICT",`Task ${n.id} is ${n.status} and cannot receive prompts.`,{details:{taskId:n.id,taskStatus:n.status}});let r=n.ptyTabs.filter(a=>a.kind==="agent"),s=t.tabId?r.find(a=>a.id===t.tabId):r[0];if(!s)throw new y("TASK_CONTEXT_CONFLICT",t.tabId?`Agent tab ${t.tabId} does not belong to task ${n.id}.`:`Task ${n.id} has no agent tab.`,{details:{taskId:n.id,tabId:t.tabId??null}});let i=await dS(t.prompt,t.readStdin),o;try{o=await Re.create(e,{taskId:n.id,agentTabId:s.id,prompt:i,delivery:t.delivery,timeoutMs:t.timeoutMs,idempotencyKey:t.idempotencyKey??null,actor:{type:"human",source:"cli",processId:process.pid}})}catch(a){throw await Jr(e),a}return await Jr(e),o}async function oS(e,t){return Re.show(e,t)}async function aS(e,t){return Re.list(e,t)}async function lS(e,t){let n;try{n=await Re.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await Jr(e),r}return await Jr(e),n}async function cS(e,t,n){return Re.wait(e,t,n)}async function dS(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await sS(e.path,"utf8")}}catch(n){throw new y("CLI_USAGE",`Unable to read prompt file ${e.path}.`,{details:{promptFile:e.path},cause:n})}if(!t)throw new y("INPUT_REQUIRED","Prompt input from stdin is unavailable.",{});return{source:"stdin",text:await t()}}async function uS(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new y("CLI_USAGE","Prompt dispatch is a feature preview. Enable agentOrchestration before sending prompts.",{details:{preview:"agentOrchestration"}})}var Qn={send:iS,show:oS,list:aS,cancel:lS,wait:cS};async function Bf(e,t,n){let r=(await P.listTasks(e,{includeClosed:!0})).tasks,s=new Set([t]),i=!0;for(;i;){i=!1;for(let a of r)a.parentTaskId&&s.has(a.parentTaskId)&&!s.has(a.id)&&(s.add(a.id),i=!0)}let o=r.filter(a=>s.has(a.id)).flatMap(a=>a.ptyTabs.map(l=>l.id));try{let a=await dl(e,t,n);return await Zl(e,o),a}catch(a){throw a instanceof y&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await Zl(e,o),a}}async function Vf(e,t){switch(e.kind){case"addWorkspace":{let n=await fe.addWorkspace(t.paths,e.path),r=n.workspace.kind==="project"?n.workspace.discoveredRepoIds?.[0]??null:n.repos[0]?.id??null;return await tc(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await fe.repos.addRepo(t.paths,e.path);return await tc(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return fe.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await bn({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await Ie(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await fe.repos.removeRepo(t.paths,e.repoId,{listTasks:P.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await vt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await vt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return fe.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await fe.archiveWorkspace(t.paths,e.workspaceId);return await pS(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await fe.restoreWorkspace(t.paths,e.workspaceId);return await tc(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return fe.removeWorkspace(t.paths,e.workspaceId,{listTasks:P.listTasks});case"createTask":return al(t.paths,e.repoId??e.workspaceId??"",e.prompt,{...e.runner?{runner:e.runner}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}});case"createChildTask":{let n=await k.load(t.paths);if(!k.previews.isEnabled(n,"agentOrchestration"))throw new y("CLI_USAGE","Child delegation is a feature preview. Enable agentOrchestration before creating child tasks.",{details:{preview:"agentOrchestration"}});return ec(t),ll(t.paths,{parentTaskId:e.parentTaskId??Zn(t).task.id,repoId:e.repoId,prompt:e.prompt,...e.runner?{runner:e.runner}:{},...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.agentCapabilityId?{capabilityId:t.agentCapabilityId}:{}})}case"listTaskChildren":return ec(t),cl(t.paths,e.taskId??Zn(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return ec(t),Bf(t.paths,e.taskId??Zn(t).task.id,t.agentCapabilityId);case"validateSwarm":return await Kf(t),Gl(Uf.resolve(t.cwd??process.cwd(),e.file));case"planSwarm":return await Kf(t),Hl(Uf.resolve(t.cwd??process.cwd(),e.file),e.inputs);case"listTasks":return e.repoId||e.workspaceId?P.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):P.listTasks(t.paths);case"currentTask":{let n=Zn(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"attachTask":return P.attachTask(t.paths,e.taskId);case"addTaskLink":return P.addTaskLink(t.paths,e.taskId,e.repoId);case"listTaskLinks":return P.listTaskLinks(t.paths,e.taskId);case"refreshInteractiveState":throw new Error("Interactive refresh should be handled by the interactive app.");case"showTask":return P.showTask(t.paths,e.taskId);case"showCurrentTask":return P.showTask(t.paths,Zn(t).task.id);case"showTaskPr":return P.prs.show(t.paths,hn(e.taskId,t),e.repoId);case"discoverTaskPr":return P.prs.discover(t.paths,hn(e.taskId,t),e.repoId);case"linkTaskPr":return P.prs.link(t.paths,hn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return P.prs.refreshAssociation(t.paths,hn(e.taskId,t),e.repoId);case"unlinkTaskPr":return P.prs.unlink(t.paths,hn(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return mt.listAgents(t.paths,e.taskId);case"showAgentStatus":return mt.showAgentStatus(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.tabId?{tabId:e.tabId}:{}});case"waitTask":{let n={states:e.states,timeoutMs:e.timeoutMs,...e.tabId?{tabId:e.tabId}:{},...t.signal?{signal:t.signal}:{}},r=hn(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?Oi.waitForTaskState(t.paths,r,n):mt.waitForTask(t.paths,r,n)}case"listEvents":return Oi.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return Oi.watch(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}},{onEvent:t.emitEvent??(()=>{}),...t.signal?{signal:t.signal}:{}});case"sendAgentPrompt":return Qn.send(t.paths,{taskId:hn(e.taskId,t),...e.tabId?{tabId:e.tabId}:t.taskContext?.agentTabId?{tabId:t.taskContext.agentTabId}:{},prompt:e.prompt,delivery:e.delivery,timeoutMs:e.timeoutMs,...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.readStdin?{readStdin:t.readStdin}:{}});case"showPromptCommand":return Qn.show(t.paths,e.commandId);case"listPromptCommands":return Qn.list(t.paths,e.taskId);case"cancelPromptCommand":return Qn.cancel(t.paths,e.commandId);case"waitPromptCommand":return Qn.wait(t.paths,e.commandId,{...e.states?{states:e.states}:{},timeoutMs:e.timeoutMs,...t.signal?{signal:t.signal}:{}});case"showSelectedTask":return P.showTask(t.paths,mn(t,"show"));case"streamTaskLogs":return P.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return P.prepareTaskLogs(t.paths,mn(t,"logs"));case"showTaskDiff":return P.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return P.showTaskDiff(t.paths,mn(t,"diff"));case"focusTask":return P.focusTask(t.paths,e.taskId);case"focusSelectedTask":return P.focusTask(t.paths,mn(t,"focus"));case"openTask":return P.openTask(t.paths,e.taskId);case"openSelectedTask":return P.openTask(t.paths,mn(t,"open"));case"runChecks":return P.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return P.runChecks(t.paths,mn(t,"check"));case"commitTask":return P.commitTask(t.paths,e.taskId);case"commitSelectedTask":return P.commitTask(t.paths,mn(t,"commit"));case"showContext":{let n=mS(t);return{kind:"showContext",workspace:{root:n.workspaceRoot,source:n.source,initialized:n.initialized},task:t.taskContext?{id:t.taskContext.task.id,source:t.taskContext.source,agentTabId:t.taskContext.agentTabId}:null}}case"help":return{kind:"help",text:bo()};case"exit":return{kind:"exit"};default:return fS(e)}}function ec(e){if(!(!e.agentContext||e.agentCapabilityId))throw new y("CAPABILITY_DENIED","This agent session has no delegation capability. Restart the agent session to receive one.",{details:{reason:"agent capability is missing"}})}async function Kf(e){let t=await k.load(e.paths);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new y("CLI_USAGE","Swarm planning is a feature preview. Enable agentOrchestration before validating or planning a swarm.",{details:{preview:"agentOrchestration"}})}async function tc(e,t,n){let r=await bn({uiStateFile:e.uiStateFile})??fs();await vt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function pS(e,t){let n=await bn({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await vt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function fS(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function mn(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>'.`)}function Zn(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function hn(e,t){return e??Zn(t).task.id}function mS(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Gf(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(`
84
216
  `);case"createRepo":return[`${e.created?"Registered":"Already registered"} repo ${e.repo.id}`,`Path: ${e.repo.rootPath}`,`Branch: ${e.repo.defaultBranch}`,`Workspace: ${e.workspaceId}`].join(`
85
217
  `);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(`
86
218
  `);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(`
87
219
  `);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(`
220
+ `);case"createChildTask":return[`${e.idempotentReplay?"Found":"Created"} child task ${e.taskId}`,`Parent: ${e.parentTaskId}`,`Root: ${e.rootTaskId}`,`Depth: ${e.delegationDepth}`,`Status: ${e.status}`,`Worktree: ${e.worktreePath}`].join(`
221
+ `);case"listTaskChildren":return e.children.length===0?`Task ${e.taskId} has no children.`:["ID STATUS DEPTH TITLE",...e.children.map(t=>`${t.id} ${t.status} ${t.delegationDepth} ${t.title}`)].join(`
222
+ `);case"cancelTaskTree":return[`Cancelled task tree ${e.taskId}`,...e.cancelled.map(t=>`${t.taskId}: ${t.disposition}`)].join(`
223
+ `);case"validateSwarm":return[`Valid swarm ${e.name}`,`Definition: ${e.definitionHash}`,`Steps: ${e.stepCount}`,`Order: ${e.order.join(" -> ")}`].join(`
224
+ `);case"planSwarm":return[`Planned swarm ${e.name}`,`Definition: ${e.definitionHash}`,`Steps: ${e.steps.length}`,...e.waves.map((t,n)=>`Wave ${n}: ${t.join(", ")}`),"Mutations: none"].join(`
88
225
  `);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(`
89
- `);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} ${yw(t)} ${Tw(t)} ${t.title}`)].join(`
90
- `);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}`,...ww(e)].join(`
226
+ `);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} ${TS(t)} ${bS(t)} ${t.title}`)].join(`
227
+ `);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}`,...wS(e)].join(`
91
228
  `);case"currentTask":return[`${e.task.id}: ${e.task.title}`,`Workspace: ${e.task.workspaceId}`,`Repo: ${e.task.repoId}`,`Worktree: ${e.task.worktreePath}`,`Context source: ${e.context.source}`,`Agent tab: ${e.context.agentTabId??"none"}`].join(`
92
- `);case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return hw(e);case"listAgents":case"showAgentStatus":return gw(e);case"waitTask":return`Task ${e.taskId}${e.tabId?` tab ${e.tabId}`:""} reached ${e.state}.`;case"listEvents":return e.events.length===0?"No events found.":e.events.map(Wi).join(`
93
- `);case"watchEvents":return"";case"sendAgentPrompt":return`${e.created?"Queued":"Found"} command ${e.command.id} for task ${e.command.taskId} tab ${e.command.agentTabId}.`;case"showPromptCommand":return fw(e.command);case"listPromptCommands":return e.commands.length===0?"No prompt commands found.":["ID TASK TAB STATE DELIVERY ATTEMPTS",...e.commands.map(t=>`${t.id} ${t.taskId} ${t.agentTabId} ${t.state} ${t.delivery} ${t.attempts}`)].join(`
229
+ `);case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return yS(e);case"listAgents":case"showAgentStatus":return gS(e);case"waitTask":return`Task ${e.taskId}${e.tabId?` tab ${e.tabId}`:""} reached ${e.state}.`;case"listEvents":return e.events.length===0?"No events found.":e.events.map(nc).join(`
230
+ `);case"watchEvents":return"";case"sendAgentPrompt":return`${e.created?"Queued":"Found"} command ${e.command.id} for task ${e.command.taskId} tab ${e.command.agentTabId}.`;case"showPromptCommand":return hS(e.command);case"listPromptCommands":return e.commands.length===0?"No prompt commands found.":["ID TASK TAB STATE DELIVERY ATTEMPTS",...e.commands.map(t=>`${t.id} ${t.taskId} ${t.agentTabId} ${t.state} ${t.delivery} ${t.attempts}`)].join(`
94
231
  `);case"cancelPromptCommand":return`${e.changed?"Cancelled":"Command already cancelled:"} ${e.command.id}`;case"waitPromptCommand":return`Command ${e.command.id} reached ${e.command.state}.`;case"showContext":return[`Workspace: ${e.workspace.root}`,`Workspace source: ${e.workspace.source}`,`Initialized: ${e.workspace.initialized?"yes":"no"}`,`Task: ${e.task?.id??"none"}`,`Task source: ${e.task?.source??"none"}`,`Agent tab: ${e.task?.agentTabId??"none"}`].join(`
95
232
  `);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(`
96
- `);default:return kw(e)}}function fw(e){return[`${e.id}: ${e.state}`,`Task: ${e.taskId}`,`Agent tab: ${e.agentTabId}`,`Delivery: ${e.delivery}`,`Attempts: ${e.attempts}`,`Prompt source: ${e.prompt.source}`,`Prompt bytes: ${Buffer.byteLength(e.prompt.text)}`,`Created: ${e.createdAt}`,`Updated: ${e.updatedAt}`,`Error: ${e.lastError?.message??"none"}`].join(`
97
- `)}function Wi(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function gw(e){return e.agents.length===0?"No agent tabs found.":["TASK TAB RUNNER STATE SESSION ERROR",...e.agents.map(t=>`${t.taskId} ${t.tabId} ${t.runner} ${t.state} ${t.sessionState??"none"} ${t.error??""}`),...e.daemonAvailable?[]:["Warning: PTY daemon unavailable; live agent tabs report idle unless a durable startup failure exists."]].join(`
98
- `)}function hw(e){let t=`${e.taskId} (${e.repoId}): ${e.disposition}`,r=e.pullRequests.length===0?["No pull requests associated."]:["PR STATUS HEAD URL",...e.pullRequests.map(n=>`#${n.number??"-"} ${n.status??"unknown"} ${n.headBranch??"-"} ${n.url??"-"}`)];return[t,...r,...e.warnings.map(n=>`Warning: ${n}`)].join(`
99
- `)}function ww(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 kw(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function yw(e){return e.checks.status}function Tw(e){if(e.type==="project"&&e.repoTargets?.length){let r=e.repoTargets.filter(s=>s.pullRequest.number);if(r.length===0)return"-";let n=r.reduce((s,i)=>{let o=i.pullRequest.status??"unknown";return s[o]=(s[o]??0)+1,s},{});return Object.entries(n).map(([s,i])=>`${i} ${s}`).join(", ")}let t=e.prs[0];return t?.number?`#${t.number}:${t.status??"unknown"}`:"-"}function bc(e,t){let{data:r,warnings:n}=Rw(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:r,warnings:n})}function Rw(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...r}=e;return{data:r,warnings:t}}return{data:e,warnings:[]}}function Pc(e,t){let r={schemaVersion:1,command:e,ok:!1,error:{code:t.code,message:t.message,retryable:t.retryable,details:t.details}};return JSON.stringify(r)}async function qi(e){let t=await X.resolveContext({cwd:e.cwd,...e.explicitWorkspaceRoot!==void 0?{explicitWorkspaceRoot:e.explicitWorkspaceRoot}:{},...e.environmentWorkspaceRoot!==void 0?{environmentWorkspaceRoot:e.environmentWorkspaceRoot}:{},...e.allowUninitializedWorkspace!==void 0?{allowUninitializedCwd:e.allowUninitializedWorkspace}:{}}),r=ne(t.workspaceRoot),n=e.resolveTask===!0||e.requireTask===!0||e.explicitTaskId!==void 0||e.environmentTaskId!==void 0||e.environmentAgentTabId!==void 0;if(n&&!t.initialized)throw new g("TASK_CONTEXT_NOT_FOUND",`Task context cannot be resolved because ${t.workspaceRoot} is not an initialized Craig workspace.`,{details:{workspaceRoot:t.workspaceRoot}});let s=n&&t.initialized?await P.resolveContext(r,{cwd:e.cwd,...e.explicitTaskId!==void 0?{explicitTaskId:e.explicitTaskId}:{},...e.environmentTaskId!==void 0?{environmentTaskId:e.environmentTaskId}:{},...e.environmentAgentTabId!==void 0?{environmentAgentTabId:e.environmentAgentTabId}:{},...e.requireTask!==void 0?{required:e.requireTask}:{}}):null;return{paths:r,workspace:t,task:s}}async function Sc(e){let t="cli",r=ya(e.argv);try{let n=ka(e.argv);if(r=n.options.json,n.mode==="interactive"){if(n.options.noInput||n.options.json||Ew(e.env)||!e.isInputTty||!e.isOutputTty)throw new g("INPUT_REQUIRED","Interactive Craig requires a TTY. Provide a command instead of starting the terminal application.",{});let u=await qi({cwd:e.cwd,...n.options.workspaceRoot!==void 0?{explicitWorkspaceRoot:n.options.workspaceRoot}:{},...e.env.CRAIG_WORKSPACE_ROOT!==void 0?{environmentWorkspaceRoot:e.env.CRAIG_WORKSPACE_ROOT}:{},allowUninitializedWorkspace:!0});return e.runInteractive(u.workspace.workspaceRoot)}if(!n.command||!n.commandName)throw new g("CLI_USAGE","Command mode requires a command.",{});if(t=n.commandName,n.command.kind==="watchEvents"&&n.options.json)throw new g("CLI_USAGE","events watch streams output; use --format jsonl instead of --json.",{});Sw(n.command,n.options.taskId);let s=Iw(n.command,n.options.taskId),i=Pw(s);vw(s,n.options.taskId,i);let o=i!=="none",a=await qi({cwd:e.cwd,...n.options.workspaceRoot!==void 0?{explicitWorkspaceRoot:n.options.workspaceRoot}:{},...e.env.CRAIG_WORKSPACE_ROOT!==void 0?{environmentWorkspaceRoot:e.env.CRAIG_WORKSPACE_ROOT}:{},...o&&n.options.taskId!==void 0?{explicitTaskId:n.options.taskId}:{},...o&&e.env.CRAIG_TASK_ID!==void 0?{environmentTaskId:e.env.CRAIG_TASK_ID}:{},...o&&e.env.CRAIG_AGENT_TAB_ID!==void 0?{environmentAgentTabId:e.env.CRAIG_AGENT_TAB_ID}:{},allowUninitializedWorkspace:bw(s),resolveTask:i!=="none",requireTask:i==="required"}),l=Cw(s,e.signal),c;try{c=await Tc(s,{paths:a.paths,workspaceContext:a.workspace,taskContext:a.task,...l.signal?{signal:l.signal}:{},...s.kind==="watchEvents"?{emitEvent:u=>e.writeStdout(`${s.format==="jsonl"?JSON.stringify(u):Wi(u)}
100
- `)}:{},...e.readStdin?{readStdin:e.readStdin}:{}})}finally{l.dispose()}let d=r?bc(t,c):Rc(c);return d.length>0&&e.writeStdout(`${d}
101
- `),0}catch(n){let s=Zn(n),i=r?Pc(t,s):s.message;return e.writeStderr(`${i}
102
- `),s.exitCode}}function bw(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function Pw(e){return e.kind==="showContext"?"optional":e.kind==="currentTask"||e.kind==="showCurrentTask"?"required":Aw(e)?e.taskId?"none":"required":e.kind==="listAgents"||e.kind==="showAgentStatus"||e.kind==="listEvents"||e.kind==="watchEvents"?"none":e.kind==="sendAgentPrompt"?e.taskId?"none":"required":e.kind==="listPromptCommands"?"none":e.kind==="waitTask"?e.taskId?"none":"required":"none"}function Sw(e,t){let r=vc(e);if(!(r===void 0||t===void 0||t===r))throw new g("CLI_USAGE",`Task ${r} conflicts with --task ${t}. Provide only one task target.`,{details:{positionalTaskId:r,globalTaskId:t}})}function vw(e,t,r){if(!(t===void 0||r!=="none"||vc(e)===t))throw new g("CLI_USAGE",`--task is not supported by ${e.kind}. Use it with context show, task current, or task show without an id.`,{details:{commandKind:e.kind,globalTaskId:t}})}function vc(e){switch(e.kind){case"showTask":case"attachTask":case"listTaskLinks":case"streamTaskLogs":case"showTaskDiff":case"focusTask":case"openTask":case"runChecks":case"commitTask":case"waitTask":case"listAgents":case"showAgentStatus":case"listEvents":case"watchEvents":case"sendAgentPrompt":case"listPromptCommands":return e.taskId;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return e.taskId;case"addTaskLink":return e.taskId;default:return}}function Iw(e,t){return t&&(e.kind==="listAgents"||e.kind==="showAgentStatus"||e.kind==="waitTask"||e.kind==="listEvents"||e.kind==="watchEvents"||e.kind==="sendAgentPrompt"||e.kind==="listPromptCommands")?{...e,taskId:e.taskId??t}:e}function Cw(e,t){if(e.kind!=="waitTask"&&e.kind!=="watchEvents"&&e.kind!=="waitPromptCommand")return{dispose:()=>{}};if(t)return{signal:t,dispose:()=>{}};let r=new AbortController,n=()=>r.abort();return process.once("SIGINT",n),{signal:r.signal,dispose:()=>process.removeListener("SIGINT",n)}}function Aw(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function Ew(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as cR}from"node:module";import{readFile as xw,stat as Dw}from"node:fs/promises";import Ui from"node:path";var Ow=200*1024,$w=500*1024,fn="100000";async function Cc(e,t,r){if(e.type==="project"&&e.repoTargets?.length)return Mw(e,t,r);try{let n=Xe(r.selectedFilePath??null,t.filePaths),s=Xe(r.selectedDiffPath??null,t.diffPaths),i=s?await wr(e.worktreePath):null,[o,a]=await Promise.all([hn(e.worktreePath,n),s?Bi(e.worktreePath,s,t.diffRows,i):Promise.resolve(ee("No diff selected","No local changes found.","empty"))]),l=s?{[s]:a}:{};return{...t,selectedFilePath:n,selectedDiffPath:s,diffContents:l,selectedFile:o,selectedDiff:a,error:null}}catch(n){let s=n instanceof Error?n.message:"Unable to inspect task worktree.";return{...t,error:s}}}async function Mw(e,t,r){let n=Xe(r.selectedFilePath??null,t.filePaths),s=Xe(r.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([Ec(e,n),(async()=>{if(!s)return ee("No diff selected","No local changes found.","empty");let l=gn(e,s),c=l?await wr(l.target.worktreePath).catch(()=>null):null;return xc(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:n,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function Ac(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return Nw(e,t);try{await J(e);let r=await wr(e.worktreePath),[n,s]=await Promise.all([Dc(e.worktreePath),Oc(e.worktreePath,r)]),i=[...new Set(s.map(u=>u.path))],o=Xe(t.selectedFilePath??null,n),a=Xe(t.selectedDiffPath??null,i),[l,c]=await Promise.all([hn(e.worktreePath,o),a?Bi(e.worktreePath,a,s,r):Promise.resolve(ee("No diff selected","No local changes found.","empty"))]),d=a?{[a]:c}:{};return{taskId:e.id,fileRows:Nc(n),filePaths:n,diffRows:s,diffPaths:i,diffContents:d,selectedFilePath:o,selectedDiffPath:a,selectedFile:l,selectedDiff:c,error:null}}catch(r){let n=r instanceof Error?r.message:"Unable to inspect task worktree.";return{taskId:e.id,fileRows:[],filePaths:[],diffRows:[],diffPaths:[],diffContents:{},selectedFilePath:null,selectedDiffPath:null,selectedFile:ee("Files unavailable",n,"error"),selectedDiff:ee("Diff unavailable",n,"error"),error:n}}}async function Nw(e,t){let r=(e.repoTargets??[]).filter(f=>f.status==="ready"),n=await Promise.all(r.map(async f=>{let h=await wr(f.worktreePath).catch(()=>null),[p,w]=await Promise.all([Dc(f.worktreePath).catch(()=>[]),Oc(f.worktreePath,h).catch(()=>[])]);return{target:f,baseRef:h,targetFiles:p,targetDiffRows:w}})),s=[],i=[];for(let{target:f,targetFiles:h,targetDiffRows:p}of n)s.push(...h.map(w=>`${f.repoId}/${w}`)),i.push(...p.map(w=>({...w,path:`${f.repoId}/${w.path}`})));let o=[...new Set(i.map(f=>f.path))].sort(),a=Xe(t.selectedFilePath??null,s),l=Xe(t.selectedDiffPath??null,o),[c,d]=await Promise.all([Ec(e,a),(async()=>{if(!l)return ee("No diff selected","No local changes found.","empty");let f=gn(e,l),h=f?n.find(p=>p.target.repoId===f.target.repoId):null;return xc(e,l,i,h?.baseRef??null)})()]),u=l?{[l]:d}:{};return{taskId:e.id,fileRows:Nc(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:u,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:d,error:null}}async function Ec(e,t){let r=gn(e,t);if(!r)return ee("No file selected","No Git-visible files found.","empty");let n=await hn(r.target.worktreePath,r.relativePath);return{...n,path:t,title:t??n.title}}async function xc(e,t,r,n=null){let s=gn(e,t);return s?{...await Bi(s.target.worktreePath,s.relativePath,r.filter(o=>o.path.startsWith(`${s.target.repoId}/`)).map(o=>({...o,path:o.path.slice(s.target.repoId.length+1)})),n),path:t,title:t}:ee(t,"Repo target is unavailable.","error",t)}function gn(e,t){if(!t)return null;let[r,...n]=t.split("/"),s=n.join("/"),i=(e.repoTargets??[]).find(o=>o.repoId===r&&o.status==="ready")??null;return!i||s.length===0?null:{target:i,relativePath:s}}async function Dc(e){let t=await C("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return Lc(t.stdout)}async function Oc(e,t){let[r,n,s,i]=await Promise.all([Lw(e,t),Ic(e,"staged"),Ic(e,"unstaged"),_w(e)]);return[...r,...n,...s,...i]}async function Lw(e,t){if(!t)return[];let[r,n]=await Promise.all([C("git",["diff","--name-status",`${t}...HEAD`],{cwd:e}),C("git",["diff","--numstat",`${t}...HEAD`],{cwd:e})]),s=$c(r.stdout),i=Mc(n.stdout);return s.map(o=>{let a=i.get(o.path)??{additions:null,deletions:null};return{group:"branch",path:o.path,status:o.status,additions:a.additions,deletions:a.deletions}}).sort((o,a)=>o.path.localeCompare(a.path))}async function Ic(e,t){let r=t==="staged"?["diff","--cached"]:["diff"],[n,s]=await Promise.all([C("git",[...r,"--name-status"],{cwd:e}),C("git",[...r,"--numstat"],{cwd:e})]),i=$c(n.stdout),o=Mc(s.stdout);return i.map(a=>{let l=o.get(a.path)??{additions:null,deletions:null};return{group:t,path:a.path,status:a.status,additions:l.additions,deletions:l.deletions}}).sort((a,l)=>a.path.localeCompare(l.path))}async function _w(e){let t=await C("git",["ls-files","--others","--exclude-standard"],{cwd:e}),r=Lc(t.stdout);return await Promise.all(r.map(async s=>{let i=await hn(e,s),o=i.status==="ready"?jw(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function $c(e){return e.split(`
103
- `).map(t=>t.trim()).filter(t=>t.length>0).map(t=>{let[r="M",...n]=t.split(" ");return{status:r,path:n.at(-1)??""}}).filter(t=>t.path.length>0)}function Mc(e){let t=new Map;for(let r of e.split(`
104
- `)){let n=r.trim();if(!n)continue;let[s="-",i="-",...o]=n.split(" "),a=o.join(" ");a&&t.set(a,{additions:s==="-"?null:Number(s),deletions:i==="-"?null:Number(i)})}return t}async function wr(e){return(await $("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await $("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function hn(e,t){if(!t)return ee("No file selected","No Git-visible files found.","empty");let r=Fw(e,t);try{let n=await Dw(r);if(n.size>Ow)return ee(t,`File is ${n.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,n.size);let s=await xw(r);return Ww(s)?ee(t,"Binary file preview is not available in Craig.","binary",t,s.byteLength):{path:t,status:"ready",title:t,lines:s.toString("utf8").split(`
105
- `),byteLength:s.byteLength}}catch(n){let s=n instanceof Error?n.message:"Unable to read file.";return ee(t,s,"missing",t,null)}}async function Bi(e,t,r,n=null){if(!t)return ee("No diff selected","No local changes found.","empty");let s=[],i=r.filter(a=>a.path===t).map(a=>a.group);if(i.includes("branch")){let a=n??await wr(e);if(a){let l=await C("git",["diff","--stat","--patch",`--unified=${fn}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
106
- ${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await C("git",["diff","--cached","--stat","--patch",`--unified=${fn}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
107
- ${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await C("git",["diff","--stat","--patch",`--unified=${fn}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
108
- ${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await $("git",["diff","--no-index","--stat","--patch",`--unified=${fn}`,"--","/dev/null",t],{cwd:e});a.stdout.trim().length>0&&s.push(`untracked
233
+ `);default:return kS(e)}}function hS(e){return[`${e.id}: ${e.state}`,`Task: ${e.taskId}`,`Agent tab: ${e.agentTabId}`,`Delivery: ${e.delivery}`,`Attempts: ${e.attempts}`,`Prompt source: ${e.prompt.source}`,`Prompt bytes: ${Buffer.byteLength(e.prompt.text)}`,`Created: ${e.createdAt}`,`Updated: ${e.updatedAt}`,`Error: ${e.lastError?.message??"none"}`].join(`
234
+ `)}function nc(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function gS(e){return e.agents.length===0?"No agent tabs found.":["TASK TAB RUNNER STATE SESSION ERROR",...e.agents.map(t=>`${t.taskId} ${t.tabId} ${t.runner} ${t.state} ${t.sessionState??"none"} ${t.error??""}`),...e.daemonAvailable?[]:["Warning: PTY daemon unavailable; live agent tabs report idle unless a durable startup failure exists."]].join(`
235
+ `)}function yS(e){let t=`${e.taskId} (${e.repoId}): ${e.disposition}`,n=e.pullRequests.length===0?["No pull requests associated."]:["PR STATUS HEAD URL",...e.pullRequests.map(r=>`#${r.number??"-"} ${r.status??"unknown"} ${r.headBranch??"-"} ${r.url??"-"}`)];return[t,...n,...e.warnings.map(r=>`Warning: ${r}`)].join(`
236
+ `)}function wS(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 kS(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function TS(e){return e.checks.status}function bS(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,i)=>{let o=i.pullRequest.status??"unknown";return s[o]=(s[o]??0)+1,s},{});return Object.entries(r).map(([s,i])=>`${i} ${s}`).join(", ")}let t=e.prs[0];return t?.number?`#${t.number}:${t.status??"unknown"}`:"-"}function Hf(e,t){let{data:n,warnings:r}=RS(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:n,warnings:r})}function RS(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...n}=e;return{data:n,warnings:t}}return{data:e,warnings:[]}}function zf(e,t){let n={schemaVersion:1,command:e,ok:!1,error:{code:t.code,message:t.message,retryable:t.retryable,details:t.details}};return JSON.stringify(n)}async function rc(e){let t=await fe.resolveContext({cwd:e.cwd,...e.explicitWorkspaceRoot!==void 0?{explicitWorkspaceRoot:e.explicitWorkspaceRoot}:{},...e.environmentWorkspaceRoot!==void 0?{environmentWorkspaceRoot:e.environmentWorkspaceRoot}:{},...e.allowUninitializedWorkspace!==void 0?{allowUninitializedCwd:e.allowUninitializedWorkspace}:{}}),n=Te(t.workspaceRoot),r=e.resolveTask===!0||e.requireTask===!0||e.explicitTaskId!==void 0||e.environmentTaskId!==void 0||e.environmentAgentTabId!==void 0;if(r&&!t.initialized)throw new y("TASK_CONTEXT_NOT_FOUND",`Task context cannot be resolved because ${t.workspaceRoot} is not an initialized Craig workspace.`,{details:{workspaceRoot:t.workspaceRoot}});let s=r&&t.initialized?await P.resolveContext(n,{cwd:e.cwd,...e.explicitTaskId!==void 0?{explicitTaskId:e.explicitTaskId}:{},...e.environmentTaskId!==void 0?{environmentTaskId:e.environmentTaskId}:{},...e.environmentAgentTabId!==void 0?{environmentAgentTabId:e.environmentAgentTabId}:{},...e.requireTask!==void 0?{required:e.requireTask}:{}}):null;return{paths:n,workspace:t,task:s}}async function Yf(e){let t="cli",n=Nd(e.argv);try{let r=Dd(e.argv);if(n=r.options.json,r.mode==="interactive"){if(r.options.noInput||r.options.json||OS(e.env)||!e.isInputTty||!e.isOutputTty)throw new y("INPUT_REQUIRED","Interactive Craig requires a TTY. Provide a command instead of starting the terminal application.",{});let d=await rc({cwd:e.cwd,...r.options.workspaceRoot!==void 0?{explicitWorkspaceRoot:r.options.workspaceRoot}:{},...e.env.CRAIG_WORKSPACE_ROOT!==void 0?{environmentWorkspaceRoot:e.env.CRAIG_WORKSPACE_ROOT}:{},allowUninitializedWorkspace:!0});return e.runInteractive(d.workspace.workspaceRoot)}if(!r.command||!r.commandName)throw new y("CLI_USAGE","Command mode requires a command.",{});if(t=r.commandName,r.command.kind==="watchEvents"&&r.options.json)throw new y("CLI_USAGE","events watch streams output; use --format jsonl instead of --json.",{});IS(r.command,r.options.taskId);let s=CS(r.command,r.options.taskId),i=PS(s);vS(s,r.options.taskId,i);let o=i!=="none",a=await rc({cwd:e.cwd,...r.options.workspaceRoot!==void 0?{explicitWorkspaceRoot:r.options.workspaceRoot}:{},...e.env.CRAIG_WORKSPACE_ROOT!==void 0?{environmentWorkspaceRoot:e.env.CRAIG_WORKSPACE_ROOT}:{},...o&&r.options.taskId!==void 0?{explicitTaskId:r.options.taskId}:{},...o&&e.env.CRAIG_TASK_ID!==void 0?{environmentTaskId:e.env.CRAIG_TASK_ID}:{},...o&&e.env.CRAIG_AGENT_TAB_ID!==void 0?{environmentAgentTabId:e.env.CRAIG_AGENT_TAB_ID}:{},allowUninitializedWorkspace:SS(s),resolveTask:i!=="none",requireTask:i==="required"}),l=AS(s,e.signal),c;try{c=await Vf(s,{paths:a.paths,cwd:e.cwd,workspaceContext:a.workspace,taskContext:a.task,...l.signal?{signal:l.signal}:{},...s.kind==="watchEvents"?{emitEvent:d=>e.writeStdout(`${s.format==="jsonl"?JSON.stringify(d):nc(d)}
237
+ `)}:{},...e.readStdin?{readStdin:e.readStdin}:{},...e.env.CRAIG_AGENT_TAB_ID?{agentContext:!0}:{},...e.env.CRAIG_AGENT_CAPABILITY?{agentCapabilityId:e.env.CRAIG_AGENT_CAPABILITY}:{}})}finally{l.dispose()}let u=n?Hf(t,c):Gf(c);return u.length>0&&e.writeStdout(`${u}
238
+ `),0}catch(r){let s=wo(r),i=n?zf(t,s):s.message;return e.writeStderr(`${i}
239
+ `),s.exitCode}}function SS(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function PS(e){return e.kind==="showContext"?"optional":e.kind==="currentTask"||e.kind==="showCurrentTask"?"required":e.kind==="createChildTask"?e.parentTaskId?"none":"required":e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||ES(e)?e.taskId?"none":"required":e.kind==="listAgents"||e.kind==="showAgentStatus"||e.kind==="listEvents"||e.kind==="watchEvents"?"none":e.kind==="sendAgentPrompt"?e.taskId?"none":"required":e.kind==="listPromptCommands"?"none":e.kind==="waitTask"?e.taskId?"none":"required":"none"}function IS(e,t){let n=Jf(e);if(!(n===void 0||t===void 0||t===n))throw new y("CLI_USAGE",`Task ${n} conflicts with --task ${t}. Provide only one task target.`,{details:{positionalTaskId:n,globalTaskId:t}})}function vS(e,t,n){if(!(t===void 0||n!=="none"||Jf(e)===t))throw new y("CLI_USAGE",`--task is not supported by ${e.kind}. Use it with context show, task current, or task show without an id.`,{details:{commandKind:e.kind,globalTaskId:t}})}function Jf(e){switch(e.kind){case"showTask":case"attachTask":case"listTaskLinks":case"listTaskChildren":case"cancelTaskTree":case"streamTaskLogs":case"showTaskDiff":case"focusTask":case"openTask":case"runChecks":case"commitTask":case"waitTask":case"listAgents":case"showAgentStatus":case"listEvents":case"watchEvents":case"sendAgentPrompt":case"listPromptCommands":return e.taskId;case"createChildTask":return e.parentTaskId;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return e.taskId;case"addTaskLink":return e.taskId;default:return}}function CS(e,t){return t&&(e.kind==="listAgents"||e.kind==="showAgentStatus"||e.kind==="waitTask"||e.kind==="listEvents"||e.kind==="watchEvents"||e.kind==="sendAgentPrompt"||e.kind==="listPromptCommands"||e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||e.kind==="createChildTask")?e.kind==="createChildTask"?{...e,parentTaskId:e.parentTaskId??t}:{...e,taskId:e.taskId??t}:e}function AS(e,t){if(e.kind!=="waitTask"&&e.kind!=="watchEvents"&&e.kind!=="waitPromptCommand")return{dispose:()=>{}};if(t)return{signal:t,dispose:()=>{}};let n=new AbortController,r=()=>n.abort();return process.once("SIGINT",r),{signal:n.signal,dispose:()=>process.removeListener("SIGINT",r)}}function ES(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function OS(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as dC}from"node:module";import{readFile as xS,stat as $S}from"node:fs/promises";import sc from"node:path";var DS=200*1024,NS=500*1024,$i="100000";async function Qf(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return _S(e,t,n);try{let r=Vt(n.selectedFilePath??null,t.filePaths),s=Vt(n.selectedDiffPath??null,t.diffPaths),i=s?await Xr(e.worktreePath):null,[o,a]=await Promise.all([Ni(e.worktreePath,r),s?ic(e.worktreePath,s,t.diffRows,i):Promise.resolve(we("No diff selected","No local changes found.","empty"))]),l=s?{[s]:a}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:l,selectedFile:o,selectedDiff:a,error:null}}catch(r){let s=r instanceof Error?r.message:"Unable to inspect task worktree.";return{...t,error:s}}}async function _S(e,t,n){let r=Vt(n.selectedFilePath??null,t.filePaths),s=Vt(n.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([em(e,r),(async()=>{if(!s)return we("No diff selected","No local changes found.","empty");let l=Di(e,s),c=l?await Xr(l.target.worktreePath).catch(()=>null):null;return tm(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function Zf(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return LS(e,t);try{await de(e);let n=await Xr(e.worktreePath),[r,s]=await Promise.all([nm(e.worktreePath),rm(e.worktreePath,n)]),i=[...new Set(s.map(d=>d.path))],o=Vt(t.selectedFilePath??null,r),a=Vt(t.selectedDiffPath??null,i),[l,c]=await Promise.all([Ni(e.worktreePath,o),a?ic(e.worktreePath,a,s,n):Promise.resolve(we("No diff selected","No local changes found.","empty"))]),u=a?{[a]:c}:{};return{taskId:e.id,fileRows:om(r),filePaths:r,diffRows:s,diffPaths:i,diffContents:u,selectedFilePath:o,selectedDiffPath:a,selectedFile:l,selectedDiff:c,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:we("Files unavailable",r,"error"),selectedDiff:we("Diff unavailable",r,"error"),error:r}}}async function LS(e,t){let n=(e.repoTargets??[]).filter(p=>p.status==="ready"),r=await Promise.all(n.map(async p=>{let h=await Xr(p.worktreePath).catch(()=>null),[f,m]=await Promise.all([nm(p.worktreePath).catch(()=>[]),rm(p.worktreePath,h).catch(()=>[])]);return{target:p,baseRef:h,targetFiles:f,targetDiffRows:m}})),s=[],i=[];for(let{target:p,targetFiles:h,targetDiffRows:f}of r)s.push(...h.map(m=>`${p.repoId}/${m}`)),i.push(...f.map(m=>({...m,path:`${p.repoId}/${m.path}`})));let o=[...new Set(i.map(p=>p.path))].sort(),a=Vt(t.selectedFilePath??null,s),l=Vt(t.selectedDiffPath??null,o),[c,u]=await Promise.all([em(e,a),(async()=>{if(!l)return we("No diff selected","No local changes found.","empty");let p=Di(e,l),h=p?r.find(f=>f.target.repoId===p.target.repoId):null;return tm(e,l,i,h?.baseRef??null)})()]),d=l?{[l]:u}:{};return{taskId:e.id,fileRows:om(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:d,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:u,error:null}}async function em(e,t){let n=Di(e,t);if(!n)return we("No file selected","No Git-visible files found.","empty");let r=await Ni(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function tm(e,t,n,r=null){let s=Di(e,t);return s?{...await ic(s.target.worktreePath,s.relativePath,n.filter(o=>o.path.startsWith(`${s.target.repoId}/`)).map(o=>({...o,path:o.path.slice(s.target.repoId.length+1)})),r),path:t,title:t}:we(t,"Repo target is unavailable.","error",t)}function Di(e,t){if(!t)return null;let[n,...r]=t.split("/"),s=r.join("/"),i=(e.repoTargets??[]).find(o=>o.repoId===n&&o.status==="ready")??null;return!i||s.length===0?null:{target:i,relativePath:s}}async function nm(e){let t=await L("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return am(t.stdout)}async function rm(e,t){let[n,r,s,i]=await Promise.all([MS(e,t),Xf(e,"staged"),Xf(e,"unstaged"),jS(e)]);return[...n,...r,...s,...i]}async function MS(e,t){if(!t)return[];let[n,r]=await Promise.all([L("git",["diff","--name-status",`${t}...HEAD`],{cwd:e}),L("git",["diff","--numstat",`${t}...HEAD`],{cwd:e})]),s=sm(n.stdout),i=im(r.stdout);return s.map(o=>{let a=i.get(o.path)??{additions:null,deletions:null};return{group:"branch",path:o.path,status:o.status,additions:a.additions,deletions:a.deletions}}).sort((o,a)=>o.path.localeCompare(a.path))}async function Xf(e,t){let n=t==="staged"?["diff","--cached"]:["diff"],[r,s]=await Promise.all([L("git",[...n,"--name-status"],{cwd:e}),L("git",[...n,"--numstat"],{cwd:e})]),i=sm(r.stdout),o=im(s.stdout);return i.map(a=>{let l=o.get(a.path)??{additions:null,deletions:null};return{group:t,path:a.path,status:a.status,additions:l.additions,deletions:l.deletions}}).sort((a,l)=>a.path.localeCompare(l.path))}async function jS(e){let t=await L("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=am(t.stdout);return await Promise.all(n.map(async s=>{let i=await Ni(e,s),o=i.status==="ready"?FS(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function sm(e){return e.split(`
240
+ `).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 im(e){let t=new Map;for(let n of e.split(`
241
+ `)){let r=n.trim();if(!r)continue;let[s="-",i="-",...o]=r.split(" "),a=o.join(" ");a&&t.set(a,{additions:s==="-"?null:Number(s),deletions:i==="-"?null:Number(i)})}return t}async function Xr(e){return(await G("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await G("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function Ni(e,t){if(!t)return we("No file selected","No Git-visible files found.","empty");let n=qS(e,t);try{let r=await $S(n);if(r.size>DS)return we(t,`File is ${r.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,r.size);let s=await xS(n);return WS(s)?we(t,"Binary file preview is not available in Craig.","binary",t,s.byteLength):{path:t,status:"ready",title:t,lines:s.toString("utf8").split(`
242
+ `),byteLength:s.byteLength}}catch(r){let s=r instanceof Error?r.message:"Unable to read file.";return we(t,s,"missing",t,null)}}async function ic(e,t,n,r=null){if(!t)return we("No diff selected","No local changes found.","empty");let s=[],i=n.filter(a=>a.path===t).map(a=>a.group);if(i.includes("branch")){let a=r??await Xr(e);if(a){let l=await L("git",["diff","--stat","--patch",`--unified=${$i}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
243
+ ${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await L("git",["diff","--cached","--stat","--patch",`--unified=${$i}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
244
+ ${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await L("git",["diff","--stat","--patch",`--unified=${$i}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
245
+ ${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await G("git",["diff","--no-index","--stat","--patch",`--unified=${$i}`,"--","/dev/null",t],{cwd:e});a.stdout.trim().length>0&&s.push(`untracked
109
246
  ${a.stdout.trimEnd()}`)}let o=s.join(`
110
247
 
111
- `);return o.length>$w?ee(t,"Diff is above the 500 KB inline preview limit.","too_large",t,o.length):o.includes("\0")?ee(t,"Binary diff preview is not available in Craig.","binary",t,o.length):{path:t,status:o.length>0?"ready":"empty",title:t,lines:o.length>0?o.split(`
112
- `):["No diff for this file."],byteLength:o.length}}function Nc(e){let t=[],r=new Set;for(let n of e){let s=n.split("/");for(let i=0;i<s.length-1;i+=1){let o=s.slice(0,i+1).join("/");r.has(o)||(r.add(o),t.push({kind:"directory",path:o,depth:i,label:s[i]??o}))}t.push({kind:"file",path:n,depth:s.length-1,label:s.at(-1)??n})}return t}function Xe(e,t){return e&&t.includes(e)?e:t[0]??null}function jw(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function Lc(e){return[...new Set(e.split(`
113
- `).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,r)=>t.localeCompare(r))}function Fw(e,t){let r=Ui.resolve(e,t),n=Ui.resolve(e);if(r!==n&&!r.startsWith(`${n}${Ui.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return r}function Ww(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function ee(e,t,r,n=null,s=null){return{path:n,status:r,title:e,lines:[t],byteLength:s}}var qw=["tasks","center","inspector","actions"],_c=["agent","terminal"],jc=[],D="inspection",Px=[..._c,...jc],Vi=["commit","push","refresh-checks","close-task"],Fc=["refresh-checks","close-task"],Wc=["task","checks","pr","setup-run","actions","next-action"],Ki=["files","review"];function qc(e,t={}){let r=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,n=Hw(e?.openInspectionKind)??r,s=k.runners.getEnabled(t);return{inputMode:Yw(e?.inputMode),focusedRegion:Kw(e?.focusedRegion),selectedRepoId:Me(e?.selectedRepoId),selectedWorkspaceId:Me(e?.selectedWorkspaceId),selectedTaskId:Me(e?.selectedTaskId),selectedPtyTabId:Me(e?.selectedPtyTabId),selectedLeftItemId:tk(Me(e?.selectedTaskId)),activeTab:r?D:Me(e?.activeTab)??"agent",preferredPtyTabKind:zw(e?.preferredPtyTabKind),inspectorSection:kr(e?.inspectorSection,Wc,"task"),inspectionMode:Gw(e?.inspectionMode,r==="diff"?"review":"files"),openInspectionKind:n,selectedFileTreePath:Me(e?.selectedFileTreePath),selectedFilePath:Me(e?.selectedFilePath),selectedDiffPath:Me(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:kr(e?.selectedActionId,Vi,"commit"),selectedProjectTargetId:null,selectedRunner:Jw(e?.selectedRunner,s,k.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:Uw(),centerZoomed:!1}}function Uw(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function Uc(e,t){return{...e??$r(),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 yr(e,t,r={}){let n=ek(e,t),s=Hi(n),i=(s?.kind==="workspace"?t.workspaces?.find(d=>d.id===s.id)??null:null)??(s?.kind==="task"?t.workspaces?.find(d=>d.id===t.tasks.find(u=>u.id===s.id)?.workspaceId)??null:null)??t.workspaces?.find(d=>d.id===e.selectedWorkspaceId)??t.workspaces?.[0]??null,a=((s?.kind==="repo"?t.repos.find(d=>d.id===s.id)??null:s?.kind==="task"?t.repos.find(d=>d.id===t.tasks.find(u=>u.id===s.id)?.repoId)??null:null)??(i?.kind==="project"?t.repos.find(d=>d.id===e.selectedRepoId&&i.discoveredRepoIds?.includes(d.id))??null:null)??(i?.kind!=="project"?t.repos.find(d=>d.id===i?.primaryRepoId)??null:null)??t.repos.find(d=>d.id===e.selectedRepoId)??t.repos[0]??null)?.id??null,l=i?t.tasks.filter(d=>d.workspaceId===i.id):a?t.tasks.filter(d=>d.repoId===a):[],c=(s?.kind==="task"?l.find(d=>d.id===s.id)??null:null)??l.find(d=>d.id===e.selectedTaskId)??l[0]??null;return{...e,inputMode:r.resetInputMode?"control":e.inputMode,selectedLeftItemId:n,selectedWorkspaceId:i?.id??null,selectedRepoId:a,selectedTaskId:c?.id??null,...Xw(c,e.activeTab,e.selectedPtyTabId),selectedFilePath:Vw(e,t,c?.id??null),...Qw(e,t,c?.id??null),selectedDiffPath:Bw(e,t,c?.id??null),inspectorSection:kr(e.inspectorSection,Wc,"task")}}function Ne(e,t){return{...e,terminal:t}}function Bc(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function Vc(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function he(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
114
- `}function Kc(e){return e.length===1&&e>=" "&&e!=="\x7F"}function Gi(e){return Hc(e)||qt(e)!==null}function Gc(e){return jc.includes(e)}function Hc(e){return _c.includes(e)}function zc(e,t){return[...e?.ptyTabs.map(r=>r.id)??[],...t?.openInspectionKind?[D]:[]]}function Bw(e,t,r){return!t.inspection||t.inspection.taskId!==r||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function Vw(e,t,r){return!t.inspection||t.inspection.taskId!==r||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function kr(e,t,r){return t.includes(e??"")?e:r}function Kw(e){return e==="tabs"?"center":kr(e,qw,"tasks")}function Gw(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":kr(e,Ki,t)}function Hw(e){return e==="file"||e==="diff"?e:null}function zw(e){return e==="terminal"?"terminal":"agent"}function Yw(e){return e==="terminal"?"terminal":"control"}function Jw(e,t=[..._],r="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:r}function wn(e,t=_){let r=t.length>0?t:_,n=r.indexOf(e);return r[(n+1)%r.length]??r[0]??"codex"}function qt(e){let t=_.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function Xw(e,t,r){if(!e)return{activeTab:t===D?t:"agent",selectedPtyTabId:null};let n=e.ptyTabs.find(a=>a.id===r)??null,s=e.selectedPtyTabId?e.ptyTabs.find(a=>a.id===e.selectedPtyTabId)??null:null,i=e.ptyTabs.find(a=>a.id===t)??null;if(i)return{activeTab:i.id,selectedPtyTabId:i.id};if(Hc(t)){let l=e.ptyTabs.find(c=>c.kind===t)??null??s??n??e.ptyTabs[0]??null;return{activeTab:l?.id??D,selectedPtyTabId:l?.id??null}}if(t===D)return{activeTab:D,selectedPtyTabId:n?.id??s?.id??e.ptyTabs[0]?.id??null};let o=s??n??e.ptyTabs[0]??null;return{activeTab:o?.id??D,selectedPtyTabId:o?.id??null}}function Qw(e,t,r){if(!t.inspection||t.inspection.taskId!==r)return{selectedFileTreePath:e.selectedFileTreePath,collapsedFileTreePaths:e.collapsedFileTreePaths};let n=e.selectedFileTreePath??t.inspection.selectedFilePath,s=e.selectedFileTreePath===null&&e.collapsedFileTreePaths.length===0?Zw(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:n,collapsedFileTreePaths:s}}function Zw(e,t){let r=new Set;if(t){let n=t.split("/");for(let s=1;s<n.length;s+=1)r.add(n.slice(0,s).join("/"))}return e.filter(n=>n.kind==="directory"&&!n.path.includes("/")&&!r.has(n.path)).map(n=>n.path).sort((n,s)=>n.localeCompare(s))}function ek(e,t){let r=gt(t);return e.selectedLeftItemId&&r.includes(e.selectedLeftItemId)?e.selectedLeftItemId:e.selectedWorkspaceId&&r.includes(`workspace:${e.selectedWorkspaceId}`)?`workspace:${e.selectedWorkspaceId}`:e.selectedTaskId&&r.includes(`task:${e.selectedTaskId}`)?`task:${e.selectedTaskId}`:e.selectedRepoId&&r.includes(`repo:${e.selectedRepoId}`)?`repo:${e.selectedRepoId}`:r[0]??null}function gt(e){let t=[];if(e.workspaces?.length)for(let r of e.workspaces){t.push(`workspace:${r.id}`);for(let n of e.tasks.filter(s=>s.workspaceId===r.id))t.push(`task:${n.id}`);r.kind==="project"&&t.push(`new-task-workspace:${r.id}`),r.kind==="repo"&&t.push(`new-task:${r.primaryRepoId}`)}else for(let r of e.repos){t.push(`repo:${r.id}`);for(let n of e.tasks.filter(s=>s.repoId===r.id))t.push(`task:${n.id}`);t.push(`new-task:${r.id}`)}return t.push("new-workspace"),t}function Hi(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 Me(e){return typeof e=="string"?e:null}function tk(e){return e?`task:${e}`:null}function Tr(e){return typeof e=="string"&&e.startsWith("task:")}function kn(e){return typeof e=="string"&&e.startsWith("new-task:")}function yn(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function Yc(e){return typeof e=="string"&&e.startsWith("workspace:")}function zi(e){return kn(e)?e.slice(9):null}function Yi(e){return yn(e)?e.slice(19):null}async function Ut(e,t,r){let n=ne(e),[s,i]=await Promise.all([X.repos.listRegisteredRepos(n),X.listWorkspaces(n,{archived:!1})]),o=await P.listTasks(n),a=Ji(o.tasks,t),l=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},c=a?await Ac(a,l):null;return{workspaceRoot:e,workspaces:i.workspaces,repos:s.repos,tasks:o.tasks,inspection:c,...r?{enabledRunnerIds:r}:{}}}function Ji(e,t){return t?.selectedTaskId?e.find(r=>r.id===t.selectedTaskId)??null:null}function Jc(e,t){return yr(e,t)}import oo from"node:path";import Ox from"picocolors";var rk=[" \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 Xi(){return[...rk]}var Tn={width:120,height:36},F={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function ce(e,t){return{width:Math.max(e??Tn.width,Tn.width),height:Math.max(t??Tn.height,Tn.height)}}var nk=["Start","Options","Exit"],sk=["Resume","Options","Exit"],bn=2,Pn=2,Sn=2,ik=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),ok=new RegExp("\x1B\\[(?:0)?m","g"),ak=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),lk=/https?:\/\/[^\s<>"']+/g,Zi="\x1B[0m",eo="\x1B]8;;\x1B\\",v={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"}},Qi=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function Zc(e,t={}){return ro(e,{subtitle:"crAIg is that you?",menuItems:nk,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function ed(e,t={}){return ro(e,{subtitle:"Control mode is paused.",menuItems:sk,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}var Rn=[" 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."],ck=["Help"],dk=5;function Cn(e,t={}){return ro(e,{subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??ck,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function td(e,t={}){let r=t.color??!0,n=v.overlay,s=new Array(e.height).fill(B(" ".repeat(e.width),r,n)),i=Xi(),o=Math.max(1,Math.floor((e.height-i.length-2-Rn.length)/2));for(let d=0;d<i.length&&!(o+d>=e.height);d+=1)s[o+d]=B(dd(i[d]??"",e.width),r,v.overlayLogo);let a=Math.max(...Rn.map(d=>d.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let d=0;d<Rn.length;d+=1){let u=c+d;if(u>=e.height)break;let f=Rn[d]??"";s[u]=B(be(" ".repeat(l)+f,e.width),r,n)}return s.join(`
115
- `)}function rd(e,t={}){let r=t.color??!0,n=v.overlay,s=new Array(e.height).fill(B(" ".repeat(e.width),r,n)),i="Error Log",o=t.errorLogPath??"",a=t.errorLogLines??[],l=Math.max(20,e.width-8),c=Math.max(0,Math.floor((e.width-l)/2)),d=[{text:i,tone:"selected"},{text:o,tone:"muted"},we(),...a.length>0?a.map(h=>({text:h})):[{text:"No Craig errors have been logged.",tone:"muted"}],we(),{text:"Esc returns to Options.",tone:"muted"}],u=Rr(d,e.height-2),f=Math.max(1,Math.floor((e.height-u.length)/2));for(let h=0;h<u.length;h+=1){let p=f+h;if(p>=e.height)break;let w=u[h]??we(),b=`${" ".repeat(c)}${An(w.text,l)}`,O=w.tone==="selected"?v.overlayMenuSelected:w.tone==="muted"?v.overlay:v.panelBg;s[p]=B(be(b,e.width),r,O)}return s.join(`
116
- `)}function nd(e,t,r={}){let n=r.color??!0,s=F.leftWidth,i=F.rightWidth,o=r.centerOnly??!1,a=e.height-F.topRailHeight-1,l=r.focusFlashActive??!1,c={bg:v.divider.bg,fg:"9ece6a"},d=l&&(t.focusedRegion==="tasks"||t.focusedRegion==="center")?c:v.divider,u=l&&(t.focusedRegion==="center"||t.focusedRegion==="inspector")?c:v.divider,f=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,h=B(be(f,e.width),n,v.rail),p=pk(t,s-bn-Pn,a,n),w=to(e,t,{color:n,centerOnly:o}),b=gk(t,i,a,n),O=t.inputMode==="terminal",q=[],U=[];for(let Pe=0;Pe<a;Pe+=1)if(!o){let yt=vn(p[Pe]??we(),s,n,"left"),Cr=B("\u2502",n,d),Ar=B("\u2502",n,u),Er=vn(b[Pe]??we(),i,n,"right");q.push(`${yt}${Cr}`),U.push(`${Ar}${Er}`)}let I=O||t.modalInput?v.panelBg:v.panelMuted,re=uk(t.footerText,t.footerToast,e.width,n,I),je={row:1,column:1,width:e.width,rows:[h]},de=o?null:{row:F.topRailHeight+1,column:1,width:s+F.dividerWidth,rows:q},ye=o?null:{row:F.topRailHeight+1,column:w.column+w.width,width:F.dividerWidth+i,rows:U},m={row:e.height,column:1,width:e.width,rows:[re]},rt=o?w.rows:w.rows.map((Pe,yt)=>`${q[yt]??""}${Pe}${U[yt]??""}`);return{frame:[h,...rt,re].join(`
117
- `),center:w,regions:{rail:je,left:de,center:w,right:ye,footer:m}}}function to(e,t,r={}){let n=r.color??!0,s=id(e,r.centerOnly??!1),i=mk(t,s.width,s.rowCount,n);return{row:s.row,column:s.column,width:s.width,rows:i.map(o=>vn(o,s.width,n,"center"))}}function sd(e,t,r,n={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!Gi(s)||t.centerHeader.tabLabel==="BROWSER"||t.terminal.error||t.terminal.rows.length===0||r.some(c=>c<0||c>=t.terminal.rows.length))return null;let i=n.color??!0,o=id(e,n.centerOnly??!1),a=od(t,o.width,i).length,l=[...new Set(r)].map(c=>({terminalIndex:c,index:a+c})).filter(({index:c})=>c<o.rowCount).map(({terminalIndex:c,index:d})=>({index:d,row:vn(ad(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function id(e,t){return{row:F.topRailHeight+1,column:t?1:F.leftWidth+F.dividerWidth+1,width:t?e.width:e.width-F.leftWidth-F.rightWidth-F.dividerWidth*2,rowCount:e.height-F.topRailHeight-1}}function uk(e,t,r,n,s){let i=` ${e}`;if(!t)return B(be(i,r),n,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=oe(o),l=oe(i),c=Math.max(1,r-l-a-2),d=l+c+a+2>r?An(i,Math.max(0,r-a-3)):i,u=Math.max(1,r-oe(d)-a-2),f=t.tone==="error"?Mk(o,n,s):Bt(o,n,s),h=`${d}${" ".repeat(u)}${f} `;return B(be(h,r),n,s)}function ro(e,t){let r=new Array(e.height).fill(B(" ".repeat(e.width),t.color,v.overlay)),n=Xi(),s=t.menuItems.map((c,d)=>`${d===t.menuIndex?">":" "} ${c}`),i=t.optionsMessage?["",t.optionsMessage]:[],o=[...s,...i];for(;o.length<dk;)o.push("");let a=[...n,"",t.subtitle,"",...o],l=Math.max(1,Math.floor((e.height-a.length)/2));for(let c=0;c<a.length;c+=1){let d=dd(a[c]??"",e.width);if(c<n.length){r[l+c]=B(d,t.color,v.overlayLogo);continue}if(c===n.length+1){r[l+c]=B(d,t.color,v.overlaySubtitle);continue}let u=c-(n.length+3),h=u>=0&&u<t.menuItems.length&&u===t.menuIndex?v.overlayMenuSelected:v.overlay;r[l+c]=B(d,t.color,h)}if(t.versionText){let c=t.updateText?" (update available)":"",d=`${t.versionText}${c} `,u=" ".repeat(Math.max(0,e.width-oe(d)));r[e.height-1]=B(`${u}${io(d,t.color,v.overlay)}`,t.color,v.overlay)}return r.join(`
118
- `)}function pk(e,t,r,n){let s=kk(e.runners),i=1,o=e.leftTree.map(l=>wk(l,t,n));return[...Rr(o,r-i),s]}function mk(e,t,r,n){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!Gi(s)?e.centerTranscript.map(o=>({...o})):fk(e);return Rr([...od(e,t,n),...i],r)}function od(e,t,r){let n=t-2,s=e.tabs.find(b=>b.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:Dk(e.tabs),o=e.inputMode==="terminal"?n:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?Bt(a,r,v.panelBg):In(a,r,v.panelMuted)}`,c=[`${In(e.centerHeader.tabLabel,r,v.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),d=yk(e.tabs,r,e.focusedRegion==="center"),u=" engaged ",f=u.length+2,h=e.inputMode==="terminal"?Bt(`${u}\u25CF `,r,v.panelBg):"",p=e.inputMode==="terminal"?" ".repeat(Math.max(0,n-oe(d)-f)):"";return[{text:e.inputMode==="terminal"?`${d}${p}${h}`:d},{text:l,tone:"muted"},{text:c},we()]}function fk(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},we(),{text:e.terminal.error},we(),{text:"Fix the native dependency setup, then re-enter terminal mode."}];let t=e.tabs.find(n=>n.active)?.id??"",r=t==="agent"||/:agent(?:-\d+)?$/.test(t)?"agent":"terminal";return e.terminal.rows.length===0?[{text:`Press Enter on the ${r.toUpperCase()} tab to attach a PTY.`}]:e.terminal.rows.map(ad)}function ad(e){return{text:so(e.segments),segments:e.segments,fullBleed:!0}}function gk(e,t,r,n){let s=e.rightInspection?hk(e.actionMessage?[...e.rightInspection.rows.slice(0,2),{id:"action-message",text:e.actionMessage},{id:"action-message-spacer",text:""},...e.rightInspection.rows.slice(2)]:e.rightInspection.rows,r):Rr([{text:"CONTEXT"},we(),...e.rightContext.map(i=>Tk(i,n)),...e.actionMessage?[we(),{text:e.actionMessage}]:[]],r);return Rr(s,r)}function hk(e,t){let r=e.slice(0,2),n=e.slice(2),s=Math.max(0,t-r.length),i=n.findIndex(a=>a.focused||a.selected),o=i===-1?0:$k(i-Math.floor(s/2),0,Math.max(0,n.length-s));return[...r.map(a=>Xc(a)),...n.slice(o,o+s).map(a=>Xc(a))]}function Xc(e){let t=e.focused?"\u25B8 ":e.selected?"\u2022 ":" ",r=e.focused||e.selected?"selected":e.muted?"muted":"default",n=`${t}${e.text}`;if(e.segments)return{text:n,segments:[{text:t},...e.segments],tone:r};if(e.accentPrefix&&!e.muted){let s=e.text.indexOf(" "),i=s===-1?e.text:e.text.slice(0,s),o=s===-1?"":e.text.slice(s);return{text:n,segments:[{text:t},{text:i,style:{fg:"7aa2f7"}},{text:o}],tone:r}}return e.color?{text:n,segments:[{text:t},{text:e.text,style:{fg:e.color}}],tone:r}:{text:n,tone:r}}function wk(e,t,r){let n=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${Bt("\u25CF",r,e.selected?v.panelSelected:v.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((p,w)=>p+oe(w.text),0):0,l=t-oe(i)-oe(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",d=e.selected?e.text:e.focused?Bt(e.text,r,v.panelBg):e.panelHeader?In(e.text,r,v.panelMuted):e.text,u=be(`${n}${c}${d}`,Math.max(0,l)),f=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let p=`${n}${e.selected?"\u25B8":" "} `,w=u.slice(p.length+2),b=[{text:p},ld(e.activity,e.activityAnimationFrame??0),{text:` ${w}${i}${o}`},...e.prBadge??[]];return{text:so(b),segments:b,tone:f}}if(e.prBadge){let p=[{text:`${u}${i}${o}`},...e.prBadge];return{text:`${u}${i}${e.prBadge.map(b=>b.text).join("")}`,segments:p,tone:f}}return{text:`${u}${i}${o}`,tone:f}}function kk(e){let t=e.map(n=>{let s=n.health>=1,i=parseInt(n.count,10),o=i>1?` (${i})`:"";return{text:`${s?"\u25CF":"\u25CB"} ${n.name}${o}`,active:s}}),r=[];for(let n=0;n<t.length;n++){let s=t[n];n>0&&r.push({text:" "}),s.active?r.push({text:s.text,style:{fg:v.success.fg}}):r.push({text:s.text,style:{fg:v.panelMuted.fg}})}return{text:t.map(n=>n.text).join(" "),segments:r,tone:"muted"}}function yk(e,t,r){return e.map(n=>{let s=n.active?r?Bt(n.label,t,v.panelBg):In(n.label,t,v.panelBg):io(n.label,t,v.panelBg),i=n.activity?no(ld(n.activity,n.activityAnimationFrame??0),t,v.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function ld(e,t){return{text:"\u25CF",style:{fg:e==="working"?Qi[t%Qi.length]??Qi[0]:e==="ready"?v.success.fg:e==="error"?v.error.fg:v.panelMuted.fg}}}function Tk(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?io(e.value,t,v.panelBg):e.value}`}}function vn(e,t,r,n){let s=Rk(n,e.tone??"default"),i=bk(e,r,s);if(n==="left"){if(e.fullBleed)return B(be(i,t),r,s);let a=t-bn-Pn;if(e.rightAlign){let c=oe(i),d=Math.max(0,a-c),u=`${" ".repeat(bn)}${" ".repeat(d)}${i}${" ".repeat(Pn)}`;return B(u,r,s)}let l=`${" ".repeat(bn)}${be(i,a)}${" ".repeat(Pn)}`;return B(l,r,s)}return n==="center"&&e.fullBleed?Pk(e,t,r,s):B(be(` ${i}`,t),r,s)}function Rk(e,t){return t==="selected"||t==="focused"?v.panelSelected:t==="muted"?v.panelMuted:v.panelBg}function Rr(e,t){let r=e.slice(0,t);for(;r.length<t;)r.push(we());return r}function we(){return{text:""}}function bk(e,t,r){return e.segments?e.segments.map(n=>no(n,t,r)).join(""):e.text}function Pk(e,t,r,n){let s=" ".repeat(Sn),i=Math.max(0,t-Sn*2);if(!e.segments)return B(`${s}${be(e.text,i)}${s}`,r,n);let o=Ik(e.segments,i),a=`${s}${o.map(l=>no(l,r,n)).join("")}${s}${r?eo:""}`;return B(a,r,n)}function no(e,t,r){let n=e.href?`${cd(e.href)}${e.text}${eo}`:Sk(e.text);return!t||!e.style?n:`${br(Ek(e.style,r))}${xk(e.style)}${n}${Zi}${br(r)}`}function Sk(e){return e.replace(lk,t=>{let[r,n]=vk(t);return`${cd(r)}${r}${eo}${n}`})}function vk(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function cd(e){return`\x1B]8;;${e}\x1B\\`}function Ik(e,t){let r=Ck(e,t);return Ak(r,t)}function Ck(e,t){let r=[],n=t;for(let s of e){if(n<=0)break;let i=oe(s.text);if(i<=n){r.push(s),n-=i;continue}let o=An(s.text,n);o.length>0&&r.push({...s,text:o}),n=0}return r}function Ak(e,t){let r=oe(so(e));if(r>=t)return e;let n=[...e].reverse().find(s=>s.style?.bg)?.style;return n?.bg?[...e,{text:" ".repeat(t-r),style:n}]:[...e,{text:" ".repeat(t-r)}]}function Ek(e,t){let r=e.inverse?e.bg??t.bg:e.fg,n=e.inverse?e.fg??t.fg:e.bg,s={},i=r??t.fg,o=n??t.bg;return i&&(s.fg=i),o&&(s.bg=o),s}function xk(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 Dk(e){let t=0;for(let r of e){if(r.active)return t;t+=r.label.length+(r.activity?2:0)+3}return 0}function dd(e,t){let r=Math.max(0,t-oe(e)),n=Math.floor(r/2),s=r-n;return`${" ".repeat(n)}${e}${" ".repeat(s)}`}function be(e,t){let r=oe(e);return r>=t?Ok(e,t):e+" ".repeat(t-r)}function Ok(e,t){if(t<=0)return"";if(oe(e)<=t)return e;let r=pd(e);return An(r,Math.max(0,t-1))+"\u2026"}function oe(e){let t=0;for(let r of Array.from(pd(e)))t+=ud(r);return t}function An(e,t){let r="",n=0;for(let s of Array.from(e)){let i=ud(s);if(n+i>t)break;r+=s,n+=i}return r}function ud(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||t>=8203&&t<=8207||t>=8288&&t<=8292||t===65279?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 $k(e,t,r){return Math.min(Math.max(e,t),r)}function pd(e){return e.replace(ak,"").replace(ik,"")}function so(e){return e.map(t=>t.text).join("")}function B(e,t,r){if(!t)return e;let n=br(r),s=e.replace(ok,`${Zi}${n}`);return`${n}${s}${Zi}`}function br(e){let t=[];return e.fg&&t.push(`38;2;${Qc(e.fg).join(";")}`),e.bg&&t.push(`48;2;${Qc(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function Qc(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function Bt(e,t,r){return En(e,t,v.success.fg,r)}function Mk(e,t,r){return En(e,t,v.error.fg,r)}function In(e,t,r){return En(e,t,v.accent.fg,r)}function io(e,t,r){return En(e,t,v.mutedfg.fg,r)}function En(e,t,r,n){if(!t)return e;let s=n.bg?{fg:r,bg:n.bg}:{fg:r};return`${br(s)}${e}${br(n)}`}function md(e,t,r){let n=e.tasks.find(l=>l.ptyTabs.some(c=>c.id===t))??null,s=n?.ptyTabs.find(l=>l.id===t)??null,i=n?.worktreePath??r,o=s?.kind==="agent"?Lk(s):[],a=n?{CRAIG_WORKSPACE_ROOT:r,CRAIG_TASK_ID:n.id,...s?.kind==="agent"?{CRAIG_AGENT_TAB_ID:s.id}:{}}:{};return n?.type==="project"?{cwd:i,command:o,env:{...a,GIT_CEILING_DIRECTORIES:Nk(process.env.GIT_CEILING_DIRECTORIES,i)}}:n?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function Nk(e,t){let r=(e??"").split(oo.delimiter).filter(n=>n.length>0);return r.includes(t)?r.join(oo.delimiter):[...r,t].join(oo.delimiter)}function Lk(e){return e.command.length>0?e.command:["codex"]}function fd(e,t){let r=e.ptyTabs.find(n=>n.kind===t);if(!r)throw new Error(`Task ${e.id} is missing its ${t} PTY tab.`);return r.id}function Qe(e){return{columns:Math.max(20,e.width-F.leftWidth-F.rightWidth-F.dividerWidth-Sn*2),rows:Math.max(5,e.height-F.topRailHeight-5)}}function gd(e){return e.length===1||he(e)||e==="BACKSPACE"||e==="TAB"}function Ze(e){return typeof e=="string"&&new RegExp(`:(?:agent|${_.join("|")})(?:-\\d+)?$`).test(e)}function hd(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 ao(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function wd(e){let t=new RegExp("\x1B\\[<(\\d+);\\d+;\\d+[mM]").exec(e);if(!t?.[1])return 0;let r=Number.parseInt(t[1],10);return r===64?-3:r===65?3:0}function Pr(e){return yd.includes(e)?"SHIFT_ENTER":null}function lo(e){return yd.some(t=>t.startsWith(e))}function kd(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var yd=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function Td(e,t,r){return r.length===0?!1:e&&(r==="\r"||r===`
119
- `||r===`\r
120
- `)?!0:!t||Date.now()-t.at>=30?!1:r===t.key?!0:r.length<=4&&r.split("").every(n=>n===t.key)}function Rd(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function bd(e,t=null){let r=t?.split(`
248
+ `);return o.length>NS?we(t,"Diff is above the 500 KB inline preview limit.","too_large",t,o.length):o.includes("\0")?we(t,"Binary diff preview is not available in Craig.","binary",t,o.length):{path:t,status:o.length>0?"ready":"empty",title:t,lines:o.length>0?o.split(`
249
+ `):["No diff for this file."],byteLength:o.length}}function om(e){let t=[],n=new Set;for(let r of e){let s=r.split("/");for(let i=0;i<s.length-1;i+=1){let o=s.slice(0,i+1).join("/");n.has(o)||(n.add(o),t.push({kind:"directory",path:o,depth:i,label:s[i]??o}))}t.push({kind:"file",path:r,depth:s.length-1,label:s.at(-1)??r})}return t}function Vt(e,t){return e&&t.includes(e)?e:t[0]??null}function FS(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function am(e){return[...new Set(e.split(`
250
+ `).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function qS(e,t){let n=sc.resolve(e,t),r=sc.resolve(e);if(n!==r&&!n.startsWith(`${r}${sc.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function WS(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function we(e,t,n,r=null,s=null){return{path:r,status:n,title:e,lines:[t],byteLength:s}}var BS=["tasks","center","inspector","actions"],lm=["agent","terminal"],cm=[],K="inspection",oW=[...lm,...cm],oc=["commit","push","refresh-checks","close-task"],dm=["refresh-checks","close-task"],um=["task","checks","pr","setup-run","actions","next-action"],ac=["files","review"];function pm(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=zS(e?.openInspectionKind)??n,s=k.runners.getEnabled(t);return{inputMode:JS(e?.inputMode),focusedRegion:GS(e?.focusedRegion),selectedRepoId:bt(e?.selectedRepoId),selectedWorkspaceId:bt(e?.selectedWorkspaceId),selectedTaskId:bt(e?.selectedTaskId),selectedPtyTabId:bt(e?.selectedPtyTabId),selectedLeftItemId:nP(bt(e?.selectedTaskId)),activeTab:n?K:bt(e?.activeTab)??"agent",preferredPtyTabKind:YS(e?.preferredPtyTabKind),inspectorSection:Qr(e?.inspectorSection,um,"task"),inspectionMode:HS(e?.inspectionMode,n==="diff"?"review":"files"),openInspectionKind:r,selectedFileTreePath:bt(e?.selectedFileTreePath),selectedFilePath:bt(e?.selectedFilePath),selectedDiffPath:bt(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:Qr(e?.selectedActionId,oc,"commit"),selectedProjectTargetId:null,selectedRunner:XS(e?.selectedRunner,s,k.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:US(),centerZoomed:!1}}function US(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function fm(e,t){return{...e??fs(),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 es(e,t,n={}){let r=tP(e,t),s=cc(r),i=(s?.kind==="workspace"?t.workspaces?.find(u=>u.id===s.id)??null:null)??(s?.kind==="task"?t.workspaces?.find(u=>u.id===t.tasks.find(d=>d.id===s.id)?.workspaceId)??null:null)??t.workspaces?.find(u=>u.id===e.selectedWorkspaceId)??t.workspaces?.[0]??null,a=((s?.kind==="repo"?t.repos.find(u=>u.id===s.id)??null:s?.kind==="task"?t.repos.find(u=>u.id===t.tasks.find(d=>d.id===s.id)?.repoId)??null:null)??(i?.kind==="project"?t.repos.find(u=>u.id===e.selectedRepoId&&i.discoveredRepoIds?.includes(u.id))??null:null)??(i?.kind!=="project"?t.repos.find(u=>u.id===i?.primaryRepoId)??null:null)??t.repos.find(u=>u.id===e.selectedRepoId)??t.repos[0]??null)?.id??null,l=i?t.tasks.filter(u=>u.workspaceId===i.id):a?t.tasks.filter(u=>u.repoId===a):[],c=(s?.kind==="task"?l.find(u=>u.id===s.id)??null:null)??l.find(u=>u.id===e.selectedTaskId)??l[0]??null;return{...e,inputMode:n.resetInputMode?"control":e.inputMode,selectedLeftItemId:r,selectedWorkspaceId:i?.id??null,selectedRepoId:a,selectedTaskId:c?.id??null,...QS(c,e.activeTab,e.selectedPtyTabId),selectedFilePath:VS(e,t,c?.id??null),...ZS(e,t,c?.id??null),selectedDiffPath:KS(e,t,c?.id??null),inspectorSection:Qr(e.inspectorSection,um,"task")}}function Rt(e,t){return{...e,terminal:t}}function mm(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function hm(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function He(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
251
+ `}function gm(e){return e.length===1&&e>=" "&&e!=="\x7F"}function lc(e){return wm(e)||er(e)!==null}function ym(e){return cm.includes(e)}function wm(e){return lm.includes(e)}function km(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[K]:[]]}function KS(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function VS(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function Qr(e,t,n){return t.includes(e??"")?e:n}function GS(e){return e==="tabs"?"center":Qr(e,BS,"tasks")}function HS(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":Qr(e,ac,t)}function zS(e){return e==="file"||e==="diff"?e:null}function YS(e){return e==="terminal"?"terminal":"agent"}function JS(e){return e==="terminal"?"terminal":"control"}function XS(e,t=[...J],n="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:n}function _i(e,t=J){let n=t.length>0?t:J,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function er(e){let t=J.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function QS(e,t,n){if(!e)return{activeTab:t===K?t:"agent",selectedPtyTabId:null};let r=e.ptyTabs.find(a=>a.id===n)??null,s=e.selectedPtyTabId?e.ptyTabs.find(a=>a.id===e.selectedPtyTabId)??null:null,i=e.ptyTabs.find(a=>a.id===t)??null;if(i)return{activeTab:i.id,selectedPtyTabId:i.id};if(wm(t)){let l=e.ptyTabs.find(c=>c.kind===t)??null??s??r??e.ptyTabs[0]??null;return{activeTab:l?.id??K,selectedPtyTabId:l?.id??null}}if(t===K)return{activeTab:K,selectedPtyTabId:r?.id??s?.id??e.ptyTabs[0]?.id??null};let o=s??r??e.ptyTabs[0]??null;return{activeTab:o?.id??K,selectedPtyTabId:o?.id??null}}function ZS(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?eP(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function eP(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 tP(e,t){let n=gn(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 gn(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of Zr(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{task:r}of Zr(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 Zr(e){let t=new Set(e.map(i=>i.id)),n=new Set,r=[],s=new Map;for(let i of e){if(i.rootTaskId===i.id||!t.has(i.rootTaskId))continue;let o=s.get(i.rootTaskId)??[];o.push(i),s.set(i.rootTaskId,o)}for(let i of e)if(!(i.rootTaskId!==i.id&&t.has(i.rootTaskId))){r.push({task:i,visualDepth:0}),n.add(i.id);for(let a of s.get(i.id)??[])n.has(a.id)||(r.push({task:a,visualDepth:1}),n.add(a.id))}for(let i of e)n.has(i.id)||r.push({task:i,visualDepth:0});return r}function cc(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 bt(e){return typeof e=="string"?e:null}function nP(e){return e?`task:${e}`:null}function ts(e){return typeof e=="string"&&e.startsWith("task:")}function Li(e){return typeof e=="string"&&e.startsWith("new-task:")}function Mi(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function Tm(e){return typeof e=="string"&&e.startsWith("workspace:")}function dc(e){return Li(e)?e.slice(9):null}function uc(e){return Mi(e)?e.slice(19):null}async function tr(e,t,n){let r=Te(e),[s,i]=await Promise.all([fe.repos.listRegisteredRepos(r),fe.listWorkspaces(r,{archived:!1})]),o=await P.listTasks(r),a={},l=await k.load(r);if(k.previews.isEnabled(l,"agentOrchestration")){let p=await Promise.all(o.tasks.map(async h=>({task:h,environment:await _t(r,h)})));for(let{task:h,environment:f}of p){let m=h.ptyTabs.find(g=>g.kind==="agent");m&&f.CRAIG_AGENT_CAPABILITY&&(a[m.id]=f.CRAIG_AGENT_CAPABILITY)}o=await P.listTasks(r)}let c=pc(o.tasks,t),u=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},d=c?await Zf(c,u):null;return{workspaceRoot:e,workspaces:i.workspaces,repos:s.repos,tasks:o.tasks,inspection:d,...Object.keys(a).length>0?{agentCapabilityTokens:a}:{},...n?{enabledRunnerIds:n}:{}}}function pc(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function bm(e,t){return es(e,t)}import Rc from"node:path";import yW from"picocolors";var rP=[" \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 fc(){return[...rP]}var ji={width:120,height:36},Q={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function Oe(e,t){return{width:Math.max(e??ji.width,ji.width),height:Math.max(t??ji.height,ji.height)}}var sP=["Start","Options","Exit"],iP=["Resume","Options","Exit"],qi=2,Wi=2,Bi=2,oP=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),aP=new RegExp("\x1B\\[(?:0)?m","g"),lP=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),cP=/https?:\/\/[^\s<>"']+/g,hc="\x1B[0m",gc="\x1B]8;;\x1B\\",D={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"}},mc=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function Pm(e,t={}){return wc(e,{subtitle:"crAIg is that you?",menuItems:sP,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function Im(e,t={}){return wc(e,{subtitle:"Control mode is paused.",menuItems:iP,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}var Fi=[" 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."],dP=["Help"],uP=5;function Vi(e,t={}){return wc(e,{subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??dP,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function vm(e,t={}){let n=t.color??!0,r=D.overlay,s=new Array(e.height).fill(te(" ".repeat(e.width),n,r)),i=fc(),o=Math.max(1,Math.floor((e.height-i.length-2-Fi.length)/2));for(let u=0;u<i.length&&!(o+u>=e.height);u+=1)s[o+u]=te(_m(i[u]??"",e.width),n,D.overlayLogo);let a=Math.max(...Fi.map(u=>u.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let u=0;u<Fi.length;u+=1){let d=c+u;if(d>=e.height)break;let p=Fi[u]??"";s[d]=te(st(" ".repeat(l)+p,e.width),n,r)}return s.join(`
252
+ `)}function Cm(e,t={}){let n=t.color??!0,r=D.overlay,s=new Array(e.height).fill(te(" ".repeat(e.width),n,r)),i="Error Log",o=t.errorLogPath??"",a=t.errorLogLines??[],l=Math.max(20,e.width-8),c=Math.max(0,Math.floor((e.width-l)/2)),u=[{text:i,tone:"selected"},{text:o,tone:"muted"},ze(),...a.length>0?a.map(h=>({text:h})):[{text:"No Craig errors have been logged.",tone:"muted"}],ze(),{text:"Esc returns to Options.",tone:"muted"}],d=ns(u,e.height-2),p=Math.max(1,Math.floor((e.height-d.length)/2));for(let h=0;h<d.length;h+=1){let f=p+h;if(f>=e.height)break;let m=d[h]??ze(),g=`${" ".repeat(c)}${Gi(m.text,l)}`,T=m.tone==="selected"?D.overlayMenuSelected:m.tone==="muted"?D.overlay:D.panelBg;s[f]=te(st(g,e.width),n,T)}return s.join(`
253
+ `)}function Am(e,t,n={}){let r=n.color??!0,s=Q.leftWidth,i=Q.rightWidth,o=n.centerOnly??!1,a=e.height-Q.topRailHeight-1,l=n.focusFlashActive??!1,c={bg:D.divider.bg,fg:"9ece6a"},u=l&&(t.focusedRegion==="tasks"||t.focusedRegion==="center")?c:D.divider,d=l&&(t.focusedRegion==="center"||t.focusedRegion==="inspector")?c:D.divider,p=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,h=te(st(p,e.width),r,D.rail),f=fP(t,s-qi-Wi,a,r),m=yc(e,t,{color:r,centerOnly:o}),g=gP(t,i,a,r),T=t.inputMode==="terminal",R=[],I=[];for(let pe=0;pe<a;pe+=1)if(!o){let z=Ui(f[pe]??ze(),s,r,"left"),Jt=te("\u2502",r,u),ls=te("\u2502",r,d),cs=Ui(g[pe]??ze(),i,r,"right");R.push(`${z}${Jt}`),I.push(`${ls}${cs}`)}let b=T||t.modalInput?D.panelBg:D.panelMuted,x=pP(t.footerText,t.footerToast,e.width,r,b),$={row:1,column:1,width:e.width,rows:[h]},_=o?null:{row:Q.topRailHeight+1,column:1,width:s+Q.dividerWidth,rows:R},v=o?null:{row:Q.topRailHeight+1,column:m.column+m.width,width:Q.dividerWidth+i,rows:I},w={row:e.height,column:1,width:e.width,rows:[x]},ue=o?m.rows:m.rows.map((pe,z)=>`${R[z]??""}${pe}${I[z]??""}`);return{frame:[h,...ue,x].join(`
254
+ `),center:m,regions:{rail:$,left:_,center:m,right:v,footer:w}}}function yc(e,t,n={}){let r=n.color??!0,s=Om(e,n.centerOnly??!1),i=mP(t,s.width,s.rowCount,r);return{row:s.row,column:s.column,width:s.width,rows:i.map(o=>Ui(o,s.width,r,"center"))}}function Em(e,t,n,r={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!lc(s)||t.centerHeader.tabLabel==="BROWSER"||t.terminal.error||t.terminal.rows.length===0||n.some(c=>c<0||c>=t.terminal.rows.length))return null;let i=r.color??!0,o=Om(e,r.centerOnly??!1),a=xm(t,o.width,i).length,l=[...new Set(n)].map(c=>({terminalIndex:c,index:a+c})).filter(({index:c})=>c<o.rowCount).map(({terminalIndex:c,index:u})=>({index:u,row:Ui($m(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function Om(e,t){return{row:Q.topRailHeight+1,column:t?1:Q.leftWidth+Q.dividerWidth+1,width:t?e.width:e.width-Q.leftWidth-Q.rightWidth-Q.dividerWidth*2,rowCount:e.height-Q.topRailHeight-1}}function pP(e,t,n,r,s){let i=` ${e}`;if(!t)return te(st(i,n),r,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=Pe(o),l=Pe(i),c=Math.max(1,n-l-a-2),u=l+c+a+2>n?Gi(i,Math.max(0,n-a-3)):i,d=Math.max(1,n-Pe(u)-a-2),p=t.tone==="error"?_P(o,r,s):nr(o,r,s),h=`${u}${" ".repeat(d)}${p} `;return te(st(h,n),r,s)}function wc(e,t){let n=new Array(e.height).fill(te(" ".repeat(e.width),t.color,D.overlay)),r=fc(),s=t.menuItems.map((c,u)=>`${u===t.menuIndex?">":" "} ${c}`),i=t.optionsMessage?["",t.optionsMessage]:[],o=[...s,...i];for(;o.length<uP;)o.push("");let a=[...r,"",t.subtitle,"",...o],l=Math.max(1,Math.floor((e.height-a.length)/2));for(let c=0;c<a.length;c+=1){let u=_m(a[c]??"",e.width);if(c<r.length){n[l+c]=te(u,t.color,D.overlayLogo);continue}if(c===r.length+1){n[l+c]=te(u,t.color,D.overlaySubtitle);continue}let d=c-(r.length+3),h=d>=0&&d<t.menuItems.length&&d===t.menuIndex?D.overlayMenuSelected:D.overlay;n[l+c]=te(u,t.color,h)}if(t.versionText){let c=t.updateText?" (update available)":"",u=`${t.versionText}${c} `,d=" ".repeat(Math.max(0,e.width-Pe(u)));n[e.height-1]=te(`${d}${bc(u,t.color,D.overlay)}`,t.color,D.overlay)}return n.join(`
255
+ `)}function fP(e,t,n,r){let s=kP(e.runners),i=1,o=e.leftTree.map(l=>wP(l,t,r));return[...ns(o,n-i),s]}function mP(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!lc(s)?e.centerTranscript.map(o=>({...o})):hP(e);return ns([...xm(e,t,r),...i],n)}function xm(e,t,n){let r=t-2,s=e.tabs.find(g=>g.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:$P(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?nr(a,n,D.panelBg):Ki(a,n,D.panelMuted)}`,c=[`${Ki(e.centerHeader.tabLabel,n,D.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),u=TP(e.tabs,n,e.focusedRegion==="center"),d=" engaged ",p=d.length+2,h=e.inputMode==="terminal"?nr(`${d}\u25CF `,n,D.panelBg):"",f=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Pe(u)-p)):"";return[{text:e.inputMode==="terminal"?`${u}${f}${h}`:u},{text:l,tone:"muted"},{text:c},ze()]}function hP(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},ze(),{text:e.terminal.error},ze(),{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($m)}function $m(e){return{text:Tc(e.segments),segments:e.segments,fullBleed:!0}}function gP(e,t,n,r){let s=e.rightInspection?yP(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):ns([{text:"CONTEXT"},ze(),...e.rightContext.map(i=>bP(i,r)),...e.actionMessage?[ze(),{text:e.actionMessage}]:[]],n);return ns(s,n)}function yP(e,t){let n=e.slice(0,2),r=e.slice(2),s=Math.max(0,t-n.length),i=r.findIndex(a=>a.focused||a.selected),o=i===-1?0:NP(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>Rm(a)),...r.slice(o,o+s).map(a=>Rm(a))]}function Rm(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(" "),i=s===-1?e.text:e.text.slice(0,s),o=s===-1?"":e.text.slice(s);return{text:r,segments:[{text:t},{text:i,style:{fg:"7aa2f7"}},{text:o}],tone:n}}return e.color?{text:r,segments:[{text:t},{text:e.text,style:{fg:e.color}}],tone:n}:{text:r,tone:n}}function wP(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${nr("\u25CF",n,e.selected?D.panelSelected:D.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((f,m)=>f+Pe(m.text),0):0,l=t-Pe(i)-Pe(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",u=e.selected?e.text:e.focused?nr(e.text,n,D.panelBg):e.panelHeader?Ki(e.text,n,D.panelMuted):e.text,d=st(`${r}${c}${u}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let f=`${r}${e.selected?"\u25B8":" "} `,m=d.slice(f.length+2),g=[{text:f},Dm(e.activity,e.activityAnimationFrame??0),{text:` ${m}${i}${o}`},...e.prBadge??[]];return{text:Tc(g),segments:g,tone:p}}if(e.prBadge){let f=[{text:`${d}${i}${o}`},...e.prBadge];return{text:`${d}${i}${e.prBadge.map(g=>g.text).join("")}`,segments:f,tone:p}}return{text:`${d}${i}${o}`,tone:p}}function kP(e){let t=e.map(r=>{let s=r.health>=1,i=parseInt(r.count,10),o=i>1?` (${i})`:"";return{text:`${s?"\u25CF":"\u25CB"} ${r.name}${o}`,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:D.success.fg}}):n.push({text:s.text,style:{fg:D.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function TP(e,t,n){return e.map(r=>{let s=r.active?n?nr(r.label,t,D.panelBg):Ki(r.label,t,D.panelBg):bc(r.label,t,D.panelBg),i=r.activity?kc(Dm(r.activity,r.activityAnimationFrame??0),t,D.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function Dm(e,t){return{text:"\u25CF",style:{fg:e==="working"?mc[t%mc.length]??mc[0]:e==="ready"?D.success.fg:e==="error"?D.error.fg:D.panelMuted.fg}}}function bP(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?bc(e.value,t,D.panelBg):e.value}`}}function Ui(e,t,n,r){let s=RP(r,e.tone??"default"),i=SP(e,n,s);if(r==="left"){if(e.fullBleed)return te(st(i,t),n,s);let a=t-qi-Wi;if(e.rightAlign){let c=Pe(i),u=Math.max(0,a-c),d=`${" ".repeat(qi)}${" ".repeat(u)}${i}${" ".repeat(Wi)}`;return te(d,n,s)}let l=`${" ".repeat(qi)}${st(i,a)}${" ".repeat(Wi)}`;return te(l,n,s)}return r==="center"&&e.fullBleed?PP(e,t,n,s):te(st(` ${i}`,t),n,s)}function RP(e,t){return t==="selected"||t==="focused"?D.panelSelected:t==="muted"?D.panelMuted:D.panelBg}function ns(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(ze());return n}function ze(){return{text:""}}function SP(e,t,n){return e.segments?e.segments.map(r=>kc(r,t,n)).join(""):e.text}function PP(e,t,n,r){let s=" ".repeat(Bi),i=Math.max(0,t-Bi*2);if(!e.segments)return te(`${s}${st(e.text,i)}${s}`,n,r);let o=CP(e.segments,i),a=`${s}${o.map(l=>kc(l,n,r)).join("")}${s}${n?gc:""}`;return te(a,n,r)}function kc(e,t,n){let r=e.href?`${Nm(e.href)}${e.text}${gc}`:IP(e.text);return!t||!e.style?r:`${rs(OP(e.style,n))}${xP(e.style)}${r}${hc}${rs(n)}`}function IP(e){return e.replace(cP,t=>{let[n,r]=vP(t);return`${Nm(n)}${n}${gc}${r}`})}function vP(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function Nm(e){return`\x1B]8;;${e}\x1B\\`}function CP(e,t){let n=AP(e,t);return EP(n,t)}function AP(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=Pe(s.text);if(i<=r){n.push(s),r-=i;continue}let o=Gi(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function EP(e,t){let n=Pe(Tc(e));if(n>=t)return e;let r=[...e].reverse().find(s=>s.style?.bg)?.style;return r?.bg?[...e,{text:" ".repeat(t-n),style:r}]:[...e,{text:" ".repeat(t-n)}]}function OP(e,t){let n=e.inverse?e.bg??t.bg:e.fg,r=e.inverse?e.fg??t.fg:e.bg,s={},i=n??t.fg,o=r??t.bg;return i&&(s.fg=i),o&&(s.bg=o),s}function xP(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 $P(e){let t=0;for(let n of e){if(n.active)return t;t+=n.label.length+(n.activity?2:0)+3}return 0}function _m(e,t){let n=Math.max(0,t-Pe(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function st(e,t){let n=Pe(e);return n>=t?DP(e,t):e+" ".repeat(t-n)}function DP(e,t){if(t<=0)return"";if(Pe(e)<=t)return e;let n=Mm(e);return Gi(n,Math.max(0,t-1))+"\u2026"}function Pe(e){let t=0;for(let n of Array.from(Mm(e)))t+=Lm(n);return t}function Gi(e,t){let n="",r=0;for(let s of Array.from(e)){let i=Lm(s);if(r+i>t)break;n+=s,r+=i}return n}function Lm(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||t>=8203&&t<=8207||t>=8288&&t<=8292||t===65279?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 NP(e,t,n){return Math.min(Math.max(e,t),n)}function Mm(e){return e.replace(lP,"").replace(oP,"")}function Tc(e){return e.map(t=>t.text).join("")}function te(e,t,n){if(!t)return e;let r=rs(n),s=e.replace(aP,`${hc}${r}`);return`${r}${s}${hc}`}function rs(e){let t=[];return e.fg&&t.push(`38;2;${Sm(e.fg).join(";")}`),e.bg&&t.push(`48;2;${Sm(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function Sm(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function nr(e,t,n){return Hi(e,t,D.success.fg,n)}function _P(e,t,n){return Hi(e,t,D.error.fg,n)}function Ki(e,t,n){return Hi(e,t,D.accent.fg,n)}function bc(e,t,n){return Hi(e,t,D.mutedfg.fg,n)}function Hi(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${rs(s)}${e}${rs(r)}`}function jm(e,t,n){let r=e.tasks.find(l=>l.ptyTabs.some(c=>c.id===t))??null,s=r?.ptyTabs.find(l=>l.id===t)??null,i=r?.worktreePath??n,o=s?.kind==="agent"?MP(s):[],a=r?{CRAIG_WORKSPACE_ROOT:n,CRAIG_TASK_ID:r.id,...s?.kind==="agent"?{CRAIG_AGENT_TAB_ID:s.id,...e.agentCapabilityTokens?.[s.id]?{CRAIG_AGENT_CAPABILITY:e.agentCapabilityTokens[s.id]}:{}}:{}}:{};return r?.type==="project"?{cwd:i,command:o,env:{...a,GIT_CEILING_DIRECTORIES:LP(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function LP(e,t){let n=(e??"").split(Rc.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(Rc.delimiter):[...n,t].join(Rc.delimiter)}function MP(e){return e.command.length>0?e.command:["codex"]}function Fm(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 Gt(e){return{columns:Math.max(20,e.width-Q.leftWidth-Q.rightWidth-Q.dividerWidth-Bi*2),rows:Math.max(5,e.height-Q.topRailHeight-5)}}function qm(e){return e.length===1||He(e)||e==="BACKSPACE"||e==="TAB"}function Ht(e){return typeof e=="string"&&new RegExp(`:(?:agent|${J.join("|")})(?:-\\d+)?$`).test(e)}function Wm(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 Sc(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function Bm(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 ss(e){return Km.includes(e)?"SHIFT_ENTER":null}function Pc(e){return Km.some(t=>t.startsWith(e))}function Um(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var Km=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function Vm(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
256
+ `||n===`\r
257
+ `)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function Gm(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function Hm(e,t=null){let n=t?.split(`
121
258
  `)??[];return e.split(`
122
- `).map((n,s)=>r[s]===n?"":`\x1B[${s+1};1H${n}`).join("")}function xn(e,t,r,n){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${r+i};${n}H${s}`).join("")}import{spawn as Sy}from"node:child_process";import{createServer as vy,createConnection as Nd}from"node:net";import{openSync as Iy}from"node:fs";import{mkdir as Cy,readFile as Ro,rm as wt,writeFile as Ay}from"node:fs/promises";import Nn from"node:path";var et=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=co(t.resolutionMs??1e3,"Heartbeat resolution"),this.now=t.now??Date.now,this.onError=t.onError}register(t){if(this.jobs.has(t.id))throw new Error(`Heartbeat job "${t.id}" is already registered.`);let r={...t,intervalMs:co(t.intervalMs,`Heartbeat job "${t.id}" interval`),inFlight:!1,nextRunAt:this.timer?this.now()+t.intervalMs:null};this.jobs.set(t.id,r)}start(){if(this.timer)return;let t=this.now();for(let r of this.jobs.values())r.nextRunAt=t+r.intervalMs;this.abortController=new AbortController,this.timer=setInterval(()=>this.tick(),this.resolutionMs)}stop(){this.abortController?.abort(),this.abortController=null,this.timer&&clearInterval(this.timer),this.timer=null;for(let t of this.jobs.values())t.nextRunAt=null}setResolutionMs(t){let r=co(t,"Heartbeat resolution");r!==this.resolutionMs&&(this.resolutionMs=r,this.timer&&(clearInterval(this.timer),this.timer=setInterval(()=>this.tick(),this.resolutionMs)))}tick(){let t=this.abortController?.signal;if(!t)return;let r=this.now();for(let n of this.jobs.values())n.inFlight||n.nextRunAt===null||r<n.nextRunAt||(n.inFlight=!0,n.nextRunAt=r+n.intervalMs,Promise.resolve().then(()=>n.run(t)).catch(s=>{if(!t.aborted)return Promise.resolve(this.onError(n.id,s)).catch(()=>{})}).finally(()=>{n.inFlight=!1}))}};function co(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as Pd,readFile as _k,rm as uo,stat as jk,writeFile as Fk}from"node:fs/promises";import po from"node:path";async function mo(e){let t=po.join(e.runtimeDir,"orchestration-supervisor.lock");await Pd(e.runtimeDir,{recursive:!0});try{await Pd(t)}catch(n){if(!qk(n))throw n;let s=await _k(po.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await jk(t).catch(()=>null);if(typeof s?.pid=="number"&&!Wk(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await uo(t,{recursive:!0,force:!0}),mo(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await Fk(po.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(n){throw await uo(t,{recursive:!0,force:!0}),n}let r=!1;return{async release(){r||(r=!0,await uo(t,{recursive:!0,force:!0}))}}}function Wk(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var qk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";function Sd(e,t){switch(e){case"codex":case"cursor":case"claude":return`\x1B[200~${t}\x1B[201~\r`;default:return Uk(e)}}function Uk(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import Bk from"node:path";var Vk={type:"system",component:"orchestration-supervisor"};async function vd(e){let t=Bk.join(e.orchestrationDir,"command-event-reconciliation.json"),r=await Dr(t)??{version:1,commands:{}},n=await $e(e),s=!1;for(let i of n){let o=new Set(r.commands[i.id]??[]);for(let a of Kk(i))o.has(a)||(await pt(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:Vk),o.add(a),s=!0);r.commands[i.id]=[...o]}s&&await L(t,r)}function Kk(e){let t=["command.queued"];return e.attempts>0&&t.push("command.delivering"),e.state==="delivered"?t.push("command.delivered"):e.state==="failed"?t.push("command.failed"):e.state==="cancelled"&&t.push("command.cancelled"),t}var Dn=class{constructor(t,r,n={}){this.paths=t;this.runtime=r;let s=n.intervalMs??250;this.heartbeat=new et({resolutionMs:s,onError:(i,o)=>n.onError?.(o)}),this.heartbeat.register({id:"orchestration.commands",intervalMs:s,run:()=>this.reconcile()})}paths;runtime;heartbeat;lease=null;reconciliation=null;async start(){if(!this.lease){this.lease=await mo(this.paths);try{await this.reconcile(),this.heartbeat.start()}catch(t){throw await this.lease.release(),this.lease=null,t}}}async wake(){await this.reconcile()}async stop(){this.heartbeat.stop(),await this.reconciliation?.catch(()=>{}),await this.lease?.release(),this.lease=null}reconcile(){return this.reconciliation?this.reconciliation:(this.reconciliation=this.reconcileCommands().finally(()=>{this.reconciliation=null}),this.reconciliation)}async reconcileCommands(){await vd(this.paths);let t=await $e(this.paths);for(let r of t){if(r.state==="delivering"){await ie.fail(this.paths,r.id,Sr("PROMPT_DELIVERY_UNCERTAIN","Craig resumed after prompt delivery began; the prompt was not replayed.",!1,!0));continue}r.state==="queued"&&await this.reconcileCommand(r)}}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await ie.fail(this.paths,t.id,Sr("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let r=await P.getTask(this.paths,t.taskId).catch(i=>{if(i instanceof g&&i.code==="TASK_NOT_FOUND")return null;throw i}),n=r?.ptyTabs.find(i=>i.id===t.agentTabId);if(!r||!n||n.kind!=="agent"||r.status==="closed"){await ie.fail(this.paths,t.id,Sr("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer available in task ${t.taskId}.`,!1,!1));return}let s=this.runtime.getActivitySnapshots().find(i=>i.tabId===t.agentTabId);if(s&&s.sessionState!=="running"){await ie.fail(this.paths,t.id,Sr("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(this.runtime.hasRunningSession(t.agentTabId)&&!(t.delivery==="when-ready"&&He(r,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")){await ie.beginDelivery(this.paths,t.id);try{this.runtime.writeToSession(t.agentTabId,Sd(n.runner??r.runner,t.prompt.text))}catch(i){await ie.fail(this.paths,t.id,Sr("PROMPT_DELIVERY_UNCERTAIN",i instanceof Error?i.message:"Prompt delivery failed after it began.",!1,!0));return}await ie.completeDelivery(this.paths,t.id)}}},Sr=(e,t,r,n)=>({code:e,message:t,retryable:r,deliveryUncertain:n});var Gk={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},Vt=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...Gk,...t.intervals},this.now=t.now??Date.now}takeDueTasks(t,r){let n=this.now(),s=new Set(t.map(o=>o.id));for(let o of this.scheduledTasks.keys())s.has(o)||this.scheduledTasks.delete(o);let i=[];for(let o of t){let a=this.getTaskIntervalMs(o,r);if(a===null){this.scheduledTasks.delete(o.id);continue}let l=this.scheduledTasks.get(o.id);if(!l){this.scheduledTasks.set(o.id,{intervalMs:a,nextPollAt:n,lastPollAt:null}),n>=this.notBefore&&i.push(o);continue}a<l.intervalMs&&(l.nextPollAt=Math.min(l.nextPollAt,n+a)),l.intervalMs=a,n>=this.notBefore&&n>=l.nextPollAt&&i.push(o)}return i}requestImmediate(t){let r=this.now();for(let n of t){let s=this.scheduledTasks.get(n);if(!s)continue;let i=s.lastPollAt===null?r:Math.max(r,s.lastPollAt+this.minimumIntervalMs);s.nextPollAt=Math.min(s.nextPollAt,i)}}recordSuccess(t,r){let n=this.now();this.rateLimitFailures=0,this.notBefore=0;for(let s of t){let i=this.getTaskIntervalMs(s,r);i===null?this.scheduledTasks.delete(s.id):this.scheduledTasks.set(s.id,{intervalMs:i,nextPollAt:n+i,lastPollAt:n})}}recordFailure(t,r){let n=this.now(),s=r instanceof fe,i=s?Math.min(this.intervals.rateLimitBaseMs*2**this.rateLimitFailures,this.intervals.rateLimitMaxMs):Math.max(this.minimumIntervalMs,this.intervals.pendingBackgroundMs);s&&(this.rateLimitFailures+=1,this.notBefore=n+i);for(let o of t){let a=this.scheduledTasks.get(o.id);a&&(a.nextPollAt=n+i,a.lastPollAt=n)}}getTaskIntervalMs(t,r){let n=Hk(t),s=t.id===r.selectedTaskId&&r.reviewVisible;if(n.length>0){let i=n.some(zk);return this.withMinimum(i?s?this.intervals.pendingForegroundMs:this.intervals.pendingBackgroundMs:s?this.intervals.stableForegroundMs:this.intervals.stableBackgroundMs)}return t.status!=="closed"?this.withMinimum(s?this.intervals.discoveryForegroundMs:this.intervals.discoveryBackgroundMs):null}withMinimum(t){return Math.max(t,this.minimumIntervalMs)}};function Hk(e){return e.type==="project"&&e.repoTargets?.length?e.repoTargets.map(t=>t.pullRequest).filter(t=>t.status==="open"):e.prs.filter(t=>t.status==="open")}function zk(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as Yk}from"node:fs";var On=class{constructor(t,r){this.paths=t;this.options=r;this.now=r.now??Date.now,this.taskDebounceMs=r.taskDebounceMs??50,this.readyAfterMs=r.readyAfterMs??5e3}paths;options;now;taskDebounceMs;readyAfterMs;agentStates=new Map;readinessTimers=new Map;watcher=null;debounceTimer=null;reconciliation=null;dirty=!1;running=!1;baselineComplete=!1;start(){if(!this.running){this.running=!0,this.baselineComplete=!1;try{this.watcher=Yk(this.paths.tasksDir,{persistent:!1},()=>{this.schedule(this.taskDebounceMs)}),this.watcher.on("error",t=>{this.reportError(t)})}catch(t){this.reportError(t)}this.schedule(0)}}notifyActivity(t){if(!this.running)return;let r=De(t.tabId,[t],this.now());this.agentStates.get(t.tabId)!==r&&(this.agentStates.set(t.tabId,r),this.schedule(0)),this.scheduleReadiness(t)}notifyActivityRemoved(t){this.running&&(this.clearReadinessTimer(t),this.agentStates.delete(t)&&this.schedule(0))}async stop(){if(this.running){this.running=!1,this.watcher?.close(),this.watcher=null,this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=null;for(let t of this.readinessTimers.values())clearTimeout(t);this.readinessTimers.clear(),await this.reconciliation?.catch(()=>{})}}scheduleReadiness(t){if(this.clearReadinessTimer(t.tabId),t.sessionState!=="running")return;let r=Math.max(0,t.lastActivityAt+this.readyAfterMs-this.now());this.readinessTimers.set(t.tabId,setTimeout(()=>{this.readinessTimers.delete(t.tabId),!(!this.running||this.agentStates.get(t.tabId)!=="working")&&(this.agentStates.set(t.tabId,"ready"),this.schedule(0))},r+1))}clearReadinessTimer(t){let r=this.readinessTimers.get(t);r&&clearTimeout(r),this.readinessTimers.delete(t)}schedule(t){if(this.running){if(this.reconciliation){this.dirty=!0;return}this.debounceTimer||(this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.requestReconciliation()},t))}}requestReconciliation(){if(!this.running||this.reconciliation){this.dirty=!0;return}this.reconciliation=this.drainReconciliations().catch(t=>this.reportError(t)).finally(()=>{this.reconciliation=null,this.running&&this.dirty&&this.requestReconciliation()})}async drainReconciliations(){do{this.dirty=!1;let t=await this.options.reconcileEvents();this.baselineComplete&&t.length>0&&await this.options.onEvents(t),this.baselineComplete=!0}while(this.running&&this.dirty)}async reportError(t){await this.options.onError(t)}};var Jk={selectedTaskId:null,reviewVisible:!1},Xk={listTasks:async e=>(await P.listTasks(e)).tasks,syncTasks:async(e,t)=>(await P.prs.discoverOrRefreshMany(e,t),Promise.all(t.map(r=>P.getTask(e,r.id))))},$n=class{constructor(t,r={}){this.paths=t;let n=r.heartbeatIntervalMs??1e3;this.dependencies=r.dependencies??Xk,this.onTasksChanged=r.onTasksChanged??(()=>{}),this.onError=r.onError??(()=>{}),this.coordinator=new Vt({...r.minimumIntervalMs!==void 0?{minimumIntervalMs:r.minimumIntervalMs}:{},...r.intervals?{intervals:r.intervals}:{},...r.now?{now:r.now}:{}}),this.eventMonitor=r.reconcileEvents?new On(t,{reconcileEvents:r.reconcileEvents,onEvents:async s=>{let i=Qk(s);i.length>0&&await this.wake(i)},onError:s=>this.reportError(s),...r.now?{now:r.now}:{}}):null,this.heartbeat=new et({resolutionMs:n,...r.now?{now:r.now}:{},onError:(s,i)=>this.reportError(i)}),this.heartbeat.register({id:"github.pull-requests",intervalMs:n,run:()=>this.reconcile()})}paths;heartbeat;coordinator;dependencies;onTasksChanged;onError;eventMonitor;pendingWakeTaskIds=new Set;reconciliation=null;reconciliationVersion=0;view=Jk;running=!1;lastErrorMessage=null;start(){this.running||(this.running=!0,this.eventMonitor?.start(),this.heartbeat.start())}async stop(){this.running&&(this.running=!1,this.heartbeat.stop(),await this.eventMonitor?.stop(),await this.reconciliation?.catch(()=>{}))}setView(t){this.view=t}notifyActivity(t){this.eventMonitor?.notifyActivity(t)}notifyActivityRemoved(t){this.eventMonitor?.notifyActivityRemoved(t)}async wake(t){if(t?.length){for(let r of t)this.pendingWakeTaskIds.add(r);this.reconciliationVersion+=1}await this.reconcile()}reconcile(){return this.reconciliation?this.reconciliation:(this.reconciliation=this.drainReconciliations(),this.reconciliation)}async drainReconciliations(){try{for(;;){let t=this.reconciliationVersion,r=[...this.pendingWakeTaskIds];if(this.pendingWakeTaskIds.clear(),this.coordinator.requestImmediate(r),await this.reconcilePullRequests(),t===this.reconciliationVersion)return}}finally{this.reconciliation=null}}async reconcilePullRequests(){let t=await this.dependencies.listTasks(this.paths),r=this.view,n=this.coordinator.takeDueTasks(t,r);if(n.length===0)return;let s=new Map(n.map(o=>[o.id,Id(o)])),i;try{i=await this.dependencies.syncTasks(this.paths,n)}catch(o){this.coordinator.recordFailure(n,o),await this.reportPersistedChangesAfterFailure(s),await this.reportError(o);return}this.coordinator.recordSuccess(i,this.view),this.lastErrorMessage=null,await this.reportChangedTasks(s,i)}async reportPersistedChangesAfterFailure(t){try{let r=await this.dependencies.listTasks(this.paths);await this.reportChangedTasks(t,r.filter(n=>t.has(n.id)))}catch(r){await this.reportError(r)}}async reportChangedTasks(t,r){let n=r.filter(s=>t.get(s.id)!==Id(s)).map(s=>s.id);n.length>0&&await this.onTasksChanged(n)}async reportError(t){let r=t instanceof Error?t.message:String(t);r!==this.lastErrorMessage&&(this.lastErrorMessage=r,await this.onError(t))}};function Qk(e){let t=new Set;for(let r of e){if(!r.taskId)continue;if(r.type==="task.created"||r.type==="task.pr.unlinked"){t.add(r.taskId);continue}let n=ey(r.data);if(r.type==="task.updated"){(Array.isArray(n?.changedFields)?n.changedFields:[]).some(i=>typeof i=="string"&&Zk.has(i))&&t.add(r.taskId);continue}r.type==="agent.state.changed"&&n?.previousState==="working"&&(n.state==="ready"||n.state==="idle"||n.state==="error")&&t.add(r.taskId)}return[...t]}var Zk=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),ey=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function Id(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as dy}from"node:module";import ty from"@xterm/headless";var ry=1e3,ny=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function Ad(e){return new ty.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:ry,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}})}function Ed(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function go(e,t){return new Promise(r=>{e.write(t,r)})}function xd(e,t=0){let r=e.buffer.active,n=[],s=r.getNullCell(),i=r.baseY+r.cursorY,o=Math.max(0,r.baseY-t);for(let a=0;a<e.rows;a+=1){let l=r.getLine(o+a);if(!l){n.push({segments:[]});continue}let c=[];for(let d=0;d<e.cols;d+=1){let u=l.getCell(d,s);!u||u.getWidth()===0||c.push({text:u.getChars()||" ",style:oy(u,o+a===i&&d===r.cursorX)})}n.push({segments:sy(iy(c))})}return n}function sy(e){let t=[];for(let r of e){let n=t.at(-1);if(n&&cy(n.style,r.style)){n.text+=r.text;continue}let s={text:r.text};Dd(r.style)||(s.style=r.style),t.push(s)}return t}function iy(e){let t=e.length;for(;t>0;){let r=e[t-1];if(!r||r.text!==" "||!Dd(r.style))break;t-=1}return e.slice(0,t)}function oy(e,t){let r={},n=Cd(e,"fg"),s=Cd(e,"bg");return n&&(r.fg=n),s&&(r.bg=s),e.isBold()&&(r.bold=!0),e.isDim()&&(r.dim=!0),e.isItalic()&&(r.italic=!0),e.isUnderline()&&(r.underline=!0),(e.isInverse()||t)&&(r.inverse=!0),r}function Cd(e,t){if(t==="fg"?e.isFgDefault():e.isBgDefault())return;let n=t==="fg"?e.isFgRGB():e.isBgRGB(),s=t==="fg"?e.getFgColor():e.getBgColor();return n?s.toString(16).padStart(6,"0"):ny[s]??ay(s)}function ay(e){if(e>=16&&e<=231){let t=e-16,r=Math.floor(t/36),n=Math.floor(t%36/6),s=t%6;return[r,n,s].map(ly).map(i=>i.toString(16).padStart(2,"0")).join("")}if(e>=232&&e<=255){let t=8+(e-232)*10;return[t,t,t].map(r=>r.toString(16).padStart(2,"0")).join("")}return"e6e6e6"}function ly(e){return e===0?0:55+e*40}function cy(e,t){return fo(e)===fo(t)}function fo(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function Dd(e){return fo(e)===""}var uy=dy(import.meta.url),py=/^CTRL_([A-Z])$/,my="\x1B[6n",fy="\x1B[c",gy="\x1B[?u",hy={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
123
- `,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:""},Mn=class{sessions=new Map;activitySnapshots=new Map;shell;env;spawn;onUpdate;onActivity;onActivityRemoved;activityEnabled;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.onActivity=t.onActivity,this.onActivityRemoved=t.onActivityRemoved,this.activityEnabled=t.activityEnabled??!0,this.resolveSessionSpec=t.resolveSessionSpec??(()=>({cwd:t.workspaceRoot,command:[]}))}ensureSession(t,r,n,s){let i=this.sessions.get(r);if(i)if(i.status!=="running")ho(i),this.sessions.delete(r);else return this.attachedTabId=r,i.scrollbackLines=0,Od(i,n),this.getViewState(r);let o;try{o=this.createSession(t,r,n,s)}catch(a){throw this.recordActivity({taskId:t,tabId:r,sessionState:"failed",lastActivityAt:Date.now(),exitCode:null,error:a instanceof Error?a.message:String(a)}),a}return this.sessions.set(r,o),this.notifyActivity(o),this.attachedTabId=r,this.getViewState(r)}write(t){let r=this.getAttachedSession();!r||r.status!=="running"||(r.pty.write(t),(t.includes("\r")||t.includes(`
124
- `))&&this.touchActivity(r))}writeKey(t){let r=wy(t);r!==null&&this.write(r)}hasRunningSession(t){return this.sessions.get(t)?.status==="running"}writeToSession(t,r){let n=this.sessions.get(t);if(!n||n.status!=="running")throw new Error(`Agent tab ${t} is not running.`);n.pty.write(r),this.touchActivity(n)}scrollViewport(t){let r=this.getAttachedSession();if(!r||t===0)return;let n=r.terminal.buffer.active.baseY;r.scrollbackLines=Math.max(0,Math.min(n,r.scrollbackLines-t))}resize(t){let r=this.getAttachedSession();r&&Od(r,t)}detach(){this.attachedTabId=null}sessionTabIds(){return[...this.sessions.keys()]}getActivitySnapshots(){return[...this.activitySnapshots.values()]}setActivityEnabled(t){if(this.activityEnabled!==t&&(this.activityEnabled=t,!!t))for(let r of this.sessions.values())this.notifyActivity(r)}disposeSession(t){let r=this.sessions.get(t);r&&(ho(r),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())ho(t);this.sessions.clear();for(let t of this.activitySnapshots.keys())this.onActivityRemoved?.(t);this.activitySnapshots.clear(),this.attachedTabId=null}getViewState(t){if(!t)return{status:"idle",rows:[],error:null,scrolledBack:!1};let r=this.sessions.get(t);return r?{status:r.status,rows:ky(r),error:r.error,scrolledBack:r.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}createSession(t,r,n,s){let i=this.spawn??Ty().spawn,o=Ad(n),a=s??this.resolveSessionSpec(t,r),l=ct({...this.env,...a.env??{}}),{executable:c,args:d}=Ry(this.shell,a.command,{cwd:a.cwd,env:l}),u=i(c,d,{name:"xterm-256color",cols:n.columns,rows:n.rows,cwd:a.cwd,env:by(l)}),f={taskId:t,tabId:r,pty:u,terminal:o,status:"running",error:null,disposables:[],scrollbackLines:0,rows:[],renderedScrollbackLines:null,screenDirty:!0,lastActivityAt:Date.now(),exitCode:null};return f.disposables.push(u.onData(h=>{this.touchActivity(f),Py(u,h),go(f.terminal,h).then(()=>{f.screenDirty=!0,this.onUpdate?.({tabId:f.tabId,kind:"full"})})})),f.disposables.push(u.onExit(h=>{f.status="exited",f.exitCode=h.exitCode,f.lastActivityAt=Date.now(),this.notifyActivity(f),go(f.terminal,`\r
125
- [process exited ${h.exitCode}]`).then(()=>{f.screenDirty=!0,this.onUpdate?.({tabId:f.tabId,kind:"full"})})})),f}getAttachedSession(){return this.attachedTabId?this.sessions.get(this.attachedTabId)??null:null}touchActivity(t){t.lastActivityAt=Date.now(),this.activityEnabled&&this.notifyActivity(t)}notifyActivity(t){this.activityEnabled&&this.recordActivity(this.buildActivitySnapshot(t))}recordActivity(t){this.activityEnabled&&(this.activitySnapshots.set(t.tabId,t),this.onActivity?.(t))}removeActivity(t){this.activitySnapshots.delete(t)&&this.onActivityRemoved?.(t)}buildActivitySnapshot(t){return{taskId:t.taskId,tabId:t.tabId,sessionState:t.status==="failed"?"failed":t.status==="exited"?"exited":"running",lastActivityAt:t.lastActivityAt,exitCode:t.exitCode,error:t.error}}};function wy(e){if(e.length===1)return e;let t=hy[e];if(t!==void 0)return t;let r=py.exec(e);return r?.[1]?String.fromCharCode(r[1].charCodeAt(0)-64):null}function Od(e,t){yy(e.pty,t),Ed(e.terminal,t),e.screenDirty=!0}function ky(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=xd(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function ho(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function yy(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function Ty(){return uy("node-pty")}function Ry(e,t,r){if(t.length===0)return{executable:e,args:[]};let s=`${[dt(t[0],r),...t.slice(1)].map($d).join(" ")}; exec ${$d(e)} -l`;return{executable:e,args:["-lc",s]}}function $d(e){return`'${e.replaceAll("'","'\\''")}'`}function by(e){let t={};for(let[r,n]of Object.entries(e))typeof n=="string"&&(t[r]=n);return t.TERM=t.TERM??"xterm-256color",t}function Py(e,t){for(let r=0;r<wo(t,my);r+=1)e.write("\x1B[1;1R");for(let r=0;r<wo(t,fy);r+=1)e.write("\x1B[?1;2c");for(let r=0;r<wo(t,gy);r+=1)e.write("\x1B[?0u")}function wo(e,t){if(t.length===0)return 0;let r=0,n=e.indexOf(t);for(;n!==-1;)r+=1,n=e.indexOf(t,n+t.length);return r}var Ld=Lt,Ey=new Set([Ld]),xy=16,Dy=250;async function _d(e){let t=ze(e.paths);await Ny(t,e.paths,e.spawnDaemon);let r=await Vd(t.socketPath),n=new ko(r,e);return await n.ready(),n}async function jd(e,t={}){let r=ze(e);await Cy(e.runtimeDir,{recursive:!0}),await wt(r.socketPath,{force:!0});let n=new yo(e,t),s=vy(i=>n.handleConnection(i));try{await n.start(),await qy(s,r.socketPath),await Ay(r.pidPath,String(process.pid),"utf8"),await new Promise(i=>{let o=!1,a=()=>{o||(o=!0,n.closeClients(),s.close(()=>{process.removeListener("SIGTERM",a),process.removeListener("SIGINT",a),i()}))};n.onShutdown=a,process.once("SIGTERM",a),process.once("SIGINT",a)})}finally{n.onShutdown=null,await wt(r.socketPath,{force:!0}),await wt(r.pidPath,{force:!0}),await n.stop(),n.disposeAll()}}async function Fd(e){let t=ze(e);return await Ln(t.socketPath)?(await Ud(t.socketPath),!0):!1}var ko=class{constructor(t,r){this.socket=t;this.options=r,this.activityEnabled=r.activityEnabled??!1,this.tasksChangedHandler=r.onTasksChanged,t.setEncoding("utf8"),t.on("data",n=>this.handleData(String(n))),t.on("error",n=>this.rejectAll(n instanceof Error?n:new Error(String(n)))),t.on("close",()=>{this.closed||(this.closed=!0,this.rejectAll(new Error("Craig PTY daemon connection closed.")),this.failRunningActivities("Craig PTY daemon connection closed."))})}socket;managesPullRequestSync=!0;nextRequestId=1;pending=new Map;viewCache=new Map;activityCache=new Map;activityRevisionByTabId=new Map;activityRevision=0;attachedTabId=null;viewedTabId=null;subscribedTabId=null;activityEnabled;pullRequestPollView={selectedTaskId:null,reviewVisible:!1};tasksChangedHandler;buffer="";closed=!1;options;async ready(){let t=await this.send({type:"ping"});if(!qd(t.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch.");await this.send({type:"setActivityEnabled",enabled:this.activityEnabled}),this.activityEnabled&&await this.refreshActivitySnapshots()}async ensureSession(t,r,n){let s=await this.send({type:"ensureSession",taskId:t,tabId:r,size:n,spec:this.options.resolveSessionSpec?.(t,r)??{cwd:this.options.workspaceRoot,command:[]}});this.attachedTabId=r,this.viewedTabId=r,this.subscribedTabId=r;let i=s.view??{status:"idle",rows:[],error:null};return this.viewCache.set(r,i),i}async hydrateSessions(t){for(let r of t)try{let n=await this.send({type:"hydrateSession",tabId:r});n.view&&this.viewCache.set(r,n.view)}catch(n){let s=n instanceof Error?n.message:String(n);this.viewCache.set(r,{status:"failed",rows:[],error:s})}this.activityEnabled&&await this.refreshActivitySnapshots()}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){let r=this.attachedTabId;this.send({type:"scrollViewport",lines:t}).then(n=>{r&&n.view&&(this.viewCache.set(r,n.view),this.notifyFullUpdate(r))}).catch(()=>{})}resize(t){let r=this.attachedTabId;this.send({type:"resize",size:t}).then(n=>{r&&n.view&&(this.viewCache.set(r,n.view),this.notifyFullUpdate(r))}).catch(()=>{})}detach(){this.attachedTabId=null,this.send({type:"detach"}).catch(()=>{})}setViewedTab(t){this.closed||(this.viewedTabId=t,this.subscribeToView(t))}setActivityEnabled(t){if(!(this.closed||this.activityEnabled===t)){if(this.activityEnabled=t,!t){for(let r of[...this.activityCache.keys()])this.removeCachedActivity(r);this.send({type:"setActivityEnabled",enabled:t}).catch(()=>{});return}this.send({type:"setActivityEnabled",enabled:t}).then(()=>this.refreshActivitySnapshots(!0)).catch(()=>{})}}setPullRequestPollView(t){this.closed||this.pullRequestPollView.selectedTaskId===t.selectedTaskId&&this.pullRequestPollView.reviewVisible===t.reviewVisible||(this.pullRequestPollView=t,this.send({type:"setPullRequestPollView",view:t}).catch(()=>{}))}setTasksChangedHandler(t){this.tasksChangedHandler=t}disposeSession(t){this.viewCache.delete(t),this.removeCachedActivity(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}}getActivitySnapshots(){return[...this.activityCache.values()]}async requestShutdown(){await this.send({type:"shutdown"})}async send(t){if(this.closed)throw new Error("Craig PTY daemon connection is closed.");let r=this.nextRequestId;this.nextRequestId+=1;let n={...t,id:r},s=new Promise((o,a)=>{this.pending.set(r,{resolve:o,reject:a})});if(this.socket.destroyed)throw this.pending.delete(r),new Error("Craig PTY daemon connection is closed.");this.socket.write(`${JSON.stringify(n)}
126
- `);let i=await s;if(!i.ok)throw new Error(i.error);return i}handleData(t){this.buffer+=t;let r=this.buffer.indexOf(`
127
- `);for(;r!==-1;){let n=this.buffer.slice(0,r);this.buffer=this.buffer.slice(r+1),this.handleMessage(n),r=this.buffer.indexOf(`
128
- `)}}handleMessage(t){if(t.trim().length===0)return;let r;try{r=JSON.parse(t)}catch{return}if("id"in r){let n=this.pending.get(r.id);if(!n)return;this.pending.delete(r.id),n.resolve(r);return}if(r.type==="update"){let n=this.viewCache.get(r.tabId)??{status:"idle",rows:[],error:null,scrolledBack:!1},s=My(n,r.patch),i=n.rows.slice(0,r.patch.rowCount);for(let o of r.patch.rows)i[o.index]=o.row;this.viewCache.set(r.tabId,{status:r.patch.status,rows:i,error:r.patch.error,scrolledBack:r.patch.scrolledBack}),this.viewedTabId===r.tabId&&this.options.onUpdate?.(s?{tabId:r.tabId,kind:"full"}:{tabId:r.tabId,kind:"rows",rowIndices:r.patch.rows.map(o=>o.index)})}r.type==="activity"&&(this.recordCachedActivity(r.snapshot),this.options.onActivity?.(r.snapshot)),r.type==="activityRemoved"&&this.removeCachedActivity(r.tabId),r.type==="tasksChanged"&&this.tasksChangedHandler?.(r.taskIds)}subscribeToView(t){this.closed||this.subscribedTabId===t||(this.subscribedTabId=t,this.send({type:"subscribeView",tabId:t}).then(r=>{t&&r.view&&this.viewCache.set(t,r.view),this.viewedTabId===t&&this.subscribedTabId===t&&this.notifyFullUpdate(t)}).catch(()=>{this.subscribedTabId===t&&(this.subscribedTabId=null)}))}rejectAll(t){for(let r of this.pending.values())r.reject(t);this.pending.clear()}notifyFullUpdate(t){t&&this.options.onUpdate?.({tabId:t,kind:"full"})}replaceActivityCache(t,r){let n=new Map;for(let[s,i]of this.activityRevisionByTabId)i>r&&n.set(s,this.activityCache.get(s)??null);this.activityCache.clear();for(let s of t)this.activityCache.set(s.tabId,s);for(let[s,i]of n)i?this.activityCache.set(s,i):this.activityCache.delete(s)}async refreshActivitySnapshots(t=!1){let r=this.activityRevision,n=await this.send({type:"getActivitySnapshots"});if(this.replaceActivityCache(n.activities??[],r),t)for(let s of this.activityCache.values())this.options.onActivity?.(s)}recordCachedActivity(t){this.activityRevision+=1,this.activityRevisionByTabId.set(t.tabId,this.activityRevision),this.activityCache.set(t.tabId,t)}removeCachedActivity(t){this.activityRevision+=1,this.activityRevisionByTabId.set(t,this.activityRevision),this.activityCache.delete(t),this.options.onActivityRemoved?.(t)}failRunningActivities(t){for(let r of this.activityCache.values()){if(r.sessionState!=="running")continue;let n={...r,sessionState:"failed",lastActivityAt:Date.now(),error:t};this.recordCachedActivity(n),this.options.onActivity?.(n)}}},yo=class{onShutdown=null;clients=new Set;subscriptions=new Map;updateTimers=new Map;activityTimers=new Map;pendingActivities=new Map;runtime;paths;orchestrationSupervisor=null;pullRequestSyncSupervisor=null;pullRequestEventReconciliationEnabled=!1;pullRequestSyncOptions;attachedTabId=null;constructor(t,r){this.paths=t,this.pullRequestSyncOptions=r.pullRequestSync;let n={...r};delete n.pullRequestSync,this.runtime=new Mn({...n,workspaceRoot:t.workspaceRoot,activityEnabled:!1,onUpdate:s=>this.handleRuntimeUpdate(s.tabId),onActivity:s=>this.handleActivityUpdate(s),onActivityRemoved:s=>this.handleActivityRemoved(s)})}async start(){let t=await k.load(this.paths);if(this.pullRequestSyncOptions!==!1){let n=this.pullRequestSyncOptions??{},s=n.reconcileEvents===!1?!1:n.reconcileEvents??(()=>Je(this.paths,{agentObserver:{daemonAvailable:!0,getSnapshots:()=>this.runtime.getActivitySnapshots(),subscribe:()=>()=>{},close:()=>{}}}));this.pullRequestEventReconciliationEnabled=!!s,this.pullRequestSyncSupervisor=new $n(this.paths,{...n,reconcileEvents:s,minimumIntervalMs:n.minimumIntervalMs??(t.github?.watchIntervalSeconds??5)*1e3,onTasksChanged:async i=>{this.broadcastTasksChanged(i),await n.onTasksChanged?.(i)},onError:async i=>{await Se.appendErrorLogBestEffort(this.paths,{context:"pull request sync supervisor",message:i instanceof Error?i.message:String(i)}),await n.onError?.(i)}}),this.pullRequestSyncSupervisor.start(),this.updateRuntimeActivityEnabled()}let r=(await $e(this.paths)).some(n=>n.state==="queued"||n.state==="delivering");(k.previews.isEnabled(t,"agentOrchestration")||r)&&await this.ensureOrchestrationSupervisor()}async stop(){await this.pullRequestSyncSupervisor?.stop(),this.pullRequestSyncSupervisor=null,this.pullRequestEventReconciliationEnabled=!1,this.updateRuntimeActivityEnabled(),await this.orchestrationSupervisor?.stop(),this.orchestrationSupervisor=null}handleConnection(t){let r="";this.clients.add(t),this.subscriptions.set(t,{activityEnabled:!1,tabId:null,view:null,rowKeys:[],pullRequestPollView:{selectedTaskId:null,reviewVisible:!1}}),t.setEncoding("utf8"),t.on("data",s=>{r+=String(s);let i=r.indexOf(`
129
- `);for(;i!==-1;){let o=r.slice(0,i);r=r.slice(i+1),this.handleLine(t,o),i=r.indexOf(`
130
- `)}});let n=()=>{this.clients.delete(t),this.subscriptions.delete(t),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()),this.hasActivitySubscribers()||(this.updateRuntimeActivityEnabled(),this.clearPendingActivityBroadcasts())};t.on("close",n),t.on("error",n)}disposeAll(){for(let t of this.updateTimers.values())clearTimeout(t);this.updateTimers.clear();for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear(),this.runtime.disposeAll()}closeClients(){for(let t of this.clients)t.destroy();this.clients.clear(),this.subscriptions.clear(),this.updateRuntimeActivityEnabled()}async handleLine(t,r){if(r.trim().length===0)return;let n;try{n=JSON.parse(r)}catch{ht(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,n);ht(t,{id:n.id,ok:!0,...n.type==="ping"?{protocolVersion:Ld}:{},...n.type==="getActivitySnapshots"?{activities:this.runtime.getActivitySnapshots()}:{},...s?{view:s}:{}})}catch(s){let i=s instanceof Error?s.message:String(s);ht(t,{id:n.id,ok:!1,error:i})}}async handleRequest(t,r){switch(r.type){case"ping":return null;case"ensureSession":return this.attachedTabId=r.tabId,this.subscribe(t,r.tabId,this.runtime.ensureSession(r.taskId,r.tabId,r.size,r.spec));case"hydrateSession":return this.runtime.getViewState(r.tabId);case"write":return this.runtime.write(r.input),null;case"writeKey":return this.runtime.writeKey(r.key),null;case"scrollViewport":return this.runtime.scrollViewport(r.lines),this.runtime.getViewState(this.attachedTabId);case"resize":return this.runtime.resize(r.size),this.runtime.getViewState(this.attachedTabId);case"detach":return this.runtime.detach(),this.attachedTabId=null,null;case"disposeSession":return this.runtime.disposeSession(r.tabId),this.attachedTabId===r.tabId&&(this.attachedTabId=null),null;case"setActivityEnabled":return this.setActivityEnabled(t,r.enabled),null;case"subscribeView":return this.subscribe(t,r.tabId,this.runtime.getViewState(r.tabId));case"pruneStale":{let n=new Set(r.keepTabIds),s=new Set([...this.runtime.sessionTabIds(),...this.runtime.getActivitySnapshots().map(i=>i.tabId)]);for(let i of s)n.has(i)||(this.runtime.disposeSession(i),this.attachedTabId===i&&(this.attachedTabId=null));return null}case"getViewState":return this.runtime.getViewState(r.tabId);case"getActivitySnapshots":return null;case"setPullRequestPollView":return this.setPullRequestPollView(t,r.view),null;case"wakeOrchestration":return await this.ensureOrchestrationSupervisor(),await this.orchestrationSupervisor.wake(),null;case"shutdown":return setTimeout(()=>this.onShutdown?.(),0),null;default:return Uy(r)}}subscribe(t,r,n){let s=this.subscriptions.get(t);return this.subscriptions.set(t,{activityEnabled:s?.activityEnabled??!1,tabId:r,view:n,rowKeys:n.rows.map(To),pullRequestPollView:s?.pullRequestPollView??{selectedTaskId:null,reviewVisible:!1}}),n}setActivityEnabled(t,r){let n=this.subscriptions.get(t);if(!n)return;this.subscriptions.set(t,{...n,activityEnabled:r});let s=this.hasActivitySubscribers();this.updateRuntimeActivityEnabled(),s||this.clearPendingActivityBroadcasts()}setPullRequestPollView(t,r){let n=this.subscriptions.get(t);n&&(this.subscriptions.set(t,{...n,pullRequestPollView:r}),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()))}getPullRequestPollView(){let t=[...this.subscriptions.values()].map(r=>r.pullRequestPollView);return t.find(r=>r.selectedTaskId&&r.reviewVisible)??t.find(r=>r.selectedTaskId)??{selectedTaskId:null,reviewVisible:!1}}broadcastTasksChanged(t){for(let r of this.clients)ht(r,{type:"tasksChanged",taskIds:t})}handleRuntimeUpdate(t){this.scheduleBroadcastUpdate(t)}handleActivityUpdate(t){if(this.pullRequestSyncSupervisor?.notifyActivity(t),!!this.hasActivitySubscribers()){if(this.pendingActivities.set(t.tabId,t),t.sessionState!=="running"){let r=this.activityTimers.get(t.tabId);r&&(clearTimeout(r),this.activityTimers.delete(t.tabId)),this.broadcastActivity(t.tabId);return}this.activityTimers.has(t.tabId)||this.activityTimers.set(t.tabId,setTimeout(()=>{this.activityTimers.delete(t.tabId),this.broadcastActivity(t.tabId)},Dy))}}handleActivityRemoved(t){this.pullRequestSyncSupervisor?.notifyActivityRemoved(t);let r=this.activityTimers.get(t);r&&(clearTimeout(r),this.activityTimers.delete(t)),this.pendingActivities.delete(t);for(let[n,s]of this.subscriptions)s.activityEnabled&&ht(n,{type:"activityRemoved",tabId:t})}broadcastActivity(t){let r=this.pendingActivities.get(t);if(r){this.pendingActivities.delete(t);for(let[n,s]of this.subscriptions)s.activityEnabled&&ht(n,{type:"activity",snapshot:r})}}hasActivitySubscribers(){return[...this.subscriptions.values()].some(t=>t.activityEnabled)}clearPendingActivityBroadcasts(){for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear()}async ensureOrchestrationSupervisor(){if(this.orchestrationSupervisor)return;let t=new Dn(this.paths,this.runtime,{onError:r=>Se.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor",message:r instanceof Error?r.message:String(r)})});await t.start(),this.orchestrationSupervisor=t,this.updateRuntimeActivityEnabled()}updateRuntimeActivityEnabled(){this.runtime.setActivityEnabled(this.orchestrationSupervisor!==null||this.pullRequestEventReconciliationEnabled||this.hasActivitySubscribers())}scheduleBroadcastUpdate(t){this.updateTimers.has(t)||!this.hasViewSubscriber(t)||this.updateTimers.set(t,setTimeout(()=>{this.updateTimers.delete(t),this.broadcastUpdate(t)},xy))}hasViewSubscriber(t){for(let r of this.subscriptions.values())if(r.tabId===t)return!0;return!1}broadcastUpdate(t){let r=this.runtime.getViewState(t);for(let n of this.clients){let s=this.subscriptions.get(n);if(!s||s.tabId!==t)continue;let i=Oy(s,r),o=$y(s.view,r);s.view=r,s.rowKeys=r.rows.map(To),(i.rows.length>0||o)&&ht(n,{type:"update",tabId:t,patch:i})}}};function Oy(e,t){let r=[];for(let n=0;n<t.rows.length;n+=1){let s=t.rows[n];e.rowKeys[n]!==To(s)&&r.push({index:n,row:s})}return{status:t.status,error:t.error,scrolledBack:t.scrolledBack??!1,rowCount:t.rows.length,rows:r}}function $y(e,t){return!e||e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==(t.scrolledBack??!1)||e.rows.length!==t.rows.length}function My(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function To(e){return JSON.stringify(e)}async function Ny(e,t,r){if(await Ly(e.socketPath,1e3))return;await Ln(e.socketPath)&&(await Ud(e.socketPath),await Md(e.socketPath,1e3)),await Ln(e.socketPath)&&(await Fy(e),await Md(e.socketPath,1e3)),await jy(e);let n=t.workspaceRoot;if(r)r(n);else{let{command:o,args:a}=_y(n),l=Iy(Nn.join(t.runtimeDir,"pty-daemon.log"),"a");Sy(o,a,{cwd:n,detached:!0,stdio:["ignore",l,l],env:process.env}).unref()}let s=Date.now();for(;Date.now()-s<5e3;){if(await Wd(e.socketPath))return;await bo(50)}let i=await Ro(Nn.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${i?`
131
- ${i.slice(-2e3)}`:""}`)}async function Wd(e){let t=await Wy(e).catch(()=>null);return t?.ok===!0&&qd(t.protocolVersion)}function qd(e){return e!==void 0&&Ey.has(e)}async function Ly(e,t){let r=Date.now();for(;Date.now()-r<t;){if(await Wd(e))return!0;await bo(50)}return!1}function _y(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=Nn.resolve(Nn.dirname(t),"..","node_modules",".bin","tsx");return{command:Es("tsx")??n,args:[t,"__craig-daemon",e]}}let r=process.argv.slice(1);return{command:process.execPath,args:[...process.execArgv,...r,"__craig-daemon",e]}}async function jy(e){let t=await Ro(e.pidPath,"utf8").catch(()=>null);if(t){let r=Number(t.trim());if(Number.isInteger(r)&&r>0&&Kd(r))return}await wt(e.socketPath,{force:!0}),await wt(e.pidPath,{force:!0})}async function Ln(e){let t=await Vd(e).catch(()=>null);return t?(t.end(),!0):!1}async function Ud(e){await Bd(e,{id:1,type:"shutdown"}).catch(()=>null)}async function Fy(e){let t=await Ro(e.pidPath,"utf8").catch(()=>null),r=Number(t?.trim());if(!Number.isInteger(r)||r<=0||!Kd(r)){await wt(e.socketPath,{force:!0});return}try{process.kill(r,"SIGTERM")}catch{await wt(e.socketPath,{force:!0})}}async function Wy(e){return Bd(e,{id:1,type:"ping"})}function Bd(e,t){return new Promise((r,n)=>{let s=Nd(e),i="",o=setTimeout(()=>{s.destroy(),n(new Error("Craig PTY daemon request timed out."))},500),a=()=>clearTimeout(o);s.setEncoding("utf8"),s.once("connect",()=>s.write(`${JSON.stringify(t)}
132
- `)),s.once("error",l=>{a(),n(l)}),s.on("data",l=>{i+=String(l);let c=i.indexOf(`
133
- `);if(c===-1)return;let d=i.slice(0,c);a(),s.end();try{r(JSON.parse(d))}catch(u){n(u instanceof Error?u:new Error(String(u)))}}),s.once("close",()=>a())})}async function Md(e,t){let r=Date.now();for(;Date.now()-r<t;){if(!await Ln(e))return;await bo(50)}}function Vd(e){return new Promise((t,r)=>{let n=Nd(e);n.once("connect",()=>t(n)),n.once("error",r)})}function qy(e,t){return new Promise((r,n)=>{e.once("error",n),e.listen(t,r)})}function ht(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
134
- `)}catch{}}function Kd(e){try{return process.kill(e,0),!0}catch{return!1}}function bo(e){return new Promise(t=>setTimeout(t,e))}function Uy(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var Po=["Runners","Feature Previews","Error Log","Help"],Hd={agentActivityIndicators:"Agent activity indicators",agentOrchestration:"Agent orchestration"};function So(e,t){return _.map(r=>{let n=k.runners.getProfile(r),s=e.runners?.[r]?.enabled!==!1,i=e.runners?.[r]?.path?.trim(),o=t.pathEdit?.runner===r?`${t.pathEdit.value}_`:i&&i.length>0?i:`default (${n.executable})`;return`${n.displayName} ${s?"enabled":"disabled"} ${o}`})}function zd(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 Yd(e){return ge.map(t=>`${k.previews.isEnabled(e,t)?"[x]":"[ ]"} ${Hd[t]}`)}function Jd(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function Xd(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(Po.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:_n(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"error-log"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function Qd(e,t,r){if(r==="UP"||r==="k")return{kind:"render",state:{...e,menuIndex:Math.max(0,e.menuIndex-1),message:null}};if(r==="DOWN"||r==="j")return{kind:"render",state:{...e,menuIndex:Math.min(ge.length-1,e.menuIndex+1),message:null}};if(r==="ESCAPE")return{kind:"back",state:e};if(!_n(r))return{kind:"noop",state:e};let n=ge[e.menuIndex]??ge[0],s=!k.previews.isEnabled(t,n);return{kind:"save-enabled",feature:n,enabled:s,state:{...e,message:`${Hd[n]} ${s?"enabled":"disabled"}.`}}}function Zd(e,t,r,n){if(e.pathEdit)return By({...e,pathEdit:e.pathEdit},t,r);let s=So(t,e).length;if(r==="UP"||r==="k")return{kind:"render",state:{...e,menuIndex:Math.max(0,e.menuIndex-1),message:null}};if(r==="DOWN"||r==="j")return{kind:"render",state:{...e,menuIndex:Math.min(s-1,e.menuIndex+1),message:null}};if(r==="ESCAPE")return{kind:"back",state:e};if(r==="e"){let a=_[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:a,value:t.runners?.[a]?.path??""}}}}if(!_n(r))return{kind:"noop",state:e};let i=_[e.menuIndex]??"codex",o=t.runners?.[i]?.enabled!==!1;return o&&n.length<=1?{kind:"render",state:{...e,message:"At least one runner must stay enabled."}}:{kind:"save-enabled",runner:i,enabled:!o,state:{...e,message:`${k.runners.getProfile(i).displayName} ${o?"disabled":"enabled"}.`}}}function By(e,t,r){if(r==="ESCAPE")return{kind:"render",state:Gd({...e,message:null})};if(r==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(_n(r)){let n=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:n,path:s.length>0?s:null,state:Gd({...e,message:s.length>0?`${k.runners.getProfile(n).displayName} executable saved.`:`${k.runners.getProfile(n).displayName} executable reset to default.`})}}return Vy(r)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${r}`}}}:{kind:"noop",state:e}}function Gd(e){let t={...e};return delete t.pathEdit,t}function _n(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
135
- `}function Vy(e){return e.length===1&&e>=" "&&e!==""}import vr from"node:path";function eu(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 tu="\u{F024B} ",ru="\u{F0DCF} ",nu="\u25CB",vo="\uEA64",su="\uEAFE",iu="\uEBDA",Io="\u25CB",Co="\u25CF",Ao="\u2713",Eo="\u2715";function ou(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}}var jn=150,au=6;var Wn="empty",z={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function uu(e,t,r){let n=Hy(t,e),s=t.repos.find(b=>b.id===e.selectedRepoId)??t.repos[0]??null,i=n?t.tasks.filter(b=>b.workspaceId===n.id):t.tasks,o=n?.kind==="project"?i:s?i.filter(b=>b.repoId===s.id):[],a=o.find(b=>b.id===e.selectedTaskId)??o[0]??null,l=a?.type==="project",c=CT(t.tasks),d=Jy(e,a),u=Yy(e,a,d,r),f=u.find(b=>b.id===d)??u[0]??{id:"agent",label:"CODEX"},h=t.inspection?.taskId===a?.id?t.inspection:null,p=s?.name??"no repo",w=a?k.runners.getDisplayName(a.runner):k.runners.getDisplayName(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?e.workspaceBrowser.query!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} Search: ${e.workspaceBrowser.query} \u2191\u2193 move Enter select Esc clear search`:`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up / search Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK ${s?`[${s.name}]`:"[no repo]"} \xB7 ${k.runners.getDisplayName(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 [${k.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:Tr(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"?a===null?"n new task Tab tasks Esc pause ? help":d===D?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${k.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:vr.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${vr.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:w},leftTree:Ky(e,t,r),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(b=>AT(b,c[b])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":f.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:p,agent:w},centerTranscript:zy(d,e,s,a,e.workspaceBrowser,h,n),tabs:u,rightContext:IT(s,a),rightInspection:cT(e,a,h)}}function Ky(e,t,r){let n=[{text:"WORKSPACES",muted:!0,panelHeader:!0,focused:e.focusedRegion==="tasks"}];if(!t.workspaces)return Gy(n,e,t.repos,t.tasks,r);let s=t.workspaces;if(s.length===0)n.push({text:"No workspaces registered.",indent:2,muted:!0});else for(let o of s){let a=e.selectedLeftItemId===`workspace:${o.id}`;n.push({id:`workspace:${o.id}`,text:`${o.kind==="project"?"\u2261":"\u2013"} ${o.name??o.id}`,selected:a,focused:a&&e.focusedRegion==="tasks"});let l=o.kind==="project"?o.discoveredRepoIds??[]:[o.primaryRepoId],c=t.tasks.filter(d=>d.workspaceId===o.id);if(c.length===0)n.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let d of c){let u=e.selectedLeftItemId===`task:${d.id}`,f=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,h={id:`task:${d.id}`,taskId:d.id,text:r?f:`${u?"\u25B8":"\u2022"} ${f}`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",...r?{activity:Nt(d,r.snapshots,r.now),activityAnimationFrame:r.animationFrame}:{}},p=mu(d);p&&(h.prBadge=p),n.push(h)}if(o.kind==="project"){let d=`new-task-workspace:${o.id}`,u=e.selectedLeftItemId===d;n.push({id:d,text:`+ New Project Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}if(o.kind==="repo"){let d=`new-task:${o.primaryRepoId}`,u=e.selectedLeftItemId===d;n.push({id:d,text:`+ New Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}else{n.push({text:` Repos (${l.length})`,indent:0,muted:!0});for(let d of l.slice(0,6)){let u=t.repos.find(f=>f.id===d);n.push({text:` \xB7 ${u?.name??d}`,indent:0,muted:!0})}l.length>6&&n.push({text:` \xB7 ${l.length-6} more`,indent:0,muted:!0})}}let i=e.selectedLeftItemId==="new-workspace";return n.push({text:"",muted:!0}),n.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&e.focusedRegion==="tasks"}),n}function Gy(e,t,r,n,s){if(r.length===0)e.push({text:"No repos registered.",indent:2,muted:!0});else for(let o of r){let a=t.selectedLeftItemId===`repo:${o.id}`;e.push({id:`repo:${o.id}`,text:`\u2013 ${o.name}`,selected:a,focused:a&&t.focusedRegion==="tasks"});let l=n.filter(u=>u.repoId===o.id);if(l.length===0)e.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let u of l){let f=t.selectedLeftItemId===`task:${u.id}`,h=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,p={id:`task:${u.id}`,taskId:u.id,text:s?h:`${f?"\u25B8":"\u2022"} ${h}`,indent:2,selected:f,focused:f&&t.focusedRegion==="tasks",...s?{activity:Nt(u,s.snapshots,s.now),activityAnimationFrame:s.animationFrame}:{}},w=mu(u);w&&(p.prBadge=w),e.push(p)}let c=`new-task:${o.id}`,d=t.selectedLeftItemId===c;e.push({id:c,text:`+ New Task [${k.runners.getDisplayName(t.selectedRunner)}]`,indent:2,selected:d,focused:d&&t.focusedRegion==="tasks",muted:!d})}let i=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&t.focusedRegion==="tasks"}),e}function Hy(e,t){let r=e.workspaces??[];if(!e.workspaces)return null;let n=e.tasks.find(s=>s.id===t.selectedTaskId)??null;return n?r.find(s=>s.id===n.workspaceId)??null:t.selectedWorkspaceId?r.find(s=>s.id===t.selectedWorkspaceId)??null:r[0]??null}function zy(e,t,r,n,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(u=>u.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((u,f)=>{let h=f===s.selectedIndex?"\u25B8":" ",p=u.kind==="repo"?" [git repo]":"/";return`${h} ${u.name}${p}`}),d=s.query!==null?`Search: ${s.query}\u2588`:"";return ke(["Browse for a workspace to register.",s.cwd,...d?[d]:[],"",...c,"",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(!r)return ke(["No repos registered yet.","","Run `craig repo add <path>` in command mode, then reopen the shell."]);if(!n){let l=o?.kind==="project",c=l?o.name??"this workspace":r.name,d=l?"Project Task":"Task";return ke([`No tasks in ${c}.`,"",`Press n or choose + New ${d} to create one with ${k.runners.getDisplayName(t.selectedRunner)}.`])}let a=n.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?ke([`${a.title} tab ready for ${n.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."]):ke([`${a.title} tab ready for ${n.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===D&&t.openInspectionKind==="file"?Zy(n,i,t.fileScrollOffset):e===D&&t.openInspectionKind==="diff"?eT(n,i,t.diffScrollOffset):n.ptyTabs.length===0&&!t.openInspectionKind?ke(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):ke(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function Yy(e,t,r,n){let s=t?.ptyTabs.map(o=>({id:o.id,label:Xy(o),...o.kind==="agent"&&n&&t?{activity:He(t,o.id,n.snapshots,n.now),activityAnimationFrame:n.animationFrame}:{}}))??[];if(!t)return[{id:Wn,label:"EMPTY",active:r===Wn,focused:e.focusedRegion==="center"&&r===Wn}];let i=e.openInspectionKind||r===D?[{id:D,label:Qy(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===r,focused:e.focusedRegion==="center"&&o.id===r}))}function Jy(e,t){return t?t.ptyTabs.some(r=>r.id===e.activeTab)||e.activeTab===D&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(r=>r.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??D:e.selectedPtyTabId&&t.ptyTabs.some(r=>r.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??D:Wn}function Xy(e){return e.title.toUpperCase()}function Qy(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,r=t?vr.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${r} \u0394`:r}function Zy(e,t,r){if(!e)return ke(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return ke(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let n=t.selectedFile,s=pu(n.path??n.title);return[{text:n.title},{text:`${n.byteLength===null?"size unknown":`${n.byteLength} bytes`} \xB7 ${n.lines.length} lines \xB7 PgUp/PgDn or wheel scroll`,tone:"muted"},{text:""},...tT(n.lines,r,s)]}function eT(e,t,r){if(!e)return ke(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return ke(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let n=t.selectedDiff,s=pu(n.path??n.title);return[{text:n.title},{text:`${t.diffPaths.length} changed files \xB7 ${n.lines.length} rows \xB7 PgUp/PgDn or wheel scroll`,tone:"muted"},{text:""},...rT(n.lines,r,s)]}function ke(e){return e.map(t=>({text:t}))}function tT(e,t,r){let n=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((i,o)=>{let a=s+o+1;return{text:`${`${String(a).padStart(n," ")} \u2502 `}${i}`,segments:[{text:String(a).padStart(n," "),style:{fg:z.lineNumber}},{text:" \u2502 ",style:{fg:z.gutter}},...xo(i,r)],tone:"default"}})}function rT(e,t,r){let n=nT(e),s=Math.max(0,Math.min(t,Math.max(0,n.length-1)));return n.slice(s).map(i=>sT(i,r))}function nT(e){let t=[],r=0,n=0;for(let s of e){let i=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/.exec(s);if(i){r=Number.parseInt(i[1]??"0",10),n=Number.parseInt(i[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:r,newNumber:null,marker:"-",text:s.slice(1),kind:"delete"}),r+=1;continue}if(s.startsWith("+")&&!s.startsWith("+++")){t.push({oldNumber:null,newNumber:n,marker:"+",text:s.slice(1),kind:"add"}),n+=1;continue}if(s.startsWith(" ")){if(r===0&&n===0)continue;t.push({oldNumber:r,newNumber:n,marker:" ",text:s.slice(1),kind:"context"}),r+=1,n+=1;continue}}}return t}function sT(e,t){let r=lu(e.oldNumber),n=lu(e.newNumber),s=e.kind==="delete"?r:n,i=e.kind==="delete"?{bg:"2a1111",fallbackFg:z.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:z.diffAdd}:null,o=`${s} \u2502 ${e.text}`,a=i?oT(xo(e.text,t),i.bg,i.fallbackFg):xo(e.text,t),l=i?{fg:z.lineNumber,bg:i.bg}:{fg:z.lineNumber},c=i?{fg:z.gutter,bg:i.bg}:{fg:z.gutter};return{text:o,segments:[{text:s,style:l},{text:" \u2502 ",style:c},...a],fullBleed:i!==null}}function lu(e){return e===null?" ":String(e).padStart(4," ")}function pu(e){let t=vr.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 xo(e,t){return t==="diff"?iT(e):t==="markdown"?aT(e):t==="json"?Do(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?Do(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 iT(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:z.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:z.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:z.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:z.diffMeta}}]:[{text:e}]}function oT(e,t,r){return e.map(n=>({text:n.text,style:{...n.style??{fg:r},bg:t}}))}function aT(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:z.markup,bold:!0}}]:Do(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function Do(e,t){let r=[],n=0;for(let s of e.matchAll(t)){let i=s[0],o=s.index??0;o>n&&r.push({text:e.slice(n,o)}),r.push({text:i,style:lT(i)}),n=o+i.length}return n<e.length&&r.push({text:e.slice(n)}),r.length>0?r:[{text:e}]}function lT(e){return e.startsWith("//")||e.startsWith("/*")?{fg:z.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:z.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:z.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:z.markup}:{fg:z.keyword}}function cT(e,t,r){let n=e.selectedProjectTargetId??t?.repoTargets?.[0]?.repoId??null,s=t?.type==="project"&&n?t.repoTargets?.find(a=>a.repoId===n)??null:null,i=t?.type==="project"?fu(t.repoTargets??[]):s?.pullRequest??(t?E(t):null),o=[dT(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=wu(e,t),l=Oo(e,r),c=gT([{id:"review-pr-header",text:"PULL REQUEST",muted:!0},...a,{id:"review-changes-spacer",text:"",muted:!0},{id:"review-changes-header",text:"CHANGES",muted:!0},...l],e);return{title:"",rows:[...o,...c]}}return e.inspectionMode==="files"?{title:"",rows:[...o,...PT(e,r)]}:{title:"",rows:[...o,...Oo(e,r)]}}function dT(e,t){let r=e.inspectionMode,n=[{label:"FILES",active:r==="files"},{label:"REVIEW",active:r==="review"}],s=[];for(let l=0;l<n.length;l++){let c=n[l];l>0&&s.push({text:" "});let d=c.active?e.focusedRegion==="inspector"||e.focusedRegion==="actions"?"9ece6a":"7aa2f7":"565f89";s.push({text:c.label,style:{fg:d}})}let i=$o(t),o=Mo(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function cu(e){return[{text:" "},$o(e),{text:" "},Mo(e)]}function mu(e){if(e.type==="project"&&e.repoTargets?.length){let r=fu(e.repoTargets);return r?cu(r):null}let t=E(e);return t?.number?cu(t):null}function fu(e){let t=e.filter(s=>s.status==="ready"),r=t.map(s=>s.pullRequest).filter(s=>!!s.number);if(r.length===0)return null;let n=pT(r);return{number:-1,status:uT(r),draft:r.some(s=>s.draft),mergeable:r.length===t.length&&r.every(s=>s.mergeable),mergeStateStatus:null,reviewDecision:r.some(s=>s.reviewDecision==="CHANGES_REQUESTED")?"CHANGES_REQUESTED":r.some(s=>s.reviewDecision==="REVIEW_REQUIRED")?"REVIEW_REQUIRED":r.every(s=>s.reviewDecision==="APPROVED")?"APPROVED":null,requiredChecks:r.flatMap(s=>s.requiredChecks),aggregateReadiness:n}}function uT(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 pT(e){let t=e.map(r=>gu(r));return t.some(r=>r==="failed")?"failed":t.some(r=>r==="pending")?"pending":t.length>0&&t.every(r=>r==="success")?"success":"none"}function $o(e){return!e||!e.number?{text:nu,style:{fg:"565f89"}}:e.status==="merged"?{text:su,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:iu,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:vo,style:{fg:"565f89"}}:{text:vo,style:{fg:"9ece6a"}}}function Mo(e){return e?.aggregateReadiness?du(e.aggregateReadiness):du(gu(e))}function du(e){return e==="failed"?{text:Eo,style:{fg:"f7768e"}}:e==="pending"?{text:Co,style:{fg:"e0af68"}}:e==="success"?{text:Ao,style:{fg:"9ece6a"}}:{text:Io,style:{fg:"565f89"}}}function gu(e){let t=e?.requiredChecks??null;return e?.status==="merged"?"success":e?.status==="closed"||!e?.number||!t||t.length===0?"none":t.some(r=>r.status==="failed")||e.reviewDecision==="CHANGES_REQUESTED"?"failed":t.every(r=>r.status==="success"||r.status==="skipped")?hu(e)?"failed":mT(e)?"success":"pending":"pending"}function mT(e){return!!(e.mergeable&&!e.draft&&!hu(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function hu(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function wu(e,t){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return fT(e,t);let r=E(t),n=yu("pr",t.branch,r??{number:null,url:null,baseBranch:null,headBranch:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,lastSyncedAt:null,requiredChecks:[],comments:[]}),s=t.prs.filter(i=>i!==r&&(i.status==="merged"||i.status==="closed")).length;return s>0&&n.push({id:"pr-history",text:`+ ${s} previous PR${s!==1?"s":""}`,muted:!0}),n}var Fn=32;function fT(e,t){let r=[],n=t.repoTargets??[],s=e.selectedProjectTargetId??n[0]?.repoId??null;for(let o of n){let a=s===o.repoId,l=e.focusedRegion==="inspector"&&a,c=o.repoId.startsWith("repo_")?o.repoId.slice(5):o.repoId;if(o.status!=="ready"){let u=o.failureReason?o.failureReason.slice(0,14):o.status,f=Fn-u.length-1,h=c.length>f?c.slice(0,f-1)+"\u2026":c,p=Fn-h.length-u.length;r.push({id:`project-review:${o.repoId}`,text:h+" ".repeat(Math.max(1,p))+u,selected:a,focused:l,muted:!0})}else{let d=$o(o.pullRequest),u=Mo(o.pullRequest),f=`${d.text} ${u.text}`,h=Fn-f.length-1,p=c.length>h?c.slice(0,h-1)+"\u2026":c,w=Fn-p.length-f.length,b=p+" ".repeat(Math.max(1,w));r.push({id:`project-review:${o.repoId}`,text:b+f,selected:a,focused:l,segments:[{text:b},{...d,text:d.text},{text:" "},{...u,text:u.text}]})}}let i=n.find(o=>o.repoId===s)??null;return i?.status==="ready"&&i.pullRequest.number&&(r.push({id:"target-detail-spacer",text:""}),r.push(...yu("target",i.branch,i.pullRequest))),r}function ku(e,t,r=null){return 3+wu(e,t).length+Oo(e,r).length}function yu(e,t,r){let n=u=>`${e}-${u}`;if(!r.number)return[{id:n("no-pr"),text:t,muted:!0}];let s=[],i=`#${r.number}`;s.push(r.url?{id:n("pr-number"),text:`${i} Open in GitHub \u2197`,segments:[{text:i},{text:" Open in GitHub \u2197",style:{fg:"7aa2f7",underline:!0},href:r.url}]}:{id:n("pr-number"),text:i});let o=r.baseBranch??"?",a=r.headBranch??t;s.push({id:n("pr-branches"),text:`${o} \u2192 ${a}`,muted:!0});let l=hT(r.reviewDecision,r.mergeStateStatus),c=l&&l!=="review approved"?"merge blocked":r.mergeable?"merge ready":r.mergeStateStatus?`merge ${r.mergeStateStatus}`:"merge unknown";l?s.push({id:n("pr-merge"),text:`${c} \xB7 ${l}`,muted:!0,segments:[{text:c},{text:" \xB7 "},{text:l,style:{fg:wT(r.reviewDecision,r.mergeStateStatus)}}]}):s.push({id:n("pr-merge"),text:c,muted:!0}),s.push({id:n("pr-synced"),text:`synced ${Tu(r.lastSyncedAt)}`,muted:!0}),s.push({id:n("checks-spacer"),text:""}),s.push({id:n("checks-header"),text:"Checks"}),r.requiredChecks.length?s.push(...r.requiredChecks.map(kT)):s.push({id:n("checks-none"),text:r.number?"No GitHub checks reported.":"No checks \u2014 sync after creating a PR.",muted:!0});let d=r.comments??[];return d.length>0&&(s.push({id:n("comments-spacer"),text:""}),s.push({id:n("comments-header"),text:`Review comments (${d.length})`}),s.push(...d.slice(-4).flatMap((u,f)=>yT(u,n(`comment:${f}`))))),s}function gT(e,t){if(t.focusedRegion!=="inspector"||t.inspectionMode!=="review"||e.length===0)return e;let r=Math.max(0,Math.min(t.reviewScrollOffset,e.length-1));return e.map((n,s)=>({...n,selected:t.reviewScrollOffset===0&&n.selected||s===r,focused:t.reviewScrollOffset===0&&n.focused||s===r}))}function hT(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function wT(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function Tu(e){if(!e)return"--";let t=Date.now()-new Date(e).getTime(),r=Math.floor(t/1e3);if(r<60)return`${r}s ago`;let n=Math.floor(r/60);if(n<60)return`${n}m ago`;let s=Math.floor(n/60);return s<24?`${s}h ago`:`${Math.floor(s/24)}d ago`}function kT(e){let{icon:t,color:r}=RT(e.status),n=e.name.length>16?`${e.name.slice(0,15)}\u2026`:e.name;return{id:`pr-check:${e.name}`,text:`${t} ${n.padEnd(16," ")} ${bT(e.status)}`,color:r,muted:!1}}function yT(e,t){let r=e.author??"unknown",n=e.createdAt?` \xB7 ${Tu(e.createdAt)}`:"",s=TT(e.body,30),i=s.slice(0,4),o=i.length<s.length,a=[{id:`${t}:author`,text:`${r}${n}`,muted:!0},...i.map((l,c)=>({id:`${t}:body:${c}`,text:` ${o&&c===i.length-1?`${l}\u2026`:l}`,muted:!0}))];return a.push({id:`${t}:spacer`,text:"",muted:!0}),a}function TT(e,t){let r=e.split(/\s+/).filter(Boolean);if(r.length===0)return[];let n=[],s="";for(let i of r){if(!s){s=i;continue}`${s} ${i}`.length<=t?s=`${s} ${i}`:(n.push(s),s=i)}return s&&n.push(s),n}function RT(e){switch(e){case"success":return{icon:Ao,color:"9ece6a"};case"pending":return{icon:Co,color:"e0af68"};case"failed":return{icon:Eo,color:"f7768e"};case"skipped":return{icon:Io,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function bT(e){return e==="success"?"passing":e==="failed"?"failing":e}function PT(e,t){if(!t)return[{id:"empty",text:"No file index. Select a task with local changes.",muted:!0}];if(t.error)return[{id:"error",text:t.error,muted:!0}];if(t.fileRows.length===0)return[{id:"empty",text:"No Git-visible files.",muted:!0}];let r=new Map(t.diffRows.map(l=>[l.path,l.status])),n=No(t.fileRows,e.collapsedFileTreePaths),s=e.fileSearchQuery,i=s?n.filter(l=>l.path.toLowerCase().includes(s.toLowerCase())):n,o=s!==null?[{id:"file-search",text:`Search: ${s}\u2588`,muted:!1}]:[],a=e.selectedFileTreePath??t.selectedFilePath;return[...o,...i.map(l=>{let c=l.kind==="file"?r.get(l.path):void 0,d=c==="A"?"9ece6a":c==="M"?"e0af68":c==="D"?"f7768e":c==="??"?"565f89":void 0,u=l.kind==="directory"?e.collapsedFileTreePaths.includes(l.path)?tu:ru:eu(l.label),f=l.kind==="directory"?"7aa2f7":ou(l.label),h=" ".repeat(l.depth),p=f?{text:u,style:{fg:f}}:{text:u},w=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:d?{text:l.label,style:{fg:d}}:{text:l.label},b=[{text:h},p,w];return{id:l.path,text:`${h}${u}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:b}})]}function No(e,t){let r=new Set(t);return e.filter(n=>{let s=n.path.split("/");for(let i=1;i<s.length;i+=1)if(r.has(s.slice(0,i).join("/")))return!1;return!0})}function Oo(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(ST(t))return vT(e,t);let r=[];for(let n of["branch","staged","unstaged","untracked"]){let s=t.diffRows.filter(i=>i.group===n);s.length!==0&&(r.push({id:n,text:n.toUpperCase(),muted:!0}),r.push(...s.map(i=>Ru(i,e,t))))}return r}function ST(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function vT(e,t){let r=[],n=[...new Set(t.diffRows.map(s=>s.path.split("/")[0]).filter(s=>typeof s=="string"&&s.length>0))].sort();for(let s of n){let i=t.diffRows.filter(a=>a.path.startsWith(`${s}/`)),o=s.startsWith("repo_")?s.slice(5):s;r.push({id:`repo-diff:${s}`,text:o,muted:!0});for(let a of["branch","staged","unstaged","untracked"]){let l=i.filter(c=>c.group===a);l.length!==0&&(r.push({id:`repo-diff:${s}:${a}`,text:` ${a}`,muted:!0}),r.push(...l.map(c=>Ru(c,e,t,s.length+1))))}}return r}function Ru(e,t,r,n=0){let s=e.additions===null?"-":`+${e.additions}`,i=e.deletions===null?"-":`-${e.deletions}`,o=e.status==="A"||e.group==="untracked"?"9ece6a":e.status==="D"?"f7768e":"e0af68",a=n>0?e.path.slice(n):e.path;return{id:`${e.group}:${e.path}`,text:` ${e.status.padEnd(2," ")} ${a} ${s}/${i}`,selected:e.path===(t.selectedDiffPath??r.selectedDiffPath),focused:e.path===(t.selectedDiffPath??r.selectedDiffPath)&&t.focusedRegion==="inspector",color:o}}function IT(e,t){return e?t?[{label:"Task",value:t.id},{label:"Repo",value:e.name},{label:"Agent",value:k.runners.getDisplayName(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:vr.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 CT(e){return e.reduce((t,r)=>(t[r.runner]+=1,t),{codex:0,cursor:0,claude:0})}function AT(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function bu(e,t,r,n,s=null){if(s)return ET(e,t,r,n,s);let i=to(e,t,{centerOnly:n});return xT(r,i)?{output:xn(i.rows,r.rows,i.row,i.column),region:i}:null}function ET(e,t,r,n,s){let i=sd(e,t,s,{centerOnly:n});if(!i||!DT(r,i))return null;let o=r.rows.slice();return{output:i.rows.map(({index:l,row:c})=>o[l]===c?"":(o[l]=c,`\x1B[${i.row+l};${i.column}H${c}`)).join(""),region:{row:i.row,column:i.column,width:i.width,rows:o}}}function xT(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function DT(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function Pu(e,t,r){let n={...e},s="";for(let i of r){let o=e[i],a=t[i];if(!OT(o,a))return null;!o||!a||(s+=xn(a.rows,o.rows,a.row,a.column),n[i]=a)}return{output:s,regions:n}}function OT(e,t){return!e||!t?e===t:e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}var $T=["tasks","center","inspector"];function MT(e,t,r){if(t==="ESCAPE")return R({state:{...e,fileSearchQuery:null},changed:!0});if(t==="BACKSPACE"||t==="DELETE"){let n=e.fileSearchQuery??"";return R({state:{...e,fileSearchQuery:n.slice(0,-1)},changed:!0})}if(t==="UP"||t==="k"||t==="DOWN"||t==="j")return _o(e,t==="UP"||t==="k"?-1:1,r);if(t==="ENTER")return Fo({...e,fileSearchQuery:null},t,r);if(t.length===1&&t>=" "){let n=(e.fileSearchQuery??"")+t;return R({state:{...e,fileSearchQuery:n},changed:!0})}return R({state:e})}function Fo(e,t,r={leftItemIds:[]}){if(e.inputMode==="terminal")return Vc(t)?R({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):R({state:e});if(e.fileSearchQuery!==null)return MT(e,t,r);if(t==="/"&&e.focusedRegion==="inspector"&&e.inspectionMode==="files")return R({state:{...e,fileSearchQuery:""},changed:!0});if(t==="q"||t==="Q")return R({state:e,exit:!0});if(t==="ESCAPE")return R({state:{...e,actionMessage:null},changed:e.actionMessage!==null,pause:!0});if(t==="n"||t==="N")return R({state:{...e,focusedRegion:"tasks",actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0});if((t==="r"||t==="R")&&e.focusedRegion==="tasks"&&(kn(e.selectedLeftItemId)||yn(e.selectedLeftItemId)))return R({state:{...e,selectedRunner:wn(e.selectedRunner,r.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return Su(e,1);if(t==="SHIFT_TAB"||t==="[")return Su(e,-1);if(t==="z"||t==="Z")return R({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===D?tt(e,-1,r):_o(e,-1,r);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===D?tt(e,1,r):_o(e,1,r);if(t==="PAGE_UP")return tt(e,-(r.pageRows??10),r);if(t==="PAGE_DOWN")return tt(e,r.pageRows??10,r);if(t==="MOUSE_WHEEL_UP")return tt(e,-3,r);if(t==="MOUSE_WHEEL_DOWN")return tt(e,3,r);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let n=r.enabledRunnerIds??_,s=e.centerTabRunner?n.indexOf(e.centerTabRunner):-1,i=s===n.length-1?null:n[s+1];return R({state:{...e,centerTabRunner:i,actionMessage:null},changed:!0})}if((t==="+"||t==="a"||t==="A"||t==="t"||t==="T")&&e.focusedRegion==="center"&&e.selectedTaskId){let n=UT(e,t);return R({state:{...e,preferredPtyTabKind:n,actionMessage:null},changed:!0,createPtyTab:!0,createPtyTabKind:n,createPtyTabRunner:n==="agent"?e.centerTabRunner:null})}if(t==="R"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return R({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0});if(t==="o"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review"&&e.selectedTaskId)return R({state:e,openPrUrl:!0});if(t==="X"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return R({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Tr(e.selectedLeftItemId)&&e.selectedTaskId)return R({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Yc(e.selectedLeftItemId)&&e.selectedWorkspaceId)return R({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&Cu(e.activeTab,r.ptyTabIds??[]))return R({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return Lo(e,-1,r.centerTabIds);if(e.focusedRegion==="inspector")return vu(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return Lo(e,1,r.centerTabIds);if(e.focusedRegion==="inspector")return vu(e,1)}if(he(t)){if(e.focusedRegion==="tasks"&&(kn(e.selectedLeftItemId)||yn(e.selectedLeftItemId))){let n=zi(e.selectedLeftItemId),s=Yi(e.selectedLeftItemId);return R({state:{...e,selectedRepoId:n??e.selectedRepoId,selectedWorkspaceId:s??e.selectedWorkspaceId,actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0})}if(e.focusedRegion==="tasks"&&e.selectedLeftItemId==="new-workspace")return R({state:{...e,actionMessage:null},changed:!0,openWorkspaceBrowser:!0});if(e.focusedRegion==="tasks"&&Tr(e.selectedLeftItemId)&&e.selectedTaskId){let n=e.selectedPtyTabId??e.activeTab;return R({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:n,selectedPtyTabId:n,preferredPtyTabKind:qt(n)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&Cu(e.activeTab,r.ptyTabIds??[])&&e.selectedTaskId)return R({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:qt(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===D)return R({state:{...e,actionMessage:null},changed:!0,refreshInspection:!0});if(e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="files"){let n=e.selectedFileTreePath??e.selectedFilePath;if(n&&(r.fileTreeDirectoryIds??[]).includes(n))return R({state:_T({...e,selectedFileTreePath:n}),changed:!0});let s=n&&(r.fileTreeFileIds??[]).includes(n)?n:e.selectedFilePath;return R({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:D,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}if(e.focusedRegion==="inspector"&&e.inspectionMode==="review"){let n=e.selectedDiffPath??r.diffPathIds?.[0]??null;return n?R({state:{...e,selectedDiffPath:n,activeTab:D,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!r.projectTargetIds?.length?R({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):R({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?R({state:e}):e.selectedActionId==="refresh-checks"?R({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?R({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):R({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return R({state:e})}function tt(e,t,r){if(t===0)return R({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?Au(e,t,r):e.inspectionMode==="review"?Iu(e,"reviewScrollOffset",t,r.reviewRowCount??100,r.pageRows):R({state:e});if(e.focusedRegion==="center"&&e.activeTab===D){if(e.openInspectionKind==="file")return Iu(e,"fileScrollOffset",t,r.fileLineCount??0,r.pageRows);if(e.openInspectionKind==="diff")return jT(e,t,r)}return R({state:e})}function Su(e,t){return qn(e,"focusedRegion",$T,t)}function Lo(e,t,r){let n=qn(e,"activeTab",r&&r.length>0?r:BT(e),t);return!n.changed||Gc(n.state.activeTab)?n:{...n,state:{...n.state,selectedPtyTabId:n.state.activeTab,preferredPtyTabKind:qt(n.state.activeTab)??n.state.preferredPtyTabKind}}}function _o(e,t,r){if(e.focusedRegion==="tasks")return NT(e,t,r.leftItemIds);if(e.focusedRegion==="center")return Lo(e,t,r.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return Au(e,t,r);if(r.projectTargetIds?.length){let s=jo(e,"selectedProjectTargetId",r.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let n=jo(e,"selectedDiffPath",r.diffPathIds??[],t,!0);return n.changed?{...n,state:{...n.state,activeTab:D,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:qn(e,"selectedActionId",Fc,t)}return qn(e,"selectedActionId",Vi,t)}function NT(e,t,r){let n=jo(e,"selectedLeftItemId",r,t);if(!n.changed)return n;let s=Hi(n.state.selectedLeftItemId);if(s?.kind==="workspace")return{...n,state:{...n.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{...n,state:{...n.state,selectedTaskId:s.id,selectedFilePath:null,selectedFileTreePath:null,selectedDiffPath:null,fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0},refreshInspection:!0};if(s?.kind==="repo")return{...n,state:{...n.state,selectedRepoId:s.id,selectedTaskId:null,selectedPtyTabId:null,selectedFilePath:null,selectedFileTreePath:null,selectedDiffPath:null,fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0},refreshInspection:!0};let i=zi(n.state.selectedLeftItemId);if(i)return{...n,state:{...n.state,selectedRepoId:i}};let o=Yi(n.state.selectedLeftItemId);return o?{...n,state:{...n.state,selectedWorkspaceId:o}}:n}function LT(e,t){if(e.inspectionMode===t)return R({state:e});let r=t==="files"?"file":e.openInspectionKind,n=t==="files"?D:e.activeTab;return R({state:{...e,inspectionMode:t,activeTab:n,openInspectionKind:r,fileScrollOffset:t==="files"?0:e.fileScrollOffset,reviewScrollOffset:t==="review"?0:e.reviewScrollOffset,actionMessage:null},changed:!0,refreshInspection:!0})}function vu(e,t){return LT(e,qT(e.inspectionMode,Ki,t))}function Au(e,t,r){let n=r.fileTreeRowIds&&r.fileTreeRowIds.length>0?r.fileTreeRowIds:r.filePathIds??[];if(n.length===0)return R({state:e});let s=e.selectedFileTreePath??e.selectedFilePath??n[0]??null,i=n.indexOf(s??""),o=Le(i===-1?0:i+t,0,n.length-1),a=n[o]??null;if(a===e.selectedFileTreePath)return R({state:e});let l=a!==null&&(r.fileTreeFileIds??r.filePathIds??[]).includes(a);return R({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?D:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function _T(e){if(!e.selectedFileTreePath)return e;let t=new Set(e.collapsedFileTreePaths);return t.has(e.selectedFileTreePath)?t.delete(e.selectedFileTreePath):t.add(e.selectedFileTreePath),{...e,collapsedFileTreePaths:[...t].sort((r,n)=>r.localeCompare(n)),actionMessage:null}}function Iu(e,t,r,n,s=10){let i=Math.max(0,n-Math.max(1,s)),o=Le(e[t]+r,0,i);return o===e[t]?R({state:e}):R({state:{...e,[t]:o,actionMessage:null},changed:!0})}function jT(e,t,r){if(r.diffPathRanges&&r.diffPathRanges.length>0)return FT(e,t,r);let n=r.diffLineCount??0,s=r.pageRows??10,i=Math.max(0,n-Math.max(1,s)),o=e.diffScrollOffset+t,a=r.diffPathIds??[];if(a.length===0||!e.selectedDiffPath){let d=Le(o,0,i);return d===e.diffScrollOffset?R({state:e}):R({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}let l=a.indexOf(e.selectedDiffPath);if(l===-1){let d=Le(o,0,i);return d===e.diffScrollOffset?R({state:e}):R({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}if(t>0&&o>i){let d=a[l+1]??null;return d?R({state:{...e,selectedDiffPath:d,activeTab:D,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===i?R({state:e}):R({state:{...e,diffScrollOffset:i,actionMessage:null},changed:!0})}if(t<0&&o<0){let d=a[l-1]??null;return d?R({state:{...e,selectedDiffPath:d,activeTab:D,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?R({state:e}):R({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let c=Le(o,0,i);return c===e.diffScrollOffset?R({state:e}):R({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function FT(e,t,r){let n=r.diffLineCount??0,s=r.pageRows??10,i=Math.max(0,n-Math.max(1,s)),o=Le(e.diffScrollOffset+t,0,i),a=WT(r.diffPathRanges??[],o)??e.selectedDiffPath;return o===e.diffScrollOffset&&a===e.selectedDiffPath?R({state:e}):R({state:{...e,diffScrollOffset:o,selectedDiffPath:a,actionMessage:null},changed:!0})}function WT(e,t){return e.find(r=>t>=r.start&&t<r.end)?.path??e.at(-1)?.path??null}function qn(e,t,r,n){let s=r.indexOf(e[t]),i=Le(s+n,0,r.length-1),o=r[i];return!o||o===e[t]?R({state:e}):R({state:{...e,[t]:o,actionMessage:null},changed:!0})}function jo(e,t,r,n,s=!1){if(r.length===0)return R({state:e});let i=r.indexOf(e[t]??r[0]??""),o=Le(i===-1?0:i+n,0,r.length-1),a=r[o]??null;return a===e[t]?R({state:e}):R({state:{...e,[t]:a,actionMessage:null},changed:!0,refreshInspection:s})}function qT(e,t,r){let n=t.indexOf(e);return t[Le(n+r,0,t.length-1)]??e}function R(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,openPrUrl:e.openPrUrl??!1}}function Cu(e,t){return t.includes(e)}function UT(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":qt(e.activeTab)??e.preferredPtyTabKind}function BT(e){return[e.selectedPtyTabId,e.openInspectionKind?D:null].filter(t=>typeof t=="string")}function Le(e,t,r){return Math.min(r,Math.max(t,e))}var Eu=async(e,t,r,n)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await n.queueTaskMutation(async()=>x(n.paths,e.selectedTaskId,i=>{let o=t??VT(i,e.activeTab,e.preferredPtyTabKind),a=$u(i,o,r??void 0,n.config);return{...i,ptyTabs:[...i.ptyTabs,a],selectedPtyTabId:a.id}}));return{updatedTask:s,nextShell:{activeTab:s.selectedPtyTabId??e.activeTab,selectedPtyTabId:s.selectedPtyTabId,preferredPtyTabKind:s.ptyTabs.at(-1)?.kind??e.preferredPtyTabKind,focusedRegion:"center",actionMessage:`Created tab: ${s.ptyTabs.at(-1)?.title??"tab"}`}}},xu=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing a tab.");let{closedTab:r,nextSelectedTab:n}=await t.queueTaskMutation(async()=>{let s={closedTab:null,nextSelectedTab:null};if(await x(t.paths,e.selectedTaskId,i=>{let o=i.ptyTabs.findIndex(l=>l.id===e.activeTab);if(o===-1)throw new Error("Only PTY tabs can be closed.");s.closedTab=i.ptyTabs[o];let a=i.ptyTabs.filter(l=>l.id!==s.closedTab.id);return s.nextSelectedTab=a[Math.min(o,a.length-1)]??null,{...i,ptyTabs:a,selectedPtyTabId:s.nextSelectedTab?.id??null}}),!s.closedTab)throw new Error("Only PTY tabs can be closed.");return{closedTab:s.closedTab,nextSelectedTab:s.nextSelectedTab}});return{closedTab:r,nextSelectedTab:n,nextShell:{activeTab:n?.id??(e.openInspectionKind?"inspection":e.activeTab),selectedPtyTabId:n?.id??null,focusedRegion:"center",actionMessage:`Closed tab: ${r.title}`}}},Du=async(e,t)=>{let r=e.selectedTaskId;r&&await t.queueTaskMutation(async()=>{await x(t.paths,r,n=>!n.ptyTabs.some(s=>s.id===e.activeTab)||n.selectedPtyTabId===e.activeTab?n:{...n,selectedPtyTabId:e.activeTab})})},Ou=async(e,t)=>{let r=e.ptyTabs.find(s=>s.kind==="agent")??null;if(r)return await t.queueTaskMutation(async()=>{await x(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:s})}),{...e,selectedPtyTabId:r.id};let n=$u(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await x(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:{...s,ptyTabs:[...s.ptyTabs,n],selectedPtyTabId:n.id}})}),{...e,ptyTabs:[...e.ptyTabs,n],selectedPtyTabId:n.id}};function VT(e,t,r){return e.ptyTabs.find(n=>n.id===t)?.kind??r}function $u(e,t,r,n={}){let s=r??e.runner,i=k.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&r&&r!==e.runner?`${e.id}:${r}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(h=>h.id)),c=1,d=a;for(;l.has(d);)c+=1,d=`${a}-${c}`;let u=new Date().toISOString(),f=r&&r!==e.runner?r:void 0;return{id:d,kind:t,...f?{runner:f}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,n):[],createdAt:u,updatedAt:u}}var Kt=class extends Error{task;constructor(t,r){super(t),this.name="InteractiveTaskStartupError",this.task=r}},Mu=async(e,t,r,n,s)=>{k.runners.assertEnabled(n,s.config);let i=t?await s.taskService.provisionProjectTask(s.paths,t,r,{runner:n,config:s.config}):await s.taskService.provisionTask(s.paths,e??"",r,{runner:n,config:s.config});try{let l=ct();dt(k.runners.getConfiguredProfile(n,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",d=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new Kt(c,d)}let o=await s.taskService.markTaskStarted(s.paths,i.task.id),a={selectedRepoId:o.repoId,selectedWorkspaceId:o.workspaceId,selectedTaskId:o.id,selectedPtyTabId:o.selectedPtyTabId,inputMode:"control",focusedRegion:"center",activeTab:o.selectedPtyTabId??"agent",selectedActionId:"commit"};return{task:o,nextShell:a}},Nu=async(e,t,r)=>{await r.queueTaskMutation(async()=>{await r.taskService.markRunnerFailed(r.paths,e,t)})},Lu=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing it.");let{taskBeforeClose:r,task:n}=await t.queueTaskMutation(async()=>{let s=await Xt(t.paths,e.selectedTaskId),i=await t.taskService.closeTask(t.paths,e.selectedTaskId);return{taskBeforeClose:s,task:i}});return{closedTabIds:r.ptyTabs.map(s=>s.id),nextShell:{selectedActionId:"close-task",actionMessage:n.cleanup.preservedWorktree?`Archived task ${n.id}; worktree preserved`:`Archived task ${n.id}`}}},_u=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(r=>Xt(t.paths,r.id)))),Ir=async(e,t,r)=>{let n=t instanceof Error?t.message:String(t);await Se.appendErrorLogBestEffort(r.paths,{context:e,message:n,details:t instanceof Error?t.stack??t.message:String(t)})};var ju=async(e,t)=>{if(!e.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");if((await t.taskService.listTasks(t.paths,{workspaceId:e.selectedWorkspaceId,includeClosed:!0})).tasks.length>0)throw new Error(`Cannot remove workspace ${e.selectedWorkspaceId} while task records still reference it.`);return await t.workspaceService.archiveWorkspace(t.paths,e.selectedWorkspaceId),{nextShell:{selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:`Removed workspace ${(await t.workspaceService.removeWorkspace(t.paths,e.selectedWorkspaceId,{listTasks:t.taskService.listTasks})).workspaceId}`}}};var Fu=async(e,t,r)=>{let n=k.runners.setRunnerEnabled(r.config,e,t);return await k.save(r.paths,n),n},Wu=async(e,t,r)=>{let n=k.runners.setRunnerPath(r.config,e,t);return await k.save(r.paths,n),n},qu=async(e,t,r)=>{let n=k.previews.setEnabled(r.config,e,t);return await k.save(r.paths,n),n};var KT=250;function _e(e,t){return e.find(r=>r.id===t.selectedTaskId)??null}function kt(e,t){return Ne(t,e.ptyRuntime.getViewState(Gt(e,t)))}function Gt(e,t){let r=_e(e.model.tasks,t);return r?r.ptyTabs.some(n=>n.id===t.activeTab)?t.activeTab:t.activeTab==="agent"||t.activeTab==="terminal"?r.ptyTabs.find(n=>n.kind===t.activeTab)?.id??t.selectedPtyTabId:t.selectedPtyTabId:t.selectedPtyTabId}function y(e,t){return kt(e,Jc(t,e.model))}function Uu(e,t,r){return e.footerToastTimer&&(clearTimeout(e.footerToastTimer),e.footerToastTimer=null),r?(e.footerToastTimer=setTimeout(()=>{e.footerToastTimer=null,!(e.state.mode!=="main"||e.state.shell.footerToast!==r)&&(e.state={mode:"main",shell:y(e,{...e.state.shell,footerToast:null})},e.render())},600),{...t,footerToast:r}):{...t,footerToast:null}}function Bu(e,t,r){return Uu(e,t,r?{tone:"success",message:r}:null)}function V(e,t,r){return Uu(e,t,{tone:"error",message:r})}function K(e,t,r,n){let s=r instanceof Error?r.message:n,i=r instanceof Error?r.stack??r.message:String(r);return Se.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function W(e,t){if(!e.uiStateFile)return;e.runtimeState=Uc(e.runtimeState,t);let r=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>We({uiStateFile:e.uiStateFile},r),()=>We({uiStateFile:e.uiStateFile},r)),e.persistQueue.catch(()=>{})}function GT(e,t){let r=e.taskMutationQueue.then(t,t);return e.taskMutationQueue=r.then(()=>{},()=>{}),r}function G(e){return{paths:e.paths,config:e.config,taskService:P,workspaceService:X,queueTaskMutation:t=>GT(e,t)}}function Wo(e,t){let r=_e(e.model.tasks,t),n=e.model.inspection,s=n&&n.taskId===r?.id?n:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?No(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:gt(e.model),centerTabIds:zc(r,t),ptyTabIds:r?.ptyTabs.map(a=>a.id)??[],filePathIds:s?.filePaths??[],fileTreeRowIds:o.map(a=>a.path),fileTreeFileIds:o.filter(a=>a.kind==="file").map(a=>a.path),fileTreeDirectoryIds:o.filter(a=>a.kind==="directory").map(a=>a.path),diffPathIds:s?.diffPaths??[],diffPathRanges:[],fileLineCount:s?.selectedFile.lines.length??0,diffLineCount:s?.selectedDiff.lines.length??0,reviewRowCount:ku(t,r,s),pageRows:Math.max(5,ce(e.activeTerminal.width,e.activeTerminal.height).height-F.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:r?.repoTargets?.map(a=>a.repoId)??[]}}async function Vu(e,t){await Du(t,G(e))}async function te(e){e.model=await Ut(e.workspaceRoot,e.state.shell,e.enabledRunnerIds),e.state.mode==="main"?e.state={mode:"main",shell:y(e,e.state.shell)}:e.state={...e.state,shell:y(e,e.state.shell)}}function Ht(e,t){e.model={...e.model,tasks:[...e.model.tasks.filter(r=>r.id!==t.id),t].sort((r,n)=>r.id.localeCompare(n.id))}}async function Un(e,t){let r=++e.inspectionRefreshSequence,n=Ji(e.model.tasks,t),s=e.model.inspection,i=t.focusedRegion==="inspector"&&t.inspectionMode==="review"&&t.openInspectionKind!=="diff",o;if(n&&s?.taskId===n.id&&!i){let a={selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath},l=await Cc(n,s,a);if(r!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await Ut(e.workspaceRoot,t,e.enabledRunnerIds),r!==e.inspectionRefreshSequence)return;e.model=o,e.state.mode==="main"&&(e.state={mode:"main",shell:y(e,e.state.shell)},W(e,e.state.shell),e.render())}function Ku(e,t){e.pendingLeftNavInspectionShell=t,!e.leftNavInspectionTimer&&(e.leftNavInspectionTimer=setTimeout(()=>{e.leftNavInspectionTimer=null;let r=e.pendingLeftNavInspectionShell;e.pendingLeftNavInspectionShell=null,!(!r||e.state.mode!=="main"||e.state.shell!==r)&&Un(e,r).catch(n=>{let s=K(e,"refresh inspection",n,"Failed to refresh inspection.");e.state={mode:"main",shell:V(e,y(e,{...e.state.shell,actionMessage:s}),s)},e.render()})},KT))}function Gu(e,t){t!==0&&(e.pendingInspectionScrollLines+=t,!e.inspectionScrollRenderTimer&&(e.inspectionScrollRenderTimer=setTimeout(()=>{e.inspectionScrollRenderTimer=null;let r=e.pendingInspectionScrollLines;if(e.pendingInspectionScrollLines=0,r===0||e.state.mode!=="main"||e.state.shell.inputMode!=="control")return;let n=tt(e.state.shell,r,Wo(e,e.state.shell));if(n.changed){if(n.refreshInspection){e.state={mode:"main",shell:y(e,n.state)},W(e,e.state.shell),e.render(),Un(e,e.state.shell).catch(s=>{let i=K(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:V(e,y(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:y(e,n.state)},W(e,e.state.shell),e.render()}},16)))}function qo(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function Uo(e){let t=e.model.tasks.flatMap(r=>r.ptyTabs.map(n=>n.id));await e.ptyRuntime.pruneStale?.(t),await e.ptyRuntime.hydrateSessions?.(t)}function zu(e){Uo(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:y(e,e.state.shell)},e.render())})}async function Yu(e,t){let r=y(e,t),n=_e(e.model.tasks,r),s=Gt(e,r);if(!n||!s||!n.ptyTabs.some(a=>a.id===s))return r;let i=e.ptyRuntime.getViewState(s);if(i.status!=="idle"||i.rows.length>0||i.error)return Ne(r,i);let o=await e.ptyRuntime.ensureSession(n.id,s,Qe(ce(e.activeTerminal.width,e.activeTerminal.height)));return Ne({...r,inputMode:"control"},o)}function Bo(e){let t=e.state.mode==="main"&&e.state.shell.inputMode==="terminal"?"terminal":"control";t!==e.inputCaptureMode&&(e.inputCaptureMode=t,e.activeTerminal.grabInput(t==="terminal"?{mouse:"button"}:!0))}async function Vo(e,t){try{let r=y(e,t),n=_e(e.model.tasks,r),s=r.selectedPtyTabId;if(n&&r.focusedRegion==="tasks"){let a=n.ptyTabs.find(l=>l.kind==="agent")??null;a?s=a.id:(n=await Hu(e,n),await te(e),s=n.selectedPtyTabId)}n&&!s&&(n=await Hu(e,n),await te(e),s=n.selectedPtyTabId);let i=y(e,{...r,activeTab:s??r.activeTab,selectedPtyTabId:s,focusedRegion:s?"center":r.focusedRegion});if(!i.selectedTaskId||!s){e.state={mode:"main",shell:i},e.render();return}e.state={mode:"main",shell:Ne({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},W(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,Qe(ce(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Ze(s),e.lastTerminalKey=null,e.state={mode:"main",shell:Ne({...i,inputMode:"terminal"},o)},W(e,e.state.shell)}catch(r){let n=K(e,"attach PTY",r,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&Ze(t.selectedPtyTabId)&&(await HT(e,t.selectedTaskId,n).catch(()=>{}),await te(e).catch(()=>{})),e.state={mode:"main",shell:V(e,Bc(y(e,t),n),n)},W(e,e.state.shell)}e.render()}async function HT(e,t,r){await Nu(t,r,G(e))}async function Ju(e,t,r,n){let s=y(e,t),{nextShell:i}=await Eu(s,r,n,G(e));return await te(e),y(e,{...s,...i})}async function Xu(e,t){let r=y(e,t),{closedTab:n,nextShell:s}=await xu(r,G(e));return e.ptyRuntime.disposeSession(n.id),await te(e),y(e,{...r,...s})}async function Qu(e,t){let r=y(e,t),n=gt(e.model),s=n.indexOf(r.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await Lu(r,G(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await te(e),y(e,{...r,...o,selectedLeftItemId:zT(n,gt(e.model),s)})}async function Zu(e,t){let r=y(e,t),{nextShell:n}=await ju(r,G(e));return await te(e),y(e,{...r,...n})}async function Hu(e,t){return Ou(t,G(e))}function Bn(e,t){e.pendingScrollLines+=t,!e.scrollRenderTimer&&(e.scrollRenderTimer=setTimeout(()=>{e.scrollRenderTimer=null;let r=e.pendingScrollLines;e.pendingScrollLines=0,r!==0&&(e.ptyRuntime.scrollViewport(r),e.state={mode:"main",shell:kt(e,e.state.shell)},e.render())},16))}function zT(e,t,r){if(t.length===0)return null;for(let n=r-1;n>=0;n-=1){let s=e[n];if(s&&t.includes(s))return s}return t[Math.min(Math.max(0,r),t.length-1)]??null}async function tp(e,t,r){if(r?.aborted||e.state.mode!=="main")return;let n=ep(e),s=t.takeDueTasks(e.model.tasks,n);if(s.length!==0)try{let i=await _u(s,G(e));if(r?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)Ht(e,o);t.recordSuccess(i,ep(e)),e.state={mode:"main",shell:y(e,e.state.shell)},e.render()}catch(i){if(r?.aborted)return;t.recordFailure(s,i);let o=i instanceof Error?i.message:"Background PR discovery failed.";o!==e.lastBackgroundPrPollError&&(e.lastBackgroundPrPollError=o,Ir("background PR polling",i,G(e)))}}function ep(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function rp(e,t){let r=y(e,t),n=_e(e.model.tasks,r),s=null,i=null;if(n?.type==="project"&&n.repoTargets?.length){let o=await P.prs.discoverOrRefreshAll(e.paths,r.selectedTaskId);await te(e);let a=o.synced+o.discovered+o.notFound;i=`Refreshed ${o.synced}/${a} targets`}else{let{disposition:o,task:a}=await P.prs.discoverOrRefresh(e.paths,r.selectedTaskId);await te(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${E(a)?.requiredChecks.length??0} reported`)}return y(e,{...Bu(e,r,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import ZT from"node:path";import{readdir as YT,stat as JT}from"node:fs/promises";import np from"node:path";async function XT(e){let t=await YT(e,{withFileTypes:!0}),r=[];for(let n of t){if(!n.isDirectory())continue;let s=np.join(e,n.name);r.push({name:n.name,path:s,kind:await QT(s)?"repo":"directory"})}return r.sort((n,s)=>n.kind!==s.kind?n.kind==="repo"?-1:1:n.name.localeCompare(s.name)),{cwd:e,entries:r,selectedIndex:0,query:null,error:null}}function sp(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(r=>r.name.toLowerCase().includes(t))}async function ip(e){let{spawn:t}=await import("node:child_process"),r=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";await new Promise((n,s)=>{let i=t(r,[e],{stdio:"ignore",detached:!0});i.unref(),i.on("error",s),i.on("spawn",n)})}async function Vn(e,t){let r=await XT(t);e.state.mode==="main"&&(e.state={mode:"main",shell:y(e,{...e.state.shell,workspaceBrowser:r,activeTab:e.state.shell.selectedPtyTabId??e.state.shell.activeTab,actionMessage:null})},e.render())}async function QT(e){let t=np.join(e,".git");return await JT(t).catch(()=>null)!==null}function op(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function ap(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function eR(e){if(e.state.mode!=="main"||e.creatingTask)return;let t=e.state.shell,r=t.taskPromptInput?.trim()??"";if(!t.selectedRepoId&&!t.selectedWorkspaceId){e.state={mode:"main",shell:y(e,{...t,taskPromptError:"Select a workspace first."})},e.render();return}if(r.length===0){e.state={mode:"main",shell:y(e,{...t,taskPromptError:"Task prompt cannot be empty."})},e.render();return}e.creatingTask=!0,e.state={mode:"main",shell:y(e,{...t,actionMessage:`Creating ${t.selectedRunner} task in ${t.selectedWorkspaceId??t.selectedRepoId}...`})},e.render();let n=null;try{let s=await Mu(t.selectedRepoId,t.selectedWorkspaceId,r,t.selectedRunner,G(e));n=s.task,Ht(e,n);let i=y(e,{...e.state.shell,...s.nextShell,selectedLeftItemId:`task:${n.id}`,inputMode:"terminal",taskPromptInput:null,taskPromptError:null,actionMessage:null}),o=await e.ptyRuntime.ensureSession(n.id,i.selectedPtyTabId??fd(n,"agent"),Qe(ce(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Ze(i.selectedPtyTabId),e.state={mode:"main",shell:Ne(i,o)},W(e,e.state.shell)}catch(s){s instanceof Kt&&(n=s.task);let i=K(e,"create task",s,"Failed to create task.");n&&!(s instanceof Kt)?(await x(e.paths,n.id,o=>({...o,status:"draft",runnerSession:{...o.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:i})).catch(()=>{}),await te(e).catch(()=>{})):n&&(await x(e.paths,n.id,o=>({...o,lastFailureReason:i})).catch(()=>{}),await te(e).catch(()=>{})),e.state={mode:"main",shell:V(e,y(e,{...e.state.shell,inputMode:"control",selectedTaskId:n?.id??e.state.shell.selectedTaskId,selectedPtyTabId:n?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:n?`task:${n.id}`:e.state.shell.selectedLeftItemId,activeTab:n?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:n?null:"",taskPromptError:i,actionMessage:null}),i)}}finally{e.creatingTask=!1,e.render()}}function tR(e,t){if(e.state.mode!=="main")return;let r=e.state.shell;if(r.taskPromptInput!==null){if(t==="ESCAPE"){e.state={mode:"main",shell:y(e,{...r,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(he(t)){eR(e);return}if(t==="BACKSPACE"){e.state={mode:"main",shell:y(e,{...r,taskPromptInput:r.taskPromptInput.slice(0,-1),taskPromptError:null})},e.render();return}if(t==="CTRL_R"){e.state={mode:"main",shell:y(e,{...r,selectedRunner:wn(r.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}Kc(t)&&(e.state={mode:"main",shell:y(e,{...r,taskPromptInput:`${r.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function rR(e,t){if(e.state.mode!=="main")return;let r=e.state.shell.workspaceBrowser;if(!r)return;if(t==="ESCAPE"){if(r.query!==null){e.state={mode:"main",shell:y(e,{...e.state.shell,workspaceBrowser:{...r,query:null,selectedIndex:0}})},e.render();return}e.state={mode:"main",shell:y(e,{...e.state.shell,workspaceBrowser:null,actionMessage:null})},e.render();return}if(t==="/"){e.state={mode:"main",shell:y(e,{...e.state.shell,workspaceBrowser:{...r,query:"",selectedIndex:0}})},e.render();return}if(r.query!==null&&(t==="BACKSPACE"||t==="DELETE")){let s=r.query.slice(0,-1);e.state={mode:"main",shell:y(e,{...e.state.shell,workspaceBrowser:{...r,query:s,selectedIndex:0}})},e.render();return}if(r.query!==null&&t.length===1&&t>=" "){let s=r.query+t;e.state={mode:"main",shell:y(e,{...e.state.shell,workspaceBrowser:{...r,query:s,selectedIndex:0}})},e.render();return}let n=sp(r);if(t==="UP"||t==="k"){e.state={mode:"main",shell:y(e,{...e.state.shell,workspaceBrowser:{...r,selectedIndex:Math.max(0,r.selectedIndex-1),error:null}})},e.render();return}if(t==="DOWN"||t==="j"){e.state={mode:"main",shell:y(e,{...e.state.shell,workspaceBrowser:{...r,selectedIndex:Math.min(Math.max(0,n.length-1),r.selectedIndex+1),error:null}})},e.render();return}if(t==="LEFT"||t==="h"){Vn(e,ZT.dirname(r.cwd)).catch(s=>{let i=K(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:V(e,y(e,{...e.state.shell,workspaceBrowser:{...r,error:i}}),i)},e.render()});return}if(t==="RIGHT"||t==="l"||he(t)){let s=n[r.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){Vn(e,s.path).catch(o=>{let a=K(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:V(e,y(e,{...e.state.shell,workspaceBrowser:{...r,error:a}}),a)},e.render()});return}let{workspaceService:i}=G(e);i.addWorkspace(e.paths,s.path).then(async o=>{await te(e);let a=o.repos[0]??null,l=y(e,{...e.state.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${o.workspace.id}`,selectedWorkspaceId:o.workspace.id,selectedRepoId:a?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${o.workspace.name??o.workspace.id}`});e.state={mode:"main",shell:l},W(e,e.state.shell),e.render()}).catch(o=>{let a=K(e,"add workspace",o,"Failed to add workspace.");e.state={mode:"main",shell:V(e,y(e,{...e.state.shell,workspaceBrowser:{...r,error:a}}),a)},e.render()})}}function nR(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let r=Xd(e.state.menuIndex,t);if(r.kind!=="noop"){if(r.kind==="render"){e.state={...e.state,menuIndex:r.menuIndex},e.render();return}if(r.kind==="back"){e.state.parentVariant&&(e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render());return}if(r.kind==="help"){let n=e.state.parentVariant;e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell,viaOptions:!0,...n!==void 0?{parentVariant:n}:{}},e.pendingClear=!0,e.render();return}if(r.kind==="runners"){let n=e.state.parentVariant;e.state={mode:"overlay",variant:"runners",menuIndex:0,optionsMessage:null,shell:e.state.shell,...n!==void 0?{parentVariant:n}:{}},e.pendingClear=!0,e.render();return}if(r.kind==="previews"){let n=e.state.parentVariant;e.state={mode:"overlay",variant:"previews",menuIndex:0,optionsMessage:null,shell:e.state.shell,...n!==void 0?{parentVariant:n}:{}},e.pendingClear=!0,e.render();return}if(r.kind==="error-log"){let n=e.state.parentVariant;sR(e,n)}}}async function sR(e,t){let r;try{r=await Se.readRecentErrorLines(e.paths)}catch(n){let s=K(e,"open error log",n,"Failed to read Craig error log.");r={path:e.paths.errorLogFile,lines:[`Unable to read error log: ${s}`],empty:!1}}e.state.mode==="overlay"&&(e.state={mode:"overlay",variant:"error-log",menuIndex:0,optionsMessage:null,shell:e.state.shell,errorLog:r,...t!==void 0?{parentVariant:t}:{}},e.pendingClear=!0,e.render())}function iR(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let r=Zd(op(e),e.config,t,e.enabledRunnerIds);if(r.kind==="noop")return;if(r.kind==="back"){let s=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:0,optionsMessage:null,shell:e.state.shell,...s!==void 0?{parentVariant:s}:{}},e.pendingClear=!0,e.render();return}if(r.kind==="render"){e.state={...e.state,runnerOptions:r.state},e.render();return}(r.kind==="save-enabled"?Fu(r.runner,r.enabled,G(e)):Wu(r.runner,r.path,G(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:y(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),runnerOptions:r.state},e.render())}).catch(s=>{if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let i=K(e,"save runner option",s,"Failed to save runner option.");e.state={...e.state,shell:V(e,y(e,e.state.shell),i),runnerOptions:{...op(e),message:i}},e.render()})}function oR(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let r=Qd(ap(e),e.config,t);if(r.kind!=="noop"){if(r.kind==="back"){let n=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:1,optionsMessage:null,shell:e.state.shell,...n!==void 0?{parentVariant:n}:{}},e.pendingClear=!0,e.render();return}if(r.kind==="render"){e.state={...e.state,previewOptions:r.state},e.render();return}qu(r.feature,r.enabled,G(e)).then(n=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=n,r.feature==="agentActivityIndicators"&&e.setAgentActivityEnabled(r.enabled),e.state={...e.state,previewOptions:r.state},e.render())}).catch(n=>{if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let s=K(e,"save feature preview",n,"Failed to save feature preview.");e.state={...e.state,shell:V(e,y(e,e.state.shell),s),previewOptions:{...ap(e),message:s}},e.render()})}}function lp(e,t){let r=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){tR(e,r);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){rR(e,r);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(r==="F"){lR(e),e.render();return}e.focusFlashUntil!==null&&(e.focusFlashUntil=null,e.focusFlashTimer&&(clearTimeout(e.focusFlashTimer),e.focusFlashTimer=null))}if(e.state.mode==="main"){let n=Fo(e.state.shell,r,Wo(e,e.state.shell));if(n.exit){e.exit(0);return}if(n.detachTerminal){e.ptyRuntime.detach(),e.state={mode:"main",shell:y(e,n.state)},W(e,e.state.shell),e.render();return}if(e.state.shell.inputMode==="terminal"){if(n.changed){e.state={mode:"main",shell:y(e,n.state)},W(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&he(r)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Pr(r);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(aR(e,r))return;e.lastTerminalKey=gd(r)?{key:r,at:Date.now()}:null;let i=hd(r,e.state.shell.terminal.scrolledBack??!1);if(i!==0){Bn(e,i);return}e.ptyRuntime.writeKey(r);return}if(r==="CTRL_C"){e.exit(0);return}if(r==="?"&&e.state.shell.inputMode==="control"){e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render();return}if(n.pause){e.state={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:y(e,n.state)},e.pendingClear=!0,e.render();return}if(n.beginTaskPrompt){e.state={mode:"main",shell:y(e,n.state)},W(e,e.state.shell),e.render();return}if(n.openWorkspaceBrowser){Vn(e,e.workspaceRoot).catch(s=>{let i=K(e,"browse workspaces",s,"Failed to browse workspaces.");e.state={mode:"main",shell:V(e,y(e,{...n.state,workspaceBrowser:{cwd:e.workspaceRoot,entries:[],selectedIndex:0,query:null,error:i}}),i)},e.render()});return}if(n.createPtyTab){Ju(e,n.state,n.createPtyTabKind,n.createPtyTabRunner).then(s=>{Vo(e,s)}).catch(s=>{let i=K(e,"create PTY tab",s,"Failed to create tab.");e.state={mode:"main",shell:V(e,y(e,{...n.state,actionMessage:i}),i)},e.render()});return}if(n.closePtyTab){Xu(e,n.state).then(s=>{e.state={mode:"main",shell:s},W(e,e.state.shell),e.render()}).catch(s=>{let i=K(e,"close PTY tab",s,"Failed to close tab.");e.state={mode:"main",shell:V(e,y(e,{...n.state,actionMessage:i}),i)},e.render()});return}if(n.refreshPullRequestChecks){rp(e,n.state).then(s=>{e.state={mode:"main",shell:s},W(e,e.state.shell),e.render()}).catch(s=>{let i=K(e,"refresh PR checks",s,"Failed to refresh PR checks.");e.state={mode:"main",shell:V(e,y(e,{...n.state,actionMessage:i}),i)},e.render()});return}if(n.openPrUrl){let s=_e(e.model.tasks,n.state),i=s?E(s)?.url??null:null;i?ip(i).catch(o=>{let a=K(e,"open PR URL",o,"Failed to open PR in browser.");e.state={mode:"main",shell:V(e,y(e,n.state),a)},e.render()}):(e.state={mode:"main",shell:V(e,y(e,n.state),"No PR URL available.")},e.render());return}if(n.closeTask){Qu(e,n.state).then(s=>{e.state={mode:"main",shell:s},W(e,e.state.shell),e.render()}).catch(s=>{let i=K(e,"close task",s,"Failed to close task.");e.state={mode:"main",shell:V(e,y(e,{...n.state,actionMessage:i}),i)},e.render()});return}if(n.removeWorkspace){Zu(e,n.state).then(s=>{e.state={mode:"main",shell:s},W(e,e.state.shell),e.render()}).catch(s=>{let i=K(e,"remove workspace",s,"Failed to remove workspace.");e.state={mode:"main",shell:V(e,y(e,{...n.state,actionMessage:i}),i)},e.render()});return}if(n.attachTerminal){Vo(e,n.state);return}if(n.refreshInspection){if(e.state={mode:"main",shell:y(e,n.state)},W(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){Ku(e,e.state.shell);return}Un(e,e.state.shell).catch(s=>{let i=K(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:V(e,y(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}n.changed&&(e.state={mode:"main",shell:y(e,n.state)},Vu(e,e.state.shell).catch(()=>{}),W(e,e.state.shell),e.render());return}if(e.state.variant==="help"){e.state.viaOptions&&e.state.parentVariant?e.state={mode:"overlay",variant:"options",menuIndex:3,optionsMessage:null,shell:e.state.shell,parentVariant:e.state.parentVariant}:e.state.parentVariant?e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell}:e.state={mode:"main",shell:y(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){nR(e,r);return}if(e.state.variant==="runners"){iR(e,r);return}if(e.state.variant==="previews"){oR(e,r);return}if(e.state.variant==="error-log"){if(r==="ESCAPE"||he(r)){let n=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:2,optionsMessage:null,shell:e.state.shell,...n!==void 0?{parentVariant:n}:{}},e.pendingClear=!0,e.render()}return}if(e.state.optionsMessage){(r==="ESCAPE"||he(r))&&(e.state={...e.state,optionsMessage:null},e.render());return}if(r==="UP"||r==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(r==="DOWN"||r==="j"){e.state={...e.state,menuIndex:Math.min(2,e.state.menuIndex+1)},e.render();return}if(r==="ESCAPE"){e.state.variant==="pause"&&(e.state={mode:"main",shell:y(e,e.state.shell)},e.pendingClear=!0,e.render());return}if(he(r)){if(e.state.menuIndex===0){let n=e.state.variant==="boot";e.state={mode:"main",shell:y(e,{...e.state.shell,inputMode:"control"})},e.pendingClear=!0,e.render(),n?e.bootHydrationReady.then(()=>{if(e.state.mode!=="main")return;let s=e.state.shell;Yu(e,s).then(i=>{e.state.mode!=="main"||e.state.shell!==s||(e.state={mode:"main",shell:i},W(e,e.state.shell),e.render())}).catch(i=>{if(e.state.mode!=="main"||e.state.shell!==s)return;let o=K(e,"warm selected PTY",i,"Failed to start selected PTY.");e.state={mode:"main",shell:V(e,y(e,e.state.shell),o)},W(e,e.state.shell),e.render()})}):zu(e);return}if(e.state.menuIndex===1){let n=e.state.variant==="boot"||e.state.variant==="pause"?e.state.variant:void 0;e.state={mode:"overlay",variant:"options",menuIndex:0,optionsMessage:null,shell:e.state.shell,...n!==void 0?{parentVariant:n}:{}},e.pendingClear=!0,e.render();return}e.exit(0)}}function cp(e,t){let r=Rd(t);if(e.state.mode!=="main"||e.state.shell.inputMode!=="terminal"||r.length===0)return;if(e.pendingTerminalKeySequence){let i=`${e.pendingTerminalKeySequence.raw}${r}`,o=Pr(i);if(o){up(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(lo(i)){e.pendingTerminalKeySequence.raw=i,dp(e);return}Kn(e)}if(r.includes("")){e.ptyRuntime.detach(),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey=null,e.state={mode:"main",shell:y(e,{...e.state.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},W(e,e.state.shell),e.render();return}let n=wd(r);if(n!==0){Bn(e,n);return}let s=Pr(r);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&r!=="\r"&&r!==`
136
- `&&r!==`\r
137
- `&&(e.suppressTerminalEnterOnAttach=!1),Td(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,r)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(r)}function aR(e,t){if(e.pendingTerminalKeySequence){let r=kd(t);if(r!==null){let n=`${e.pendingTerminalKeySequence.raw}${r}`,s=Pr(n);if(s)return up(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(lo(n))return e.pendingTerminalKeySequence.raw=n,dp(e),!0}return Kn(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>Kn(e),30)},!0)}function dp(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>Kn(e),30))}function Kn(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function up(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function pp(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){Gu(e,ao(t));return}let r=ao(t);r!==0&&Bn(e,r)}function lR(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var mp=1e3,dR=cR(import.meta.url),uR=dR("terminal-kit"),pR=uR.terminal;function Ko(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function fp(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function gp(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function mR(e,t){return e?e.tabId!==t.tabId?{tabId:t.tabId,kind:"full"}:e.kind==="full"||t.kind==="full"?{tabId:t.tabId,kind:"full"}:{tabId:t.tabId,kind:"rows",rowIndices:[...new Set([...e.rowIndices,...t.rowIndices])]}:t}async function hp(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),r=ne(t),n=await k.load(r),s=k.runners.getEnabled(n),i=e.uiStateFile?await Rt({uiStateFile:e.uiStateFile}):null,o=await Ut(t,void 0,s),a=yr(qc(i,n),o);o=await Ut(t,a,s);let l={current:o},c=()=>{},d=()=>{},u=()=>{},f={workspaceRoot:t,onUpdate:p=>c(p),onActivity:p=>d(p),onActivityRemoved:p=>u(p),resolveSessionSpec:(p,w)=>md(l.current,w,t)},h=e.ptyRuntime??await _d({...f,paths:r,activityEnabled:k.previews.isEnabled(n,"agentActivityIndicators")});return new Promise(p=>{let w=e.terminal??pR,b=null,O=null,q=null,U=null,I=null,re=0,je=!1,de=new Map,ye=h.managesPullRequestSync?null:new Vt({minimumIntervalMs:(n.github?.watchIntervalSeconds??5)*1e3}),m,rt=new et({resolutionMs:k.previews.isEnabled(n,"agentActivityIndicators")?jn:mp,onError:(T,N)=>Ir(`heartbeat job "${T}"`,N,G(m))});m={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:yr(a,o)},get model(){return l.current},set model(T){l.current=T},config:n,enabledRunnerIds:s,creatingTask:!1,suppressTerminalEnterOnAttach:!1,lastTerminalKey:null,pendingScrollLines:0,pendingInspectionScrollLines:0,leftNavInspectionTimer:null,pendingLeftNavInspectionShell:null,pendingTerminalKeySequence:null,scrollRenderTimer:null,inspectionScrollRenderTimer:null,ptyRenderTimer:null,footerToastTimer:null,focusFlashUntil:null,focusFlashTimer:null,lastBackgroundPrPollError:null,versionText:`Craig v${k.version.getCurrent()}`,updateText:null,inspectionRefreshSequence:0,pendingClear:!0,inputCaptureMode:null,runtimeState:i,persistQueue:Promise.resolve(),taskMutationQueue:Promise.resolve(),bootHydrationReady:Promise.resolve(),paths:r,workspaceRoot:t,uiStateFile:e.uiStateFile,activeTerminal:w,ptyRuntime:h,resolve:p,render:()=>{},renderTaskNavigation:()=>!1,exit:T=>p(T),setAgentActivityEnabled:T=>{rt.setResolutionMs(T?jn:mp),m.ptyRuntime.setActivityEnabled?.(T)}},m.setAgentActivityEnabled(k.previews.isEnabled(n,"agentActivityIndicators")),c=T=>{m.state.mode==="main"&&(I=mR(I,T),m.ptyRenderTimer||(m.ptyRenderTimer=setTimeout(()=>{m.ptyRenderTimer=null;let N=I;if(I=null,m.state.mode==="main"){let H=kt(m,m.state.shell);if(m.state={mode:"main",shell:H},!U||!O){m.render();return}let ue=ce(w.width,w.height),Q={...U,terminal:H.terminal},Fe=bu(ue,Q,O,H.centerZoomed,N?.kind==="rows"?N.rowIndices:null);if(!Fe){m.render();return}Fe.output.length>0&&w.noFormat(Fe.output),U=Q,O=Fe.region,q&&(q={...q,center:Fe.region}),b=null,w.hideCursor(!0)}},0)))},d=T=>{m.state.mode==="main"&&k.previews.isEnabled(m.config,"agentActivityIndicators")&&Ze(T.tabId)&&de.get(T.tabId)!==De(T.tabId,[T],Date.now())&&m.render()},u=T=>{m.state.mode==="main"&&k.previews.isEnabled(m.config,"agentActivityIndicators")&&Ze(T)&&de.get(T)!=="idle"&&m.render()};let Pe=Promise.resolve(),yt=T=>{Pe=Pe.then(async()=>{let N=await Promise.all([...new Set(T)].map(H=>P.getTask(m.paths,H)));for(let H of N)Ht(m,H);m.state.mode==="main"?m.state={mode:"main",shell:y(m,m.state.shell)}:m.state={...m.state,shell:y(m,m.state.shell)},m.render()}).catch(N=>Ir("daemon task-state refresh",N,G(m)))};m.ptyRuntime.setTasksChangedHandler?.(yt);let Cr=T=>{let N=ce(w.width,w.height),H=k.previews.isEnabled(m.config,"agentActivityIndicators"),ue=H?m.ptyRuntime.getActivitySnapshots?.()??[]:[],Q=Date.now(),Fe=uu(y(m,T.shell),m.model,H?{snapshots:ue,now:Q,animationFrame:re}:void 0);if(de.clear(),H)for(let yp of m.model.tasks)for(let Gn of yp.ptyTabs)Gn.kind==="agent"&&de.set(Gn.id,De(Gn.id,ue,Q));let kp=nd(N,Fe,{centerOnly:T.shell.centerZoomed,focusFlashActive:m.focusFlashUntil!==null&&Date.now()<m.focusFlashUntil});return{data:Fe,presentation:kp}},Ar=(T,N,H,ue)=>{if(!q)return!1;let Q=Pu(q,N.regions,H);return Q?(Q.output.length>0&&w.noFormat(Q.output),U=T,q=Q.regions,O=Q.regions.center,b=ue?N.frame:null,w.hideCursor(!0),!0):!1};m.renderTaskNavigation=()=>{if(m.state.mode!=="main"||m.pendingClear)return!1;Bo(m),m.ptyRuntime.setPullRequestPollView?.(gp(m.state)),m.ptyRuntime.setViewedTab?.(Gt(m,m.state.shell));let{data:T,presentation:N}=Cr(m.state);return Ar(T,N,["rail","left","center","footer"],!1)},m.render=()=>{Bo(m);let T=m.state;m.ptyRuntime.setPullRequestPollView?.(gp(T)),m.ptyRuntime.setViewedTab?.(T.mode==="main"?Gt(m,T.shell):null);let N=ce(w.width,w.height),H,ue=null;if(T.mode==="main"){let Q=Cr(T);if(ue=Q.presentation,H=ue.frame,!m.pendingClear&&Ar(Q.data,ue,["rail","left","center","right","footer"],!0))return;U=Q.data,O=ue.center}else H=T.variant==="boot"?Zc(N,{menuIndex:T.menuIndex,optionsMessage:T.optionsMessage,versionText:m.versionText,updateText:m.updateText}):T.variant==="pause"?ed(N,{menuIndex:T.menuIndex,optionsMessage:T.optionsMessage,versionText:m.versionText,updateText:m.updateText}):T.variant==="options"?Cn(N,{menuIndex:T.menuIndex,optionsMenuItems:Po}):T.variant==="runners"?Cn(N,{menuIndex:Ko(T).menuIndex,optionsMenuItems:So(m.config,Ko(T)),optionsMessage:zd(Ko(T)),optionsSubtitle:"Runners"}):T.variant==="previews"?Cn(N,{menuIndex:fp(T).menuIndex,optionsMenuItems:Yd(m.config),optionsMessage:Jd(fp(T)),optionsSubtitle:"Feature Previews - Experimental"}):T.variant==="error-log"?rd(N,{errorLogPath:T.errorLog?.path??r.errorLogFile,errorLogLines:T.errorLog?.lines??[]}):td(N),U=null,O=null,q=null;m.pendingClear&&(w.moveTo(1,1),w.eraseDisplayBelow(),m.pendingClear=!1,b=null),w.noFormat(bd(H,b)),b=H,q=ue?.regions??null,w.hideCursor(!0)};let Er=T=>lp(m,T),Go=T=>cp(m,T),Ho=T=>pp(m,T),wp=()=>{process.stdout.off("resize",zo),process.off("SIGCONT",Yo),w.removeListener("key",Er),w.removeListener("unknown",Go),w.removeListener("mouse",Ho),m.scrollRenderTimer&&(clearTimeout(m.scrollRenderTimer),m.scrollRenderTimer=null),m.inspectionScrollRenderTimer&&(clearTimeout(m.inspectionScrollRenderTimer),m.inspectionScrollRenderTimer=null),m.leftNavInspectionTimer&&(clearTimeout(m.leftNavInspectionTimer),m.leftNavInspectionTimer=null),m.pendingTerminalKeySequence&&(clearTimeout(m.pendingTerminalKeySequence.timer),m.pendingTerminalKeySequence=null),m.ptyRenderTimer&&(clearTimeout(m.ptyRenderTimer),m.ptyRenderTimer=null),m.footerToastTimer&&(clearTimeout(m.footerToastTimer),m.footerToastTimer=null),m.focusFlashTimer&&(clearTimeout(m.focusFlashTimer),m.focusFlashTimer=null),rt.stop(),m.ptyRuntime.disposeAll(),w.grabInput(!1),w.hideCursor(!1),w.fullscreen(!1)};m.exit=T=>{wp(),p(T)};let zo=()=>{qo(m),m.state.mode==="main"&&m.state.shell.inputMode==="terminal"&&(m.ptyRuntime.resize(Qe(ce(w.width,w.height))),m.state={mode:"main",shell:kt(m,m.state.shell)}),m.render()},Yo=()=>{qo(m),m.state.mode==="main"&&m.state.shell.inputMode==="terminal"&&(m.ptyRuntime.resize(Qe(ce(w.width,w.height))),m.state={mode:"main",shell:kt(m,m.state.shell)}),m.render()};process.stdout.on("resize",zo),process.on("SIGCONT",Yo),w.grabInput(!0),m.inputCaptureMode="control",w.hideCursor(!0),w.fullscreen(!0),w.on("key",Er),w.on("unknown",Go),w.on("mouse",Ho),ye&&rt.register({id:"github.pull-requests",intervalMs:1e3,run:T=>tp(m,ye,T)}),rt.register({id:"agent.activity-indicators",intervalMs:jn,run:()=>{if(!k.previews.isEnabled(m.config,"agentActivityIndicators")){re=0,je=!1;return}let T=Date.now(),N=nn(m.model.tasks,m.ptyRuntime.getActivitySnapshots?.()??[],T);(N||je)&&(re=(re+1)%au,m.state.mode==="main"&&m.render()),je=N}}),rt.start(),k.version.checkForUpdate().then(T=>{T.updateAvailable&&T.latest&&(m.updateText=`Update available: v${T.latest}`,m.render())}),m.bootHydrationReady=Uo(m).catch(()=>{}),m.render()})}async function fR(){try{if(process.argv[2]==="__craig-daemon"){let e=process.argv[3]??process.cwd(),t=ne(e);return await jd(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=process.argv[3]??process.cwd(),t=ne(e);return await Fd(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
138
- `),1}return Sc({argv:process.argv.slice(2),cwd:process.cwd(),env:process.env,isInputTty:process.stdin.isTTY===!0,isOutputTty:process.stdout.isTTY===!0,writeStdout:e=>process.stdout.write(e),writeStderr:e=>process.stderr.write(e),readStdin:async()=>{let e="";process.stdin.setEncoding("utf8");for await(let t of process.stdin)e+=t;return e},runInteractive:e=>hp({uiStateFile:ne(e).uiStateFile,workspaceRoot:e})})}var gR=await fR();process.exit(gR);
259
+ `).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function zi(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{spawn as II}from"node:child_process";import{createServer as vI,createConnection as oh}from"node:net";import{openSync as CI}from"node:fs";import{mkdir as AI,readFile as Lc,rm as wn,writeFile as EI}from"node:fs/promises";import Zi from"node:path";var zt=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=Ic(t.resolutionMs??1e3,"Heartbeat resolution"),this.now=t.now??Date.now,this.onError=t.onError}register(t){if(this.jobs.has(t.id))throw new Error(`Heartbeat job "${t.id}" is already registered.`);let n={...t,intervalMs:Ic(t.intervalMs,`Heartbeat job "${t.id}" interval`),inFlight:!1,nextRunAt:this.timer?this.now()+t.intervalMs:null};this.jobs.set(t.id,n)}start(){if(this.timer)return;let t=this.now();for(let n of this.jobs.values())n.nextRunAt=t+n.intervalMs;this.abortController=new AbortController,this.timer=setInterval(()=>this.tick(),this.resolutionMs)}stop(){this.abortController?.abort(),this.abortController=null,this.timer&&clearInterval(this.timer),this.timer=null;for(let t of this.jobs.values())t.nextRunAt=null}setResolutionMs(t){let n=Ic(t,"Heartbeat resolution");n!==this.resolutionMs&&(this.resolutionMs=n,this.timer&&(clearInterval(this.timer),this.timer=setInterval(()=>this.tick(),this.resolutionMs)))}tick(){let t=this.abortController?.signal;if(!t)return;let n=this.now();for(let r of this.jobs.values())r.inFlight||r.nextRunAt===null||n<r.nextRunAt||(r.inFlight=!0,r.nextRunAt=n+r.intervalMs,Promise.resolve().then(()=>r.run(t)).catch(s=>{if(!t.aborted)return Promise.resolve(this.onError(r.id,s)).catch(()=>{})}).finally(()=>{r.inFlight=!1}))}};function Ic(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as zm,readFile as jP,rm as vc,stat as FP,writeFile as qP}from"node:fs/promises";import Cc from"node:path";async function Ac(e){let t=Cc.join(e.runtimeDir,"orchestration-supervisor.lock");await zm(e.runtimeDir,{recursive:!0});try{await zm(t)}catch(r){if(!BP(r))throw r;let s=await jP(Cc.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await FP(t).catch(()=>null);if(typeof s?.pid=="number"&&!WP(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await vc(t,{recursive:!0,force:!0}),Ac(e);throw new y("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await qP(Cc.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await vc(t,{recursive:!0,force:!0}),r}let n=!1;return{async release(){n||(n=!0,await vc(t,{recursive:!0,force:!0}))}}}function WP(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var BP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";function Ym(e,t){switch(e){case"codex":case"cursor":case"claude":return`\x1B[200~${t}\x1B[201~\r`;default:return UP(e)}}function UP(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import KP from"node:path";var VP={type:"system",component:"orchestration-supervisor"};async function Jm(e){let t=KP.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await us(t)??{version:1,commands:{}},r=await gt(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of GP(i))o.has(a)||(await cn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:VP),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await U(t,n)}function GP(e){let t=["command.queued"];return e.attempts>0&&t.push("command.delivering"),e.state==="delivered"?t.push("command.delivered"):e.state==="failed"?t.push("command.failed"):e.state==="cancelled"&&t.push("command.cancelled"),t}var Yi=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new zt({resolutionMs:s,onError:(i,o)=>r.onError?.(o)}),this.heartbeat.register({id:"orchestration.commands",intervalMs:s,run:()=>this.reconcile()})}paths;runtime;heartbeat;lease=null;reconciliation=null;async start(){if(!this.lease){this.lease=await Ac(this.paths);try{await this.reconcile(),this.heartbeat.start()}catch(t){throw await this.lease.release(),this.lease=null,t}}}async wake(){await this.reconcile()}async stop(){this.heartbeat.stop(),await this.reconciliation?.catch(()=>{}),await this.lease?.release(),this.lease=null}reconcile(){return this.reconciliation?this.reconciliation:(this.reconciliation=this.reconcileCommands().finally(()=>{this.reconciliation=null}),this.reconciliation)}async reconcileCommands(){await Jm(this.paths);let t=await gt(this.paths);for(let n of t){if(n.state==="delivering"){await Re.fail(this.paths,n.id,is("PROMPT_DELIVERY_UNCERTAIN","Craig resumed after prompt delivery began; the prompt was not replayed.",!1,!0));continue}n.state==="queued"&&await this.reconcileCommand(n)}}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await Re.fail(this.paths,t.id,is("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let n=await P.getTask(this.paths,t.taskId).catch(i=>{if(i instanceof y&&i.code==="TASK_NOT_FOUND")return null;throw i}),r=n?.ptyTabs.find(i=>i.id===t.agentTabId);if(!n||!r||r.kind!=="agent"||n.status==="closed"){await Re.fail(this.paths,t.id,is("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer available in task ${t.taskId}.`,!1,!1));return}let s=this.runtime.getActivitySnapshots().find(i=>i.tabId===t.agentTabId);if(s&&s.sessionState!=="running"){await Re.fail(this.paths,t.id,is("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(this.runtime.hasRunningSession(t.agentTabId)&&!(t.delivery==="when-ready"&&Dt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")){await Re.beginDelivery(this.paths,t.id);try{this.runtime.writeToSession(t.agentTabId,Ym(r.runner??n.runner,t.prompt.text))}catch(i){await Re.fail(this.paths,t.id,is("PROMPT_DELIVERY_UNCERTAIN",i instanceof Error?i.message:"Prompt delivery failed after it began.",!1,!0));return}await Re.completeDelivery(this.paths,t.id)}}},is=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var HP={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},rr=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...HP,...t.intervals},this.now=t.now??Date.now}takeDueTasks(t,n){let r=this.now(),s=new Set(t.map(o=>o.id));for(let o of this.scheduledTasks.keys())s.has(o)||this.scheduledTasks.delete(o);let i=[];for(let o of t){let a=this.getTaskIntervalMs(o,n);if(a===null){this.scheduledTasks.delete(o.id);continue}let l=this.scheduledTasks.get(o.id);if(!l){this.scheduledTasks.set(o.id,{intervalMs:a,nextPollAt:r,lastPollAt:null}),r>=this.notBefore&&i.push(o);continue}a<l.intervalMs&&(l.nextPollAt=Math.min(l.nextPollAt,r+a)),l.intervalMs=a,r>=this.notBefore&&r>=l.nextPollAt&&i.push(o)}return i}requestImmediate(t){let n=this.now();for(let r of t){let s=this.scheduledTasks.get(r);if(!s)continue;let i=s.lastPollAt===null?n:Math.max(n,s.lastPollAt+this.minimumIntervalMs);s.nextPollAt=Math.min(s.nextPollAt,i)}}recordSuccess(t,n){let r=this.now();this.rateLimitFailures=0,this.notBefore=0;for(let s of t){let i=this.getTaskIntervalMs(s,n);i===null?this.scheduledTasks.delete(s.id):this.scheduledTasks.set(s.id,{intervalMs:i,nextPollAt:r+i,lastPollAt:r})}}recordFailure(t,n){let r=this.now(),s=n instanceof Ne,i=s?Math.min(this.intervals.rateLimitBaseMs*2**this.rateLimitFailures,this.intervals.rateLimitMaxMs):Math.max(this.minimumIntervalMs,this.intervals.pendingBackgroundMs);s&&(this.rateLimitFailures+=1,this.notBefore=r+i);for(let o of t){let a=this.scheduledTasks.get(o.id);a&&(a.nextPollAt=r+i,a.lastPollAt=r)}}getTaskIntervalMs(t,n){let r=zP(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(YP);return this.withMinimum(i?s?this.intervals.pendingForegroundMs:this.intervals.pendingBackgroundMs:s?this.intervals.stableForegroundMs:this.intervals.stableBackgroundMs)}return t.status!=="closed"?this.withMinimum(s?this.intervals.discoveryForegroundMs:this.intervals.discoveryBackgroundMs):null}withMinimum(t){return Math.max(t,this.minimumIntervalMs)}};function zP(e){return e.type==="project"&&e.repoTargets?.length?e.repoTargets.map(t=>t.pullRequest).filter(t=>t.status==="open"):e.prs.filter(t=>t.status==="open")}function YP(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as JP}from"node:fs";var Ji=class{constructor(t,n){this.paths=t;this.options=n;this.now=n.now??Date.now,this.taskDebounceMs=n.taskDebounceMs??50,this.readyAfterMs=n.readyAfterMs??5e3}paths;options;now;taskDebounceMs;readyAfterMs;agentStates=new Map;readinessTimers=new Map;watcher=null;debounceTimer=null;reconciliation=null;dirty=!1;running=!1;baselineComplete=!1;start(){if(!this.running){this.running=!0,this.baselineComplete=!1;try{this.watcher=JP(this.paths.tasksDir,{persistent:!1},()=>{this.schedule(this.taskDebounceMs)}),this.watcher.on("error",t=>{this.reportError(t)})}catch(t){this.reportError(t)}this.schedule(0)}}notifyActivity(t){if(!this.running)return;let n=pt(t.tabId,[t],this.now());this.agentStates.get(t.tabId)!==n&&(this.agentStates.set(t.tabId,n),this.schedule(0)),this.scheduleReadiness(t)}notifyActivityRemoved(t){this.running&&(this.clearReadinessTimer(t),this.agentStates.delete(t)&&this.schedule(0))}async stop(){if(this.running){this.running=!1,this.watcher?.close(),this.watcher=null,this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=null;for(let t of this.readinessTimers.values())clearTimeout(t);this.readinessTimers.clear(),await this.reconciliation?.catch(()=>{})}}scheduleReadiness(t){if(this.clearReadinessTimer(t.tabId),t.sessionState!=="running")return;let n=Math.max(0,t.lastActivityAt+this.readyAfterMs-this.now());this.readinessTimers.set(t.tabId,setTimeout(()=>{this.readinessTimers.delete(t.tabId),!(!this.running||this.agentStates.get(t.tabId)!=="working")&&(this.agentStates.set(t.tabId,"ready"),this.schedule(0))},n+1))}clearReadinessTimer(t){let n=this.readinessTimers.get(t);n&&clearTimeout(n),this.readinessTimers.delete(t)}schedule(t){if(this.running){if(this.reconciliation){this.dirty=!0;return}this.debounceTimer||(this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.requestReconciliation()},t))}}requestReconciliation(){if(!this.running||this.reconciliation){this.dirty=!0;return}this.reconciliation=this.drainReconciliations().catch(t=>this.reportError(t)).finally(()=>{this.reconciliation=null,this.running&&this.dirty&&this.requestReconciliation()})}async drainReconciliations(){do{this.dirty=!1;let t=await this.options.reconcileEvents();this.baselineComplete&&t.length>0&&await this.options.onEvents(t),this.baselineComplete=!0}while(this.running&&this.dirty)}async reportError(t){await this.options.onError(t)}};var XP={selectedTaskId:null,reviewVisible:!1},QP={listTasks:async e=>(await P.listTasks(e)).tasks,syncTasks:async(e,t)=>(await P.prs.discoverOrRefreshMany(e,t),Promise.all(t.map(n=>P.getTask(e,n.id))))},Xi=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??QP,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new rr({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new Ji(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=ZP(s);i.length>0&&await this.wake(i)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new zt({resolutionMs:r,...n.now?{now:n.now}:{},onError:(s,i)=>this.reportError(i)}),this.heartbeat.register({id:"github.pull-requests",intervalMs:r,run:()=>this.reconcile()})}paths;heartbeat;coordinator;dependencies;onTasksChanged;onError;eventMonitor;pendingWakeTaskIds=new Set;reconciliation=null;reconciliationVersion=0;view=XP;running=!1;lastErrorMessage=null;start(){this.running||(this.running=!0,this.eventMonitor?.start(),this.heartbeat.start())}async stop(){this.running&&(this.running=!1,this.heartbeat.stop(),await this.eventMonitor?.stop(),await this.reconciliation?.catch(()=>{}))}setView(t){this.view=t}notifyActivity(t){this.eventMonitor?.notifyActivity(t)}notifyActivityRemoved(t){this.eventMonitor?.notifyActivityRemoved(t)}async wake(t){if(t?.length){for(let n of t)this.pendingWakeTaskIds.add(n);this.reconciliationVersion+=1}await this.reconcile()}reconcile(){return this.reconciliation?this.reconciliation:(this.reconciliation=this.drainReconciliations(),this.reconciliation)}async drainReconciliations(){try{for(;;){let t=this.reconciliationVersion,n=[...this.pendingWakeTaskIds];if(this.pendingWakeTaskIds.clear(),this.coordinator.requestImmediate(n),await this.reconcilePullRequests(),t===this.reconciliationVersion)return}}finally{this.reconciliation=null}}async reconcilePullRequests(){let t=await this.dependencies.listTasks(this.paths),n=this.view,r=this.coordinator.takeDueTasks(t,n);if(r.length===0)return;let s=new Map(r.map(o=>[o.id,Xm(o)])),i;try{i=await this.dependencies.syncTasks(this.paths,r)}catch(o){this.coordinator.recordFailure(r,o),await this.reportPersistedChangesAfterFailure(s),await this.reportError(o);return}this.coordinator.recordSuccess(i,this.view),this.lastErrorMessage=null,await this.reportChangedTasks(s,i)}async reportPersistedChangesAfterFailure(t){try{let n=await this.dependencies.listTasks(this.paths);await this.reportChangedTasks(t,n.filter(r=>t.has(r.id)))}catch(n){await this.reportError(n)}}async reportChangedTasks(t,n){let r=n.filter(s=>t.get(s.id)!==Xm(s)).map(s=>s.id);r.length>0&&await this.onTasksChanged(r)}async reportError(t){let n=t instanceof Error?t.message:String(t);n!==this.lastErrorMessage&&(this.lastErrorMessage=n,await this.onError(t))}};function ZP(e){let t=new Set;for(let n of e){if(!n.taskId)continue;if(n.type==="task.created"||n.type==="task.pr.unlinked"){t.add(n.taskId);continue}let r=tI(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&eI.has(i))&&t.add(n.taskId);continue}n.type==="agent.state.changed"&&r?.previousState==="working"&&(r.state==="ready"||r.state==="idle"||r.state==="error")&&t.add(n.taskId)}return[...t]}var eI=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),tI=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function Xm(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as uI}from"node:module";import nI from"@xterm/headless";var rI=1e3,sI=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function Zm(e){return new nI.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:rI,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}})}function eh(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function Oc(e,t){return new Promise(n=>{e.write(t,n)})}function th(e,t=0){let n=e.buffer.active,r=[],s=n.getNullCell(),i=n.baseY+n.cursorY,o=Math.max(0,n.baseY-t);for(let a=0;a<e.rows;a+=1){let l=n.getLine(o+a);if(!l){r.push({segments:[]});continue}let c=[];for(let u=0;u<e.cols;u+=1){let d=l.getCell(u,s);!d||d.getWidth()===0||c.push({text:d.getChars()||" ",style:aI(d,o+a===i&&u===n.cursorX)})}r.push({segments:iI(oI(c))})}return r}function iI(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&dI(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};nh(n.style)||(s.style=n.style),t.push(s)}return t}function oI(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||!nh(n.style))break;t-=1}return e.slice(0,t)}function aI(e,t){let n={},r=Qm(e,"fg"),s=Qm(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 Qm(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"):sI[s]??lI(s)}function lI(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(cI).map(i=>i.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 cI(e){return e===0?0:55+e*40}function dI(e,t){return Ec(e)===Ec(t)}function Ec(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function nh(e){return Ec(e)===""}var pI=uI(import.meta.url),fI=/^CTRL_([A-Z])$/,mI="\x1B[6n",hI="\x1B[c",gI="\x1B[?u",yI={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
260
+ `,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:""},Qi=class{sessions=new Map;activitySnapshots=new Map;shell;env;spawn;onUpdate;onActivity;onActivityRemoved;activityEnabled;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.onActivity=t.onActivity,this.onActivityRemoved=t.onActivityRemoved,this.activityEnabled=t.activityEnabled??!0,this.resolveSessionSpec=t.resolveSessionSpec??(()=>({cwd:t.workspaceRoot,command:[]}))}ensureSession(t,n,r,s){let i=this.sessions.get(n);if(i)if(i.status!=="running")xc(i),this.sessions.delete(n);else return this.attachedTabId=n,i.scrollbackLines=0,rh(i,r),this.getViewState(n);let o;try{o=this.createSession(t,n,r,s)}catch(a){throw this.recordActivity({taskId:t,tabId:n,sessionState:"failed",lastActivityAt:Date.now(),exitCode:null,error:a instanceof Error?a.message:String(a)}),a}return this.sessions.set(n,o),this.notifyActivity(o),this.attachedTabId=n,this.getViewState(n)}write(t){let n=this.getAttachedSession();!n||n.status!=="running"||(n.pty.write(t),(t.includes("\r")||t.includes(`
261
+ `))&&this.touchActivity(n))}writeKey(t){let n=wI(t);n!==null&&this.write(n)}hasRunningSession(t){return this.sessions.get(t)?.status==="running"}writeToSession(t,n){let r=this.sessions.get(t);if(!r||r.status!=="running")throw new Error(`Agent tab ${t} is not running.`);r.pty.write(n),this.touchActivity(r)}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&&rh(n,t)}detach(){this.attachedTabId=null}sessionTabIds(){return[...this.sessions.keys()]}getActivitySnapshots(){return[...this.activitySnapshots.values()]}setActivityEnabled(t){if(this.activityEnabled!==t&&(this.activityEnabled=t,!!t))for(let n of this.sessions.values())this.notifyActivity(n)}disposeSession(t){let n=this.sessions.get(t);n&&(xc(n),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())xc(t);this.sessions.clear();for(let t of this.activitySnapshots.keys())this.onActivityRemoved?.(t);this.activitySnapshots.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:kI(n),error:n.error,scrolledBack:n.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}createSession(t,n,r,s){let i=this.spawn??bI().spawn,o=Zm(r),a=s??this.resolveSessionSpec(t,n),l=sn({...this.env,...a.env??{}}),{executable:c,args:u}=RI(this.shell,a.command,{cwd:a.cwd,env:l}),d=i(c,u,{name:"xterm-256color",cols:r.columns,rows:r.rows,cwd:a.cwd,env:SI(l)}),p={taskId:t,tabId:n,pty:d,terminal:o,status:"running",error:null,disposables:[],scrollbackLines:0,rows:[],renderedScrollbackLines:null,screenDirty:!0,lastActivityAt:Date.now(),exitCode:null};return p.disposables.push(d.onData(h=>{this.touchActivity(p),PI(d,h),Oc(p.terminal,h).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p.disposables.push(d.onExit(h=>{p.status="exited",p.exitCode=h.exitCode,p.lastActivityAt=Date.now(),this.notifyActivity(p),Oc(p.terminal,`\r
262
+ [process exited ${h.exitCode}]`).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p}getAttachedSession(){return this.attachedTabId?this.sessions.get(this.attachedTabId)??null:null}touchActivity(t){t.lastActivityAt=Date.now(),this.activityEnabled&&this.notifyActivity(t)}notifyActivity(t){this.activityEnabled&&this.recordActivity(this.buildActivitySnapshot(t))}recordActivity(t){this.activityEnabled&&(this.activitySnapshots.set(t.tabId,t),this.onActivity?.(t))}removeActivity(t){this.activitySnapshots.delete(t)&&this.onActivityRemoved?.(t)}buildActivitySnapshot(t){return{taskId:t.taskId,tabId:t.tabId,sessionState:t.status==="failed"?"failed":t.status==="exited"?"exited":"running",lastActivityAt:t.lastActivityAt,exitCode:t.exitCode,error:t.error}}};function wI(e){if(e.length===1)return e;let t=yI[e];if(t!==void 0)return t;let n=fI.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function rh(e,t){TI(e.pty,t),eh(e.terminal,t),e.screenDirty=!0}function kI(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=th(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function xc(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function TI(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function bI(){return pI("node-pty")}function RI(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[on(t[0],n),...t.slice(1)].map(sh).join(" ")}; exec ${sh(e)} -l`;return{executable:e,args:["-lc",s]}}function sh(e){return`'${e.replaceAll("'","'\\''")}'`}function SI(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 PI(e,t){for(let n=0;n<$c(t,mI);n+=1)e.write("\x1B[1;1R");for(let n=0;n<$c(t,hI);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<$c(t,gI);n+=1)e.write("\x1B[?0u")}function $c(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 ah=ln,OI=new Set([ah]),xI=16,$I=250;async function lh(e){let t=ft(e.paths);await LI(t,e.paths,e.spawnDaemon);let n=await hh(t.socketPath),r=new Dc(n,e);return await r.ready(),r}async function ch(e,t={}){let n=ft(e);await AI(e.runtimeDir,{recursive:!0}),await wn(n.socketPath,{force:!0});let r=new Nc(e,t),s=vI(i=>r.handleConnection(i));try{await r.start(),await BI(s,n.socketPath),await EI(n.pidPath,String(process.pid),"utf8"),await new Promise(i=>{let o=!1,a=()=>{o||(o=!0,r.closeClients(),s.close(()=>{process.removeListener("SIGTERM",a),process.removeListener("SIGINT",a),i()}))};r.onShutdown=a,process.once("SIGTERM",a),process.once("SIGINT",a)})}finally{r.onShutdown=null,await wn(n.socketPath,{force:!0}),await wn(n.pidPath,{force:!0}),await r.stop(),r.disposeAll()}}async function dh(e){let t=ft(e);return await eo(t.socketPath)?(await fh(t.socketPath),!0):!1}var Dc=class{constructor(t,n){this.socket=t;this.options=n,this.activityEnabled=n.activityEnabled??!1,this.tasksChangedHandler=n.onTasksChanged,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||(this.closed=!0,this.rejectAll(new Error("Craig PTY daemon connection closed.")),this.failRunningActivities("Craig PTY daemon connection closed."))})}socket;managesPullRequestSync=!0;nextRequestId=1;pending=new Map;viewCache=new Map;activityCache=new Map;activityRevisionByTabId=new Map;activityRevision=0;attachedTabId=null;viewedTabId=null;subscribedTabId=null;activityEnabled;pullRequestPollView={selectedTaskId:null,reviewVisible:!1};tasksChangedHandler;buffer="";closed=!1;options;async ready(){let t=await this.send({type:"ping"});if(!ph(t.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch.");await this.send({type:"setActivityEnabled",enabled:this.activityEnabled}),this.activityEnabled&&await this.refreshActivitySnapshots()}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,this.viewedTabId=n,this.subscribedTabId=n;let i=s.view??{status:"idle",rows:[],error:null};return this.viewCache.set(n,i),i}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})}this.activityEnabled&&await this.refreshActivitySnapshots()}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){let n=this.attachedTabId;this.send({type:"scrollViewport",lines:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}resize(t){let n=this.attachedTabId;this.send({type:"resize",size:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}detach(){this.attachedTabId=null,this.send({type:"detach"}).catch(()=>{})}setViewedTab(t){this.closed||(this.viewedTabId=t,this.subscribeToView(t))}setActivityEnabled(t){if(!(this.closed||this.activityEnabled===t)){if(this.activityEnabled=t,!t){for(let n of[...this.activityCache.keys()])this.removeCachedActivity(n);this.send({type:"setActivityEnabled",enabled:t}).catch(()=>{});return}this.send({type:"setActivityEnabled",enabled:t}).then(()=>this.refreshActivitySnapshots(!0)).catch(()=>{})}}setPullRequestPollView(t){this.closed||this.pullRequestPollView.selectedTaskId===t.selectedTaskId&&this.pullRequestPollView.reviewVisible===t.reviewVisible||(this.pullRequestPollView=t,this.send({type:"setPullRequestPollView",view:t}).catch(()=>{}))}setTasksChangedHandler(t){this.tasksChangedHandler=t}disposeSession(t){this.viewCache.delete(t),this.removeCachedActivity(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}}getActivitySnapshots(){return[...this.activityCache.values()]}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((o,a)=>{this.pending.set(n,{resolve:o,reject:a})});if(this.socket.destroyed)throw this.pending.delete(n),new Error("Craig PTY daemon connection is closed.");this.socket.write(`${JSON.stringify(r)}
263
+ `);let i=await s;if(!i.ok)throw new Error(i.error);return i}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
264
+ `);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
265
+ `)}}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}if(n.type==="update"){let r=this.viewCache.get(n.tabId)??{status:"idle",rows:[],error:null,scrolledBack:!1},s=_I(r,n.patch),i=r.rows.slice(0,n.patch.rowCount);for(let o of n.patch.rows)i[o.index]=o.row;this.viewCache.set(n.tabId,{status:n.patch.status,rows:i,error:n.patch.error,scrolledBack:n.patch.scrolledBack}),this.viewedTabId===n.tabId&&this.options.onUpdate?.(s?{tabId:n.tabId,kind:"full"}:{tabId:n.tabId,kind:"rows",rowIndices:n.patch.rows.map(o=>o.index)})}n.type==="activity"&&(this.recordCachedActivity(n.snapshot),this.options.onActivity?.(n.snapshot)),n.type==="activityRemoved"&&this.removeCachedActivity(n.tabId),n.type==="tasksChanged"&&this.tasksChangedHandler?.(n.taskIds)}subscribeToView(t){this.closed||this.subscribedTabId===t||(this.subscribedTabId=t,this.send({type:"subscribeView",tabId:t}).then(n=>{t&&n.view&&this.viewCache.set(t,n.view),this.viewedTabId===t&&this.subscribedTabId===t&&this.notifyFullUpdate(t)}).catch(()=>{this.subscribedTabId===t&&(this.subscribedTabId=null)}))}rejectAll(t){for(let n of this.pending.values())n.reject(t);this.pending.clear()}notifyFullUpdate(t){t&&this.options.onUpdate?.({tabId:t,kind:"full"})}replaceActivityCache(t,n){let r=new Map;for(let[s,i]of this.activityRevisionByTabId)i>n&&r.set(s,this.activityCache.get(s)??null);this.activityCache.clear();for(let s of t)this.activityCache.set(s.tabId,s);for(let[s,i]of r)i?this.activityCache.set(s,i):this.activityCache.delete(s)}async refreshActivitySnapshots(t=!1){let n=this.activityRevision,r=await this.send({type:"getActivitySnapshots"});if(this.replaceActivityCache(r.activities??[],n),t)for(let s of this.activityCache.values())this.options.onActivity?.(s)}recordCachedActivity(t){this.activityRevision+=1,this.activityRevisionByTabId.set(t.tabId,this.activityRevision),this.activityCache.set(t.tabId,t)}removeCachedActivity(t){this.activityRevision+=1,this.activityRevisionByTabId.set(t,this.activityRevision),this.activityCache.delete(t),this.options.onActivityRemoved?.(t)}failRunningActivities(t){for(let n of this.activityCache.values()){if(n.sessionState!=="running")continue;let r={...n,sessionState:"failed",lastActivityAt:Date.now(),error:t};this.recordCachedActivity(r),this.options.onActivity?.(r)}}},Nc=class{onShutdown=null;clients=new Set;subscriptions=new Map;updateTimers=new Map;activityTimers=new Map;pendingActivities=new Map;runtime;paths;orchestrationSupervisor=null;pullRequestSyncSupervisor=null;pullRequestEventReconciliationEnabled=!1;pullRequestSyncOptions;attachedTabId=null;constructor(t,n){this.paths=t,this.pullRequestSyncOptions=n.pullRequestSync;let r={...n};delete r.pullRequestSync,this.runtime=new Qi({...r,workspaceRoot:t.workspaceRoot,activityEnabled:!1,onUpdate:s=>this.handleRuntimeUpdate(s.tabId),onActivity:s=>this.handleActivityUpdate(s),onActivityRemoved:s=>this.handleActivityRemoved(s)})}async start(){let t=await k.load(this.paths);if(this.pullRequestSyncOptions!==!1){let r=this.pullRequestSyncOptions??{},s=r.reconcileEvents===!1?!1:r.reconcileEvents??(()=>Kt(this.paths,{agentObserver:{daemonAvailable:!0,getSnapshots:()=>this.runtime.getActivitySnapshots(),subscribe:()=>()=>{},close:()=>{}}}));this.pullRequestEventReconciliationEnabled=!!s,this.pullRequestSyncSupervisor=new Xi(this.paths,{...r,reconcileEvents:s,minimumIntervalMs:r.minimumIntervalMs??(t.github?.watchIntervalSeconds??5)*1e3,onTasksChanged:async i=>{this.broadcastTasksChanged(i),await r.onTasksChanged?.(i)},onError:async i=>{await it.appendErrorLogBestEffort(this.paths,{context:"pull request sync supervisor",message:i instanceof Error?i.message:String(i)}),await r.onError?.(i)}}),this.pullRequestSyncSupervisor.start(),this.updateRuntimeActivityEnabled()}let n=(await gt(this.paths)).some(r=>r.state==="queued"||r.state==="delivering");(k.previews.isEnabled(t,"agentOrchestration")||n)&&await this.ensureOrchestrationSupervisor()}async stop(){await this.pullRequestSyncSupervisor?.stop(),this.pullRequestSyncSupervisor=null,this.pullRequestEventReconciliationEnabled=!1,this.updateRuntimeActivityEnabled(),await this.orchestrationSupervisor?.stop(),this.orchestrationSupervisor=null}handleConnection(t){let n="";this.clients.add(t),this.subscriptions.set(t,{activityEnabled:!1,tabId:null,view:null,rowKeys:[],pullRequestPollView:{selectedTaskId:null,reviewVisible:!1}}),t.setEncoding("utf8"),t.on("data",s=>{n+=String(s);let i=n.indexOf(`
266
+ `);for(;i!==-1;){let o=n.slice(0,i);n=n.slice(i+1),this.handleLine(t,o),i=n.indexOf(`
267
+ `)}});let r=()=>{this.clients.delete(t),this.subscriptions.delete(t),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()),this.hasActivitySubscribers()||(this.updateRuntimeActivityEnabled(),this.clearPendingActivityBroadcasts())};t.on("close",r),t.on("error",r)}disposeAll(){for(let t of this.updateTimers.values())clearTimeout(t);this.updateTimers.clear();for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear(),this.runtime.disposeAll()}closeClients(){for(let t of this.clients)t.destroy();this.clients.clear(),this.subscriptions.clear(),this.updateRuntimeActivityEnabled()}async handleLine(t,n){if(n.trim().length===0)return;let r;try{r=JSON.parse(n)}catch{yn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);yn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion:ah}:{},...r.type==="getActivitySnapshots"?{activities:this.runtime.getActivitySnapshots()}:{},...s?{view:s}:{}})}catch(s){let i=s instanceof Error?s.message:String(s);yn(t,{id:r.id,ok:!1,error:i})}}async handleRequest(t,n){switch(n.type){case"ping":return null;case"ensureSession":return this.attachedTabId=n.tabId,this.subscribe(t,n.tabId,this.runtime.ensureSession(n.taskId,n.tabId,n.size,n.spec));case"hydrateSession":return this.runtime.getViewState(n.tabId);case"write":return this.runtime.write(n.input),null;case"writeKey":return this.runtime.writeKey(n.key),null;case"scrollViewport":return this.runtime.scrollViewport(n.lines),this.runtime.getViewState(this.attachedTabId);case"resize":return this.runtime.resize(n.size),this.runtime.getViewState(this.attachedTabId);case"detach":return this.runtime.detach(),this.attachedTabId=null,null;case"disposeSession":return this.runtime.disposeSession(n.tabId),this.attachedTabId===n.tabId&&(this.attachedTabId=null),null;case"setActivityEnabled":return this.setActivityEnabled(t,n.enabled),null;case"subscribeView":return this.subscribe(t,n.tabId,this.runtime.getViewState(n.tabId));case"pruneStale":{let r=new Set(n.keepTabIds),s=new Set([...this.runtime.sessionTabIds(),...this.runtime.getActivitySnapshots().map(i=>i.tabId)]);for(let i of s)r.has(i)||(this.runtime.disposeSession(i),this.attachedTabId===i&&(this.attachedTabId=null));return null}case"getViewState":return this.runtime.getViewState(n.tabId);case"getActivitySnapshots":return null;case"setPullRequestPollView":return this.setPullRequestPollView(t,n.view),null;case"wakeOrchestration":return await this.ensureOrchestrationSupervisor(),await this.orchestrationSupervisor.wake(),null;case"shutdown":return setTimeout(()=>this.onShutdown?.(),0),null;default:return UI(n)}}subscribe(t,n,r){let s=this.subscriptions.get(t);return this.subscriptions.set(t,{activityEnabled:s?.activityEnabled??!1,tabId:n,view:r,rowKeys:r.rows.map(_c),pullRequestPollView:s?.pullRequestPollView??{selectedTaskId:null,reviewVisible:!1}}),r}setActivityEnabled(t,n){let r=this.subscriptions.get(t);if(!r)return;this.subscriptions.set(t,{...r,activityEnabled:n});let s=this.hasActivitySubscribers();this.updateRuntimeActivityEnabled(),s||this.clearPendingActivityBroadcasts()}setPullRequestPollView(t,n){let r=this.subscriptions.get(t);r&&(this.subscriptions.set(t,{...r,pullRequestPollView:n}),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()))}getPullRequestPollView(){let t=[...this.subscriptions.values()].map(n=>n.pullRequestPollView);return t.find(n=>n.selectedTaskId&&n.reviewVisible)??t.find(n=>n.selectedTaskId)??{selectedTaskId:null,reviewVisible:!1}}broadcastTasksChanged(t){for(let n of this.clients)yn(n,{type:"tasksChanged",taskIds:t})}handleRuntimeUpdate(t){this.scheduleBroadcastUpdate(t)}handleActivityUpdate(t){if(this.pullRequestSyncSupervisor?.notifyActivity(t),!!this.hasActivitySubscribers()){if(this.pendingActivities.set(t.tabId,t),t.sessionState!=="running"){let n=this.activityTimers.get(t.tabId);n&&(clearTimeout(n),this.activityTimers.delete(t.tabId)),this.broadcastActivity(t.tabId);return}this.activityTimers.has(t.tabId)||this.activityTimers.set(t.tabId,setTimeout(()=>{this.activityTimers.delete(t.tabId),this.broadcastActivity(t.tabId)},$I))}}handleActivityRemoved(t){this.pullRequestSyncSupervisor?.notifyActivityRemoved(t);let n=this.activityTimers.get(t);n&&(clearTimeout(n),this.activityTimers.delete(t)),this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&yn(r,{type:"activityRemoved",tabId:t})}broadcastActivity(t){let n=this.pendingActivities.get(t);if(n){this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&yn(r,{type:"activity",snapshot:n})}}hasActivitySubscribers(){return[...this.subscriptions.values()].some(t=>t.activityEnabled)}clearPendingActivityBroadcasts(){for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear()}async ensureOrchestrationSupervisor(){if(this.orchestrationSupervisor)return;let t=new Yi(this.paths,this.runtime,{onError:n=>it.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor",message:n instanceof Error?n.message:String(n)})});await t.start(),this.orchestrationSupervisor=t,this.updateRuntimeActivityEnabled()}updateRuntimeActivityEnabled(){this.runtime.setActivityEnabled(this.orchestrationSupervisor!==null||this.pullRequestEventReconciliationEnabled||this.hasActivitySubscribers())}scheduleBroadcastUpdate(t){this.updateTimers.has(t)||!this.hasViewSubscriber(t)||this.updateTimers.set(t,setTimeout(()=>{this.updateTimers.delete(t),this.broadcastUpdate(t)},xI))}hasViewSubscriber(t){for(let n of this.subscriptions.values())if(n.tabId===t)return!0;return!1}broadcastUpdate(t){let n=this.runtime.getViewState(t);for(let r of this.clients){let s=this.subscriptions.get(r);if(!s||s.tabId!==t)continue;let i=DI(s,n),o=NI(s.view,n);s.view=n,s.rowKeys=n.rows.map(_c),(i.rows.length>0||o)&&yn(r,{type:"update",tabId:t,patch:i})}}};function DI(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==_c(s)&&n.push({index:r,row:s})}return{status:t.status,error:t.error,scrolledBack:t.scrolledBack??!1,rowCount:t.rows.length,rows:n}}function NI(e,t){return!e||e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==(t.scrolledBack??!1)||e.rows.length!==t.rows.length}function _I(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function _c(e){return JSON.stringify(e)}async function LI(e,t,n){if(await MI(e.socketPath,1e3))return;await eo(e.socketPath)&&(await fh(e.socketPath),await ih(e.socketPath,1e3)),await eo(e.socketPath)&&(await qI(e),await ih(e.socketPath,1e3)),await FI(e);let r=t.workspaceRoot;if(n)n(r);else{let{command:o,args:a}=jI(r),l=CI(Zi.join(t.runtimeDir,"pty-daemon.log"),"a");II(o,a,{cwd:r,detached:!0,stdio:["ignore",l,l],env:process.env}).unref()}let s=Date.now();for(;Date.now()-s<5e3;){if(await uh(e.socketPath))return;await Mc(50)}let i=await Lc(Zi.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${i?`
268
+ ${i.slice(-2e3)}`:""}`)}async function uh(e){let t=await WI(e).catch(()=>null);return t?.ok===!0&&ph(t.protocolVersion)}function ph(e){return e!==void 0&&OI.has(e)}async function MI(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await uh(e))return!0;await Mc(50)}return!1}function jI(e){let t=process.argv[1];if(t?.endsWith(".ts")){let r=Zi.resolve(Zi.dirname(t),"..","node_modules",".bin","tsx");return{command:zo("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 FI(e){let t=await Lc(e.pidPath,"utf8").catch(()=>null);if(t){let n=Number(t.trim());if(Number.isInteger(n)&&n>0&&gh(n))return}await wn(e.socketPath,{force:!0}),await wn(e.pidPath,{force:!0})}async function eo(e){let t=await hh(e).catch(()=>null);return t?(t.end(),!0):!1}async function fh(e){await mh(e,{id:1,type:"shutdown"}).catch(()=>null)}async function qI(e){let t=await Lc(e.pidPath,"utf8").catch(()=>null),n=Number(t?.trim());if(!Number.isInteger(n)||n<=0||!gh(n)){await wn(e.socketPath,{force:!0});return}try{process.kill(n,"SIGTERM")}catch{await wn(e.socketPath,{force:!0})}}async function WI(e){return mh(e,{id:1,type:"ping"})}function mh(e,t){return new Promise((n,r)=>{let s=oh(e),i="",o=setTimeout(()=>{s.destroy(),r(new Error("Craig PTY daemon request timed out."))},500),a=()=>clearTimeout(o);s.setEncoding("utf8"),s.once("connect",()=>s.write(`${JSON.stringify(t)}
269
+ `)),s.once("error",l=>{a(),r(l)}),s.on("data",l=>{i+=String(l);let c=i.indexOf(`
270
+ `);if(c===-1)return;let u=i.slice(0,c);a(),s.end();try{n(JSON.parse(u))}catch(d){r(d instanceof Error?d:new Error(String(d)))}}),s.once("close",()=>a())})}async function ih(e,t){let n=Date.now();for(;Date.now()-n<t;){if(!await eo(e))return;await Mc(50)}}function hh(e){return new Promise((t,n)=>{let r=oh(e);r.once("connect",()=>t(r)),r.once("error",n)})}function BI(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,n)})}function yn(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
271
+ `)}catch{}}function gh(e){try{return process.kill(e,0),!0}catch{return!1}}function Mc(e){return new Promise(t=>setTimeout(t,e))}function UI(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var jc=["Runners","Feature Previews","Error Log","Help"],wh={agentActivityIndicators:"Agent activity indicators",agentOrchestration:"Agent orchestration"};function Fc(e,t){return J.map(n=>{let r=k.runners.getProfile(n),s=e.runners?.[n]?.enabled!==!1,i=e.runners?.[n]?.path?.trim(),o=t.pathEdit?.runner===n?`${t.pathEdit.value}_`:i&&i.length>0?i:`default (${r.executable})`;return`${r.displayName} ${s?"enabled":"disabled"} ${o}`})}function kh(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 Th(e){return Me.map(t=>`${k.previews.isEnabled(e,t)?"[x]":"[ ]"} ${wh[t]}`)}function bh(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function Rh(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(jc.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:to(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"error-log"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function Sh(e,t,n){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(Me.length-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(!to(n))return{kind:"noop",state:e};let r=Me[e.menuIndex]??Me[0],s=!k.previews.isEnabled(t,r);return{kind:"save-enabled",feature:r,enabled:s,state:{...e,message:`${wh[r]} ${s?"enabled":"disabled"}.`}}}function Ph(e,t,n,r){if(e.pathEdit)return KI({...e,pathEdit:e.pathEdit},t,n);let s=Fc(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 a=J[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:a,value:t.runners?.[a]?.path??""}}}}if(!to(n))return{kind:"noop",state:e};let i=J[e.menuIndex]??"codex",o=t.runners?.[i]?.enabled!==!1;return o&&r.length<=1?{kind:"render",state:{...e,message:"At least one runner must stay enabled."}}:{kind:"save-enabled",runner:i,enabled:!o,state:{...e,message:`${k.runners.getProfile(i).displayName} ${o?"disabled":"enabled"}.`}}}function KI(e,t,n){if(n==="ESCAPE")return{kind:"render",state:yh({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(to(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:r,path:s.length>0?s:null,state:yh({...e,message:s.length>0?`${k.runners.getProfile(r).displayName} executable saved.`:`${k.runners.getProfile(r).displayName} executable reset to default.`})}}return VI(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function yh(e){let t={...e};return delete t.pathEdit,t}function to(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
272
+ `}function VI(e){return e.length===1&&e>=" "&&e!==""}import os from"node:path";function Ih(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 vh="\u{F024B} ",Ch="\u{F0DCF} ",Ah="\u25CB",qc="\uEA64",Eh="\uEAFE",Oh="\uEBDA",Wc="\u25CB",Bc="\u25CF",Uc="\u2713",Kc="\u2715";function xh(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}}var no=150,$h=6;var so="empty",le={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function Lh(e,t,n){let r=zI(t,e),s=t.repos.find(g=>g.id===e.selectedRepoId)??t.repos[0]??null,i=r?t.tasks.filter(g=>g.workspaceId===r.id):t.tasks,o=r?.kind==="project"?i:s?i.filter(g=>g.repoId===s.id):[],a=o.find(g=>g.id===e.selectedTaskId)??o[0]??null,l=a?.type==="project",c=Av(t.tasks),u=XI(e,a),d=JI(e,a,u,n),p=d.find(g=>g.id===u)??d[0]??{id:"agent",label:"CODEX"},h=t.inspection?.taskId===a?.id?t.inspection:null,f=s?.name??"no repo",m=a?k.runners.getDisplayName(a.runner):k.runners.getDisplayName(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?e.workspaceBrowser.query!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} Search: ${e.workspaceBrowser.query} \u2191\u2193 move Enter select Esc clear search`:`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up / search Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK ${s?`[${s.name}]`:"[no repo]"} \xB7 ${k.runners.getDisplayName(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 [${k.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:ts(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"?a===null?"n new task Tab tasks Esc pause ? help":u===K?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${k.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:os.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${os.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:m},leftTree:GI(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(g=>Ev(g,c[g])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:f,agent:m},centerTranscript:YI(u,e,s,a,e.workspaceBrowser,h,r),tabs:d,rightContext:Cv(s,a),rightInspection:dv(e,a,h)}}function GI(e,t,n){let r=[{text:"WORKSPACES",muted:!0,panelHeader:!0,focused:e.focusedRegion==="tasks"}];if(!t.workspaces)return HI(r,e,t.repos,t.tasks,n);let s=t.workspaces;if(s.length===0)r.push({text:"No workspaces registered.",indent:2,muted:!0});else for(let o of s){let a=e.selectedLeftItemId===`workspace:${o.id}`;r.push({id:`workspace:${o.id}`,text:`${o.kind==="project"?"\u2261":"\u2013"} ${o.name??o.id}`,selected:a,focused:a&&e.focusedRegion==="tasks"});let l=o.kind==="project"?o.discoveredRepoIds??[]:[o.primaryRepoId],c=t.tasks.filter(u=>u.workspaceId===o.id);if(c.length===0)r.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:u,visualDepth:d}of Zr(c)){let p=e.selectedLeftItemId===`task:${u.id}`,h=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,f={id:`task:${u.id}`,taskId:u.id,text:n?h:`${p?"\u25B8":"\u2022"} ${h}`,indent:d===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:_n(u,n.snapshots,n.now),activityAnimationFrame:n.animationFrame}:{}},m=jh(u);m&&(f.prBadge=m),r.push(f)}if(o.kind==="project"){let u=`new-task-workspace:${o.id}`,d=e.selectedLeftItemId===u;r.push({id:u,text:`+ New Project Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:d,focused:d&&e.focusedRegion==="tasks",muted:!d})}if(o.kind==="repo"){let u=`new-task:${o.primaryRepoId}`,d=e.selectedLeftItemId===u;r.push({id:u,text:`+ New Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:d,focused:d&&e.focusedRegion==="tasks",muted:!d})}else{r.push({text:` Repos (${l.length})`,indent:0,muted:!0});for(let u of l.slice(0,6)){let d=t.repos.find(p=>p.id===u);r.push({text:` \xB7 ${d?.name??u}`,indent:0,muted:!0})}l.length>6&&r.push({text:` \xB7 ${l.length-6} more`,indent:0,muted:!0})}}let i=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&e.focusedRegion==="tasks"}),r}function HI(e,t,n,r,s){if(n.length===0)e.push({text:"No repos registered.",indent:2,muted:!0});else for(let o of n){let a=t.selectedLeftItemId===`repo:${o.id}`;e.push({id:`repo:${o.id}`,text:`\u2013 ${o.name}`,selected:a,focused:a&&t.focusedRegion==="tasks"});let l=r.filter(d=>d.repoId===o.id);if(l.length===0)e.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:d,visualDepth:p}of Zr(l)){let h=t.selectedLeftItemId===`task:${d.id}`,f=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,m={id:`task:${d.id}`,taskId:d.id,text:s?f:`${h?"\u25B8":"\u2022"} ${f}`,indent:p===0?2:4,selected:h,focused:h&&t.focusedRegion==="tasks",...s?{activity:_n(d,s.snapshots,s.now),activityAnimationFrame:s.animationFrame}:{}},g=jh(d);g&&(m.prBadge=g),e.push(m)}let c=`new-task:${o.id}`,u=t.selectedLeftItemId===c;e.push({id:c,text:`+ New Task [${k.runners.getDisplayName(t.selectedRunner)}]`,indent:2,selected:u,focused:u&&t.focusedRegion==="tasks",muted:!u})}let i=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&t.focusedRegion==="tasks"}),e}function zI(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 YI(e,t,n,r,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(d=>d.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((d,p)=>{let h=p===s.selectedIndex?"\u25B8":" ",f=d.kind==="repo"?" [git repo]":"/";return`${h} ${d.name}${f}`}),u=s.query!==null?`Search: ${s.query}\u2588`:"";return Ye(["Browse for a workspace to register.",s.cwd,...u?[u]:[],"",...c,"",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 Ye(["No repos registered yet.","","Run `craig repo add <path>` in command mode, then reopen the shell."]);if(!r){let l=o?.kind==="project",c=l?o.name??"this workspace":n.name,u=l?"Project Task":"Task";return Ye([`No tasks in ${c}.`,"",`Press n or choose + New ${u} to create one with ${k.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?Ye([`${a.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."]):Ye([`${a.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===K&&t.openInspectionKind==="file"?ev(r,i,t.fileScrollOffset):e===K&&t.openInspectionKind==="diff"?tv(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?Ye(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):Ye(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function JI(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:QI(o),...o.kind==="agent"&&r&&t?{activity:Dt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame}:{}}))??[];if(!t)return[{id:so,label:"EMPTY",active:n===so,focused:e.focusedRegion==="center"&&n===so}];let i=e.openInspectionKind||n===K?[{id:K,label:ZI(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function XI(e,t){return t?t.ptyTabs.some(n=>n.id===e.activeTab)||e.activeTab===K&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??K:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??K:so}function QI(e){return e.title.toUpperCase()}function ZI(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?os.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function ev(e,t,n){if(!e)return Ye(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return Ye(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=Mh(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:""},...nv(r.lines,n,s)]}function tv(e,t,n){if(!e)return Ye(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return Ye(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=Mh(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:""},...rv(r.lines,n,s)]}function Ye(e){return e.map(t=>({text:t}))}function nv(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((i,o)=>{let a=s+o+1;return{text:`${`${String(a).padStart(r," ")} \u2502 `}${i}`,segments:[{text:String(a).padStart(r," "),style:{fg:le.lineNumber}},{text:" \u2502 ",style:{fg:le.gutter}},...Vc(i,n)],tone:"default"}})}function rv(e,t,n){let r=sv(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>iv(i,n))}function sv(e){let t=[],n=0,r=0;for(let s of e){let i=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/.exec(s);if(i){n=Number.parseInt(i[1]??"0",10),r=Number.parseInt(i[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 iv(e,t){let n=Dh(e.oldNumber),r=Dh(e.newNumber),s=e.kind==="delete"?n:r,i=e.kind==="delete"?{bg:"2a1111",fallbackFg:le.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:le.diffAdd}:null,o=`${s} \u2502 ${e.text}`,a=i?av(Vc(e.text,t),i.bg,i.fallbackFg):Vc(e.text,t),l=i?{fg:le.lineNumber,bg:i.bg}:{fg:le.lineNumber},c=i?{fg:le.gutter,bg:i.bg}:{fg:le.gutter};return{text:o,segments:[{text:s,style:l},{text:" \u2502 ",style:c},...a],fullBleed:i!==null}}function Dh(e){return e===null?" ":String(e).padStart(4," ")}function Mh(e){let t=os.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 Vc(e,t){return t==="diff"?ov(e):t==="markdown"?lv(e):t==="json"?Gc(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?Gc(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 ov(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:le.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:le.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:le.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:le.diffMeta}}]:[{text:e}]}function av(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function lv(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:le.markup,bold:!0}}]:Gc(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function Gc(e,t){let n=[],r=0;for(let s of e.matchAll(t)){let i=s[0],o=s.index??0;o>r&&n.push({text:e.slice(r,o)}),n.push({text:i,style:cv(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function cv(e){return e.startsWith("//")||e.startsWith("/*")?{fg:le.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:le.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:le.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:le.markup}:{fg:le.keyword}}function dv(e,t,n){let r=e.selectedProjectTargetId??t?.repoTargets?.[0]?.repoId??null,s=t?.type==="project"&&r?t.repoTargets?.find(a=>a.repoId===r)??null:null,i=t?.type==="project"?Fh(t.repoTargets??[]):s?.pullRequest??(t?B(t):null),o=[uv(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=Bh(e,t),l=Hc(e,n),c=gv([{id:"review-pr-header",text:"PULL REQUEST",muted:!0},...a,{id:"review-changes-spacer",text:"",muted:!0},{id:"review-changes-header",text:"CHANGES",muted:!0},...l],e);return{title:"",rows:[...o,...c]}}return e.inspectionMode==="files"?{title:"",rows:[...o,...Pv(e,n)]}:{title:"",rows:[...o,...Hc(e,n)]}}function uv(e,t){let n=e.inspectionMode,r=[{label:"FILES",active:n==="files"},{label:"REVIEW",active:n==="review"}],s=[];for(let l=0;l<r.length;l++){let c=r[l];l>0&&s.push({text:" "});let u=c.active?e.focusedRegion==="inspector"||e.focusedRegion==="actions"?"9ece6a":"7aa2f7":"565f89";s.push({text:c.label,style:{fg:u}})}let i=zc(t),o=Yc(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function Nh(e){return[{text:" "},zc(e),{text:" "},Yc(e)]}function jh(e){if(e.type==="project"&&e.repoTargets?.length){let n=Fh(e.repoTargets);return n?Nh(n):null}let t=B(e);return t?.number?Nh(t):null}function Fh(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=fv(n);return{number:-1,status:pv(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 pv(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 fv(e){let t=e.map(n=>qh(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 zc(e){return!e||!e.number?{text:Ah,style:{fg:"565f89"}}:e.status==="merged"?{text:Eh,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:Oh,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:qc,style:{fg:"565f89"}}:{text:qc,style:{fg:"9ece6a"}}}function Yc(e){return e?.aggregateReadiness?_h(e.aggregateReadiness):_h(qh(e))}function _h(e){return e==="failed"?{text:Kc,style:{fg:"f7768e"}}:e==="pending"?{text:Bc,style:{fg:"e0af68"}}:e==="success"?{text:Uc,style:{fg:"9ece6a"}}:{text:Wc,style:{fg:"565f89"}}}function qh(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")?Wh(e)?"failed":mv(e)?"success":"pending":"pending"}function mv(e){return!!(e.mergeable&&!e.draft&&!Wh(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function Wh(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function Bh(e,t){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return hv(e,t);let n=B(t),r=Kh("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(i=>i!==n&&(i.status==="merged"||i.status==="closed")).length;return s>0&&r.push({id:"pr-history",text:`+ ${s} previous PR${s!==1?"s":""}`,muted:!0}),r}var ro=32;function hv(e,t){let n=[],r=t.repoTargets??[],s=e.selectedProjectTargetId??r[0]?.repoId??null;for(let o of r){let a=s===o.repoId,l=e.focusedRegion==="inspector"&&a,c=o.repoId.startsWith("repo_")?o.repoId.slice(5):o.repoId;if(o.status!=="ready"){let d=o.failureReason?o.failureReason.slice(0,14):o.status,p=ro-d.length-1,h=c.length>p?c.slice(0,p-1)+"\u2026":c,f=ro-h.length-d.length;n.push({id:`project-review:${o.repoId}`,text:h+" ".repeat(Math.max(1,f))+d,selected:a,focused:l,muted:!0})}else{let u=zc(o.pullRequest),d=Yc(o.pullRequest),p=`${u.text} ${d.text}`,h=ro-p.length-1,f=c.length>h?c.slice(0,h-1)+"\u2026":c,m=ro-f.length-p.length,g=f+" ".repeat(Math.max(1,m));n.push({id:`project-review:${o.repoId}`,text:g+p,selected:a,focused:l,segments:[{text:g},{...u,text:u.text},{text:" "},{...d,text:d.text}]})}}let i=r.find(o=>o.repoId===s)??null;return i?.status==="ready"&&i.pullRequest.number&&(n.push({id:"target-detail-spacer",text:""}),n.push(...Kh("target",i.branch,i.pullRequest))),n}function Uh(e,t,n=null){return 3+Bh(e,t).length+Hc(e,n).length}function Kh(e,t,n){let r=d=>`${e}-${d}`;if(!n.number)return[{id:r("no-pr"),text:t,muted:!0}];let s=[],i=`#${n.number}`;s.push(n.url?{id:r("pr-number"),text:`${i} Open in GitHub \u2197`,segments:[{text:i},{text:" Open in GitHub \u2197",style:{fg:"7aa2f7",underline:!0},href:n.url}]}:{id:r("pr-number"),text:i});let o=n.baseBranch??"?",a=n.headBranch??t;s.push({id:r("pr-branches"),text:`${o} \u2192 ${a}`,muted:!0});let l=yv(n.reviewDecision,n.mergeStateStatus),c=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:`${c} \xB7 ${l}`,muted:!0,segments:[{text:c},{text:" \xB7 "},{text:l,style:{fg:wv(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${Vh(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(kv)):s.push({id:r("checks-none"),text:n.number?"No GitHub checks reported.":"No checks \u2014 sync after creating a PR.",muted:!0});let u=n.comments??[];return u.length>0&&(s.push({id:r("comments-spacer"),text:""}),s.push({id:r("comments-header"),text:`Review comments (${u.length})`}),s.push(...u.slice(-4).flatMap((d,p)=>Tv(d,r(`comment:${p}`))))),s}function gv(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 yv(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function wv(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function Vh(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 kv(e){let{icon:t,color:n}=Rv(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," ")} ${Sv(e.status)}`,color:n,muted:!1}}function Tv(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${Vh(e.createdAt)}`:"",s=bv(e.body,30),i=s.slice(0,4),o=i.length<s.length,a=[{id:`${t}:author`,text:`${n}${r}`,muted:!0},...i.map((l,c)=>({id:`${t}:body:${c}`,text:` ${o&&c===i.length-1?`${l}\u2026`:l}`,muted:!0}))];return a.push({id:`${t}:spacer`,text:"",muted:!0}),a}function bv(e,t){let n=e.split(/\s+/).filter(Boolean);if(n.length===0)return[];let r=[],s="";for(let i of n){if(!s){s=i;continue}`${s} ${i}`.length<=t?s=`${s} ${i}`:(r.push(s),s=i)}return s&&r.push(s),r}function Rv(e){switch(e){case"success":return{icon:Uc,color:"9ece6a"};case"pending":return{icon:Bc,color:"e0af68"};case"failed":return{icon:Kc,color:"f7768e"};case"skipped":return{icon:Wc,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function Sv(e){return e==="success"?"passing":e==="failed"?"failing":e}function Pv(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(l=>[l.path,l.status])),r=Jc(t.fileRows,e.collapsedFileTreePaths),s=e.fileSearchQuery,i=s?r.filter(l=>l.path.toLowerCase().includes(s.toLowerCase())):r,o=s!==null?[{id:"file-search",text:`Search: ${s}\u2588`,muted:!1}]:[],a=e.selectedFileTreePath??t.selectedFilePath;return[...o,...i.map(l=>{let c=l.kind==="file"?n.get(l.path):void 0,u=c==="A"?"9ece6a":c==="M"?"e0af68":c==="D"?"f7768e":c==="??"?"565f89":void 0,d=l.kind==="directory"?e.collapsedFileTreePaths.includes(l.path)?vh:Ch:Ih(l.label),p=l.kind==="directory"?"7aa2f7":xh(l.label),h=" ".repeat(l.depth),f=p?{text:d,style:{fg:p}}:{text:d},m=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:u?{text:l.label,style:{fg:u}}:{text:l.label},g=[{text:h},f,m];return{id:l.path,text:`${h}${d}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:g}})]}function Jc(e,t){let n=new Set(t);return e.filter(r=>{let s=r.path.split("/");for(let i=1;i<s.length;i+=1)if(n.has(s.slice(0,i).join("/")))return!1;return!0})}function Hc(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(Iv(t))return vv(e,t);let n=[];for(let r of["branch","staged","unstaged","untracked"]){let s=t.diffRows.filter(i=>i.group===r);s.length!==0&&(n.push({id:r,text:r.toUpperCase(),muted:!0}),n.push(...s.map(i=>Gh(i,e,t))))}return n}function Iv(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function vv(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 i=t.diffRows.filter(a=>a.path.startsWith(`${s}/`)),o=s.startsWith("repo_")?s.slice(5):s;n.push({id:`repo-diff:${s}`,text:o,muted:!0});for(let a of["branch","staged","unstaged","untracked"]){let l=i.filter(c=>c.group===a);l.length!==0&&(n.push({id:`repo-diff:${s}:${a}`,text:` ${a}`,muted:!0}),n.push(...l.map(c=>Gh(c,e,t,s.length+1))))}}return n}function Gh(e,t,n,r=0){let s=e.additions===null?"-":`+${e.additions}`,i=e.deletions===null?"-":`-${e.deletions}`,o=e.status==="A"||e.group==="untracked"?"9ece6a":e.status==="D"?"f7768e":"e0af68",a=r>0?e.path.slice(r):e.path;return{id:`${e.group}:${e.path}`,text:` ${e.status.padEnd(2," ")} ${a} ${s}/${i}`,selected:e.path===(t.selectedDiffPath??n.selectedDiffPath),focused:e.path===(t.selectedDiffPath??n.selectedDiffPath)&&t.focusedRegion==="inspector",color:o}}function Cv(e,t){return e?t?[{label:"Task",value:t.id},{label:"Repo",value:e.name},{label:"Agent",value:k.runners.getDisplayName(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:os.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 Av(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0})}function Ev(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function Hh(e,t,n,r,s=null){if(s)return Ov(e,t,n,r,s);let i=yc(e,t,{centerOnly:r});return xv(n,i)?{output:zi(i.rows,n.rows,i.row,i.column),region:i}:null}function Ov(e,t,n,r,s){let i=Em(e,t,s,{centerOnly:r});if(!i||!$v(n,i))return null;let o=n.rows.slice();return{output:i.rows.map(({index:l,row:c})=>o[l]===c?"":(o[l]=c,`\x1B[${i.row+l};${i.column}H${c}`)).join(""),region:{row:i.row,column:i.column,width:i.width,rows:o}}}function xv(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function $v(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function zh(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!Dv(o,a))return null;!o||!a||(s+=zi(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function Dv(e,t){return!e||!t?e===t:e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}var Nv=["tasks","center","inspector"];function _v(e,t,n){if(t==="ESCAPE")return E({state:{...e,fileSearchQuery:null},changed:!0});if(t==="BACKSPACE"||t==="DELETE"){let r=e.fileSearchQuery??"";return E({state:{...e,fileSearchQuery:r.slice(0,-1)},changed:!0})}if(t==="UP"||t==="k"||t==="DOWN"||t==="j")return Qc(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return ed({...e,fileSearchQuery:null},t,n);if(t.length===1&&t>=" "){let r=(e.fileSearchQuery??"")+t;return E({state:{...e,fileSearchQuery:r},changed:!0})}return E({state:e})}function ed(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return hm(t)?E({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):E({state:e});if(e.fileSearchQuery!==null)return _v(e,t,n);if(t==="/"&&e.focusedRegion==="inspector"&&e.inspectionMode==="files")return E({state:{...e,fileSearchQuery:""},changed:!0});if(t==="q"||t==="Q")return E({state:e,exit:!0});if(t==="ESCAPE")return E({state:{...e,actionMessage:null},changed:e.actionMessage!==null,pause:!0});if(t==="n"||t==="N")return E({state:{...e,focusedRegion:"tasks",actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0});if((t==="r"||t==="R")&&e.focusedRegion==="tasks"&&(Li(e.selectedLeftItemId)||Mi(e.selectedLeftItemId)))return E({state:{...e,selectedRunner:_i(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return Yh(e,1);if(t==="SHIFT_TAB"||t==="[")return Yh(e,-1);if(t==="z"||t==="Z")return E({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===K?Yt(e,-1,n):Qc(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===K?Yt(e,1,n):Qc(e,1,n);if(t==="PAGE_UP")return Yt(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return Yt(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return Yt(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return Yt(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??J,s=e.centerTabRunner?r.indexOf(e.centerTabRunner):-1,i=s===r.length-1?null:r[s+1];return E({state:{...e,centerTabRunner:i,actionMessage:null},changed:!0})}if((t==="+"||t==="a"||t==="A"||t==="t"||t==="T")&&e.focusedRegion==="center"&&e.selectedTaskId){let r=Uv(e,t);return E({state:{...e,preferredPtyTabKind:r,actionMessage:null},changed:!0,createPtyTab:!0,createPtyTabKind:r,createPtyTabRunner:r==="agent"?e.centerTabRunner:null})}if(t==="R"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0});if(t==="o"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review"&&e.selectedTaskId)return E({state:e,openPrUrl:!0});if(t==="X"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&ts(e.selectedLeftItemId)&&e.selectedTaskId)return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Tm(e.selectedLeftItemId)&&e.selectedWorkspaceId)return E({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&Qh(e.activeTab,n.ptyTabIds??[]))return E({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return Xc(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return Jh(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return Xc(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return Jh(e,1)}if(He(t)){if(e.focusedRegion==="tasks"&&(Li(e.selectedLeftItemId)||Mi(e.selectedLeftItemId))){let r=dc(e.selectedLeftItemId),s=uc(e.selectedLeftItemId);return E({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 E({state:{...e,actionMessage:null},changed:!0,openWorkspaceBrowser:!0});if(e.focusedRegion==="tasks"&&ts(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return E({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:er(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&Qh(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return E({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:er(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===K)return E({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 E({state:jv({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return E({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:K,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}if(e.focusedRegion==="inspector"&&e.inspectionMode==="review"){let r=e.selectedDiffPath??n.diffPathIds?.[0]??null;return r?E({state:{...e,selectedDiffPath:r,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!n.projectTargetIds?.length?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?E({state:e}):e.selectedActionId==="refresh-checks"?E({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return E({state:e})}function Yt(e,t,n){if(t===0)return E({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?Zh(e,t,n):e.inspectionMode==="review"?Xh(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):E({state:e});if(e.focusedRegion==="center"&&e.activeTab===K){if(e.openInspectionKind==="file")return Xh(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return Fv(e,t,n)}return E({state:e})}function Yh(e,t){return io(e,"focusedRegion",Nv,t)}function Xc(e,t,n){let r=io(e,"activeTab",n&&n.length>0?n:Kv(e),t);return!r.changed||ym(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:er(r.state.activeTab)??r.state.preferredPtyTabKind}}}function Qc(e,t,n){if(e.focusedRegion==="tasks")return Lv(e,t,n.leftItemIds);if(e.focusedRegion==="center")return Xc(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return Zh(e,t,n);if(n.projectTargetIds?.length){let s=Zc(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=Zc(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:io(e,"selectedActionId",dm,t)}return io(e,"selectedActionId",oc,t)}function Lv(e,t,n){let r=Zc(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=cc(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 i=dc(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=uc(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function Mv(e,t){if(e.inspectionMode===t)return E({state:e});let n=t==="files"?"file":e.openInspectionKind,r=t==="files"?K:e.activeTab;return E({state:{...e,inspectionMode:t,activeTab:r,openInspectionKind:n,fileScrollOffset:t==="files"?0:e.fileScrollOffset,reviewScrollOffset:t==="review"?0:e.reviewScrollOffset,actionMessage:null},changed:!0,refreshInspection:!0})}function Jh(e,t){return Mv(e,Bv(e.inspectionMode,ac,t))}function Zh(e,t,n){let r=n.fileTreeRowIds&&n.fileTreeRowIds.length>0?n.fileTreeRowIds:n.filePathIds??[];if(r.length===0)return E({state:e});let s=e.selectedFileTreePath??e.selectedFilePath??r[0]??null,i=r.indexOf(s??""),o=St(i===-1?0:i+t,0,r.length-1),a=r[o]??null;if(a===e.selectedFileTreePath)return E({state:e});let l=a!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(a);return E({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?K:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function jv(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 Xh(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=St(e[t]+n,0,i);return o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function Fv(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return qv(e,t,n);let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=e.diffScrollOffset+t,a=n.diffPathIds??[];if(a.length===0||!e.selectedDiffPath){let u=St(o,0,i);return u===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:u,actionMessage:null},changed:!0})}let l=a.indexOf(e.selectedDiffPath);if(l===-1){let u=St(o,0,i);return u===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:u,actionMessage:null},changed:!0})}if(t>0&&o>i){let u=a[l+1]??null;return u?E({state:{...e,selectedDiffPath:u,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===i?E({state:e}):E({state:{...e,diffScrollOffset:i,actionMessage:null},changed:!0})}if(t<0&&o<0){let u=a[l-1]??null;return u?E({state:{...e,selectedDiffPath:u,activeTab:K,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?E({state:e}):E({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let c=St(o,0,i);return c===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function qv(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=St(e.diffScrollOffset+t,0,i),a=Wv(n.diffPathRanges??[],o)??e.selectedDiffPath;return o===e.diffScrollOffset&&a===e.selectedDiffPath?E({state:e}):E({state:{...e,diffScrollOffset:o,selectedDiffPath:a,actionMessage:null},changed:!0})}function Wv(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function io(e,t,n,r){let s=n.indexOf(e[t]),i=St(s+r,0,n.length-1),o=n[i];return!o||o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function Zc(e,t,n,r,s=!1){if(n.length===0)return E({state:e});let i=n.indexOf(e[t]??n[0]??""),o=St(i===-1?0:i+r,0,n.length-1),a=n[o]??null;return a===e[t]?E({state:e}):E({state:{...e,[t]:a,actionMessage:null},changed:!0,refreshInspection:s})}function Bv(e,t,n){let r=t.indexOf(e);return t[St(r+n,0,t.length-1)]??e}function E(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,openPrUrl:e.openPrUrl??!1}}function Qh(e,t){return t.includes(e)}function Uv(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":er(e.activeTab)??e.preferredPtyTabKind}function Kv(e){return[e.selectedPtyTabId,e.openInspectionKind?K:null].filter(t=>typeof t=="string")}function St(e,t,n){return Math.min(n,Math.max(t,e))}var eg=async(e,t,n,r)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await r.queueTaskMutation(async()=>q(r.paths,e.selectedTaskId,i=>{let o=t??Vv(i,e.activeTab,e.preferredPtyTabKind),a=sg(i,o,n??void 0,r.config);return{...i,ptyTabs:[...i.ptyTabs,a],selectedPtyTabId:a.id}}));return{updatedTask:s,nextShell:{activeTab:s.selectedPtyTabId??e.activeTab,selectedPtyTabId:s.selectedPtyTabId,preferredPtyTabKind:s.ptyTabs.at(-1)?.kind??e.preferredPtyTabKind,focusedRegion:"center",actionMessage:`Created tab: ${s.ptyTabs.at(-1)?.title??"tab"}`}}},tg=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing a tab.");let{closedTab:n,nextSelectedTab:r}=await t.queueTaskMutation(async()=>{let s={closedTab:null,nextSelectedTab:null};if(await q(t.paths,e.selectedTaskId,i=>{let o=i.ptyTabs.findIndex(l=>l.id===e.activeTab);if(o===-1)throw new Error("Only PTY tabs can be closed.");s.closedTab=i.ptyTabs[o];let a=i.ptyTabs.filter(l=>l.id!==s.closedTab.id);return s.nextSelectedTab=a[Math.min(o,a.length-1)]??null,{...i,ptyTabs:a,selectedPtyTabId:s.nextSelectedTab?.id??null}}),!s.closedTab)throw new Error("Only PTY tabs can be closed.");return{closedTab:s.closedTab,nextSelectedTab:s.nextSelectedTab}});return{closedTab:n,nextSelectedTab:r,nextShell:{activeTab:r?.id??(e.openInspectionKind?"inspection":e.activeTab),selectedPtyTabId:r?.id??null,focusedRegion:"center",actionMessage:`Closed tab: ${n.title}`}}},ng=async(e,t)=>{let n=e.selectedTaskId;n&&await t.queueTaskMutation(async()=>{await q(t.paths,n,r=>!r.ptyTabs.some(s=>s.id===e.activeTab)||r.selectedPtyTabId===e.activeTab?r:{...r,selectedPtyTabId:e.activeTab})})},rg=async(e,t)=>{let n=e.ptyTabs.find(s=>s.kind==="agent")??null;if(n)return await t.queueTaskMutation(async()=>{await q(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:s})}),{...e,selectedPtyTabId:n.id};let r=sg(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await q(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:{...s,ptyTabs:[...s.ptyTabs,r],selectedPtyTabId:r.id}})}),{...e,ptyTabs:[...e.ptyTabs,r],selectedPtyTabId:r.id}};function Vv(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function sg(e,t,n,r={}){let s=n??e.runner,i=k.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(h=>h.id)),c=1,u=a;for(;l.has(u);)c+=1,u=`${a}-${c}`;let d=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:u,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,r):[],createdAt:d,updatedAt:d}}var sr=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},ig=async(e,t,n,r,s)=>{k.runners.assertEnabled(r,s.config);let i=t?await s.taskService.provisionProjectTask(s.paths,t,n,{runner:r,config:s.config}):await s.taskService.provisionTask(s.paths,e??"",n,{runner:r,config:s.config});k.previews.isEnabled(s.config,"agentOrchestration")&&await _t(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=sn();on(k.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",u=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new sr(c,u)}let o=await s.taskService.markTaskStarted(s.paths,i.task.id),a={selectedRepoId:o.repoId,selectedWorkspaceId:o.workspaceId,selectedTaskId:o.id,selectedPtyTabId:o.selectedPtyTabId,inputMode:"control",focusedRegion:"center",activeTab:o.selectedPtyTabId??"agent",selectedActionId:"commit"};return{task:o,nextShell:a}},og=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},ag=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing it.");let{taskBeforeClose:n,task:r}=await t.queueTaskMutation(async()=>{let s=await dr(t.paths,e.selectedTaskId),i=await t.taskService.closeTask(t.paths,e.selectedTaskId);return{taskBeforeClose:s,task:i}});return{closedTabIds:n.ptyTabs.map(s=>s.id),nextShell:{selectedActionId:"close-task",actionMessage:r.cleanup.preservedWorktree?`Archived task ${r.id}; worktree preserved`:`Archived task ${r.id}`}}},lg=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>dr(t.paths,n.id)))),as=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await it.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var cg=async(e,t)=>{if(!e.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");if((await t.taskService.listTasks(t.paths,{workspaceId:e.selectedWorkspaceId,includeClosed:!0})).tasks.length>0)throw new Error(`Cannot remove workspace ${e.selectedWorkspaceId} while task records still reference it.`);return await t.workspaceService.archiveWorkspace(t.paths,e.selectedWorkspaceId),{nextShell:{selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:`Removed workspace ${(await t.workspaceService.removeWorkspace(t.paths,e.selectedWorkspaceId,{listTasks:t.taskService.listTasks})).workspaceId}`}}};var dg=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},ug=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},pg=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var Gv=250;function Pt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function kn(e,t){return Rt(t,e.ptyRuntime.getViewState(ir(e,t)))}function ir(e,t){let n=Pt(e.model.tasks,t);return n?n.ptyTabs.some(r=>r.id===t.activeTab)?t.activeTab:t.activeTab==="agent"||t.activeTab==="terminal"?n.ptyTabs.find(r=>r.kind===t.activeTab)?.id??t.selectedPtyTabId:t.selectedPtyTabId:t.selectedPtyTabId}function S(e,t){return kn(e,bm(t,e.model))}function fg(e,t,n){return e.footerToastTimer&&(clearTimeout(e.footerToastTimer),e.footerToastTimer=null),n?(e.footerToastTimer=setTimeout(()=>{e.footerToastTimer=null,!(e.state.mode!=="main"||e.state.shell.footerToast!==n)&&(e.state={mode:"main",shell:S(e,{...e.state.shell,footerToast:null})},e.render())},600),{...t,footerToast:n}):{...t,footerToast:null}}function mg(e,t,n){return fg(e,t,n?{tone:"success",message:n}:null)}function ne(e,t,n){return fg(e,t,{tone:"error",message:n})}function re(e,t,n,r){let s=n instanceof Error?n.message:r,i=n instanceof Error?n.stack??n.message:String(n);return it.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function Z(e,t){if(!e.uiStateFile)return;e.runtimeState=fm(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>vt({uiStateFile:e.uiStateFile},n),()=>vt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function Hv(e,t){let n=e.taskMutationQueue.then(t,t);return e.taskMutationQueue=n.then(()=>{},()=>{}),n}function se(e){return{paths:e.paths,config:e.config,taskService:P,workspaceService:fe,queueTaskMutation:t=>Hv(e,t)}}function td(e,t){let n=Pt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?Jc(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:gn(e.model),centerTabIds:km(n,t),ptyTabIds:n?.ptyTabs.map(a=>a.id)??[],filePathIds:s?.filePaths??[],fileTreeRowIds:o.map(a=>a.path),fileTreeFileIds:o.filter(a=>a.kind==="file").map(a=>a.path),fileTreeDirectoryIds:o.filter(a=>a.kind==="directory").map(a=>a.path),diffPathIds:s?.diffPaths??[],diffPathRanges:[],fileLineCount:s?.selectedFile.lines.length??0,diffLineCount:s?.selectedDiff.lines.length??0,reviewRowCount:Uh(t,n,s),pageRows:Math.max(5,Oe(e.activeTerminal.width,e.activeTerminal.height).height-Q.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:n?.repoTargets?.map(a=>a.repoId)??[]}}async function hg(e,t){await ng(t,se(e))}async function ke(e){e.model=await tr(e.workspaceRoot,e.state.shell,e.enabledRunnerIds),e.state.mode==="main"?e.state={mode:"main",shell:S(e,e.state.shell)}:e.state={...e.state,shell:S(e,e.state.shell)}}function or(e,t){e.model={...e.model,tasks:[...e.model.tasks.filter(n=>n.id!==t.id),t].sort((n,r)=>n.id.localeCompare(r.id))}}async function oo(e,t){let n=++e.inspectionRefreshSequence,r=pc(e.model.tasks,t),s=e.model.inspection,i=t.focusedRegion==="inspector"&&t.inspectionMode==="review"&&t.openInspectionKind!=="diff",o;if(r&&s?.taskId===r.id&&!i){let a={selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath},l=await Qf(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await tr(e.workspaceRoot,t,e.enabledRunnerIds),n!==e.inspectionRefreshSequence)return;e.model=o,e.state.mode==="main"&&(e.state={mode:"main",shell:S(e,e.state.shell)},Z(e,e.state.shell),e.render())}function gg(e,t){e.pendingLeftNavInspectionShell=t,!e.leftNavInspectionTimer&&(e.leftNavInspectionTimer=setTimeout(()=>{e.leftNavInspectionTimer=null;let n=e.pendingLeftNavInspectionShell;e.pendingLeftNavInspectionShell=null,!(!n||e.state.mode!=="main"||e.state.shell!==n)&&oo(e,n).catch(r=>{let s=re(e,"refresh inspection",r,"Failed to refresh inspection.");e.state={mode:"main",shell:ne(e,S(e,{...e.state.shell,actionMessage:s}),s)},e.render()})},Gv))}function yg(e,t){t!==0&&(e.pendingInspectionScrollLines+=t,!e.inspectionScrollRenderTimer&&(e.inspectionScrollRenderTimer=setTimeout(()=>{e.inspectionScrollRenderTimer=null;let n=e.pendingInspectionScrollLines;if(e.pendingInspectionScrollLines=0,n===0||e.state.mode!=="main"||e.state.shell.inputMode!=="control")return;let r=Yt(e.state.shell,n,td(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:S(e,r.state)},Z(e,e.state.shell),e.render(),oo(e,e.state.shell).catch(s=>{let i=re(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ne(e,S(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:S(e,r.state)},Z(e,e.state.shell),e.render()}},16)))}function nd(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function rd(e){let t=e.model.tasks.flatMap(n=>n.ptyTabs.map(r=>r.id));await e.ptyRuntime.pruneStale?.(t),await e.ptyRuntime.hydrateSessions?.(t)}function kg(e){rd(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:S(e,e.state.shell)},e.render())})}async function Tg(e,t){let n=S(e,t),r=Pt(e.model.tasks,n),s=ir(e,n);if(!r||!s||!r.ptyTabs.some(a=>a.id===s))return n;let i=e.ptyRuntime.getViewState(s);if(i.status!=="idle"||i.rows.length>0||i.error)return Rt(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,Gt(Oe(e.activeTerminal.width,e.activeTerminal.height)));return Rt({...n,inputMode:"control"},o)}function sd(e){let t=e.state.mode==="main"&&e.state.shell.inputMode==="terminal"?"terminal":"control";t!==e.inputCaptureMode&&(e.inputCaptureMode=t,e.activeTerminal.grabInput(t==="terminal"?{mouse:"button"}:!0))}async function id(e,t){try{let n=S(e,t),r=Pt(e.model.tasks,n),s=n.selectedPtyTabId;if(r&&n.focusedRegion==="tasks"){let a=r.ptyTabs.find(l=>l.kind==="agent")??null;a?s=a.id:(r=await wg(e,r),await ke(e),s=r.selectedPtyTabId)}r&&!s&&(r=await wg(e,r),await ke(e),s=r.selectedPtyTabId);let i=S(e,{...n,activeTab:s??n.activeTab,selectedPtyTabId:s,focusedRegion:s?"center":n.focusedRegion});if(!i.selectedTaskId||!s){e.state={mode:"main",shell:i},e.render();return}e.state={mode:"main",shell:Rt({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},Z(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,Gt(Oe(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Ht(s),e.lastTerminalKey=null,e.state={mode:"main",shell:Rt({...i,inputMode:"terminal"},o)},Z(e,e.state.shell)}catch(n){let r=re(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&Ht(t.selectedPtyTabId)&&(await zv(e,t.selectedTaskId,r).catch(()=>{}),await ke(e).catch(()=>{})),e.state={mode:"main",shell:ne(e,mm(S(e,t),r),r)},Z(e,e.state.shell)}e.render()}async function zv(e,t,n){await og(t,n,se(e))}async function bg(e,t,n,r){let s=S(e,t),{nextShell:i}=await eg(s,n,r,se(e));return await ke(e),S(e,{...s,...i})}async function Rg(e,t){let n=S(e,t),{closedTab:r,nextShell:s}=await tg(n,se(e));return e.ptyRuntime.disposeSession(r.id),await ke(e),S(e,{...n,...s})}async function Sg(e,t){let n=S(e,t),r=gn(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await ag(n,se(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await ke(e),S(e,{...n,...o,selectedLeftItemId:Yv(r,gn(e.model),s)})}async function Pg(e,t){let n=S(e,t),{nextShell:r}=await cg(n,se(e));return await ke(e),S(e,{...n,...r})}async function wg(e,t){return rg(t,se(e))}function ao(e,t){e.pendingScrollLines+=t,!e.scrollRenderTimer&&(e.scrollRenderTimer=setTimeout(()=>{e.scrollRenderTimer=null;let n=e.pendingScrollLines;e.pendingScrollLines=0,n!==0&&(e.ptyRuntime.scrollViewport(n),e.state={mode:"main",shell:kn(e,e.state.shell)},e.render())},16))}function Yv(e,t,n){if(t.length===0)return null;for(let r=n-1;r>=0;r-=1){let s=e[r];if(s&&t.includes(s))return s}return t[Math.min(Math.max(0,n),t.length-1)]??null}async function vg(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=Ig(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await lg(s,se(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)or(e,o);t.recordSuccess(i,Ig(e)),e.state={mode:"main",shell:S(e,e.state.shell)},e.render()}catch(i){if(n?.aborted)return;t.recordFailure(s,i);let o=i instanceof Error?i.message:"Background PR discovery failed.";o!==e.lastBackgroundPrPollError&&(e.lastBackgroundPrPollError=o,as("background PR polling",i,se(e)))}}function Ig(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function Cg(e,t){let n=S(e,t),r=Pt(e.model.tasks,n),s=null,i=null;if(r?.type==="project"&&r.repoTargets?.length){let o=await P.prs.discoverOrRefreshAll(e.paths,n.selectedTaskId);await ke(e);let a=o.synced+o.discovered+o.notFound;i=`Refreshed ${o.synced}/${a} targets`}else{let{disposition:o,task:a}=await P.prs.discoverOrRefresh(e.paths,n.selectedTaskId);await ke(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${B(a)?.requiredChecks.length??0} reported`)}return S(e,{...mg(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import eC from"node:path";import{readdir as Jv,stat as Xv}from"node:fs/promises";import Ag from"node:path";async function Qv(e){let t=await Jv(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=Ag.join(e,r.name);n.push({name:r.name,path:s,kind:await Zv(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 Eg(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function Og(e){let{spawn:t}=await import("node:child_process"),n=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";await new Promise((r,s)=>{let i=t(n,[e],{stdio:"ignore",detached:!0});i.unref(),i.on("error",s),i.on("spawn",r)})}async function lo(e,t){let n=await Qv(t);e.state.mode==="main"&&(e.state={mode:"main",shell:S(e,{...e.state.shell,workspaceBrowser:n,activeTab:e.state.shell.selectedPtyTabId??e.state.shell.activeTab,actionMessage:null})},e.render())}async function Zv(e){let t=Ag.join(e,".git");return await Xv(t).catch(()=>null)!==null}function xg(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function $g(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function tC(e){if(e.state.mode!=="main"||e.creatingTask)return;let t=e.state.shell,n=t.taskPromptInput?.trim()??"";if(!t.selectedRepoId&&!t.selectedWorkspaceId){e.state={mode:"main",shell:S(e,{...t,taskPromptError:"Select a workspace first."})},e.render();return}if(n.length===0){e.state={mode:"main",shell:S(e,{...t,taskPromptError:"Task prompt cannot be empty."})},e.render();return}e.creatingTask=!0,e.state={mode:"main",shell:S(e,{...t,actionMessage:`Creating ${t.selectedRunner} task in ${t.selectedWorkspaceId??t.selectedRepoId}...`})},e.render();let r=null;try{let s=await ig(t.selectedRepoId,t.selectedWorkspaceId,n,t.selectedRunner,se(e));r=s.task,or(e,r);let i=S(e,{...e.state.shell,...s.nextShell,selectedLeftItemId:`task:${r.id}`,inputMode:"terminal",taskPromptInput:null,taskPromptError:null,actionMessage:null}),o=await e.ptyRuntime.ensureSession(r.id,i.selectedPtyTabId??Fm(r,"agent"),Gt(Oe(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Ht(i.selectedPtyTabId),e.state={mode:"main",shell:Rt(i,o)},Z(e,e.state.shell)}catch(s){s instanceof sr&&(r=s.task);let i=re(e,"create task",s,"Failed to create task.");r&&!(s instanceof sr)?(await q(e.paths,r.id,o=>({...o,status:"draft",runnerSession:{...o.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:i})).catch(()=>{}),await ke(e).catch(()=>{})):r&&(await q(e.paths,r.id,o=>({...o,lastFailureReason:i})).catch(()=>{}),await ke(e).catch(()=>{})),e.state={mode:"main",shell:ne(e,S(e,{...e.state.shell,inputMode:"control",selectedTaskId:r?.id??e.state.shell.selectedTaskId,selectedPtyTabId:r?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:r?`task:${r.id}`:e.state.shell.selectedLeftItemId,activeTab:r?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:r?null:"",taskPromptError:i,actionMessage:null}),i)}}finally{e.creatingTask=!1,e.render()}}function nC(e,t){if(e.state.mode!=="main")return;let n=e.state.shell;if(n.taskPromptInput!==null){if(t==="ESCAPE"){e.state={mode:"main",shell:S(e,{...n,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(He(t)){tC(e);return}if(t==="BACKSPACE"){e.state={mode:"main",shell:S(e,{...n,taskPromptInput:n.taskPromptInput.slice(0,-1),taskPromptError:null})},e.render();return}if(t==="CTRL_R"){e.state={mode:"main",shell:S(e,{...n,selectedRunner:_i(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}gm(t)&&(e.state={mode:"main",shell:S(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function rC(e,t){if(e.state.mode!=="main")return;let n=e.state.shell.workspaceBrowser;if(!n)return;if(t==="ESCAPE"){if(n.query!==null){e.state={mode:"main",shell:S(e,{...e.state.shell,workspaceBrowser:{...n,query:null,selectedIndex:0}})},e.render();return}e.state={mode:"main",shell:S(e,{...e.state.shell,workspaceBrowser:null,actionMessage:null})},e.render();return}if(t==="/"){e.state={mode:"main",shell:S(e,{...e.state.shell,workspaceBrowser:{...n,query:"",selectedIndex:0}})},e.render();return}if(n.query!==null&&(t==="BACKSPACE"||t==="DELETE")){let s=n.query.slice(0,-1);e.state={mode:"main",shell:S(e,{...e.state.shell,workspaceBrowser:{...n,query:s,selectedIndex:0}})},e.render();return}if(n.query!==null&&t.length===1&&t>=" "){let s=n.query+t;e.state={mode:"main",shell:S(e,{...e.state.shell,workspaceBrowser:{...n,query:s,selectedIndex:0}})},e.render();return}let r=Eg(n);if(t==="UP"||t==="k"){e.state={mode:"main",shell:S(e,{...e.state.shell,workspaceBrowser:{...n,selectedIndex:Math.max(0,n.selectedIndex-1),error:null}})},e.render();return}if(t==="DOWN"||t==="j"){e.state={mode:"main",shell:S(e,{...e.state.shell,workspaceBrowser:{...n,selectedIndex:Math.min(Math.max(0,r.length-1),n.selectedIndex+1),error:null}})},e.render();return}if(t==="LEFT"||t==="h"){lo(e,eC.dirname(n.cwd)).catch(s=>{let i=re(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:ne(e,S(e,{...e.state.shell,workspaceBrowser:{...n,error:i}}),i)},e.render()});return}if(t==="RIGHT"||t==="l"||He(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){lo(e,s.path).catch(o=>{let a=re(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:ne(e,S(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()});return}let{workspaceService:i}=se(e);i.addWorkspace(e.paths,s.path).then(async o=>{await ke(e);let a=o.repos[0]??null,l=S(e,{...e.state.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${o.workspace.id}`,selectedWorkspaceId:o.workspace.id,selectedRepoId:a?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${o.workspace.name??o.workspace.id}`});e.state={mode:"main",shell:l},Z(e,e.state.shell),e.render()}).catch(o=>{let a=re(e,"add workspace",o,"Failed to add workspace.");e.state={mode:"main",shell:ne(e,S(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()})}}function sC(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=Rh(e.state.menuIndex,t);if(n.kind!=="noop"){if(n.kind==="render"){e.state={...e.state,menuIndex:n.menuIndex},e.render();return}if(n.kind==="back"){e.state.parentVariant&&(e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render());return}if(n.kind==="help"){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell,viaOptions:!0,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}if(n.kind==="runners"){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"runners",menuIndex:0,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}if(n.kind==="previews"){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"previews",menuIndex:0,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}if(n.kind==="error-log"){let r=e.state.parentVariant;iC(e,r)}}}async function iC(e,t){let n;try{n=await it.readRecentErrorLines(e.paths)}catch(r){let s=re(e,"open error log",r,"Failed to read Craig error log.");n={path:e.paths.errorLogFile,lines:[`Unable to read error log: ${s}`],empty:!1}}e.state.mode==="overlay"&&(e.state={mode:"overlay",variant:"error-log",menuIndex:0,optionsMessage:null,shell:e.state.shell,errorLog:n,...t!==void 0?{parentVariant:t}:{}},e.pendingClear=!0,e.render())}function oC(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=Ph(xg(e),e.config,t,e.enabledRunnerIds);if(n.kind==="noop")return;if(n.kind==="back"){let s=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:0,optionsMessage:null,shell:e.state.shell,...s!==void 0?{parentVariant:s}:{}},e.pendingClear=!0,e.render();return}if(n.kind==="render"){e.state={...e.state,runnerOptions:n.state},e.render();return}(n.kind==="save-enabled"?dg(n.runner,n.enabled,se(e)):ug(n.runner,n.path,se(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:S(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),runnerOptions:n.state},e.render())}).catch(s=>{if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let i=re(e,"save runner option",s,"Failed to save runner option.");e.state={...e.state,shell:ne(e,S(e,e.state.shell),i),runnerOptions:{...xg(e),message:i}},e.render()})}function aC(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=Sh($g(e),e.config,t);if(n.kind!=="noop"){if(n.kind==="back"){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:1,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}if(n.kind==="render"){e.state={...e.state,previewOptions:n.state},e.render();return}pg(n.feature,n.enabled,se(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,n.feature==="agentActivityIndicators"&&e.setAgentActivityEnabled(n.enabled),e.state={...e.state,previewOptions:n.state},e.render())}).catch(r=>{if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let s=re(e,"save feature preview",r,"Failed to save feature preview.");e.state={...e.state,shell:ne(e,S(e,e.state.shell),s),previewOptions:{...$g(e),message:s}},e.render()})}}function Dg(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){nC(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){rC(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){cC(e),e.render();return}e.focusFlashUntil!==null&&(e.focusFlashUntil=null,e.focusFlashTimer&&(clearTimeout(e.focusFlashTimer),e.focusFlashTimer=null))}if(e.state.mode==="main"){let r=ed(e.state.shell,n,td(e,e.state.shell));if(r.exit){e.exit(0);return}if(r.detachTerminal){e.ptyRuntime.detach(),e.state={mode:"main",shell:S(e,r.state)},Z(e,e.state.shell),e.render();return}if(e.state.shell.inputMode==="terminal"){if(r.changed){e.state={mode:"main",shell:S(e,r.state)},Z(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&He(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=ss(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(lC(e,n))return;e.lastTerminalKey=qm(n)?{key:n,at:Date.now()}:null;let i=Wm(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){ao(e,i);return}e.ptyRuntime.writeKey(n);return}if(n==="CTRL_C"){e.exit(0);return}if(n==="?"&&e.state.shell.inputMode==="control"){e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render();return}if(r.pause){e.state={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:S(e,r.state)},e.pendingClear=!0,e.render();return}if(r.beginTaskPrompt){e.state={mode:"main",shell:S(e,r.state)},Z(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){lo(e,e.workspaceRoot).catch(s=>{let i=re(e,"browse workspaces",s,"Failed to browse workspaces.");e.state={mode:"main",shell:ne(e,S(e,{...r.state,workspaceBrowser:{cwd:e.workspaceRoot,entries:[],selectedIndex:0,query:null,error:i}}),i)},e.render()});return}if(r.createPtyTab){bg(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{id(e,s)}).catch(s=>{let i=re(e,"create PTY tab",s,"Failed to create tab.");e.state={mode:"main",shell:ne(e,S(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.closePtyTab){Rg(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=re(e,"close PTY tab",s,"Failed to close tab.");e.state={mode:"main",shell:ne(e,S(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.refreshPullRequestChecks){Cg(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=re(e,"refresh PR checks",s,"Failed to refresh PR checks.");e.state={mode:"main",shell:ne(e,S(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.openPrUrl){let s=Pt(e.model.tasks,r.state),i=s?B(s)?.url??null:null;i?Og(i).catch(o=>{let a=re(e,"open PR URL",o,"Failed to open PR in browser.");e.state={mode:"main",shell:ne(e,S(e,r.state),a)},e.render()}):(e.state={mode:"main",shell:ne(e,S(e,r.state),"No PR URL available.")},e.render());return}if(r.closeTask){Sg(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=re(e,"close task",s,"Failed to close task.");e.state={mode:"main",shell:ne(e,S(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.removeWorkspace){Pg(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=re(e,"remove workspace",s,"Failed to remove workspace.");e.state={mode:"main",shell:ne(e,S(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.attachTerminal){id(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:S(e,r.state)},Z(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){gg(e,e.state.shell);return}oo(e,e.state.shell).catch(s=>{let i=re(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ne(e,S(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}r.changed&&(e.state={mode:"main",shell:S(e,r.state)},hg(e,e.state.shell).catch(()=>{}),Z(e,e.state.shell),e.render());return}if(e.state.variant==="help"){e.state.viaOptions&&e.state.parentVariant?e.state={mode:"overlay",variant:"options",menuIndex:3,optionsMessage:null,shell:e.state.shell,parentVariant:e.state.parentVariant}:e.state.parentVariant?e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell}:e.state={mode:"main",shell:S(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){sC(e,n);return}if(e.state.variant==="runners"){oC(e,n);return}if(e.state.variant==="previews"){aC(e,n);return}if(e.state.variant==="error-log"){if(n==="ESCAPE"||He(n)){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:2,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render()}return}if(e.state.optionsMessage){(n==="ESCAPE"||He(n))&&(e.state={...e.state,optionsMessage:null},e.render());return}if(n==="UP"||n==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(n==="DOWN"||n==="j"){e.state={...e.state,menuIndex:Math.min(2,e.state.menuIndex+1)},e.render();return}if(n==="ESCAPE"){e.state.variant==="pause"&&(e.state={mode:"main",shell:S(e,e.state.shell)},e.pendingClear=!0,e.render());return}if(He(n)){if(e.state.menuIndex===0){let r=e.state.variant==="boot";e.state={mode:"main",shell:S(e,{...e.state.shell,inputMode:"control"})},e.pendingClear=!0,e.render(),r?e.bootHydrationReady.then(()=>{if(e.state.mode!=="main")return;let s=e.state.shell;Tg(e,s).then(i=>{e.state.mode!=="main"||e.state.shell!==s||(e.state={mode:"main",shell:i},Z(e,e.state.shell),e.render())}).catch(i=>{if(e.state.mode!=="main"||e.state.shell!==s)return;let o=re(e,"warm selected PTY",i,"Failed to start selected PTY.");e.state={mode:"main",shell:ne(e,S(e,e.state.shell),o)},Z(e,e.state.shell),e.render()})}):kg(e);return}if(e.state.menuIndex===1){let r=e.state.variant==="boot"||e.state.variant==="pause"?e.state.variant:void 0;e.state={mode:"overlay",variant:"options",menuIndex:0,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}e.exit(0)}}function Ng(e,t){let n=Gm(t);if(e.state.mode!=="main"||e.state.shell.inputMode!=="terminal"||n.length===0)return;if(e.pendingTerminalKeySequence){let i=`${e.pendingTerminalKeySequence.raw}${n}`,o=ss(i);if(o){Lg(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(Pc(i)){e.pendingTerminalKeySequence.raw=i,_g(e);return}co(e)}if(n.includes("")){e.ptyRuntime.detach(),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey=null,e.state={mode:"main",shell:S(e,{...e.state.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},Z(e,e.state.shell),e.render();return}let r=Bm(n);if(r!==0){ao(e,r);return}let s=ss(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
273
+ `&&n!==`\r
274
+ `&&(e.suppressTerminalEnterOnAttach=!1),Vm(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function lC(e,t){if(e.pendingTerminalKeySequence){let n=Um(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=ss(r);if(s)return Lg(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(Pc(r))return e.pendingTerminalKeySequence.raw=r,_g(e),!0}return co(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>co(e),30)},!0)}function _g(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>co(e),30))}function co(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function Lg(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function Mg(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){yg(e,Sc(t));return}let n=Sc(t);n!==0&&ao(e,n)}function cC(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var jg=1e3,uC=dC(import.meta.url),pC=uC("terminal-kit"),fC=pC.terminal;function od(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Fg(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function qg(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function mC(e,t){return e?e.tabId!==t.tabId?{tabId:t.tabId,kind:"full"}:e.kind==="full"||t.kind==="full"?{tabId:t.tabId,kind:"full"}:{tabId:t.tabId,kind:"rows",rowIndices:[...new Set([...e.rowIndices,...t.rowIndices])]}:t}async function Wg(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=Te(t),r=await k.load(n),s=k.runners.getEnabled(r),i=e.uiStateFile?await bn({uiStateFile:e.uiStateFile}):null,o=await tr(t,void 0,s),a=es(pm(i,r),o);o=await tr(t,a,s);let l={current:o},c=()=>{},u=()=>{},d=()=>{},p={workspaceRoot:t,onUpdate:f=>c(f),onActivity:f=>u(f),onActivityRemoved:f=>d(f),resolveSessionSpec:(f,m)=>jm(l.current,m,t)},h=e.ptyRuntime??await lh({...p,paths:n,activityEnabled:k.previews.isEnabled(r,"agentActivityIndicators")});return new Promise(f=>{let m=e.terminal??fC,g=null,T=null,R=null,I=null,b=null,x=0,$=!1,_=new Map,v=h.managesPullRequestSync?null:new rr({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,ue=new zt({resolutionMs:k.previews.isEnabled(r,"agentActivityIndicators")?no:jg,onError:(C,Y)=>as(`heartbeat job "${C}"`,Y,se(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:es(a,o)},get model(){return l.current},set model(C){l.current=C},config:r,enabledRunnerIds:s,creatingTask:!1,suppressTerminalEnterOnAttach:!1,lastTerminalKey:null,pendingScrollLines:0,pendingInspectionScrollLines:0,leftNavInspectionTimer:null,pendingLeftNavInspectionShell:null,pendingTerminalKeySequence:null,scrollRenderTimer:null,inspectionScrollRenderTimer:null,ptyRenderTimer:null,footerToastTimer:null,focusFlashUntil:null,focusFlashTimer:null,lastBackgroundPrPollError:null,versionText:`Craig v${k.version.getCurrent()}`,updateText:null,inspectionRefreshSequence:0,pendingClear:!0,inputCaptureMode:null,runtimeState:i,persistQueue:Promise.resolve(),taskMutationQueue:Promise.resolve(),bootHydrationReady:Promise.resolve(),paths:n,workspaceRoot:t,uiStateFile:e.uiStateFile,activeTerminal:m,ptyRuntime:h,resolve:f,render:()=>{},renderTaskNavigation:()=>!1,exit:C=>f(C),setAgentActivityEnabled:C=>{ue.setResolutionMs(C?no:jg),w.ptyRuntime.setActivityEnabled?.(C)}},w.setAgentActivityEnabled(k.previews.isEnabled(r,"agentActivityIndicators")),c=C=>{w.state.mode==="main"&&(b=mC(b,C),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let Y=b;if(b=null,w.state.mode==="main"){let oe=kn(w,w.state.shell);if(w.state={mode:"main",shell:oe},!I||!T){w.render();return}let xe=Oe(m.width,m.height),ge={...I,terminal:oe.terminal},It=Hh(xe,ge,T,oe.centerZoomed,Y?.kind==="rows"?Y.rowIndices:null);if(!It){w.render();return}It.output.length>0&&m.noFormat(It.output),I=ge,T=It.region,R&&(R={...R,center:It.region}),g=null,m.hideCursor(!0)}},0)))},u=C=>{w.state.mode==="main"&&k.previews.isEnabled(w.config,"agentActivityIndicators")&&Ht(C.tabId)&&_.get(C.tabId)!==pt(C.tabId,[C],Date.now())&&w.render()},d=C=>{w.state.mode==="main"&&k.previews.isEnabled(w.config,"agentActivityIndicators")&&Ht(C)&&_.get(C)!=="idle"&&w.render()};let pe=Promise.resolve(),z=C=>{pe=pe.then(async()=>{let Y=await Promise.all([...new Set(C)].map(oe=>P.getTask(w.paths,oe)));for(let oe of Y)or(w,oe);w.state.mode==="main"?w.state={mode:"main",shell:S(w,w.state.shell)}:w.state={...w.state,shell:S(w,w.state.shell)},w.render()}).catch(Y=>as("daemon task-state refresh",Y,se(w)))};w.ptyRuntime.setTasksChangedHandler?.(z);let Jt=C=>{let Y=Oe(m.width,m.height),oe=k.previews.isEnabled(w.config,"agentActivityIndicators"),xe=oe?w.ptyRuntime.getActivitySnapshots?.()??[]:[],ge=Date.now(),It=Lh(S(w,C.shell),w.model,oe?{snapshots:xe,now:ge,animationFrame:x}:void 0);if(_.clear(),oe)for(let Kg of w.model.tasks)for(let uo of Kg.ptyTabs)uo.kind==="agent"&&_.set(uo.id,pt(uo.id,xe,ge));let Ug=Am(Y,It,{centerOnly:C.shell.centerZoomed,focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:It,presentation:Ug}},ls=(C,Y,oe,xe)=>{if(!R)return!1;let ge=zh(R,Y.regions,oe);return ge?(ge.output.length>0&&m.noFormat(ge.output),I=C,R=ge.regions,T=ge.regions.center,g=xe?Y.frame:null,m.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;sd(w),w.ptyRuntime.setPullRequestPollView?.(qg(w.state)),w.ptyRuntime.setViewedTab?.(ir(w,w.state.shell));let{data:C,presentation:Y}=Jt(w.state);return ls(C,Y,["rail","left","center","footer"],!1)},w.render=()=>{sd(w);let C=w.state;w.ptyRuntime.setPullRequestPollView?.(qg(C)),w.ptyRuntime.setViewedTab?.(C.mode==="main"?ir(w,C.shell):null);let Y=Oe(m.width,m.height),oe,xe=null;if(C.mode==="main"){let ge=Jt(C);if(xe=ge.presentation,oe=xe.frame,!w.pendingClear&&ls(ge.data,xe,["rail","left","center","right","footer"],!0))return;I=ge.data,T=xe.center}else oe=C.variant==="boot"?Pm(Y,{menuIndex:C.menuIndex,optionsMessage:C.optionsMessage,versionText:w.versionText,updateText:w.updateText}):C.variant==="pause"?Im(Y,{menuIndex:C.menuIndex,optionsMessage:C.optionsMessage,versionText:w.versionText,updateText:w.updateText}):C.variant==="options"?Vi(Y,{menuIndex:C.menuIndex,optionsMenuItems:jc}):C.variant==="runners"?Vi(Y,{menuIndex:od(C).menuIndex,optionsMenuItems:Fc(w.config,od(C)),optionsMessage:kh(od(C)),optionsSubtitle:"Runners"}):C.variant==="previews"?Vi(Y,{menuIndex:Fg(C).menuIndex,optionsMenuItems:Th(w.config),optionsMessage:bh(Fg(C)),optionsSubtitle:"Feature Previews - Experimental"}):C.variant==="error-log"?Cm(Y,{errorLogPath:C.errorLog?.path??n.errorLogFile,errorLogLines:C.errorLog?.lines??[]}):vm(Y),I=null,T=null,R=null;w.pendingClear&&(m.moveTo(1,1),m.eraseDisplayBelow(),w.pendingClear=!1,g=null),m.noFormat(Hm(oe,g)),g=oe,R=xe?.regions??null,m.hideCursor(!0)};let cs=C=>Dg(w,C),ad=C=>Ng(w,C),ld=C=>Mg(w,C),Bg=()=>{process.stdout.off("resize",cd),process.off("SIGCONT",dd),m.removeListener("key",cs),m.removeListener("unknown",ad),m.removeListener("mouse",ld),w.scrollRenderTimer&&(clearTimeout(w.scrollRenderTimer),w.scrollRenderTimer=null),w.inspectionScrollRenderTimer&&(clearTimeout(w.inspectionScrollRenderTimer),w.inspectionScrollRenderTimer=null),w.leftNavInspectionTimer&&(clearTimeout(w.leftNavInspectionTimer),w.leftNavInspectionTimer=null),w.pendingTerminalKeySequence&&(clearTimeout(w.pendingTerminalKeySequence.timer),w.pendingTerminalKeySequence=null),w.ptyRenderTimer&&(clearTimeout(w.ptyRenderTimer),w.ptyRenderTimer=null),w.footerToastTimer&&(clearTimeout(w.footerToastTimer),w.footerToastTimer=null),w.focusFlashTimer&&(clearTimeout(w.focusFlashTimer),w.focusFlashTimer=null),ue.stop(),w.ptyRuntime.disposeAll(),m.grabInput(!1),m.hideCursor(!1),m.fullscreen(!1)};w.exit=C=>{Bg(),f(C)};let cd=()=>{nd(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Gt(Oe(m.width,m.height))),w.state={mode:"main",shell:kn(w,w.state.shell)}),w.render()},dd=()=>{nd(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Gt(Oe(m.width,m.height))),w.state={mode:"main",shell:kn(w,w.state.shell)}),w.render()};process.stdout.on("resize",cd),process.on("SIGCONT",dd),m.grabInput(!0),w.inputCaptureMode="control",m.hideCursor(!0),m.fullscreen(!0),m.on("key",cs),m.on("unknown",ad),m.on("mouse",ld),v&&ue.register({id:"github.pull-requests",intervalMs:1e3,run:C=>vg(w,v,C)}),ue.register({id:"agent.activity-indicators",intervalMs:no,run:()=>{if(!k.previews.isEnabled(w.config,"agentActivityIndicators")){x=0,$=!1;return}let C=Date.now(),Y=Ls(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],C);(Y||$)&&(x=(x+1)%$h,w.state.mode==="main"&&w.render()),$=Y}}),ue.start(),k.version.checkForUpdate().then(C=>{C.updateAvailable&&C.latest&&(w.updateText=`Update available: v${C.latest}`,w.render())}),w.bootHydrationReady=rd(w).catch(()=>{}),w.render()})}async function hC(){try{if(process.argv[2]==="__craig-daemon"){let e=process.argv[3]??process.cwd(),t=Te(e);return await ch(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=process.argv[3]??process.cwd(),t=Te(e);return await dh(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
275
+ `),1}return Yf({argv:process.argv.slice(2),cwd:process.cwd(),env:process.env,isInputTty:process.stdin.isTTY===!0,isOutputTty:process.stdout.isTTY===!0,writeStdout:e=>process.stdout.write(e),writeStderr:e=>process.stderr.write(e),readStdin:async()=>{let e="";process.stdin.setEncoding("utf8");for await(let t of process.stdin)e+=t;return e},runInteractive:e=>Wg({uiStateFile:Te(e).uiStateFile,workspaceRoot:e})})}var gC=await hC();process.exit(gC);