craig-cli 0.13.1 → 0.13.3

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 +41 -1
  2. package/dist/cli.js +213 -71
  3. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -1,25 +1,25 @@
1
1
  #!/usr/bin/env node
2
- var Xp=Object.defineProperty;var Lr=(e,t)=>{for(var r in t)Xp(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 im}from"node:fs/promises";import{randomUUID as Qp}from"node:crypto";import{chmod as Zp,open as em,readFile as tm,rename as rm,rm as nm}from"node:fs/promises";import ts from"node:path";async function O(e,t,r={}){let n=ts.dirname(e),s=ts.join(n,`.${ts.basename(e)}.${process.pid}.${Date.now()}.${Qp()}.tmp`),i=await em(s,"w",r.mode);try{let o=`${JSON.stringify(t,null,2)}
3
- `;await i.writeFile(o,"utf8"),await i.sync(),await i.close(),await rm(s,e),r.mode!==void 0&&await Zp(e,r.mode)}catch(o){throw await i.close().catch(()=>{}),await nm(s,{force:!0}).catch(()=>{}),o}}async function _r(e){try{let t=await tm(e,"utf8");return JSON.parse(t)}catch(t){if(sm(t))return null;throw t}}function sm(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}async function It(e){try{let t=await im(e.uiStateFile,"utf8"),r=JSON.parse(t);return om(r,e.uiStateFile)}catch(t){if(lm(t))return null;throw t}}async function Ue(e,t){await O(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function Fr(){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 om(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")||!vt(e,"inputMode")||!vt(e,"focusedRegion")||!vt(e,"activeTab")||!vt(e,"inspectorSection")||!vt(e,"inspectionMode")||!jr(e,"openInspectionKind")||!jr(e,"selectedFileTreePath")||!jr(e,"selectedFilePath")||!jr(e,"selectedDiffPath")||!am(e,"collapsedFileTreePaths")||!vt(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 vt(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function jr(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function am(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(r=>typeof r=="string"))}function lm(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var rs={};Lr(rs,{RUNNER_IDS:()=>j,assertEnabled:()=>Ta,buildCommand:()=>Pa,getConfiguredProfile:()=>Wr,getDefault:()=>ya,getDisplayName:()=>ba,getEnabled:()=>qr,getProfile:()=>Ct,isRunnerType:()=>Ur,parse:()=>Ra,setRunnerEnabled:()=>Sa,setRunnerPath:()=>va});var j=["codex","cursor","claude"];var ka={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 Ct=e=>ka[e];var Wr=(e,t={})=>{let r=Ct(e),n=t.runners?.[e]?.path?.trim();return{...r,executable:n&&n.length>0?n:r.executable}};var qr=(e={})=>j.filter(t=>e.runners?.[t]?.enabled!==!1);var ya=(e={})=>{let t=qr(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 Ta=(e,t={})=>{if(t.runners?.[e]?.enabled===!1)throw new Error(`Runner "${e}" is disabled in .craig/config.json.`)};var Ur=e=>j.includes(e);var Ra=e=>{if(!e||e.length===0)return"codex";if(!Ur(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${j.join(", ")}.`);return e};var ba=e=>Ct(e).displayName;var Pa=(e,t,r={})=>{let n=[Wr(e,r).executable];return t&&t.length>0&&n.push(t),n};var Sa=(e,t,r)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:r}}});var va=(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 ns={};Lr(ns,{PREVIEW_FEATURE_IDS:()=>ge,isEnabled:()=>Ia,setEnabled:()=>Ca});var ge=["agentActivityIndicators","agentOrchestration"];function Ia(e,t){return e.previews?.[t]===!0}function Ca(e,t,r){return{...e,previews:{...e.previews,[t]:r}}}import{mkdir as cm,readFile as dm,writeFile as um}from"node:fs/promises";import pm from"node:path";var mm=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Aa=async e=>{try{return await dm(e,"utf8")}catch(t){if(mm(t))return null;throw t}},Ea=async(e,t)=>{await cm(pm.dirname(e),{recursive:!0}),await um(e,t,"utf8")};var Br=(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(!j.includes(n))throw new Error(`Craig config at ${t} is invalid. "runners.${n}" 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.${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 ss=async(e,t={readConfigFile:Aa})=>{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 Br(n,e.configFile)};var is=async(e,t,r={writeConfigFile:Ea})=>{Br(t,e.configFile),await r.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
4
- `)};var os={};Lr(os,{checkForUpdate:()=>xa,getCurrent:()=>Vr});var Vr=()=>{try{return"0.13.1"}catch{return"unknown"}};var fm="https://registry.npmjs.org/craig-cli/latest",gm=3600*1e3,hm={value:null},wm=(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},xa=async(e={fetch:globalThis.fetch,getCurrent:Vr,cache:hm})=>{let t=e.getCurrent(),r=Date.now();if(e.cache.value&&r-e.cache.value.cachedAt<gm)return e.cache.value.result;let n=null;try{let i=await e.fetch(fm,{signal:AbortSignal.timeout(5e3)});i.ok&&(n=(await i.json()).version??null)}catch{}let s={current:t,latest:n,updateAvailable:n!==null&&n!==t&&wm(n,t)};return e.cache.value={result:s,cachedAt:r},s};var k={load:ss,save:is,previews:ns,runners:rs,version:os};var Da={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,PARTIAL_RESULT:7,INTERNAL_ERROR:1},m=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=Da[t],this.retryable=n.retryable??!1,this.details=n.details??{}}};function as(e){return e instanceof m?e:new m("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as km,mkdir as ym,readFile as Tm}from"node:fs/promises";import Rm from"node:path";var Oa=80,ls=async(e,t)=>{await ym(Rm.dirname(e.errorLogFile),{recursive:!0}),await km(e.errorLogFile,bm(t),"utf8")},$a=async(e,t)=>{try{await ls(e,t)}catch{}},cs=async(e,t=Oa)=>{try{let n=(await Tm(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(Pm(r))return{path:e.errorLogFile,lines:[],empty:!0};throw r}},Na=async(e,t=Oa)=>cs(e,t);function bm(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 Xy=Object.defineProperty;var Fs=(e,t)=>{for(var n in t)Xy(e,n,{get:t[n],enumerable:!0})};import{realpath as pE}from"node:fs/promises";import fe from"node:path";function Ie(e){let t=fe.join(e,".craig");return{workspaceRoot:e,repoRoot:e,craigDir:t,indexFile:fe.join(t,"index.json"),reposDir:fe.join(t,"repos"),workspacesDir:fe.join(t,"workspaces"),sessionsDir:fe.join(t,"sessions"),runtimeDir:fe.join(t,"runtime"),uiStateFile:fe.join(t,"runtime","ui-state.json"),tasksDir:fe.join(t,"tasks"),jobsDir:fe.join(t,"jobs"),commandsDir:fe.join(t,"commands"),eventsDir:fe.join(t,"events"),orchestrationDir:fe.join(t,"orchestration"),logsDir:fe.join(t,"logs"),errorLogFile:fe.join(t,"logs","errors.log"),artifactsDir:fe.join(t,"artifacts"),worktreesDir:fe.join(t,"worktrees"),configFile:fe.join(t,"config.json")}}import Vc from"node:path";import{readFile as iI}from"node:fs/promises";import{readFile as iw}from"node:fs/promises";import{randomUUID as Qy}from"node:crypto";import{chmod as Zy,open as ew,readFile as tw,rename as nw,rm as rw}from"node:fs/promises";import Vo from"node:path";async function M(e,t,n={}){let r=Vo.dirname(e),s=Vo.join(r,`.${Vo.basename(e)}.${process.pid}.${Date.now()}.${Qy()}.tmp`),i=await ew(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 nw(s,e),n.mode!==void 0&&await Zy(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await rw(s,{force:!0}).catch(()=>{}),o}}async function Ls(e){try{let t=await tw(e,"utf8");return JSON.parse(t)}catch(t){if(sw(t))return null;throw t}}function sw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}async function Un(e){try{let t=await iw(e.uiStateFile,"utf8"),n=JSON.parse(t);return ow(n,e.uiStateFile)}catch(t){if(lw(t))return null;throw t}}async function jt(e,t){await M(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function js(){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 ow(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")||!qn(e,"inputMode")||!qn(e,"focusedRegion")||!qn(e,"activeTab")||!qn(e,"inspectorSection")||!qn(e,"inspectionMode")||!Ms(e,"openInspectionKind")||!Ms(e,"selectedFileTreePath")||!Ms(e,"selectedFilePath")||!Ms(e,"selectedDiffPath")||!aw(e,"collapsedFileTreePaths")||!qn(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 qn(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function Ms(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function aw(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function lw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var Ko={};Fs(Ko,{RUNNER_IDS:()=>J,assertEnabled:()=>ed,buildCommand:()=>rd,getConfiguredProfile:()=>qs,getDefault:()=>Zu,getDisplayName:()=>nd,getEnabled:()=>Us,getProfile:()=>Wn,isRunnerType:()=>Ws,parse:()=>td,setRunnerEnabled:()=>sd,setRunnerPath:()=>id});var J=["codex","cursor","claude"];var Qu={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 Wn=e=>Qu[e];var qs=(e,t={})=>{let n=Wn(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}};var Us=(e={})=>J.filter(t=>e.runners?.[t]?.enabled!==!1);var Zu=(e={})=>{let t=Us(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 ed=(e,t={})=>{if(t.runners?.[e]?.enabled===!1)throw new Error(`Runner "${e}" is disabled in .craig/config.json.`)};var Ws=e=>J.includes(e);var td=e=>{if(!e||e.length===0)return"codex";if(!Ws(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${J.join(", ")}.`);return e};var nd=e=>Wn(e).displayName;var rd=(e,t,n={})=>{let r=[qs(e,n).executable];return t&&t.length>0&&r.push(t),r};var sd=(e,t,n)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}});var id=(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 Go={};Fs(Go,{PREVIEW_FEATURE_IDS:()=>ze,isEnabled:()=>od,setEnabled:()=>ad});var ze=["agentActivityIndicators","agentOrchestration"];function od(e,t){return e.previews?.[t]===!0}function ad(e,t,n){return{...e,previews:{...e.previews,[t]:n}}}import{mkdir as cw,readFile as uw,writeFile as dw}from"node:fs/promises";import pw from"node:path";var fw=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",ld=async e=>{try{return await uw(e,"utf8")}catch(t){if(fw(t))return null;throw t}},cd=async(e,t)=>{await cw(pw.dirname(e),{recursive:!0}),await dw(e,t,"utf8")};var Bs=(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"&&!ze.includes(r))throw new Error(`Craig config at ${t} is invalid. "previews.${r}" is not supported. Expected one of: ${ze.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:ld})=>{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 Bs(r,e.configFile)};var Yo=async(e,t,n={writeConfigFile:cd})=>{Bs(t,e.configFile),await n.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
4
+ `)};var zo={};Fs(zo,{checkForUpdate:()=>ud,getCurrent:()=>Vs});var Vs=()=>{try{return"0.13.3"}catch{return"unknown"}};var mw="https://registry.npmjs.org/craig-cli/latest",hw=3600*1e3,gw={value:null},yw=(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},ud=async(e={fetch:globalThis.fetch,getCurrent:Vs,cache:gw})=>{let t=e.getCurrent(),n=Date.now();if(e.cache.value&&n-e.cache.value.cachedAt<hw)return e.cache.value.result;let r=null;try{let i=await e.fetch(mw,{signal:AbortSignal.timeout(5e3)});i.ok&&(r=(await i.json()).version??null)}catch{}let s={current:t,latest:r,updateAvailable:r!==null&&r!==t&&yw(r,t)};return e.cache.value={result:s,cachedAt:n},s};var k={load:Ho,save:Yo,previews:Go,runners:Ko,version:zo};var dd={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,FURY_DEFINITION_INVALID:2,FURY_INPUT_INVALID:2,FURY_PLAN_NOT_FOUND:3,FURY_APPROVAL_REQUIRED:4,FURY_RUN_NOT_FOUND:3,FURY_REVIEW_NOT_FOUND:3,FURY_RECORD_INVALID:2,FURY_STATE_CONFLICT:4,FURY_OUTPUT_INVALID:4,PARTIAL_RESULT:7,INTERNAL_ERROR:1},g=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=dd[t],this.retryable=r.retryable??!1,this.details=r.details??{}}};function Jo(e){return e instanceof g?e:new g("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as ww,mkdir as kw,readFile as Tw}from"node:fs/promises";import bw from"node:path";var pd=80,Xo=async(e,t)=>{await kw(bw.dirname(e.errorLogFile),{recursive:!0}),await ww(e.errorLogFile,Rw(t),"utf8")},fd=async(e,t)=>{try{await Xo(e,t)}catch{}},Qo=async(e,t=pd)=>{try{let r=(await Tw(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(Sw(n))return{path:e.errorLogFile,lines:[],empty:!0};throw n}},md=async(e,t=pd)=>Qo(e,t);function Rw(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 Pm(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var Se={appendErrorLog:ls,appendErrorLogBestEffort:$a,readErrorLog:cs,readRecentErrorLines:Na};function Wa(e){let{commandTokens:t,options:r,help:n}=vm(e);if(n)return La({kind:"help"},r);if(t.length===0)return{mode:"interactive",options:r};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":Qt(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:ja(o,"Repo path")};break;case"repo:list":Qt(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:J(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:ja(o,"Workspace path")};break;case"workspace:list":a=Im(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:J(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:J(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:J(o,"Workspace id")};break;case"task:new":a=Am(o);break;case"task:create-child":a=Em(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:J(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:J(o,"Task id")}};break;case"task:list":a=Cm(o);break;case"task:current":Qt(o,"task current"),a={kind:"currentTask"};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:J(o,"Task id")};break;case"task:pr":a=xm(o);break;case"task:wait":a=_m(o);break;case"agent:list":Qt(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=$m(o);break;case"agent:send":a=Nm(o);break;case"command:show":a={kind:"showPromptCommand",commandId:J(o,"Command id")};break;case"command:list":Qt(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:J(o,"Command id")};break;case"command:wait":a=Mm(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:J(o,"Task id")};break;case"task:logs":a={kind:"streamTaskLogs",taskId:J(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:J(o,"Task id")};break;case"task:focus":a={kind:"focusTask",taskId:J(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:J(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:J(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:J(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:Fa(o,0,"Task id"),repoId:Fa(o,1,"Repo id")},Ua(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:J(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 La(a,r)}function qa(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 Sm(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",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 ds(){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 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 vm(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||!_a(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==="--"||_a(c))throw S(`Global option ${l} requires a value.`);a+=1,l==="--workspace-root"?n.workspaceRoot=_(c,"Workspace root"):n.taskId=_(c,"Task id")}return{commandTokens:r,options:n,help:i}}function Im(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 Cm(e){if(e.length===0)return{kind:"listTasks"};if(e.length===2&&e[0]==="--repo")return{kind:"listTasks",repoId:_(e[1],"Repo id")};throw S(`Unsupported command: task list ${e.join(" ")}`)}function Am(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=_(c,"Repo id")}else if(l==="--workspace"){if(r!==void 0)throw S("Task option --workspace may only be provided once.");r=_(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=_(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...r?{workspaceId:r}:{},...n?{runner:n}:{},prompt:o}}function Em(e){let t,r,n,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 S(`Unsupported task create-child option: ${l}`);i.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==="--parent"){if(t)throw S("Task option --parent may only be provided once.");t=_(c,"Parent task id")}else if(l==="--repo"){if(r)throw S("Task option --repo may only be provided once.");r=_(c,"Repo id")}else if(l==="--runner"){if(n)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.")}}else{if(s)throw S("Task option --idempotency-key may only be provided once.");s=_(c,"Idempotency key")}}if(!r)throw S("Child task creation requires '--repo <repo-id>'.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},repoId:r,prompt:_(i.join(" "),"Child task prompt"),...n?{runner:n}:{},...s?{idempotencyKey:s}:{}}}function xm(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=_(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=_(c,"Repo id")}else{if(i!==void 0)throw S("Task PR option --pr may only be provided once.");i=_(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 us=300*1e3,Dm=new Set(["idle","working","ready","error"]),Om=new Set(["queued","delivering","delivered","failed","cancelled"]);function $m(e){if(e.length===0)return{kind:"showAgentStatus"};if(e.length===2&&e[0]==="--tab")return{kind:"showAgentStatus",tabId:_(e[1],"Agent tab id")};throw S(`Unsupported command: agent status ${e.join(" ")}`)}function Nm(e){let t,r,n="when-ready",s=us,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:_(c,"Prompt")}:{source:"file",path:_(c,"Prompt file")}}else if(l==="--tab")r=_(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=ps(c):i=_(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 Mm(e){let t=_(e[0]??"","Command id"),r,n=us,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=Lm(a):n=ps(a)}return{kind:"waitPromptCommand",commandId:t,...r?{states:r}:{},timeoutMs:n}}function Lm(e){let t=e.split(",").map(r=>r.trim()).filter(Boolean);if(t.length===0||t.some(r=>!Om.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=_(c,"Event type glob");else if(l==="--after")n=_(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 _m(e){let t,r,n,s=us,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=_(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=jm(l):a==="--tab"?n=_(l,"Agent tab id"):s=ps(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 jm(e){let t=e.split(",").map(r=>r.trim()).filter(Boolean);if(t.length===0||t.some(r=>!Dm.has(r)))throw S(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function ps(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 La(e,t){return{mode:"command",command:e,commandName:Sm(e),options:t}}function _a(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function Qt(e,t){Ua(e,0,t)}function Ua(e,t,r){if(e.length!==t)throw S(`Command ${r} received an unexpected number of arguments.`)}function J(e,t){if(e.length!==1)throw S(`${t} is required and must be provided once.`);return _(e[0],t)}function ja(e,t){return _(e.join(" "),t)}function Fa(e,t,r){return _(e[t]??"",r)}function _(e,t){let r=e.trim();if(r.length===0)throw S(`${t} cannot be empty.`);return r}function S(e){return new m("CLI_USAGE",`${e}
9
+ `}function Sw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var kt={appendErrorLog:Xo,appendErrorLogBestEffort:fd,readErrorLog:Qo,readRecentErrorLines:md};function Td(e){let{commandTokens:t,options:n,help:r}=Iw(e);if(r)return gd({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":Er(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:wd(o,"Repo path")};break;case"repo:list":Er(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:X(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:wd(o,"Workspace path")};break;case"workspace:list":a=vw(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:X(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:X(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:X(o,"Workspace id")};break;case"task:new":a=Aw(o);break;case"task:create-child":a=Ew(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:X(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:X(o,"Task id")}};break;case"task:list":a=Cw(o);break;case"task:current":Er(o,"task current"),a={kind:"currentTask"};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:X(o,"Task id")};break;case"task:pr":a=Ow(o);break;case"task:wait":a=Lw(o);break;case"agent:list":Er(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=Nw(o);break;case"agent:send":a=_w(o);break;case"command:show":a={kind:"showPromptCommand",commandId:X(o,"Command id")};break;case"command:list":Er(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:X(o,"Command id")};break;case"command:wait":a=xw(o);break;case"events:list":a=hd(o,!1);break;case"events:watch":a=hd(o,!0);break;case"fury:validate":a={kind:"validateFury",file:X(o,"Fury file")};break;case"fury:plan":a=Mw(o);break;case"fury:approve":a={kind:"approveFury",planId:X(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:X(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:X(o,"Fury run id")};break;case"fury:watch":a=jw(o);break;case"fury:cancel":a={kind:"cancelFury",runId:X(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:X(o,"Fury run id")};break;case"fury:step":a=qw(o);break;case"fury:reviews":a=Uw(o);break;case"fury:review":a=Ww(o);break;case"task:attach":a={kind:"attachTask",taskId:X(o,"Task id")};break;case"task:logs":a={kind:"streamTaskLogs",taskId:X(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:X(o,"Task id")};break;case"task:focus":a={kind:"focusTask",taskId:X(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:X(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:X(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:X(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:kd(o,0,"Task id"),repoId:kd(o,1,"Repo id")},ra(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:X(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw P(`Unsupported command: ${t.join(" ")}`)}return gd(a,n)}function bd(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 Pw(e){return e.kind==="actFuryReview"?`fury.review.${e.action==="request_changes"?"request-changes":e.action}`:{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",validateFury:"fury.validate",planFury:"fury.plan",approveFury:"fury.approve",runFury:"fury.run",showFury:"fury.status",watchFury:"fury.watch",cancelFury:"fury.cancel",resumeFury:"fury.resume",completeFuryStep:"fury.step.complete",failFuryStep:"fury.step.fail",listFuryReviews:"fury.reviews.list",showFuryReview:"fury.review.show",actFuryReview:"fury.review.action",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 Zo(){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 fury validate <file> Validate a versioned fury YAML definition"," craig fury plan <file> [--root-task <id>] [--input key=value] Create an immutable approval plan"," craig fury approve <plan-id> Approve an exact validated plan (human only)"," craig fury run <plan-id> Start the single run authorized by an approved plan"," craig fury status|watch|cancel|resume <run-id> Inspect or control a durable run"," craig fury step complete|fail --run <run-id> --step <step-id> Explicitly finish agent work"," craig fury reviews list [--run <run-id>] [--state <state>] List human checkpoints"," craig fury review show|approve|reject|request-changes|resubmit <review-id>"," 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 Iw(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||!yd(l)){n.push(l);continue}if(s.has(l))throw P(`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==="--"||yd(c))throw P(`Global option ${l} requires a value.`);a+=1,l==="--workspace-root"?r.workspaceRoot=j(c,"Workspace root"):r.taskId=j(c,"Task id")}return{commandTokens:n,options:r,help:i}}function vw(e){if(e.length===0)return{kind:"listWorkspaces",archived:!1};if(e.length===1&&e[0]==="--archived")return{kind:"listWorkspaces",archived:!0};throw P(`Unsupported command: workspace list ${e.join(" ")}`)}function Cw(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 P(`Unsupported command: task list ${e.join(" ")}`)}function Aw(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 P(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw P(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw P("Task option --repo may only be provided once.");t=j(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw P("Task option --workspace may only be provided once.");n=j(c,"Workspace id")}else{if(r!==void 0)throw P("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(d){throw P(d instanceof Error?d.message:"Unsupported runner.")}}}if(!t&&!n)throw P("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw P("Task creation accepts either '--repo' or '--workspace', not both.");let o=j(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function Ew(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 P(`Unsupported task create-child option: ${l}`);i.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw P(`Task option ${l} requires a value.`);if(a+=1,l==="--parent"){if(t)throw P("Task option --parent may only be provided once.");t=j(c,"Parent task id")}else if(l==="--repo"){if(n)throw P("Task option --repo may only be provided once.");n=j(c,"Repo id")}else if(l==="--runner"){if(r)throw P("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(d){throw P(d instanceof Error?d.message:"Unsupported runner.")}}else{if(s)throw P("Task option --idempotency-key may only be provided once.");s=j(c,"Idempotency key")}}if(!n)throw P("Child task creation requires '--repo <repo-id>'.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},repoId:n,prompt:j(i.join(" "),"Child task prompt"),...r?{runner:r}:{},...s?{idempotencyKey:s}:{}}}function Ow(e){let[t,...n]=e;if(!["show","discover","link","refresh","unlink"].includes(t??""))throw P(`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 P(`Unsupported task pr ${t} option: ${l}`);if(r!==void 0)throw P(`task pr ${t} accepts at most one task id.`);r=j(l,"Task id");continue}let c=n[a+1];if(c===void 0||c==="--")throw P(`Task PR option ${l} requires a value.`);if(a+=1,l==="--repo"){if(s!==void 0)throw P("Task PR option --repo may only be provided once.");s=j(c,"Repo id")}else{if(i!==void 0)throw P("Task PR option --pr may only be provided once.");i=j(c,"Pull request selector")}}if((t==="link"||t==="unlink")&&i===void 0)throw P(`task pr ${t} requires --pr <url|number>.`);if(t!=="link"&&t!=="unlink"&&i!==void 0)throw P(`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 P(`Unsupported command: task pr ${e.join(" ")}`)}}var ea=300*1e3,$w=new Set(["idle","working","ready","error"]),Dw=new Set(["queued","delivering","delivered","failed","cancelled"]);function Nw(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 P(`Unsupported command: agent status ${e.join(" ")}`)}function _w(e){let t,n,r="when-ready",s=ea,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 P(`Unsupported agent send option: ${l}`);if(o.has(l))throw P(`Agent send option ${l} may only be provided once.`);if(o.add(l),l==="--stdin"){if(t)throw P("Agent send accepts exactly one prompt source.");t={source:"stdin"};continue}let c=e[a+1];if(c===void 0||c.startsWith("--"))throw P(`Agent send option ${l} requires a value.`);if(a+=1,l==="--prompt"||l==="--prompt-file"){if(t)throw P("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")n=j(c,"Agent tab id");else if(l==="--delivery"){if(c!=="when-ready"&&c!=="immediate")throw P('Agent send delivery must be "when-ready" or "immediate".');r=c}else l==="--timeout"?s=na(c):i=j(c,"Idempotency key")}if(!t)throw P("Agent send requires --prompt, --prompt-file, or --stdin.");return{kind:"sendAgentPrompt",prompt:t,delivery:r,timeoutMs:s,...n?{tabId:n}:{},...i?{idempotencyKey:i}:{}}}function xw(e){let t=j(e[0]??"","Command id"),n,r=ea,s=new Set;for(let i=1;i<e.length;i+=1){let o=e[i];if(o!=="--state"&&o!=="--timeout")throw P(`Unsupported command wait option: ${o}`);if(s.has(o))throw P(`Command wait option ${o} may only be provided once.`);s.add(o);let a=e[i+1];if(a===void 0||a.startsWith("--"))throw P(`Command wait option ${o} requires a value.`);i+=1,o==="--state"?n=Fw(a):r=na(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function Fw(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Dw.has(n)))throw P(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function hd(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 P(`Unsupported events ${t?"watch":"list"} option: ${l}`);if(!t&&l==="--format")throw P("--format is supported only by events watch.");if(i.has(l))throw P(`Events option ${l} may only be provided once.`);i.add(l);let c=e[a+1];if(c===void 0||c.startsWith("--"))throw P(`Events option ${l} requires a value.`);if(a+=1,l==="--type")n=j(c,"Event type glob");else if(l==="--after")r=j(c,"Event cursor");else if(c==="jsonl")s="jsonl";else throw P('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 Lw(e){let t,n,r,s=ea,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 P(`Unsupported task wait option: ${a}`);if(t!==void 0)throw P("task wait accepts at most one task id.");t=j(a,"Task id");continue}if(i.has(a))throw P(`Task wait option ${a} may only be provided once.`);i.add(a);let l=e[o+1];if(l===void 0||l.startsWith("--"))throw P(`Task wait option ${a} requires a value.`);o+=1,a==="--state"?n=Bw(l):a==="--tab"?r=j(l,"Agent tab id"):s=na(l)}if(!n)throw P("task wait requires --state <idle|working|ready|error>[,...].");return{kind:"waitTask",...t?{taskId:t}:{},states:n,...r?{tabId:r}:{},timeoutMs:s}}function Mw(e){let t,n,r={};for(let s=0;s<e.length;s+=1){let i=e[s];if(i!=="--input"&&i!=="--root-task"){if(i.startsWith("--"))throw P(`Unsupported fury plan option: ${i}`);if(t!==void 0)throw P("fury plan accepts exactly one definition file.");t=j(i,"Fury file");continue}let o=e[s+1];if(o===void 0||o.startsWith("--"))throw P(`Fury plan option ${i} requires a value.`);if(s+=1,i==="--root-task"){if(n)throw P("Fury plan option --root-task may only be provided once.");n=j(o,"Root task id");continue}let a=o.indexOf("=");if(a<1)throw P(`Invalid fury input "${o}". Use key=value.`);let l=j(o.slice(0,a),"Fury input name");if(Object.hasOwn(r,l))throw P(`Fury input "${l}" may only be provided once.`);r[l]=o.slice(a+1)}if(!t)throw P("fury plan requires a definition file.");return{kind:"planFury",file:t,inputs:r,...n?{rootTaskId:n}:{}}}function jw(e){let t=j(e[0]??"","Fury run id"),n,r="human";for(let s=1;s<e.length;s+=2){let i=e[s],o=e[s+1];if(!o||!["--after","--format"].includes(i??""))throw P("fury watch supports --after and --format jsonl.");if(i==="--after")n=j(o,"Event cursor");else if(o==="jsonl")r=o;else throw P("fury watch format must be jsonl.")}return{kind:"watchFury",runId:t,...n?{after:n}:{},format:r}}function qw(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw P("fury step requires complete or fail.");let n=ta(e.slice(1),["--run","--step","--output","--output-file","--stdin","--reason"]),r=j(n.get("--run")??"","Fury run id"),s=j(n.get("--step")??"","Fury step id");if(t==="fail"){if(["--output","--output-file","--stdin"].some(a=>n.has(a)))throw P("fury step fail accepts only --reason.");return{kind:"failFuryStep",runId:r,stepId:s,reason:j(n.get("--reason")??"","Failure reason")}}if(n.has("--reason"))throw P("fury step complete does not accept --reason.");let i=["--output","--output-file","--stdin"].filter(a=>n.has(a));if(i.length>1)throw P("fury step complete accepts only one output source.");let o=i[0];return{kind:"completeFuryStep",runId:r,stepId:s,...o==="--output"?{output:{source:"inline",text:n.get(o)}}:o==="--output-file"?{output:{source:"file",path:n.get(o)}}:o==="--stdin"?{output:{source:"stdin"}}:{}}}function Uw(e){if(e[0]!=="list")throw P("fury reviews requires list.");let t=ta(e.slice(1),["--run","--state"]),n=t.get("--run"),r=t.get("--state");if(r&&!["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"].includes(r))throw P(`Unsupported fury review state: ${r}`);return{kind:"listFuryReviews",...n?{runId:n}:{},...r?{state:r}:{}}}function Ww(e){let t=e[0],n=j(e[1]??"","Fury review id");if(t==="show")return ra(e,2,"fury review show"),{kind:"showFuryReview",reviewId:n};if(!t||!["approve","reject","request-changes","resubmit"].includes(t))throw P("Unsupported fury review action.");let r=ta(e.slice(2),["--note","--reason","--summary"]),s=t==="request-changes"?"request_changes":t,i=r.get("--note")??r.get("--reason")??r.get("--summary"),o=t==="approve"?"--note":t==="resubmit"?"--summary":"--reason";if([...r.keys()].some(a=>a!==o))throw P(`fury review ${t} accepts only ${o}.`);return{kind:"actFuryReview",reviewId:n,action:s,...i?{message:i}:{}}}function ta(e,t){let n=new Map;for(let r=0;r<e.length;r+=1){let s=e[r];if(!t.includes(s)||n.has(s))throw P(`Unsupported or duplicate option: ${s}`);if(s==="--stdin"){n.set(s,"true");continue}let i=e[++r];if(i===void 0||i.startsWith("--"))throw P(`Option ${s} requires a value.`);n.set(s,j(i,s))}return n}function Bw(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!$w.has(n)))throw P(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function na(e){let t=/^(\d+)(ms|s|m|h)$/.exec(e.trim());if(!t)throw P(`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 P(`Duration "${e}" is too large.`);return s}function gd(e,t){return{mode:"command",command:e,commandName:Pw(e),options:t}}function yd(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function Er(e,t){ra(e,0,t)}function ra(e,t,n){if(e.length!==t)throw P(`Command ${n} received an unexpected number of arguments.`)}function X(e,t){if(e.length!==1)throw P(`${t} is required and must be provided once.`);return j(e[0],t)}function wd(e,t){return j(e.join(" "),t)}function kd(e,t,n){return j(e[t]??"",n)}function j(e,t){let n=e.trim();if(n.length===0)throw P(`${t} cannot be empty.`);return n}function P(e){return new g("CLI_USAGE",`${e}
11
11
 
12
- ${ds()}`,{})}var pe=(e,t)=>{let r=ms(e);if(!Wm(r))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return r},ms=e=>{if(typeof e!="object"||e===null)return e;let t=e;return{...t,runner:fs(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"):[],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:Bm(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:qm(t.repoTargets),runnerSession:t.runnerSession??Fm(t),checks:Jm(t),lastCommit:t.lastCommit??null,prs:Xm(t),artifacts:tf(t),cleanup:rf(t)}},Fm=e=>{if(typeof e.title!="string")return null;let t=fs(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},Wm=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.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"&&Va(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||Um(t.repoTargets))&&Km(t.runnerSession)&&Gm(t.prompt)&&Ka(t.checks)&&Ga(t.lastCommit)&&zm(t.prs)&&Ym(t.artifacts)&&za(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},qm=e=>{if(Array.isArray(e))return e.filter(Ba)},Um=e=>Array.isArray(e)&&e.every(Ba),Ba=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)&&Ka(t.checks)&&Ga(t.lastCommit)&&Ha(t.pullRequest)&&za(t.cleanup)},Bm=e=>{if(Va(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 Vm(e.id,e.title,t,fs(e.runner))},Vm=(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}]},fs=e=>e&&k.runners.isRunnerType(e)?e:"codex",Va=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(r=>typeof r=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"),Km=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),Gm=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",Ka=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"),Ga=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",Ha=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&Hm(e.requiredChecks),Hm=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)),zm=e=>Array.isArray(e)&&e.every(Ha),Ym=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),za=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),Jm=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},Xm=e=>{if(Array.isArray(e.prs))return e.prs.map(Qm);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:Ya(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:Ja(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},Qm=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:Ya(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:Zm(t.reviewDecision),requiredChecks:Ja(t.requiredChecks),comments:ef(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},Ya=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,Zm=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,ef=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}]}):[],Ja=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})):[],tf=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},rf=e=>e.cleanup??{paneClosedAt:null,worktreeRemovedAt:null,preservedWorktree:!1,warning:null};import{readFile as qf}from"node:fs/promises";import{readFile as nf,readdir as sf,rm as of}from"node:fs/promises";import Xa from"node:path";var gs=(e,t)=>Xa.join(e.workspacesDir,`${t}.json`),af=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"):[]}},Qa=(e,t)=>{let r=af(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},it=async(e,t)=>{let r=gs(e,t);try{let n=await nf(r,"utf8");return Qa(JSON.parse(n),r)}catch(n){throw lf(n)?new m("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 m("WORKSPACE_RECORD_INVALID",n instanceof Error?n.message:`Craig workspace "${t}" is invalid.`,{details:{workspaceId:t},cause:n}):n}},ot=async(e,t)=>{await O(gs(e,t.id),{...t,updatedAt:new Date().toISOString()})},ae=async e=>{let t=await sf(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(n=>n.isFile()&&n.name.endsWith(".json")).map(n=>it(e,Xa.basename(n.name,".json"))))).sort((n,s)=>n.id.localeCompare(s.id))},Za=async(e,t)=>{await of(gs(e,t),{force:!0})},lf=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as cf,readdir as df,rm as uf}from"node:fs/promises";import el from"node:path";var hs=(e,t)=>el.join(e.reposDir,`${t}.json`),tl=(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=hs(e,t);try{let n=await cf(r,"utf8");return tl(JSON.parse(n),r)}catch(n){throw pf(n)?new m("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 m("REPO_RECORD_INVALID",n instanceof Error?n.message:`Craig repo "${t}" is invalid.`,{details:{repoId:t},cause:n}):n}},ws=async(e,t)=>{await O(hs(e,t.id),{...t,updatedAt:new Date().toISOString()})},Zt=async e=>{let t=await df(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(n=>n.isFile()&&n.name.endsWith(".json")).map(n=>me(e,el.basename(n.name,".json"))))).sort((n,s)=>n.name.localeCompare(s.name)||n.id.localeCompare(s.id))},rl=async(e,t)=>{await uf(hs(e,t),{force:!0})},pf=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as mf}from"node:fs/promises";var ff=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"},At=(e,t,r)=>{if(!ff(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 mf(e.indexFile,"utf8");return At(JSON.parse(t),e.workspaceRoot,e.indexFile)},ve=async(e,t)=>{await O(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as yf,stat as Tf}from"node:fs/promises";import xt from"node:path";import{realpath as il}from"node:fs/promises";import Kr from"node:path";import{execFile as gf}from"node:child_process";import{promisify as hf}from"node:util";var nl=hf(gf);async function C(e,t,r={}){try{let n=await nl(e,t,{cwd:r.cwd,env:r.env});return{stdout:n.stdout,stderr:n.stderr}}catch(n){if(sl(n)){let s=n.stderr?.trim()||n.stdout?.trim()||n.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw n}}async function N(e,t,r={}){try{let n=await nl(e,t,{cwd:r.cwd,env:r.env});return{stdout:n.stdout,stderr:n.stderr,exitCode:0}}catch(n){if(sl(n))return{stdout:n.stdout??"",stderr:n.stderr??"",exitCode:typeof n.code=="number"?n.code:null};throw n}}function sl(e){return e instanceof Error}var ks=async e=>{try{let r=(await C("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[n,s]=await Promise.all([il(r).catch(()=>Kr.resolve(r)),il(e).catch(()=>Kr.resolve(e))]);return n===s}catch{return!1}},ys=async e=>{let t=await N("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 N("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"},ol=async e=>{let t=await N("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=Kr.resolve(e,r);return Kr.dirname(n)};import{mkdir as le,readFile as wf}from"node:fs/promises";var kf=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Et=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 wf(t.indexFile,"utf8"),i=JSON.parse(s);return At(i,e,t.indexFile)}catch(s){if(!kf(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 O(t.indexFile,n),n};var al=(e,t,r)=>{let n=new Date().toISOString();return{id:Rf(e,xt.basename(t)),name:xt.basename(t),rootPath:t,defaultBranch:r,createdAt:n,updatedAt:n}},ll=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},Rf=(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},bf=(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},cl=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])]})},Pf=async(e,t)=>{let r=await yf(t,{withFileTypes:!0}),n=await Zt(e),s=[];for(let i of r){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=xt.join(t,i.name);if(!await ks(o))continue;let a=n.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await ys(o);s.push(a?ll(a,l):al([...n,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},Sf=async(e,t)=>{let r=await ys(t),n=await Zt(e),s=n.find(u=>u.rootPath===t)??null,i=s?ll(s,r):al(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 ws(e,i),l||await ot(e,d),await cl(e,{repoIds:[i.id],workspaceIds:[d.id]}),{kind:"createWorkspace",workspace:d,repos:[i],created:!l}},vf=async(e,t)=>{let r=await Pf(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=bf(n,xt.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:xt.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=>ws(e,c))),await ot(e,l),await cl(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:r,created:!i}},er=async(e,t)=>{await Et(e.workspaceRoot);let r=xt.resolve(e.workspaceRoot,t);if(!(await Tf(r).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${r}`);return await ks(r)?Sf(e,r):vf(e,r)};var Ts=async(e,t,r={listWorkspaceRecords:ae,ensureCraigState:Et})=>(await r.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await r.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var Rs=async(e,t,r={readWorkspace:it,writeWorkspace:ot})=>{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 bs=async(e,t)=>{let n={...await it(e,t),status:"active",archivedAt:null};await ot(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 at=async(e,t,r={deleteWorkspace:Za,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 Ps=async(e,t,r)=>{let n=await it(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 at(e,t),{kind:"removeWorkspace",workspaceId:n.id,rootPath:n.rootPath??""}};import{readFile as If,realpath as pl,stat as Cf}from"node:fs/promises";import Gr from"node:path";async function Ss(e){let t=await fl(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return dl(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return dl(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let r=await ul(t);if(r)return{workspaceRoot:r,source:"ancestor",initialized:!0};let n=await ol(t);if(n){let s=await ul(n);if(s)return{workspaceRoot:s,source:"git_common_dir",initialized:!0}}if(e.allowUninitializedCwd)return{workspaceRoot:t,source:"cwd",initialized:!1};throw new m("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 dl(e,t,r,n){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await fl(Gr.resolve(r,e),s),o=await ml(i);if(o)return{workspaceRoot:o,source:t,initialized:!0};if(n)return{workspaceRoot:i,source:t,initialized:!1};throw new m("WORKSPACE_CONTEXT_NOT_FOUND",`${s} ${i} is not an initialized Craig workspace.`,{details:{workspaceRoot:i,source:t}})}async function ul(e){let t=e;for(;;){let r=await ml(t);if(r)return r;let n=Gr.dirname(t);if(n===t)return null;t=n}}async function ml(e){let t=ne(e);try{let r=await If(t.indexFile,"utf8"),n=JSON.parse(r),s=typeof n=="object"&&n!==null&&"workspaceRoot"in n&&typeof n.workspaceRoot=="string"?n.workspaceRoot:e,i=At(n,s,t.indexFile);if(await pl(i.workspaceRoot).catch(()=>Gr.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(Af(r))return null;throw r instanceof m?r:new m("WORKSPACE_CONTEXT_INVALID",r instanceof Error?r.message:`Craig workspace at ${e} is invalid.`,{details:{workspaceRoot:e},cause:r})}}async function fl(e,t){let r=Gr.resolve(e);try{if(!(await Cf(r)).isDirectory())throw new m("WORKSPACE_CONTEXT_INVALID",`${t} ${r} is not a directory.`,{details:{path:r}});return await pl(r)}catch(n){throw n instanceof m?n:new m("WORKSPACE_CONTEXT_NOT_FOUND",`${t} ${r} does not exist or cannot be read.`,{details:{path:r},cause:n})}}function Af(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var vs={};Lr(vs,{addRepo:()=>gl,listRegisteredRepos:()=>hl,removeRepo:()=>wl});import Ef from"node:path";import{stat as xf}from"node:fs/promises";var gl=async(e,t)=>{let r=Ef.resolve(e.workspaceRoot,t);if(!(await xf(r).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${r}`);let s=await er(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 hl=async(e,t={listRepos:Zt,ensureCraigState:Et})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var wl=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=>at(e,c.id))),await rl(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 Q={addWorkspace:er,listWorkspaces:Ts,archiveWorkspace:Rs,restoreWorkspace:bs,removeWorkspace:Ps,removeWorkspaceRecord:at,resolveContext:Ss,repos:vs};import{mkdir as kl,readFile as Df,rm as zr,stat as Of,writeFile as $f}from"node:fs/promises";import Hr from"node:path";var Nf=25,Mf=3e4,Lf=5e3;async function Be(e,t,r){let n=Hr.join(e.runtimeDir,"task-locks"),s=Hr.join(n,`${t}.lock`);await kl(n,{recursive:!0});let i=Date.now();for(;;)try{await kl(s);try{await $f(Hr.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await zr(s,{recursive:!0,force:!0}),o}break}catch(o){if(!Ff(o))throw o;if(await _f(s))continue;if(Date.now()-i>=Mf)throw new m("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await Wf(Nf)}try{return await r()}finally{await zr(s,{recursive:!0,force:!0})}}async function _f(e){let t=await Df(Hr.join(e,"owner.json"),"utf8").then(n=>JSON.parse(n)).catch(()=>null);if(t&&typeof t.pid=="number")return jf(t.pid)?!1:(await zr(e,{recursive:!0,force:!0}),!0);let r=await Of(e).catch(()=>null);return!r||Date.now()-r.mtimeMs<Lf?!1:(await zr(e,{recursive:!0,force:!0}),!0)}function jf(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 Ff=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Wf=e=>new Promise(t=>setTimeout(t,e));var Ie=async(e,t)=>{let r=await qf(Yr(e,t),"utf8");return JSON.parse(r)},tr=async(e,t)=>{let r=await Ie(e,t);return pe(r,Yr(e,t))},Ce=async(e,t)=>{let r=yl(t);await O(Yr(e,t.id),r)},E=async(e,t,r)=>Be(e,t,async()=>{let n=await tr(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=yl(s);return await O(Yr(e,t),i),i}),Is=async(e,t)=>{let r=await se(e);r.taskIds.includes(t)||await ve(e,{...r,taskIds:[...r.taskIds,t]})},Yr=(e,t)=>`${e.tasksDir}/${t}.json`,yl=e=>({...e,updatedAt:new Date().toISOString()});var D=e=>e.prs.length===0?null:[...e.prs].reverse().find(r=>r.status!=="merged"&&r.status!=="closed")??e.prs[e.prs.length-1]??null,Ve=e=>e.status==="merged"||e.status==="closed",Ae=(e,t)=>{let r=e.prs.findIndex(s=>Dt(s,t)),n=r>=0?e.prs.map((s,i)=>i===r?t:s):[...e.prs,t];return{...e,prs:n}},Dt=(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(),lt=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(r=>r.status!=="merged"&&r.status!=="closed")??e[e.length-1];return Xr(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},Xr=e=>e.mergeable&&!Uf(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),Uf=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Cs=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=Bf(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:Vf(e.reviewDecision??null),requiredChecks:As(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:zf(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}},Bf=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,Vf=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,As=e=>{let t=e.map(n=>Kf(n)).filter(n=>n!==null),r=new Map;for(let n of t){let s=r.get(n.name);(!s||Gf(s,n))&&r.set(n.name,n)}return[...r.values()].map(n=>({name:n.name,status:n.status,conclusion:n.conclusion}))},Kf=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:Rl(n??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:Hf(t)}:null},Gf=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):Jr(e)&&!Jr(t)?!0:!Jr(e)&&Jr(t)?!1:Tl(t.status)>=Tl(e.status),Jr=e=>e.conclusion?.toUpperCase()==="CANCELLED",Tl=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},Hf=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},zf=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(Yf).filter(r=>r!==null).slice(-4):[]},Yf=e=>{if(typeof e!="object"||e===null)return null;let t=e,r=Jf(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},Jf=e=>e.replace(/\s+/g," ").trim(),Rl=(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?Rl(n,n):"unknown"};var fe=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as Xf}from"node:fs/promises";import bl 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 rg(n)?new m("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):ng(n)?new m("TASK_RECORD_INVALID",n instanceof Error?n.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:n}):n}},X=async e=>{if(!await Es(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Ot=(e,t)=>t.artifacts.logPath?bl.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:bl.join(e.workspaceRoot,t.artifacts.logPath):null,rr=async(e,t)=>{let r=await Es(t.worktreePath),n=Ot(e,t),s=n?await Es(n):!1;return{worktreeExists:r,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:Qf(t),lastCommitSummary:Zf(t),prSummary:eg(t),cleanupSummary:tg(t)}},Es=async e=>{try{return await Xf(e),!0}catch{return!1}},Qf=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}`},Zf=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",eg=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
+ ${Zo()}`,{})}var je=(e,t)=>{let n=sa(e);if(!Kw(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},sa=e=>{if(typeof e!="object"||e===null)return e;let t=e,n=e,r={...n};return delete r.swarmRunId,delete r.swarmStepId,{...r,runner:ia(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(s=>typeof s=="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,furyRunId:typeof t.furyRunId=="string"||t.furyRunId===null?t.furyRunId:typeof n.swarmRunId=="string"?n.swarmRunId:null,furyStepId:typeof t.furyStepId=="string"||t.furyStepId===null?t.furyStepId:typeof n.swarmStepId=="string"?n.swarmStepId:null,ptyTabs:Yw(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:Gw(t.repoTargets),runnerSession:t.runnerSession??Vw(t),checks:tk(t),lastCommit:t.lastCommit??null,prs:nk(t),artifacts:ok(t),cleanup:ak(t)}},Vw=e=>{if(typeof e.title!="string")return null;let t=ia(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},Kw=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.furyRunId=="string"||t.furyRunId===null)&&(typeof t.furyStepId=="string"||t.furyStepId===null)&&typeof t.repoRoot=="string"&&typeof t.worktreePath=="string"&&typeof t.branch=="string"&&Sd(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||Hw(t.repoTargets))&&Jw(t.runnerSession)&&Xw(t.prompt)&&Pd(t.checks)&&Id(t.lastCommit)&&Zw(t.prs)&&ek(t.artifacts)&&Cd(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Gw=e=>{if(Array.isArray(e))return e.filter(Rd)},Hw=e=>Array.isArray(e)&&e.every(Rd),Rd=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)&&Pd(t.checks)&&Id(t.lastCommit)&&vd(t.pullRequest)&&Cd(t.cleanup)},Yw=e=>{if(Sd(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 zw(e.id,e.title,t,ia(e.runner))},zw=(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}]},ia=e=>e&&k.runners.isRunnerType(e)?e:"codex",Sd=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"),Jw=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),Xw=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",Pd=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"),Id=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",vd=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&Qw(e.requiredChecks),Qw=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)),Zw=e=>Array.isArray(e)&&e.every(vd),ek=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),Cd=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),tk=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},nk=e=>{if(Array.isArray(e.prs))return e.prs.map(rk);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:Ad(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:Ed(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},rk=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:Ad(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:sk(t.reviewDecision),requiredChecks:Ed(t.requiredChecks),comments:ik(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},Ad=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,sk=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,ik=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}]}):[],Ed=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})):[],ok=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},ak=e=>e.cleanup??{paneClosedAt:null,worktreeRemovedAt:null,preservedWorktree:!1,warning:null};import{readFile as Kk}from"node:fs/promises";import{readFile as lk,readdir as ck,rm as uk}from"node:fs/promises";import Od from"node:path";var oa=(e,t)=>Od.join(e.workspacesDir,`${t}.json`),dk=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"):[]}},$d=(e,t)=>{let n=dk(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},mn=async(e,t)=>{let n=oa(e,t);try{let r=await lk(n,"utf8");return $d(JSON.parse(r),n)}catch(r){throw pk(r)?new g("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 g("WORKSPACE_RECORD_INVALID",r instanceof Error?r.message:`Craig workspace "${t}" is invalid.`,{details:{workspaceId:t},cause:r}):r}},hn=async(e,t)=>{await M(oa(e,t.id),{...t,updatedAt:new Date().toISOString()})},Oe=async e=>{let t=await ck(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>mn(e,Od.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},Dd=async(e,t)=>{await uk(oa(e,t),{force:!0})},pk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as fk,readdir as mk,rm as hk}from"node:fs/promises";import Nd from"node:path";var aa=(e,t)=>Nd.join(e.reposDir,`${t}.json`),_d=(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},qe=async(e,t)=>{let n=aa(e,t);try{let r=await fk(n,"utf8");return _d(JSON.parse(r),n)}catch(r){throw gk(r)?new g("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 g("REPO_RECORD_INVALID",r instanceof Error?r.message:`Craig repo "${t}" is invalid.`,{details:{repoId:t},cause:r}):r}},la=async(e,t)=>{await M(aa(e,t.id),{...t,updatedAt:new Date().toISOString()})},Or=async e=>{let t=await mk(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>qe(e,Nd.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},xd=async(e,t)=>{await hk(aa(e,t),{force:!0})},gk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as yk}from"node:fs/promises";var wk=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"},Bn=(e,t,n)=>{if(!wk(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},ve=async e=>{let t=await yk(e.indexFile,"utf8");return Bn(JSON.parse(t),e.workspaceRoot,e.indexFile)},Tt=async(e,t)=>{await M(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as Sk,stat as Pk}from"node:fs/promises";import Kn from"node:path";import{realpath as Md}from"node:fs/promises";import Ks from"node:path";import{execFile as kk}from"node:child_process";import{promisify as Tk}from"node:util";var Fd=Tk(kk);async function F(e,t,n={}){try{let r=await Fd(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(Ld(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 Fd(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(Ld(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function Ld(e){return e instanceof Error}var ca=async e=>{try{let n=(await F("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([Md(n).catch(()=>Ks.resolve(n)),Md(e).catch(()=>Ks.resolve(e))]);return r===s}catch{return!1}},ua=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 F("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},jd=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 $e,readFile as bk}from"node:fs/promises";var Rk=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Vn=async e=>{let t=Ie(e);await $e(t.craigDir,{recursive:!0}),await Promise.all([$e(t.reposDir,{recursive:!0}),$e(t.workspacesDir,{recursive:!0}),$e(t.sessionsDir,{recursive:!0}),$e(t.runtimeDir,{recursive:!0}),$e(t.tasksDir,{recursive:!0}),$e(t.jobsDir,{recursive:!0}),$e(t.commandsDir,{recursive:!0}),$e(t.eventsDir,{recursive:!0}),$e(t.orchestrationDir,{recursive:!0}),$e(t.logsDir,{recursive:!0}),$e(t.artifactsDir,{recursive:!0}),$e(t.worktreesDir,{recursive:!0})]);try{let s=await bk(t.indexFile,"utf8"),i=JSON.parse(s);return Bn(i,e,t.indexFile)}catch(s){if(!Rk(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 M(t.indexFile,r),r};var qd=(e,t,n)=>{let r=new Date().toISOString();return{id:Ik(e,Kn.basename(t)),name:Kn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},Ud=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},Ik=(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},vk=(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},Wd=async(e,t)=>{let n=await ve(e);await Tt(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},Ck=async(e,t)=>{let n=await Sk(t,{withFileTypes:!0}),r=await Or(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Kn.join(t,i.name);if(!await ca(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await ua(o);s.push(a?Ud(a,l):qd([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},Ak=async(e,t)=>{let n=await ua(t),r=await Or(e),s=r.find(u=>u.rootPath===t)??null,i=s?Ud(s,n):qd(r,t,n),o=`workspace_${i.id}`,l=(await Oe(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:n,status:"active",linkedRepoIds:[],archivedAt:null,createdAt:c,updatedAt:c};return await la(e,i),l||await hn(e,d),await Wd(e,{repoIds:[i.id],workspaceIds:[d.id]}),{kind:"createWorkspace",workspace:d,repos:[i],created:!l}},Ek=async(e,t)=>{let n=await Ck(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await Oe(e),s=vk(r,Kn.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:Kn.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=>la(e,c))),await hn(e,l),await Wd(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},$r=async(e,t)=>{await Vn(e.workspaceRoot);let n=Kn.resolve(e.workspaceRoot,t);if(!(await Pk(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await ca(n)?Ak(e,n):Ek(e,n)};var da=async(e,t,n={listWorkspaceRecords:Oe,ensureCraigState:Vn})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var pa=async(e,t,n={readWorkspace:mn,writeWorkspace:hn})=>{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 fa=async(e,t)=>{let r={...await mn(e,t),status:"active",archivedAt:null};await hn(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 gn=async(e,t,n={deleteWorkspace:Dd,readCraigIndex:ve,writeCraigIndex:Tt})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var ma=async(e,t,n)=>{let r=await mn(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 gn(e,t),{kind:"removeWorkspace",workspaceId:r.id,rootPath:r.rootPath??""}};import{readFile as Ok,realpath as Kd,stat as $k}from"node:fs/promises";import Gs from"node:path";async function ha(e){let t=await Hd(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return Bd(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return Bd(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await Vd(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await jd(t);if(r){let s=await Vd(r);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 Bd(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await Hd(Gs.resolve(n,e),s),o=await Gd(i);if(o)return{workspaceRoot:o,source:t,initialized:!0};if(r)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 Vd(e){let t=e;for(;;){let n=await Gd(t);if(n)return n;let r=Gs.dirname(t);if(r===t)return null;t=r}}async function Gd(e){let t=Ie(e);try{let n=await Ok(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Bn(r,s,t.indexFile);if(await Kd(i.workspaceRoot).catch(()=>Gs.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(Dk(n))return null;throw n instanceof g?n:new g("WORKSPACE_CONTEXT_INVALID",n instanceof Error?n.message:`Craig workspace at ${e} is invalid.`,{details:{workspaceRoot:e},cause:n})}}async function Hd(e,t){let n=Gs.resolve(e);try{if(!(await $k(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await Kd(n)}catch(r){throw r instanceof g?r:new g("WORKSPACE_CONTEXT_NOT_FOUND",`${t} ${n} does not exist or cannot be read.`,{details:{path:n},cause:r})}}function Dk(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var ga={};Fs(ga,{addRepo:()=>Yd,listRegisteredRepos:()=>zd,removeRepo:()=>Jd});import Nk from"node:path";import{stat as _k}from"node:fs/promises";var Yd=async(e,t)=>{let n=Nk.resolve(e.workspaceRoot,t);if(!(await _k(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await $r(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 zd=async(e,t={listRepos:Or,ensureCraigState:Vn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var Jd=async(e,t,n)=>{let r=await qe(e,t),i=(await Oe(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=>gn(e,c.id))),await xd(e,t);let l=await ve(e);return await Tt(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var we={addWorkspace:$r,listWorkspaces:da,archiveWorkspace:pa,restoreWorkspace:fa,removeWorkspace:ma,removeWorkspaceRecord:gn,resolveContext:ha,repos:ga};import{mkdir as Xd,readFile as xk,rm as Ys,stat as Fk,writeFile as Lk}from"node:fs/promises";import Hs from"node:path";var Mk=25,jk=3e4,qk=5e3;async function qt(e,t,n){let r=Hs.join(e.runtimeDir,"task-locks"),s=Hs.join(r,`${t}.lock`);await Xd(r,{recursive:!0});let i=Date.now();for(;;)try{await Xd(s);try{await Lk(Hs.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await Ys(s,{recursive:!0,force:!0}),o}break}catch(o){if(!Bk(o))throw o;if(await Uk(s))continue;if(Date.now()-i>=jk)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await Vk(Mk)}try{return await n()}finally{await Ys(s,{recursive:!0,force:!0})}}async function Uk(e){let t=await xk(Hs.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return Wk(t.pid)?!1:(await Ys(e,{recursive:!0,force:!0}),!0);let n=await Fk(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<qk?!1:(await Ys(e,{recursive:!0,force:!0}),!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 Bk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Vk=e=>new Promise(t=>setTimeout(t,e));var bt=async(e,t)=>{let n=await Kk(zs(e,t),"utf8");return JSON.parse(n)},Dr=async(e,t)=>{let n=await bt(e,t);return je(n,zs(e,t))},Rt=async(e,t)=>{let n=Qd(t);await M(zs(e,t.id),n)},W=async(e,t,n)=>qt(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=Qd(s);return await M(zs(e,t),i),i}),ya=async(e,t)=>{let n=await ve(e);n.taskIds.includes(t)||await Tt(e,{...n,taskIds:[...n.taskIds,t]})},zs=(e,t)=>`${e.tasksDir}/${t}.json`,Qd=e=>({...e,updatedAt:new Date().toISOString()});var V=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Ut=e=>e.status==="merged"||e.status==="closed",St=(e,t)=>{let n=e.prs.findIndex(s=>Gn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},Gn=(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(),yn=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return Xs(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},Xs=e=>e.mergeable&&!Gk(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),Gk=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",wa=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),Pt=(e,t,n)=>{let r=e.isDraft??!1,s=Hk(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:Yk(e.reviewDecision??null),requiredChecks:ka(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:Qk(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}},Hk=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,Yk=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,ka=e=>{let t=e.map(r=>zk(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||Jk(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},zk=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:ep(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:Xk(t)}:null},Jk=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):Js(e)&&!Js(t)?!0:!Js(e)&&Js(t)?!1:Zd(t.status)>=Zd(e.status),Js=e=>e.conclusion?.toUpperCase()==="CANCELLED",Zd=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},Xk=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},Qk=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(Zk).filter(n=>n!==null).slice(-4):[]},Zk=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=eT(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},eT=e=>e.replace(/\s+/g," ").trim(),ep=(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?ep(r,r):"unknown"};var Ue=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as tT}from"node:fs/promises";import tp from"node:path";var L=async(e,t,n={readRawTask:bt,validateTaskRecord:je})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw oT(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):aT(r)?new g("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},me=async e=>{if(!await Ta(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Hn=(e,t)=>t.artifacts.logPath?tp.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:tp.join(e.workspaceRoot,t.artifacts.logPath):null,Nr=async(e,t)=>{let n=await Ta(t.worktreePath),r=Hn(e,t),s=r?await Ta(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:nT(t),lastCommitSummary:rT(t),prSummary:sT(t),cleanupSummary:iT(t)}},Ta=async e=>{try{return await tT(e),!0}catch{return!1}},nT=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}`},rT=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",sT=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})
13
13
  ${i.join(`
14
- `)}`}let t=D(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})`},tg=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",rg=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",ng=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var Pl=async(e,t)=>{let r=await N("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.")},xs=async(e,t,r,n="main")=>{let s=n.trim()||"main";if((await N("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 sg(e,s);await C("git",["worktree","add","-b",t,r,o],{cwd:e})},sg=async(e,t)=>(await N("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await N("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await N("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t,Qr=async e=>{let t=await N("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},Sl=async e=>{await C("git",["add","-A"],{cwd:e})},vl=async(e,t)=>{await C("git",["commit","-m",t],{cwd:e})},Il=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}},Cl=async e=>{let t=await N("git",["branch","--show-current"],{cwd:e});if(t.exitCode!==0)return null;let r=t.stdout.trim();return r.length>0?r:null};var Al=async(e,t)=>{await C("git",["worktree","remove","--force",t],{cwd:e})};var Ds=async e=>$t(e,e.repoRoot),$t=async(e,t)=>{let r=await se(e),n=El(new Date),s=xl(r.taskIds,n);for(;;){let i=`task_${n}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await Pl(t,o))return i;s+=1}},nr=async e=>{let t=await se(e),r=El(new Date),n=xl(t.taskIds,r);return`task_${r}_${String(n).padStart(2,"0")}`},El=e=>{let t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0");return`${t}${r}${n}`},xl=(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 sr=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(ig(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}},ig=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var Dl=["merge_ready","pr_open","checked","review","running","draft"],Os=e=>[...e].sort((t,r)=>t.id.localeCompare(r.id)),$s=(e,t)=>t&&e.some(n=>n.id===t)?t:e.length===0?null:[...e].sort(og)[0]?.id??null,og=(e,t)=>{let r=Ol(e.status),n=Ol(t.status);return r!==n?r-n:t.updatedAt.localeCompare(e.updatedAt)},Ol=e=>{let t=Dl.indexOf(e);return t>=0?t:Dl.length};import $l from"node:path";var ct=(e,t)=>t?$l.isAbsolute(t)?t:$l.join(e.repoRoot,t):null;import{randomUUID as ag}from"node:crypto";import{mkdir as ir,rm as lg,writeFile as Zr}from"node:fs/promises";import M from"node:path";var Ml=["AGENTS","md"].join("."),Nt=async(e,t,r,n={})=>{let s=await me(e,t),[i,o]=await Promise.all([mg(e,s.id),$t(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([ir(M.dirname(c),{recursive:!0}),ir(u,{recursive:!0}),Zr(d,"","utf8")]);let g=cg(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,...n.lineage?{lineage:n.lineage}:{}});return await Ce(e,g),await Is(e,o),await xs(s.rootPath,l,c,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,sessionId:a,workspaceId:i.id,task:g}},or=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 Nt(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 nr(e),a=new Date().toISOString(),l=n.runner??"codex",c=n.sessionId??null,d=`craig/${o}`,u=M.join(e.craigDir,"task-bundles",o),g=M.join(e.logsDir,`${o}.log`),f=M.join(e.artifactsDir,o);await ir(u,{recursive:!0}),await ir(f,{recursive:!0}),await Zr(g,"","utf8");let p=await Promise.all(i.map(I=>me(e,I))),w=ug(p),R=await Promise.all(p.map(I=>dg(e,I,o,d,M.join(u,w.get(I.id))))),x=R.find(I=>I.status==="ready")??R[0];if(!R.some(I=>I.status==="ready"))throw await lg(u,{recursive:!0,force:!0}),new Error(`No project repo targets could be provisioned for ${t}: ${R.map(I=>`${I.repoId}: ${I.failureReason??"unknown error"}`).join("; ")}`);await Zr(M.join(u,"manifest.json"),JSON.stringify({taskId:o,workspaceId:t,prompt:r,repos:R.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 Zr(M.join(u,Ml),pg({taskId:o,workspaceId:t,prompt:r,repos:p,repoTargets:R,bundlePath:u}),"utf8");let F=ar(o,r,a,l,n.config??{}),U={id:o,title:r,slug:_l(r),type:"project",status:"draft",runner:l,repoId:x.repoId,workspaceId:s.id,sessionId:c,selectedPtyTabId:F[0]?.id??null,linkedRepoIds:i.filter(I=>I!==x.repoId),...Ll(o,n.lineage),repoRoot:u,worktreePath:u,branch:d,bundlePath:u,selectedRepoTargetId:x.repoId,repoTargets:R,ptyTabs:F,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:x.checks,lastCommit:null,prs:[],artifacts:{logPath:M.relative(e.workspaceRoot,g),checkSummaryPath:M.relative(e.workspaceRoot,M.join(f,"check-summary.json")),prDraftPath:null,prStatusPath:M.relative(e.workspaceRoot,M.join(f,"pr-status.json"))},cleanup:en(),lastFailureReason:R.every(I=>I.status==="unavailable")?"No project repo targets could be provisioned.":null,createdAt:a,updatedAt:a};return await Ce(e,U),await Is(e,o),{repoId:x.repoId,repoRoot:u,sessionId:c,workspaceId:s.id,task:U,bundlePath:u,repoTargets:R}},ar=(e,t,r,n="codex",s={})=>{let i=k.runners.getProfile(n);return[{id:`${e}:agent`,kind:"agent",...s.previews?.agentOrchestration?{capabilityId:`capability_${ag()}`}:{},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}]},cg=(e,t)=>{let r=new Date().toISOString(),n=ar(t.taskId,t.prompt,r,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:_l(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,sessionId:t.sessionId,selectedPtyTabId:n[0]?.id??null,linkedRepoIds:[],...Ll(t.taskId,t.lineage),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:{...Ns(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:en(),lastFailureReason:null,createdAt:r,updatedAt:r}},dg=async(e,t,r,n,s)=>{await ir(M.dirname(s),{recursive:!0});try{return await xs(t.rootPath,n,s,t.defaultBranch),{repoId:t.id,branch:n,repoRoot:t.rootPath,worktreePath:s,status:"ready",failureReason:null,checks:Ns(M.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Nl(),cleanup:en()}}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:Ns(M.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Nl(),cleanup:en()}}},ug=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},pg=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
- `)},Ns=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),Nl=()=>({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}),en=()=>({paneClosedAt:null,worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),Ll=(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}),mg=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},_l=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");import zl from"node:path";import{readFile as fg,rm as pI}from"node:fs/promises";import gg from"node:path";var Ke=async(e,t)=>{let r=await fg(Ms(e,t),"utf8"),n=JSON.parse(r);return hg(n,Ms(e,t))},dt=async(e,t)=>{await O(Ms(e,t.id),{...t,updatedAt:new Date().toISOString()})};var Ms=(e,t)=>gg.join(e.sessionsDir,`${t}.json`);function hg(e,t){let r=yg(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")||!kg(r.attach)||!wg(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 wg(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 kg(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 yg(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{randomUUID as Ng}from"node:crypto";import{mkdir as Mg,rm as Lg,writeFile as _g}from"node:fs/promises";import js from"node:path";import{spawn as Tg}from"node:child_process";import{createHash as Rg}from"node:crypto";import bg from"node:path";function ut(e){return`'${e.replace(/'/g,"'\\''")}'`}var Pg="craig",jl=async(e,t,r)=>{let n=Ls(e,t),s=vg(),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=Cg(i.stdout);return await Sg(e,n),o};var Sg=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})},Fl=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 ql=async(e,t,r)=>{await C("tmux",["pipe-pane","-o","-t",e,`cat >> ${ut(t)}`],{cwd:r})},tn=async(e,t,r,n)=>{let s=n??Bl(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 Eg(e,["attach-session","-t",s])};var Ul=async(e,t)=>{await C("tmux",["kill-session","-t",t],{cwd:e})};var Bl=e=>{let r=bg.basename(e).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"repo",n=Rg("sha1").update(e).digest("hex").slice(0,8);return`${Pg}-${r}-${n}`},Ls=(e,t)=>`${Bl(e)}-${t.toLowerCase()}`,vg=()=>{let e=Ig();return e?["-x",`${e.columns}`,"-y",`${e.rows}`]:[]},Ig=()=>{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},Cg=e=>{let t=Ag(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]}},Ag=e=>e.split(/\s+/).map(t=>t.trim()).filter(t=>t.length>0),Eg=async(e,t)=>{await new Promise((r,n)=>{let s=Tg("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 xg,constants as Dg}from"node:fs";import{homedir as Vl}from"node:os";import Ge from"node:path";var Og=[Ge.join(Vl(),".local","bin"),Ge.join(Vl(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function Gl(e=process.env){return $g([...(e.PATH??"").split(Ge.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:Og])}function pt(e=process.env){return{...e,PATH:Gl(e).join(Ge.delimiter)}}function _s(e,t={}){if(e.includes(Ge.sep)){let r=Ge.isAbsolute(e)?e:Ge.resolve(t.cwd??process.cwd(),e);return Kl(r)?r:null}for(let r of Gl(t.env)){let n=Ge.join(r,e);if(Kl(n))return n}return null}function mt(e,t={}){let r=_s(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 Kl(e){try{return xg(e,Dg.X_OK),!0}catch{return!1}}function $g(e){return[...new Set(e)]}var lr={async create(e,t){let r=await jl(t.repoRoot,t.taskId,t.worktreePath);t.logPath&&await ql(r.paneId,t.logPath,t.repoRoot);let n=await Hl({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||Ls(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 dt(e,s),s},async attach(e,t,r){let n=await lr.snapshot(t,r);if(!n.alive)throw new Error(`Session ${t.id} is no longer live and cannot be attached.`);await tn(r,t.paneId,t.windowTarget,t.sessionName);let s={...t,status:"running",lastAttachedAt:new Date().toISOString(),snapshot:n};return await dt(e,s),s},async resize(e,t,r,n){await Fl(n,t.sessionName,r);let s={...t,attach:{...t.attach,lastSize:r}};return await dt(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 dt(e,n),n},async snapshot(e,t){return Fg(e,t)}},Fs={async prepare(e,t){let n=e.runnerSession.command[0],s=pt();mt(n,{cwd:t.repoRoot,env:s})},async launch(e,t){let r=e.runnerSession.command,n=mt(r[0],{cwd:e.worktreePath,env:pt()}),s=Object.keys(t.environment??{}).length>0?await jg(t.session,t.environment):null,i=[n,...r.slice(1)].map(a=>ut(a)).join(" "),o=s?`. ${ut(s)} && rm -f ${ut(s)} && exec ${i}`:`exec ${i}`;try{await Wl(t.session.paneId,o,t.repoRoot)}catch(a){throw s&&await Lg(s,{force:!0}).catch(()=>{}),a}},async status(e){return e.runnerSession.lastKnownState},async stop(){},async collectArtifacts(){}};async function jg(e,t){let r=js.join(js.dirname(e.logPath??e.worktreePath),".launch-environment");await Mg(r,{recursive:!0,mode:448});let n=js.join(r,`${e.id}.${Ng()}.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}=${ut(o)}`}).join(`
18
- `);return await _g(n,`${s}
19
- `,{encoding:"utf8",mode:384,flag:"wx"}),n}var Fg=async(e,t)=>{let r=await N("tmux",["list-panes","-F","#{pane_id}","-t",e.paneId],{cwd:t});return Hl({paneId:e.paneId,windowTarget:e.windowTarget,alive:r.exitCode===0&&r.stdout.split(/\s+/).some(n=>n.trim()===e.paneId)})},Hl=async e=>({paneId:e.paneId,windowTarget:e.windowTarget,alive:e.alive,capturedAt:new Date().toISOString()});var Ws=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 or(e,n.workspaceId,s,{runner:o,config:i,...n.lineage?{lineage:n.lineage}:{}}):await Nt(e,t,s,{runner:o,config:i,...n.lineage?{lineage:n.lineage}:{}}),l=a.task,c=k.runners.buildCommand(o,s,i),d=`session_${l.id}`,u=l.artifacts.logPath?zl.resolve(e.workspaceRoot,l.artifacts.logPath):zl.join(e.logsDir,`${l.id}.log`);try{let g=await n.onProvisioned?.(l);await Fs.prepare(l,{repoRoot:a.repoRoot});let f=await lr.create(e,{sessionId:d,taskId:l.id,repoId:a.repoId,workspaceId:a.workspaceId,repoRoot:a.repoRoot,worktreePath:l.worktreePath,logPath:u,command:c});await Fs.launch(l,{repoRoot:a.repoRoot,session:f,...g?{environment:g}:{}});let p=new Date().toISOString();f={...f,status:"running",startedAt:p,command:c};let w=await E(e,l.id,R=>({...R,status:"running",runner:o,sessionId:f.id,selectedPtyTabId:R.selectedPtyTabId,runnerSession:{command:f.command,pid:null,startedAt:p,lastKnownState:"running",exitCode:null,exitedAt:null}}));return await dt(e,f),{kind:"createTask",taskId:w.id,repoId:w.repoId,workspaceId:w.workspaceId,sessionId:f.id,status:w.status,branch:w.branch,worktreePath:w.worktreePath,runner:w.runner}}catch(g){throw await E(e,l.id,f=>({...f,sessionId:null,status:"draft",runnerSession:{...f.runnerSession,lastKnownState:"failed"},lastFailureReason:g instanceof Error?g.message:"Unknown Craig error"})),g}};import{mkdir as Vg}from"node:fs/promises";import Kg from"node:path";var xe=async e=>{let t=await N("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var Yl=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})},Mt=async(e,t)=>{let r=await C("gh",qs(e),{cwd:t});return JSON.parse(r.stdout)},Lt=async(e,t)=>{let r=await N("gh",qs(e),{cwd:t});if(r.exitCode===0)return JSON.parse(r.stdout);let n=r.stderr.trim()||r.stdout.trim();if(Ql(n))return null;throw new Error(n||`GitHub CLI failed while discovering a pull request for ${e}.`)},Jl=async(e,t)=>{let r=await N("gh",qs(e),{cwd:t});if(r.exitCode===0)return JSON.parse(r.stdout);let n=r.stderr.trim()||r.stdout.trim();if(Ql(n))return null;throw new Error(n||`GitHub CLI failed while discovering a pull request for ${e}.`)},Xl=async(e,t,r)=>{if(r.length===0)return[];let n=Ug(r),s;try{s=await C("gh",["api","graphql","-f",`query=${n}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw Wg(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=Bg(c);return{id:a.id,found:d!==null,view:d}})},rn=async e=>{let t=await N("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:qg(t.stdout.trim())},He=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])}},Wg=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")},Ql=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},qs=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],qg=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},Ug=e=>`
14
+ `)}`}let t=V(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})`},iT=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",oT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",aT=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var np=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.")},ba=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 lT(e,s);await F("git",["worktree","add","-b",t,n,o],{cwd:e})},lT=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,Qs=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},rp=async e=>{await F("git",["add","-A"],{cwd:e})},sp=async(e,t)=>{await F("git",["commit","-m",t],{cwd:e})},ip=async e=>{let t=await F("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}},op=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 ap=async(e,t)=>{await F("git",["worktree","remove","--force",t],{cwd:e})};var Ra=async e=>Yn(e,e.repoRoot),Yn=async(e,t)=>{let n=await ve(e),r=lp(new Date),s=cp(n.taskIds,r);for(;;){let i=`task_${r}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await np(t,o))return i;s+=1}},_r=async e=>{let t=await ve(e),n=lp(new Date),r=cp(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`},lp=e=>{let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}${n}${r}`},cp=(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 xr=async(e,t,n={readRawTask:bt,validateTaskRecord:je})=>{let r=await ve(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(cT(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}},cT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var up=["merge_ready","pr_open","checked","review","running","draft"],Sa=e=>[...e].sort((t,n)=>t.id.localeCompare(n.id)),Pa=(e,t)=>t&&e.some(r=>r.id===t)?t:e.length===0?null:[...e].sort(uT)[0]?.id??null,uT=(e,t)=>{let n=dp(e.status),r=dp(t.status);return n!==r?n-r:t.updatedAt.localeCompare(e.updatedAt)},dp=e=>{let t=up.indexOf(e);return t>=0?t:up.length};import pp from"node:path";var wn=(e,t)=>t?pp.isAbsolute(t)?t:pp.join(e.repoRoot,t):null;import{randomUUID as dT}from"node:crypto";import{mkdir as Fr,rm as pT,writeFile as Zs}from"node:fs/promises";import H from"node:path";var mp=["AGENTS","md"].join("."),zn=async(e,t,n,r={})=>{let s=await qe(e,t),[i,o]=await Promise.all([yT(e,s.id),Yn(e,s.rootPath)]),a=r.sessionId??null,l=`craig/${o}`,c=H.join(e.worktreesDir,s.id,o),d=H.join(e.logsDir,`${o}.log`),u=H.join(e.artifactsDir,o);await Promise.all([Fr(H.dirname(c),{recursive:!0}),Fr(u,{recursive:!0}),Zs(d,"","utf8")]);let p=fT(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 Rt(e,p),await ya(e,o),await ba(s.rootPath,l,c,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,sessionId:a,workspaceId:i.id,task:p}},Lr=async(e,t,n,r={})=>{let s=(await Oe(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 zn(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 _r(e),a=new Date().toISOString(),l=r.runner??"codex",c=r.sessionId??null,d=`craig/${o}`,u=H.join(e.craigDir,"task-bundles",o),p=H.join(e.logsDir,`${o}.log`),h=H.join(e.artifactsDir,o);await Fr(u,{recursive:!0}),await Fr(h,{recursive:!0}),await Zs(p,"","utf8");let f=await Promise.all(i.map(b=>qe(e,b))),m=hT(f),y=await Promise.all(f.map(b=>mT(e,b,o,d,H.join(u,m.get(b.id))))),T=y.find(b=>b.status==="ready")??y[0];if(!y.some(b=>b.status==="ready"))throw await pT(u,{recursive:!0,force:!0}),new Error(`No project repo targets could be provisioned for ${t}: ${y.map(b=>`${b.repoId}: ${b.failureReason??"unknown error"}`).join("; ")}`);await Zs(H.join(u,"manifest.json"),JSON.stringify({taskId:o,workspaceId:t,prompt:n,repos:y.map(b=>({repoId:b.repoId,repoName:f.find($=>$.id===b.repoId)?.name??b.repoId,path:H.relative(u,b.worktreePath),status:b.status,worktreePath:b.worktreePath,failureReason:b.failureReason}))},null,2),"utf8"),await Zs(H.join(u,mp),gT({taskId:o,workspaceId:t,prompt:n,repos:f,repoTargets:y,bundlePath:u}),"utf8");let R=Mr(o,n,a,l,r.config??{}),v={id:o,title:n,slug:gp(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),...hp(o,r.lineage),repoRoot:u,worktreePath:u,branch:d,bundlePath:u,selectedRepoTargetId:T.repoId,repoTargets:y,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:ei(),lastFailureReason:y.every(b=>b.status==="unavailable")?"No project repo targets could be provisioned.":null,createdAt:a,updatedAt:a};return await Rt(e,v),await ya(e,o),{repoId:T.repoId,repoRoot:u,sessionId:c,workspaceId:s.id,task:v,bundlePath:u,repoTargets:y}},Mr=(e,t,n,r="codex",s={})=>{let i=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",...s.previews?.agentOrchestration?{capabilityId:`capability_${dT()}`}:{},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}]},fT=(e,t)=>{let n=new Date().toISOString(),r=Mr(t.taskId,t.prompt,n,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:gp(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,sessionId:t.sessionId,selectedPtyTabId:r[0]?.id??null,linkedRepoIds:[],...hp(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:{...Ia(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:ei(),lastFailureReason:null,createdAt:n,updatedAt:n}},mT=async(e,t,n,r,s)=>{await Fr(H.dirname(s),{recursive:!0});try{return await ba(t.rootPath,r,s,t.defaultBranch),{repoId:t.id,branch:r,repoRoot:t.rootPath,worktreePath:s,status:"ready",failureReason:null,checks:Ia(H.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:fp(),cleanup:ei()}}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:Ia(H.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:fp(),cleanup:ei()}}},hT=e=>{let t=new Set(["manifest.json",mp]),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},gT=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
+ `)},Ia=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),fp=()=>({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}),ei=()=>({paneClosedAt:null,worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),hp=(e,t)=>({parentTaskId:t?.parentTaskId??null,rootTaskId:t?.rootTaskId??e,delegationDepth:t?.delegationDepth??0,delegationIdempotencyKey:t?.delegationIdempotencyKey??null,furyRunId:t?.furyRunId??null,furyStepId:t?.furyStepId??null}),yT=async(e,t)=>{let r=(await Oe(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},gp=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");import Cp from"node:path";import{readFile as wT,rm as aD}from"node:fs/promises";import kT from"node:path";var Wt=async(e,t)=>{let n=await wT(va(e,t),"utf8"),r=JSON.parse(n);return TT(r,va(e,t))},kn=async(e,t)=>{await M(va(e,t.id),{...t,updatedAt:new Date().toISOString()})};var va=(e,t)=>kT.join(e.sessionsDir,`${t}.json`);function TT(e,t){let n=ST(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")||!RT(n.attach)||!bT(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 bT(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 RT(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 ST(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 MT}from"node:crypto";import{mkdir as jT,rm as qT,writeFile as UT}from"node:fs/promises";import Ea from"node:path";import{spawn as PT}from"node:child_process";import{createHash as IT}from"node:crypto";import vT from"node:path";function Tn(e){return`'${e.replace(/'/g,"'\\''")}'`}var CT="craig",yp=async(e,t,n)=>{let r=Ca(e,t),s=ET(),i=await F("tmux",["new-session","-d","-P","-F","#{session_name} #{window_id} #{pane_id}","-s",r,"-n","runner",...s,"-c",n],{cwd:e}),o=$T(i.stdout);return await AT(e,r),o};var AT=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 F("tmux",r,{cwd:e})},wp=async(e,t,n)=>{await F("tmux",["resize-window","-t",t,"-x",`${n.columns}`,"-y",`${n.rows}`],{cwd:e})},kp=async(e,t,n)=>{await F("tmux",["send-keys","-t",e,t,"C-m"],{cwd:n})};var Tp=async(e,t,n)=>{await F("tmux",["pipe-pane","-o","-t",e,`cat >> ${Tn(t)}`],{cwd:n})},ti=async(e,t,n,r)=>{let s=r??Rp(e);if(n?await F("tmux",["select-window","-t",n],{cwd:e}):await F("tmux",["select-window","-t",t],{cwd:e}),await F("tmux",["select-pane","-t",t],{cwd:e}),process.env.TMUX){await F("tmux",["switch-client","-t",s],{cwd:e});return}await NT(e,["attach-session","-t",s])};var bp=async(e,t)=>{await F("tmux",["kill-session","-t",t],{cwd:e})};var Rp=e=>{let n=vT.basename(e).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"repo",r=IT("sha1").update(e).digest("hex").slice(0,8);return`${CT}-${n}-${r}`},Ca=(e,t)=>`${Rp(e)}-${t.toLowerCase()}`,ET=()=>{let e=OT();return e?["-x",`${e.columns}`,"-y",`${e.rows}`]:[]},OT=()=>{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},$T=e=>{let t=DT(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]}},DT=e=>e.split(/\s+/).map(t=>t.trim()).filter(t=>t.length>0),NT=async(e,t)=>{await new Promise((n,r)=>{let s=PT("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 _T,constants as xT}from"node:fs";import{homedir as Sp}from"node:os";import Bt from"node:path";var FT=[Bt.join(Sp(),".local","bin"),Bt.join(Sp(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function Ip(e=process.env){return LT([...(e.PATH??"").split(Bt.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:FT])}function bn(e=process.env){return{...e,PATH:Ip(e).join(Bt.delimiter)}}function Aa(e,t={}){if(e.includes(Bt.sep)){let n=Bt.isAbsolute(e)?e:Bt.resolve(t.cwd??process.cwd(),e);return Pp(n)?n:null}for(let n of Ip(t.env)){let r=Bt.join(n,e);if(Pp(r))return r}return null}function Rn(e,t={}){let n=Aa(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 Pp(e){try{return _T(e,xT.X_OK),!0}catch{return!1}}function LT(e){return[...new Set(e)]}var jr={async create(e,t){let n=await yp(t.repoRoot,t.taskId,t.worktreePath);t.logPath&&await Tp(n.paneId,t.logPath,t.repoRoot);let r=await vp({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||Ca(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 kn(e,s),s},async attach(e,t,n){let r=await jr.snapshot(t,n);if(!r.alive)throw new Error(`Session ${t.id} is no longer live and cannot be attached.`);await ti(n,t.paneId,t.windowTarget,t.sessionName);let s={...t,status:"running",lastAttachedAt:new Date().toISOString(),snapshot:r};return await kn(e,s),s},async resize(e,t,n,r){await wp(r,t.sessionName,n);let s={...t,attach:{...t.attach,lastSize:n}};return await kn(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 kn(e,r),r},async snapshot(e,t){return BT(e,t)}},Oa={async prepare(e,t){let r=e.runnerSession.command[0],s=bn();Rn(r,{cwd:t.repoRoot,env:s})},async launch(e,t){let n=e.runnerSession.command,r=Rn(n[0],{cwd:e.worktreePath,env:bn()}),s=Object.keys(t.environment??{}).length>0?await WT(t.session,t.environment):null,i=[r,...n.slice(1)].map(a=>Tn(a)).join(" "),o=s?`. ${Tn(s)} && rm -f ${Tn(s)} && exec ${i}`:`exec ${i}`;try{await kp(t.session.paneId,o,t.repoRoot)}catch(a){throw s&&await qT(s,{force:!0}).catch(()=>{}),a}},async status(e){return e.runnerSession.lastKnownState},async stop(){},async collectArtifacts(){}};async function WT(e,t){let n=Ea.join(Ea.dirname(e.logPath??e.worktreePath),".launch-environment");await jT(n,{recursive:!0,mode:448});let r=Ea.join(n,`${e.id}.${MT()}.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}=${Tn(o)}`}).join(`
18
+ `);return await UT(r,`${s}
19
+ `,{encoding:"utf8",mode:384,flag:"wx"}),r}var BT=async(e,t)=>{let n=await G("tmux",["list-panes","-F","#{pane_id}","-t",e.paneId],{cwd:t});return vp({paneId:e.paneId,windowTarget:e.windowTarget,alive:n.exitCode===0&&n.stdout.split(/\s+/).some(r=>r.trim()===e.paneId)})},vp=async e=>({paneId:e.paneId,windowTarget:e.windowTarget,alive:e.alive,capturedAt:new Date().toISOString()});var $a=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 Lr(e,r.workspaceId,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}):await zn(e,t,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}),l=a.task,c=k.runners.buildCommand(o,s,i),d=`session_${l.id}`,u=l.artifacts.logPath?Cp.resolve(e.workspaceRoot,l.artifacts.logPath):Cp.join(e.logsDir,`${l.id}.log`);try{let p=await r.onProvisioned?.(l);await Oa.prepare(l,{repoRoot:a.repoRoot});let h=await jr.create(e,{sessionId:d,taskId:l.id,repoId:a.repoId,workspaceId:a.workspaceId,repoRoot:a.repoRoot,worktreePath:l.worktreePath,logPath:u,command:c});await Oa.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 W(e,l.id,y=>({...y,status:"running",runner:o,sessionId:h.id,selectedPtyTabId:y.selectedPtyTabId,runnerSession:{command:h.command,pid:null,startedAt:f,lastKnownState:"running",exitCode:null,exitedAt:null}}));return await kn(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 W(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 YT}from"node:fs/promises";import zT from"node:path";var It=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 Ap=async(e,t,n)=>{let r=n==="merge"?"--merge":n==="rebase"?"--rebase":"--squash";await F("gh",["pr","merge",String(t),r,"--delete-branch=false"],{cwd:e})},Jn=async(e,t)=>{let n=await F("gh",Da(e),{cwd:t});return JSON.parse(n.stdout)},Xn=async(e,t)=>{let n=await G("gh",Da(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if($p(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Ep=async(e,t)=>{let n=await G("gh",Da(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if($p(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Op=async(e,t,n)=>{if(n.length===0)return[];let r=GT(n),s;try{s=await F("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw VT(a)?new Ue(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}`],d=HT(c);return{id:a.id,found:d!==null,view:d}})},ni=async e=>{let t=await G("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:KT(t.stdout.trim())},Vt=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])}},VT=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")},$p=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},Da=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],KT=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},GT=e=>`
20
20
  query CraigPullRequestBatch($owner: String!, $name: String!) {
21
21
  repository(owner: $owner, name: $name) {
22
- ${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(`
23
23
  `)}
24
24
  }
25
25
  }
@@ -70,19 +70,155 @@ fragment PrFields on PullRequest {
70
70
  }
71
71
  }
72
72
  }
73
- `,Bg=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 ft=async(e,t)=>{let r=ct(e,t.artifacts.prStatusPath);r&&(await Vg(Kg.dirname(r),{recursive:!0}),await O(r,{taskId:t.id,prs:t.prs}))},cr=async(e,t,r={writeTask:Ce,writePrStatusArtifact:ft})=>{await r.writeTask(e,t);try{await r.writePrStatusArtifact(e,t)}catch(n){throw new m("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},dr=async(e,t,r,n,s={readRawTask:Ie,validateTaskRecord:pe,writeTask:Ce,writePrStatusArtifact:ft,withTaskLock:Be})=>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(g=>n?.number!==null&&g.number===n?.number)??n,l=Ee(r,a),c=Ae(o,l),d=o.status==="closed"?o.status:lt(c.prs),u={...c,status:d};return cr(e,u,s)}),ur=async(e,t)=>{let r=D(t),n=r?.number?String(r.number):t.branch,s=await Mt(n,t.worktreePath);return dr(e,t,s,r)},pr=async(e,t)=>{for(let r of await Us(t)){let n=await Lt(r,t.worktreePath);if(!n)continue;return{discovered:!0,task:await dr(e,t,n,null)}}return{discovered:!1,task:t}},Us=async e=>{let t=await Cl(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(r=>!!r))]};async function mr(e,t,r,n){return Be(e,t,async()=>{let s=await A(e,t);if(!s.repoTargets?.find(f=>f.repoId===r))throw new Error(`Project task ${t} has no repo target ${r}.`);let o=He(n.url),a=s.prs.find(f=>o?Dt(f,{owner:o.owner,repo:o.name,number:n.number}):f.number===n.number)??null,l=Ee(n,a,o??void 0),c=Gg(n),d=Ae(s,l),u={...d,repoTargets:(d.repoTargets??[]).map(f=>f.repoId===r?{...f,pullRequest:c}:f)},g={...u,status:u.status==="closed"?u.status:Bs(u)};return cr(e,g)})}function Gg(e){let t=He(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:Hg(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:zg(e.reviewDecision??null),requiredChecks:As(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function Bs(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 Hg=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,zg=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null;var _t=async(e,t,r)=>{let n=r.pullRequest.number?String(r.pullRequest.number):r.branch;if(r.pullRequest.number){let i=await Mt(n,r.worktreePath);return await mr(e,t.id,r.repoId,i),"synced"}let s=await Lt(n,r.worktreePath);return s?(await mr(e,t.id,r.repoId,s),"discovered"):"not_found"};var fr=async(e,t)=>{let r=await A(e,t),n=D(r);return n?.number?(await xe(r.worktreePath),Ve(n)?(await pr(e,r)).task:ur(e,r)):r},Ks=async(e,t)=>{let r=await A(e,t);if(r.type==="project"&&r.repoTargets?.length)return await jt(e,t),A(e,t);let n=D(r);if(await X(r),await xe(r.worktreePath),!n?.number||Ve(n)){let i=await pr(e,r);if(!i.discovered&&!n?.number)throw new Error(`No PR found for ${r.branch}.`);return i.task}return await ur(e,r)},jt=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 _t(e,r,i):await _t(e,r,i).catch(()=>"not_found");s[o==="not_found"?"notFound":o]++}return s},Gs=async(e,t)=>{let r=new Map,n=new Map,s=[];for(let i of t){let o=Vs(r,i);if(i.type==="project"&&i.repoTargets?.length){for(let u of i.repoTargets.filter(g=>g.status==="ready")){let g={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 Zl(n,g).catch(async()=>{try{await xe(u.worktreePath);let f=u.pullRequest.number?await _t(e,i,u):await _t(e,i,u);nn(o,f,u.pullRequest.number??null,u.pullRequest.url??null)}catch(f){if(f instanceof fe)throw f;s.push(f)}})}continue}let a=D(i),l=a?.number&&!Ve(a),c=l?[]:await Us(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 Zl(n,d).catch(async()=>{try{let{disposition:u,task:g}=await sn(e,i.id),f=D(g);nn(o,u,f?.number??null,f?.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 Xl(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=Vs(r,l.task),u=a.get(l.id)?.view??await Yg(i.worktreePath,l);if(!u){nn(c,"not_found",null,null);continue}if(l.targetRepoId)await mr(e,l.task.id,l.targetRepoId,u);else{let g=await Ie(e,l.task.id),f=pe(g,`${e.tasksDir}/${l.task.id}.json`);await dr(e,f,u,l.mode==="number"?D(f):null)}nn(c,l.mode==="number"?"synced":"discovered",u.number,u.url)}}catch(o){if(o instanceof fe)throw o;s.push(o)}return Jg(s),t.map(i=>Vs(r,i))},sn=async(e,t)=>{let r=await A(e,t);await X(r),await xe(r.worktreePath);let n=D(r);if(n?.number&&!Ve(n))return{disposition:"synced",task:await ur(e,r)};let s=await pr(e,r);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},Yg=async(e,t)=>{if(t.mode!=="head")return null;for(let r of t.fallbackSelectors){let n=await Lt(r,e);if(n)return n}return null},Zl=async(e,t)=>{let r=await rn(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]})},Vs=(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):!!D(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,n),n},nn=(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},Jg=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var Hs=async(e,t)=>{let r=await A(e,t);try{r.type==="project"&&r.repoTargets?.length?(await jt(e,t),r=await A(e,t)):r.prs.some(i=>i.number)&&(r=await fr(e,t))}catch{}let n=await rr(e,r),s=r.sessionId?await Ke(e,r.sessionId).catch(()=>null):null;return{kind:"showTask",task:r,inspection:n,session:s}};var zs=async(e,t)=>{let r=await A(e,t);if(await X(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 Xg(r.worktreePath);return{kind:"showTaskDiff",taskId:r.id,diffText:s,isEmpty:!1}},Xg=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 Qg(e);for(let s of n){let i=await N("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(i.stdout.trimEnd())}return t.join(`
73
+ `,HT=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 Sn=async(e,t)=>{let n=wn(e,t.artifacts.prStatusPath);n&&(await YT(zT.dirname(n),{recursive:!0}),await M(n,{taskId:t.id,prs:t.prs}))},qr=async(e,t,n={writeTask:Rt,writePrStatusArtifact:Sn})=>{await n.writeTask(e,t);try{await n.writePrStatusArtifact(e,t)}catch(r){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:r})}return t},Ur=async(e,t,n,r,s={readRawTask:bt,validateTaskRecord:je,writeTask:Rt,writePrStatusArtifact:Sn,withTaskLock:qt})=>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=Pt(n,a),c=St(o,l),d=o.status==="closed"?o.status:yn(c.prs),u={...c,status:d};return qr(e,u,s)}),Wr=async(e,t)=>{let n=V(t),r=n?.number?String(n.number):t.branch,s=await Jn(r,t.worktreePath);return Ur(e,t,s,n)},Br=async(e,t)=>{for(let n of await Na(t)){let r=await Xn(n,t.worktreePath);if(!r)continue;return{discovered:!0,task:await Ur(e,t,r,null)}}return{discovered:!1,task:t}},Na=async e=>{let t=await op(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(n=>!!n))]};async function Vr(e,t,n,r){return qt(e,t,async()=>{let s=await L(e,t);if(!s.repoTargets?.find(h=>h.repoId===n))throw new Error(`Project task ${t} has no repo target ${n}.`);let o=Vt(r.url),a=s.prs.find(h=>o?Gn(h,{owner:o.owner,repo:o.name,number:r.number}):h.number===r.number)??null,l=Pt(r,a,o??void 0),c=JT(r),d=St(s,l),u={...d,repoTargets:(d.repoTargets??[]).map(h=>h.repoId===n?{...h,pullRequest:c}:h)},p={...u,status:u.status==="closed"?u.status:_a(u)};return qr(e,p)})}function JT(e){let t=Vt(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:XT(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:QT(e.reviewDecision??null),requiredChecks:ka(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function _a(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 XT=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,QT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null;var Qn=async(e,t,n)=>{let r=n.pullRequest.number?String(n.pullRequest.number):n.branch;if(n.pullRequest.number){let i=await Jn(r,n.worktreePath);return await Vr(e,t.id,n.repoId,i),"synced"}let s=await Xn(r,n.worktreePath);return s?(await Vr(e,t.id,n.repoId,s),"discovered"):"not_found"};var Kr=async(e,t)=>{let n=await L(e,t),r=V(n);return r?.number?(await It(n.worktreePath),Ut(r)?(await Br(e,n)).task:Wr(e,n)):n},Fa=async(e,t)=>{let n=await L(e,t);if(n.type==="project"&&n.repoTargets?.length)return await Zn(e,t),L(e,t);let r=V(n);if(await me(n),await It(n.worktreePath),!r?.number||Ut(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 Wr(e,n)},Zn=async(e,t)=>{let n=await L(e,t),r=(n.repoTargets??[]).filter(i=>i.status==="ready"),s={synced:0,discovered:0,notFound:0};for(let i of r){await It(i.worktreePath);let o=i.pullRequest.number?await Qn(e,n,i):await Qn(e,n,i).catch(()=>"not_found");s[o==="not_found"?"notFound":o]++}return s},La=async(e,t)=>{let n=new Map,r=new Map,s=[];for(let i of t){let o=xa(n,i);if(i.type==="project"&&i.repoTargets?.length){for(let u of i.repoTargets.filter(p=>p.status==="ready")){let p={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 Dp(r,p).catch(async()=>{try{await It(u.worktreePath);let h=u.pullRequest.number?await Qn(e,i,u):await Qn(e,i,u);ri(o,h,u.pullRequest.number??null,u.pullRequest.url??null)}catch(h){if(h instanceof Ue)throw h;s.push(h)}})}continue}let a=V(i),l=a?.number&&!Ut(a),c=l?[]:await Na(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 Dp(r,d).catch(async()=>{try{let{disposition:u,task:p}=await si(e,i.id),h=V(p);ri(o,u,h?.number??null,h?.url??null)}catch(u){if(u instanceof Ue)throw u;s.push(u)}})}for(let i of r.values())try{await It(i.worktreePath);let o=await Op(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=xa(n,l.task),u=a.get(l.id)?.view??await ZT(i.worktreePath,l);if(!u){ri(c,"not_found",null,null);continue}if(l.targetRepoId)await Vr(e,l.task.id,l.targetRepoId,u);else{let p=await bt(e,l.task.id),h=je(p,`${e.tasksDir}/${l.task.id}.json`);await Ur(e,h,u,l.mode==="number"?V(h):null)}ri(c,l.mode==="number"?"synced":"discovered",u.number,u.url)}}catch(o){if(o instanceof Ue)throw o;s.push(o)}return eb(s),t.map(i=>xa(n,i))},si=async(e,t)=>{let n=await L(e,t);await me(n),await It(n.worktreePath);let r=V(n);if(r?.number&&!Ut(r))return{disposition:"synced",task:await Wr(e,n)};let s=await Br(e,n);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},ZT=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},Dp=async(e,t)=>{let n=await ni(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]})},xa=(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):!!V(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,r),r},ri=(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},eb=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var Ma=async(e,t)=>{let n=await L(e,t);try{n.type==="project"&&n.repoTargets?.length?(await Zn(e,t),n=await L(e,t)):n.prs.some(i=>i.number)&&(n=await Kr(e,t))}catch{}let r=await Nr(e,n),s=n.sessionId?await Wt(e,n.sessionId).catch(()=>null):null;return{kind:"showTask",task:n,inspection:r,session:s}};var ja=async(e,t)=>{let n=await L(e,t);if(await me(n),(await F("git",["status","--short"],{cwd:n.worktreePath})).stdout.trim().length===0)return{kind:"showTaskDiff",taskId:n.id,diffText:"",isEmpty:!0};let s=await tb(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}},tb=async e=>{let t=[],n=await F("git",["diff","--stat","--patch","HEAD"],{cwd:e});n.stdout.trim().length>0&&t.push(n.stdout.trimEnd());let r=await nb(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(`
74
74
 
75
- `)},Qg=async e=>(await C("git",["ls-files","--others","--exclude-standard"],{cwd:e})).stdout.split(`
76
- `).map(r=>r.trim()).filter(r=>r.length>0);import{spawn as Zg}from"node:child_process";import{access as eh}from"node:fs/promises";var Ys=async(e,t)=>{let r=await A(e,t),n=Ot(e,r);if(!n)throw new Error(`Task ${r.id} does not have a Craig-managed log path.`);try{await eh(n)}catch{throw new Error(`Task ${r.id} log file does not exist yet at ${n}.`)}return{kind:"streamTaskLogs",taskId:r.id,logPath:n}},Js=async e=>{await new Promise((t,r)=>{let n=!1,s=Zg("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 th}from"node:fs/promises";import rh from"node:path";var Xs=async(e,t)=>{let r=await A(e,t);if(await X(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 Qr(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 E(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 N("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 g=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,f=await E(e,r.id,p=>({...p,status:"review",checks:{...p.checks,results:i,status:"failed",lastRunAt:d},lastFailureReason:g}));return await ec(e,f),{kind:"runChecks",taskId:r.id,status:"failed",commands:s}}}let o=await E(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 ec(e,o),{kind:"runChecks",taskId:r.id,status:"passed",commands:s}},ec=async(e,t)=>{let r=ct(e,t.artifacts.checkSummaryPath);r&&(await th(rh.dirname(r),{recursive:!0}),await O(r,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))};var Qs=async(e,t)=>{let r=await A(e,t);await X(r);let n=await Qr(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 Sl(r.worktreePath),await vl(r.worktreePath,s);let i=await Il(r.worktreePath),o=new Date().toISOString(),a=await E(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 nh}from"node:fs/promises";var Zs=async(e,t)=>{let r=await A(e,t),n=await sh(r.worktreePath);return E(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:n&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},sh=async e=>{try{return await nh(e),!0}catch{return!1}};var ei=async(e,t,r)=>{let n=[],s=null,i=null;try{if(t.sessionId){let o=await Ke(e,t.sessionId);await Ul(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 Al(e.repoRoot,t.worktreePath),i=new Date().toISOString()}catch(o){n.push(o instanceof Error?o.message:"Failed to remove worktree.")}await E(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 ti=async(e,t,r)=>{let n=await me(e,r),s=await E(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}},ri=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 ni=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),Ke(e,r.sessionId)]),i=await lr.attach(e,s,n.rootPath);return{kind:"attachTask",taskId:r.id,sessionId:i.id,disposition:"attached"}};var si=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 Ke(e,r.sessionId).catch(s=>{throw ih(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 tn(e.repoRoot,n.paneId,n.windowTarget,n.sessionName),{kind:"focusTask",taskId:r.id,tmuxTarget:n.paneId}},ih=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";import{spawn as oh}from"node:child_process";var ii=async(e,t)=>{let r=await A(e,t);await X(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 ah(i,e.repoRoot),{kind:"openTask",taskId:r.id,worktreePath:r.worktreePath,launched:!0,command:i}},ah=async(e,t)=>{await new Promise((r,n)=>{let[s,...i]=e,o=oh(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 oi=async(e,t,r)=>{await E(e,t,n=>({...n,status:n.status==="running"?"draft":n.status,runnerSession:{...n.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:r}))},ai=async(e,t,r)=>E(e,t,n=>({...n,status:"draft",runnerSession:{...n.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:r})),li=async(e,t)=>E(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 rc}from"node:fs/promises";import gr from"node:path";async function di(e,t){if(t.explicitTaskId!==void 0){let l=await tc(e,t.explicitTaskId,"explicit");return ci(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await tc(e,t.environmentTaskId,"environment");return ci(l,"environment",t.environmentAgentTabId)}let r=await rc(t.cwd).catch(()=>gr.resolve(t.cwd)),n=await sr(e,{includeClosed:!0}),i=(await Promise.all(n.tasks.map(async l=>({task:l,matches:await ch(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 m("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 ci(a,"cwd",t.environmentAgentTabId);if(t.environmentAgentTabId!==void 0)throw new m("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 m("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 tc(e,t,r){try{return await A(e,t)}catch(n){throw!(n instanceof m)||n.code!=="TASK_NOT_FOUND"?n:new m("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 ci(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 m("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 lh(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function ch(e,t){return(await Promise.all(lh(e).map(n=>rc(n).catch(()=>gr.resolve(n))))).some(n=>dh(n,t))}function dh(e,t){let r=gr.relative(gr.resolve(e),t);return r===""||!r.startsWith("..")&&!gr.isAbsolute(r)}var ui=async(e,t,r="merge",n)=>{let s=await A(e,t),i=n??D(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await Yl(s.worktreePath,i,r)};var hr={readTask:A,writeTask:Ce,withTaskLock:Be,ensureGhAuthenticated:xe,fetchPrView:Mt,discoverPrView:Jl,getGitHubRepositoryLocator:rn,writePrStatusArtifact:ft};async function mi(e,t,r,n=hr){let s=await n.readTask(e,t),i=await ph(s,r,n);return ze(s,i,"showTaskPr","shown",[])}async function fi(e,t,r,n=hr){return n.withTaskLock(e,t,async()=>{let s=await n.readTask(e,t),i=await yi(s,r,null,n);await Ti(i,n);let o=await an(`discover a pull request for ${i.branch}`,()=>n.discoverPrView(i.branch,i.worktreePath));if(!o)return ze(s,i,"discoverTaskPr","not_found",[]);Ri(o,i);let a=ln(s,i,o.number),l=await bi(e,s,i,o,n);return ze(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function gi(e,t,r,n,s=hr){let i=ki(r);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await yi(o,n,i.repository,s);sc(i.repository,a),await Ti(a,s);let l=await an(`fetch pull request ${r}`,()=>s.fetchPrView(r,a.worktreePath));mh(l,i),Ri(l,a);let c=ln(o,a,l.number),d=Pi(o,a),u=d&&!Dt(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.`]:[],g=await bi(e,o,a,l,s);return ze(g,a,"linkTaskPr",c?"unchanged":"linked",u)})}async function uh(e,t,r,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw Ft(e,t);let o=e.prs.find(a=>a.number===r.number)??D(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await on(o,e.worktreePath,e.repoId,n),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw Ft(e,t);let a=nc(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 on(l,o.worktreePath,t,n),projectTarget:o}}if(!r.repository)throw new m("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 m("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 hi(e,t,r,n=hr){return n.withTaskLock(e,t,async()=>{let s=await n.readTask(e,t),i=await yi(s,r,null,n),o=Pi(s,i);if(!o?.number)return ze(s,i,"refreshTaskPr","not_found",[]);await Ti(i,n);let a=await an(`refresh pull request #${o.number}`,()=>n.fetchPrView(String(o.number),i.worktreePath));Ri(a,i);let l=await bi(e,s,i,a,n);return ze(l,i,"refreshTaskPr","synced",[])})}async function wi(e,t,r,n,s=hr){let i=ki(r);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await uh(o,n,i,s);if(sc(i.repository,a),!ln(o,a,i.number))return ze(o,a,"unlinkTaskPr","unchanged",[]);let c=fh(o,a,i.number),d=await oc(e,c,s);return ze(d,a,"unlinkTaskPr","unlinked",[])})}function ki(e){let t=e.trim(),r=He(t);if(r)return{number:r.number,repository:r};if(/^[1-9]\d*$/.test(t))return{number:Number(t),repository:null};throw new m("CLI_USAGE",`Invalid pull request selector "${e}". Use a GitHub pull request URL or positive number.`,{details:{selector:e}})}async function yi(e,t,r,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw Ft(e,t);return pi(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 Ft(e,t);return pi(o.repoId,o.branch,o.worktreePath,o,n)}if(!r)throw new m("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 pi(o.repoId,o.branch,o.worktreePath,o,n).catch(l=>{if(l instanceof m&&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 m("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 ph(e,t,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw Ft(e,t);let s=D(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await on(s,e.worktreePath,e.repoId,r),projectTarget:null}}if(!t)throw new m("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 Ft(e,t);return{repoId:t,branch:n.branch,worktreePath:n.worktreePath,repository:await on(n.pullRequest,n.worktreePath,t,r),projectTarget:n}}async function on(e,t,r,n){let s=nc(e);return s||(await n.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:r})}function nc(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?He(e.url):null}async function pi(e,t,r,n,s){let i=await s.getGitHubRepositoryLocator(r);if(!i)throw new m("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 Ti(e,t){await an("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function an(e,t){try{return await t()}catch(r){throw r instanceof m?r:new m("EXTERNAL_DEPENDENCY_FAILED",`Failed to ${e}: ${r instanceof Error?r.message:String(r)}`,{retryable:!0,cause:r})}}function sc(e,t){if(e&&!Te(e,t.repository))throw ic(e,t)}function mh(e,t){let r=He(e.url);if(!r||r.number!==t.number)throw new m("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 m("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 Ri(e,t){let r=He(e.url);if(!r||!Te(r,t.repository))throw ic(r,t);if(e.headRefName!==t.branch)throw new m("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 ic(e,t){return new m("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 Ft(e,t){return new m("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 bi(e,t,r,n,s){let i=ln(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:cc(o)}:l)}),oc(e,a,s)}function fh(e,t,r){let n=e.prs.filter(i=>!lc(i,t,r)),s={...e,prs:n};if(t.projectTarget?.pullRequest.number===r){let i=ac(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?cc(i):hh(t.repository)}:o)}}return s}async function oc(e,t,r){let n=t.status==="closed"?t.status:t.type==="project"?Bs(t):lt(t.prs),s={...t,status:n};return cr(e,s,r)}function ln(e,t,r){return Si(e,t).find(n=>lc(n,t,r))??null}function Pi(e,t){if(!t.projectTarget)return D(e);let r=Si(e,t);return ac(r)}function ac(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function Si(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?gh(n.pullRequest,t.repository):null;return s&&!r.some(i=>Dt(i,s))?[...r,s]:r}function lc(e,t,r){return e.number!==r?!1:!e.owner||!e.repo||Te({owner:e.owner,name:e.repo},t.repository)}function ze(e,t,r,n,s){let i=Si(e,t);return{kind:r,taskId:e.id,repoId:t.repoId,disposition:n,pullRequests:i,primaryPullRequest:Pi(e,t),warnings:s}}function cc(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 gh(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 hh(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 T={listTasks:sr,getTask:A,provisionTask:Nt,provisionProjectTask:or,createTask:Ws,showTask:Hs,showTaskDiff:zs,prepareTaskLogs:Ys,streamTaskLogs:Js,runChecks:Xs,commitTask:Qs,closeTask:Zs,cleanupTask:ei,addTaskLink:ti,listTaskLinks:ri,sortTasksForDisplay:Os,resolveSelectedTaskId:$s,allocateTaskId:Ds,allocateTaskIdForRepo:$t,allocateProjectTaskId:nr,createDefaultTaskPtyTabs:ar,assertTaskWorktreeExists:X,resolveTaskLogPath:Ot,buildTaskInspection:rr,resolveArtifactPath:ct,attachTask:ni,focusTask:si,openTask:ii,markRunnerFailed:oi,recordStartupFailure:ai,markTaskStarted:li,resolveContext:di,prs:{refresh:fr,refreshChecks:Ks,discoverOrRefresh:sn,discoverOrRefreshAll:jt,discoverOrRefreshMany:Gs,show:mi,discover:fi,link:gi,refreshAssociation:hi,unlink:wi,merge:ui,getPrimaryPr:D,isPrTerminal:Ve,isMergeReady:Xr,deriveTaskStatus:lt,upsertPr:Ae,normalizePr:Ee,summarizeRequiredChecks:Cs,writePrStatusArtifact:ft}};var dc={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 Ye(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 Wt(e,t,r){let n="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=Ye(e,s.id,t,r);dc[i]>dc[n]&&(n=i)}return n}function cn(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=Ye(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:Wt(i,t,r),agentTabIds:n.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:n,tasks:s}}async function vi(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 m("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(f=>f.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 uc(e.id);let u=a-n();if(u<=0)throw wh(e.id,r.states,r.timeoutMs);let g=s;await new Promise((f,p)=>{let w=()=>{clearTimeout(x),r.signal?.removeEventListener("abort",R),f()},R=()=>{clearTimeout(x),p(uc(e.id))},x=setTimeout(w,u);i=w,r.signal?.addEventListener("abort",R,{once:!0}),s!==g&&i()}),i=null}}finally{o()}}var wh=(e,t,r)=>new m("OPERATION_TIMEOUT",`Timed out after ${r}ms waiting for task ${e} agent state ${t.join(",")}.`,{retryable:!0,details:{taskId:e,states:t,timeoutMs:r}}),uc=e=>new m("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as Th}from"node:net";import{createHash as kh}from"node:crypto";import{tmpdir as yh}from"node:os";import pc from"node:path";var gt=9;function Oe(e){let t=kh("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:pc.join(yh(),`craig-${t}.sock`),pidPath:pc.join(e.runtimeDir,"pty-daemon.pid")}}async function mc(e){let t=null;try{let r=await Rh(Oe(e.paths).socketPath);return t=new Ci(r,e),await t.ready(),t}catch{return t?.close(),null}}var Ci=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!==gt)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})}
77
- `);let s=await n;if(!s.ok)throw new Error(s.error);return s}handleData(t){this.buffer+=t;let r=this.buffer.indexOf(`
78
- `);for(;r!==-1;){let n=this.buffer.slice(0,r);this.buffer=this.buffer.slice(r+1),this.handleMessage(n),r=this.buffer.indexOf(`
79
- `)}}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 Rh(e){return new Promise((t,r)=>{let n=Th(e);n.once("connect",()=>t(n)),n.once("error",r)})}var Ei={openObserver:gc,listTasks:e=>T.listTasks(e),getTask:(e,t)=>T.getTask(e,t),now:Date.now};async function bh(e,t,r=Ei){let n=await fc(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 Ph(e,t,r=Ei){let n=await fc(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 m("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 Sh(e,t,r,n=Ei){let s=await n.getTask(e,t),i=await n.openObserver(e);try{return await vi(s,i,{...r,now:n.now})}finally{i.close()}}async function fc(e,t,r){return t?[await r.getTask(e,t)]:(await r.listTasks(e)).tasks}async function gc(e){return Ai.open(e)}async function vh(e){return gc(e)}var Ai=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 mc({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()}},$e={listAgents:bh,showAgentStatus:Ph,waitForTask:Sh,openObserver:vh};import{randomUUID as Lh}from"node:crypto";import{mkdir as Tc,open as $i,readdir as Rc,readFile as un,rm as _h,stat as jh}from"node:fs/promises";import Ni from"node:path";import{mkdir as hc,readFile as Ih,rm as dn,stat as Ch,writeFile as Ah}from"node:fs/promises";import xi from"node:path";var Eh=20,xh=3e4,Dh=5e3;async function wc(e,t){let r=xi.join(e.runtimeDir,"event-journal.lock");await hc(e.runtimeDir,{recursive:!0});let n=Date.now();for(;;)try{await hc(r);try{await Ah(xi.join(r,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await dn(r,{recursive:!0,force:!0}),s}break}catch(s){if(!Nh(s))throw s;if(await Oh(r))continue;if(Date.now()-n>=xh)throw new m("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await Mh(Eh)}try{return await t()}finally{await dn(r,{recursive:!0,force:!0})}}async function Oh(e){let t=await Ih(xi.join(e,"owner.json"),"utf8").then(n=>JSON.parse(n)).catch(()=>null);if(t&&typeof t.pid=="number")return $h(t.pid)?!1:(await dn(e,{recursive:!0,force:!0}),!0);let r=await Ch(e).catch(()=>null);return!r||Date.now()-r.mtimeMs<Dh?!1:(await dn(e,{recursive:!0,force:!0}),!0)}function $h(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 Nh=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Mh=e=>new Promise(t=>setTimeout(t,e));var Fh=256*1024,Wh=16,qh=64*1024;async function Ne(e,t,r={}){let n=Oi(r.maxSegmentBytes??Fh,"Event journal segment size"),s=Oi(r.maxSegments??Wh,"Event journal retention"),i=Oi(r.maxRecordBytes??qh,"Event record size");return wc(e,async()=>{await Tc(e.eventsDir,{recursive:!0}),await Gh(e);let o=await Mi(e),a=t.id??Lh(),l=o.events.find(R=>R.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:Yh(t.data)},u=`${JSON.stringify(d)}
80
- `;if(Buffer.byteLength(u)>i)throw new m("CLI_USAGE",`Event record exceeds the ${i}-byte limit.`,{details:{eventType:t.type,maxRecordBytes:i}});let f=(await pn(e)).at(-1),p=!f||await Uh(f.path,u,n);if(p&&(f={name:yc(c),path:Ni.join(e.eventsDir,yc(c)),startSequence:c}),!f)throw new m("INTERNAL_ERROR","Failed to select an event journal segment.",{});let w=await $i(f.path,"a");try{await w.writeFile(u,"utf8"),await w.sync()}finally{await w.close()}return p&&await Sc(e.eventsDir),await Bh(e,s),d})}async function wr(e,t={}){let r=await Mi(e),n=Hh(r.events,t.after,r.earliestSequence,r.events.at(-1)?.sequence??null),s=t.typeGlob?zh(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 bc(e){return(await Mi(e)).events}async function Mi(e){await Tc(e.eventsDir,{recursive:!0});let t=await pn(e),r=[],n=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await un(i.path,"utf8"),a=s===t.length-1,l=o.split(`
75
+ `)},nb=async e=>(await F("git",["ls-files","--others","--exclude-standard"],{cwd:e})).stdout.split(`
76
+ `).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as rb}from"node:child_process";import{access as sb}from"node:fs/promises";var qa=async(e,t)=>{let n=await L(e,t),r=Hn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await sb(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},Ua=async e=>{await new Promise((t,n)=>{let r=!1,s=rb("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 ib}from"node:fs/promises";import ob from"node:path";var Wa=async(e,t)=>{let n=await L(e,t);if(await me(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 Qs(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 W(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}),d=new Date().toISOString(),u=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:d,exitCode:u}),u!==0){let p=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,h=await W(e,n.id,f=>({...f,status:"review",checks:{...f.checks,results:i,status:"failed",lastRunAt:d},lastFailureReason:p}));return await Np(e,h),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await W(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 Np(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},Np=async(e,t)=>{let n=wn(e,t.artifacts.checkSummaryPath);n&&(await ib(ob.dirname(n),{recursive:!0}),await M(n,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))};var Ba=async(e,t)=>{let n=await L(e,t);await me(n);let r=await Qs(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 rp(n.worktreePath),await sp(n.worktreePath,s);let i=await ip(n.worktreePath),o=new Date().toISOString(),a=await W(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 ab}from"node:fs/promises";var Va=async(e,t)=>{let n=await L(e,t),r=await lb(n.worktreePath);return W(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},lb=async e=>{try{return await ab(e),!0}catch{return!1}};var Ka=async(e,t,n)=>{let r=[],s=null,i=null;try{if(t.sessionId){let o=await Wt(e,t.sessionId);await bp(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 ap(e.repoRoot,t.worktreePath),i=new Date().toISOString()}catch(o){r.push(o instanceof Error?o.message:"Failed to remove worktree.")}await W(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 Ga=async(e,t,n)=>{let r=await qe(e,n),s=await W(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}},Ha=async(e,t)=>{let n=await L(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>qe(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};var Ya=async(e,t)=>{let n=await L(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([qe(e,n.repoId),Wt(e,n.sessionId)]),i=await jr.attach(e,s,r.rootPath);return{kind:"attachTask",taskId:n.id,sessionId:i.id,disposition:"attached"}};var za=async(e,t)=>{let n=await L(e,t);if(!n.sessionId)throw new Error(`Task ${n.id} does not have a Craig session.`);let r=await Wt(e,n.sessionId).catch(s=>{throw cb(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 ti(e.repoRoot,r.paneId,r.windowTarget,r.sessionName),{kind:"focusTask",taskId:n.id,tmuxTarget:r.paneId}},cb=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";import{spawn as ub}from"node:child_process";var Ja=async(e,t)=>{let n=await L(e,t);await me(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 db(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},db=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=ub(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 Xa=async(e,t,n)=>{await W(e,t,r=>({...r,status:r.status==="running"?"draft":r.status,runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n}))},Qa=async(e,t,n)=>W(e,t,r=>({...r,status:"draft",runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n})),Za=async(e,t)=>W(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 xp}from"node:fs/promises";import Gr from"node:path";async function tl(e,t){if(t.explicitTaskId!==void 0){let l=await _p(e,t.explicitTaskId,"explicit");return el(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await _p(e,t.environmentTaskId,"environment");return el(l,"environment",t.environmentAgentTabId)}let n=await xp(t.cwd).catch(()=>Gr.resolve(t.cwd)),r=await xr(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await fb(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 g("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 el(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 ${n}. Use --task <id> or run the command inside a task worktree.`,{details:{cwd:n}});return null}async function _p(e,t,n){try{return await L(e,t)}catch(r){throw!(r instanceof g)||r.code!=="TASK_NOT_FOUND"?r:new g("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 el(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 g("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 pb(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function fb(e,t){return(await Promise.all(pb(e).map(r=>xp(r).catch(()=>Gr.resolve(r))))).some(r=>mb(r,t))}function mb(e,t){let n=Gr.relative(Gr.resolve(e),t);return n===""||!n.startsWith("..")&&!Gr.isAbsolute(n)}var nl=async(e,t,n="merge",r)=>{let s=await L(e,t),i=r??V(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await Ap(s.worktreePath,i,n)};var Hr={readTask:L,writeTask:Rt,withTaskLock:qt,ensureGhAuthenticated:It,fetchPrView:Jn,discoverPrView:Ep,getGitHubRepositoryLocator:ni,writePrStatusArtifact:Sn};async function sl(e,t,n,r=Hr){let s=await r.readTask(e,t),i=await gb(s,n,r);return Kt(s,i,"showTaskPr","shown",[])}async function il(e,t,n,r=Hr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await ul(s,n,null,r);await dl(i,r);let o=await oi(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return Kt(s,i,"discoverTaskPr","not_found",[]);pl(o,i);let a=ai(s,i,o.number),l=await fl(e,s,i,o,r);return Kt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function ol(e,t,n,r,s=Hr){let i=cl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await ul(o,r,i.repository,s);Lp(i.repository,a),await dl(a,s);let l=await oi(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));yb(l,i),pl(l,a);let c=ai(o,a,l.number),d=ml(o,a),u=d&&!Gn(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.`]:[],p=await fl(e,o,a,l,s);return Kt(p,a,"linkTaskPr",c?"unchanged":"linked",u)})}async function hb(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw er(e,t);let o=e.prs.find(a=>a.number===n.number)??V(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await ii(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw er(e,t);let a=Fp(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&ct({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await ii(l,o.worktreePath,t,r),projectTarget:o}}if(!n.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:n.number}});let s=n.repository,i=[];for(let o of e.repoTargets??[]){let a=o.pullRequest.owner&&o.pullRequest.repo&&ct({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&ct({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 ${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 al(e,t,n,r=Hr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await ul(s,n,null,r),o=ml(s,i);if(!o?.number)return Kt(s,i,"refreshTaskPr","not_found",[]);await dl(i,r);let a=await oi(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));pl(a,i);let l=await fl(e,s,i,a,r);return Kt(l,i,"refreshTaskPr","synced",[])})}async function ll(e,t,n,r,s=Hr){let i=cl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await hb(o,r,i,s);if(Lp(i.repository,a),!ai(o,a,i.number))return Kt(o,a,"unlinkTaskPr","unchanged",[]);let c=wb(o,a,i.number),d=await jp(e,c,s);return Kt(d,a,"unlinkTaskPr","unlinked",[])})}function cl(e){let t=e.trim(),n=Vt(t);if(n)return{number:n.number,repository:n};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 ul(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw er(e,t);return rl(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 er(e,t);return rl(o.repoId,o.branch,o.worktreePath,o,r)}if(!n)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 rl(o.repoId,o.branch,o.worktreePath,o,r).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&&ct(a.repository,n)&&i.push(a)}if(i.length!==1)throw new g("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 gb(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw er(e,t);let s=V(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await ii(s,e.worktreePath,e.repoId,n),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 r=e.repoTargets?.find(s=>s.repoId===t);if(!r)throw er(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await ii(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function ii(e,t,n,r){let s=Fp(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function Fp(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Vt(e.url):null}async function rl(e,t,n,r,s){let i=await s.getGitHubRepositoryLocator(n);if(!i)throw new g("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 dl(e,t){await oi("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function oi(e,t){try{return await t()}catch(n){throw n instanceof g?n:new g("EXTERNAL_DEPENDENCY_FAILED",`Failed to ${e}: ${n instanceof Error?n.message:String(n)}`,{retryable:!0,cause:n})}}function Lp(e,t){if(e&&!ct(e,t.repository))throw Mp(e,t)}function yb(e,t){let n=Vt(e.url);if(!n||n.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&&!ct(t.repository,n))throw new g("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 pl(e,t){let n=Vt(e.url);if(!n||!ct(n,t.repository))throw Mp(n,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 Mp(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 er(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 ct(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function fl(e,t,n,r,s){let i=ai(t,n,r.number),o=Pt(r,i,n.repository),a=St(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:Wp(o)}:l)}),jp(e,a,s)}function wb(e,t,n){let r=e.prs.filter(i=>!Up(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=qp(r.filter(o=>o.owner&&o.repo&&ct({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?Wp(i):Tb(t.repository)}:o)}}return s}async function jp(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?_a(t):yn(t.prs),s={...t,status:r};return qr(e,s,n)}function ai(e,t,n){return hl(e,t).find(r=>Up(r,t,n))??null}function ml(e,t){if(!t.projectTarget)return V(e);let n=hl(e,t);return qp(n)}function qp(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function hl(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&ct({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?kb(r.pullRequest,t.repository):null;return s&&!n.some(i=>Gn(i,s))?[...n,s]:n}function Up(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||ct({owner:e.owner,name:e.repo},t.repository)}function Kt(e,t,n,r,s){let i=hl(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:ml(e,t),warnings:s}}function Wp(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 kb(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 Tb(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 S={listTasks:xr,getTask:L,provisionTask:zn,provisionProjectTask:Lr,createTask:$a,showTask:Ma,showTaskDiff:ja,prepareTaskLogs:qa,streamTaskLogs:Ua,runChecks:Wa,commitTask:Ba,closeTask:Va,cleanupTask:Ka,addTaskLink:Ga,listTaskLinks:Ha,sortTasksForDisplay:Sa,resolveSelectedTaskId:Pa,allocateTaskId:Ra,allocateTaskIdForRepo:Yn,allocateProjectTaskId:_r,createDefaultTaskPtyTabs:Mr,assertTaskWorktreeExists:me,resolveTaskLogPath:Hn,buildTaskInspection:Nr,resolveArtifactPath:wn,attachTask:Ya,focusTask:za,openTask:Ja,markRunnerFailed:Xa,recordStartupFailure:Qa,markTaskStarted:Za,resolveContext:tl,prs:{refresh:Kr,refreshChecks:Fa,discoverOrRefresh:si,discoverOrRefreshAll:Zn,discoverOrRefreshMany:La,show:sl,discover:il,link:ol,refreshAssociation:al,unlink:ll,merge:nl,getPrimaryPr:V,isPrTerminal:Ut,isMergeReady:Xs,deriveTaskStatus:yn,upsertPr:St,normalizePr:Pt,summarizeRequiredChecks:wa,writePrStatusArtifact:Sn}};var Bp={idle:0,working:1,ready:2,error:3};function vt(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 Gt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return vt(t,n,r,i)}function tr(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=Gt(e,s.id,t,n);Bp[i]>Bp[r]&&(r=i)}return r}function li(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&vt(s.id,t,n)==="working"))}function ut(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=Gt(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:tr(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function gl(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 g("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=ut([e],t.getSnapshots(),l),d=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:e.id,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw Vp(e.id);let u=a-r();if(u<=0)throw bb(e.id,n.states,n.timeoutMs);let p=s;await new Promise((h,f)=>{let m=()=>{clearTimeout(T),n.signal?.removeEventListener("abort",y),h()},y=()=>{clearTimeout(T),f(Vp(e.id))},T=setTimeout(m,u);i=m,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var bb=(e,t,n)=>new g("OPERATION_TIMEOUT",`Timed out after ${n}ms waiting for task ${e} agent state ${t.join(",")}.`,{retryable:!0,details:{taskId:e,states:t,timeoutMs:n}}),Vp=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as Pb}from"node:net";import{createHash as Rb}from"node:crypto";import{tmpdir as Sb}from"node:os";import Kp from"node:path";var Pn=9;function Ct(e){let t=Rb("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:Kp.join(Sb(),`craig-${t}.sock`),pidPath:Kp.join(e.runtimeDir,"pty-daemon.pid")}}async function Gp(e){let t=null;try{let n=await Ib(Ct(e.paths).socketPath);return t=new wl(n,e),await t.ready(),t}catch{return t?.close(),null}}var wl=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!==Pn)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 Ib(e){return new Promise((t,n)=>{let r=Pb(e);r.once("connect",()=>t(r)),r.once("error",n)})}var Tl={openObserver:Yp,listTasks:e=>S.listTasks(e),getTask:(e,t)=>S.getTask(e,t),now:Date.now};async function vb(e,t,n=Tl){let r=await Hp(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...ut(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function Cb(e,t,n=Tl){let r=await Hp(e,t.taskId,n),s=await n.openObserver(e);try{let i=ut(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 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 Ab(e,t,n,r=Tl){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await gl(s,i,{...n,now:r.now})}finally{i.close()}}async function Hp(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function Yp(e){return kl.open(e)}async function Eb(e){return Yp(e)}var kl=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 Gp({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()}},At={listAgents:vb,showAgentStatus:Cb,waitForTask:Ab,openObserver:Eb};import{randomUUID as Jb}from"node:crypto";import{mkdir as yf,open as $l,readdir as Dl,readFile as Qr,rm as Xb,stat as Qb}from"node:fs/promises";import fi from"node:path";import{createHash as _b}from"node:crypto";import{mkdir as Yr,readdir as Sl,readFile as zr,writeFile as xb}from"node:fs/promises";import We from"node:path";import{mkdir as zp,readFile as Ob,rm as bl,stat as $b,writeFile as Db}from"node:fs/promises";import Rl from"node:path";async function nr(e,t){let n=Rl.join(e.runtimeDir,"fury-store.lock");await zp(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await zp(n);try{await Db(Rl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await bl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!Jp(s,"EEXIST"))throw s;let i=await Ob(Rl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await $b(n).catch(()=>null);if(typeof i?.pid=="number"&&!Nb(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await bl(n,{recursive:!0,force:!0});continue}if(Date.now()-r>3e4)throw new g("OPERATION_TIMEOUT","Timed out waiting for the fury store lock.",{retryable:!0});await new Promise(a=>setTimeout(a,20))}try{return await t()}finally{await bl(n,{recursive:!0,force:!0})}}function Nb(e){try{return process.kill(e,0),!0}catch(t){return Jp(t,"EPERM")}}var Jp=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var he=e=>({root:We.join(e.craigDir,"fury"),definitions:We.join(e.craigDir,"fury","definitions"),plans:We.join(e.craigDir,"fury","plans"),approvals:We.join(e.craigDir,"fury","approvals"),runs:We.join(e.craigDir,"fury","runs"),reviews:We.join(e.craigDir,"fury","reviews")});function Pl(e){return _b("sha256").update(JSON.stringify(e)).digest("hex")}async function Qp(e,t,n){let r=he(e);await Yr(r.definitions,{recursive:!0});let s=We.join(r.definitions,`${t}.yaml`);await xb(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!Ht(i,"EEXIST"))throw i})}async function Zp(e,t){return nr(e,async()=>{let n=await ef(e),r=n.find(o=>o.planHash===t.planHash);if(r)return r;let s=n.filter(o=>o.rootTaskId===t.rootTaskId&&o.sourceFile===t.sourceFile).at(-1),i=s&&Date.parse(t.createdAt)<=Date.parse(s.createdAt)?{...t,createdAt:new Date(Date.parse(s.createdAt)+1).toISOString()}:t;return await Yr(he(e).plans,{recursive:!0}),await M(df(e,i.id),i),i})}async function ci(e,t){di(t,"plan");try{return Fb(JSON.parse(await zr(df(e,t),"utf8")),t)}catch(n){throw Ht(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function ef(e){let t=he(e).plans,n=await Sl(t).catch(s=>Ht(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>ci(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function tf(e){let t=await ef(e),n=await Promise.all(t.map(s=>Cl(e,s.id))),r=new Map;for(let[s,i]of t.entries())n[s]===null&&r.set(`${i.rootTaskId}\0${i.sourceFile}`,i);return[...r.values()].sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function nf(e,t){return nr(e,async()=>{let n=await Cl(e,t.planId);if(n){if(n.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after approval.`,{});return{approval:n,created:!1}}return await Yr(he(e).approvals,{recursive:!0}),await M(pf(e,t.planId),t),{approval:t,created:!0}})}async function rf(e,t){di(t,"plan");let n=await Cl(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function sf(e,t){return nr(e,async()=>{let r=(await af(e)).find(s=>s.planId===t.planId);if(r){if(r.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after its run was created.`,{});return{run:r,created:!1}}return await Yr(he(e).runs,{recursive:!0}),await M(Il(e,t.id),t),{run:t,created:!0}})}async function ue(e,t){di(t,"run");try{return cf(JSON.parse(await zr(Il(e,t),"utf8")),t)}catch(n){throw Ht(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function of(e){return af(e)}async function af(e){let t=he(e).runs,n=await Sl(t).catch(s=>Ht(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(async s=>{let i=s.slice(0,-5);return cf(JSON.parse(await zr(We.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ve(e,t,n){return nr(e,async()=>{let r=await ue(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury mutation cannot change its id.",{});return await M(Il(e,t),s),s})}async function lf(e,t){await Yr(he(e).reviews,{recursive:!0}),await M(vl(e,t.id),t)}async function Jr(e,t,n){return nr(e,async()=>{let r=await rr(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await M(vl(e,t),s),s})}async function rr(e,t){di(t,"review");try{return Lb(JSON.parse(await zr(vl(e,t),"utf8")),t)}catch(n){throw Ht(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function ui(e){let t=he(e).reviews,n=await Sl(t).catch(r=>Ht(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>rr(e,r.slice(0,-5))))}function cf(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!Ce(e)||e.schemaVersion!==1||e.id!==t||typeof e.planId!="string"||!/^fury_plan_[A-Za-z0-9_-]+$/.test(e.planId)||typeof e.planHash!="string"||!/^[a-f0-9]{64}$/.test(e.planHash)||typeof e.definitionHash!="string"||!/^[a-f0-9]{64}$/.test(e.definitionHash)||typeof e.name!="string"||!e.name||typeof e.sourceFile!="string"||!e.sourceFile||typeof e.rootTaskId!="string"||!e.rootTaskId||!n.includes(String(e.state))||!Ce(e.inputs)||!uf(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!Mb(e.stepRuns,e.order)||!Xr(e.actor)||!Be(e.createdAt)||!Be(e.updatedAt)||!Be(e.stateChangedAt)||!Be(e.deadlineAt)||e.completedAt!==null&&!Be(e.completedAt))throw new g("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function Fb(e,t){if(!Ce(e)||e.schemaVersion!==1||e.id!==t||typeof e.planHash!="string"||!/^[a-f0-9]{64}$/.test(e.planHash)||typeof e.definitionHash!="string"||!/^[a-f0-9]{64}$/.test(e.definitionHash)||typeof e.name!="string"||!e.name||typeof e.sourceFile!="string"||!e.sourceFile||typeof e.rootTaskId!="string"||!e.rootTaskId||!Ce(e.inputs)||!uf(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||!Array.isArray(e.waves)||e.waves.some(r=>!Array.isArray(r)||r.some(s=>typeof s!="string"))||!Array.isArray(e.steps)||e.steps.length!==e.order.length||!Xr(e.createdBy)||!Be(e.createdAt))throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} is invalid.`,{});let n={...e};if(delete n.id,delete n.planHash,delete n.createdBy,delete n.createdAt,Pl(n)!==e.planHash)throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function Lb(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!Ce(e)||e.schemaVersion!==1||e.id!==t||typeof e.runId!="string"||typeof e.stepId!="string"||!n.includes(String(e.state))||typeof e.title!="string"||typeof e.summary!="string"||e.feedbackTarget!==null&&(!Ce(e.feedbackTarget)||typeof e.feedbackTarget.taskId!="string"||e.feedbackTarget.agentTabId!==null&&typeof e.feedbackTarget.agentTabId!="string")||!Number.isInteger(e.round)||Number(e.round)<1||!Number.isInteger(e.version)||Number(e.version)<1||!Be(e.requestedAt)||!Be(e.deadlineAt)||!Be(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!Xp(r))||e.lastDecision!==null&&!Xp(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function Mb(e,t){return Ce(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&jb(e[n],n))}function jb(e,t){return!Ce(e)||e.id!==t||!["agent","human_review"].includes(String(e.kind))||!["pending","running","waiting_for_review","changes_requested","succeeded","failed","cancelled","timed_out"].includes(String(e.state))||!Array.isArray(e.needs)||e.needs.some(n=>typeof n!="string")||!Ce(e.plan)?!1:[e.taskId,e.agentTabId,e.commandId,e.reviewId,e.error].every(n=>n===null||typeof n=="string")&&[e.startedAt,e.completedAt,e.deadlineAt].every(n=>n===null||Be(n))&&(e.completedBy===null||Xr(e.completedBy))}function Xp(e){return Ce(e)&&Number.isInteger(e.sequence)&&Number.isInteger(e.round)&&["approve","reject","request_changes","resubmit"].includes(String(e.action))&&(e.message===null||typeof e.message=="string")&&Xr(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Be(e.occurredAt)}function uf(e){return Ce(e)&&Number.isInteger(e.maxConcurrency)&&Number(e.maxConcurrency)>0&&Number.isInteger(e.maxTasks)&&Number(e.maxTasks)>0&&Number.isInteger(e.timeoutMs)&&Number(e.timeoutMs)>0}function Xr(e){return Ce(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}var Il=(e,t)=>We.join(he(e).runs,`${t}.json`),df=(e,t)=>We.join(he(e).plans,`${t}.json`),pf=(e,t)=>We.join(he(e).approvals,`${t}.json`),vl=(e,t)=>We.join(he(e).reviews,`${t}.json`),di=(e,t)=>{if(!(t==="plan"?/^fury_plan_[A-Za-z0-9_-]+$/:t==="run"?/^fury_[A-Za-z0-9_-]+$/:/^review_[A-Za-z0-9_-]+$/).test(e))throw new g("CLI_USAGE",`Invalid fury ${t} id "${e}".`,{})};async function Cl(e,t){try{let n=JSON.parse(await zr(pf(e,t),"utf8"));if(!Ce(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!Xr(n.approvedBy)||!Ce(n.approvedBy)||n.approvedBy.type!=="human"||!Be(n.approvedAt))throw new g("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(Ht(n,"ENOENT"))return null;throw n}}var Ce=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Be=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Ht=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as ff,readFile as qb,rm as pi,stat as Ub,writeFile as Wb}from"node:fs/promises";import Al from"node:path";var Bb=20,Vb=3e4,Kb=5e3;async function mf(e,t){let n=Al.join(e.runtimeDir,"event-journal.lock");await ff(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await ff(n);try{await Wb(Al.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await pi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!Yb(s))throw s;if(await Gb(n))continue;if(Date.now()-r>=Vb)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await zb(Bb)}try{return await t()}finally{await pi(n,{recursive:!0,force:!0})}}async function Gb(e){let t=await qb(Al.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return Hb(t.pid)?!1:(await pi(e,{recursive:!0,force:!0}),!0);let n=await Ub(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<Kb?!1:(await pi(e,{recursive:!0,force:!0}),!0)}function Hb(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 Yb=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",zb=e=>new Promise(t=>setTimeout(t,e));var Zb=256*1024,eR=16,tR=64*1024;async function De(e,t,n={}){let r=Ol(n.maxSegmentBytes??Zb,"Event journal segment size"),s=Ol(n.maxSegments??eR,"Event journal retention"),i=Ol(n.maxRecordBytes??tR,"Event record size");return mf(e,async()=>{await yf(e.eventsDir,{recursive:!0}),await aR(e);let o=await Nl(e),a=t.id??Jb(),l=o.events.find(y=>y.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,furyRunId:t.furyRunId??null,furyStepId:t.furyStepId??null,type:t.type,occurredAt:t.occurredAt??new Date().toISOString(),actor:t.actor,data:uR(t.data)},u=`${JSON.stringify(d)}
80
+ `;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 mi(e)).at(-1),f=!h||await nR(h.path,u,r);if(f&&(h={name:gf(c),path:fi.join(e.eventsDir,gf(c)),startSequence:c}),!h)throw new g("INTERNAL_ERROR","Failed to select an event journal segment.",{});let m=await $l(h.path,"a");try{await m.writeFile(u,"utf8"),await m.sync()}finally{await m.close()}return f&&await kf(e.eventsDir),await rR(e,s),d})}async function In(e,t={}){let n=await Nl(e),r=lR(n.events,t.after,n.earliestSequence,n.events.at(-1)?.sequence??null),s=t.typeGlob?cR(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 wf(e){return(await Nl(e)).events}async function Nl(e){await yf(e.eventsDir,{recursive:!0});let t=await mi(e),n=[],r=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await Qr(i.path,"utf8"),a=s===t.length-1,l=o.split(`
81
81
  `);if(o.endsWith(`
82
- `))l.pop();else{if(!a)throw Je(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 Je(i.name,`empty record at line ${c+1}`);let u;try{u=JSON.parse(d)}catch{throw Je(i.name,`invalid JSON at line ${c+1}`)}let g=Jh(u,i.name,c+1);if(c===0&&g.sequence!==i.startSequence)throw Je(i.name,`first record sequence ${g.sequence} does not match segment name`);if(n.has(g.id))throw Je(i.name,`duplicate event id ${g.id}`);n.add(g.id);let f=r.at(-1);if(f&&g.sequence!==f.sequence+1)throw Je(i.name,`non-monotonic sequence ${g.sequence} after ${f.sequence}`);r.push(g)}}return{events:r,earliestSequence:r[0]?.sequence??null}}async function pn(e){return(await Rc(e.eventsDir).catch(r=>{if(Pc(r))return[];throw r})).flatMap(r=>{let n=/^segment-(\d{16})\.jsonl$/.exec(r);return n?[{name:r,path:Ni.join(e.eventsDir,r),startSequence:Number(n[1])}]:[]}).sort((r,n)=>r.startSequence-n.startSequence)}async function Uh(e,t,r){let n=await jh(e).catch(()=>null);return n!==null&&n.size>0&&n.size+Buffer.byteLength(t)>r}async function Bh(e,t){let r=await pn(e),n=Math.max(0,r.length-t),s=await Vh(e);if(s===null)return;for(let o=0;o<n;o+=1)if(await Kh(r[o].path,s)){n=o;break}let i=r.slice(0,n);for(let o of i)await _h(o.path,{force:!0});i.length>0&&await Sc(e.eventsDir)}async function Vh(e){let t=await Rc(e.commandsDir).catch(n=>{if(Pc(n))return[];throw n}),r=new Set;for(let n of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await un(Ni.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 Kh(e,t){if(t.size===0)return!1;let r=await un(e,"utf8");for(let n of r.split(`
83
- `))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 Gh(e){let t=(await pn(e)).at(-1);if(!t)return;let r=await un(t.path);if(r.length===0||r[r.length-1]===10)return;let n=r.lastIndexOf(10),s=await $i(t.path,"r+");try{await s.truncate(n+1),await s.sync()}finally{await s.close()}}function Hh(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 Di(t);return kc(t,i,r),i}let s=e.find(i=>i.id===t);if(!s)throw r!==null&&r>1?new m("EVENT_CURSOR_EXPIRED",`Event cursor ${t} has expired.`,{details:{cursor:t,earliestAvailableSequence:r,resumeAfter:r-1}}):Di(t);return kc(t,s.sequence,r),s.sequence}function kc(e,t,r){if(r!==null&&t<r-1)throw new m("EVENT_CURSOR_EXPIRED",`Event cursor ${e} has expired.`,{details:{cursor:e,earliestAvailableSequence:r,resumeAfter:r-1}})}function zh(e){if(e.length===0||e.length>256)throw new m("CLI_USAGE","Event type glob must contain between 1 and 256 characters.",{});let t=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replaceAll("*",".*");return new RegExp(`^${t}$`)}function Yh(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 Jh(e,t,r){if(typeof e!="object"||e===null||Array.isArray(e))throw Je(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))||!qt(n.workspaceId)||!qt(n.taskId)||!qt(n.agentTabId)||!qt(n.commandId)||!qt(n.swarmRunId)||!qt(n.swarmStepId)||!Xh(n.actor)||!("data"in n))throw Je(t,`record at line ${r} has an invalid schema`);return n}function Xh(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 qt=e=>e===null||typeof e=="string",yc=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,Je=(e,t)=>new m("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),Di=e=>new m("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),Pc=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Oi(e,t){if(!Number.isSafeInteger(e)||e<1)throw new m("CLI_USAGE",`${t} must be a positive integer.`,{details:{value:e}});return e}async function Sc(e){let t=await $i(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as Cc,readdir as lw,readFile as Ac}from"node:fs/promises";import Ec from"node:path";import{mkdir as vc,readFile as Qh,rm as mn,stat as Zh,writeFile as ew}from"node:fs/promises";import Li from"node:path";var tw=20,rw=3e4,nw=5e3;async function _i(e,t){let r=Li.join(e.runtimeDir,"command-store.lock");await vc(e.runtimeDir,{recursive:!0});let n=Date.now();for(;;)try{await vc(r);try{await ew(Li.join(r,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await mn(r,{recursive:!0,force:!0}),s}break}catch(s){if(!ow(s))throw s;if(await sw(r))continue;if(Date.now()-n>=rw)throw new m("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await aw(tw)}try{return await t()}finally{await mn(r,{recursive:!0,force:!0})}}async function sw(e){let t=await Qh(Li.join(e,"owner.json"),"utf8").then(n=>JSON.parse(n)).catch(()=>null);if(t&&typeof t.pid=="number")return iw(t.pid)?!1:(await mn(e,{recursive:!0,force:!0}),!0);let r=await Zh(e).catch(()=>null);return!r||Date.now()-r.mtimeMs<nw?!1:(await mn(e,{recursive:!0,force:!0}),!0)}function iw(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 ow=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",aw=e=>new Promise(t=>setTimeout(t,e));async function hn(e,t){ji(t);try{let r=JSON.parse(await Ac(kr(e,t),"utf8"));return Dc(r,kr(e,t),t)}catch(r){throw pw(r)?new m("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):r instanceof SyntaxError?gn(t,kr(e,t),r):r}}async function Me(e){await Cc(e.commandsDir,{recursive:!0});let t=await lw(e.commandsDir),r=[];for(let n of t.filter(s=>s.endsWith(".json")).sort()){let s=Ec.join(e.commandsDir,n);try{r.push(Dc(JSON.parse(await Ac(s,"utf8")),s,n.slice(0,-5)))}catch(i){throw i instanceof m?i:gn(n.slice(0,-5),s,i)}}return r.sort((n,s)=>n.createdAt.localeCompare(s.createdAt)||n.id.localeCompare(s.id))}async function xc(e,t){return ji(t.id),_i(e,async()=>{await Cc(e.commandsDir,{recursive:!0});let r=await Me(e);if(t.idempotencyKey){let n=r.find(s=>s.idempotencyKey===t.idempotencyKey);if(n){if(!cw(n,t))throw new m("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 O(kr(e,t.id),t),{command:t,created:!0}})}async function yr(e,t,r){return ji(t),_i(e,async()=>{let n=await hn(e,t),s=r(n);if(s.id!==n.id)throw new m("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await O(kr(e,t),s),s})}function cw(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 Dc(e,t,r){if(!fn(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw gn("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||!fn(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!uw(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||!Ut(e.expiresAt)||!Ut(e.createdAt)||!Ut(e.updatedAt)||e.deliveryStartedAt!==null&&!Ut(e.deliveryStartedAt)||e.deliveredAt!==null&&!Ut(e.deliveredAt)||e.cancelledAt!==null&&!Ut(e.cancelledAt)||e.cancelledBy!==null&&!Ic(e.cancelledBy)||!Ic(e.actor)||!dw(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 gn(n,t);return e}function Ic(e){return!fn(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 dw(e){return e===null||fn(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var kr=(e,t)=>Ec.join(e.commandsDir,`${t}.json`),ji=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new m("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},Ut=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),uw=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}),fn=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),pw=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",gn=(e,t,r)=>new m("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...r?{cause:r}:{}});function Oc(e,t=new Date){return wn(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function $c(e,t=new Date){return e.state==="delivered"?e:(wn(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function Nc(e,t,r=new Date){return e.state==="failed"?e:(wn(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:r.toISOString()})}function Mc(e,t,r=new Date){return e.state==="cancelled"?e:(wn(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:r.toISOString(),cancelledBy:t,updatedAt:r.toISOString()})}function wn(e,t,r){if(!t.includes(e.state))throw new m("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 mw}from"node:crypto";var Fi=32*1024,Lc=1440*60*1e3,Wi=256,fw=["delivered","failed","cancelled"],qi={type:"system",component:"orchestration-supervisor"};async function gw(e,t){if(Pw(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>Lc)throw new m("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:Lc}});if(t.idempotencyKey!==void 0&&t.idempotencyKey!==null&&t.idempotencyKey.trim().length===0)throw new m("CLI_USAGE","Idempotency key cannot be empty.",{});if((t.idempotencyKey?.length??0)>Wi)throw new m("CLI_USAGE",`Idempotency key exceeds ${Wi} characters.`,{details:{maxIdempotencyKeyLength:Wi}});let r=t.now??new Date,n={schemaVersion:1,id:t.id??`command_${mw()}`,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 xc(e,n);if(s.created)try{await ht(e,s.command,"command.queued")}catch(i){throw _c(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function hw(e,t){return{kind:"showPromptCommand",command:await hn(e,t)}}async function ww(e,t){let r=await Me(e);return{kind:"listPromptCommands",commands:t?r.filter(n=>n.taskId===t):r}}async function kw(e,t,r){let n=!1,s=await yr(e,t,i=>{if(i.state==="cancelled")return i;let o=Mc(i,r??i.actor);return n=!0,o});if(n)try{await ht(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw _c(s,i)}return{kind:"cancelPromptCommand",command:s,changed:n}}async function yw(e,t){let r=await yr(e,t,n=>Oc(n));return await ht(e,r,"command.delivering",qi),r}async function Tw(e,t){let r=await yr(e,t,n=>$c(n));return await ht(e,r,"command.delivered",qi),r}async function Rw(e,t,r){let n=await yr(e,t,s=>Nc(s,r));return await ht(e,n,"command.failed",qi),n}async function bw(e,t,r){let n=[...r.states??fw],s=Date.now()+r.timeoutMs;for(;;){let i=await hn(e,t);if(n.includes(i.state))return{kind:"waitPromptCommand",command:i,matchedStates:n};if(r.signal?.aborted)throw new m("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 m("OPERATION_TIMEOUT",`Timed out after ${r.timeoutMs}ms waiting for command ${t}.`,{retryable:!0,details:{commandId:t,states:n,timeoutMs:r.timeoutMs}});await Sw(Math.min(r.pollIntervalMs??100,o),r.signal)}}function Pw(e){if(e.trim().length===0)throw new m("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>Fi)throw new m("CLI_USAGE",`Prompt exceeds the ${Fi}-byte limit.`,{details:{maxPromptBytes:Fi,promptBytes:t}});if([...e].some(r=>{let n=r.charCodeAt(0);return n<=8||n>=11&&n<=31||n>=127&&n<=159}))throw new m("CLI_USAGE","Prompt contains unsupported control characters.",{})}async function ht(e,t,r,n=t.actor){await Ne(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 Sw(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 _c=(e,t)=>new m("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:gw,show:hw,list:ww,cancel:kw,wait:bw,beginDelivery:yw,completeDelivery:Tw,fail:Rw};import{randomUUID as Fc,timingSafeEqual as vw}from"node:crypto";import{mkdir as Iw,readFile as Cw,readdir as Aw}from"node:fs/promises";import Wc from"node:path";var Ew=10080*60*1e3,xw={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024};async function Xe(e,t,r={type:"system",component:"orchestration-supervisor"}){let n=t.ptyTabs.find(i=>i.kind==="agent");if(!n)return{};let s=null;if(await Iw(Ki(e),{recursive:!0,mode:448}),await E(e,t.id,async i=>{let o=i.ptyTabs.find(d=>d.id===n.id&&d.kind==="agent");if(!o)throw new m("CAPABILITY_DENIED",`Agent tab ${n.id} no longer exists.`,{});let a=o.capabilityId??`capability_${Fc()}`,l=await kn(e,a);if(l&&(l.taskId!==i.id||l.agentTabId!==o.id))throw new m("CAPABILITY_DENIED",`Capability ${a} is bound to another agent.`,{details:{capabilityId:a,taskId:i.id,agentTabId:o.id}});return s=(l??await Dw(e,a,i.id,o.id,r)).token,o.capabilityId?i:{...i,ptyTabs:i.ptyTabs.map(d=>d.id===o.id?{...d,capabilityId:a}:d)}}),!s)throw new m("INTERNAL_ERROR",`Failed to issue a capability for ${n.id}.`,{});return{CRAIG_AGENT_CAPABILITY:s}}async function Dw(e,t,r,n,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${Fc()}`,taskId:r,agentTabId:n,allowedCommandFamilies:["task.create-child","task.children","task.cancel-tree"],targetPolicy:"children-only",limits:{...xw},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+Ew).toISOString(),revokedAt:null,revokedBy:null};return await O(Gi(e,o.id),o,{mode:384}),o}async function Tr(e,t,r,n){let s=await $w(e,t);return s.revokedAt&&wt(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&wt(s.id,"expired"),s.allowedCommandFamilies.includes(r)||wt(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await Ow(e,s.taskId,n)&&wt(s.id,`target task ${n} is outside the capability task subtree`),{capability:s,actor:{type:"agent",taskId:s.taskId,agentTabId:s.agentTabId,capabilityId:s.id}}}async function Ow(e,t,r){if(t===r)return!0;let n=(await T.listTasks(e,{includeClosed:!0})).tasks,s=new Map(n.map(a=>[a.id,a])),i=s.get(r),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 qc(e,t,r){let n=await kn(e,t);n&&(n.revokedAt||await O(Gi(e,t),{...n,revokedAt:new Date().toISOString(),revokedBy:r},{mode:384}))}async function Vi(e,t,r){let n=await Aw(Ki(e)).catch(i=>Uc(i)?[]:Promise.reject(i)),s=[];for(let i of n){let o=/^(capability_[A-Za-z0-9-]+)\.json$/.exec(i);if(!o)continue;let a=await kn(e,o[1]);!a||!t.has(a.taskId)||(await qc(e,a.id,r),s.push(a.id))}return s}async function $w(e,t){let r=t.indexOf("."),n=r>0?t.slice(0,r):"";/^capability_[A-Za-z0-9-]+$/.test(n)||wt("<redacted>","token is invalid");let s=await kn(e,n);if(!s)throw new m("CAPABILITY_NOT_FOUND",`Craig capability "${n}" was not found.`,{details:{capabilityId:n}});let i=Buffer.from(s.token),o=Buffer.from(t);return(i.length!==o.length||!vw(i,o))&&wt(n,"token is invalid"),s}async function kn(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||wt(t,"identifier is invalid");try{let r=JSON.parse(await Cw(Gi(e,t),"utf8"));if(!Nw(r,t))throw new m("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return r}catch(r){if(Uc(r))return null;throw r}}function Nw(e,t){if(!Bi(e)||e.schemaVersion!==1||e.id!==t)return!1;let r=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(n=>["task.create-child","task.children","task.cancel-tree"].includes(String(n)))&&e.targetPolicy==="children-only"&&Bi(r)&&[r.maxChildren,r.maxDepth,r.maxConcurrentChildren,r.maxPromptBytes].every(n=>Number.isInteger(n)&&Number(n)>0)&&Ui(e.createdAt)&&Ui(e.expiresAt)&&jc(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||Ui(e.revokedAt)&&jc(e.revokedBy))}function jc(e){return Bi(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 wt(e,t){throw new m("CAPABILITY_DENIED",`Craig capability ${e} was denied: ${t}.`,{details:{capabilityId:e,reason:t}})}var Ki=e=>Wc.join(e.orchestrationDir,"capabilities"),Gi=(e,t)=>Wc.join(Ki(e),`${t}.json`),Bi=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ui=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Uc=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as Bc,readFile as Mw,rm as Hi,stat as Lw,writeFile as _w}from"node:fs/promises";import zi from"node:path";var jw=20,Fw=3e4,Ww=5e3;async function Yi(e,t){let r=zi.join(e.runtimeDir,"delegation.lock");await Bc(e.runtimeDir,{recursive:!0});let n=Date.now();for(;;)try{await Bc(r);try{await _w(zi.join(r,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Hi(r,{recursive:!0,force:!0}),s}break}catch(s){if(!Bw(s))throw s;if(await qw(r))continue;if(Date.now()-n>=Fw)throw new m("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,jw))}try{return await t()}finally{await Hi(r,{recursive:!0,force:!0})}}async function qw(e){let t=await Mw(zi.join(e,"owner.json"),"utf8").then(n=>JSON.parse(n)).catch(()=>null);if(t&&typeof t.pid=="number"&&Uw(t.pid))return!1;let r=await Lw(e).catch(()=>null);return!t&&r&&Date.now()-r.mtimeMs<Ww?!1:(await Hi(e,{recursive:!0,force:!0}),!0)}function Uw(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 Bw=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var Vw={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function Ji(e,t,r,n={}){let s=await k.load(e);return k.previews.isEnabled(s,"agentOrchestration")?T.createTask(e,t,r,{...n,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 Xe(e,i,{type:"human",source:"cli",processId:process.pid})})}):T.createTask(e,t,r,n)}async function Xi(e,t){return Yi(e,async()=>{let r=await T.getTask(e,t.parentTaskId),n=t.capabilityId?await Tr(e,t.capabilityId,"task.create-child",r.id):null,s=n?.actor??{type:"human",source:"cli",processId:process.pid},i=n?.capability.limits??Vw,o=t.prompt.trim();if(o.length===0)throw new m("CLI_USAGE","Child task prompt cannot be empty.",{});if(Buffer.byteLength(o)>i.maxPromptBytes&&yn("prompt bytes",i.maxPromptBytes),r.delegationDepth+1>i.maxDepth&&yn("delegation depth",i.maxDepth),!new Set([r.repoId,...r.linkedRepoIds,...(r.repoTargets??[]).map(p=>p.repoId)]).has(t.repoId))throw new m("CAPABILITY_DENIED",`Repo ${t.repoId} is outside parent task ${r.id}.`,{details:{parentTaskId:r.id,repoId:t.repoId}});let c=(await T.listTasks(e,{includeClosed:!0})).tasks.filter(p=>p.parentTaskId===r.id),d=t.idempotencyKey?.trim()||null;if(d){if(d.length>256)throw new m("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let p=c.find(w=>w.delegationIdempotencyKey===d);if(p){if(p.repoId!==t.repoId||p.prompt.value!==o||t.runner&&p.runner!==t.runner)throw new m("COMMAND_STATE_CONFLICT",`Idempotency key "${d}" is already used by child ${p.id}.`,{details:{idempotencyKey:d,taskId:p.id}});return Vc(p,!0)}}c.length>=i.maxChildren&&yn("children",i.maxChildren),c.filter(p=>p.status!=="closed"&&p.status!=="merged").length>=i.maxConcurrentChildren&&yn("concurrent children",i.maxConcurrentChildren);let g=await T.createTask(e,t.repoId,o,{...t.runner?{runner:t.runner}:{},lineage:{parentTaskId:r.id,rootTaskId:r.rootTaskId,delegationDepth:r.delegationDepth+1,delegationIdempotencyKey:d,swarmRunId:r.swarmRunId,swarmStepId:null},onProvisioned:async p=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:p.id,CRAIG_AGENT_TAB_ID:p.ptyTabs.find(w=>w.kind==="agent")?.id??"",...await Xe(e,p,s)})}),f=await T.getTask(e,g.taskId);try{await Ne(e,{workspaceId:f.workspaceId,taskId:f.id,agentTabId:s.type==="agent"?s.agentTabId:null,type:"task.child.created",actor:s,data:{parentTaskId:r.id,rootTaskId:f.rootTaskId,delegationDepth:f.delegationDepth}})}catch(p){throw new m("PARTIAL_RESULT",`Child ${f.id} was created, but its audit event could not be recorded.`,{details:{taskId:f.id,parentTaskId:r.id,persisted:!0},cause:p})}return Vc(f,!1)})}async function Qi(e,t,r){r&&await Tr(e,r,"task.children",t),await T.getTask(e,t);let n=(await T.listTasks(e,{includeClosed:!0})).tasks.filter(s=>s.parentTaskId===t).sort((s,i)=>s.id.localeCompare(i.id));return{kind:"listTaskChildren",taskId:t,children:n}}async function Zi(e,t,r){return Yi(e,async()=>{let s=(r?await Tr(e,r,"task.cancel-tree",t):null)?.actor??{type:"human",source:"cli",processId:process.pid};await T.getTask(e,t);let i=(await T.listTasks(e,{includeClosed:!0})).tasks,o=new Map(i.map(p=>[p.id,p])),a=new Map;for(let p of i)p.parentTaskId&&a.set(p.parentTaskId,[...a.get(p.parentTaskId)??[],p]);let l=[],c=new Set,d=p=>{if(c.has(p))throw new m("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${p}.`,{details:{taskId:p,rootTaskId:t}});let w=o.get(p);if(w){c.add(p),l.push(w);for(let R of(a.get(p)??[]).sort((x,F)=>x.id.localeCompare(F.id)))d(R.id)}};d(t);let u=[],g=[],f=[];try{await Vi(e,new Set(l.map(p=>p.id)),s)}catch{f.push(...l.map(p=>p.id))}for(let p of l){let w=p.status;if(w==="closed"){u.push({taskId:p.id,previousStatus:w,status:"closed",disposition:"already-closed"});continue}await T.cleanupTask(e,p,{preserveWorktree:!0});let R=await T.closeTask(e,p.id);u.push({taskId:p.id,previousStatus:w,status:R.status,disposition:"cancelled"});try{await Ne(e,{workspaceId:p.workspaceId,taskId:p.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:w}})}catch{g.push(p.id)}}if(g.length>0||f.length>0)throw new m("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:u,auditFailures:g,revocationFailures:f,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:u}})}function Vc(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 yn(e,t){throw new m("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}import{createHash as Kc}from"node:crypto";import Kw from"node:path";import{mkdir as Gw}from"node:fs/promises";var eo={type:"system",component:"heartbeat"};async function Qe(e,t={}){await Gw(e.orchestrationDir,{recursive:!0});let[r,n,s,i]=await Promise.all([T.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):$e.listAgents(e),bc(e),Zw(e)]),o=n??Re(r.tasks.filter(p=>p.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=Qw(i),l=a!==i,c=[],d=to(s.filter(Xw),p=>p.taskId),u=to(s.filter(p=>p.type.startsWith("task.pr.")),p=>p.taskId),g=to(s.filter(p=>p.type==="agent.state.changed"),p=>p.agentTabId);for(let p of r.tasks){let w=Hw(p),R=d.get(p.id),x=no(R?.data)??a.tasks[p.id]??null,F=R?.id??a.tasks[p.id]?.eventId??null;if(x?.signature!==w.signature){let de=x?p.status==="closed"&&x?.status!=="closed"?"task.closed":"task.updated":"task.created",ye=await Ne(e,{id:ro(de,p.id,w.signature),type:de,taskId:p.id,workspaceId:p.workspaceId||null,occurredAt:p.updatedAt,actor:eo,data:{...w,changedFields:x?Yw(x,w):[]}});c.push(ye),F=ye.id}a.tasks[p.id]={...w,eventId:F};let U=Jw(p.prs),I=u.get(p.id),re=no(I?.data)??a.pullRequests[p.id]??null,We=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",h=await Ne(e,{id:ro(ye,p.id,U.signature),type:ye,taskId:p.id,workspaceId:p.workspaceId||null,occurredAt:p.updatedAt,actor:eo,data:U});c.push(h),We=h.id}a.pullRequests[p.id]={...U,eventId:We}}let f=new Map(o.tasks.map(p=>[p.taskId,p.state]));for(let p of o.agents){let w=g.get(p.tabId),R=no(w?.data)??a.agents[p.tabId]??null;if(R?.state===p.state){a.agents[p.tabId]={state:p.state,eventId:w?.id??a.agents[p.tabId]?.eventId??null};continue}let x=[w?.id??a.agents[p.tabId]?.eventId??"initial",p.state,p.sessionState??"none",p.lastActivityAt??"none",p.exitCode??"none",p.error??"none"].join(":"),F=await Ne(e,{id:ro("agent.state.changed",p.tabId,x),type:"agent.state.changed",taskId:p.taskId,agentTabId:p.tabId,actor:eo,data:{previousState:typeof R?.state=="string"?R.state:null,state:p.state,taskState:f.get(p.taskId)??"idle",sessionState:p.sessionState,lastActivityAt:p.lastActivityAt,exitCode:p.exitCode,error:p.error}});c.push(F),a.agents[p.tabId]={state:p.state,eventId:F.id}}return(c.length>0||l)&&await O(Hc(e),a),c}function Hw(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:Gc(t)}}var zw=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function Yw(e,t){return zw.filter(r=>JSON.stringify(e[r])!==JSON.stringify(t[r]))}function Jw(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:Gc(t)}}function to(e,t){let r=new Map;for(let n of e){let s=t(n);s&&r.set(s,n)}return r}var Xw=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",Gc=e=>Kc("sha256").update(JSON.stringify(e)).digest("hex"),ro=(...e)=>Kc("sha256").update(e.join("\0")).digest("hex"),no=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,Hc=e=>Kw.join(e.orchestrationDir,"event-reconciliation.json");function Qw(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 Zw(e){try{return await _r(Hc(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function ek(e,t){return await so(e),await Qe(e),wr(e,t)}async function tk(e,t,r){await so(e);let n=await $e.openObserver(e);try{let s=t.after,i=0,o=0;for(;!r.signal?.aborted;){await Qe(e,{agentObserver:n});let a=await wr(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 zc(r.pollIntervalMs??250,r.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:r.signal?.aborted??!1}}finally{n.close()}}async function rk(e,t,r){await so(e);let n=await T.getTask(e,t);if(r.tabId&&!n.ptyTabs.some(i=>i.kind==="agent"&&i.id===r.tabId))throw new m("TASK_CONTEXT_CONFLICT",`Agent tab ${r.tabId} does not belong to task ${t}.`,{details:{taskId:t,tabId:r.tabId}});let s=await $e.openObserver(e);try{await Qe(e,{agentObserver:s});let o=(await wr(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(f=>f.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 sk(t);let u=a-Date.now();if(u<=0)throw nk(t,r.states,r.timeoutMs);await Qe(e,{agentObserver:s}),o=(await wr(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await zc(Math.min(250,u),r.signal)}}finally{s.close()}}async function so(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new m("CLI_USAGE","Event orchestration is a feature preview. Enable agentOrchestration before using events commands.",{details:{preview:"agentOrchestration"}})}function zc(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 nk=(e,t,r)=>new m("OPERATION_TIMEOUT",`Timed out after ${r}ms waiting for task ${e} agent state ${t.join(",")}.`,{retryable:!0,details:{taskId:e,states:t,timeoutMs:r}}),sk=e=>new m("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),Tn={list:ek,watch:tk,waitForTaskState:rk,reconcile:Qe};import{readFile as ak}from"node:fs/promises";import{createConnection as ik}from"node:net";async function Rr(e){let t=await Yc(Oe(e).socketPath).catch(()=>null);if(!t)return!1;try{return(await Rn(t,{type:"ping"})).protocolVersion!==gt?!1:(await Rn(t,{type:"wakeOrchestration"}),!0)}catch{return!1}finally{t.end()}}async function io(e,t){if(t.length===0)return!0;let r=await Yc(Oe(e).socketPath).catch(()=>null);if(!r)return!1;try{if((await Rn(r,{type:"ping"})).protocolVersion!==gt)return!1;for(let s of t)await Rn(r,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{r.end()}}var ok=1;function Rn(e,t){let r=ok++;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(`
84
- `);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})}
85
- `)})}function Yc(e){return new Promise((t,r)=>{let n=ik(e);n.once("connect",()=>t(n)),n.once("error",r)})}async function lk(e,t){await fk(e);let r=await T.getTask(e,t.taskId);if(r.status==="closed")throw new m("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 m("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 mk(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 Rr(e),a}return await Rr(e),o}async function ck(e,t){return ie.show(e,t)}async function dk(e,t){return ie.list(e,t)}async function uk(e,t){let r;try{r=await ie.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(n){throw await Rr(e),n}return await Rr(e),r}async function pk(e,t,r){return ie.wait(e,t,r)}async function mk(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await ak(e.path,"utf8")}}catch(r){throw new m("CLI_USAGE",`Unable to read prompt file ${e.path}.`,{details:{promptFile:e.path},cause:r})}if(!t)throw new m("INPUT_REQUIRED","Prompt input from stdin is unavailable.",{});return{source:"stdin",text:await t()}}async function fk(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new m("CLI_USAGE","Prompt dispatch is a feature preview. Enable agentOrchestration before sending prompts.",{details:{preview:"agentOrchestration"}})}var Bt={send:lk,show:ck,list:dk,cancel:uk,wait:pk};async function Jc(e,t,r){let n=(await T.listTasks(e,{includeClosed:!0})).tasks,s=new Set([t]),i=!0;for(;i;){i=!1;for(let a of n)a.parentTaskId&&s.has(a.parentTaskId)&&!s.has(a.id)&&(s.add(a.id),i=!0)}let o=n.filter(a=>s.has(a.id)).flatMap(a=>a.ptyTabs.map(l=>l.id));try{let a=await Zi(e,t,r);return await io(e,o),a}catch(a){throw a instanceof m&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await io(e,o),a}}async function Xc(e,t){switch(e.kind){case"addWorkspace":{let r=await Q.addWorkspace(t.paths,e.path),n=r.workspace.kind==="project"?r.workspace.discoveredRepoIds?.[0]??null:r.repos[0]?.id??null;return await ao(t.paths,r.workspace.id,n),r}case"addRepo":{let r=await Q.repos.addRepo(t.paths,e.path);return await ao(t.paths,r.workspaceId,r.repo.id),r}case"listRepos":return Q.repos.listRegisteredRepos(t.paths);case"removeRepo":{let r=await It({uiStateFile:t.paths.uiStateFile}),n=r?.selectedWorkspaceId?(await ae(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await Q.repos.removeRepo(t.paths,e.repoId,{listTasks:T.listTasks});if(r){let i=n.includes(r.selectedWorkspaceId??""),o=r.selectedRepoId===e.repoId;i?await Ue({uiStateFile:t.paths.uiStateFile},{...r,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await Ue({uiStateFile:t.paths.uiStateFile},{...r,selectedRepoId:null})}return s}case"listWorkspaces":return Q.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let r=await Q.archiveWorkspace(t.paths,e.workspaceId);return await gk(t.paths,e.workspaceId),r}case"restoreWorkspace":{let r=await Q.restoreWorkspace(t.paths,e.workspaceId);return await ao(t.paths,e.workspaceId,r.primaryRepoId),r}case"removeWorkspace":return Q.removeWorkspace(t.paths,e.workspaceId,{listTasks:T.listTasks});case"createTask":return Ji(t.paths,e.repoId??e.workspaceId??"",e.prompt,{...e.runner?{runner:e.runner}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}});case"createChildTask":{let r=await k.load(t.paths);if(!k.previews.isEnabled(r,"agentOrchestration"))throw new m("CLI_USAGE","Child delegation is a feature preview. Enable agentOrchestration before creating child tasks.",{details:{preview:"agentOrchestration"}});return oo(t),Xi(t.paths,{parentTaskId:e.parentTaskId??Vt(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 oo(t),Qi(t.paths,e.taskId??Vt(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return oo(t),Jc(t.paths,e.taskId??Vt(t).task.id,t.agentCapabilityId);case"listTasks":return e.repoId||e.workspaceId?T.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):T.listTasks(t.paths);case"currentTask":{let r=Vt(t);return{kind:"currentTask",task:r.task,context:{source:r.source,agentTabId:r.agentTabId}}}case"attachTask":return T.attachTask(t.paths,e.taskId);case"addTaskLink":return T.addTaskLink(t.paths,e.taskId,e.repoId);case"listTaskLinks":return T.listTaskLinks(t.paths,e.taskId);case"refreshInteractiveState":throw new Error("Interactive refresh should be handled by the interactive app.");case"showTask":return T.showTask(t.paths,e.taskId);case"showCurrentTask":return T.showTask(t.paths,Vt(t).task.id);case"showTaskPr":return T.prs.show(t.paths,yt(e.taskId,t),e.repoId);case"discoverTaskPr":return T.prs.discover(t.paths,yt(e.taskId,t),e.repoId);case"linkTaskPr":return T.prs.link(t.paths,yt(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return T.prs.refreshAssociation(t.paths,yt(e.taskId,t),e.repoId);case"unlinkTaskPr":return T.prs.unlink(t.paths,yt(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return $e.listAgents(t.paths,e.taskId);case"showAgentStatus":return $e.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=yt(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?Tn.waitForTaskState(t.paths,n,r):$e.waitForTask(t.paths,n,r)}case"listEvents":return Tn.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return Tn.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 Bt.send(t.paths,{taskId:yt(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 Bt.show(t.paths,e.commandId);case"listPromptCommands":return Bt.list(t.paths,e.taskId);case"cancelPromptCommand":return Bt.cancel(t.paths,e.commandId);case"waitPromptCommand":return Bt.wait(t.paths,e.commandId,{...e.states?{states:e.states}:{},timeoutMs:e.timeoutMs,...t.signal?{signal:t.signal}:{}});case"showSelectedTask":return T.showTask(t.paths,kt(t,"show"));case"streamTaskLogs":return T.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return T.prepareTaskLogs(t.paths,kt(t,"logs"));case"showTaskDiff":return T.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return T.showTaskDiff(t.paths,kt(t,"diff"));case"focusTask":return T.focusTask(t.paths,e.taskId);case"focusSelectedTask":return T.focusTask(t.paths,kt(t,"focus"));case"openTask":return T.openTask(t.paths,e.taskId);case"openSelectedTask":return T.openTask(t.paths,kt(t,"open"));case"runChecks":return T.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return T.runChecks(t.paths,kt(t,"check"));case"commitTask":return T.commitTask(t.paths,e.taskId);case"commitSelectedTask":return T.commitTask(t.paths,kt(t,"commit"));case"showContext":{let r=wk(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:ds()};case"exit":return{kind:"exit"};default:return hk(e)}}function oo(e){if(!(!e.agentContext||e.agentCapabilityId))throw new m("CAPABILITY_DENIED","This agent session has no delegation capability. Restart the agent session to receive one.",{details:{reason:"agent capability is missing"}})}async function ao(e,t,r){let n=await It({uiStateFile:e.uiStateFile})??Fr();await Ue({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:t,selectedRepoId:r,selectedTaskId:null})}async function gk(e,t){let r=await It({uiStateFile:e.uiStateFile});r?.selectedWorkspaceId===t&&await Ue({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function hk(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function kt(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 Vt(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function yt(e,t){return e??Vt(t).task.id}function wk(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Qc(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 Yt(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 Yt(i.name,`empty record at line ${c+1}`);let u;try{u=JSON.parse(d)}catch{throw Yt(i.name,`invalid JSON at line ${c+1}`)}let p=dR(u,i.name,c+1);if(c===0&&p.sequence!==i.startSequence)throw Yt(i.name,`first record sequence ${p.sequence} does not match segment name`);if(r.has(p.id))throw Yt(i.name,`duplicate event id ${p.id}`);r.add(p.id);let h=n.at(-1);if(h&&p.sequence!==h.sequence+1)throw Yt(i.name,`non-monotonic sequence ${p.sequence} after ${h.sequence}`);n.push(p)}}return{events:n,earliestSequence:n[0]?.sequence??null}}async function mi(e){return(await Dl(e.eventsDir).catch(n=>{if(_l(n))return[];throw n})).flatMap(n=>{let r=/^segment-(\d{16})\.jsonl$/.exec(n);return r?[{name:n,path:fi.join(e.eventsDir,n),startSequence:Number(r[1])}]:[]}).sort((n,r)=>n.startSequence-r.startSequence)}async function nR(e,t,n){let r=await Qb(e).catch(()=>null);return r!==null&&r.size>0&&r.size+Buffer.byteLength(t)>n}async function rR(e,t){let n=await mi(e),r=Math.max(0,n.length-t),s=await iR(e),i=await sR(e);if(s===null||i===null)return;for(let a=0;a<r;a+=1)if(await oR(n[a].path,s,i)){r=a;break}let o=n.slice(0,r);for(let a of o)await Xb(a.path,{force:!0});o.length>0&&await kf(e.eventsDir)}async function sR(e){let t=he(e).runs,n=await Dl(t).catch(s=>{if(_l(s))return[];throw s}),r=new Set;for(let s of n.filter(i=>i.endsWith(".json")))try{let i=JSON.parse(await Qr(fi.join(t,s),"utf8"));typeof i.id=="string"&&["pending","running","waiting_for_review"].includes(String(i.state))&&r.add(i.id)}catch{return null}return r}async function iR(e){let t=await Dl(e.commandsDir).catch(r=>{if(_l(r))return[];throw r}),n=new Set;for(let r of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await Qr(fi.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 oR(e,t,n){if(t.size===0&&n.size===0)return!1;let r=await Qr(e,"utf8");for(let s of r.split(`
83
+ `))if(s)try{let i=JSON.parse(s);if(typeof i.commandId=="string"&&t.has(i.commandId)||typeof i.furyRunId=="string"&&n.has(i.furyRunId))return!0}catch{return!0}return!1}async function aR(e){let t=(await mi(e)).at(-1);if(!t)return;let n=await Qr(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await $l(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function lR(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 El(t);return hf(t,i,n),i}let s=e.find(i=>i.id===t);if(!s)throw n!==null&&n>1?new g("EVENT_CURSOR_EXPIRED",`Event cursor ${t} has expired.`,{details:{cursor:t,earliestAvailableSequence:n,resumeAfter:n-1}}):El(t);return hf(t,s.sequence,n),s.sequence}function hf(e,t,n){if(n!==null&&t<n-1)throw new g("EVENT_CURSOR_EXPIRED",`Event cursor ${e} has expired.`,{details:{cursor:e,earliestAvailableSequence:n,resumeAfter:n-1}})}function cR(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 uR(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 dR(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw Yt(t,`record at line ${n} is not an object`);let r=e,s={...r,furyRunId:r.furyRunId??r.swarmRunId??null,furyStepId:r.furyStepId??r.swarmStepId??null,type:typeof r.type=="string"&&r.type.startsWith("swarm.")?`fury.${r.type.slice(6)}`:r.type};delete s.swarmRunId,delete s.swarmStepId;let i=s;if(i.schemaVersion!==1||typeof i.id!="string"||i.id.length===0||i.id.length>256||!Number.isSafeInteger(i.sequence)||(i.sequence??0)<1||typeof i.type!="string"||i.type.length===0||i.type.length>256||typeof i.occurredAt!="string"||!Number.isFinite(Date.parse(i.occurredAt))||!sr(i.workspaceId)||!sr(i.taskId)||!sr(i.agentTabId)||!sr(i.commandId)||!sr(i.furyRunId)||!sr(i.furyStepId)||!pR(i.actor)||!("data"in i))throw Yt(t,`record at line ${n} has an invalid schema`);return i}function pR(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 sr=e=>e===null||typeof e=="string",gf=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,Yt=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),El=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),_l=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Ol(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 kf(e){let t=await $l(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as Rf,readdir as SR,readFile as Sf}from"node:fs/promises";import Pf from"node:path";import{mkdir as Tf,readFile as fR,rm as hi,stat as mR,writeFile as hR}from"node:fs/promises";import xl from"node:path";var gR=20,yR=3e4,wR=5e3;async function Fl(e,t){let n=xl.join(e.runtimeDir,"command-store.lock");await Tf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Tf(n);try{await hR(xl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await hi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!bR(s))throw s;if(await kR(n))continue;if(Date.now()-r>=yR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await RR(gR)}try{return await t()}finally{await hi(n,{recursive:!0,force:!0})}}async function kR(e){let t=await fR(xl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return TR(t.pid)?!1:(await hi(e,{recursive:!0,force:!0}),!0);let n=await mR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<wR?!1:(await hi(e,{recursive:!0,force:!0}),!0)}function TR(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 bR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",RR=e=>new Promise(t=>setTimeout(t,e));async function wi(e,t){Ll(t);try{let n=JSON.parse(await Sf(Zr(e,t),"utf8"));return vf(n,Zr(e,t),t)}catch(n){throw CR(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?yi(t,Zr(e,t),n):n}}async function Ke(e){await Rf(e.commandsDir,{recursive:!0});let t=await SR(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=Pf.join(e.commandsDir,r);try{n.push(vf(JSON.parse(await Sf(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:yi(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function If(e,t){return Ll(t.id),Fl(e,async()=>{await Rf(e.commandsDir,{recursive:!0});let n=await Ke(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!PR(r,t))throw new g("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 M(Zr(e,t.id),t),{command:t,created:!0}})}async function es(e,t,n){return Ll(t),Fl(e,async()=>{let r=await wi(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await M(Zr(e,t),s),s})}function PR(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 vf(e,t,n){if(!gi(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw yi("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||!gi(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!vR(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||!ir(e.expiresAt)||!ir(e.createdAt)||!ir(e.updatedAt)||e.deliveryStartedAt!==null&&!ir(e.deliveryStartedAt)||e.deliveredAt!==null&&!ir(e.deliveredAt)||e.cancelledAt!==null&&!ir(e.cancelledAt)||e.cancelledBy!==null&&!bf(e.cancelledBy)||!bf(e.actor)||!IR(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 yi(r,t);return e}function bf(e){return!gi(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 IR(e){return e===null||gi(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var Zr=(e,t)=>Pf.join(e.commandsDir,`${t}.json`),Ll=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},ir=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),vR=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}),gi=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),CR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",yi=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function Cf(e,t=new Date){return ki(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function Af(e,t=new Date){return e.state==="delivered"?e:(ki(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function Ef(e,t,n=new Date){return e.state==="failed"?e:(ki(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function Of(e,t,n=new Date){return e.state==="cancelled"?e:(ki(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function ki(e,t,n){if(!t.includes(e.state))throw new g("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 AR}from"node:crypto";var Ml=32*1024,$f=1440*60*1e3,jl=256,ER=["delivered","failed","cancelled"],ql={type:"system",component:"orchestration-supervisor"};async function OR(e,t){if(MR(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>$f)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:$f}});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)>jl)throw new g("CLI_USAGE",`Idempotency key exceeds ${jl} characters.`,{details:{maxIdempotencyKeyLength:jl}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${AR()}`,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 If(e,r);if(s.created)try{await vn(e,s.command,"command.queued")}catch(i){throw Df(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function $R(e,t){return{kind:"showPromptCommand",command:await wi(e,t)}}async function DR(e,t){let n=await Ke(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function NR(e,t,n){let r=!1,s=await es(e,t,i=>{if(i.state==="cancelled")return i;let o=Of(i,n??i.actor);return r=!0,o});if(r)try{await vn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw Df(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function _R(e,t){let n=await es(e,t,r=>Cf(r));return await vn(e,n,"command.delivering",ql),n}async function xR(e,t){let n=await es(e,t,r=>Af(r));return await vn(e,n,"command.delivered",ql),n}async function FR(e,t,n){let r=await es(e,t,s=>Ef(s,n));return await vn(e,r,"command.failed",ql),r}async function LR(e,t,n){let r=[...n.states??ER],s=Date.now()+n.timeoutMs;for(;;){let i=await wi(e,t);if(r.includes(i.state))return{kind:"waitPromptCommand",command:i,matchedStates:r};if(n.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 ${n.timeoutMs}ms waiting for command ${t}.`,{retryable:!0,details:{commandId:t,states:r,timeoutMs:n.timeoutMs}});await jR(Math.min(n.pollIntervalMs??100,o),n.signal)}}function MR(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>Ml)throw new g("CLI_USAGE",`Prompt exceeds the ${Ml}-byte limit.`,{details:{maxPromptBytes:Ml,promptBytes:t}});if([...e].some(n=>{let r=n.charCodeAt(0);return r<=8||r>=11&&r<=31||r>=127&&r<=159}))throw new g("CLI_USAGE","Prompt contains unsupported control characters.",{})}async function vn(e,t,n,r=t.actor){await De(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 jR(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 Df=(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}),de={create:OR,show:$R,list:DR,cancel:NR,wait:LR,beginDelivery:_R,completeDelivery:xR,fail:FR};import{randomUUID as _f,timingSafeEqual as qR}from"node:crypto";import{mkdir as UR,readFile as WR,readdir as BR}from"node:fs/promises";import xf from"node:path";var VR=10080*60*1e3,KR={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},GR=["task.create-child","task.children","task.cancel-tree"],HR=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function Je(e,t,n={type:"system",component:"orchestration-supervisor"},r){let s=t.ptyTabs.find(o=>o.kind==="agent"&&(!r||o.id===r));if(!s)return{};let i=null;if(await UR(Vl(e),{recursive:!0,mode:448}),await W(e,t.id,async o=>{let a=o.ptyTabs.find(u=>u.id===s.id&&u.kind==="agent");if(!a)throw new g("CAPABILITY_DENIED",`Agent tab ${s.id} no longer exists.`,{});let l=a.capabilityId??`capability_${_f()}`,c=await Ti(e,l);if(c&&(c.taskId!==o.id||c.agentTabId!==a.id))throw new g("CAPABILITY_DENIED",`Capability ${l} is bound to another agent.`,{details:{capabilityId:l,taskId:o.id,agentTabId:a.id}});return i=(c??await YR(e,l,o.id,a.id,n)).token,a.capabilityId?o:{...o,ptyTabs:o.ptyTabs.map(u=>u.id===a.id?{...u,capabilityId:l}:u)}}),!i)throw new g("INTERNAL_ERROR",`Failed to issue a capability for ${s.id}.`,{});return{CRAIG_AGENT_CAPABILITY:i}}async function YR(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${_f()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...GR],targetPolicy:"children-only",limits:{...KR},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+VR).toISOString(),revokedAt:null,revokedBy:null};return await M(Kl(e,o.id),o,{mode:384}),o}async function Ge(e,t,n,r){let s=await JR(e,t);return s.revokedAt&&Cn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&Cn(s.id,"expired"),!HR.has(n)&&!s.allowedCommandFamilies.includes(n)&&Cn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await zR(e,s.taskId,r)&&Cn(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 zR(e,t,n){if(t===n)return!0;let r=(await S.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 Ff(e,t,n){let r=await Ti(e,t);r&&(r.revokedAt||await M(Kl(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function Bl(e,t,n){let r=await BR(Vl(e)).catch(i=>Lf(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 Ti(e,o[1]);!a||!t.has(a.taskId)||(await Ff(e,a.id,n),s.push(a.id))}return s}async function JR(e,t){let n=t.indexOf("."),r=n>0?t.slice(0,n):"";/^capability_[A-Za-z0-9-]+$/.test(r)||Cn("<redacted>","token is invalid");let s=await Ti(e,r);if(!s)throw new g("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||!qR(i,o))&&Cn(r,"token is invalid"),s}async function Ti(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||Cn(t,"identifier is invalid");try{let n=JSON.parse(await WR(Kl(e,t),"utf8"));if(!XR(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(Lf(n))return null;throw n}}function XR(e,t){if(!Wl(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.length>0&&e.allowedCommandFamilies.every(r=>typeof r=="string"&&QR(r))&&e.targetPolicy==="children-only"&&Wl(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&Ul(e.createdAt)&&Ul(e.expiresAt)&&Nf(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||Ul(e.revokedAt)&&Nf(e.revokedBy))}function Nf(e){return Wl(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 Cn(e,t){throw new g("CAPABILITY_DENIED",`Craig capability ${e} was denied: ${t}.`,{details:{capabilityId:e,reason:t}})}var Vl=e=>xf.join(e.orchestrationDir,"capabilities"),Kl=(e,t)=>xf.join(Vl(e),`${t}.json`),QR=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),Wl=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ul=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Lf=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as Mf,readFile as ZR,rm as Gl,stat as eS,writeFile as tS}from"node:fs/promises";import Hl from"node:path";var nS=20,rS=3e4,sS=5e3;async function Yl(e,t){let n=Hl.join(e.runtimeDir,"delegation.lock");await Mf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Mf(n);try{await tS(Hl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Gl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!aS(s))throw s;if(await iS(n))continue;if(Date.now()-r>=rS)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,nS))}try{return await t()}finally{await Gl(n,{recursive:!0,force:!0})}}async function iS(e){let t=await ZR(Hl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&oS(t.pid))return!1;let n=await eS(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<sS?!1:(await Gl(e,{recursive:!0,force:!0}),!0)}function oS(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 aS=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var lS={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function zl(e,t,n,r={}){let s=await k.load(e);return k.previews.isEnabled(s,"agentOrchestration")?S.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 Je(e,i,{type:"human",source:"cli",processId:process.pid})})}):S.createTask(e,t,n,r)}async function ts(e,t){return Yl(e,async()=>{let n=await S.getTask(e,t.parentTaskId),r=t.capabilityId?await Ge(e,t.capabilityId,"task.create-child",n.id):null,s=r?.actor??{type:"human",source:"cli",processId:process.pid},i=r?.capability.limits??lS,o=t.prompt.trim();if(o.length===0)throw new g("CLI_USAGE","Child task prompt cannot be empty.",{});if(Buffer.byteLength(o)>i.maxPromptBytes&&bi("prompt bytes",i.maxPromptBytes),n.delegationDepth+1>i.maxDepth&&bi("delegation depth",i.maxDepth),!new Set([n.repoId,...n.linkedRepoIds,...(n.repoTargets??[]).map(f=>f.repoId)]).has(t.repoId))throw new g("CAPABILITY_DENIED",`Repo ${t.repoId} is outside parent task ${n.id}.`,{details:{parentTaskId:n.id,repoId:t.repoId}});let c=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(f=>f.parentTaskId===n.id),d=t.idempotencyKey?.trim()||null;if(d){if(d.length>256)throw new g("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let f=c.find(m=>m.delegationIdempotencyKey===d);if(f){if(f.repoId!==t.repoId||f.prompt.value!==o||t.runner&&f.runner!==t.runner)throw new g("COMMAND_STATE_CONFLICT",`Idempotency key "${d}" is already used by child ${f.id}.`,{details:{idempotencyKey:d,taskId:f.id}});return jf(f,!0)}}c.length>=i.maxChildren&&bi("children",i.maxChildren),c.filter(f=>f.status!=="closed"&&f.status!=="merged").length>=i.maxConcurrentChildren&&bi("concurrent children",i.maxConcurrentChildren);let p=await S.createTask(e,t.repoId,o,{...t.runner?{runner:t.runner}:{},lineage:{parentTaskId:n.id,rootTaskId:n.rootTaskId,delegationDepth:n.delegationDepth+1,delegationIdempotencyKey:d,furyRunId:t.fury?.runId??n.furyRunId,furyStepId:t.fury?.stepId??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??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await Je(e,f,s)})}),h=await S.getTask(e,p.taskId);try{await De(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 g("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 jf(h,!1)})}async function Jl(e,t,n){n&&await Ge(e,n,"task.children",t),await S.getTask(e,t);let r=(await S.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 Xl(e,t,n){return Yl(e,async()=>{let s=(n?await Ge(e,n,"task.cancel-tree",t):null)?.actor??{type:"human",source:"cli",processId:process.pid};await S.getTask(e,t);let i=(await S.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,d=f=>{if(c.has(f))throw new g("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 y of(a.get(f)??[]).sort((T,R)=>T.id.localeCompare(R.id)))d(y.id)}};d(t);let u=[],p=[],h=[];try{await Bl(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"){u.push({taskId:f.id,previousStatus:m,status:"closed",disposition:"already-closed"});continue}await S.cleanupTask(e,f,{preserveWorktree:!0});let y=await S.closeTask(e,f.id);u.push({taskId:f.id,previousStatus:m,status:y.status,disposition:"cancelled"});try{await De(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 g("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:u,auditFailures:p,revocationFailures:h,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:u}})}function jf(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 bi(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var Ri=Symbol.for("yaml.alias"),Si=Symbol.for("yaml.document"),Xe=Symbol.for("yaml.map"),Ql=Symbol.for("yaml.pair"),Ne=Symbol.for("yaml.scalar"),Et=Symbol.for("yaml.seq"),Re=Symbol.for("yaml.node.type"),_e=e=>!!e&&typeof e=="object"&&e[Re]===Ri,dt=e=>!!e&&typeof e=="object"&&e[Re]===Si,Qe=e=>!!e&&typeof e=="object"&&e[Re]===Xe,q=e=>!!e&&typeof e=="object"&&e[Re]===Ql,_=e=>!!e&&typeof e=="object"&&e[Re]===Ne,Ze=e=>!!e&&typeof e=="object"&&e[Re]===Et;function B(e){if(e&&typeof e=="object")switch(e[Re]){case Xe:case Et:return!0}return!1}function U(e){if(e&&typeof e=="object")switch(e[Re]){case Ri:case Xe:case Ne:case Et:return!0}return!1}var Pi=e=>(_(e)||B(e))&&!!e.anchor;var Ae=Symbol("break visit"),qf=Symbol("skip children"),pt=Symbol("remove node");function He(e,t){let n=Uf(t);dt(e)?or(null,e.contents,n,Object.freeze([e]))===pt&&(e.contents=null):or(null,e,n,Object.freeze([]))}He.BREAK=Ae;He.SKIP=qf;He.REMOVE=pt;function or(e,t,n,r){let s=Wf(e,t,n,r);if(U(s)||q(s))return Bf(e,r,s),or(e,s,n,r);if(typeof s!="symbol"){if(B(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=or(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ae)return Ae;o===pt&&(t.items.splice(i,1),i-=1)}}}else if(q(t)){r=Object.freeze(r.concat(t));let i=or("key",t.key,n,r);if(i===Ae)return Ae;i===pt&&(t.key=null);let o=or("value",t.value,n,r);if(o===Ae)return Ae;o===pt&&(t.value=null)}}return s}async function Ii(e,t){let n=Uf(t);dt(e)?await ar(null,e.contents,n,Object.freeze([e]))===pt&&(e.contents=null):await ar(null,e,n,Object.freeze([]))}Ii.BREAK=Ae;Ii.SKIP=qf;Ii.REMOVE=pt;async function ar(e,t,n,r){let s=await Wf(e,t,n,r);if(U(s)||q(s))return Bf(e,r,s),ar(e,s,n,r);if(typeof s!="symbol"){if(B(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=await ar(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ae)return Ae;o===pt&&(t.items.splice(i,1),i-=1)}}}else if(q(t)){r=Object.freeze(r.concat(t));let i=await ar("key",t.key,n,r);if(i===Ae)return Ae;i===pt&&(t.key=null);let o=await ar("value",t.value,n,r);if(o===Ae)return Ae;o===pt&&(t.value=null)}}return s}function Uf(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 Wf(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(Qe(t))return n.Map?.(e,t,r);if(Ze(t))return n.Seq?.(e,t,r);if(q(t))return n.Pair?.(e,t,r);if(_(t))return n.Scalar?.(e,t,r);if(_e(t))return n.Alias?.(e,t,r)}function Bf(e,t,n){let r=t[t.length-1];if(B(r))r.items[e]=n;else if(q(r))e==="key"?r.key=n:r.value=n;else if(dt(r))r.contents=n;else{let s=_e(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var cS={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},uS=e=>e.replace(/[!,[\]{}]/g,t=>cS[t]),ft=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+uS(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&&U(t.contents)){let i={};He(t.contents,(o,a)=>{U(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
+ `)}};ft.defaultYaml={explicit:!1,version:"1.2"};ft.defaultTags={"!!":"tag:yaml.org,2002:"};function vi(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 Zl(e){let t=new Set;return He(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function ec(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function Vf(e,t){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=Zl(e));let o=ec(t,s);return s.add(o),o},setAnchors:()=>{for(let i of n){let o=r.get(i);if(typeof o=="object"&&o.anchor&&(_(o.node)||B(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 zt(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=zt(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=zt(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=zt(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=zt(e,r,s,i);o===void 0?delete r[s]:o!==i&&(r[s]=o)}return e.call(t,n,r)}function ae(e,t,n){if(Array.isArray(e))return e.map((r,s)=>ae(r,String(s),n));if(e&&typeof e.toJSON=="function"){if(!n||!Pi(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 Jt=class{constructor(t){Object.defineProperty(this,Re,{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(!dt(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=ae(this,"",o);if(typeof s=="function")for(let{count:l,res:c}of o.anchors.values())s(c,l);return typeof i=="function"?zt(i,{"":a},"",a):a}};var Ot=class extends Jt{constructor(t){super(Ri),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=[],He(t,{Node:(i,o)=>{(_e(o)||Pi(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||(ae(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=Ci(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(vi(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 Ci(e,t,n){if(_e(t)){let r=t.resolve(e),s=n&&r&&n.get(r);return s?s.count*s.aliasCount:0}else if(B(t)){let r=0;for(let s of t.items){let i=Ci(e,s,n);i>r&&(r=i)}return r}else if(q(t)){let r=Ci(e,t.key,n),s=Ci(e,t.value,n);return Math.max(r,s)}return 1}var Ai=e=>!e||typeof e!="function"&&typeof e!="object",O=class extends Jt{constructor(t){super(Ne),this.value=t}toJSON(t,n){return n?.keep?this.value:ae(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 dS="tag:yaml.org,2002:";function pS(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 $t(e,t,n){if(dt(e)&&(e=e.contents),U(e))return e;if(q(e)){let u=n.schema[Xe].createNode?.(n.schema,null,n);return u.items.push(e),u}(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 Ot(l.anchor);l={anchor:null,node:null},a.set(e,l)}t?.startsWith("!!")&&(t=dS+t.slice(2));let c=pS(e,t,o.tags);if(!c){if(e&&typeof e.toJSON=="function"&&(e=e.toJSON()),!e||typeof e!="object"){let u=new O(e);return l&&(l.node=u),u}c=e instanceof Map?o[Xe]:Symbol.iterator in Object(e)?o[Et]:o[Xe]}i&&(i(c),delete n.onTagObj);let d=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?d.tag=t:c.default||(d.tag=c.tag),l&&(l.node=d),d}function ns(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 $t(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 cr=e=>e==null||typeof e=="object"&&!!e[Symbol.iterator]().next().done,lr=class extends Jt{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=>U(r)||q(r)?r.clone(t):r),this.range&&(n.range=this.range.slice()),n}addIn(t,n){if(cr(t))this.add(n);else{let[r,...s]=t,i=this.get(r,!0);if(B(i))i.addIn(s,n);else if(i===void 0&&this.schema)this.set(r,ns(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(B(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&&_(i)?i.value:i:B(i)?i.getIn(s,n):void 0}hasAllNullValues(t){return this.items.every(n=>{if(!q(n))return!1;let r=n.value;return r==null||t&&_(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 B(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(B(i))i.setIn(s,n);else if(i===void 0&&this.schema)this.set(r,ns(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};var Kf=e=>e.replace(/^(?!$)(?: $)?/gm,"#");function Ye(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var mt=(e,t,n)=>e.endsWith(`
85
+ `)?Ye(n,t):n.includes(`
86
+ `)?`
87
+ `+Ye(n,t):(e.endsWith(" ")?"":" ")+n;var tc="flow",Ei="block",rs="quoted";function ss(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=[],d={},u=s-t.length;typeof r=="number"&&(r>s-Math.max(2,i)?c.push(0):u=s-r);let p,h,f=!1,m=-1,y=-1,T=-1;n===Ei&&(m=Gf(e,m,t.length),m!==-1&&(u=m+l));for(let v;v=e[m+=1];){if(n===rs&&v==="\\"){switch(y=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(v===`
88
+ `)n===Ei&&(m=Gf(e,m,t.length)),u=m+t.length+l,p=void 0;else{if(v===" "&&h&&h!==" "&&h!==`
89
+ `&&h!==" "){let b=e[m+1];b&&b!==" "&&b!==`
90
+ `&&b!==" "&&(p=m)}if(m>=u)if(p)c.push(p),u=p+l,p=void 0;else if(n===rs){for(;h===" "||h===" ";)h=v,v=e[m+=1],f=!0;let b=m>T+1?m-2:y-1;if(d[b])return e;c.push(b),d[b]=!0,u=b+l,p=void 0}else f=!0}h=v}if(f&&a&&a(),c.length===0)return e;o&&o();let R=e.slice(0,c[0]);for(let v=0;v<c.length;++v){let b=c[v],$=c[v+1]||e.length;b===0?R=`
91
+ ${t}${e.slice(0,$)}`:(n===rs&&d[b]&&(R+=`${e[b]}\\`),R+=`
92
+ ${t}${e.slice(b+1,$)}`)}return R}function Gf(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 $i=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),Di=e=>/^(%|---|\.\.\.)/m.test(e);function fS(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 is(e,t){let n=JSON.stringify(e);if(t.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=t,s=t.options.doubleQuotedMinMultiLineLength,i=t.indent||(Di(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 d=n.substr(l+2,4);switch(d){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:d.substr(0,2)==="00"?o+="\\x"+d.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:ss(o,i,rs,$i(t,!1))}function nc(e,t){if(t.options.singleQuote===!1||t.implicitKey&&e.includes(`
98
+ `)||/[ \t]\n|\n[ \t]/.test(e))return is(e,t);let n=t.indent||(Di(e)?" ":""),r="'"+e.replace(/'/g,"''").replace(/\n+/g,`$&
99
+ ${n}`)+"'";return t.implicitKey?r:ss(r,n,tc,$i(t,!1))}function ur(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=is;else{let s=e.includes('"'),i=e.includes("'");s&&!i?r=nc:i&&!s?r=is:r=n?nc:is}return r(e,t)}var rc;try{rc=new RegExp(`(^|(?<!
100
+ ))
101
+ +(?!
102
+ |$)`,"g")}catch{rc=/\n+(?!\n|$)/g}function Oi({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 ur(n,r);let c=r.indent||(r.forceBlockIndent||Di(n)?" ":""),d=o==="literal"?!0:o==="folded"||t===O.BLOCK_FOLDED?!1:t===O.BLOCK_LITERAL?!0:!fS(n,l,c.length);if(!n)return d?`|
103
+ `:`>
104
+ `;let u,p;for(p=n.length;p>0;--p){let $=n[p-1];if($!==`
105
+ `&&$!==" "&&$!==" ")break}let h=n.substring(p),f=h.indexOf(`
106
+ `);f===-1?u="-":n===h||f!==h.length-1?(u="+",i&&i()):u="",h&&(n=n.slice(0,-h.length),h[h.length-1]===`
107
+ `&&(h=h.slice(0,-1)),h=h.replace(rc,`$&${c}`));let m=!1,y,T=-1;for(y=0;y<n.length;++y){let $=n[y];if($===" ")m=!0;else if($===`
108
+ `)T=y;else break}let R=n.substring(0,T<y?T+1:y);R&&(n=n.substring(R.length),R=R.replace(/\n+/g,`$&${c}`));let b=(m?c?"2":"1":"")+u;if(e&&(b+=" "+a(e.replace(/ ?[\r\n]+/g," ")),s&&s()),!d){let $=n.replace(/\n+/g,`
109
+ $&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),D=!1,x=$i(r,!0);o!=="folded"&&t!==O.BLOCK_FOLDED&&(x.onOverflow=()=>{D=!0});let C=ss(`${R}${$}${h}`,c,Ei,x);if(!D)return`>${b}
110
+ ${c}${C}`}return n=n.replace(/\n+/g,`$&${c}`),`|${b}
111
+ ${c}${R}${n}${h}`}function mS(e,t,n,r){let{type:s,value:i}=e,{actualString:o,implicitKey:a,indent:l,indentStep:c,inFlow:d}=t;if(a&&i.includes(`
112
+ `)||d&&/[[\]{},]/.test(i))return ur(i,t);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(i))return a||d||!i.includes(`
113
+ `)?ur(i,t):Oi(e,t,n,r);if(!a&&!d&&s!==O.PLAIN&&i.includes(`
114
+ `))return Oi(e,t,n,r);if(Di(i)){if(l==="")return t.forceBlockIndent=!0,Oi(e,t,n,r);if(a&&l===c)return ur(i,t)}let u=i.replace(/\n+/g,`$&
115
+ ${l}`);if(o){let p=m=>m.default&&m.tag!=="tag:yaml.org,2002:str"&&m.test?.test(u),{compat:h,tags:f}=t.doc.schema;if(f.some(p)||h?.some(p))return ur(i,t)}return a?u:ss(u,l,tc,$i(t,!1))}function An(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=d=>{switch(d){case O.BLOCK_FOLDED:case O.BLOCK_LITERAL:return s||i?ur(o.value,t):Oi(o,t,n,r);case O.QUOTE_DOUBLE:return is(o.value,t);case O.QUOTE_SINGLE:return nc(o.value,t);case O.PLAIN:return mS(o,t,n,r);default:return null}},c=l(a);if(c===null){let{defaultKeyType:d,defaultStringType:u}=t.options,p=s&&d||u;if(c=l(p),c===null)throw new Error(`Unsupported default string type ${p}`)}return c}function Ni(e,t){let n=Object.assign({blockQuote:!0,commentString:Kf,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 hS(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(_(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 gS(e,t,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(_(e)||B(e))&&e.anchor;i&&vi(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 Dt(e,t,n,r){if(q(e))return e.toString(t,n,r);if(_e(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=U(e)?e:t.doc.createNode(e,{onTagObj:l=>s=l});s??(s=hS(t.doc.schema.tags,i));let o=gS(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):_(i)?An(i,t,n,r):i.toString(t,n,r);return o?_(i)||a[0]==="{"||a[0]==="["?`${o} ${a}`:`${o}
116
+ ${t.indent}${a}`:a}function Hf({key:e,value:t},n,r,s){let{allNullValues:i,doc:o,indent:a,indentStep:l,options:{commentString:c,indentSeq:d,simpleKeys:u}}=n,p=U(e)&&e.comment||null;if(u){if(p)throw new Error("With simple keys, key nodes cannot have comments");if(B(e)||!U(e)&&typeof e=="object"){let x="With simple keys, collection cannot be used as a key value";throw new Error(x)}}let h=!u&&(!e||p&&t==null&&!n.inFlow||B(e)||(_(e)?e.type===O.BLOCK_FOLDED||e.type===O.BLOCK_LITERAL:typeof e=="object"));n=Object.assign({},n,{allNullValues:!1,implicitKey:!h&&(u||!i),indent:a+l});let f=!1,m=!1,y=Dt(e,n,()=>f=!0,()=>m=!0);if(!h&&!n.inFlow&&y.length>1024){if(u)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(),y===""?"?":h?`? ${y}`:y}else if(i&&!u||t==null&&h)return y=`? ${y}`,p&&!f?y+=mt(y,n.indent,c(p)):m&&s&&s(),y;f&&(p=null),h?(p&&(y+=mt(y,n.indent,c(p))),y=`? ${y}
117
+ ${a}:`):(y=`${y}:`,p&&(y+=mt(y,n.indent,c(p))));let T,R,v;U(t)?(T=!!t.spaceBefore,R=t.commentBefore,v=t.comment):(T=!1,R=null,v=null,t&&typeof t=="object"&&(t=o.createNode(t))),n.implicitKey=!1,!h&&!p&&_(t)&&(n.indentAtStart=y.length+1),m=!1,!d&&l.length>=2&&!n.inFlow&&!h&&Ze(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let b=!1,$=Dt(t,n,()=>b=!0,()=>m=!0),D=" ";if(p||T||R){if(D=T?`
118
+ `:"",R){let x=c(R);D+=`
119
+ ${Ye(x,n.indent)}`}$===""&&!n.inFlow?D===`
120
+ `&&v&&(D=`
121
+
122
+ `):D+=`
123
+ ${n.indent}`}else if(!h&&B(t)){let x=$[0],C=$.indexOf(`
124
+ `),w=C!==-1,ge=n.inFlow??t.flow??t.items.length===0;if(w||!ge){let ye=!1;if(w&&(x==="&"||x==="!")){let Y=$.indexOf(" ");x==="&"&&Y!==-1&&Y<C&&$[Y+1]==="!"&&(Y=$.indexOf(" ",Y+1)),(Y===-1||C<Y)&&(ye=!0)}ye||(D=`
125
+ ${n.indent}`)}}else($===""||$[0]===`
126
+ `)&&(D="");return y+=D+$,n.inFlow?b&&r&&r():v&&!b?y+=mt(y,n.indent,c(v)):m&&s&&s(),y}function sc(e,t){(e==="debug"||e==="warn")&&console.warn(t)}var _i="<<",et={identify:e=>e===_i||typeof e=="symbol"&&e.description===_i,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new O(Symbol(_i)),{addToJSMap:oc}),stringify:()=>_i},Yf=(e,t)=>(et.identify(t)||_(t)&&(!t.type||t.type===O.PLAIN)&&et.identify(t.value))&&e?.doc.schema.tags.some(n=>n.tag===et.tag&&n.default);function oc(e,t,n){let r=zf(e,n);if(Ze(r))for(let s of r.items)ic(e,t,s);else if(Array.isArray(r))for(let s of r)ic(e,t,s);else ic(e,t,r)}function ic(e,t,n){let r=zf(e,n);if(!Qe(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 zf(e,t){return e&&_e(t)?t.resolve(e.doc,e):t}function xi(e,t,{key:n,value:r}){if(U(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(Yf(e,n))oc(e,t,r);else{let s=ae(n,"",e);if(t instanceof Map)t.set(s,ae(r,s,e));else if(t instanceof Set)t.add(s);else{let i=yS(n,s,e),o=ae(r,i,e);i in t?Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0}):t[i]=o}}return t}function yS(e,t,n){if(t===null)return"";if(typeof t!="object")return String(t);if(U(e)&&n?.doc){let r=Ni(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)+'..."'),sc(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 dr(e,t,n){let r=$t(e,void 0,n),s=$t(t,void 0,n);return new Q(r,s)}var Q=class e{constructor(t,n=null){Object.defineProperty(this,Re,{value:Ql}),this.key=t,this.value=n}clone(t){let{key:n,value:r}=this;return U(n)&&(n=n.clone(t)),U(r)&&(r=r.clone(t)),new e(n,r)}toJSON(t,n){let r=n?.mapAsMap?new Map:{};return xi(n,r,this)}toString(t,n,r){return t?.doc?Hf(this,t,n,r):JSON.stringify(this)}};function Li(e,t,n){return(t.inFlow??e.flow?kS:wS)(e,t,n)}function wS({comment:e,items:t},n,{blockItemPrefix:r,flowChars:s,itemIndent:i,onChompKeep:o,onComment:a}){let{indent:l,options:{commentString:c}}=n,d=Object.assign({},n,{indent:i,type:null}),u=!1,p=[];for(let f=0;f<t.length;++f){let m=t[f],y=null;if(U(m))!u&&m.spaceBefore&&p.push(""),Fi(n,p,m.commentBefore,u),m.comment&&(y=m.comment);else if(q(m)){let R=U(m.key)?m.key:null;R&&(!u&&R.spaceBefore&&p.push(""),Fi(n,p,R.commentBefore,u))}u=!1;let T=Dt(m,d,()=>y=null,()=>u=!0);y&&(T+=mt(T,i,c(y))),u&&y&&(u=!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
+ `+Ye(c(e),l),a&&a()):u&&o&&o(),h}function kS({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,d=0,u=[];for(let f=0;f<e.length;++f){let m=e[f],y=null;if(U(m))m.spaceBefore&&u.push(""),Fi(t,u,m.commentBefore,!1),m.comment&&(y=m.comment);else if(q(m)){let R=U(m.key)?m.key:null;R&&(R.spaceBefore&&u.push(""),Fi(t,u,R.commentBefore,!1),R.comment&&(c=!0));let v=U(m.value)?m.value:null;v?(v.comment&&(y=v.comment),v.commentBefore&&(c=!0)):m.value==null&&R?.comment&&(y=R.comment)}y&&(c=!0);let T=Dt(m,l,()=>y=null);c||(c=u.length>d||T.includes(`
130
+ `)),f<e.length-1?T+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=u.reduce((R,v)=>R+v.length+2,2)+(T.length+2)>t.options.lineWidth)),c&&(T+=",")),y&&(T+=mt(T,r,a(y))),u.push(T),d=u.length}let{start:p,end:h}=n;if(u.length===0)return p+h;if(!c){let f=u.reduce((m,y)=>m+y.length+2,2);c=t.options.lineWidth>0&&f>t.options.lineWidth}if(c){let f=p;for(let m of u)f+=m?`
131
+ ${i}${s}${m}`:`
132
+ `;return`${f}
133
+ ${s}${h}`}else return`${p}${o}${u.join(" ")}${o}${h}`}function Fi({indent:e,options:{commentString:t}},n,r,s){if(r&&s&&(r=r.replace(/^\n+/,"")),r){let i=Ye(t(r),e);n.push(i.trimStart())}}function Xt(e,t){let n=_(t)?t.value:t;for(let r of e)if(q(r)&&(r.key===t||r.key===n||_(r.key)&&r.key.value===n))return r}var te=class extends lr{static get tagName(){return"tag:yaml.org,2002:map"}constructor(t){super(Xe,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(dr(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;q(t)?r=t:!t||typeof t!="object"||!("key"in t)?r=new Q(t,t?.value):r=new Q(t.key,t.value);let s=Xt(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);_(s.value)&&Ai(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=Xt(this.items,t);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(t,n){let s=Xt(this.items,t)?.value;return(!n&&_(s)?s.value:s)??void 0}has(t){return!!Xt(this.items,t)}set(t,n){this.add(new Q(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)xi(n,s,i);return s}toString(t,n,r){if(!t)return JSON.stringify(this);for(let s of this.items)if(!q(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 tt={collection:"map",default:!0,nodeClass:te,tag:"tag:yaml.org,2002:map",resolve(e,t){return Qe(e)||t("Expected a mapping for this tag"),e},createNode:(e,t,n)=>te.from(e,t,n)};var ke=class extends lr{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(t){super(Et,t),this.items=[]}add(t){this.items.push(t)}delete(t){let n=Mi(t);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(t,n){let r=Mi(t);if(typeof r!="number")return;let s=this.items[r];return!n&&_(s)?s.value:s}has(t){let n=Mi(t);return typeof n=="number"&&n<this.items.length}set(t,n){let r=Mi(t);if(typeof r!="number")throw new Error(`Expected a valid index, not ${t}.`);let s=this.items[r];_(s)&&Ai(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(ae(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($t(a,void 0,r))}}return i}};function Mi(e){let t=_(e)?e.value:e;return t&&typeof t=="string"&&(t=Number(t)),typeof t=="number"&&Number.isInteger(t)&&t>=0?t:null}var nt={collection:"seq",default:!0,nodeClass:ke,tag:"tag:yaml.org,2002:seq",resolve(e,t){return Ze(e)||t("Expected a sequence for this tag"),e},createNode:(e,t,n)=>ke.from(e,t,n)};var Qt={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),An(e,t,n,r)}};var En={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"&&En.test.test(e)?e:t.options.nullStr};var os={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&&os.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 Te({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 ji={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:Te},qi={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():Te(e)}},Ui={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:Te};var Wi=e=>typeof e=="bigint"||Number.isInteger(e),ac=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function Jf(e,t,n){let{value:r}=e;return Wi(r)&&r>=0?n+r.toString(t):Te(e)}var Bi={identify:e=>Wi(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(e,t,n)=>ac(e,2,8,n),stringify:e=>Jf(e,8,"0o")},Vi={identify:Wi,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>ac(e,0,10,n),stringify:Te},Ki={identify:e=>Wi(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>ac(e,2,16,n),stringify:e=>Jf(e,16,"0x")};var Xf=[tt,nt,Qt,En,os,Bi,Vi,Ki,ji,qi,Ui];function Qf(e){return typeof e=="bigint"||Number.isInteger(e)}var Gi=({value:e})=>JSON.stringify(e),TS=[{identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify:Gi},{identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:Gi},{identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:e=>e==="true",stringify:Gi},{identify:Qf,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})=>Qf(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:Gi}],bS={default:!0,tag:"",test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}},Zf=[tt,nt].concat(TS,bS);var as={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),d=new Array(c);for(let u=0,p=0;u<c;++u,p+=l)d[u]=a.substr(p,l);a=d.join(t===O.BLOCK_LITERAL?`
134
+ `:" ")}return An({comment:e,type:t,value:a},r,s,i)}};function lc(e,t){if(Ze(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!q(r)){if(Qe(r)){r.items.length>1&&t("Each pair must have its own sequence indicator");let s=r.items[0]||new Q(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]=q(r)?r:new Q(r)}}else t("Expected a sequence for this tag");return e}function cc(e,t,n){let{replacer:r}=n,s=new ke(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(dr(a,l,n))}return s}var ls={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:lc,createNode:cc};var pr=class e extends ke{constructor(){super(),this.add=te.prototype.add.bind(this),this.delete=te.prototype.delete.bind(this),this.get=te.prototype.get.bind(this),this.has=te.prototype.has.bind(this),this.set=te.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(q(s)?(i=ae(s.key,"",n),o=ae(s.value,i,n)):i=ae(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=cc(t,n,r),i=new this;return i.items=s.items,i}};pr.tag="tag:yaml.org,2002:omap";var cs={collection:"seq",identify:e=>e instanceof Map,nodeClass:pr,default:!1,tag:"tag:yaml.org,2002:omap",resolve(e,t){let n=lc(e,t),r=[];for(let{key:s}of n.items)_(s)&&(r.includes(s.value)?t(`Ordered maps must not include duplicate keys: ${s.value}`):r.push(s.value));return Object.assign(new pr,n)},createNode:(e,t,n)=>pr.from(e,t,n)};function em({value:e,source:t},n){return t&&(e?uc:dc).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}var uc={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:em},dc={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:em};var tm={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:Te},nm={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():Te(e)}},rm={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:Te};var us=e=>typeof e=="bigint"||Number.isInteger(e);function Hi(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 pc(e,t,n){let{value:r}=e;if(us(r)){let s=r.toString(t);return r<0?"-"+n+s.substr(1):n+s}return Te(e)}var sm={identify:us,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>Hi(e,2,2,n),stringify:e=>pc(e,2,"0b")},im={identify:us,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>Hi(e,1,8,n),stringify:e=>pc(e,8,"0")},om={identify:us,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>Hi(e,0,10,n),stringify:Te},am={identify:us,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>Hi(e,2,16,n),stringify:e=>pc(e,16,"0x")};var fr=class e extends te{constructor(t){super(t),this.tag=e.tag}add(t){let n;q(t)?n=t:t&&typeof t=="object"&&"key"in t&&"value"in t&&t.value===null?n=new Q(t.key,null):n=new Q(t,null),Xt(this.items,n.key)||this.items.push(n)}get(t,n){let r=Xt(this.items,t);return!n&&q(r)?_(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=Xt(this.items,t);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new Q(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(dr(o,null,r));return i}};fr.tag="tag:yaml.org,2002:set";var ds={collection:"map",identify:e=>e instanceof Set,nodeClass:fr,default:!1,tag:"tag:yaml.org,2002:set",createNode:(e,t,n)=>fr.from(e,t,n),resolve(e,t){if(Qe(e)){if(e.hasAllNullValues(!0))return Object.assign(new fr,e);t("Set items must all have null values")}else t("Expected a mapping for this tag");return e}};function fc(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 lm(e){let{value:t}=e,n=o=>o;if(typeof t=="bigint")n=o=>BigInt(o);else if(isNaN(t)||!isFinite(t))return Te(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 Yi={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})=>fc(e,n),stringify:lm},zi={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=>fc(e,!1),stringify:lm},mr={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(mr.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),d=t[8];if(d&&d!=="Z"){let u=fc(d,!1);Math.abs(u)<30&&(u*=60),c-=6e4*u}return new Date(c)},stringify:({value:e})=>e?.toISOString().replace(/(T00:00:00)?\.000Z$/,"")??""};var mc=[tt,nt,Qt,En,uc,dc,sm,im,om,am,tm,nm,rm,as,et,cs,ls,ds,Yi,zi,mr];var cm=new Map([["core",Xf],["failsafe",[tt,nt,Qt]],["json",Zf],["yaml11",mc],["yaml-1.1",mc]]),um={binary:as,bool:os,float:Ui,floatExp:qi,floatNaN:ji,floatTime:zi,int:Vi,intHex:Ki,intOct:Bi,intTime:Yi,map:tt,merge:et,null:En,omap:cs,pairs:ls,seq:nt,set:ds,timestamp:mr},dm={"tag:yaml.org,2002:binary":as,"tag:yaml.org,2002:merge":et,"tag:yaml.org,2002:omap":cs,"tag:yaml.org,2002:pairs":ls,"tag:yaml.org,2002:set":ds,"tag:yaml.org,2002:timestamp":mr};function Ji(e,t,n){let r=cm.get(t);if(r&&!e)return n&&!r.includes(et)?r.concat(et):r.slice();let s=r;if(!s)if(Array.isArray(e))s=[];else{let i=Array.from(cm.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(et)),s.reduce((i,o)=>{let a=typeof o=="string"?um[o]:o;if(!a){let l=JSON.stringify(o),c=Object.keys(um).map(d=>JSON.stringify(d)).join(", ");throw new Error(`Unknown custom tag ${l}; use one of ${c}`)}return i.includes(a)||i.push(a),i},[])}var RS=(e,t)=>e.key<t.key?-1:e.key>t.key?1:0,ps=class e{constructor({compat:t,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(t)?Ji(t,"compat"):t?Ji(null,t):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?dm:{},this.tags=Ji(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,Xe,{value:tt}),Object.defineProperty(this,Ne,{value:Qt}),Object.defineProperty(this,Et,{value:nt}),this.sortMapEntries=typeof o=="function"?o:o===!0?RS:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function pm(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=Ni(e,t),{commentString:i}=s.options;if(e.commentBefore){n.length!==1&&n.unshift("");let l=i(e.commentBefore);n.unshift(Ye(l,""))}let o=!1,a=null;if(e.contents){if(U(e.contents)){if(e.contents.spaceBefore&&r&&n.push(""),e.contents.commentBefore){let d=i(e.contents.commentBefore);n.push(Ye(d,""))}s.forceBlockIndent=!!e.comment,a=e.contents.comment}let l=a?void 0:()=>o=!0,c=Dt(e.contents,s,()=>a=null,l);a&&(c+=mt(c,"",i(a))),(c[0]==="|"||c[0]===">")&&n[n.length-1]==="---"?n[n.length-1]=`--- ${c}`:n.push(c)}else n.push(Dt(e.contents,s));if(e.directives?.docEnd)if(e.comment){let l=i(e.comment);l.includes(`
137
+ `)?(n.push("..."),n.push(Ye(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(Ye(i(l),"")))}return n.join(`
138
+ `)+`
139
+ `}var Zt=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,Re,{value:Si});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 ft({version:o}),this.setSchema(o,r),this.contents=t===void 0?null:this.createNode(t,s,r)}clone(){let t=Object.create(e.prototype,{[Re]:{value:Si}});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=U(this.contents)?this.contents.clone(t.schema):this.contents,this.range&&(t.range=this.range.slice()),t}add(t){hr(this.contents)&&this.contents.add(t)}addIn(t,n){hr(this.contents)&&this.contents.addIn(t,n)}createAlias(t,n){if(!t.anchor){let r=Zl(this);t.anchor=!n||r.has(n)?ec(n||"a",r):n}return new Ot(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 y=R=>typeof R=="number"||R instanceof String||R instanceof Number,T=n.filter(y).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:d}=r??{},{onAnchor:u,setAnchors:p,sourceObjects:h}=Vf(this,o||"a"),f={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:u,onTagObj:c,replacer:s,schema:this.schema,sourceObjects:h},m=$t(t,d,f);return a&&B(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 Q(s,i)}delete(t){return hr(this.contents)?this.contents.delete(t):!1}deleteIn(t){return cr(t)?this.contents==null?!1:(this.contents=null,!0):hr(this.contents)?this.contents.deleteIn(t):!1}get(t,n){return B(this.contents)?this.contents.get(t,n):void 0}getIn(t,n){return cr(t)?!n&&_(this.contents)?this.contents.value:this.contents:B(this.contents)?this.contents.getIn(t,n):void 0}has(t){return B(this.contents)?this.contents.has(t):!1}hasIn(t){return cr(t)?this.contents!==void 0:B(this.contents)?this.contents.hasIn(t):!1}set(t,n){this.contents==null?this.contents=ns(this.schema,[t],n):hr(this.contents)&&this.contents.set(t,n)}setIn(t,n){cr(t)?this.contents=n:this.contents==null?this.contents=ns(this.schema,Array.from(t),n):hr(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 ft({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 ft({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 ps(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=ae(this.contents,n??"",a);if(typeof i=="function")for(let{count:c,res:d}of a.anchors.values())i(d,c);return typeof o=="function"?zt(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 pm(this,t)}};function hr(e){if(B(e))return!0;throw new Error("Expected a YAML collection as document contents")}var fs=class extends Error{constructor(t,n,r,s){super(),this.name=t,this.code=r,this.message=s,this.pos=n}},rt=class extends fs{constructor(t,n,r){super("YAMLParseError",t,n,r)}},ms=class extends fs{constructor(t,n,r){super("YAMLWarning",t,n,r)}},hc=(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 ht(e,{flow:t,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let l=!1,c=a,d=a,u="",p="",h=!1,f=!1,m=null,y=null,T=null,R=null,v=null,b=null,$=null;for(let C of e)switch(f&&(C.type!=="space"&&C.type!=="newline"&&C.type!=="comma"&&i(C.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),f=!1),m&&(c&&C.type!=="comment"&&C.type!=="newline"&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),m=null),C.type){case"space":!t&&(n!=="doc-start"||r?.type!=="flow-collection")&&C.source.includes(" ")&&(m=C),d=!0;break;case"comment":{d||i(C,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let w=C.source.substring(1)||" ";u?u+=p+w:u=w,p="",c=!1;break}case"newline":c?u?u+=C.source:(!b||n!=="seq-item-ind")&&(l=!0):p+=C.source,c=!0,h=!0,(y||T)&&(R=C),d=!0;break;case"anchor":y&&i(C,"MULTIPLE_ANCHORS","A node can have at most one anchor"),C.source.endsWith(":")&&i(C.offset+C.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),y=C,$??($=C.offset),c=!1,d=!1,f=!0;break;case"tag":{T&&i(C,"MULTIPLE_TAGS","A node can have at most one tag"),T=C,$??($=C.offset),c=!1,d=!1,f=!0;break}case n:(y||T)&&i(C,"BAD_PROP_ORDER",`Anchors and tags must be after the ${C.source} indicator`),b&&i(C,"UNEXPECTED_TOKEN",`Unexpected ${C.source} in ${t??"collection"}`),b=C,c=n==="seq-item-ind"||n==="explicit-key-ind",d=!1;break;case"comma":if(t){v&&i(C,"UNEXPECTED_TOKEN",`Unexpected , in ${t}`),v=C,c=!1,d=!1;break}default:i(C,"UNEXPECTED_TOKEN",`Unexpected ${C.type} token`),c=!1,d=!1}let D=e[e.length-1],x=D?D.offset+D.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:v,found:b,spaceBefore:l,comment:u,hasNewline:h,anchor:y,tag:T,newlineAfterProp:R,end:x,start:$??x}}function en(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(en(t.key)||en(t.value))return!0}return!1;default:return!0}}function hs(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&en(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function Xi(e,t,n){let{uniqueKeys:r}=e.options;if(r===!1)return!1;let s=typeof r=="function"?r:(i,o)=>i===o||_(i)&&_(o)&&i.value===o.value;return t.some(i=>s(i.key,n))}var fm="All mapping items must start at the same column";function mm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??te,a=new o(n.schema);n.atRoot&&(n.atRoot=!1);let l=r.offset,c=null;for(let d of r.items){let{start:u,key:p,sep:h,value:f}=d,m=ht(u,{indicator:"explicit-key-ind",next:p??h?.[0],offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0}),y=!m.found;if(y){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",fm)),!m.anchor&&!m.tag&&!h){c=m.end,m.comment&&(a.comment?a.comment+=`
146
+ `+m.comment:a.comment=m.comment);continue}(m.newlineAfterProp||en(p))&&s(p??u[u.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else m.found?.indent!==r.indent&&s(l,"BAD_INDENT",fm);n.atKey=!0;let T=m.end,R=p?e(n,p,m,s):t(n,T,u,null,m,s);n.schema.compat&&hs(r.indent,p,s),n.atKey=!1,Xi(n,a.items,R)&&s(T,"DUPLICATE_KEY","Map keys must be unique");let v=ht(h??[],{indicator:"map-value-ind",next:f,offset:R.range[2],onError:s,parentIndent:r.indent,startOnNewline:!p||p.type==="block-scalar"});if(l=v.end,v.found){y&&(f?.type==="block-map"&&!v.hasNewline&&s(l,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),n.options.strict&&m.start<v.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,v,s):t(n,l,h,null,v,s);n.schema.compat&&hs(r.indent,f,s),l=b.range[2];let $=new Q(R,b);n.options.keepSourceTokens&&($.srcToken=d),a.items.push($)}else{y&&s(R.range,"MISSING_CHAR","Implicit map keys need to be followed by map values"),v.comment&&(R.comment?R.comment+=`
147
+ `+v.comment:R.comment=v.comment);let b=new Q(R);n.options.keepSourceTokens&&(b.srcToken=d),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 hm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??ke,a=new o(n.schema);n.atRoot&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let l=r.offset,c=null;for(let{start:d,value:u}of r.items){let p=ht(d,{indicator:"seq-item-ind",next:u,offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0});if(!p.found)if(p.anchor||p.tag||u)u?.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=u?e(n,u,p,s):t(n,p.end,d,null,p,s);n.schema.compat&&hs(r.indent,u,s),l=h.range[2],a.items.push(h)}return a.range=[r.offset,l,c??l],a}function gt(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 d=l.substring(1)||" ";s?s+=o+d:s=d,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 gc="Block collections are not allowed within flow collections",yc=e=>e&&(e.type==="block-map"||e.type==="block-seq");function gm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",l=i?.nodeClass??(o?te:ke),c=new l(n.schema);c.flow=!0;let d=n.atRoot;d&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let u=r.offset+r.start.source.length;for(let y=0;y<r.items.length;++y){let T=r.items[y],{start:R,key:v,sep:b,value:$}=T,D=ht(R,{flow:a,indicator:"explicit-key-ind",next:v??b?.[0],offset:u,onError:s,parentIndent:r.indent,startOnNewline:!1});if(!D.found){if(!D.anchor&&!D.tag&&!b&&!$){y===0&&D.comma?s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`):y<r.items.length-1&&s(D.start,"UNEXPECTED_TOKEN",`Unexpected empty item in ${a}`),D.comment&&(c.comment?c.comment+=`
148
+ `+D.comment:c.comment=D.comment),u=D.end;continue}!o&&n.options.strict&&en(v)&&s(v,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line")}if(y===0)D.comma&&s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`);else if(D.comma||s(D.start,"MISSING_CHAR",`Missing , between ${a} items`),D.comment){let x="";e:for(let C of R)switch(C.type){case"comma":case"space":break;case"comment":x=C.source.substring(1);break e;default:break e}if(x){let C=c.items[c.items.length-1];q(C)&&(C=C.value??C.key),C.comment?C.comment+=`
149
+ `+x:C.comment=x,D.comment=D.comment.substring(x.length+1)}}if(!o&&!b&&!D.found){let x=$?e(n,$,D,s):t(n,D.end,b,null,D,s);c.items.push(x),u=x.range[2],yc($)&&s(x.range,"BLOCK_IN_FLOW",gc)}else{n.atKey=!0;let x=D.end,C=v?e(n,v,D,s):t(n,x,R,null,D,s);yc(v)&&s(C.range,"BLOCK_IN_FLOW",gc),n.atKey=!1;let w=ht(b??[],{flow:a,indicator:"map-value-ind",next:$,offset:C.range[2],onError:s,parentIndent:r.indent,startOnNewline:!1});if(w.found){if(!o&&!D.found&&n.options.strict){if(b)for(let Y of b){if(Y===w.found)break;if(Y.type==="newline"){s(Y,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}D.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 $&&("source"in $&&$.source?.[0]===":"?s($,"MISSING_CHAR",`Missing space after : in ${a}`):s(w.start,"MISSING_CHAR",`Missing , or : between ${a} items`));let ge=$?e(n,$,w,s):w.found?t(n,w.end,b,null,w,s):null;ge?yc($)&&s(ge.range,"BLOCK_IN_FLOW",gc):w.comment&&(C.comment?C.comment+=`
150
+ `+w.comment:C.comment=w.comment);let ye=new Q(C,ge);if(n.options.keepSourceTokens&&(ye.srcToken=T),o){let Y=c;Xi(n,Y.items,C)&&s(x,"DUPLICATE_KEY","Map keys must be unique"),Y.items.push(ye)}else{let Y=new te(n.schema);Y.flow=!0,Y.items.push(ye);let fn=(ge??C).range;Y.range=[C.range[0],fn[1],fn[2]],c.items.push(Y)}u=ge?ge.range[2]:w.end}}let p=o?"}":"]",[h,...f]=r.end,m=u;if(h?.source===p)m=h.offset+h.source.length;else{let y=a[0].toUpperCase()+a.substring(1),T=d?`${y} must end with a ${p}`:`${y} in block collection must be sufficiently indented and end with a ${p}`;s(u,d?"MISSING_CHAR":"BAD_INDENT",T),h&&h.source.length!==1&&f.unshift(h)}if(f.length>0){let y=gt(f,m,n.options.strict,s);y.comment&&(c.comment?c.comment+=`
151
+ `+y.comment:c.comment=y.comment),c.range=[r.offset,m,y.offset]}else c.range=[r.offset,m,m];return c}function wc(e,t,n,r,s,i){let o=n.type==="block-map"?mm(e,t,n,r,i):n.type==="block-seq"?hm(e,t,n,r,i):gm(e,t,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function ym(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===te.tagName&&a==="map"||o===ke.tagName&&a==="seq")return wc(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),wc(e,t,n,s,o)}let c=wc(e,t,n,s,o,l),d=l.resolve?.(c,p=>s(i,"TAG_RESOLVE_FAILED",p),t.options)??c,u=U(d)?d:new O(d);return u.range=c.range,u.tag=o,l?.format&&(u.format=l.format),u}function kc(e,t,n){let r=t.offset,s=SS(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?PS(t.source):[],a=o.length;for(let m=o.length-1;m>=0;--m){let y=o[m][1];if(y===""||y==="\r")a=m;else break}if(a===0){let m=s.chomp==="+"&&o.length>0?`
152
+ `.repeat(Math.max(1,o.length-1)):"",y=r+s.length;return t.source&&(y+=t.source.length),{value:m,type:i,comment:s.comment,range:[r,y,y]}}let l=t.indent+s.indent,c=t.offset+s.length,d=0;for(let m=0;m<a;++m){let[y,T]=o[m];if(T===""||T==="\r")s.indent===0&&y.length>l&&(l=y.length);else{y.length<l&&n(c+y.length,"MISSING_CHAR","Block scalars with more-indented leading empty lines must use an explicit indentation indicator"),s.indent===0&&(l=y.length),d=m,l===0&&!e.atRoot&&n(c,"BAD_INDENT","Block scalar values in collections must be indented");break}c+=y.length+T.length+1}for(let m=o.length-1;m>=a;--m)o[m][0].length>l&&(a=m+1);let u="",p="",h=!1;for(let m=0;m<d;++m)u+=o[m][0].slice(l)+`
153
+ `;for(let m=d;m<a;++m){let[y,T]=o[m];c+=y.length+T.length+1;let R=T[T.length-1]==="\r";if(R&&(T=T.slice(0,-1)),T&&y.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),y=""}i===O.BLOCK_LITERAL?(u+=p+y.slice(l)+T,p=`
154
+ `):y.length>l||T[0]===" "?(p===" "?p=`
155
+ `:!h&&p===`
156
+ `&&(p=`
157
+
158
+ `),u+=p+y.slice(l)+T,p=`
159
+ `,h=!0):T===""?p===`
160
+ `?u+=`
161
+ `:p=`
162
+ `:(u+=p+T,p=" ",h=!1)}switch(s.chomp){case"-":break;case"+":for(let m=a;m<o.length;++m)u+=`
163
+ `+o[m][0].slice(l);u[u.length-1]!==`
164
+ `&&(u+=`
165
+ `);break;default:u+=`
166
+ `}let f=r+s.length+t.source.length;return{value:u,type:i,comment:s.comment,range:[r,f,f]}}function SS({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,d="",u=s.length;for(let p=1;p<t.length;++p){let h=t[p];switch(h.type){case"space":c=!0;case"newline":u+=h.source.length;break;case"comment":n&&!c&&r(h,"MISSING_CHAR","Comments must be separated from other tokens by white space characters"),u+=h.source.length,d=h.source.substring(1);break;case"error":r(h,"UNEXPECTED_TOKEN",h.message),u+=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"&&(u+=m.length)}}}return{mode:i,indent:o,chomp:a,comment:d,length:u}}function PS(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 Tc(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=IS(i,c);break;case"single-quoted-scalar":a=O.QUOTE_SINGLE,l=vS(i,c);break;case"double-quoted-scalar":a=O.QUOTE_DOUBLE,l=CS(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 d=r+i.length,u=gt(o,d,t,n);return{value:l,type:a,comment:u.comment,range:[r,d,u.offset]}}function IS(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}`),wm(e)}function vS(e,t){return(e[e.length-1]!=="'"||e.length===1)&&t(e.length,"MISSING_CHAR","Missing closing 'quote"),wm(e.slice(1,-1)).replace(/''/g,"'")}function wm(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 CS(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}=AS(e,r);n+=i,r=o}else if(s==="\\"){let i=e[++r],o=ES[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+=OS(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 AS(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 ES={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 OS(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 bc(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?kc(e,t,r):Tc(t,e.options.strict,r),l=n?e.directives.tagName(n.source,u=>r(n,"TAG_RESOLVE_FAILED",u)):null,c;e.options.stringKeys&&e.atKey?c=e.schema[Ne]:l?c=$S(e.schema,s,l,n,r):t.type==="scalar"?c=DS(e,s,t,r):c=e.schema[Ne];let d;try{let u=c.resolve(s,p=>r(n??t,"TAG_RESOLVE_FAILED",p),e.options);d=_(u)?u:new O(u)}catch(u){let p=u instanceof Error?u.message:String(u);r(n??t,"TAG_RESOLVE_FAILED",p),d=new O(s)}return d.range=a,d.source=s,i&&(d.type=i),l&&(d.tag=l),c.format&&(d.format=c.format),o&&(d.comment=o),d}function $S(e,t,n,r,s){if(n==="!")return e[Ne];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[Ne])}function DS({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[Ne];if(n.compat){let a=n.compat.find(l=>l.default&&l.test?.test(r))??n[Ne];if(o.tag!==a.tag){let l=t.tagString(o.tag),c=t.tagString(a.tag),d=`Value may be parsed as either ${l} or ${c}`;i(s,"TAG_RESOLVE_FAILED",d,!0)}}return o}function km(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 NS={composeNode:Rc,composeEmptyNode:Qi};function Rc(e,t,n,r){let s=e.atKey,{spaceBefore:i,comment:o,anchor:a,tag:l}=n,c,d=!0;switch(t.type){case"alias":c=_S(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=bc(e,t,l,r),a&&(c.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{c=ym(NS,e,t,n,r),a&&(c.anchor=a.source.substring(1))}catch(u){let p=u instanceof Error?u.message:String(u);r(t,"RESOURCE_EXHAUSTION",p)}break;default:{let u=t.type==="error"?t.message:`Unsupported token (type: ${t.type})`;r(t,"UNEXPECTED_TOKEN",u),d=!1}}return c??(c=Qi(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&&(!_(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&&d&&(c.srcToken=t),c}function Qi(e,t,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:l},c){let d={type:"scalar",offset:km(t,n,r),indent:-1,source:""},u=bc(e,d,a,c);return o&&(u.anchor=o.source.substring(1),u.anchor===""&&c(o,"BAD_ALIAS","Anchor cannot be an empty string")),s&&(u.spaceBefore=!0),i&&(u.comment=i,u.range[2]=l),u}function _S({options:e},{offset:t,source:n,end:r},s){let i=new Ot(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=gt(r,o,e.strict,s);return i.range=[t,o,a.offset],a.comment&&(i.comment=a.comment),i}function Tm(e,t,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:t},e),l=new Zt(void 0,a),c={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},d=ht(r,{indicator:"doc-start",next:s??i?.[0],offset:n,onError:o,parentIndent:0,startOnNewline:!0});d.found&&(l.directives.docStart=!0,s&&(s.type==="block-map"||s.type==="block-seq")&&!d.hasNewline&&o(d.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),l.contents=s?Rc(c,s,d,o):Qi(c,d.end,r,null,d,o);let u=l.contents.range[2],p=gt(i,u,!1,o);return p.comment&&(l.comment=p.comment),l.range=[n,u,p.offset],l}function gs(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 bm(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 ys=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=gs(n);i?this.warnings.push(new ms(o,r,s)):this.errors.push(new rt(o,r,s))},this.directives=new ft({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=bm(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(B(i)&&!i.flow&&i.items.length>0){let o=i.items[0];q(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:bm(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=gs(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=Tm(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 rt(gs(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 rt(gs(t),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=gt(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 rt(gs(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 Zt(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 Sc=Symbol("break visit"),xS=Symbol("skip children"),Rm=Symbol("remove item");function On(e,t){"type"in e&&e.type==="document"&&(e={start:e.start,value:e.value}),Sm(Object.freeze([]),e,t)}On.BREAK=Sc;On.SKIP=xS;On.REMOVE=Rm;On.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};On.parentCollection=(e,t)=>{let n=On.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 Sm(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=Sm(Object.freeze(e.concat([[s,o]])),i.items[o],n);if(typeof a=="number")o=a-1;else{if(a===Sc)return Sc;a===Rm&&(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 Pc="\uFEFF",Ic="",vc="",Zi="";function Pm(e){switch(e){case Pc:return"byte-order-mark";case Ic:return"doc-mode";case vc:return"flow-error-end";case Zi: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 st(e){switch(e){case void 0:case" ":case`
191
+ `:case"\r":case" ":return!0;default:return!1}}var Im=new Set("0123456789ABCDEFabcdef"),LS=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),eo=new Set(",[]{}"),MS=new Set(` ,[]{}
192
+ \r `),Cc=e=>!e||MS.has(e),ws=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==="...")&&st(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]===Pc&&(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 Ic,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==="...")&&st(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&&!st(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===":")&&st(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(Cc),"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("..."))&&st(s[3]))&&!(r===this.indentNext-1&&this.flowLevel===1&&(s[0]==="]"||s[0]==="}")))return this.flowLevel=0,yield vc,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(Cc),"flow";case'"':case"'":return this.flowKey=!0,yield*this.parseQuotedScalar();case":":{let o=this.charAt(1);if(this.flowKey||st(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=>st(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 Zi,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(st(i)||t&&eo.has(i))break;n=r}else if(st(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&&eo.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&&eo.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield Zi,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(Cc),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(st(r)||n&&eo.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(;!st(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(LS.has(n))n=this.buffer[++t];else if(n==="%"&&Im.has(this.buffer[t+1])&&Im.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 ks=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 tn(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function vm(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 Am(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 to(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 gr(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 no(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 Cm(e){if(e.start.type==="flow-seq-start")for(let t of e.items)t.sep&&!t.value&&!tn(t.start,"explicit-key-ind")&&!tn(t.sep,"map-value-ind")&&(t.key&&(t.value=t.key),delete t.key,Am(t.value)?t.value.end?no(t.value.end,t.sep):t.value.end=t.sep:no(t.start,t.sep),delete t.sep)}var Ts=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 ws,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=Pm(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"&&Cm(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&&vm(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":{vm(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=to(this.peek(2)),r=gr(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)){no(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(tn(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(Am(n.key)&&!tn(n.sep,"newline")){let o=gr(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(tn(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=gr(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]}):tn(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&&!tn(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)){no(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||tn(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=to(r),i=gr(s);Cm(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=to(t),r=gr(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=to(t),r=gr(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 jS(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new ks||null,prettyErrors:t}}function Ac(e,t={}){let{lineCounter:n,prettyErrors:r}=jS(t),s=new Ts(n?.addNewLine),i=new ys(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 rt(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(hc(e,n)),o.warnings.forEach(hc(e,n))),o}var bs=1024*1024;function Ec(e,t){Buffer.byteLength(e)>bs&&ro(t,[`Definition exceeds ${bs} bytes.`]);let n=Ac(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];He(n,(i,o)=>{_e(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&&ro(t,s),n.contents===null&&ro(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){ro(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function ro(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}import{createHash as US}from"node:crypto";var yr=/^[a-z][a-z0-9_-]{0,63}$/,Em=/\$\{\{\s*([^{}]+?)\s*\}\}/g,Om=32,$m=128,WS=16,BS=32,VS=10080*60*1e3,wr=32*1024,Dm=16;function Dc(e,t){let n=[],r=xe(e,"$",n);it(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=tP(r.name,"$.name",n),i=GS(r.limits,n),o=HS(r.inputs,n),a=YS(r.steps,n);a.length>$m&&n.push(`$.steps may contain at most ${$m} steps.`),a.filter(u=>u.kind==="agent"&&u.createChild).length>i.maxTasks&&n.push("$.steps creates more child tasks than limits.max_tasks allows.");let l=new Set(a.map(u=>u.id));for(let u of a)for(let p of u.needs)l.has(p)||n.push(`$.steps.${u.id}.needs references missing step "${p}".`),p===u.id&&n.push(`$.steps.${u.id}.needs cannot reference itself.`);let c=XS(a,n);c&&QS(a,o,c.ancestors,n),n.length>0&&sP(t,n);let d={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:d,hash:US("sha256").update($c(d)).digest("hex"),order:c.order,waves:KS(c.waves,i.maxConcurrency)}}function KS(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 GS(e,t){let n=xe(e,"$.limits",t);it(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=Nm(n.max_concurrency,"$.limits.max_concurrency",1,WS,t),s=Nm(n.max_tasks,"$.limits.max_tasks",1,BS,t),i=Fm(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function HS(e,t){if(e===void 0)return{};let n=xe(e,"$.inputs",t),r=Object.entries(n);r.length>Om&&t.push(`$.inputs may contain at most ${Om} inputs.`);let s={};for(let[i,o]of r){yr.test(i)||t.push(`$.inputs key "${i}" must match ${yr}.`);let a=xe(o,`$.inputs.${i}`,t);it(a,["type","required","default"],`$.inputs.${i}`,t);let l=rP(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:nP(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&&!_m(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&_m(a.default,l)?{defaultValue:a.default}:{}}}return s}function YS(e,t){let n=xe(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{yr.test(s)||t.push(`$.steps key "${s}" must match ${yr}.`);let o=xe(i,`$.steps.${s}`,t),a=xm(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?JS(s,o,a,t):zS(s,o,a,t)})}function zS(e,t,n,r){it(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?nn(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let u=xe(t.create_child,`$.steps.${e}.create_child`,r);it(u,["repo"],`$.steps.${e}.create_child`,r),a={repo:nn(u.repo,`$.steps.${e}.create_child.repo`,r)}}let l;if(t.agent!==void 0){let u=xe(t.agent,`$.steps.${e}.agent`,r);if(it(u,["runner"],`$.steps.${e}.agent`,r),u.runner!==void 0)try{l=k.runners.parse(nn(u.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=nn(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>wr&&r.push(`$.steps.${e}.prompt exceeds ${wr} bytes.`);let d;if(t.output!==void 0){let u=xe(t.output,`$.steps.${e}.output`,r);it(u,["schema"],`$.steps.${e}.output`,r),d=Oc(u.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}:{},...d?{outputSchema:d}:{}}}function JS(e,t,n,r){it(t,["needs","human_review"],`$.steps.${e}`,r);let s=xe(t.human_review,`$.steps.${e}.human_review`,r);it(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=xe(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);it(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=nn(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:nn(s.title,`$.steps.${e}.human_review.title`,r),summary:nn(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:Fm(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function Oc(e,t,n,r){if(r>Dm)return n.push(`${t} exceeds the maximum schema depth of ${Dm}.`),{};let s=xe(e,t,n);it(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&&xm(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=xe(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))Oc(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&Oc(s.items,`${t}.items`,n,r+1),s}function XS(e,t){let n=new Set(e.map(u=>u.id));if(e.some(u=>u.needs.some(p=>!n.has(p))))return null;let r=new Map(e.map((u,p)=>[u.id,p])),s=new Map(e.map(u=>[u.id,u.needs.length])),i=new Map;for(let u of e)for(let p of u.needs)i.set(p,[...i.get(p)??[],u.id]);let o=e.filter(u=>u.needs.length===0).map(u=>u.id),a=[],l=[];for(;o.length>0;){o.sort((h,f)=>r.get(h)-r.get(f));let u=o;l.push(u),a.push(...u);let p=[];for(let h of u)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(u=>[u.id,u])),d=new Map;for(let u of a){let p=new Set;for(let h of c.get(u).needs){p.add(h);for(let f of d.get(h)??[])p.add(f)}d.set(u,p)}return{order:a,waves:l,ancestors:d}}function QS(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(Em)],c=a.replace(Em,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let d of l)ZS(d[1].trim(),i,t,n,s,r)}}}function ZS(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&&eP(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function eP(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(!so(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(!so(a))return;i=a}}function $c(e){return Array.isArray(e)?`[${e.map($c).join(",")}]`:so(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${$c(e[t])}`).join(",")}}`:JSON.stringify(e)}function xe(e,t,n){return so(e)?e:(n.push(`${t} must be an object.`),{})}function it(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 tP(e,t,n){let r=nn(e,t,n);return yr.test(r)||n.push(`${t} must match ${yr}.`),r}function nn(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function xm(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 Nm(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 nP(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function rP(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function _m(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function Fm(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>VS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function sP(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var so=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as iP,stat as oP}from"node:fs/promises";var aP=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function Nc(e){let t=await Lm(e);return{kind:"validateFury",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 _c(e,t){let n=await Lm(e),r=lP(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:kr(l.title,r,`$.steps.${a}.human_review.title`),summary:kr(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?kr(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:kr(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",repo:kr(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)},runner:l.runner??null,prompt:dP(l.prompt,r,a),outputSchema:l.outputSchema??null,review:null}});return{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}}async function Lm(e){let t;try{let n=await oP(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>bs)throw new Error(`Definition exceeds ${bs} bytes.`);t=await iP(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return Dc(Ec(t,e),e)}function lP(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]=cP(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 g("FURY_INPUT_INVALID","Fury inputs are invalid.",{details:{issues:n}});return r}function cP(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 uP(e,t){return e.replace(aP,(n,r)=>{if(!Object.hasOwn(t,r))throw new g("FURY_INPUT_INVALID",`Input "${r}" is required by a template but has no value.`,{details:{input:r}});return String(t[r])})}function kr(e,t,n){let r=uP(e,t);if(r.trim().length===0)throw new g("FURY_INPUT_INVALID",`Resolved ${n} must be a non-empty string.`,{details:{location:n}});return r}function dP(e,t,n){let r=`$.steps.${n}.prompt`,s=kr(e,t,r);if(Buffer.byteLength(s)>wr)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${wr} bytes.`,{details:{location:r,maxBytes:wr}});return s}import{createHash as Mm}from"node:crypto";import pP from"node:path";import{mkdir as fP}from"node:fs/promises";var xc={type:"system",component:"heartbeat"};async function rn(e,t={}){await fP(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([S.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):At.listAgents(e),wf(e),TP(e)]),o=r??ut(n.tasks.filter(f=>f.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=kP(i),l=a!==i,c=[],d=Fc(s.filter(wP),f=>f.taskId),u=Fc(s.filter(f=>f.type.startsWith("task.pr.")),f=>f.taskId),p=Fc(s.filter(f=>f.type==="agent.state.changed"),f=>f.agentTabId);for(let f of n.tasks){let m=mP(f),y=d.get(f.id),T=Mc(y?.data)??a.tasks[f.id]??null,R=y?.id??a.tasks[f.id]?.eventId??null;if(T?.signature!==m.signature){let x=T?f.status==="closed"&&T?.status!=="closed"?"task.closed":"task.updated":"task.created",C=await De(e,{id:Lc(x,f.id,m.signature),type:x,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:xc,data:{...m,changedFields:T?gP(T,m):[]}});c.push(C),R=C.id}a.tasks[f.id]={...m,eventId:R};let v=yP(f.prs),b=u.get(f.id),$=Mc(b?.data)??a.pullRequests[f.id]??null,D=b?.id??a.pullRequests[f.id]?.eventId??null;if(($||v.associations.length>0)&&$?.signature!==v.signature){let x=Array.isArray($?.associations)?$.associations.length:0,C=v.associations.length>x?"task.pr.linked":v.associations.length<x?"task.pr.unlinked":"task.pr.refreshed",w=await De(e,{id:Lc(C,f.id,v.signature),type:C,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:xc,data:v});c.push(w),D=w.id}a.pullRequests[f.id]={...v,eventId:D}}let h=new Map(o.tasks.map(f=>[f.taskId,f.state]));for(let f of o.agents){let m=p.get(f.tabId),y=Mc(m?.data)??a.agents[f.tabId]??null;if(y?.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 De(e,{id:Lc("agent.state.changed",f.tabId,T),type:"agent.state.changed",taskId:f.taskId,agentTabId:f.tabId,actor:xc,data:{previousState:typeof y?.state=="string"?y.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 M(qm(e),a),c}function mP(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:jm(t)}}var hP=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function gP(e,t){return hP.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function yP(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:jm(t)}}function Fc(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var wP=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",jm=e=>Mm("sha256").update(JSON.stringify(e)).digest("hex"),Lc=(...e)=>Mm("sha256").update(e.join("\0")).digest("hex"),Mc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,qm=e=>pP.join(e.orchestrationDir,"event-reconciliation.json");function kP(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 TP(e){try{return await Ls(qm(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function bP(e,t){return await jc(e),await rn(e),In(e,t)}async function RP(e,t,n){await jc(e);let r=await At.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await rn(e,{agentObserver:r});let a=await In(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 Um(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function SP(e,t,n){await jc(e);let r=await S.getTask(e,t);if(n.tabId&&!r.ptyTabs.some(i=>i.kind==="agent"&&i.id===n.tabId))throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${t}.`,{details:{taskId:t,tabId:n.tabId}});let s=await At.openObserver(e);try{await rn(e,{agentObserver:s});let o=(await In(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=ut([r],s.getSnapshots(),l),d=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:t,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw IP(t);let u=a-Date.now();if(u<=0)throw PP(t,n.states,n.timeoutMs);await rn(e,{agentObserver:s}),o=(await In(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await Um(Math.min(250,u),n.signal)}}finally{s.close()}}async function jc(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 Um(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 PP=(e,t,n)=>new g("OPERATION_TIMEOUT",`Timed out after ${n}ms waiting for task ${e} agent state ${t.join(",")}.`,{retryable:!0,details:{taskId:e,states:t,timeoutMs:n}}),IP=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),io={list:bP,watch:RP,waitForTaskState:SP,reconcile:rn};import{readFile as AP}from"node:fs/promises";import{createConnection as vP}from"node:net";async function Nt(e){let t=await Wm(Ct(e).socketPath).catch(()=>null);if(!t)return!1;try{return(await oo(t,{type:"ping"})).protocolVersion!==Pn?!1:(await oo(t,{type:"wakeOrchestration"}),!0)}catch{return!1}finally{t.end()}}async function qc(e,t){if(t.length===0)return!0;let n=await Wm(Ct(e).socketPath).catch(()=>null);if(!n)return!1;try{if((await oo(n,{type:"ping"})).protocolVersion!==Pn)return!1;for(let s of t)await oo(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}var CP=1;function oo(e,t){let n=CP++;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 d=i.indexOf(`
214
+ `);if(d===-1)return;l();let u=JSON.parse(i.slice(0,d));u.ok?r(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:n})}
215
+ `)})}function Wm(e){return new Promise((t,n)=>{let r=vP(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function EP(e,t){await xP(e);let n=await S.getTask(e,t.taskId);if(n.status==="closed")throw new g("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 g("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 _P(t.prompt,t.readStdin),o;try{o=await de.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 Nt(e),a}return await Nt(e),o}async function OP(e,t){return de.show(e,t)}async function $P(e,t){return de.list(e,t)}async function DP(e,t){let n;try{n=await de.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await Nt(e),r}return await Nt(e),n}async function NP(e,t,n){return de.wait(e,t,n)}async function _P(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await AP(e.path,"utf8")}}catch(n){throw new g("CLI_USAGE",`Unable to read prompt file ${e.path}.`,{details:{promptFile:e.path},cause:n})}if(!t)throw new g("INPUT_REQUIRED","Prompt input from stdin is unavailable.",{});return{source:"stdin",text:await t()}}async function xP(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 Tr={send:EP,show:OP,list:$P,cancel:DP,wait:NP};async function ao(e,t,n){let r=(await S.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 Xl(e,t,n);return await qc(e,o),a}catch(a){throw a instanceof g&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await qc(e,o),a}}import{randomUUID as Km}from"node:crypto";import{readFile as FP,realpath as Bm}from"node:fs/promises";import Uc from"node:path";var ne={type:"system",component:"orchestration-supervisor"},LP=/\$\{\{\s*steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)\s*\}\}/g;async function MP(e,t,n,r,s,i){await Nn(e);let o=await QP(e,t);if(await S.getTask(e,r),s.type==="agent"){if(!i||s.taskId!==r)throw new g("CAPABILITY_DENIED","An agent may only plan Fury work rooted at its own task.",{});await Ge(e,i,"fury.plan",r)}let a=await _c(t,n);ZP(a.steps,r);let l=new Date().toISOString(),c={schemaVersion:1,definitionHash:a.definitionHash,name:a.name,sourceFile:o,rootTaskId:r,inputs:a.inputs,limits:a.limits,order:a.order,waves:a.waves,steps:a.steps},d={...c,id:`fury_plan_${Km()}`,planHash:Pl(c),createdBy:s,createdAt:l};await Qp(e,a.definitionHash,await FP(t,"utf8"));let u=await Zp(e,d);try{await De(e,{id:`${u.id}:fury.plan.created`,taskId:r,type:"fury.plan.created",occurredAt:u.createdAt,actor:u.createdBy,data:{planId:u.id,planHash:u.planHash,name:u.name}})}catch(p){throw new g("PARTIAL_RESULT",`Fury plan ${u.id} was persisted, but its audit event could not be recorded.`,{details:{planId:u.id,planHash:u.planHash,persisted:!0},cause:p})}return{kind:"planFury",plan:u}}async function jP(e,t,n){if(await Nn(e),n.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can approve a Fury plan.",{});let r=await ci(e,t),s={schemaVersion:1,planId:r.id,planHash:r.planHash,approvedBy:n,approvedAt:new Date().toISOString()},i=await nf(e,s);try{await De(e,{id:`${r.id}:fury.plan.approved`,taskId:r.rootTaskId,type:"fury.plan.approved",occurredAt:i.approval.approvedAt,actor:i.approval.approvedBy,data:{planId:r.id,planHash:r.planHash}})}catch(o){throw new g("PARTIAL_RESULT",`Fury plan ${r.id} was approved, but its audit event could not be recorded.`,{details:{planId:r.id,planHash:r.planHash,persisted:!0,approved:!0},cause:o})}return{kind:"approveFury",plan:r,approval:i.approval,created:i.created}}async function qP(e,t,n,r){await Nn(e);let s=await ci(e,t);if((await rf(e,t)).planHash!==s.planHash)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} changed after approval.`,{});if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury run requires an agent capability.",{});await Ge(e,r,"fury.run",s.rootTaskId)}await Je(e,await S.getTask(e,s.rootTaskId));let o=new Date,l={schemaVersion:1,id:`fury_${Km()}`,planId:s.id,planHash:s.planHash,definitionHash:s.definitionHash,name:s.name,sourceFile:s.sourceFile,rootTaskId:s.rootTaskId,state:"pending",inputs:s.inputs,limits:s.limits,order:s.order,stepRuns:Object.fromEntries(s.steps.map(d=>[d.id,{id:d.id,kind:d.kind,needs:d.needs,state:"pending",plan:d,taskId:null,agentTabId:null,commandId:null,reviewId:null,output:null,error:null,startedAt:null,completedAt:null,deadlineAt:null,completedBy:null}])),actor:n,createdAt:o.toISOString(),updatedAt:o.toISOString(),stateChangedAt:o.toISOString(),deadlineAt:new Date(o.getTime()+s.limits.timeoutMs).toISOString(),completedAt:null},c=await sf(e,l);try{await le(e,c.run,null,"fury.run.created",c.run.actor,{state:"pending"})}catch(d){throw new g("PARTIAL_RESULT",`Fury run ${c.run.id} was persisted, but its audit event could not be recorded.`,{details:{runId:c.run.id,planId:c.run.planId,persisted:!0},cause:d})}return await Dn(e,c.run.id),await Nt(e),{kind:"runFury",run:await ue(e,c.run.id),created:c.created}}async function UP(e,t){return await Nn(e),await Dn(e,t),{kind:"showFury",run:await ue(e,t)}}async function co(e,t={}){let n=await k.load(e);if(k.previews.isEnabled(n,"agentOrchestration"))for(let r of await of(e))await Dn(e,r.id,t)}async function Dn(e,t,n={}){let r=await ue(e,t);if(await rI(e,r),yt(r))return;if(Date.now()>=Date.parse(r.deadlineAt)){r=await Ve(e,t,o=>nI(o));for(let o of Object.values(r.stepRuns))o.reviewId&&await Jr(e,o.reviewId,a=>({...a,state:"timed_out",version:a.version+1,updatedAt:new Date().toISOString()}));await le(e,r,null,"fury.run.timed_out",ne,{state:r.state});return}let s=new Map((await Ke(e)).map(o=>[o.id,o]));for(let o of r.order){let a=r.stepRuns[o];if(a.state==="running"&&!a.taskId){r=await Vm(e,r,a);continue}a.state==="running"&&a.commandId&&s.get(a.commandId)?.state==="failed"&&(r=await lo(e,r.id,a.id,s.get(a.commandId)?.lastError?.message??"Prompt delivery failed.",ne));let l=!a.commandId||s.get(a.commandId)?.state==="delivered";a.state==="running"&&a.agentTabId&&l&&n.isAgentAvailable&&a.startedAt&&Date.now()-Date.parse(a.startedAt)>2e3&&!n.isAgentAvailable(a.agentTabId)&&(r=await lo(e,r.id,a.id,`Agent session ${a.agentTabId} disappeared.`,ne)),a.state==="running"&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(r=await Ve(e,r.id,c=>sn(c,a.id,{state:"timed_out",error:"Step timed out.",completedAt:new Date().toISOString(),completedBy:ne})),await le(e,r,a.id,"fury.step.timed_out",ne,{})),(a.state==="waiting_for_review"||a.state==="changes_requested")&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(a.reviewId&&await Jr(e,a.reviewId,c=>({...c,state:"timed_out",version:c.version+1,updatedAt:new Date().toISOString()})),r=await Ve(e,r.id,c=>sn(c,a.id,{state:"timed_out",error:"Review timed out.",completedAt:new Date().toISOString(),completedBy:ne})),await le(e,r,a.id,"fury.review.timed_out",ne,{reviewId:a.reviewId}))}if(Object.values(r.stepRuns).some(o=>o.state==="failed"||o.state==="timed_out")){await uo(e,r.id,"failed",ne);return}let i=Object.values(r.stepRuns).filter(o=>o.state==="running").length;for(let o of r.order){if(i>=r.limits.maxConcurrency)break;let a=r.stepRuns[o];a.state!=="pending"||!a.needs.every(l=>r.stepRuns[l]?.state==="succeeded")||(a.kind==="human_review"?r=await WP(e,r,a):(r=await Vm(e,r,a),i+=1))}await tI(e,r.id)}async function Vm(e,t,n){let r=new Date;t=await Ve(e,t.id,o=>sn(o,n.id,{state:"running",startedAt:r.toISOString(),deadlineAt:o.deadlineAt})),await le(e,t,n.id,"fury.step.started",ne,{});let s=t.stepRuns[n.id];if(s.taskId)return t;let i=`${br(s.plan.prompt,t)}
216
+
217
+ ${eI(t.id,n.id,s.plan.outputSchema)}`;try{let o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await ts(e,{parentTaskId:t.rootTaskId,repoId:br(s.plan.target.repo,t),prompt:i,...s.plan.runner?{runner:s.plan.runner}:{},idempotencyKey:`fury:${t.id}:${n.id}`,fury:{runId:t.id,stepId:n.id}}),d=await S.getTask(e,c.taskId),u=d.ptyTabs.find(p=>p.kind==="agent");if(!u)throw new g("TASK_CONTEXT_CONFLICT",`Created task ${d.id} has no agent tab.`,{});o=d.id,a=u.id}else{o=br(s.plan.target.task,t);let c=await S.getTask(e,o),d=c.ptyTabs.find(p=>p.kind==="agent"&&(!s.plan.runner||(p.runner??c.runner)===s.plan.runner));if(!d)throw new g("TASK_CONTEXT_CONFLICT",s.plan.runner?`Task ${c.id} has no ${s.plan.runner} agent tab for fury step ${n.id}.`:`Task ${c.id} has no agent tab.`,{});await Je(e,c,ne,d.id),a=d.id,l=(await de.create(e,{taskId:o,agentTabId:a,prompt:{source:"inline",text:i},delivery:"when-ready",timeoutMs:Math.min(t.limits.timeoutMs,864e5),idempotencyKey:`fury:${t.id}:${n.id}`,actor:ne})).command.id}return t=await Ve(e,t.id,c=>sn(c,n.id,{taskId:o,agentTabId:a,commandId:l})),await le(e,t,n.id,"fury.step.dispatched",ne,{taskId:o,agentTabId:a,commandId:l}),t}catch(o){return lo(e,t.id,n.id,o instanceof Error?o.message:"Step dispatch failed.",ne)}}async function WP(e,t,n){let r=n.plan.review,s=new Date,i=`review_${t.id.slice(5)}_${n.id}`,o=r.feedbackTask?br(r.feedbackTask,t):null,a=o?Object.values(t.stepRuns).find(c=>c.taskId===o&&c.agentTabId):null,l={schemaVersion:1,id:i,runId:t.id,stepId:n.id,state:"waiting_for_review",title:br(r.title,t),summary:br(r.summary,t),feedbackTarget:o?{taskId:o,agentTabId:a?.agentTabId??null}:null,round:1,requestedAt:s.toISOString(),deadlineAt:new Date(Math.min(Date.parse(t.deadlineAt),s.getTime()+r.timeoutMs)).toISOString(),version:1,lastDecision:null,history:[],updatedAt:s.toISOString()};return await lf(e,l),t=await Ve(e,t.id,c=>sn(c,n.id,{state:"waiting_for_review",reviewId:i,startedAt:s.toISOString(),deadlineAt:l.deadlineAt})),await le(e,t,n.id,"fury.review.requested",ne,{reviewId:i,title:l.title}),t}async function BP(e,t,n,r,s,i){let o=await ue(e,t),a=Hm(o,n);await Gm(e,a,s,i,"fury.step.complete"),XP(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await Ve(e,t,c=>{if(yt(c)||c.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return sn(c,n,{state:"succeeded",output:r,completedAt:l,completedBy:s})}),await le(e,o,n,"fury.step.succeeded",s,{taskId:a.taskId}),await Dn(e,t),o=await ue(e,t),{kind:"completeFuryStep",run:o,step:o.stepRuns[n]}}async function VP(e,t,n,r,s,i){let o=await ue(e,t),a=Hm(o,n);await Gm(e,a,s,i,"fury.step.fail");let l=await lo(e,t,n,r,s);return await uo(e,t,"failed",s),{kind:"failFuryStep",run:await ue(e,t),step:l.stepRuns[n]}}async function KP(e,t,n,r){let s=await ue(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury cancellation requires an agent capability.",{});await Ge(e,r,"fury.cancel",s.rootTaskId)}if(yt(s))return{kind:"cancelFury",run:s,changed:!1};let i=new Date().toISOString(),o=!1,a=await Ve(e,t,c=>yt(c)?c:(o=!0,{...c,state:"cancelled",completedAt:i,updatedAt:i,stateChangedAt:i,stepRuns:Object.fromEntries(Object.entries(c.stepRuns).map(([d,u])=>[d,u.state==="succeeded"?u:{...u,state:"cancelled",completedAt:i,completedBy:n}]))}));if(!o)return{kind:"cancelFury",run:a,changed:!1};let l=await Ke(e);for(let c of Object.values(a.stepRuns)){let d=c.commandId?l.find(u=>u.id===c.commandId):null;d?.state==="queued"&&await de.cancel(e,d.id,n),c.taskId&&c.plan.target?.type==="create_child"&&await ao(e,c.taskId).catch(()=>{}),c.reviewId&&await Jr(e,c.reviewId,u=>({...u,state:"cancelled",version:u.version+1,updatedAt:i}))}return await le(e,a,null,"fury.run.cancelled",n,{}),{kind:"cancelFury",run:a,changed:o}}async function GP(e,t,n,r){let s=await ue(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury resume requires an agent capability.",{});await Ge(e,r,"fury.resume",s.rootTaskId)}if(yt(s))throw new g("FURY_STATE_CONFLICT",`Cannot resume ${s.id} while it is ${s.state}.`,{});return await Dn(e,t),await Nt(e),{kind:"resumeFury",run:await ue(e,t)}}async function HP(e,t,n){return await Nn(e),{kind:"listFuryReviews",reviews:(await ui(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function YP(e,t){return await Nn(e),{kind:"showFuryReview",review:await rr(e,t)}}async function zP(e,t,n,r,s,i){let o=await rr(e,t),a=await ue(e,o.runId);if(n!=="resubmit"&&s.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can decide a fury review.",{});if(n==="resubmit"&&s.type==="agent"){if(!o.feedbackTarget||s.taskId!==o.feedbackTarget.taskId||!i)throw new g("CAPABILITY_DENIED","Only the feedback-target agent can resubmit this review.",{});await Ge(e,i,"fury.review.resubmit",s.taskId)}if(!(n==="resubmit"?o.state==="changes_requested":o.state==="waiting_for_review"))throw new g("FURY_STATE_CONFLICT",`Review ${t} cannot ${n} while ${o.state}.`,{});if((n==="reject"||n==="request_changes")&&!r?.trim())throw new g("CLI_USAGE",`${n} requires a reason.`,{});if(n==="request_changes"&&!o.feedbackTarget)throw new g("FURY_STATE_CONFLICT",`Review ${t} has no feedback target.`,{});let c=null;if(n==="request_changes"){let h=await S.getTask(e,o.feedbackTarget.taskId),f=o.feedbackTarget.agentTabId?h.ptyTabs.find(y=>y.kind==="agent"&&y.id===o.feedbackTarget.agentTabId):h.ptyTabs.find(y=>y.kind==="agent");if(!f)throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${h.id} has no agent tab.`,{});c=(await de.create(e,{taskId:h.id,agentTabId:f.id,prompt:{source:"inline",text:`Fury review changes requested:
218
+
219
+ ${r}`},delivery:"when-ready",timeoutMs:Math.min(a.limits.timeoutMs,864e5),idempotencyKey:`fury-review:${t}:${o.round}`,actor:s})).command.id}let d=new Date().toISOString(),u={sequence:o.history.length+1,round:o.round,action:n,message:r,actor:s,feedbackCommandId:c,occurredAt:d},p=n==="approve"?"approved":n==="reject"?"rejected":n==="request_changes"?"changes_requested":"waiting_for_review";return o=await Jr(e,t,h=>{if(!(n==="resubmit"?h.state==="changes_requested":h.state==="waiting_for_review")||h.version!==o.version)throw new g("FURY_STATE_CONFLICT",`Review ${t} changed concurrently.`,{});return{...h,state:p,round:n==="resubmit"?h.round+1:h.round,version:h.version+1,lastDecision:u,history:[...h.history,u],updatedAt:d}}),a=await Ve(e,a.id,h=>{if(yt(h))throw new g("FURY_STATE_CONFLICT",`Run ${h.id} is ${h.state}.`,{});return sn(h,o.stepId,n==="approve"?{state:"succeeded",completedAt:d,completedBy:s}:n==="reject"?{state:"failed",error:r,completedAt:d,completedBy:s}:n==="request_changes"?{state:"changes_requested"}:{state:"waiting_for_review"})}),await le(e,a,o.stepId,`fury.review.${n}`,s,{reviewId:t,round:o.round,feedbackCommandId:c}),n==="reject"?await uo(e,a.id,"failed",s):await Dn(e,a.id),c&&await Nt(e),{kind:"actFuryReview",review:o,run:await ue(e,a.id)}}async function JP(e,t,n,r){await Nn(e),await ue(e,t);let s=n,i=0,o=0;for(;!r.signal?.aborted;){await Dn(e,t);let a=await In(e,{typeGlob:"fury.*",...s?{after:s}:{}});for(let l of a.events.filter(c=>c.furyRunId===t))r.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,yt(await ue(e,t)))return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!1};await sI(250,r.signal)}return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!0}}function br(e,t){return e.replace(LP,(n,r,s)=>{let i=t.stepRuns[r];if(!i||i.state!=="succeeded")throw new g("FURY_STATE_CONFLICT",`Step ${r} is not complete.`,{});if(s==="task_id")return i.taskId??"";let o=i.output;for(let a of s.split(".").slice(1))o=$n(o)?o[a]:void 0;if(o===void 0)throw new g("FURY_OUTPUT_INVALID",`Step ${r} has no output at ${s}.`,{});return typeof o=="string"?o:JSON.stringify(o)})}function XP(e,t){if(!t){if(e!=null)throw new g("FURY_OUTPUT_INVALID","This step does not declare output.",{});return}let n=[];if(Wc(e,t,"$",n),n.length)throw new g("FURY_OUTPUT_INVALID","Fury step output does not match its schema.",{details:{issues:n}})}function Wc(e,t,n,r){let s=t.type;if(!(s==="null"?e===null:s==="array"?Array.isArray(e):s==="object"?$n(e):s==="integer"?Number.isInteger(e):s==="number"?typeof e=="number"&&Number.isFinite(e):typeof e===s)){r.push(`${n} must be ${String(s)}.`);return}if(Array.isArray(t.enum)&&!t.enum.some(o=>JSON.stringify(o)===JSON.stringify(e))&&r.push(`${n} is not in enum.`),s==="object"&&$n(e)){let o=$n(t.properties)?t.properties:{};for(let a of Array.isArray(t.required)?t.required:[])typeof a=="string"&&!Object.hasOwn(e,a)&&r.push(`${n}.${a} is required.`);for(let[a,l]of Object.entries(e))$n(o[a])?Wc(l,o[a],`${n}.${a}`,r):t.additionalProperties===!1&&r.push(`${n}.${a} is not allowed.`)}s==="array"&&Array.isArray(e)&&$n(t.items)&&e.forEach((o,a)=>Wc(o,t.items,`${n}[${a}]`,r))}async function Gm(e,t,n,r,s){if(n.type!=="human"){if(n.type!=="agent"||!r||n.taskId!==t.taskId)throw new g("CAPABILITY_DENIED","The step actor does not own this fury step.",{});await Ge(e,r,s,n.taskId)}}function Hm(e,t){if(yt(e))throw new g("FURY_STATE_CONFLICT",`Run ${e.id} is ${e.state}.`,{});let n=e.stepRuns[t];if(!n)throw new g("FURY_STATE_CONFLICT",`Run ${e.id} has no step ${t}.`,{});if(n.kind!=="agent"||n.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${t} is ${n.state}.`,{});return n}async function QP(e,t){let[n,r]=await Promise.all([Bm(he(e).root),Bm(t)]),s=Uc.relative(n,r);if(!s||s.startsWith("..")||Uc.isAbsolute(s)||!/\.ya?ml$/i.test(s))throw new g("FURY_DEFINITION_INVALID","Fury plans must use a YAML definition stored under .craig/fury/.",{details:{file:t,furyRoot:he(e).root}});return Uc.join(".craig","fury",s)}function ZP(e,t){for(let n of e){let r=n.target?.type==="task"?n.target.task:n.review?.feedbackTask;if(r){if(r.includes("${{ steps.")){if(/^\$\{\{\s*steps\.[a-z][a-z0-9_-]{0,63}\.task_id\s*\}\}$/.test(r))continue;throw new g("FURY_DEFINITION_INVALID",`Fury step ${n.id} has an unsafe dynamic task target.`,{details:{stepId:n.id,target:r}})}if(r!==t)throw new g("FURY_DEFINITION_INVALID",`Fury step ${n.id} targets ${r} outside its planning task.`,{details:{stepId:n.id,targetTaskId:r,rootTaskId:t}})}}}function eI(e,t,n){return n?`When the work is complete, report it explicitly with: craig fury step complete --run ${e} --step ${t} --output '<json matching ${JSON.stringify(n)}>' --json
220
+ If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`:`When the work is complete, report it explicitly with: craig fury step complete --run ${e} --step ${t} --json
221
+ If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function lo(e,t,n,r,s){let i=new Date().toISOString(),o=!1,a=await Ve(e,t,l=>{if(l.stepRuns[n]?.state==="failed")return l;if(yt(l)||l.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,sn(l,n,{state:"failed",error:r,completedAt:i,completedBy:s})});return o&&await le(e,a,n,"fury.step.failed",s,{reason:r}),a}function sn(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function tI(e,t){let n=await ue(e,t),r=Object.values(n.stepRuns),s=r.every(i=>i.state==="succeeded")?"succeeded":r.some(i=>i.state==="failed"||i.state==="timed_out")?"failed":r.some(i=>i.state==="running")?"running":r.some(i=>i.state==="waiting_for_review"||i.state==="changes_requested")?"waiting_for_review":r.some(i=>i.state==="pending")?"running":n.state;await uo(e,t,s,ne)}async function uo(e,t,n,r){let s=await ue(e,t);if(s.state===n)return s;let i=["succeeded","failed","cancelled","timed_out"].includes(n),o=new Date().toISOString(),a=await Ve(e,t,l=>yt(l)?l:{...l,state:n,updatedAt:o,stateChangedAt:o,completedAt:i?o:null});return a.state!==n||await le(e,a,null,`fury.run.${n}`,r,{state:n}),a}function nI(e){let t=new Date().toISOString();return{...e,state:"timed_out",updatedAt:t,stateChangedAt:t,completedAt:t,stepRuns:Object.fromEntries(Object.entries(e.stepRuns).map(([n,r])=>[n,r.state==="succeeded"?r:{...r,state:"timed_out",completedAt:t,completedBy:ne}]))}}async function le(e,t,n,r,s,i){let o=$n(i)&&Number.isInteger(i.round)?`:round-${String(i.round)}`:"",a=n?t.stepRuns[n]:null,l=r==="fury.run.created"?t.createdAt:r.startsWith("fury.run.")?t.stateChangedAt:r==="fury.step.started"||r==="fury.review.requested"?a?.startedAt:r==="fury.step.dispatched"?`${a?.taskId??"task"}:${a?.commandId??"launch"}`:r.startsWith("fury.step.")?a?.completedAt:o||t.updatedAt;await De(e,{id:`${t.id}:${n??"run"}:${r}:${l??"unknown"}${o}`,furyRunId:t.id,furyStepId:n,taskId:n?t.stepRuns[n]?.taskId??t.rootTaskId:t.rootTaskId,type:r,occurredAt:typeof l=="string"&&Number.isFinite(Date.parse(l))?l:t.updatedAt,actor:s,data:i})}async function rI(e,t){await le(e,t,null,"fury.run.created",t.actor,{state:"pending"}),t.state!=="pending"&&await le(e,t,null,`fury.run.${t.state}`,ne,{state:t.state});for(let n of Object.values(t.stepRuns)){if(n.startedAt&&await le(e,t,n.id,"fury.step.started",ne,{}),n.taskId&&await le(e,t,n.id,"fury.step.dispatched",ne,{taskId:n.taskId,agentTabId:n.agentTabId,commandId:n.commandId}),["succeeded","failed","timed_out","cancelled"].includes(n.state)&&await le(e,t,n.id,`fury.step.${n.state}`,n.completedBy??ne,{reason:n.error}),!n.reviewId)continue;let r=await rr(e,n.reviewId);await le(e,t,n.id,"fury.review.requested",ne,{reviewId:r.id,title:r.title});for(let s of r.history)await le(e,t,n.id,`fury.review.${s.action}`,s.actor,{reviewId:r.id,round:s.round,feedbackCommandId:s.feedbackCommandId})}}async function Nn(e){if(!k.previews.isEnabled(await k.load(e),"agentOrchestration"))throw new g("CLI_USAGE","Fury execution is a feature preview. Enable agentOrchestration first.",{details:{preview:"agentOrchestration"}})}function yt(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function $n(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function sI(e,t){return new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var Fe={plan:MP,approve:jP,run:qP,show:UP,watch:JP,cancel:KP,resume:GP,completeStep:BP,failStep:VP,listReviews:HP,showReview:YP,actOnReview:zP,reconcile:co};async function zm(e,t){switch(e.kind){case"addWorkspace":{let n=await we.addWorkspace(t.paths,e.path),r=n.workspace.kind==="project"?n.workspace.discoveredRepoIds?.[0]??null:n.repos[0]?.id??null;return await Bc(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await we.repos.addRepo(t.paths,e.path);return await Bc(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return we.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await Un({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await Oe(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await we.repos.removeRepo(t.paths,e.repoId,{listTasks:S.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await jt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await jt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return we.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await we.archiveWorkspace(t.paths,e.workspaceId);return await aI(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await we.restoreWorkspace(t.paths,e.workspaceId);return await Bc(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return we.removeWorkspace(t.paths,e.workspaceId,{listTasks:S.listTasks});case"createTask":return zl(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 g("CLI_USAGE","Child delegation is a feature preview. Enable agentOrchestration before creating child tasks.",{details:{preview:"agentOrchestration"}});return _n(t),ts(t.paths,{parentTaskId:e.parentTaskId??an(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 _n(t),Jl(t.paths,e.taskId??an(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return _n(t),ao(t.paths,e.taskId??an(t).task.id,t.agentCapabilityId);case"validateFury":return await Ym(t),Nc(Vc.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await Ym(t),Fe.plan(t.paths,Vc.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??an(t).task.id,on(t),t.agentCapabilityId);case"approveFury":return Fe.approve(t.paths,e.planId,on(t));case"runFury":return _n(t),Fe.run(t.paths,e.planId,on(t),t.agentCapabilityId);case"showFury":return Fe.show(t.paths,e.runId);case"watchFury":return Fe.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return Fe.cancel(t.paths,e.runId,on(t),t.agentCapabilityId);case"resumeFury":return Fe.resume(t.paths,e.runId,on(t),t.agentCapabilityId);case"completeFuryStep":return _n(t),Fe.completeStep(t.paths,e.runId,e.stepId,await oI(e.output,t),on(t),t.agentCapabilityId);case"failFuryStep":return _n(t),Fe.failStep(t.paths,e.runId,e.stepId,e.reason,on(t),t.agentCapabilityId);case"listFuryReviews":return Fe.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return Fe.showReview(t.paths,e.reviewId);case"actFuryReview":return _n(t),Fe.actOnReview(t.paths,e.reviewId,e.action,e.message??null,on(t),t.agentCapabilityId);case"listTasks":return e.repoId||e.workspaceId?S.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):S.listTasks(t.paths);case"currentTask":{let n=an(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"attachTask":return S.attachTask(t.paths,e.taskId);case"addTaskLink":return S.addTaskLink(t.paths,e.taskId,e.repoId);case"listTaskLinks":return S.listTaskLinks(t.paths,e.taskId);case"refreshInteractiveState":throw new Error("Interactive refresh should be handled by the interactive app.");case"showTask":return S.showTask(t.paths,e.taskId);case"showCurrentTask":return S.showTask(t.paths,an(t).task.id);case"showTaskPr":return S.prs.show(t.paths,Fn(e.taskId,t),e.repoId);case"discoverTaskPr":return S.prs.discover(t.paths,Fn(e.taskId,t),e.repoId);case"linkTaskPr":return S.prs.link(t.paths,Fn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return S.prs.refreshAssociation(t.paths,Fn(e.taskId,t),e.repoId);case"unlinkTaskPr":return S.prs.unlink(t.paths,Fn(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return At.listAgents(t.paths,e.taskId);case"showAgentStatus":return At.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=Fn(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?io.waitForTaskState(t.paths,r,n):At.waitForTask(t.paths,r,n)}case"listEvents":return io.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return io.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 Tr.send(t.paths,{taskId:Fn(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 Tr.show(t.paths,e.commandId);case"listPromptCommands":return Tr.list(t.paths,e.taskId);case"cancelPromptCommand":return Tr.cancel(t.paths,e.commandId);case"waitPromptCommand":return Tr.wait(t.paths,e.commandId,{...e.states?{states:e.states}:{},timeoutMs:e.timeoutMs,...t.signal?{signal:t.signal}:{}});case"showSelectedTask":return S.showTask(t.paths,xn(t,"show"));case"streamTaskLogs":return S.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return S.prepareTaskLogs(t.paths,xn(t,"logs"));case"showTaskDiff":return S.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return S.showTaskDiff(t.paths,xn(t,"diff"));case"focusTask":return S.focusTask(t.paths,e.taskId);case"focusSelectedTask":return S.focusTask(t.paths,xn(t,"focus"));case"openTask":return S.openTask(t.paths,e.taskId);case"openSelectedTask":return S.openTask(t.paths,xn(t,"open"));case"runChecks":return S.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return S.runChecks(t.paths,xn(t,"check"));case"commitTask":return S.commitTask(t.paths,e.taskId);case"commitSelectedTask":return S.commitTask(t.paths,xn(t,"commit"));case"showContext":{let n=cI(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:Zo()};case"exit":return{kind:"exit"};default:return lI(e)}}function _n(e){if(!(!e.agentContext||e.agentCapabilityId))throw new g("CAPABILITY_DENIED","This agent session has no delegation capability. Restart the agent session to receive one.",{details:{reason:"agent capability is missing"}})}async function Ym(e){let t=await k.load(e.paths);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Fury planning is a feature preview. Enable agentOrchestration before validating or planning a fury.",{details:{preview:"agentOrchestration"}})}function on(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=an(e);if(!e.agentCapabilityId||!t.agentTabId)throw new g("CAPABILITY_DENIED","This agent session has no scoped capability.",{});return{type:"agent",taskId:t.task.id,agentTabId:t.agentTabId,capabilityId:e.agentCapabilityId.split(".",1)[0]}}async function oI(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await iI(Vc.resolve(t.cwd??process.cwd(),e.path),"utf8");else{if(!t.readStdin)throw new g("INPUT_REQUIRED","Fury output from stdin is unavailable.",{});n=await t.readStdin()}try{return JSON.parse(n)}catch(r){throw new g("FURY_OUTPUT_INVALID","Fury step output must be valid JSON.",{cause:r})}}async function Bc(e,t,n){let r=await Un({uiStateFile:e.uiStateFile})??js();await jt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function aI(e,t){let n=await Un({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await jt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function lI(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function xn(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 an(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Fn(e,t){return e??an(t).task.id}function cI(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Xm(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(`
86
222
  `);case"createRepo":return[`${e.created?"Registered":"Already registered"} repo ${e.repo.id}`,`Path: ${e.repo.rootPath}`,`Branch: ${e.repo.defaultBranch}`,`Workspace: ${e.workspaceId}`].join(`
87
223
  `);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(`
88
224
  `);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(`
@@ -90,54 +226,60 @@ fragment PrFields on PullRequest {
90
226
  `);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(`
91
227
  `);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(`
92
228
  `);case"cancelTaskTree":return[`Cancelled task tree ${e.taskId}`,...e.cancelled.map(t=>`${t.taskId}: ${t.disposition}`)].join(`
93
- `);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(`
94
- `);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} ${Pk(t)} ${Sk(t)} ${t.title}`)].join(`
95
- `);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}`,...Rk(e)].join(`
229
+ `);case"validateFury":return[`Valid fury ${e.name}`,`Definition: ${e.definitionHash}`,`Steps: ${e.stepCount}`,`Order: ${e.order.join(" -> ")}`].join(`
230
+ `);case"planFury":return[`Planned fury ${e.plan.name}`,`Plan: ${e.plan.id}`,`Root task: ${e.plan.rootTaskId}`,`Hash: ${e.plan.planHash}`,`Steps: ${e.plan.steps.length}`,...e.plan.waves.map((t,n)=>`Wave ${n}: ${t.join(", ")}`),`Approval required: craig fury approve ${e.plan.id} --json`].join(`
231
+ `);case"approveFury":return`${e.created?"Approved":"Already approved"} fury plan ${e.plan.id}: ${e.plan.planHash}`;case"runFury":return`${e.created?"Started":"Found"} fury ${e.run.id}: ${e.run.state}`;case"showFury":case"cancelFury":case"resumeFury":return uI(e.run);case"completeFuryStep":case"failFuryStep":return`${e.run.id} step ${e.step.id}: ${e.step.state}`;case"listFuryReviews":return e.reviews.length===0?"No fury reviews found.":["ID RUN STEP STATE ROUND TITLE",...e.reviews.map(t=>`${t.id} ${t.runId} ${t.stepId} ${t.state} ${t.round} ${t.title}`)].join(`
232
+ `);case"showFuryReview":return Jm(e.review);case"actFuryReview":return`${Jm(e.review)}
233
+ Run: ${e.run.state}`;case"watchFury":return"";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(`
234
+ `);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} ${gI(t)} ${yI(t)} ${t.title}`)].join(`
235
+ `);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}`,...mI(e)].join(`
96
236
  `);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(`
97
- `);case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return Tk(e);case"listAgents":case"showAgentStatus":return yk(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(lo).join(`
98
- `);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 kk(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(`
237
+ `);case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return fI(e);case"listAgents":case"showAgentStatus":return pI(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(Kc).join(`
238
+ `);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 dI(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(`
99
239
  `);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(`
100
240
  `);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(`
101
- `);default:return bk(e)}}function kk(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(`
102
- `)}function lo(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function yk(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(`
103
- `)}function Tk(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(`
104
- `)}function Rk(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 bk(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function Pk(e){return e.checks.status}function Sk(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 Zc(e,t){let{data:r,warnings:n}=vk(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:r,warnings:n})}function vk(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...r}=e;return{data:r,warnings:t}}return{data:e,warnings:[]}}function ed(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 co(e){let t=await Q.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 m("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 T.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 td(e){let t="cli",r=qa(e.argv);try{let n=Wa(e.argv);if(r=n.options.json,n.mode==="interactive"){if(n.options.noInput||n.options.json||$k(e.env)||!e.isInputTty||!e.isOutputTty)throw new m("INPUT_REQUIRED","Interactive Craig requires a TTY. Provide a command instead of starting the terminal application.",{});let u=await co({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 m("CLI_USAGE","Command mode requires a command.",{});if(t=n.commandName,n.command.kind==="watchEvents"&&n.options.json)throw new m("CLI_USAGE","events watch streams output; use --format jsonl instead of --json.",{});Ak(n.command,n.options.taskId);let s=xk(n.command,n.options.taskId),i=Ck(s);Ek(s,n.options.taskId,i);let o=i!=="none",a=await co({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:Ik(s),resolveTask:i!=="none",requireTask:i==="required"}),l=Dk(s,e.signal),c;try{c=await Xc(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):lo(u)}
105
- `)}:{},...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 d=r?Zc(t,c):Qc(c);return d.length>0&&e.writeStdout(`${d}
106
- `),0}catch(n){let s=as(n),i=r?ed(t,s):s.message;return e.writeStderr(`${i}
107
- `),s.exitCode}}function Ik(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function Ck(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"||Ok(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 Ak(e,t){let r=rd(e);if(!(r===void 0||t===void 0||t===r))throw new m("CLI_USAGE",`Task ${r} conflicts with --task ${t}. Provide only one task target.`,{details:{positionalTaskId:r,globalTaskId:t}})}function Ek(e,t,r){if(!(t===void 0||r!=="none"||rd(e)===t))throw new m("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 rd(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 xk(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 Dk(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 Ok(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function $k(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as mb}from"node:module";import{readFile as Nk,stat as Mk}from"node:fs/promises";import uo from"node:path";var Lk=200*1024,_k=500*1024,bn="100000";async function sd(e,t,r){if(e.type==="project"&&e.repoTargets?.length)return jk(e,t,r);try{let n=Ze(r.selectedFilePath??null,t.filePaths),s=Ze(r.selectedDiffPath??null,t.diffPaths),i=s?await br(e.worktreePath):null,[o,a]=await Promise.all([Sn(e.worktreePath,n),s?po(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 jk(e,t,r){let n=Ze(r.selectedFilePath??null,t.filePaths),s=Ze(r.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([od(e,n),(async()=>{if(!s)return ee("No diff selected","No local changes found.","empty");let l=Pn(e,s),c=l?await br(l.target.worktreePath).catch(()=>null):null;return ad(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:n,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function id(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return Fk(e,t);try{await X(e);let r=await br(e.worktreePath),[n,s]=await Promise.all([ld(e.worktreePath),cd(e.worktreePath,r)]),i=[...new Set(s.map(u=>u.path))],o=Ze(t.selectedFilePath??null,n),a=Ze(t.selectedDiffPath??null,i),[l,c]=await Promise.all([Sn(e.worktreePath,o),a?po(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:pd(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 Fk(e,t){let r=(e.repoTargets??[]).filter(g=>g.status==="ready"),n=await Promise.all(r.map(async g=>{let f=await br(g.worktreePath).catch(()=>null),[p,w]=await Promise.all([ld(g.worktreePath).catch(()=>[]),cd(g.worktreePath,f).catch(()=>[])]);return{target:g,baseRef:f,targetFiles:p,targetDiffRows:w}})),s=[],i=[];for(let{target:g,targetFiles:f,targetDiffRows:p}of n)s.push(...f.map(w=>`${g.repoId}/${w}`)),i.push(...p.map(w=>({...w,path:`${g.repoId}/${w.path}`})));let o=[...new Set(i.map(g=>g.path))].sort(),a=Ze(t.selectedFilePath??null,s),l=Ze(t.selectedDiffPath??null,o),[c,d]=await Promise.all([od(e,a),(async()=>{if(!l)return ee("No diff selected","No local changes found.","empty");let g=Pn(e,l),f=g?n.find(p=>p.target.repoId===g.target.repoId):null;return ad(e,l,i,f?.baseRef??null)})()]),u=l?{[l]:d}:{};return{taskId:e.id,fileRows:pd(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:u,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:d,error:null}}async function od(e,t){let r=Pn(e,t);if(!r)return ee("No file selected","No Git-visible files found.","empty");let n=await Sn(r.target.worktreePath,r.relativePath);return{...n,path:t,title:t??n.title}}async function ad(e,t,r,n=null){let s=Pn(e,t);return s?{...await po(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 Pn(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 ld(e){let t=await C("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return md(t.stdout)}async function cd(e,t){let[r,n,s,i]=await Promise.all([Wk(e,t),nd(e,"staged"),nd(e,"unstaged"),qk(e)]);return[...r,...n,...s,...i]}async function Wk(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=dd(r.stdout),i=ud(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 nd(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=dd(n.stdout),o=ud(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 qk(e){let t=await C("git",["ls-files","--others","--exclude-standard"],{cwd:e}),r=md(t.stdout);return await Promise.all(r.map(async s=>{let i=await Sn(e,s),o=i.status==="ready"?Uk(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function dd(e){return e.split(`
108
- `).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 ud(e){let t=new Map;for(let r of e.split(`
109
- `)){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 br(e){return(await N("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await N("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function Sn(e,t){if(!t)return ee("No file selected","No Git-visible files found.","empty");let r=Bk(e,t);try{let n=await Mk(r);if(n.size>Lk)return ee(t,`File is ${n.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,n.size);let s=await Nk(r);return Vk(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(`
110
- `),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 po(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 br(e);if(a){let l=await C("git",["diff","--stat","--patch",`--unified=${bn}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
111
- ${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await C("git",["diff","--cached","--stat","--patch",`--unified=${bn}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
112
- ${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await C("git",["diff","--stat","--patch",`--unified=${bn}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
113
- ${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await N("git",["diff","--no-index","--stat","--patch",`--unified=${bn}`,"--","/dev/null",t],{cwd:e});a.stdout.trim().length>0&&s.push(`untracked
241
+ `);default:return hI(e)}}function uI(e){return[`${e.id}: ${e.state}`,`Definition: ${e.name} (${e.definitionHash})`,`Root task: ${e.rootTaskId}`,...e.order.map(t=>{let n=e.stepRuns[t];return`${t}: ${n.state}${n.taskId?` (${n.taskId})`:""}${n.error?` - ${n.error}`:""}`})].join(`
242
+ `)}function Jm(e){return[`${e.id}: ${e.state}`,`Run: ${e.runId}`,`Step: ${e.stepId}`,`Round: ${e.round}`,`Title: ${e.title}`,`Summary: ${e.summary}`,`Deadline: ${e.deadlineAt}`].join(`
243
+ `)}function dI(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(`
244
+ `)}function Kc(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function pI(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(`
245
+ `)}function fI(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(`
246
+ `)}function mI(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 hI(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function gI(e){return e.checks.status}function yI(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 Qm(e,t){let{data:n,warnings:r}=wI(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:n,warnings:r})}function wI(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...n}=e;return{data:n,warnings:t}}return{data:e,warnings:[]}}function Zm(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 Gc(e){let t=await we.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=Ie(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 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=r&&t.initialized?await S.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 eh(e){let t="cli",n=bd(e.argv);try{let r=Td(e.argv);if(n=r.options.json,r.mode==="interactive"){if(r.options.noInput||r.options.json||vI(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.",{});if(r.options.workspaceRoot===void 0&&(e.env.CRAIG_TASK_ID!==void 0||e.env.CRAIG_AGENT_TAB_ID!==void 0))throw new g("TASK_CONTEXT_CONFLICT","Interactive Craig will not implicitly attach to a live workspace from an agent session. Pass --workspace-root <path> to confirm the live workspace, or pass a different directory for an isolated workspace.",{details:{workspaceRoot:e.env.CRAIG_WORKSPACE_ROOT??null,taskId:e.env.CRAIG_TASK_ID??null,agentTabId:e.env.CRAIG_AGENT_TAB_ID??null}});let u=await Gc({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(u.workspace.workspaceRoot)}if(!r.command||!r.commandName)throw new g("CLI_USAGE","Command mode requires a command.",{});if(t=r.commandName,(r.command.kind==="watchEvents"||r.command.kind==="watchFury")&&r.options.json)throw new g("CLI_USAGE","watch commands stream output; use --format jsonl instead of --json.",{});bI(r.command,r.options.taskId);let s=SI(r.command,r.options.taskId),i=TI(s);RI(s,r.options.taskId,i);let o=i!=="none",a=await Gc({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:kI(s),resolveTask:i!=="none",requireTask:i==="required"}),l=PI(s,e.signal),c;try{c=await zm(s,{paths:a.paths,cwd:e.cwd,workspaceContext:a.workspace,taskContext:a.task,...l.signal?{signal:l.signal}:{},...s.kind==="watchEvents"||s.kind==="watchFury"?{emitEvent:u=>e.writeStdout(`${s.format==="jsonl"?JSON.stringify(u):Kc(u)}
247
+ `)}:{},...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 d=n?Qm(t,c):Xm(c);return d.length>0&&e.writeStdout(`${d}
248
+ `),0}catch(r){let s=Jo(r),i=n?Zm(t,s):s.message;return e.writeStderr(`${i}
249
+ `),s.exitCode}}function kI(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function TI(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"||II(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==="planFury"?e.rootTaskId?"optional":"required":e.kind==="approveFury"||e.kind==="runFury"||e.kind==="cancelFury"||e.kind==="resumeFury"||e.kind==="completeFuryStep"||e.kind==="failFuryStep"||e.kind==="actFuryReview"?"optional":e.kind==="waitTask"?e.taskId?"none":"required":"none"}function bI(e,t){let n=th(e);if(!(n===void 0||t===void 0||t===n))throw new g("CLI_USAGE",`Task ${n} conflicts with --task ${t}. Provide only one task target.`,{details:{positionalTaskId:n,globalTaskId:t}})}function RI(e,t,n){if(!(t===void 0||n!=="none"||th(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 th(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 SI(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 PI(e,t){if(e.kind!=="waitTask"&&e.kind!=="watchEvents"&&e.kind!=="watchFury"&&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 II(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function vI(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as aE}from"node:module";import{readFile as CI,stat as AI}from"node:fs/promises";import Hc from"node:path";var EI=200*1024,OI=500*1024,po="100000";async function rh(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return $I(e,t,n);try{let r=ln(n.selectedFilePath??null,t.filePaths),s=ln(n.selectedDiffPath??null,t.diffPaths),i=s?await Rs(e.worktreePath):null,[o,a]=await Promise.all([mo(e.worktreePath,r),s?Yc(e.worktreePath,s,t.diffRows,i):Promise.resolve(Se("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 $I(e,t,n){let r=ln(n.selectedFilePath??null,t.filePaths),s=ln(n.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([ih(e,r),(async()=>{if(!s)return Se("No diff selected","No local changes found.","empty");let l=fo(e,s),c=l?await Rs(l.target.worktreePath).catch(()=>null):null;return oh(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function sh(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return DI(e,t);try{await me(e);let n=await Rs(e.worktreePath),[r,s]=await Promise.all([ah(e.worktreePath),lh(e.worktreePath,n)]),i=[...new Set(s.map(u=>u.path))],o=ln(t.selectedFilePath??null,r),a=ln(t.selectedDiffPath??null,i),[l,c]=await Promise.all([mo(e.worktreePath,o),a?Yc(e.worktreePath,a,s,n):Promise.resolve(Se("No diff selected","No local changes found.","empty"))]),d=a?{[a]:c}:{};return{taskId:e.id,fileRows:dh(r),filePaths:r,diffRows:s,diffPaths:i,diffContents:d,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:Se("Files unavailable",r,"error"),selectedDiff:Se("Diff unavailable",r,"error"),error:r}}}async function DI(e,t){let n=(e.repoTargets??[]).filter(p=>p.status==="ready"),r=await Promise.all(n.map(async p=>{let h=await Rs(p.worktreePath).catch(()=>null),[f,m]=await Promise.all([ah(p.worktreePath).catch(()=>[]),lh(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=ln(t.selectedFilePath??null,s),l=ln(t.selectedDiffPath??null,o),[c,d]=await Promise.all([ih(e,a),(async()=>{if(!l)return Se("No diff selected","No local changes found.","empty");let p=fo(e,l),h=p?r.find(f=>f.target.repoId===p.target.repoId):null;return oh(e,l,i,h?.baseRef??null)})()]),u=l?{[l]:d}:{};return{taskId:e.id,fileRows:dh(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:u,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:d,error:null}}async function ih(e,t){let n=fo(e,t);if(!n)return Se("No file selected","No Git-visible files found.","empty");let r=await mo(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function oh(e,t,n,r=null){let s=fo(e,t);return s?{...await Yc(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}:Se(t,"Repo target is unavailable.","error",t)}function fo(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 ah(e){let t=await F("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return ph(t.stdout)}async function lh(e,t){let[n,r,s,i]=await Promise.all([NI(e,t),nh(e,"staged"),nh(e,"unstaged"),_I(e)]);return[...n,...r,...s,...i]}async function NI(e,t){if(!t)return[];let[n,r]=await Promise.all([F("git",["diff","--name-status",`${t}...HEAD`],{cwd:e}),F("git",["diff","--numstat",`${t}...HEAD`],{cwd:e})]),s=ch(n.stdout),i=uh(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 nh(e,t){let n=t==="staged"?["diff","--cached"]:["diff"],[r,s]=await Promise.all([F("git",[...n,"--name-status"],{cwd:e}),F("git",[...n,"--numstat"],{cwd:e})]),i=ch(r.stdout),o=uh(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 _I(e){let t=await F("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=ph(t.stdout);return await Promise.all(n.map(async s=>{let i=await mo(e,s),o=i.status==="ready"?xI(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function ch(e){return e.split(`
250
+ `).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 uh(e){let t=new Map;for(let n of e.split(`
251
+ `)){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 Rs(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 mo(e,t){if(!t)return Se("No file selected","No Git-visible files found.","empty");let n=FI(e,t);try{let r=await AI(n);if(r.size>EI)return Se(t,`File is ${r.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,r.size);let s=await CI(n);return LI(s)?Se(t,"Binary file preview is not available in Craig.","binary",t,s.byteLength):{path:t,status:"ready",title:t,lines:s.toString("utf8").split(`
252
+ `),byteLength:s.byteLength}}catch(r){let s=r instanceof Error?r.message:"Unable to read file.";return Se(t,s,"missing",t,null)}}async function Yc(e,t,n,r=null){if(!t)return Se("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 Rs(e);if(a){let l=await F("git",["diff","--stat","--patch",`--unified=${po}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
253
+ ${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await F("git",["diff","--cached","--stat","--patch",`--unified=${po}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
254
+ ${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await F("git",["diff","--stat","--patch",`--unified=${po}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
255
+ ${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await G("git",["diff","--no-index","--stat","--patch",`--unified=${po}`,"--","/dev/null",t],{cwd:e});a.stdout.trim().length>0&&s.push(`untracked
114
256
  ${a.stdout.trimEnd()}`)}let o=s.join(`
115
257
 
116
- `);return o.length>_k?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(`
117
- `):["No diff for this file."],byteLength:o.length}}function pd(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 Ze(e,t){return e&&t.includes(e)?e:t[0]??null}function Uk(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function md(e){return[...new Set(e.split(`
118
- `).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,r)=>t.localeCompare(r))}function Bk(e,t){let r=uo.resolve(e,t),n=uo.resolve(e);if(r!==n&&!r.startsWith(`${n}${uo.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return r}function Vk(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 Kk=["tasks","center","inspector","actions"],fd=["agent","terminal"],gd=[],$="inspection",lO=[...fd,...gd],mo=["commit","push","refresh-checks","close-task"],hd=["refresh-checks","close-task"],wd=["task","checks","pr","setup-run","actions","next-action"],fo=["files","review"];function kd(e,t={}){let r=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,n=Xk(e?.openInspectionKind)??r,s=k.runners.getEnabled(t);return{inputMode:Zk(e?.inputMode),focusedRegion:Yk(e?.focusedRegion),selectedRepoId:Le(e?.selectedRepoId),selectedWorkspaceId:Le(e?.selectedWorkspaceId),selectedTaskId:Le(e?.selectedTaskId),selectedPtyTabId:Le(e?.selectedPtyTabId),selectedLeftItemId:iy(Le(e?.selectedTaskId)),activeTab:r?$:Le(e?.activeTab)??"agent",preferredPtyTabKind:Qk(e?.preferredPtyTabKind),inspectorSection:Pr(e?.inspectorSection,wd,"task"),inspectionMode:Jk(e?.inspectionMode,r==="diff"?"review":"files"),openInspectionKind:n,selectedFileTreePath:Le(e?.selectedFileTreePath),selectedFilePath:Le(e?.selectedFilePath),selectedDiffPath:Le(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:Pr(e?.selectedActionId,mo,"commit"),selectedProjectTargetId:null,selectedRunner:ey(e?.selectedRunner,s,k.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:Gk(),centerZoomed:!1}}function Gk(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function yd(e,t){return{...e??Fr(),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 vr(e,t,r={}){let n=sy(e,t),s=ho(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,...ty(c,e.activeTab,e.selectedPtyTabId),selectedFilePath:zk(e,t,c?.id??null),...ry(e,t,c?.id??null),selectedDiffPath:Hk(e,t,c?.id??null),inspectorSection:Pr(e.inspectorSection,wd,"task")}}function _e(e,t){return{...e,terminal:t}}function Td(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function Rd(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===`
119
- `}function bd(e){return e.length===1&&e>=" "&&e!=="\x7F"}function go(e){return Sd(e)||Kt(e)!==null}function Pd(e){return gd.includes(e)}function Sd(e){return fd.includes(e)}function vd(e,t){return[...e?.ptyTabs.map(r=>r.id)??[],...t?.openInspectionKind?[$]:[]]}function Hk(e,t,r){return!t.inspection||t.inspection.taskId!==r||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function zk(e,t,r){return!t.inspection||t.inspection.taskId!==r||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function Pr(e,t,r){return t.includes(e??"")?e:r}function Yk(e){return e==="tabs"?"center":Pr(e,Kk,"tasks")}function Jk(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":Pr(e,fo,t)}function Xk(e){return e==="file"||e==="diff"?e:null}function Qk(e){return e==="terminal"?"terminal":"agent"}function Zk(e){return e==="terminal"?"terminal":"control"}function ey(e,t=[...j],r="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:r}function vn(e,t=j){let r=t.length>0?t:j,n=r.indexOf(e);return r[(n+1)%r.length]??r[0]??"codex"}function Kt(e){let t=j.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function ty(e,t,r){if(!e)return{activeTab:t===$?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(Sd(t)){let l=e.ptyTabs.find(c=>c.kind===t)??null??s??n??e.ptyTabs[0]??null;return{activeTab:l?.id??$,selectedPtyTabId:l?.id??null}}if(t===$)return{activeTab:$,selectedPtyTabId:n?.id??s?.id??e.ptyTabs[0]?.id??null};let o=s??n??e.ptyTabs[0]??null;return{activeTab:o?.id??$,selectedPtyTabId:o?.id??null}}function ry(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?ny(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:n,collapsedFileTreePaths:s}}function ny(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 sy(e,t){let r=Tt(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 Tt(e){let t=[];if(e.workspaces?.length)for(let r of e.workspaces){t.push(`workspace:${r.id}`);for(let{task:n}of Sr(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{task:n}of Sr(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 Sr(e){let t=new Set(e.map(i=>i.id)),r=new Set,n=[],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))){n.push({task:i,visualDepth:0}),r.add(i.id);for(let a of s.get(i.id)??[])r.has(a.id)||(n.push({task:a,visualDepth:1}),r.add(a.id))}for(let i of e)r.has(i.id)||n.push({task:i,visualDepth:0});return n}function ho(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 Le(e){return typeof e=="string"?e:null}function iy(e){return e?`task:${e}`:null}function Ir(e){return typeof e=="string"&&e.startsWith("task:")}function In(e){return typeof e=="string"&&e.startsWith("new-task:")}function Cn(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function Id(e){return typeof e=="string"&&e.startsWith("workspace:")}function wo(e){return In(e)?e.slice(9):null}function ko(e){return Cn(e)?e.slice(19):null}async function Gt(e,t,r){let n=ne(e),[s,i]=await Promise.all([Q.repos.listRegisteredRepos(n),Q.listWorkspaces(n,{archived:!1})]),o=await T.listTasks(n),a={},l=await k.load(n);if(k.previews.isEnabled(l,"agentOrchestration")){let g=await Promise.all(o.tasks.map(async f=>({task:f,environment:await Xe(n,f)})));for(let{task:f,environment:p}of g){let w=f.ptyTabs.find(R=>R.kind==="agent");w&&p.CRAIG_AGENT_CAPABILITY&&(a[w.id]=p.CRAIG_AGENT_CAPABILITY)}o=await T.listTasks(n)}let c=yo(o.tasks,t),d=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},u=c?await id(c,d):null;return{workspaceRoot:e,workspaces:i.workspaces,repos:s.repos,tasks:o.tasks,inspection:u,...Object.keys(a).length>0?{agentCapabilityTokens:a}:{},...r?{enabledRunnerIds:r}:{}}}function yo(e,t){return t?.selectedTaskId?e.find(r=>r.id===t.selectedTaskId)??null:null}function Cd(e,t){return vr(e,t)}import Eo from"node:path";import yO from"picocolors";var oy=[" \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 To(){return[...oy]}var An={width:120,height:36},W={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function ce(e,t){return{width:Math.max(e??An.width,An.width),height:Math.max(t??An.height,An.height)}}var ay=["Start","Options","Exit"],ly=["Resume","Options","Exit"],xn=2,Dn=2,On=2,cy=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),dy=new RegExp("\x1B\\[(?:0)?m","g"),uy=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),py=/https?:\/\/[^\s<>"']+/g,bo="\x1B[0m",Po="\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"}},Ro=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function xd(e,t={}){return vo(e,{subtitle:"crAIg is that you?",menuItems:ay,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function Dd(e,t={}){return vo(e,{subtitle:"Control mode is paused.",menuItems:ly,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}var En=[" 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."],my=["Help"],fy=5;function Mn(e,t={}){return vo(e,{subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??my,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function Od(e,t={}){let r=t.color??!0,n=v.overlay,s=new Array(e.height).fill(B(" ".repeat(e.width),r,n)),i=To(),o=Math.max(1,Math.floor((e.height-i.length-2-En.length)/2));for(let d=0;d<i.length&&!(o+d>=e.height);d+=1)s[o+d]=B(qd(i[d]??"",e.width),r,v.overlayLogo);let a=Math.max(...En.map(d=>d.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let d=0;d<En.length;d+=1){let u=c+d;if(u>=e.height)break;let g=En[d]??"";s[u]=B(be(" ".repeat(l)+g,e.width),r,n)}return s.join(`
120
- `)}function $d(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(f=>({text:f})):[{text:"No Craig errors have been logged.",tone:"muted"}],we(),{text:"Esc returns to Options.",tone:"muted"}],u=Cr(d,e.height-2),g=Math.max(1,Math.floor((e.height-u.length)/2));for(let f=0;f<u.length;f+=1){let p=g+f;if(p>=e.height)break;let w=u[f]??we(),R=`${" ".repeat(c)}${Ln(w.text,l)}`,x=w.tone==="selected"?v.overlayMenuSelected:w.tone==="muted"?v.overlay:v.panelBg;s[p]=B(be(R,e.width),r,x)}return s.join(`
121
- `)}function Nd(e,t,r={}){let n=r.color??!0,s=W.leftWidth,i=W.rightWidth,o=r.centerOnly??!1,a=e.height-W.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,g=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,f=B(be(g,e.width),n,v.rail),p=hy(t,s-xn-Dn,a,n),w=So(e,t,{color:n,centerOnly:o}),R=yy(t,i,a,n),x=t.inputMode==="terminal",F=[],U=[];for(let Pe=0;Pe<a;Pe+=1)if(!o){let St=$n(p[Pe]??we(),s,n,"left"),$r=B("\u2502",n,d),Nr=B("\u2502",n,u),Mr=$n(R[Pe]??we(),i,n,"right");F.push(`${St}${$r}`),U.push(`${Nr}${Mr}`)}let I=x||t.modalInput?v.panelBg:v.panelMuted,re=gy(t.footerText,t.footerToast,e.width,n,I),We={row:1,column:1,width:e.width,rows:[f]},de=o?null:{row:W.topRailHeight+1,column:1,width:s+W.dividerWidth,rows:F},ye=o?null:{row:W.topRailHeight+1,column:w.column+w.width,width:W.dividerWidth+i,rows:U},h={row:e.height,column:1,width:e.width,rows:[re]},st=o?w.rows:w.rows.map((Pe,St)=>`${F[St]??""}${Pe}${U[St]??""}`);return{frame:[f,...st,re].join(`
122
- `),center:w,regions:{rail:We,left:de,center:w,right:ye,footer:h}}}function So(e,t,r={}){let n=r.color??!0,s=Ld(e,r.centerOnly??!1),i=wy(t,s.width,s.rowCount,n);return{row:s.row,column:s.column,width:s.width,rows:i.map(o=>$n(o,s.width,n,"center"))}}function Md(e,t,r,n={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!go(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=Ld(e,n.centerOnly??!1),a=_d(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:$n(jd(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function Ld(e,t){return{row:W.topRailHeight+1,column:t?1:W.leftWidth+W.dividerWidth+1,width:t?e.width:e.width-W.leftWidth-W.rightWidth-W.dividerWidth*2,rowCount:e.height-W.topRailHeight-1}}function gy(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?Ln(i,Math.max(0,r-a-3)):i,u=Math.max(1,r-oe(d)-a-2),g=t.tone==="error"?jy(o,n,s):Ht(o,n,s),f=`${d}${" ".repeat(u)}${g} `;return B(be(f,r),n,s)}function vo(e,t){let r=new Array(e.height).fill(B(" ".repeat(e.width),t.color,v.overlay)),n=To(),s=t.menuItems.map((c,d)=>`${d===t.menuIndex?">":" "} ${c}`),i=t.optionsMessage?["",t.optionsMessage]:[],o=[...s,...i];for(;o.length<fy;)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=qd(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),f=u>=0&&u<t.menuItems.length&&u===t.menuIndex?v.overlayMenuSelected:v.overlay;r[l+c]=B(d,t.color,f)}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}${Ao(d,t.color,v.overlay)}`,t.color,v.overlay)}return r.join(`
123
- `)}function hy(e,t,r,n){let s=by(e.runners),i=1,o=e.leftTree.map(l=>Ry(l,t,n));return[...Cr(o,r-i),s]}function wy(e,t,r,n){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!go(s)?e.centerTranscript.map(o=>({...o})):ky(e);return Cr([..._d(e,t,n),...i],r)}function _d(e,t,r){let n=t-2,s=e.tabs.find(R=>R.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:My(e.tabs),o=e.inputMode==="terminal"?n:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?Ht(a,r,v.panelBg):Nn(a,r,v.panelMuted)}`,c=[`${Nn(e.centerHeader.tabLabel,r,v.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),d=Py(e.tabs,r,e.focusedRegion==="center"),u=" engaged ",g=u.length+2,f=e.inputMode==="terminal"?Ht(`${u}\u25CF `,r,v.panelBg):"",p=e.inputMode==="terminal"?" ".repeat(Math.max(0,n-oe(d)-g)):"";return[{text:e.inputMode==="terminal"?`${d}${p}${f}`:d},{text:l,tone:"muted"},{text:c},we()]}function ky(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(jd)}function jd(e){return{text:Co(e.segments),segments:e.segments,fullBleed:!0}}function yy(e,t,r,n){let s=e.rightInspection?Ty(e.actionMessage?[...e.rightInspection.rows.slice(0,2),{id:"action-message",text:e.actionMessage},{id:"action-message-spacer",text:""},...e.rightInspection.rows.slice(2)]:e.rightInspection.rows,r):Cr([{text:"CONTEXT"},we(),...e.rightContext.map(i=>Sy(i,n)),...e.actionMessage?[we(),{text:e.actionMessage}]:[]],r);return Cr(s,r)}function Ty(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:_y(i-Math.floor(s/2),0,Math.max(0,n.length-s));return[...r.map(a=>Ad(a)),...n.slice(o,o+s).map(a=>Ad(a))]}function Ad(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 Ry(e,t,r){let n=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${Ht("\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?Ht(e.text,r,v.panelBg):e.panelHeader?Nn(e.text,r,v.panelMuted):e.text,u=be(`${n}${c}${d}`,Math.max(0,l)),g=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let p=`${n}${e.selected?"\u25B8":" "} `,w=u.slice(p.length+2),R=[{text:p},Fd(e.activity,e.activityAnimationFrame??0),{text:` ${w}${i}${o}`},...e.prBadge??[]];return{text:Co(R),segments:R,tone:g}}if(e.prBadge){let p=[{text:`${u}${i}${o}`},...e.prBadge];return{text:`${u}${i}${e.prBadge.map(R=>R.text).join("")}`,segments:p,tone:g}}return{text:`${u}${i}${o}`,tone:g}}function by(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 Py(e,t,r){return e.map(n=>{let s=n.active?r?Ht(n.label,t,v.panelBg):Nn(n.label,t,v.panelBg):Ao(n.label,t,v.panelBg),i=n.activity?Io(Fd(n.activity,n.activityAnimationFrame??0),t,v.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function Fd(e,t){return{text:"\u25CF",style:{fg:e==="working"?Ro[t%Ro.length]??Ro[0]:e==="ready"?v.success.fg:e==="error"?v.error.fg:v.panelMuted.fg}}}function Sy(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?Ao(e.value,t,v.panelBg):e.value}`}}function $n(e,t,r,n){let s=vy(n,e.tone??"default"),i=Iy(e,r,s);if(n==="left"){if(e.fullBleed)return B(be(i,t),r,s);let a=t-xn-Dn;if(e.rightAlign){let c=oe(i),d=Math.max(0,a-c),u=`${" ".repeat(xn)}${" ".repeat(d)}${i}${" ".repeat(Dn)}`;return B(u,r,s)}let l=`${" ".repeat(xn)}${be(i,a)}${" ".repeat(Dn)}`;return B(l,r,s)}return n==="center"&&e.fullBleed?Cy(e,t,r,s):B(be(` ${i}`,t),r,s)}function vy(e,t){return t==="selected"||t==="focused"?v.panelSelected:t==="muted"?v.panelMuted:v.panelBg}function Cr(e,t){let r=e.slice(0,t);for(;r.length<t;)r.push(we());return r}function we(){return{text:""}}function Iy(e,t,r){return e.segments?e.segments.map(n=>Io(n,t,r)).join(""):e.text}function Cy(e,t,r,n){let s=" ".repeat(On),i=Math.max(0,t-On*2);if(!e.segments)return B(`${s}${be(e.text,i)}${s}`,r,n);let o=xy(e.segments,i),a=`${s}${o.map(l=>Io(l,r,n)).join("")}${s}${r?Po:""}`;return B(a,r,n)}function Io(e,t,r){let n=e.href?`${Wd(e.href)}${e.text}${Po}`:Ay(e.text);return!t||!e.style?n:`${Ar($y(e.style,r))}${Ny(e.style)}${n}${bo}${Ar(r)}`}function Ay(e){return e.replace(py,t=>{let[r,n]=Ey(t);return`${Wd(r)}${r}${Po}${n}`})}function Ey(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function Wd(e){return`\x1B]8;;${e}\x1B\\`}function xy(e,t){let r=Dy(e,t);return Oy(r,t)}function Dy(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=Ln(s.text,n);o.length>0&&r.push({...s,text:o}),n=0}return r}function Oy(e,t){let r=oe(Co(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 $y(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 Ny(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 My(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 qd(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?Ly(e,t):e+" ".repeat(t-r)}function Ly(e,t){if(t<=0)return"";if(oe(e)<=t)return e;let r=Bd(e);return Ln(r,Math.max(0,t-1))+"\u2026"}function oe(e){let t=0;for(let r of Array.from(Bd(e)))t+=Ud(r);return t}function Ln(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 _y(e,t,r){return Math.min(Math.max(e,t),r)}function Bd(e){return e.replace(uy,"").replace(cy,"")}function Co(e){return e.map(t=>t.text).join("")}function B(e,t,r){if(!t)return e;let n=Ar(r),s=e.replace(dy,`${bo}${n}`);return`${n}${s}${bo}`}function Ar(e){let t=[];return e.fg&&t.push(`38;2;${Ed(e.fg).join(";")}`),e.bg&&t.push(`48;2;${Ed(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function Ed(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function Ht(e,t,r){return _n(e,t,v.success.fg,r)}function jy(e,t,r){return _n(e,t,v.error.fg,r)}function Nn(e,t,r){return _n(e,t,v.accent.fg,r)}function Ao(e,t,r){return _n(e,t,v.mutedfg.fg,r)}function _n(e,t,r,n){if(!t)return e;let s=n.bg?{fg:r,bg:n.bg}:{fg:r};return`${Ar(s)}${e}${Ar(n)}`}function Vd(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"?Wy(s):[],a=n?{CRAIG_WORKSPACE_ROOT:r,CRAIG_TASK_ID:n.id,...s?.kind==="agent"?{CRAIG_AGENT_TAB_ID:s.id,...e.agentCapabilityTokens?.[s.id]?{CRAIG_AGENT_CAPABILITY:e.agentCapabilityTokens[s.id]}:{}}:{}}:{};return n?.type==="project"?{cwd:i,command:o,env:{...a,GIT_CEILING_DIRECTORIES:Fy(process.env.GIT_CEILING_DIRECTORIES,i)}}:n?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function Fy(e,t){let r=(e??"").split(Eo.delimiter).filter(n=>n.length>0);return r.includes(t)?r.join(Eo.delimiter):[...r,t].join(Eo.delimiter)}function Wy(e){return e.command.length>0?e.command:["codex"]}function Kd(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 et(e){return{columns:Math.max(20,e.width-W.leftWidth-W.rightWidth-W.dividerWidth-On*2),rows:Math.max(5,e.height-W.topRailHeight-5)}}function Gd(e){return e.length===1||he(e)||e==="BACKSPACE"||e==="TAB"}function tt(e){return typeof e=="string"&&new RegExp(`:(?:agent|${j.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 xo(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function zd(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 Er(e){return Jd.includes(e)?"SHIFT_ENTER":null}function Do(e){return Jd.some(t=>t.startsWith(e))}function Yd(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var Jd=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function Xd(e,t,r){return r.length===0?!1:e&&(r==="\r"||r===`
124
- `||r===`\r
125
- `)?!0:!t||Date.now()-t.at>=30?!1:r===t.key?!0:r.length<=4&&r.split("").every(n=>n===t.key)}function Qd(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function Zd(e,t=null){let r=t?.split(`
258
+ `);return o.length>OI?Se(t,"Diff is above the 500 KB inline preview limit.","too_large",t,o.length):o.includes("\0")?Se(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(`
259
+ `):["No diff for this file."],byteLength:o.length}}function dh(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 ln(e,t){return e&&t.includes(e)?e:t[0]??null}function xI(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function ph(e){return[...new Set(e.split(`
260
+ `).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function FI(e,t){let n=Hc.resolve(e,t),r=Hc.resolve(e);if(n!==r&&!n.startsWith(`${r}${Hc.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function LI(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function Se(e,t,n,r=null,s=null){return{path:r,status:n,title:e,lines:[t],byteLength:s}}var MI=["tasks","center","inspector","actions"],fh=["agent","terminal"],mh=[],K="inspection",OB=[...fh,...mh],zc=["commit","push","refresh-checks","close-task"],hh=["refresh-checks","close-task"],gh=["task","checks","pr","setup-run","actions","next-action"],Jc=["files","review"];function yh(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=VI(e?.openInspectionKind)??n,s=k.runners.getEnabled(t);return{inputMode:GI(e?.inputMode),focusedRegion:WI(e?.focusedRegion),selectedRepoId:_t(e?.selectedRepoId),selectedWorkspaceId:_t(e?.selectedWorkspaceId),selectedTaskId:_t(e?.selectedTaskId),selectedPtyTabId:_t(e?.selectedPtyTabId),selectedLeftItemId:QI(_t(e?.selectedTaskId)),activeTab:n?K:_t(e?.activeTab)??"agent",preferredPtyTabKind:KI(e?.preferredPtyTabKind),inspectorSection:Ss(e?.inspectorSection,gh,"task"),inspectionMode:BI(e?.inspectionMode,n==="diff"?"review":"files"),openInspectionKind:r,selectedFileTreePath:_t(e?.selectedFileTreePath),selectedFilePath:_t(e?.selectedFilePath),selectedDiffPath:_t(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:Ss(e?.selectedActionId,zc,"commit"),selectedProjectTargetId:null,selectedRunner:HI(e?.selectedRunner,s,k.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:jI(),centerZoomed:!1}}function jI(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function wh(e,t){return{...e??js(),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 Is(e,t,n={}){let r=XI(e,t),s=Qc(r),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:n.resetInputMode?"control":e.inputMode,selectedLeftItemId:r,selectedWorkspaceId:i?.id??null,selectedRepoId:a,selectedTaskId:c?.id??null,...YI(c,e.activeTab,e.selectedPtyTabId),selectedFilePath:UI(e,t,c?.id??null),...zI(e,t,c?.id??null),selectedDiffPath:qI(e,t,c?.id??null),inspectorSection:Ss(e.inspectorSection,gh,"task")}}function xt(e,t){return{...e,terminal:t}}function kh(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function Th(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function ot(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
261
+ `}function bh(e){return e.length===1&&e>=" "&&e!=="\x7F"}function Xc(e){return Sh(e)||Rr(e)!==null}function Rh(e){return mh.includes(e)}function Sh(e){return fh.includes(e)}function Ph(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[K]:[]]}function qI(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function UI(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function Ss(e,t,n){return t.includes(e??"")?e:n}function WI(e){return e==="tabs"?"center":Ss(e,MI,"tasks")}function BI(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":Ss(e,Jc,t)}function VI(e){return e==="file"||e==="diff"?e:null}function KI(e){return e==="terminal"?"terminal":"agent"}function GI(e){return e==="terminal"?"terminal":"control"}function HI(e,t=[...J],n="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:n}function ho(e,t=J){let n=t.length>0?t:J,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function Rr(e){let t=J.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function YI(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(Sh(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 zI(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?JI(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function JI(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 XI(e,t){let n=Ln(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 Ln(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of Ps(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 Ps(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 Ps(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 Qc(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 _t(e){return typeof e=="string"?e:null}function QI(e){return e?`task:${e}`:null}function vs(e){return typeof e=="string"&&e.startsWith("task:")}function go(e){return typeof e=="string"&&e.startsWith("new-task:")}function yo(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function Ih(e){return typeof e=="string"&&e.startsWith("workspace:")}function Zc(e){return go(e)?e.slice(9):null}function eu(e){return yo(e)?e.slice(19):null}async function Sr(e,t,n){let r=Ie(e),[s,i]=await Promise.all([we.repos.listRegisteredRepos(r),we.listWorkspaces(r,{archived:!1})]),o=await S.listTasks(r),a={},l=await k.load(r),c=0;if(k.previews.isEnabled(l,"agentOrchestration")){let h=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(T=>T.kind==="agent").map(async T=>({agentTab:T,environment:await Je(r,y,void 0,T.id)}))));for(let{agentTab:y,environment:T}of h)T.CRAIG_AGENT_CAPABILITY&&(a[y.id]=T.CRAIG_AGENT_CAPABILITY);o=await S.listTasks(r);let[f,m]=await Promise.all([tf(r),ui(r)]);c=f.length+m.filter(y=>y.state==="waiting_for_review").length}let d=tu(o.tasks,t),u=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},p=d?await sh(d,u):null;return{workspaceRoot:e,workspaces:i.workspaces,repos:s.repos,tasks:o.tasks,inspection:p,furyApprovalCount:c,...Object.keys(a).length>0?{agentCapabilityTokens:a}:{},...n?{enabledRunnerIds:n}:{}}}function tu(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function vh(e,t){return Is(e,t)}import du from"node:path";import UB from"picocolors";var ZI=[" \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 nu(){return[...ZI]}var wo={width:120,height:36},Z={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function Le(e,t){return{width:Math.max(e??wo.width,wo.width),height:Math.max(t??wo.height,wo.height)}}var ev=["Start","Options","Exit"],tv=["Resume","Options","Exit"],To=2,bo=2,Ro=2,nv=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),rv=new RegExp("\x1B\\[(?:0)?m","g"),sv=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),iv=/https?:\/\/[^\s<>"']+/g,su="\x1B[0m",iu="\x1B]8;;\x1B\\",N={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"}},ru=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function Eh(e,t={}){return au(e,{subtitle:"crAIg is that you?",menuItems:ev,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function Oh(e,t={}){return au(e,{subtitle:"Control mode is paused.",menuItems:tv,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}var ko=[" 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."],ov=["Help"],av=5;function Io(e,t={}){return au(e,{subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??ov,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function $h(e,t={}){let n=t.color??!0,r=N.overlay,s=new Array(e.height).fill(re(" ".repeat(e.width),n,r)),i=nu(),o=Math.max(1,Math.floor((e.height-i.length-2-ko.length)/2));for(let d=0;d<i.length&&!(o+d>=e.height);d+=1)s[o+d]=re(qh(i[d]??"",e.width),n,N.overlayLogo);let a=Math.max(...ko.map(d=>d.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let d=0;d<ko.length;d+=1){let u=c+d;if(u>=e.height)break;let p=ko[d]??"";s[u]=re(wt(" ".repeat(l)+p,e.width),n,r)}return s.join(`
262
+ `)}function Dh(e,t={}){let n=t.color??!0,r=N.overlay,s=new Array(e.height).fill(re(" ".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)),d=[{text:i,tone:"selected"},{text:o,tone:"muted"},at(),...a.length>0?a.map(h=>({text:h})):[{text:"No Craig errors have been logged.",tone:"muted"}],at(),{text:"Esc returns to Options.",tone:"muted"}],u=Cs(d,e.height-2),p=Math.max(1,Math.floor((e.height-u.length)/2));for(let h=0;h<u.length;h+=1){let f=p+h;if(f>=e.height)break;let m=u[h]??at(),y=`${" ".repeat(c)}${vo(m.text,l)}`,T=m.tone==="selected"?N.overlayMenuSelected:m.tone==="muted"?N.overlay:N.panelBg;s[f]=re(wt(y,e.width),n,T)}return s.join(`
263
+ `)}function Nh(e,t,n={}){let r=n.color??!0,s=Z.leftWidth,i=Z.rightWidth,o=n.centerOnly??!1,a=e.height-Z.topRailHeight-1,l=n.focusFlashActive??!1,c={bg:N.divider.bg,fg:"9ece6a"},d=l&&(t.focusedRegion==="tasks"||t.focusedRegion==="center")?c:N.divider,u=l&&(t.focusedRegion==="center"||t.focusedRegion==="inspector")?c:N.divider,p=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,h=re(wt(p,e.width),r,N.rail),f=cv(t,s-To-bo,a,r),m=ou(e,t,{color:r,centerOnly:o}),y=pv(t,i,a,r),T=t.inputMode==="terminal",R=[],v=[];for(let ye=0;ye<a;ye+=1)if(!o){let Y=So(f[ye]??at(),s,r,"left"),fn=re("\u2502",r,d),_s=re("\u2502",r,u),xs=So(y[ye]??at(),i,r,"right");R.push(`${Y}${fn}`),v.push(`${_s}${xs}`)}let b=T||t.modalInput?N.panelBg:N.panelMuted,$=lv(t.footerText,t.footerToast,e.width,r,b),D={row:1,column:1,width:e.width,rows:[h]},x=o?null:{row:Z.topRailHeight+1,column:1,width:s+Z.dividerWidth,rows:R},C=o?null:{row:Z.topRailHeight+1,column:m.column+m.width,width:Z.dividerWidth+i,rows:v},w={row:e.height,column:1,width:e.width,rows:[$]},ge=o?m.rows:m.rows.map((ye,Y)=>`${R[Y]??""}${ye}${v[Y]??""}`);return{frame:[h,...ge,$].join(`
264
+ `),center:m,regions:{rail:D,left:x,center:m,right:C,footer:w}}}function ou(e,t,n={}){let r=n.color??!0,s=xh(e,n.centerOnly??!1),i=uv(t,s.width,s.rowCount,r);return{row:s.row,column:s.column,width:s.width,rows:i.map(o=>So(o,s.width,r,"center"))}}function _h(e,t,n,r={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!Xc(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=xh(e,r.centerOnly??!1),a=Fh(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:d})=>({index:d,row:So(Lh(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function xh(e,t){return{row:Z.topRailHeight+1,column:t?1:Z.leftWidth+Z.dividerWidth+1,width:t?e.width:e.width-Z.leftWidth-Z.rightWidth-Z.dividerWidth*2,rowCount:e.height-Z.topRailHeight-1}}function lv(e,t,n,r,s){let i=` ${e}`;if(!t)return re(wt(i,n),r,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=Ee(o),l=Ee(i),c=Math.max(1,n-l-a-2),d=l+c+a+2>n?vo(i,Math.max(0,n-a-3)):i,u=Math.max(1,n-Ee(d)-a-2),p=t.tone==="error"?$v(o,r,s):Pr(o,r,s),h=`${d}${" ".repeat(u)}${p} `;return re(wt(h,n),r,s)}function au(e,t){let n=new Array(e.height).fill(re(" ".repeat(e.width),t.color,N.overlay)),r=nu(),s=t.menuItems.map((c,d)=>`${d===t.menuIndex?">":" "} ${c}`),i=t.optionsMessage?["",t.optionsMessage]:[],o=[...s,...i];for(;o.length<av;)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 d=qh(a[c]??"",e.width);if(c<r.length){n[l+c]=re(d,t.color,N.overlayLogo);continue}if(c===r.length+1){n[l+c]=re(d,t.color,N.overlaySubtitle);continue}let u=c-(r.length+3),h=u>=0&&u<t.menuItems.length&&u===t.menuIndex?N.overlayMenuSelected:N.overlay;n[l+c]=re(d,t.color,h)}if(t.versionText){let c=t.updateText?" (update available)":"",d=`${t.versionText}${c} `,u=" ".repeat(Math.max(0,e.width-Ee(d)));n[e.height-1]=re(`${u}${uu(d,t.color,N.overlay)}`,t.color,N.overlay)}return n.join(`
265
+ `)}function cv(e,t,n,r){let s=hv(e.runners),i=1,o=e.leftTree.map(l=>mv(l,t,r));return[...Cs(o,n-i),s]}function uv(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!Xc(s)?e.centerTranscript.map(o=>({...o})):dv(e);return Cs([...Fh(e,t,r),...i],n)}function Fh(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:Av(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?Pr(a,n,N.panelBg):Po(a,n,N.panelMuted)}`,c=[`${Po(e.centerHeader.tabLabel,n,N.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),d=gv(e.tabs,n,e.focusedRegion==="center"),u=" engaged ",p=u.length+2,h=e.inputMode==="terminal"?Pr(`${u}\u25CF `,n,N.panelBg):"",f=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Ee(d)-p)):"";return[{text:e.inputMode==="terminal"?`${d}${f}${h}`:d},{text:l,tone:"muted"},{text:c},at()]}function dv(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},at(),{text:e.terminal.error},at(),{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(Lh)}function Lh(e){return{text:cu(e.segments),segments:e.segments,fullBleed:!0}}function pv(e,t,n,r){let s=e.rightInspection?fv(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):Cs([{text:"CONTEXT"},at(),...e.rightContext.map(i=>yv(i,r)),...e.actionMessage?[at(),{text:e.actionMessage}]:[]],n);return Cs(s,n)}function fv(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:Ov(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>Ch(a)),...r.slice(o,o+s).map(a=>Ch(a))]}function Ch(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 mv(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${Pr("\u25CF",n,e.selected?N.panelSelected:N.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((f,m)=>f+Ee(m.text),0):0,l=t-Ee(i)-Ee(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",d=e.selected?e.text:e.focused?Pr(e.text,n,N.panelBg):e.panelHeader?Po(e.text,n,N.panelMuted):e.text,u=wt(`${r}${c}${d}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let f=`${r}${e.selected?"\u25B8":" "} `,m=u.slice(f.length+2),y=[{text:f},Mh(e.activity,e.activityAnimationFrame??0),{text:` ${m}${i}${o}`},...e.prBadge??[]];return{text:cu(y),segments:y,tone:p}}if(e.prBadge){let f=[{text:`${u}${i}${o}`},...e.prBadge];return{text:`${u}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:f,tone:p}}return{text:`${u}${i}${o}`,tone:p}}function hv(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:N.success.fg}}):n.push({text:s.text,style:{fg:N.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function gv(e,t,n){return e.map(r=>{let s=r.active?n?Pr(r.label,t,N.panelBg):Po(r.label,t,N.panelBg):uu(r.label,t,N.panelBg),i=r.activity?lu(Mh(r.activity,r.activityAnimationFrame??0),t,N.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function Mh(e,t){return{text:"\u25CF",style:{fg:e==="working"?ru[t%ru.length]??ru[0]:e==="ready"?N.success.fg:e==="error"?N.error.fg:N.panelMuted.fg}}}function yv(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?uu(e.value,t,N.panelBg):e.value}`}}function So(e,t,n,r){let s=wv(r,e.tone??"default"),i=kv(e,n,s);if(r==="left"){if(e.fullBleed)return re(wt(i,t),n,s);let a=t-To-bo;if(e.rightAlign){let c=Ee(i),d=Math.max(0,a-c),u=`${" ".repeat(To)}${" ".repeat(d)}${i}${" ".repeat(bo)}`;return re(u,n,s)}let l=`${" ".repeat(To)}${wt(i,a)}${" ".repeat(bo)}`;return re(l,n,s)}return r==="center"&&e.fullBleed?Tv(e,t,n,s):re(wt(` ${i}`,t),n,s)}function wv(e,t){return t==="selected"||t==="focused"?N.panelSelected:t==="muted"?N.panelMuted:N.panelBg}function Cs(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(at());return n}function at(){return{text:""}}function kv(e,t,n){return e.segments?e.segments.map(r=>lu(r,t,n)).join(""):e.text}function Tv(e,t,n,r){let s=" ".repeat(Ro),i=Math.max(0,t-Ro*2);if(!e.segments)return re(`${s}${wt(e.text,i)}${s}`,n,r);let o=Sv(e.segments,i),a=`${s}${o.map(l=>lu(l,n,r)).join("")}${s}${n?iu:""}`;return re(a,n,r)}function lu(e,t,n){let r=e.href?`${jh(e.href)}${e.text}${iu}`:bv(e.text);return!t||!e.style?r:`${As(vv(e.style,n))}${Cv(e.style)}${r}${su}${As(n)}`}function bv(e){return e.replace(iv,t=>{let[n,r]=Rv(t);return`${jh(n)}${n}${iu}${r}`})}function Rv(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function jh(e){return`\x1B]8;;${e}\x1B\\`}function Sv(e,t){let n=Pv(e,t);return Iv(n,t)}function Pv(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=Ee(s.text);if(i<=r){n.push(s),r-=i;continue}let o=vo(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function Iv(e,t){let n=Ee(cu(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 vv(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 Cv(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 Av(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 qh(e,t){let n=Math.max(0,t-Ee(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function wt(e,t){let n=Ee(e);return n>=t?Ev(e,t):e+" ".repeat(t-n)}function Ev(e,t){if(t<=0)return"";if(Ee(e)<=t)return e;let n=Wh(e);return vo(n,Math.max(0,t-1))+"\u2026"}function Ee(e){let t=0;for(let n of Array.from(Wh(e)))t+=Uh(n);return t}function vo(e,t){let n="",r=0;for(let s of Array.from(e)){let i=Uh(s);if(r+i>t)break;n+=s,r+=i}return n}function Uh(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 Ov(e,t,n){return Math.min(Math.max(e,t),n)}function Wh(e){return e.replace(sv,"").replace(nv,"")}function cu(e){return e.map(t=>t.text).join("")}function re(e,t,n){if(!t)return e;let r=As(n),s=e.replace(rv,`${su}${r}`);return`${r}${s}${su}`}function As(e){let t=[];return e.fg&&t.push(`38;2;${Ah(e.fg).join(";")}`),e.bg&&t.push(`48;2;${Ah(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function Ah(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function Pr(e,t,n){return Co(e,t,N.success.fg,n)}function $v(e,t,n){return Co(e,t,N.error.fg,n)}function Po(e,t,n){return Co(e,t,N.accent.fg,n)}function uu(e,t,n){return Co(e,t,N.mutedfg.fg,n)}function Co(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${As(s)}${e}${As(r)}`}function Bh(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"?Nv(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:Dv(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function Dv(e,t){let n=(e??"").split(du.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(du.delimiter):[...n,t].join(du.delimiter)}function Nv(e){return e.command.length>0?e.command:["codex"]}function Vh(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 cn(e){return{columns:Math.max(20,e.width-Z.leftWidth-Z.rightWidth-Z.dividerWidth-Ro*2),rows:Math.max(5,e.height-Z.topRailHeight-5)}}function Kh(e){return e.length===1||ot(e)||e==="BACKSPACE"||e==="TAB"}function un(e){return typeof e=="string"&&new RegExp(`:(?:agent|${J.join("|")})(?:-\\d+)?$`).test(e)}function Gh(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 pu(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function Hh(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 Es(e){return zh.includes(e)?"SHIFT_ENTER":null}function fu(e){return zh.some(t=>t.startsWith(e))}function Yh(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var zh=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function Jh(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
266
+ `||n===`\r
267
+ `)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function Xh(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function Qh(e,t=null){let n=t?.split(`
126
268
  `)??[];return e.split(`
127
- `).map((n,s)=>r[s]===n?"":`\x1B[${s+1};1H${n}`).join("")}function jn(e,t,r,n){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${r+i};${n}H${s}`).join("")}import{spawn as AT}from"node:child_process";import{createServer as ET,createConnection as pu}from"node:net";import{openSync as xT}from"node:fs";import{mkdir as DT,readFile as Bo,rm as bt,writeFile as OT}from"node:fs/promises";import Bn from"node:path";var rt=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=Oo(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:Oo(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=Oo(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 Oo(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as eu,readFile as qy,rm as $o,stat as Uy,writeFile as By}from"node:fs/promises";import No from"node:path";async function Mo(e){let t=No.join(e.runtimeDir,"orchestration-supervisor.lock");await eu(e.runtimeDir,{recursive:!0});try{await eu(t)}catch(n){if(!Ky(n))throw n;let s=await qy(No.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await Uy(t).catch(()=>null);if(typeof s?.pid=="number"&&!Vy(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await $o(t,{recursive:!0,force:!0}),Mo(e);throw new m("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await By(No.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(n){throw await $o(t,{recursive:!0,force:!0}),n}let r=!1;return{async release(){r||(r=!0,await $o(t,{recursive:!0,force:!0}))}}}function Vy(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 Ky=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";function tu(e,t){switch(e){case"codex":case"cursor":case"claude":return`\x1B[200~${t}\x1B[201~\r`;default:return Gy(e)}}function Gy(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import Hy from"node:path";var zy={type:"system",component:"orchestration-supervisor"};async function ru(e){let t=Hy.join(e.orchestrationDir,"command-event-reconciliation.json"),r=await _r(t)??{version:1,commands:{}},n=await Me(e),s=!1;for(let i of n){let o=new Set(r.commands[i.id]??[]);for(let a of Yy(i))o.has(a)||(await ht(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:zy),o.add(a),s=!0);r.commands[i.id]=[...o]}s&&await O(t,r)}function Yy(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 Fn=class{constructor(t,r,n={}){this.paths=t;this.runtime=r;let s=n.intervalMs??250;this.heartbeat=new rt({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 ru(this.paths);let t=await Me(this.paths);for(let r of t){if(r.state==="delivering"){await ie.fail(this.paths,r.id,xr("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,xr("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let r=await T.getTask(this.paths,t.taskId).catch(i=>{if(i instanceof m&&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,xr("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,xr("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(this.runtime.hasRunningSession(t.agentTabId)&&!(t.delivery==="when-ready"&&Ye(r,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")){await ie.beginDelivery(this.paths,t.id);try{this.runtime.writeToSession(t.agentTabId,tu(n.runner??r.runner,t.prompt.text))}catch(i){await ie.fail(this.paths,t.id,xr("PROMPT_DELIVERY_UNCERTAIN",i instanceof Error?i.message:"Prompt delivery failed after it began.",!1,!0));return}await ie.completeDelivery(this.paths,t.id)}}},xr=(e,t,r,n)=>({code:e,message:t,retryable:r,deliveryUncertain:n});var Jy={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},zt=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...Jy,...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=Xy(t),s=t.id===r.selectedTaskId&&r.reviewVisible;if(n.length>0){let i=n.some(Qy);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 Xy(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 Qy(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as Zy}from"node:fs";var Wn=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=Zy(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 eT={selectedTaskId:null,reviewVisible:!1},tT={listTasks:async e=>(await T.listTasks(e)).tasks,syncTasks:async(e,t)=>(await T.prs.discoverOrRefreshMany(e,t),Promise.all(t.map(r=>T.getTask(e,r.id))))},qn=class{constructor(t,r={}){this.paths=t;let n=r.heartbeatIntervalMs??1e3;this.dependencies=r.dependencies??tT,this.onTasksChanged=r.onTasksChanged??(()=>{}),this.onError=r.onError??(()=>{}),this.coordinator=new zt({...r.minimumIntervalMs!==void 0?{minimumIntervalMs:r.minimumIntervalMs}:{},...r.intervals?{intervals:r.intervals}:{},...r.now?{now:r.now}:{}}),this.eventMonitor=r.reconcileEvents?new Wn(t,{reconcileEvents:r.reconcileEvents,onEvents:async s=>{let i=rT(s);i.length>0&&await this.wake(i)},onError:s=>this.reportError(s),...r.now?{now:r.now}:{}}):null,this.heartbeat=new rt({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=eT;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,nu(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)!==nu(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 rT(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=sT(r.data);if(r.type==="task.updated"){(Array.isArray(n?.changedFields)?n.changedFields:[]).some(i=>typeof i=="string"&&nT.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 nT=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),sT=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function nu(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as fT}from"node:module";import iT from"@xterm/headless";var oT=1e3,aT=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function iu(e){return new iT.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:oT,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}})}function ou(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function _o(e,t){return new Promise(r=>{e.write(t,r)})}function au(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:dT(u,o+a===i&&d===r.cursorX)})}n.push({segments:lT(cT(c))})}return n}function lT(e){let t=[];for(let r of e){let n=t.at(-1);if(n&&mT(n.style,r.style)){n.text+=r.text;continue}let s={text:r.text};lu(r.style)||(s.style=r.style),t.push(s)}return t}function cT(e){let t=e.length;for(;t>0;){let r=e[t-1];if(!r||r.text!==" "||!lu(r.style))break;t-=1}return e.slice(0,t)}function dT(e,t){let r={},n=su(e,"fg"),s=su(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 su(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"):aT[s]??uT(s)}function uT(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(pT).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 pT(e){return e===0?0:55+e*40}function mT(e,t){return Lo(e)===Lo(t)}function Lo(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function lu(e){return Lo(e)===""}var gT=fT(import.meta.url),hT=/^CTRL_([A-Z])$/,wT="\x1B[6n",kT="\x1B[c",yT="\x1B[?u",TT={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
128
- `,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:""},Un=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")jo(i),this.sessions.delete(r);else return this.attachedTabId=r,i.scrollbackLines=0,cu(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(`
129
- `))&&this.touchActivity(r))}writeKey(t){let r=RT(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&&cu(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&&(jo(r),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())jo(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:bT(r),error:r.error,scrolledBack:r.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}createSession(t,r,n,s){let i=this.spawn??ST().spawn,o=iu(n),a=s??this.resolveSessionSpec(t,r),l=pt({...this.env,...a.env??{}}),{executable:c,args:d}=vT(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:IT(l)}),g={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 g.disposables.push(u.onData(f=>{this.touchActivity(g),CT(u,f),_o(g.terminal,f).then(()=>{g.screenDirty=!0,this.onUpdate?.({tabId:g.tabId,kind:"full"})})})),g.disposables.push(u.onExit(f=>{g.status="exited",g.exitCode=f.exitCode,g.lastActivityAt=Date.now(),this.notifyActivity(g),_o(g.terminal,`\r
130
- [process exited ${f.exitCode}]`).then(()=>{g.screenDirty=!0,this.onUpdate?.({tabId:g.tabId,kind:"full"})})})),g}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 RT(e){if(e.length===1)return e;let t=TT[e];if(t!==void 0)return t;let r=hT.exec(e);return r?.[1]?String.fromCharCode(r[1].charCodeAt(0)-64):null}function cu(e,t){PT(e.pty,t),ou(e.terminal,t),e.screenDirty=!0}function bT(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=au(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function jo(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function PT(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function ST(){return gT("node-pty")}function vT(e,t,r){if(t.length===0)return{executable:e,args:[]};let s=`${[mt(t[0],r),...t.slice(1)].map(du).join(" ")}; exec ${du(e)} -l`;return{executable:e,args:["-lc",s]}}function du(e){return`'${e.replaceAll("'","'\\''")}'`}function IT(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 CT(e,t){for(let r=0;r<Fo(t,wT);r+=1)e.write("\x1B[1;1R");for(let r=0;r<Fo(t,kT);r+=1)e.write("\x1B[?1;2c");for(let r=0;r<Fo(t,yT);r+=1)e.write("\x1B[?0u")}function Fo(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 mu=gt,$T=new Set([mu]),NT=16,MT=250;async function fu(e){let t=Oe(e.paths);await FT(t,e.paths,e.spawnDaemon);let r=await Ru(t.socketPath),n=new Wo(r,e);return await n.ready(),n}async function gu(e,t={}){let r=Oe(e);await DT(e.runtimeDir,{recursive:!0}),await bt(r.socketPath,{force:!0});let n=new qo(e,t),s=ET(i=>n.handleConnection(i));try{await n.start(),await KT(s,r.socketPath),await OT(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 bt(r.socketPath,{force:!0}),await bt(r.pidPath,{force:!0}),await n.stop(),n.disposeAll()}}async function hu(e){let t=Oe(e);return await Vn(t.socketPath)?(await yu(t.socketPath),!0):!1}var Wo=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(!ku(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)}
131
- `);let i=await s;if(!i.ok)throw new Error(i.error);return i}handleData(t){this.buffer+=t;let r=this.buffer.indexOf(`
132
- `);for(;r!==-1;){let n=this.buffer.slice(0,r);this.buffer=this.buffer.slice(r+1),this.handleMessage(n),r=this.buffer.indexOf(`
133
- `)}}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=jT(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)}}},qo=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 Un({...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??(()=>Qe(this.paths,{agentObserver:{daemonAvailable:!0,getSnapshots:()=>this.runtime.getActivitySnapshots(),subscribe:()=>()=>{},close:()=>{}}}));this.pullRequestEventReconciliationEnabled=!!s,this.pullRequestSyncSupervisor=new qn(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 Me(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(`
134
- `);for(;i!==-1;){let o=r.slice(0,i);r=r.slice(i+1),this.handleLine(t,o),i=r.indexOf(`
135
- `)}});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{Rt(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,n);Rt(t,{id:n.id,ok:!0,...n.type==="ping"?{protocolVersion:mu}:{},...n.type==="getActivitySnapshots"?{activities:this.runtime.getActivitySnapshots()}:{},...s?{view:s}:{}})}catch(s){let i=s instanceof Error?s.message:String(s);Rt(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 GT(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(Uo),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)Rt(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)},MT))}}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&&Rt(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&&Rt(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 Fn(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)},NT))}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=LT(s,r),o=_T(s.view,r);s.view=r,s.rowKeys=r.rows.map(Uo),(i.rows.length>0||o)&&Rt(n,{type:"update",tabId:t,patch:i})}}};function LT(e,t){let r=[];for(let n=0;n<t.rows.length;n+=1){let s=t.rows[n];e.rowKeys[n]!==Uo(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 _T(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 jT(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function Uo(e){return JSON.stringify(e)}async function FT(e,t,r){if(await WT(e.socketPath,1e3))return;await Vn(e.socketPath)&&(await yu(e.socketPath),await uu(e.socketPath,1e3)),await Vn(e.socketPath)&&(await BT(e),await uu(e.socketPath,1e3)),await UT(e);let n=t.workspaceRoot;if(r)r(n);else{let{command:o,args:a}=qT(n),l=xT(Bn.join(t.runtimeDir,"pty-daemon.log"),"a");AT(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 wu(e.socketPath))return;await Vo(50)}let i=await Bo(Bn.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${i?`
136
- ${i.slice(-2e3)}`:""}`)}async function wu(e){let t=await VT(e).catch(()=>null);return t?.ok===!0&&ku(t.protocolVersion)}function ku(e){return e!==void 0&&$T.has(e)}async function WT(e,t){let r=Date.now();for(;Date.now()-r<t;){if(await wu(e))return!0;await Vo(50)}return!1}function qT(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=Bn.resolve(Bn.dirname(t),"..","node_modules",".bin","tsx");return{command:_s("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 UT(e){let t=await Bo(e.pidPath,"utf8").catch(()=>null);if(t){let r=Number(t.trim());if(Number.isInteger(r)&&r>0&&bu(r))return}await bt(e.socketPath,{force:!0}),await bt(e.pidPath,{force:!0})}async function Vn(e){let t=await Ru(e).catch(()=>null);return t?(t.end(),!0):!1}async function yu(e){await Tu(e,{id:1,type:"shutdown"}).catch(()=>null)}async function BT(e){let t=await Bo(e.pidPath,"utf8").catch(()=>null),r=Number(t?.trim());if(!Number.isInteger(r)||r<=0||!bu(r)){await bt(e.socketPath,{force:!0});return}try{process.kill(r,"SIGTERM")}catch{await bt(e.socketPath,{force:!0})}}async function VT(e){return Tu(e,{id:1,type:"ping"})}function Tu(e,t){return new Promise((r,n)=>{let s=pu(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)}
137
- `)),s.once("error",l=>{a(),n(l)}),s.on("data",l=>{i+=String(l);let c=i.indexOf(`
138
- `);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 uu(e,t){let r=Date.now();for(;Date.now()-r<t;){if(!await Vn(e))return;await Vo(50)}}function Ru(e){return new Promise((t,r)=>{let n=pu(e);n.once("connect",()=>t(n)),n.once("error",r)})}function KT(e,t){return new Promise((r,n)=>{e.once("error",n),e.listen(t,r)})}function Rt(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
139
- `)}catch{}}function bu(e){try{return process.kill(e,0),!0}catch{return!1}}function Vo(e){return new Promise(t=>setTimeout(t,e))}function GT(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var Ko=["Runners","Feature Previews","Error Log","Help"],Su={agentActivityIndicators:"Agent activity indicators",agentOrchestration:"Agent orchestration"};function Go(e,t){return j.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 vu(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 Iu(e){return ge.map(t=>`${k.previews.isEnabled(e,t)?"[x]":"[ ]"} ${Su[t]}`)}function Cu(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function Au(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(Ko.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:Kn(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"error-log"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function Eu(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(!Kn(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:`${Su[n]} ${s?"enabled":"disabled"}.`}}}function xu(e,t,r,n){if(e.pathEdit)return HT({...e,pathEdit:e.pathEdit},t,r);let s=Go(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=j[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:a,value:t.runners?.[a]?.path??""}}}}if(!Kn(r))return{kind:"noop",state:e};let i=j[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 HT(e,t,r){if(r==="ESCAPE")return{kind:"render",state:Pu({...e,message:null})};if(r==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(Kn(r)){let n=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:n,path:s.length>0?s:null,state:Pu({...e,message:s.length>0?`${k.runners.getProfile(n).displayName} executable saved.`:`${k.runners.getProfile(n).displayName} executable reset to default.`})}}return zT(r)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${r}`}}}:{kind:"noop",state:e}}function Pu(e){let t={...e};return delete t.pathEdit,t}function Kn(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
140
- `}function zT(e){return e.length===1&&e>=" "&&e!==""}import Dr from"node:path";function Du(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 Ou="\u{F024B} ",$u="\u{F0DCF} ",Nu="\u25CB",Ho="\uEA64",Mu="\uEAFE",Lu="\uEBDA",zo="\u25CB",Yo="\u25CF",Jo="\u2713",Xo="\u2715";function _u(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 Gn=150,ju=6;var zn="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=XT(t,e),s=t.repos.find(R=>R.id===e.selectedRepoId)??t.repos[0]??null,i=n?t.tasks.filter(R=>R.workspaceId===n.id):t.tasks,o=n?.kind==="project"?i:s?i.filter(R=>R.repoId===s.id):[],a=o.find(R=>R.id===e.selectedTaskId)??o[0]??null,l=a?.type==="project",c=DR(t.tasks),d=eR(e,a),u=ZT(e,a,d,r),g=u.find(R=>R.id===d)??u[0]??{id:"agent",label:"CODEX"},f=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`:Ir(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===$?"\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:Dr.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${Dr.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:w},leftTree:YT(e,t,r),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(R=>OR(R,c[R])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":g.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:p,agent:w},centerTranscript:QT(d,e,s,a,e.workspaceBrowser,f,n),tabs:u,rightContext:xR(s,a),rightInspection:mR(e,a,f)}}function YT(e,t,r){let n=[{text:"WORKSPACES",muted:!0,panelHeader:!0,focused:e.focusedRegion==="tasks"}];if(!t.workspaces)return JT(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{task:d,visualDepth:u}of Sr(c)){let g=e.selectedLeftItemId===`task:${d.id}`,f=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,p={id:`task:${d.id}`,taskId:d.id,text:r?f:`${g?"\u25B8":"\u2022"} ${f}`,indent:u===0?2:4,selected:g,focused:g&&e.focusedRegion==="tasks",...r?{activity:Wt(d,r.snapshots,r.now),activityAnimationFrame:r.animationFrame}:{}},w=Vu(d);w&&(p.prBadge=w),n.push(p)}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(g=>g.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 JT(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{task:u,visualDepth:g}of Sr(l)){let f=t.selectedLeftItemId===`task:${u.id}`,p=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,w={id:`task:${u.id}`,taskId:u.id,text:s?p:`${f?"\u25B8":"\u2022"} ${p}`,indent:g===0?2:4,selected:f,focused:f&&t.focusedRegion==="tasks",...s?{activity:Wt(u,s.snapshots,s.now),activityAnimationFrame:s.animationFrame}:{}},R=Vu(u);R&&(w.prBadge=R),e.push(w)}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 XT(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 QT(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,g)=>{let f=g===s.selectedIndex?"\u25B8":" ",p=u.kind==="repo"?" [git repo]":"/";return`${f} ${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===$&&t.openInspectionKind==="file"?nR(n,i,t.fileScrollOffset):e===$&&t.openInspectionKind==="diff"?sR(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 ZT(e,t,r,n){let s=t?.ptyTabs.map(o=>({id:o.id,label:tR(o),...o.kind==="agent"&&n&&t?{activity:Ye(t,o.id,n.snapshots,n.now),activityAnimationFrame:n.animationFrame}:{}}))??[];if(!t)return[{id:zn,label:"EMPTY",active:r===zn,focused:e.focusedRegion==="center"&&r===zn}];let i=e.openInspectionKind||r===$?[{id:$,label:rR(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===r,focused:e.focusedRegion==="center"&&o.id===r}))}function eR(e,t){return t?t.ptyTabs.some(r=>r.id===e.activeTab)||e.activeTab===$&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(r=>r.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??$:e.selectedPtyTabId&&t.ptyTabs.some(r=>r.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??$:zn}function tR(e){return e.title.toUpperCase()}function rR(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,r=t?Dr.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${r} \u0394`:r}function nR(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=Bu(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:""},...iR(n.lines,r,s)]}function sR(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=Bu(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:""},...oR(n.lines,r,s)]}function ke(e){return e.map(t=>({text:t}))}function iR(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}},...Qo(i,r)],tone:"default"}})}function oR(e,t,r){let n=aR(e),s=Math.max(0,Math.min(t,Math.max(0,n.length-1)));return n.slice(s).map(i=>lR(i,r))}function aR(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 lR(e,t){let r=Fu(e.oldNumber),n=Fu(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?dR(Qo(e.text,t),i.bg,i.fallbackFg):Qo(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 Fu(e){return e===null?" ":String(e).padStart(4," ")}function Bu(e){let t=Dr.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 Qo(e,t){return t==="diff"?cR(e):t==="markdown"?uR(e):t==="json"?Zo(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?Zo(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 cR(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 dR(e,t,r){return e.map(n=>({text:n.text,style:{...n.style??{fg:r},bg:t}}))}function uR(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:z.markup,bold:!0}}]:Zo(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function Zo(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:pR(i)}),n=o+i.length}return n<e.length&&r.push({text:e.slice(n)}),r.length>0?r:[{text:e}]}function pR(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 mR(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"?Ku(t.repoTargets??[]):s?.pullRequest??(t?D(t):null),o=[fR(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=zu(e,t),l=ea(e,r),c=yR([{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,...CR(e,r)]}:{title:"",rows:[...o,...ea(e,r)]}}function fR(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=ta(t),o=ra(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function Wu(e){return[{text:" "},ta(e),{text:" "},ra(e)]}function Vu(e){if(e.type==="project"&&e.repoTargets?.length){let r=Ku(e.repoTargets);return r?Wu(r):null}let t=D(e);return t?.number?Wu(t):null}function Ku(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=hR(r);return{number:-1,status:gR(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 gR(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 hR(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 ta(e){return!e||!e.number?{text:Nu,style:{fg:"565f89"}}:e.status==="merged"?{text:Mu,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:Lu,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:Ho,style:{fg:"565f89"}}:{text:Ho,style:{fg:"9ece6a"}}}function ra(e){return e?.aggregateReadiness?qu(e.aggregateReadiness):qu(Gu(e))}function qu(e){return e==="failed"?{text:Xo,style:{fg:"f7768e"}}:e==="pending"?{text:Yo,style:{fg:"e0af68"}}:e==="success"?{text:Jo,style:{fg:"9ece6a"}}:{text:zo,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":wR(e)?"success":"pending":"pending"}function wR(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 zu(e,t){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return kR(e,t);let r=D(t),n=Ju("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 Hn=32;function kR(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,g=Hn-u.length-1,f=c.length>g?c.slice(0,g-1)+"\u2026":c,p=Hn-f.length-u.length;r.push({id:`project-review:${o.repoId}`,text:f+" ".repeat(Math.max(1,p))+u,selected:a,focused:l,muted:!0})}else{let d=ta(o.pullRequest),u=ra(o.pullRequest),g=`${d.text} ${u.text}`,f=Hn-g.length-1,p=c.length>f?c.slice(0,f-1)+"\u2026":c,w=Hn-p.length-g.length,R=p+" ".repeat(Math.max(1,w));r.push({id:`project-review:${o.repoId}`,text:R+g,selected:a,focused:l,segments:[{text:R},{...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(...Ju("target",i.branch,i.pullRequest))),r}function Yu(e,t,r=null){return 3+zu(e,t).length+ea(e,r).length}function Ju(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=TR(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:RR(r.reviewDecision,r.mergeStateStatus)}}]}):s.push({id:n("pr-merge"),text:c,muted:!0}),s.push({id:n("pr-synced"),text:`synced ${Xu(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(bR)):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,g)=>PR(u,n(`comment:${g}`))))),s}function yR(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 TR(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function RR(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function Xu(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 bR(e){let{icon:t,color:r}=vR(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," ")} ${IR(e.status)}`,color:r,muted:!1}}function PR(e,t){let r=e.author??"unknown",n=e.createdAt?` \xB7 ${Xu(e.createdAt)}`:"",s=SR(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 SR(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 vR(e){switch(e){case"success":return{icon:Jo,color:"9ece6a"};case"pending":return{icon:Yo,color:"e0af68"};case"failed":return{icon:Xo,color:"f7768e"};case"skipped":return{icon:zo,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function IR(e){return e==="success"?"passing":e==="failed"?"failing":e}function CR(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=na(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)?Ou:$u:Du(l.label),g=l.kind==="directory"?"7aa2f7":_u(l.label),f=" ".repeat(l.depth),p=g?{text:u,style:{fg:g}}:{text:u},w=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:d?{text:l.label,style:{fg:d}}:{text:l.label},R=[{text:f},p,w];return{id:l.path,text:`${f}${u}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:R}})]}function na(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 ea(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(AR(t))return ER(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=>Qu(i,e,t))))}return r}function AR(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function ER(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=>Qu(c,e,t,s.length+1))))}}return r}function Qu(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 xR(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:Dr.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 DR(e){return e.reduce((t,r)=>(t[r.runner]+=1,t),{codex:0,cursor:0,claude:0})}function OR(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function Zu(e,t,r,n,s=null){if(s)return $R(e,t,r,n,s);let i=So(e,t,{centerOnly:n});return NR(r,i)?{output:jn(i.rows,r.rows,i.row,i.column),region:i}:null}function $R(e,t,r,n,s){let i=Md(e,t,s,{centerOnly:n});if(!i||!MR(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 NR(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function MR(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function ep(e,t,r){let n={...e},s="";for(let i of r){let o=e[i],a=t[i];if(!LR(o,a))return null;!o||!a||(s+=jn(a.rows,o.rows,a.row,a.column),n[i]=a)}return{output:s,regions:n}}function LR(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 _R=["tasks","center","inspector"];function jR(e,t,r){if(t==="ESCAPE")return P({state:{...e,fileSearchQuery:null},changed:!0});if(t==="BACKSPACE"||t==="DELETE"){let n=e.fileSearchQuery??"";return P({state:{...e,fileSearchQuery:n.slice(0,-1)},changed:!0})}if(t==="UP"||t==="k"||t==="DOWN"||t==="j")return ia(e,t==="UP"||t==="k"?-1:1,r);if(t==="ENTER")return aa({...e,fileSearchQuery:null},t,r);if(t.length===1&&t>=" "){let n=(e.fileSearchQuery??"")+t;return P({state:{...e,fileSearchQuery:n},changed:!0})}return P({state:e})}function aa(e,t,r={leftItemIds:[]}){if(e.inputMode==="terminal")return Rd(t)?P({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):P({state:e});if(e.fileSearchQuery!==null)return jR(e,t,r);if(t==="/"&&e.focusedRegion==="inspector"&&e.inspectionMode==="files")return P({state:{...e,fileSearchQuery:""},changed:!0});if(t==="q"||t==="Q")return P({state:e,exit:!0});if(t==="ESCAPE")return P({state:{...e,actionMessage:null},changed:e.actionMessage!==null,pause:!0});if(t==="n"||t==="N")return P({state:{...e,focusedRegion:"tasks",actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0});if((t==="r"||t==="R")&&e.focusedRegion==="tasks"&&(In(e.selectedLeftItemId)||Cn(e.selectedLeftItemId)))return P({state:{...e,selectedRunner:vn(e.selectedRunner,r.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return tp(e,1);if(t==="SHIFT_TAB"||t==="[")return tp(e,-1);if(t==="z"||t==="Z")return P({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===$?nt(e,-1,r):ia(e,-1,r);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===$?nt(e,1,r):ia(e,1,r);if(t==="PAGE_UP")return nt(e,-(r.pageRows??10),r);if(t==="PAGE_DOWN")return nt(e,r.pageRows??10,r);if(t==="MOUSE_WHEEL_UP")return nt(e,-3,r);if(t==="MOUSE_WHEEL_DOWN")return nt(e,3,r);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let n=r.enabledRunnerIds??j,s=e.centerTabRunner?n.indexOf(e.centerTabRunner):-1,i=s===n.length-1?null:n[s+1];return P({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=GR(e,t);return P({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 P({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0});if(t==="o"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review"&&e.selectedTaskId)return P({state:e,openPrUrl:!0});if(t==="X"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return P({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Ir(e.selectedLeftItemId)&&e.selectedTaskId)return P({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Id(e.selectedLeftItemId)&&e.selectedWorkspaceId)return P({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&sp(e.activeTab,r.ptyTabIds??[]))return P({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return sa(e,-1,r.centerTabIds);if(e.focusedRegion==="inspector")return rp(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return sa(e,1,r.centerTabIds);if(e.focusedRegion==="inspector")return rp(e,1)}if(he(t)){if(e.focusedRegion==="tasks"&&(In(e.selectedLeftItemId)||Cn(e.selectedLeftItemId))){let n=wo(e.selectedLeftItemId),s=ko(e.selectedLeftItemId);return P({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 P({state:{...e,actionMessage:null},changed:!0,openWorkspaceBrowser:!0});if(e.focusedRegion==="tasks"&&Ir(e.selectedLeftItemId)&&e.selectedTaskId){let n=e.selectedPtyTabId??e.activeTab;return P({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:n,selectedPtyTabId:n,preferredPtyTabKind:Kt(n)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&sp(e.activeTab,r.ptyTabIds??[])&&e.selectedTaskId)return P({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:Kt(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===$)return P({state:{...e,actionMessage:null},changed:!0,refreshInspection:!0});if(e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="files"){let n=e.selectedFileTreePath??e.selectedFilePath;if(n&&(r.fileTreeDirectoryIds??[]).includes(n))return P({state:qR({...e,selectedFileTreePath:n}),changed:!0});let s=n&&(r.fileTreeFileIds??[]).includes(n)?n:e.selectedFilePath;return P({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:$,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?P({state:{...e,selectedDiffPath:n,activeTab:$,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!r.projectTargetIds?.length?P({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):P({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?P({state:e}):e.selectedActionId==="refresh-checks"?P({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?P({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):P({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return P({state:e})}function nt(e,t,r){if(t===0)return P({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?ip(e,t,r):e.inspectionMode==="review"?np(e,"reviewScrollOffset",t,r.reviewRowCount??100,r.pageRows):P({state:e});if(e.focusedRegion==="center"&&e.activeTab===$){if(e.openInspectionKind==="file")return np(e,"fileScrollOffset",t,r.fileLineCount??0,r.pageRows);if(e.openInspectionKind==="diff")return UR(e,t,r)}return P({state:e})}function tp(e,t){return Yn(e,"focusedRegion",_R,t)}function sa(e,t,r){let n=Yn(e,"activeTab",r&&r.length>0?r:HR(e),t);return!n.changed||Pd(n.state.activeTab)?n:{...n,state:{...n.state,selectedPtyTabId:n.state.activeTab,preferredPtyTabKind:Kt(n.state.activeTab)??n.state.preferredPtyTabKind}}}function ia(e,t,r){if(e.focusedRegion==="tasks")return FR(e,t,r.leftItemIds);if(e.focusedRegion==="center")return sa(e,t,r.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return ip(e,t,r);if(r.projectTargetIds?.length){let s=oa(e,"selectedProjectTargetId",r.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let n=oa(e,"selectedDiffPath",r.diffPathIds??[],t,!0);return n.changed?{...n,state:{...n.state,activeTab:$,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:Yn(e,"selectedActionId",hd,t)}return Yn(e,"selectedActionId",mo,t)}function FR(e,t,r){let n=oa(e,"selectedLeftItemId",r,t);if(!n.changed)return n;let s=ho(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=wo(n.state.selectedLeftItemId);if(i)return{...n,state:{...n.state,selectedRepoId:i}};let o=ko(n.state.selectedLeftItemId);return o?{...n,state:{...n.state,selectedWorkspaceId:o}}:n}function WR(e,t){if(e.inspectionMode===t)return P({state:e});let r=t==="files"?"file":e.openInspectionKind,n=t==="files"?$:e.activeTab;return P({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 rp(e,t){return WR(e,KR(e.inspectionMode,fo,t))}function ip(e,t,r){let n=r.fileTreeRowIds&&r.fileTreeRowIds.length>0?r.fileTreeRowIds:r.filePathIds??[];if(n.length===0)return P({state:e});let s=e.selectedFileTreePath??e.selectedFilePath??n[0]??null,i=n.indexOf(s??""),o=je(i===-1?0:i+t,0,n.length-1),a=n[o]??null;if(a===e.selectedFileTreePath)return P({state:e});let l=a!==null&&(r.fileTreeFileIds??r.filePathIds??[]).includes(a);return P({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?$:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function qR(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 np(e,t,r,n,s=10){let i=Math.max(0,n-Math.max(1,s)),o=je(e[t]+r,0,i);return o===e[t]?P({state:e}):P({state:{...e,[t]:o,actionMessage:null},changed:!0})}function UR(e,t,r){if(r.diffPathRanges&&r.diffPathRanges.length>0)return BR(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=je(o,0,i);return d===e.diffScrollOffset?P({state:e}):P({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}let l=a.indexOf(e.selectedDiffPath);if(l===-1){let d=je(o,0,i);return d===e.diffScrollOffset?P({state:e}):P({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}if(t>0&&o>i){let d=a[l+1]??null;return d?P({state:{...e,selectedDiffPath:d,activeTab:$,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===i?P({state:e}):P({state:{...e,diffScrollOffset:i,actionMessage:null},changed:!0})}if(t<0&&o<0){let d=a[l-1]??null;return d?P({state:{...e,selectedDiffPath:d,activeTab:$,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?P({state:e}):P({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let c=je(o,0,i);return c===e.diffScrollOffset?P({state:e}):P({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function BR(e,t,r){let n=r.diffLineCount??0,s=r.pageRows??10,i=Math.max(0,n-Math.max(1,s)),o=je(e.diffScrollOffset+t,0,i),a=VR(r.diffPathRanges??[],o)??e.selectedDiffPath;return o===e.diffScrollOffset&&a===e.selectedDiffPath?P({state:e}):P({state:{...e,diffScrollOffset:o,selectedDiffPath:a,actionMessage:null},changed:!0})}function VR(e,t){return e.find(r=>t>=r.start&&t<r.end)?.path??e.at(-1)?.path??null}function Yn(e,t,r,n){let s=r.indexOf(e[t]),i=je(s+n,0,r.length-1),o=r[i];return!o||o===e[t]?P({state:e}):P({state:{...e,[t]:o,actionMessage:null},changed:!0})}function oa(e,t,r,n,s=!1){if(r.length===0)return P({state:e});let i=r.indexOf(e[t]??r[0]??""),o=je(i===-1?0:i+n,0,r.length-1),a=r[o]??null;return a===e[t]?P({state:e}):P({state:{...e,[t]:a,actionMessage:null},changed:!0,refreshInspection:s})}function KR(e,t,r){let n=t.indexOf(e);return t[je(n+r,0,t.length-1)]??e}function P(e){return{state:e.state,changed:e.changed??!1,exit:e.exit??!1,pause:e.pause??!1,attachTerminal:e.attachTerminal??!1,detachTerminal:e.detachTerminal??!1,beginTaskPrompt:e.beginTaskPrompt??!1,openWorkspaceBrowser:e.openWorkspaceBrowser??!1,createWorkspaceTask:e.createWorkspaceTask??!1,createPtyTab:e.createPtyTab??!1,createPtyTabKind:e.createPtyTabKind??null,createPtyTabRunner:e.createPtyTabRunner??null,closePtyTab:e.closePtyTab??!1,refreshPullRequestChecks:e.refreshPullRequestChecks??!1,closeTask:e.closeTask??!1,removeWorkspace:e.removeWorkspace??!1,refreshInspection:e.refreshInspection??!1,openPrUrl:e.openPrUrl??!1}}function sp(e,t){return t.includes(e)}function GR(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Kt(e.activeTab)??e.preferredPtyTabKind}function HR(e){return[e.selectedPtyTabId,e.openInspectionKind?$:null].filter(t=>typeof t=="string")}function je(e,t,r){return Math.min(r,Math.max(t,e))}var op=async(e,t,r,n)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await n.queueTaskMutation(async()=>E(n.paths,e.selectedTaskId,i=>{let o=t??zR(i,e.activeTab,e.preferredPtyTabKind),a=dp(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"}`}}},ap=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 E(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}`}}},lp=async(e,t)=>{let r=e.selectedTaskId;r&&await t.queueTaskMutation(async()=>{await E(t.paths,r,n=>!n.ptyTabs.some(s=>s.id===e.activeTab)||n.selectedPtyTabId===e.activeTab?n:{...n,selectedPtyTabId:e.activeTab})})},cp=async(e,t)=>{let r=e.ptyTabs.find(s=>s.kind==="agent")??null;if(r)return await t.queueTaskMutation(async()=>{await E(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=dp(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await E(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 zR(e,t,r){return e.ptyTabs.find(n=>n.id===t)?.kind??r}function dp(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(f=>f.id)),c=1,d=a;for(;l.has(d);)c+=1,d=`${a}-${c}`;let u=new Date().toISOString(),g=r&&r!==e.runner?r:void 0;return{id:d,kind:t,...g?{runner:g}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,n):[],createdAt:u,updatedAt:u}}var Yt=class extends Error{task;constructor(t,r){super(t),this.name="InteractiveTaskStartupError",this.task=r}},up=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});k.previews.isEnabled(s.config,"agentOrchestration")&&await Xe(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=pt();mt(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 Yt(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}},pp=async(e,t,r)=>{await r.queueTaskMutation(async()=>{await r.taskService.markRunnerFailed(r.paths,e,t)})},mp=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 tr(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}`}}},fp=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(r=>tr(t.paths,r.id)))),Or=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 gp=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 hp=async(e,t,r)=>{let n=k.runners.setRunnerEnabled(r.config,e,t);return await k.save(r.paths,n),n},wp=async(e,t,r)=>{let n=k.runners.setRunnerPath(r.config,e,t);return await k.save(r.paths,n),n},kp=async(e,t,r)=>{let n=k.previews.setEnabled(r.config,e,t);return await k.save(r.paths,n),n};var YR=250;function Fe(e,t){return e.find(r=>r.id===t.selectedTaskId)??null}function Pt(e,t){return _e(t,e.ptyRuntime.getViewState(Jt(e,t)))}function Jt(e,t){let r=Fe(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 Pt(e,Cd(t,e.model))}function yp(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 Tp(e,t,r){return yp(e,t,r?{tone:"success",message:r}:null)}function V(e,t,r){return yp(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 q(e,t){if(!e.uiStateFile)return;e.runtimeState=yd(e.runtimeState,t);let r=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>Ue({uiStateFile:e.uiStateFile},r),()=>Ue({uiStateFile:e.uiStateFile},r)),e.persistQueue.catch(()=>{})}function JR(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:T,workspaceService:Q,queueTaskMutation:t=>JR(e,t)}}function la(e,t){let r=Fe(e.model.tasks,t),n=e.model.inspection,s=n&&n.taskId===r?.id?n:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?na(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:Tt(e.model),centerTabIds:vd(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:Yu(t,r,s),pageRows:Math.max(5,ce(e.activeTerminal.width,e.activeTerminal.height).height-W.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:r?.repoTargets?.map(a=>a.repoId)??[]}}async function Rp(e,t){await lp(t,G(e))}async function te(e){e.model=await Gt(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 Xt(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 Jn(e,t){let r=++e.inspectionRefreshSequence,n=yo(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 sd(n,s,a);if(r!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await Gt(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)},q(e,e.state.shell),e.render())}function bp(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)&&Jn(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()})},YR))}function Pp(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=nt(e.state.shell,r,la(e,e.state.shell));if(n.changed){if(n.refreshInspection){e.state={mode:"main",shell:y(e,n.state)},q(e,e.state.shell),e.render(),Jn(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)},q(e,e.state.shell),e.render()}},16)))}function ca(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function da(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 vp(e){da(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:y(e,e.state.shell)},e.render())})}async function Ip(e,t){let r=y(e,t),n=Fe(e.model.tasks,r),s=Jt(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 _e(r,i);let o=await e.ptyRuntime.ensureSession(n.id,s,et(ce(e.activeTerminal.width,e.activeTerminal.height)));return _e({...r,inputMode:"control"},o)}function ua(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 pa(e,t){try{let r=y(e,t),n=Fe(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 Sp(e,n),await te(e),s=n.selectedPtyTabId)}n&&!s&&(n=await Sp(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:_e({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},q(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,et(ce(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=tt(s),e.lastTerminalKey=null,e.state={mode:"main",shell:_e({...i,inputMode:"terminal"},o)},q(e,e.state.shell)}catch(r){let n=K(e,"attach PTY",r,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&tt(t.selectedPtyTabId)&&(await XR(e,t.selectedTaskId,n).catch(()=>{}),await te(e).catch(()=>{})),e.state={mode:"main",shell:V(e,Td(y(e,t),n),n)},q(e,e.state.shell)}e.render()}async function XR(e,t,r){await pp(t,r,G(e))}async function Cp(e,t,r,n){let s=y(e,t),{nextShell:i}=await op(s,r,n,G(e));return await te(e),y(e,{...s,...i})}async function Ap(e,t){let r=y(e,t),{closedTab:n,nextShell:s}=await ap(r,G(e));return e.ptyRuntime.disposeSession(n.id),await te(e),y(e,{...r,...s})}async function Ep(e,t){let r=y(e,t),n=Tt(e.model),s=n.indexOf(r.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await mp(r,G(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await te(e),y(e,{...r,...o,selectedLeftItemId:QR(n,Tt(e.model),s)})}async function xp(e,t){let r=y(e,t),{nextShell:n}=await gp(r,G(e));return await te(e),y(e,{...r,...n})}async function Sp(e,t){return cp(t,G(e))}function Xn(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:Pt(e,e.state.shell)},e.render())},16))}function QR(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 Op(e,t,r){if(r?.aborted||e.state.mode!=="main")return;let n=Dp(e),s=t.takeDueTasks(e.model.tasks,n);if(s.length!==0)try{let i=await fp(s,G(e));if(r?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)Xt(e,o);t.recordSuccess(i,Dp(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,Or("background PR polling",i,G(e)))}}function Dp(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function $p(e,t){let r=y(e,t),n=Fe(e.model.tasks,r),s=null,i=null;if(n?.type==="project"&&n.repoTargets?.length){let o=await T.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 T.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: ${D(a)?.requiredChecks.length??0} reported`)}return y(e,{...Tp(e,r,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import nb from"node:path";import{readdir as ZR,stat as eb}from"node:fs/promises";import Np from"node:path";async function tb(e){let t=await ZR(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 rb(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 Mp(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(r=>r.name.toLowerCase().includes(t))}async function Lp(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 Qn(e,t){let r=await tb(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 rb(e){let t=Np.join(e,".git");return await eb(t).catch(()=>null)!==null}function _p(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function jp(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function sb(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 up(t.selectedRepoId,t.selectedWorkspaceId,r,t.selectedRunner,G(e));n=s.task,Xt(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??Kd(n,"agent"),et(ce(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=tt(i.selectedPtyTabId),e.state={mode:"main",shell:_e(i,o)},q(e,e.state.shell)}catch(s){s instanceof Yt&&(n=s.task);let i=K(e,"create task",s,"Failed to create task.");n&&!(s instanceof Yt)?(await E(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 E(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 ib(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)){sb(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:vn(r.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}bd(t)&&(e.state={mode:"main",shell:y(e,{...r,taskPromptInput:`${r.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function ob(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=Mp(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"){Qn(e,nb.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")){Qn(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},q(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 ab(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let r=Au(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;lb(e,n)}}}async function lb(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 cb(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let r=xu(_p(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"?hp(r.runner,r.enabled,G(e)):wp(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:{..._p(e),message:i}},e.render()})}function db(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let r=Eu(jp(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}kp(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:{...jp(e),message:s}},e.render()})}}function Fp(e,t){let r=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){ib(e,r);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){ob(e,r);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(r==="F"){pb(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=aa(e.state.shell,r,la(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)},q(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)},q(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&he(r)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Er(r);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(ub(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){Xn(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)},q(e,e.state.shell),e.render();return}if(n.openWorkspaceBrowser){Qn(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){Cp(e,n.state,n.createPtyTabKind,n.createPtyTabRunner).then(s=>{pa(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){Ap(e,n.state).then(s=>{e.state={mode:"main",shell:s},q(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){$p(e,n.state).then(s=>{e.state={mode:"main",shell:s},q(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=Fe(e.model.tasks,n.state),i=s?D(s)?.url??null:null;i?Lp(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){Ep(e,n.state).then(s=>{e.state={mode:"main",shell:s},q(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){xp(e,n.state).then(s=>{e.state={mode:"main",shell:s},q(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){pa(e,n.state);return}if(n.refreshInspection){if(e.state={mode:"main",shell:y(e,n.state)},q(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){bp(e,e.state.shell);return}Jn(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)},Rp(e,e.state.shell).catch(()=>{}),q(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"){ab(e,r);return}if(e.state.variant==="runners"){cb(e,r);return}if(e.state.variant==="previews"){db(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;Ip(e,s).then(i=>{e.state.mode!=="main"||e.state.shell!==s||(e.state={mode:"main",shell:i},q(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)},q(e,e.state.shell),e.render()})}):vp(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 Wp(e,t){let r=Qd(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=Er(i);if(o){Up(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(Do(i)){e.pendingTerminalKeySequence.raw=i,qp(e);return}Zn(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"})},q(e,e.state.shell),e.render();return}let n=zd(r);if(n!==0){Xn(e,n);return}let s=Er(r);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&r!=="\r"&&r!==`
141
- `&&r!==`\r
142
- `&&(e.suppressTerminalEnterOnAttach=!1),Xd(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,r)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(r)}function ub(e,t){if(e.pendingTerminalKeySequence){let r=Yd(t);if(r!==null){let n=`${e.pendingTerminalKeySequence.raw}${r}`,s=Er(n);if(s)return Up(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(Do(n))return e.pendingTerminalKeySequence.raw=n,qp(e),!0}return Zn(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>Zn(e),30)},!0)}function qp(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>Zn(e),30))}function Zn(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 Bp(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){Pp(e,xo(t));return}let r=xo(t);r!==0&&Xn(e,r)}function pb(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var Vp=1e3,fb=mb(import.meta.url),gb=fb("terminal-kit"),hb=gb.terminal;function ma(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Kp(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 wb(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 It({uiStateFile:e.uiStateFile}):null,o=await Gt(t,void 0,s),a=vr(kd(i,n),o);o=await Gt(t,a,s);let l={current:o},c=()=>{},d=()=>{},u=()=>{},g={workspaceRoot:t,onUpdate:p=>c(p),onActivity:p=>d(p),onActivityRemoved:p=>u(p),resolveSessionSpec:(p,w)=>Vd(l.current,w,t)},f=e.ptyRuntime??await fu({...g,paths:r,activityEnabled:k.previews.isEnabled(n,"agentActivityIndicators")});return new Promise(p=>{let w=e.terminal??hb,R=null,x=null,F=null,U=null,I=null,re=0,We=!1,de=new Map,ye=f.managesPullRequestSync?null:new zt({minimumIntervalMs:(n.github?.watchIntervalSeconds??5)*1e3}),h,st=new rt({resolutionMs:k.previews.isEnabled(n,"agentActivityIndicators")?Gn:Vp,onError:(b,L)=>Or(`heartbeat job "${b}"`,L,G(h))});h={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:vr(a,o)},get model(){return l.current},set model(b){l.current=b},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:f,resolve:p,render:()=>{},renderTaskNavigation:()=>!1,exit:b=>p(b),setAgentActivityEnabled:b=>{st.setResolutionMs(b?Gn:Vp),h.ptyRuntime.setActivityEnabled?.(b)}},h.setAgentActivityEnabled(k.previews.isEnabled(n,"agentActivityIndicators")),c=b=>{h.state.mode==="main"&&(I=wb(I,b),h.ptyRenderTimer||(h.ptyRenderTimer=setTimeout(()=>{h.ptyRenderTimer=null;let L=I;if(I=null,h.state.mode==="main"){let H=Pt(h,h.state.shell);if(h.state={mode:"main",shell:H},!U||!x){h.render();return}let ue=ce(w.width,w.height),Z={...U,terminal:H.terminal},qe=Zu(ue,Z,x,H.centerZoomed,L?.kind==="rows"?L.rowIndices:null);if(!qe){h.render();return}qe.output.length>0&&w.noFormat(qe.output),U=Z,x=qe.region,F&&(F={...F,center:qe.region}),R=null,w.hideCursor(!0)}},0)))},d=b=>{h.state.mode==="main"&&k.previews.isEnabled(h.config,"agentActivityIndicators")&&tt(b.tabId)&&de.get(b.tabId)!==De(b.tabId,[b],Date.now())&&h.render()},u=b=>{h.state.mode==="main"&&k.previews.isEnabled(h.config,"agentActivityIndicators")&&tt(b)&&de.get(b)!=="idle"&&h.render()};let Pe=Promise.resolve(),St=b=>{Pe=Pe.then(async()=>{let L=await Promise.all([...new Set(b)].map(H=>T.getTask(h.paths,H)));for(let H of L)Xt(h,H);h.state.mode==="main"?h.state={mode:"main",shell:y(h,h.state.shell)}:h.state={...h.state,shell:y(h,h.state.shell)},h.render()}).catch(L=>Or("daemon task-state refresh",L,G(h)))};h.ptyRuntime.setTasksChangedHandler?.(St);let $r=b=>{let L=ce(w.width,w.height),H=k.previews.isEnabled(h.config,"agentActivityIndicators"),ue=H?h.ptyRuntime.getActivitySnapshots?.()??[]:[],Z=Date.now(),qe=Uu(y(h,b.shell),h.model,H?{snapshots:ue,now:Z,animationFrame:re}:void 0);if(de.clear(),H)for(let Jp of h.model.tasks)for(let es of Jp.ptyTabs)es.kind==="agent"&&de.set(es.id,De(es.id,ue,Z));let Yp=Nd(L,qe,{centerOnly:b.shell.centerZoomed,focusFlashActive:h.focusFlashUntil!==null&&Date.now()<h.focusFlashUntil});return{data:qe,presentation:Yp}},Nr=(b,L,H,ue)=>{if(!F)return!1;let Z=ep(F,L.regions,H);return Z?(Z.output.length>0&&w.noFormat(Z.output),U=b,F=Z.regions,x=Z.regions.center,R=ue?L.frame:null,w.hideCursor(!0),!0):!1};h.renderTaskNavigation=()=>{if(h.state.mode!=="main"||h.pendingClear)return!1;ua(h),h.ptyRuntime.setPullRequestPollView?.(Gp(h.state)),h.ptyRuntime.setViewedTab?.(Jt(h,h.state.shell));let{data:b,presentation:L}=$r(h.state);return Nr(b,L,["rail","left","center","footer"],!1)},h.render=()=>{ua(h);let b=h.state;h.ptyRuntime.setPullRequestPollView?.(Gp(b)),h.ptyRuntime.setViewedTab?.(b.mode==="main"?Jt(h,b.shell):null);let L=ce(w.width,w.height),H,ue=null;if(b.mode==="main"){let Z=$r(b);if(ue=Z.presentation,H=ue.frame,!h.pendingClear&&Nr(Z.data,ue,["rail","left","center","right","footer"],!0))return;U=Z.data,x=ue.center}else H=b.variant==="boot"?xd(L,{menuIndex:b.menuIndex,optionsMessage:b.optionsMessage,versionText:h.versionText,updateText:h.updateText}):b.variant==="pause"?Dd(L,{menuIndex:b.menuIndex,optionsMessage:b.optionsMessage,versionText:h.versionText,updateText:h.updateText}):b.variant==="options"?Mn(L,{menuIndex:b.menuIndex,optionsMenuItems:Ko}):b.variant==="runners"?Mn(L,{menuIndex:ma(b).menuIndex,optionsMenuItems:Go(h.config,ma(b)),optionsMessage:vu(ma(b)),optionsSubtitle:"Runners"}):b.variant==="previews"?Mn(L,{menuIndex:Kp(b).menuIndex,optionsMenuItems:Iu(h.config),optionsMessage:Cu(Kp(b)),optionsSubtitle:"Feature Previews - Experimental"}):b.variant==="error-log"?$d(L,{errorLogPath:b.errorLog?.path??r.errorLogFile,errorLogLines:b.errorLog?.lines??[]}):Od(L),U=null,x=null,F=null;h.pendingClear&&(w.moveTo(1,1),w.eraseDisplayBelow(),h.pendingClear=!1,R=null),w.noFormat(Zd(H,R)),R=H,F=ue?.regions??null,w.hideCursor(!0)};let Mr=b=>Fp(h,b),fa=b=>Wp(h,b),ga=b=>Bp(h,b),zp=()=>{process.stdout.off("resize",ha),process.off("SIGCONT",wa),w.removeListener("key",Mr),w.removeListener("unknown",fa),w.removeListener("mouse",ga),h.scrollRenderTimer&&(clearTimeout(h.scrollRenderTimer),h.scrollRenderTimer=null),h.inspectionScrollRenderTimer&&(clearTimeout(h.inspectionScrollRenderTimer),h.inspectionScrollRenderTimer=null),h.leftNavInspectionTimer&&(clearTimeout(h.leftNavInspectionTimer),h.leftNavInspectionTimer=null),h.pendingTerminalKeySequence&&(clearTimeout(h.pendingTerminalKeySequence.timer),h.pendingTerminalKeySequence=null),h.ptyRenderTimer&&(clearTimeout(h.ptyRenderTimer),h.ptyRenderTimer=null),h.footerToastTimer&&(clearTimeout(h.footerToastTimer),h.footerToastTimer=null),h.focusFlashTimer&&(clearTimeout(h.focusFlashTimer),h.focusFlashTimer=null),st.stop(),h.ptyRuntime.disposeAll(),w.grabInput(!1),w.hideCursor(!1),w.fullscreen(!1)};h.exit=b=>{zp(),p(b)};let ha=()=>{ca(h),h.state.mode==="main"&&h.state.shell.inputMode==="terminal"&&(h.ptyRuntime.resize(et(ce(w.width,w.height))),h.state={mode:"main",shell:Pt(h,h.state.shell)}),h.render()},wa=()=>{ca(h),h.state.mode==="main"&&h.state.shell.inputMode==="terminal"&&(h.ptyRuntime.resize(et(ce(w.width,w.height))),h.state={mode:"main",shell:Pt(h,h.state.shell)}),h.render()};process.stdout.on("resize",ha),process.on("SIGCONT",wa),w.grabInput(!0),h.inputCaptureMode="control",w.hideCursor(!0),w.fullscreen(!0),w.on("key",Mr),w.on("unknown",fa),w.on("mouse",ga),ye&&st.register({id:"github.pull-requests",intervalMs:1e3,run:b=>Op(h,ye,b)}),st.register({id:"agent.activity-indicators",intervalMs:Gn,run:()=>{if(!k.previews.isEnabled(h.config,"agentActivityIndicators")){re=0,We=!1;return}let b=Date.now(),L=cn(h.model.tasks,h.ptyRuntime.getActivitySnapshots?.()??[],b);(L||We)&&(re=(re+1)%ju,h.state.mode==="main"&&h.render()),We=L}}),st.start(),k.version.checkForUpdate().then(b=>{b.updateAvailable&&b.latest&&(h.updateText=`Update available: v${b.latest}`,h.render())}),h.bootHydrationReady=da(h).catch(()=>{}),h.render()})}async function kb(){try{if(process.argv[2]==="__craig-daemon"){let e=process.argv[3]??process.cwd(),t=ne(e);return await gu(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=process.argv[3]??process.cwd(),t=ne(e);return await hu(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
143
- `),1}return td({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 yb=await kb();process.exit(yb);
269
+ `).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function Ao(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{spawn as bC}from"node:child_process";import{createServer as RC,createConnection as ug}from"node:net";import{openSync as SC}from"node:fs";import{mkdir as PC,readFile as dg,rm as $s,writeFile as IC}from"node:fs/promises";import No from"node:path";var dn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=mu(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:mu(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=mu(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 mu(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as Zh,readFile as _v,rm as hu,stat as xv,writeFile as Fv}from"node:fs/promises";import gu from"node:path";async function yu(e){let t=gu.join(e.runtimeDir,"orchestration-supervisor.lock");await Zh(e.runtimeDir,{recursive:!0});try{await Zh(t)}catch(r){if(!Mv(r))throw r;let s=await _v(gu.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await xv(t).catch(()=>null);if(typeof s?.pid=="number"&&!Lv(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await hu(t,{recursive:!0,force:!0}),yu(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await Fv(gu.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await hu(t,{recursive:!0,force:!0}),r}let n=!1;return{async release(){n||(n=!0,await hu(t,{recursive:!0,force:!0}))}}}function Lv(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 Mv=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";function eg(e,t){switch(e){case"codex":case"cursor":case"claude":return`\x1B[200~${t}\x1B[201~\r`;default:return jv(e)}}function jv(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import qv from"node:path";var Uv={type:"system",component:"orchestration-supervisor"};async function tg(e){let t=qv.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Ls(t)??{version:1,commands:{}},r=await Ke(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of Wv(i))o.has(a)||(await vn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:Uv),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await M(t,n)}function Wv(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 Eo=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new dn({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 yu(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 co(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await tg(this.paths);let t=await Ke(this.paths);for(let n of t){if(n.state==="delivering"){await de.fail(this.paths,n.id,Os("PROMPT_DELIVERY_UNCERTAIN","Craig resumed after prompt delivery began; the prompt was not replayed.",!1,!0));continue}n.state==="queued"&&await this.reconcileCommand(n)}await co(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await de.fail(this.paths,t.id,Os("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let n=await S.getTask(this.paths,t.taskId).catch(i=>{if(i instanceof g&&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 de.fail(this.paths,t.id,Os("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 de.fail(this.paths,t.id,Os("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(this.runtime.hasRunningSession(t.agentTabId)&&!(t.delivery==="when-ready"&&Gt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")){await de.beginDelivery(this.paths,t.id);try{this.runtime.writeToSession(t.agentTabId,eg(r.runner??n.runner,t.prompt.text))}catch(i){await de.fail(this.paths,t.id,Os("PROMPT_DELIVERY_UNCERTAIN",i instanceof Error?i.message:"Prompt delivery failed after it began.",!1,!0));return}await de.completeDelivery(this.paths,t.id)}}},Os=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var Bv={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},Ir=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...Bv,...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 Ue,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=Vv(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(Kv);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 Vv(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 Kv(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as Gv}from"node:fs";var Oo=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=Gv(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=vt(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 Hv={selectedTaskId:null,reviewVisible:!1},Yv={listTasks:async e=>(await S.listTasks(e)).tasks,syncTasks:async(e,t)=>(await S.prs.discoverOrRefreshMany(e,t),Promise.all(t.map(n=>S.getTask(e,n.id))))},$o=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??Yv,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new Ir({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new Oo(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=zv(s);i.length>0&&await this.wake(i)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new dn({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=Hv;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,ng(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)!==ng(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 zv(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=Xv(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&Jv.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 Jv=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),Xv=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function ng(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as aC}from"node:module";import Qv from"@xterm/headless";var Zv=1e3,eC=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function sg(e){return new Qv.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:Zv,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}})}function ig(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function ku(e,t){return new Promise(n=>{e.write(t,n)})}function og(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 d=0;d<e.cols;d+=1){let u=l.getCell(d,s);!u||u.getWidth()===0||c.push({text:u.getChars()||" ",style:rC(u,o+a===i&&d===n.cursorX)})}r.push({segments:tC(nC(c))})}return r}function tC(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&oC(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};ag(n.style)||(s.style=n.style),t.push(s)}return t}function nC(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||!ag(n.style))break;t-=1}return e.slice(0,t)}function rC(e,t){let n={},r=rg(e,"fg"),s=rg(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 rg(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"):eC[s]??sC(s)}function sC(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(iC).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 iC(e){return e===0?0:55+e*40}function oC(e,t){return wu(e)===wu(t)}function wu(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function ag(e){return wu(e)===""}var lC=aC(import.meta.url),cC=/^CTRL_([A-Z])$/,uC="\x1B[6n",dC="\x1B[c",pC="\x1B[?u",fC={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
270
+ `,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:""},Do=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")Tu(i),this.sessions.delete(n);else return this.attachedTabId=n,i.scrollbackLines=0,lg(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(`
271
+ `))&&this.touchActivity(n))}writeKey(t){let n=mC(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&&lg(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&&(Tu(n),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())Tu(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:hC(n),error:n.error,scrolledBack:n.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}createSession(t,n,r,s){let i=this.spawn??yC().spawn,o=sg(r),a=s??this.resolveSessionSpec(t,n),l=bn({...this.env,...a.env??{}}),{executable:c,args:d}=wC(this.shell,a.command,{cwd:a.cwd,env:l}),u=i(c,d,{name:"xterm-256color",cols:r.columns,rows:r.rows,cwd:a.cwd,env:kC(l)}),p={taskId:t,tabId:n,pty:u,terminal:o,status:"running",error:null,disposables:[],scrollbackLines:0,rows:[],renderedScrollbackLines:null,screenDirty:!0,lastActivityAt:Date.now(),exitCode:null};return p.disposables.push(u.onData(h=>{this.touchActivity(p),TC(u,h),ku(p.terminal,h).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p.disposables.push(u.onExit(h=>{p.status="exited",p.exitCode=h.exitCode,p.lastActivityAt=Date.now(),this.notifyActivity(p),ku(p.terminal,`\r
272
+ [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 mC(e){if(e.length===1)return e;let t=fC[e];if(t!==void 0)return t;let n=cC.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function lg(e,t){gC(e.pty,t),ig(e.terminal,t),e.screenDirty=!0}function hC(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=og(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function Tu(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function gC(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function yC(){return lC("node-pty")}function wC(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[Rn(t[0],n),...t.slice(1)].map(cg).join(" ")}; exec ${cg(e)} -l`;return{executable:e,args:["-lc",s]}}function cg(e){return`'${e.replaceAll("'","'\\''")}'`}function kC(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 TC(e,t){for(let n=0;n<bu(t,uC);n+=1)e.write("\x1B[1;1R");for(let n=0;n<bu(t,dC);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<bu(t,pC);n+=1)e.write("\x1B[?0u")}function bu(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 pg=Pn,vC=new Set([pg]),CC=16,AC=250;async function fg(e){let t=Ct(e.paths);await DC(t,e.paths,e.spawnDaemon);let n=await Tg(t.socketPath),r=new Ru(n,e);return await r.ready(),r}async function mg(e,t={}){let n=Ct(e);await PC(e.runtimeDir,{recursive:!0}),await $s(n.socketPath,{force:!0});let r=new Su(e,t),s=RC(i=>r.handleConnection(i));try{await r.start(),await MC(s,n.socketPath),await IC(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 $s(n.socketPath,{force:!0}),await $s(n.pidPath,{force:!0}),await r.stop(),r.disposeAll()}}async function hg(e){let t=Ct(e);return await wg(t.socketPath)?(await FC(t.socketPath),!0):!1}var Ru=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(!yg(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)}
273
+ `);let i=await s;if(!i.ok)throw new Error(i.error);return i}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
274
+ `);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
275
+ `)}}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=$C(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)}}},Su=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 Do({...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??(()=>rn(this.paths,{agentObserver:{daemonAvailable:!0,getSnapshots:()=>this.runtime.getActivitySnapshots(),subscribe:()=>()=>{},close:()=>{}}}));this.pullRequestEventReconciliationEnabled=!!s,this.pullRequestSyncSupervisor=new $o(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 kt.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 Ke(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(`
276
+ `);for(;i!==-1;){let o=n.slice(0,i);n=n.slice(i+1),this.handleLine(t,o),i=n.indexOf(`
277
+ `)}});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{Mn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);Mn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion:pg}:{},...r.type==="getActivitySnapshots"?{activities:this.runtime.getActivitySnapshots()}:{},...s?{view:s}:{}})}catch(s){let i=s instanceof Error?s.message:String(s);Mn(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 qC(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(Pu),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)Mn(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)},AC))}}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&&Mn(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&&Mn(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 Eo(this.paths,this.runtime,{onError:n=>kt.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)},CC))}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=EC(s,n),o=OC(s.view,n);s.view=n,s.rowKeys=n.rows.map(Pu),(i.rows.length>0||o)&&Mn(r,{type:"update",tabId:t,patch:i})}}};function EC(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==Pu(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 OC(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 $C(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function Pu(e){return JSON.stringify(e)}async function DC(e,t,n){if(await NC(e.socketPath,1e3))return;if(await wg(e.socketPath))throw new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly; this client will not replace a live workspace daemon.");await xC(e);let r=t.workspaceRoot;if(n)n(r);else{let{command:o,args:a}=_C(r),l=SC(No.join(t.runtimeDir,"pty-daemon.log"),"a");bC(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 gg(e.socketPath))return;await bg(50)}let i=await dg(No.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${i?`
278
+ ${i.slice(-2e3)}`:""}`)}async function gg(e){let t=await LC(e).catch(()=>null);return t?.ok===!0&&yg(t.protocolVersion)}function yg(e){return e!==void 0&&vC.has(e)}async function NC(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await gg(e))return!0;await bg(50)}return!1}function _C(e){let t=process.argv[1];if(t?.endsWith(".ts")){let r=No.resolve(No.dirname(t),"..","node_modules",".bin","tsx");return{command:Aa("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 xC(e){let t=await dg(e.pidPath,"utf8").catch(()=>null);if(t){let n=Number(t.trim());if(Number.isInteger(n)&&n>0&&jC(n))return}await $s(e.socketPath,{force:!0}),await $s(e.pidPath,{force:!0})}async function wg(e){let t=await Tg(e).catch(()=>null);return t?(t.end(),!0):!1}async function FC(e){await kg(e,{id:1,type:"shutdown"}).catch(()=>null)}async function LC(e){return kg(e,{id:1,type:"ping"})}function kg(e,t){return new Promise((n,r)=>{let s=ug(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)}
279
+ `)),s.once("error",l=>{a(),r(l)}),s.on("data",l=>{i+=String(l);let c=i.indexOf(`
280
+ `);if(c===-1)return;let d=i.slice(0,c);a(),s.end();try{n(JSON.parse(d))}catch(u){r(u instanceof Error?u:new Error(String(u)))}}),s.once("close",()=>a())})}function Tg(e){return new Promise((t,n)=>{let r=ug(e);r.once("connect",()=>t(r)),r.once("error",n)})}function MC(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,n)})}function Mn(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
281
+ `)}catch{}}function jC(e){try{return process.kill(e,0),!0}catch{return!1}}function bg(e){return new Promise(t=>setTimeout(t,e))}function qC(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var Iu=["Runners","Feature Previews","Error Log","Help"],Sg={agentActivityIndicators:"Agent activity indicators",agentOrchestration:"Agent orchestration"};function vu(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 Pg(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 Ig(e){return ze.map(t=>`${k.previews.isEnabled(e,t)?"[x]":"[ ]"} ${Sg[t]}`)}function vg(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function Cg(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(Iu.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:_o(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"error-log"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function Ag(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(ze.length-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(!_o(n))return{kind:"noop",state:e};let r=ze[e.menuIndex]??ze[0],s=!k.previews.isEnabled(t,r);return{kind:"save-enabled",feature:r,enabled:s,state:{...e,message:`${Sg[r]} ${s?"enabled":"disabled"}.`}}}function Eg(e,t,n,r){if(e.pathEdit)return UC({...e,pathEdit:e.pathEdit},t,n);let s=vu(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(!_o(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 UC(e,t,n){if(n==="ESCAPE")return{kind:"render",state:Rg({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(_o(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:r,path:s.length>0?s:null,state:Rg({...e,message:s.length>0?`${k.runners.getProfile(r).displayName} executable saved.`:`${k.runners.getProfile(r).displayName} executable reset to default.`})}}return WC(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function Rg(e){let t={...e};return delete t.pathEdit,t}function _o(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
282
+ `}function WC(e){return e.length===1&&e>=" "&&e!==""}import Ds from"node:path";function Og(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 $g="\u{F024B} ",Dg="\u{F0DCF} ",Ng="\u25CB",Cu="\uEA64",_g="\uEAFE",xg="\uEBDA",Au="\u25CB",Eu="\u25CF",Ou="\u2713",$u="\u2715";function Fg(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 xo=150,Lg=6;var Lo="empty",pe={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function Ug(e,t,n){let r=KC(t,e),s=t.repos.find(y=>y.id===e.selectedRepoId)??t.repos[0]??null,i=r?t.tasks.filter(y=>y.workspaceId===r.id):t.tasks,o=r?.kind==="project"?i:s?i.filter(y=>y.repoId===s.id):[],a=o.find(y=>y.id===e.selectedTaskId)??o[0]??null,l=a?.type==="project",c=IA(t.tasks),d=YC(e,a),u=HC(e,a,d,n),p=u.find(y=>y.id===d)??u[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`:vs(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===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:Ds.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${Ds.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:m},leftTree:BC(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>vA(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:f,agent:m},centerTranscript:GC(d,e,s,a,e.workspaceBrowser,h,r),tabs:u,rightContext:PA(s,a),rightInspection:aA(e,a,h)}}function BC(e,t,n){let r=[{text:"WORKSPACES",muted:!0,panelHeader:!0,focused:e.focusedRegion==="tasks"}];if((t.furyApprovalCount??0)>0&&r.push({text:`\u25CF ${t.furyApprovalCount} Fury approval${t.furyApprovalCount===1?"":"s"} waiting`,indent:1,status:"pending"}),!t.workspaces)return VC(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(d=>d.workspaceId===o.id);if(c.length===0)r.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:d,visualDepth:u}of Ps(c)){let p=e.selectedLeftItemId===`task:${d.id}`,h=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,f={id:`task:${d.id}`,taskId:d.id,text:n?h:`${p?"\u25B8":"\u2022"} ${h}`,indent:u===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:tr(d,n.snapshots,n.now),activityAnimationFrame:n.animationFrame}:{}},m=Bg(d);m&&(f.prBadge=m),r.push(f)}if(o.kind==="project"){let d=`new-task-workspace:${o.id}`,u=e.selectedLeftItemId===d;r.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;r.push({id:d,text:`+ New Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}else{r.push({text:` Repos (${l.length})`,indent:0,muted:!0});for(let d of l.slice(0,6)){let u=t.repos.find(p=>p.id===d);r.push({text:` \xB7 ${u?.name??d}`,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 VC(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(u=>u.repoId===o.id);if(l.length===0)e.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:u,visualDepth:p}of Ps(l)){let h=t.selectedLeftItemId===`task:${u.id}`,f=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,m={id:`task:${u.id}`,taskId:u.id,text:s?f:`${h?"\u25B8":"\u2022"} ${f}`,indent:p===0?2:4,selected:h,focused:h&&t.focusedRegion==="tasks",...s?{activity:tr(u,s.snapshots,s.now),activityAnimationFrame:s.animationFrame}:{}},y=Bg(u);y&&(m.prBadge=y),e.push(m)}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 KC(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 GC(e,t,n,r,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,p)=>{let h=p===s.selectedIndex?"\u25B8":" ",f=u.kind==="repo"?" [git repo]":"/";return`${h} ${u.name}${f}`}),d=s.query!==null?`Search: ${s.query}\u2588`:"";return lt(["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(!n)return lt(["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,d=l?"Project Task":"Task";return lt([`No tasks in ${c}.`,"",`Press n or choose + New ${d} to create one with ${k.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?lt([`${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."]):lt([`${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"?XC(r,i,t.fileScrollOffset):e===K&&t.openInspectionKind==="diff"?QC(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?lt(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):lt(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function HC(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:zC(o),...o.kind==="agent"&&r&&t?{activity:Gt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame}:{}}))??[];if(!t)return[{id:Lo,label:"EMPTY",active:n===Lo,focused:e.focusedRegion==="center"&&n===Lo}];let i=e.openInspectionKind||n===K?[{id:K,label:JC(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function YC(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:Lo}function zC(e){return e.title.toUpperCase()}function JC(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?Ds.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function XC(e,t,n){if(!e)return lt(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return lt(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=Wg(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:""},...ZC(r.lines,n,s)]}function QC(e,t,n){if(!e)return lt(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return lt(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=Wg(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:""},...eA(r.lines,n,s)]}function lt(e){return e.map(t=>({text:t}))}function ZC(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:pe.lineNumber}},{text:" \u2502 ",style:{fg:pe.gutter}},...Du(i,n)],tone:"default"}})}function eA(e,t,n){let r=tA(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>nA(i,n))}function tA(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 nA(e,t){let n=Mg(e.oldNumber),r=Mg(e.newNumber),s=e.kind==="delete"?n:r,i=e.kind==="delete"?{bg:"2a1111",fallbackFg:pe.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:pe.diffAdd}:null,o=`${s} \u2502 ${e.text}`,a=i?sA(Du(e.text,t),i.bg,i.fallbackFg):Du(e.text,t),l=i?{fg:pe.lineNumber,bg:i.bg}:{fg:pe.lineNumber},c=i?{fg:pe.gutter,bg:i.bg}:{fg:pe.gutter};return{text:o,segments:[{text:s,style:l},{text:" \u2502 ",style:c},...a],fullBleed:i!==null}}function Mg(e){return e===null?" ":String(e).padStart(4," ")}function Wg(e){let t=Ds.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 Du(e,t){return t==="diff"?rA(e):t==="markdown"?iA(e):t==="json"?Nu(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?Nu(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 rA(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:pe.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:pe.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:pe.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:pe.diffMeta}}]:[{text:e}]}function sA(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function iA(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:pe.markup,bold:!0}}]:Nu(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function Nu(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:oA(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function oA(e){return e.startsWith("//")||e.startsWith("/*")?{fg:pe.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:pe.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:pe.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:pe.markup}:{fg:pe.keyword}}function aA(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"?Vg(t.repoTargets??[]):s?.pullRequest??(t?V(t):null),o=[lA(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=Hg(e,t),l=_u(e,n),c=fA([{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,...bA(e,n)]}:{title:"",rows:[...o,..._u(e,n)]}}function lA(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 d=c.active?e.focusedRegion==="inspector"||e.focusedRegion==="actions"?"9ece6a":"7aa2f7":"565f89";s.push({text:c.label,style:{fg:d}})}let i=xu(t),o=Fu(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function jg(e){return[{text:" "},xu(e),{text:" "},Fu(e)]}function Bg(e){if(e.type==="project"&&e.repoTargets?.length){let n=Vg(e.repoTargets);return n?jg(n):null}let t=V(e);return t?.number?jg(t):null}function Vg(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=uA(n);return{number:-1,status:cA(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 cA(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 uA(e){let t=e.map(n=>Kg(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 xu(e){return!e||!e.number?{text:Ng,style:{fg:"565f89"}}:e.status==="merged"?{text:_g,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:xg,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:Cu,style:{fg:"565f89"}}:{text:Cu,style:{fg:"9ece6a"}}}function Fu(e){return e?.aggregateReadiness?qg(e.aggregateReadiness):qg(Kg(e))}function qg(e){return e==="failed"?{text:$u,style:{fg:"f7768e"}}:e==="pending"?{text:Eu,style:{fg:"e0af68"}}:e==="success"?{text:Ou,style:{fg:"9ece6a"}}:{text:Au,style:{fg:"565f89"}}}function Kg(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")?Gg(e)?"failed":dA(e)?"success":"pending":"pending"}function dA(e){return!!(e.mergeable&&!e.draft&&!Gg(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function Gg(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function Hg(e,t){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return pA(e,t);let n=V(t),r=zg("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 Fo=32;function pA(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 u=o.failureReason?o.failureReason.slice(0,14):o.status,p=Fo-u.length-1,h=c.length>p?c.slice(0,p-1)+"\u2026":c,f=Fo-h.length-u.length;n.push({id:`project-review:${o.repoId}`,text:h+" ".repeat(Math.max(1,f))+u,selected:a,focused:l,muted:!0})}else{let d=xu(o.pullRequest),u=Fu(o.pullRequest),p=`${d.text} ${u.text}`,h=Fo-p.length-1,f=c.length>h?c.slice(0,h-1)+"\u2026":c,m=Fo-f.length-p.length,y=f+" ".repeat(Math.max(1,m));n.push({id:`project-review:${o.repoId}`,text:y+p,selected:a,focused:l,segments:[{text:y},{...d,text:d.text},{text:" "},{...u,text:u.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(...zg("target",i.branch,i.pullRequest))),n}function Yg(e,t,n=null){return 3+Hg(e,t).length+_u(e,n).length}function zg(e,t,n){let r=u=>`${e}-${u}`;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=mA(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:hA(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${Jg(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(gA)):s.push({id:r("checks-none"),text:n.number?"No GitHub checks reported.":"No checks \u2014 sync after creating a PR.",muted:!0});let d=n.comments??[];return d.length>0&&(s.push({id:r("comments-spacer"),text:""}),s.push({id:r("comments-header"),text:`Review comments (${d.length})`}),s.push(...d.slice(-4).flatMap((u,p)=>yA(u,r(`comment:${p}`))))),s}function fA(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 mA(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function hA(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function Jg(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 gA(e){let{icon:t,color:n}=kA(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," ")} ${TA(e.status)}`,color:n,muted:!1}}function yA(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${Jg(e.createdAt)}`:"",s=wA(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 wA(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 kA(e){switch(e){case"success":return{icon:Ou,color:"9ece6a"};case"pending":return{icon:Eu,color:"e0af68"};case"failed":return{icon:$u,color:"f7768e"};case"skipped":return{icon:Au,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function TA(e){return e==="success"?"passing":e==="failed"?"failing":e}function bA(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=Lu(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,d=c==="A"?"9ece6a":c==="M"?"e0af68":c==="D"?"f7768e":c==="??"?"565f89":void 0,u=l.kind==="directory"?e.collapsedFileTreePaths.includes(l.path)?$g:Dg:Og(l.label),p=l.kind==="directory"?"7aa2f7":Fg(l.label),h=" ".repeat(l.depth),f=p?{text:u,style:{fg:p}}:{text:u},m=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:d?{text:l.label,style:{fg:d}}:{text:l.label},y=[{text:h},f,m];return{id:l.path,text:`${h}${u}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:y}})]}function Lu(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 _u(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(RA(t))return SA(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=>Xg(i,e,t))))}return n}function RA(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function SA(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=>Xg(c,e,t,s.length+1))))}}return n}function Xg(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 PA(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:Ds.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 IA(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0})}function vA(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function Qg(e,t,n,r,s=null){if(s)return CA(e,t,n,r,s);let i=ou(e,t,{centerOnly:r});return AA(n,i)?{output:Ao(i.rows,n.rows,i.row,i.column),region:i}:null}function CA(e,t,n,r,s){let i=_h(e,t,s,{centerOnly:r});if(!i||!EA(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 AA(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function EA(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function Zg(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!OA(o,a))return null;!o||!a||(s+=Ao(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function OA(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 $A=["tasks","center","inspector"];function DA(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 ju(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return Uu({...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 Uu(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return Th(t)?E({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):E({state:e});if(e.fileSearchQuery!==null)return DA(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"&&(go(e.selectedLeftItemId)||yo(e.selectedLeftItemId)))return E({state:{...e,selectedRunner:ho(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return ey(e,1);if(t==="SHIFT_TAB"||t==="[")return ey(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?pn(e,-1,n):ju(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===K?pn(e,1,n):ju(e,1,n);if(t==="PAGE_UP")return pn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return pn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return pn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return pn(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=qA(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"&&vs(e.selectedLeftItemId)&&e.selectedTaskId)return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Ih(e.selectedLeftItemId)&&e.selectedWorkspaceId)return E({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&ry(e.activeTab,n.ptyTabIds??[]))return E({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return Mu(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return ty(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return Mu(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return ty(e,1)}if(ot(t)){if(e.focusedRegion==="tasks"&&(go(e.selectedLeftItemId)||yo(e.selectedLeftItemId))){let r=Zc(e.selectedLeftItemId),s=eu(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"&&vs(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return E({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:Rr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&ry(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return E({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:Rr(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:xA({...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 pn(e,t,n){if(t===0)return E({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?sy(e,t,n):e.inspectionMode==="review"?ny(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):E({state:e});if(e.focusedRegion==="center"&&e.activeTab===K){if(e.openInspectionKind==="file")return ny(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return FA(e,t,n)}return E({state:e})}function ey(e,t){return Mo(e,"focusedRegion",$A,t)}function Mu(e,t,n){let r=Mo(e,"activeTab",n&&n.length>0?n:UA(e),t);return!r.changed||Rh(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:Rr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function ju(e,t,n){if(e.focusedRegion==="tasks")return NA(e,t,n.leftItemIds);if(e.focusedRegion==="center")return Mu(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return sy(e,t,n);if(n.projectTargetIds?.length){let s=qu(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=qu(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:Mo(e,"selectedActionId",hh,t)}return Mo(e,"selectedActionId",zc,t)}function NA(e,t,n){let r=qu(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=Qc(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=Zc(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=eu(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function _A(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 ty(e,t){return _A(e,jA(e.inspectionMode,Jc,t))}function sy(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=Ft(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 xA(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 ny(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=Ft(e[t]+n,0,i);return o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function FA(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return LA(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 d=Ft(o,0,i);return d===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}let l=a.indexOf(e.selectedDiffPath);if(l===-1){let d=Ft(o,0,i);return d===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}if(t>0&&o>i){let d=a[l+1]??null;return d?E({state:{...e,selectedDiffPath:d,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 d=a[l-1]??null;return d?E({state:{...e,selectedDiffPath:d,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=Ft(o,0,i);return c===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function LA(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=Ft(e.diffScrollOffset+t,0,i),a=MA(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 MA(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function Mo(e,t,n,r){let s=n.indexOf(e[t]),i=Ft(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 qu(e,t,n,r,s=!1){if(n.length===0)return E({state:e});let i=n.indexOf(e[t]??n[0]??""),o=Ft(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 jA(e,t,n){let r=t.indexOf(e);return t[Ft(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 ry(e,t){return t.includes(e)}function qA(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Rr(e.activeTab)??e.preferredPtyTabKind}function UA(e){return[e.selectedPtyTabId,e.openInspectionKind?K:null].filter(t=>typeof t=="string")}function Ft(e,t,n){return Math.min(n,Math.max(t,e))}var iy=async(e,t,n,r)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await r.queueTaskMutation(async()=>W(r.paths,e.selectedTaskId,i=>{let o=t??WA(i,e.activeTab,e.preferredPtyTabKind),a=cy(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"}`}}},oy=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 W(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}`}}},ay=async(e,t)=>{let n=e.selectedTaskId;n&&await t.queueTaskMutation(async()=>{await W(t.paths,n,r=>!r.ptyTabs.some(s=>s.id===e.activeTab)||r.selectedPtyTabId===e.activeTab?r:{...r,selectedPtyTabId:e.activeTab})})},ly=async(e,t)=>{let n=e.ptyTabs.find(s=>s.kind==="agent")??null;if(n)return await t.queueTaskMutation(async()=>{await W(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=cy(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await W(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 WA(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function cy(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,d=a;for(;l.has(d);)c+=1,d=`${a}-${c}`;let u=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:d,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,r):[],createdAt:u,updatedAt:u}}var vr=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},uy=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 Je(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=bn();Rn(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.",d=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new vr(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}},dy=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},py=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}`}}},fy=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Dr(t.paths,n.id)))),Ns=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await kt.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var my=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 hy=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},gy=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},yy=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var BA=250;function Lt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function jn(e,t){return xt(t,e.ptyRuntime.getViewState(Cr(e,t)))}function Cr(e,t){let n=Lt(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 I(e,t){return jn(e,vh(t,e.model))}function wy(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:I(e,{...e.state.shell,footerToast:null})},e.render())},600),{...t,footerToast:n}):{...t,footerToast:null}}function ky(e,t,n){return wy(e,t,n?{tone:"success",message:n}:null)}function se(e,t,n){return wy(e,t,{tone:"error",message:n})}function ie(e,t,n,r){let s=n instanceof Error?n.message:r,i=n instanceof Error?n.stack??n.message:String(n);return kt.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function ee(e,t){if(!e.uiStateFile)return;e.runtimeState=wh(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>jt({uiStateFile:e.uiStateFile},n),()=>jt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function VA(e,t){let n=e.taskMutationQueue.then(t,t);return e.taskMutationQueue=n.then(()=>{},()=>{}),n}function oe(e){return{paths:e.paths,config:e.config,taskService:S,workspaceService:we,queueTaskMutation:t=>VA(e,t)}}function Wu(e,t){let n=Lt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?Lu(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:Ln(e.model),centerTabIds:Ph(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:Yg(t,n,s),pageRows:Math.max(5,Le(e.activeTerminal.width,e.activeTerminal.height).height-Z.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:n?.repoTargets?.map(a=>a.repoId)??[]}}async function Ty(e,t){await ay(t,oe(e))}async function Pe(e){e.model=await Sr(e.workspaceRoot,e.state.shell,e.enabledRunnerIds),e.state.mode==="main"?e.state={mode:"main",shell:I(e,e.state.shell)}:e.state={...e.state,shell:I(e,e.state.shell)}}function Ar(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 jo(e,t){let n=++e.inspectionRefreshSequence,r=tu(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 rh(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await Sr(e.workspaceRoot,t,e.enabledRunnerIds),n!==e.inspectionRefreshSequence)return;e.model=o,e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,e.state.shell)},ee(e,e.state.shell),e.render())}function by(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)&&jo(e,n).catch(r=>{let s=ie(e,"refresh inspection",r,"Failed to refresh inspection.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,actionMessage:s}),s)},e.render()})},BA))}function Ry(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=pn(e.state.shell,n,Wu(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render(),jo(e,e.state.shell).catch(s=>{let i=ie(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render()}},16)))}function Bu(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function Vu(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 Py(e){Vu(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.render())})}async function Iy(e,t){let n=I(e,t),r=Lt(e.model.tasks,n),s=Cr(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 xt(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,cn(Le(e.activeTerminal.width,e.activeTerminal.height)));return xt({...n,inputMode:"control"},o)}function Ku(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 Gu(e,t){try{let n=I(e,t),r=Lt(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 Sy(e,r),await Pe(e),s=r.selectedPtyTabId)}r&&!s&&(r=await Sy(e,r),await Pe(e),s=r.selectedPtyTabId);let i=I(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:xt({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},ee(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,cn(Le(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=un(s),e.lastTerminalKey=null,e.state={mode:"main",shell:xt({...i,inputMode:"terminal"},o)},ee(e,e.state.shell)}catch(n){let r=ie(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&un(t.selectedPtyTabId)&&(await KA(e,t.selectedTaskId,r).catch(()=>{}),await Pe(e).catch(()=>{})),e.state={mode:"main",shell:se(e,kh(I(e,t),r),r)},ee(e,e.state.shell)}e.render()}async function KA(e,t,n){await dy(t,n,oe(e))}async function vy(e,t,n,r){let s=I(e,t),{nextShell:i}=await iy(s,n,r,oe(e));return await Pe(e),I(e,{...s,...i})}async function Cy(e,t){let n=I(e,t),{closedTab:r,nextShell:s}=await oy(n,oe(e));return e.ptyRuntime.disposeSession(r.id),await Pe(e),I(e,{...n,...s})}async function Ay(e,t){let n=I(e,t),r=Ln(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await py(n,oe(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Pe(e),I(e,{...n,...o,selectedLeftItemId:GA(r,Ln(e.model),s)})}async function Ey(e,t){let n=I(e,t),{nextShell:r}=await my(n,oe(e));return await Pe(e),I(e,{...n,...r})}async function Sy(e,t){return ly(t,oe(e))}function qo(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:jn(e,e.state.shell)},e.render())},16))}function GA(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 $y(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=Oy(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await fy(s,oe(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)Ar(e,o);t.recordSuccess(i,Oy(e)),e.state={mode:"main",shell:I(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,Ns("background PR polling",i,oe(e)))}}function Oy(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function Dy(e,t){let n=I(e,t),r=Lt(e.model.tasks,n),s=null,i=null;if(r?.type==="project"&&r.repoTargets?.length){let o=await S.prs.discoverOrRefreshAll(e.paths,n.selectedTaskId);await Pe(e);let a=o.synced+o.discovered+o.notFound;i=`Refreshed ${o.synced}/${a} targets`}else{let{disposition:o,task:a}=await S.prs.discoverOrRefresh(e.paths,n.selectedTaskId);await Pe(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${V(a)?.requiredChecks.length??0} reported`)}return I(e,{...ky(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import XA from"node:path";import{readdir as HA,stat as YA}from"node:fs/promises";import Ny from"node:path";async function zA(e){let t=await HA(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=Ny.join(e,r.name);n.push({name:r.name,path:s,kind:await JA(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 _y(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function xy(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 Uo(e,t){let n=await zA(t);e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:n,activeTab:e.state.shell.selectedPtyTabId??e.state.shell.activeTab,actionMessage:null})},e.render())}async function JA(e){let t=Ny.join(e,".git");return await YA(t).catch(()=>null)!==null}function Fy(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function Ly(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function QA(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:I(e,{...t,taskPromptError:"Select a workspace first."})},e.render();return}if(n.length===0){e.state={mode:"main",shell:I(e,{...t,taskPromptError:"Task prompt cannot be empty."})},e.render();return}e.creatingTask=!0,e.state={mode:"main",shell:I(e,{...t,actionMessage:`Creating ${t.selectedRunner} task in ${t.selectedWorkspaceId??t.selectedRepoId}...`})},e.render();let r=null;try{let s=await uy(t.selectedRepoId,t.selectedWorkspaceId,n,t.selectedRunner,oe(e));r=s.task,Ar(e,r);let i=I(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??Vh(r,"agent"),cn(Le(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=un(i.selectedPtyTabId),e.state={mode:"main",shell:xt(i,o)},ee(e,e.state.shell)}catch(s){s instanceof vr&&(r=s.task);let i=ie(e,"create task",s,"Failed to create task.");r&&!(s instanceof vr)?(await W(e.paths,r.id,o=>({...o,status:"draft",runnerSession:{...o.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:i})).catch(()=>{}),await Pe(e).catch(()=>{})):r&&(await W(e.paths,r.id,o=>({...o,lastFailureReason:i})).catch(()=>{}),await Pe(e).catch(()=>{})),e.state={mode:"main",shell:se(e,I(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 ZA(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:I(e,{...n,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(ot(t)){QA(e);return}if(t==="BACKSPACE"){e.state={mode:"main",shell:I(e,{...n,taskPromptInput:n.taskPromptInput.slice(0,-1),taskPromptError:null})},e.render();return}if(t==="CTRL_R"){e.state={mode:"main",shell:I(e,{...n,selectedRunner:ho(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}bh(t)&&(e.state={mode:"main",shell:I(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function eE(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:I(e,{...e.state.shell,workspaceBrowser:{...n,query:null,selectedIndex:0}})},e.render();return}e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:null,actionMessage:null})},e.render();return}if(t==="/"){e.state={mode:"main",shell:I(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:I(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:I(e,{...e.state.shell,workspaceBrowser:{...n,query:s,selectedIndex:0}})},e.render();return}let r=_y(n);if(t==="UP"||t==="k"){e.state={mode:"main",shell:I(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:I(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"){Uo(e,XA.dirname(n.cwd)).catch(s=>{let i=ie(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:i}}),i)},e.render()});return}if(t==="RIGHT"||t==="l"||ot(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){Uo(e,s.path).catch(o=>{let a=ie(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()});return}let{workspaceService:i}=oe(e);i.addWorkspace(e.paths,s.path).then(async o=>{await Pe(e);let a=o.repos[0]??null,l=I(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},ee(e,e.state.shell),e.render()}).catch(o=>{let a=ie(e,"add workspace",o,"Failed to add workspace.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()})}}function tE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=Cg(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;nE(e,r)}}}async function nE(e,t){let n;try{n=await kt.readRecentErrorLines(e.paths)}catch(r){let s=ie(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 rE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=Eg(Fy(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"?hy(n.runner,n.enabled,oe(e)):gy(n.runner,n.path,oe(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:I(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=ie(e,"save runner option",s,"Failed to save runner option.");e.state={...e.state,shell:se(e,I(e,e.state.shell),i),runnerOptions:{...Fy(e),message:i}},e.render()})}function sE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=Ag(Ly(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}yy(n.feature,n.enabled,oe(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=ie(e,"save feature preview",r,"Failed to save feature preview.");e.state={...e.state,shell:se(e,I(e,e.state.shell),s),previewOptions:{...Ly(e),message:s}},e.render()})}}function My(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){ZA(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){eE(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){oE(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=Uu(e.state.shell,n,Wu(e,e.state.shell));if(r.exit){e.exit(0);return}if(r.detachTerminal){e.ptyRuntime.detach(),e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render();return}if(e.state.shell.inputMode==="terminal"){if(r.changed){e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&ot(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Es(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(iE(e,n))return;e.lastTerminalKey=Kh(n)?{key:n,at:Date.now()}:null;let i=Gh(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){qo(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:I(e,r.state)},e.pendingClear=!0,e.render();return}if(r.beginTaskPrompt){e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){Uo(e,e.workspaceRoot).catch(s=>{let i=ie(e,"browse workspaces",s,"Failed to browse workspaces.");e.state={mode:"main",shell:se(e,I(e,{...r.state,workspaceBrowser:{cwd:e.workspaceRoot,entries:[],selectedIndex:0,query:null,error:i}}),i)},e.render()});return}if(r.createPtyTab){vy(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{Gu(e,s)}).catch(s=>{let i=ie(e,"create PTY tab",s,"Failed to create tab.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.closePtyTab){Cy(e,r.state).then(s=>{e.state={mode:"main",shell:s},ee(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"close PTY tab",s,"Failed to close tab.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.refreshPullRequestChecks){Dy(e,r.state).then(s=>{e.state={mode:"main",shell:s},ee(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"refresh PR checks",s,"Failed to refresh PR checks.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.openPrUrl){let s=Lt(e.model.tasks,r.state),i=s?V(s)?.url??null:null;i?xy(i).catch(o=>{let a=ie(e,"open PR URL",o,"Failed to open PR in browser.");e.state={mode:"main",shell:se(e,I(e,r.state),a)},e.render()}):(e.state={mode:"main",shell:se(e,I(e,r.state),"No PR URL available.")},e.render());return}if(r.closeTask){Ay(e,r.state).then(s=>{e.state={mode:"main",shell:s},ee(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"close task",s,"Failed to close task.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.removeWorkspace){Ey(e,r.state).then(s=>{e.state={mode:"main",shell:s},ee(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"remove workspace",s,"Failed to remove workspace.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.attachTerminal){Gu(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){by(e,e.state.shell);return}jo(e,e.state.shell).catch(s=>{let i=ie(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}r.changed&&(e.state={mode:"main",shell:I(e,r.state)},Ty(e,e.state.shell).catch(()=>{}),ee(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:I(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){tE(e,n);return}if(e.state.variant==="runners"){rE(e,n);return}if(e.state.variant==="previews"){sE(e,n);return}if(e.state.variant==="error-log"){if(n==="ESCAPE"||ot(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"||ot(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:I(e,e.state.shell)},e.pendingClear=!0,e.render());return}if(ot(n)){if(e.state.menuIndex===0){let r=e.state.variant==="boot";e.state={mode:"main",shell:I(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;Iy(e,s).then(i=>{e.state.mode!=="main"||e.state.shell!==s||(e.state={mode:"main",shell:i},ee(e,e.state.shell),e.render())}).catch(i=>{if(e.state.mode!=="main"||e.state.shell!==s)return;let o=ie(e,"warm selected PTY",i,"Failed to start selected PTY.");e.state={mode:"main",shell:se(e,I(e,e.state.shell),o)},ee(e,e.state.shell),e.render()})}):Py(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 jy(e,t){let n=Xh(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=Es(i);if(o){Uy(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(fu(i)){e.pendingTerminalKeySequence.raw=i,qy(e);return}Wo(e)}if(n.includes("")){e.ptyRuntime.detach(),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey=null,e.state={mode:"main",shell:I(e,{...e.state.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},ee(e,e.state.shell),e.render();return}let r=Hh(n);if(r!==0){qo(e,r);return}let s=Es(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
283
+ `&&n!==`\r
284
+ `&&(e.suppressTerminalEnterOnAttach=!1),Jh(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function iE(e,t){if(e.pendingTerminalKeySequence){let n=Yh(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Es(r);if(s)return Uy(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(fu(r))return e.pendingTerminalKeySequence.raw=r,qy(e),!0}return Wo(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>Wo(e),30)},!0)}function qy(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>Wo(e),30))}function Wo(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function Uy(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function Wy(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){Ry(e,pu(t));return}let n=pu(t);n!==0&&qo(e,n)}function oE(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var By=1e3,lE=aE(import.meta.url),cE=lE("terminal-kit"),uE=cE.terminal;function Hu(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Vy(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Ky(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function dE(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 Gy(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=Ie(t),r=await k.load(n),s=k.runners.getEnabled(r),i=e.uiStateFile?await Un({uiStateFile:e.uiStateFile}):null,o=await Sr(t,void 0,s),a=Is(yh(i,r),o);o=await Sr(t,a,s);let l={current:o},c=()=>{},d=()=>{},u=()=>{},p={workspaceRoot:t,onUpdate:f=>c(f),onActivity:f=>d(f),onActivityRemoved:f=>u(f),resolveSessionSpec:(f,m)=>Bh(l.current,m,t)},h=e.ptyRuntime??await fg({...p,paths:n,activityEnabled:k.previews.isEnabled(r,"agentActivityIndicators")});return new Promise(f=>{let m=e.terminal??uE,y=null,T=null,R=null,v=null,b=null,$=0,D=!1,x=new Map,C=h.managesPullRequestSync?null:new Ir({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,ge=new dn({resolutionMs:k.previews.isEnabled(r,"agentActivityIndicators")?xo:By,onError:(A,z)=>Ns(`heartbeat job "${A}"`,z,oe(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:Is(a,o)},get model(){return l.current},set model(A){l.current=A},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:A=>f(A),setAgentActivityEnabled:A=>{ge.setResolutionMs(A?xo:By),w.ptyRuntime.setActivityEnabled?.(A)}},w.setAgentActivityEnabled(k.previews.isEnabled(r,"agentActivityIndicators")),c=A=>{w.state.mode==="main"&&(b=dE(b,A),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let z=b;if(b=null,w.state.mode==="main"){let ce=jn(w,w.state.shell);if(w.state={mode:"main",shell:ce},!v||!T){w.render();return}let Me=Le(m.width,m.height),be={...v,terminal:ce.terminal},Mt=Qg(Me,be,T,ce.centerZoomed,z?.kind==="rows"?z.rowIndices:null);if(!Mt){w.render();return}Mt.output.length>0&&m.noFormat(Mt.output),v=be,T=Mt.region,R&&(R={...R,center:Mt.region}),y=null,m.hideCursor(!0)}},0)))},d=A=>{w.state.mode==="main"&&k.previews.isEnabled(w.config,"agentActivityIndicators")&&un(A.tabId)&&x.get(A.tabId)!==vt(A.tabId,[A],Date.now())&&w.render()},u=A=>{w.state.mode==="main"&&k.previews.isEnabled(w.config,"agentActivityIndicators")&&un(A)&&x.get(A)!=="idle"&&w.render()};let ye=Promise.resolve(),Y=A=>{ye=ye.then(async()=>{let z=await Promise.all([...new Set(A)].map(ce=>S.getTask(w.paths,ce)));for(let ce of z)Ar(w,ce);w.state.mode==="main"?w.state={mode:"main",shell:I(w,w.state.shell)}:w.state={...w.state,shell:I(w,w.state.shell)},w.render()}).catch(z=>Ns("daemon task-state refresh",z,oe(w)))};w.ptyRuntime.setTasksChangedHandler?.(Y);let fn=A=>{let z=Le(m.width,m.height),ce=k.previews.isEnabled(w.config,"agentActivityIndicators"),Me=ce?w.ptyRuntime.getActivitySnapshots?.()??[]:[],be=Date.now(),Mt=Ug(I(w,A.shell),w.model,ce?{snapshots:Me,now:be,animationFrame:$}:void 0);if(x.clear(),ce)for(let Jy of w.model.tasks)for(let Bo of Jy.ptyTabs)Bo.kind==="agent"&&x.set(Bo.id,vt(Bo.id,Me,be));let zy=Nh(z,Mt,{centerOnly:A.shell.centerZoomed,focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:Mt,presentation:zy}},_s=(A,z,ce,Me)=>{if(!R)return!1;let be=Zg(R,z.regions,ce);return be?(be.output.length>0&&m.noFormat(be.output),v=A,R=be.regions,T=be.regions.center,y=Me?z.frame:null,m.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;Ku(w),w.ptyRuntime.setPullRequestPollView?.(Ky(w.state)),w.ptyRuntime.setViewedTab?.(Cr(w,w.state.shell));let{data:A,presentation:z}=fn(w.state);return _s(A,z,["rail","left","center","footer"],!1)},w.render=()=>{Ku(w);let A=w.state;w.ptyRuntime.setPullRequestPollView?.(Ky(A)),w.ptyRuntime.setViewedTab?.(A.mode==="main"?Cr(w,A.shell):null);let z=Le(m.width,m.height),ce,Me=null;if(A.mode==="main"){let be=fn(A);if(Me=be.presentation,ce=Me.frame,!w.pendingClear&&_s(be.data,Me,["rail","left","center","right","footer"],!0))return;v=be.data,T=Me.center}else ce=A.variant==="boot"?Eh(z,{menuIndex:A.menuIndex,optionsMessage:A.optionsMessage,versionText:w.versionText,updateText:w.updateText}):A.variant==="pause"?Oh(z,{menuIndex:A.menuIndex,optionsMessage:A.optionsMessage,versionText:w.versionText,updateText:w.updateText}):A.variant==="options"?Io(z,{menuIndex:A.menuIndex,optionsMenuItems:Iu}):A.variant==="runners"?Io(z,{menuIndex:Hu(A).menuIndex,optionsMenuItems:vu(w.config,Hu(A)),optionsMessage:Pg(Hu(A)),optionsSubtitle:"Runners"}):A.variant==="previews"?Io(z,{menuIndex:Vy(A).menuIndex,optionsMenuItems:Ig(w.config),optionsMessage:vg(Vy(A)),optionsSubtitle:"Feature Previews - Experimental"}):A.variant==="error-log"?Dh(z,{errorLogPath:A.errorLog?.path??n.errorLogFile,errorLogLines:A.errorLog?.lines??[]}):$h(z),v=null,T=null,R=null;w.pendingClear&&(m.moveTo(1,1),m.eraseDisplayBelow(),w.pendingClear=!1,y=null),m.noFormat(Qh(ce,y)),y=ce,R=Me?.regions??null,m.hideCursor(!0)};let xs=A=>My(w,A),Yu=A=>jy(w,A),zu=A=>Wy(w,A),Yy=()=>{process.stdout.off("resize",Ju),process.off("SIGCONT",Xu),m.removeListener("key",xs),m.removeListener("unknown",Yu),m.removeListener("mouse",zu),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),ge.stop(),w.ptyRuntime.disposeAll(),m.grabInput(!1),m.hideCursor(!1),m.fullscreen(!1)};w.exit=A=>{Yy(),f(A)};let Ju=()=>{Bu(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(cn(Le(m.width,m.height))),w.state={mode:"main",shell:jn(w,w.state.shell)}),w.render()},Xu=()=>{Bu(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(cn(Le(m.width,m.height))),w.state={mode:"main",shell:jn(w,w.state.shell)}),w.render()};process.stdout.on("resize",Ju),process.on("SIGCONT",Xu),m.grabInput(!0),w.inputCaptureMode="control",m.hideCursor(!0),m.fullscreen(!0),m.on("key",xs),m.on("unknown",Yu),m.on("mouse",zu),C&&ge.register({id:"github.pull-requests",intervalMs:1e3,run:A=>$y(w,C,A)}),ge.register({id:"agent.activity-indicators",intervalMs:xo,run:()=>{if(!k.previews.isEnabled(w.config,"agentActivityIndicators")){$=0,D=!1;return}let A=Date.now(),z=li(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],A);(z||D)&&($=($+1)%Lg,w.state.mode==="main"&&w.render()),D=z}}),ge.start(),k.version.checkForUpdate().then(A=>{A.updateAvailable&&A.latest&&(w.updateText=`Update available: v${A.latest}`,w.render())}),w.bootHydrationReady=Vu(w).catch(()=>{}),w.render()})}async function fE(){try{if(process.argv[2]==="__craig-daemon"){let e=await Hy(process.argv[3]??process.cwd()),t=Ie(e);return await mg(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await Hy(process.argv[3]??process.cwd()),t=Ie(e);return await hg(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
285
+ `),1}return eh({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=>Gy({uiStateFile:Ie(e).uiStateFile,workspaceRoot:e})})}async function Hy(e){return pE(e)}var mE=await fE();process.exit(mE);