craig-cli 0.14.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -2
- package/dist/cli.js +110 -110
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`;await i.writeFile(o,"utf8"),await i.sync(),await i.close(),await
|
|
4
|
-
`)};var Zo={};Ds(Zo,{checkForUpdate:()=>
|
|
5
|
-
`,"utf8")},
|
|
6
|
-
`).filter(i=>i.length>0).map(Tw);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(Rw(n))return{path:e.logFile,lines:[],empty:!0};throw n}},ta=async(e,t)=>
|
|
7
|
-
`)}function Pw(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 S(`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 S(`Global option ${l} requires a value.`);a+=1,l==="--workspace-root"?r.workspaceRoot=L(c,"Workspace root"):r.taskId=L(c,"Task id")}return{commandTokens:n,options:r,help:i}}function Iw(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 vw(e){if(e.length===0)return{kind:"listTasks"};if(e.length===2&&e[0]==="--repo")return{kind:"listTasks",repoId:L(e[1],"Repo id")};throw S(`Unsupported command: task list ${e.join(" ")}`)}function Cw(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 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=L(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw S("Task option --workspace may only be provided once.");n=L(c,"Workspace id")}else{if(r!==void 0)throw S("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(d){throw S(d instanceof Error?d.message:"Unsupported runner.")}}}if(!t&&!n)throw S("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw S("Task creation accepts either '--repo' or '--workspace', not both.");let o=L(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function Aw(e){let t,n,r,s,i,o=[],a=!0;for(let l=0;l<e.length;l+=1){let c=e[l];if(c==="--"){a=!1;continue}if(!a||!["--parent","--repo","--workspace","--runner","--idempotency-key"].includes(c)){if(a&&c.startsWith("--"))throw S(`Unsupported task create-child option: ${c}`);o.push(c);continue}let d=e[l+1];if(d===void 0||d==="--")throw S(`Task option ${c} requires a value.`);if(l+=1,c==="--parent"){if(t)throw S("Task option --parent may only be provided once.");t=L(d,"Parent task id")}else if(c==="--repo"){if(n)throw S("Task option --repo may only be provided once.");n=L(d,"Repo id")}else if(c==="--workspace"){if(r)throw S("Task option --workspace may only be provided once.");r=L(d,"Workspace id")}else if(c==="--runner"){if(s)throw S("Task option --runner may only be provided once.");try{s=k.runners.parse(d)}catch(u){throw S(u instanceof Error?u.message:"Unsupported runner.")}}else{if(i)throw S("Task option --idempotency-key may only be provided once.");i=L(d,"Idempotency key")}}if(n&&r)throw S("Child task creation accepts only one of --repo or --workspace.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},...n?{repoId:n}:{},...r?{workspaceId:r}:{},prompt:L(o.join(" "),"Child task prompt"),...s?{runner:s}:{},...i?{idempotencyKey:i}:{}}}function Ew(e){let[t,...n]=e;if(!["show","discover","link","refresh","unlink"].includes(t??""))throw S(`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 S(`Unsupported task pr ${t} option: ${l}`);if(r!==void 0)throw S(`task pr ${t} accepts at most one task id.`);r=L(l,"Task id");continue}let c=n[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=L(c,"Repo id")}else{if(i!==void 0)throw S("Task PR option --pr may only be provided once.");i=L(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={...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 S(`Unsupported command: task pr ${e.join(" ")}`)}}var ra=300*1e3,Ow=new Set(["idle","working","ready","error"]),$w=new Set(["queued","delivering","delivered","failed","cancelled"]);function Dw(e){if(e.length===0)return{kind:"showAgentStatus"};if(e.length===2&&e[0]==="--tab")return{kind:"showAgentStatus",tabId:L(e[1],"Agent tab id")};throw S(`Unsupported command: agent status ${e.join(" ")}`)}function Nw(e){let t,n,r="when-ready",s=ra,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:L(c,"Prompt")}:{source:"file",path:L(c,"Prompt file")}}else if(l==="--tab")n=L(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".');r=c}else l==="--timeout"?s=ia(c):i=L(c,"Idempotency key")}if(!t)throw S("Agent send requires --prompt, --prompt-file, or --stdin.");return{kind:"sendAgentPrompt",prompt:t,delivery:r,timeoutMs:s,...n?{tabId:n}:{},...i?{idempotencyKey:i}:{}}}function _w(e){let t=L(e[0]??"","Command id"),n,r=ra,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"?n=xw(a):r=ia(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function xw(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!$w.has(n)))throw S(`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 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")n=L(c,"Event type glob");else if(l==="--after")r=L(c,"Event cursor");else if(c==="jsonl")s="jsonl";else throw S('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=ra,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=L(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"?n=Uw(l):a==="--tab"?r=L(l,"Agent tab id"):s=ia(l)}if(!n)throw S("task wait requires --state <idle|working|ready|error>[,...].");return{kind:"waitTask",...t?{taskId:t}:{},states:n,...r?{tabId:r}:{},timeoutMs:s}}function Fw(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 S(`Unsupported fury plan option: ${i}`);if(t!==void 0)throw S("fury plan accepts exactly one definition file.");t=L(i,"Fury file");continue}let o=e[s+1];if(o===void 0||o.startsWith("--"))throw S(`Fury plan option ${i} requires a value.`);if(s+=1,i==="--root-task"){if(n)throw S("Fury plan option --root-task may only be provided once.");n=L(o,"Root task id");continue}let a=o.indexOf("=");if(a<1)throw S(`Invalid fury input "${o}". Use key=value.`);let l=L(o.slice(0,a),"Fury input name");if(Object.hasOwn(r,l))throw S(`Fury input "${l}" may only be provided once.`);r[l]=o.slice(a+1)}if(!t)throw S("fury plan requires a definition file.");return{kind:"planFury",file:t,inputs:r,...n?{rootTaskId:n}:{}}}function Mw(e){let t=L(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 S("fury watch supports --after and --format jsonl.");if(i==="--after")n=L(o,"Event cursor");else if(o==="jsonl")r=o;else throw S("fury watch format must be jsonl.")}return{kind:"watchFury",runId:t,...n?{after:n}:{},format:r}}function jw(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw S("fury step requires complete or fail.");let n=sa(e.slice(1),["--run","--step","--output","--output-file","--stdin","--reason"]),r=L(n.get("--run")??"","Fury run id"),s=L(n.get("--step")??"","Fury step id");if(t==="fail"){if(["--output","--output-file","--stdin"].some(a=>n.has(a)))throw S("fury step fail accepts only --reason.");return{kind:"failFuryStep",runId:r,stepId:s,reason:L(n.get("--reason")??"","Failure reason")}}if(n.has("--reason"))throw S("fury step complete does not accept --reason.");let i=["--output","--output-file","--stdin"].filter(a=>n.has(a));if(i.length>1)throw S("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 qw(e){if(e[0]!=="list")throw S("fury reviews requires list.");let t=sa(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 S(`Unsupported fury review state: ${r}`);return{kind:"listFuryReviews",...n?{runId:n}:{},...r?{state:r}:{}}}function Ww(e){let t=e[0],n=L(e[1]??"","Fury review id");if(t==="show")return oa(e,2,"fury review show"),{kind:"showFuryReview",reviewId:n};if(!t||!["approve","reject","request-changes","resubmit"].includes(t))throw S("Unsupported fury review action.");let r=sa(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 S(`fury review ${t} accepts only ${o}.`);return{kind:"actFuryReview",reviewId:n,action:s,...i?{message:i}:{}}}function sa(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 S(`Unsupported or duplicate option: ${s}`);if(s==="--stdin"){n.set(s,"true");continue}let i=e[++r];if(i===void 0||i.startsWith("--"))throw S(`Option ${s} requires a value.`);n.set(s,L(i,s))}return n}function Uw(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Ow.has(n)))throw S(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function ia(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 n=Number(t[1]),r={ms:1,s:1e3,m:6e4,h:36e5}[t[2]],s=n*r;if(!Number.isSafeInteger(s))throw S(`Duration "${e}" is too large.`);return s}function gd(e,t){return{mode:"command",command:e,commandName:Sw(e),options:t}}function yd(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function Pr(e,t){oa(e,0,t)}function oa(e,t,n){if(e.length!==t)throw S(`Command ${n} received an unexpected number of arguments.`)}function ee(e,t){if(e.length!==1)throw S(`${t} is required and must be provided once.`);return L(e[0],t)}function wd(e,t){return L(e.join(" "),t)}function kd(e,t,n){return L(e[t]??"",n)}function L(e,t){let n=e.trim();if(n.length===0)throw S(`${t} cannot be empty.`);return n}function S(e){return new g("CLI_USAGE",`${e}
|
|
2
|
+
var Yy=Object.defineProperty;var Ds=(e,t)=>{for(var n in t)Yy(e,n,{get:t[n],enumerable:!0})};import{realpath as iE}from"node:fs/promises";import ye from"node:path";function ve(e){let t=ye.join(e,".craig");return{workspaceRoot:e,repoRoot:e,craigDir:t,indexFile:ye.join(t,"index.json"),reposDir:ye.join(t,"repos"),workspacesDir:ye.join(t,"workspaces"),runtimeDir:ye.join(t,"runtime"),uiStateFile:ye.join(t,"runtime","ui-state.json"),tasksDir:ye.join(t,"tasks"),jobsDir:ye.join(t,"jobs"),commandsDir:ye.join(t,"commands"),eventsDir:ye.join(t,"events"),orchestrationDir:ye.join(t,"orchestration"),logsDir:ye.join(t,"logs"),logFile:ye.join(t,"logs","craig.jsonl"),artifactsDir:ye.join(t,"artifacts"),worktreesDir:ye.join(t,"worktrees"),configFile:ye.join(t,"config.json")}}import Uc from"node:path";import{readFile as YP}from"node:fs/promises";import{readFile as nw}from"node:fs/promises";import{randomUUID as zy}from"node:crypto";import{chmod as Jy,open as Xy,readFile as Qy,rename as Zy,rm as ew}from"node:fs/promises";import Yo from"node:path";async function q(e,t,n={}){let r=Yo.dirname(e),s=Yo.join(r,`.${Yo.basename(e)}.${process.pid}.${Date.now()}.${zy()}.tmp`),i=await Xy(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 Zy(s,e),n.mode!==void 0&&await Jy(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await ew(s,{force:!0}).catch(()=>{}),o}}async function Ns(e){try{let t=await Qy(e,"utf8");return JSON.parse(t)}catch(t){if(tw(t))return null;throw t}}function tw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}async function Mn(e){try{let t=await nw(e.uiStateFile,"utf8"),n=JSON.parse(t);return rw(n,e.uiStateFile)}catch(t){if(iw(t))return null;throw t}}async function jt(e,t){await q(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function xs(){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 rw(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")||!Fn(e,"inputMode")||!Fn(e,"focusedRegion")||!Fn(e,"activeTab")||!Fn(e,"inspectorSection")||!Fn(e,"inspectionMode")||!_s(e,"openInspectionKind")||!_s(e,"selectedFileTreePath")||!_s(e,"selectedFilePath")||!_s(e,"selectedDiffPath")||!sw(e,"collapsedFileTreePaths")||!Fn(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 Fn(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function _s(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function sw(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function iw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var zo={};Ds(zo,{RUNNER_IDS:()=>z,assertEnabled:()=>Zu,buildCommand:()=>nd,getConfiguredProfile:()=>Ls,getDefault:()=>Qu,getDisplayName:()=>td,getEnabled:()=>Fs,getProfile:()=>jn,isRunnerType:()=>Ms,parse:()=>ed,setRunnerEnabled:()=>rd,setRunnerPath:()=>sd});var z=["codex","cursor","claude"];var Xu={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 jn=e=>Xu[e];var Ls=(e,t={})=>{let n=jn(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}};var Fs=(e={})=>z.filter(t=>e.runners?.[t]?.enabled!==!1);var Qu=(e={})=>{let t=Fs(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 Zu=(e,t={})=>{if(t.runners?.[e]?.enabled===!1)throw new Error(`Runner "${e}" is disabled in .craig/config.json.`)};var Ms=e=>z.includes(e);var ed=e=>{if(!e||e.length===0)return"codex";if(!Ms(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${z.join(", ")}.`);return e};var td=e=>jn(e).displayName;var nd=(e,t,n={})=>{let r=[Ls(e,n).executable];return t&&t.length>0&&r.push(t),r};var rd=(e,t,n)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}});var sd=(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 Jo={};Ds(Jo,{PREVIEW_FEATURE_IDS:()=>ze,isEnabled:()=>id,setEnabled:()=>od});var ze=["agentOrchestration"];function id(e,t){return e.previews?.[t]===!0}function od(e,t,n){return{...e,previews:{...e.previews,[t]:n}}}import{mkdir as ow,readFile as aw,writeFile as lw}from"node:fs/promises";import cw from"node:path";var uw=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",ad=async e=>{try{return await aw(e,"utf8")}catch(t){if(uw(t))return null;throw t}},ld=async(e,t)=>{await ow(cw.dirname(e),{recursive:!0}),await lw(e,t,"utf8")};var dw=["incrementalCenterPane","agentActivityIndicators"],js=(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(!z.includes(r))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" is not supported. Expected one of: ${z.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(!dw.includes(r)&&!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 Xo=async(e,t={readConfigFile:ad})=>{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 js(r,e.configFile)};var Qo=async(e,t,n={writeConfigFile:ld})=>{js(t,e.configFile),await n.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
|
|
4
|
+
`)};var Zo={};Ds(Zo,{checkForUpdate:()=>cd,getCurrent:()=>qs});var qs=()=>{try{return"0.15.0"}catch{return"unknown"}};var pw="https://registry.npmjs.org/craig-cli/latest",fw=3600*1e3,mw={value:null},hw=(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},cd=async(e={fetch:globalThis.fetch,getCurrent:qs,cache:mw})=>{let t=e.getCurrent(),n=Date.now();if(e.cache.value&&n-e.cache.value.cachedAt<fw)return e.cache.value.result;let r=null;try{let i=await e.fetch(pw,{signal:AbortSignal.timeout(5e3)});i.ok&&(r=(await i.json()).version??null)}catch{}let s={current:t,latest:r,updateAvailable:r!==null&&r!==t&&hw(r,t)};return e.cache.value={result:s,cachedAt:n},s};var b={load:Xo,save:Qo,previews:Jo,runners:zo,version:Zo};var ud={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=ud[t],this.retryable=r.retryable??!1,this.details=r.details??{}}};function ea(e){return e instanceof g?e:new g("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as gw,mkdir as yw,readFile as ww}from"node:fs/promises";import kw from"node:path";var dd=80,Us=async(e,t)=>{await yw(kw.dirname(e.logFile),{recursive:!0});let n={timestamp:new Date().toISOString(),...t};await gw(e.logFile,`${JSON.stringify(n)}
|
|
5
|
+
`,"utf8")},pd=async(e,t)=>{try{await Us(e,t)}catch{}},Ws=async(e,t=dd)=>{try{let s=(await ww(e.logFile,"utf8")).trimEnd().split(`
|
|
6
|
+
`).filter(i=>i.length>0).map(Tw);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(Rw(n))return{path:e.logFile,lines:[],empty:!0};throw n}},ta=async(e,t)=>Us(e,{level:"error",component:"application",event:bw(t.context),message:t.message,...t.details?{details:t.details}:{}}),fd=async(e,t)=>{try{await ta(e,t)}catch{}},md=Ws,hd=async(e,t=dd)=>Ws(e,t);function Tw(e){try{let t=JSON.parse(e);if(!t.timestamp||!t.level||!t.component||!t.event||!t.message)return e;let n=[t.taskId,t.tabId].filter(Boolean).join("/");return`[${t.timestamp}] ${t.level.toUpperCase().padEnd(5)} ${t.component}.${t.event}${n?` ${n}`:""} \u2014 ${t.message}`}catch{return e}}function bw(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function Rw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var ue={appendErrorLog:ta,appendErrorLogBestEffort:fd,appendLog:Us,appendLogBestEffort:pd,readLog:Ws,readErrorLog:md,readRecentErrorLines:hd};function bd(e){let{commandTokens:t,options:n,help:r}=Pw(e);if(r)return yd({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":Pr(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:kd(o,"Repo path")};break;case"repo:list":Pr(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:ee(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:kd(o,"Workspace path")};break;case"workspace:list":a=Iw(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:ee(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:ee(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:ee(o,"Workspace id")};break;case"task:new":a=Cw(o);break;case"task:create-child":a=Aw(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:ee(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:ee(o,"Task id")}};break;case"task:list":a=vw(o);break;case"task:current":Pr(o,"task current"),a={kind:"currentTask"};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:ee(o,"Task id")};break;case"task:pr":a=Ew(o);break;case"task:wait":a=Lw(o);break;case"agent:list":Pr(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=Dw(o);break;case"agent:send":a=Nw(o);break;case"command:show":a={kind:"showPromptCommand",commandId:ee(o,"Command id")};break;case"command:list":Pr(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:ee(o,"Command id")};break;case"command:wait":a=_w(o);break;case"events:list":a=gd(o,!1);break;case"events:watch":a=gd(o,!0);break;case"fury:validate":a={kind:"validateFury",file:ee(o,"Fury file")};break;case"fury:plan":a=Fw(o);break;case"fury:approve":a={kind:"approveFury",planId:ee(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:ee(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:ee(o,"Fury run id")};break;case"fury:watch":a=Mw(o);break;case"fury:cancel":a={kind:"cancelFury",runId:ee(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:ee(o,"Fury run id")};break;case"fury:step":a=jw(o);break;case"fury:reviews":a=qw(o);break;case"fury:review":a=Uw(o);break;case"task:logs":a={kind:"streamTaskLogs",taskId:ee(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:ee(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:ee(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:ee(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:ee(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:Td(o,0,"Task id"),repoId:Td(o,1,"Repo id")},oa(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:ee(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 yd(a,n)}function Rd(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 Sw(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",addTaskLink:"link.add",listTaskLinks:"link.list",refreshInteractiveState:"interactive.refresh",showSelectedTask:"task.show",streamTaskLogs:"task.logs",streamSelectedTaskLogs:"task.logs",showTaskDiff:"task.diff",showSelectedTaskDiff:"task.diff",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 na(){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> | --workspace <workspace-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 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(`
|
|
7
|
+
`)}function Pw(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||!wd(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==="--"||wd(c))throw P(`Global option ${l} requires a value.`);a+=1,l==="--workspace-root"?r.workspaceRoot=L(c,"Workspace root"):r.taskId=L(c,"Task id")}return{commandTokens:n,options:r,help:i}}function Iw(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 vw(e){if(e.length===0)return{kind:"listTasks"};if(e.length===2&&e[0]==="--repo")return{kind:"listTasks",repoId:L(e[1],"Repo id")};throw P(`Unsupported command: task list ${e.join(" ")}`)}function Cw(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=L(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw P("Task option --workspace may only be provided once.");n=L(c,"Workspace id")}else{if(r!==void 0)throw P("Task option --runner may only be provided once.");try{r=b.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=L(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function Aw(e){let t,n,r,s,i,o=[],a=!0;for(let l=0;l<e.length;l+=1){let c=e[l];if(c==="--"){a=!1;continue}if(!a||!["--parent","--repo","--workspace","--runner","--idempotency-key"].includes(c)){if(a&&c.startsWith("--"))throw P(`Unsupported task create-child option: ${c}`);o.push(c);continue}let d=e[l+1];if(d===void 0||d==="--")throw P(`Task option ${c} requires a value.`);if(l+=1,c==="--parent"){if(t)throw P("Task option --parent may only be provided once.");t=L(d,"Parent task id")}else if(c==="--repo"){if(n)throw P("Task option --repo may only be provided once.");n=L(d,"Repo id")}else if(c==="--workspace"){if(r)throw P("Task option --workspace may only be provided once.");r=L(d,"Workspace id")}else if(c==="--runner"){if(s)throw P("Task option --runner may only be provided once.");try{s=b.runners.parse(d)}catch(u){throw P(u instanceof Error?u.message:"Unsupported runner.")}}else{if(i)throw P("Task option --idempotency-key may only be provided once.");i=L(d,"Idempotency key")}}if(n&&r)throw P("Child task creation accepts only one of --repo or --workspace.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},...n?{repoId:n}:{},...r?{workspaceId:r}:{},prompt:L(o.join(" "),"Child task prompt"),...s?{runner:s}:{},...i?{idempotencyKey:i}:{}}}function Ew(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=L(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=L(c,"Repo id")}else{if(i!==void 0)throw P("Task PR option --pr may only be provided once.");i=L(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 ra=300*1e3,Ow=new Set(["idle","working","ready","error"]),$w=new Set(["queued","delivering","delivered","failed","cancelled"]);function Dw(e){if(e.length===0)return{kind:"showAgentStatus"};if(e.length===2&&e[0]==="--tab")return{kind:"showAgentStatus",tabId:L(e[1],"Agent tab id")};throw P(`Unsupported command: agent status ${e.join(" ")}`)}function Nw(e){let t,n,r="when-ready",s=ra,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:L(c,"Prompt")}:{source:"file",path:L(c,"Prompt file")}}else if(l==="--tab")n=L(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=ia(c):i=L(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 _w(e){let t=L(e[0]??"","Command id"),n,r=ra,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=xw(a):r=ia(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function xw(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!$w.has(n)))throw P(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function gd(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=L(c,"Event type glob");else if(l==="--after")r=L(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=ra,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=L(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=Ww(l):a==="--tab"?r=L(l,"Agent tab id"):s=ia(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 Fw(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=L(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=L(o,"Root task id");continue}let a=o.indexOf("=");if(a<1)throw P(`Invalid fury input "${o}". Use key=value.`);let l=L(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 Mw(e){let t=L(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=L(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 jw(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw P("fury step requires complete or fail.");let n=sa(e.slice(1),["--run","--step","--output","--output-file","--stdin","--reason"]),r=L(n.get("--run")??"","Fury run id"),s=L(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:L(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 qw(e){if(e[0]!=="list")throw P("fury reviews requires list.");let t=sa(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 Uw(e){let t=e[0],n=L(e[1]??"","Fury review id");if(t==="show")return oa(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=sa(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 sa(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,L(i,s))}return n}function Ww(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Ow.has(n)))throw P(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function ia(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 yd(e,t){return{mode:"command",command:e,commandName:Sw(e),options:t}}function wd(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function Pr(e,t){oa(e,0,t)}function oa(e,t,n){if(e.length!==t)throw P(`Command ${n} received an unexpected number of arguments.`)}function ee(e,t){if(e.length!==1)throw P(`${t} is required and must be provided once.`);return L(e[0],t)}function kd(e,t){return L(e.join(" "),t)}function Td(e,t,n){return L(e[t]??"",n)}function L(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}
|
|
8
8
|
|
|
9
|
-
${na()}`,{})}var je=(e,t)=>{let n=aa(e);if(!Vw(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},aa=e=>{if(typeof e!="object"||e===null)return e;let t=e,n=e,r={...n};return delete r.swarmRunId,delete r.swarmStepId,delete r.tmuxWindowTarget,delete r.tmuxPage,delete r.tmuxTarget,delete r.layoutSlot,delete r.sessionId,{...r,runner:la(t.runner),repoId:typeof t.repoId=="string"?t.repoId:"legacy_repo",workspaceId:typeof t.workspaceId=="string"?t.workspaceId:"legacy_workspace",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:Hw(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:Kw(t.repoTargets),runnerSession:t.runnerSession??Bw(t),checks:ek(t),lastCommit:t.lastCommit??null,prs:tk(t),artifacts:ik(t),cleanup:ok(t)}},Bw=e=>{if(typeof e.title!="string")return null;let t=la(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},Vw=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.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||Gw(t.repoTargets))&&zw(t.runnerSession)&&Jw(t.prompt)&&Pd(t.checks)&&Id(t.lastCommit)&&Qw(t.prs)&&Zw(t.artifacts)&&Cd(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Kw=e=>{if(Array.isArray(e))return e.filter(Rd)},Gw=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)},Hw=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 Yw(e.id,e.title,t,la(e.runner))},Yw=(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}]},la=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"),zw=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),Jw=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"&&Xw(e.requiredChecks),Xw=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)),Qw=e=>Array.isArray(e)&&e.every(vd),Zw=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.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),ek=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},tk=e=>{if(Array.isArray(e.prs))return e.prs.map(nk);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}]},nk=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:rk(t.reviewDecision),requiredChecks:Ed(t.requiredChecks),comments:sk(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,rk=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,sk=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})):[],ik=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},ok=e=>{let t=e.cleanup;return{worktreeRemovedAt:t?.worktreeRemovedAt??null,preservedWorktree:t?.preservedWorktree??!1,warning:t?.warning??null}};import{readFile as Vk}from"node:fs/promises";import{readFile as ak,readdir as lk,rm as ck}from"node:fs/promises";import Od from"node:path";var ca=(e,t)=>Od.join(e.workspacesDir,`${t}.json`),uk=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=uk(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=ca(e,t);try{let r=await ak(n,"utf8");return $d(JSON.parse(r),n)}catch(r){throw dk(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 j(ca(e,t.id),{...t,updatedAt:new Date().toISOString()})},$e=async e=>{let t=await lk(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 ck(ca(e,t),{force:!0})},dk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as pk,readdir as fk,rm as mk}from"node:fs/promises";import Nd from"node:path";var ua=(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},ut=async(e,t)=>{let n=ua(e,t);try{let r=await pk(n,"utf8");return _d(JSON.parse(r),n)}catch(r){throw hk(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}},da=async(e,t)=>{await j(ua(e,t.id),{...t,updatedAt:new Date().toISOString()})},Ir=async e=>{let t=await fk(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>ut(e,Nd.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},xd=async(e,t)=>{await mk(ua(e,t),{force:!0})},hk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as gk}from"node:fs/promises";var yk=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"},qn=(e,t,n)=>{if(!yk(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},Ce=async e=>{let t=await gk(e.indexFile,"utf8");return qn(JSON.parse(t),e.workspaceRoot,e.indexFile)},bt=async(e,t)=>{await j(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as Rk,stat as Sk}from"node:fs/promises";import Un from"node:path";import{realpath as Md}from"node:fs/promises";import Bs from"node:path";import{execFile as wk}from"node:child_process";import{promisify as kk}from"node:util";var Ld=kk(wk);async function K(e,t,n={}){try{let r=await Ld(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(Fd(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function J(e,t,n={}){try{let r=await Ld(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(Fd(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function Fd(e){return e instanceof Error}var pa=async e=>{try{let n=(await K("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([Md(n).catch(()=>Bs.resolve(n)),Md(e).catch(()=>Bs.resolve(e))]);return r===s}catch{return!1}},fa=async e=>{let t=await J("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 J("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await K("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},jd=async e=>{let t=await J("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=Bs.resolve(e,n);return Bs.dirname(r)};import{mkdir as qe,readFile as Tk}from"node:fs/promises";var bk=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Wn=async e=>{let t=ve(e);await qe(t.craigDir,{recursive:!0}),await Promise.all([qe(t.reposDir,{recursive:!0}),qe(t.workspacesDir,{recursive:!0}),qe(t.runtimeDir,{recursive:!0}),qe(t.tasksDir,{recursive:!0}),qe(t.jobsDir,{recursive:!0}),qe(t.commandsDir,{recursive:!0}),qe(t.eventsDir,{recursive:!0}),qe(t.orchestrationDir,{recursive:!0}),qe(t.logsDir,{recursive:!0}),qe(t.artifactsDir,{recursive:!0}),qe(t.worktreesDir,{recursive:!0})]);try{let s=await Tk(t.indexFile,"utf8"),i=JSON.parse(s);return qn(i,e,t.indexFile)}catch(s){if(!bk(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 j(t.indexFile,r),r};var qd=(e,t,n)=>{let r=new Date().toISOString();return{id:Pk(e,Un.basename(t)),name:Un.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},Wd=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},Pk=(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},Ik=(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},Ud=async(e,t)=>{let n=await Ce(e);await bt(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},vk=async(e,t)=>{let n=await Rk(t,{withFileTypes:!0}),r=await Ir(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Un.join(t,i.name);if(!await pa(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await fa(o);s.push(a?Wd(a,l):qd([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},Ck=async(e,t)=>{let n=await fa(t),r=await Ir(e),s=r.find(u=>u.rootPath===t)??null,i=s?Wd(s,n):qd(r,t,n),o=`workspace_${i.id}`,l=(await $e(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 da(e,i),l||await hn(e,d),await Ud(e,{repoIds:[i.id],workspaceIds:[d.id]}),{kind:"createWorkspace",workspace:d,repos:[i],created:!l}},Ak=async(e,t)=>{let n=await vk(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await $e(e),s=Ik(r,Un.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:Un.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=>da(e,c))),await hn(e,l),await Ud(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},vr=async(e,t)=>{await Wn(e.workspaceRoot);let n=Un.resolve(e.workspaceRoot,t);if(!(await Sk(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await pa(n)?Ck(e,n):Ak(e,n)};var ma=async(e,t,n={listWorkspaceRecords:$e,ensureCraigState:Wn})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var ha=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 ga=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:Ce,writeCraigIndex:bt})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var ya=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 Ek,realpath as Kd,stat as Ok}from"node:fs/promises";import Vs from"node:path";async function wa(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(Vs.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=Vs.dirname(t);if(r===t)return null;t=r}}async function Gd(e){let t=ve(e);try{let n=await Ek(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=qn(r,s,t.indexFile);if(await Kd(i.workspaceRoot).catch(()=>Vs.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($k(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=Vs.resolve(e);try{if(!(await Ok(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 $k(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var ka={};Ds(ka,{addRepo:()=>Yd,listRegisteredRepos:()=>zd,removeRepo:()=>Jd});import Dk from"node:path";import{stat as Nk}from"node:fs/promises";var Yd=async(e,t)=>{let n=Dk.resolve(e.workspaceRoot,t);if(!(await Nk(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await vr(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:Ir,ensureCraigState:Wn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var Jd=async(e,t,n)=>{let r=await ut(e,t),i=(await $e(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 Ce(e);return await bt(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var ke={addWorkspace:vr,listWorkspaces:ma,archiveWorkspace:ha,restoreWorkspace:ga,removeWorkspace:ya,removeWorkspaceRecord:gn,resolveContext:wa,repos:ka};import{mkdir as Xd,readFile as _k,rm as Gs,stat as xk,writeFile as Lk}from"node:fs/promises";import Ks from"node:path";var Fk=25,Mk=3e4,jk=5e3;async function Wt(e,t,n){let r=Ks.join(e.runtimeDir,"task-locks"),s=Ks.join(r,`${t}.lock`);await Xd(r,{recursive:!0});let i=Date.now();for(;;)try{await Xd(s);try{await Lk(Ks.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await Gs(s,{recursive:!0,force:!0}),o}break}catch(o){if(!Uk(o))throw o;if(await qk(s))continue;if(Date.now()-i>=Mk)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await Bk(Fk)}try{return await n()}finally{await Gs(s,{recursive:!0,force:!0})}}async function qk(e){let t=await _k(Ks.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return Wk(t.pid)?!1:(await Gs(e,{recursive:!0,force:!0}),!0);let n=await xk(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<jk?!1:(await Gs(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 Uk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Bk=e=>new Promise(t=>setTimeout(t,e));var Rt=async(e,t)=>{let n=await Vk(Hs(e,t),"utf8");return JSON.parse(n)},Cr=async(e,t)=>{let n=await Rt(e,t);return je(n,Hs(e,t))},St=async(e,t)=>{let n=Qd(t);await j(Hs(e,t.id),n)},V=async(e,t,n)=>Wt(e,t,async()=>{let r=await Cr(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 j(Hs(e,t),i),i}),Ta=async(e,t)=>{let n=await Ce(e);n.taskIds.includes(t)||await bt(e,{...n,taskIds:[...n.taskIds,t]})},Hs=(e,t)=>`${e.tasksDir}/${t}.json`,Qd=e=>({...e,updatedAt:new Date().toISOString()});var U=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",Pt=(e,t)=>{let n=e.prs.findIndex(s=>Bn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},Bn=(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 zs(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},zs=e=>e.mergeable&&!Kk(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),Kk=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",ba=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),It=(e,t,n)=>{let r=e.isDraft??!1,s=Gk(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:Hk(e.reviewDecision??null),requiredChecks:Ra(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:Xk(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}},Gk=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,Hk=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Ra=e=>{let t=e.map(r=>Yk(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||zk(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},Yk=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:Jk(t)}:null},zk=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):Ys(e)&&!Ys(t)?!0:!Ys(e)&&Ys(t)?!1:Zd(t.status)>=Zd(e.status),Ys=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}},Jk=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},Xk=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(Qk).filter(n=>n!==null).slice(-4):[]},Qk=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=Zk(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},Zk=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 We=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as eT}from"node:fs/promises";import tp from"node:path";var q=async(e,t,n={readRawTask:Rt,validateTaskRecord:je})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw iT(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):oT(r)?new g("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},fe=async e=>{if(!await Sa(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Vn=(e,t)=>t.artifacts.logPath?tp.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:tp.join(e.workspaceRoot,t.artifacts.logPath):null,Ar=async(e,t)=>{let n=await Sa(t.worktreePath),r=Vn(e,t),s=r?await Sa(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:tT(t),lastCommitSummary:nT(t),prSummary:rT(t),cleanupSummary:sT(t)}},Sa=async e=>{try{return await eT(e),!0}catch{return!1}},tT=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}`},nT=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",rT=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})
|
|
9
|
+
${na()}`,{})}var je=(e,t)=>{let n=aa(e);if(!Vw(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},aa=e=>{if(typeof e!="object"||e===null)return e;let t=e,n=e,r={...n};return delete r.swarmRunId,delete r.swarmStepId,delete r.tmuxWindowTarget,delete r.tmuxPage,delete r.tmuxTarget,delete r.layoutSlot,delete r.sessionId,{...r,runner:la(t.runner),repoId:typeof t.repoId=="string"?t.repoId:"legacy_repo",workspaceId:typeof t.workspaceId=="string"?t.workspaceId:"legacy_workspace",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:Hw(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:Kw(t.repoTargets),runnerSession:t.runnerSession??Bw(t),checks:ek(t),lastCommit:t.lastCommit??null,prs:tk(t),artifacts:ik(t),cleanup:ok(t)}},Bw=e=>{if(typeof e.title!="string")return null;let t=la(e.runner);return{command:b.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},Vw=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"&&b.runners.isRunnerType(t.runner??"")&&typeof t.repoId=="string"&&typeof t.workspaceId=="string"&&(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"&&Pd(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||Gw(t.repoTargets))&&zw(t.runnerSession)&&Jw(t.prompt)&&Id(t.checks)&&vd(t.lastCommit)&&Qw(t.prs)&&Zw(t.artifacts)&&Ad(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Kw=e=>{if(Array.isArray(e))return e.filter(Sd)},Gw=e=>Array.isArray(e)&&e.every(Sd),Sd=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)&&Id(t.checks)&&vd(t.lastCommit)&&Cd(t.pullRequest)&&Ad(t.cleanup)},Hw=e=>{if(Pd(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 Yw(e.id,e.title,t,la(e.runner))},Yw=(e,t,n,r)=>{let s=b.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",title:s.defaultAgentTitle,command:b.runners.buildCommand(r),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},la=e=>e&&b.runners.isRunnerType(e)?e:"codex",Pd=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"),zw=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),Jw=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",Id=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"),vd=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",Cd=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&Xw(e.requiredChecks),Xw=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)),Qw=e=>Array.isArray(e)&&e.every(Cd),Zw=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),Ad=e=>typeof e=="object"&&e!==null&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),ek=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},tk=e=>{if(Array.isArray(e.prs))return e.prs.map(nk);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:Ed(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:Od(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},nk=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:Ed(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:rk(t.reviewDecision),requiredChecks:Od(t.requiredChecks),comments:sk(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},Ed=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,rk=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,sk=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}]}):[],Od=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})):[],ik=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},ok=e=>{let t=e.cleanup;return{worktreeRemovedAt:t?.worktreeRemovedAt??null,preservedWorktree:t?.preservedWorktree??!1,warning:t?.warning??null}};import{readFile as Vk}from"node:fs/promises";import{readFile as ak,readdir as lk,rm as ck}from"node:fs/promises";import $d from"node:path";var ca=(e,t)=>$d.join(e.workspacesDir,`${t}.json`),uk=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"):[]}},Dd=(e,t)=>{let n=uk(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=ca(e,t);try{let r=await ak(n,"utf8");return Dd(JSON.parse(r),n)}catch(r){throw dk(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 q(ca(e,t.id),{...t,updatedAt:new Date().toISOString()})},$e=async e=>{let t=await lk(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>mn(e,$d.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},Nd=async(e,t)=>{await ck(ca(e,t),{force:!0})},dk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as pk,readdir as fk,rm as mk}from"node:fs/promises";import _d from"node:path";var ua=(e,t)=>_d.join(e.reposDir,`${t}.json`),xd=(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},ut=async(e,t)=>{let n=ua(e,t);try{let r=await pk(n,"utf8");return xd(JSON.parse(r),n)}catch(r){throw hk(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}},da=async(e,t)=>{await q(ua(e,t.id),{...t,updatedAt:new Date().toISOString()})},Ir=async e=>{let t=await fk(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>ut(e,_d.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},Ld=async(e,t)=>{await mk(ua(e,t),{force:!0})},hk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as gk}from"node:fs/promises";var yk=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"},qn=(e,t,n)=>{if(!yk(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},Ce=async e=>{let t=await gk(e.indexFile,"utf8");return qn(JSON.parse(t),e.workspaceRoot,e.indexFile)},bt=async(e,t)=>{await q(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as Rk,stat as Sk}from"node:fs/promises";import Wn from"node:path";import{realpath as jd}from"node:fs/promises";import Bs from"node:path";import{execFile as wk}from"node:child_process";import{promisify as kk}from"node:util";var Fd=kk(wk);async function K(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(Md(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function J(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(Md(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function Md(e){return e instanceof Error}var pa=async e=>{try{let n=(await K("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([jd(n).catch(()=>Bs.resolve(n)),jd(e).catch(()=>Bs.resolve(e))]);return r===s}catch{return!1}},fa=async e=>{let t=await J("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 J("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await K("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},qd=async e=>{let t=await J("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=Bs.resolve(e,n);return Bs.dirname(r)};import{mkdir as qe,readFile as Tk}from"node:fs/promises";var bk=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Un=async e=>{let t=ve(e);await qe(t.craigDir,{recursive:!0}),await Promise.all([qe(t.reposDir,{recursive:!0}),qe(t.workspacesDir,{recursive:!0}),qe(t.runtimeDir,{recursive:!0}),qe(t.tasksDir,{recursive:!0}),qe(t.jobsDir,{recursive:!0}),qe(t.commandsDir,{recursive:!0}),qe(t.eventsDir,{recursive:!0}),qe(t.orchestrationDir,{recursive:!0}),qe(t.logsDir,{recursive:!0}),qe(t.artifactsDir,{recursive:!0}),qe(t.worktreesDir,{recursive:!0})]);try{let s=await Tk(t.indexFile,"utf8"),i=JSON.parse(s);return qn(i,e,t.indexFile)}catch(s){if(!bk(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 q(t.indexFile,r),r};var Ud=(e,t,n)=>{let r=new Date().toISOString();return{id:Pk(e,Wn.basename(t)),name:Wn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},Wd=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},Pk=(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},Ik=(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},Bd=async(e,t)=>{let n=await Ce(e);await bt(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},vk=async(e,t)=>{let n=await Rk(t,{withFileTypes:!0}),r=await Ir(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Wn.join(t,i.name);if(!await pa(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await fa(o);s.push(a?Wd(a,l):Ud([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},Ck=async(e,t)=>{let n=await fa(t),r=await Ir(e),s=r.find(u=>u.rootPath===t)??null,i=s?Wd(s,n):Ud(r,t,n),o=`workspace_${i.id}`,l=(await $e(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 da(e,i),l||await hn(e,d),await Bd(e,{repoIds:[i.id],workspaceIds:[d.id]}),{kind:"createWorkspace",workspace:d,repos:[i],created:!l}},Ak=async(e,t)=>{let n=await vk(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await $e(e),s=Ik(r,Wn.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:Wn.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=>da(e,c))),await hn(e,l),await Bd(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},vr=async(e,t)=>{await Un(e.workspaceRoot);let n=Wn.resolve(e.workspaceRoot,t);if(!(await Sk(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await pa(n)?Ck(e,n):Ak(e,n)};var ma=async(e,t,n={listWorkspaceRecords:$e,ensureCraigState:Un})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var ha=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 ga=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:Nd,readCraigIndex:Ce,writeCraigIndex:bt})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var ya=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 Ek,realpath as Gd,stat as Ok}from"node:fs/promises";import Vs from"node:path";async function wa(e){let t=await Yd(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return Vd(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return Vd(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await Kd(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await qd(t);if(r){let s=await Kd(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 Vd(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await Yd(Vs.resolve(n,e),s),o=await Hd(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 Kd(e){let t=e;for(;;){let n=await Hd(t);if(n)return n;let r=Vs.dirname(t);if(r===t)return null;t=r}}async function Hd(e){let t=ve(e);try{let n=await Ek(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=qn(r,s,t.indexFile);if(await Gd(i.workspaceRoot).catch(()=>Vs.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($k(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 Yd(e,t){let n=Vs.resolve(e);try{if(!(await Ok(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await Gd(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 $k(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var ka={};Ds(ka,{addRepo:()=>zd,listRegisteredRepos:()=>Jd,removeRepo:()=>Xd});import Dk from"node:path";import{stat as Nk}from"node:fs/promises";var zd=async(e,t)=>{let n=Dk.resolve(e.workspaceRoot,t);if(!(await Nk(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await vr(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 Jd=async(e,t={listRepos:Ir,ensureCraigState:Un})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var Xd=async(e,t,n)=>{let r=await ut(e,t),i=(await $e(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 Ld(e,t);let l=await Ce(e);return await bt(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var we={addWorkspace:vr,listWorkspaces:ma,archiveWorkspace:ha,restoreWorkspace:ga,removeWorkspace:ya,removeWorkspaceRecord:gn,resolveContext:wa,repos:ka};import{mkdir as Qd,readFile as _k,rm as Gs,stat as xk,writeFile as Lk}from"node:fs/promises";import Ks from"node:path";var Fk=25,Mk=3e4,jk=5e3;async function qt(e,t,n){let r=Ks.join(e.runtimeDir,"task-locks"),s=Ks.join(r,`${t}.lock`);await Qd(r,{recursive:!0});let i=Date.now();for(;;)try{await Qd(s);try{await Lk(Ks.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await Gs(s,{recursive:!0,force:!0}),o}break}catch(o){if(!Wk(o))throw o;if(await qk(s))continue;if(Date.now()-i>=Mk)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await Bk(Fk)}try{return await n()}finally{await Gs(s,{recursive:!0,force:!0})}}async function qk(e){let t=await _k(Ks.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return Uk(t.pid)?!1:(await Gs(e,{recursive:!0,force:!0}),!0);let n=await xk(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<jk?!1:(await Gs(e,{recursive:!0,force:!0}),!0)}function Uk(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 Wk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Bk=e=>new Promise(t=>setTimeout(t,e));var Rt=async(e,t)=>{let n=await Vk(Hs(e,t),"utf8");return JSON.parse(n)},Cr=async(e,t)=>{let n=await Rt(e,t);return je(n,Hs(e,t))},St=async(e,t)=>{let n=Zd(t);await q(Hs(e,t.id),n)},V=async(e,t,n)=>qt(e,t,async()=>{let r=await Cr(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=Zd(s);return await q(Hs(e,t),i),i}),Ta=async(e,t)=>{let n=await Ce(e);n.taskIds.includes(t)||await bt(e,{...n,taskIds:[...n.taskIds,t]})},Hs=(e,t)=>`${e.tasksDir}/${t}.json`,Zd=e=>({...e,updatedAt:new Date().toISOString()});var W=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",Pt=(e,t)=>{let n=e.prs.findIndex(s=>Bn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},Bn=(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 zs(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},zs=e=>e.mergeable&&!Kk(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),Kk=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",ba=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),It=(e,t,n)=>{let r=e.isDraft??!1,s=Gk(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:Hk(e.reviewDecision??null),requiredChecks:Ra(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:Xk(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}},Gk=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,Hk=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Ra=e=>{let t=e.map(r=>Yk(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||zk(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},Yk=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:tp(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:Jk(t)}:null},zk=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):Ys(e)&&!Ys(t)?!0:!Ys(e)&&Ys(t)?!1:ep(t.status)>=ep(e.status),Ys=e=>e.conclusion?.toUpperCase()==="CANCELLED",ep=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},Jk=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},Xk=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(Qk).filter(n=>n!==null).slice(-4):[]},Qk=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=Zk(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},Zk=e=>e.replace(/\s+/g," ").trim(),tp=(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?tp(r,r):"unknown"};var Ue=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as eT}from"node:fs/promises";import np from"node:path";var F=async(e,t,n={readRawTask:Rt,validateTaskRecord:je})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw iT(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):oT(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 Sa(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Vn=(e,t)=>t.artifacts.logPath?np.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:np.join(e.workspaceRoot,t.artifacts.logPath):null,Ar=async(e,t)=>{let n=await Sa(t.worktreePath),r=Vn(e,t),s=r?await Sa(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:tT(t),lastCommitSummary:nT(t),prSummary:rT(t),cleanupSummary:sT(t)}},Sa=async e=>{try{return await eT(e),!0}catch{return!1}},tT=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}`},nT=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",rT=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})
|
|
10
10
|
${i.join(`
|
|
11
|
-
`)}`}let t=
|
|
12
|
-
`);if(!n||!r)throw new Error("Unable to read git HEAD commit metadata.");return{sha:n,message:r}},
|
|
11
|
+
`)}`}let t=W(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})`},sT=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",iT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",oT=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var rp=async(e,t)=>{let n=await J("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.")},Pa=async(e,t,n,r="main")=>{let s=r.trim()||"main";if((await J("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 aT(e,s);await K("git",["worktree","add","-b",t,n,o],{cwd:e})},aT=async(e,t)=>(await J("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await J("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await J("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t,Js=async e=>{let t=await J("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},sp=async e=>{await K("git",["add","-A"],{cwd:e})},ip=async(e,t)=>{await K("git",["commit","-m",t],{cwd:e})},op=async e=>{let t=await K("git",["show","-s","--format=%H%n%s","HEAD"],{cwd:e}),[n="",r=""]=t.stdout.trim().split(`
|
|
12
|
+
`);if(!n||!r)throw new Error("Unable to read git HEAD commit metadata.");return{sha:n,message:r}},ap=async e=>{let t=await J("git",["branch","--show-current"],{cwd:e});if(t.exitCode!==0)return null;let n=t.stdout.trim();return n.length>0?n:null};var lp=async(e,t)=>{await K("git",["worktree","remove","--force",t],{cwd:e})};var Ia=async e=>Kn(e,e.repoRoot),Kn=async(e,t)=>{let n=await Ce(e),r=cp(new Date),s=up(n.taskIds,r);for(;;){let i=`task_${r}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await rp(t,o))return i;s+=1}},Er=async e=>{let t=await Ce(e),n=cp(new Date),r=up(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`},cp=e=>{let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}${n}${r}`},up=(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 Or=async(e,t,n={readRawTask:Rt,validateTaskRecord:je})=>{let r=await Ce(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(lT(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}},lT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var dp=["merge_ready","pr_open","checked","review","running","draft"],va=e=>[...e].sort((t,n)=>t.id.localeCompare(n.id)),Ca=(e,t)=>t&&e.some(r=>r.id===t)?t:e.length===0?null:[...e].sort(cT)[0]?.id??null,cT=(e,t)=>{let n=pp(e.status),r=pp(t.status);return n!==r?n-r:t.updatedAt.localeCompare(e.updatedAt)},pp=e=>{let t=dp.indexOf(e);return t>=0?t:dp.length};import fp from"node:path";var wn=(e,t)=>t?fp.isAbsolute(t)?t:fp.join(e.repoRoot,t):null;import{randomUUID as uT}from"node:crypto";import{mkdir as $r,rm as dT,writeFile as Xs}from"node:fs/promises";import G from"node:path";var hp=["AGENTS","md"].join("."),Gn=async(e,t,n,r={})=>{let s=await ut(e,t),[i,o]=await Promise.all([gT(e,s.id,r.workspaceId,r.allowLinkedProjectRepo??!1),Kn(e,s.rootPath)]),a=`craig/${o}`,l=G.join(e.worktreesDir,s.id,o),c=G.join(e.logsDir,`${o}.log`),d=G.join(e.artifactsDir,o);await Promise.all([$r(G.dirname(l),{recursive:!0}),$r(d,{recursive:!0}),Xs(c,"","utf8")]);let u=pT(e,{taskId:o,repoId:s.id,workspaceId:i.id,repoRoot:s.rootPath,prompt:n,runner:r.runner??"codex",config:r.config??{},branch:a,worktreePath:l,...r.lineage?{lineage:r.lineage}:{}});return await St(e,u),await Ta(e,o),await Pa(s.rootPath,a,l,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,workspaceId:i.id,task:u}},Dr=async(e,t,n,r={})=>{let s=(await $e(e)).find(T=>T.id===t&&T.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 T=await Gn(e,s.primaryRepoId,n,r);return{...T,bundlePath:T.task.worktreePath,repoTargets:[]}}let i=s.discoveredRepoIds??[];if(i.length===0)throw new Error(`Project workspace ${t} has no discovered repos.`);let o=await Er(e),a=new Date().toISOString(),l=r.runner??"codex",c=`craig/${o}`,d=G.join(e.craigDir,"task-bundles",o),u=G.join(e.logsDir,`${o}.log`),p=G.join(e.artifactsDir,o);await $r(d,{recursive:!0}),await $r(p,{recursive:!0}),await Xs(u,"","utf8");let m=await Promise.all(i.map(T=>ut(e,T))),h=mT(m),f=await Promise.all(m.map(T=>fT(e,T,o,c,G.join(d,h.get(T.id))))),y=f.find(T=>T.status==="ready")??f[0];if(!f.some(T=>T.status==="ready"))throw await dT(d,{recursive:!0,force:!0}),new Error(`No project repo targets could be provisioned for ${t}: ${f.map(T=>`${T.repoId}: ${T.failureReason??"unknown error"}`).join("; ")}`);await Xs(G.join(d,"manifest.json"),JSON.stringify({taskId:o,workspaceId:t,prompt:n,repos:f.map(T=>({repoId:T.repoId,repoName:m.find(O=>O.id===T.repoId)?.name??T.repoId,path:G.relative(d,T.worktreePath),status:T.status,worktreePath:T.worktreePath,failureReason:T.failureReason}))},null,2),"utf8"),await Xs(G.join(d,hp),hT({taskId:o,workspaceId:t,prompt:n,repos:m,repoTargets:f,bundlePath:d}),"utf8");let k=Nr(o,n,a,l,r.config??{}),R={id:o,title:n,slug:yp(n),type:"project",status:"draft",runner:l,repoId:y.repoId,workspaceId:s.id,selectedPtyTabId:k[0]?.id??null,linkedRepoIds:i.filter(T=>T!==y.repoId),...gp(o,r.lineage),repoRoot:d,worktreePath:d,branch:c,bundlePath:d,selectedRepoTargetId:y.repoId,repoTargets:f,ptyTabs:k,runnerSession:{command:b.runners.buildCommand(l,n,r.config??{}),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:n},checks:y.checks,lastCommit:null,prs:[],artifacts:{logPath:G.relative(e.workspaceRoot,u),checkSummaryPath:G.relative(e.workspaceRoot,G.join(p,"check-summary.json")),prDraftPath:null,prStatusPath:G.relative(e.workspaceRoot,G.join(p,"pr-status.json"))},cleanup:Qs(),lastFailureReason:f.every(T=>T.status==="unavailable")?"No project repo targets could be provisioned.":null,createdAt:a,updatedAt:a};return await St(e,R),await Ta(e,o),{repoId:y.repoId,repoRoot:d,workspaceId:s.id,task:R,bundlePath:d,repoTargets:f}},Nr=(e,t,n,r="codex",s={})=>{let i=b.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",...s.previews?.agentOrchestration?{capabilityId:`capability_${uT()}`}:{},title:i.defaultAgentTitle,command:b.runners.buildCommand(r,void 0,s),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},pT=(e,t)=>{let n=new Date().toISOString(),r=Nr(t.taskId,t.prompt,n,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:yp(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,selectedPtyTabId:r[0]?.id??null,linkedRepoIds:[],...gp(t.taskId,t.lineage),repoRoot:t.repoRoot,worktreePath:t.worktreePath,branch:t.branch,ptyTabs:r,runnerSession:{command:b.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:{...Aa(G.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:G.relative(e.workspaceRoot,G.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:G.relative(e.workspaceRoot,G.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:G.relative(e.workspaceRoot,G.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:Qs(),lastFailureReason:null,createdAt:n,updatedAt:n}},fT=async(e,t,n,r,s)=>{await $r(G.dirname(s),{recursive:!0});try{return await Pa(t.rootPath,r,s,t.defaultBranch),{repoId:t.id,branch:r,repoRoot:t.rootPath,worktreePath:s,status:"ready",failureReason:null,checks:Aa(G.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:mp(),cleanup:Qs()}}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:Aa(G.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:mp(),cleanup:Qs()}}},mT=e=>{let t=new Set(["manifest.json",hp]),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},hT=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=G.relative(e.bundlePath,r.worktreePath),o=r.status==="ready"?"ready":`unavailable: ${r.failureReason??"unknown error"}`;return`- \`${i}/\` - ${s} (${r.repoId}, ${o})`}).join(`
|
|
13
13
|
`);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(`
|
|
14
|
-
`)},Aa=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),
|
|
14
|
+
`)},Aa=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),mp=()=>({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}),Qs=()=>({worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),gp=(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}),gT=async(e,t,n,r=!1)=>{let s=await $e(e),i=n?s.find(o=>o.id===n&&o.status==="active"&&(o.kind==="project"?r||o.discoveredRepoIds?.includes(t):o.primaryRepoId===t)):s.find(o=>o.kind!=="project"&&o.primaryRepoId===t&&o.status==="active");if(!i)throw new Error(n?`Repo ${t} is not available in active workspace ${n}.`:`Repo ${t} does not have an active workspace.`);return i},yp=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");var Ea=async(e,t,n)=>{await V(e,t,r=>({...r,status:r.status==="running"?"draft":r.status,runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n}))},_r=async(e,t,n)=>V(e,t,r=>({...r,status:"draft",runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n})),xr=async(e,t)=>V(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"}}});var Oa=async(e,t,n,r={})=>{let s=n.trim(),i=await b.load(e),o=r.runner??b.runners.getDefault(i);if(b.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 l=(r.workspaceId?await Dr(e,r.workspaceId,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}):await Gn(e,t,s,{runner:o,config:i,...r.owningWorkspaceId?{workspaceId:r.owningWorkspaceId,allowLinkedProjectRepo:r.allowLinkedProjectRepo??!1}:{},...r.lineage?{lineage:r.lineage}:{}})).task;try{let c=await r.onProvisioned?.(l);if(!r.launchProvisioned)throw new Error("Craig task creation requires the PTY daemon launcher.");await r.launchProvisioned(l,c||void 0);let d=r.markStartedAfterLaunch===!1?await F(e,l.id):await xr(e,l.id),u=d.ptyTabs.find(p=>p.kind==="agent");return{kind:"createTask",taskId:d.id,repoId:d.repoId,workspaceId:d.workspaceId,agentTabId:u.id,status:d.status,branch:d.branch,worktreePath:d.worktreePath,runner:d.runner}}catch(c){throw await _r(e,l.id,c instanceof Error?c.message:"Unknown Craig error"),c}};import{mkdir as bT}from"node:fs/promises";import RT from"node:path";var vt=async e=>{let t=await J("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var wp=async(e,t,n)=>{let r=n==="merge"?"--merge":n==="rebase"?"--rebase":"--squash";await K("gh",["pr","merge",String(t),r,"--delete-branch=false"],{cwd:e})},Hn=async(e,t)=>{let n=await K("gh",$a(e),{cwd:t});return JSON.parse(n.stdout)},Yn=async(e,t)=>{let n=await J("gh",$a(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(bp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},kp=async(e,t)=>{let n=await J("gh",$a(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(bp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Tp=async(e,t,n)=>{if(n.length===0)return[];let r=kT(n),s;try{s=await K("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw yT(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=TT(c);return{id:a.id,found:d!==null,view:d}})},Zs=async e=>{let t=await J("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:wT(t.stdout.trim())},Wt=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])}},yT=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")},bp=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},$a=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],wT=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},kT=e=>`
|
|
15
15
|
query CraigPullRequestBatch($owner: String!, $name: String!) {
|
|
16
16
|
repository(owner: $owner, name: $name) {
|
|
17
17
|
${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(`
|
|
@@ -65,27 +65,27 @@ fragment PrFields on PullRequest {
|
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
|
-
`,TT=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 kn=async(e,t)=>{let n=wn(e,t.artifacts.prStatusPath);n&&(await bT(RT.dirname(n),{recursive:!0}),await
|
|
68
|
+
`,TT=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 kn=async(e,t)=>{let n=wn(e,t.artifacts.prStatusPath);n&&(await bT(RT.dirname(n),{recursive:!0}),await q(n,{taskId:t.id,prs:t.prs}))},Lr=async(e,t,n={writeTask:St,writePrStatusArtifact:kn})=>{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},Fr=async(e,t,n,r,s={readRawTask:Rt,validateTaskRecord:je,writeTask:St,writePrStatusArtifact:kn,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=It(n,a),c=Pt(o,l),d=o.status==="closed"?o.status:yn(c.prs),u={...c,status:d};return Lr(e,u,s)}),Mr=async(e,t)=>{let n=W(t),r=n?.number?String(n.number):t.branch,s=await Hn(r,t.worktreePath);return Fr(e,t,s,n)},jr=async(e,t)=>{for(let n of await Da(t)){let r=await Yn(n,t.worktreePath);if(!r)continue;return{discovered:!0,task:await Fr(e,t,r,null)}}return{discovered:!1,task:t}},Da=async e=>{let t=await ap(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(n=>!!n))]};async function qr(e,t,n,r){return qt(e,t,async()=>{let s=await F(e,t);if(!s.repoTargets?.find(m=>m.repoId===n))throw new Error(`Project task ${t} has no repo target ${n}.`);let o=Wt(r.url),a=s.prs.find(m=>o?Bn(m,{owner:o.owner,repo:o.name,number:r.number}):m.number===r.number)??null,l=It(r,a,o??void 0),c=ST(r),d=Pt(s,l),u={...d,repoTargets:(d.repoTargets??[]).map(m=>m.repoId===n?{...m,pullRequest:c}:m)},p={...u,status:u.status==="closed"?u.status:Na(u)};return Lr(e,p)})}function ST(e){let t=Wt(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:PT(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:IT(e.reviewDecision??null),requiredChecks:Ra(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function Na(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 PT=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,IT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null;var zn=async(e,t,n)=>{let r=n.pullRequest.number?String(n.pullRequest.number):n.branch;if(n.pullRequest.number){let i=await Hn(r,n.worktreePath);return await qr(e,t.id,n.repoId,i),"synced"}let s=await Yn(r,n.worktreePath);return s?(await qr(e,t.id,n.repoId,s),"discovered"):"not_found"};var Ur=async(e,t)=>{let n=await F(e,t),r=W(n);return r?.number?(await vt(n.worktreePath),Ut(r)?(await jr(e,n)).task:Mr(e,n)):n},xa=async(e,t)=>{let n=await F(e,t);if(n.type==="project"&&n.repoTargets?.length)return await Jn(e,t),F(e,t);let r=W(n);if(await me(n),await vt(n.worktreePath),!r?.number||Ut(r)){let i=await jr(e,n);if(!i.discovered&&!r?.number)throw new Error(`No PR found for ${n.branch}.`);return i.task}return await Mr(e,n)},Jn=async(e,t)=>{let n=await F(e,t),r=(n.repoTargets??[]).filter(i=>i.status==="ready"),s={synced:0,discovered:0,notFound:0};for(let i of r){await vt(i.worktreePath);let o=i.pullRequest.number?await zn(e,n,i):await zn(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=_a(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 Rp(r,p).catch(async()=>{try{await vt(u.worktreePath);let m=u.pullRequest.number?await zn(e,i,u):await zn(e,i,u);ei(o,m,u.pullRequest.number??null,u.pullRequest.url??null)}catch(m){if(m instanceof Ue)throw m;s.push(m)}})}continue}let a=W(i),l=a?.number&&!Ut(a),c=l?[]:await Da(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 Rp(r,d).catch(async()=>{try{let{disposition:u,task:p}=await ti(e,i.id),m=W(p);ei(o,u,m?.number??null,m?.url??null)}catch(u){if(u instanceof Ue)throw u;s.push(u)}})}for(let i of r.values())try{await vt(i.worktreePath);let o=await Tp(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=_a(n,l.task),u=a.get(l.id)?.view??await vT(i.worktreePath,l);if(!u){ei(c,"not_found",null,null);continue}if(l.targetRepoId)await qr(e,l.task.id,l.targetRepoId,u);else{let p=await Rt(e,l.task.id),m=je(p,`${e.tasksDir}/${l.task.id}.json`);await Fr(e,m,u,l.mode==="number"?W(m):null)}ei(c,l.mode==="number"?"synced":"discovered",u.number,u.url)}}catch(o){if(o instanceof Ue)throw o;s.push(o)}return CT(s),t.map(i=>_a(n,i))},ti=async(e,t)=>{let n=await F(e,t);await me(n),await vt(n.worktreePath);let r=W(n);if(r?.number&&!Ut(r))return{disposition:"synced",task:await Mr(e,n)};let s=await jr(e,n);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},vT=async(e,t)=>{if(t.mode!=="head")return null;for(let n of t.fallbackSelectors){let r=await Yn(n,e);if(r)return r}return null},Rp=async(e,t)=>{let n=await Zs(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]})},_a=(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):!!W(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,r),r},ei=(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},CT=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var Fa=async(e,t)=>{let n=await F(e,t);try{n.type==="project"&&n.repoTargets?.length?(await Jn(e,t),n=await F(e,t)):n.prs.some(s=>s.number)&&(n=await Ur(e,t))}catch{}let r=await Ar(e,n);return{kind:"showTask",task:n,inspection:r}};var Ma=async(e,t)=>{let n=await F(e,t);if(await me(n),(await K("git",["status","--short"],{cwd:n.worktreePath})).stdout.trim().length===0)return{kind:"showTaskDiff",taskId:n.id,diffText:"",isEmpty:!0};let s=await AT(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}},AT=async e=>{let t=[],n=await K("git",["diff","--stat","--patch","HEAD"],{cwd:e});n.stdout.trim().length>0&&t.push(n.stdout.trimEnd());let r=await ET(e);for(let s of r){let i=await J("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(i.stdout.trimEnd())}return t.join(`
|
|
69
69
|
|
|
70
70
|
`)},ET=async e=>(await K("git",["ls-files","--others","--exclude-standard"],{cwd:e})).stdout.split(`
|
|
71
|
-
`).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as OT}from"node:child_process";import{access as $T}from"node:fs/promises";var ja=async(e,t)=>{let n=await q(e,t),r=Vn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await $T(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},qa=async e=>{await new Promise((t,n)=>{let r=!1,s=OT("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 DT}from"node:fs/promises";import NT from"node:path";var Wa=async(e,t)=>{let n=await q(e,t);if(await fe(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 Js(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 V(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 J("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}`,m=await V(e,n.id,h=>({...h,status:"review",checks:{...h.checks,results:i,status:"failed",lastRunAt:d},lastFailureReason:p}));return await Rp(e,m),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await V(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 Rp(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},Rp=async(e,t)=>{let n=wn(e,t.artifacts.checkSummaryPath);n&&(await DT(NT.dirname(n),{recursive:!0}),await j(n,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))};var Ua=async(e,t)=>{let n=await q(e,t);await fe(n);let r=await Js(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 V(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 _T}from"node:fs/promises";var Ba=async(e,t)=>{let n=await q(e,t),r=await xT(n.worktreePath);return V(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},xT=async e=>{try{return await _T(e),!0}catch{return!1}};var Va=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await ap(e.repoRoot,t.worktreePath),s=new Date().toISOString()}catch(i){r.push(i instanceof Error?i.message:"Failed to remove worktree.")}await V(e,t.id,i=>({...i,cleanup:{...i.cleanup,worktreeRemovedAt:s??i.cleanup.worktreeRemovedAt,preservedWorktree:n.preserveWorktree,warning:r.length>0?r.join(" "):null}}))};var Ka=async(e,t,n)=>{let r=await ut(e,n),s=await V(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}},Ga=async(e,t)=>{let n=await q(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>ut(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};import{spawn as LT}from"node:child_process";var Ha=async(e,t)=>{let n=await q(e,t);await fe(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 FT(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},FT=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=LT(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"}.`))})})};import{realpath as Pp}from"node:fs/promises";import Ur from"node:path";async function za(e,t){if(t.explicitTaskId!==void 0){let l=await Sp(e,t.explicitTaskId,"explicit");return Ya(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await Sp(e,t.environmentTaskId,"environment");return Ya(l,"environment",t.environmentAgentTabId)}let n=await Pp(t.cwd).catch(()=>Ur.resolve(t.cwd)),r=await Or(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await jT(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 Ya(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 Sp(e,t,n){try{return await q(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 Ya(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 MT(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function jT(e,t){return(await Promise.all(MT(e).map(r=>Pp(r).catch(()=>Ur.resolve(r))))).some(r=>qT(r,t))}function qT(e,t){let n=Ur.relative(Ur.resolve(e),t);return n===""||!n.startsWith("..")&&!Ur.isAbsolute(n)}var Ja=async(e,t,n="merge",r)=>{let s=await q(e,t),i=r??U(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await yp(s.worktreePath,i,n)};var Br={readTask:q,writeTask:St,withTaskLock:Wt,ensureGhAuthenticated:vt,fetchPrView:Hn,discoverPrView:wp,getGitHubRepositoryLocator:Zs,writePrStatusArtifact:kn};async function Qa(e,t,n,r=Br){let s=await r.readTask(e,t),i=await UT(s,n,r);return Vt(s,i,"showTaskPr","shown",[])}async function Za(e,t,n,r=Br){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await sl(s,n,null,r);await il(i,r);let o=await ri(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return Vt(s,i,"discoverTaskPr","not_found",[]);ol(o,i);let a=si(s,i,o.number),l=await al(e,s,i,o,r);return Vt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function el(e,t,n,r,s=Br){let i=rl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await sl(o,r,i.repository,s);vp(i.repository,a),await il(a,s);let l=await ri(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));BT(l,i),ol(l,a);let c=si(o,a,l.number),d=ll(o,a),u=d&&!Bn(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 al(e,o,a,l,s);return Vt(p,a,"linkTaskPr",c?"unchanged":"linked",u)})}async function WT(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw Xn(e,t);let o=e.prs.find(a=>a.number===n.number)??U(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await ni(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw Xn(e,t);let a=Ip(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&dt({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await ni(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&&dt({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&dt({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 tl(e,t,n,r=Br){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await sl(s,n,null,r),o=ll(s,i);if(!o?.number)return Vt(s,i,"refreshTaskPr","not_found",[]);await il(i,r);let a=await ri(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));ol(a,i);let l=await al(e,s,i,a,r);return Vt(l,i,"refreshTaskPr","synced",[])})}async function nl(e,t,n,r,s=Br){let i=rl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await WT(o,r,i,s);if(vp(i.repository,a),!si(o,a,i.number))return Vt(o,a,"unlinkTaskPr","unchanged",[]);let c=VT(o,a,i.number),d=await Ap(e,c,s);return Vt(d,a,"unlinkTaskPr","unlinked",[])})}function rl(e){let t=e.trim(),n=Bt(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 sl(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw Xn(e,t);return Xa(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 Xn(e,t);return Xa(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 Xa(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&&dt(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 UT(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw Xn(e,t);let s=U(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await ni(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 Xn(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await ni(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function ni(e,t,n,r){let s=Ip(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function Ip(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Bt(e.url):null}async function Xa(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 il(e,t){await ri("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function ri(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 vp(e,t){if(e&&!dt(e,t.repository))throw Cp(e,t)}function BT(e,t){let n=Bt(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&&!dt(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 ol(e,t){let n=Bt(e.url);if(!n||!dt(n,t.repository))throw Cp(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 Cp(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 Xn(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 dt(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function al(e,t,n,r,s){let i=si(t,n,r.number),o=It(r,i,n.repository),a=Pt(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:$p(o)}:l)}),Ap(e,a,s)}function VT(e,t,n){let r=e.prs.filter(i=>!Op(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=Ep(r.filter(o=>o.owner&&o.repo&&dt({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?$p(i):GT(t.repository)}:o)}}return s}async function Ap(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?Na(t):yn(t.prs),s={...t,status:r};return Lr(e,s,n)}function si(e,t,n){return cl(e,t).find(r=>Op(r,t,n))??null}function ll(e,t){if(!t.projectTarget)return U(e);let n=cl(e,t);return Ep(n)}function Ep(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function cl(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&dt({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?KT(r.pullRequest,t.repository):null;return s&&!n.some(i=>Bn(i,s))?[...n,s]:n}function Op(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||dt({owner:e.owner,name:e.repo},t.repository)}function Vt(e,t,n,r,s){let i=cl(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:ll(e,t),warnings:s}}function $p(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 KT(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 GT(e){return{provider:"github",owner:e.owner,repo:e.name,number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null}}var P={listTasks:Or,getTask:q,provisionTask:Gn,provisionProjectTask:Dr,createTask:Oa,showTask:Fa,showTaskDiff:Ma,prepareTaskLogs:ja,streamTaskLogs:qa,runChecks:Wa,commitTask:Ua,closeTask:Ba,cleanupTask:Va,addTaskLink:Ka,listTaskLinks:Ga,sortTasksForDisplay:va,resolveSelectedTaskId:Ca,allocateTaskId:Ia,allocateTaskIdForRepo:Kn,allocateProjectTaskId:Er,createDefaultTaskPtyTabs:Nr,assertTaskWorktreeExists:fe,resolveTaskLogPath:Vn,buildTaskInspection:Ar,resolveArtifactPath:wn,openTask:Ha,markRunnerFailed:Ea,recordStartupFailure:_r,markTaskStarted:xr,resolveContext:za,prs:{refresh:Wr,refreshChecks:xa,discoverOrRefresh:ti,discoverOrRefreshAll:Jn,discoverOrRefreshMany:La,show:Qa,discover:Za,link:el,refreshAssociation:tl,unlink:nl,merge:Ja,getPrimaryPr:U,isPrTerminal:Ut,isMergeReady:zs,deriveTaskStatus:yn,upsertPr:Pt,normalizePr:It,summarizeRequiredChecks:ba,writePrStatusArtifact:kn}};var Dp={idle:0,ready:1,working:2,error:3};function Ct(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 Kt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return Ct(t,n,r,i)}function Qn(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=Kt(e,s.id,t,n);Dp[i]>Dp[r]&&(r=i)}return r}function ii(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&Ct(s.id,t,n)==="working"))}function pt(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=Kt(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:Qn(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function ul(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=pt([e],t.getSnapshots(),l),d=n.tabId?c.agents.find(m=>m.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 Np(e.id);let u=a-r();if(u<=0)throw HT(e.id,n.states,n.timeoutMs);let p=s;await new Promise((m,h)=>{let f=()=>{clearTimeout(T),n.signal?.removeEventListener("abort",y),m()},y=()=>{clearTimeout(T),h(Np(e.id))},T=setTimeout(f,u);i=f,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var HT=(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}}),Np=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as XT}from"node:net";import{createHash as YT}from"node:crypto";import{tmpdir as zT}from"node:os";import _p from"node:path";var Vr=9,JT=new Set([6,7,8,Vr]);function Gt(e){return e!==void 0&&JT.has(e)}function Je(e){let t=YT("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:_p.join(zT(),`craig-${t}.sock`),pidPath:_p.join(e.runtimeDir,"pty-daemon.pid")}}async function xp(e){let t=null;try{let n=await QT(Je(e.paths).socketPath);return t=new pl(n,e),await t.ready(),t}catch{return t?.close(),null}}var pl=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!==Vr)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})}
|
|
71
|
+
`).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as OT}from"node:child_process";import{access as $T}from"node:fs/promises";var ja=async(e,t)=>{let n=await F(e,t),r=Vn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await $T(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},qa=async e=>{await new Promise((t,n)=>{let r=!1,s=OT("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 DT}from"node:fs/promises";import NT from"node:path";var Ua=async(e,t)=>{let n=await F(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 Js(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 b.load(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);await V(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 J("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}`,m=await V(e,n.id,h=>({...h,status:"review",checks:{...h.checks,results:i,status:"failed",lastRunAt:d},lastFailureReason:p}));return await Sp(e,m),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await V(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 Sp(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},Sp=async(e,t)=>{let n=wn(e,t.artifacts.checkSummaryPath);n&&(await DT(NT.dirname(n),{recursive:!0}),await q(n,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))};var Wa=async(e,t)=>{let n=await F(e,t);await me(n);let r=await Js(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 sp(n.worktreePath),await ip(n.worktreePath,s);let i=await op(n.worktreePath),o=new Date().toISOString(),a=await V(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 _T}from"node:fs/promises";var Ba=async(e,t)=>{let n=await F(e,t),r=await xT(n.worktreePath);return V(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},xT=async e=>{try{return await _T(e),!0}catch{return!1}};var Va=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await lp(e.repoRoot,t.worktreePath),s=new Date().toISOString()}catch(i){r.push(i instanceof Error?i.message:"Failed to remove worktree.")}await V(e,t.id,i=>({...i,cleanup:{...i.cleanup,worktreeRemovedAt:s??i.cleanup.worktreeRemovedAt,preservedWorktree:n.preserveWorktree,warning:r.length>0?r.join(" "):null}}))};var Ka=async(e,t,n)=>{let r=await ut(e,n),s=await V(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}},Ga=async(e,t)=>{let n=await F(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>ut(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};import{spawn as LT}from"node:child_process";var Ha=async(e,t)=>{let n=await F(e,t);await me(n);let s=(await b.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 FT(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},FT=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=LT(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"}.`))})})};import{realpath as Ip}from"node:fs/promises";import Wr from"node:path";async function za(e,t){if(t.explicitTaskId!==void 0){let l=await Pp(e,t.explicitTaskId,"explicit");return Ya(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await Pp(e,t.environmentTaskId,"environment");return Ya(l,"environment",t.environmentAgentTabId)}let n=await Ip(t.cwd).catch(()=>Wr.resolve(t.cwd)),r=await Or(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await jT(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 Ya(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 Pp(e,t,n){try{return await F(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 Ya(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 MT(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function jT(e,t){return(await Promise.all(MT(e).map(r=>Ip(r).catch(()=>Wr.resolve(r))))).some(r=>qT(r,t))}function qT(e,t){let n=Wr.relative(Wr.resolve(e),t);return n===""||!n.startsWith("..")&&!Wr.isAbsolute(n)}var Ja=async(e,t,n="merge",r)=>{let s=await F(e,t),i=r??W(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await wp(s.worktreePath,i,n)};var Br={readTask:F,writeTask:St,withTaskLock:qt,ensureGhAuthenticated:vt,fetchPrView:Hn,discoverPrView:kp,getGitHubRepositoryLocator:Zs,writePrStatusArtifact:kn};async function Qa(e,t,n,r=Br){let s=await r.readTask(e,t),i=await WT(s,n,r);return Bt(s,i,"showTaskPr","shown",[])}async function Za(e,t,n,r=Br){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await sl(s,n,null,r);await il(i,r);let o=await ri(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return Bt(s,i,"discoverTaskPr","not_found",[]);ol(o,i);let a=si(s,i,o.number),l=await al(e,s,i,o,r);return Bt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function el(e,t,n,r,s=Br){let i=rl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await sl(o,r,i.repository,s);Cp(i.repository,a),await il(a,s);let l=await ri(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));BT(l,i),ol(l,a);let c=si(o,a,l.number),d=ll(o,a),u=d&&!Bn(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 al(e,o,a,l,s);return Bt(p,a,"linkTaskPr",c?"unchanged":"linked",u)})}async function UT(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw Xn(e,t);let o=e.prs.find(a=>a.number===n.number)??W(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await ni(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw Xn(e,t);let a=vp(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&dt({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await ni(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&&dt({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&dt({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 tl(e,t,n,r=Br){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await sl(s,n,null,r),o=ll(s,i);if(!o?.number)return Bt(s,i,"refreshTaskPr","not_found",[]);await il(i,r);let a=await ri(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));ol(a,i);let l=await al(e,s,i,a,r);return Bt(l,i,"refreshTaskPr","synced",[])})}async function nl(e,t,n,r,s=Br){let i=rl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await UT(o,r,i,s);if(Cp(i.repository,a),!si(o,a,i.number))return Bt(o,a,"unlinkTaskPr","unchanged",[]);let c=VT(o,a,i.number),d=await Ep(e,c,s);return Bt(d,a,"unlinkTaskPr","unlinked",[])})}function rl(e){let t=e.trim(),n=Wt(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 sl(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw Xn(e,t);return Xa(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 Xn(e,t);return Xa(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 Xa(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&&dt(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 WT(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw Xn(e,t);let s=W(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await ni(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 Xn(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await ni(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function ni(e,t,n,r){let s=vp(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function vp(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Wt(e.url):null}async function Xa(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 il(e,t){await ri("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function ri(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 Cp(e,t){if(e&&!dt(e,t.repository))throw Ap(e,t)}function BT(e,t){let n=Wt(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&&!dt(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 ol(e,t){let n=Wt(e.url);if(!n||!dt(n,t.repository))throw Ap(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 Ap(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 Xn(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 dt(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function al(e,t,n,r,s){let i=si(t,n,r.number),o=It(r,i,n.repository),a=Pt(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:Dp(o)}:l)}),Ep(e,a,s)}function VT(e,t,n){let r=e.prs.filter(i=>!$p(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=Op(r.filter(o=>o.owner&&o.repo&&dt({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?Dp(i):GT(t.repository)}:o)}}return s}async function Ep(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?Na(t):yn(t.prs),s={...t,status:r};return Lr(e,s,n)}function si(e,t,n){return cl(e,t).find(r=>$p(r,t,n))??null}function ll(e,t){if(!t.projectTarget)return W(e);let n=cl(e,t);return Op(n)}function Op(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function cl(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&dt({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?KT(r.pullRequest,t.repository):null;return s&&!n.some(i=>Bn(i,s))?[...n,s]:n}function $p(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||dt({owner:e.owner,name:e.repo},t.repository)}function Bt(e,t,n,r,s){let i=cl(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:ll(e,t),warnings:s}}function Dp(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 KT(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 GT(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:Or,getTask:F,provisionTask:Gn,provisionProjectTask:Dr,createTask:Oa,showTask:Fa,showTaskDiff:Ma,prepareTaskLogs:ja,streamTaskLogs:qa,runChecks:Ua,commitTask:Wa,closeTask:Ba,cleanupTask:Va,addTaskLink:Ka,listTaskLinks:Ga,sortTasksForDisplay:va,resolveSelectedTaskId:Ca,allocateTaskId:Ia,allocateTaskIdForRepo:Kn,allocateProjectTaskId:Er,createDefaultTaskPtyTabs:Nr,assertTaskWorktreeExists:me,resolveTaskLogPath:Vn,buildTaskInspection:Ar,resolveArtifactPath:wn,openTask:Ha,markRunnerFailed:Ea,recordStartupFailure:_r,markTaskStarted:xr,resolveContext:za,prs:{refresh:Ur,refreshChecks:xa,discoverOrRefresh:ti,discoverOrRefreshAll:Jn,discoverOrRefreshMany:La,show:Qa,discover:Za,link:el,refreshAssociation:tl,unlink:nl,merge:Ja,getPrimaryPr:W,isPrTerminal:Ut,isMergeReady:zs,deriveTaskStatus:yn,upsertPr:Pt,normalizePr:It,summarizeRequiredChecks:ba,writePrStatusArtifact:kn}};var Np={idle:0,ready:1,working:2,error:3};function Ct(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 Vt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return Ct(t,n,r,i)}function Qn(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=Vt(e,s.id,t,n);Np[i]>Np[r]&&(r=i)}return r}function ii(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&Ct(s.id,t,n)==="working"))}function pt(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=Vt(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:Qn(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function ul(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=pt([e],t.getSnapshots(),l),d=n.tabId?c.agents.find(m=>m.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 _p(e.id);let u=a-r();if(u<=0)throw HT(e.id,n.states,n.timeoutMs);let p=s;await new Promise((m,h)=>{let f=()=>{clearTimeout(k),n.signal?.removeEventListener("abort",y),m()},y=()=>{clearTimeout(k),h(_p(e.id))},k=setTimeout(f,u);i=f,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var HT=(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}}),_p=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as XT}from"node:net";import{createHash as YT}from"node:crypto";import{tmpdir as zT}from"node:os";import xp from"node:path";var Vr=9,JT=new Set([6,7,8,Vr]);function Kt(e){return e!==void 0&&JT.has(e)}function Je(e){let t=YT("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:xp.join(zT(),`craig-${t}.sock`),pidPath:xp.join(e.runtimeDir,"pty-daemon.pid")}}async function Lp(e){let t=null;try{let n=await QT(Je(e.paths).socketPath);return t=new pl(n,e),await t.ready(),t}catch{return t?.close(),null}}var pl=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!==Vr)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})}
|
|
72
72
|
`);let s=await r;if(!s.ok)throw new Error(s.error);return s}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
|
|
73
73
|
`);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
|
|
74
|
-
`)}}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 QT(e){return new Promise((t,n)=>{let r=XT(e);r.once("connect",()=>t(r)),r.once("error",n)})}var ml={openObserver:Fp,listTasks:e=>P.listTasks(e),getTask:(e,t)=>P.getTask(e,t),now:Date.now};async function ZT(e,t,n=ml){let r=await Lp(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...pt(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function eb(e,t,n=ml){let r=await Lp(e,t.taskId,n),s=await n.openObserver(e);try{let i=pt(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 tb(e,t,n,r=ml){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await ul(s,i,{...n,now:r.now})}finally{i.close()}}async function Lp(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function Fp(e){return fl.open(e)}async function nb(e){return Fp(e)}var fl=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 xp({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:ZT,showAgentStatus:eb,waitForTask:tb,openObserver:nb};import{randomUUID as Sb}from"node:crypto";import{mkdir as of,open as Il,readdir as vl,readFile as zr,rm as Pb,stat as Ib}from"node:fs/promises";import ui from"node:path";import{createHash as ab}from"node:crypto";import{mkdir as Kr,readdir as yl,readFile as Gr,writeFile as lb}from"node:fs/promises";import Ue from"node:path";import{mkdir as Mp,readFile as rb,rm as hl,stat as sb,writeFile as ib}from"node:fs/promises";import gl from"node:path";async function Zn(e,t){let n=gl.join(e.runtimeDir,"fury-store.lock");await Mp(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Mp(n);try{await ib(gl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await hl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!jp(s,"EEXIST"))throw s;let i=await rb(gl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await sb(n).catch(()=>null);if(typeof i?.pid=="number"&&!ob(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await hl(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 hl(n,{recursive:!0,force:!0})}}function ob(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 me=e=>({root:Ue.join(e.craigDir,"fury"),definitions:Ue.join(e.craigDir,"fury","definitions"),plans:Ue.join(e.craigDir,"fury","plans"),approvals:Ue.join(e.craigDir,"fury","approvals"),runs:Ue.join(e.craigDir,"fury","runs"),reviews:Ue.join(e.craigDir,"fury","reviews")});function wl(e){return ab("sha256").update(JSON.stringify(e)).digest("hex")}async function Wp(e,t,n){let r=me(e);await Kr(r.definitions,{recursive:!0});let s=Ue.join(r.definitions,`${t}.yaml`);await lb(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!Ht(i,"EEXIST"))throw i})}async function Up(e,t){return Zn(e,async()=>{let n=await Bp(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 Kr(me(e).plans,{recursive:!0}),await j(Zp(e,i.id),i),i})}async function oi(e,t){li(t,"plan");try{return cb(JSON.parse(await Gr(Zp(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 Bp(e){let t=me(e).plans,n=await yl(t).catch(s=>Ht(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>oi(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Vp(e){let t=await Bp(e),n=await Promise.all(t.map(s=>bl(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 Kp(e,t){return Zn(e,async()=>{let n=await bl(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 Kr(me(e).approvals,{recursive:!0}),await j(ef(e,t.planId),t),{approval:t,created:!0}})}async function Gp(e,t){li(t,"plan");let n=await bl(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function Hp(e,t){return Zn(e,async()=>{let r=(await zp(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 Kr(me(e).runs,{recursive:!0}),await j(kl(e,t.id),t),{run:t,created:!0}})}async function ue(e,t){li(t,"run");try{return Xp(JSON.parse(await Gr(kl(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 Yp(e){return zp(e)}async function zp(e){let t=me(e).runs,n=await yl(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 Xp(JSON.parse(await Gr(Ue.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ve(e,t,n){return Zn(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 j(kl(e,t),s),s})}async function Jp(e,t){await Kr(me(e).reviews,{recursive:!0}),await j(Tl(e,t.id),t)}async function Hr(e,t,n){return Zn(e,async()=>{let r=await er(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await j(Tl(e,t),s),s})}async function er(e,t){li(t,"review");try{return ub(JSON.parse(await Gr(Tl(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 ai(e){let t=me(e).reviews,n=await yl(t).catch(r=>Ht(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>er(e,r.slice(0,-5))))}function Xp(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!Ae(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))||!Ae(e.inputs)||!Qp(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!db(e.stepRuns,e.order)||!Yr(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 cb(e,t){if(!Ae(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||!Ae(e.inputs)||!Qp(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||!Yr(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,wl(n)!==e.planHash)throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function ub(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!Ae(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&&(!Ae(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=>!qp(r))||e.lastDecision!==null&&!qp(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function db(e,t){return Ae(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&pb(e[n],n))}function pb(e,t){return!Ae(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")||!Ae(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||Yr(e.completedBy))}function qp(e){return Ae(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")&&Yr(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Be(e.occurredAt)}function Qp(e){return Ae(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 Yr(e){return Ae(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 kl=(e,t)=>Ue.join(me(e).runs,`${t}.json`),Zp=(e,t)=>Ue.join(me(e).plans,`${t}.json`),ef=(e,t)=>Ue.join(me(e).approvals,`${t}.json`),Tl=(e,t)=>Ue.join(me(e).reviews,`${t}.json`),li=(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 bl(e,t){try{let n=JSON.parse(await Gr(ef(e,t),"utf8"));if(!Ae(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!Yr(n.approvedBy)||!Ae(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 Ae=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 tf,readFile as fb,rm as ci,stat as mb,writeFile as hb}from"node:fs/promises";import Rl from"node:path";var gb=20,yb=3e4,wb=5e3;async function nf(e,t){let n=Rl.join(e.runtimeDir,"event-journal.lock");await tf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await tf(n);try{await hb(Rl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await ci(n,{recursive:!0,force:!0}),s}break}catch(s){if(!bb(s))throw s;if(await kb(n))continue;if(Date.now()-r>=yb)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await Rb(gb)}try{return await t()}finally{await ci(n,{recursive:!0,force:!0})}}async function kb(e){let t=await fb(Rl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return Tb(t.pid)?!1:(await ci(e,{recursive:!0,force:!0}),!0);let n=await mb(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<wb?!1:(await ci(e,{recursive:!0,force:!0}),!0)}function Tb(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 bb=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Rb=e=>new Promise(t=>setTimeout(t,e));var vb=256*1024,Cb=16,Ab=64*1024;async function De(e,t,n={}){let r=Pl(n.maxSegmentBytes??vb,"Event journal segment size"),s=Pl(n.maxSegments??Cb,"Event journal retention"),i=Pl(n.maxRecordBytes??Ab,"Event record size");return nf(e,async()=>{await of(e.eventsDir,{recursive:!0}),await _b(e);let o=await Cl(e),a=t.id??Sb(),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:Fb(t.data)},u=`${JSON.stringify(d)}
|
|
75
|
-
`;if(Buffer.byteLength(u)>i)throw new g("CLI_USAGE",`Event record exceeds the ${i}-byte limit.`,{details:{eventType:t.type,maxRecordBytes:i}});let m=(await di(e)).at(-1),h=!m||await Eb(m.path,u,r);if(h&&(m={name:
|
|
74
|
+
`)}}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 QT(e){return new Promise((t,n)=>{let r=XT(e);r.once("connect",()=>t(r)),r.once("error",n)})}var ml={openObserver:Mp,listTasks:e=>S.listTasks(e),getTask:(e,t)=>S.getTask(e,t),now:Date.now};async function ZT(e,t,n=ml){let r=await Fp(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...pt(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function eb(e,t,n=ml){let r=await Fp(e,t.taskId,n),s=await n.openObserver(e);try{let i=pt(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 tb(e,t,n,r=ml){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await ul(s,i,{...n,now:r.now})}finally{i.close()}}async function Fp(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function Mp(e){return fl.open(e)}async function nb(e){return Mp(e)}var fl=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 Lp({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:ZT,showAgentStatus:eb,waitForTask:tb,openObserver:nb};import{randomUUID as Sb}from"node:crypto";import{mkdir as af,open as Il,readdir as vl,readFile as zr,rm as Pb,stat as Ib}from"node:fs/promises";import ui from"node:path";import{createHash as ab}from"node:crypto";import{mkdir as Kr,readdir as yl,readFile as Gr,writeFile as lb}from"node:fs/promises";import We from"node:path";import{mkdir as jp,readFile as rb,rm as hl,stat as sb,writeFile as ib}from"node:fs/promises";import gl from"node:path";async function Zn(e,t){let n=gl.join(e.runtimeDir,"fury-store.lock");await jp(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await jp(n);try{await ib(gl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await hl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!qp(s,"EEXIST"))throw s;let i=await rb(gl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await sb(n).catch(()=>null);if(typeof i?.pid=="number"&&!ob(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await hl(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 hl(n,{recursive:!0,force:!0})}}function ob(e){try{return process.kill(e,0),!0}catch(t){return qp(t,"EPERM")}}var qp=(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 wl(e){return ab("sha256").update(JSON.stringify(e)).digest("hex")}async function Wp(e,t,n){let r=he(e);await Kr(r.definitions,{recursive:!0});let s=We.join(r.definitions,`${t}.yaml`);await lb(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!Gt(i,"EEXIST"))throw i})}async function Bp(e,t){return Zn(e,async()=>{let n=await Vp(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 Kr(he(e).plans,{recursive:!0}),await q(ef(e,i.id),i),i})}async function oi(e,t){li(t,"plan");try{return cb(JSON.parse(await Gr(ef(e,t),"utf8")),t)}catch(n){throw Gt(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function Vp(e){let t=he(e).plans,n=await yl(t).catch(s=>Gt(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>oi(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Kp(e){let t=await Vp(e),n=await Promise.all(t.map(s=>bl(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 Gp(e,t){return Zn(e,async()=>{let n=await bl(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 Kr(he(e).approvals,{recursive:!0}),await q(tf(e,t.planId),t),{approval:t,created:!0}})}async function Hp(e,t){li(t,"plan");let n=await bl(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function Yp(e,t){return Zn(e,async()=>{let r=(await Jp(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 Kr(he(e).runs,{recursive:!0}),await q(kl(e,t.id),t),{run:t,created:!0}})}async function de(e,t){li(t,"run");try{return Qp(JSON.parse(await Gr(kl(e,t),"utf8")),t)}catch(n){throw Gt(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function zp(e){return Jp(e)}async function Jp(e){let t=he(e).runs,n=await yl(t).catch(s=>Gt(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 Qp(JSON.parse(await Gr(We.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ve(e,t,n){return Zn(e,async()=>{let r=await de(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury mutation cannot change its id.",{});return await q(kl(e,t),s),s})}async function Xp(e,t){await Kr(he(e).reviews,{recursive:!0}),await q(Tl(e,t.id),t)}async function Hr(e,t,n){return Zn(e,async()=>{let r=await er(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await q(Tl(e,t),s),s})}async function er(e,t){li(t,"review");try{return ub(JSON.parse(await Gr(Tl(e,t),"utf8")),t)}catch(n){throw Gt(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function ai(e){let t=he(e).reviews,n=await yl(t).catch(r=>Gt(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>er(e,r.slice(0,-5))))}function Qp(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!Ae(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))||!Ae(e.inputs)||!Zp(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!db(e.stepRuns,e.order)||!Yr(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 cb(e,t){if(!Ae(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||!Ae(e.inputs)||!Zp(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||!Yr(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,wl(n)!==e.planHash)throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function ub(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!Ae(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&&(!Ae(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=>!Up(r))||e.lastDecision!==null&&!Up(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function db(e,t){return Ae(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&pb(e[n],n))}function pb(e,t){return!Ae(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")||!Ae(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||Yr(e.completedBy))}function Up(e){return Ae(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")&&Yr(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Be(e.occurredAt)}function Zp(e){return Ae(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 Yr(e){return Ae(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 kl=(e,t)=>We.join(he(e).runs,`${t}.json`),ef=(e,t)=>We.join(he(e).plans,`${t}.json`),tf=(e,t)=>We.join(he(e).approvals,`${t}.json`),Tl=(e,t)=>We.join(he(e).reviews,`${t}.json`),li=(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 bl(e,t){try{let n=JSON.parse(await Gr(tf(e,t),"utf8"));if(!Ae(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!Yr(n.approvedBy)||!Ae(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(Gt(n,"ENOENT"))return null;throw n}}var Ae=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Be=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Gt=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as nf,readFile as fb,rm as ci,stat as mb,writeFile as hb}from"node:fs/promises";import Rl from"node:path";var gb=20,yb=3e4,wb=5e3;async function rf(e,t){let n=Rl.join(e.runtimeDir,"event-journal.lock");await nf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await nf(n);try{await hb(Rl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await ci(n,{recursive:!0,force:!0}),s}break}catch(s){if(!bb(s))throw s;if(await kb(n))continue;if(Date.now()-r>=yb)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await Rb(gb)}try{return await t()}finally{await ci(n,{recursive:!0,force:!0})}}async function kb(e){let t=await fb(Rl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return Tb(t.pid)?!1:(await ci(e,{recursive:!0,force:!0}),!0);let n=await mb(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<wb?!1:(await ci(e,{recursive:!0,force:!0}),!0)}function Tb(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 bb=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Rb=e=>new Promise(t=>setTimeout(t,e));var vb=256*1024,Cb=16,Ab=64*1024;async function De(e,t,n={}){let r=Pl(n.maxSegmentBytes??vb,"Event journal segment size"),s=Pl(n.maxSegments??Cb,"Event journal retention"),i=Pl(n.maxRecordBytes??Ab,"Event record size");return rf(e,async()=>{await af(e.eventsDir,{recursive:!0}),await _b(e);let o=await Cl(e),a=t.id??Sb(),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:Fb(t.data)},u=`${JSON.stringify(d)}
|
|
75
|
+
`;if(Buffer.byteLength(u)>i)throw new g("CLI_USAGE",`Event record exceeds the ${i}-byte limit.`,{details:{eventType:t.type,maxRecordBytes:i}});let m=(await di(e)).at(-1),h=!m||await Eb(m.path,u,r);if(h&&(m={name:of(c),path:ui.join(e.eventsDir,of(c)),startSequence:c}),!m)throw new g("INTERNAL_ERROR","Failed to select an event journal segment.",{});let f=await Il(m.path,"a");try{await f.writeFile(u,"utf8"),await f.sync()}finally{await f.close()}return h&&await cf(e.eventsDir),await Ob(e,s),d})}async function Tn(e,t={}){let n=await Cl(e),r=xb(n.events,t.after,n.earliestSequence,n.events.at(-1)?.sequence??null),s=t.typeGlob?Lb(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 lf(e){return(await Cl(e)).events}async function Cl(e){await af(e.eventsDir,{recursive:!0});let t=await di(e),n=[],r=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await zr(i.path,"utf8"),a=s===t.length-1,l=o.split(`
|
|
76
76
|
`);if(o.endsWith(`
|
|
77
|
-
`))l.pop();else{if(!a)throw
|
|
78
|
-
`))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 _b(e){let t=(await di(e)).at(-1);if(!t)return;let n=await zr(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await Il(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function xb(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 Sl(t);return rf(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}}):Sl(t);return rf(t,s.sequence,n),s.sequence}function rf(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 Lb(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 Fb(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 Mb(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))||!tr(i.workspaceId)||!tr(i.taskId)||!tr(i.agentTabId)||!tr(i.commandId)||!tr(i.furyRunId)||!tr(i.furyStepId)||!jb(i.actor)||!("data"in i))throw Yt(t,`record at line ${n} has an invalid schema`);return i}function jb(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 tr=e=>e===null||typeof e=="string",sf=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}}),Sl=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),Al=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Pl(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 lf(e){let t=await Il(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as df,readdir as Jb,readFile as pf}from"node:fs/promises";import ff from"node:path";import{mkdir as cf,readFile as qb,rm as pi,stat as Wb,writeFile as Ub}from"node:fs/promises";import El from"node:path";var Bb=20,Vb=3e4,Kb=5e3;async function Ol(e,t){let n=El.join(e.runtimeDir,"command-store.lock");await cf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await cf(n);try{await Ub(El.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 command store 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(El.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 Wb(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));async function hi(e,t){$l(t);try{let n=JSON.parse(await pf(Jr(e,t),"utf8"));return hf(n,Jr(e,t),t)}catch(n){throw eR(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?mi(t,Jr(e,t),n):n}}async function Ke(e){await df(e.commandsDir,{recursive:!0});let t=await Jb(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=ff.join(e.commandsDir,r);try{n.push(hf(JSON.parse(await pf(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:mi(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function mf(e,t){return $l(t.id),Ol(e,async()=>{await df(e.commandsDir,{recursive:!0});let n=await Ke(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!Xb(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 j(Jr(e,t.id),t),{command:t,created:!0}})}async function Xr(e,t,n){return $l(t),Ol(e,async()=>{let r=await hi(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await j(Jr(e,t),s),s})}function Xb(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 hf(e,t,n){if(!fi(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw mi("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||!fi(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!Zb(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||!nr(e.expiresAt)||!nr(e.createdAt)||!nr(e.updatedAt)||e.deliveryStartedAt!==null&&!nr(e.deliveryStartedAt)||e.deliveredAt!==null&&!nr(e.deliveredAt)||e.cancelledAt!==null&&!nr(e.cancelledAt)||e.cancelledBy!==null&&!uf(e.cancelledBy)||!uf(e.actor)||!Qb(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 mi(r,t);return e}function uf(e){return!fi(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 Qb(e){return e===null||fi(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var Jr=(e,t)=>ff.join(e.commandsDir,`${t}.json`),$l=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},nr=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),Zb=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}),fi=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),eR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",mi=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function gf(e,t=new Date){return gi(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function yf(e,t=new Date){return e.state==="delivered"?e:(gi(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function wf(e,t,n=new Date){return e.state==="failed"?e:(gi(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function kf(e,t,n=new Date){return e.state==="cancelled"?e:(gi(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function gi(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 tR}from"node:crypto";var Dl=32*1024,Tf=1440*60*1e3,Nl=256,nR=["delivered","failed","cancelled"],_l={type:"system",component:"orchestration-supervisor"};async function rR(e,t){if(dR(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>Tf)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:Tf}});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)>Nl)throw new g("CLI_USAGE",`Idempotency key exceeds ${Nl} characters.`,{details:{maxIdempotencyKeyLength:Nl}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${tR()}`,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 mf(e,r);if(s.created)try{await bn(e,s.command,"command.queued")}catch(i){throw bf(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function sR(e,t){return{kind:"showPromptCommand",command:await hi(e,t)}}async function iR(e,t){let n=await Ke(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function oR(e,t,n){let r=!1,s=await Xr(e,t,i=>{if(i.state==="cancelled")return i;let o=kf(i,n??i.actor);return r=!0,o});if(r)try{await bn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw bf(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function aR(e,t){let n=await Xr(e,t,r=>gf(r));return await bn(e,n,"command.delivering",_l),n}async function lR(e,t){let n=await Xr(e,t,r=>yf(r));return await bn(e,n,"command.delivered",_l),n}async function cR(e,t,n){let r=await Xr(e,t,s=>wf(s,n));return await bn(e,r,"command.failed",_l),r}async function uR(e,t,n){let r=[...n.states??nR],s=Date.now()+n.timeoutMs;for(;;){let i=await hi(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 pR(Math.min(n.pollIntervalMs??100,o),n.signal)}}function dR(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>Dl)throw new g("CLI_USAGE",`Prompt exceeds the ${Dl}-byte limit.`,{details:{maxPromptBytes:Dl,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 bn(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 pR(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 bf=(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:rR,show:sR,list:iR,cancel:oR,wait:uR,beginDelivery:aR,completeDelivery:lR,fail:cR};import{randomUUID as Sf,timingSafeEqual as fR}from"node:crypto";import{mkdir as mR,readFile as hR,readdir as gR}from"node:fs/promises";import Pf from"node:path";var yR=10080*60*1e3,wR={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},kR=["task.create-child","task.children","task.cancel-tree"],TR=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function Xe(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 mR(Ml(e),{recursive:!0,mode:448}),await V(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_${Sf()}`,c=await yi(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 bR(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 bR(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${Sf()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...kR],targetPolicy:"children-only",limits:{...wR},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+yR).toISOString(),revokedAt:null,revokedBy:null};return await j(jl(e,o.id),o,{mode:384}),o}async function Ge(e,t,n,r){let s=await SR(e,t);return s.revokedAt&&Rn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&Rn(s.id,"expired"),!TR.has(n)&&!s.allowedCommandFamilies.includes(n)&&Rn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await RR(e,s.taskId,r)&&Rn(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 RR(e,t,n){if(t===n)return!0;let r=(await P.listTasks(e,{includeClosed:!0})).tasks,s=new Map(r.map(a=>[a.id,a])),i=s.get(n),o=new Set;for(;i?.parentTaskId&&!o.has(i.id);){if(i.parentTaskId===t)return!0;o.add(i.id),i=s.get(i.parentTaskId)}return!1}async function If(e,t,n){let r=await yi(e,t);r&&(r.revokedAt||await j(jl(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function Fl(e,t,n){let r=await gR(Ml(e)).catch(i=>vf(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 yi(e,o[1]);!a||!t.has(a.taskId)||(await If(e,a.id,n),s.push(a.id))}return s}async function SR(e,t){let n=t.indexOf("."),r=n>0?t.slice(0,n):"";/^capability_[A-Za-z0-9-]+$/.test(r)||Rn("<redacted>","token is invalid");let s=await yi(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||!fR(i,o))&&Rn(r,"token is invalid"),s}async function yi(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||Rn(t,"identifier is invalid");try{let n=JSON.parse(await hR(jl(e,t),"utf8"));if(!PR(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(vf(n))return null;throw n}}function PR(e,t){if(!Ll(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"&&IR(r))&&e.targetPolicy==="children-only"&&Ll(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&xl(e.createdAt)&&xl(e.expiresAt)&&Rf(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||xl(e.revokedAt)&&Rf(e.revokedBy))}function Rf(e){return Ll(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 Rn(e,t){throw new g("CAPABILITY_DENIED",`Craig capability ${e} was denied: ${t}.`,{details:{capabilityId:e,reason:t}})}var Ml=e=>Pf.join(e.orchestrationDir,"capabilities"),jl=(e,t)=>Pf.join(Ml(e),`${t}.json`),IR=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),Ll=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),xl=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),vf=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as Cf,readFile as vR,rm as ql,stat as CR,writeFile as AR}from"node:fs/promises";import Wl from"node:path";var ER=20,OR=3e4,$R=5e3;async function Ul(e,t){let n=Wl.join(e.runtimeDir,"delegation.lock");await Cf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Cf(n);try{await AR(Wl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await ql(n,{recursive:!0,force:!0}),s}break}catch(s){if(!_R(s))throw s;if(await DR(n))continue;if(Date.now()-r>=OR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,ER))}try{return await t()}finally{await ql(n,{recursive:!0,force:!0})}}async function DR(e){let t=await vR(Wl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&NR(t.pid))return!1;let n=await CR(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<$R?!1:(await ql(e,{recursive:!0,force:!0}),!0)}function NR(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 _R=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var xR={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function Bl(e,t,n,r={}){let s=await k.load(e);return k.previews.isEnabled(s,"agentOrchestration")?P.createTask(e,t,n,{...r,onProvisioned:async i=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:i.id,CRAIG_AGENT_TAB_ID:i.ptyTabs.find(o=>o.kind==="agent")?.id??"",...await Xe(e,i,{type:"human",source:"cli",processId:process.pid})})}):P.createTask(e,t,n,r)}async function Vl(e,t,n={}){return Ul(e,async()=>{let r=await P.getTask(e,t.parentTaskId),s=t.capabilityId?await Ge(e,t.capabilityId,"task.create-child",r.id):null,i=s?.actor??{type:"human",source:"cli",processId:process.pid},o=s?.capability.limits??xR,a=LR(r,t),l=t.prompt.trim();if(l.length===0)throw new g("CLI_USAGE","Child task prompt cannot be empty.",{});Buffer.byteLength(l)>o.maxPromptBytes&&wi("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&wi("delegation depth",o.maxDepth);let c=new Set([r.repoId,...r.linkedRepoIds,...(r.repoTargets??[]).map(y=>y.repoId)]);if(a.type==="repo"&&!c.has(a.id))throw new g("CAPABILITY_DENIED",`Repo ${a.id} is outside parent task ${r.id}.`,{details:{parentTaskId:r.id,repoId:a.id}});let u=(await P.listTasks(e,{includeClosed:!0})).tasks.filter(y=>y.parentTaskId===r.id),p=t.idempotencyKey?.trim()||null;if(p){if(p.length>256)throw new g("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let y=u.find(T=>T.delegationIdempotencyKey===p);if(y){if(!FR(y,a)||y.prompt.value!==l||t.runner&&y.runner!==t.runner)throw new g("COMMAND_STATE_CONFLICT",`Idempotency key "${p}" is already used by child ${y.id}.`,{details:{idempotencyKey:p,taskId:y.id}});return Af(y,!0)}}u.length>=o.maxChildren&&wi("children",o.maxChildren),u.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&wi("concurrent children",o.maxConcurrentChildren);let h=await(n.createTask??P.createTask)(e,a.id,l,{...t.runner?{runner:t.runner}:{},...a.type==="workspace"?{workspaceId:a.id}:{owningWorkspaceId:r.workspaceId},lineage:{parentTaskId:r.id,rootTaskId:r.rootTaskId,delegationDepth:r.delegationDepth+1,delegationIdempotencyKey:p,furyRunId:t.fury?.runId??r.furyRunId,furyStepId:t.fury?.stepId??null},onProvisioned:async y=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:y.id,CRAIG_AGENT_TAB_ID:y.ptyTabs.find(T=>T.kind==="agent")?.id??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await Xe(e,y,i)})}),f=await P.getTask(e,h.taskId);try{await De(e,{workspaceId:f.workspaceId,taskId:f.id,agentTabId:i.type==="agent"?i.agentTabId:null,type:"task.child.created",actor:i,data:{parentTaskId:r.id,rootTaskId:f.rootTaskId,delegationDepth:f.delegationDepth,targetType:a.type,targetId:a.id}})}catch(y){throw new g("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:y})}return Af(f,!1)})}async function Kl(e,t,n){n&&await Ge(e,n,"task.children",t),await P.getTask(e,t);let r=(await P.listTasks(e,{includeClosed:!0})).tasks.filter(s=>s.parentTaskId===t).sort((s,i)=>s.id.localeCompare(i.id));return{kind:"listTaskChildren",taskId:t,children:r}}async function Gl(e,t,n){return Ul(e,async()=>{let s=(n?await Ge(e,n,"task.cancel-tree",t):null)?.actor??{type:"human",source:"cli",processId:process.pid};await P.getTask(e,t);let i=(await P.listTasks(e,{includeClosed:!0})).tasks,o=new Map(i.map(h=>[h.id,h])),a=new Map;for(let h of i)h.parentTaskId&&a.set(h.parentTaskId,[...a.get(h.parentTaskId)??[],h]);let l=[],c=new Set,d=h=>{if(c.has(h))throw new g("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${h}.`,{details:{taskId:h,rootTaskId:t}});let f=o.get(h);if(f){c.add(h),l.push(f);for(let y of(a.get(h)??[]).sort((T,R)=>T.id.localeCompare(R.id)))d(y.id)}};d(t);let u=[],p=[],m=[];try{await Fl(e,new Set(l.map(h=>h.id)),s)}catch{m.push(...l.map(h=>h.id))}for(let h of l){let f=h.status;if(f==="closed"){u.push({taskId:h.id,previousStatus:f,status:"closed",disposition:"already-closed"});continue}await P.cleanupTask(e,h,{preserveWorktree:!0});let y=await P.closeTask(e,h.id);u.push({taskId:h.id,previousStatus:f,status:y.status,disposition:"cancelled"});try{await De(e,{workspaceId:h.workspaceId,taskId:h.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:f}})}catch{p.push(h.id)}}if(p.length>0||m.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:m,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:u}})}function Af(e,t){let n=e.type==="project"?"workspace":"repo",r=e.ptyTabs.find(s=>s.kind==="agent");if(!r)throw new g("TASK_RECORD_INVALID",`Child task ${e.id} has no agent tab.`,{});return{kind:"createChildTask",taskId:e.id,parentTaskId:e.parentTaskId,rootTaskId:e.rootTaskId,delegationDepth:e.delegationDepth,targetType:n,targetId:n==="workspace"?e.workspaceId:e.repoId,repoId:e.repoId,workspaceId:e.workspaceId,agentTabId:r.id,status:e.status,branch:e.branch,worktreePath:e.worktreePath,runner:e.runner,idempotentReplay:t}}function LR(e,t){if(t.repoId&&t.workspaceId)throw new g("CLI_USAGE","Child task creation accepts only one of repoId or workspaceId.",{});if(t.workspaceId){if(e.type!=="project"||t.workspaceId!==e.workspaceId)throw new g("CAPABILITY_DENIED",`Workspace ${t.workspaceId} is outside parent task ${e.id}.`,{details:{parentTaskId:e.id,workspaceId:t.workspaceId}});return{type:"workspace",id:t.workspaceId}}return t.repoId?{type:"repo",id:t.repoId}:e.type==="project"?{type:"workspace",id:e.workspaceId}:{type:"repo",id:e.repoId}}function FR(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function wi(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var ki=Symbol.for("yaml.alias"),Ti=Symbol.for("yaml.document"),Qe=Symbol.for("yaml.map"),Hl=Symbol.for("yaml.pair"),Ne=Symbol.for("yaml.scalar"),Et=Symbol.for("yaml.seq"),Pe=Symbol.for("yaml.node.type"),_e=e=>!!e&&typeof e=="object"&&e[Pe]===ki,ft=e=>!!e&&typeof e=="object"&&e[Pe]===Ti,Ze=e=>!!e&&typeof e=="object"&&e[Pe]===Qe,F=e=>!!e&&typeof e=="object"&&e[Pe]===Hl,_=e=>!!e&&typeof e=="object"&&e[Pe]===Ne,et=e=>!!e&&typeof e=="object"&&e[Pe]===Et;function W(e){if(e&&typeof e=="object")switch(e[Pe]){case Qe:case Et:return!0}return!1}function M(e){if(e&&typeof e=="object")switch(e[Pe]){case ki:case Qe:case Ne:case Et:return!0}return!1}var bi=e=>(_(e)||W(e))&&!!e.anchor;var Ee=Symbol("break visit"),Ef=Symbol("skip children"),mt=Symbol("remove node");function He(e,t){let n=Of(t);ft(e)?rr(null,e.contents,n,Object.freeze([e]))===mt&&(e.contents=null):rr(null,e,n,Object.freeze([]))}He.BREAK=Ee;He.SKIP=Ef;He.REMOVE=mt;function rr(e,t,n,r){let s=$f(e,t,n,r);if(M(s)||F(s))return Df(e,r,s),rr(e,s,n,r);if(typeof s!="symbol"){if(W(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=rr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ee)return Ee;o===mt&&(t.items.splice(i,1),i-=1)}}}else if(F(t)){r=Object.freeze(r.concat(t));let i=rr("key",t.key,n,r);if(i===Ee)return Ee;i===mt&&(t.key=null);let o=rr("value",t.value,n,r);if(o===Ee)return Ee;o===mt&&(t.value=null)}}return s}async function Ri(e,t){let n=Of(t);ft(e)?await sr(null,e.contents,n,Object.freeze([e]))===mt&&(e.contents=null):await sr(null,e,n,Object.freeze([]))}Ri.BREAK=Ee;Ri.SKIP=Ef;Ri.REMOVE=mt;async function sr(e,t,n,r){let s=await $f(e,t,n,r);if(M(s)||F(s))return Df(e,r,s),sr(e,s,n,r);if(typeof s!="symbol"){if(W(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=await sr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ee)return Ee;o===mt&&(t.items.splice(i,1),i-=1)}}}else if(F(t)){r=Object.freeze(r.concat(t));let i=await sr("key",t.key,n,r);if(i===Ee)return Ee;i===mt&&(t.key=null);let o=await sr("value",t.value,n,r);if(o===Ee)return Ee;o===mt&&(t.value=null)}}return s}function Of(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 $f(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(Ze(t))return n.Map?.(e,t,r);if(et(t))return n.Seq?.(e,t,r);if(F(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 Df(e,t,n){let r=t[t.length-1];if(W(r))r.items[e]=n;else if(F(r))e==="key"?r.key=n:r.value=n;else if(ft(r))r.contents=n;else{let s=_e(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var MR={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},jR=e=>e.replace(/[!,[\]{}]/g,t=>MR[t]),ht=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+jR(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&&M(t.contents)){let i={};He(t.contents,(o,a)=>{M(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(`
|
|
79
|
-
`)}};ht.defaultYaml={explicit:!1,version:"1.2"};ht.defaultTags={"!!":"tag:yaml.org,2002:"};function Si(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 Yl(e){let t=new Set;return He(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function zl(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function
|
|
77
|
+
`))l.pop();else{if(!a)throw Ht(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 Ht(i.name,`empty record at line ${c+1}`);let u;try{u=JSON.parse(d)}catch{throw Ht(i.name,`invalid JSON at line ${c+1}`)}let p=Mb(u,i.name,c+1);if(c===0&&p.sequence!==i.startSequence)throw Ht(i.name,`first record sequence ${p.sequence} does not match segment name`);if(r.has(p.id))throw Ht(i.name,`duplicate event id ${p.id}`);r.add(p.id);let m=n.at(-1);if(m&&p.sequence!==m.sequence+1)throw Ht(i.name,`non-monotonic sequence ${p.sequence} after ${m.sequence}`);n.push(p)}}return{events:n,earliestSequence:n[0]?.sequence??null}}async function di(e){return(await vl(e.eventsDir).catch(n=>{if(Al(n))return[];throw n})).flatMap(n=>{let r=/^segment-(\d{16})\.jsonl$/.exec(n);return r?[{name:n,path:ui.join(e.eventsDir,n),startSequence:Number(r[1])}]:[]}).sort((n,r)=>n.startSequence-r.startSequence)}async function Eb(e,t,n){let r=await Ib(e).catch(()=>null);return r!==null&&r.size>0&&r.size+Buffer.byteLength(t)>n}async function Ob(e,t){let n=await di(e),r=Math.max(0,n.length-t),s=await Db(e),i=await $b(e);if(s===null||i===null)return;for(let a=0;a<r;a+=1)if(await Nb(n[a].path,s,i)){r=a;break}let o=n.slice(0,r);for(let a of o)await Pb(a.path,{force:!0});o.length>0&&await cf(e.eventsDir)}async function $b(e){let t=he(e).runs,n=await vl(t).catch(s=>{if(Al(s))return[];throw s}),r=new Set;for(let s of n.filter(i=>i.endsWith(".json")))try{let i=JSON.parse(await zr(ui.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 Db(e){let t=await vl(e.commandsDir).catch(r=>{if(Al(r))return[];throw r}),n=new Set;for(let r of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await zr(ui.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 Nb(e,t,n){if(t.size===0&&n.size===0)return!1;let r=await zr(e,"utf8");for(let s of r.split(`
|
|
78
|
+
`))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 _b(e){let t=(await di(e)).at(-1);if(!t)return;let n=await zr(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await Il(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function xb(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 Sl(t);return sf(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}}):Sl(t);return sf(t,s.sequence,n),s.sequence}function sf(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 Lb(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 Fb(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 Mb(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw Ht(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))||!tr(i.workspaceId)||!tr(i.taskId)||!tr(i.agentTabId)||!tr(i.commandId)||!tr(i.furyRunId)||!tr(i.furyStepId)||!jb(i.actor)||!("data"in i))throw Ht(t,`record at line ${n} has an invalid schema`);return i}function jb(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 tr=e=>e===null||typeof e=="string",of=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,Ht=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),Sl=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),Al=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Pl(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 cf(e){let t=await Il(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as pf,readdir as Jb,readFile as ff}from"node:fs/promises";import mf from"node:path";import{mkdir as uf,readFile as qb,rm as pi,stat as Ub,writeFile as Wb}from"node:fs/promises";import El from"node:path";var Bb=20,Vb=3e4,Kb=5e3;async function Ol(e,t){let n=El.join(e.runtimeDir,"command-store.lock");await uf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await uf(n);try{await Wb(El.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 command store 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(El.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));async function hi(e,t){$l(t);try{let n=JSON.parse(await ff(Jr(e,t),"utf8"));return gf(n,Jr(e,t),t)}catch(n){throw eR(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?mi(t,Jr(e,t),n):n}}async function Ke(e){await pf(e.commandsDir,{recursive:!0});let t=await Jb(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=mf.join(e.commandsDir,r);try{n.push(gf(JSON.parse(await ff(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:mi(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function hf(e,t){return $l(t.id),Ol(e,async()=>{await pf(e.commandsDir,{recursive:!0});let n=await Ke(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!Xb(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 q(Jr(e,t.id),t),{command:t,created:!0}})}async function Xr(e,t,n){return $l(t),Ol(e,async()=>{let r=await hi(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await q(Jr(e,t),s),s})}function Xb(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 gf(e,t,n){if(!fi(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw mi("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||!fi(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!Zb(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||!nr(e.expiresAt)||!nr(e.createdAt)||!nr(e.updatedAt)||e.deliveryStartedAt!==null&&!nr(e.deliveryStartedAt)||e.deliveredAt!==null&&!nr(e.deliveredAt)||e.cancelledAt!==null&&!nr(e.cancelledAt)||e.cancelledBy!==null&&!df(e.cancelledBy)||!df(e.actor)||!Qb(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 mi(r,t);return e}function df(e){return!fi(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 Qb(e){return e===null||fi(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var Jr=(e,t)=>mf.join(e.commandsDir,`${t}.json`),$l=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},nr=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),Zb=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}),fi=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),eR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",mi=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function yf(e,t=new Date){return gi(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function wf(e,t=new Date){return e.state==="delivered"?e:(gi(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function kf(e,t,n=new Date){return e.state==="failed"?e:(gi(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function Tf(e,t,n=new Date){return e.state==="cancelled"?e:(gi(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function gi(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 tR}from"node:crypto";var Dl=32*1024,bf=1440*60*1e3,Nl=256,nR=["delivered","failed","cancelled"],_l={type:"system",component:"orchestration-supervisor"};async function rR(e,t){if(dR(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>bf)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:bf}});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)>Nl)throw new g("CLI_USAGE",`Idempotency key exceeds ${Nl} characters.`,{details:{maxIdempotencyKeyLength:Nl}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${tR()}`,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 hf(e,r);if(s.created)try{await bn(e,s.command,"command.queued")}catch(i){throw Rf(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function sR(e,t){return{kind:"showPromptCommand",command:await hi(e,t)}}async function iR(e,t){let n=await Ke(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function oR(e,t,n){let r=!1,s=await Xr(e,t,i=>{if(i.state==="cancelled")return i;let o=Tf(i,n??i.actor);return r=!0,o});if(r)try{await bn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw Rf(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function aR(e,t){let n=await Xr(e,t,r=>yf(r));return await bn(e,n,"command.delivering",_l),n}async function lR(e,t){let n=await Xr(e,t,r=>wf(r));return await bn(e,n,"command.delivered",_l),n}async function cR(e,t,n){let r=await Xr(e,t,s=>kf(s,n));return await bn(e,r,"command.failed",_l),r}async function uR(e,t,n){let r=[...n.states??nR],s=Date.now()+n.timeoutMs;for(;;){let i=await hi(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 pR(Math.min(n.pollIntervalMs??100,o),n.signal)}}function dR(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>Dl)throw new g("CLI_USAGE",`Prompt exceeds the ${Dl}-byte limit.`,{details:{maxPromptBytes:Dl,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 bn(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 pR(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 Rf=(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}),ae={create:rR,show:sR,list:iR,cancel:oR,wait:uR,beginDelivery:aR,completeDelivery:lR,fail:cR};import{randomUUID as Pf,timingSafeEqual as fR}from"node:crypto";import{mkdir as mR,readFile as hR,readdir as gR}from"node:fs/promises";import If from"node:path";var yR=10080*60*1e3,wR={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},kR=["task.create-child","task.children","task.cancel-tree"],TR=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function Xe(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 mR(Ml(e),{recursive:!0,mode:448}),await V(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_${Pf()}`,c=await yi(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 bR(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 bR(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${Pf()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...kR],targetPolicy:"children-only",limits:{...wR},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+yR).toISOString(),revokedAt:null,revokedBy:null};return await q(jl(e,o.id),o,{mode:384}),o}async function Ge(e,t,n,r){let s=await SR(e,t);return s.revokedAt&&Rn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&Rn(s.id,"expired"),!TR.has(n)&&!s.allowedCommandFamilies.includes(n)&&Rn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await RR(e,s.taskId,r)&&Rn(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 RR(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 vf(e,t,n){let r=await yi(e,t);r&&(r.revokedAt||await q(jl(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function Fl(e,t,n){let r=await gR(Ml(e)).catch(i=>Cf(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 yi(e,o[1]);!a||!t.has(a.taskId)||(await vf(e,a.id,n),s.push(a.id))}return s}async function SR(e,t){let n=t.indexOf("."),r=n>0?t.slice(0,n):"";/^capability_[A-Za-z0-9-]+$/.test(r)||Rn("<redacted>","token is invalid");let s=await yi(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||!fR(i,o))&&Rn(r,"token is invalid"),s}async function yi(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||Rn(t,"identifier is invalid");try{let n=JSON.parse(await hR(jl(e,t),"utf8"));if(!PR(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(Cf(n))return null;throw n}}function PR(e,t){if(!Ll(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"&&IR(r))&&e.targetPolicy==="children-only"&&Ll(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&xl(e.createdAt)&&xl(e.expiresAt)&&Sf(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||xl(e.revokedAt)&&Sf(e.revokedBy))}function Sf(e){return Ll(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 Rn(e,t){throw new g("CAPABILITY_DENIED",`Craig capability ${e} was denied: ${t}.`,{details:{capabilityId:e,reason:t}})}var Ml=e=>If.join(e.orchestrationDir,"capabilities"),jl=(e,t)=>If.join(Ml(e),`${t}.json`),IR=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),Ll=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),xl=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Cf=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as Af,readFile as vR,rm as ql,stat as CR,writeFile as AR}from"node:fs/promises";import Ul from"node:path";var ER=20,OR=3e4,$R=5e3;async function Wl(e,t){let n=Ul.join(e.runtimeDir,"delegation.lock");await Af(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Af(n);try{await AR(Ul.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await ql(n,{recursive:!0,force:!0}),s}break}catch(s){if(!_R(s))throw s;if(await DR(n))continue;if(Date.now()-r>=OR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,ER))}try{return await t()}finally{await ql(n,{recursive:!0,force:!0})}}async function DR(e){let t=await vR(Ul.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&NR(t.pid))return!1;let n=await CR(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<$R?!1:(await ql(e,{recursive:!0,force:!0}),!0)}function NR(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 _R=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var xR={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function Bl(e,t,n,r={}){let s=await b.load(e);return b.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 Xe(e,i,{type:"human",source:"cli",processId:process.pid})})}):S.createTask(e,t,n,r)}async function Vl(e,t,n={}){return Wl(e,async()=>{let r=await S.getTask(e,t.parentTaskId),s=t.capabilityId?await Ge(e,t.capabilityId,"task.create-child",r.id):null,i=s?.actor??{type:"human",source:"cli",processId:process.pid},o=s?.capability.limits??xR,a=LR(r,t),l=t.prompt.trim();if(l.length===0)throw new g("CLI_USAGE","Child task prompt cannot be empty.",{});Buffer.byteLength(l)>o.maxPromptBytes&&wi("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&wi("delegation depth",o.maxDepth);let c=new Set([r.repoId,...r.linkedRepoIds,...(r.repoTargets??[]).map(y=>y.repoId)]);if(a.type==="repo"&&!c.has(a.id))throw new g("CAPABILITY_DENIED",`Repo ${a.id} is outside parent task ${r.id}.`,{details:{parentTaskId:r.id,repoId:a.id}});let u=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(y=>y.parentTaskId===r.id),p=t.idempotencyKey?.trim()||null;if(p){if(p.length>256)throw new g("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let y=u.find(k=>k.delegationIdempotencyKey===p);if(y){if(!FR(y,a)||y.prompt.value!==l||t.runner&&y.runner!==t.runner)throw new g("COMMAND_STATE_CONFLICT",`Idempotency key "${p}" is already used by child ${y.id}.`,{details:{idempotencyKey:p,taskId:y.id}});return Ef(y,!0)}}u.length>=o.maxChildren&&wi("children",o.maxChildren),u.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&wi("concurrent children",o.maxConcurrentChildren);let h=await(n.createTask??S.createTask)(e,a.id,l,{...t.runner?{runner:t.runner}:{},...a.type==="workspace"?{workspaceId:a.id}:{owningWorkspaceId:r.workspaceId,...r.type==="project"&&r.linkedRepoIds.includes(a.id)?{allowLinkedProjectRepo:!0}:{}},lineage:{parentTaskId:r.id,rootTaskId:r.rootTaskId,delegationDepth:r.delegationDepth+1,delegationIdempotencyKey:p,furyRunId:t.fury?.runId??r.furyRunId,furyStepId:t.fury?.stepId??null},onProvisioned:async y=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:y.id,CRAIG_AGENT_TAB_ID:y.ptyTabs.find(k=>k.kind==="agent")?.id??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await Xe(e,y,i)})}),f=await S.getTask(e,h.taskId);try{await De(e,{workspaceId:f.workspaceId,taskId:f.id,agentTabId:i.type==="agent"?i.agentTabId:null,type:"task.child.created",actor:i,data:{parentTaskId:r.id,rootTaskId:f.rootTaskId,delegationDepth:f.delegationDepth,targetType:a.type,targetId:a.id}})}catch(y){throw new g("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:y})}return Ef(f,!1)})}async function Kl(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 Gl(e,t,n){return Wl(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(h=>[h.id,h])),a=new Map;for(let h of i)h.parentTaskId&&a.set(h.parentTaskId,[...a.get(h.parentTaskId)??[],h]);let l=[],c=new Set,d=h=>{if(c.has(h))throw new g("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${h}.`,{details:{taskId:h,rootTaskId:t}});let f=o.get(h);if(f){c.add(h),l.push(f);for(let y of(a.get(h)??[]).sort((k,R)=>k.id.localeCompare(R.id)))d(y.id)}};d(t);let u=[],p=[],m=[];try{await Fl(e,new Set(l.map(h=>h.id)),s)}catch{m.push(...l.map(h=>h.id))}for(let h of l){let f=h.status;if(f==="closed"){u.push({taskId:h.id,previousStatus:f,status:"closed",disposition:"already-closed"});continue}await S.cleanupTask(e,h,{preserveWorktree:!0});let y=await S.closeTask(e,h.id);u.push({taskId:h.id,previousStatus:f,status:y.status,disposition:"cancelled"});try{await De(e,{workspaceId:h.workspaceId,taskId:h.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:f}})}catch{p.push(h.id)}}if(p.length>0||m.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:m,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:u}})}function Ef(e,t){let n=e.type==="project"?"workspace":"repo",r=e.ptyTabs.find(s=>s.kind==="agent");if(!r)throw new g("TASK_RECORD_INVALID",`Child task ${e.id} has no agent tab.`,{});return{kind:"createChildTask",taskId:e.id,parentTaskId:e.parentTaskId,rootTaskId:e.rootTaskId,delegationDepth:e.delegationDepth,targetType:n,targetId:n==="workspace"?e.workspaceId:e.repoId,repoId:e.repoId,workspaceId:e.workspaceId,agentTabId:r.id,status:e.status,branch:e.branch,worktreePath:e.worktreePath,runner:e.runner,idempotentReplay:t}}function LR(e,t){if(t.repoId&&t.workspaceId)throw new g("CLI_USAGE","Child task creation accepts only one of repoId or workspaceId.",{});if(t.workspaceId){if(e.type!=="project"||t.workspaceId!==e.workspaceId)throw new g("CAPABILITY_DENIED",`Workspace ${t.workspaceId} is outside parent task ${e.id}.`,{details:{parentTaskId:e.id,workspaceId:t.workspaceId}});return{type:"workspace",id:t.workspaceId}}return t.repoId?{type:"repo",id:t.repoId}:e.type==="project"?{type:"workspace",id:e.workspaceId}:{type:"repo",id:e.repoId}}function FR(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function wi(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var ki=Symbol.for("yaml.alias"),Ti=Symbol.for("yaml.document"),Qe=Symbol.for("yaml.map"),Hl=Symbol.for("yaml.pair"),Ne=Symbol.for("yaml.scalar"),Et=Symbol.for("yaml.seq"),Pe=Symbol.for("yaml.node.type"),_e=e=>!!e&&typeof e=="object"&&e[Pe]===ki,ft=e=>!!e&&typeof e=="object"&&e[Pe]===Ti,Ze=e=>!!e&&typeof e=="object"&&e[Pe]===Qe,M=e=>!!e&&typeof e=="object"&&e[Pe]===Hl,_=e=>!!e&&typeof e=="object"&&e[Pe]===Ne,et=e=>!!e&&typeof e=="object"&&e[Pe]===Et;function U(e){if(e&&typeof e=="object")switch(e[Pe]){case Qe:case Et:return!0}return!1}function j(e){if(e&&typeof e=="object")switch(e[Pe]){case ki:case Qe:case Ne:case Et:return!0}return!1}var bi=e=>(_(e)||U(e))&&!!e.anchor;var Ee=Symbol("break visit"),Of=Symbol("skip children"),mt=Symbol("remove node");function He(e,t){let n=$f(t);ft(e)?rr(null,e.contents,n,Object.freeze([e]))===mt&&(e.contents=null):rr(null,e,n,Object.freeze([]))}He.BREAK=Ee;He.SKIP=Of;He.REMOVE=mt;function rr(e,t,n,r){let s=Df(e,t,n,r);if(j(s)||M(s))return Nf(e,r,s),rr(e,s,n,r);if(typeof s!="symbol"){if(U(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=rr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ee)return Ee;o===mt&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=rr("key",t.key,n,r);if(i===Ee)return Ee;i===mt&&(t.key=null);let o=rr("value",t.value,n,r);if(o===Ee)return Ee;o===mt&&(t.value=null)}}return s}async function Ri(e,t){let n=$f(t);ft(e)?await sr(null,e.contents,n,Object.freeze([e]))===mt&&(e.contents=null):await sr(null,e,n,Object.freeze([]))}Ri.BREAK=Ee;Ri.SKIP=Of;Ri.REMOVE=mt;async function sr(e,t,n,r){let s=await Df(e,t,n,r);if(j(s)||M(s))return Nf(e,r,s),sr(e,s,n,r);if(typeof s!="symbol"){if(U(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=await sr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ee)return Ee;o===mt&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=await sr("key",t.key,n,r);if(i===Ee)return Ee;i===mt&&(t.key=null);let o=await sr("value",t.value,n,r);if(o===Ee)return Ee;o===mt&&(t.value=null)}}return s}function $f(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 Df(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(Ze(t))return n.Map?.(e,t,r);if(et(t))return n.Seq?.(e,t,r);if(M(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 Nf(e,t,n){let r=t[t.length-1];if(U(r))r.items[e]=n;else if(M(r))e==="key"?r.key=n:r.value=n;else if(ft(r))r.contents=n;else{let s=_e(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var MR={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},jR=e=>e.replace(/[!,[\]{}]/g,t=>MR[t]),ht=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+jR(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&&j(t.contents)){let i={};He(t.contents,(o,a)=>{j(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(`
|
|
79
|
+
`)}};ht.defaultYaml={explicit:!1,version:"1.2"};ht.defaultTags={"!!":"tag:yaml.org,2002:"};function Si(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 Yl(e){let t=new Set;return He(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function zl(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function _f(e,t){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=Yl(e));let o=zl(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)||U(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 Yt(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=Yt(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=Yt(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=Yt(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=Yt(e,r,s,i);o===void 0?delete r[s]:o!==i&&(r[s]=o)}return e.call(t,n,r)}function le(e,t,n){if(Array.isArray(e))return e.map((r,s)=>le(r,String(s),n));if(e&&typeof e.toJSON=="function"){if(!n||!bi(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 zt=class{constructor(t){Object.defineProperty(this,Pe,{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(!ft(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=le(this,"",o);if(typeof s=="function")for(let{count:l,res:c}of o.anchors.values())s(c,l);return typeof i=="function"?Yt(i,{"":a},"",a):a}};var Ot=class extends zt{constructor(t){super(ki),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)||bi(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||(le(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=Pi(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(Si(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 Pi(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(U(t)){let r=0;for(let s of t.items){let i=Pi(e,s,n);i>r&&(r=i)}return r}else if(M(t)){let r=Pi(e,t.key,n),s=Pi(e,t.value,n);return Math.max(r,s)}return 1}var Ii=e=>!e||typeof e!="function"&&typeof e!="object",E=class extends zt{constructor(t){super(Ne),this.value=t}toJSON(t,n){return n?.keep?this.value:le(this.value,t,n)}toString(){return String(this.value)}};E.BLOCK_FOLDED="BLOCK_FOLDED";E.BLOCK_LITERAL="BLOCK_LITERAL";E.PLAIN="PLAIN";E.QUOTE_DOUBLE="QUOTE_DOUBLE";E.QUOTE_SINGLE="QUOTE_SINGLE";var qR="tag:yaml.org,2002:";function UR(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(ft(e)&&(e=e.contents),j(e))return e;if(M(e)){let u=n.schema[Qe].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=qR+t.slice(2));let c=UR(e,t,o.tags);if(!c){if(e&&typeof e.toJSON=="function"&&(e=e.toJSON()),!e||typeof e!="object"){let u=new E(e);return l&&(l.node=u),u}c=e instanceof Map?o[Qe]:Symbol.iterator in Object(e)?o[Et]:o[Qe]}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 E(e);return t?d.tag=t:c.default||(d.tag=c.tag),l&&(l.node=d),d}function Qr(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 or=e=>e==null||typeof e=="object"&&!!e[Symbol.iterator]().next().done,ir=class extends zt{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=>j(r)||M(r)?r.clone(t):r),this.range&&(n.range=this.range.slice()),n}addIn(t,n){if(or(t))this.add(n);else{let[r,...s]=t,i=this.get(r,!0);if(U(i))i.addIn(s,n);else if(i===void 0&&this.schema)this.set(r,Qr(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(U(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:U(i)?i.getIn(s,n):void 0}hasAllNullValues(t){return this.items.every(n=>{if(!M(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 U(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(U(i))i.setIn(s,n);else if(i===void 0&&this.schema)this.set(r,Qr(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};var xf=e=>e.replace(/^(?!$)(?: $)?/gm,"#");function Ye(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var gt=(e,t,n)=>e.endsWith(`
|
|
80
80
|
`)?Ye(n,t):n.includes(`
|
|
81
81
|
`)?`
|
|
82
|
-
`+Ye(n,t):(e.endsWith(" ")?"":" ")+n;var Jl="flow",vi="block",Zr="quoted";function es(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,m,h=!1,f=-1,y=-1,
|
|
83
|
-
`)n===vi&&(f=
|
|
82
|
+
`+Ye(n,t):(e.endsWith(" ")?"":" ")+n;var Jl="flow",vi="block",Zr="quoted";function es(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,m,h=!1,f=-1,y=-1,k=-1;n===vi&&(f=Lf(e,f,t.length),f!==-1&&(u=f+l));for(let T;T=e[f+=1];){if(n===Zr&&T==="\\"){switch(y=f,e[f+1]){case"x":f+=3;break;case"u":f+=5;break;case"U":f+=9;break;default:f+=1}k=f}if(T===`
|
|
83
|
+
`)n===vi&&(f=Lf(e,f,t.length)),u=f+t.length+l,p=void 0;else{if(T===" "&&m&&m!==" "&&m!==`
|
|
84
84
|
`&&m!==" "){let O=e[f+1];O&&O!==" "&&O!==`
|
|
85
|
-
`&&O!==" "&&(p=f)}if(f>=u)if(p)c.push(p),u=p+l,p=void 0;else if(n===Zr){for(;m===" "||m===" ";)m=
|
|
85
|
+
`&&O!==" "&&(p=f)}if(f>=u)if(p)c.push(p),u=p+l,p=void 0;else if(n===Zr){for(;m===" "||m===" ";)m=T,T=e[f+=1],h=!0;let O=f>k+1?f-2:y-1;if(d[O])return e;c.push(O),d[O]=!0,u=O+l,p=void 0}else h=!0}m=T}if(h&&a&&a(),c.length===0)return e;o&&o();let R=e.slice(0,c[0]);for(let T=0;T<c.length;++T){let O=c[T],$=c[T+1]||e.length;O===0?R=`
|
|
86
86
|
${t}${e.slice(0,$)}`:(n===Zr&&d[O]&&(R+=`${e[O]}\\`),R+=`
|
|
87
|
-
${t}${e.slice(O+1,$)}`)}return R}function
|
|
88
|
-
`);r=t,s=t+1,i=e[s]}return r}var Ai=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),Ei=e=>/^(%|---|\.\.\.)/m.test(e);function
|
|
87
|
+
${t}${e.slice(O+1,$)}`)}return R}function Lf(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!==`
|
|
88
|
+
`);r=t,s=t+1,i=e[s]}return r}var Ai=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),Ei=e=>/^(%|---|\.\.\.)/m.test(e);function WR(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]===`
|
|
89
89
|
`){if(i-o>r)return!0;if(o=i+1,s-o<=r)return!1}return!0}function ts(e,t){let n=JSON.stringify(e);if(t.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=t,s=t.options.doubleQuotedMinMultiLineLength,i=t.indent||(Ei(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)+`
|
|
90
90
|
|
|
91
91
|
`;n[l+2]==="\\"&&n[l+3]==="n"&&n[l+4]!=='"';)o+=`
|
|
@@ -94,71 +94,71 @@ ${t}${e.slice(O+1,$)}`)}return R}function xf(e,t,n){let r=t,s=t+1,i=e[s];for(;i=
|
|
|
94
94
|
${n}`)+"'";return t.implicitKey?r:es(r,n,Jl,Ai(t,!1))}function ar(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=ts;else{let s=e.includes('"'),i=e.includes("'");s&&!i?r=Xl:i&&!s?r=ts:r=n?Xl:ts}return r(e,t)}var Ql;try{Ql=new RegExp(`(^|(?<!
|
|
95
95
|
))
|
|
96
96
|
+(?!
|
|
97
|
-
|$)`,"g")}catch{Ql=/\n+(?!\n|$)/g}function Ci({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 ar(n,r);let c=r.indent||(r.forceBlockIndent||Ei(n)?" ":""),d=o==="literal"?!0:o==="folded"||t===E.BLOCK_FOLDED?!1:t===E.BLOCK_LITERAL?!0:!
|
|
97
|
+
|$)`,"g")}catch{Ql=/\n+(?!\n|$)/g}function Ci({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 ar(n,r);let c=r.indent||(r.forceBlockIndent||Ei(n)?" ":""),d=o==="literal"?!0:o==="folded"||t===E.BLOCK_FOLDED?!1:t===E.BLOCK_LITERAL?!0:!WR(n,l,c.length);if(!n)return d?`|
|
|
98
98
|
`:`>
|
|
99
99
|
`;let u,p;for(p=n.length;p>0;--p){let $=n[p-1];if($!==`
|
|
100
100
|
`&&$!==" "&&$!==" ")break}let m=n.substring(p),h=m.indexOf(`
|
|
101
101
|
`);h===-1?u="-":n===m||h!==m.length-1?(u="+",i&&i()):u="",m&&(n=n.slice(0,-m.length),m[m.length-1]===`
|
|
102
|
-
`&&(m=m.slice(0,-1)),m=m.replace(Ql,`$&${c}`));let f=!1,y,
|
|
103
|
-
`)
|
|
102
|
+
`&&(m=m.slice(0,-1)),m=m.replace(Ql,`$&${c}`));let f=!1,y,k=-1;for(y=0;y<n.length;++y){let $=n[y];if($===" ")f=!0;else if($===`
|
|
103
|
+
`)k=y;else break}let R=n.substring(0,k<y?k+1:y);R&&(n=n.substring(R.length),R=R.replace(/\n+/g,`$&${c}`));let O=(f?c?"2":"1":"")+u;if(e&&(O+=" "+a(e.replace(/ ?[\r\n]+/g," ")),s&&s()),!d){let $=n.replace(/\n+/g,`
|
|
104
104
|
$&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),D=!1,x=Ai(r,!0);o!=="folded"&&t!==E.BLOCK_FOLDED&&(x.onOverflow=()=>{D=!0});let v=es(`${R}${$}${m}`,c,vi,x);if(!D)return`>${O}
|
|
105
105
|
${c}${v}`}return n=n.replace(/\n+/g,`$&${c}`),`|${O}
|
|
106
106
|
${c}${R}${n}${m}`}function BR(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(`
|
|
107
107
|
`)||d&&/[[\]{},]/.test(i))return ar(i,t);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(i))return a||d||!i.includes(`
|
|
108
108
|
`)?ar(i,t):Ci(e,t,n,r);if(!a&&!d&&s!==E.PLAIN&&i.includes(`
|
|
109
109
|
`))return Ci(e,t,n,r);if(Ei(i)){if(l==="")return t.forceBlockIndent=!0,Ci(e,t,n,r);if(a&&l===c)return ar(i,t)}let u=i.replace(/\n+/g,`$&
|
|
110
|
-
${l}`);if(o){let p=f=>f.default&&f.tag!=="tag:yaml.org,2002:str"&&f.test?.test(u),{compat:m,tags:h}=t.doc.schema;if(h.some(p)||m?.some(p))return ar(i,t)}return a?u:es(u,l,Jl,Ai(t,!1))}function Sn(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!==E.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(o.value)&&(a=E.QUOTE_DOUBLE);let l=d=>{switch(d){case E.BLOCK_FOLDED:case E.BLOCK_LITERAL:return s||i?ar(o.value,t):Ci(o,t,n,r);case E.QUOTE_DOUBLE:return ts(o.value,t);case E.QUOTE_SINGLE:return Xl(o.value,t);case E.PLAIN:return BR(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 Oi(e,t){let n=Object.assign({blockQuote:!0,commentString:
|
|
111
|
-
${t.indent}${a}`:a}function
|
|
112
|
-
${a}:`):(y=`${y}:`,p&&(y+=gt(y,n.indent,c(p))));let
|
|
110
|
+
${l}`);if(o){let p=f=>f.default&&f.tag!=="tag:yaml.org,2002:str"&&f.test?.test(u),{compat:m,tags:h}=t.doc.schema;if(h.some(p)||m?.some(p))return ar(i,t)}return a?u:es(u,l,Jl,Ai(t,!1))}function Sn(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!==E.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(o.value)&&(a=E.QUOTE_DOUBLE);let l=d=>{switch(d){case E.BLOCK_FOLDED:case E.BLOCK_LITERAL:return s||i?ar(o.value,t):Ci(o,t,n,r);case E.QUOTE_DOUBLE:return ts(o.value,t);case E.QUOTE_SINGLE:return Xl(o.value,t);case E.PLAIN:return BR(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 Oi(e,t){let n=Object.assign({blockQuote:!0,commentString:xf,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 VR(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 KR(e,t,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(_(e)||U(e))&&e.anchor;i&&Si(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(M(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=j(e)?e:t.doc.createNode(e,{onTagObj:l=>s=l});s??(s=VR(t.doc.schema.tags,i));let o=KR(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)?Sn(i,t,n,r):i.toString(t,n,r);return o?_(i)||a[0]==="{"||a[0]==="["?`${o} ${a}`:`${o}
|
|
111
|
+
${t.indent}${a}`:a}function Ff({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=j(e)&&e.comment||null;if(u){if(p)throw new Error("With simple keys, key nodes cannot have comments");if(U(e)||!j(e)&&typeof e=="object"){let x="With simple keys, collection cannot be used as a key value";throw new Error(x)}}let m=!u&&(!e||p&&t==null&&!n.inFlow||U(e)||(_(e)?e.type===E.BLOCK_FOLDED||e.type===E.BLOCK_LITERAL:typeof e=="object"));n=Object.assign({},n,{allNullValues:!1,implicitKey:!m&&(u||!i),indent:a+l});let h=!1,f=!1,y=Dt(e,n,()=>h=!0,()=>f=!0);if(!m&&!n.inFlow&&y.length>1024){if(u)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");m=!0}if(n.inFlow){if(i||t==null)return h&&r&&r(),y===""?"?":m?`? ${y}`:y}else if(i&&!u||t==null&&m)return y=`? ${y}`,p&&!h?y+=gt(y,n.indent,c(p)):f&&s&&s(),y;h&&(p=null),m?(p&&(y+=gt(y,n.indent,c(p))),y=`? ${y}
|
|
112
|
+
${a}:`):(y=`${y}:`,p&&(y+=gt(y,n.indent,c(p))));let k,R,T;j(t)?(k=!!t.spaceBefore,R=t.commentBefore,T=t.comment):(k=!1,R=null,T=null,t&&typeof t=="object"&&(t=o.createNode(t))),n.implicitKey=!1,!m&&!p&&_(t)&&(n.indentAtStart=y.length+1),f=!1,!d&&l.length>=2&&!n.inFlow&&!m&&et(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let O=!1,$=Dt(t,n,()=>O=!0,()=>f=!0),D=" ";if(p||k||R){if(D=k?`
|
|
113
113
|
`:"",R){let x=c(R);D+=`
|
|
114
114
|
${Ye(x,n.indent)}`}$===""&&!n.inFlow?D===`
|
|
115
|
-
`&&
|
|
115
|
+
`&&T&&(D=`
|
|
116
116
|
|
|
117
117
|
`):D+=`
|
|
118
|
-
${n.indent}`}else if(!m&&
|
|
119
|
-
`),w=v!==-1,
|
|
118
|
+
${n.indent}`}else if(!m&&U(t)){let x=$[0],v=$.indexOf(`
|
|
119
|
+
`),w=v!==-1,Re=n.inFlow??t.flow??t.items.length===0;if(w||!Re){let ge=!1;if(w&&(x==="&"||x==="!")){let H=$.indexOf(" ");x==="&"&&H!==-1&&H<v&&$[H+1]==="!"&&(H=$.indexOf(" ",H+1)),(H===-1||v<H)&&(ge=!0)}ge||(D=`
|
|
120
120
|
${n.indent}`)}}else($===""||$[0]===`
|
|
121
|
-
`)&&(D="");return y+=D+$,n.inFlow?O&&r&&r():
|
|
121
|
+
`)&&(D="");return y+=D+$,n.inFlow?O&&r&&r():T&&!O?y+=gt(y,n.indent,c(T)):f&&s&&s(),y}function Zl(e,t){(e==="debug"||e==="warn")&&console.warn(t)}var $i="<<",tt={identify:e=>e===$i||typeof e=="symbol"&&e.description===$i,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new E(Symbol($i)),{addToJSMap:tc}),stringify:()=>$i},Mf=(e,t)=>(tt.identify(t)||_(t)&&(!t.type||t.type===E.PLAIN)&&tt.identify(t.value))&&e?.doc.schema.tags.some(n=>n.tag===tt.tag&&n.default);function tc(e,t,n){let r=jf(e,n);if(et(r))for(let s of r.items)ec(e,t,s);else if(Array.isArray(r))for(let s of r)ec(e,t,s);else ec(e,t,r)}function ec(e,t,n){let r=jf(e,n);if(!Ze(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 jf(e,t){return e&&_e(t)?t.resolve(e.doc,e):t}function Di(e,t,{key:n,value:r}){if(j(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(Mf(e,n))tc(e,t,r);else{let s=le(n,"",e);if(t instanceof Map)t.set(s,le(r,s,e));else if(t instanceof Set)t.add(s);else{let i=GR(n,s,e),o=le(r,i,e);i in t?Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0}):t[i]=o}}return t}function GR(e,t,n){if(t===null)return"";if(typeof t!="object")return String(t);if(j(e)&&n?.doc){let r=Oi(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)+'..."'),Zl(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 lr(e,t,n){let r=$t(e,void 0,n),s=$t(t,void 0,n);return new X(r,s)}var X=class e{constructor(t,n=null){Object.defineProperty(this,Pe,{value:Hl}),this.key=t,this.value=n}clone(t){let{key:n,value:r}=this;return j(n)&&(n=n.clone(t)),j(r)&&(r=r.clone(t)),new e(n,r)}toJSON(t,n){let r=n?.mapAsMap?new Map:{};return Di(n,r,this)}toString(t,n,r){return t?.doc?Ff(this,t,n,r):JSON.stringify(this)}};function _i(e,t,n){return(t.inFlow??e.flow?YR:HR)(e,t,n)}function HR({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 h=0;h<t.length;++h){let f=t[h],y=null;if(j(f))!u&&f.spaceBefore&&p.push(""),Ni(n,p,f.commentBefore,u),f.comment&&(y=f.comment);else if(M(f)){let R=j(f.key)?f.key:null;R&&(!u&&R.spaceBefore&&p.push(""),Ni(n,p,R.commentBefore,u))}u=!1;let k=Dt(f,d,()=>y=null,()=>u=!0);y&&(k+=gt(k,i,c(y))),u&&y&&(u=!1),p.push(r+k)}let m;if(p.length===0)m=s.start+s.end;else{m=p[0];for(let h=1;h<p.length;++h){let f=p[h];m+=f?`
|
|
122
122
|
${l}${f}`:`
|
|
123
123
|
`}}return e?(m+=`
|
|
124
|
-
`+Ye(c(e),l),a&&a()):u&&o&&o(),m}function YR({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 h=0;h<e.length;++h){let f=e[h],y=null;if(
|
|
125
|
-
`)),h<e.length-1?
|
|
124
|
+
`+Ye(c(e),l),a&&a()):u&&o&&o(),m}function YR({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 h=0;h<e.length;++h){let f=e[h],y=null;if(j(f))f.spaceBefore&&u.push(""),Ni(t,u,f.commentBefore,!1),f.comment&&(y=f.comment);else if(M(f)){let R=j(f.key)?f.key:null;R&&(R.spaceBefore&&u.push(""),Ni(t,u,R.commentBefore,!1),R.comment&&(c=!0));let T=j(f.value)?f.value:null;T?(T.comment&&(y=T.comment),T.commentBefore&&(c=!0)):f.value==null&&R?.comment&&(y=R.comment)}y&&(c=!0);let k=Dt(f,l,()=>y=null);c||(c=u.length>d||k.includes(`
|
|
125
|
+
`)),h<e.length-1?k+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=u.reduce((R,T)=>R+T.length+2,2)+(k.length+2)>t.options.lineWidth)),c&&(k+=",")),y&&(k+=gt(k,r,a(y))),u.push(k),d=u.length}let{start:p,end:m}=n;if(u.length===0)return p+m;if(!c){let h=u.reduce((f,y)=>f+y.length+2,2);c=t.options.lineWidth>0&&h>t.options.lineWidth}if(c){let h=p;for(let f of u)h+=f?`
|
|
126
126
|
${i}${s}${f}`:`
|
|
127
127
|
`;return`${h}
|
|
128
|
-
${s}${m}`}else return`${p}${o}${u.join(" ")}${o}${m}`}function Ni({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
|
|
129
|
-
`:" ")}return Sn({comment:e,type:t,value:a},r,s,i)}};function rc(e,t){if(et(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!
|
|
128
|
+
${s}${m}`}else return`${p}${o}${u.join(" ")}${o}${m}`}function Ni({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 Jt(e,t){let n=_(t)?t.value:t;for(let r of e)if(M(r)&&(r.key===t||r.key===n||_(r.key)&&r.key.value===n))return r}var te=class extends ir{static get tagName(){return"tag:yaml.org,2002:map"}constructor(t){super(Qe,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(lr(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;M(t)?r=t:!t||typeof t!="object"||!("key"in t)?r=new X(t,t?.value):r=new X(t.key,t.value);let s=Jt(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);_(s.value)&&Ii(r.value)?s.value.value=r.value:s.value=r.value}else if(i){let o=this.items.findIndex(a=>i(r,a)<0);o===-1?this.items.push(r):this.items.splice(o,0,r)}else this.items.push(r)}delete(t){let n=Jt(this.items,t);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(t,n){let s=Jt(this.items,t)?.value;return(!n&&_(s)?s.value:s)??void 0}has(t){return!!Jt(this.items,t)}set(t,n){this.add(new X(t,n),!0)}toJSON(t,n,r){let s=r?new r:n?.mapAsMap?new Map:{};n?.onCreate&&n.onCreate(s);for(let i of this.items)Di(n,s,i);return s}toString(t,n,r){if(!t)return JSON.stringify(this);for(let s of this.items)if(!M(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})),_i(this,t,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:t.indent||"",onChompKeep:r,onComment:n})}};var nt={collection:"map",default:!0,nodeClass:te,tag:"tag:yaml.org,2002:map",resolve(e,t){return Ze(e)||t("Expected a mapping for this tag"),e},createNode:(e,t,n)=>te.from(e,t,n)};var ke=class extends ir{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=xi(t);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(t,n){let r=xi(t);if(typeof r!="number")return;let s=this.items[r];return!n&&_(s)?s.value:s}has(t){let n=xi(t);return typeof n=="number"&&n<this.items.length}set(t,n){let r=xi(t);if(typeof r!="number")throw new Error(`Expected a valid index, not ${t}.`);let s=this.items[r];_(s)&&Ii(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(le(i,String(s++),n));return r}toString(t,n,r){return t?_i(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 xi(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 rt={collection:"seq",default:!0,nodeClass:ke,tag:"tag:yaml.org,2002:seq",resolve(e,t){return et(e)||t("Expected a sequence for this tag"),e},createNode:(e,t,n)=>ke.from(e,t,n)};var Xt={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),Sn(e,t,n,r)}};var Pn={identify:e=>e==null,createNode:()=>new E(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new E(null),stringify:({source:e},t)=>typeof e=="string"&&Pn.test.test(e)?e:t.options.nullStr};var ns={identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:e=>new E(e[0]==="t"||e[0]==="T"),stringify({source:e,value:t},n){if(e&&ns.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 Li={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},Fi={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)}},Mi={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 E(parseFloat(e)),n=e.indexOf(".");return n!==-1&&e[e.length-1]==="0"&&(t.minFractionDigits=e.length-n-1),t},stringify:Te};var ji=e=>typeof e=="bigint"||Number.isInteger(e),nc=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function qf(e,t,n){let{value:r}=e;return ji(r)&&r>=0?n+r.toString(t):Te(e)}var qi={identify:e=>ji(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(e,t,n)=>nc(e,2,8,n),stringify:e=>qf(e,8,"0o")},Ui={identify:ji,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>nc(e,0,10,n),stringify:Te},Wi={identify:e=>ji(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>nc(e,2,16,n),stringify:e=>qf(e,16,"0x")};var Uf=[nt,rt,Xt,Pn,ns,qi,Ui,Wi,Li,Fi,Mi];function Wf(e){return typeof e=="bigint"||Number.isInteger(e)}var Bi=({value:e})=>JSON.stringify(e),zR=[{identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify:Bi},{identify:e=>e==null,createNode:()=>new E(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:Bi},{identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:e=>e==="true",stringify:Bi},{identify:Wf,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})=>Wf(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:Bi}],JR={default:!0,tag:"",test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}},Bf=[nt,rt].concat(zR,JR);var rs={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=E.BLOCK_LITERAL),t!==E.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===E.BLOCK_LITERAL?`
|
|
129
|
+
`:" ")}return Sn({comment:e,type:t,value:a},r,s,i)}};function rc(e,t){if(et(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!M(r)){if(Ze(r)){r.items.length>1&&t("Each pair must have its own sequence indicator");let s=r.items[0]||new X(new E(null));if(r.commentBefore&&(s.key.commentBefore=s.key.commentBefore?`${r.commentBefore}
|
|
130
130
|
${s.key.commentBefore}`:r.commentBefore),r.comment){let i=s.value??s.key;i.comment=i.comment?`${r.comment}
|
|
131
|
-
${i.comment}`:r.comment}r=s}e.items[n]=
|
|
131
|
+
${i.comment}`:r.comment}r=s}e.items[n]=M(r)?r:new X(r)}}else t("Expected a sequence for this tag");return e}function sc(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(lr(a,l,n))}return s}var ss={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:rc,createNode:sc};var cr=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(M(s)?(i=le(s.key,"",n),o=le(s.value,i,n)):i=le(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=sc(t,n,r),i=new this;return i.items=s.items,i}};cr.tag="tag:yaml.org,2002:omap";var is={collection:"seq",identify:e=>e instanceof Map,nodeClass:cr,default:!1,tag:"tag:yaml.org,2002:omap",resolve(e,t){let n=rc(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 cr,n)},createNode:(e,t,n)=>cr.from(e,t,n)};function Vf({value:e,source:t},n){return t&&(e?ic:oc).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}var ic={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 E(!0),stringify:Vf},oc={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 E(!1),stringify:Vf};var Kf={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},Gf={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)}},Hf={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 E(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 os=e=>typeof e=="bigint"||Number.isInteger(e);function Vi(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 ac(e,t,n){let{value:r}=e;if(os(r)){let s=r.toString(t);return r<0?"-"+n+s.substr(1):n+s}return Te(e)}var Yf={identify:os,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>Vi(e,2,2,n),stringify:e=>ac(e,2,"0b")},zf={identify:os,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>Vi(e,1,8,n),stringify:e=>ac(e,8,"0")},Jf={identify:os,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>Vi(e,0,10,n),stringify:Te},Xf={identify:os,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>Vi(e,2,16,n),stringify:e=>ac(e,16,"0x")};var ur=class e extends te{constructor(t){super(t),this.tag=e.tag}add(t){let n;M(t)?n=t:t&&typeof t=="object"&&"key"in t&&"value"in t&&t.value===null?n=new X(t.key,null):n=new X(t,null),Jt(this.items,n.key)||this.items.push(n)}get(t,n){let r=Jt(this.items,t);return!n&&M(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=Jt(this.items,t);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new X(t))}toJSON(t,n){return super.toJSON(t,n,Set)}toString(t,n,r){if(!t)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},t,{allNullValues:!0}),n,r);throw new Error("Set items must all have null values")}static from(t,n,r){let{replacer:s}=r,i=new this(t);if(n&&Symbol.iterator in Object(n))for(let o of n)typeof s=="function"&&(o=s.call(n,o,o)),i.items.push(lr(o,null,r));return i}};ur.tag="tag:yaml.org,2002:set";var as={collection:"map",identify:e=>e instanceof Set,nodeClass:ur,default:!1,tag:"tag:yaml.org,2002:set",createNode:(e,t,n)=>ur.from(e,t,n),resolve(e,t){if(Ze(e)){if(e.hasAllNullValues(!0))return Object.assign(new ur,e);t("Set items must all have null values")}else t("Expected a mapping for this tag");return e}};function lc(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 Qf(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 Ki={identify:e=>typeof e=="bigint"||Number.isInteger(e),default:!0,tag:"tag:yaml.org,2002:int",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:(e,t,{intAsBigInt:n})=>lc(e,n),stringify:Qf},Gi={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=>lc(e,!1),stringify:Qf},dr={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(dr.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=lc(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 cc=[nt,rt,Xt,Pn,ic,oc,Yf,zf,Jf,Xf,Kf,Gf,Hf,rs,tt,is,ss,as,Ki,Gi,dr];var Zf=new Map([["core",Uf],["failsafe",[nt,rt,Xt]],["json",Bf],["yaml11",cc],["yaml-1.1",cc]]),em={binary:rs,bool:ns,float:Mi,floatExp:Fi,floatNaN:Li,floatTime:Gi,int:Ui,intHex:Wi,intOct:qi,intTime:Ki,map:nt,merge:tt,null:Pn,omap:is,pairs:ss,seq:rt,set:as,timestamp:dr},tm={"tag:yaml.org,2002:binary":rs,"tag:yaml.org,2002:merge":tt,"tag:yaml.org,2002:omap":is,"tag:yaml.org,2002:pairs":ss,"tag:yaml.org,2002:set":as,"tag:yaml.org,2002:timestamp":dr};function Hi(e,t,n){let r=Zf.get(t);if(r&&!e)return n&&!r.includes(tt)?r.concat(tt):r.slice();let s=r;if(!s)if(Array.isArray(e))s=[];else{let i=Array.from(Zf.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(tt)),s.reduce((i,o)=>{let a=typeof o=="string"?em[o]:o;if(!a){let l=JSON.stringify(o),c=Object.keys(em).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 XR=(e,t)=>e.key<t.key?-1:e.key>t.key?1:0,ls=class e{constructor({compat:t,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(t)?Hi(t,"compat"):t?Hi(null,t):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?tm:{},this.tags=Hi(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,Qe,{value:nt}),Object.defineProperty(this,Ne,{value:Xt}),Object.defineProperty(this,Et,{value:rt}),this.sortMapEntries=typeof o=="function"?o:o===!0?XR:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function nm(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=Oi(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(j(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+=gt(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(`
|
|
132
132
|
`)?(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(`
|
|
133
133
|
`)+`
|
|
134
|
-
`}var
|
|
134
|
+
`}var Qt=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,Pe,{value:Ti});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 ht({version:o}),this.setSchema(o,r),this.contents=t===void 0?null:this.createNode(t,s,r)}clone(){let t=Object.create(e.prototype,{[Pe]:{value:Ti}});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=j(this.contents)?this.contents.clone(t.schema):this.contents,this.range&&(t.range=this.range.slice()),t}add(t){pr(this.contents)&&this.contents.add(t)}addIn(t,n){pr(this.contents)&&this.contents.addIn(t,n)}createAlias(t,n){if(!t.anchor){let r=Yl(this);t.anchor=!n||r.has(n)?zl(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,k=n.filter(y).map(String);k.length>0&&(n=n.concat(k)),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:m}=_f(this,o||"a"),h={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:u,onTagObj:c,replacer:s,schema:this.schema,sourceObjects:m},f=$t(t,d,h);return a&&U(f)&&(f.flow=!0),p(),f}createPair(t,n,r={}){let s=this.createNode(t,null,r),i=this.createNode(n,null,r);return new X(s,i)}delete(t){return pr(this.contents)?this.contents.delete(t):!1}deleteIn(t){return or(t)?this.contents==null?!1:(this.contents=null,!0):pr(this.contents)?this.contents.deleteIn(t):!1}get(t,n){return U(this.contents)?this.contents.get(t,n):void 0}getIn(t,n){return or(t)?!n&&_(this.contents)?this.contents.value:this.contents:U(this.contents)?this.contents.getIn(t,n):void 0}has(t){return U(this.contents)?this.contents.has(t):!1}hasIn(t){return or(t)?this.contents!==void 0:U(this.contents)?this.contents.hasIn(t):!1}set(t,n){this.contents==null?this.contents=Qr(this.schema,[t],n):pr(this.contents)&&this.contents.set(t,n)}setIn(t,n){or(t)?this.contents=n:this.contents==null?this.contents=Qr(this.schema,Array.from(t),n):pr(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 ht({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 ht({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 ls(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=le(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"?Yt(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 nm(this,t)}};function pr(e){if(U(e))return!0;throw new Error("Expected a YAML collection as document contents")}var cs=class extends Error{constructor(t,n,r,s){super(),this.name=t,this.code=r,this.message=s,this.pos=n}},st=class extends cs{constructor(t,n,r){super("YAMLParseError",t,n,r)}},us=class extends cs{constructor(t,n,r){super("YAMLWarning",t,n,r)}},uc=(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
|
|
135
135
|
`),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+=`:
|
|
136
136
|
|
|
137
137
|
${o}
|
|
138
138
|
${c}
|
|
139
|
-
`}};function yt(e,{flow:t,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let l=!1,c=a,d=a,u="",p="",m=!1,h=!1,f=null,y=null,
|
|
140
|
-
`))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(
|
|
141
|
-
`+f.comment:a.comment=f.comment);continue}(f.newlineAfterProp||
|
|
142
|
-
`+
|
|
143
|
-
`+D.comment:c.comment=D.comment),u=D.end;continue}!o&&n.options.strict&&
|
|
144
|
-
`+x:v.comment=x,D.comment=D.comment.substring(x.length+1)}}if(!o&&!O&&!D.found){let x=$?e(n,$,D,s):t(n,D.end,O,null,D,s);c.items.push(x),u=x.range[2],pc($)&&s(x.range,"BLOCK_IN_FLOW",dc)}else{n.atKey=!0;let x=D.end,v=
|
|
145
|
-
`+w.comment:v.comment=w.comment);let ge=new X(v,
|
|
146
|
-
`+y.comment:c.comment=y.comment),c.range=[r.offset,f,y.offset]}else c.range=[r.offset,f,f];return c}function fc(e,t,n,r,s,i){let o=n.type==="block-map"?
|
|
147
|
-
`.repeat(Math.max(1,o.length-1)):"",y=r+s.length;return t.source&&(y+=t.source.length),{value:f,type:i,comment:s.comment,range:[r,y,y]}}let l=t.indent+s.indent,c=t.offset+s.length,d=0;for(let f=0;f<a;++f){let[y,
|
|
148
|
-
`;for(let f=d;f<a;++f){let[y,
|
|
149
|
-
`):y.length>l||
|
|
139
|
+
`}};function yt(e,{flow:t,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let l=!1,c=a,d=a,u="",p="",m=!1,h=!1,f=null,y=null,k=null,R=null,T=null,O=null,$=null;for(let v of e)switch(h&&(v.type!=="space"&&v.type!=="newline"&&v.type!=="comma"&&i(v.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),h=!1),f&&(c&&v.type!=="comment"&&v.type!=="newline"&&i(f,"TAB_AS_INDENT","Tabs are not allowed as indentation"),f=null),v.type){case"space":!t&&(n!=="doc-start"||r?.type!=="flow-collection")&&v.source.includes(" ")&&(f=v),d=!0;break;case"comment":{d||i(v,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let w=v.source.substring(1)||" ";u?u+=p+w:u=w,p="",c=!1;break}case"newline":c?u?u+=v.source:(!O||n!=="seq-item-ind")&&(l=!0):p+=v.source,c=!0,m=!0,(y||k)&&(R=v),d=!0;break;case"anchor":y&&i(v,"MULTIPLE_ANCHORS","A node can have at most one anchor"),v.source.endsWith(":")&&i(v.offset+v.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),y=v,$??($=v.offset),c=!1,d=!1,h=!0;break;case"tag":{k&&i(v,"MULTIPLE_TAGS","A node can have at most one tag"),k=v,$??($=v.offset),c=!1,d=!1,h=!0;break}case n:(y||k)&&i(v,"BAD_PROP_ORDER",`Anchors and tags must be after the ${v.source} indicator`),O&&i(v,"UNEXPECTED_TOKEN",`Unexpected ${v.source} in ${t??"collection"}`),O=v,c=n==="seq-item-ind"||n==="explicit-key-ind",d=!1;break;case"comma":if(t){T&&i(v,"UNEXPECTED_TOKEN",`Unexpected , in ${t}`),T=v,c=!1,d=!1;break}default:i(v,"UNEXPECTED_TOKEN",`Unexpected ${v.type} token`),c=!1,d=!1}let D=e[e.length-1],x=D?D.offset+D.source.length:s;return h&&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"),f&&(c&&f.indent<=o||r?.type==="block-map"||r?.type==="block-seq")&&i(f,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:T,found:O,spaceBefore:l,comment:u,hasNewline:m,anchor:y,tag:k,newlineAfterProp:R,end:x,start:$??x}}function Zt(e){if(!e)return null;switch(e.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(e.source.includes(`
|
|
140
|
+
`))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(Zt(t.key)||Zt(t.value))return!0}return!1;default:return!0}}function ds(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&Zt(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function Yi(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 rm="All mapping items must start at the same column";function sm({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:m,value:h}=d,f=yt(u,{indicator:"explicit-key-ind",next:p??m?.[0],offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0}),y=!f.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",rm)),!f.anchor&&!f.tag&&!m){c=f.end,f.comment&&(a.comment?a.comment+=`
|
|
141
|
+
`+f.comment:a.comment=f.comment);continue}(f.newlineAfterProp||Zt(p))&&s(p??u[u.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else f.found?.indent!==r.indent&&s(l,"BAD_INDENT",rm);n.atKey=!0;let k=f.end,R=p?e(n,p,f,s):t(n,k,u,null,f,s);n.schema.compat&&ds(r.indent,p,s),n.atKey=!1,Yi(n,a.items,R)&&s(k,"DUPLICATE_KEY","Map keys must be unique");let T=yt(m??[],{indicator:"map-value-ind",next:h,offset:R.range[2],onError:s,parentIndent:r.indent,startOnNewline:!p||p.type==="block-scalar"});if(l=T.end,T.found){y&&(h?.type==="block-map"&&!T.hasNewline&&s(l,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),n.options.strict&&f.start<T.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 O=h?e(n,h,T,s):t(n,l,m,null,T,s);n.schema.compat&&ds(r.indent,h,s),l=O.range[2];let $=new X(R,O);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"),T.comment&&(R.comment?R.comment+=`
|
|
142
|
+
`+T.comment:R.comment=T.comment);let O=new X(R);n.options.keepSourceTokens&&(O.srcToken=d),a.items.push(O)}}return c&&c<l&&s(c,"IMPOSSIBLE","Map comment with trailing content"),a.range=[r.offset,l,c??l],a}function im({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=yt(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 m=u?e(n,u,p,s):t(n,p.end,d,null,p,s);n.schema.compat&&ds(r.indent,u,s),l=m.range[2],a.items.push(m)}return a.range=[r.offset,l,c??l],a}function wt(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 dc="Block collections are not allowed within flow collections",pc=e=>e&&(e.type==="block-map"||e.type==="block-seq");function om({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 k=r.items[y],{start:R,key:T,sep:O,value:$}=k,D=yt(R,{flow:a,indicator:"explicit-key-ind",next:T??O?.[0],offset:u,onError:s,parentIndent:r.indent,startOnNewline:!1});if(!D.found){if(!D.anchor&&!D.tag&&!O&&!$){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+=`
|
|
143
|
+
`+D.comment:c.comment=D.comment),u=D.end;continue}!o&&n.options.strict&&Zt(T)&&s(T,"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 v of R)switch(v.type){case"comma":case"space":break;case"comment":x=v.source.substring(1);break e;default:break e}if(x){let v=c.items[c.items.length-1];M(v)&&(v=v.value??v.key),v.comment?v.comment+=`
|
|
144
|
+
`+x:v.comment=x,D.comment=D.comment.substring(x.length+1)}}if(!o&&!O&&!D.found){let x=$?e(n,$,D,s):t(n,D.end,O,null,D,s);c.items.push(x),u=x.range[2],pc($)&&s(x.range,"BLOCK_IN_FLOW",dc)}else{n.atKey=!0;let x=D.end,v=T?e(n,T,D,s):t(n,x,R,null,D,s);pc(T)&&s(v.range,"BLOCK_IN_FLOW",dc),n.atKey=!1;let w=yt(O??[],{flow:a,indicator:"map-value-ind",next:$,offset:v.range[2],onError:s,parentIndent:r.indent,startOnNewline:!1});if(w.found){if(!o&&!D.found&&n.options.strict){if(O)for(let H of O){if(H===w.found)break;if(H.type==="newline"){s(H,"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 Re=$?e(n,$,w,s):w.found?t(n,w.end,O,null,w,s):null;Re?pc($)&&s(Re.range,"BLOCK_IN_FLOW",dc):w.comment&&(v.comment?v.comment+=`
|
|
145
|
+
`+w.comment:v.comment=w.comment);let ge=new X(v,Re);if(n.options.keepSourceTokens&&(ge.srcToken=k),o){let H=c;Yi(n,H.items,v)&&s(x,"DUPLICATE_KEY","Map keys must be unique"),H.items.push(ge)}else{let H=new te(n.schema);H.flow=!0,H.items.push(ge);let pn=(Re??v).range;H.range=[v.range[0],pn[1],pn[2]],c.items.push(H)}u=Re?Re.range[2]:w.end}}let p=o?"}":"]",[m,...h]=r.end,f=u;if(m?.source===p)f=m.offset+m.source.length;else{let y=a[0].toUpperCase()+a.substring(1),k=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",k),m&&m.source.length!==1&&h.unshift(m)}if(h.length>0){let y=wt(h,f,n.options.strict,s);y.comment&&(c.comment?c.comment+=`
|
|
146
|
+
`+y.comment:c.comment=y.comment),c.range=[r.offset,f,y.offset]}else c.range=[r.offset,f,f];return c}function fc(e,t,n,r,s,i){let o=n.type==="block-map"?sm(e,t,n,r,i):n.type==="block-seq"?im(e,t,n,r,i):om(e,t,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function am(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:m}=r,h=p&&i?p.offset>i.offset?p:i:p??i;h&&(!m||m.offset<h.offset)&&s(h,"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 fc(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),fc(e,t,n,s,o)}let c=fc(e,t,n,s,o,l),d=l.resolve?.(c,p=>s(i,"TAG_RESOLVE_FAILED",p),t.options)??c,u=j(d)?d:new E(d);return u.range=c.range,u.tag=o,l?.format&&(u.format=l.format),u}function mc(e,t,n){let r=t.offset,s=QR(t,e.options.strict,n);if(!s)return{value:"",type:null,comment:"",range:[r,r,r]};let i=s.mode===">"?E.BLOCK_FOLDED:E.BLOCK_LITERAL,o=t.source?ZR(t.source):[],a=o.length;for(let f=o.length-1;f>=0;--f){let y=o[f][1];if(y===""||y==="\r")a=f;else break}if(a===0){let f=s.chomp==="+"&&o.length>0?`
|
|
147
|
+
`.repeat(Math.max(1,o.length-1)):"",y=r+s.length;return t.source&&(y+=t.source.length),{value:f,type:i,comment:s.comment,range:[r,y,y]}}let l=t.indent+s.indent,c=t.offset+s.length,d=0;for(let f=0;f<a;++f){let[y,k]=o[f];if(k===""||k==="\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=f,l===0&&!e.atRoot&&n(c,"BAD_INDENT","Block scalar values in collections must be indented");break}c+=y.length+k.length+1}for(let f=o.length-1;f>=a;--f)o[f][0].length>l&&(a=f+1);let u="",p="",m=!1;for(let f=0;f<d;++f)u+=o[f][0].slice(l)+`
|
|
148
|
+
`;for(let f=d;f<a;++f){let[y,k]=o[f];c+=y.length+k.length+1;let R=k[k.length-1]==="\r";if(R&&(k=k.slice(0,-1)),k&&y.length<l){let O=`Block scalar lines must not be less indented than their ${s.indent?"explicit indentation indicator":"first line"}`;n(c-k.length-(R?2:1),"BAD_INDENT",O),y=""}i===E.BLOCK_LITERAL?(u+=p+y.slice(l)+k,p=`
|
|
149
|
+
`):y.length>l||k[0]===" "?(p===" "?p=`
|
|
150
150
|
`:!m&&p===`
|
|
151
151
|
`&&(p=`
|
|
152
152
|
|
|
153
|
-
`),u+=p+y.slice(l)+
|
|
154
|
-
`,m=!0):
|
|
153
|
+
`),u+=p+y.slice(l)+k,p=`
|
|
154
|
+
`,m=!0):k===""?p===`
|
|
155
155
|
`?u+=`
|
|
156
156
|
`:p=`
|
|
157
|
-
`:(u+=p+
|
|
157
|
+
`:(u+=p+k,p=" ",m=!1)}switch(s.chomp){case"-":break;case"+":for(let f=a;f<o.length;++f)u+=`
|
|
158
158
|
`+o[f][0].slice(l);u[u.length-1]!==`
|
|
159
159
|
`&&(u+=`
|
|
160
160
|
`);break;default:u+=`
|
|
161
|
-
`}let h=r+s.length+t.source.length;return{value:u,type:i,comment:s.comment,range:[r,h,h]}}function QR({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 m=s[p];if(!a&&(m==="-"||m==="+"))a=m;else{let h=Number(m);!o&&h?o=h: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 m=t[p];switch(m.type){case"space":c=!0;case"newline":u+=m.source.length;break;case"comment":n&&!c&&r(m,"MISSING_CHAR","Comments must be separated from other tokens by white space characters"),u+=m.source.length,d=m.source.substring(1);break;case"error":r(m,"UNEXPECTED_TOKEN",m.message),u+=m.source.length;break;default:{let h=`Unexpected token in block scalar header: ${m.type}`;r(m,"UNEXPECTED_TOKEN",h);let f=m.source;f&&typeof f=="string"&&(u+=f.length)}}}return{mode:i,indent:o,chomp:a,comment:d,length:u}}function ZR(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 hc(e,t,n){let{offset:r,type:s,source:i,end:o}=e,a,l,c=(p,m,h)=>n(r+p,m,h);switch(s){case"scalar":a=E.PLAIN,l=eS(i,c);break;case"single-quoted-scalar":a=E.QUOTE_SINGLE,l=tS(i,c);break;case"double-quoted-scalar":a=E.QUOTE_DOUBLE,l=nS(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=wt(o,d,t,n);return{value:l,type:a,comment:u.comment,range:[r,d,u.offset]}}function eS(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}`),
|
|
161
|
+
`}let h=r+s.length+t.source.length;return{value:u,type:i,comment:s.comment,range:[r,h,h]}}function QR({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 m=s[p];if(!a&&(m==="-"||m==="+"))a=m;else{let h=Number(m);!o&&h?o=h: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 m=t[p];switch(m.type){case"space":c=!0;case"newline":u+=m.source.length;break;case"comment":n&&!c&&r(m,"MISSING_CHAR","Comments must be separated from other tokens by white space characters"),u+=m.source.length,d=m.source.substring(1);break;case"error":r(m,"UNEXPECTED_TOKEN",m.message),u+=m.source.length;break;default:{let h=`Unexpected token in block scalar header: ${m.type}`;r(m,"UNEXPECTED_TOKEN",h);let f=m.source;f&&typeof f=="string"&&(u+=f.length)}}}return{mode:i,indent:o,chomp:a,comment:d,length:u}}function ZR(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 hc(e,t,n){let{offset:r,type:s,source:i,end:o}=e,a,l,c=(p,m,h)=>n(r+p,m,h);switch(s){case"scalar":a=E.PLAIN,l=eS(i,c);break;case"single-quoted-scalar":a=E.QUOTE_SINGLE,l=tS(i,c);break;case"double-quoted-scalar":a=E.QUOTE_DOUBLE,l=nS(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=wt(o,d,t,n);return{value:l,type:a,comment:u.comment,range:[r,d,u.offset]}}function eS(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}`),lm(e)}function tS(e,t){return(e[e.length-1]!=="'"||e.length===1)&&t(e.length,"MISSING_CHAR","Missing closing 'quote"),lm(e.slice(1,-1)).replace(/''/g,"'")}function lm(e){let t,n;try{t=new RegExp(`(.*?)(?<![ ])[ ]*\r?
|
|
162
162
|
`,"sy"),n=new RegExp(`[ ]*(.*?)(?:(?<![ ])[ ]*)?\r?
|
|
163
163
|
`,"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===`
|
|
164
164
|
`?s+=i:i=`
|
|
@@ -173,17 +173,17 @@ ${c}
|
|
|
173
173
|
`);)r===`
|
|
174
174
|
`&&(n+=`
|
|
175
175
|
`),t+=1,r=e[t+1];return n||(n=" "),{fold:n,offset:t}}var sS={0:"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:`
|
|
176
|
-
`,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function iS(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 gc(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?mc(e,t,r):hc(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=oS(e.schema,s,l,n,r):t.type==="scalar"?c=aS(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 E(u)}catch(u){let p=u instanceof Error?u.message:String(u);r(n??t,"TAG_RESOLVE_FAILED",p),d=new E(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 oS(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 aS({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
|
|
176
|
+
`,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function iS(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 gc(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?mc(e,t,r):hc(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=oS(e.schema,s,l,n,r):t.type==="scalar"?c=aS(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 E(u)}catch(u){let p=u instanceof Error?u.message:String(u);r(n??t,"TAG_RESOLVE_FAILED",p),d=new E(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 oS(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 aS({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 cm(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 lS={composeNode:yc,composeEmptyNode:zi};function yc(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=cS(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=gc(e,t,l,r),a&&(c.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{c=am(lS,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=zi(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 zi(e,t,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:l},c){let d={type:"scalar",offset:cm(t,n,r),indent:-1,source:""},u=gc(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 cS({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=wt(r,o,e.strict,s);return i.range=[t,o,a.offset],a.comment&&(i.comment=a.comment),i}function um(e,t,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:t},e),l=new Qt(void 0,a),c={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},d=yt(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?yc(c,s,d,o):zi(c,d.end,r,null,d,o);let u=l.contents.range[2],p=wt(i,u,!1,o);return p.comment&&(l.comment=p.comment),l.range=[n,u,p.offset],l}function ps(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 dm(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?`
|
|
177
177
|
|
|
178
178
|
`:`
|
|
179
|
-
`)+(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 fs=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=ps(n);i?this.warnings.push(new us(o,r,s)):this.errors.push(new st(o,r,s))},this.directives=new ht({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=
|
|
180
|
-
${r}`:r;else if(s||t.directives.docStart||!i)t.commentBefore=r;else if(
|
|
179
|
+
`)+(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 fs=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=ps(n);i?this.warnings.push(new us(o,r,s)):this.errors.push(new st(o,r,s))},this.directives=new ht({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=dm(this.prelude);if(r){let i=t.contents;if(n)t.comment=t.comment?`${t.comment}
|
|
180
|
+
${r}`:r;else if(s||t.directives.docStart||!i)t.commentBefore=r;else if(U(i)&&!i.flow&&i.items.length>0){let o=i.items[0];M(o)&&(o=o.key);let a=o.commentBefore;o.commentBefore=a?`${r}
|
|
181
181
|
${a}`:r}else{let o=i.commentBefore;i.commentBefore=o?`${r}
|
|
182
|
-
${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:
|
|
183
|
-
${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.push(new st(ps(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
|
|
182
|
+
${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:dm(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=ps(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=um(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 st(ps(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 st(ps(t),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=wt(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}
|
|
183
|
+
${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.push(new st(ps(t),"UNEXPECTED_TOKEN",`Unsupported token ${t.type}`))}}*end(t=!1,n=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(t){let r=Object.assign({_directives:this.directives},this.options),s=new Qt(void 0,r);this.atDirectives&&this.onError(n,"MISSING_CHAR","Missing directives-end indicator line"),s.range=[0,n,n],this.decorate(s,!1),yield s}}};var wc=Symbol("break visit"),uS=Symbol("skip children"),pm=Symbol("remove item");function In(e,t){"type"in e&&e.type==="document"&&(e={start:e.start,value:e.value}),fm(Object.freeze([]),e,t)}In.BREAK=wc;In.SKIP=uS;In.REMOVE=pm;In.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};In.parentCollection=(e,t)=>{let n=In.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 fm(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=fm(Object.freeze(e.concat([[s,o]])),i.items[o],n);if(typeof a=="number")o=a-1;else{if(a===wc)return wc;a===pm&&(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 kc="\uFEFF",Tc="",bc="",Ji="";function mm(e){switch(e){case kc:return"byte-order-mark";case Tc:return"doc-mode";case bc:return"flow-error-end";case Ji:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case`
|
|
184
184
|
`:case`\r
|
|
185
185
|
`: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 it(e){switch(e){case void 0:case" ":case`
|
|
186
|
-
`:case"\r":case" ":return!0;default:return!1}}var
|
|
186
|
+
`:case"\r":case" ":return!0;default:return!1}}var hm=new Set("0123456789ABCDEFabcdef"),pS=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),Xi=new Set(",[]{}"),fS=new Set(` ,[]{}
|
|
187
187
|
\r `),Rc=e=>!e||fS.has(e),ms=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===`
|
|
188
188
|
`?!0:n==="\r"?this.buffer[t+1]===`
|
|
189
189
|
`:!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===`
|
|
@@ -199,22 +199,22 @@ ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.pus
|
|
|
199
199
|
`&&i>=this.pos&&i+1+n>a)t=i;else break}while(!0);return yield Ji,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(it(i)||t&&Xi.has(i))break;n=r}else if(it(s)){let i=this.buffer[r+1];if(s==="\r"&&(i===`
|
|
200
200
|
`?(r+=1,s=`
|
|
201
201
|
`,i=this.buffer[r+1]):n=r),i==="#"||t&&Xi.has(i))break;if(s===`
|
|
202
|
-
`){let o=this.continueScalar(r+1);if(o===-1)break;r=Math.max(r,o-2)}}else{if(t&&Xi.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield Ji,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(Rc),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(it(r)||n&&Xi.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(;!it(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(pS.has(n))n=this.buffer[++t];else if(n==="%"&&
|
|
202
|
+
`){let o=this.continueScalar(r+1);if(o===-1)break;r=Math.max(r,o-2)}}else{if(t&&Xi.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield Ji,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(Rc),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(it(r)||n&&Xi.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(;!it(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(pS.has(n))n=this.buffer[++t];else if(n==="%"&&hm.has(this.buffer[t+1])&&hm.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===`
|
|
203
203
|
`?yield*this.pushCount(1):t==="\r"&&this.charAt(1)===`
|
|
204
|
-
`?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 hs=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
|
|
204
|
+
`?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 hs=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 en(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function gm(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 wm(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 Qi(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 fr(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 Zi(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 ym(e){if(e.start.type==="flow-seq-start")for(let t of e.items)t.sep&&!t.value&&!en(t.start,"explicit-key-ind")&&!en(t.sep,"map-value-ind")&&(t.key&&(t.value=t.key),delete t.key,wm(t.value)?t.value.end?Zi(t.value.end,t.sep):t.value.end=t.sep:Zi(t.start,t.sep),delete t.sep)}var gs=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 ms,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=mm(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"&&ym(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&&gm(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":{gm(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=Qi(this.peek(2)),r=fr(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(`
|
|
205
205
|
`)+1;for(;n!==0;)this.onNewLine(this.offset+n),n=this.source.indexOf(`
|
|
206
|
-
`,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)){Zi(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(
|
|
206
|
+
`,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)){Zi(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(en(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(wm(n.key)&&!en(n.sep,"newline")){let o=fr(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(en(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=fr(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]}):en(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&&!en(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)){Zi(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||en(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=Qi(r),i=fr(s);ym(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(`
|
|
207
207
|
`)+1;for(;n!==0;)this.onNewLine(this.offset+n),n=this.source.indexOf(`
|
|
208
|
-
`,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=Qi(t),r=fr(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=Qi(t),r=fr(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 mS(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new hs||null,prettyErrors:t}}function Sc(e,t={}){let{lineCounter:n,prettyErrors:r}=mS(t),s=new gs(n?.addNewLine),i=new fs(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 st(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(uc(e,n)),o.warnings.forEach(uc(e,n))),o}var ys=1024*1024;function Pc(e,t){Buffer.byteLength(e)>ys&&eo(t,[`Definition exceeds ${ys} bytes.`]);let n=Sc(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&&eo(t,s),n.contents===null&&eo(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){eo(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function eo(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 gS}from"node:crypto";var mr=/^[a-z][a-z0-9_-]{0,63}$/,wm=/\$\{\{\s*([^{}]+?)\s*\}\}/g,km=32,Tm=128,yS=16,wS=32,kS=10080*60*1e3,hr=32*1024,bm=16;function Cc(e,t){let n=[],r=xe(e,"$",n);ot(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=OS(r.name,"$.name",n),i=bS(r.limits,n),o=RS(r.inputs,n),a=SS(r.steps,n);a.length>Tm&&n.push(`$.steps may contain at most ${Tm} 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=vS(a,n);c&&CS(a,o,c.ancestors,n),n.length>0&&NS(t,n);let d={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:d,hash:gS("sha256").update(vc(d)).digest("hex"),order:c.order,waves:TS(c.waves,i.maxConcurrency)}}function TS(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 bS(e,t){let n=xe(e,"$.limits",t);ot(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=Rm(n.max_concurrency,"$.limits.max_concurrency",1,yS,t),s=Rm(n.max_tasks,"$.limits.max_tasks",1,wS,t),i=Im(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function RS(e,t){if(e===void 0)return{};let n=xe(e,"$.inputs",t),r=Object.entries(n);r.length>km&&t.push(`$.inputs may contain at most ${km} inputs.`);let s={};for(let[i,o]of r){mr.test(i)||t.push(`$.inputs key "${i}" must match ${mr}.`);let a=xe(o,`$.inputs.${i}`,t);ot(a,["type","required","default"],`$.inputs.${i}`,t);let l=DS(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:$S(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&&!Sm(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&Sm(a.default,l)?{defaultValue:a.default}:{}}}return s}function SS(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])=>{mr.test(s)||t.push(`$.steps key "${s}" must match ${mr}.`);let o=xe(i,`$.steps.${s}`,t),a=Pm(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?IS(s,o,a,t):PS(s,o,a,t)})}function PS(e,t,n,r){ot(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?Nt(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let u=xe(t.create_child,`$.steps.${e}.create_child`,r);ot(u,["repo","workspace"],`$.steps.${e}.create_child`,r),u.repo!==void 0&&u.workspace!==void 0&&r.push(`$.steps.${e}.create_child accepts only one of repo or workspace.`),a={...u.repo!==void 0?{repo:Nt(u.repo,`$.steps.${e}.create_child.repo`,r)}:{},...u.workspace!==void 0?{workspace:Nt(u.workspace,`$.steps.${e}.create_child.workspace`,r)}:{}}}let l;if(t.agent!==void 0){let u=xe(t.agent,`$.steps.${e}.agent`,r);if(ot(u,["runner"],`$.steps.${e}.agent`,r),u.runner!==void 0)try{l=k.runners.parse(Nt(u.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=Nt(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>hr&&r.push(`$.steps.${e}.prompt exceeds ${hr} bytes.`);let d;if(t.output!==void 0){let u=xe(t.output,`$.steps.${e}.output`,r);ot(u,["schema"],`$.steps.${e}.output`,r),d=Ic(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 IS(e,t,n,r){ot(t,["needs","human_review"],`$.steps.${e}`,r);let s=xe(t.human_review,`$.steps.${e}.human_review`,r);ot(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);ot(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=Nt(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:Nt(s.title,`$.steps.${e}.human_review.title`,r),summary:Nt(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:Im(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function Ic(e,t,n,r){if(r>bm)return n.push(`${t} exceeds the maximum schema depth of ${bm}.`),{};let s=xe(e,t,n);ot(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&&Pm(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))Ic(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&Ic(s.items,`${t}.items`,n,r+1),s}function vS(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((m,h)=>r.get(m)-r.get(h));let u=o;l.push(u),a.push(...u);let p=[];for(let m of u)for(let h of i.get(m)??[]){let f=s.get(h)-1;s.set(h,f),f===0&&p.push(h)}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 m of c.get(u).needs){p.add(m);for(let h of d.get(m)??[])p.add(h)}d.set(u,p)}return{order:a,waves:l,ancestors:d}}function CS(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(wm)],c=a.replace(wm,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let d of l)AS(d[1].trim(),i,t,n,s,r)}}}function AS(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&&ES(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function ES(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(!to(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(!to(a))return;i=a}}function vc(e){return Array.isArray(e)?`[${e.map(vc).join(",")}]`:to(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${vc(e[t])}`).join(",")}}`:JSON.stringify(e)}function xe(e,t,n){return to(e)?e:(n.push(`${t} must be an object.`),{})}function ot(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 OS(e,t,n){let r=Nt(e,t,n);return mr.test(r)||n.push(`${t} must match ${mr}.`),r}function Nt(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function Pm(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 Rm(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 $S(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function DS(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function Sm(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function Im(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>kS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function NS(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var to=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as _S,stat as xS}from"node:fs/promises";var LS=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function Ac(e){let t=await vm(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 Ec(e,t){let n=await vm(e),r=FS(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:vn(l.title,r,`$.steps.${a}.human_review.title`),summary:vn(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?vn(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:vn(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",...l.createChild?.repo?{repo:vn(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)}:{},...l.createChild?.workspace?{workspace:vn(l.createChild.workspace,r,`$.steps.${a}.create_child.workspace`)}:{}},runner:l.runner??null,prompt:qS(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 vm(e){let t;try{let n=await xS(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>ys)throw new Error(`Definition exceeds ${ys} bytes.`);t=await _S(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return Cc(Pc(t,e),e)}function FS(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]=MS(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 MS(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 jS(e,t){return e.replace(LS,(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 vn(e,t,n){let r=jS(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 qS(e,t,n){let r=`$.steps.${n}.prompt`,s=vn(e,t,r);if(Buffer.byteLength(s)>hr)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${hr} bytes.`,{details:{location:r,maxBytes:hr}});return s}import{createHash as Cm}from"node:crypto";import WS from"node:path";import{mkdir as US}from"node:fs/promises";var Oc={type:"system",component:"heartbeat"};async function nn(e,t={}){await US(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([P.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):At.listAgents(e),af(e),zS(e)]),o=r??pt(n.tasks.filter(h=>h.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=YS(i),l=a!==i,c=[],d=$c(s.filter(HS),h=>h.taskId),u=$c(s.filter(h=>h.type.startsWith("task.pr.")),h=>h.taskId),p=$c(s.filter(h=>h.type==="agent.state.changed"),h=>h.agentTabId);for(let h of n.tasks){let f=BS(h),y=d.get(h.id),T=Nc(y?.data)??a.tasks[h.id]??null,R=y?.id??a.tasks[h.id]?.eventId??null;if(T?.signature!==f.signature){let x=T?h.status==="closed"&&T?.status!=="closed"?"task.closed":"task.updated":"task.created",v=await De(e,{id:Dc(x,h.id,f.signature),type:x,taskId:h.id,workspaceId:h.workspaceId||null,occurredAt:h.updatedAt,actor:Oc,data:{...f,changedFields:T?KS(T,f):[]}});c.push(v),R=v.id}a.tasks[h.id]={...f,eventId:R};let b=GS(h.prs),O=u.get(h.id),$=Nc(O?.data)??a.pullRequests[h.id]??null,D=O?.id??a.pullRequests[h.id]?.eventId??null;if(($||b.associations.length>0)&&$?.signature!==b.signature){let x=Array.isArray($?.associations)?$.associations.length:0,v=b.associations.length>x?"task.pr.linked":b.associations.length<x?"task.pr.unlinked":"task.pr.refreshed",w=await De(e,{id:Dc(v,h.id,b.signature),type:v,taskId:h.id,workspaceId:h.workspaceId||null,occurredAt:h.updatedAt,actor:Oc,data:b});c.push(w),D=w.id}a.pullRequests[h.id]={...b,eventId:D}}let m=new Map(o.tasks.map(h=>[h.taskId,h.state]));for(let h of o.agents){let f=p.get(h.tabId),y=Nc(f?.data)??a.agents[h.tabId]??null;if(y?.state===h.state){a.agents[h.tabId]={state:h.state,eventId:f?.id??a.agents[h.tabId]?.eventId??null};continue}let T=[f?.id??a.agents[h.tabId]?.eventId??"initial",h.state,h.sessionState??"none",h.lastActivityAt??"none",h.exitCode??"none",h.error??"none"].join(":"),R=await De(e,{id:Dc("agent.state.changed",h.tabId,T),type:"agent.state.changed",taskId:h.taskId,agentTabId:h.tabId,actor:Oc,data:{previousState:typeof y?.state=="string"?y.state:null,state:h.state,taskState:m.get(h.taskId)??"idle",sessionState:h.sessionState,lastActivityAt:h.lastActivityAt,exitCode:h.exitCode,error:h.error}});c.push(R),a.agents[h.tabId]={state:h.state,eventId:R.id}}return(c.length>0||l)&&await j(Em(e),a),c}function BS(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:Am(t)}}var VS=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function KS(e,t){return VS.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function GS(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:Am(t)}}function $c(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var HS=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",Am=e=>Cm("sha256").update(JSON.stringify(e)).digest("hex"),Dc=(...e)=>Cm("sha256").update(e.join("\0")).digest("hex"),Nc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,Em=e=>WS.join(e.orchestrationDir,"event-reconciliation.json");function YS(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 zS(e){try{return await Ns(Em(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function JS(e,t){return await _c(e),await nn(e),Tn(e,t)}async function XS(e,t,n){await _c(e);let r=await At.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await nn(e,{agentObserver:r});let a=await Tn(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 Om(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function QS(e,t,n){await _c(e);let r=await P.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 nn(e,{agentObserver:s});let o=(await Tn(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=pt([r],s.getSnapshots(),l),d=n.tabId?c.agents.find(m=>m.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 eP(t);let u=a-Date.now();if(u<=0)throw ZS(t,n.states,n.timeoutMs);await nn(e,{agentObserver:s}),o=(await Tn(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await Om(Math.min(250,u),n.signal)}}finally{s.close()}}async function _c(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 Om(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 ZS=(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}}),eP=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),no={list:JS,watch:XS,waitForTaskState:QS,reconcile:nn};import{readFile as hP}from"node:fs/promises";import{mkdir as cP,readFile as _m,rm as xm}from"node:fs/promises";import{createConnection as uP}from"node:net";import dP from"node:path";import{spawn as iP}from"node:child_process";import{closeSync as oP,openSync as aP}from"node:fs";import Lc from"node:path";import{accessSync as tP,constants as nP}from"node:fs";import{homedir as $m}from"node:os";import rn from"node:path";var rP=[rn.join($m(),".local","bin"),rn.join($m(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function Nm(e=process.env){return sP([...(e.PATH??"").split(rn.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:rP])}function ro(e=process.env){return{...e,PATH:Nm(e).join(rn.delimiter)}}function xc(e,t={}){if(e.includes(rn.sep)){let n=rn.isAbsolute(e)?e:rn.resolve(t.cwd??process.cwd(),e);return Dm(n)?n:null}for(let n of Nm(t.env)){let r=rn.join(n,e);if(Dm(r))return r}return null}function so(e,t={}){let n=xc(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 Dm(e){try{return tP(e,nP.X_OK),!0}catch{return!1}}function sP(e){return[...new Set(e)]}function io(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=lP(e.workspaceRoot),s=aP(Lc.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return iP(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{oP(s)}})().unref()}function lP(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=Lc.resolve(Lc.dirname(t),"..","node_modules",".bin","tsx");return{command:xc("tsx")??n,args:[t,"__craig-daemon",e]}}if(!t)throw new Error("Craig cannot resolve its daemon entrypoint.");return{command:process.execPath,args:[...process.execArgv,t,"__craig-daemon",e]}}async function _t(e){let t=await oo(Je(e).socketPath).catch(()=>null);if(!t)return!1;try{let n=await Cn(t,{type:"ping"});return Gt(n.protocolVersion)?(await Cn(t,{type:"wakeOrchestration"}),!0):!1}catch{return!1}finally{t.end()}}async function Fc(e,t){if(t.length===0)return!0;let n=await oo(Je(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await Cn(n,{type:"ping"});if(!Gt(r.protocolVersion))return!1;for(let s of t)await Cn(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function Fm(e,t){await pP(e);let n=await oo(Je(e).socketPath);try{let r=await Cn(n,{type:"ping"});if(!Gt(r.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await Cn(n,{type:"ensureSession",taskId:t.taskId,tabId:t.tabId,size:{columns:120,rows:36},spec:{cwd:t.cwd,command:t.command,...t.env?{env:t.env}:{}}})}finally{n.end()}}async function pP(e){let t=Je(e),n=await Lm(t.socketPath).catch(()=>null);if(Gt(n?.protocolVersion))return;if(n)throw new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly.");await cP(e.runtimeDir,{recursive:!0});let r=await _m(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&fP(s))throw new Error("A Craig PTY daemon process is still running but is not accepting connections. Stop it explicitly before starting another daemon.");await Promise.all([xm(t.socketPath,{force:!0}),xm(t.pidPath,{force:!0})]),io(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await Lm(t.socketPath).catch(()=>null);if(Gt(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await _m(dP.join(e.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
|
|
209
|
-
${o.slice(-2e3)}`:""}`)}async function
|
|
208
|
+
`,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=Qi(t),r=fr(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=Qi(t),r=fr(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 mS(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new hs||null,prettyErrors:t}}function Sc(e,t={}){let{lineCounter:n,prettyErrors:r}=mS(t),s=new gs(n?.addNewLine),i=new fs(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 st(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(uc(e,n)),o.warnings.forEach(uc(e,n))),o}var ys=1024*1024;function Pc(e,t){Buffer.byteLength(e)>ys&&eo(t,[`Definition exceeds ${ys} bytes.`]);let n=Sc(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&&eo(t,s),n.contents===null&&eo(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){eo(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function eo(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 gS}from"node:crypto";var mr=/^[a-z][a-z0-9_-]{0,63}$/,km=/\$\{\{\s*([^{}]+?)\s*\}\}/g,Tm=32,bm=128,yS=16,wS=32,kS=10080*60*1e3,hr=32*1024,Rm=16;function Cc(e,t){let n=[],r=xe(e,"$",n);ot(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=OS(r.name,"$.name",n),i=bS(r.limits,n),o=RS(r.inputs,n),a=SS(r.steps,n);a.length>bm&&n.push(`$.steps may contain at most ${bm} 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=vS(a,n);c&&CS(a,o,c.ancestors,n),n.length>0&&NS(t,n);let d={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:d,hash:gS("sha256").update(vc(d)).digest("hex"),order:c.order,waves:TS(c.waves,i.maxConcurrency)}}function TS(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 bS(e,t){let n=xe(e,"$.limits",t);ot(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=Sm(n.max_concurrency,"$.limits.max_concurrency",1,yS,t),s=Sm(n.max_tasks,"$.limits.max_tasks",1,wS,t),i=vm(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function RS(e,t){if(e===void 0)return{};let n=xe(e,"$.inputs",t),r=Object.entries(n);r.length>Tm&&t.push(`$.inputs may contain at most ${Tm} inputs.`);let s={};for(let[i,o]of r){mr.test(i)||t.push(`$.inputs key "${i}" must match ${mr}.`);let a=xe(o,`$.inputs.${i}`,t);ot(a,["type","required","default"],`$.inputs.${i}`,t);let l=DS(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:$S(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&&!Pm(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&Pm(a.default,l)?{defaultValue:a.default}:{}}}return s}function SS(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])=>{mr.test(s)||t.push(`$.steps key "${s}" must match ${mr}.`);let o=xe(i,`$.steps.${s}`,t),a=Im(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?IS(s,o,a,t):PS(s,o,a,t)})}function PS(e,t,n,r){ot(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?Nt(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let u=xe(t.create_child,`$.steps.${e}.create_child`,r);ot(u,["repo","workspace"],`$.steps.${e}.create_child`,r),u.repo!==void 0&&u.workspace!==void 0&&r.push(`$.steps.${e}.create_child accepts only one of repo or workspace.`),a={...u.repo!==void 0?{repo:Nt(u.repo,`$.steps.${e}.create_child.repo`,r)}:{},...u.workspace!==void 0?{workspace:Nt(u.workspace,`$.steps.${e}.create_child.workspace`,r)}:{}}}let l;if(t.agent!==void 0){let u=xe(t.agent,`$.steps.${e}.agent`,r);if(ot(u,["runner"],`$.steps.${e}.agent`,r),u.runner!==void 0)try{l=b.runners.parse(Nt(u.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=Nt(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>hr&&r.push(`$.steps.${e}.prompt exceeds ${hr} bytes.`);let d;if(t.output!==void 0){let u=xe(t.output,`$.steps.${e}.output`,r);ot(u,["schema"],`$.steps.${e}.output`,r),d=Ic(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 IS(e,t,n,r){ot(t,["needs","human_review"],`$.steps.${e}`,r);let s=xe(t.human_review,`$.steps.${e}.human_review`,r);ot(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);ot(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=Nt(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:Nt(s.title,`$.steps.${e}.human_review.title`,r),summary:Nt(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:vm(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function Ic(e,t,n,r){if(r>Rm)return n.push(`${t} exceeds the maximum schema depth of ${Rm}.`),{};let s=xe(e,t,n);ot(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&&Im(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))Ic(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&Ic(s.items,`${t}.items`,n,r+1),s}function vS(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((m,h)=>r.get(m)-r.get(h));let u=o;l.push(u),a.push(...u);let p=[];for(let m of u)for(let h of i.get(m)??[]){let f=s.get(h)-1;s.set(h,f),f===0&&p.push(h)}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 m of c.get(u).needs){p.add(m);for(let h of d.get(m)??[])p.add(h)}d.set(u,p)}return{order:a,waves:l,ancestors:d}}function CS(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(km)],c=a.replace(km,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let d of l)AS(d[1].trim(),i,t,n,s,r)}}}function AS(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&&ES(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function ES(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(!to(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(!to(a))return;i=a}}function vc(e){return Array.isArray(e)?`[${e.map(vc).join(",")}]`:to(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${vc(e[t])}`).join(",")}}`:JSON.stringify(e)}function xe(e,t,n){return to(e)?e:(n.push(`${t} must be an object.`),{})}function ot(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 OS(e,t,n){let r=Nt(e,t,n);return mr.test(r)||n.push(`${t} must match ${mr}.`),r}function Nt(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function Im(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 Sm(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 $S(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function DS(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function Pm(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function vm(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>kS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function NS(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var to=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as _S,stat as xS}from"node:fs/promises";var LS=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function Ac(e){let t=await Cm(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 Ec(e,t){let n=await Cm(e),r=FS(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:vn(l.title,r,`$.steps.${a}.human_review.title`),summary:vn(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?vn(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:vn(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",...l.createChild?.repo?{repo:vn(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)}:{},...l.createChild?.workspace?{workspace:vn(l.createChild.workspace,r,`$.steps.${a}.create_child.workspace`)}:{}},runner:l.runner??null,prompt:qS(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 Cm(e){let t;try{let n=await xS(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>ys)throw new Error(`Definition exceeds ${ys} bytes.`);t=await _S(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return Cc(Pc(t,e),e)}function FS(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]=MS(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 MS(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 jS(e,t){return e.replace(LS,(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 vn(e,t,n){let r=jS(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 qS(e,t,n){let r=`$.steps.${n}.prompt`,s=vn(e,t,r);if(Buffer.byteLength(s)>hr)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${hr} bytes.`,{details:{location:r,maxBytes:hr}});return s}import{createHash as Am}from"node:crypto";import US from"node:path";import{mkdir as WS}from"node:fs/promises";var Oc={type:"system",component:"heartbeat"};async function tn(e,t={}){await WS(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),lf(e),zS(e)]),o=r??pt(n.tasks.filter(h=>h.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=YS(i),l=a!==i,c=[],d=$c(s.filter(HS),h=>h.taskId),u=$c(s.filter(h=>h.type.startsWith("task.pr.")),h=>h.taskId),p=$c(s.filter(h=>h.type==="agent.state.changed"),h=>h.agentTabId);for(let h of n.tasks){let f=BS(h),y=d.get(h.id),k=Nc(y?.data)??a.tasks[h.id]??null,R=y?.id??a.tasks[h.id]?.eventId??null;if(k?.signature!==f.signature){let x=k?h.status==="closed"&&k?.status!=="closed"?"task.closed":"task.updated":"task.created",v=await De(e,{id:Dc(x,h.id,f.signature),type:x,taskId:h.id,workspaceId:h.workspaceId||null,occurredAt:h.updatedAt,actor:Oc,data:{...f,changedFields:k?KS(k,f):[]}});c.push(v),R=v.id}a.tasks[h.id]={...f,eventId:R};let T=GS(h.prs),O=u.get(h.id),$=Nc(O?.data)??a.pullRequests[h.id]??null,D=O?.id??a.pullRequests[h.id]?.eventId??null;if(($||T.associations.length>0)&&$?.signature!==T.signature){let x=Array.isArray($?.associations)?$.associations.length:0,v=T.associations.length>x?"task.pr.linked":T.associations.length<x?"task.pr.unlinked":"task.pr.refreshed",w=await De(e,{id:Dc(v,h.id,T.signature),type:v,taskId:h.id,workspaceId:h.workspaceId||null,occurredAt:h.updatedAt,actor:Oc,data:T});c.push(w),D=w.id}a.pullRequests[h.id]={...T,eventId:D}}let m=new Map(o.tasks.map(h=>[h.taskId,h.state]));for(let h of o.agents){let f=p.get(h.tabId),y=Nc(f?.data)??a.agents[h.tabId]??null;if(y?.state===h.state){a.agents[h.tabId]={state:h.state,eventId:f?.id??a.agents[h.tabId]?.eventId??null};continue}let k=[f?.id??a.agents[h.tabId]?.eventId??"initial",h.state,h.sessionState??"none",h.lastActivityAt??"none",h.exitCode??"none",h.error??"none"].join(":"),R=await De(e,{id:Dc("agent.state.changed",h.tabId,k),type:"agent.state.changed",taskId:h.taskId,agentTabId:h.tabId,actor:Oc,data:{previousState:typeof y?.state=="string"?y.state:null,state:h.state,taskState:m.get(h.taskId)??"idle",sessionState:h.sessionState,lastActivityAt:h.lastActivityAt,exitCode:h.exitCode,error:h.error}});c.push(R),a.agents[h.tabId]={state:h.state,eventId:R.id}}return(c.length>0||l)&&await q(Om(e),a),c}function BS(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:Em(t)}}var VS=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function KS(e,t){return VS.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function GS(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:Em(t)}}function $c(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var HS=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",Em=e=>Am("sha256").update(JSON.stringify(e)).digest("hex"),Dc=(...e)=>Am("sha256").update(e.join("\0")).digest("hex"),Nc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,Om=e=>US.join(e.orchestrationDir,"event-reconciliation.json");function YS(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 zS(e){try{return await Ns(Om(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function JS(e,t){return await _c(e),await tn(e),Tn(e,t)}async function XS(e,t,n){await _c(e);let r=await At.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await tn(e,{agentObserver:r});let a=await Tn(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 $m(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function QS(e,t,n){await _c(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 tn(e,{agentObserver:s});let o=(await Tn(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=pt([r],s.getSnapshots(),l),d=n.tabId?c.agents.find(m=>m.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 eP(t);let u=a-Date.now();if(u<=0)throw ZS(t,n.states,n.timeoutMs);await tn(e,{agentObserver:s}),o=(await Tn(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await $m(Math.min(250,u),n.signal)}}finally{s.close()}}async function _c(e){let t=await b.load(e);if(!b.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 $m(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 ZS=(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}}),eP=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),no={list:JS,watch:XS,waitForTaskState:QS,reconcile:tn};import{readFile as hP}from"node:fs/promises";import{mkdir as cP,readFile as xm,rm as Lm}from"node:fs/promises";import{createConnection as uP}from"node:net";import dP from"node:path";import{spawn as iP}from"node:child_process";import{closeSync as oP,openSync as aP}from"node:fs";import Lc from"node:path";import{accessSync as tP,constants as nP}from"node:fs";import{homedir as Dm}from"node:os";import nn from"node:path";var rP=[nn.join(Dm(),".local","bin"),nn.join(Dm(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function _m(e=process.env){return sP([...(e.PATH??"").split(nn.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:rP])}function ro(e=process.env){return{...e,PATH:_m(e).join(nn.delimiter)}}function xc(e,t={}){if(e.includes(nn.sep)){let n=nn.isAbsolute(e)?e:nn.resolve(t.cwd??process.cwd(),e);return Nm(n)?n:null}for(let n of _m(t.env)){let r=nn.join(n,e);if(Nm(r))return r}return null}function so(e,t={}){let n=xc(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 Nm(e){try{return tP(e,nP.X_OK),!0}catch{return!1}}function sP(e){return[...new Set(e)]}function io(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=lP(e.workspaceRoot),s=aP(Lc.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return iP(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{oP(s)}})().unref()}function lP(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=Lc.resolve(Lc.dirname(t),"..","node_modules",".bin","tsx");return{command:xc("tsx")??n,args:[t,"__craig-daemon",e]}}if(!t)throw new Error("Craig cannot resolve its daemon entrypoint.");return{command:process.execPath,args:[...process.execArgv,t,"__craig-daemon",e]}}async function _t(e){let t=await ao(Je(e).socketPath).catch(()=>null);if(!t)return!1;try{let n=await Cn(t,{type:"ping"});return Kt(n.protocolVersion)?(await Cn(t,{type:"wakeOrchestration"}),!0):!1}catch{return!1}finally{t.end()}}async function oo(e,t){if(t.length===0)return!0;let n=await ao(Je(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await Cn(n,{type:"ping"});if(!Kt(r.protocolVersion))return!1;for(let s of t)await Cn(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function Mm(e,t){await pP(e);let n=await ao(Je(e).socketPath);try{let r=await Cn(n,{type:"ping"});if(!Kt(r.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await Cn(n,{type:"ensureSession",taskId:t.taskId,tabId:t.tabId,size:{columns:120,rows:36},spec:{cwd:t.cwd,command:t.command,...t.env?{env:t.env}:{}}})}finally{n.end()}}async function pP(e){let t=Je(e),n=await Fm(t.socketPath).catch(()=>null);if(Kt(n?.protocolVersion))return;if(n)throw new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly.");await cP(e.runtimeDir,{recursive:!0});let r=await xm(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&fP(s))throw new Error("A Craig PTY daemon process is still running but is not accepting connections. Stop it explicitly before starting another daemon.");await Promise.all([Lm(t.socketPath,{force:!0}),Lm(t.pidPath,{force:!0})]),io(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await Fm(t.socketPath).catch(()=>null);if(Kt(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await xm(dP.join(e.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
|
|
209
|
+
${o.slice(-2e3)}`:""}`)}async function Fm(e){let t=await ao(e);try{return await Cn(t,{type:"ping"})}finally{t.end()}}function fP(e){try{return process.kill(e,0),!0}catch{return!1}}var mP=1;function Cn(e,t){let n=mP++;return new Promise((r,s)=>{let i="",o=setTimeout(()=>{l(),e.destroy(),s(new Error("Craig PTY daemon request timed out."))},1e3),a=c=>{i+=String(c);let d=i.indexOf(`
|
|
210
210
|
`);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})}
|
|
211
|
-
`)})}function
|
|
211
|
+
`)})}function ao(e){return new Promise((t,n)=>{let r=uP(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function gP(e,t){await RP(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 bP(t.prompt,t.readStdin),o;try{o=await ae.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 _t(e),a}return await Fc(e,o.command.id),o}async function Fc(e,t){if((await ae.show(e,t)).command.state==="delivered"||await _t(e))return;let r=(await ae.show(e,t)).command;if(r.state==="delivered")return;let s=r.state==="queued"?await ae.fail(e,r.id,{code:"ORCHESTRATION_UNAVAILABLE",message:"Craig could not wake the workspace orchestration supervisor.",retryable:!0,deliveryUncertain:!1}):r;throw new g("PARTIAL_RESULT",`Command ${r.id} was persisted as ${s.state}, but Craig could not start prompt delivery.`,{retryable:!0,details:{commandId:r.id,durableState:s.state}})}async function yP(e,t){return ae.show(e,t)}async function wP(e,t){return ae.list(e,t)}async function kP(e,t){let n;try{n=await ae.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await _t(e),r}return await _t(e),n}async function TP(e,t,n){return ae.wait(e,t,n)}async function bP(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await hP(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 RP(e){let t=await b.load(e);if(!b.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Prompt dispatch is a feature preview. Enable agentOrchestration before sending prompts.",{details:{preview:"agentOrchestration"}})}var gr={send:gP,show:yP,list:wP,cancel:kP,wait:TP};var SP=6e4;async function lo(e,t){return Vl(e,t,{createTask:PP})}async function jm(e,t,n,r={}){return Bl(e,t,n,{...r,launchProvisioned:(s,i)=>qm(e,s,i,!1)})}async function PP(e,t,n,r={}){return S.createTask(e,t,n,{...r,markStartedAfterLaunch:!1,launchProvisioned:(s,i)=>qm(e,s,i,!0)})}async function qm(e,t,n,r=!1){let s=t.ptyTabs.find(i=>i.kind==="agent");if(!s)throw new Error(`Task ${t.id} is missing its agent PTY tab.`);try{if(await Mm(e,{taskId:t.id,tabId:s.id,cwd:t.worktreePath,command:r?s.command:t.runnerSession.command,...n?{env:n}:{}}),!r)return;let i=await ae.create(e,{taskId:t.id,agentTabId:s.id,prompt:{source:"inline",text:t.prompt.value},delivery:"when-ready",timeoutMs:SP,idempotencyKey:`task-start:${t.id}`,actor:{type:"system",component:"orchestration-supervisor"}});await Fc(e,i.command.id)}catch(i){throw await oo(e,[s.id]),i}}async function co(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 Gl(e,t,n);return await oo(e,o),a}catch(a){throw a instanceof g&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await oo(e,o),a}}import{randomUUID as Bm}from"node:crypto";import{readFile as IP,realpath as Um}from"node:fs/promises";import Mc from"node:path";var ne={type:"system",component:"orchestration-supervisor"},vP=/\$\{\{\s*steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)\s*\}\}/g;async function CP(e,t,n,r,s,i){await $n(e);let o=await UP(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 Ec(t,n);WP(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_${Bm()}`,planHash:wl(c),createdBy:s,createdAt:l};await Wp(e,a.definitionHash,await IP(t,"utf8"));let u=await Bp(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 AP(e,t,n){if(await $n(e),n.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can approve a Fury plan.",{});let r=await oi(e,t),s={schemaVersion:1,planId:r.id,planHash:r.planHash,approvedBy:n,approvedAt:new Date().toISOString()},i=await Gp(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 EP(e,t,n,r){await $n(e);let s=await oi(e,t);if((await Hp(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 Xe(e,await S.getTask(e,s.rootTaskId));let o=new Date,l={schemaVersion:1,id:`fury_${Bm()}`,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 Yp(e,l);try{await ce(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 On(e,c.run.id),await _t(e),{kind:"runFury",run:await de(e,c.run.id),created:c.created}}async function OP(e,t){return await $n(e),await On(e,t),{kind:"showFury",run:await de(e,t)}}async function po(e,t={}){let n=await b.load(e);if(b.previews.isEnabled(n,"agentOrchestration"))for(let r of await zp(e))await On(e,r.id,t)}async function On(e,t,n={}){let r=await de(e,t);if(await GP(e,r),kt(r))return;if(Date.now()>=Date.parse(r.deadlineAt)){r=await Ve(e,t,o=>KP(o));for(let o of Object.values(r.stepRuns))o.reviewId&&await Hr(e,o.reviewId,a=>({...a,state:"timed_out",version:a.version+1,updatedAt:new Date().toISOString()}));await ce(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 Wm(e,r,a);continue}a.state==="running"&&a.commandId&&s.get(a.commandId)?.state==="failed"&&(r=await uo(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 uo(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=>rn(c,a.id,{state:"timed_out",error:"Step timed out.",completedAt:new Date().toISOString(),completedBy:ne})),await ce(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 Hr(e,a.reviewId,c=>({...c,state:"timed_out",version:c.version+1,updatedAt:new Date().toISOString()})),r=await Ve(e,r.id,c=>rn(c,a.id,{state:"timed_out",error:"Review timed out.",completedAt:new Date().toISOString(),completedBy:ne})),await ce(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 fo(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 $P(e,r,a):(r=await Wm(e,r,a),i+=1))}await VP(e,r.id)}async function Wm(e,t,n){let r=new Date;t=await Ve(e,t.id,o=>rn(o,n.id,{state:"running",startedAt:r.toISOString(),deadlineAt:o.deadlineAt})),await ce(e,t,n.id,"fury.step.started",ne,{});let s=t.stepRuns[n.id];if(s.taskId)return t;let i=`${En(s.plan.prompt,t)}
|
|
212
212
|
|
|
213
|
-
${
|
|
213
|
+
${BP(t.id,n.id,s.plan.outputSchema)}`;try{let o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await lo(e,{parentTaskId:t.rootTaskId,...s.plan.target.repo?{repoId:En(s.plan.target.repo,t)}:{},...s.plan.target.workspace?{workspaceId:En(s.plan.target.workspace,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=En(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 Xe(e,c,ne,d.id),a=d.id,l=(await ae.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=>rn(c,n.id,{taskId:o,agentTabId:a,commandId:l})),await ce(e,t,n.id,"fury.step.dispatched",ne,{taskId:o,agentTabId:a,commandId:l}),t}catch(o){return uo(e,t.id,n.id,o instanceof Error?o.message:"Step dispatch failed.",ne)}}async function $P(e,t,n){let r=n.plan.review,s=new Date,i=`review_${t.id.slice(5)}_${n.id}`,o=r.feedbackTask?En(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:En(r.title,t),summary:En(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 Xp(e,l),t=await Ve(e,t.id,c=>rn(c,n.id,{state:"waiting_for_review",reviewId:i,startedAt:s.toISOString(),deadlineAt:l.deadlineAt})),await ce(e,t,n.id,"fury.review.requested",ne,{reviewId:i,title:l.title}),t}async function DP(e,t,n,r,s,i){let o=await de(e,t),a=Km(o,n);await Vm(e,a,s,i,"fury.step.complete"),qP(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await Ve(e,t,c=>{if(kt(c)||c.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return rn(c,n,{state:"succeeded",output:r,completedAt:l,completedBy:s})}),await ce(e,o,n,"fury.step.succeeded",s,{taskId:a.taskId}),await On(e,t),o=await de(e,t),{kind:"completeFuryStep",run:o,step:o.stepRuns[n]}}async function NP(e,t,n,r,s,i){let o=await de(e,t),a=Km(o,n);await Vm(e,a,s,i,"fury.step.fail");let l=await uo(e,t,n,r,s);return await fo(e,t,"failed",s),{kind:"failFuryStep",run:await de(e,t),step:l.stepRuns[n]}}async function _P(e,t,n,r){let s=await de(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(kt(s))return{kind:"cancelFury",run:s,changed:!1};let i=new Date().toISOString(),o=!1,a=await Ve(e,t,c=>kt(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 ae.cancel(e,d.id,n),c.taskId&&c.plan.target?.type==="create_child"&&await co(e,c.taskId).catch(()=>{}),c.reviewId&&await Hr(e,c.reviewId,u=>({...u,state:"cancelled",version:u.version+1,updatedAt:i}))}return await ce(e,a,null,"fury.run.cancelled",n,{}),{kind:"cancelFury",run:a,changed:o}}async function xP(e,t,n,r){let s=await de(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(kt(s))throw new g("FURY_STATE_CONFLICT",`Cannot resume ${s.id} while it is ${s.state}.`,{});return await On(e,t),await _t(e),{kind:"resumeFury",run:await de(e,t)}}async function LP(e,t,n){return await $n(e),{kind:"listFuryReviews",reviews:(await ai(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function FP(e,t){return await $n(e),{kind:"showFuryReview",review:await er(e,t)}}async function MP(e,t,n,r,s,i){let o=await er(e,t),a=await de(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 m=await S.getTask(e,o.feedbackTarget.taskId),h=o.feedbackTarget.agentTabId?m.ptyTabs.find(y=>y.kind==="agent"&&y.id===o.feedbackTarget.agentTabId):m.ptyTabs.find(y=>y.kind==="agent");if(!h)throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${m.id} has no agent tab.`,{});c=(await ae.create(e,{taskId:m.id,agentTabId:h.id,prompt:{source:"inline",text:`Fury review changes requested:
|
|
214
214
|
|
|
215
|
-
${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 Hr(e,t,m=>{if(!(n==="resubmit"?m.state==="changes_requested":m.state==="waiting_for_review")||m.version!==o.version)throw new g("FURY_STATE_CONFLICT",`Review ${t} changed concurrently.`,{});return{...m,state:p,round:n==="resubmit"?m.round+1:m.round,version:m.version+1,lastDecision:u,history:[...m.history,u],updatedAt:d}}),a=await Ve(e,a.id,m=>{if(kt(m))throw new g("FURY_STATE_CONFLICT",`Run ${m.id} is ${m.state}.`,{});return
|
|
215
|
+
${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 Hr(e,t,m=>{if(!(n==="resubmit"?m.state==="changes_requested":m.state==="waiting_for_review")||m.version!==o.version)throw new g("FURY_STATE_CONFLICT",`Review ${t} changed concurrently.`,{});return{...m,state:p,round:n==="resubmit"?m.round+1:m.round,version:m.version+1,lastDecision:u,history:[...m.history,u],updatedAt:d}}),a=await Ve(e,a.id,m=>{if(kt(m))throw new g("FURY_STATE_CONFLICT",`Run ${m.id} is ${m.state}.`,{});return rn(m,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 ce(e,a,o.stepId,`fury.review.${n}`,s,{reviewId:t,round:o.round,feedbackCommandId:c}),n==="reject"?await fo(e,a.id,"failed",s):await On(e,a.id),c&&await _t(e),{kind:"actFuryReview",review:o,run:await de(e,a.id)}}async function jP(e,t,n,r){await $n(e),await de(e,t);let s=n,i=0,o=0;for(;!r.signal?.aborted;){await On(e,t);let a=await Tn(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,kt(await de(e,t)))return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!1};await HP(250,r.signal)}return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!0}}function En(e,t){return e.replace(vP,(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=An(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 qP(e,t){if(!t){if(e!=null)throw new g("FURY_OUTPUT_INVALID","This step does not declare output.",{});return}let n=[];if(jc(e,t,"$",n),n.length)throw new g("FURY_OUTPUT_INVALID","Fury step output does not match its schema.",{details:{issues:n}})}function jc(e,t,n,r){let s=t.type;if(!(s==="null"?e===null:s==="array"?Array.isArray(e):s==="object"?An(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"&&An(e)){let o=An(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))An(o[a])?jc(l,o[a],`${n}.${a}`,r):t.additionalProperties===!1&&r.push(`${n}.${a} is not allowed.`)}s==="array"&&Array.isArray(e)&&An(t.items)&&e.forEach((o,a)=>jc(o,t.items,`${n}[${a}]`,r))}async function Vm(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 Km(e,t){if(kt(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 UP(e,t){let[n,r]=await Promise.all([Um(he(e).root),Um(t)]),s=Mc.relative(n,r);if(!s||s.startsWith("..")||Mc.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 Mc.join(".craig","fury",s)}function WP(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 BP(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
|
|
216
216
|
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
|
|
217
|
-
If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function co(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(kt(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 BP(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 po(e,t,s,ne)}async function po(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=>kt(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 VP(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=An(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 KP(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 er(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 $n(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 kt(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function An(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function GP(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 Le={plan:vP,approve:CP,run:AP,show:EP,watch:MP,cancel:NP,resume:_P,completeStep:$P,failStep:DP,listReviews:xP,showReview:LP,actOnReview:FP,reconcile:uo};async function Gm(e,t){switch(e.kind){case"addWorkspace":{let n=await ke.addWorkspace(t.paths,e.path),r=n.workspace.kind==="project"?n.workspace.discoveredRepoIds?.[0]??null:n.repos[0]?.id??null;return await qc(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await ke.repos.addRepo(t.paths,e.path);return await qc(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return ke.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await Mn({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await $e(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await ke.repos.removeRepo(t.paths,e.repoId,{listTasks:P.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await qt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await qt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return ke.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await ke.archiveWorkspace(t.paths,e.workspaceId);return await zP(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await ke.restoreWorkspace(t.paths,e.workspaceId);return await qc(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return ke.removeWorkspace(t.paths,e.workspaceId,{listTasks:P.listTasks});case"createTask":return Mm(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 Dn(t),ao(t.paths,{parentTaskId:e.parentTaskId??an(t).task.id,...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{},prompt:e.prompt,...e.runner?{runner:e.runner}:{},...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.agentCapabilityId?{capabilityId:t.agentCapabilityId}:{}})}case"listTaskChildren":return Dn(t),Kl(t.paths,e.taskId??an(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return Dn(t),lo(t.paths,e.taskId??an(t).task.id,t.agentCapabilityId);case"validateFury":return await Km(t),Ac(Wc.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await Km(t),Le.plan(t.paths,Wc.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??an(t).task.id,on(t),t.agentCapabilityId);case"approveFury":return Le.approve(t.paths,e.planId,on(t));case"runFury":return Dn(t),Le.run(t.paths,e.planId,on(t),t.agentCapabilityId);case"showFury":return Le.show(t.paths,e.runId);case"watchFury":return Le.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return Le.cancel(t.paths,e.runId,on(t),t.agentCapabilityId);case"resumeFury":return Le.resume(t.paths,e.runId,on(t),t.agentCapabilityId);case"completeFuryStep":return Dn(t),Le.completeStep(t.paths,e.runId,e.stepId,await YP(e.output,t),on(t),t.agentCapabilityId);case"failFuryStep":return Dn(t),Le.failStep(t.paths,e.runId,e.stepId,e.reason,on(t),t.agentCapabilityId);case"listFuryReviews":return Le.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return Le.showReview(t.paths,e.reviewId);case"actFuryReview":return Dn(t),Le.actOnReview(t.paths,e.reviewId,e.action,e.message??null,on(t),t.agentCapabilityId);case"listTasks":return e.repoId||e.workspaceId?P.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):P.listTasks(t.paths);case"currentTask":{let n=an(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"addTaskLink":return P.addTaskLink(t.paths,e.taskId,e.repoId);case"listTaskLinks":return P.listTaskLinks(t.paths,e.taskId);case"refreshInteractiveState":throw new Error("Interactive refresh should be handled by the interactive app.");case"showTask":return P.showTask(t.paths,e.taskId);case"showCurrentTask":return P.showTask(t.paths,an(t).task.id);case"showTaskPr":return P.prs.show(t.paths,Nn(e.taskId,t),e.repoId);case"discoverTaskPr":return P.prs.discover(t.paths,Nn(e.taskId,t),e.repoId);case"linkTaskPr":return P.prs.link(t.paths,Nn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return P.prs.refreshAssociation(t.paths,Nn(e.taskId,t),e.repoId);case"unlinkTaskPr":return P.prs.unlink(t.paths,Nn(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=Nn(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?no.waitForTaskState(t.paths,r,n):At.waitForTask(t.paths,r,n)}case"listEvents":return no.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return no.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 gr.send(t.paths,{taskId:Nn(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 gr.show(t.paths,e.commandId);case"listPromptCommands":return gr.list(t.paths,e.taskId);case"cancelPromptCommand":return gr.cancel(t.paths,e.commandId);case"waitPromptCommand":return gr.wait(t.paths,e.commandId,{...e.states?{states:e.states}:{},timeoutMs:e.timeoutMs,...t.signal?{signal:t.signal}:{}});case"showSelectedTask":return P.showTask(t.paths,yr(t,"show"));case"streamTaskLogs":return P.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return P.prepareTaskLogs(t.paths,yr(t,"logs"));case"showTaskDiff":return P.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return P.showTaskDiff(t.paths,yr(t,"diff"));case"openTask":return P.openTask(t.paths,e.taskId);case"openSelectedTask":return P.openTask(t.paths,yr(t,"open"));case"runChecks":return P.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return P.runChecks(t.paths,yr(t,"check"));case"commitTask":return P.commitTask(t.paths,e.taskId);case"commitSelectedTask":return P.commitTask(t.paths,yr(t,"commit"));case"showContext":{let n=XP(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:na()};case"exit":return{kind:"exit"};default:return JP(e)}}function Dn(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 Km(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 YP(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await HP(Wc.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 qc(e,t,n){let r=await Mn({uiStateFile:e.uiStateFile})??xs();await qt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function zP(e,t){let n=await Mn({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await qt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function JP(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function yr(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 Nn(e,t){return e??an(t).task.id}function XP(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Ym(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(`
|
|
217
|
+
If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function uo(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(kt(l)||l.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,rn(l,n,{state:"failed",error:r,completedAt:i,completedBy:s})});return o&&await ce(e,a,n,"fury.step.failed",s,{reason:r}),a}function rn(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function VP(e,t){let n=await de(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 fo(e,t,s,ne)}async function fo(e,t,n,r){let s=await de(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=>kt(l)?l:{...l,state:n,updatedAt:o,stateChangedAt:o,completedAt:i?o:null});return a.state!==n||await ce(e,a,null,`fury.run.${n}`,r,{state:n}),a}function KP(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 ce(e,t,n,r,s,i){let o=An(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 GP(e,t){await ce(e,t,null,"fury.run.created",t.actor,{state:"pending"}),t.state!=="pending"&&await ce(e,t,null,`fury.run.${t.state}`,ne,{state:t.state});for(let n of Object.values(t.stepRuns)){if(n.startedAt&&await ce(e,t,n.id,"fury.step.started",ne,{}),n.taskId&&await ce(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 ce(e,t,n.id,`fury.step.${n.state}`,n.completedBy??ne,{reason:n.error}),!n.reviewId)continue;let r=await er(e,n.reviewId);await ce(e,t,n.id,"fury.review.requested",ne,{reviewId:r.id,title:r.title});for(let s of r.history)await ce(e,t,n.id,`fury.review.${s.action}`,s.actor,{reviewId:r.id,round:s.round,feedbackCommandId:s.feedbackCommandId})}}async function $n(e){if(!b.previews.isEnabled(await b.load(e),"agentOrchestration"))throw new g("CLI_USAGE","Fury execution is a feature preview. Enable agentOrchestration first.",{details:{preview:"agentOrchestration"}})}function kt(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function An(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function HP(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 Le={plan:CP,approve:AP,run:EP,show:OP,watch:jP,cancel:_P,resume:xP,completeStep:DP,failStep:NP,listReviews:LP,showReview:FP,actOnReview:MP,reconcile:po};async function Hm(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 qc(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await we.repos.addRepo(t.paths,e.path);return await qc(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return we.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await Mn({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await $e(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 JP(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await we.restoreWorkspace(t.paths,e.workspaceId);return await qc(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return we.removeWorkspace(t.paths,e.workspaceId,{listTasks:S.listTasks});case"createTask":return jm(t.paths,e.repoId??e.workspaceId??"",e.prompt,{...e.runner?{runner:e.runner}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}});case"createChildTask":{let n=await b.load(t.paths);if(!b.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 Dn(t),lo(t.paths,{parentTaskId:e.parentTaskId??on(t).task.id,...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{},prompt:e.prompt,...e.runner?{runner:e.runner}:{},...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.agentCapabilityId?{capabilityId:t.agentCapabilityId}:{}})}case"listTaskChildren":return Dn(t),Kl(t.paths,e.taskId??on(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return Dn(t),co(t.paths,e.taskId??on(t).task.id,t.agentCapabilityId);case"validateFury":return await Gm(t),Ac(Uc.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await Gm(t),Le.plan(t.paths,Uc.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??on(t).task.id,sn(t),t.agentCapabilityId);case"approveFury":return Le.approve(t.paths,e.planId,sn(t));case"runFury":return Dn(t),Le.run(t.paths,e.planId,sn(t),t.agentCapabilityId);case"showFury":return Le.show(t.paths,e.runId);case"watchFury":return Le.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return Le.cancel(t.paths,e.runId,sn(t),t.agentCapabilityId);case"resumeFury":return Le.resume(t.paths,e.runId,sn(t),t.agentCapabilityId);case"completeFuryStep":return Dn(t),Le.completeStep(t.paths,e.runId,e.stepId,await zP(e.output,t),sn(t),t.agentCapabilityId);case"failFuryStep":return Dn(t),Le.failStep(t.paths,e.runId,e.stepId,e.reason,sn(t),t.agentCapabilityId);case"listFuryReviews":return Le.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return Le.showReview(t.paths,e.reviewId);case"actFuryReview":return Dn(t),Le.actOnReview(t.paths,e.reviewId,e.action,e.message??null,sn(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=on(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}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,on(t).task.id);case"showTaskPr":return S.prs.show(t.paths,Nn(e.taskId,t),e.repoId);case"discoverTaskPr":return S.prs.discover(t.paths,Nn(e.taskId,t),e.repoId);case"linkTaskPr":return S.prs.link(t.paths,Nn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return S.prs.refreshAssociation(t.paths,Nn(e.taskId,t),e.repoId);case"unlinkTaskPr":return S.prs.unlink(t.paths,Nn(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=Nn(e.taskId,t),s=await b.load(t.paths);return b.previews.isEnabled(s,"agentOrchestration")?no.waitForTaskState(t.paths,r,n):At.waitForTask(t.paths,r,n)}case"listEvents":return no.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return no.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 gr.send(t.paths,{taskId:Nn(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 gr.show(t.paths,e.commandId);case"listPromptCommands":return gr.list(t.paths,e.taskId);case"cancelPromptCommand":return gr.cancel(t.paths,e.commandId);case"waitPromptCommand":return gr.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,yr(t,"show"));case"streamTaskLogs":return S.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return S.prepareTaskLogs(t.paths,yr(t,"logs"));case"showTaskDiff":return S.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return S.showTaskDiff(t.paths,yr(t,"diff"));case"openTask":return S.openTask(t.paths,e.taskId);case"openSelectedTask":return S.openTask(t.paths,yr(t,"open"));case"runChecks":return S.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return S.runChecks(t.paths,yr(t,"check"));case"commitTask":return S.commitTask(t.paths,e.taskId);case"commitSelectedTask":return S.commitTask(t.paths,yr(t,"commit"));case"showContext":{let n=QP(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:na()};case"exit":return{kind:"exit"};default:return XP(e)}}function Dn(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 Gm(e){let t=await b.load(e.paths);if(!b.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 sn(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=on(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 zP(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await YP(Uc.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 qc(e,t,n){let r=await Mn({uiStateFile:e.uiStateFile})??xs();await jt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function JP(e,t){let n=await Mn({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await jt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function XP(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function yr(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 on(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Nn(e,t){return e??on(t).task.id}function QP(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function zm(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(`
|
|
218
218
|
`);case"createRepo":return[`${e.created?"Registered":"Already registered"} repo ${e.repo.id}`,`Path: ${e.repo.rootPath}`,`Branch: ${e.repo.defaultBranch}`,`Workspace: ${e.workspaceId}`].join(`
|
|
219
219
|
`);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(`
|
|
220
220
|
`);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(`
|
|
@@ -224,58 +224,58 @@ If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>
|
|
|
224
224
|
`);case"cancelTaskTree":return[`Cancelled task tree ${e.taskId}`,...e.cancelled.map(t=>`${t.taskId}: ${t.disposition}`)].join(`
|
|
225
225
|
`);case"validateFury":return[`Valid fury ${e.name}`,`Definition: ${e.definitionHash}`,`Steps: ${e.stepCount}`,`Order: ${e.order.join(" -> ")}`].join(`
|
|
226
226
|
`);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(`
|
|
227
|
-
`);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
|
|
228
|
-
`);case"showFuryReview":return
|
|
227
|
+
`);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 ZP(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(`
|
|
228
|
+
`);case"showFuryReview":return Ym(e.review);case"actFuryReview":return`${Ym(e.review)}
|
|
229
229
|
Run: ${e.run.state}`;case"watchFury":return"";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(`
|
|
230
|
-
`);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} ${
|
|
231
|
-
`);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}`,`Agent tab: ${e.task.ptyTabs.find(t=>t.kind==="agent")?.id??"<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}`,...
|
|
230
|
+
`);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} ${iI(t)} ${oI(t)} ${t.title}`)].join(`
|
|
231
|
+
`);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}`,`Agent tab: ${e.task.ptyTabs.find(t=>t.kind==="agent")?.id??"<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}`,...rI(e)].join(`
|
|
232
232
|
`);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(`
|
|
233
|
-
`);case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return
|
|
234
|
-
`);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
|
|
233
|
+
`);case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return nI(e);case"listAgents":case"showAgentStatus":return tI(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(Wc).join(`
|
|
234
|
+
`);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 eI(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(`
|
|
235
235
|
`);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(`
|
|
236
236
|
`);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"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(`
|
|
237
|
-
`);default:return
|
|
238
|
-
`)}function
|
|
239
|
-
`)}function
|
|
240
|
-
`)}function
|
|
241
|
-
`)}function
|
|
242
|
-
`)}function
|
|
243
|
-
`)}:{},...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?
|
|
244
|
-
`),0}catch(r){let s=ea(r),i=n?
|
|
245
|
-
`),s.exitCode}}function
|
|
246
|
-
`).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
|
|
247
|
-
`)){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 ws(e){return(await J("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await J("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function
|
|
248
|
-
`),byteLength:s.byteLength}}catch(r){let s=r instanceof Error?r.message:"Unable to read file.";return Ie(t,s,"missing",t,null)}}async function Kc(e,t,n,r=null){if(!t)return Ie("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 ws(e);if(a){let l=await K("git",["diff","--stat","--patch",`--unified=${
|
|
249
|
-
${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await K("git",["diff","--cached","--stat","--patch",`--unified=${
|
|
250
|
-
${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await K("git",["diff","--stat","--patch",`--unified=${
|
|
251
|
-
${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await J("git",["diff","--no-index","--stat","--patch",`--unified=${
|
|
237
|
+
`);default:return sI(e)}}function ZP(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(`
|
|
238
|
+
`)}function Ym(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(`
|
|
239
|
+
`)}function eI(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(`
|
|
240
|
+
`)}function Wc(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function tI(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(`
|
|
241
|
+
`)}function nI(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(`
|
|
242
|
+
`)}function rI(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 sI(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function iI(e){return e.checks.status}function oI(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 Jm(e,t){let{data:n,warnings:r}=aI(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:n,warnings:r})}function aI(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...n}=e;return{data:n,warnings:t}}return{data:e,warnings:[]}}function Xm(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 Bc(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=ve(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 Qm(e){let t="cli",n=Rd(e.argv);try{let r=bd(e.argv);if(n=r.options.json,r.mode==="interactive"){if(r.options.noInput||r.options.json||hI(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 Bc({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.",{});uI(r.command,r.options.taskId);let s=pI(r.command,r.options.taskId),i=cI(s);dI(s,r.options.taskId,i);let o=i!=="none",a=await Bc({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:lI(s),resolveTask:i!=="none",requireTask:i==="required"}),l=fI(s,e.signal),c;try{c=await Hm(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):Wc(u)}
|
|
243
|
+
`)}:{},...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?Jm(t,c):zm(c);return d.length>0&&e.writeStdout(`${d}
|
|
244
|
+
`),0}catch(r){let s=ea(r),i=n?Xm(t,s):s.message;return e.writeStderr(`${i}
|
|
245
|
+
`),s.exitCode}}function lI(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function cI(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"||mI(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 uI(e,t){let n=Zm(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 dI(e,t,n){if(!(t===void 0||n!=="none"||Zm(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 Zm(e){switch(e.kind){case"showTask":case"listTaskLinks":case"listTaskChildren":case"cancelTaskTree":case"streamTaskLogs":case"showTaskDiff":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 pI(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 fI(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 mI(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function hI(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as eE}from"node:module";import{readFile as gI,stat as yI}from"node:fs/promises";import Vc from"node:path";var wI=200*1024,kI=500*1024,mo="100000";async function th(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return TI(e,t,n);try{let r=an(n.selectedFilePath??null,t.filePaths),s=an(n.selectedDiffPath??null,t.diffPaths),i=s?await ws(e.worktreePath):null,[o,a]=await Promise.all([go(e.worktreePath,r),s?Kc(e.worktreePath,s,t.diffRows,i):Promise.resolve(Ie("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 TI(e,t,n){let r=an(n.selectedFilePath??null,t.filePaths),s=an(n.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([rh(e,r),(async()=>{if(!s)return Ie("No diff selected","No local changes found.","empty");let l=ho(e,s),c=l?await ws(l.target.worktreePath).catch(()=>null):null;return sh(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function nh(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return bI(e,t);try{await me(e);let n=await ws(e.worktreePath),[r,s]=await Promise.all([ih(e.worktreePath),oh(e.worktreePath,n)]),i=[...new Set(s.map(u=>u.path))],o=an(t.selectedFilePath??null,r),a=an(t.selectedDiffPath??null,i),[l,c]=await Promise.all([go(e.worktreePath,o),a?Kc(e.worktreePath,a,s,n):Promise.resolve(Ie("No diff selected","No local changes found.","empty"))]),d=a?{[a]:c}:{};return{taskId:e.id,fileRows:ch(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:Ie("Files unavailable",r,"error"),selectedDiff:Ie("Diff unavailable",r,"error"),error:r}}}async function bI(e,t){let n=(e.repoTargets??[]).filter(p=>p.status==="ready"),r=await Promise.all(n.map(async p=>{let m=await ws(p.worktreePath).catch(()=>null),[h,f]=await Promise.all([ih(p.worktreePath).catch(()=>[]),oh(p.worktreePath,m).catch(()=>[])]);return{target:p,baseRef:m,targetFiles:h,targetDiffRows:f}})),s=[],i=[];for(let{target:p,targetFiles:m,targetDiffRows:h}of r)s.push(...m.map(f=>`${p.repoId}/${f}`)),i.push(...h.map(f=>({...f,path:`${p.repoId}/${f.path}`})));let o=[...new Set(i.map(p=>p.path))].sort(),a=an(t.selectedFilePath??null,s),l=an(t.selectedDiffPath??null,o),[c,d]=await Promise.all([rh(e,a),(async()=>{if(!l)return Ie("No diff selected","No local changes found.","empty");let p=ho(e,l),m=p?r.find(h=>h.target.repoId===p.target.repoId):null;return sh(e,l,i,m?.baseRef??null)})()]),u=l?{[l]:d}:{};return{taskId:e.id,fileRows:ch(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:u,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:d,error:null}}async function rh(e,t){let n=ho(e,t);if(!n)return Ie("No file selected","No Git-visible files found.","empty");let r=await go(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function sh(e,t,n,r=null){let s=ho(e,t);return s?{...await Kc(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}:Ie(t,"Repo target is unavailable.","error",t)}function ho(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 ih(e){let t=await K("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return uh(t.stdout)}async function oh(e,t){let[n,r,s,i]=await Promise.all([RI(e,t),eh(e,"staged"),eh(e,"unstaged"),SI(e)]);return[...n,...r,...s,...i]}async function RI(e,t){if(!t)return[];let[n,r]=await Promise.all([K("git",["diff","--name-status",`${t}...HEAD`],{cwd:e}),K("git",["diff","--numstat",`${t}...HEAD`],{cwd:e})]),s=ah(n.stdout),i=lh(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 eh(e,t){let n=t==="staged"?["diff","--cached"]:["diff"],[r,s]=await Promise.all([K("git",[...n,"--name-status"],{cwd:e}),K("git",[...n,"--numstat"],{cwd:e})]),i=ah(r.stdout),o=lh(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 SI(e){let t=await K("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=uh(t.stdout);return await Promise.all(n.map(async s=>{let i=await go(e,s),o=i.status==="ready"?PI(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function ah(e){return e.split(`
|
|
246
|
+
`).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 lh(e){let t=new Map;for(let n of e.split(`
|
|
247
|
+
`)){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 ws(e){return(await J("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await J("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function go(e,t){if(!t)return Ie("No file selected","No Git-visible files found.","empty");let n=II(e,t);try{let r=await yI(n);if(r.size>wI)return Ie(t,`File is ${r.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,r.size);let s=await gI(n);return vI(s)?Ie(t,"Binary file preview is not available in Craig.","binary",t,s.byteLength):{path:t,status:"ready",title:t,lines:s.toString("utf8").split(`
|
|
248
|
+
`),byteLength:s.byteLength}}catch(r){let s=r instanceof Error?r.message:"Unable to read file.";return Ie(t,s,"missing",t,null)}}async function Kc(e,t,n,r=null){if(!t)return Ie("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 ws(e);if(a){let l=await K("git",["diff","--stat","--patch",`--unified=${mo}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
|
|
249
|
+
${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await K("git",["diff","--cached","--stat","--patch",`--unified=${mo}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
|
|
250
|
+
${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await K("git",["diff","--stat","--patch",`--unified=${mo}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
|
|
251
|
+
${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await J("git",["diff","--no-index","--stat","--patch",`--unified=${mo}`,"--","/dev/null",t],{cwd:e});a.stdout.trim().length>0&&s.push(`untracked
|
|
252
252
|
${a.stdout.trimEnd()}`)}let o=s.join(`
|
|
253
253
|
|
|
254
|
-
`);return o.length>
|
|
255
|
-
`):["No diff for this file."],byteLength:o.length}}function
|
|
256
|
-
`).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function
|
|
257
|
-
`}function wh(e){return e.length===1&&e>=" "&&e!=="\x7F"}function Yc(e){return Th(e)||wr(e)!==null}function kh(e){return dh.includes(e)}function Th(e){return uh.includes(e)}function bh(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[B]:[]]}function AI(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function EI(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function ks(e,t,n){return t.includes(e??"")?e:n}function OI(e){return e==="tabs"?"center":ks(e,vI,"tasks")}function $I(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":ks(e,Hc,t)}function DI(e){return e==="file"||e==="diff"?e:null}function NI(e){return e==="terminal"?"terminal":"agent"}function _I(e){return e==="terminal"?"terminal":"control"}function xI(e,t=[...z],n="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:n}function go(e,t=z){let n=t.length>0?t:z,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function wr(e){let t=z.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function LI(e,t,n){if(!e)return{activeTab:t===B?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(Th(t)){let l=e.ptyTabs.find(c=>c.kind===t)??null??s??r??e.ptyTabs[0]??null;return{activeTab:l?.id??B,selectedPtyTabId:l?.id??null}}if(t===B)return{activeTab:B,selectedPtyTabId:r?.id??s?.id??e.ptyTabs[0]?.id??null};let o=s??r??e.ptyTabs[0]??null;return{activeTab:o?.id??B,selectedPtyTabId:o?.id??null}}function FI(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?MI(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function MI(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 jI(e,t){let n=_n(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 _n(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of Ts(yo(e.tasks,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 Ts(wo(e.tasks,n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function yo(e,t){return Rh(e,n=>n.workspaceId===t)}function wo(e,t){return Rh(e,n=>n.repoId===t)}function qI(e,t){return t.rootTaskId===t.id?t:e.find(n=>n.id===t.rootTaskId)??t}function Rh(e,t){let n=new Map(e.map(r=>[r.id,r]));return e.filter(r=>t(n.get(r.rootTaskId)??r))}function Ts(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 zc(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 xt(e){return typeof e=="string"?e:null}function WI(e){return e?`task:${e}`:null}function Rs(e){return typeof e=="string"&&e.startsWith("task:")}function ko(e){return typeof e=="string"&&e.startsWith("new-task:")}function To(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function Sh(e){return typeof e=="string"&&e.startsWith("workspace:")}function Jc(e){return ko(e)?e.slice(9):null}function Xc(e){return To(e)?e.slice(19):null}async function kr(e,t,n){let r=ve(e),[s,i]=await Promise.all([ke.repos.listRegisteredRepos(r),ke.listWorkspaces(r,{archived:!1})]),o=await P.listTasks(r),a={},l=await k.load(r),c=0;if(k.previews.isEnabled(l,"agentOrchestration")){let m=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(T=>T.kind==="agent").map(async T=>({agentTab:T,environment:await Xe(r,y,void 0,T.id)}))));for(let{agentTab:y,environment:T}of m)T.CRAIG_AGENT_CAPABILITY&&(a[y.id]=T.CRAIG_AGENT_CAPABILITY);o=await P.listTasks(r);let[h,f]=await Promise.all([Vp(r),ai(r)]);c=h.length+f.filter(y=>y.state==="waiting_for_review").length}let d=Qc(o.tasks,t),u=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},p=d?await th(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 Qc(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function Ph(e,t){return bs(e,t)}import lu from"node:path";import tB from"picocolors";var UI=[" \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 Zc(){return[...UI]}var bo={width:120,height:36},Q={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function Fe(e,t){return{width:Math.max(e??bo.width,bo.width),height:Math.max(t??bo.height,bo.height)}}var BI=["Start","Options","Exit"],VI=["Resume","Options","Exit"],So=2,Po=2,Io=2,KI=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),GI=new RegExp("\x1B\\[(?:0)?m","g"),HI=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),YI=/https?:\/\/[^\s<>"']+/g,tu="\x1B[0m",nu="\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"}},eu=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function Ch(e,t={}){return su(e,{subtitle:"crAIg is that you?",menuItems:BI,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function Ah(e,t={}){return su(e,{subtitle:"Control mode is paused.",menuItems:VI,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}var Ro=[" 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."],zI=["Help"],JI=5;function Ao(e,t={}){return su(e,{subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??zI,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function Eh(e,t={}){let n=t.color??!0,r=N.overlay,s=new Array(e.height).fill(re(" ".repeat(e.width),n,r)),i=Zc(),o=Math.max(1,Math.floor((e.height-i.length-2-Ro.length)/2));for(let d=0;d<i.length&&!(o+d>=e.height);d+=1)s[o+d]=re(Mh(i[d]??"",e.width),n,N.overlayLogo);let a=Math.max(...Ro.map(d=>d.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let d=0;d<Ro.length;d+=1){let u=c+d;if(u>=e.height)break;let p=Ro[d]??"";s[u]=re(Tt(" ".repeat(l)+p,e.width),n,r)}return s.join(`
|
|
258
|
-
`)}function
|
|
259
|
-
`)}function
|
|
260
|
-
`),center:f,regions:{rail:D,left:x,center:f,right:v,footer:w}}}function ru(e,t,n={}){let r=n.color??!0,s=
|
|
261
|
-
`)}function
|
|
254
|
+
`);return o.length>kI?Ie(t,"Diff is above the 500 KB inline preview limit.","too_large",t,o.length):o.includes("\0")?Ie(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(`
|
|
255
|
+
`):["No diff for this file."],byteLength:o.length}}function ch(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 an(e,t){return e&&t.includes(e)?e:t[0]??null}function PI(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function uh(e){return[...new Set(e.split(`
|
|
256
|
+
`).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function II(e,t){let n=Vc.resolve(e,t),r=Vc.resolve(e);if(n!==r&&!n.startsWith(`${r}${Vc.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function vI(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function Ie(e,t,n,r=null,s=null){return{path:r,status:n,title:e,lines:[t],byteLength:s}}var CI=["tasks","center","inspector","actions"],dh=["agent","terminal"],ph=[],B="inspection",YW=[...dh,...ph],Gc=["commit","push","refresh-checks","close-task"],fh=["refresh-checks","close-task"],mh=["task","checks","pr","setup-run","actions","next-action"],Hc=["files","review"];function hh(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=NI(e?.openInspectionKind)??n,s=b.runners.getEnabled(t);return{inputMode:xI(e?.inputMode),focusedRegion:$I(e?.focusedRegion),selectedRepoId:xt(e?.selectedRepoId),selectedWorkspaceId:xt(e?.selectedWorkspaceId),selectedTaskId:xt(e?.selectedTaskId),selectedPtyTabId:xt(e?.selectedPtyTabId),selectedLeftItemId:WI(xt(e?.selectedTaskId)),activeTab:n?B:xt(e?.activeTab)??"agent",preferredPtyTabKind:_I(e?.preferredPtyTabKind),inspectorSection:ks(e?.inspectorSection,mh,"task"),inspectionMode:DI(e?.inspectionMode,n==="diff"?"review":"files"),openInspectionKind:r,selectedFileTreePath:xt(e?.selectedFileTreePath),selectedFilePath:xt(e?.selectedFilePath),selectedDiffPath:xt(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:ks(e?.selectedActionId,Gc,"commit"),selectedProjectTargetId:null,selectedRunner:LI(e?.selectedRunner,s,b.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:AI(),centerZoomed:!1}}function AI(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function gh(e,t){return{...e??xs(),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 bs(e,t,n={}){let r=qI(e,t),s=zc(r),i=s?.kind==="task"?t.tasks.find(p=>p.id===s.id)??null:null,o=i?UI(t.tasks,i):null,a=(s?.kind==="workspace"?t.workspaces?.find(p=>p.id===s.id)??null:null)??(o?t.workspaces?.find(p=>p.id===o.workspaceId)??null:null)??t.workspaces?.find(p=>p.id===e.selectedWorkspaceId)??t.workspaces?.[0]??null,c=((s?.kind==="repo"?t.repos.find(p=>p.id===s.id)??null:o?t.repos.find(p=>p.id===o.repoId)??null:null)??(a?.kind==="project"?t.repos.find(p=>p.id===e.selectedRepoId&&a.discoveredRepoIds?.includes(p.id))??null:null)??(a?.kind!=="project"?t.repos.find(p=>p.id===a?.primaryRepoId)??null:null)??t.repos.find(p=>p.id===e.selectedRepoId)??t.repos[0]??null)?.id??null,d=a?wo(t.tasks,a.id):c?ko(t.tasks,c):[],u=(s?.kind==="task"?d.find(p=>p.id===s.id)??null:null)??d.find(p=>p.id===e.selectedTaskId)??d[0]??null;return{...e,inputMode:n.resetInputMode?"control":e.inputMode,selectedLeftItemId:r,selectedWorkspaceId:a?.id??null,selectedRepoId:c,selectedTaskId:u?.id??null,...FI(u,e.activeTab,e.selectedPtyTabId),selectedFilePath:OI(e,t,u?.id??null),...MI(e,t,u?.id??null),selectedDiffPath:EI(e,t,u?.id??null),inspectorSection:ks(e.inspectorSection,mh,"task")}}function Lt(e,t){return{...e,terminal:t}}function yh(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function wh(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function at(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
257
|
+
`}function kh(e){return e.length===1&&e>=" "&&e!=="\x7F"}function Yc(e){return bh(e)||wr(e)!==null}function Th(e){return ph.includes(e)}function bh(e){return dh.includes(e)}function Rh(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[B]:[]]}function EI(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function OI(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function ks(e,t,n){return t.includes(e??"")?e:n}function $I(e){return e==="tabs"?"center":ks(e,CI,"tasks")}function DI(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":ks(e,Hc,t)}function NI(e){return e==="file"||e==="diff"?e:null}function _I(e){return e==="terminal"?"terminal":"agent"}function xI(e){return e==="terminal"?"terminal":"control"}function LI(e,t=[...z],n="codex"){return e&&b.runners.isRunnerType(e)&&t.includes(e)?e:n}function yo(e,t=z){let n=t.length>0?t:z,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function wr(e){let t=z.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function FI(e,t,n){if(!e)return{activeTab:t===B?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(bh(t)){let l=e.ptyTabs.find(c=>c.kind===t)??null??s??r??e.ptyTabs[0]??null;return{activeTab:l?.id??B,selectedPtyTabId:l?.id??null}}if(t===B)return{activeTab:B,selectedPtyTabId:r?.id??s?.id??e.ptyTabs[0]?.id??null};let o=s??r??e.ptyTabs[0]??null;return{activeTab:o?.id??B,selectedPtyTabId:o?.id??null}}function MI(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 qI(e,t){let n=_n(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 _n(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of Ts(wo(e.tasks,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 Ts(ko(e.tasks,n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function wo(e,t){return Sh(e,n=>n.workspaceId===t)}function ko(e,t){return Sh(e,n=>n.repoId===t)}function UI(e,t){return t.rootTaskId===t.id?t:e.find(n=>n.id===t.rootTaskId)??t}function Sh(e,t){let n=new Map(e.map(r=>[r.id,r]));return e.filter(r=>t(n.get(r.rootTaskId)??r))}function Ts(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 zc(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 xt(e){return typeof e=="string"?e:null}function WI(e){return e?`task:${e}`:null}function Rs(e){return typeof e=="string"&&e.startsWith("task:")}function To(e){return typeof e=="string"&&e.startsWith("new-task:")}function bo(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function Ph(e){return typeof e=="string"&&e.startsWith("workspace:")}function Jc(e){return To(e)?e.slice(9):null}function Xc(e){return bo(e)?e.slice(19):null}async function kr(e,t,n){let r=ve(e),[s,i]=await Promise.all([we.repos.listRegisteredRepos(r),we.listWorkspaces(r,{archived:!1})]),o=await S.listTasks(r),a={},l=await b.load(r),c=0;if(b.previews.isEnabled(l,"agentOrchestration")){let m=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(k=>k.kind==="agent").map(async k=>({agentTab:k,environment:await Xe(r,y,void 0,k.id)}))));for(let{agentTab:y,environment:k}of m)k.CRAIG_AGENT_CAPABILITY&&(a[y.id]=k.CRAIG_AGENT_CAPABILITY);o=await S.listTasks(r);let[h,f]=await Promise.all([Kp(r),ai(r)]);c=h.length+f.filter(y=>y.state==="waiting_for_review").length}let d=Qc(o.tasks,t),u=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},p=d?await nh(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 Qc(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function Ih(e,t){return bs(e,t)}import lu from"node:path";import iB from"picocolors";var BI=[" \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 Zc(){return[...BI]}var Ro={width:120,height:36},Q={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function Fe(e,t){return{width:Math.max(e??Ro.width,Ro.width),height:Math.max(t??Ro.height,Ro.height)}}var VI=["Start","Options","Exit"],KI=["Resume","Options","Exit"],Po=2,Io=2,vo=2,GI=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),HI=new RegExp("\x1B\\[(?:0)?m","g"),YI=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),zI=/https?:\/\/[^\s<>"']+/g,tu="\x1B[0m",nu="\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"}},eu=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function Ah(e,t={}){return su(e,{subtitle:"crAIg is that you?",menuItems:VI,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function Eh(e,t={}){return su(e,{subtitle:"Control mode is paused.",menuItems:KI,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}var So=[" 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."],JI=["Help"],XI=5;function Eo(e,t={}){return su(e,{subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??JI,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function Oh(e,t={}){let n=t.color??!0,r=N.overlay,s=new Array(e.height).fill(re(" ".repeat(e.width),n,r)),i=Zc(),o=Math.max(1,Math.floor((e.height-i.length-2-So.length)/2));for(let d=0;d<i.length&&!(o+d>=e.height);d+=1)s[o+d]=re(jh(i[d]??"",e.width),n,N.overlayLogo);let a=Math.max(...So.map(d=>d.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let d=0;d<So.length;d+=1){let u=c+d;if(u>=e.height)break;let p=So[d]??"";s[u]=re(Tt(" ".repeat(l)+p,e.width),n,r)}return s.join(`
|
|
258
|
+
`)}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="Logs",o=t.logPath??"",a=t.logLines??[],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"},lt(),...a.length>0?a.map(m=>({text:m,tone:QI(m)})):[{text:"No Craig activity has been logged.",tone:"muted"}],lt(),{text:"Esc returns to Options.",tone:"muted"}],u=Ss(d,e.height-2),p=Math.max(1,Math.floor((e.height-u.length)/2));for(let m=0;m<u.length;m+=1){let h=p+m;if(h>=e.height)break;let f=u[m]??lt(),y=`${" ".repeat(c)}${Oo(f.text,l)}`,k=f.tone==="selected"?N.overlayMenuSelected:f.tone==="info"?{...N.overlay,fg:N.accent.fg}:f.tone==="warning"?{...N.overlay,fg:N.pending.fg}:f.tone==="error"?{...N.overlay,fg:N.error.fg}:f.tone==="muted"?N.overlay:N.panelBg;s[h]=re(Tt(y,e.width),n,k)}return s.join(`
|
|
259
|
+
`)}function QI(e){return e.includes(" ERROR ")?"error":e.includes(" WARN ")?"warning":e.includes(" INFO ")?"info":"muted"}function Dh(e,t,n={}){let r=n.color??!0,s=Q.leftWidth,i=Q.rightWidth,o=n.centerOnly??!1,a=e.height-Q.topRailHeight-1,l=n.focusFlashActive??!1,c={bg: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}`,m=re(Tt(p,e.width),r,N.rail),h=ev(t,s-Po-Io,a,r),f=ru(e,t,{color:r,centerOnly:o}),y=rv(t,i,a,r),k=t.inputMode==="terminal",R=[],T=[];for(let ge=0;ge<a;ge+=1)if(!o){let H=Co(h[ge]??lt(),s,r,"left"),pn=re("\u2502",r,d),Os=re("\u2502",r,u),$s=Co(y[ge]??lt(),i,r,"right");R.push(`${H}${pn}`),T.push(`${Os}${$s}`)}let O=k||t.modalInput?N.panelBg:N.panelMuted,$=ZI(t.footerText,t.footerToast,e.width,r,O),D={row:1,column:1,width:e.width,rows:[m]},x=o?null:{row:Q.topRailHeight+1,column:1,width:s+Q.dividerWidth,rows:R},v=o?null:{row:Q.topRailHeight+1,column:f.column+f.width,width:Q.dividerWidth+i,rows:T},w={row:e.height,column:1,width:e.width,rows:[$]},Re=o?f.rows:f.rows.map((ge,H)=>`${R[H]??""}${ge}${T[H]??""}`);return{frame:[m,...Re,$].join(`
|
|
260
|
+
`),center:f,regions:{rail:D,left:x,center:f,right:v,footer:w}}}function ru(e,t,n={}){let r=n.color??!0,s=_h(e,n.centerOnly??!1),i=tv(t,s.width,s.rowCount,r);return{row:s.row,column:s.column,width:s.width,rows:i.map(o=>Co(o,s.width,r,"center"))}}function Nh(e,t,n,r={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!Yc(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=_h(e,r.centerOnly??!1),a=xh(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:Co(Lh(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function _h(e,t){return{row:Q.topRailHeight+1,column:t?1:Q.leftWidth+Q.dividerWidth+1,width:t?e.width:e.width-Q.leftWidth-Q.rightWidth-Q.dividerWidth*2,rowCount:e.height-Q.topRailHeight-1}}function ZI(e,t,n,r,s){let i=` ${e}`;if(!t)return re(Tt(i,n),r,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=Oe(o),l=Oe(i),c=Math.max(1,n-l-a-2),d=l+c+a+2>n?Oo(i,Math.max(0,n-a-3)):i,u=Math.max(1,n-Oe(d)-a-2),p=t.tone==="error"?Rv(o,r,s):Tr(o,r,s),m=`${d}${" ".repeat(u)}${p} `;return re(Tt(m,n),r,s)}function su(e,t){let n=new Array(e.height).fill(re(" ".repeat(e.width),t.color,N.overlay)),r=Zc(),s=t.menuItems.map((c,d)=>`${d===t.menuIndex?">":" "} ${c}`),i=t.optionsMessage?["",t.optionsMessage]:[],o=[...s,...i];for(;o.length<XI;)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=jh(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),m=u>=0&&u<t.menuItems.length&&u===t.menuIndex?N.overlayMenuSelected:N.overlay;n[l+c]=re(d,t.color,m)}if(t.versionText){let c=t.updateText?" (update available)":"",d=`${t.versionText}${c} `,u=" ".repeat(Math.max(0,e.width-Oe(d)));n[e.height-1]=re(`${u}${au(d,t.color,N.overlay)}`,t.color,N.overlay)}return n.join(`
|
|
261
|
+
`)}function ev(e,t,n,r){let s=ov(e.runners),i=1,o=e.leftTree.map(l=>iv(l,t,r));return[...Ss(o,n-i),s]}function tv(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!Yc(s)?e.centerTranscript.map(o=>({...o})):nv(e);return Ss([...xh(e,t,r),...i],n)}function xh(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:kv(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?Tr(a,n,N.panelBg):Ao(a,n,N.panelMuted)}`,c=[`${Ao(e.centerHeader.tabLabel,n,N.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),d=av(e.tabs,n,e.focusedRegion==="center"),u=" engaged ",p=u.length+2,m=e.inputMode==="terminal"?Tr(`${u}\u25CF `,n,N.panelBg):"",h=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Oe(d)-p)):"";return[{text:e.inputMode==="terminal"?`${d}${h}${m}`:d},{text:l,tone:"muted"},{text:c},lt()]}function nv(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},lt(),{text:e.terminal.error},lt(),{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:ou(e.segments),segments:e.segments,fullBleed:!0}}function rv(e,t,n,r){let s=e.rightInspection?sv(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):Ss([{text:"CONTEXT"},lt(),...e.rightContext.map(i=>lv(i,r)),...e.actionMessage?[lt(),{text:e.actionMessage}]:[]],n);return Ss(s,n)}function sv(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:bv(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>vh(a)),...r.slice(o,o+s).map(a=>vh(a))]}function vh(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 iv(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${Tr("\u25CF",n,e.selected?N.panelSelected:N.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((h,f)=>h+Oe(f.text),0):0,l=t-Oe(i)-Oe(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",d=e.selected?e.text:e.focused?Tr(e.text,n,N.panelBg):e.panelHeader?Ao(e.text,n,N.panelMuted):e.text,u=Tt(`${r}${c}${d}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let h=`${r}${e.selected?"\u25B8":" "} `,f=u.slice(h.length+2),y=[{text:h},Fh(e.activity,e.activityAnimationFrame??0),{text:` ${f}${i}${o}`},...e.prBadge??[]];return{text:ou(y),segments:y,tone:p}}if(e.prBadge){let h=[{text:`${u}${i}${o}`},...e.prBadge];return{text:`${u}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:h,tone:p}}return{text:`${u}${i}${o}`,tone:p}}function ov(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 av(e,t,n){return e.map(r=>{let s=r.active?n?Tr(r.label,t,N.panelBg):Ao(r.label,t,N.panelBg):au(r.label,t,N.panelBg),i=r.activity?iu(Fh(r.activity,r.activityAnimationFrame??0),t,N.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function Fh(e,t){return{text:"\u25CF",style:{fg:e==="working"?eu[t%eu.length]??eu[0]:e==="ready"?N.success.fg:e==="error"?N.error.fg:N.panelMuted.fg}}}function lv(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?au(e.value,t,N.panelBg):e.value}`}}function Co(e,t,n,r){let s=cv(r,e.tone??"default"),i=uv(e,n,s);if(r==="left"){if(e.fullBleed)return re(Tt(i,t),n,s);let a=t-Po-Io;if(e.rightAlign){let c=Oe(i),d=Math.max(0,a-c),u=`${" ".repeat(Po)}${" ".repeat(d)}${i}${" ".repeat(Io)}`;return re(u,n,s)}let l=`${" ".repeat(Po)}${Tt(i,a)}${" ".repeat(Io)}`;return re(l,n,s)}return r==="center"&&e.fullBleed?dv(e,t,n,s):re(Tt(` ${i}`,t),n,s)}function cv(e,t){return t==="selected"||t==="focused"?N.panelSelected:t==="muted"?N.panelMuted:N.panelBg}function Ss(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(lt());return n}function lt(){return{text:""}}function uv(e,t,n){return e.segments?e.segments.map(r=>iu(r,t,n)).join(""):e.text}function dv(e,t,n,r){let s=" ".repeat(vo),i=Math.max(0,t-vo*2);if(!e.segments)return re(`${s}${Tt(e.text,i)}${s}`,n,r);let o=mv(e.segments,i),a=`${s}${o.map(l=>iu(l,n,r)).join("")}${s}${n?nu:""}`;return re(a,n,r)}function iu(e,t,n){let r=e.href?`${Mh(e.href)}${e.text}${nu}`:pv(e.text);return!t||!e.style?r:`${Ps(yv(e.style,n))}${wv(e.style)}${r}${tu}${Ps(n)}`}function pv(e){return e.replace(zI,t=>{let[n,r]=fv(t);return`${Mh(n)}${n}${nu}${r}`})}function fv(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function Mh(e){return`\x1B]8;;${e}\x1B\\`}function mv(e,t){let n=hv(e,t);return gv(n,t)}function hv(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=Oe(s.text);if(i<=r){n.push(s),r-=i;continue}let o=Oo(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function gv(e,t){let n=Oe(ou(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 yv(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 wv(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 kv(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 jh(e,t){let n=Math.max(0,t-Oe(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function Tt(e,t){let n=Oe(e);return n>=t?Tv(e,t):e+" ".repeat(t-n)}function Tv(e,t){if(t<=0)return"";if(Oe(e)<=t)return e;let n=Uh(e);return Oo(n,Math.max(0,t-1))+"\u2026"}function Oe(e){let t=0;for(let n of Array.from(Uh(e)))t+=qh(n);return t}function Oo(e,t){let n="",r=0;for(let s of Array.from(e)){let i=qh(s);if(r+i>t)break;n+=s,r+=i}return n}function qh(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 bv(e,t,n){return Math.min(Math.max(e,t),n)}function Uh(e){return e.replace(YI,"").replace(GI,"")}function ou(e){return e.map(t=>t.text).join("")}function re(e,t,n){if(!t)return e;let r=Ps(n),s=e.replace(HI,`${tu}${r}`);return`${r}${s}${tu}`}function Ps(e){let t=[];return e.fg&&t.push(`38;2;${Ch(e.fg).join(";")}`),e.bg&&t.push(`48;2;${Ch(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function Ch(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function Tr(e,t,n){return $o(e,t,N.success.fg,n)}function Rv(e,t,n){return $o(e,t,N.error.fg,n)}function Ao(e,t,n){return $o(e,t,N.accent.fg,n)}function au(e,t,n){return $o(e,t,N.mutedfg.fg,n)}function $o(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${Ps(s)}${e}${Ps(r)}`}function Wh(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"?Pv(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:Sv(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function Sv(e,t){let n=(e??"").split(lu.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(lu.delimiter):[...n,t].join(lu.delimiter)}function Pv(e){return e.command.length>0?e.command:["codex"]}function Bh(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 ln(e){return{columns:Math.max(20,e.width-Q.leftWidth-Q.rightWidth-Q.dividerWidth-vo*2),rows:Math.max(5,e.height-Q.topRailHeight-5)}}function Vh(e){return e.length===1||at(e)||e==="BACKSPACE"||e==="TAB"}function cn(e){return typeof e=="string"&&new RegExp(`:(?:agent|${z.join("|")})(?:-\\d+)?$`).test(e)}function Kh(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 cu(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function Gh(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 Is(e){return Yh.includes(e)?"SHIFT_ENTER":null}function uu(e){return Yh.some(t=>t.startsWith(e))}function Hh(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var Yh=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function zh(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
|
|
262
262
|
`||n===`\r
|
|
263
|
-
`)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function
|
|
263
|
+
`)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function Jh(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function Xh(e,t=null){let n=t?.split(`
|
|
264
264
|
`)??[];return e.split(`
|
|
265
|
-
`).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function $o(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{createServer as gC,createConnection as lg}from"node:net";import{mkdir as yC,readFile as cg,rm as Cs,writeFile as wC}from"node:fs/promises";import kC from"node:path";import{setTimeout as xv}from"node:timers/promises";var dn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=du(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:du(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=du(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 du(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as Xh,readFile as Pv,rm as pu,stat as Iv,writeFile as vv}from"node:fs/promises";import fu from"node:path";async function mu(e){let t=fu.join(e.runtimeDir,"orchestration-supervisor.lock");await Xh(e.runtimeDir,{recursive:!0});try{await Xh(t)}catch(r){if(!Av(r))throw r;let s=await Pv(fu.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await Iv(t).catch(()=>null);if(typeof s?.pid=="number"&&!Cv(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await pu(t,{recursive:!0,force:!0}),mu(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await vv(fu.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await pu(t,{recursive:!0,force:!0}),r}let n=!1;return{async release(){n||(n=!0,await pu(t,{recursive:!0,force:!0}))}}}function Cv(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 Av=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var Ev="\x1B[200~",Ov="\x1B[201~";function Qh(e,t){switch(e){case"codex":return hu(t,50);case"cursor":return hu(t,50);case"claude":return hu(t,50);default:return $v(e)}}function hu(e,t){return{paste:`${Ev}${e}${Ov}`,submit:"\r",submitDelayMs:t}}function $v(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import Dv from"node:path";var Nv={type:"system",component:"orchestration-supervisor"};async function Zh(e){let t=Dv.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Ns(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 _v(i))o.has(a)||(await bn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:Nv),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await j(t,n)}function _v(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 Do=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 mu(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 uo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await Zh(this.paths);let t=await Ke(this.paths);for(let n of t){if(n.state==="delivering"){await de.fail(this.paths,n.id,vs("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 uo(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,vs("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let n=await P.getTask(this.paths,t.taskId).catch(i=>{if(i instanceof 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,vs("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,vs("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(this.runtime.hasRunningSession(t.agentTabId)&&!(t.delivery==="when-ready"&&Kt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")){await de.beginDelivery(this.paths,t.id);try{let i=Qh(r.runner??n.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,i.paste),await xv(i.submitDelayMs),this.runtime.writeToSession(t.agentTabId,i.submit)}catch(i){await de.fail(this.paths,t.id,vs("PROMPT_DELIVERY_UNCERTAIN",i instanceof Error?i.message:"Prompt delivery failed after it began.",!1,!0));return}await de.completeDelivery(this.paths,t.id)}}},vs=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var Lv={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},br=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...Lv,...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 We,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=Fv(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(Mv);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 Fv(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 Mv(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as jv}from"node:fs";var No=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;watchers=[];debounceTimer=null;reconciliation=null;dirty=!1;running=!1;baselineComplete=!1;start(){this.running||(this.running=!0,this.baselineComplete=!1,this.watchPath(this.paths.tasksDir,()=>this.schedule(this.taskDebounceMs)),this.watchPath(this.paths.craigDir,(t,n)=>{let r=n===null?"":String(n);(r==="index.json"||r.startsWith(".index.json."))&&this.schedule(this.taskDebounceMs)}),this.schedule(0))}notifyActivity(t){if(!this.running)return;let n=Ct(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;for(let t of this.watchers.splice(0))t.close();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))}watchPath(t,n){try{let r=jv(t,{persistent:!1},n);r.on("error",s=>{this.reportError(s)}),this.watchers.push(r)}catch(r){this.reportError(r)}}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 qv={selectedTaskId:null,reviewVisible:!1},Wv={listTasks:async e=>(await P.listTasks(e)).tasks,syncTasks:async(e,t)=>(await P.prs.discoverOrRefreshMany(e,t),Promise.all(t.map(n=>P.getTask(e,n.id))))},_o=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??Wv,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new br({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new No(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=Bv(s);i.length>0&&await this.onTasksChanged(i);let o=Uv(s);o.length>0&&await this.wake(o)},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=qv;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,eg(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)!==eg(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 Uv(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=Gv(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&Kv.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]}function Bv(e){let t=new Set;for(let n of e)n.taskId&&Vv(n)&&t.add(n.taskId);return[...t]}function Vv(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var Kv=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),Gv=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function eg(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as nC}from"node:module";import Hv from"@xterm/headless";var Yv=1e3,zv=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function ng(e){return new Hv.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:Yv,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}})}function rg(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function yu(e,t){return new Promise(n=>{e.write(t,n)})}function sg(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:Qv(u,o+a===i&&d===n.cursorX)})}r.push({segments:Jv(Xv(c))})}return r}function Jv(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&tC(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};ig(n.style)||(s.style=n.style),t.push(s)}return t}function Xv(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||!ig(n.style))break;t-=1}return e.slice(0,t)}function Qv(e,t){let n={},r=tg(e,"fg"),s=tg(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 tg(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"):zv[s]??Zv(s)}function Zv(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(eC).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 eC(e){return e===0?0:55+e*40}function tC(e,t){return gu(e)===gu(t)}function gu(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function ig(e){return gu(e)===""}var rC=nC(import.meta.url),sC=/^CTRL_([A-Z])$/,iC="\x1B[6n",oC="\x1B[c",aC="\x1B[?u",lC={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
|
|
266
|
-
`,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:""},
|
|
267
|
-
`))&&this.touchActivity(n))}writeKey(t){let n=
|
|
268
|
-
[process exited ${m.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
|
|
265
|
+
`).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function Do(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{createServer as wC,createConnection as cg}from"node:net";import{mkdir as kC,readFile as ug,rm as Cs,writeFile as TC}from"node:fs/promises";import bC from"node:path";import{setTimeout as Lv}from"node:timers/promises";var un=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=du(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:du(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=du(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 du(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as Qh,readFile as Iv,rm as pu,stat as vv,writeFile as Cv}from"node:fs/promises";import fu from"node:path";async function mu(e){let t=fu.join(e.runtimeDir,"orchestration-supervisor.lock");await Qh(e.runtimeDir,{recursive:!0});try{await Qh(t)}catch(r){if(!Ev(r))throw r;let s=await Iv(fu.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await vv(t).catch(()=>null);if(typeof s?.pid=="number"&&!Av(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await pu(t,{recursive:!0,force:!0}),mu(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await Cv(fu.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await pu(t,{recursive:!0,force:!0}),r}let n=!1;return{async release(){n||(n=!0,await pu(t,{recursive:!0,force:!0}))}}}function Av(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 Ev=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var Ov="\x1B[200~",$v="\x1B[201~";function Zh(e,t){switch(e){case"codex":return hu(t,50);case"cursor":return hu(t,50);case"claude":return hu(t,50);default:return Dv(e)}}function hu(e,t){return{paste:`${Ov}${e}${$v}`,submit:"\r",submitDelayMs:t}}function Dv(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import Nv from"node:path";var _v={type:"system",component:"orchestration-supervisor"};async function eg(e){let t=Nv.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Ns(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 xv(i))o.has(a)||(await bn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:_v),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await q(t,n)}function xv(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 No=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new un({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 mu(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 po(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await eg(this.paths);let t=await Ke(this.paths);for(let n of t){if(await this.reconcileInitialPromptTask(n),n.state==="delivering"){await this.failCommand(n,vs("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 po(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await this.failCommand(t,vs("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let n=await S.getTask(this.paths,t.taskId).catch(o=>{if(o instanceof g&&o.code==="TASK_NOT_FOUND")return null;throw o}),r=n?.ptyTabs.find(o=>o.id===t.agentTabId);if(!n||!r||r.kind!=="agent"||n.status==="closed"){await this.failCommand(t,vs("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer available in task ${t.taskId}.`,!1,!1));return}let s=this.runtime.getActivitySnapshots().find(o=>o.tabId===t.agentTabId);if(s&&s.sessionState!=="running"){await this.failCommand(t,vs("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(!this.runtime.hasRunningSession(t.agentTabId)||t.delivery==="when-ready"&&Vt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")return;await ae.beginDelivery(this.paths,t.id);try{let o=Zh(r.runner??n.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,o.paste),await Lv(o.submitDelayMs),this.runtime.writeToSession(t.agentTabId,o.submit)}catch(o){await this.failCommand(t,vs("PROMPT_DELIVERY_UNCERTAIN",o instanceof Error?o.message:"Prompt delivery failed after it began.",!1,!0));return}let i=await ae.completeDelivery(this.paths,t.id);await this.reconcileInitialPromptTask(i)}async failCommand(t,n){let r=await ae.fail(this.paths,t.id,n);await this.reconcileInitialPromptTask(r)}async reconcileInitialPromptTask(t){if(!Fv(t)||t.state==="queued"||t.state==="delivering")return;let n=await S.getTask(this.paths,t.taskId).catch(r=>{if(r instanceof g&&r.code==="TASK_NOT_FOUND")return null;throw r});if(!(!n||n.status==="closed")){if(t.state==="delivered"){(n.status==="draft"||n.runnerSession.lastKnownState==="starting")&&await S.markTaskStarted(this.paths,n.id);return}n.runnerSession.lastKnownState!=="failed"&&await S.recordStartupFailure(this.paths,n.id,t.lastError?.message??`Initial prompt ${t.state}.`)}}},Fv=e=>e.idempotencyKey===`task-start:${e.taskId}`,vs=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var Mv={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},br=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...Mv,...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=jv(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(qv);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 jv(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 qv(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as Uv}from"node:fs";var _o=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;watchers=[];debounceTimer=null;reconciliation=null;dirty=!1;running=!1;baselineComplete=!1;start(){this.running||(this.running=!0,this.baselineComplete=!1,this.watchPath(this.paths.tasksDir,()=>this.schedule(this.taskDebounceMs)),this.watchPath(this.paths.craigDir,(t,n)=>{let r=n===null?"":String(n);(r==="index.json"||r.startsWith(".index.json."))&&this.schedule(this.taskDebounceMs)}),this.schedule(0))}notifyActivity(t){if(!this.running)return;let n=Ct(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;for(let t of this.watchers.splice(0))t.close();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))}watchPath(t,n){try{let r=Uv(t,{persistent:!1},n);r.on("error",s=>{this.reportError(s)}),this.watchers.push(r)}catch(r){this.reportError(r)}}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 Wv={selectedTaskId:null,reviewVisible:!1},Bv={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))))},xo=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??Bv,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new br({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new _o(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=Kv(s);i.length>0&&await this.onTasksChanged(i);let o=Vv(s);o.length>0&&await this.wake(o)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new un({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=Wv;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,tg(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)!==tg(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 Vv(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=Yv(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&Hv.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]}function Kv(e){let t=new Set;for(let n of e)n.taskId&&Gv(n)&&t.add(n.taskId);return[...t]}function Gv(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var Hv=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),Yv=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function tg(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as sC}from"node:module";import zv from"@xterm/headless";var Jv=1e3,Xv=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function rg(e){return new zv.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:Jv,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}})}function sg(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function yu(e,t){return new Promise(n=>{e.write(t,n)})}function ig(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:eC(u,o+a===i&&d===n.cursorX)})}r.push({segments:Qv(Zv(c))})}return r}function Qv(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&rC(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};og(n.style)||(s.style=n.style),t.push(s)}return t}function Zv(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||!og(n.style))break;t-=1}return e.slice(0,t)}function eC(e,t){let n={},r=ng(e,"fg"),s=ng(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 ng(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"):Xv[s]??tC(s)}function tC(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(nC).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 nC(e){return e===0?0:55+e*40}function rC(e,t){return gu(e)===gu(t)}function gu(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function og(e){return gu(e)===""}var iC=sC(import.meta.url),oC=/^CTRL_([A-Z])$/,aC="\x1B[6n",lC="\x1B[c",cC="\x1B[?u",uC={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
|
|
266
|
+
`,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:""},Lo=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")wu(i),this.sessions.delete(n);else return this.attachedTabId=n,i.scrollbackLines=0,ag(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(`
|
|
267
|
+
`))&&this.touchActivity(n))}writeKey(t){let n=dC(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&&ag(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&&(wu(n),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())wu(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:pC(n),error:n.error,scrolledBack:n.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}createSession(t,n,r,s){let i=this.spawn??mC().spawn,o=rg(r),a=s??this.resolveSessionSpec(t,n),l=ro({...this.env,...a.env??{}}),{executable:c,args:d}=hC(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:gC(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(m=>{this.touchActivity(p),yC(u,m),yu(p.terminal,m).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p.disposables.push(u.onExit(m=>{p.status="exited",p.exitCode=m.exitCode,p.lastActivityAt=Date.now(),this.notifyActivity(p),yu(p.terminal,`\r
|
|
268
|
+
[process exited ${m.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 dC(e){if(e.length===1)return e;let t=uC[e];if(t!==void 0)return t;let n=oC.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function ag(e,t){fC(e.pty,t),sg(e.terminal,t),e.screenDirty=!0}function pC(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=ig(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function wu(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function fC(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function mC(){return iC("node-pty")}function hC(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[so(t[0],n),...t.slice(1)].map(lg).join(" ")}; exec ${lg(e)} -l`;return{executable:e,args:["-lc",s]}}function lg(e){return`'${e.replaceAll("'","'\\''")}'`}function gC(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 yC(e,t){for(let n=0;n<ku(t,aC);n+=1)e.write("\x1B[1;1R");for(let n=0;n<ku(t,lC);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<ku(t,cC);n+=1)e.write("\x1B[?0u")}function ku(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 Fo=Vr,RC=16,SC=250;async function dg(e){let t=Je(e.paths);await CC(t,e.paths,e.spawnDaemon);let n=await kg(t.socketPath),r=new Tu(n,e);return await r.ready(),r}async function pg(e,t={}){let n=Je(e);await kC(e.runtimeDir,{recursive:!0}),await Cs(n.socketPath,{force:!0});let r=new bu(e,t),s=wC(i=>r.handleConnection(i));try{await r.start(),await $C(s,n.socketPath),await TC(n.pidPath,String(process.pid),"utf8"),await ue.appendLogBestEffort(e,{level:"info",component:"daemon",event:"started",message:`PTY daemon started with protocol ${Fo}.`,details:{pid:process.pid,protocolVersion:Fo}}),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)})}catch(i){throw await ue.appendLogBestEffort(e,{level:"error",component:"daemon",event:"failed",message:i instanceof Error?i.message:String(i),details:{pid:process.pid}}),i}finally{await ue.appendLogBestEffort(e,{level:"info",component:"daemon",event:"stopped",message:"PTY daemon stopped and disposed its remaining sessions.",details:{pid:process.pid,remainingSessionCount:r.sessionCount()}}),r.onShutdown=null,await Cs(n.socketPath,{force:!0}),await Cs(n.pidPath,{force:!0}),await r.stop(),r.disposeAll()}}async function fg(e){let t=Je(e);return await gg(t.socketPath)?(await OC(t.socketPath),!0):!1}var Tu=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;protocolVersion=Fo;options;async ready(){let t=await this.send({type:"ping"});if(!hg(t.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch.");this.protocolVersion=t.protocolVersion,this.protocolVersion<=8&&await this.send({type:"setViewUpdateMode",mode:"incremental"}),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),r.view.status==="idle"&&ue.appendLogBestEffort(this.options.paths,{level:"debug",component:"pty",event:"hydration.missing",message:"No live PTY session was found for the persisted tab.",tabId:n}))}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)}
|
|
269
269
|
`);let i=await s;if(!i.ok)throw new Error(i.error);return i}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
|
|
270
270
|
`);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
|
|
271
|
-
`)}}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"){if("view"in n){this.viewCache.set(n.tabId,n.view),this.viewedTabId===n.tabId&&this.notifyFullUpdate(n.tabId);return}let r=this.viewCache.get(n.tabId)??{status:"idle",rows:[],error:null,scrolledBack:!1},s=
|
|
271
|
+
`)}}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"){if("view"in n){this.viewCache.set(n.tabId,n.view),this.viewedTabId===n.tabId&&this.notifyFullUpdate(n.tabId);return}let r=this.viewCache.get(n.tabId)??{status:"idle",rows:[],error:null,scrolledBack:!1},s=vC(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)}}},bu=class{onShutdown=null;clients=new Set;subscriptions=new Map;updateTimers=new Map;activityTimers=new Map;pendingActivities=new Map;runtime;paths;orchestrationSupervisor=null;orchestrationSupervisorStartup=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 Lo({...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 b.load(this.paths);if(this.pullRequestSyncOptions!==!1){let r=this.pullRequestSyncOptions??{},s=r.reconcileEvents===!1?!1:r.reconcileEvents??(()=>tn(this.paths,{agentObserver:{daemonAvailable:!0,getSnapshots:()=>this.runtime.getActivitySnapshots(),subscribe:()=>()=>{},close:()=>{}}}));this.pullRequestEventReconciliationEnabled=!!s,this.pullRequestSyncSupervisor=new xo(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 ue.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");(b.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(`
|
|
272
272
|
`);for(;i!==-1;){let o=n.slice(0,i);n=n.slice(i+1),this.handleLine(t,o),i=n.indexOf(`
|
|
273
|
-
`)}});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()}sessionCount(){return this.runtime.sessionTabIds().length}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{xn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);xn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion:
|
|
274
|
-
${s.slice(-2e3)}`:""}`)}async function
|
|
273
|
+
`)}});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()}sessionCount(){return this.runtime.sessionTabIds().length}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{xn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);xn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion:Fo,sessionCount:this.runtime.sessionTabIds().length}:{},...r.type==="getActivitySnapshots"?{activities:this.runtime.getActivitySnapshots()}:{},...s?{view:s}:{}})}catch(s){let i=s instanceof Error?s.message:String(s);xn(t,{id:r.id,ok:!1,error:i})}}async handleRequest(t,n){switch(n.type){case"ping":return null;case"ensureSession":{let r=this.runtime.hasRunningSession(n.tabId),s=this.runtime.ensureSession(n.taskId,n.tabId,n.size,n.spec);return r||this.log({level:"info",component:"pty",event:"spawned",message:"PTY session spawned.",taskId:n.taskId,tabId:n.tabId}),this.attachedTabId=n.tabId,this.subscribe(t,n.tabId,s)}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.attachedTabId&&this.log({level:"debug",component:"pty",event:"detached",message:"Client detached from PTY session.",tabId:this.attachedTabId}),this.runtime.detach(),this.attachedTabId=null,null;case"disposeSession":return this.log({level:"info",component:"pty",event:"disposed",message:"PTY session disposed because its tab was closed.",tabId:n.tabId,details:{reason:"tab_closed"}}),this.runtime.disposeSession(n.tabId),this.attachedTabId===n.tabId&&(this.attachedTabId=null),null;case"setViewUpdateMode":return this.runtime.getViewState(this.attachedTabId);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.log({level:"info",component:"pty",event:"disposed",message:"PTY session disposed because its tab is no longer active.",tabId:i,details:{reason:"stale_tab"}}),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 this.log({level:"warn",component:"daemon",event:"shutdown.requested",message:"PTY daemon shutdown was explicitly requested.",details:{liveSessionCount:this.runtime.sessionTabIds().length}}),setTimeout(()=>this.onShutdown?.(),0),null;default:return NC(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(Ru),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)xn(n,{type:"tasksChanged",taskIds:t})}handleRuntimeUpdate(t){this.scheduleBroadcastUpdate(t)}handleActivityUpdate(t){if(t.sessionState!=="running"&&this.log({level:t.sessionState==="failed"||t.exitCode!==0?"error":"info",component:"pty",event:"exited",message:t.sessionState==="failed"?"PTY session failed.":"PTY process exited.",taskId:t.taskId,tabId:t.tabId,details:{sessionState:t.sessionState,exitCode:t.exitCode,error:t.error}}),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)},SC))}}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&&xn(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&&xn(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(){this.orchestrationSupervisor||(this.orchestrationSupervisorStartup||(this.orchestrationSupervisorStartup=this.startOrchestrationSupervisor().finally(()=>{this.orchestrationSupervisorStartup=null})),this.orchestrationSupervisor=await this.orchestrationSupervisorStartup,this.updateRuntimeActivityEnabled())}async startOrchestrationSupervisor(){let t=new No(this.paths,this.runtime,{onError:n=>ue.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor",message:n instanceof Error?n.message:String(n)})});try{return await t.start(),await ue.appendLogBestEffort(this.paths,{level:"info",component:"orchestration",event:"supervisor.started",message:"Orchestration supervisor is ready."}),t}catch(n){throw await ue.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor startup",message:n instanceof Error?n.message:String(n)}),n}}updateRuntimeActivityEnabled(){this.runtime.setActivityEnabled(this.orchestrationSupervisor!==null||this.pullRequestEventReconciliationEnabled||this.hasActivitySubscribers())}log(t){ue.appendLogBestEffort(this.paths,t)}scheduleBroadcastUpdate(t){this.updateTimers.has(t)||!this.hasViewSubscriber(t)||this.updateTimers.set(t,setTimeout(()=>{this.updateTimers.delete(t),this.broadcastUpdate(t)},RC))}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=PC(s,n),o=IC(s.view,n);s.view=n,s.rowKeys=n.rows.map(Ru),(i.rows.length>0||o)&&xn(r,{type:"update",tabId:t,patch:i})}}};function PC(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==Ru(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 IC(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 vC(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function Ru(e){return JSON.stringify(e)}async function CC(e,t,n){if(await AC(e.socketPath,1e3))return;if(await gg(e.socketPath)){let i=await yg(e.socketPath).catch(()=>null),o=i?.ok?i.protocolVersion??"unknown":"unknown",a=i?.ok?i.sessionCount??"unknown":"unknown";throw await ue.appendLogBestEffort(t,{level:"warn",component:"daemon",event:"upgrade.blocked",message:`Left incompatible protocol ${o} daemon running to preserve possible live PTYs.`,details:{protocolVersion:o,sessionCount:a}}),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 EC(e,t),io(t,n);let r=Date.now();for(;Date.now()-r<5e3;){if(await mg(e.socketPath))return;await Tg(50)}let s=await ug(bC.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${s?`
|
|
274
|
+
${s.slice(-2e3)}`:""}`)}async function mg(e){let t=await yg(e).catch(()=>null);return t?.ok===!0&&hg(t.protocolVersion)}function hg(e){return Kt(e)}async function AC(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await mg(e))return!0;await Tg(50)}return!1}async function EC(e,t){let n=await ug(e.pidPath,"utf8").catch(()=>null);if(n){let r=Number(n.trim());if(Number.isInteger(r)&&r>0&&DC(r))return;await ue.appendLogBestEffort(t,{level:"warn",component:"daemon",event:"previous_exit.unclean",message:"Found stale daemon state from a process that is no longer running.",details:{previousPid:Number.isInteger(r)?r:null}})}await Cs(e.socketPath,{force:!0}),await Cs(e.pidPath,{force:!0})}async function gg(e){let t=await kg(e).catch(()=>null);return t?(t.end(),!0):!1}async function OC(e){await wg(e,{id:1,type:"shutdown"}).catch(()=>null)}async function yg(e){return wg(e,{id:1,type:"ping"})}function wg(e,t){return new Promise((n,r)=>{let s=cg(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)}
|
|
275
275
|
`)),s.once("error",l=>{a(),r(l)}),s.on("data",l=>{i+=String(l);let c=i.indexOf(`
|
|
276
|
-
`);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
|
|
277
|
-
`)}catch{}}function
|
|
278
|
-
`}function NC(e){return e.length===1&&e>=" "&&e!==""}import As from"node:path";function Ag(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 Eg="\u{F024B} ",Og="\u{F0DCF} ",$g="\u25CB",Iu="\uEA64",Dg="\uEAFE",Ng="\uEBDA",vu="\u25CB",Cu="\u25CF",Au="\u2713",Eu="\u2715";function _g(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 Mo=150,xg=6;var qo="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 jg(e,t,n){let r=LC(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=gA(t.tasks),d=jC(e,a),u=MC(e,a,d,n),p=u.find(y=>y.id===d)??u[0]??{id:"agent",label:"CODEX"},m=t.inspection?.taskId===a?.id?t.inspection:null,h=s?.name??"no repo",f=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`:Rs(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===B?"\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:As.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${As.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:f},leftTree:_C(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>yA(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:h,agent:f},centerTranscript:FC(d,e,s,a,e.workspaceBrowser,m,r),tabs:u,rightContext:hA(s,a),rightInspection:QC(e,a,m)}}function _C(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 xC(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=yo(t.tasks,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 Ts(c)){let p=e.selectedLeftItemId===`task:${d.id}`,m=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,h={id:`task:${d.id}`,taskId:d.id,text:n?m:`${p?"\u25B8":"\u2022"} ${m}`,indent:u===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:Qn(d,n.snapshots,n.now),activityAnimationFrame:n.animationFrame}:{}},f=Wg(d);f&&(h.prBadge=f),r.push(h)}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 xC(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=wo(r,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 Ts(l)){let m=t.selectedLeftItemId===`task:${u.id}`,h=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,f={id:`task:${u.id}`,taskId:u.id,text:s?h:`${m?"\u25B8":"\u2022"} ${h}`,indent:p===0?2:4,selected:m,focused:m&&t.focusedRegion==="tasks",...s?{activity:Qn(u,s.snapshots,s.now),activityAnimationFrame:s.animationFrame}:{}},y=Wg(u);y&&(f.prBadge=y),e.push(f)}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 LC(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 FC(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 m=p===s.selectedIndex?"\u25B8":" ",h=u.kind==="repo"?" [git repo]":"/";return`${m} ${u.name}${h}`}),d=s.query!==null?`Search: ${s.query}\u2588`:"";return ct(["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 ct(["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 ct([`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"?ct([`${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."]):ct([`${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===B&&t.openInspectionKind==="file"?UC(r,i,t.fileScrollOffset):e===B&&t.openInspectionKind==="diff"?BC(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?ct(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):ct(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function MC(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:qC(o),...o.kind==="agent"&&r&&t?{activity:Kt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame}:{}}))??[];if(!t)return[{id:qo,label:"EMPTY",active:n===qo,focused:e.focusedRegion==="center"&&n===qo}];let i=e.openInspectionKind||n===B?[{id:B,label:WC(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function jC(e,t){return t?t.ptyTabs.some(n=>n.id===e.activeTab)||e.activeTab===B&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??B:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??B:qo}function qC(e){return e.title.toUpperCase()}function WC(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?As.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function UC(e,t,n){if(!e)return ct(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return ct(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=qg(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:""},...VC(r.lines,n,s)]}function BC(e,t,n){if(!e)return ct(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return ct(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=qg(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:""},...KC(r.lines,n,s)]}function ct(e){return e.map(t=>({text:t}))}function VC(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}},...Ou(i,n)],tone:"default"}})}function KC(e,t,n){let r=GC(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>HC(i,n))}function GC(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 HC(e,t){let n=Lg(e.oldNumber),r=Lg(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?zC(Ou(e.text,t),i.bg,i.fallbackFg):Ou(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 Lg(e){return e===null?" ":String(e).padStart(4," ")}function qg(e){let t=As.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 Ou(e,t){return t==="diff"?YC(e):t==="markdown"?JC(e):t==="json"?$u(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?$u(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 YC(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 zC(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function JC(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:pe.markup,bold:!0}}]:$u(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function $u(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:XC(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function XC(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 QC(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"?Ug(t.repoTargets??[]):s?.pullRequest??(t?U(t):null),o=[ZC(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=Kg(e,t),l=Du(e,n),c=sA([{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,...pA(e,n)]}:{title:"",rows:[...o,...Du(e,n)]}}function ZC(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=Nu(t),o=_u(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function Fg(e){return[{text:" "},Nu(e),{text:" "},_u(e)]}function Wg(e){if(e.type==="project"&&e.repoTargets?.length){let n=Ug(e.repoTargets);return n?Fg(n):null}let t=U(e);return t?.number?Fg(t):null}function Ug(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=tA(n);return{number:-1,status:eA(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 eA(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 tA(e){let t=e.map(n=>Bg(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 Nu(e){return!e||!e.number?{text:$g,style:{fg:"565f89"}}:e.status==="merged"?{text:Dg,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:Ng,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:Iu,style:{fg:"565f89"}}:{text:Iu,style:{fg:"9ece6a"}}}function _u(e){return e?.aggregateReadiness?Mg(e.aggregateReadiness):Mg(Bg(e))}function Mg(e){return e==="failed"?{text:Eu,style:{fg:"f7768e"}}:e==="pending"?{text:Cu,style:{fg:"e0af68"}}:e==="success"?{text:Au,style:{fg:"9ece6a"}}:{text:vu,style:{fg:"565f89"}}}function Bg(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")?Vg(e)?"failed":nA(e)?"success":"pending":"pending"}function nA(e){return!!(e.mergeable&&!e.draft&&!Vg(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function Vg(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function Kg(e,t){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return rA(e,t);let n=U(t),r=Hg("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 jo=32;function rA(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=jo-u.length-1,m=c.length>p?c.slice(0,p-1)+"\u2026":c,h=jo-m.length-u.length;n.push({id:`project-review:${o.repoId}`,text:m+" ".repeat(Math.max(1,h))+u,selected:a,focused:l,muted:!0})}else{let d=Nu(o.pullRequest),u=_u(o.pullRequest),p=`${d.text} ${u.text}`,m=jo-p.length-1,h=c.length>m?c.slice(0,m-1)+"\u2026":c,f=jo-h.length-p.length,y=h+" ".repeat(Math.max(1,f));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(...Hg("target",i.branch,i.pullRequest))),n}function Gg(e,t,n=null){return 3+Kg(e,t).length+Du(e,n).length}function Hg(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=iA(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:oA(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${Yg(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(aA)):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)=>lA(u,r(`comment:${p}`))))),s}function sA(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 iA(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function oA(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function Yg(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 aA(e){let{icon:t,color:n}=uA(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," ")} ${dA(e.status)}`,color:n,muted:!1}}function lA(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${Yg(e.createdAt)}`:"",s=cA(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 cA(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 uA(e){switch(e){case"success":return{icon:Au,color:"9ece6a"};case"pending":return{icon:Cu,color:"e0af68"};case"failed":return{icon:Eu,color:"f7768e"};case"skipped":return{icon:vu,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function dA(e){return e==="success"?"passing":e==="failed"?"failing":e}function pA(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=xu(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)?Eg:Og:Ag(l.label),p=l.kind==="directory"?"7aa2f7":_g(l.label),m=" ".repeat(l.depth),h=p?{text:u,style:{fg:p}}:{text:u},f=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:d?{text:l.label,style:{fg:d}}:{text:l.label},y=[{text:m},h,f];return{id:l.path,text:`${m}${u}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:y}})]}function xu(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 Du(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(fA(t))return mA(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=>zg(i,e,t))))}return n}function fA(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function mA(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=>zg(c,e,t,s.length+1))))}}return n}function zg(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 hA(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:As.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 gA(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0})}function yA(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function Jg(e,t,n,r,s=null){if(s)return wA(e,t,n,r,s);let i=ru(e,t,{centerOnly:r});return kA(n,i)?{output:$o(i.rows,n.rows,i.row,i.column),region:i}:null}function wA(e,t,n,r,s){let i=Dh(e,t,s,{centerOnly:r});if(!i||!TA(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 kA(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function TA(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function Xg(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!bA(o,a))return null;!o||!a||(s+=$o(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function bA(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 RA=["tasks","center","inspector"];function SA(e,t,n){if(t==="ESCAPE")return A({state:{...e,fileSearchQuery:null},changed:!0});if(t==="BACKSPACE"||t==="DELETE"){let r=e.fileSearchQuery??"";return A({state:{...e,fileSearchQuery:r.slice(0,-1)},changed:!0})}if(t==="UP"||t==="k"||t==="DOWN"||t==="j")return Fu(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return ju({...e,fileSearchQuery:null},t,n);if(t.length===1&&t>=" "){let r=(e.fileSearchQuery??"")+t;return A({state:{...e,fileSearchQuery:r},changed:!0})}return A({state:e})}function ju(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return yh(t)?A({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):A({state:e});if(e.fileSearchQuery!==null)return SA(e,t,n);if(t==="/"&&e.focusedRegion==="inspector"&&e.inspectionMode==="files")return A({state:{...e,fileSearchQuery:""},changed:!0});if(t==="q"||t==="Q")return A({state:e,exit:!0});if(t==="ESCAPE")return A({state:{...e,actionMessage:null},changed:e.actionMessage!==null,pause:!0});if(t==="n"||t==="N")return A({state:{...e,focusedRegion:"tasks",actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0});if((t==="r"||t==="R")&&e.focusedRegion==="tasks"&&(ko(e.selectedLeftItemId)||To(e.selectedLeftItemId)))return A({state:{...e,selectedRunner:go(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return Qg(e,1);if(t==="SHIFT_TAB"||t==="[")return Qg(e,-1);if(t==="z"||t==="Z")return A({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===B?pn(e,-1,n):Fu(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===B?pn(e,1,n):Fu(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??z,s=e.centerTabRunner?r.indexOf(e.centerTabRunner):-1,i=s===r.length-1?null:r[s+1];return A({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=$A(e,t);return A({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 A({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0});if(t==="o"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review"&&e.selectedTaskId)return A({state:e,openPrUrl:!0});if(t==="X"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return A({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Rs(e.selectedLeftItemId)&&e.selectedTaskId)return A({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Sh(e.selectedLeftItemId)&&e.selectedWorkspaceId)return A({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&ty(e.activeTab,n.ptyTabIds??[]))return A({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return Lu(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return Zg(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return Lu(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return Zg(e,1)}if(at(t)){if(e.focusedRegion==="tasks"&&(ko(e.selectedLeftItemId)||To(e.selectedLeftItemId))){let r=Jc(e.selectedLeftItemId),s=Xc(e.selectedLeftItemId);return A({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 A({state:{...e,actionMessage:null},changed:!0,openWorkspaceBrowser:!0});if(e.focusedRegion==="tasks"&&Rs(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return A({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:wr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&ty(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return A({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:wr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===B)return A({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 A({state:vA({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return A({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:B,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?A({state:{...e,selectedDiffPath:r,activeTab:B,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!n.projectTargetIds?.length?A({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):A({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?A({state:e}):e.selectedActionId==="refresh-checks"?A({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?A({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):A({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return A({state:e})}function pn(e,t,n){if(t===0)return A({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?ny(e,t,n):e.inspectionMode==="review"?ey(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):A({state:e});if(e.focusedRegion==="center"&&e.activeTab===B){if(e.openInspectionKind==="file")return ey(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return CA(e,t,n)}return A({state:e})}function Qg(e,t){return Wo(e,"focusedRegion",RA,t)}function Lu(e,t,n){let r=Wo(e,"activeTab",n&&n.length>0?n:DA(e),t);return!r.changed||kh(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:wr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function Fu(e,t,n){if(e.focusedRegion==="tasks")return PA(e,t,n.leftItemIds);if(e.focusedRegion==="center")return Lu(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return ny(e,t,n);if(n.projectTargetIds?.length){let s=Mu(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=Mu(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:B,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:Wo(e,"selectedActionId",ph,t)}return Wo(e,"selectedActionId",Gc,t)}function PA(e,t,n){let r=Mu(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=zc(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=Jc(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=Xc(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function IA(e,t){if(e.inspectionMode===t)return A({state:e});let n=t==="files"?"file":e.openInspectionKind,r=t==="files"?B:e.activeTab;return A({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 Zg(e,t){return IA(e,OA(e.inspectionMode,Hc,t))}function ny(e,t,n){let r=n.fileTreeRowIds&&n.fileTreeRowIds.length>0?n.fileTreeRowIds:n.filePathIds??[];if(r.length===0)return A({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 A({state:e});let l=a!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(a);return A({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?B:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function vA(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 ey(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]?A({state:e}):A({state:{...e,[t]:o,actionMessage:null},changed:!0})}function CA(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return AA(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?A({state:e}):A({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?A({state:e}):A({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}if(t>0&&o>i){let d=a[l+1]??null;return d?A({state:{...e,selectedDiffPath:d,activeTab:B,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===i?A({state:e}):A({state:{...e,diffScrollOffset:i,actionMessage:null},changed:!0})}if(t<0&&o<0){let d=a[l-1]??null;return d?A({state:{...e,selectedDiffPath:d,activeTab:B,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?A({state:e}):A({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let c=Ft(o,0,i);return c===e.diffScrollOffset?A({state:e}):A({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function AA(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=EA(n.diffPathRanges??[],o)??e.selectedDiffPath;return o===e.diffScrollOffset&&a===e.selectedDiffPath?A({state:e}):A({state:{...e,diffScrollOffset:o,selectedDiffPath:a,actionMessage:null},changed:!0})}function EA(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function Wo(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]?A({state:e}):A({state:{...e,[t]:o,actionMessage:null},changed:!0})}function Mu(e,t,n,r,s=!1){if(n.length===0)return A({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]?A({state:e}):A({state:{...e,[t]:a,actionMessage:null},changed:!0,refreshInspection:s})}function OA(e,t,n){let r=t.indexOf(e);return t[Ft(r+n,0,t.length-1)]??e}function A(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 ty(e,t){return t.includes(e)}function $A(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":wr(e.activeTab)??e.preferredPtyTabKind}function DA(e){return[e.selectedPtyTabId,e.openInspectionKind?B:null].filter(t=>typeof t=="string")}function Ft(e,t,n){return Math.min(n,Math.max(t,e))}var ry=async(e,t,n,r)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await r.queueTaskMutation(async()=>V(r.paths,e.selectedTaskId,i=>{let o=t??NA(i,e.activeTab,e.preferredPtyTabKind),a=ay(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"}`}}},sy=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 V(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}`}}},iy=async(e,t)=>{let n=e.selectedTaskId;n&&await t.queueTaskMutation(async()=>{await V(t.paths,n,r=>!r.ptyTabs.some(s=>s.id===e.activeTab)||r.selectedPtyTabId===e.activeTab?r:{...r,selectedPtyTabId:e.activeTab})})},oy=async(e,t)=>{let n=e.ptyTabs.find(s=>s.kind==="agent")??null;if(n)return await t.queueTaskMutation(async()=>{await V(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=ay(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await V(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 NA(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function ay(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(m=>m.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 Rr=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},ly=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 Xe(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=ro();so(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 Rr(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}},cy=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},uy=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 Cr(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}`}}},dy=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Cr(t.paths,n.id)))),Es=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await we.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var py=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 fy=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},my=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},hy=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var _A=250;function Mt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function Ln(e,t){return Lt(t,e.ptyRuntime.getViewState(Sr(e,t)))}function Sr(e,t){let n=Mt(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 Ln(e,Ph(t,e.model))}function gy(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 yy(e,t,n){return gy(e,t,n?{tone:"success",message:n}:null)}function se(e,t,n){return gy(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 we.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function Z(e,t){if(!e.uiStateFile)return;e.runtimeState=hh(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>qt({uiStateFile:e.uiStateFile},n),()=>qt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function xA(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:P,workspaceService:ke,queueTaskMutation:t=>xA(e,t)}}function qu(e,t){let n=Mt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?xu(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:_n(e.model),centerTabIds:bh(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:Gg(t,n,s),pageRows:Math.max(5,Fe(e.activeTerminal.width,e.activeTerminal.height).height-Q.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:n?.repoTargets?.map(a=>a.repoId)??[]}}async function wy(e,t){await iy(t,oe(e))}async function Re(e){e.model=await kr(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 Uo(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 Bo(e,t){let n=++e.inspectionRefreshSequence,r=Qc(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 eh(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await kr(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)},Z(e,e.state.shell),e.render())}function ky(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)&&Bo(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()})},_A))}function Ty(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,qu(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:I(e,r.state)},Z(e,e.state.shell),e.render(),Bo(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)},Z(e,e.state.shell),e.render()}},16)))}function Wu(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function Uu(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 Ry(e){Uu(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.render())})}async function Sy(e,t){let n=I(e,t),r=Mt(e.model.tasks,n),s=Sr(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 Lt(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,cn(Fe(e.activeTerminal.width,e.activeTerminal.height)));return Lt({...n,inputMode:"control"},o)}function Bu(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 Vu(e,t){try{let n=I(e,t),r=Mt(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 by(e,r),await Re(e),s=r.selectedPtyTabId)}r&&!s&&(r=await by(e,r),await Re(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:Lt({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},Z(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,cn(Fe(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=un(s),e.lastTerminalKey=null,e.state={mode:"main",shell:Lt({...i,inputMode:"terminal"},o)},Z(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 LA(e,t.selectedTaskId,r).catch(()=>{}),await Re(e).catch(()=>{})),e.state={mode:"main",shell:se(e,gh(I(e,t),r),r)},Z(e,e.state.shell)}e.render()}async function LA(e,t,n){await cy(t,n,oe(e))}async function Py(e,t,n,r){let s=I(e,t),{nextShell:i}=await ry(s,n,r,oe(e));return await Re(e),I(e,{...s,...i})}async function Iy(e,t){let n=I(e,t),{closedTab:r,nextShell:s}=await sy(n,oe(e));return e.ptyRuntime.disposeSession(r.id),await Re(e),I(e,{...n,...s})}async function vy(e,t){let n=I(e,t),r=_n(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await uy(n,oe(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Re(e),I(e,{...n,...o,selectedLeftItemId:FA(r,_n(e.model),s)})}async function Cy(e,t){let n=I(e,t),{nextShell:r}=await py(n,oe(e));return await Re(e),I(e,{...n,...r})}async function by(e,t){return oy(t,oe(e))}function Vo(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:Ln(e,e.state.shell)},e.render())},16))}function FA(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 Ey(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=Ay(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await dy(s,oe(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)Uo(e,o);t.recordSuccess(i,Ay(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,Es("background PR polling",i,oe(e)))}}function Ay(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function Oy(e,t){let n=I(e,t),r=Mt(e.model.tasks,n),s=null,i=null;if(r?.type==="project"&&r.repoTargets?.length){let o=await P.prs.discoverOrRefreshAll(e.paths,n.selectedTaskId);await Re(e);let a=o.synced+o.discovered+o.notFound;i=`Refreshed ${o.synced}/${a} targets`}else{let{disposition:o,task:a}=await P.prs.discoverOrRefresh(e.paths,n.selectedTaskId);await Re(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${U(a)?.requiredChecks.length??0} reported`)}return I(e,{...yy(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import UA from"node:path";import{readdir as MA,stat as jA}from"node:fs/promises";import $y from"node:path";async function qA(e){let t=await MA(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=$y.join(e,r.name);n.push({name:r.name,path:s,kind:await WA(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 Dy(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function Ny(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 Ko(e,t){let n=await qA(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 WA(e){let t=$y.join(e,".git");return await jA(t).catch(()=>null)!==null}function _y(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function xy(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function BA(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 ly(t.selectedRepoId,t.selectedWorkspaceId,n,t.selectedRunner,oe(e));r=s.task,await Re(e);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??Uh(r,"agent"),cn(Fe(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=un(i.selectedPtyTabId),e.state={mode:"main",shell:Lt(i,o)},Z(e,e.state.shell)}catch(s){s instanceof Rr&&(r=s.task);let i=ie(e,"create task",s,"Failed to create task.");r&&!(s instanceof Rr)?(await V(e.paths,r.id,o=>({...o,status:"draft",runnerSession:{...o.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:i})).catch(()=>{}),await Re(e).catch(()=>{})):r&&(await V(e.paths,r.id,o=>({...o,lastFailureReason:i})).catch(()=>{}),await Re(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 VA(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(at(t)){BA(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:go(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}wh(t)&&(e.state={mode:"main",shell:I(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function KA(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=Dy(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"){Ko(e,UA.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"||at(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){Ko(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 Re(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},Z(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 GA(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=Ig(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==="logs"){let r=e.state.parentVariant;HA(e,r)}}}async function HA(e,t){let n;try{n=await we.readLog(e.paths)}catch(r){let s=ie(e,"open logs",r,"Failed to read Craig logs.");n={path:e.paths.logFile,lines:[`Unable to read logs: ${s}`],empty:!1}}e.state.mode==="overlay"&&(e.state={mode:"overlay",variant:"logs",menuIndex:0,optionsMessage:null,shell:e.state.shell,log:n,...t!==void 0?{parentVariant:t}:{}},e.pendingClear=!0,e.render())}function YA(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=Cg(_y(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"?fy(n.runner,n.enabled,oe(e)):my(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:{..._y(e),message:i}},e.render()})}function zA(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=vg(xy(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}hy(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:{...xy(e),message:s}},e.render()})}}function Ly(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){VA(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){KA(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){XA(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=ju(e.state.shell,n,qu(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)},Z(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)},Z(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&at(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Is(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(JA(e,n))return;e.lastTerminalKey=Bh(n)?{key:n,at:Date.now()}:null;let i=Vh(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){Vo(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)},Z(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){Ko(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){Py(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{Vu(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){Iy(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(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){Oy(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(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=Mt(e.model.tasks,r.state),i=s?U(s)?.url??null:null;i?Ny(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){vy(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(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){Cy(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(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){Vu(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:I(e,r.state)},Z(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){ky(e,e.state.shell);return}Bo(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)},wy(e,e.state.shell).catch(()=>{}),Z(e,e.state.shell),e.render());return}if(e.state.variant==="help"){e.state.viaOptions&&e.state.parentVariant?e.state={mode:"overlay",variant:"options",menuIndex:3,optionsMessage:null,shell:e.state.shell,parentVariant:e.state.parentVariant}:e.state.parentVariant?e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell}:e.state={mode:"main",shell:I(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){GA(e,n);return}if(e.state.variant==="runners"){YA(e,n);return}if(e.state.variant==="previews"){zA(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||at(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"||at(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(at(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;Sy(e,s).then(i=>{e.state.mode!=="main"||e.state.shell!==s||(e.state={mode:"main",shell:i},Z(e,e.state.shell),e.render())}).catch(i=>{if(e.state.mode!=="main"||e.state.shell!==s)return;let o=ie(e,"warm selected PTY",i,"Failed to start selected PTY.");e.state={mode:"main",shell:se(e,I(e,e.state.shell),o)},Z(e,e.state.shell),e.render()})}):Ry(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 Fy(e,t){let n=zh(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=Is(i);if(o){jy(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(uu(i)){e.pendingTerminalKeySequence.raw=i,My(e);return}Go(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"})},Z(e,e.state.shell),e.render();return}let r=Kh(n);if(r!==0){Vo(e,r);return}let s=Is(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
|
|
276
|
+
`);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 kg(e){return new Promise((t,n)=>{let r=cg(e);r.once("connect",()=>t(r)),r.once("error",n)})}function $C(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,n)})}function xn(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
|
|
277
|
+
`)}catch{}}function DC(e){try{return process.kill(e,0),!0}catch{return!1}}function Tg(e){return new Promise(t=>setTimeout(t,e))}function NC(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var Su=["Runners","Feature Previews","Logs","Help"],Rg={agentOrchestration:"Agent orchestration"};function Pu(e,t){return z.map(n=>{let r=b.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 Sg(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 Pg(e){return ze.map(t=>`${b.previews.isEnabled(e,t)?"[x]":"[ ]"} ${Rg[t]}`)}function Ig(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function vg(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(Su.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:Mo(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"logs"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function Cg(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(!Mo(n))return{kind:"noop",state:e};let r=ze[e.menuIndex]??ze[0],s=!b.previews.isEnabled(t,r);return{kind:"save-enabled",feature:r,enabled:s,state:{...e,message:`${Rg[r]} ${s?"enabled":"disabled"}.`}}}function Ag(e,t,n,r){if(e.pathEdit)return _C({...e,pathEdit:e.pathEdit},t,n);let s=Pu(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=z[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:a,value:t.runners?.[a]?.path??""}}}}if(!Mo(n))return{kind:"noop",state:e};let i=z[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:`${b.runners.getProfile(i).displayName} ${o?"disabled":"enabled"}.`}}}function _C(e,t,n){if(n==="ESCAPE")return{kind:"render",state:bg({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(Mo(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:r,path:s.length>0?s:null,state:bg({...e,message:s.length>0?`${b.runners.getProfile(r).displayName} executable saved.`:`${b.runners.getProfile(r).displayName} executable reset to default.`})}}return xC(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function bg(e){let t={...e};return delete t.pathEdit,t}function Mo(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
|
|
278
|
+
`}function xC(e){return e.length===1&&e>=" "&&e!==""}import As from"node:path";function Eg(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 Og="\u{F024B} ",$g="\u{F0DCF} ",Dg="\u25CB",Iu="\uEA64",Ng="\uEAFE",_g="\uEBDA",vu="\u25CB",Cu="\u25CF",Au="\u2713",Eu="\u2715";function xg(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 Ou=150,Lg=6;var qo="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 qg(e,t,n){let r=MC(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=wA(t.tasks),d=UC(e,a),u=qC(e,a,d,n),p=u.find(y=>y.id===d)??u[0]??{id:"agent",label:"CODEX"},m=t.inspection?.taskId===a?.id?t.inspection:null,h=s?.name??"no repo",f=a?b.runners.getDisplayName(a.runner):b.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 ${b.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 [${b.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:Rs(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===B?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${b.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:As.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${As.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:f},leftTree:LC(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>kA(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:h,agent:f},centerTranscript:jC(d,e,s,a,e.workspaceBrowser,m,r),tabs:u,rightContext:yA(s,a),rightInspection:eA(e,a,m)}}function LC(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 FC(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=wo(t.tasks,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 Ts(c)){let p=e.selectedLeftItemId===`task:${d.id}`,m=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,h={id:`task:${d.id}`,taskId:d.id,text:n?m:`${p?"\u25B8":"\u2022"} ${m}`,indent:u===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:Qn(d,n.snapshots,n.now),activityAnimationFrame:n.animationFrame}:{}},f=Wg(d);f&&(h.prBadge=f),r.push(h)}if(o.kind==="project"){let d=`new-task-workspace:${o.id}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Project Task [${b.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 [${b.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 FC(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=ko(r,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 Ts(l)){let m=t.selectedLeftItemId===`task:${u.id}`,h=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,f={id:`task:${u.id}`,taskId:u.id,text:s?h:`${m?"\u25B8":"\u2022"} ${h}`,indent:p===0?2:4,selected:m,focused:m&&t.focusedRegion==="tasks",...s?{activity:Qn(u,s.snapshots,s.now),activityAnimationFrame:s.animationFrame}:{}},y=Wg(u);y&&(f.prBadge=y),e.push(f)}let c=`new-task:${o.id}`,d=t.selectedLeftItemId===c;e.push({id:c,text:`+ New Task [${b.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 MC(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 jC(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 m=p===s.selectedIndex?"\u25B8":" ",h=u.kind==="repo"?" [git repo]":"/";return`${m} ${u.name}${h}`}),d=s.query!==null?`Search: ${s.query}\u2588`:"";return ct(["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 ct(["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 ct([`No tasks in ${c}.`,"",`Press n or choose + New ${d} to create one with ${b.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?ct([`${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."]):ct([`${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===B&&t.openInspectionKind==="file"?VC(r,i,t.fileScrollOffset):e===B&&t.openInspectionKind==="diff"?KC(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?ct(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):ct(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function qC(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:WC(o),...o.kind==="agent"&&r&&t?{activity:Vt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame}:{}}))??[];if(!t)return[{id:qo,label:"EMPTY",active:n===qo,focused:e.focusedRegion==="center"&&n===qo}];let i=e.openInspectionKind||n===B?[{id:B,label:BC(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function UC(e,t){return t?t.ptyTabs.some(n=>n.id===e.activeTab)||e.activeTab===B&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??B:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??B:qo}function WC(e){return e.title.toUpperCase()}function BC(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?As.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function VC(e,t,n){if(!e)return ct(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return ct(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=Ug(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:""},...GC(r.lines,n,s)]}function KC(e,t,n){if(!e)return ct(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return ct(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=Ug(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:""},...HC(r.lines,n,s)]}function ct(e){return e.map(t=>({text:t}))}function GC(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}},...$u(i,n)],tone:"default"}})}function HC(e,t,n){let r=YC(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>zC(i,n))}function YC(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 zC(e,t){let n=Fg(e.oldNumber),r=Fg(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?XC($u(e.text,t),i.bg,i.fallbackFg):$u(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 Fg(e){return e===null?" ":String(e).padStart(4," ")}function Ug(e){let t=As.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 $u(e,t){return t==="diff"?JC(e):t==="markdown"?QC(e):t==="json"?Du(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?Du(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 JC(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 XC(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function QC(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:pe.markup,bold:!0}}]:Du(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function Du(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:ZC(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function ZC(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 eA(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"?Bg(t.repoTargets??[]):s?.pullRequest??(t?W(t):null),o=[tA(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=Gg(e,t),l=Nu(e,n),c=oA([{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,...mA(e,n)]}:{title:"",rows:[...o,...Nu(e,n)]}}function tA(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=_u(t),o=xu(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function Mg(e){return[{text:" "},_u(e),{text:" "},xu(e)]}function Wg(e){if(e.type==="project"&&e.repoTargets?.length){let n=Bg(e.repoTargets);return n?Mg(n):null}let t=W(e);return t?.number?Mg(t):null}function Bg(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=rA(n);return{number:-1,status:nA(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 nA(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 rA(e){let t=e.map(n=>Vg(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 _u(e){return!e||!e.number?{text:Dg,style:{fg:"565f89"}}:e.status==="merged"?{text:Ng,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:_g,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:Iu,style:{fg:"565f89"}}:{text:Iu,style:{fg:"9ece6a"}}}function xu(e){return e?.aggregateReadiness?jg(e.aggregateReadiness):jg(Vg(e))}function jg(e){return e==="failed"?{text:Eu,style:{fg:"f7768e"}}:e==="pending"?{text:Cu,style:{fg:"e0af68"}}:e==="success"?{text:Au,style:{fg:"9ece6a"}}:{text:vu,style:{fg:"565f89"}}}function Vg(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")?Kg(e)?"failed":sA(e)?"success":"pending":"pending"}function sA(e){return!!(e.mergeable&&!e.draft&&!Kg(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function Kg(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function Gg(e,t){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return iA(e,t);let n=W(t),r=Yg("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 jo=32;function iA(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=jo-u.length-1,m=c.length>p?c.slice(0,p-1)+"\u2026":c,h=jo-m.length-u.length;n.push({id:`project-review:${o.repoId}`,text:m+" ".repeat(Math.max(1,h))+u,selected:a,focused:l,muted:!0})}else{let d=_u(o.pullRequest),u=xu(o.pullRequest),p=`${d.text} ${u.text}`,m=jo-p.length-1,h=c.length>m?c.slice(0,m-1)+"\u2026":c,f=jo-h.length-p.length,y=h+" ".repeat(Math.max(1,f));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(...Yg("target",i.branch,i.pullRequest))),n}function Hg(e,t,n=null){return 3+Gg(e,t).length+Nu(e,n).length}function Yg(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=aA(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:lA(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${zg(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(cA)):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)=>uA(u,r(`comment:${p}`))))),s}function oA(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 aA(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function lA(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function zg(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 cA(e){let{icon:t,color:n}=pA(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," ")} ${fA(e.status)}`,color:n,muted:!1}}function uA(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${zg(e.createdAt)}`:"",s=dA(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 dA(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 pA(e){switch(e){case"success":return{icon:Au,color:"9ece6a"};case"pending":return{icon:Cu,color:"e0af68"};case"failed":return{icon:Eu,color:"f7768e"};case"skipped":return{icon:vu,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function fA(e){return e==="success"?"passing":e==="failed"?"failing":e}function mA(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)?Og:$g:Eg(l.label),p=l.kind==="directory"?"7aa2f7":xg(l.label),m=" ".repeat(l.depth),h=p?{text:u,style:{fg:p}}:{text:u},f=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:d?{text:l.label,style:{fg:d}}:{text:l.label},y=[{text:m},h,f];return{id:l.path,text:`${m}${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 Nu(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(hA(t))return gA(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=>Jg(i,e,t))))}return n}function hA(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function gA(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=>Jg(c,e,t,s.length+1))))}}return n}function Jg(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 yA(e,t){return e?t?[{label:"Task",value:t.id},{label:"Repo",value:e.name},{label:"Agent",value:b.runners.getDisplayName(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:As.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 wA(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0})}function kA(e,t){return{name:b.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function Xg(e,t,n,r,s=null){if(s)return TA(e,t,n,r,s);let i=ru(e,t,{centerOnly:r});return bA(n,i)?{output:Do(i.rows,n.rows,i.row,i.column),region:i}:null}function TA(e,t,n,r,s){let i=Nh(e,t,s,{centerOnly:r});if(!i||!RA(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 bA(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function RA(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function Qg(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!SA(o,a))return null;!o||!a||(s+=Do(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function SA(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 PA=["tasks","center","inspector"];function IA(e,t,n){if(t==="ESCAPE")return A({state:{...e,fileSearchQuery:null},changed:!0});if(t==="BACKSPACE"||t==="DELETE"){let r=e.fileSearchQuery??"";return A({state:{...e,fileSearchQuery:r.slice(0,-1)},changed:!0})}if(t==="UP"||t==="k"||t==="DOWN"||t==="j")return Mu(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return qu({...e,fileSearchQuery:null},t,n);if(t.length===1&&t>=" "){let r=(e.fileSearchQuery??"")+t;return A({state:{...e,fileSearchQuery:r},changed:!0})}return A({state:e})}function qu(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return wh(t)?A({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):A({state:e});if(e.fileSearchQuery!==null)return IA(e,t,n);if(t==="/"&&e.focusedRegion==="inspector"&&e.inspectionMode==="files")return A({state:{...e,fileSearchQuery:""},changed:!0});if(t==="q"||t==="Q")return A({state:e,exit:!0});if(t==="ESCAPE")return A({state:{...e,actionMessage:null},changed:e.actionMessage!==null,pause:!0});if(t==="n"||t==="N")return A({state:{...e,focusedRegion:"tasks",actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0});if((t==="r"||t==="R")&&e.focusedRegion==="tasks"&&(To(e.selectedLeftItemId)||bo(e.selectedLeftItemId)))return A({state:{...e,selectedRunner:yo(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return Zg(e,1);if(t==="SHIFT_TAB"||t==="[")return Zg(e,-1);if(t==="z"||t==="Z")return A({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===B?dn(e,-1,n):Mu(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===B?dn(e,1,n):Mu(e,1,n);if(t==="PAGE_UP")return dn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return dn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return dn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return dn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??z,s=e.centerTabRunner?r.indexOf(e.centerTabRunner):-1,i=s===r.length-1?null:r[s+1];return A({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=NA(e,t);return A({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 A({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0});if(t==="o"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review"&&e.selectedTaskId)return A({state:e,openPrUrl:!0});if(t==="X"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return A({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Rs(e.selectedLeftItemId)&&e.selectedTaskId)return A({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Ph(e.selectedLeftItemId)&&e.selectedWorkspaceId)return A({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&ny(e.activeTab,n.ptyTabIds??[]))return A({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return Fu(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return ey(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return Fu(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return ey(e,1)}if(at(t)){if(e.focusedRegion==="tasks"&&(To(e.selectedLeftItemId)||bo(e.selectedLeftItemId))){let r=Jc(e.selectedLeftItemId),s=Xc(e.selectedLeftItemId);return A({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 A({state:{...e,actionMessage:null},changed:!0,openWorkspaceBrowser:!0});if(e.focusedRegion==="tasks"&&Rs(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return A({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:wr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&ny(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return A({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:wr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===B)return A({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 A({state:AA({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return A({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:B,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?A({state:{...e,selectedDiffPath:r,activeTab:B,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!n.projectTargetIds?.length?A({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):A({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?A({state:e}):e.selectedActionId==="refresh-checks"?A({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?A({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):A({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return A({state:e})}function dn(e,t,n){if(t===0)return A({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?ry(e,t,n):e.inspectionMode==="review"?ty(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):A({state:e});if(e.focusedRegion==="center"&&e.activeTab===B){if(e.openInspectionKind==="file")return ty(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return EA(e,t,n)}return A({state:e})}function Zg(e,t){return Uo(e,"focusedRegion",PA,t)}function Fu(e,t,n){let r=Uo(e,"activeTab",n&&n.length>0?n:_A(e),t);return!r.changed||Th(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:wr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function Mu(e,t,n){if(e.focusedRegion==="tasks")return vA(e,t,n.leftItemIds);if(e.focusedRegion==="center")return Fu(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return ry(e,t,n);if(n.projectTargetIds?.length){let s=ju(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=ju(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:B,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:Uo(e,"selectedActionId",fh,t)}return Uo(e,"selectedActionId",Gc,t)}function vA(e,t,n){let r=ju(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=zc(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=Jc(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=Xc(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function CA(e,t){if(e.inspectionMode===t)return A({state:e});let n=t==="files"?"file":e.openInspectionKind,r=t==="files"?B:e.activeTab;return A({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 ey(e,t){return CA(e,DA(e.inspectionMode,Hc,t))}function ry(e,t,n){let r=n.fileTreeRowIds&&n.fileTreeRowIds.length>0?n.fileTreeRowIds:n.filePathIds??[];if(r.length===0)return A({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 A({state:e});let l=a!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(a);return A({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?B:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function AA(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 ty(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]?A({state:e}):A({state:{...e,[t]:o,actionMessage:null},changed:!0})}function EA(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return OA(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?A({state:e}):A({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?A({state:e}):A({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}if(t>0&&o>i){let d=a[l+1]??null;return d?A({state:{...e,selectedDiffPath:d,activeTab:B,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===i?A({state:e}):A({state:{...e,diffScrollOffset:i,actionMessage:null},changed:!0})}if(t<0&&o<0){let d=a[l-1]??null;return d?A({state:{...e,selectedDiffPath:d,activeTab:B,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?A({state:e}):A({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let c=Ft(o,0,i);return c===e.diffScrollOffset?A({state:e}):A({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function OA(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=$A(n.diffPathRanges??[],o)??e.selectedDiffPath;return o===e.diffScrollOffset&&a===e.selectedDiffPath?A({state:e}):A({state:{...e,diffScrollOffset:o,selectedDiffPath:a,actionMessage:null},changed:!0})}function $A(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function Uo(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]?A({state:e}):A({state:{...e,[t]:o,actionMessage:null},changed:!0})}function ju(e,t,n,r,s=!1){if(n.length===0)return A({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]?A({state:e}):A({state:{...e,[t]:a,actionMessage:null},changed:!0,refreshInspection:s})}function DA(e,t,n){let r=t.indexOf(e);return t[Ft(r+n,0,t.length-1)]??e}function A(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 ny(e,t){return t.includes(e)}function NA(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":wr(e.activeTab)??e.preferredPtyTabKind}function _A(e){return[e.selectedPtyTabId,e.openInspectionKind?B:null].filter(t=>typeof t=="string")}function Ft(e,t,n){return Math.min(n,Math.max(t,e))}var sy=async(e,t,n,r)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await r.queueTaskMutation(async()=>V(r.paths,e.selectedTaskId,i=>{let o=t??xA(i,e.activeTab,e.preferredPtyTabKind),a=ly(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"}`}}},iy=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 V(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}`}}},oy=async(e,t)=>{let n=e.selectedTaskId;n&&await t.queueTaskMutation(async()=>{await V(t.paths,n,r=>!r.ptyTabs.some(s=>s.id===e.activeTab)||r.selectedPtyTabId===e.activeTab?r:{...r,selectedPtyTabId:e.activeTab})})},ay=async(e,t)=>{let n=e.ptyTabs.find(s=>s.kind==="agent")??null;if(n)return await t.queueTaskMutation(async()=>{await V(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=ly(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await V(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 xA(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function ly(e,t,n,r={}){let s=n??e.runner,i=b.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(m=>m.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"?b.runners.buildCommand(s,void 0,r):[],createdAt:u,updatedAt:u}}var Rr=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},cy=async(e,t,n,r,s)=>{b.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});b.previews.isEnabled(s.config,"agentOrchestration")&&await Xe(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=ro();so(b.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 Rr(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}},uy=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},dy=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 Cr(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}`}}},py=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Cr(t.paths,n.id)))),Es=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await ue.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var fy=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 my=async(e,t,n)=>{let r=b.runners.setRunnerEnabled(n.config,e,t);return await b.save(n.paths,r),r},hy=async(e,t,n)=>{let r=b.runners.setRunnerPath(n.config,e,t);return await b.save(n.paths,r),r},gy=async(e,t,n)=>{let r=b.previews.setEnabled(n.config,e,t);return await b.save(n.paths,r),r};var LA=250;function Mt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function Ln(e,t){return Lt(t,e.ptyRuntime.getViewState(Sr(e,t)))}function Sr(e,t){let n=Mt(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 Ln(e,Ih(t,e.model))}function yy(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 wy(e,t,n){return yy(e,t,n?{tone:"success",message:n}:null)}function se(e,t,n){return yy(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 ue.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function Z(e,t){if(!e.uiStateFile)return;e.runtimeState=gh(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 FA(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=>FA(e,t)}}function Uu(e,t){let n=Mt(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:_n(e.model),centerTabIds:Rh(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:Hg(t,n,s),pageRows:Math.max(5,Fe(e.activeTerminal.width,e.activeTerminal.height).height-Q.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:n?.repoTargets?.map(a=>a.repoId)??[]}}async function ky(e,t){await oy(t,oe(e))}async function be(e){e.model=await kr(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 Wo(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 Bo(e,t){let n=++e.inspectionRefreshSequence,r=Qc(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 th(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await kr(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)},Z(e,e.state.shell),e.render())}function Ty(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)&&Bo(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()})},LA))}function by(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=dn(e.state.shell,n,Uu(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:I(e,r.state)},Z(e,e.state.shell),e.render(),Bo(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)},Z(e,e.state.shell),e.render()}},16)))}function Wu(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function Bu(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 Sy(e){Bu(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.render())})}async function Py(e,t){let n=I(e,t),r=Mt(e.model.tasks,n),s=Sr(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 Lt(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,ln(Fe(e.activeTerminal.width,e.activeTerminal.height)));return Lt({...n,inputMode:"control"},o)}function Vu(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 Ku(e,t){try{let n=I(e,t),r=Mt(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 Ry(e,r),await be(e),s=r.selectedPtyTabId)}r&&!s&&(r=await Ry(e,r),await be(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:Lt({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},Z(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,ln(Fe(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=cn(s),e.lastTerminalKey=null,e.state={mode:"main",shell:Lt({...i,inputMode:"terminal"},o)},Z(e,e.state.shell)}catch(n){let r=ie(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&cn(t.selectedPtyTabId)&&(await MA(e,t.selectedTaskId,r).catch(()=>{}),await be(e).catch(()=>{})),e.state={mode:"main",shell:se(e,yh(I(e,t),r),r)},Z(e,e.state.shell)}e.render()}async function MA(e,t,n){await uy(t,n,oe(e))}async function Iy(e,t,n,r){let s=I(e,t),{nextShell:i}=await sy(s,n,r,oe(e));return await be(e),I(e,{...s,...i})}async function vy(e,t){let n=I(e,t),{closedTab:r,nextShell:s}=await iy(n,oe(e));return e.ptyRuntime.disposeSession(r.id),await be(e),I(e,{...n,...s})}async function Cy(e,t){let n=I(e,t),r=_n(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await dy(n,oe(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await be(e),I(e,{...n,...o,selectedLeftItemId:jA(r,_n(e.model),s)})}async function Ay(e,t){let n=I(e,t),{nextShell:r}=await fy(n,oe(e));return await be(e),I(e,{...n,...r})}async function Ry(e,t){return ay(t,oe(e))}function Vo(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:Ln(e,e.state.shell)},e.render())},16))}function jA(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 Oy(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=Ey(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await py(s,oe(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)Wo(e,o);t.recordSuccess(i,Ey(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,Es("background PR polling",i,oe(e)))}}function Ey(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function $y(e,t){let n=I(e,t),r=Mt(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 be(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 be(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${W(a)?.requiredChecks.length??0} reported`)}return I(e,{...wy(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import VA from"node:path";import{readdir as qA,stat as UA}from"node:fs/promises";import Dy from"node:path";async function WA(e){let t=await qA(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=Dy.join(e,r.name);n.push({name:r.name,path:s,kind:await BA(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 Ny(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function _y(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 Ko(e,t){let n=await WA(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 BA(e){let t=Dy.join(e,".git");return await UA(t).catch(()=>null)!==null}function xy(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 KA(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 cy(t.selectedRepoId,t.selectedWorkspaceId,n,t.selectedRunner,oe(e));r=s.task,await be(e);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??Bh(r,"agent"),ln(Fe(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=cn(i.selectedPtyTabId),e.state={mode:"main",shell:Lt(i,o)},Z(e,e.state.shell)}catch(s){s instanceof Rr&&(r=s.task);let i=ie(e,"create task",s,"Failed to create task.");r&&!(s instanceof Rr)?(await V(e.paths,r.id,o=>({...o,status:"draft",runnerSession:{...o.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:i})).catch(()=>{}),await be(e).catch(()=>{})):r&&(await V(e.paths,r.id,o=>({...o,lastFailureReason:i})).catch(()=>{}),await be(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 GA(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(at(t)){KA(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:yo(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}kh(t)&&(e.state={mode:"main",shell:I(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function HA(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=Ny(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"){Ko(e,VA.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"||at(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){Ko(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 be(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},Z(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 YA(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=vg(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==="logs"){let r=e.state.parentVariant;zA(e,r)}}}async function zA(e,t){let n;try{n=await ue.readLog(e.paths)}catch(r){let s=ie(e,"open logs",r,"Failed to read Craig logs.");n={path:e.paths.logFile,lines:[`Unable to read logs: ${s}`],empty:!1}}e.state.mode==="overlay"&&(e.state={mode:"overlay",variant:"logs",menuIndex:0,optionsMessage:null,shell:e.state.shell,log:n,...t!==void 0?{parentVariant:t}:{}},e.pendingClear=!0,e.render())}function JA(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=Ag(xy(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"?my(n.runner,n.enabled,oe(e)):hy(n.runner,n.path,oe(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=b.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:b.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:{...xy(e),message:i}},e.render()})}function XA(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=Cg(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}gy(n.feature,n.enabled,oe(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,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 Fy(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){GA(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){HA(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){ZA(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=qu(e.state.shell,n,Uu(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)},Z(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)},Z(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&at(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Is(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(QA(e,n))return;e.lastTerminalKey=Vh(n)?{key:n,at:Date.now()}:null;let i=Kh(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){Vo(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)},Z(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){Ko(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){Iy(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{Ku(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){vy(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(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){$y(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(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=Mt(e.model.tasks,r.state),i=s?W(s)?.url??null:null;i?_y(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){Cy(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(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){Ay(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(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){Ku(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:I(e,r.state)},Z(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){Ty(e,e.state.shell);return}Bo(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)},ky(e,e.state.shell).catch(()=>{}),Z(e,e.state.shell),e.render());return}if(e.state.variant==="help"){e.state.viaOptions&&e.state.parentVariant?e.state={mode:"overlay",variant:"options",menuIndex:3,optionsMessage:null,shell:e.state.shell,parentVariant:e.state.parentVariant}:e.state.parentVariant?e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell}:e.state={mode:"main",shell:I(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){YA(e,n);return}if(e.state.variant==="runners"){JA(e,n);return}if(e.state.variant==="previews"){XA(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||at(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"||at(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(at(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;Py(e,s).then(i=>{e.state.mode!=="main"||e.state.shell!==s||(e.state={mode:"main",shell:i},Z(e,e.state.shell),e.render())}).catch(i=>{if(e.state.mode!=="main"||e.state.shell!==s)return;let o=ie(e,"warm selected PTY",i,"Failed to start selected PTY.");e.state={mode:"main",shell:se(e,I(e,e.state.shell),o)},Z(e,e.state.shell),e.render()})}):Sy(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 My(e,t){let n=Jh(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=Is(i);if(o){qy(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(uu(i)){e.pendingTerminalKeySequence.raw=i,jy(e);return}Go(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"})},Z(e,e.state.shell),e.render();return}let r=Gh(n);if(r!==0){Vo(e,r);return}let s=Is(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
|
|
279
279
|
`&&n!==`\r
|
|
280
|
-
`&&(e.suppressTerminalEnterOnAttach=!1),
|
|
281
|
-
`),1}return
|
|
280
|
+
`&&(e.suppressTerminalEnterOnAttach=!1),zh(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function QA(e,t){if(e.pendingTerminalKeySequence){let n=Hh(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Is(r);if(s)return qy(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(uu(r))return e.pendingTerminalKeySequence.raw=r,jy(e),!0}return Go(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>Go(e),30)},!0)}function jy(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>Go(e),30))}function Go(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function qy(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function Uy(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){by(e,cu(t));return}let n=cu(t);n!==0&&Vo(e,n)}function ZA(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var tE=eE(import.meta.url),nE=tE("terminal-kit"),rE=nE.terminal;function Gu(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Wy(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function By(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function sE(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 Vy(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=ve(t),r=await b.load(n),s=b.runners.getEnabled(r),i=e.uiStateFile?await Mn({uiStateFile:e.uiStateFile}):null,o=await kr(t,void 0,s),a=bs(hh(i,r),o);o=await kr(t,a,s);let l={current:o},c=()=>{},d=()=>{},u=()=>{},p={workspaceRoot:t,onUpdate:h=>c(h),onActivity:h=>d(h),onActivityRemoved:h=>u(h),resolveSessionSpec:(h,f)=>Wh(l.current,f,t)},m=e.ptyRuntime??await dg({...p,paths:n,activityEnabled:!0});return new Promise(h=>{let f=e.terminal??rE,y=null,k=null,R=null,T=null,O=null,$=0,D=!1,x=new Map,v=m.managesPullRequestSync?null:new br({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,Re=new un({resolutionMs:Ou,onError:(C,Y)=>Es(`heartbeat job "${C}"`,Y,oe(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:bs(a,o)},get model(){return l.current},set model(C){l.current=C},config:r,enabledRunnerIds:s,creatingTask:!1,suppressTerminalEnterOnAttach:!1,lastTerminalKey:null,pendingScrollLines:0,pendingInspectionScrollLines:0,leftNavInspectionTimer:null,pendingLeftNavInspectionShell:null,pendingTerminalKeySequence:null,scrollRenderTimer:null,inspectionScrollRenderTimer:null,ptyRenderTimer:null,footerToastTimer:null,focusFlashUntil:null,focusFlashTimer:null,lastBackgroundPrPollError:null,versionText:`Craig v${b.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:f,ptyRuntime:m,resolve:h,render:()=>{},renderTaskNavigation:()=>!1,exit:C=>h(C)},w.ptyRuntime.setActivityEnabled?.(!0),c=C=>{w.state.mode==="main"&&(O=sE(O,C),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let Y=O;if(O=null,w.state.mode==="main"){let fe=Ln(w,w.state.shell);if(w.state={mode:"main",shell:fe},!T||!k){w.render();return}let Me=Fe(f.width,f.height),Se={...T,terminal:fe.terminal},fn=Xg(Me,Se,k,fe.centerZoomed,Y?.kind==="rows"?Y.rowIndices:null);if(!fn){w.render();return}fn.output.length>0&&f.noFormat(fn.output),T=Se,k=fn.region,R&&(R={...R,center:fn.region}),y=null,f.hideCursor(!0)}},0)))},d=C=>{w.state.mode==="main"&&cn(C.tabId)&&x.get(C.tabId)!==Ct(C.tabId,[C],Date.now())&&w.render()},u=C=>{w.state.mode==="main"&&cn(C)&&x.get(C)!=="idle"&&w.render()};let ge=Promise.resolve(),H=C=>{ge=ge.then(async()=>{let Y=await Promise.all([...new Set(C)].map(fe=>S.getTask(w.paths,fe)));for(let fe of Y)Wo(w,fe);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(Y=>Es("daemon task-state refresh",Y,oe(w)))};w.ptyRuntime.setTasksChangedHandler?.(H);let pn=C=>{let Y=Fe(f.width,f.height),fe=w.ptyRuntime.getActivitySnapshots?.()??[],Me=Date.now(),Se=qg(I(w,C.shell),w.model,{snapshots:fe,now:Me,animationFrame:$});x.clear();for(let Hy of w.model.tasks)for(let Ho of Hy.ptyTabs)Ho.kind==="agent"&&x.set(Ho.id,Ct(Ho.id,fe,Me));let fn=Dh(Y,Se,{centerOnly:C.shell.centerZoomed,focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:Se,presentation:fn}},Os=(C,Y,fe,Me)=>{if(!R)return!1;let Se=Qg(R,Y.regions,fe);return Se?(Se.output.length>0&&f.noFormat(Se.output),T=C,R=Se.regions,k=Se.regions.center,y=Me?Y.frame:null,f.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;Vu(w),w.ptyRuntime.setPullRequestPollView?.(By(w.state)),w.ptyRuntime.setViewedTab?.(Sr(w,w.state.shell));let{data:C,presentation:Y}=pn(w.state);return Os(C,Y,["rail","left","center","footer"],!1)},w.render=()=>{Vu(w);let C=w.state;w.ptyRuntime.setPullRequestPollView?.(By(C)),w.ptyRuntime.setViewedTab?.(C.mode==="main"?Sr(w,C.shell):null);let Y=Fe(f.width,f.height),fe,Me=null;if(C.mode==="main"){let Se=pn(C);if(Me=Se.presentation,fe=Me.frame,!w.pendingClear&&Os(Se.data,Me,["rail","left","center","right","footer"],!0))return;T=Se.data,k=Me.center}else fe=C.variant==="boot"?Ah(Y,{menuIndex:C.menuIndex,optionsMessage:C.optionsMessage,versionText:w.versionText,updateText:w.updateText}):C.variant==="pause"?Eh(Y,{menuIndex:C.menuIndex,optionsMessage:C.optionsMessage,versionText:w.versionText,updateText:w.updateText}):C.variant==="options"?Eo(Y,{menuIndex:C.menuIndex,optionsMenuItems:Su}):C.variant==="runners"?Eo(Y,{menuIndex:Gu(C).menuIndex,optionsMenuItems:Pu(w.config,Gu(C)),optionsMessage:Sg(Gu(C)),optionsSubtitle:"Runners"}):C.variant==="previews"?Eo(Y,{menuIndex:Wy(C).menuIndex,optionsMenuItems:Pg(w.config),optionsMessage:Ig(Wy(C)),optionsSubtitle:"Feature Previews - Experimental"}):C.variant==="logs"?$h(Y,{logPath:C.log?.path??n.logFile,logLines:C.log?.lines??[]}):Oh(Y),T=null,k=null,R=null;w.pendingClear&&(f.moveTo(1,1),f.eraseDisplayBelow(),w.pendingClear=!1,y=null),f.noFormat(Xh(fe,y)),y=fe,R=Me?.regions??null,f.hideCursor(!0)};let $s=C=>Fy(w,C),Hu=C=>My(w,C),Yu=C=>Uy(w,C),Gy=()=>{process.stdout.off("resize",zu),process.off("SIGCONT",Ju),f.removeListener("key",$s),f.removeListener("unknown",Hu),f.removeListener("mouse",Yu),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),Re.stop(),w.ptyRuntime.disposeAll(),f.grabInput(!1),f.hideCursor(!1),f.fullscreen(!1)};w.exit=C=>{Gy(),h(C)};let zu=()=>{Wu(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(ln(Fe(f.width,f.height))),w.state={mode:"main",shell:Ln(w,w.state.shell)}),w.render()},Ju=()=>{Wu(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(ln(Fe(f.width,f.height))),w.state={mode:"main",shell:Ln(w,w.state.shell)}),w.render()};process.stdout.on("resize",zu),process.on("SIGCONT",Ju),f.grabInput(!0),w.inputCaptureMode="control",f.hideCursor(!0),f.fullscreen(!0),f.on("key",$s),f.on("unknown",Hu),f.on("mouse",Yu),v&&Re.register({id:"github.pull-requests",intervalMs:1e3,run:C=>Oy(w,v,C)}),Re.register({id:"agent.activity-indicators",intervalMs:Ou,run:()=>{let C=Date.now(),Y=ii(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],C);(Y||D)&&($=($+1)%Lg,w.state.mode==="main"&&w.render()),D=Y}}),Re.start(),b.version.checkForUpdate().then(C=>{C.updateAvailable&&C.latest&&(w.updateText=`Update available: v${C.latest}`,w.render())}),w.bootHydrationReady=Bu(w).catch(()=>{}),w.render()})}async function oE(){try{if(process.argv[2]==="__craig-daemon"){let e=await Ky(process.argv[3]??process.cwd()),t=ve(e);return await pg(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await Ky(process.argv[3]??process.cwd()),t=ve(e);return await fg(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
|
|
281
|
+
`),1}return Qm({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=>Vy({uiStateFile:ve(e).uiStateFile,workspaceRoot:e})})}async function Ky(e){return iE(e)}var aE=await oE();process.exit(aE);
|