craig-cli 0.17.1 → 0.17.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.js +109 -108
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
- var kw=Object.defineProperty;var xs=(e,t)=>{for(var n in t)kw(e,n,{get:t[n],enumerable:!0})};import{realpath as GE}from"node:fs/promises";import ke from"node:path";function Ae(e){let t=ke.join(e,".craig");return{workspaceRoot:e,repoRoot:e,craigDir:t,indexFile:ke.join(t,"index.json"),reposDir:ke.join(t,"repos"),workspacesDir:ke.join(t,"workspaces"),runtimeDir:ke.join(t,"runtime"),uiStateFile:ke.join(t,"runtime","ui-state.json"),tasksDir:ke.join(t,"tasks"),jobsDir:ke.join(t,"jobs"),commandsDir:ke.join(t,"commands"),eventsDir:ke.join(t,"events"),orchestrationDir:ke.join(t,"orchestration"),logsDir:ke.join(t,"logs"),logFile:ke.join(t,"logs","craig.jsonl"),artifactsDir:ke.join(t,"artifacts"),worktreesDir:ke.join(t,"worktrees"),configFile:ke.join(t,"config.json")}}import ru from"node:path";import{readFile as NI}from"node:fs/promises";import{readFile as Cw}from"node:fs/promises";import{randomUUID as Tw}from"node:crypto";import{chmod as bw,open as Rw,readFile as Pw,rename as Sw,rm as Iw}from"node:fs/promises";import oa from"node:path";async function q(e,t,n={}){let r=oa.dirname(e),s=oa.join(r,`.${oa.basename(e)}.${process.pid}.${Date.now()}.${Tw()}.tmp`),i=await Rw(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 Sw(s,e),n.mode!==void 0&&await bw(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await Iw(s,{force:!0}).catch(()=>{}),o}}async function Fs(e){try{let t=await Pw(e,"utf8");return JSON.parse(t)}catch(t){if(vw(t))return null;throw t}}function vw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}async function qn(e){try{let t=await Cw(e.uiStateFile,"utf8"),n=JSON.parse(t);return Aw(n,e.uiStateFile)}catch(t){if(Ow(t))return null;throw t}}async function Vt(e,t){await q(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function Ms(){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 Aw(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")||!jn(e,"inputMode")||!jn(e,"focusedRegion")||!jn(e,"activeTab")||!jn(e,"inspectorSection")||!jn(e,"inspectionMode")||!Ls(e,"openInspectionKind")||!Ls(e,"selectedFileTreePath")||!Ls(e,"selectedFilePath")||!Ls(e,"selectedDiffPath")||!Ew(e,"collapsedFileTreePaths")||!jn(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 jn(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function Ls(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function Ew(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function Ow(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var aa={};xs(aa,{RUNNER_IDS:()=>ue,STABLE_RUNNER_IDS:()=>mt,assertEnabled:()=>kd,buildCommand:()=>Rd,getConfiguredProfile:()=>js,getDefault:()=>wd,getDisplayName:()=>bd,getEnabled:()=>qs,getProfile:()=>Un,isRunnerType:()=>Us,parse:()=>Td,setRunnerEnabled:()=>Pd,setRunnerPath:()=>Sd});var mt=["codex","cursor","claude"],ue=[...mt,"pi"];var yd={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"},pi:{id:"pi",displayName:"Pi",executable:"pi",defaultAgentTitle:"Pi"}};var Un=e=>yd[e];var js=(e,t={})=>{let n=Un(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}};var qs=(e={})=>ue.filter(t=>t!=="pi"||e.previews?.piRunner===!0).filter(t=>e.runners?.[t]?.enabled!==!1);var wd=(e={})=>{let t=qs(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 kd=(e,t={})=>{if(e==="pi"&&t.previews?.piRunner!==!0)throw new Error('Runner "pi" is experimental. Enable the piRunner feature preview in .craig/config.json.');if(t.runners?.[e]?.enabled===!1)throw new Error(`Runner "${e}" is disabled in .craig/config.json.`)};var Us=e=>ue.includes(e);var Td=e=>{if(!e||e.length===0)return"codex";if(!Us(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${ue.join(", ")}.`);return e};var bd=e=>Un(e).displayName;var Rd=(e,t,n={})=>{let r=[js(e,n).executable];return t&&t.length>0&&r.push(t),r};var Pd=(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 la={};xs(la,{PREVIEW_FEATURE_IDS:()=>Xe,isEnabled:()=>Id,setEnabled:()=>vd});var Xe=["agentOrchestration","piRunner","fileOpen"];function Id(e,t){return e.previews?.[t]===!0}function vd(e,t,n){return{...e,previews:{...e.previews,[t]:n}}}import{mkdir as $w,readFile as Nw,writeFile as Dw}from"node:fs/promises";import _w from"node:path";var xw=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Cd=async e=>{try{return await Nw(e,"utf8")}catch(t){if(xw(t))return null;throw t}},Ad=async(e,t)=>{await $w(_w.dirname(e),{recursive:!0}),await Dw(e,t,"utf8")};var Fw=["incrementalCenterPane","agentActivityIndicators"],Ws=(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(!ue.includes(r))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" is not supported. Expected one of: ${ue.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(!Fw.includes(r)&&!Xe.includes(r))throw new Error(`Craig config at ${t} is invalid. "previews.${r}" is not supported. Expected one of: ${Xe.join(", ")}.`);if(typeof s!="boolean")throw new Error(`Craig config at ${t} is invalid. "previews.${r}" must be a boolean.`)}}return n};var ca=async(e,t={readConfigFile:Cd})=>{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 Ws(r,e.configFile)};var ua=async(e,t,n={writeConfigFile:Ad})=>{Ws(t,e.configFile),await n.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
4
- `)};var da={};xs(da,{checkForUpdate:()=>Ed,getCurrent:()=>Bs});var Bs=()=>{try{return"0.17.1"}catch{return"unknown"}};var Lw="https://registry.npmjs.org/craig-cli/latest",Mw=3600*1e3,jw={value:null},qw=(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},Ed=async(e={fetch:globalThis.fetch,getCurrent:Bs,cache:jw})=>{let t=e.getCurrent(),n=Date.now();if(e.cache.value&&n-e.cache.value.cachedAt<Mw)return e.cache.value.result;let r=null;try{let i=await e.fetch(Lw,{signal:AbortSignal.timeout(5e3)});i.ok&&(r=(await i.json()).version??null)}catch{}let s={current:t,latest:r,updateAvailable:r!==null&&r!==t&&qw(r,t)};return e.cache.value={result:s,cachedAt:n},s};var T={load:ca,save:ua,previews:la,runners:aa,version:da};var Od={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=Od[t],this.retryable=r.retryable??!1,this.details=r.details??{}}};function pa(e){return e instanceof g?e:new g("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as Uw,mkdir as Ww,readFile as Bw}from"node:fs/promises";import Vw from"node:path";var $d=80,Vs=async(e,t)=>{await Ww(Vw.dirname(e.logFile),{recursive:!0});let n={timestamp:new Date().toISOString(),...t};await Uw(e.logFile,`${JSON.stringify(n)}
5
- `,"utf8")},Nd=async(e,t)=>{try{await Vs(e,t)}catch{}},Ks=async(e,t=$d)=>{try{let s=(await Bw(e.logFile,"utf8")).trimEnd().split(`
6
- `).filter(i=>i.length>0).map(Kw);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(Hw(n))return{path:e.logFile,lines:[],empty:!0};throw n}},fa=async(e,t)=>Vs(e,{level:"error",component:"application",event:Gw(t.context),message:t.message,...t.details?{details:t.details}:{}}),Dd=async(e,t)=>{try{await fa(e,t)}catch{}},_d=Ks,xd=async(e,t=$d)=>Ks(e,t);function Kw(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 Gw(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function Hw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var de={appendErrorLog:fa,appendErrorLogBestEffort:Dd,appendLog:Vs,appendLogBestEffort:Nd,readLog:Ks,readErrorLog:_d,readRecentErrorLines:xd};function jd(e){let{commandTokens:t,options:n,help:r}=zw(e);if(r)return Ld({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":Er(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:ma(o,"Repo path")};break;case"repo:list":Er(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:X(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:ma(o,"Workspace path")};break;case"workspace:list":a=Jw(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:X(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:X(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:X(o,"Workspace id")};break;case"file:open":a={kind:"openFile",path:X(o,"File path")};break;case"task:new":a=Qw(o);break;case"task:create-child":a=Zw(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:X(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:X(o,"Task id")}};break;case"task:list":a=Xw(o);break;case"task:current":Er(o,"task current"),a={kind:"currentTask"};break;case"task:rename":a={kind:"renameTask",title:ma(o,"Task title")};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:X(o,"Task id")};break;case"task:pr":a=ek(o);break;case"task:repo":if(o[0]!=="add")throw S(`Unsupported task repo command: ${o.join(" ")}`);Hs(o,3,"task repo add"),a={kind:"addTaskRepoTarget",taskId:Gs(o,1,"Task id"),repoId:Gs(o,2,"Repo id")};break;case"task:wait":a=ak(o);break;case"agent:list":Er(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=rk(o);break;case"agent:send":a=sk(o);break;case"command:show":a={kind:"showPromptCommand",commandId:X(o,"Command id")};break;case"command:list":Er(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:X(o,"Command id")};break;case"command:wait":a=ik(o);break;case"events:list":a=Fd(o,!1);break;case"events:watch":a=Fd(o,!0);break;case"fury:validate":a={kind:"validateFury",file:X(o,"Fury file")};break;case"fury:plan":a=lk(o);break;case"fury:approve":a={kind:"approveFury",planId:X(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:X(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:X(o,"Fury run id")};break;case"fury:watch":a=ck(o);break;case"fury:cancel":a={kind:"cancelFury",runId:X(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:X(o,"Fury run id")};break;case"fury:step":a=uk(o);break;case"fury:reviews":a=dk(o);break;case"fury:review":a=pk(o);break;case"task:logs":a={kind:"streamTaskLogs",taskId:X(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:X(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:X(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:X(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:X(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:Gs(o,0,"Task id"),repoId:Gs(o,1,"Repo id")},Hs(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:X(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw S(`Unsupported command: ${t.join(" ")}`)}return Ld(a,n)}function qd(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 Yw(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",renameTask:"task.rename",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",addTaskRepoTarget:"task.repo.add",listTaskLinks:"link.list",openFile:"file.open",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 ha(){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 file open <path> Open a readable file in the active Craig TUI (preview)"," craig task new --repo <repo-id> [--runner codex|cursor|claude|pi] <prompt>"," craig task new --workspace <workspace-id> [--runner codex|cursor|claude|pi] <prompt>"," craig task create-child [--parent <task-id>] [--repo <repo-id> | --workspace <workspace-id>] [--runner codex|cursor|claude|pi] [--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 rename <name> Rename the resolved task without changing its ID or worktree"," craig task show [<id>] Show task details; omit id to use resolved context"," craig task repo add <task-id> <repo-id> Provision a repo target in an existing project task"," 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 contextual repo linkage only (does not provision a target)"," craig link list <task-id> List linked repos for a task"].join(`
7
- `)}function zw(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||!Md(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==="--"||Md(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 Jw(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 Xw(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 Qw(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=T.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 Zw(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=T.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 ek(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 ga=300*1e3,tk=new Set(["idle","working","ready","error"]),nk=new Set(["queued","delivering","delivered","failed","cancelled"]);function rk(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 sk(e){let t,n,r="when-ready",s=ga,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=wa(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 ik(e){let t=L(e[0]??"","Command id"),n,r=ga,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=ok(a):r=wa(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function ok(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!nk.has(n)))throw S(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function Fd(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 ak(e){let t,n,r,s=ga,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=fk(l):a==="--tab"?r=L(l,"Agent tab id"):s=wa(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 lk(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 ck(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 uk(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw S("fury step requires complete or fail.");let n=ya(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 dk(e){if(e[0]!=="list")throw S("fury reviews requires list.");let t=ya(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 pk(e){let t=e[0],n=L(e[1]??"","Fury review id");if(t==="show")return Hs(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=ya(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 ya(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 fk(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!tk.has(n)))throw S(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function wa(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 Ld(e,t){return{mode:"command",command:e,commandName:Yw(e),options:t}}function Md(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function Er(e,t){Hs(e,0,t)}function Hs(e,t,n){if(e.length!==t)throw S(`Command ${n} received an unexpected number of arguments.`)}function X(e,t){if(e.length!==1)throw S(`${t} is required and must be provided once.`);return L(e[0],t)}function ma(e,t){return L(e.join(" "),t)}function Gs(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 Pw=Object.defineProperty;var xs=(e,t)=>{for(var n in t)Pw(e,n,{get:t[n],enumerable:!0})};import{realpath as XE}from"node:fs/promises";import ke from"node:path";function Ae(e){let t=ke.join(e,".craig");return{workspaceRoot:e,repoRoot:e,craigDir:t,indexFile:ke.join(t,"index.json"),reposDir:ke.join(t,"repos"),workspacesDir:ke.join(t,"workspaces"),runtimeDir:ke.join(t,"runtime"),uiStateFile:ke.join(t,"runtime","ui-state.json"),tasksDir:ke.join(t,"tasks"),jobsDir:ke.join(t,"jobs"),commandsDir:ke.join(t,"commands"),eventsDir:ke.join(t,"events"),orchestrationDir:ke.join(t,"orchestration"),logsDir:ke.join(t,"logs"),logFile:ke.join(t,"logs","craig.jsonl"),artifactsDir:ke.join(t,"artifacts"),worktreesDir:ke.join(t,"worktrees"),configFile:ke.join(t,"config.json")}}import iu from"node:path";import{readFile as LI}from"node:fs/promises";import{readFile as $w}from"node:fs/promises";import{randomUUID as Sw}from"node:crypto";import{chmod as Iw,open as vw,readFile as Cw,rename as Aw,rm as Ew}from"node:fs/promises";import la from"node:path";async function q(e,t,n={}){let r=la.dirname(e),s=la.join(r,`.${la.basename(e)}.${process.pid}.${Date.now()}.${Sw()}.tmp`),i=await vw(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 Aw(s,e),n.mode!==void 0&&await Iw(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await Ew(s,{force:!0}).catch(()=>{}),o}}async function Ls(e){try{let t=await Cw(e,"utf8");return JSON.parse(t)}catch(t){if(Ow(t))return null;throw t}}function Ow(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}async function qn(e){try{let t=await $w(e.uiStateFile,"utf8"),n=JSON.parse(t);return Nw(n,e.uiStateFile)}catch(t){if(_w(t))return null;throw t}}async function Vt(e,t){await q(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function Ms(){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 Nw(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")||!jn(e,"inputMode")||!jn(e,"focusedRegion")||!jn(e,"activeTab")||!jn(e,"inspectorSection")||!jn(e,"inspectionMode")||!Fs(e,"openInspectionKind")||!Fs(e,"selectedFileTreePath")||!Fs(e,"selectedFilePath")||!Fs(e,"selectedDiffPath")||!Dw(e,"collapsedFileTreePaths")||!jn(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 jn(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function Fs(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function Dw(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function _w(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var ca={};xs(ca,{RUNNER_IDS:()=>ue,STABLE_RUNNER_IDS:()=>mt,assertEnabled:()=>bd,buildCommand:()=>Sd,getConfiguredProfile:()=>js,getDefault:()=>Td,getDisplayName:()=>Pd,getEnabled:()=>qs,getProfile:()=>Un,isRunnerType:()=>Us,parse:()=>Rd,setRunnerEnabled:()=>Id,setRunnerPath:()=>vd});var mt=["codex","cursor","claude"],ue=[...mt,"pi"];var kd={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"},pi:{id:"pi",displayName:"Pi",executable:"pi",defaultAgentTitle:"Pi"}};var Un=e=>kd[e];var js=(e,t={})=>{let n=Un(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}};var qs=(e={})=>ue.filter(t=>t!=="pi"||e.previews?.piRunner===!0).filter(t=>e.runners?.[t]?.enabled!==!1);var Td=(e={})=>{let t=qs(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 bd=(e,t={})=>{if(e==="pi"&&t.previews?.piRunner!==!0)throw new Error('Runner "pi" is experimental. Enable the piRunner feature preview in .craig/config.json.');if(t.runners?.[e]?.enabled===!1)throw new Error(`Runner "${e}" is disabled in .craig/config.json.`)};var Us=e=>ue.includes(e);var Rd=e=>{if(!e||e.length===0)return"codex";if(!Us(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${ue.join(", ")}.`);return e};var Pd=e=>Un(e).displayName;var Sd=(e,t,n={})=>{let r=[js(e,n).executable];return t&&t.length>0&&r.push(t),r};var Id=(e,t,n)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}});var vd=(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 ua={};xs(ua,{PREVIEW_FEATURE_IDS:()=>Xe,isEnabled:()=>Cd,setEnabled:()=>Ad});var Xe=["agentOrchestration","piRunner","fileOpen"];function Cd(e,t){return e.previews?.[t]===!0}function Ad(e,t,n){return{...e,previews:{...e.previews,[t]:n}}}import{mkdir as xw,readFile as Lw,writeFile as Fw}from"node:fs/promises";import Mw from"node:path";var jw=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Ed=async e=>{try{return await Lw(e,"utf8")}catch(t){if(jw(t))return null;throw t}},Od=async(e,t)=>{await xw(Mw.dirname(e),{recursive:!0}),await Fw(e,t,"utf8")};var qw=["incrementalCenterPane","agentActivityIndicators"],Ws=(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(!ue.includes(r))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" is not supported. Expected one of: ${ue.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(!qw.includes(r)&&!Xe.includes(r))throw new Error(`Craig config at ${t} is invalid. "previews.${r}" is not supported. Expected one of: ${Xe.join(", ")}.`);if(typeof s!="boolean")throw new Error(`Craig config at ${t} is invalid. "previews.${r}" must be a boolean.`)}}return n};var da=async(e,t={readConfigFile:Ed})=>{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 Ws(r,e.configFile)};var pa=async(e,t,n={writeConfigFile:Od})=>{Ws(t,e.configFile),await n.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
4
+ `)};var fa={};xs(fa,{checkForUpdate:()=>$d,getCurrent:()=>Bs});var Bs=()=>{try{return"0.17.3"}catch{return"unknown"}};var Uw="https://registry.npmjs.org/craig-cli/latest",Ww=3600*1e3,Bw={value:null},Vw=(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},$d=async(e={fetch:globalThis.fetch,getCurrent:Bs,cache:Bw})=>{let t=e.getCurrent(),n=Date.now();if(e.cache.value&&n-e.cache.value.cachedAt<Ww)return e.cache.value.result;let r=null;try{let i=await e.fetch(Uw,{signal:AbortSignal.timeout(5e3)});i.ok&&(r=(await i.json()).version??null)}catch{}let s={current:t,latest:r,updateAvailable:r!==null&&r!==t&&Vw(r,t)};return e.cache.value={result:s,cachedAt:n},s};var T={load:da,save:pa,previews:ua,runners:ca,version:fa};var Nd={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=Nd[t],this.retryable=r.retryable??!1,this.details=r.details??{}}};function ma(e){return e instanceof g?e:new g("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as Kw,mkdir as Gw,readFile as Hw}from"node:fs/promises";import Yw from"node:path";var Dd=80,Vs=async(e,t)=>{await Gw(Yw.dirname(e.logFile),{recursive:!0});let n={timestamp:new Date().toISOString(),...t};await Kw(e.logFile,`${JSON.stringify(n)}
5
+ `,"utf8")},_d=async(e,t)=>{try{await Vs(e,t)}catch{}},Ks=async(e,t=Dd)=>{try{let s=(await Hw(e.logFile,"utf8")).trimEnd().split(`
6
+ `).filter(i=>i.length>0).map(zw);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(Xw(n))return{path:e.logFile,lines:[],empty:!0};throw n}},ha=async(e,t)=>Vs(e,{level:"error",component:"application",event:Jw(t.context),message:t.message,...t.details?{details:t.details}:{}}),xd=async(e,t)=>{try{await ha(e,t)}catch{}},Ld=Ks,Fd=async(e,t=Dd)=>Ks(e,t);function zw(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 Jw(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function Xw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var de={appendErrorLog:ha,appendErrorLogBestEffort:xd,appendLog:Vs,appendLogBestEffort:_d,readLog:Ks,readErrorLog:Ld,readRecentErrorLines:Fd};function Ud(e){let{commandTokens:t,options:n,help:r}=Zw(e);if(r)return jd({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":Er(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:ga(o,"Repo path")};break;case"repo:list":Er(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:X(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:ga(o,"Workspace path")};break;case"workspace:list":a=ek(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:X(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:X(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:X(o,"Workspace id")};break;case"file:open":a={kind:"openFile",path:X(o,"File path")};break;case"task:new":a=nk(o);break;case"task:create-child":a=rk(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:X(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:X(o,"Task id")}};break;case"task:list":a=tk(o);break;case"task:current":Er(o,"task current"),a={kind:"currentTask"};break;case"task:rename":a={kind:"renameTask",title:ga(o,"Task title")};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:X(o,"Task id")};break;case"task:pr":a=sk(o);break;case"task:repo":if(o[0]!=="add")throw S(`Unsupported task repo command: ${o.join(" ")}`);Hs(o,3,"task repo add"),a={kind:"addTaskRepoTarget",taskId:Gs(o,1,"Task id"),repoId:Gs(o,2,"Repo id")};break;case"task:wait":a=dk(o);break;case"agent:list":Er(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=ak(o);break;case"agent:send":a=lk(o);break;case"command:show":a={kind:"showPromptCommand",commandId:X(o,"Command id")};break;case"command:list":Er(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:X(o,"Command id")};break;case"command:wait":a=ck(o);break;case"events:list":a=Md(o,!1);break;case"events:watch":a=Md(o,!0);break;case"fury:validate":a={kind:"validateFury",file:X(o,"Fury file")};break;case"fury:plan":a=pk(o);break;case"fury:approve":a={kind:"approveFury",planId:X(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:X(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:X(o,"Fury run id")};break;case"fury:watch":a=fk(o);break;case"fury:cancel":a={kind:"cancelFury",runId:X(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:X(o,"Fury run id")};break;case"fury:step":a=mk(o);break;case"fury:reviews":a=hk(o);break;case"fury:review":a=gk(o);break;case"task:logs":a={kind:"streamTaskLogs",taskId:X(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:X(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:X(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:X(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:X(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:Gs(o,0,"Task id"),repoId:Gs(o,1,"Repo id")},Hs(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:X(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw S(`Unsupported command: ${t.join(" ")}`)}return jd(a,n)}function Wd(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 Qw(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",renameTask:"task.rename",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",addTaskRepoTarget:"task.repo.add",listTaskLinks:"link.list",openFile:"file.open",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 ya(){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 file open <path> Open a readable file in the active Craig TUI (preview)"," craig task new --repo <repo-id> [--runner codex|cursor|claude|pi] <prompt>"," craig task new --workspace <workspace-id> [--runner codex|cursor|claude|pi] <prompt>"," craig task create-child [--parent <task-id>] [--repo <repo-id> | --workspace <workspace-id>] [--runner codex|cursor|claude|pi] [--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 rename <name> Rename the resolved task without changing its ID or worktree"," craig task show [<id>] Show task details; omit id to use resolved context"," craig task repo add <task-id> <repo-id> Provision a repo target in an existing project task"," 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 contextual repo linkage only (does not provision a target)"," craig link list <task-id> List linked repos for a task"].join(`
7
+ `)}function Zw(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||!qd(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==="--"||qd(c))throw S(`Global option ${l} requires a value.`);a+=1,l==="--workspace-root"?r.workspaceRoot=F(c,"Workspace root"):r.taskId=F(c,"Task id")}return{commandTokens:n,options:r,help:i}}function ek(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 tk(e){if(e.length===0)return{kind:"listTasks"};if(e.length===2&&e[0]==="--repo")return{kind:"listTasks",repoId:F(e[1],"Repo id")};throw S(`Unsupported command: task list ${e.join(" ")}`)}function nk(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=F(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw S("Task option --workspace may only be provided once.");n=F(c,"Workspace id")}else{if(r!==void 0)throw S("Task option --runner may only be provided once.");try{r=T.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=F(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function rk(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=F(d,"Parent task id")}else if(c==="--repo"){if(n)throw S("Task option --repo may only be provided once.");n=F(d,"Repo id")}else if(c==="--workspace"){if(r)throw S("Task option --workspace may only be provided once.");r=F(d,"Workspace id")}else if(c==="--runner"){if(s)throw S("Task option --runner may only be provided once.");try{s=T.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=F(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:F(o.join(" "),"Child task prompt"),...s?{runner:s}:{},...i?{idempotencyKey:i}:{}}}function sk(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=F(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=F(c,"Repo id")}else{if(i!==void 0)throw S("Task PR option --pr may only be provided once.");i=F(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 wa=300*1e3,ik=new Set(["idle","working","ready","error"]),ok=new Set(["queued","delivering","delivered","failed","cancelled"]);function ak(e){if(e.length===0)return{kind:"showAgentStatus"};if(e.length===2&&e[0]==="--tab")return{kind:"showAgentStatus",tabId:F(e[1],"Agent tab id")};throw S(`Unsupported command: agent status ${e.join(" ")}`)}function lk(e){let t,n,r="when-ready",s=wa,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:F(c,"Prompt")}:{source:"file",path:F(c,"Prompt file")}}else if(l==="--tab")n=F(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=Ta(c):i=F(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 ck(e){let t=F(e[0]??"","Command id"),n,r=wa,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=uk(a):r=Ta(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function uk(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!ok.has(n)))throw S(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function Md(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=F(c,"Event type glob");else if(l==="--after")r=F(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 dk(e){let t,n,r,s=wa,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=F(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=yk(l):a==="--tab"?r=F(l,"Agent tab id"):s=Ta(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 pk(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=F(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=F(o,"Root task id");continue}let a=o.indexOf("=");if(a<1)throw S(`Invalid fury input "${o}". Use key=value.`);let l=F(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 fk(e){let t=F(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=F(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 mk(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw S("fury step requires complete or fail.");let n=ka(e.slice(1),["--run","--step","--output","--output-file","--stdin","--reason"]),r=F(n.get("--run")??"","Fury run id"),s=F(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:F(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 hk(e){if(e[0]!=="list")throw S("fury reviews requires list.");let t=ka(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 gk(e){let t=e[0],n=F(e[1]??"","Fury review id");if(t==="show")return Hs(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=ka(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 ka(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,F(i,s))}return n}function yk(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!ik.has(n)))throw S(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function Ta(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 jd(e,t){return{mode:"command",command:e,commandName:Qw(e),options:t}}function qd(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function Er(e,t){Hs(e,0,t)}function Hs(e,t,n){if(e.length!==t)throw S(`Command ${n} received an unexpected number of arguments.`)}function X(e,t){if(e.length!==1)throw S(`${t} is required and must be provided once.`);return F(e[0],t)}function ga(e,t){return F(e.join(" "),t)}function Gs(e,t,n){return F(e[t]??"",n)}function F(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}
8
8
 
9
- ${ha()}`,{})}var Ue=(e,t)=>{let n=ka(e);if(!hk(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},ka=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:Ta(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:wk(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:gk(t.repoTargets),runnerSession:t.runnerSession??mk(t),checks:Ik(t),lastCommit:t.lastCommit??null,prs:vk(t),artifacts:Ok(t),cleanup:$k(t)}},mk=e=>{if(typeof e.title!="string")return null;let t=Ta(e.runner);return{command:T.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},hk=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"&&T.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"&&Wd(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||yk(t.repoTargets))&&Tk(t.runnerSession)&&bk(t.prompt)&&Bd(t.checks)&&Vd(t.lastCommit)&&Pk(t.prs)&&Sk(t.artifacts)&&Gd(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},gk=e=>{if(Array.isArray(e))return e.filter(Ud)},yk=e=>Array.isArray(e)&&e.every(Ud),Ud=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)&&Bd(t.checks)&&Vd(t.lastCommit)&&Kd(t.pullRequest)&&Gd(t.cleanup)},wk=e=>{if(Wd(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 kk(e.id,e.title,t,Ta(e.runner))},kk=(e,t,n,r)=>{let s=T.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",title:s.defaultAgentTitle,command:T.runners.buildCommand(r),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},Ta=e=>e&&T.runners.isRunnerType(e)?e:"codex",Wd=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"),Tk=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),bk=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",Bd=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",Kd=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&Rk(e.requiredChecks),Rk=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)),Pk=e=>Array.isArray(e)&&e.every(Kd),Sk=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),Gd=e=>typeof e=="object"&&e!==null&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),Ik=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},vk=e=>{if(Array.isArray(e.prs))return e.prs.map(Ck);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:Hd(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:Yd(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},Ck=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:Hd(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:Ak(t.reviewDecision),requiredChecks:Yd(t.requiredChecks),comments:Ek(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},Hd=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,Ak=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Ek=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}]}):[],Yd=e=>Array.isArray(e)?e.map(t=>({...t,status:t.status==="pending"||t.status==="success"||t.status==="failed"||t.status==="skipped"||t.status==="unknown"?t.status:"unknown",conclusion:t.conclusion??null})):[],Ok=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},$k=e=>{let t=e.cleanup;return{worktreeRemovedAt:t?.worktreeRemovedAt??null,preservedWorktree:t?.preservedWorktree??!1,warning:t?.warning??null}};import{readFile as hT}from"node:fs/promises";import{readFile as Nk,readdir as Dk,rm as _k}from"node:fs/promises";import zd from"node:path";var ba=(e,t)=>zd.join(e.workspacesDir,`${t}.json`),xk=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"):[]}},Jd=(e,t)=>{let n=xk(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},yn=async(e,t)=>{let n=ba(e,t);try{let r=await Nk(n,"utf8");return Jd(JSON.parse(r),n)}catch(r){throw Fk(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}},wn=async(e,t)=>{await q(ba(e,t.id),{...t,updatedAt:new Date().toISOString()})},Ie=async e=>{let t=await Dk(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>yn(e,zd.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},Xd=async(e,t)=>{await _k(ba(e,t),{force:!0})},Fk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as Lk,readdir as Mk,rm as jk}from"node:fs/promises";import Qd from"node:path";var Ra=(e,t)=>Qd.join(e.reposDir,`${t}.json`),Zd=(e,t)=>{if(typeof e!="object"||e===null||typeof e.id!="string"||typeof e.name!="string"||typeof e.rootPath!="string"||typeof e.defaultBranch!="string"||typeof e.createdAt!="string"||typeof e.updatedAt!="string")throw new Error(`Craig repo record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return e},De=async(e,t)=>{let n=Ra(e,t);try{let r=await Lk(n,"utf8");return Zd(JSON.parse(r),n)}catch(r){throw qk(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}},Pa=async(e,t)=>{await q(Ra(e,t.id),{...t,updatedAt:new Date().toISOString()})},Or=async e=>{let t=await Mk(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>De(e,Qd.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},ep=async(e,t)=>{await jk(Ra(e,t),{force:!0})},qk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as Uk}from"node:fs/promises";var Wk=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return t.version===2&&typeof t.workspaceRoot=="string"&&Array.isArray(t.repoIds)&&t.repoIds.every(n=>typeof n=="string")&&Array.isArray(t.workspaceIds)&&t.workspaceIds.every(n=>typeof n=="string")&&Array.isArray(t.taskIds)&&t.taskIds.every(n=>typeof n=="string")&&Array.isArray(t.jobIds)&&t.jobIds.every(n=>typeof n=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Wn=(e,t,n)=>{if(!Wk(e))throw new Error(`Craig index at ${n} is invalid. Remove or repair the file before rerunning Craig.`);if(e.workspaceRoot!==t)throw new Error(`Craig index at ${n} belongs to ${e.workspaceRoot}, not ${t}. Remove or repair the file before rerunning Craig.`);return e},Ee=async e=>{let t=await Uk(e.indexFile,"utf8");return Wn(JSON.parse(t),e.workspaceRoot,e.indexFile)},It=async(e,t)=>{await q(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as Hk,stat as Yk}from"node:fs/promises";import Vn from"node:path";import{realpath as rp}from"node:fs/promises";import Ys from"node:path";import{execFile as Bk}from"node:child_process";import{promisify as Vk}from"node:util";var tp=Vk(Bk);async function G(e,t,n={}){try{let r=await tp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(np(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function z(e,t,n={}){try{let r=await tp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(np(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function np(e){return e instanceof Error}var Sa=async e=>{try{let n=(await G("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([rp(n).catch(()=>Ys.resolve(n)),rp(e).catch(()=>Ys.resolve(e))]);return r===s}catch{return!1}},Ia=async e=>{let t=await z("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 z("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await G("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},sp=async e=>{let t=await z("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=Ys.resolve(e,n);return Ys.dirname(r)};import{mkdir as We,readFile as Kk}from"node:fs/promises";var Gk=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Bn=async e=>{let t=Ae(e);await We(t.craigDir,{recursive:!0}),await Promise.all([We(t.reposDir,{recursive:!0}),We(t.workspacesDir,{recursive:!0}),We(t.runtimeDir,{recursive:!0}),We(t.tasksDir,{recursive:!0}),We(t.jobsDir,{recursive:!0}),We(t.commandsDir,{recursive:!0}),We(t.eventsDir,{recursive:!0}),We(t.orchestrationDir,{recursive:!0}),We(t.logsDir,{recursive:!0}),We(t.artifactsDir,{recursive:!0}),We(t.worktreesDir,{recursive:!0})]);try{let s=await Kk(t.indexFile,"utf8"),i=JSON.parse(s);return Wn(i,e,t.indexFile)}catch(s){if(!Gk(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 ip=(e,t,n)=>{let r=new Date().toISOString();return{id:zk(e,Vn.basename(t)),name:Vn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},op=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},zk=(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},Jk=(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},ap=async(e,t)=>{let n=await Ee(e);await It(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},Xk=async(e,t)=>{let n=await Hk(t,{withFileTypes:!0}),r=await Or(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Vn.join(t,i.name);if(!await Sa(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await Ia(o);s.push(a?op(a,l):ip([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},Qk=async(e,t)=>{let n=await Ia(t),r=await Or(e),s=r.find(u=>u.rootPath===t)??null,i=s?op(s,n):ip(r,t,n),o=`workspace_${i.id}`,l=(await Ie(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 Pa(e,i),l||await wn(e,d),await ap(e,{repoIds:[i.id],workspaceIds:[d.id]}),{kind:"createWorkspace",workspace:d,repos:[i],created:!l}},Zk=async(e,t)=>{let n=await Xk(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await Ie(e),s=Jk(r,Vn.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:Vn.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=>Pa(e,c))),await wn(e,l),await ap(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},$r=async(e,t)=>{await Bn(e.workspaceRoot);let n=Vn.resolve(e.workspaceRoot,t);if(!(await Yk(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await Sa(n)?Qk(e,n):Zk(e,n)};var va=async(e,t,n={listWorkspaceRecords:Ie,ensureCraigState:Bn})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var Ca=async(e,t,n={readWorkspace:yn,writeWorkspace:wn})=>{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 Aa=async(e,t)=>{let r={...await yn(e,t),status:"active",archivedAt:null};await wn(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 kn=async(e,t,n={deleteWorkspace:Xd,readCraigIndex:Ee,writeCraigIndex:It})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var Ea=async(e,t,n)=>{let r=await yn(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 kn(e,t),{kind:"removeWorkspace",workspaceId:r.id,rootPath:r.rootPath??""}};import{readFile as eT,realpath as up,stat as tT}from"node:fs/promises";import zs from"node:path";async function Oa(e){let t=await pp(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return lp(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return lp(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await cp(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await sp(t);if(r){let s=await cp(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 lp(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await pp(zs.resolve(n,e),s),o=await dp(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 cp(e){let t=e;for(;;){let n=await dp(t);if(n)return n;let r=zs.dirname(t);if(r===t)return null;t=r}}async function dp(e){let t=Ae(e);try{let n=await eT(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Wn(r,s,t.indexFile);if(await up(i.workspaceRoot).catch(()=>zs.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(nT(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 pp(e,t){let n=zs.resolve(e);try{if(!(await tT(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await up(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 nT(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var $a={};xs($a,{addRepo:()=>fp,listRegisteredRepos:()=>mp,removeRepo:()=>hp});import rT from"node:path";import{stat as sT}from"node:fs/promises";var fp=async(e,t)=>{let n=rT.resolve(e.workspaceRoot,t);if(!(await sT(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await $r(e,t),i=s.repos[0];if(!i||s.workspace.kind==="project")throw new Error(`Repo path is not a git repository: ${n}`);return{kind:"createRepo",repo:i,workspaceId:s.workspace.id,created:s.created}};var mp=async(e,t={listRepos:Or,ensureCraigState:Bn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var hp=async(e,t,n)=>{let r=await De(e,t),i=(await Ie(e)).filter(c=>c.primaryRepoId===t),o=i.filter(c=>c.status==="active"),a=await n.listTasks(e,{repoId:t});if(o.length>0)throw new Error(`Cannot remove repo ${t} while active workspace records still reference it.`);if(a.tasks.length>0)throw new Error(`Cannot remove repo ${t} while task records still reference it.`);await Promise.all(i.map(c=>kn(e,c.id))),await ep(e,t);let l=await Ee(e);return await It(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var Te={addWorkspace:$r,listWorkspaces:va,archiveWorkspace:Ca,restoreWorkspace:Aa,removeWorkspace:Ea,removeWorkspaceRecord:kn,resolveContext:Oa,repos:$a};import{mkdir as gp,readFile as iT,rm as Xs,stat as oT,writeFile as aT}from"node:fs/promises";import Js from"node:path";var lT=25,cT=3e4,uT=5e3;async function Qe(e,t,n){let r=Js.join(e.runtimeDir,"task-locks"),s=Js.join(r,`${t}.lock`);await gp(r,{recursive:!0});let i=Date.now();for(;;)try{await gp(s);try{await aT(Js.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await Xs(s,{recursive:!0,force:!0}),o}break}catch(o){if(!fT(o))throw o;if(await dT(s))continue;if(Date.now()-i>=cT)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await mT(lT)}try{return await n()}finally{await Xs(s,{recursive:!0,force:!0})}}async function dT(e){let t=await iT(Js.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return pT(t.pid)?!1:(await Xs(e,{recursive:!0,force:!0}),!0);let n=await oT(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<uT?!1:(await Xs(e,{recursive:!0,force:!0}),!0)}function pT(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 fT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",mT=e=>new Promise(t=>setTimeout(t,e));var vt=async(e,t)=>{let n=await hT(Qs(e,t),"utf8");return JSON.parse(n)},Nr=async(e,t)=>{let n=await vt(e,t);return Ue(n,Qs(e,t))},Ze=async(e,t)=>{let n=yp(t);await q(Qs(e,t.id),n)},V=async(e,t,n)=>Qe(e,t,async()=>{let r=await Nr(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=yp(s);return await q(Qs(e,t),i),i}),Na=async(e,t)=>{let n=await Ee(e);n.taskIds.includes(t)||await It(e,{...n,taskIds:[...n.taskIds,t]})},Qs=(e,t)=>`${e.tasksDir}/${t}.json`,yp=e=>({...e,updatedAt:new Date().toISOString()});var K=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Kt=e=>e.status==="merged"||e.status==="closed",Ct=(e,t)=>{let n=e.prs.findIndex(s=>Kn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},Kn=(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(),Tn=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return ei(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},ei=e=>e.mergeable&&!gT(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),gT=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Da=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),At=(e,t,n)=>{let r=e.isDraft??!1,s=yT(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:wT(e.reviewDecision??null),requiredChecks:_a(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:RT(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}},yT=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,wT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,_a=e=>{let t=e.map(r=>kT(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||TT(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},kT=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:kp(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:bT(t)}:null},TT=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):Zs(e)&&!Zs(t)?!0:!Zs(e)&&Zs(t)?!1:wp(t.status)>=wp(e.status),Zs=e=>e.conclusion?.toUpperCase()==="CANCELLED",wp=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},bT=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},RT=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(PT).filter(n=>n!==null).slice(-4):[]},PT=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=ST(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},ST=e=>e.replace(/\s+/g," ").trim(),kp=(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?kp(r,r):"unknown"};var Be=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as IT}from"node:fs/promises";import Tp from"node:path";var F=async(e,t,n={readRawTask:vt,validateTaskRecord:Ue})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw OT(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):$T(r)?new g("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},he=async e=>{if(!await xa(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Gn=(e,t)=>t.artifacts.logPath?Tp.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:Tp.join(e.workspaceRoot,t.artifacts.logPath):null,Dr=async(e,t)=>{let n=await xa(t.worktreePath),r=Gn(e,t),s=r?await xa(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:vT(t),lastCommitSummary:CT(t),prSummary:AT(t),cleanupSummary:ET(t)}},xa=async e=>{try{return await IT(e),!0}catch{return!1}},vT=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}`},CT=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",AT=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
+ ${ya()}`,{})}var Ue=(e,t)=>{let n=ba(e);if(!kk(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},ba=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:Ra(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:Rk(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:Tk(t.repoTargets),runnerSession:t.runnerSession??wk(t),checks:Ek(t),lastCommit:t.lastCommit??null,prs:Ok(t),artifacts:_k(t),cleanup:xk(t)}},wk=e=>{if(typeof e.title!="string")return null;let t=Ra(e.runner);return{command:T.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},kk=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"&&T.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"&&Vd(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||bk(t.repoTargets))&&Sk(t.runnerSession)&&Ik(t.prompt)&&Kd(t.checks)&&Gd(t.lastCommit)&&Ck(t.prs)&&Ak(t.artifacts)&&Yd(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Tk=e=>{if(Array.isArray(e))return e.filter(Bd)},bk=e=>Array.isArray(e)&&e.every(Bd),Bd=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)&&Kd(t.checks)&&Gd(t.lastCommit)&&Hd(t.pullRequest)&&Yd(t.cleanup)},Rk=e=>{if(Vd(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 Pk(e.id,e.title,t,Ra(e.runner))},Pk=(e,t,n,r)=>{let s=T.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",title:s.defaultAgentTitle,command:T.runners.buildCommand(r),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},Ra=e=>e&&T.runners.isRunnerType(e)?e:"codex",Vd=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"),Sk=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),Ik=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",Kd=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"),Gd=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",Hd=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&vk(e.requiredChecks),vk=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)),Ck=e=>Array.isArray(e)&&e.every(Hd),Ak=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),Yd=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:[]},Ok=e=>{if(Array.isArray(e.prs))return e.prs.map($k);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:zd(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:Jd(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},$k=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:zd(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:Nk(t.reviewDecision),requiredChecks:Jd(t.requiredChecks),comments:Dk(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},zd=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,Nk=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Dk=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}]}):[],Jd=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})):[],_k=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},xk=e=>{let t=e.cleanup;return{worktreeRemovedAt:t?.worktreeRemovedAt??null,preservedWorktree:t?.preservedWorktree??!1,warning:t?.warning??null}};import{readFile as kT}from"node:fs/promises";import{readFile as Lk,readdir as Fk,rm as Mk}from"node:fs/promises";import Xd from"node:path";var Pa=(e,t)=>Xd.join(e.workspacesDir,`${t}.json`),jk=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"):[]}},Qd=(e,t)=>{let n=jk(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},yn=async(e,t)=>{let n=Pa(e,t);try{let r=await Lk(n,"utf8");return Qd(JSON.parse(r),n)}catch(r){throw qk(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}},wn=async(e,t)=>{await q(Pa(e,t.id),{...t,updatedAt:new Date().toISOString()})},Ie=async e=>{let t=await Fk(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>yn(e,Xd.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},Zd=async(e,t)=>{await Mk(Pa(e,t),{force:!0})},qk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as Uk,readdir as Wk,rm as Bk}from"node:fs/promises";import ep from"node:path";var Sa=(e,t)=>ep.join(e.reposDir,`${t}.json`),tp=(e,t)=>{if(typeof e!="object"||e===null||typeof e.id!="string"||typeof e.name!="string"||typeof e.rootPath!="string"||typeof e.defaultBranch!="string"||typeof e.createdAt!="string"||typeof e.updatedAt!="string")throw new Error(`Craig repo record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return e},De=async(e,t)=>{let n=Sa(e,t);try{let r=await Uk(n,"utf8");return tp(JSON.parse(r),n)}catch(r){throw Vk(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}},Ia=async(e,t)=>{await q(Sa(e,t.id),{...t,updatedAt:new Date().toISOString()})},Or=async e=>{let t=await Wk(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>De(e,ep.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},np=async(e,t)=>{await Bk(Sa(e,t),{force:!0})},Vk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as Kk}from"node:fs/promises";var Gk=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"},Wn=(e,t,n)=>{if(!Gk(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},Ee=async e=>{let t=await Kk(e.indexFile,"utf8");return Wn(JSON.parse(t),e.workspaceRoot,e.indexFile)},It=async(e,t)=>{await q(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as Xk,stat as Qk}from"node:fs/promises";import Vn from"node:path";import{realpath as ip}from"node:fs/promises";import Ys from"node:path";import{execFile as Hk}from"node:child_process";import{promisify as Yk}from"node:util";var rp=Yk(Hk);async function G(e,t,n={}){try{let r=await rp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(sp(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function z(e,t,n={}){try{let r=await rp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(sp(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function sp(e){return e instanceof Error}var va=async e=>{try{let n=(await G("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([ip(n).catch(()=>Ys.resolve(n)),ip(e).catch(()=>Ys.resolve(e))]);return r===s}catch{return!1}},Ca=async e=>{let t=await z("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 z("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await G("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},op=async e=>{let t=await z("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=Ys.resolve(e,n);return Ys.dirname(r)};import{mkdir as We,readFile as zk}from"node:fs/promises";var Jk=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Bn=async e=>{let t=Ae(e);await We(t.craigDir,{recursive:!0}),await Promise.all([We(t.reposDir,{recursive:!0}),We(t.workspacesDir,{recursive:!0}),We(t.runtimeDir,{recursive:!0}),We(t.tasksDir,{recursive:!0}),We(t.jobsDir,{recursive:!0}),We(t.commandsDir,{recursive:!0}),We(t.eventsDir,{recursive:!0}),We(t.orchestrationDir,{recursive:!0}),We(t.logsDir,{recursive:!0}),We(t.artifactsDir,{recursive:!0}),We(t.worktreesDir,{recursive:!0})]);try{let s=await zk(t.indexFile,"utf8"),i=JSON.parse(s);return Wn(i,e,t.indexFile)}catch(s){if(!Jk(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 ap=(e,t,n)=>{let r=new Date().toISOString();return{id:Zk(e,Vn.basename(t)),name:Vn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},lp=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},Zk=(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},eT=(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},cp=async(e,t)=>{let n=await Ee(e);await It(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},tT=async(e,t)=>{let n=await Xk(t,{withFileTypes:!0}),r=await Or(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Vn.join(t,i.name);if(!await va(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await Ca(o);s.push(a?lp(a,l):ap([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},nT=async(e,t)=>{let n=await Ca(t),r=await Or(e),s=r.find(u=>u.rootPath===t)??null,i=s?lp(s,n):ap(r,t,n),o=`workspace_${i.id}`,l=(await Ie(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 Ia(e,i),l||await wn(e,d),await cp(e,{repoIds:[i.id],workspaceIds:[d.id]}),{kind:"createWorkspace",workspace:d,repos:[i],created:!l}},rT=async(e,t)=>{let n=await tT(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await Ie(e),s=eT(r,Vn.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:Vn.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=>Ia(e,c))),await wn(e,l),await cp(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},$r=async(e,t)=>{await Bn(e.workspaceRoot);let n=Vn.resolve(e.workspaceRoot,t);if(!(await Qk(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await va(n)?nT(e,n):rT(e,n)};var Aa=async(e,t,n={listWorkspaceRecords:Ie,ensureCraigState:Bn})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var Ea=async(e,t,n={readWorkspace:yn,writeWorkspace:wn})=>{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 Oa=async(e,t)=>{let r={...await yn(e,t),status:"active",archivedAt:null};await wn(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 kn=async(e,t,n={deleteWorkspace:Zd,readCraigIndex:Ee,writeCraigIndex:It})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var $a=async(e,t,n)=>{let r=await yn(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 kn(e,t),{kind:"removeWorkspace",workspaceId:r.id,rootPath:r.rootPath??""}};import{readFile as sT,realpath as pp,stat as iT}from"node:fs/promises";import zs from"node:path";async function Na(e){let t=await mp(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return up(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return up(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await dp(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await op(t);if(r){let s=await dp(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 up(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await mp(zs.resolve(n,e),s),o=await fp(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 dp(e){let t=e;for(;;){let n=await fp(t);if(n)return n;let r=zs.dirname(t);if(r===t)return null;t=r}}async function fp(e){let t=Ae(e);try{let n=await sT(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Wn(r,s,t.indexFile);if(await pp(i.workspaceRoot).catch(()=>zs.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(oT(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 mp(e,t){let n=zs.resolve(e);try{if(!(await iT(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await pp(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 oT(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var Da={};xs(Da,{addRepo:()=>hp,listRegisteredRepos:()=>gp,removeRepo:()=>yp});import aT from"node:path";import{stat as lT}from"node:fs/promises";var hp=async(e,t)=>{let n=aT.resolve(e.workspaceRoot,t);if(!(await lT(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await $r(e,t),i=s.repos[0];if(!i||s.workspace.kind==="project")throw new Error(`Repo path is not a git repository: ${n}`);return{kind:"createRepo",repo:i,workspaceId:s.workspace.id,created:s.created}};var gp=async(e,t={listRepos:Or,ensureCraigState:Bn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var yp=async(e,t,n)=>{let r=await De(e,t),i=(await Ie(e)).filter(c=>c.primaryRepoId===t),o=i.filter(c=>c.status==="active"),a=await n.listTasks(e,{repoId:t});if(o.length>0)throw new Error(`Cannot remove repo ${t} while active workspace records still reference it.`);if(a.tasks.length>0)throw new Error(`Cannot remove repo ${t} while task records still reference it.`);await Promise.all(i.map(c=>kn(e,c.id))),await np(e,t);let l=await Ee(e);return await It(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var Te={addWorkspace:$r,listWorkspaces:Aa,archiveWorkspace:Ea,restoreWorkspace:Oa,removeWorkspace:$a,removeWorkspaceRecord:kn,resolveContext:Na,repos:Da};import{mkdir as wp,readFile as cT,rm as Xs,stat as uT,writeFile as dT}from"node:fs/promises";import Js from"node:path";var pT=25,fT=3e4,mT=5e3;async function Qe(e,t,n){let r=Js.join(e.runtimeDir,"task-locks"),s=Js.join(r,`${t}.lock`);await wp(r,{recursive:!0});let i=Date.now();for(;;)try{await wp(s);try{await dT(Js.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await Xs(s,{recursive:!0,force:!0}),o}break}catch(o){if(!yT(o))throw o;if(await hT(s))continue;if(Date.now()-i>=fT)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await wT(pT)}try{return await n()}finally{await Xs(s,{recursive:!0,force:!0})}}async function hT(e){let t=await cT(Js.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return gT(t.pid)?!1:(await Xs(e,{recursive:!0,force:!0}),!0);let n=await uT(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<mT?!1:(await Xs(e,{recursive:!0,force:!0}),!0)}function gT(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 yT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",wT=e=>new Promise(t=>setTimeout(t,e));var vt=async(e,t)=>{let n=await kT(Qs(e,t),"utf8");return JSON.parse(n)},Nr=async(e,t)=>{let n=await vt(e,t);return Ue(n,Qs(e,t))},Ze=async(e,t)=>{let n=kp(t);await q(Qs(e,t.id),n)},V=async(e,t,n)=>Qe(e,t,async()=>{let r=await Nr(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=kp(s);return await q(Qs(e,t),i),i}),_a=async(e,t)=>{let n=await Ee(e);n.taskIds.includes(t)||await It(e,{...n,taskIds:[...n.taskIds,t]})},Qs=(e,t)=>`${e.tasksDir}/${t}.json`,kp=e=>({...e,updatedAt:new Date().toISOString()});var K=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Kt=e=>e.status==="merged"||e.status==="closed",Ct=(e,t)=>{let n=e.prs.findIndex(s=>Kn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},Kn=(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(),Tn=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return ei(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},ei=e=>e.mergeable&&!TT(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),TT=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",xa=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),At=(e,t,n)=>{let r=e.isDraft??!1,s=bT(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:RT(e.reviewDecision??null),requiredChecks:La(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:vT(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}},bT=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,RT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,La=e=>{let t=e.map(r=>PT(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||ST(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},PT=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:bp(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:IT(t)}:null},ST=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):Zs(e)&&!Zs(t)?!0:!Zs(e)&&Zs(t)?!1:Tp(t.status)>=Tp(e.status),Zs=e=>e.conclusion?.toUpperCase()==="CANCELLED",Tp=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},IT=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},vT=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(CT).filter(n=>n!==null).slice(-4):[]},CT=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=AT(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},AT=e=>e.replace(/\s+/g," ").trim(),bp=(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?bp(r,r):"unknown"};var Be=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as ET}from"node:fs/promises";import Rp from"node:path";var L=async(e,t,n={readRawTask:vt,validateTaskRecord:Ue})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw _T(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):xT(r)?new g("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},he=async e=>{if(!await Fa(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Gn=(e,t)=>t.artifacts.logPath?Rp.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:Rp.join(e.workspaceRoot,t.artifacts.logPath):null,Dr=async(e,t)=>{let n=await Fa(t.worktreePath),r=Gn(e,t),s=r?await Fa(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:OT(t),lastCommitSummary:$T(t),prSummary:NT(t),cleanupSummary:DT(t)}},Fa=async e=>{try{return await ET(e),!0}catch{return!1}},OT=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}`},$T=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",NT=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=K(e);if(!t?.number||!t.url)return"not linked";let n=t.requiredChecks.length,r=n===1?"check":"checks";return`#${t.number} ${t.status??"unknown"} mergeable=${t.mergeable} mergeState=${t.mergeStateStatus??"unknown"} (${n} ${r})`},ET=e=>e.status!=="merged"?"not merged":e.cleanup.warning?`warning: ${e.cleanup.warning}`:e.cleanup.preservedWorktree?"preserved worktree":e.cleanup.worktreeRemovedAt?`worktree removed at ${e.cleanup.worktreeRemovedAt}`:"cleanup pending",OT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",$T=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var _r=async(e,t)=>{let n=await z("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.")},Fa=async(e,t,n,r="main")=>{let s=r.trim()||"main";if((await z("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 NT(e,s);await G("git",["worktree","add","-b",t,n,o],{cwd:e})},NT=async(e,t)=>(await z("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await z("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await z("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t,ti=async e=>{let t=await z("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},bp=async e=>{await G("git",["add","-A"],{cwd:e})},Rp=async(e,t)=>{await G("git",["commit","-m",t],{cwd:e})},Pp=async e=>{let t=await G("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}},Sp=async e=>{let t=await z("git",["branch","--show-current"],{cwd:e});if(t.exitCode!==0)return null;let n=t.stdout.trim();return n.length>0?n:null};var ni=async(e,t)=>{await G("git",["worktree","remove","--force",t],{cwd:e})},Ip=async(e,t)=>{await G("git",["branch","-D",t],{cwd:e})};var La=async e=>Hn(e,e.repoRoot),Hn=async(e,t)=>{let n=await Ee(e),r=vp(new Date),s=Cp(n.taskIds,r);for(;;){let i=`task_${r}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await _r(t,o))return i;s+=1}},xr=async e=>{let t=await Ee(e),n=vp(new Date),r=Cp(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`},vp=e=>{let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}${n}${r}`},Cp=(e,t)=>{let n=e.filter(r=>r.startsWith(`task_${t}_`)).map(r=>Number.parseInt(r.slice(-2),10)).filter(r=>Number.isInteger(r));return n.length===0?1:Math.max(...n)+1};var Fr=async(e,t,n={readRawTask:vt,validateTaskRecord:Ue})=>{let r=await Ee(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(DT(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}},DT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var Ap=["merge_ready","pr_open","checked","review","running","draft"],Ma=e=>[...e].sort((t,n)=>t.id.localeCompare(n.id)),ja=(e,t)=>t&&e.some(r=>r.id===t)?t:e.length===0?null:[...e].sort(_T)[0]?.id??null,_T=(e,t)=>{let n=Ep(e.status),r=Ep(t.status);return n!==r?n-r:t.updatedAt.localeCompare(e.updatedAt)},Ep=e=>{let t=Ap.indexOf(e);return t>=0?t:Ap.length};import Op from"node:path";var bn=(e,t)=>t?Op.isAbsolute(t)?t:Op.join(e.repoRoot,t):null;import{randomUUID as xT}from"node:crypto";import{mkdir as Mr,rm as FT,writeFile as ri}from"node:fs/promises";import H from"node:path";var Lr=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");var $p=["AGENTS","md"].join("."),Yn=async(e,t,n,r={})=>{let s=await De(e,t),[i,o]=await Promise.all([UT(e,s.id,r.workspaceId,r.allowLinkedProjectRepo??!1),Hn(e,s.rootPath)]),a=`craig/${o}`,l=H.join(e.worktreesDir,s.id,o),c=H.join(e.logsDir,`${o}.log`),d=H.join(e.artifactsDir,o);await Promise.all([Mr(H.dirname(l),{recursive:!0}),Mr(d,{recursive:!0}),ri(c,"","utf8")]);let u=LT(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 Ze(e,u),await Na(e,o),await Fa(s.rootPath,a,l,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,workspaceId:i.id,task:u}},jr=async(e,t,n,r={})=>{let s=(await Ie(e)).find(b=>b.id===t&&b.status==="active");if(!s)throw new Error(`Workspace ${t} does not exist or is archived.`);if(s.kind!=="project"){if(!s.primaryRepoId)throw new Error(`Workspace ${t} is not task-capable.`);let b=await Yn(e,s.primaryRepoId,n,r);return{...b,bundlePath:b.task.worktreePath,repoTargets:[]}}let i=s.discoveredRepoIds??[];if(i.length===0)throw new Error(`Project workspace ${t} has no discovered repos.`);let o=await xr(e),a=new Date().toISOString(),l=r.runner??"codex",c=`craig/${o}`,d=H.join(e.craigDir,"task-bundles",o),u=H.join(e.logsDir,`${o}.log`),p=H.join(e.artifactsDir,o);await Mr(d,{recursive:!0}),await Mr(p,{recursive:!0}),await ri(u,"","utf8");let h=await Promise.all(i.map(b=>De(e,b))),m=jT(h),f=await Promise.all(h.map(b=>MT(e,b,o,c,H.join(d,m.get(b.id))))),y=f.find(b=>b.status==="ready")??f[0];if(!f.some(b=>b.status==="ready"))throw await FT(d,{recursive:!0,force:!0}),new Error(`No project repo targets could be provisioned for ${t}: ${f.map(b=>`${b.repoId}: ${b.failureReason??"unknown error"}`).join("; ")}`);await Ua({taskId:o,workspaceId:t,prompt:n,repos:h,repoTargets:f,bundlePath:d});let k=qr(o,n,a,l,r.config??{}),R={id:o,title:n,slug:Lr(n),type:"project",status:"draft",runner:l,repoId:y.repoId,workspaceId:s.id,selectedPtyTabId:k[0]?.id??null,linkedRepoIds:i.filter(b=>b!==y.repoId),...Dp(o,r.lineage),repoRoot:d,worktreePath:d,branch:c,bundlePath:d,selectedRepoTargetId:y.repoId,repoTargets:f,ptyTabs:k,runnerSession:{command:T.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:H.relative(e.workspaceRoot,u),checkSummaryPath:H.relative(e.workspaceRoot,H.join(p,"check-summary.json")),prDraftPath:null,prStatusPath:H.relative(e.workspaceRoot,H.join(p,"pr-status.json"))},cleanup:si(),lastFailureReason:f.every(b=>b.status==="unavailable")?"No project repo targets could be provisioned.":null,createdAt:a,updatedAt:a};return await Ze(e,R),await Na(e,o),{repoId:y.repoId,repoRoot:d,workspaceId:s.id,task:R,bundlePath:d,repoTargets:f}},qr=(e,t,n,r="codex",s={})=>{let i=T.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",...s.previews?.agentOrchestration?{capabilityId:`capability_${xT()}`}:{},title:i.defaultAgentTitle,command:T.runners.buildCommand(r,void 0,s),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},LT=(e,t)=>{let n=new Date().toISOString(),r=qr(t.taskId,t.prompt,n,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:Lr(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,selectedPtyTabId:r[0]?.id??null,linkedRepoIds:[],...Dp(t.taskId,t.lineage),repoRoot:t.repoRoot,worktreePath:t.worktreePath,branch:t.branch,ptyTabs:r,runnerSession:{command:T.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:{...Wa(H.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:H.relative(e.workspaceRoot,H.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:H.relative(e.workspaceRoot,H.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:H.relative(e.workspaceRoot,H.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:si(),lastFailureReason:null,createdAt:n,updatedAt:n}},MT=async(e,t,n,r,s)=>{try{return await qa(e,t,r,s)}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:Wa(H.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Np(),cleanup:si()}}},qa=async(e,t,n,r)=>(await Mr(H.dirname(r),{recursive:!0}),await Fa(t.rootPath,n,r,t.defaultBranch),{repoId:t.id,branch:n,repoRoot:t.rootPath,worktreePath:r,status:"ready",failureReason:null,checks:Wa(H.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Np(),cleanup:si()}),jT=e=>{let t=new Set(["manifest.json",$p]),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},qT=e=>{let t=new Map(e.repos.map(r=>[r.id,r.name])),n=e.repoTargets.map(r=>{let s=t.get(r.repoId)??r.repoId,i=H.relative(e.bundlePath,r.worktreePath),o=r.status==="ready"?"ready":`unavailable: ${r.failureReason??"unknown error"}`;return`- \`${i}/\` - ${s} (${r.repoId}, ${o})`}).join(`
11
+ `)}`}let t=K(e);if(!t?.number||!t.url)return"not linked";let n=t.requiredChecks.length,r=n===1?"check":"checks";return`#${t.number} ${t.status??"unknown"} mergeable=${t.mergeable} mergeState=${t.mergeStateStatus??"unknown"} (${n} ${r})`},DT=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",_T=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",xT=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var _r=async(e,t)=>{let n=await z("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.")},Ma=async(e,t,n,r="main")=>{let s=r.trim()||"main";if((await z("git",["show-ref","--verify","--quiet",`refs/heads/${s}`],{cwd:e})).exitCode!==0)throw new Error(`Base branch '${s}' does not exist locally.`);let o=await LT(e,s);await G("git",["worktree","add","-b",t,n,o],{cwd:e})},LT=async(e,t)=>(await z("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await z("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await z("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t,ti=async e=>{let t=await z("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},Pp=async e=>{await G("git",["add","-A"],{cwd:e})},Sp=async(e,t)=>{await G("git",["commit","-m",t],{cwd:e})},Ip=async e=>{let t=await G("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}},vp=async e=>{let t=await z("git",["branch","--show-current"],{cwd:e});if(t.exitCode!==0)return null;let n=t.stdout.trim();return n.length>0?n:null};var ni=async(e,t)=>{await G("git",["worktree","remove","--force",t],{cwd:e})},Cp=async(e,t)=>{await G("git",["branch","-D",t],{cwd:e})};var ja=async e=>Hn(e,e.repoRoot),Hn=async(e,t)=>{let n=await Ee(e),r=Ap(new Date),s=Ep(n.taskIds,r);for(;;){let i=`task_${r}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await _r(t,o))return i;s+=1}},xr=async e=>{let t=await Ee(e),n=Ap(new Date),r=Ep(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`},Ap=e=>{let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}${n}${r}`},Ep=(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 Lr=async(e,t,n={readRawTask:vt,validateTaskRecord:Ue})=>{let r=await Ee(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(FT(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}},FT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var Op=["merge_ready","pr_open","checked","review","running","draft"],qa=e=>[...e].sort((t,n)=>t.id.localeCompare(n.id)),Ua=(e,t)=>t&&e.some(r=>r.id===t)?t:e.length===0?null:[...e].sort(MT)[0]?.id??null,MT=(e,t)=>{let n=$p(e.status),r=$p(t.status);return n!==r?n-r:t.updatedAt.localeCompare(e.updatedAt)},$p=e=>{let t=Op.indexOf(e);return t>=0?t:Op.length};import Np from"node:path";var bn=(e,t)=>t?Np.isAbsolute(t)?t:Np.join(e.repoRoot,t):null;import{randomUUID as jT}from"node:crypto";import{mkdir as Mr,rm as qT,writeFile as ri}from"node:fs/promises";import H from"node:path";var Fr=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");var Dp=["AGENTS","md"].join("."),Yn=async(e,t,n,r={})=>{let s=await De(e,t),[i,o]=await Promise.all([KT(e,s.id,r.workspaceId,r.allowLinkedProjectRepo??!1),Hn(e,s.rootPath)]),a=`craig/${o}`,l=H.join(e.worktreesDir,s.id,o),c=H.join(e.logsDir,`${o}.log`),d=H.join(e.artifactsDir,o);await Promise.all([Mr(H.dirname(l),{recursive:!0}),Mr(d,{recursive:!0}),ri(c,"","utf8")]);let u=UT(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 Ze(e,u),await _a(e,o),await Ma(s.rootPath,a,l,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,workspaceId:i.id,task:u}},jr=async(e,t,n,r={})=>{let s=(await Ie(e)).find(b=>b.id===t&&b.status==="active");if(!s)throw new Error(`Workspace ${t} does not exist or is archived.`);if(s.kind!=="project"){if(!s.primaryRepoId)throw new Error(`Workspace ${t} is not task-capable.`);let b=await Yn(e,s.primaryRepoId,n,r);return{...b,bundlePath:b.task.worktreePath,repoTargets:[]}}let i=s.discoveredRepoIds??[];if(i.length===0)throw new Error(`Project workspace ${t} has no discovered repos.`);let o=await xr(e),a=new Date().toISOString(),l=r.runner??"codex",c=`craig/${o}`,d=H.join(e.craigDir,"task-bundles",o),u=H.join(e.logsDir,`${o}.log`),p=H.join(e.artifactsDir,o);await Mr(d,{recursive:!0}),await Mr(p,{recursive:!0}),await ri(u,"","utf8");let h=await Promise.all(i.map(b=>De(e,b))),m=BT(h),f=await Promise.all(h.map(b=>WT(e,b,o,c,H.join(d,m.get(b.id))))),y=f.find(b=>b.status==="ready")??f[0];if(!f.some(b=>b.status==="ready"))throw await qT(d,{recursive:!0,force:!0}),new Error(`No project repo targets could be provisioned for ${t}: ${f.map(b=>`${b.repoId}: ${b.failureReason??"unknown error"}`).join("; ")}`);await Ba({taskId:o,workspaceId:t,prompt:n,repos:h,repoTargets:f,bundlePath:d});let k=qr(o,n,a,l,r.config??{}),R={id:o,title:n,slug:Fr(n),type:"project",status:"draft",runner:l,repoId:y.repoId,workspaceId:s.id,selectedPtyTabId:k[0]?.id??null,linkedRepoIds:i.filter(b=>b!==y.repoId),...xp(o,r.lineage),repoRoot:d,worktreePath:d,branch:c,bundlePath:d,selectedRepoTargetId:y.repoId,repoTargets:f,ptyTabs:k,runnerSession:{command:T.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:H.relative(e.workspaceRoot,u),checkSummaryPath:H.relative(e.workspaceRoot,H.join(p,"check-summary.json")),prDraftPath:null,prStatusPath:H.relative(e.workspaceRoot,H.join(p,"pr-status.json"))},cleanup:si(),lastFailureReason:f.every(b=>b.status==="unavailable")?"No project repo targets could be provisioned.":null,createdAt:a,updatedAt:a};return await Ze(e,R),await _a(e,o),{repoId:y.repoId,repoRoot:d,workspaceId:s.id,task:R,bundlePath:d,repoTargets:f}},qr=(e,t,n,r="codex",s={})=>{let i=T.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",...s.previews?.agentOrchestration?{capabilityId:`capability_${jT()}`}:{},title:i.defaultAgentTitle,command:T.runners.buildCommand(r,void 0,s),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},UT=(e,t)=>{let n=new Date().toISOString(),r=qr(t.taskId,t.prompt,n,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:Fr(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,selectedPtyTabId:r[0]?.id??null,linkedRepoIds:[],...xp(t.taskId,t.lineage),repoRoot:t.repoRoot,worktreePath:t.worktreePath,branch:t.branch,ptyTabs:r,runnerSession:{command:T.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:{...Va(H.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:H.relative(e.workspaceRoot,H.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:H.relative(e.workspaceRoot,H.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:H.relative(e.workspaceRoot,H.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:si(),lastFailureReason:null,createdAt:n,updatedAt:n}},WT=async(e,t,n,r,s)=>{try{return await Wa(e,t,r,s)}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:Va(H.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:_p(),cleanup:si()}}},Wa=async(e,t,n,r)=>(await Mr(H.dirname(r),{recursive:!0}),await Ma(t.rootPath,n,r,t.defaultBranch),{repoId:t.id,branch:n,repoRoot:t.rootPath,worktreePath:r,status:"ready",failureReason:null,checks:Va(H.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:_p(),cleanup:si()}),BT=e=>{let t=new Set(["manifest.json",Dp]),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},VT=e=>{let t=new Map(e.repos.map(r=>[r.id,r.name])),n=e.repoTargets.map(r=>{let s=t.get(r.repoId)??r.repoId,i=H.relative(e.bundlePath,r.worktreePath),o=r.status==="ready"?"ready":`unavailable: ${r.failureReason??"unknown error"}`;return`- \`${i}/\` - ${s} (${r.repoId}, ${o})`}).join(`
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
- `)},Ua=async e=>{await ri(H.join(e.bundlePath,"manifest.json"),JSON.stringify({taskId:e.taskId,workspaceId:e.workspaceId,prompt:e.prompt,repos:e.repoTargets.map(t=>({repoId:t.repoId,repoName:e.repos.find(n=>n.id===t.repoId)?.name??t.repoId,path:H.relative(e.bundlePath,t.worktreePath),status:t.status,worktreePath:t.worktreePath,failureReason:t.failureReason}))},null,2),"utf8"),await ri(H.join(e.bundlePath,$p),qT(e),"utf8")},Wa=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),Np=()=>({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}),si=()=>({worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),Dp=(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}),UT=async(e,t,n,r=!1)=>{let s=await Ie(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};var Ba=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}))},Ur=async(e,t,n)=>V(e,t,r=>({...r,status:"draft",runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n})),Wr=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 Va=async(e,t,n,r={})=>{let s=n.trim(),i=await T.load(e),o=r.runner??T.runners.getDefault(i);if(T.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 jr(e,r.workspaceId,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}):await Yn(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 Wr(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 Ur(e,l.id,c instanceof Error?c.message:"Unknown Craig error"),c}};import{mkdir as GT}from"node:fs/promises";import HT from"node:path";var Et=async e=>{let t=await z("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var _p=async(e,t,n)=>{let r=n==="merge"?"--merge":n==="rebase"?"--rebase":"--squash";await G("gh",["pr","merge",String(t),r,"--delete-branch=false"],{cwd:e})},zn=async(e,t)=>{let n=await G("gh",Ka(e),{cwd:t});return JSON.parse(n.stdout)},Jn=async(e,t)=>{let n=await z("gh",Ka(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Lp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},xp=async(e,t)=>{let n=await z("gh",Ka(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Lp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Fp=async(e,t,n)=>{if(n.length===0)return[];let r=VT(n),s;try{s=await G("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw WT(a)?new Be(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=KT(c);return{id:a.id,found:d!==null,view:d}})},ii=async e=>{let t=await z("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:BT(t.stdout.trim())},Gt=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])}},WT=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")},Lp=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},Ka=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],BT=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},VT=e=>`
14
+ `)},Ba=async e=>{await ri(H.join(e.bundlePath,"manifest.json"),JSON.stringify({taskId:e.taskId,workspaceId:e.workspaceId,prompt:e.prompt,repos:e.repoTargets.map(t=>({repoId:t.repoId,repoName:e.repos.find(n=>n.id===t.repoId)?.name??t.repoId,path:H.relative(e.bundlePath,t.worktreePath),status:t.status,worktreePath:t.worktreePath,failureReason:t.failureReason}))},null,2),"utf8"),await ri(H.join(e.bundlePath,Dp),VT(e),"utf8")},Va=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),_p=()=>({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}),si=()=>({worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),xp=(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}),KT=async(e,t,n,r=!1)=>{let s=await Ie(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};var Ka=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}))},Ur=async(e,t,n)=>V(e,t,r=>({...r,status:"draft",runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n})),Wr=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 Ga=async(e,t,n,r={})=>{let s=n.trim(),i=await T.load(e),o=r.runner??T.runners.getDefault(i);if(T.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 jr(e,r.workspaceId,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}):await Yn(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 L(e,l.id):await Wr(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 Ur(e,l.id,c instanceof Error?c.message:"Unknown Craig error"),c}};import{mkdir as JT}from"node:fs/promises";import XT from"node:path";var Et=async e=>{let t=await z("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var Lp=async(e,t,n)=>{let r=n==="merge"?"--merge":n==="rebase"?"--rebase":"--squash";await G("gh",["pr","merge",String(t),r,"--delete-branch=false"],{cwd:e})},zn=async(e,t)=>{let n=await G("gh",Ha(e),{cwd:t});return JSON.parse(n.stdout)},Jn=async(e,t)=>{let n=await z("gh",Ha(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(jp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Fp=async(e,t)=>{let n=await z("gh",Ha(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(jp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Mp=async(e,t,n)=>{if(n.length===0)return[];let r=YT(n),s;try{s=await G("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw GT(a)?new Be(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=zT(c);return{id:a.id,found:d!==null,view:d}})},ii=async e=>{let t=await z("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:HT(t.stdout.trim())},Gt=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])}},GT=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")},jp=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},Ha=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],HT=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},YT=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,50 +65,50 @@ fragment PrFields on PullRequest {
65
65
  }
66
66
  }
67
67
  }
68
- `,KT=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 Rn=async(e,t)=>{let n=bn(e,t.artifacts.prStatusPath);n&&(await GT(HT.dirname(n),{recursive:!0}),await q(n,{taskId:t.id,prs:t.prs}))},Xn=async(e,t,n={writeTask:Ze,writePrStatusArtifact:Rn})=>{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},Br=async(e,t,n,r,s={readRawTask:vt,validateTaskRecord:Ue,writeTask:Ze,writePrStatusArtifact:Rn,withTaskLock:Qe})=>s.withTaskLock(e,t.id,async()=>{let i=await s.readRawTask(e,t.id),o=s.validateTaskRecord(i,`${e.tasksDir}/${t.id}.json`),a=o.prs.find(p=>r?.number!==null&&p.number===r?.number)??r,l=At(n,a),c=Ct(o,l),d=o.status==="closed"?o.status:Tn(c.prs),u={...c,status:d};return Xn(e,u,s)}),Vr=async(e,t)=>{let n=K(t),r=n?.number?String(n.number):t.branch,s=await zn(r,t.worktreePath);return Br(e,t,s,n)},Kr=async(e,t)=>{for(let n of await Ga(t)){let r=await Jn(n,t.worktreePath);if(!r)continue;return{discovered:!0,task:await Br(e,t,r,null)}}return{discovered:!1,task:t}},Ga=async e=>{let t=await Sp(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(n=>!!n))]};async function Gr(e,t,n,r){return Qe(e,t,async()=>{let s=await F(e,t);if(!s.repoTargets?.find(h=>h.repoId===n))throw new Error(`Project task ${t} has no repo target ${n}.`);let o=Gt(r.url),a=s.prs.find(h=>o?Kn(h,{owner:o.owner,repo:o.name,number:r.number}):h.number===r.number)??null,l=At(r,a,o??void 0),c=YT(r),d=Ct(s,l),u={...d,repoTargets:(d.repoTargets??[]).map(h=>h.repoId===n?{...h,pullRequest:r.headRefName===h.branch?c:Qn(h)?h.pullRequest:Mp(h.pullRequest)}:h)},p={...u,status:u.status==="closed"?u.status:ai(u)};return Xn(e,p)})}async function oi(e,t,n){return Qe(e,t,async()=>{let r=await F(e,t),s=r.repoTargets?.find(a=>a.repoId===n);if(!s)throw new Error(`Project task ${t} has no repo target ${n}.`);if(s.pullRequest.number===null||Qn(s))return r;let i={...r,repoTargets:(r.repoTargets??[]).map(a=>a.repoId===n?{...a,pullRequest:Mp(a.pullRequest)}:a)},o={...i,status:i.status==="closed"?i.status:ai(i)};return Xn(e,o)})}function Qn(e){return e.pullRequest.number!==null&&e.pullRequest.headBranch===e.branch}function YT(e){let t=Gt(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:zT(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:JT(e.reviewDecision??null),requiredChecks:_a(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function ai(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 zT=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,JT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Mp=e=>({provider:"github",owner:e.owner??null,repo:e.repo??null,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 Zn=async(e,t,n)=>{if(Qn(n)){let s=String(n.pullRequest.number),i=await zn(s,n.worktreePath);return await Gr(e,t.id,n.repoId,i),"synced"}let r=await Jn(n.branch,n.worktreePath);return r?(await Gr(e,t.id,n.repoId,r),"discovered"):(await oi(e,t.id,n.repoId),"not_found")};var Hr=async(e,t)=>{let n=await F(e,t),r=K(n);return r?.number?(await Et(n.worktreePath),Kt(r)?(await Kr(e,n)).task:Vr(e,n)):n},Ya=async(e,t)=>{let n=await F(e,t);if(n.type==="project"&&n.repoTargets?.length)return await er(e,t),F(e,t);let r=K(n);if(await he(n),await Et(n.worktreePath),!r?.number||Kt(r)){let i=await Kr(e,n);if(!i.discovered&&!r?.number)throw new Error(`No PR found for ${n.branch}.`);return i.task}return await Vr(e,n)},er=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 Et(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},za=async(e,t)=>{let n=new Map,r=new Map,s=[];for(let i of t){let o=Ha(n,i);if(i.type==="project"&&i.repoTargets?.length){for(let u of i.repoTargets.filter(p=>p.status==="ready")){let p=Qn(u),h={id:`${i.id}:${u.repoId}`,task:i,targetRepoId:u.repoId,worktreePath:u.worktreePath,selector:p?String(u.pullRequest.number):u.branch,mode:p?"number":"head",fallbackSelectors:[]};await jp(r,h).catch(async()=>{try{await Et(u.worktreePath);let m=u.pullRequest.number?await Zn(e,i,u):await Zn(e,i,u);li(o,m,u.pullRequest.number??null,u.pullRequest.url??null)}catch(m){if(m instanceof Be)throw m;s.push(m)}})}continue}let a=K(i),l=a?.number&&!Kt(a),c=l?[]:await Ga(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 jp(r,d).catch(async()=>{try{let{disposition:u,task:p}=await ci(e,i.id),h=K(p);li(o,u,h?.number??null,h?.url??null)}catch(u){if(u instanceof Be)throw u;s.push(u)}})}for(let i of r.values())try{await Et(i.worktreePath);let o=await Fp(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=Ha(n,l.task),u=a.get(l.id)?.view??await XT(i.worktreePath,l);if(!u){l.targetRepoId&&l.mode==="head"&&await oi(e,l.task.id,l.targetRepoId),li(c,"not_found",null,null);continue}if(l.targetRepoId)await Gr(e,l.task.id,l.targetRepoId,u);else{let p=await vt(e,l.task.id),h=Ue(p,`${e.tasksDir}/${l.task.id}.json`);await Br(e,h,u,l.mode==="number"?K(h):null)}li(c,l.mode==="number"?"synced":"discovered",u.number,u.url)}}catch(o){if(o instanceof Be)throw o;s.push(o)}return QT(s),t.map(i=>Ha(n,i))},ci=async(e,t)=>{let n=await F(e,t);await he(n),await Et(n.worktreePath);let r=K(n);if(r?.number&&!Kt(r))return{disposition:"synced",task:await Vr(e,n)};let s=await Kr(e,n);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},XT=async(e,t)=>{if(t.mode!=="head")return null;for(let n of t.fallbackSelectors){let r=await Jn(n,e);if(r)return r}return null},jp=async(e,t)=>{let n=await ii(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]})},Ha=(e,t)=>{let n=e.get(t.id);if(n)return n;let r={taskId:t.id,synced:0,discovered:0,notFound:0,hadPr:t.type==="project"?!!t.repoTargets?.some(s=>s.pullRequest.number):!!K(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,r),r},li=(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},QT=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var Ja=async(e,t)=>{let n=await F(e,t);try{n.type==="project"&&n.repoTargets?.length?(await er(e,t),n=await F(e,t)):n.prs.some(s=>s.number)&&(n=await Hr(e,t))}catch{}let r=await Dr(e,n);return{kind:"showTask",task:n,inspection:r}};var Xa=async(e,t)=>{let n=await F(e,t);if(await he(n),(await G("git",["status","--short"],{cwd:n.worktreePath})).stdout.trim().length===0)return{kind:"showTaskDiff",taskId:n.id,diffText:"",isEmpty:!0};let s=await ZT(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}},ZT=async e=>{let t=[],n=await G("git",["diff","--stat","--patch","HEAD"],{cwd:e});n.stdout.trim().length>0&&t.push(n.stdout.trimEnd());let r=await eb(e);for(let s of r){let i=await z("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(i.stdout.trimEnd())}return t.join(`
68
+ `,zT=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 Rn=async(e,t)=>{let n=bn(e,t.artifacts.prStatusPath);n&&(await JT(XT.dirname(n),{recursive:!0}),await q(n,{taskId:t.id,prs:t.prs}))},Xn=async(e,t,n={writeTask:Ze,writePrStatusArtifact:Rn})=>{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},Br=async(e,t,n,r,s={readRawTask:vt,validateTaskRecord:Ue,writeTask:Ze,writePrStatusArtifact:Rn,withTaskLock:Qe})=>s.withTaskLock(e,t.id,async()=>{let i=await s.readRawTask(e,t.id),o=s.validateTaskRecord(i,`${e.tasksDir}/${t.id}.json`),a=o.prs.find(p=>r?.number!==null&&p.number===r?.number)??r,l=At(n,a),c=Ct(o,l),d=o.status==="closed"?o.status:Tn(c.prs),u={...c,status:d};return Xn(e,u,s)}),Vr=async(e,t)=>{let n=K(t),r=n?.number?String(n.number):t.branch,s=await zn(r,t.worktreePath);return Br(e,t,s,n)},Kr=async(e,t)=>{for(let n of await Ya(t)){let r=await Jn(n,t.worktreePath);if(!r)continue;return{discovered:!0,task:await Br(e,t,r,null)}}return{discovered:!1,task:t}},Ya=async e=>{let t=await vp(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(n=>!!n))]};async function Gr(e,t,n,r){return Qe(e,t,async()=>{let s=await L(e,t);if(!s.repoTargets?.find(h=>h.repoId===n))throw new Error(`Project task ${t} has no repo target ${n}.`);let o=Gt(r.url),a=s.prs.find(h=>o?Kn(h,{owner:o.owner,repo:o.name,number:r.number}):h.number===r.number)??null,l=At(r,a,o??void 0),c=QT(r),d=Ct(s,l),u={...d,repoTargets:(d.repoTargets??[]).map(h=>h.repoId===n?{...h,pullRequest:r.headRefName===h.branch?c:Qn(h)?h.pullRequest:qp(h.pullRequest)}:h)},p={...u,status:u.status==="closed"?u.status:ai(u)};return Xn(e,p)})}async function oi(e,t,n){return Qe(e,t,async()=>{let r=await L(e,t),s=r.repoTargets?.find(a=>a.repoId===n);if(!s)throw new Error(`Project task ${t} has no repo target ${n}.`);if(s.pullRequest.number===null||Qn(s))return r;let i={...r,repoTargets:(r.repoTargets??[]).map(a=>a.repoId===n?{...a,pullRequest:qp(a.pullRequest)}:a)},o={...i,status:i.status==="closed"?i.status:ai(i)};return Xn(e,o)})}function Qn(e){return e.pullRequest.number!==null&&e.pullRequest.headBranch===e.branch}function QT(e){let t=Gt(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:ZT(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:eb(e.reviewDecision??null),requiredChecks:La(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function ai(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 ZT=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,eb=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,qp=e=>({provider:"github",owner:e.owner??null,repo:e.repo??null,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 Zn=async(e,t,n)=>{if(Qn(n)){let s=String(n.pullRequest.number),i=await zn(s,n.worktreePath);return await Gr(e,t.id,n.repoId,i),"synced"}let r=await Jn(n.branch,n.worktreePath);return r?(await Gr(e,t.id,n.repoId,r),"discovered"):(await oi(e,t.id,n.repoId),"not_found")};var Hr=async(e,t)=>{let n=await L(e,t),r=K(n);return r?.number?(await Et(n.worktreePath),Kt(r)?(await Kr(e,n)).task:Vr(e,n)):n},Ja=async(e,t)=>{let n=await L(e,t);if(n.type==="project"&&n.repoTargets?.length)return await er(e,t),L(e,t);let r=K(n);if(await he(n),await Et(n.worktreePath),!r?.number||Kt(r)){let i=await Kr(e,n);if(!i.discovered&&!r?.number)throw new Error(`No PR found for ${n.branch}.`);return i.task}return await Vr(e,n)},er=async(e,t)=>{let n=await L(e,t),r=(n.repoTargets??[]).filter(i=>i.status==="ready"),s={synced:0,discovered:0,notFound:0};for(let i of r){await Et(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},Xa=async(e,t)=>{let n=new Map,r=new Map,s=[];for(let i of t){let o=za(n,i);if(i.type==="project"&&i.repoTargets?.length){for(let u of i.repoTargets.filter(p=>p.status==="ready")){let p=Qn(u),h={id:`${i.id}:${u.repoId}`,task:i,targetRepoId:u.repoId,worktreePath:u.worktreePath,selector:p?String(u.pullRequest.number):u.branch,mode:p?"number":"head",fallbackSelectors:[]};await Up(r,h).catch(async()=>{try{await Et(u.worktreePath);let m=u.pullRequest.number?await Zn(e,i,u):await Zn(e,i,u);li(o,m,u.pullRequest.number??null,u.pullRequest.url??null)}catch(m){if(m instanceof Be)throw m;s.push(m)}})}continue}let a=K(i),l=a?.number&&!Kt(a),c=l?[]:await Ya(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 Up(r,d).catch(async()=>{try{let{disposition:u,task:p}=await ci(e,i.id),h=K(p);li(o,u,h?.number??null,h?.url??null)}catch(u){if(u instanceof Be)throw u;s.push(u)}})}for(let i of r.values())try{await Et(i.worktreePath);let o=await Mp(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=za(n,l.task),u=a.get(l.id)?.view??await tb(i.worktreePath,l);if(!u){l.targetRepoId&&l.mode==="head"&&await oi(e,l.task.id,l.targetRepoId),li(c,"not_found",null,null);continue}if(l.targetRepoId)await Gr(e,l.task.id,l.targetRepoId,u);else{let p=await vt(e,l.task.id),h=Ue(p,`${e.tasksDir}/${l.task.id}.json`);await Br(e,h,u,l.mode==="number"?K(h):null)}li(c,l.mode==="number"?"synced":"discovered",u.number,u.url)}}catch(o){if(o instanceof Be)throw o;s.push(o)}return nb(s),t.map(i=>za(n,i))},ci=async(e,t)=>{let n=await L(e,t);await he(n),await Et(n.worktreePath);let r=K(n);if(r?.number&&!Kt(r))return{disposition:"synced",task:await Vr(e,n)};let s=await Kr(e,n);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},tb=async(e,t)=>{if(t.mode!=="head")return null;for(let n of t.fallbackSelectors){let r=await Jn(n,e);if(r)return r}return null},Up=async(e,t)=>{let n=await ii(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]})},za=(e,t)=>{let n=e.get(t.id);if(n)return n;let r={taskId:t.id,synced:0,discovered:0,notFound:0,hadPr:t.type==="project"?!!t.repoTargets?.some(s=>s.pullRequest.number):!!K(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,r),r},li=(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},nb=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var Qa=async(e,t)=>{let n=await L(e,t);try{n.type==="project"&&n.repoTargets?.length?(await er(e,t),n=await L(e,t)):n.prs.some(s=>s.number)&&(n=await Hr(e,t))}catch{}let r=await Dr(e,n);return{kind:"showTask",task:n,inspection:r}};var Za=async(e,t)=>{let n=await L(e,t);if(await he(n),(await G("git",["status","--short"],{cwd:n.worktreePath})).stdout.trim().length===0)return{kind:"showTaskDiff",taskId:n.id,diffText:"",isEmpty:!0};let s=await rb(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}},rb=async e=>{let t=[],n=await G("git",["diff","--stat","--patch","HEAD"],{cwd:e});n.stdout.trim().length>0&&t.push(n.stdout.trimEnd());let r=await sb(e);for(let s of r){let i=await z("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(i.stdout.trimEnd())}return t.join(`
69
69
 
70
- `)},eb=async e=>(await G("git",["ls-files","--others","--exclude-standard"],{cwd:e})).stdout.split(`
71
- `).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as tb}from"node:child_process";import{access as nb}from"node:fs/promises";var Qa=async(e,t)=>{let n=await F(e,t),r=Gn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await nb(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},Za=async e=>{await new Promise((t,n)=>{let r=!1,s=tb("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 rb}from"node:fs/promises";import sb from"node:path";var el=async(e,t)=>{let n=await F(e,t);if(await he(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 ti(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 T.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 z("sh",["-lc",a],{cwd:n.worktreePath}),d=new Date().toISOString(),u=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:d,exitCode:u}),u!==0){let p=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,h=await V(e,n.id,m=>({...m,status:"review",checks:{...m.checks,results:i,status:"failed",lastRunAt:d},lastFailureReason:p}));return await qp(e,h),{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 qp(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},qp=async(e,t)=>{let n=bn(e,t.artifacts.checkSummaryPath);n&&(await rb(sb.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 tl=async(e,t)=>{let n=await F(e,t);await he(n);let r=await ti(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.title.trim();await bp(n.worktreePath),await Rp(n.worktreePath,s);let i=await Pp(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 ib}from"node:fs/promises";var nl=async(e,t)=>{let n=await F(e,t),r=await ob(n.worktreePath);return V(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},ob=async e=>{try{return await ib(e),!0}catch{return!1}};var rl=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await ni(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 sl=async(e,t,n)=>{let r=await De(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}},il=async(e,t)=>{let n=await F(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>De(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};import{access as ab,readFile as Up,rm as lb,writeFile as Wp}from"node:fs/promises";import ui from"node:path";var Vp=["AGENTS","md"].join("."),ol=async(e,t,n)=>Qe(e,t,async()=>{let r=await F(e,t);cb(r);let s=r.repoTargets?.find(m=>m.repoId===n);if(s)return Bp(r.id,s.repoId,s.branch,s.worktreePath,"unchanged");let[i,o]=await Promise.all([De(e,n),Ie(e).then(m=>m.find(f=>f.id===r.workspaceId)??null)]);if(!o||o.kind!=="project"||o.status!=="active"||!o.discoveredRepoIds?.includes(i.id))throw new g("TASK_CONTEXT_CONFLICT",`Repo ${i.id} is not a discovered repository in project workspace ${r.workspaceId}.`,{details:{taskId:r.id,repoId:i.id,workspaceId:r.workspaceId}});let a=r.bundlePath??r.worktreePath,l=ui.join(a,ub(i.name,r)),c=ui.join(a,"manifest.json"),d=ui.join(a,Vp),[u,p,h]=await Promise.all([Up(c,"utf8"),Up(d,"utf8"),_r(i.rootPath,r.branch)]);try{let m=await qa(e,i,r.branch,l),f={...r,linkedRepoIds:i.id===r.repoId||r.linkedRepoIds.includes(i.id)?r.linkedRepoIds:[...r.linkedRepoIds,i.id],repoTargets:[...r.repoTargets??[],m]},y=await Promise.all((f.repoTargets??[]).map(k=>De(e,k.repoId)));return await Ua({taskId:r.id,workspaceId:r.workspaceId,prompt:db(u)??r.title,repos:y,repoTargets:f.repoTargets??[],bundlePath:a}),await Ze(e,f),Bp(r.id,i.id,m.branch,m.worktreePath,"added")}catch(m){let f=await pb({repoRoot:i.rootPath,branch:r.branch,worktreePath:l,branchAlreadyExisted:h,manifestPath:c,manifestBackup:u,guidePath:d,guideBackup:p});throw f.length>0?new g("PARTIAL_RESULT",`Failed to attach repo ${i.id} to task ${r.id}, and rollback was incomplete.`,{retryable:!0,details:{taskId:r.id,repoId:i.id,rollbackFailures:f.map(y=>y instanceof Error?y.message:String(y))},cause:m}):m}}),cb=e=>{if(e.type!=="project"||!e.bundlePath)throw new g("TASK_CONTEXT_CONFLICT",`Task ${e.id} is not a project task and cannot accept repository targets.`,{details:{taskId:e.id,taskType:e.type}})},ub=(e,t)=>{let n=new Set(["manifest.json",Vp,...(t.repoTargets??[]).map(o=>ui.basename(o.worktreePath))]),r=n.has(e)?`${e}-repo`:e,s=r,i=2;for(;n.has(s);)s=`${r}-${i}`,i+=1;return s},db=e=>{try{let t=JSON.parse(e);return typeof t.prompt=="string"?t.prompt:null}catch{return null}},pb=async e=>{let t=[];return await Wp(e.manifestPath,e.manifestBackup,"utf8").catch(r=>t.push(r)),await Wp(e.guidePath,e.guideBackup,"utf8").catch(r=>t.push(r)),await ab(e.worktreePath).then(()=>!0).catch(()=>!1)&&await ni(e.repoRoot,e.worktreePath).catch(async r=>{t.push(r),await lb(e.worktreePath,{recursive:!0,force:!0}).catch(s=>t.push(s))}),e.branchAlreadyExisted||await _r(e.repoRoot,e.branch).catch(s=>(t.push(s),!1))&&await Ip(e.repoRoot,e.branch).catch(s=>t.push(s)),t},Bp=(e,t,n,r,s)=>({kind:"addTaskRepoTarget",disposition:s,taskId:e,repoId:t,branch:n,worktreePath:r});import{spawn as fb}from"node:child_process";var al=async(e,t)=>{let n=await F(e,t);await he(n);let s=(await T.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 mb(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},mb=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=fb(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 Gp}from"node:fs/promises";import Yr from"node:path";async function cl(e,t){if(t.explicitTaskId!==void 0){let l=await Kp(e,t.explicitTaskId,"explicit");return ll(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await Kp(e,t.environmentTaskId,"environment");return ll(l,"environment",t.environmentAgentTabId)}let n=await Gp(t.cwd).catch(()=>Yr.resolve(t.cwd)),r=await Fr(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await gb(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 ll(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 Kp(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 ll(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 hb(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function gb(e,t){return(await Promise.all(hb(e).map(r=>Gp(r).catch(()=>Yr.resolve(r))))).some(r=>yb(r,t))}function yb(e,t){let n=Yr.relative(Yr.resolve(e),t);return n===""||!n.startsWith("..")&&!Yr.isAbsolute(n)}var ul=async(e,t,n)=>{let r=n.trim();if(r.length===0)throw new Error("Task title cannot be empty.");let s="",i=await V(e,t,o=>(s=o.title,{...o,title:r,slug:Lr(r)}));return{kind:"renameTask",taskId:i.id,previousTitle:s,title:i.title,slug:i.slug}};var dl=async(e,t,n="merge",r)=>{let s=await F(e,t),i=r??K(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await _p(s.worktreePath,i,n)};var zr={readTask:F,writeTask:Ze,withTaskLock:Qe,ensureGhAuthenticated:Et,fetchPrView:zn,discoverPrView:xp,getGitHubRepositoryLocator:ii,writePrStatusArtifact:Rn};async function fl(e,t,n,r=zr){let s=await r.readTask(e,t),i=await kb(s,n,r);return Ht(s,i,"showTaskPr","shown",[])}async function ml(e,t,n,r=zr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await kl(s,n,null,r);await Tl(i,r);let o=await pi(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return Ht(s,i,"discoverTaskPr","not_found",[]);bl(o,i);let a=fi(s,i,o.number),l=await Rl(e,s,i,o,r);return Ht(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function hl(e,t,n,r,s=zr){let i=wl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await kl(o,r,i.repository,s);Yp(i.repository,a),await Tl(a,s);let l=await pi(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));Tb(l,i),bl(l,a);let c=fi(o,a,l.number),d=Pl(o,a),u=d&&!Kn(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 Rl(e,o,a,l,s);return Ht(p,a,"linkTaskPr",c?"unchanged":"linked",u)})}async function wb(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw tr(e,t);let o=e.prs.find(a=>a.number===n.number)??K(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await di(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw tr(e,t);let a=Hp(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&ht({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await di(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&&ht({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&ht({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 gl(e,t,n,r=zr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await kl(s,n,null,r),o=Pl(s,i);if(!o?.number)return Ht(s,i,"refreshTaskPr","not_found",[]);await Tl(i,r);let a=await pi(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));bl(a,i);let l=await Rl(e,s,i,a,r);return Ht(l,i,"refreshTaskPr","synced",[])})}async function yl(e,t,n,r,s=zr){let i=wl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await wb(o,r,i,s);if(Yp(i.repository,a),!fi(o,a,i.number))return Ht(o,a,"unlinkTaskPr","unchanged",[]);let c=bb(o,a,i.number),d=await Jp(e,c,s);return Ht(d,a,"unlinkTaskPr","unlinked",[])})}function wl(e){let t=e.trim(),n=Gt(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 kl(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw tr(e,t);return pl(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 tr(e,t);return pl(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 pl(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&&ht(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 kb(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw tr(e,t);let s=K(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await di(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 tr(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await di(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function di(e,t,n,r){let s=Hp(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function Hp(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Gt(e.url):null}async function pl(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 Tl(e,t){await pi("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function pi(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 Yp(e,t){if(e&&!ht(e,t.repository))throw zp(e,t)}function Tb(e,t){let n=Gt(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&&!ht(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 bl(e,t){let n=Gt(e.url);if(!n||!ht(n,t.repository))throw zp(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 zp(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 tr(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 ht(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function Rl(e,t,n,r,s){let i=fi(t,n,r.number),o=At(r,i,n.repository),a=Ct(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:Zp(o)}:l)}),Jp(e,a,s)}function bb(e,t,n){let r=e.prs.filter(i=>!Qp(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=Xp(r.filter(o=>o.owner&&o.repo&&ht({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?Zp(i):Pb(t.repository)}:o)}}return s}async function Jp(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?ai(t):Tn(t.prs),s={...t,status:r};return Xn(e,s,n)}function fi(e,t,n){return Sl(e,t).find(r=>Qp(r,t,n))??null}function Pl(e,t){if(!t.projectTarget)return K(e);let n=Sl(e,t);return Xp(n)}function Xp(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function Sl(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&ht({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?Rb(r.pullRequest,t.repository):null;return s&&!n.some(i=>Kn(i,s))?[...n,s]:n}function Qp(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||ht({owner:e.owner,name:e.repo},t.repository)}function Ht(e,t,n,r,s){let i=Sl(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:Pl(e,t),warnings:s}}function Zp(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 Rb(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 Pb(e){return{provider:"github",owner:e.owner,repo:e.name,number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null}}var P={listTasks:Fr,getTask:F,provisionTask:Yn,provisionProjectTask:jr,createTask:Va,showTask:Ja,showTaskDiff:Xa,prepareTaskLogs:Qa,streamTaskLogs:Za,runChecks:el,commitTask:tl,closeTask:nl,cleanupTask:rl,addTaskLink:sl,addTaskRepoTarget:ol,listTaskLinks:il,sortTasksForDisplay:Ma,resolveSelectedTaskId:ja,allocateTaskId:La,allocateTaskIdForRepo:Hn,allocateProjectTaskId:xr,createDefaultTaskPtyTabs:qr,assertTaskWorktreeExists:he,resolveTaskLogPath:Gn,buildTaskInspection:Dr,resolveArtifactPath:bn,openTask:al,markRunnerFailed:Ba,recordStartupFailure:Ur,markTaskStarted:Wr,renameTask:ul,resolveContext:cl,prs:{refresh:Hr,refreshChecks:Ya,discoverOrRefresh:ci,discoverOrRefreshAll:er,discoverOrRefreshMany:za,show:fl,discover:ml,link:hl,refreshAssociation:gl,unlink:yl,merge:dl,getPrimaryPr:K,isPrTerminal:Kt,isMergeReady:ei,deriveTaskStatus:Tn,upsertPr:Ct,normalizePr:At,summarizeRequiredChecks:Da,writePrStatusArtifact:Rn}};var ef={idle:0,ready:1,working:2,error:3};function Ot(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 Yt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return Ot(t,n,r,i)}function nr(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=Yt(e,s.id,t,n);ef[i]>ef[r]&&(r=i)}return r}function mi(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&Ot(s.id,t,n)==="working"))}function gt(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=Yt(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:nr(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function Il(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=gt([e],t.getSnapshots(),l),d=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:e.id,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw tf(e.id);let u=a-r();if(u<=0)throw Sb(e.id,n.states,n.timeoutMs);let p=s;await new Promise((h,m)=>{let f=()=>{clearTimeout(k),n.signal?.removeEventListener("abort",y),h()},y=()=>{clearTimeout(k),m(tf(e.id))},k=setTimeout(f,u);i=f,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var Sb=(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}}),tf=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as Ab}from"node:net";import{createHash as Ib}from"node:crypto";import{tmpdir as vb}from"node:os";import nf from"node:path";var Pn=10,Cb=new Set([6,7,8,9,Pn]);function zt(e){return e!==void 0&&Cb.has(e)}function _e(e){let t=Ib("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:nf.join(vb(),`craig-${t}.sock`),pidPath:nf.join(e.runtimeDir,"pty-daemon.pid")}}async function rf(e){let t=null;try{let n=await Eb(_e(e.paths).socketPath);return t=new Cl(n,e),await t.ready(),t}catch{return t?.close(),null}}var Cl=class{constructor(t,n){this.socket=t;this.options=n;t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>this.handleClose())}socket;options;pending=new Map;snapshots=new Map;revisionByTabId=new Map;nextRequestId=1;revision=0;buffer="";closed=!1;async ready(){if((await this.send({type:"ping"})).protocolVersion!==Pn)throw new Error("Craig PTY daemon protocol mismatch.");await this.send({type:"setActivityEnabled",enabled:!0});let n=this.revision,r=await this.send({type:"getActivitySnapshots"});this.replaceSnapshots(r.activities??[],n)}getSnapshots(){return[...this.snapshots.values()]}close(){this.closed||(this.closed=!0,this.socket.end(),this.rejectAll(new Error("Craig PTY daemon activity connection closed.")))}async send(t){if(this.closed||this.socket.destroyed)throw new Error("Craig PTY daemon activity connection is closed.");let n=this.nextRequestId++,r=new Promise((i,o)=>{this.pending.set(n,{resolve:i,reject:o})});this.socket.write(`${JSON.stringify({...t,id:n})}
70
+ `)},sb=async e=>(await G("git",["ls-files","--others","--exclude-standard"],{cwd:e})).stdout.split(`
71
+ `).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as ib}from"node:child_process";import{access as ob}from"node:fs/promises";var el=async(e,t)=>{let n=await L(e,t),r=Gn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await ob(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},tl=async e=>{await new Promise((t,n)=>{let r=!1,s=ib("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 ab}from"node:fs/promises";import lb from"node:path";var nl=async(e,t)=>{let n=await L(e,t);if(await he(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 ti(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 T.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 z("sh",["-lc",a],{cwd:n.worktreePath}),d=new Date().toISOString(),u=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:d,exitCode:u}),u!==0){let p=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,h=await V(e,n.id,m=>({...m,status:"review",checks:{...m.checks,results:i,status:"failed",lastRunAt:d},lastFailureReason:p}));return await Wp(e,h),{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 Wp(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},Wp=async(e,t)=>{let n=bn(e,t.artifacts.checkSummaryPath);n&&(await ab(lb.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 rl=async(e,t)=>{let n=await L(e,t);await he(n);let r=await ti(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.title.trim();await Pp(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 cb}from"node:fs/promises";var sl=async(e,t)=>{let n=await L(e,t),r=await ub(n.worktreePath);return V(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},ub=async e=>{try{return await cb(e),!0}catch{return!1}};var il=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await ni(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 ol=async(e,t,n)=>{let r=await De(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}},al=async(e,t)=>{let n=await L(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>De(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};import{access as db,readFile as Bp,rm as pb,writeFile as Vp}from"node:fs/promises";import ui from"node:path";var Gp=["AGENTS","md"].join("."),ll=async(e,t,n)=>Qe(e,t,async()=>{let r=await L(e,t);fb(r);let s=r.repoTargets?.find(m=>m.repoId===n);if(s)return Kp(r.id,s.repoId,s.branch,s.worktreePath,"unchanged");let[i,o]=await Promise.all([De(e,n),Ie(e).then(m=>m.find(f=>f.id===r.workspaceId)??null)]);if(!o||o.kind!=="project"||o.status!=="active"||!o.discoveredRepoIds?.includes(i.id))throw new g("TASK_CONTEXT_CONFLICT",`Repo ${i.id} is not a discovered repository in project workspace ${r.workspaceId}.`,{details:{taskId:r.id,repoId:i.id,workspaceId:r.workspaceId}});let a=r.bundlePath??r.worktreePath,l=ui.join(a,mb(i.name,r)),c=ui.join(a,"manifest.json"),d=ui.join(a,Gp),[u,p,h]=await Promise.all([Bp(c,"utf8"),Bp(d,"utf8"),_r(i.rootPath,r.branch)]);try{let m=await Wa(e,i,r.branch,l),f={...r,linkedRepoIds:i.id===r.repoId||r.linkedRepoIds.includes(i.id)?r.linkedRepoIds:[...r.linkedRepoIds,i.id],repoTargets:[...r.repoTargets??[],m]},y=await Promise.all((f.repoTargets??[]).map(k=>De(e,k.repoId)));return await Ba({taskId:r.id,workspaceId:r.workspaceId,prompt:hb(u)??r.title,repos:y,repoTargets:f.repoTargets??[],bundlePath:a}),await Ze(e,f),Kp(r.id,i.id,m.branch,m.worktreePath,"added")}catch(m){let f=await gb({repoRoot:i.rootPath,branch:r.branch,worktreePath:l,branchAlreadyExisted:h,manifestPath:c,manifestBackup:u,guidePath:d,guideBackup:p});throw f.length>0?new g("PARTIAL_RESULT",`Failed to attach repo ${i.id} to task ${r.id}, and rollback was incomplete.`,{retryable:!0,details:{taskId:r.id,repoId:i.id,rollbackFailures:f.map(y=>y instanceof Error?y.message:String(y))},cause:m}):m}}),fb=e=>{if(e.type!=="project"||!e.bundlePath)throw new g("TASK_CONTEXT_CONFLICT",`Task ${e.id} is not a project task and cannot accept repository targets.`,{details:{taskId:e.id,taskType:e.type}})},mb=(e,t)=>{let n=new Set(["manifest.json",Gp,...(t.repoTargets??[]).map(o=>ui.basename(o.worktreePath))]),r=n.has(e)?`${e}-repo`:e,s=r,i=2;for(;n.has(s);)s=`${r}-${i}`,i+=1;return s},hb=e=>{try{let t=JSON.parse(e);return typeof t.prompt=="string"?t.prompt:null}catch{return null}},gb=async e=>{let t=[];return await Vp(e.manifestPath,e.manifestBackup,"utf8").catch(r=>t.push(r)),await Vp(e.guidePath,e.guideBackup,"utf8").catch(r=>t.push(r)),await db(e.worktreePath).then(()=>!0).catch(()=>!1)&&await ni(e.repoRoot,e.worktreePath).catch(async r=>{t.push(r),await pb(e.worktreePath,{recursive:!0,force:!0}).catch(s=>t.push(s))}),e.branchAlreadyExisted||await _r(e.repoRoot,e.branch).catch(s=>(t.push(s),!1))&&await Cp(e.repoRoot,e.branch).catch(s=>t.push(s)),t},Kp=(e,t,n,r,s)=>({kind:"addTaskRepoTarget",disposition:s,taskId:e,repoId:t,branch:n,worktreePath:r});import{spawn as yb}from"node:child_process";var cl=async(e,t)=>{let n=await L(e,t);await he(n);let s=(await T.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 wb(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},wb=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=yb(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 Yp}from"node:fs/promises";import Yr from"node:path";async function dl(e,t){if(t.explicitTaskId!==void 0){let l=await Hp(e,t.explicitTaskId,"explicit");return ul(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await Hp(e,t.environmentTaskId,"environment");return ul(l,"environment",t.environmentAgentTabId)}let n=await Yp(t.cwd).catch(()=>Yr.resolve(t.cwd)),r=await Lr(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await Tb(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 ul(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 Hp(e,t,n){try{return await L(e,t)}catch(r){throw!(r instanceof g)||r.code!=="TASK_NOT_FOUND"?r:new g("TASK_CONTEXT_NOT_FOUND",`Craig task "${t}" from ${n==="explicit"?"--task":"CRAIG_TASK_ID"} was not found.`,{details:{taskId:t,source:n},cause:r})}}function ul(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 kb(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function Tb(e,t){return(await Promise.all(kb(e).map(r=>Yp(r).catch(()=>Yr.resolve(r))))).some(r=>bb(r,t))}function bb(e,t){let n=Yr.relative(Yr.resolve(e),t);return n===""||!n.startsWith("..")&&!Yr.isAbsolute(n)}var pl=async(e,t,n)=>{let r=n.trim();if(r.length===0)throw new Error("Task title cannot be empty.");let s="",i=await V(e,t,o=>(s=o.title,{...o,title:r,slug:Fr(r)}));return{kind:"renameTask",taskId:i.id,previousTitle:s,title:i.title,slug:i.slug}};var fl=async(e,t,n="merge",r)=>{let s=await L(e,t),i=r??K(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await Lp(s.worktreePath,i,n)};var zr={readTask:L,writeTask:Ze,withTaskLock:Qe,ensureGhAuthenticated:Et,fetchPrView:zn,discoverPrView:Fp,getGitHubRepositoryLocator:ii,writePrStatusArtifact:Rn};async function hl(e,t,n,r=zr){let s=await r.readTask(e,t),i=await Pb(s,n,r);return Ht(s,i,"showTaskPr","shown",[])}async function gl(e,t,n,r=zr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await bl(s,n,null,r);await Rl(i,r);let o=await pi(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return Ht(s,i,"discoverTaskPr","not_found",[]);Pl(o,i);let a=fi(s,i,o.number),l=await Sl(e,s,i,o,r);return Ht(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function yl(e,t,n,r,s=zr){let i=Tl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await bl(o,r,i.repository,s);Jp(i.repository,a),await Rl(a,s);let l=await pi(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));Sb(l,i),Pl(l,a);let c=fi(o,a,l.number),d=Il(o,a),u=d&&!Kn(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 Sl(e,o,a,l,s);return Ht(p,a,"linkTaskPr",c?"unchanged":"linked",u)})}async function Rb(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw tr(e,t);let o=e.prs.find(a=>a.number===n.number)??K(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await di(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw tr(e,t);let a=zp(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&ht({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await di(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&&ht({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&ht({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 wl(e,t,n,r=zr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await bl(s,n,null,r),o=Il(s,i);if(!o?.number)return Ht(s,i,"refreshTaskPr","not_found",[]);await Rl(i,r);let a=await pi(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));Pl(a,i);let l=await Sl(e,s,i,a,r);return Ht(l,i,"refreshTaskPr","synced",[])})}async function kl(e,t,n,r,s=zr){let i=Tl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Rb(o,r,i,s);if(Jp(i.repository,a),!fi(o,a,i.number))return Ht(o,a,"unlinkTaskPr","unchanged",[]);let c=Ib(o,a,i.number),d=await Qp(e,c,s);return Ht(d,a,"unlinkTaskPr","unlinked",[])})}function Tl(e){let t=e.trim(),n=Gt(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 bl(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw tr(e,t);return ml(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 tr(e,t);return ml(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 ml(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&&ht(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 Pb(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw tr(e,t);let s=K(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await di(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 tr(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await di(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function di(e,t,n,r){let s=zp(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function zp(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Gt(e.url):null}async function ml(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 Rl(e,t){await pi("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function pi(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 Jp(e,t){if(e&&!ht(e,t.repository))throw Xp(e,t)}function Sb(e,t){let n=Gt(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&&!ht(t.repository,n))throw new g("PR_REPOSITORY_MISMATCH",`GitHub returned a pull request from ${n.owner}/${n.name}, not ${t.repository.owner}/${t.repository.name}.`,{details:{selectorRepository:t.repository,returnedRepository:n}})}function Pl(e,t){let n=Gt(e.url);if(!n||!ht(n,t.repository))throw Xp(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 Xp(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 tr(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 ht(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function Sl(e,t,n,r,s){let i=fi(t,n,r.number),o=At(r,i,n.repository),a=Ct(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:tf(o)}:l)}),Qp(e,a,s)}function Ib(e,t,n){let r=e.prs.filter(i=>!ef(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=Zp(r.filter(o=>o.owner&&o.repo&&ht({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?tf(i):Cb(t.repository)}:o)}}return s}async function Qp(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?ai(t):Tn(t.prs),s={...t,status:r};return Xn(e,s,n)}function fi(e,t,n){return vl(e,t).find(r=>ef(r,t,n))??null}function Il(e,t){if(!t.projectTarget)return K(e);let n=vl(e,t);return Zp(n)}function Zp(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function vl(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&ht({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?vb(r.pullRequest,t.repository):null;return s&&!n.some(i=>Kn(i,s))?[...n,s]:n}function ef(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||ht({owner:e.owner,name:e.repo},t.repository)}function Ht(e,t,n,r,s){let i=vl(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:Il(e,t),warnings:s}}function tf(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 vb(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 Cb(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:Lr,getTask:L,provisionTask:Yn,provisionProjectTask:jr,createTask:Ga,showTask:Qa,showTaskDiff:Za,prepareTaskLogs:el,streamTaskLogs:tl,runChecks:nl,commitTask:rl,closeTask:sl,cleanupTask:il,addTaskLink:ol,addTaskRepoTarget:ll,listTaskLinks:al,sortTasksForDisplay:qa,resolveSelectedTaskId:Ua,allocateTaskId:ja,allocateTaskIdForRepo:Hn,allocateProjectTaskId:xr,createDefaultTaskPtyTabs:qr,assertTaskWorktreeExists:he,resolveTaskLogPath:Gn,buildTaskInspection:Dr,resolveArtifactPath:bn,openTask:cl,markRunnerFailed:Ka,recordStartupFailure:Ur,markTaskStarted:Wr,renameTask:pl,resolveContext:dl,prs:{refresh:Hr,refreshChecks:Ja,discoverOrRefresh:ci,discoverOrRefreshAll:er,discoverOrRefreshMany:Xa,show:hl,discover:gl,link:yl,refreshAssociation:wl,unlink:kl,merge:fl,getPrimaryPr:K,isPrTerminal:Kt,isMergeReady:ei,deriveTaskStatus:Tn,upsertPr:Ct,normalizePr:At,summarizeRequiredChecks:xa,writePrStatusArtifact:Rn}};var nf={idle:0,ready:1,working:2,error:3};function Ot(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 Yt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return Ot(t,n,r,i)}function nr(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=Yt(e,s.id,t,n);nf[i]>nf[r]&&(r=i)}return r}function mi(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&Ot(s.id,t,n)==="working"))}function gt(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=Yt(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:nr(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function Cl(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=gt([e],t.getSnapshots(),l),d=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:e.id,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw rf(e.id);let u=a-r();if(u<=0)throw Ab(e.id,n.states,n.timeoutMs);let p=s;await new Promise((h,m)=>{let f=()=>{clearTimeout(k),n.signal?.removeEventListener("abort",y),h()},y=()=>{clearTimeout(k),m(rf(e.id))},k=setTimeout(f,u);i=f,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var Ab=(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}}),rf=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as Nb}from"node:net";import{createHash as Eb}from"node:crypto";import{tmpdir as Ob}from"node:os";import sf from"node:path";var Pn=10,$b=new Set([6,7,8,9,Pn]);function zt(e){return e!==void 0&&$b.has(e)}function _e(e){let t=Eb("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:sf.join(Ob(),`craig-${t}.sock`),pidPath:sf.join(e.runtimeDir,"pty-daemon.pid")}}async function of(e){let t=null;try{let n=await Db(_e(e.paths).socketPath);return t=new El(n,e),await t.ready(),t}catch{return t?.close(),null}}var El=class{constructor(t,n){this.socket=t;this.options=n;t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>this.handleClose())}socket;options;pending=new Map;snapshots=new Map;revisionByTabId=new Map;nextRequestId=1;revision=0;buffer="";closed=!1;async ready(){if((await this.send({type:"ping"})).protocolVersion!==Pn)throw new Error("Craig PTY daemon protocol mismatch.");await this.send({type:"setActivityEnabled",enabled:!0});let n=this.revision,r=await this.send({type:"getActivitySnapshots"});this.replaceSnapshots(r.activities??[],n)}getSnapshots(){return[...this.snapshots.values()]}close(){this.closed||(this.closed=!0,this.socket.end(),this.rejectAll(new Error("Craig PTY daemon activity connection closed.")))}async send(t){if(this.closed||this.socket.destroyed)throw new Error("Craig PTY daemon activity connection is closed.");let n=this.nextRequestId++,r=new Promise((i,o)=>{this.pending.set(n,{resolve:i,reject:o})});this.socket.write(`${JSON.stringify({...t,id:n})}
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 Eb(e){return new Promise((t,n)=>{let r=Ab(e);r.once("connect",()=>t(r)),r.once("error",n)})}var El={openObserver:of,listTasks:e=>P.listTasks(e),getTask:(e,t)=>P.getTask(e,t),now:Date.now};async function Ob(e,t,n=El){let r=await sf(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...gt(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function $b(e,t,n=El){let r=await sf(e,t.taskId,n),s=await n.openObserver(e);try{let i=gt(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 Nb(e,t,n,r=El){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await Il(s,i,{...n,now:r.now})}finally{i.close()}}async function sf(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function of(e){return Al.open(e)}async function Db(e){return of(e)}var Al=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 rf({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()}},$t={listAgents:Ob,showAgentStatus:$b,waitForTask:Nb,openObserver:Db};import{randomUUID as eR}from"node:crypto";import{mkdir as Af,open as ql,readdir as Ul,readFile as es,rm as tR,stat as nR}from"node:fs/promises";import ki from"node:path";import{createHash as Mb}from"node:crypto";import{mkdir as Jr,readdir as Nl,readFile as Xr,writeFile as jb}from"node:fs/promises";import Ve from"node:path";import{mkdir as af,readFile as _b,rm as Ol,stat as xb,writeFile as Fb}from"node:fs/promises";import $l from"node:path";async function rr(e,t){let n=$l.join(e.runtimeDir,"fury-store.lock");await af(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await af(n);try{await Fb($l.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await Ol(n,{recursive:!0,force:!0}),s}break}catch(s){if(!lf(s,"EEXIST"))throw s;let i=await _b($l.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await xb(n).catch(()=>null);if(typeof i?.pid=="number"&&!Lb(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await Ol(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 Ol(n,{recursive:!0,force:!0})}}function Lb(e){try{return process.kill(e,0),!0}catch(t){return lf(t,"EPERM")}}var lf=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var ge=e=>({root:Ve.join(e.craigDir,"fury"),definitions:Ve.join(e.craigDir,"fury","definitions"),plans:Ve.join(e.craigDir,"fury","plans"),approvals:Ve.join(e.craigDir,"fury","approvals"),runs:Ve.join(e.craigDir,"fury","runs"),reviews:Ve.join(e.craigDir,"fury","reviews")});function Dl(e){return Mb("sha256").update(JSON.stringify(e)).digest("hex")}async function uf(e,t,n){let r=ge(e);await Jr(r.definitions,{recursive:!0});let s=Ve.join(r.definitions,`${t}.yaml`);await jb(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!Jt(i,"EEXIST"))throw i})}async function df(e,t){return rr(e,async()=>{let n=await pf(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 Jr(ge(e).plans,{recursive:!0}),await q(Rf(e,i.id),i),i})}async function hi(e,t){yi(t,"plan");try{return qb(JSON.parse(await Xr(Rf(e,t),"utf8")),t)}catch(n){throw Jt(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function pf(e){let t=ge(e).plans,n=await Nl(t).catch(s=>Jt(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>hi(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function ff(e){let t=await pf(e),n=await Promise.all(t.map(s=>Fl(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 mf(e,t){return rr(e,async()=>{let n=await Fl(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 Jr(ge(e).approvals,{recursive:!0}),await q(Pf(e,t.planId),t),{approval:t,created:!0}})}async function hf(e,t){yi(t,"plan");let n=await Fl(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function gf(e,t){return rr(e,async()=>{let r=(await wf(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 Jr(ge(e).runs,{recursive:!0}),await q(_l(e,t.id),t),{run:t,created:!0}})}async function pe(e,t){yi(t,"run");try{return Tf(JSON.parse(await Xr(_l(e,t),"utf8")),t)}catch(n){throw Jt(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function yf(e){return wf(e)}async function wf(e){let t=ge(e).runs,n=await Nl(t).catch(s=>Jt(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 Tf(JSON.parse(await Xr(Ve.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ge(e,t,n){return rr(e,async()=>{let r=await pe(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury mutation cannot change its id.",{});return await q(_l(e,t),s),s})}async function kf(e,t){await Jr(ge(e).reviews,{recursive:!0}),await q(xl(e,t.id),t)}async function Qr(e,t,n){return rr(e,async()=>{let r=await sr(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await q(xl(e,t),s),s})}async function sr(e,t){yi(t,"review");try{return Ub(JSON.parse(await Xr(xl(e,t),"utf8")),t)}catch(n){throw Jt(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function gi(e){let t=ge(e).reviews,n=await Nl(t).catch(r=>Jt(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>sr(e,r.slice(0,-5))))}function Tf(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!Oe(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))||!Oe(e.inputs)||!bf(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!Wb(e.stepRuns,e.order)||!Zr(e.actor)||!Ke(e.createdAt)||!Ke(e.updatedAt)||!Ke(e.stateChangedAt)||!Ke(e.deadlineAt)||e.completedAt!==null&&!Ke(e.completedAt))throw new g("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function qb(e,t){if(!Oe(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||!Oe(e.inputs)||!bf(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||!Zr(e.createdBy)||!Ke(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,Dl(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(!Oe(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&&(!Oe(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||!Ke(e.requestedAt)||!Ke(e.deadlineAt)||!Ke(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!cf(r))||e.lastDecision!==null&&!cf(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function Wb(e,t){return Oe(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&Bb(e[n],n))}function Bb(e,t){return!Oe(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")||!Oe(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||Ke(n))&&(e.completedBy===null||Zr(e.completedBy))}function cf(e){return Oe(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")&&Zr(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Ke(e.occurredAt)}function bf(e){return Oe(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 Zr(e){return Oe(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 _l=(e,t)=>Ve.join(ge(e).runs,`${t}.json`),Rf=(e,t)=>Ve.join(ge(e).plans,`${t}.json`),Pf=(e,t)=>Ve.join(ge(e).approvals,`${t}.json`),xl=(e,t)=>Ve.join(ge(e).reviews,`${t}.json`),yi=(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 Fl(e,t){try{let n=JSON.parse(await Xr(Pf(e,t),"utf8"));if(!Oe(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!Zr(n.approvedBy)||!Oe(n.approvedBy)||n.approvedBy.type!=="human"||!Ke(n.approvedAt))throw new g("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(Jt(n,"ENOENT"))return null;throw n}}var Oe=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ke=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Jt=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as Sf,readFile as Vb,rm as wi,stat as Kb,writeFile as Gb}from"node:fs/promises";import Ll from"node:path";var Hb=20,Yb=3e4,zb=5e3;async function If(e,t){let n=Ll.join(e.runtimeDir,"event-journal.lock");await Sf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Sf(n);try{await Gb(Ll.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await wi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!Qb(s))throw s;if(await Jb(n))continue;if(Date.now()-r>=Yb)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await Zb(Hb)}try{return await t()}finally{await wi(n,{recursive:!0,force:!0})}}async function Jb(e){let t=await Vb(Ll.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return Xb(t.pid)?!1:(await wi(e,{recursive:!0,force:!0}),!0);let n=await Kb(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<zb?!1:(await wi(e,{recursive:!0,force:!0}),!0)}function Xb(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 Qb=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Zb=e=>new Promise(t=>setTimeout(t,e));var rR=256*1024,sR=16,iR=64*1024;async function xe(e,t,n={}){let r=jl(n.maxSegmentBytes??rR,"Event journal segment size"),s=jl(n.maxSegments??sR,"Event journal retention"),i=jl(n.maxRecordBytes??iR,"Event record size");return If(e,async()=>{await Af(e.eventsDir,{recursive:!0}),await dR(e);let o=await Wl(e),a=t.id??eR(),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:mR(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 h=(await Ti(e)).at(-1),m=!h||await oR(h.path,u,r);if(m&&(h={name:Cf(c),path:ki.join(e.eventsDir,Cf(c)),startSequence:c}),!h)throw new g("INTERNAL_ERROR","Failed to select an event journal segment.",{});let f=await ql(h.path,"a");try{await f.writeFile(u,"utf8"),await f.sync()}finally{await f.close()}return m&&await Of(e.eventsDir),await aR(e,s),d})}async function Sn(e,t={}){let n=await Wl(e),r=pR(n.events,t.after,n.earliestSequence,n.events.at(-1)?.sequence??null),s=t.typeGlob?fR(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 Ef(e){return(await Wl(e)).events}async function Wl(e){await Af(e.eventsDir,{recursive:!0});let t=await Ti(e),n=[],r=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await es(i.path,"utf8"),a=s===t.length-1,l=o.split(`
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 Db(e){return new Promise((t,n)=>{let r=Nb(e);r.once("connect",()=>t(r)),r.once("error",n)})}var $l={openObserver:lf,listTasks:e=>P.listTasks(e),getTask:(e,t)=>P.getTask(e,t),now:Date.now};async function _b(e,t,n=$l){let r=await af(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...gt(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function xb(e,t,n=$l){let r=await af(e,t.taskId,n),s=await n.openObserver(e);try{let i=gt(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 Lb(e,t,n,r=$l){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await Cl(s,i,{...n,now:r.now})}finally{i.close()}}async function af(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function lf(e){return Ol.open(e)}async function Fb(e){return lf(e)}var Ol=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 of({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()}},$t={listAgents:_b,showAgentStatus:xb,waitForTask:Lb,openObserver:Fb};import{randomUUID as sR}from"node:crypto";import{mkdir as Of,open as Wl,readdir as Bl,readFile as es,rm as iR,stat as oR}from"node:fs/promises";import ki from"node:path";import{createHash as Wb}from"node:crypto";import{mkdir as Jr,readdir as _l,readFile as Xr,writeFile as Bb}from"node:fs/promises";import Ve from"node:path";import{mkdir as cf,readFile as Mb,rm as Nl,stat as jb,writeFile as qb}from"node:fs/promises";import Dl from"node:path";async function rr(e,t){let n=Dl.join(e.runtimeDir,"fury-store.lock");await cf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await cf(n);try{await qb(Dl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await Nl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!uf(s,"EEXIST"))throw s;let i=await Mb(Dl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await jb(n).catch(()=>null);if(typeof i?.pid=="number"&&!Ub(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await Nl(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 Nl(n,{recursive:!0,force:!0})}}function Ub(e){try{return process.kill(e,0),!0}catch(t){return uf(t,"EPERM")}}var uf=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var ge=e=>({root:Ve.join(e.craigDir,"fury"),definitions:Ve.join(e.craigDir,"fury","definitions"),plans:Ve.join(e.craigDir,"fury","plans"),approvals:Ve.join(e.craigDir,"fury","approvals"),runs:Ve.join(e.craigDir,"fury","runs"),reviews:Ve.join(e.craigDir,"fury","reviews")});function xl(e){return Wb("sha256").update(JSON.stringify(e)).digest("hex")}async function pf(e,t,n){let r=ge(e);await Jr(r.definitions,{recursive:!0});let s=Ve.join(r.definitions,`${t}.yaml`);await Bb(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!Jt(i,"EEXIST"))throw i})}async function ff(e,t){return rr(e,async()=>{let n=await mf(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 Jr(ge(e).plans,{recursive:!0}),await q(Sf(e,i.id),i),i})}async function hi(e,t){yi(t,"plan");try{return Vb(JSON.parse(await Xr(Sf(e,t),"utf8")),t)}catch(n){throw Jt(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function mf(e){let t=ge(e).plans,n=await _l(t).catch(s=>Jt(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>hi(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function hf(e){let t=await mf(e),n=await Promise.all(t.map(s=>Ml(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 gf(e,t){return rr(e,async()=>{let n=await Ml(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 Jr(ge(e).approvals,{recursive:!0}),await q(If(e,t.planId),t),{approval:t,created:!0}})}async function yf(e,t){yi(t,"plan");let n=await Ml(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function wf(e,t){return rr(e,async()=>{let r=(await Tf(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 Jr(ge(e).runs,{recursive:!0}),await q(Ll(e,t.id),t),{run:t,created:!0}})}async function pe(e,t){yi(t,"run");try{return Rf(JSON.parse(await Xr(Ll(e,t),"utf8")),t)}catch(n){throw Jt(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function kf(e){return Tf(e)}async function Tf(e){let t=ge(e).runs,n=await _l(t).catch(s=>Jt(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 Rf(JSON.parse(await Xr(Ve.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ge(e,t,n){return rr(e,async()=>{let r=await pe(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury mutation cannot change its id.",{});return await q(Ll(e,t),s),s})}async function bf(e,t){await Jr(ge(e).reviews,{recursive:!0}),await q(Fl(e,t.id),t)}async function Qr(e,t,n){return rr(e,async()=>{let r=await sr(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await q(Fl(e,t),s),s})}async function sr(e,t){yi(t,"review");try{return Kb(JSON.parse(await Xr(Fl(e,t),"utf8")),t)}catch(n){throw Jt(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function gi(e){let t=ge(e).reviews,n=await _l(t).catch(r=>Jt(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>sr(e,r.slice(0,-5))))}function Rf(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!Oe(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))||!Oe(e.inputs)||!Pf(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!Gb(e.stepRuns,e.order)||!Zr(e.actor)||!Ke(e.createdAt)||!Ke(e.updatedAt)||!Ke(e.stateChangedAt)||!Ke(e.deadlineAt)||e.completedAt!==null&&!Ke(e.completedAt))throw new g("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function Vb(e,t){if(!Oe(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||!Oe(e.inputs)||!Pf(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||!Zr(e.createdBy)||!Ke(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,xl(n)!==e.planHash)throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function Kb(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!Oe(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&&(!Oe(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||!Ke(e.requestedAt)||!Ke(e.deadlineAt)||!Ke(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!df(r))||e.lastDecision!==null&&!df(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function Gb(e,t){return Oe(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&Hb(e[n],n))}function Hb(e,t){return!Oe(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")||!Oe(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||Ke(n))&&(e.completedBy===null||Zr(e.completedBy))}function df(e){return Oe(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")&&Zr(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Ke(e.occurredAt)}function Pf(e){return Oe(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 Zr(e){return Oe(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 Ll=(e,t)=>Ve.join(ge(e).runs,`${t}.json`),Sf=(e,t)=>Ve.join(ge(e).plans,`${t}.json`),If=(e,t)=>Ve.join(ge(e).approvals,`${t}.json`),Fl=(e,t)=>Ve.join(ge(e).reviews,`${t}.json`),yi=(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 Ml(e,t){try{let n=JSON.parse(await Xr(If(e,t),"utf8"));if(!Oe(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!Zr(n.approvedBy)||!Oe(n.approvedBy)||n.approvedBy.type!=="human"||!Ke(n.approvedAt))throw new g("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(Jt(n,"ENOENT"))return null;throw n}}var Oe=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ke=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Jt=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as vf,readFile as Yb,rm as wi,stat as zb,writeFile as Jb}from"node:fs/promises";import jl from"node:path";var Xb=20,Qb=3e4,Zb=5e3;async function Cf(e,t){let n=jl.join(e.runtimeDir,"event-journal.lock");await vf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await vf(n);try{await Jb(jl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await wi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!nR(s))throw s;if(await eR(n))continue;if(Date.now()-r>=Qb)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await rR(Xb)}try{return await t()}finally{await wi(n,{recursive:!0,force:!0})}}async function eR(e){let t=await Yb(jl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return tR(t.pid)?!1:(await wi(e,{recursive:!0,force:!0}),!0);let n=await zb(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<Zb?!1:(await wi(e,{recursive:!0,force:!0}),!0)}function tR(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var nR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",rR=e=>new Promise(t=>setTimeout(t,e));var aR=256*1024,lR=16,cR=64*1024;async function xe(e,t,n={}){let r=Ul(n.maxSegmentBytes??aR,"Event journal segment size"),s=Ul(n.maxSegments??lR,"Event journal retention"),i=Ul(n.maxRecordBytes??cR,"Event record size");return Cf(e,async()=>{await Of(e.eventsDir,{recursive:!0}),await hR(e);let o=await Vl(e),a=t.id??sR(),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:wR(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 h=(await Ti(e)).at(-1),m=!h||await uR(h.path,u,r);if(m&&(h={name:Ef(c),path:ki.join(e.eventsDir,Ef(c)),startSequence:c}),!h)throw new g("INTERNAL_ERROR","Failed to select an event journal segment.",{});let f=await Wl(h.path,"a");try{await f.writeFile(u,"utf8"),await f.sync()}finally{await f.close()}return m&&await Nf(e.eventsDir),await dR(e,s),d})}async function Sn(e,t={}){let n=await Vl(e),r=gR(n.events,t.after,n.earliestSequence,n.events.at(-1)?.sequence??null),s=t.typeGlob?yR(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 $f(e){return(await Vl(e)).events}async function Vl(e){await Of(e.eventsDir,{recursive:!0});let t=await Ti(e),n=[],r=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await es(i.path,"utf8"),a=s===t.length-1,l=o.split(`
76
76
  `);if(o.endsWith(`
77
- `))l.pop();else{if(!a)throw Xt(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 Xt(i.name,`empty record at line ${c+1}`);let u;try{u=JSON.parse(d)}catch{throw Xt(i.name,`invalid JSON at line ${c+1}`)}let p=hR(u,i.name,c+1);if(c===0&&p.sequence!==i.startSequence)throw Xt(i.name,`first record sequence ${p.sequence} does not match segment name`);if(r.has(p.id))throw Xt(i.name,`duplicate event id ${p.id}`);r.add(p.id);let h=n.at(-1);if(h&&p.sequence!==h.sequence+1)throw Xt(i.name,`non-monotonic sequence ${p.sequence} after ${h.sequence}`);n.push(p)}}return{events:n,earliestSequence:n[0]?.sequence??null}}async function Ti(e){return(await Ul(e.eventsDir).catch(n=>{if(Bl(n))return[];throw n})).flatMap(n=>{let r=/^segment-(\d{16})\.jsonl$/.exec(n);return r?[{name:n,path:ki.join(e.eventsDir,n),startSequence:Number(r[1])}]:[]}).sort((n,r)=>n.startSequence-r.startSequence)}async function oR(e,t,n){let r=await nR(e).catch(()=>null);return r!==null&&r.size>0&&r.size+Buffer.byteLength(t)>n}async function aR(e,t){let n=await Ti(e),r=Math.max(0,n.length-t),s=await cR(e),i=await lR(e);if(s===null||i===null)return;for(let a=0;a<r;a+=1)if(await uR(n[a].path,s,i)){r=a;break}let o=n.slice(0,r);for(let a of o)await tR(a.path,{force:!0});o.length>0&&await Of(e.eventsDir)}async function lR(e){let t=ge(e).runs,n=await Ul(t).catch(s=>{if(Bl(s))return[];throw s}),r=new Set;for(let s of n.filter(i=>i.endsWith(".json")))try{let i=JSON.parse(await es(ki.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 cR(e){let t=await Ul(e.commandsDir).catch(r=>{if(Bl(r))return[];throw r}),n=new Set;for(let r of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await es(ki.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 uR(e,t,n){if(t.size===0&&n.size===0)return!1;let r=await es(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 dR(e){let t=(await Ti(e)).at(-1);if(!t)return;let n=await es(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await ql(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function pR(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 Ml(t);return vf(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}}):Ml(t);return vf(t,s.sequence,n),s.sequence}function vf(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 fR(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 mR(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 hR(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw Xt(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))||!ir(i.workspaceId)||!ir(i.taskId)||!ir(i.agentTabId)||!ir(i.commandId)||!ir(i.furyRunId)||!ir(i.furyStepId)||!gR(i.actor)||!("data"in i))throw Xt(t,`record at line ${n} has an invalid schema`);return i}function gR(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 ir=e=>e===null||typeof e=="string",Cf=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,Xt=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),Ml=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),Bl=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function jl(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 Of(e){let t=await ql(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as Df,readdir as CR,readFile as _f}from"node:fs/promises";import xf from"node:path";import{mkdir as $f,readFile as yR,rm as bi,stat as wR,writeFile as kR}from"node:fs/promises";import Vl from"node:path";var TR=20,bR=3e4,RR=5e3;async function Kl(e,t){let n=Vl.join(e.runtimeDir,"command-store.lock");await $f(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await $f(n);try{await kR(Vl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await bi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!IR(s))throw s;if(await PR(n))continue;if(Date.now()-r>=bR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await vR(TR)}try{return await t()}finally{await bi(n,{recursive:!0,force:!0})}}async function PR(e){let t=await yR(Vl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return SR(t.pid)?!1:(await bi(e,{recursive:!0,force:!0}),!0);let n=await wR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<RR?!1:(await bi(e,{recursive:!0,force:!0}),!0)}function SR(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 IR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",vR=e=>new Promise(t=>setTimeout(t,e));async function Si(e,t){Gl(t);try{let n=JSON.parse(await _f(ts(e,t),"utf8"));return Lf(n,ts(e,t),t)}catch(n){throw $R(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?Pi(t,ts(e,t),n):n}}async function He(e){await Df(e.commandsDir,{recursive:!0});let t=await CR(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=xf.join(e.commandsDir,r);try{n.push(Lf(JSON.parse(await _f(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:Pi(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function Ff(e,t){return Gl(t.id),Kl(e,async()=>{await Df(e.commandsDir,{recursive:!0});let n=await He(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!AR(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(ts(e,t.id),t),{command:t,created:!0}})}async function ns(e,t,n){return Gl(t),Kl(e,async()=>{let r=await Si(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await q(ts(e,t),s),s})}function AR(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 Lf(e,t,n){if(!Ri(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw Pi("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||!Ri(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!OR(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||!or(e.expiresAt)||!or(e.createdAt)||!or(e.updatedAt)||e.deliveryStartedAt!==null&&!or(e.deliveryStartedAt)||e.deliveredAt!==null&&!or(e.deliveredAt)||e.cancelledAt!==null&&!or(e.cancelledAt)||e.cancelledBy!==null&&!Nf(e.cancelledBy)||!Nf(e.actor)||!ER(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 Pi(r,t);return e}function Nf(e){return!Ri(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 ER(e){return e===null||Ri(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var ts=(e,t)=>xf.join(e.commandsDir,`${t}.json`),Gl=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},or=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),OR=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}),Ri=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),$R=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",Pi=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function Mf(e,t=new Date){return Ii(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function jf(e,t=new Date){return e.state==="delivered"?e:(Ii(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function qf(e,t,n=new Date){return e.state==="failed"?e:(Ii(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function Uf(e,t,n=new Date){return e.state==="cancelled"?e:(Ii(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function Ii(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 NR}from"node:crypto";var Hl=32*1024,Wf=1440*60*1e3,Yl=256,DR=["delivered","failed","cancelled"],zl={type:"system",component:"orchestration-supervisor"};async function _R(e,t){if(WR(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>Wf)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:Wf}});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)>Yl)throw new g("CLI_USAGE",`Idempotency key exceeds ${Yl} characters.`,{details:{maxIdempotencyKeyLength:Yl}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${NR()}`,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 Ff(e,r);if(s.created)try{await In(e,s.command,"command.queued")}catch(i){throw Bf(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function xR(e,t){return{kind:"showPromptCommand",command:await Si(e,t)}}async function FR(e,t){let n=await He(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function LR(e,t,n){let r=!1,s=await ns(e,t,i=>{if(i.state==="cancelled")return i;let o=Uf(i,n??i.actor);return r=!0,o});if(r)try{await In(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw Bf(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function MR(e,t){let n=await ns(e,t,r=>Mf(r));return await In(e,n,"command.delivering",zl),n}async function jR(e,t){let n=await ns(e,t,r=>jf(r));return await In(e,n,"command.delivered",zl),n}async function qR(e,t,n){let r=await ns(e,t,s=>qf(s,n));return await In(e,r,"command.failed",zl),r}async function UR(e,t,n){let r=[...n.states??DR],s=Date.now()+n.timeoutMs;for(;;){let i=await Si(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 BR(Math.min(n.pollIntervalMs??100,o),n.signal)}}function WR(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>Hl)throw new g("CLI_USAGE",`Prompt exceeds the ${Hl}-byte limit.`,{details:{maxPromptBytes:Hl,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 In(e,t,n,r=t.actor){await xe(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 BR(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}),ae={create:_R,show:xR,list:FR,cancel:LR,wait:UR,beginDelivery:MR,completeDelivery:jR,fail:qR};import{randomUUID as Kf,timingSafeEqual as VR}from"node:crypto";import{mkdir as KR,readFile as GR,readdir as HR}from"node:fs/promises";import Gf from"node:path";var YR=10080*60*1e3,zR={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},JR=["task.create-child","task.children","task.cancel-tree"],XR=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function et(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 KR(Zl(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_${Kf()}`,c=await vi(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 QR(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 QR(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${Kf()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...JR],targetPolicy:"children-only",limits:{...zR},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+YR).toISOString(),revokedAt:null,revokedBy:null};return await q(ec(e,o.id),o,{mode:384}),o}async function Ye(e,t,n,r){let s=await eP(e,t);return s.revokedAt&&vn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&vn(s.id,"expired"),!XR.has(n)&&!s.allowedCommandFamilies.includes(n)&&vn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await ZR(e,s.taskId,r)&&vn(s.id,`target task ${r} is outside the capability task subtree`),{capability:s,actor:{type:"agent",taskId:s.taskId,agentTabId:s.agentTabId,capabilityId:s.id}}}async function ZR(e,t,n){if(t===n)return!0;let r=(await 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 Hf(e,t,n){let r=await vi(e,t);r&&(r.revokedAt||await q(ec(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function Ql(e,t,n){let r=await HR(Zl(e)).catch(i=>Yf(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 vi(e,o[1]);!a||!t.has(a.taskId)||(await Hf(e,a.id,n),s.push(a.id))}return s}async function eP(e,t){let n=t.indexOf("."),r=n>0?t.slice(0,n):"";/^capability_[A-Za-z0-9-]+$/.test(r)||vn("<redacted>","token is invalid");let s=await vi(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||!VR(i,o))&&vn(r,"token is invalid"),s}async function vi(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||vn(t,"identifier is invalid");try{let n=JSON.parse(await GR(ec(e,t),"utf8"));if(!tP(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(Yf(n))return null;throw n}}function tP(e,t){if(!Xl(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"&&nP(r))&&e.targetPolicy==="children-only"&&Xl(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&Jl(e.createdAt)&&Jl(e.expiresAt)&&Vf(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||Jl(e.revokedAt)&&Vf(e.revokedBy))}function Vf(e){return Xl(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 vn(e,t){throw new g("CAPABILITY_DENIED",`Craig capability ${e} was denied: ${t}.`,{details:{capabilityId:e,reason:t}})}var Zl=e=>Gf.join(e.orchestrationDir,"capabilities"),ec=(e,t)=>Gf.join(Zl(e),`${t}.json`),nP=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),Xl=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Jl=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Yf=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as zf,readFile as rP,rm as tc,stat as sP,writeFile as iP}from"node:fs/promises";import nc from"node:path";var oP=20,aP=3e4,lP=5e3;async function rc(e,t){let n=nc.join(e.runtimeDir,"delegation.lock");await zf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await zf(n);try{await iP(nc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await tc(n,{recursive:!0,force:!0}),s}break}catch(s){if(!dP(s))throw s;if(await cP(n))continue;if(Date.now()-r>=aP)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,oP))}try{return await t()}finally{await tc(n,{recursive:!0,force:!0})}}async function cP(e){let t=await rP(nc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&uP(t.pid))return!1;let n=await sP(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<lP?!1:(await tc(e,{recursive:!0,force:!0}),!0)}function uP(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 dP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var pP={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function sc(e,t,n,r={}){let s=await T.load(e);return T.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 et(e,i,{type:"human",source:"cli",processId:process.pid})})}):P.createTask(e,t,n,r)}async function ic(e,t,n={}){return rc(e,async()=>{let r=await P.getTask(e,t.parentTaskId),s=t.capabilityId?await Ye(e,t.capabilityId,"task.create-child",r.id):null,i=s?.actor??{type:"human",source:"cli",processId:process.pid},o=s?.capability.limits??pP,a=fP(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&&Ci("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&Ci("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(k=>k.delegationIdempotencyKey===p);if(y){if(!mP(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 Jf(y,!0)}}u.length>=o.maxChildren&&Ci("children",o.maxChildren),u.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&Ci("concurrent children",o.maxConcurrentChildren);let m=await(n.createTask??P.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 et(e,y,i)})}),f=await P.getTask(e,m.taskId);try{await xe(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 Jf(f,!1)})}async function oc(e,t,n){n&&await Ye(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 ac(e,t,n){return rc(e,async()=>{let s=(n?await Ye(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(m=>[m.id,m])),a=new Map;for(let m of i)m.parentTaskId&&a.set(m.parentTaskId,[...a.get(m.parentTaskId)??[],m]);let l=[],c=new Set,d=m=>{if(c.has(m))throw new g("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${m}.`,{details:{taskId:m,rootTaskId:t}});let f=o.get(m);if(f){c.add(m),l.push(f);for(let y of(a.get(m)??[]).sort((k,R)=>k.id.localeCompare(R.id)))d(y.id)}};d(t);let u=[],p=[],h=[];try{await Ql(e,new Set(l.map(m=>m.id)),s)}catch{h.push(...l.map(m=>m.id))}for(let m of l){let f=m.status;if(f==="closed"){u.push({taskId:m.id,previousStatus:f,status:"closed",disposition:"already-closed"});continue}await P.cleanupTask(e,m,{preserveWorktree:!0});let y=await P.closeTask(e,m.id);u.push({taskId:m.id,previousStatus:f,status:y.status,disposition:"cancelled"});try{await xe(e,{workspaceId:m.workspaceId,taskId:m.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:f}})}catch{p.push(m.id)}}if(p.length>0||h.length>0)throw new g("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:u,auditFailures:p,revocationFailures:h,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:u}})}function Jf(e,t){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 fP(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 mP(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function Ci(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var Ai=Symbol.for("yaml.alias"),Ei=Symbol.for("yaml.document"),tt=Symbol.for("yaml.map"),lc=Symbol.for("yaml.pair"),Fe=Symbol.for("yaml.scalar"),Nt=Symbol.for("yaml.seq"),ve=Symbol.for("yaml.node.type"),Le=e=>!!e&&typeof e=="object"&&e[ve]===Ai,yt=e=>!!e&&typeof e=="object"&&e[ve]===Ei,nt=e=>!!e&&typeof e=="object"&&e[ve]===tt,M=e=>!!e&&typeof e=="object"&&e[ve]===lc,_=e=>!!e&&typeof e=="object"&&e[ve]===Fe,rt=e=>!!e&&typeof e=="object"&&e[ve]===Nt;function W(e){if(e&&typeof e=="object")switch(e[ve]){case tt:case Nt:return!0}return!1}function j(e){if(e&&typeof e=="object")switch(e[ve]){case Ai:case tt:case Fe:case Nt:return!0}return!1}var Oi=e=>(_(e)||W(e))&&!!e.anchor;var $e=Symbol("break visit"),Xf=Symbol("skip children"),wt=Symbol("remove node");function ze(e,t){let n=Qf(t);yt(e)?ar(null,e.contents,n,Object.freeze([e]))===wt&&(e.contents=null):ar(null,e,n,Object.freeze([]))}ze.BREAK=$e;ze.SKIP=Xf;ze.REMOVE=wt;function ar(e,t,n,r){let s=Zf(e,t,n,r);if(j(s)||M(s))return em(e,r,s),ar(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=ar(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===$e)return $e;o===wt&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=ar("key",t.key,n,r);if(i===$e)return $e;i===wt&&(t.key=null);let o=ar("value",t.value,n,r);if(o===$e)return $e;o===wt&&(t.value=null)}}return s}async function $i(e,t){let n=Qf(t);yt(e)?await lr(null,e.contents,n,Object.freeze([e]))===wt&&(e.contents=null):await lr(null,e,n,Object.freeze([]))}$i.BREAK=$e;$i.SKIP=Xf;$i.REMOVE=wt;async function lr(e,t,n,r){let s=await Zf(e,t,n,r);if(j(s)||M(s))return em(e,r,s),lr(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 lr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===$e)return $e;o===wt&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=await lr("key",t.key,n,r);if(i===$e)return $e;i===wt&&(t.key=null);let o=await lr("value",t.value,n,r);if(o===$e)return $e;o===wt&&(t.value=null)}}return s}function Qf(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 Zf(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(nt(t))return n.Map?.(e,t,r);if(rt(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(Le(t))return n.Alias?.(e,t,r)}function em(e,t,n){let r=t[t.length-1];if(W(r))r.items[e]=n;else if(M(r))e==="key"?r.key=n:r.value=n;else if(yt(r))r.contents=n;else{let s=Le(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var hP={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},gP=e=>e.replace(/[!,[\]{}]/g,t=>hP[t]),kt=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+gP(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={};ze(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
- `)}};kt.defaultYaml={explicit:!1,version:"1.2"};kt.defaultTags={"!!":"tag:yaml.org,2002:"};function Ni(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 cc(e){let t=new Set;return ze(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function uc(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function tm(e,t){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=cc(e));let o=uc(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)||W(o.node)))o.node.anchor=o.anchor;else{let a=new Error("Failed to resolve repeated object (this should not happen)");throw a.source=i,a}}},sourceObjects:r}}function Qt(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=Qt(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=Qt(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=Qt(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=Qt(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||!Oi(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,ve,{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(!yt(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"?Qt(i,{"":a},"",a):a}};var Dt=class extends Zt{constructor(t){super(Ai),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=[],ze(t,{Node:(i,o)=>{(Le(o)||Oi(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=Di(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(Ni(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 Di(e,t,n){if(Le(t)){let r=t.resolve(e),s=n&&r&&n.get(r);return s?s.count*s.aliasCount:0}else if(W(t)){let r=0;for(let s of t.items){let i=Di(e,s,n);i>r&&(r=i)}return r}else if(M(t)){let r=Di(e,t.key,n),s=Di(e,t.value,n);return Math.max(r,s)}return 1}var _i=e=>!e||typeof e!="function"&&typeof e!="object",E=class extends Zt{constructor(t){super(Fe),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 yP="tag:yaml.org,2002:";function wP(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(yt(e)&&(e=e.contents),j(e))return e;if(M(e)){let u=n.schema[tt].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 Dt(l.anchor);l={anchor:null,node:null},a.set(e,l)}t?.startsWith("!!")&&(t=yP+t.slice(2));let c=wP(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[tt]:Symbol.iterator in Object(e)?o[Nt]:o[tt]}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 rs(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 ur=e=>e==null||typeof e=="object"&&!!e[Symbol.iterator]().next().done,cr=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(ur(t))this.add(n);else{let[r,...s]=t,i=this.get(r,!0);if(W(i))i.addIn(s,n);else if(i===void 0&&this.schema)this.set(r,rs(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}deleteIn(t){let[n,...r]=t;if(r.length===0)return this.delete(n);let s=this.get(n,!0);if(W(s))return s.deleteIn(r);throw new Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}getIn(t,n){let[r,...s]=t,i=this.get(r,!0);return s.length===0?!n&&_(i)?i.value:i:W(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 W(s)?s.hasIn(r):!1}setIn(t,n){let[r,...s]=t;if(s.length===0)this.set(r,n);else{let i=this.get(r,!0);if(W(i))i.setIn(s,n);else if(i===void 0&&this.schema)this.set(r,rs(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};var nm=e=>e.replace(/^(?!$)(?: $)?/gm,"#");function Je(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var Tt=(e,t,n)=>e.endsWith(`
77
+ `))l.pop();else{if(!a)throw Xt(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 Xt(i.name,`empty record at line ${c+1}`);let u;try{u=JSON.parse(d)}catch{throw Xt(i.name,`invalid JSON at line ${c+1}`)}let p=kR(u,i.name,c+1);if(c===0&&p.sequence!==i.startSequence)throw Xt(i.name,`first record sequence ${p.sequence} does not match segment name`);if(r.has(p.id))throw Xt(i.name,`duplicate event id ${p.id}`);r.add(p.id);let h=n.at(-1);if(h&&p.sequence!==h.sequence+1)throw Xt(i.name,`non-monotonic sequence ${p.sequence} after ${h.sequence}`);n.push(p)}}return{events:n,earliestSequence:n[0]?.sequence??null}}async function Ti(e){return(await Bl(e.eventsDir).catch(n=>{if(Kl(n))return[];throw n})).flatMap(n=>{let r=/^segment-(\d{16})\.jsonl$/.exec(n);return r?[{name:n,path:ki.join(e.eventsDir,n),startSequence:Number(r[1])}]:[]}).sort((n,r)=>n.startSequence-r.startSequence)}async function uR(e,t,n){let r=await oR(e).catch(()=>null);return r!==null&&r.size>0&&r.size+Buffer.byteLength(t)>n}async function dR(e,t){let n=await Ti(e),r=Math.max(0,n.length-t),s=await fR(e),i=await pR(e);if(s===null||i===null)return;for(let a=0;a<r;a+=1)if(await mR(n[a].path,s,i)){r=a;break}let o=n.slice(0,r);for(let a of o)await iR(a.path,{force:!0});o.length>0&&await Nf(e.eventsDir)}async function pR(e){let t=ge(e).runs,n=await Bl(t).catch(s=>{if(Kl(s))return[];throw s}),r=new Set;for(let s of n.filter(i=>i.endsWith(".json")))try{let i=JSON.parse(await es(ki.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 fR(e){let t=await Bl(e.commandsDir).catch(r=>{if(Kl(r))return[];throw r}),n=new Set;for(let r of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await es(ki.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 mR(e,t,n){if(t.size===0&&n.size===0)return!1;let r=await es(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 hR(e){let t=(await Ti(e)).at(-1);if(!t)return;let n=await es(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await Wl(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function gR(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 ql(t);return Af(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}}):ql(t);return Af(t,s.sequence,n),s.sequence}function Af(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 yR(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 wR(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 kR(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw Xt(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))||!ir(i.workspaceId)||!ir(i.taskId)||!ir(i.agentTabId)||!ir(i.commandId)||!ir(i.furyRunId)||!ir(i.furyStepId)||!TR(i.actor)||!("data"in i))throw Xt(t,`record at line ${n} has an invalid schema`);return i}function TR(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 ir=e=>e===null||typeof e=="string",Ef=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,Xt=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),ql=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),Kl=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Ul(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 Nf(e){let t=await Wl(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as xf,readdir as $R,readFile as Lf}from"node:fs/promises";import Ff from"node:path";import{mkdir as Df,readFile as bR,rm as bi,stat as RR,writeFile as PR}from"node:fs/promises";import Gl from"node:path";var SR=20,IR=3e4,vR=5e3;async function Hl(e,t){let n=Gl.join(e.runtimeDir,"command-store.lock");await Df(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Df(n);try{await PR(Gl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await bi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!ER(s))throw s;if(await CR(n))continue;if(Date.now()-r>=IR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await OR(SR)}try{return await t()}finally{await bi(n,{recursive:!0,force:!0})}}async function CR(e){let t=await bR(Gl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return AR(t.pid)?!1:(await bi(e,{recursive:!0,force:!0}),!0);let n=await RR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<vR?!1:(await bi(e,{recursive:!0,force:!0}),!0)}function AR(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 ER=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",OR=e=>new Promise(t=>setTimeout(t,e));async function Si(e,t){Yl(t);try{let n=JSON.parse(await Lf(ts(e,t),"utf8"));return jf(n,ts(e,t),t)}catch(n){throw xR(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?Pi(t,ts(e,t),n):n}}async function He(e){await xf(e.commandsDir,{recursive:!0});let t=await $R(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=Ff.join(e.commandsDir,r);try{n.push(jf(JSON.parse(await Lf(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:Pi(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 Yl(t.id),Hl(e,async()=>{await xf(e.commandsDir,{recursive:!0});let n=await He(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!NR(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(ts(e,t.id),t),{command:t,created:!0}})}async function ns(e,t,n){return Yl(t),Hl(e,async()=>{let r=await Si(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await q(ts(e,t),s),s})}function NR(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 jf(e,t,n){if(!Ri(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw Pi("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||!Ri(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!_R(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||!or(e.expiresAt)||!or(e.createdAt)||!or(e.updatedAt)||e.deliveryStartedAt!==null&&!or(e.deliveryStartedAt)||e.deliveredAt!==null&&!or(e.deliveredAt)||e.cancelledAt!==null&&!or(e.cancelledAt)||e.cancelledBy!==null&&!_f(e.cancelledBy)||!_f(e.actor)||!DR(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 Pi(r,t);return e}function _f(e){return!Ri(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 DR(e){return e===null||Ri(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var ts=(e,t)=>Ff.join(e.commandsDir,`${t}.json`),Yl=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},or=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),_R=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}),Ri=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),xR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",Pi=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function qf(e,t=new Date){return Ii(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function Uf(e,t=new Date){return e.state==="delivered"?e:(Ii(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:(Ii(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function Bf(e,t,n=new Date){return e.state==="cancelled"?e:(Ii(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function Ii(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 LR}from"node:crypto";var zl=32*1024,Vf=1440*60*1e3,Jl=256,FR=["delivered","failed","cancelled"],Xl={type:"system",component:"orchestration-supervisor"};async function MR(e,t){if(GR(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>Vf)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:Vf}});if(t.idempotencyKey!==void 0&&t.idempotencyKey!==null&&t.idempotencyKey.trim().length===0)throw new g("CLI_USAGE","Idempotency key cannot be empty.",{});if((t.idempotencyKey?.length??0)>Jl)throw new g("CLI_USAGE",`Idempotency key exceeds ${Jl} characters.`,{details:{maxIdempotencyKeyLength:Jl}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${LR()}`,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 In(e,s.command,"command.queued")}catch(i){throw Kf(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function jR(e,t){return{kind:"showPromptCommand",command:await Si(e,t)}}async function qR(e,t){let n=await He(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function UR(e,t,n){let r=!1,s=await ns(e,t,i=>{if(i.state==="cancelled")return i;let o=Bf(i,n??i.actor);return r=!0,o});if(r)try{await In(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw Kf(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function WR(e,t){let n=await ns(e,t,r=>qf(r));return await In(e,n,"command.delivering",Xl),n}async function BR(e,t){let n=await ns(e,t,r=>Uf(r));return await In(e,n,"command.delivered",Xl),n}async function VR(e,t,n){let r=await ns(e,t,s=>Wf(s,n));return await In(e,r,"command.failed",Xl),r}async function KR(e,t,n){let r=[...n.states??FR],s=Date.now()+n.timeoutMs;for(;;){let i=await Si(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 HR(Math.min(n.pollIntervalMs??100,o),n.signal)}}function GR(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>zl)throw new g("CLI_USAGE",`Prompt exceeds the ${zl}-byte limit.`,{details:{maxPromptBytes:zl,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 In(e,t,n,r=t.actor){await xe(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 HR(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 Kf=(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:MR,show:jR,list:qR,cancel:UR,wait:KR,beginDelivery:WR,completeDelivery:BR,fail:VR};import{randomUUID as Hf,timingSafeEqual as YR}from"node:crypto";import{mkdir as zR,readFile as JR,readdir as XR}from"node:fs/promises";import Yf from"node:path";var QR=10080*60*1e3,ZR={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},eP=["task.create-child","task.children","task.cancel-tree"],tP=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function et(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 zR(tc(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_${Hf()}`,c=await vi(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 nP(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 nP(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${Hf()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...eP],targetPolicy:"children-only",limits:{...ZR},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+QR).toISOString(),revokedAt:null,revokedBy:null};return await q(nc(e,o.id),o,{mode:384}),o}async function Ye(e,t,n,r){let s=await sP(e,t);return s.revokedAt&&vn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&vn(s.id,"expired"),!tP.has(n)&&!s.allowedCommandFamilies.includes(n)&&vn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await rP(e,s.taskId,r)&&vn(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 rP(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 zf(e,t,n){let r=await vi(e,t);r&&(r.revokedAt||await q(nc(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function ec(e,t,n){let r=await XR(tc(e)).catch(i=>Jf(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 vi(e,o[1]);!a||!t.has(a.taskId)||(await zf(e,a.id,n),s.push(a.id))}return s}async function sP(e,t){let n=t.indexOf("."),r=n>0?t.slice(0,n):"";/^capability_[A-Za-z0-9-]+$/.test(r)||vn("<redacted>","token is invalid");let s=await vi(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||!YR(i,o))&&vn(r,"token is invalid"),s}async function vi(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||vn(t,"identifier is invalid");try{let n=JSON.parse(await JR(nc(e,t),"utf8"));if(!iP(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(Jf(n))return null;throw n}}function iP(e,t){if(!Zl(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"&&oP(r))&&e.targetPolicy==="children-only"&&Zl(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&Ql(e.createdAt)&&Ql(e.expiresAt)&&Gf(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||Ql(e.revokedAt)&&Gf(e.revokedBy))}function Gf(e){return Zl(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 vn(e,t){throw new g("CAPABILITY_DENIED",`Craig capability ${e} was denied: ${t}.`,{details:{capabilityId:e,reason:t}})}var tc=e=>Yf.join(e.orchestrationDir,"capabilities"),nc=(e,t)=>Yf.join(tc(e),`${t}.json`),oP=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),Zl=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ql=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Jf=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as Xf,readFile as aP,rm as rc,stat as lP,writeFile as cP}from"node:fs/promises";import sc from"node:path";var uP=20,dP=3e4,pP=5e3;async function ic(e,t){let n=sc.join(e.runtimeDir,"delegation.lock");await Xf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Xf(n);try{await cP(sc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await rc(n,{recursive:!0,force:!0}),s}break}catch(s){if(!hP(s))throw s;if(await fP(n))continue;if(Date.now()-r>=dP)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,uP))}try{return await t()}finally{await rc(n,{recursive:!0,force:!0})}}async function fP(e){let t=await aP(sc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&mP(t.pid))return!1;let n=await lP(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<pP?!1:(await rc(e,{recursive:!0,force:!0}),!0)}function mP(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 hP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var gP={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function oc(e,t,n,r={}){let s=await T.load(e);return T.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 et(e,i,{type:"human",source:"cli",processId:process.pid})})}):P.createTask(e,t,n,r)}async function ac(e,t,n={}){return ic(e,async()=>{let r=await P.getTask(e,t.parentTaskId),s=t.capabilityId?await Ye(e,t.capabilityId,"task.create-child",r.id):null,i=s?.actor??{type:"human",source:"cli",processId:process.pid},o=s?.capability.limits??gP,a=yP(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&&Ci("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&Ci("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(k=>k.delegationIdempotencyKey===p);if(y){if(!wP(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 Qf(y,!0)}}u.length>=o.maxChildren&&Ci("children",o.maxChildren),u.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&Ci("concurrent children",o.maxConcurrentChildren);let m=await(n.createTask??P.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 et(e,y,i)})}),f=await P.getTask(e,m.taskId);try{await xe(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 Qf(f,!1)})}async function lc(e,t,n){n&&await Ye(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 cc(e,t,n){return ic(e,async()=>{let s=(n?await Ye(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(m=>[m.id,m])),a=new Map;for(let m of i)m.parentTaskId&&a.set(m.parentTaskId,[...a.get(m.parentTaskId)??[],m]);let l=[],c=new Set,d=m=>{if(c.has(m))throw new g("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${m}.`,{details:{taskId:m,rootTaskId:t}});let f=o.get(m);if(f){c.add(m),l.push(f);for(let y of(a.get(m)??[]).sort((k,R)=>k.id.localeCompare(R.id)))d(y.id)}};d(t);let u=[],p=[],h=[];try{await ec(e,new Set(l.map(m=>m.id)),s)}catch{h.push(...l.map(m=>m.id))}for(let m of l){let f=m.status;if(f==="closed"){u.push({taskId:m.id,previousStatus:f,status:"closed",disposition:"already-closed"});continue}await P.cleanupTask(e,m,{preserveWorktree:!0});let y=await P.closeTask(e,m.id);u.push({taskId:m.id,previousStatus:f,status:y.status,disposition:"cancelled"});try{await xe(e,{workspaceId:m.workspaceId,taskId:m.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:f}})}catch{p.push(m.id)}}if(p.length>0||h.length>0)throw new g("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:u,auditFailures:p,revocationFailures:h,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:u}})}function Qf(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 yP(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 wP(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function Ci(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var Ai=Symbol.for("yaml.alias"),Ei=Symbol.for("yaml.document"),tt=Symbol.for("yaml.map"),uc=Symbol.for("yaml.pair"),Le=Symbol.for("yaml.scalar"),Nt=Symbol.for("yaml.seq"),ve=Symbol.for("yaml.node.type"),Fe=e=>!!e&&typeof e=="object"&&e[ve]===Ai,yt=e=>!!e&&typeof e=="object"&&e[ve]===Ei,nt=e=>!!e&&typeof e=="object"&&e[ve]===tt,M=e=>!!e&&typeof e=="object"&&e[ve]===uc,_=e=>!!e&&typeof e=="object"&&e[ve]===Le,rt=e=>!!e&&typeof e=="object"&&e[ve]===Nt;function W(e){if(e&&typeof e=="object")switch(e[ve]){case tt:case Nt:return!0}return!1}function j(e){if(e&&typeof e=="object")switch(e[ve]){case Ai:case tt:case Le:case Nt:return!0}return!1}var Oi=e=>(_(e)||W(e))&&!!e.anchor;var $e=Symbol("break visit"),Zf=Symbol("skip children"),wt=Symbol("remove node");function ze(e,t){let n=em(t);yt(e)?ar(null,e.contents,n,Object.freeze([e]))===wt&&(e.contents=null):ar(null,e,n,Object.freeze([]))}ze.BREAK=$e;ze.SKIP=Zf;ze.REMOVE=wt;function ar(e,t,n,r){let s=tm(e,t,n,r);if(j(s)||M(s))return nm(e,r,s),ar(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=ar(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===$e)return $e;o===wt&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=ar("key",t.key,n,r);if(i===$e)return $e;i===wt&&(t.key=null);let o=ar("value",t.value,n,r);if(o===$e)return $e;o===wt&&(t.value=null)}}return s}async function $i(e,t){let n=em(t);yt(e)?await lr(null,e.contents,n,Object.freeze([e]))===wt&&(e.contents=null):await lr(null,e,n,Object.freeze([]))}$i.BREAK=$e;$i.SKIP=Zf;$i.REMOVE=wt;async function lr(e,t,n,r){let s=await tm(e,t,n,r);if(j(s)||M(s))return nm(e,r,s),lr(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 lr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===$e)return $e;o===wt&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=await lr("key",t.key,n,r);if(i===$e)return $e;i===wt&&(t.key=null);let o=await lr("value",t.value,n,r);if(o===$e)return $e;o===wt&&(t.value=null)}}return s}function em(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 tm(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(nt(t))return n.Map?.(e,t,r);if(rt(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(Fe(t))return n.Alias?.(e,t,r)}function nm(e,t,n){let r=t[t.length-1];if(W(r))r.items[e]=n;else if(M(r))e==="key"?r.key=n:r.value=n;else if(yt(r))r.contents=n;else{let s=Fe(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var kP={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},TP=e=>e.replace(/[!,[\]{}]/g,t=>kP[t]),kt=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+TP(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={};ze(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
+ `)}};kt.defaultYaml={explicit:!1,version:"1.2"};kt.defaultTags={"!!":"tag:yaml.org,2002:"};function Ni(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 dc(e){let t=new Set;return ze(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function pc(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function rm(e,t){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=dc(e));let o=pc(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)||W(o.node)))o.node.anchor=o.anchor;else{let a=new Error("Failed to resolve repeated object (this should not happen)");throw a.source=i,a}}},sourceObjects:r}}function Qt(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=Qt(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=Qt(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=Qt(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=Qt(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||!Oi(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,ve,{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(!yt(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"?Qt(i,{"":a},"",a):a}};var Dt=class extends Zt{constructor(t){super(Ai),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=[],ze(t,{Node:(i,o)=>{(Fe(o)||Oi(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=Di(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(Ni(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 Di(e,t,n){if(Fe(t)){let r=t.resolve(e),s=n&&r&&n.get(r);return s?s.count*s.aliasCount:0}else if(W(t)){let r=0;for(let s of t.items){let i=Di(e,s,n);i>r&&(r=i)}return r}else if(M(t)){let r=Di(e,t.key,n),s=Di(e,t.value,n);return Math.max(r,s)}return 1}var _i=e=>!e||typeof e!="function"&&typeof e!="object",E=class extends Zt{constructor(t){super(Le),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 bP="tag:yaml.org,2002:";function RP(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(yt(e)&&(e=e.contents),j(e))return e;if(M(e)){let u=n.schema[tt].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 Dt(l.anchor);l={anchor:null,node:null},a.set(e,l)}t?.startsWith("!!")&&(t=bP+t.slice(2));let c=RP(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[tt]:Symbol.iterator in Object(e)?o[Nt]:o[tt]}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 rs(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 ur=e=>e==null||typeof e=="object"&&!!e[Symbol.iterator]().next().done,cr=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(ur(t))this.add(n);else{let[r,...s]=t,i=this.get(r,!0);if(W(i))i.addIn(s,n);else if(i===void 0&&this.schema)this.set(r,rs(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}deleteIn(t){let[n,...r]=t;if(r.length===0)return this.delete(n);let s=this.get(n,!0);if(W(s))return s.deleteIn(r);throw new Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}getIn(t,n){let[r,...s]=t,i=this.get(r,!0);return s.length===0?!n&&_(i)?i.value:i:W(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 W(s)?s.hasIn(r):!1}setIn(t,n){let[r,...s]=t;if(s.length===0)this.set(r,n);else{let i=this.get(r,!0);if(W(i))i.setIn(s,n);else if(i===void 0&&this.schema)this.set(r,rs(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};var sm=e=>e.replace(/^(?!$)(?: $)?/gm,"#");function Je(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var Tt=(e,t,n)=>e.endsWith(`
80
80
  `)?Je(n,t):n.includes(`
81
81
  `)?`
82
- `+Je(n,t):(e.endsWith(" ")?"":" ")+n;var dc="flow",xi="block",ss="quoted";function is(e,t,n="flow",{indentAtStart:r,lineWidth:s=80,minContentWidth:i=20,onFold:o,onOverflow:a}={}){if(!s||s<0)return e;s<i&&(i=0);let l=Math.max(1+i,1+s-t.length);if(e.length<=l)return e;let c=[],d={},u=s-t.length;typeof r=="number"&&(r>s-Math.max(2,i)?c.push(0):u=s-r);let p,h,m=!1,f=-1,y=-1,k=-1;n===xi&&(f=rm(e,f,t.length),f!==-1&&(u=f+l));for(let b;b=e[f+=1];){if(n===ss&&b==="\\"){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(b===`
83
- `)n===xi&&(f=rm(e,f,t.length)),u=f+t.length+l,p=void 0;else{if(b===" "&&h&&h!==" "&&h!==`
82
+ `+Je(n,t):(e.endsWith(" ")?"":" ")+n;var fc="flow",xi="block",ss="quoted";function is(e,t,n="flow",{indentAtStart:r,lineWidth:s=80,minContentWidth:i=20,onFold:o,onOverflow:a}={}){if(!s||s<0)return e;s<i&&(i=0);let l=Math.max(1+i,1+s-t.length);if(e.length<=l)return e;let c=[],d={},u=s-t.length;typeof r=="number"&&(r>s-Math.max(2,i)?c.push(0):u=s-r);let p,h,m=!1,f=-1,y=-1,k=-1;n===xi&&(f=im(e,f,t.length),f!==-1&&(u=f+l));for(let b;b=e[f+=1];){if(n===ss&&b==="\\"){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(b===`
83
+ `)n===xi&&(f=im(e,f,t.length)),u=f+t.length+l,p=void 0;else{if(b===" "&&h&&h!==" "&&h!==`
84
84
  `&&h!==" "){let $=e[f+1];$&&$!==" "&&$!==`
85
85
  `&&$!==" "&&(p=f)}if(f>=u)if(p)c.push(p),u=p+l,p=void 0;else if(n===ss){for(;h===" "||h===" ";)h=b,b=e[f+=1],m=!0;let $=f>k+1?f-2:y-1;if(d[$])return e;c.push($),d[$]=!0,u=$+l,p=void 0}else m=!0}h=b}if(m&&a&&a(),c.length===0)return e;o&&o();let R=e.slice(0,c[0]);for(let b=0;b<c.length;++b){let $=c[b],O=c[b+1]||e.length;$===0?R=`
86
86
  ${t}${e.slice(0,O)}`:(n===ss&&d[$]&&(R+=`${e[$]}\\`),R+=`
87
- ${t}${e.slice($+1,O)}`)}return R}function rm(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 Li=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),Mi=e=>/^(%|---|\.\.\.)/m.test(e);function kP(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]===`
87
+ ${t}${e.slice($+1,O)}`)}return R}function im(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 Fi=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),Mi=e=>/^(%|---|\.\.\.)/m.test(e);function PP(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 os(e,t){let n=JSON.stringify(e);if(t.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=t,s=t.options.doubleQuotedMinMultiLineLength,i=t.indent||(Mi(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+=`
92
- `,l+=2;o+=i,n[l+2]===" "&&(o+="\\"),l+=1,a=l+1}break;default:l+=1}return o=a?o+n.slice(a):n,r?o:is(o,i,ss,Li(t,!1))}function pc(e,t){if(t.options.singleQuote===!1||t.implicitKey&&e.includes(`
92
+ `,l+=2;o+=i,n[l+2]===" "&&(o+="\\"),l+=1,a=l+1}break;default:l+=1}return o=a?o+n.slice(a):n,r?o:is(o,i,ss,Fi(t,!1))}function mc(e,t){if(t.options.singleQuote===!1||t.implicitKey&&e.includes(`
93
93
  `)||/[ \t]\n|\n[ \t]/.test(e))return os(e,t);let n=t.indent||(Mi(e)?" ":""),r="'"+e.replace(/'/g,"''").replace(/\n+/g,`$&
94
- ${n}`)+"'";return t.implicitKey?r:is(r,n,dc,Li(t,!1))}function dr(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=os;else{let s=e.includes('"'),i=e.includes("'");s&&!i?r=pc:i&&!s?r=os:r=n?pc:os}return r(e,t)}var fc;try{fc=new RegExp(`(^|(?<!
94
+ ${n}`)+"'";return t.implicitKey?r:is(r,n,fc,Fi(t,!1))}function dr(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=os;else{let s=e.includes('"'),i=e.includes("'");s&&!i?r=mc:i&&!s?r=os:r=n?mc:os}return r(e,t)}var hc;try{hc=new RegExp(`(^|(?<!
95
95
  ))
96
96
  +(?!
97
- |$)`,"g")}catch{fc=/\n+(?!\n|$)/g}function Fi({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 dr(n,r);let c=r.indent||(r.forceBlockIndent||Mi(n)?" ":""),d=o==="literal"?!0:o==="folded"||t===E.BLOCK_FOLDED?!1:t===E.BLOCK_LITERAL?!0:!kP(n,l,c.length);if(!n)return d?`|
97
+ |$)`,"g")}catch{hc=/\n+(?!\n|$)/g}function Li({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 dr(n,r);let c=r.indent||(r.forceBlockIndent||Mi(n)?" ":""),d=o==="literal"?!0:o==="folded"||t===E.BLOCK_FOLDED?!1:t===E.BLOCK_LITERAL?!0:!PP(n,l,c.length);if(!n)return d?`|
98
98
  `:`>
99
99
  `;let u,p;for(p=n.length;p>0;--p){let O=n[p-1];if(O!==`
100
100
  `&&O!==" "&&O!==" ")break}let h=n.substring(p),m=h.indexOf(`
101
101
  `);m===-1?u="-":n===h||m!==h.length-1?(u="+",i&&i()):u="",h&&(n=n.slice(0,-h.length),h[h.length-1]===`
102
- `&&(h=h.slice(0,-1)),h=h.replace(fc,`$&${c}`));let f=!1,y,k=-1;for(y=0;y<n.length;++y){let O=n[y];if(O===" ")f=!0;else if(O===`
102
+ `&&(h=h.slice(0,-1)),h=h.replace(hc,`$&${c}`));let f=!1,y,k=-1;for(y=0;y<n.length;++y){let O=n[y];if(O===" ")f=!0;else if(O===`
103
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 $=(f?c?"2":"1":"")+u;if(e&&($+=" "+a(e.replace(/ ?[\r\n]+/g," ")),s&&s()),!d){let O=n.replace(/\n+/g,`
104
- $&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),N=!1,x=Li(r,!0);o!=="folded"&&t!==E.BLOCK_FOLDED&&(x.onOverflow=()=>{N=!0});let v=is(`${R}${O}${h}`,c,xi,x);if(!N)return`>${$}
104
+ $&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),N=!1,x=Fi(r,!0);o!=="folded"&&t!==E.BLOCK_FOLDED&&(x.onOverflow=()=>{N=!0});let v=is(`${R}${O}${h}`,c,xi,x);if(!N)return`>${$}
105
105
  ${c}${v}`}return n=n.replace(/\n+/g,`$&${c}`),`|${$}
106
- ${c}${R}${n}${h}`}function TP(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(`
106
+ ${c}${R}${n}${h}`}function SP(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 dr(i,t);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(i))return a||d||!i.includes(`
108
- `)?dr(i,t):Fi(e,t,n,r);if(!a&&!d&&s!==E.PLAIN&&i.includes(`
109
- `))return Fi(e,t,n,r);if(Mi(i)){if(l==="")return t.forceBlockIndent=!0,Fi(e,t,n,r);if(a&&l===c)return dr(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:h,tags:m}=t.doc.schema;if(m.some(p)||h?.some(p))return dr(i,t)}return a?u:is(u,l,dc,Li(t,!1))}function Cn(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?dr(o.value,t):Fi(o,t,n,r);case E.QUOTE_DOUBLE:return os(o.value,t);case E.QUOTE_SINGLE:return pc(o.value,t);case E.PLAIN:return TP(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 ji(e,t){let n=Object.assign({blockQuote:!0,commentString:nm,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 bP(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 RP(e,t,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(_(e)||W(e))&&e.anchor;i&&Ni(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 xt(e,t,n,r){if(M(e))return e.toString(t,n,r);if(Le(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=bP(t.doc.schema.tags,i));let o=RP(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)?Cn(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 sm({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(W(e)||!j(e)&&typeof e=="object"){let x="With simple keys, collection cannot be used as a key value";throw new Error(x)}}let h=!u&&(!e||p&&t==null&&!n.inFlow||W(e)||(_(e)?e.type===E.BLOCK_FOLDED||e.type===E.BLOCK_LITERAL:typeof e=="object"));n=Object.assign({},n,{allNullValues:!1,implicitKey:!h&&(u||!i),indent:a+l});let m=!1,f=!1,y=xt(e,n,()=>m=!0,()=>f=!0);if(!h&&!n.inFlow&&y.length>1024){if(u)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");h=!0}if(n.inFlow){if(i||t==null)return m&&r&&r(),y===""?"?":h?`? ${y}`:y}else if(i&&!u||t==null&&h)return y=`? ${y}`,p&&!m?y+=Tt(y,n.indent,c(p)):f&&s&&s(),y;m&&(p=null),h?(p&&(y+=Tt(y,n.indent,c(p))),y=`? ${y}
108
+ `)?dr(i,t):Li(e,t,n,r);if(!a&&!d&&s!==E.PLAIN&&i.includes(`
109
+ `))return Li(e,t,n,r);if(Mi(i)){if(l==="")return t.forceBlockIndent=!0,Li(e,t,n,r);if(a&&l===c)return dr(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:h,tags:m}=t.doc.schema;if(m.some(p)||h?.some(p))return dr(i,t)}return a?u:is(u,l,fc,Fi(t,!1))}function Cn(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?dr(o.value,t):Li(o,t,n,r);case E.QUOTE_DOUBLE:return os(o.value,t);case E.QUOTE_SINGLE:return mc(o.value,t);case E.PLAIN:return SP(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 ji(e,t){let n=Object.assign({blockQuote:!0,commentString:sm,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 IP(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 vP(e,t,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(_(e)||W(e))&&e.anchor;i&&Ni(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 xt(e,t,n,r){if(M(e))return e.toString(t,n,r);if(Fe(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=IP(t.doc.schema.tags,i));let o=vP(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)?Cn(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 om({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(W(e)||!j(e)&&typeof e=="object"){let x="With simple keys, collection cannot be used as a key value";throw new Error(x)}}let h=!u&&(!e||p&&t==null&&!n.inFlow||W(e)||(_(e)?e.type===E.BLOCK_FOLDED||e.type===E.BLOCK_LITERAL:typeof e=="object"));n=Object.assign({},n,{allNullValues:!1,implicitKey:!h&&(u||!i),indent:a+l});let m=!1,f=!1,y=xt(e,n,()=>m=!0,()=>f=!0);if(!h&&!n.inFlow&&y.length>1024){if(u)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");h=!0}if(n.inFlow){if(i||t==null)return m&&r&&r(),y===""?"?":h?`? ${y}`:y}else if(i&&!u||t==null&&h)return y=`? ${y}`,p&&!m?y+=Tt(y,n.indent,c(p)):f&&s&&s(),y;m&&(p=null),h?(p&&(y+=Tt(y,n.indent,c(p))),y=`? ${y}
112
112
  ${a}:`):(y=`${y}:`,p&&(y+=Tt(y,n.indent,c(p))));let k,R,b;j(t)?(k=!!t.spaceBefore,R=t.commentBefore,b=t.comment):(k=!1,R=null,b=null,t&&typeof t=="object"&&(t=o.createNode(t))),n.implicitKey=!1,!h&&!p&&_(t)&&(n.indentAtStart=y.length+1),f=!1,!d&&l.length>=2&&!n.inFlow&&!h&&rt(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let $=!1,O=xt(t,n,()=>$=!0,()=>f=!0),N=" ";if(p||k||R){if(N=k?`
113
113
  `:"",R){let x=c(R);N+=`
114
114
  ${Je(x,n.indent)}`}O===""&&!n.inFlow?N===`
@@ -118,32 +118,32 @@ ${Je(x,n.indent)}`}O===""&&!n.inFlow?N===`
118
118
  ${n.indent}`}else if(!h&&W(t)){let x=O[0],v=O.indexOf(`
119
119
  `),w=v!==-1,Se=n.inFlow??t.flow??t.items.length===0;if(w||!Se){let ye=!1;if(w&&(x==="&"||x==="!")){let Y=O.indexOf(" ");x==="&"&&Y!==-1&&Y<v&&O[Y+1]==="!"&&(Y=O.indexOf(" ",Y+1)),(Y===-1||v<Y)&&(ye=!0)}ye||(N=`
120
120
  ${n.indent}`)}}else(O===""||O[0]===`
121
- `)&&(N="");return y+=N+O,n.inFlow?$&&r&&r():b&&!$?y+=Tt(y,n.indent,c(b)):f&&s&&s(),y}function mc(e,t){(e==="debug"||e==="warn")&&console.warn(t)}var qi="<<",st={identify:e=>e===qi||typeof e=="symbol"&&e.description===qi,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new E(Symbol(qi)),{addToJSMap:gc}),stringify:()=>qi},im=(e,t)=>(st.identify(t)||_(t)&&(!t.type||t.type===E.PLAIN)&&st.identify(t.value))&&e?.doc.schema.tags.some(n=>n.tag===st.tag&&n.default);function gc(e,t,n){let r=om(e,n);if(rt(r))for(let s of r.items)hc(e,t,s);else if(Array.isArray(r))for(let s of r)hc(e,t,s);else hc(e,t,r)}function hc(e,t,n){let r=om(e,n);if(!nt(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 om(e,t){return e&&Le(t)?t.resolve(e.doc,e):t}function Ui(e,t,{key:n,value:r}){if(j(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(im(e,n))gc(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=PP(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 PP(e,t,n){if(t===null)return"";if(typeof t!="object")return String(t);if(j(e)&&n?.doc){let r=ji(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)+'..."'),mc(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 pr(e,t,n){let r=_t(e,void 0,n),s=_t(t,void 0,n);return new Q(r,s)}var Q=class e{constructor(t,n=null){Object.defineProperty(this,ve,{value:lc}),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 Ui(n,r,this)}toString(t,n,r){return t?.doc?sm(this,t,n,r):JSON.stringify(this)}};function Bi(e,t,n){return(t.inFlow??e.flow?IP:SP)(e,t,n)}function SP({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 m=0;m<t.length;++m){let f=t[m],y=null;if(j(f))!u&&f.spaceBefore&&p.push(""),Wi(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(""),Wi(n,p,R.commentBefore,u))}u=!1;let k=xt(f,d,()=>y=null,()=>u=!0);y&&(k+=Tt(k,i,c(y))),u&&y&&(u=!1),p.push(r+k)}let h;if(p.length===0)h=s.start+s.end;else{h=p[0];for(let m=1;m<p.length;++m){let f=p[m];h+=f?`
121
+ `)&&(N="");return y+=N+O,n.inFlow?$&&r&&r():b&&!$?y+=Tt(y,n.indent,c(b)):f&&s&&s(),y}function gc(e,t){(e==="debug"||e==="warn")&&console.warn(t)}var qi="<<",st={identify:e=>e===qi||typeof e=="symbol"&&e.description===qi,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new E(Symbol(qi)),{addToJSMap:wc}),stringify:()=>qi},am=(e,t)=>(st.identify(t)||_(t)&&(!t.type||t.type===E.PLAIN)&&st.identify(t.value))&&e?.doc.schema.tags.some(n=>n.tag===st.tag&&n.default);function wc(e,t,n){let r=lm(e,n);if(rt(r))for(let s of r.items)yc(e,t,s);else if(Array.isArray(r))for(let s of r)yc(e,t,s);else yc(e,t,r)}function yc(e,t,n){let r=lm(e,n);if(!nt(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 lm(e,t){return e&&Fe(t)?t.resolve(e.doc,e):t}function Ui(e,t,{key:n,value:r}){if(j(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(am(e,n))wc(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=CP(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 CP(e,t,n){if(t===null)return"";if(typeof t!="object")return String(t);if(j(e)&&n?.doc){let r=ji(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)+'..."'),gc(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 pr(e,t,n){let r=_t(e,void 0,n),s=_t(t,void 0,n);return new Q(r,s)}var Q=class e{constructor(t,n=null){Object.defineProperty(this,ve,{value:uc}),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 Ui(n,r,this)}toString(t,n,r){return t?.doc?om(this,t,n,r):JSON.stringify(this)}};function Bi(e,t,n){return(t.inFlow??e.flow?EP:AP)(e,t,n)}function AP({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 m=0;m<t.length;++m){let f=t[m],y=null;if(j(f))!u&&f.spaceBefore&&p.push(""),Wi(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(""),Wi(n,p,R.commentBefore,u))}u=!1;let k=xt(f,d,()=>y=null,()=>u=!0);y&&(k+=Tt(k,i,c(y))),u&&y&&(u=!1),p.push(r+k)}let h;if(p.length===0)h=s.start+s.end;else{h=p[0];for(let m=1;m<p.length;++m){let f=p[m];h+=f?`
122
122
  ${l}${f}`:`
123
123
  `}}return e?(h+=`
124
- `+Je(c(e),l),a&&a()):u&&o&&o(),h}function IP({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 m=0;m<e.length;++m){let f=e[m],y=null;if(j(f))f.spaceBefore&&u.push(""),Wi(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(""),Wi(t,u,R.commentBefore,!1),R.comment&&(c=!0));let b=j(f.value)?f.value:null;b?(b.comment&&(y=b.comment),b.commentBefore&&(c=!0)):f.value==null&&R?.comment&&(y=R.comment)}y&&(c=!0);let k=xt(f,l,()=>y=null);c||(c=u.length>d||k.includes(`
124
+ `+Je(c(e),l),a&&a()):u&&o&&o(),h}function EP({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 m=0;m<e.length;++m){let f=e[m],y=null;if(j(f))f.spaceBefore&&u.push(""),Wi(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(""),Wi(t,u,R.commentBefore,!1),R.comment&&(c=!0));let b=j(f.value)?f.value:null;b?(b.comment&&(y=b.comment),b.commentBefore&&(c=!0)):f.value==null&&R?.comment&&(y=R.comment)}y&&(c=!0);let k=xt(f,l,()=>y=null);c||(c=u.length>d||k.includes(`
125
125
  `)),m<e.length-1?k+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=u.reduce((R,b)=>R+b.length+2,2)+(k.length+2)>t.options.lineWidth)),c&&(k+=",")),y&&(k+=Tt(k,r,a(y))),u.push(k),d=u.length}let{start:p,end:h}=n;if(u.length===0)return p+h;if(!c){let m=u.reduce((f,y)=>f+y.length+2,2);c=t.options.lineWidth>0&&m>t.options.lineWidth}if(c){let m=p;for(let f of u)m+=f?`
126
126
  ${i}${s}${f}`:`
127
127
  `;return`${m}
128
- ${s}${h}`}else return`${p}${o}${u.join(" ")}${o}${h}`}function Wi({indent:e,options:{commentString:t}},n,r,s){if(r&&s&&(r=r.replace(/^\n+/,"")),r){let i=Je(t(r),e);n.push(i.trimStart())}}function en(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 cr{static get tagName(){return"tag:yaml.org,2002:map"}constructor(t){super(tt,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(pr(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 Q(t,t?.value):r=new Q(t.key,t.value);let s=en(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);_(s.value)&&_i(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=en(this.items,t);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(t,n){let s=en(this.items,t)?.value;return(!n&&_(s)?s.value:s)??void 0}has(t){return!!en(this.items,t)}set(t,n){this.add(new Q(t,n),!0)}toJSON(t,n,r){let s=r?new r:n?.mapAsMap?new Map:{};n?.onCreate&&n.onCreate(s);for(let i of this.items)Ui(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})),Bi(this,t,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:t.indent||"",onChompKeep:r,onComment:n})}};var it={collection:"map",default:!0,nodeClass:te,tag:"tag:yaml.org,2002:map",resolve(e,t){return nt(e)||t("Expected a mapping for this tag"),e},createNode:(e,t,n)=>te.from(e,t,n)};var be=class extends cr{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(t){super(Nt,t),this.items=[]}add(t){this.items.push(t)}delete(t){let n=Vi(t);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(t,n){let r=Vi(t);if(typeof r!="number")return;let s=this.items[r];return!n&&_(s)?s.value:s}has(t){let n=Vi(t);return typeof n=="number"&&n<this.items.length}set(t,n){let r=Vi(t);if(typeof r!="number")throw new Error(`Expected a valid index, not ${t}.`);let s=this.items[r];_(s)&&_i(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?Bi(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 Vi(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 ot={collection:"seq",default:!0,nodeClass:be,tag:"tag:yaml.org,2002:seq",resolve(e,t){return rt(e)||t("Expected a sequence for this tag"),e},createNode:(e,t,n)=>be.from(e,t,n)};var tn={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),Cn(e,t,n,r)}};var An={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"&&An.test.test(e)?e:t.options.nullStr};var as={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&&as.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 Re({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 Ki={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:Re},Gi={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():Re(e)}},Hi={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:Re};var Yi=e=>typeof e=="bigint"||Number.isInteger(e),yc=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function am(e,t,n){let{value:r}=e;return Yi(r)&&r>=0?n+r.toString(t):Re(e)}var zi={identify:e=>Yi(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(e,t,n)=>yc(e,2,8,n),stringify:e=>am(e,8,"0o")},Ji={identify:Yi,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>yc(e,0,10,n),stringify:Re},Xi={identify:e=>Yi(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>yc(e,2,16,n),stringify:e=>am(e,16,"0x")};var lm=[it,ot,tn,An,as,zi,Ji,Xi,Ki,Gi,Hi];function cm(e){return typeof e=="bigint"||Number.isInteger(e)}var Qi=({value:e})=>JSON.stringify(e),vP=[{identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify:Qi},{identify:e=>e==null,createNode:()=>new E(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:Qi},{identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:e=>e==="true",stringify:Qi},{identify:cm,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})=>cm(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:Qi}],CP={default:!0,tag:"",test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}},um=[it,ot].concat(vP,CP);var ls={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 Cn({comment:e,type:t,value:a},r,s,i)}};function wc(e,t){if(rt(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!M(r)){if(nt(r)){r.items.length>1&&t("Each pair must have its own sequence indicator");let s=r.items[0]||new Q(new E(null));if(r.commentBefore&&(s.key.commentBefore=s.key.commentBefore?`${r.commentBefore}
128
+ ${s}${h}`}else return`${p}${o}${u.join(" ")}${o}${h}`}function Wi({indent:e,options:{commentString:t}},n,r,s){if(r&&s&&(r=r.replace(/^\n+/,"")),r){let i=Je(t(r),e);n.push(i.trimStart())}}function en(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 cr{static get tagName(){return"tag:yaml.org,2002:map"}constructor(t){super(tt,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(pr(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 Q(t,t?.value):r=new Q(t.key,t.value);let s=en(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);_(s.value)&&_i(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=en(this.items,t);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(t,n){let s=en(this.items,t)?.value;return(!n&&_(s)?s.value:s)??void 0}has(t){return!!en(this.items,t)}set(t,n){this.add(new Q(t,n),!0)}toJSON(t,n,r){let s=r?new r:n?.mapAsMap?new Map:{};n?.onCreate&&n.onCreate(s);for(let i of this.items)Ui(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})),Bi(this,t,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:t.indent||"",onChompKeep:r,onComment:n})}};var it={collection:"map",default:!0,nodeClass:te,tag:"tag:yaml.org,2002:map",resolve(e,t){return nt(e)||t("Expected a mapping for this tag"),e},createNode:(e,t,n)=>te.from(e,t,n)};var be=class extends cr{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(t){super(Nt,t),this.items=[]}add(t){this.items.push(t)}delete(t){let n=Vi(t);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(t,n){let r=Vi(t);if(typeof r!="number")return;let s=this.items[r];return!n&&_(s)?s.value:s}has(t){let n=Vi(t);return typeof n=="number"&&n<this.items.length}set(t,n){let r=Vi(t);if(typeof r!="number")throw new Error(`Expected a valid index, not ${t}.`);let s=this.items[r];_(s)&&_i(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?Bi(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 Vi(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 ot={collection:"seq",default:!0,nodeClass:be,tag:"tag:yaml.org,2002:seq",resolve(e,t){return rt(e)||t("Expected a sequence for this tag"),e},createNode:(e,t,n)=>be.from(e,t,n)};var tn={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),Cn(e,t,n,r)}};var An={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"&&An.test.test(e)?e:t.options.nullStr};var as={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&&as.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 Re({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 Ki={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:Re},Gi={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():Re(e)}},Hi={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:Re};var Yi=e=>typeof e=="bigint"||Number.isInteger(e),kc=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function cm(e,t,n){let{value:r}=e;return Yi(r)&&r>=0?n+r.toString(t):Re(e)}var zi={identify:e=>Yi(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(e,t,n)=>kc(e,2,8,n),stringify:e=>cm(e,8,"0o")},Ji={identify:Yi,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>kc(e,0,10,n),stringify:Re},Xi={identify:e=>Yi(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>kc(e,2,16,n),stringify:e=>cm(e,16,"0x")};var um=[it,ot,tn,An,as,zi,Ji,Xi,Ki,Gi,Hi];function dm(e){return typeof e=="bigint"||Number.isInteger(e)}var Qi=({value:e})=>JSON.stringify(e),OP=[{identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify:Qi},{identify:e=>e==null,createNode:()=>new E(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:Qi},{identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:e=>e==="true",stringify:Qi},{identify:dm,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})=>dm(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:Qi}],$P={default:!0,tag:"",test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}},pm=[it,ot].concat(OP,$P);var ls={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 Cn({comment:e,type:t,value:a},r,s,i)}};function Tc(e,t){if(rt(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!M(r)){if(nt(r)){r.items.length>1&&t("Each pair must have its own sequence indicator");let s=r.items[0]||new Q(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]=M(r)?r:new Q(r)}}else t("Expected a sequence for this tag");return e}function kc(e,t,n){let{replacer:r}=n,s=new be(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(pr(a,l,n))}return s}var cs={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:wc,createNode:kc};var fr=class e extends be{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=kc(t,n,r),i=new this;return i.items=s.items,i}};fr.tag="tag:yaml.org,2002:omap";var us={collection:"seq",identify:e=>e instanceof Map,nodeClass:fr,default:!1,tag:"tag:yaml.org,2002:omap",resolve(e,t){let n=wc(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 fr,n)},createNode:(e,t,n)=>fr.from(e,t,n)};function dm({value:e,source:t},n){return t&&(e?Tc:bc).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}var Tc={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:dm},bc={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:dm};var pm={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:Re},fm={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():Re(e)}},mm={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:Re};var ds=e=>typeof e=="bigint"||Number.isInteger(e);function Zi(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 Rc(e,t,n){let{value:r}=e;if(ds(r)){let s=r.toString(t);return r<0?"-"+n+s.substr(1):n+s}return Re(e)}var hm={identify:ds,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>Zi(e,2,2,n),stringify:e=>Rc(e,2,"0b")},gm={identify:ds,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>Zi(e,1,8,n),stringify:e=>Rc(e,8,"0")},ym={identify:ds,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>Zi(e,0,10,n),stringify:Re},wm={identify:ds,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>Zi(e,2,16,n),stringify:e=>Rc(e,16,"0x")};var mr=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 Q(t.key,null):n=new Q(t,null),en(this.items,n.key)||this.items.push(n)}get(t,n){let r=en(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=en(this.items,t);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new Q(t))}toJSON(t,n){return super.toJSON(t,n,Set)}toString(t,n,r){if(!t)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},t,{allNullValues:!0}),n,r);throw new Error("Set items must all have null values")}static from(t,n,r){let{replacer:s}=r,i=new this(t);if(n&&Symbol.iterator in Object(n))for(let o of n)typeof s=="function"&&(o=s.call(n,o,o)),i.items.push(pr(o,null,r));return i}};mr.tag="tag:yaml.org,2002:set";var ps={collection:"map",identify:e=>e instanceof Set,nodeClass:mr,default:!1,tag:"tag:yaml.org,2002:set",createNode:(e,t,n)=>mr.from(e,t,n),resolve(e,t){if(nt(e)){if(e.hasAllNullValues(!0))return Object.assign(new mr,e);t("Set items must all have null values")}else t("Expected a mapping for this tag");return e}};function Pc(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 km(e){let{value:t}=e,n=o=>o;if(typeof t=="bigint")n=o=>BigInt(o);else if(isNaN(t)||!isFinite(t))return Re(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 eo={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})=>Pc(e,n),stringify:km},to={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=>Pc(e,!1),stringify:km},hr={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(hr.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=Pc(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 Sc=[it,ot,tn,An,Tc,bc,hm,gm,ym,wm,pm,fm,mm,ls,st,us,cs,ps,eo,to,hr];var Tm=new Map([["core",lm],["failsafe",[it,ot,tn]],["json",um],["yaml11",Sc],["yaml-1.1",Sc]]),bm={binary:ls,bool:as,float:Hi,floatExp:Gi,floatNaN:Ki,floatTime:to,int:Ji,intHex:Xi,intOct:zi,intTime:eo,map:it,merge:st,null:An,omap:us,pairs:cs,seq:ot,set:ps,timestamp:hr},Rm={"tag:yaml.org,2002:binary":ls,"tag:yaml.org,2002:merge":st,"tag:yaml.org,2002:omap":us,"tag:yaml.org,2002:pairs":cs,"tag:yaml.org,2002:set":ps,"tag:yaml.org,2002:timestamp":hr};function no(e,t,n){let r=Tm.get(t);if(r&&!e)return n&&!r.includes(st)?r.concat(st):r.slice();let s=r;if(!s)if(Array.isArray(e))s=[];else{let i=Array.from(Tm.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(st)),s.reduce((i,o)=>{let a=typeof o=="string"?bm[o]:o;if(!a){let l=JSON.stringify(o),c=Object.keys(bm).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 AP=(e,t)=>e.key<t.key?-1:e.key>t.key?1:0,fs=class e{constructor({compat:t,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(t)?no(t,"compat"):t?no(null,t):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?Rm:{},this.tags=no(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,tt,{value:it}),Object.defineProperty(this,Fe,{value:tn}),Object.defineProperty(this,Nt,{value:ot}),this.sortMapEntries=typeof o=="function"?o:o===!0?AP:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function Pm(e,t){let n=[],r=t.directives===!0;if(t.directives!==!1&&e.directives){let l=e.directives.toString(e);l?(n.push(l),r=!0):e.directives.docStart&&(r=!0)}r&&n.push("---");let s=ji(e,t),{commentString:i}=s.options;if(e.commentBefore){n.length!==1&&n.unshift("");let l=i(e.commentBefore);n.unshift(Je(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(Je(d,""))}s.forceBlockIndent=!!e.comment,a=e.contents.comment}let l=a?void 0:()=>o=!0,c=xt(e.contents,s,()=>a=null,l);a&&(c+=Tt(c,"",i(a))),(c[0]==="|"||c[0]===">")&&n[n.length-1]==="---"?n[n.length-1]=`--- ${c}`:n.push(c)}else n.push(xt(e.contents,s));if(e.directives?.docEnd)if(e.comment){let l=i(e.comment);l.includes(`
131
+ ${i.comment}`:r.comment}r=s}e.items[n]=M(r)?r:new Q(r)}}else t("Expected a sequence for this tag");return e}function bc(e,t,n){let{replacer:r}=n,s=new be(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(pr(a,l,n))}return s}var cs={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:Tc,createNode:bc};var fr=class e extends be{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=bc(t,n,r),i=new this;return i.items=s.items,i}};fr.tag="tag:yaml.org,2002:omap";var us={collection:"seq",identify:e=>e instanceof Map,nodeClass:fr,default:!1,tag:"tag:yaml.org,2002:omap",resolve(e,t){let n=Tc(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 fr,n)},createNode:(e,t,n)=>fr.from(e,t,n)};function fm({value:e,source:t},n){return t&&(e?Rc:Pc).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}var Rc={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:fm},Pc={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:fm};var mm={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:Re},hm={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():Re(e)}},gm={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:Re};var ds=e=>typeof e=="bigint"||Number.isInteger(e);function Zi(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 Sc(e,t,n){let{value:r}=e;if(ds(r)){let s=r.toString(t);return r<0?"-"+n+s.substr(1):n+s}return Re(e)}var ym={identify:ds,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>Zi(e,2,2,n),stringify:e=>Sc(e,2,"0b")},wm={identify:ds,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>Zi(e,1,8,n),stringify:e=>Sc(e,8,"0")},km={identify:ds,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>Zi(e,0,10,n),stringify:Re},Tm={identify:ds,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>Zi(e,2,16,n),stringify:e=>Sc(e,16,"0x")};var mr=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 Q(t.key,null):n=new Q(t,null),en(this.items,n.key)||this.items.push(n)}get(t,n){let r=en(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=en(this.items,t);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new Q(t))}toJSON(t,n){return super.toJSON(t,n,Set)}toString(t,n,r){if(!t)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},t,{allNullValues:!0}),n,r);throw new Error("Set items must all have null values")}static from(t,n,r){let{replacer:s}=r,i=new this(t);if(n&&Symbol.iterator in Object(n))for(let o of n)typeof s=="function"&&(o=s.call(n,o,o)),i.items.push(pr(o,null,r));return i}};mr.tag="tag:yaml.org,2002:set";var ps={collection:"map",identify:e=>e instanceof Set,nodeClass:mr,default:!1,tag:"tag:yaml.org,2002:set",createNode:(e,t,n)=>mr.from(e,t,n),resolve(e,t){if(nt(e)){if(e.hasAllNullValues(!0))return Object.assign(new mr,e);t("Set items must all have null values")}else t("Expected a mapping for this tag");return e}};function Ic(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 bm(e){let{value:t}=e,n=o=>o;if(typeof t=="bigint")n=o=>BigInt(o);else if(isNaN(t)||!isFinite(t))return Re(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 eo={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})=>Ic(e,n),stringify:bm},to={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=>Ic(e,!1),stringify:bm},hr={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(hr.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=Ic(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 vc=[it,ot,tn,An,Rc,Pc,ym,wm,km,Tm,mm,hm,gm,ls,st,us,cs,ps,eo,to,hr];var Rm=new Map([["core",um],["failsafe",[it,ot,tn]],["json",pm],["yaml11",vc],["yaml-1.1",vc]]),Pm={binary:ls,bool:as,float:Hi,floatExp:Gi,floatNaN:Ki,floatTime:to,int:Ji,intHex:Xi,intOct:zi,intTime:eo,map:it,merge:st,null:An,omap:us,pairs:cs,seq:ot,set:ps,timestamp:hr},Sm={"tag:yaml.org,2002:binary":ls,"tag:yaml.org,2002:merge":st,"tag:yaml.org,2002:omap":us,"tag:yaml.org,2002:pairs":cs,"tag:yaml.org,2002:set":ps,"tag:yaml.org,2002:timestamp":hr};function no(e,t,n){let r=Rm.get(t);if(r&&!e)return n&&!r.includes(st)?r.concat(st):r.slice();let s=r;if(!s)if(Array.isArray(e))s=[];else{let i=Array.from(Rm.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(st)),s.reduce((i,o)=>{let a=typeof o=="string"?Pm[o]:o;if(!a){let l=JSON.stringify(o),c=Object.keys(Pm).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 NP=(e,t)=>e.key<t.key?-1:e.key>t.key?1:0,fs=class e{constructor({compat:t,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(t)?no(t,"compat"):t?no(null,t):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?Sm:{},this.tags=no(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,tt,{value:it}),Object.defineProperty(this,Le,{value:tn}),Object.defineProperty(this,Nt,{value:ot}),this.sortMapEntries=typeof o=="function"?o:o===!0?NP:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function Im(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=ji(e,t),{commentString:i}=s.options;if(e.commentBefore){n.length!==1&&n.unshift("");let l=i(e.commentBefore);n.unshift(Je(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(Je(d,""))}s.forceBlockIndent=!!e.comment,a=e.contents.comment}let l=a?void 0:()=>o=!0,c=xt(e.contents,s,()=>a=null,l);a&&(c+=Tt(c,"",i(a))),(c[0]==="|"||c[0]===">")&&n[n.length-1]==="---"?n[n.length-1]=`--- ${c}`:n.push(c)}else n.push(xt(e.contents,s));if(e.directives?.docEnd)if(e.comment){let l=i(e.comment);l.includes(`
132
132
  `)?(n.push("..."),n.push(Je(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(Je(i(l),"")))}return n.join(`
133
133
  `)+`
134
- `}var nn=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,ve,{value:Ei});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 kt({version:o}),this.setSchema(o,r),this.contents=t===void 0?null:this.createNode(t,s,r)}clone(){let t=Object.create(e.prototype,{[ve]:{value:Ei}});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){gr(this.contents)&&this.contents.add(t)}addIn(t,n){gr(this.contents)&&this.contents.addIn(t,n)}createAlias(t,n){if(!t.anchor){let r=cc(this);t.anchor=!n||r.has(n)?uc(n||"a",r):n}return new Dt(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:h}=tm(this,o||"a"),m={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:u,onTagObj:c,replacer:s,schema:this.schema,sourceObjects:h},f=_t(t,d,m);return a&&W(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 Q(s,i)}delete(t){return gr(this.contents)?this.contents.delete(t):!1}deleteIn(t){return ur(t)?this.contents==null?!1:(this.contents=null,!0):gr(this.contents)?this.contents.deleteIn(t):!1}get(t,n){return W(this.contents)?this.contents.get(t,n):void 0}getIn(t,n){return ur(t)?!n&&_(this.contents)?this.contents.value:this.contents:W(this.contents)?this.contents.getIn(t,n):void 0}has(t){return W(this.contents)?this.contents.has(t):!1}hasIn(t){return ur(t)?this.contents!==void 0:W(this.contents)?this.contents.hasIn(t):!1}set(t,n){this.contents==null?this.contents=rs(this.schema,[t],n):gr(this.contents)&&this.contents.set(t,n)}setIn(t,n){ur(t)?this.contents=n:this.contents==null?this.contents=rs(this.schema,Array.from(t),n):gr(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 kt({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 kt({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 fs(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"?Qt(o,{"":l},"",l):l}toJSON(t,n){return this.toJS({json:!0,jsonArg:t,mapAsMap:!1,onAnchor:n})}toString(t={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in t&&(!Number.isInteger(t.indent)||Number(t.indent)<=0)){let n=JSON.stringify(t.indent);throw new Error(`"indent" option must be a positive integer, not ${n}`)}return Pm(this,t)}};function gr(e){if(W(e))return!0;throw new Error("Expected a YAML collection as document contents")}var ms=class extends Error{constructor(t,n,r,s){super(),this.name=t,this.code=r,this.message=s,this.pos=n}},at=class extends ms{constructor(t,n,r){super("YAMLParseError",t,n,r)}},hs=class extends ms{constructor(t,n,r){super("YAMLWarning",t,n,r)}},Ic=(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
134
+ `}var nn=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,ve,{value:Ei});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 kt({version:o}),this.setSchema(o,r),this.contents=t===void 0?null:this.createNode(t,s,r)}clone(){let t=Object.create(e.prototype,{[ve]:{value:Ei}});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){gr(this.contents)&&this.contents.add(t)}addIn(t,n){gr(this.contents)&&this.contents.addIn(t,n)}createAlias(t,n){if(!t.anchor){let r=dc(this);t.anchor=!n||r.has(n)?pc(n||"a",r):n}return new Dt(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:h}=rm(this,o||"a"),m={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:u,onTagObj:c,replacer:s,schema:this.schema,sourceObjects:h},f=_t(t,d,m);return a&&W(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 Q(s,i)}delete(t){return gr(this.contents)?this.contents.delete(t):!1}deleteIn(t){return ur(t)?this.contents==null?!1:(this.contents=null,!0):gr(this.contents)?this.contents.deleteIn(t):!1}get(t,n){return W(this.contents)?this.contents.get(t,n):void 0}getIn(t,n){return ur(t)?!n&&_(this.contents)?this.contents.value:this.contents:W(this.contents)?this.contents.getIn(t,n):void 0}has(t){return W(this.contents)?this.contents.has(t):!1}hasIn(t){return ur(t)?this.contents!==void 0:W(this.contents)?this.contents.hasIn(t):!1}set(t,n){this.contents==null?this.contents=rs(this.schema,[t],n):gr(this.contents)&&this.contents.set(t,n)}setIn(t,n){ur(t)?this.contents=n:this.contents==null?this.contents=rs(this.schema,Array.from(t),n):gr(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 kt({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 kt({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 fs(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"?Qt(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 Im(this,t)}};function gr(e){if(W(e))return!0;throw new Error("Expected a YAML collection as document contents")}var ms=class extends Error{constructor(t,n,r,s){super(),this.name=t,this.code=r,this.message=s,this.pos=n}},at=class extends ms{constructor(t,n,r){super("YAMLParseError",t,n,r)}},hs=class extends ms{constructor(t,n,r){super("YAMLWarning",t,n,r)}},Cc=(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
139
  `}};function bt(e,{flow:t,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let l=!1,c=a,d=a,u="",p="",h=!1,m=!1,f=null,y=null,k=null,R=null,b=null,$=null,O=null;for(let v of e)switch(m&&(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"),m=!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:(!$||n!=="seq-item-ind")&&(l=!0):p+=v.source,c=!0,h=!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,O??(O=v.offset),c=!1,d=!1,m=!0;break;case"tag":{k&&i(v,"MULTIPLE_TAGS","A node can have at most one tag"),k=v,O??(O=v.offset),c=!1,d=!1,m=!0;break}case n:(y||k)&&i(v,"BAD_PROP_ORDER",`Anchors and tags must be after the ${v.source} indicator`),$&&i(v,"UNEXPECTED_TOKEN",`Unexpected ${v.source} in ${t??"collection"}`),$=v,c=n==="seq-item-ind"||n==="explicit-key-ind",d=!1;break;case"comma":if(t){b&&i(v,"UNEXPECTED_TOKEN",`Unexpected , in ${t}`),b=v,c=!1,d=!1;break}default:i(v,"UNEXPECTED_TOKEN",`Unexpected ${v.type} token`),c=!1,d=!1}let N=e[e.length-1],x=N?N.offset+N.source.length:s;return m&&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:b,found:$,spaceBefore:l,comment:u,hasNewline:h,anchor:y,tag:k,newlineAfterProp:R,end:x,start:O??x}}function rn(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(rn(t.key)||rn(t.value))return!0}return!1;default:return!0}}function gs(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&rn(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function ro(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 Sm="All mapping items must start at the same column";function Im({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??te,a=new o(n.schema);n.atRoot&&(n.atRoot=!1);let l=r.offset,c=null;for(let d of r.items){let{start:u,key:p,sep:h,value:m}=d,f=bt(u,{indicator:"explicit-key-ind",next:p??h?.[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",Sm)),!f.anchor&&!f.tag&&!h){c=f.end,f.comment&&(a.comment?a.comment+=`
141
- `+f.comment:a.comment=f.comment);continue}(f.newlineAfterProp||rn(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",Sm);n.atKey=!0;let k=f.end,R=p?e(n,p,f,s):t(n,k,u,null,f,s);n.schema.compat&&gs(r.indent,p,s),n.atKey=!1,ro(n,a.items,R)&&s(k,"DUPLICATE_KEY","Map keys must be unique");let b=bt(h??[],{indicator:"map-value-ind",next:m,offset:R.range[2],onError:s,parentIndent:r.indent,startOnNewline:!p||p.type==="block-scalar"});if(l=b.end,b.found){y&&(m?.type==="block-map"&&!b.hasNewline&&s(l,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),n.options.strict&&f.start<b.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 $=m?e(n,m,b,s):t(n,l,h,null,b,s);n.schema.compat&&gs(r.indent,m,s),l=$.range[2];let O=new Q(R,$);n.options.keepSourceTokens&&(O.srcToken=d),a.items.push(O)}else{y&&s(R.range,"MISSING_CHAR","Implicit map keys need to be followed by map values"),b.comment&&(R.comment?R.comment+=`
142
- `+b.comment:R.comment=b.comment);let $=new Q(R);n.options.keepSourceTokens&&($.srcToken=d),a.items.push($)}}return c&&c<l&&s(c,"IMPOSSIBLE","Map comment with trailing content"),a.range=[r.offset,l,c??l],a}function vm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??be,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=bt(d,{indicator:"seq-item-ind",next:u,offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0});if(!p.found)if(p.anchor||p.tag||u)u?.type==="block-seq"?s(p.end,"BAD_INDENT","All sequence items must start at the same column"):s(l,"MISSING_CHAR","Sequence item without - indicator");else{c=p.end,p.comment&&(a.comment=p.comment);continue}let h=u?e(n,u,p,s):t(n,p.end,d,null,p,s);n.schema.compat&&gs(r.indent,u,s),l=h.range[2],a.items.push(h)}return a.range=[r.offset,l,c??l],a}function Rt(e,t,n,r){let s="";if(e){let i=!1,o="";for(let a of e){let{source:l,type:c}=a;switch(c){case"space":i=!0;break;case"comment":{n&&!i&&r(a,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let 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 vc="Block collections are not allowed within flow collections",Cc=e=>e&&(e.type==="block-map"||e.type==="block-seq");function Cm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",l=i?.nodeClass??(o?te:be),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:b,sep:$,value:O}=k,N=bt(R,{flow:a,indicator:"explicit-key-ind",next:b??$?.[0],offset:u,onError:s,parentIndent:r.indent,startOnNewline:!1});if(!N.found){if(!N.anchor&&!N.tag&&!$&&!O){y===0&&N.comma?s(N.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`):y<r.items.length-1&&s(N.start,"UNEXPECTED_TOKEN",`Unexpected empty item in ${a}`),N.comment&&(c.comment?c.comment+=`
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(rn(t.key)||rn(t.value))return!0}return!1;default:return!0}}function gs(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&rn(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function ro(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 vm="All mapping items must start at the same column";function Cm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??te,a=new o(n.schema);n.atRoot&&(n.atRoot=!1);let l=r.offset,c=null;for(let d of r.items){let{start:u,key:p,sep:h,value:m}=d,f=bt(u,{indicator:"explicit-key-ind",next:p??h?.[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",vm)),!f.anchor&&!f.tag&&!h){c=f.end,f.comment&&(a.comment?a.comment+=`
141
+ `+f.comment:a.comment=f.comment);continue}(f.newlineAfterProp||rn(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",vm);n.atKey=!0;let k=f.end,R=p?e(n,p,f,s):t(n,k,u,null,f,s);n.schema.compat&&gs(r.indent,p,s),n.atKey=!1,ro(n,a.items,R)&&s(k,"DUPLICATE_KEY","Map keys must be unique");let b=bt(h??[],{indicator:"map-value-ind",next:m,offset:R.range[2],onError:s,parentIndent:r.indent,startOnNewline:!p||p.type==="block-scalar"});if(l=b.end,b.found){y&&(m?.type==="block-map"&&!b.hasNewline&&s(l,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),n.options.strict&&f.start<b.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 $=m?e(n,m,b,s):t(n,l,h,null,b,s);n.schema.compat&&gs(r.indent,m,s),l=$.range[2];let O=new Q(R,$);n.options.keepSourceTokens&&(O.srcToken=d),a.items.push(O)}else{y&&s(R.range,"MISSING_CHAR","Implicit map keys need to be followed by map values"),b.comment&&(R.comment?R.comment+=`
142
+ `+b.comment:R.comment=b.comment);let $=new Q(R);n.options.keepSourceTokens&&($.srcToken=d),a.items.push($)}}return c&&c<l&&s(c,"IMPOSSIBLE","Map comment with trailing content"),a.range=[r.offset,l,c??l],a}function Am({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??be,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=bt(d,{indicator:"seq-item-ind",next:u,offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0});if(!p.found)if(p.anchor||p.tag||u)u?.type==="block-seq"?s(p.end,"BAD_INDENT","All sequence items must start at the same column"):s(l,"MISSING_CHAR","Sequence item without - indicator");else{c=p.end,p.comment&&(a.comment=p.comment);continue}let h=u?e(n,u,p,s):t(n,p.end,d,null,p,s);n.schema.compat&&gs(r.indent,u,s),l=h.range[2],a.items.push(h)}return a.range=[r.offset,l,c??l],a}function Rt(e,t,n,r){let s="";if(e){let i=!1,o="";for(let a of e){let{source:l,type:c}=a;switch(c){case"space":i=!0;break;case"comment":{n&&!i&&r(a,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let 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 Ac="Block collections are not allowed within flow collections",Ec=e=>e&&(e.type==="block-map"||e.type==="block-seq");function Em({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",l=i?.nodeClass??(o?te:be),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:b,sep:$,value:O}=k,N=bt(R,{flow:a,indicator:"explicit-key-ind",next:b??$?.[0],offset:u,onError:s,parentIndent:r.indent,startOnNewline:!1});if(!N.found){if(!N.anchor&&!N.tag&&!$&&!O){y===0&&N.comma?s(N.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`):y<r.items.length-1&&s(N.start,"UNEXPECTED_TOKEN",`Unexpected empty item in ${a}`),N.comment&&(c.comment?c.comment+=`
143
143
  `+N.comment:c.comment=N.comment),u=N.end;continue}!o&&n.options.strict&&rn(b)&&s(b,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line")}if(y===0)N.comma&&s(N.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`);else if(N.comma||s(N.start,"MISSING_CHAR",`Missing , between ${a} items`),N.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,N.comment=N.comment.substring(x.length+1)}}if(!o&&!$&&!N.found){let x=O?e(n,O,N,s):t(n,N.end,$,null,N,s);c.items.push(x),u=x.range[2],Cc(O)&&s(x.range,"BLOCK_IN_FLOW",vc)}else{n.atKey=!0;let x=N.end,v=b?e(n,b,N,s):t(n,x,R,null,N,s);Cc(b)&&s(v.range,"BLOCK_IN_FLOW",vc),n.atKey=!1;let w=bt($??[],{flow:a,indicator:"map-value-ind",next:O,offset:v.range[2],onError:s,parentIndent:r.indent,startOnNewline:!1});if(w.found){if(!o&&!N.found&&n.options.strict){if($)for(let Y of $){if(Y===w.found)break;if(Y.type==="newline"){s(Y,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}N.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 O&&("source"in O&&O.source?.[0]===":"?s(O,"MISSING_CHAR",`Missing space after : in ${a}`):s(w.start,"MISSING_CHAR",`Missing , or : between ${a} items`));let Se=O?e(n,O,w,s):w.found?t(n,w.end,$,null,w,s):null;Se?Cc(O)&&s(Se.range,"BLOCK_IN_FLOW",vc):w.comment&&(v.comment?v.comment+=`
144
+ `+x:v.comment=x,N.comment=N.comment.substring(x.length+1)}}if(!o&&!$&&!N.found){let x=O?e(n,O,N,s):t(n,N.end,$,null,N,s);c.items.push(x),u=x.range[2],Ec(O)&&s(x.range,"BLOCK_IN_FLOW",Ac)}else{n.atKey=!0;let x=N.end,v=b?e(n,b,N,s):t(n,x,R,null,N,s);Ec(b)&&s(v.range,"BLOCK_IN_FLOW",Ac),n.atKey=!1;let w=bt($??[],{flow:a,indicator:"map-value-ind",next:O,offset:v.range[2],onError:s,parentIndent:r.indent,startOnNewline:!1});if(w.found){if(!o&&!N.found&&n.options.strict){if($)for(let Y of $){if(Y===w.found)break;if(Y.type==="newline"){s(Y,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}N.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 O&&("source"in O&&O.source?.[0]===":"?s(O,"MISSING_CHAR",`Missing space after : in ${a}`):s(w.start,"MISSING_CHAR",`Missing , or : between ${a} items`));let Se=O?e(n,O,w,s):w.found?t(n,w.end,$,null,w,s):null;Se?Ec(O)&&s(Se.range,"BLOCK_IN_FLOW",Ac):w.comment&&(v.comment?v.comment+=`
145
145
  `+w.comment:v.comment=w.comment);let ye=new Q(v,Se);if(n.options.keepSourceTokens&&(ye.srcToken=k),o){let Y=c;ro(n,Y.items,v)&&s(x,"DUPLICATE_KEY","Map keys must be unique"),Y.items.push(ye)}else{let Y=new te(n.schema);Y.flow=!0,Y.items.push(ye);let gn=(Se??v).range;Y.range=[v.range[0],gn[1],gn[2]],c.items.push(Y)}u=Se?Se.range[2]:w.end}}let p=o?"}":"]",[h,...m]=r.end,f=u;if(h?.source===p)f=h.offset+h.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),h&&h.source.length!==1&&m.unshift(h)}if(m.length>0){let y=Rt(m,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 Ac(e,t,n,r,s,i){let o=n.type==="block-map"?Im(e,t,n,r,i):n.type==="block-seq"?vm(e,t,n,r,i):Cm(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:h}=r,m=p&&i?p.offset>i.offset?p:i:p??i;m&&(!h||h.offset<m.offset)&&s(m,"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===be.tagName&&a==="seq")return Ac(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),Ac(e,t,n,s,o)}let c=Ac(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 Ec(e,t,n){let r=t.offset,s=EP(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?OP(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?`
146
+ `+y.comment:c.comment=y.comment),c.range=[r.offset,f,y.offset]}else c.range=[r.offset,f,f];return c}function Oc(e,t,n,r,s,i){let o=n.type==="block-map"?Cm(e,t,n,r,i):n.type==="block-seq"?Am(e,t,n,r,i):Em(e,t,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function Om(e,t,n,r,s){let i=r.tag,o=i?t.directives.tagName(i.source,p=>s(i,"TAG_RESOLVE_FAILED",p)):null;if(n.type==="block-seq"){let{anchor:p,newlineAfterProp:h}=r,m=p&&i?p.offset>i.offset?p:i:p??i;m&&(!h||h.offset<m.offset)&&s(m,"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===be.tagName&&a==="seq")return Oc(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),Oc(e,t,n,s,o)}let c=Oc(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 $c(e,t,n){let r=t.offset,s=DP(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?_P(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
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="",h=!1;for(let f=0;f<d;++f)u+=o[f][0].slice(l)+`
148
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 $=`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",$),y=""}i===E.BLOCK_LITERAL?(u+=p+y.slice(l)+k,p=`
149
149
  `):y.length>l||k[0]===" "?(p===" "?p=`
@@ -158,38 +158,38 @@ ${c}
158
158
  `+o[f][0].slice(l);u[u.length-1]!==`
159
159
  `&&(u+=`
160
160
  `);break;default:u+=`
161
- `}let m=r+s.length+t.source.length;return{value:u,type:i,comment:s.comment,range:[r,m,m]}}function EP({offset:e,props:t},n,r){if(t[0].type!=="block-scalar-header")return r(t[0],"IMPOSSIBLE","Block scalar header not found"),null;let{source:s}=t[0],i=s[0],o=0,a="",l=-1;for(let p=1;p<s.length;++p){let h=s[p];if(!a&&(h==="-"||h==="+"))a=h;else{let m=Number(h);!o&&m?o=m:l===-1&&(l=e+p)}}l!==-1&&r(l,"UNEXPECTED_TOKEN",`Block scalar header includes extra characters: ${s}`);let c=!1,d="",u=s.length;for(let p=1;p<t.length;++p){let h=t[p];switch(h.type){case"space":c=!0;case"newline":u+=h.source.length;break;case"comment":n&&!c&&r(h,"MISSING_CHAR","Comments must be separated from other tokens by white space characters"),u+=h.source.length,d=h.source.substring(1);break;case"error":r(h,"UNEXPECTED_TOKEN",h.message),u+=h.source.length;break;default:{let m=`Unexpected token in block scalar header: ${h.type}`;r(h,"UNEXPECTED_TOKEN",m);let f=h.source;f&&typeof f=="string"&&(u+=f.length)}}}return{mode:i,indent:o,chomp:a,comment:d,length:u}}function OP(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 Oc(e,t,n){let{offset:r,type:s,source:i,end:o}=e,a,l,c=(p,h,m)=>n(r+p,h,m);switch(s){case"scalar":a=E.PLAIN,l=$P(i,c);break;case"single-quoted-scalar":a=E.QUOTE_SINGLE,l=NP(i,c);break;case"double-quoted-scalar":a=E.QUOTE_DOUBLE,l=DP(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=Rt(o,d,t,n);return{value:l,type:a,comment:u.comment,range:[r,d,u.offset]}}function $P(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}`),Em(e)}function NP(e,t){return(e[e.length-1]!=="'"||e.length===1)&&t(e.length,"MISSING_CHAR","Missing closing 'quote"),Em(e.slice(1,-1)).replace(/''/g,"'")}function Em(e){let t,n;try{t=new RegExp(`(.*?)(?<![ ])[ ]*\r?
161
+ `}let m=r+s.length+t.source.length;return{value:u,type:i,comment:s.comment,range:[r,m,m]}}function DP({offset:e,props:t},n,r){if(t[0].type!=="block-scalar-header")return r(t[0],"IMPOSSIBLE","Block scalar header not found"),null;let{source:s}=t[0],i=s[0],o=0,a="",l=-1;for(let p=1;p<s.length;++p){let h=s[p];if(!a&&(h==="-"||h==="+"))a=h;else{let m=Number(h);!o&&m?o=m:l===-1&&(l=e+p)}}l!==-1&&r(l,"UNEXPECTED_TOKEN",`Block scalar header includes extra characters: ${s}`);let c=!1,d="",u=s.length;for(let p=1;p<t.length;++p){let h=t[p];switch(h.type){case"space":c=!0;case"newline":u+=h.source.length;break;case"comment":n&&!c&&r(h,"MISSING_CHAR","Comments must be separated from other tokens by white space characters"),u+=h.source.length,d=h.source.substring(1);break;case"error":r(h,"UNEXPECTED_TOKEN",h.message),u+=h.source.length;break;default:{let m=`Unexpected token in block scalar header: ${h.type}`;r(h,"UNEXPECTED_TOKEN",m);let f=h.source;f&&typeof f=="string"&&(u+=f.length)}}}return{mode:i,indent:o,chomp:a,comment:d,length:u}}function _P(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 Nc(e,t,n){let{offset:r,type:s,source:i,end:o}=e,a,l,c=(p,h,m)=>n(r+p,h,m);switch(s){case"scalar":a=E.PLAIN,l=xP(i,c);break;case"single-quoted-scalar":a=E.QUOTE_SINGLE,l=LP(i,c);break;case"double-quoted-scalar":a=E.QUOTE_DOUBLE,l=FP(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=Rt(o,d,t,n);return{value:l,type:a,comment:u.comment,range:[r,d,u.offset]}}function xP(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}`),$m(e)}function LP(e,t){return(e[e.length-1]!=="'"||e.length===1)&&t(e.length,"MISSING_CHAR","Missing closing 'quote"),$m(e.slice(1,-1)).replace(/''/g,"'")}function $m(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=`
165
- `:(s+=i+r[1],i=" "),o=n.lastIndex;let a=/[ \t]*(.*)/sy;return a.lastIndex=o,r=a.exec(e),s+i+(r?.[1]??"")}function DP(e,t){let n="";for(let r=1;r<e.length-1;++r){let s=e[r];if(!(s==="\r"&&e[r+1]===`
165
+ `:(s+=i+r[1],i=" "),o=n.lastIndex;let a=/[ \t]*(.*)/sy;return a.lastIndex=o,r=a.exec(e),s+i+(r?.[1]??"")}function FP(e,t){let n="";for(let r=1;r<e.length-1;++r){let s=e[r];if(!(s==="\r"&&e[r+1]===`
166
166
  `))if(s===`
167
- `){let{fold:i,offset:o}=_P(e,r);n+=i,r=o}else if(s==="\\"){let i=e[++r],o=xP[i];if(o)n+=o;else if(i===`
167
+ `){let{fold:i,offset:o}=MP(e,r);n+=i,r=o}else if(s==="\\"){let i=e[++r],o=jP[i];if(o)n+=o;else if(i===`
168
168
  `)for(i=e[r+1];i===" "||i===" ";)i=e[++r+1];else if(i==="\r"&&e[r+1]===`
169
- `)for(i=e[++r+1];i===" "||i===" ";)i=e[++r+1];else if(i==="x"||i==="u"||i==="U"){let a=i==="x"?2:i==="u"?4:8;n+=FP(e,r+1,a,t),r+=a}else{let a=e.substr(r-1,2);t(r-1,"BAD_DQ_ESCAPE",`Invalid escape sequence ${a}`),n+=a}}else if(s===" "||s===" "){let i=r,o=e[r+1];for(;o===" "||o===" ";)o=e[++r+1];o!==`
169
+ `)for(i=e[++r+1];i===" "||i===" ";)i=e[++r+1];else if(i==="x"||i==="u"||i==="U"){let a=i==="x"?2:i==="u"?4:8;n+=qP(e,r+1,a,t),r+=a}else{let a=e.substr(r-1,2);t(r-1,"BAD_DQ_ESCAPE",`Invalid escape sequence ${a}`),n+=a}}else if(s===" "||s===" "){let i=r,o=e[r+1];for(;o===" "||o===" ";)o=e[++r+1];o!==`
170
170
  `&&!(o==="\r"&&e[r+2]===`
171
- `)&&(n+=r>i?e.slice(i,r+1):s)}else n+=s}return(e[e.length-1]!=='"'||e.length===1)&&t(e.length,"MISSING_CHAR",'Missing closing "quote'),n}function _P(e,t){let n="",r=e[t+1];for(;(r===" "||r===" "||r===`
171
+ `)&&(n+=r>i?e.slice(i,r+1):s)}else n+=s}return(e[e.length-1]!=='"'||e.length===1)&&t(e.length,"MISSING_CHAR",'Missing closing "quote'),n}function MP(e,t){let n="",r=e[t+1];for(;(r===" "||r===" "||r===`
172
172
  `||r==="\r")&&!(r==="\r"&&e[t+2]!==`
173
173
  `);)r===`
174
174
  `&&(n+=`
175
- `),t+=1,r=e[t+1];return n||(n=" "),{fold:n,offset:t}}var xP={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 FP(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 $c(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?Ec(e,t,r):Oc(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[Fe]:l?c=LP(e.schema,s,l,n,r):t.type==="scalar"?c=MP(e,s,t,r):c=e.schema[Fe];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 LP(e,t,n,r,s){if(n==="!")return e[Fe];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[Fe])}function MP({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[Fe];if(n.compat){let a=n.compat.find(l=>l.default&&l.test?.test(r))??n[Fe];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 Om(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 jP={composeNode:Nc,composeEmptyNode:so};function Nc(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=qP(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=$c(e,t,l,r),a&&(c.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{c=Am(jP,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=so(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 so(e,t,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:l},c){let d={type:"scalar",offset:Om(t,n,r),indent:-1,source:""},u=$c(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 qP({options:e},{offset:t,source:n,end:r},s){let i=new Dt(n.substring(1));i.source===""&&s(t,"BAD_ALIAS","Alias cannot be an empty string"),i.source.endsWith(":")&&s(t+n.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let o=t+n.length,a=Rt(r,o,e.strict,s);return i.range=[t,o,a.offset],a.comment&&(i.comment=a.comment),i}function $m(e,t,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:t},e),l=new nn(void 0,a),c={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},d=bt(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?Nc(c,s,d,o):so(c,d.end,r,null,d,o);let u=l.contents.range[2],p=Rt(i,u,!1,o);return p.comment&&(l.comment=p.comment),l.range=[n,u,p.offset],l}function ys(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 Nm(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?`
175
+ `),t+=1,r=e[t+1];return n||(n=" "),{fold:n,offset:t}}var jP={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 qP(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 Dc(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?$c(e,t,r):Nc(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[Le]:l?c=UP(e.schema,s,l,n,r):t.type==="scalar"?c=WP(e,s,t,r):c=e.schema[Le];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 UP(e,t,n,r,s){if(n==="!")return e[Le];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[Le])}function WP({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[Le];if(n.compat){let a=n.compat.find(l=>l.default&&l.test?.test(r))??n[Le];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 Nm(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 BP={composeNode:_c,composeEmptyNode:so};function _c(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=VP(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=Dc(e,t,l,r),a&&(c.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{c=Om(BP,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=so(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 so(e,t,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:l},c){let d={type:"scalar",offset:Nm(t,n,r),indent:-1,source:""},u=Dc(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 VP({options:e},{offset:t,source:n,end:r},s){let i=new Dt(n.substring(1));i.source===""&&s(t,"BAD_ALIAS","Alias cannot be an empty string"),i.source.endsWith(":")&&s(t+n.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let o=t+n.length,a=Rt(r,o,e.strict,s);return i.range=[t,o,a.offset],a.comment&&(i.comment=a.comment),i}function Dm(e,t,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:t},e),l=new nn(void 0,a),c={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},d=bt(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?_c(c,s,d,o):so(c,d.end,r,null,d,o);let u=l.contents.range[2],p=Rt(i,u,!1,o);return p.comment&&(l.comment=p.comment),l.range=[n,u,p.offset],l}function ys(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 _m(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 ws=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=ys(n);i?this.warnings.push(new hs(o,r,s)):this.errors.push(new at(o,r,s))},this.directives=new kt({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=Nm(this.prelude);if(r){let i=t.contents;if(n)t.comment=t.comment?`${t.comment}
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 ws=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=ys(n);i?this.warnings.push(new hs(o,r,s)):this.errors.push(new at(o,r,s))},this.directives=new kt({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=_m(this.prelude);if(r){let i=t.contents;if(n)t.comment=t.comment?`${t.comment}
180
180
  ${r}`:r;else if(s||t.directives.docStart||!i)t.commentBefore=r;else if(W(i)&&!i.flow&&i.items.length>0){let o=i.items[0];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:Nm(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=ys(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=$m(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 at(ys(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 at(ys(t),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=Rt(t.end,t.offset+t.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),n.comment){let r=this.doc.comment;this.doc.comment=r?`${r}
183
- ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.push(new at(ys(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 nn(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 Dc=Symbol("break visit"),UP=Symbol("skip children"),Dm=Symbol("remove item");function En(e,t){"type"in e&&e.type==="document"&&(e={start:e.start,value:e.value}),_m(Object.freeze([]),e,t)}En.BREAK=Dc;En.SKIP=UP;En.REMOVE=Dm;En.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};En.parentCollection=(e,t)=>{let n=En.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 _m(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=_m(Object.freeze(e.concat([[s,o]])),i.items[o],n);if(typeof a=="number")o=a-1;else{if(a===Dc)return Dc;a===Dm&&(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 _c="\uFEFF",xc="",Fc="",io="";function xm(e){switch(e){case _c:return"byte-order-mark";case xc:return"doc-mode";case Fc:return"flow-error-end";case io:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case`
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:_m(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=ys(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=Dm(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 at(ys(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 at(ys(t),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=Rt(t.end,t.offset+t.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),n.comment){let r=this.doc.comment;this.doc.comment=r?`${r}
183
+ ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.push(new at(ys(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 nn(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 xc=Symbol("break visit"),KP=Symbol("skip children"),xm=Symbol("remove item");function En(e,t){"type"in e&&e.type==="document"&&(e={start:e.start,value:e.value}),Lm(Object.freeze([]),e,t)}En.BREAK=xc;En.SKIP=KP;En.REMOVE=xm;En.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};En.parentCollection=(e,t)=>{let n=En.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 Lm(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=Lm(Object.freeze(e.concat([[s,o]])),i.items[o],n);if(typeof a=="number")o=a-1;else{if(a===xc)return xc;a===xm&&(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 Lc="\uFEFF",Fc="",Mc="",io="";function Fm(e){switch(e){case Lc:return"byte-order-mark";case Fc:return"doc-mode";case Mc:return"flow-error-end";case io: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 lt(e){switch(e){case void 0:case" ":case`
186
- `:case"\r":case" ":return!0;default:return!1}}var Fm=new Set("0123456789ABCDEFabcdef"),BP=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),oo=new Set(",[]{}"),VP=new Set(` ,[]{}
187
- \r `),Lc=e=>!e||VP.has(e),ks=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===`
186
+ `:case"\r":case" ":return!0;default:return!1}}var Mm=new Set("0123456789ABCDEFabcdef"),HP=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),oo=new Set(",[]{}"),YP=new Set(` ,[]{}
187
+ \r `),jc=e=>!e||YP.has(e),ks=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===`
190
190
  `||!s&&!this.atEnd)return t+r+1}return n===`
191
191
  `||r>=this.indentNext||!n&&!this.atEnd?t+r:-1}if(n==="-"||n==="."){let r=this.buffer.substr(t,3);if((r==="---"||r==="...")&&lt(this.buffer[t+3]))return-1}return t}getLine(){let t=this.lineEndPos;return(typeof t!="number"||t!==-1&&t<this.pos)&&(t=this.buffer.indexOf(`
192
- `,this.pos),this.lineEndPos=t),t===-1?this.atEnd?this.buffer.substring(this.pos):null:(this.buffer[t-1]==="\r"&&(t-=1),this.buffer.substring(this.pos,t))}hasChars(t){return this.pos+t<=this.buffer.length}setNext(t){return this.buffer=this.buffer.substring(this.pos),this.pos=0,this.lineEndPos=null,this.next=t,null}peek(t){return this.buffer.substr(this.pos,t)}*parseNext(t){switch(t){case"stream":return yield*this.parseStream();case"line-start":return yield*this.parseLineStart();case"block-start":return yield*this.parseBlockStart();case"doc":return yield*this.parseDocument();case"flow":return yield*this.parseFlowCollection();case"quoted-scalar":return yield*this.parseQuotedScalar();case"block-scalar":return yield*this.parseBlockScalar();case"plain-scalar":return yield*this.parsePlainScalar()}}*parseStream(){let t=this.getLine();if(t===null)return this.setNext("stream");if(t[0]===_c&&(yield*this.pushCount(1),t=t.substring(1)),t[0]==="%"){let n=t.length,r=t.indexOf("#");for(;r!==-1;){let i=t[r-1];if(i===" "||i===" "){n=r-1;break}else r=t.indexOf("#",r+1)}for(;;){let i=t[n-1];if(i===" "||i===" ")n-=1;else break}let s=(yield*this.pushCount(n))+(yield*this.pushSpaces(!0));return yield*this.pushCount(t.length-s),this.pushNewline(),"stream"}if(this.atLineEnd()){let n=yield*this.pushSpaces(!0);return yield*this.pushCount(t.length-n),yield*this.pushNewline(),"stream"}return yield xc,yield*this.parseLineStart()}*parseLineStart(){let t=this.charAt(0);if(!t&&!this.atEnd)return this.setNext("line-start");if(t==="-"||t==="."){if(!this.atEnd&&!this.hasChars(4))return this.setNext("line-start");let n=this.peek(3);if((n==="---"||n==="...")&&lt(this.charAt(3)))return yield*this.pushCount(3),this.indentValue=0,this.indentNext=0,n==="---"?"doc":"stream"}return this.indentValue=yield*this.pushSpaces(!1),this.indentNext>this.indentValue&&!lt(this.charAt(1))&&(this.indentNext=this.indentValue),yield*this.parseBlockStart()}*parseBlockStart(){let[t,n]=this.peek(2);if(!n&&!this.atEnd)return this.setNext("block-start");if((t==="-"||t==="?"||t===":")&&lt(n)){let r=(yield*this.pushCount(1))+(yield*this.pushSpaces(!0));return this.indentNext=this.indentValue+1,this.indentValue+=r,"block-start"}return"doc"}*parseDocument(){yield*this.pushSpaces(!0);let t=this.getLine();if(t===null)return this.setNext("doc");let n=yield*this.pushIndicators();switch(t[n]){case"#":yield*this.pushCount(t.length-n);case void 0:return yield*this.pushNewline(),yield*this.parseLineStart();case"{":case"[":return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*this.pushCount(1),"doc";case"*":return yield*this.pushUntil(Lc),"doc";case'"':case"'":return yield*this.parseQuotedScalar();case"|":case">":return n+=yield*this.parseBlockScalarHeader(),n+=yield*this.pushSpaces(!0),yield*this.pushCount(t.length-n),yield*this.pushNewline(),yield*this.parseBlockScalar();default:return yield*this.parsePlainScalar()}}*parseFlowCollection(){let t,n,r=-1;do t=yield*this.pushNewline(),t>0?(n=yield*this.pushSpaces(!1),this.indentValue=r=n):n=0,n+=yield*this.pushSpaces(!0);while(t+n>0);let s=this.getLine();if(s===null)return this.setNext("flow");if((r!==-1&&r<this.indentNext&&s[0]!=="#"||r===0&&(s.startsWith("---")||s.startsWith("..."))&&lt(s[3]))&&!(r===this.indentNext-1&&this.flowLevel===1&&(s[0]==="]"||s[0]==="}")))return this.flowLevel=0,yield Fc,yield*this.parseLineStart();let i=0;for(;s[i]===",";)i+=yield*this.pushCount(1),i+=yield*this.pushSpaces(!0),this.flowKey=!1;switch(i+=yield*this.pushIndicators(),s[i]){case void 0:return"flow";case"#":return yield*this.pushCount(s.length-i),"flow";case"{":case"[":return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel+=1,"flow";case"}":case"]":return yield*this.pushCount(1),this.flowKey=!0,this.flowLevel-=1,this.flowLevel?"flow":"doc";case"*":return yield*this.pushUntil(Lc),"flow";case'"':case"'":return this.flowKey=!0,yield*this.parseQuotedScalar();case":":{let o=this.charAt(1);if(this.flowKey||lt(o)||o===",")return this.flowKey=!1,yield*this.pushCount(1),yield*this.pushSpaces(!0),"flow"}default:return this.flowKey=!1,yield*this.parsePlainScalar()}}*parseQuotedScalar(){let t=this.charAt(0),n=this.buffer.indexOf(t,this.pos+1);if(t==="'")for(;n!==-1&&this.buffer[n+1]==="'";)n=this.buffer.indexOf("'",n+2);else for(;n!==-1;){let i=0;for(;this.buffer[n-1-i]==="\\";)i+=1;if(i%2===0)break;n=this.buffer.indexOf('"',n+1)}let r=this.buffer.substring(0,n),s=r.indexOf(`
192
+ `,this.pos),this.lineEndPos=t),t===-1?this.atEnd?this.buffer.substring(this.pos):null:(this.buffer[t-1]==="\r"&&(t-=1),this.buffer.substring(this.pos,t))}hasChars(t){return this.pos+t<=this.buffer.length}setNext(t){return this.buffer=this.buffer.substring(this.pos),this.pos=0,this.lineEndPos=null,this.next=t,null}peek(t){return this.buffer.substr(this.pos,t)}*parseNext(t){switch(t){case"stream":return yield*this.parseStream();case"line-start":return yield*this.parseLineStart();case"block-start":return yield*this.parseBlockStart();case"doc":return yield*this.parseDocument();case"flow":return yield*this.parseFlowCollection();case"quoted-scalar":return yield*this.parseQuotedScalar();case"block-scalar":return yield*this.parseBlockScalar();case"plain-scalar":return yield*this.parsePlainScalar()}}*parseStream(){let t=this.getLine();if(t===null)return this.setNext("stream");if(t[0]===Lc&&(yield*this.pushCount(1),t=t.substring(1)),t[0]==="%"){let n=t.length,r=t.indexOf("#");for(;r!==-1;){let i=t[r-1];if(i===" "||i===" "){n=r-1;break}else r=t.indexOf("#",r+1)}for(;;){let i=t[n-1];if(i===" "||i===" ")n-=1;else break}let s=(yield*this.pushCount(n))+(yield*this.pushSpaces(!0));return yield*this.pushCount(t.length-s),this.pushNewline(),"stream"}if(this.atLineEnd()){let n=yield*this.pushSpaces(!0);return yield*this.pushCount(t.length-n),yield*this.pushNewline(),"stream"}return yield Fc,yield*this.parseLineStart()}*parseLineStart(){let t=this.charAt(0);if(!t&&!this.atEnd)return this.setNext("line-start");if(t==="-"||t==="."){if(!this.atEnd&&!this.hasChars(4))return this.setNext("line-start");let n=this.peek(3);if((n==="---"||n==="...")&&lt(this.charAt(3)))return yield*this.pushCount(3),this.indentValue=0,this.indentNext=0,n==="---"?"doc":"stream"}return this.indentValue=yield*this.pushSpaces(!1),this.indentNext>this.indentValue&&!lt(this.charAt(1))&&(this.indentNext=this.indentValue),yield*this.parseBlockStart()}*parseBlockStart(){let[t,n]=this.peek(2);if(!n&&!this.atEnd)return this.setNext("block-start");if((t==="-"||t==="?"||t===":")&&lt(n)){let r=(yield*this.pushCount(1))+(yield*this.pushSpaces(!0));return this.indentNext=this.indentValue+1,this.indentValue+=r,"block-start"}return"doc"}*parseDocument(){yield*this.pushSpaces(!0);let t=this.getLine();if(t===null)return this.setNext("doc");let n=yield*this.pushIndicators();switch(t[n]){case"#":yield*this.pushCount(t.length-n);case void 0:return yield*this.pushNewline(),yield*this.parseLineStart();case"{":case"[":return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*this.pushCount(1),"doc";case"*":return yield*this.pushUntil(jc),"doc";case'"':case"'":return yield*this.parseQuotedScalar();case"|":case">":return n+=yield*this.parseBlockScalarHeader(),n+=yield*this.pushSpaces(!0),yield*this.pushCount(t.length-n),yield*this.pushNewline(),yield*this.parseBlockScalar();default:return yield*this.parsePlainScalar()}}*parseFlowCollection(){let t,n,r=-1;do t=yield*this.pushNewline(),t>0?(n=yield*this.pushSpaces(!1),this.indentValue=r=n):n=0,n+=yield*this.pushSpaces(!0);while(t+n>0);let s=this.getLine();if(s===null)return this.setNext("flow");if((r!==-1&&r<this.indentNext&&s[0]!=="#"||r===0&&(s.startsWith("---")||s.startsWith("..."))&&lt(s[3]))&&!(r===this.indentNext-1&&this.flowLevel===1&&(s[0]==="]"||s[0]==="}")))return this.flowLevel=0,yield Mc,yield*this.parseLineStart();let i=0;for(;s[i]===",";)i+=yield*this.pushCount(1),i+=yield*this.pushSpaces(!0),this.flowKey=!1;switch(i+=yield*this.pushIndicators(),s[i]){case void 0:return"flow";case"#":return yield*this.pushCount(s.length-i),"flow";case"{":case"[":return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel+=1,"flow";case"}":case"]":return yield*this.pushCount(1),this.flowKey=!0,this.flowLevel-=1,this.flowLevel?"flow":"doc";case"*":return yield*this.pushUntil(jc),"flow";case'"':case"'":return this.flowKey=!0,yield*this.parseQuotedScalar();case":":{let o=this.charAt(1);if(this.flowKey||lt(o)||o===",")return this.flowKey=!1,yield*this.pushCount(1),yield*this.pushSpaces(!0),"flow"}default:return this.flowKey=!1,yield*this.parsePlainScalar()}}*parseQuotedScalar(){let t=this.charAt(0),n=this.buffer.indexOf(t,this.pos+1);if(t==="'")for(;n!==-1&&this.buffer[n+1]==="'";)n=this.buffer.indexOf("'",n+2);else for(;n!==-1;){let i=0;for(;this.buffer[n-1-i]==="\\";)i+=1;if(i%2===0)break;n=this.buffer.indexOf('"',n+1)}let r=this.buffer.substring(0,n),s=r.indexOf(`
193
193
  `,this.pos);if(s!==-1){for(;s!==-1;){let i=this.continueScalar(s+1);if(i===-1)break;s=r.indexOf(`
194
194
  `,i)}s!==-1&&(n=s-(r[s-1]==="\r"?2:1))}if(n===-1){if(!this.atEnd)return this.setNext("quoted-scalar");n=this.buffer.length}return yield*this.pushToIndex(n+1,!1),this.flowLevel?"flow":"doc"}*parseBlockScalarHeader(){this.blockScalarIndent=-1,this.blockScalarKeep=!1;let t=this.pos;for(;;){let n=this.buffer[++t];if(n==="+")this.blockScalarKeep=!0;else if(n>"0"&&n<="9")this.blockScalarIndent=Number(n)-1;else if(n!=="-")break}return yield*this.pushUntil(n=>lt(n)||n==="#")}*parseBlockScalar(){let t=this.pos-1,n=0,r;e:for(let i=this.pos;r=this.buffer[i];++i)switch(r){case" ":n+=1;break;case`
195
195
  `:t=i,n=0;break;case"\r":{let o=this.buffer[i+1];if(!o&&!this.atEnd)return this.setNext("block-scalar");if(o===`
@@ -199,24 +199,24 @@ ${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 io,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(lt(i)||t&&oo.has(i))break;n=r}else if(lt(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&&oo.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&&oo.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield io,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(Lc),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(lt(r)||n&&oo.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(;!lt(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(BP.has(n))n=this.buffer[++t];else if(n==="%"&&Fm.has(this.buffer[t+1])&&Fm.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===`
202
+ `){let o=this.continueScalar(r+1);if(o===-1)break;r=Math.max(r,o-2)}}else{if(t&&oo.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield io,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(jc),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(lt(r)||n&&oo.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(;!lt(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(HP.has(n))n=this.buffer[++t];else if(n==="%"&&Mm.has(this.buffer[t+1])&&Mm.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 Ts=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 sn(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function Lm(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 jm(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 ao(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 yr(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 lo(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 Mm(e){if(e.start.type==="flow-seq-start")for(let t of e.items)t.sep&&!t.value&&!sn(t.start,"explicit-key-ind")&&!sn(t.sep,"map-value-ind")&&(t.key&&(t.value=t.key),delete t.key,jm(t.value)?t.value.end?lo(t.value.end,t.sep):t.value.end=t.sep:lo(t.start,t.sep),delete t.sep)}var bs=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 ks,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=xm(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"&&Mm(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&&Lm(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":{Lm(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=ao(this.peek(2)),r=yr(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(`
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 Ts=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 sn(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function jm(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 Um(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 ao(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 yr(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 lo(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 qm(e){if(e.start.type==="flow-seq-start")for(let t of e.items)t.sep&&!t.value&&!sn(t.start,"explicit-key-ind")&&!sn(t.sep,"map-value-ind")&&(t.key&&(t.value=t.key),delete t.key,Um(t.value)?t.value.end?lo(t.value.end,t.sep):t.value.end=t.sep:lo(t.start,t.sep),delete t.sep)}var bs=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 ks,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=Fm(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"&&qm(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&&jm(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":{jm(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=ao(this.peek(2)),r=yr(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)){lo(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(sn(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(jm(n.key)&&!sn(n.sep,"newline")){let o=yr(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(sn(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=yr(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]}):sn(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&&!sn(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)){lo(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||sn(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=ao(r),i=yr(s);Mm(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(`
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)){lo(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(sn(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(Um(n.key)&&!sn(n.sep,"newline")){let o=yr(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(sn(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=yr(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]}):sn(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&&!sn(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)){lo(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||sn(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=ao(r),i=yr(s);qm(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=ao(t),r=yr(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=ao(t),r=yr(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 KP(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new Ts||null,prettyErrors:t}}function Mc(e,t={}){let{lineCounter:n,prettyErrors:r}=KP(t),s=new bs(n?.addNewLine),i=new ws(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 at(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(Ic(e,n)),o.warnings.forEach(Ic(e,n))),o}var Rs=1024*1024;function jc(e,t){Buffer.byteLength(e)>Rs&&co(t,[`Definition exceeds ${Rs} bytes.`]);let n=Mc(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];ze(n,(i,o)=>{Le(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&&co(t,s),n.contents===null&&co(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){co(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function co(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 HP}from"node:crypto";var wr=/^[a-z][a-z0-9_-]{0,63}$/,qm=/\$\{\{\s*([^{}]+?)\s*\}\}/g,Um=32,Wm=128,YP=16,zP=32,JP=10080*60*1e3,kr=32*1024,Bm=16;function Wc(e,t){let n=[],r=Me(e,"$",n);ct(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=aS(r.name,"$.name",n),i=QP(r.limits,n),o=ZP(r.inputs,n),a=eS(r.steps,n);a.length>Wm&&n.push(`$.steps may contain at most ${Wm} 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=rS(a,n);c&&sS(a,o,c.ancestors,n),n.length>0&&uS(t,n);let d={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:d,hash:HP("sha256").update(Uc(d)).digest("hex"),order:c.order,waves:XP(c.waves,i.maxConcurrency)}}function XP(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 QP(e,t){let n=Me(e,"$.limits",t);ct(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=Vm(n.max_concurrency,"$.limits.max_concurrency",1,YP,t),s=Vm(n.max_tasks,"$.limits.max_tasks",1,zP,t),i=Hm(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function ZP(e,t){if(e===void 0)return{};let n=Me(e,"$.inputs",t),r=Object.entries(n);r.length>Um&&t.push(`$.inputs may contain at most ${Um} inputs.`);let s={};for(let[i,o]of r){wr.test(i)||t.push(`$.inputs key "${i}" must match ${wr}.`);let a=Me(o,`$.inputs.${i}`,t);ct(a,["type","required","default"],`$.inputs.${i}`,t);let l=cS(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:lS(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&&!Km(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&Km(a.default,l)?{defaultValue:a.default}:{}}}return s}function eS(e,t){let n=Me(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{wr.test(s)||t.push(`$.steps key "${s}" must match ${wr}.`);let o=Me(i,`$.steps.${s}`,t),a=Gm(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?nS(s,o,a,t):tS(s,o,a,t)})}function tS(e,t,n,r){ct(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?Ft(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let u=Me(t.create_child,`$.steps.${e}.create_child`,r);ct(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:Ft(u.repo,`$.steps.${e}.create_child.repo`,r)}:{},...u.workspace!==void 0?{workspace:Ft(u.workspace,`$.steps.${e}.create_child.workspace`,r)}:{}}}let l;if(t.agent!==void 0){let u=Me(t.agent,`$.steps.${e}.agent`,r);if(ct(u,["runner"],`$.steps.${e}.agent`,r),u.runner!==void 0)try{l=T.runners.parse(Ft(u.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=Ft(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>kr&&r.push(`$.steps.${e}.prompt exceeds ${kr} bytes.`);let d;if(t.output!==void 0){let u=Me(t.output,`$.steps.${e}.output`,r);ct(u,["schema"],`$.steps.${e}.output`,r),d=qc(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 nS(e,t,n,r){ct(t,["needs","human_review"],`$.steps.${e}`,r);let s=Me(t.human_review,`$.steps.${e}.human_review`,r);ct(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=Me(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);ct(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=Ft(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:Ft(s.title,`$.steps.${e}.human_review.title`,r),summary:Ft(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:Hm(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function qc(e,t,n,r){if(r>Bm)return n.push(`${t} exceeds the maximum schema depth of ${Bm}.`),{};let s=Me(e,t,n);ct(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&&Gm(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=Me(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))qc(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&qc(s.items,`${t}.items`,n,r+1),s}function rS(e,t){let n=new Set(e.map(u=>u.id));if(e.some(u=>u.needs.some(p=>!n.has(p))))return null;let r=new Map(e.map((u,p)=>[u.id,p])),s=new Map(e.map(u=>[u.id,u.needs.length])),i=new Map;for(let u of e)for(let p of u.needs)i.set(p,[...i.get(p)??[],u.id]);let o=e.filter(u=>u.needs.length===0).map(u=>u.id),a=[],l=[];for(;o.length>0;){o.sort((h,m)=>r.get(h)-r.get(m));let u=o;l.push(u),a.push(...u);let p=[];for(let h of u)for(let m of i.get(h)??[]){let f=s.get(m)-1;s.set(m,f),f===0&&p.push(m)}o=p}if(a.length!==e.length)return t.push("$.steps must form an acyclic graph."),null;let c=new Map(e.map(u=>[u.id,u])),d=new Map;for(let u of a){let p=new Set;for(let h of c.get(u).needs){p.add(h);for(let m of d.get(h)??[])p.add(m)}d.set(u,p)}return{order:a,waves:l,ancestors:d}}function sS(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(qm)],c=a.replace(qm,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let d of l)iS(d[1].trim(),i,t,n,s,r)}}}function iS(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&&oS(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function oS(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(!uo(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(!uo(a))return;i=a}}function Uc(e){return Array.isArray(e)?`[${e.map(Uc).join(",")}]`:uo(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Uc(e[t])}`).join(",")}}`:JSON.stringify(e)}function Me(e,t,n){return uo(e)?e:(n.push(`${t} must be an object.`),{})}function ct(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 aS(e,t,n){let r=Ft(e,t,n);return wr.test(r)||n.push(`${t} must match ${wr}.`),r}function Ft(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function Gm(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 Vm(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 lS(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function cS(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function Km(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function Hm(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>JP?(n.push(`${t} must be between 1ms and 7d.`),1):i}function uS(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var uo=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as dS,stat as pS}from"node:fs/promises";var fS=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function Bc(e){let t=await Ym(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 Vc(e,t){let n=await Ym(e),r=mS(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:On(l.title,r,`$.steps.${a}.human_review.title`),summary:On(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?On(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:On(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",...l.createChild?.repo?{repo:On(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)}:{},...l.createChild?.workspace?{workspace:On(l.createChild.workspace,r,`$.steps.${a}.create_child.workspace`)}:{}},runner:l.runner??null,prompt:yS(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 Ym(e){let t;try{let n=await pS(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>Rs)throw new Error(`Definition exceeds ${Rs} bytes.`);t=await dS(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return Wc(jc(t,e),e)}function mS(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]=hS(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 hS(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 gS(e,t){return e.replace(fS,(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 On(e,t,n){let r=gS(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 yS(e,t,n){let r=`$.steps.${n}.prompt`,s=On(e,t,r);if(Buffer.byteLength(s)>kr)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${kr} bytes.`,{details:{location:r,maxBytes:kr}});return s}import{createHash as zm}from"node:crypto";import wS from"node:path";import{mkdir as kS}from"node:fs/promises";var Kc={type:"system",component:"heartbeat"};async function on(e,t={}){await kS(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([P.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):$t.listAgents(e),Ef(e),vS(e)]),o=r??gt(n.tasks.filter(m=>m.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=IS(i),l=a!==i,c=[],d=Gc(s.filter(SS),m=>m.taskId),u=Gc(s.filter(m=>m.type.startsWith("task.pr.")),m=>m.taskId),p=Gc(s.filter(m=>m.type==="agent.state.changed"),m=>m.agentTabId);for(let m of n.tasks){let f=TS(m),y=d.get(m.id),k=Yc(y?.data)??a.tasks[m.id]??null,R=y?.id??a.tasks[m.id]?.eventId??null;if(k?.signature!==f.signature){let x=k?m.status==="closed"&&k?.status!=="closed"?"task.closed":"task.updated":"task.created",v=await xe(e,{id:Hc(x,m.id,f.signature),type:x,taskId:m.id,workspaceId:m.workspaceId||null,occurredAt:m.updatedAt,actor:Kc,data:{...f,changedFields:k?RS(k,f):[]}});c.push(v),R=v.id}a.tasks[m.id]={...f,eventId:R};let b=PS(m.prs),$=u.get(m.id),O=Yc($?.data)??a.pullRequests[m.id]??null,N=$?.id??a.pullRequests[m.id]?.eventId??null;if((O||b.associations.length>0)&&O?.signature!==b.signature){let x=Array.isArray(O?.associations)?O.associations.length:0,v=b.associations.length>x?"task.pr.linked":b.associations.length<x?"task.pr.unlinked":"task.pr.refreshed",w=await xe(e,{id:Hc(v,m.id,b.signature),type:v,taskId:m.id,workspaceId:m.workspaceId||null,occurredAt:m.updatedAt,actor:Kc,data:b});c.push(w),N=w.id}a.pullRequests[m.id]={...b,eventId:N}}let h=new Map(o.tasks.map(m=>[m.taskId,m.state]));for(let m of o.agents){let f=p.get(m.tabId),y=Yc(f?.data)??a.agents[m.tabId]??null;if(y?.state===m.state){a.agents[m.tabId]={state:m.state,eventId:f?.id??a.agents[m.tabId]?.eventId??null};continue}let k=[f?.id??a.agents[m.tabId]?.eventId??"initial",m.state,m.sessionState??"none",m.lastActivityAt??"none",m.exitCode??"none",m.error??"none"].join(":"),R=await xe(e,{id:Hc("agent.state.changed",m.tabId,k),type:"agent.state.changed",taskId:m.taskId,agentTabId:m.tabId,actor:Kc,data:{previousState:typeof y?.state=="string"?y.state:null,state:m.state,taskState:h.get(m.taskId)??"idle",sessionState:m.sessionState,lastActivityAt:m.lastActivityAt,exitCode:m.exitCode,error:m.error}});c.push(R),a.agents[m.tabId]={state:m.state,eventId:R.id}}return(c.length>0||l)&&await q(Xm(e),a),c}function TS(e){let t={status:e.status,title:e.title,runner:e.runner,branch:e.branch,lastCommitSha:e.lastCommit?.sha??null,checksStatus:e.checks.status,checksLastRunAt:e.checks.lastRunAt,sourceUpdatedAt:e.updatedAt,agentTabIds:e.ptyTabs.filter(n=>n.kind==="agent").map(n=>n.id)};return{...t,signature:Jm(t)}}var bS=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function RS(e,t){return bS.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function PS(e){let t=e.map(n=>({provider:n.provider,owner:n.owner,repo:n.repo,number:n.number,url:n.url,status:n.status,draft:n.draft,headBranch:n.headBranch,lastSyncedAt:n.lastSyncedAt,lastSyncedHeadSha:n.lastSyncedHeadSha}));return{associations:t,signature:Jm(t)}}function Gc(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var SS=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",Jm=e=>zm("sha256").update(JSON.stringify(e)).digest("hex"),Hc=(...e)=>zm("sha256").update(e.join("\0")).digest("hex"),Yc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,Xm=e=>wS.join(e.orchestrationDir,"event-reconciliation.json");function IS(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 vS(e){try{return await Fs(Xm(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function CS(e,t){return await zc(e),await on(e),Sn(e,t)}async function AS(e,t,n){await zc(e);let r=await $t.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await on(e,{agentObserver:r});let a=await Sn(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 Qm(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function ES(e,t,n){await zc(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 $t.openObserver(e);try{await on(e,{agentObserver:s});let o=(await Sn(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=gt([r],s.getSnapshots(),l),d=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:t,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw $S(t);let u=a-Date.now();if(u<=0)throw OS(t,n.states,n.timeoutMs);await on(e,{agentObserver:s}),o=(await Sn(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await Qm(Math.min(250,u),n.signal)}}finally{s.close()}}async function zc(e){let t=await T.load(e);if(!T.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 Qm(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 OS=(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}}),$S=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),po={list:CS,watch:AS,waitForTaskState:ES,reconcile:on};import{readFile as GS}from"node:fs/promises";import{mkdir as qS,readFile as nh,rm as rh}from"node:fs/promises";import{createConnection as US}from"node:net";import WS from"node:path";import{spawn as FS}from"node:child_process";import{closeSync as LS,openSync as MS}from"node:fs";import Xc from"node:path";import{accessSync as NS,constants as DS}from"node:fs";import{homedir as Zm}from"node:os";import an from"node:path";var _S=[an.join(Zm(),".local","bin"),an.join(Zm(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function th(e=process.env){return xS([...(e.PATH??"").split(an.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:_S])}function fo(e=process.env){return{...e,PATH:th(e).join(an.delimiter)}}function Jc(e,t={}){if(e.includes(an.sep)){let n=an.isAbsolute(e)?e:an.resolve(t.cwd??process.cwd(),e);return eh(n)?n:null}for(let n of th(t.env)){let r=an.join(n,e);if(eh(r))return r}return null}function mo(e,t={}){let n=Jc(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 eh(e){try{return NS(e,DS.X_OK),!0}catch{return!1}}function xS(e){return[...new Set(e)]}function ho(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=jS(e.workspaceRoot),s=MS(Xc.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return FS(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{LS(s)}})().unref()}function jS(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=Xc.resolve(Xc.dirname(t),"..","node_modules",".bin","tsx");return{command:Jc("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 Lt(e){let t=await yo(_e(e).socketPath).catch(()=>null);if(!t)return!1;try{let n=await $n(t,{type:"ping"});return zt(n.protocolVersion)?(await $n(t,{type:"wakeOrchestration"}),!0):!1}catch{return!1}finally{t.end()}}async function go(e,t){if(t.length===0)return!0;let n=await yo(_e(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await $n(n,{type:"ping"});if(!zt(r.protocolVersion))return!1;for(let s of t)await $n(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function ih(e,t){await BS(e);let n=await yo(_e(e).socketPath);try{let r=await $n(n,{type:"ping"});if(!zt(r.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await $n(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 BS(e){let t=_e(e),n=await sh(t.socketPath).catch(()=>null);if(zt(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 qS(e.runtimeDir,{recursive:!0});let r=await nh(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&VS(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([rh(t.socketPath,{force:!0}),rh(t.pidPath,{force:!0})]),ho(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await sh(t.socketPath).catch(()=>null);if(zt(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await nh(WS.join(e.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
209
- ${o.slice(-2e3)}`:""}`)}async function sh(e){let t=await yo(e);try{return await $n(t,{type:"ping"})}finally{t.end()}}function VS(e){try{return process.kill(e,0),!0}catch{return!1}}var KS=1;function $n(e,t){let n=KS++;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(`
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=ao(t),r=yr(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=ao(t),r=yr(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 zP(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new Ts||null,prettyErrors:t}}function qc(e,t={}){let{lineCounter:n,prettyErrors:r}=zP(t),s=new bs(n?.addNewLine),i=new ws(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 at(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(Cc(e,n)),o.warnings.forEach(Cc(e,n))),o}var Rs=1024*1024;function Uc(e,t){Buffer.byteLength(e)>Rs&&co(t,[`Definition exceeds ${Rs} bytes.`]);let n=qc(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];ze(n,(i,o)=>{Fe(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&&co(t,s),n.contents===null&&co(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){co(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function co(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 XP}from"node:crypto";var wr=/^[a-z][a-z0-9_-]{0,63}$/,Wm=/\$\{\{\s*([^{}]+?)\s*\}\}/g,Bm=32,Vm=128,QP=16,ZP=32,eS=10080*60*1e3,kr=32*1024,Km=16;function Vc(e,t){let n=[],r=Me(e,"$",n);ct(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=dS(r.name,"$.name",n),i=nS(r.limits,n),o=rS(r.inputs,n),a=sS(r.steps,n);a.length>Vm&&n.push(`$.steps may contain at most ${Vm} 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=aS(a,n);c&&lS(a,o,c.ancestors,n),n.length>0&&mS(t,n);let d={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:d,hash:XP("sha256").update(Bc(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 nS(e,t){let n=Me(e,"$.limits",t);ct(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=Gm(n.max_concurrency,"$.limits.max_concurrency",1,QP,t),s=Gm(n.max_tasks,"$.limits.max_tasks",1,ZP,t),i=zm(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=Me(e,"$.inputs",t),r=Object.entries(n);r.length>Bm&&t.push(`$.inputs may contain at most ${Bm} inputs.`);let s={};for(let[i,o]of r){wr.test(i)||t.push(`$.inputs key "${i}" must match ${wr}.`);let a=Me(o,`$.inputs.${i}`,t);ct(a,["type","required","default"],`$.inputs.${i}`,t);let l=fS(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:pS(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&&!Hm(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&Hm(a.default,l)?{defaultValue:a.default}:{}}}return s}function sS(e,t){let n=Me(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{wr.test(s)||t.push(`$.steps key "${s}" must match ${wr}.`);let o=Me(i,`$.steps.${s}`,t),a=Ym(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?oS(s,o,a,t):iS(s,o,a,t)})}function iS(e,t,n,r){ct(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?Lt(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let u=Me(t.create_child,`$.steps.${e}.create_child`,r);ct(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:Lt(u.repo,`$.steps.${e}.create_child.repo`,r)}:{},...u.workspace!==void 0?{workspace:Lt(u.workspace,`$.steps.${e}.create_child.workspace`,r)}:{}}}let l;if(t.agent!==void 0){let u=Me(t.agent,`$.steps.${e}.agent`,r);if(ct(u,["runner"],`$.steps.${e}.agent`,r),u.runner!==void 0)try{l=T.runners.parse(Lt(u.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=Lt(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>kr&&r.push(`$.steps.${e}.prompt exceeds ${kr} bytes.`);let d;if(t.output!==void 0){let u=Me(t.output,`$.steps.${e}.output`,r);ct(u,["schema"],`$.steps.${e}.output`,r),d=Wc(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 oS(e,t,n,r){ct(t,["needs","human_review"],`$.steps.${e}`,r);let s=Me(t.human_review,`$.steps.${e}.human_review`,r);ct(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=Me(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);ct(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=Lt(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:Lt(s.title,`$.steps.${e}.human_review.title`,r),summary:Lt(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:zm(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function Wc(e,t,n,r){if(r>Km)return n.push(`${t} exceeds the maximum schema depth of ${Km}.`),{};let s=Me(e,t,n);ct(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&&Ym(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=Me(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))Wc(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&Wc(s.items,`${t}.items`,n,r+1),s}function aS(e,t){let n=new Set(e.map(u=>u.id));if(e.some(u=>u.needs.some(p=>!n.has(p))))return null;let r=new Map(e.map((u,p)=>[u.id,p])),s=new Map(e.map(u=>[u.id,u.needs.length])),i=new Map;for(let u of e)for(let p of u.needs)i.set(p,[...i.get(p)??[],u.id]);let o=e.filter(u=>u.needs.length===0).map(u=>u.id),a=[],l=[];for(;o.length>0;){o.sort((h,m)=>r.get(h)-r.get(m));let u=o;l.push(u),a.push(...u);let p=[];for(let h of u)for(let m of i.get(h)??[]){let f=s.get(m)-1;s.set(m,f),f===0&&p.push(m)}o=p}if(a.length!==e.length)return t.push("$.steps must form an acyclic graph."),null;let c=new Map(e.map(u=>[u.id,u])),d=new Map;for(let u of a){let p=new Set;for(let h of c.get(u).needs){p.add(h);for(let m of d.get(h)??[])p.add(m)}d.set(u,p)}return{order:a,waves:l,ancestors:d}}function lS(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)cS(d[1].trim(),i,t,n,s,r)}}}function cS(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&&uS(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function uS(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(!uo(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(!uo(a))return;i=a}}function Bc(e){return Array.isArray(e)?`[${e.map(Bc).join(",")}]`:uo(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Bc(e[t])}`).join(",")}}`:JSON.stringify(e)}function Me(e,t,n){return uo(e)?e:(n.push(`${t} must be an object.`),{})}function ct(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 dS(e,t,n){let r=Lt(e,t,n);return wr.test(r)||n.push(`${t} must match ${wr}.`),r}function Lt(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function Ym(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 Gm(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 pS(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function fS(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function Hm(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function zm(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>eS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function mS(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var uo=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as hS,stat as gS}from"node:fs/promises";var yS=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function Kc(e){let t=await Jm(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 Gc(e,t){let n=await Jm(e),r=wS(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:On(l.title,r,`$.steps.${a}.human_review.title`),summary:On(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?On(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:On(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",...l.createChild?.repo?{repo:On(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)}:{},...l.createChild?.workspace?{workspace:On(l.createChild.workspace,r,`$.steps.${a}.create_child.workspace`)}:{}},runner:l.runner??null,prompt:bS(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 Jm(e){let t;try{let n=await gS(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>Rs)throw new Error(`Definition exceeds ${Rs} bytes.`);t=await hS(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return Vc(Uc(t,e),e)}function wS(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]=kS(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 kS(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 TS(e,t){return e.replace(yS,(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 On(e,t,n){let r=TS(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 bS(e,t,n){let r=`$.steps.${n}.prompt`,s=On(e,t,r);if(Buffer.byteLength(s)>kr)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${kr} bytes.`,{details:{location:r,maxBytes:kr}});return s}import{createHash as Xm}from"node:crypto";import RS from"node:path";import{mkdir as PS}from"node:fs/promises";var Hc={type:"system",component:"heartbeat"};async function on(e,t={}){await PS(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([P.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):$t.listAgents(e),$f(e),OS(e)]),o=r??gt(n.tasks.filter(m=>m.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=ES(i),l=a!==i,c=[],d=Yc(s.filter(AS),m=>m.taskId),u=Yc(s.filter(m=>m.type.startsWith("task.pr.")),m=>m.taskId),p=Yc(s.filter(m=>m.type==="agent.state.changed"),m=>m.agentTabId);for(let m of n.tasks){let f=SS(m),y=d.get(m.id),k=Jc(y?.data)??a.tasks[m.id]??null,R=y?.id??a.tasks[m.id]?.eventId??null;if(k?.signature!==f.signature){let x=k?m.status==="closed"&&k?.status!=="closed"?"task.closed":"task.updated":"task.created",v=await xe(e,{id:zc(x,m.id,f.signature),type:x,taskId:m.id,workspaceId:m.workspaceId||null,occurredAt:m.updatedAt,actor:Hc,data:{...f,changedFields:k?vS(k,f):[]}});c.push(v),R=v.id}a.tasks[m.id]={...f,eventId:R};let b=CS(m.prs),$=u.get(m.id),O=Jc($?.data)??a.pullRequests[m.id]??null,N=$?.id??a.pullRequests[m.id]?.eventId??null;if((O||b.associations.length>0)&&O?.signature!==b.signature){let x=Array.isArray(O?.associations)?O.associations.length:0,v=b.associations.length>x?"task.pr.linked":b.associations.length<x?"task.pr.unlinked":"task.pr.refreshed",w=await xe(e,{id:zc(v,m.id,b.signature),type:v,taskId:m.id,workspaceId:m.workspaceId||null,occurredAt:m.updatedAt,actor:Hc,data:b});c.push(w),N=w.id}a.pullRequests[m.id]={...b,eventId:N}}let h=new Map(o.tasks.map(m=>[m.taskId,m.state]));for(let m of o.agents){let f=p.get(m.tabId),y=Jc(f?.data)??a.agents[m.tabId]??null;if(y?.state===m.state){a.agents[m.tabId]={state:m.state,eventId:f?.id??a.agents[m.tabId]?.eventId??null};continue}let k=[f?.id??a.agents[m.tabId]?.eventId??"initial",m.state,m.sessionState??"none",m.lastActivityAt??"none",m.exitCode??"none",m.error??"none"].join(":"),R=await xe(e,{id:zc("agent.state.changed",m.tabId,k),type:"agent.state.changed",taskId:m.taskId,agentTabId:m.tabId,actor:Hc,data:{previousState:typeof y?.state=="string"?y.state:null,state:m.state,taskState:h.get(m.taskId)??"idle",sessionState:m.sessionState,lastActivityAt:m.lastActivityAt,exitCode:m.exitCode,error:m.error}});c.push(R),a.agents[m.tabId]={state:m.state,eventId:R.id}}return(c.length>0||l)&&await q(Zm(e),a),c}function SS(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:Qm(t)}}var IS=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function vS(e,t){return IS.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function CS(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:Qm(t)}}function Yc(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var AS=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",Qm=e=>Xm("sha256").update(JSON.stringify(e)).digest("hex"),zc=(...e)=>Xm("sha256").update(e.join("\0")).digest("hex"),Jc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,Zm=e=>RS.join(e.orchestrationDir,"event-reconciliation.json");function ES(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 OS(e){try{return await Ls(Zm(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function $S(e,t){return await Xc(e),await on(e),Sn(e,t)}async function NS(e,t,n){await Xc(e);let r=await $t.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await on(e,{agentObserver:r});let a=await Sn(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 eh(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function DS(e,t,n){await Xc(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 $t.openObserver(e);try{await on(e,{agentObserver:s});let o=(await Sn(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=gt([r],s.getSnapshots(),l),d=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:t,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw xS(t);let u=a-Date.now();if(u<=0)throw _S(t,n.states,n.timeoutMs);await on(e,{agentObserver:s}),o=(await Sn(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await eh(Math.min(250,u),n.signal)}}finally{s.close()}}async function Xc(e){let t=await T.load(e);if(!T.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 eh(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 _S=(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}}),xS=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),po={list:$S,watch:NS,waitForTaskState:DS,reconcile:on};import{readFile as JS}from"node:fs/promises";import{mkdir as VS,readFile as sh,rm as ih}from"node:fs/promises";import{createConnection as KS}from"node:net";import GS from"node:path";import{spawn as qS}from"node:child_process";import{closeSync as US,openSync as WS}from"node:fs";import Zc from"node:path";import{accessSync as LS,constants as FS}from"node:fs";import{homedir as th}from"node:os";import an from"node:path";var MS=[an.join(th(),".local","bin"),an.join(th(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function rh(e=process.env){return jS([...(e.PATH??"").split(an.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:MS])}function fo(e=process.env){return{...e,PATH:rh(e).join(an.delimiter)}}function Qc(e,t={}){if(e.includes(an.sep)){let n=an.isAbsolute(e)?e:an.resolve(t.cwd??process.cwd(),e);return nh(n)?n:null}for(let n of rh(t.env)){let r=an.join(n,e);if(nh(r))return r}return null}function mo(e,t={}){let n=Qc(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 nh(e){try{return LS(e,FS.X_OK),!0}catch{return!1}}function jS(e){return[...new Set(e)]}function ho(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=BS(e.workspaceRoot),s=WS(Zc.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return qS(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{US(s)}})().unref()}function BS(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=Zc.resolve(Zc.dirname(t),"..","node_modules",".bin","tsx");return{command:Qc("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 Ft(e){let t=await yo(_e(e).socketPath).catch(()=>null);if(!t)return!1;try{let n=await $n(t,{type:"ping"});return zt(n.protocolVersion)?(await $n(t,{type:"wakeOrchestration"}),!0):!1}catch{return!1}finally{t.end()}}async function go(e,t){if(t.length===0)return!0;let n=await yo(_e(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await $n(n,{type:"ping"});if(!zt(r.protocolVersion))return!1;for(let s of t)await $n(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function ah(e,t){await HS(e);let n=await yo(_e(e).socketPath);try{let r=await $n(n,{type:"ping"});if(!zt(r.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await $n(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 HS(e){let t=_e(e),n=await oh(t.socketPath).catch(()=>null);if(zt(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 VS(e.runtimeDir,{recursive:!0});let r=await sh(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&YS(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([ih(t.socketPath,{force:!0}),ih(t.pidPath,{force:!0})]),ho(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await oh(t.socketPath).catch(()=>null);if(zt(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await sh(GS.join(e.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
209
+ ${o.slice(-2e3)}`:""}`)}async function oh(e){let t=await yo(e);try{return await $n(t,{type:"ping"})}finally{t.end()}}function YS(e){try{return process.kill(e,0),!0}catch{return!1}}var zS=1;function $n(e,t){let n=zS++;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 yo(e){return new Promise((t,n)=>{let r=US(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function HS(e,t){await ZS(e);let n=await P.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 QS(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 Lt(e),a}return await Qc(e,o.command.id),o}async function Qc(e,t){if((await ae.show(e,t)).command.state==="delivered"||await Lt(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 YS(e,t){return ae.show(e,t)}async function zS(e,t){return ae.list(e,t)}async function JS(e,t){let n;try{n=await ae.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await Lt(e),r}return await Lt(e),n}async function XS(e,t,n){return ae.wait(e,t,n)}async function QS(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await GS(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 ZS(e){let t=await T.load(e);if(!T.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Prompt dispatch is a feature preview. Enable agentOrchestration before sending prompts.",{details:{preview:"agentOrchestration"}})}var Tr={send:HS,show:YS,list:zS,cancel:JS,wait:XS};var eI=6e4;async function wo(e,t){return ic(e,t,{createTask:tI})}async function oh(e,t,n,r={}){return sc(e,t,n,{...r,launchProvisioned:(s,i)=>ah(e,s,i,!1)})}async function tI(e,t,n,r={}){return P.createTask(e,t,n,{...r,markStartedAfterLaunch:!1,launchProvisioned:(s,i)=>ah(e,s,i,!0)})}async function ah(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 ih(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:eI,idempotencyKey:`task-start:${t.id}`,actor:{type:"system",component:"orchestration-supervisor"}});await Qc(e,i.command.id)}catch(i){throw await go(e,[s.id]),i}}async function ko(e,t,n){let r=(await P.listTasks(e,{includeClosed:!0})).tasks,s=new Set([t]),i=!0;for(;i;){i=!1;for(let a of r)a.parentTaskId&&s.has(a.parentTaskId)&&!s.has(a.id)&&(s.add(a.id),i=!0)}let o=r.filter(a=>s.has(a.id)).flatMap(a=>a.ptyTabs.map(l=>l.id));try{let a=await ac(e,t,n);return await go(e,o),a}catch(a){throw a instanceof g&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await go(e,o),a}}import{randomUUID as uh}from"node:crypto";import{readFile as nI,realpath as lh}from"node:fs/promises";import Zc from"node:path";var ne={type:"system",component:"orchestration-supervisor"},rI=/\$\{\{\s*steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)\s*\}\}/g;async function sI(e,t,n,r,s,i){await xn(e);let o=await wI(e,t);if(await P.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 Ye(e,i,"fury.plan",r)}let a=await Vc(t,n);kI(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_${uh()}`,planHash:Dl(c),createdBy:s,createdAt:l};await uf(e,a.definitionHash,await nI(t,"utf8"));let u=await df(e,d);try{await xe(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 iI(e,t,n){if(await xn(e),n.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can approve a Fury plan.",{});let r=await hi(e,t),s={schemaVersion:1,planId:r.id,planHash:r.planHash,approvedBy:n,approvedAt:new Date().toISOString()},i=await mf(e,s);try{await xe(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 oI(e,t,n,r){await xn(e);let s=await hi(e,t);if((await hf(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 Ye(e,r,"fury.run",s.rootTaskId)}await et(e,await P.getTask(e,s.rootTaskId));let o=new Date,l={schemaVersion:1,id:`fury_${uh()}`,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 gf(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 _n(e,c.run.id),await Lt(e),{kind:"runFury",run:await pe(e,c.run.id),created:c.created}}async function aI(e,t){return await xn(e),await _n(e,t),{kind:"showFury",run:await pe(e,t)}}async function bo(e,t={}){let n=await T.load(e);if(T.previews.isEnabled(n,"agentOrchestration"))for(let r of await yf(e))await _n(e,r.id,t)}async function _n(e,t,n={}){let r=await pe(e,t);if(await PI(e,r),Pt(r))return;if(Date.now()>=Date.parse(r.deadlineAt)){r=await Ge(e,t,o=>RI(o));for(let o of Object.values(r.stepRuns))o.reviewId&&await Qr(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 He(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 ch(e,r,a);continue}a.state==="running"&&a.commandId&&s.get(a.commandId)?.state==="failed"&&(r=await To(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 To(e,r.id,a.id,`Agent session ${a.agentTabId} disappeared.`,ne)),a.state==="running"&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(r=await Ge(e,r.id,c=>ln(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 Qr(e,a.reviewId,c=>({...c,state:"timed_out",version:c.version+1,updatedAt:new Date().toISOString()})),r=await Ge(e,r.id,c=>ln(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 Ro(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 lI(e,r,a):(r=await ch(e,r,a),i+=1))}await bI(e,r.id)}async function ch(e,t,n){let r=new Date;t=await Ge(e,t.id,o=>ln(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=`${Dn(s.plan.prompt,t)}
211
+ `)})}function yo(e){return new Promise((t,n)=>{let r=KS(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function XS(e,t){await rI(e);let n=await P.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 nI(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 Ft(e),a}return await eu(e,o.command.id),o}async function eu(e,t){if((await ae.show(e,t)).command.state==="delivered"||await Ft(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 QS(e,t){return ae.show(e,t)}async function ZS(e,t){return ae.list(e,t)}async function eI(e,t){let n;try{n=await ae.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await Ft(e),r}return await Ft(e),n}async function tI(e,t,n){return ae.wait(e,t,n)}async function nI(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await JS(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 rI(e){let t=await T.load(e);if(!T.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Prompt dispatch is a feature preview. Enable agentOrchestration before sending prompts.",{details:{preview:"agentOrchestration"}})}var Tr={send:XS,show:QS,list:ZS,cancel:eI,wait:tI};function wo(e,t){if(t!=="codex")return e;let[n="codex",...r]=e,s=["--no-alt-screen","--no-daemon"].filter(i=>!r.includes(i));return[n,...s,...r]}var sI=6e4;async function ko(e,t){return ac(e,t,{createTask:iI})}async function lh(e,t,n,r={}){return oc(e,t,n,{...r,launchProvisioned:(s,i)=>ch(e,s,i,!1)})}async function iI(e,t,n,r={}){return P.createTask(e,t,n,{...r,markStartedAfterLaunch:!1,launchProvisioned:(s,i)=>ch(e,s,i,!0)})}async function ch(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 ah(e,{taskId:t.id,tabId:s.id,cwd:t.worktreePath,command:wo(r?s.command:t.runnerSession.command,s.runner??t.runner),...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:sI,idempotencyKey:`task-start:${t.id}`,actor:{type:"system",component:"orchestration-supervisor"}});await eu(e,i.command.id)}catch(i){throw await go(e,[s.id]),i}}async function To(e,t,n){let r=(await P.listTasks(e,{includeClosed:!0})).tasks,s=new Set([t]),i=!0;for(;i;){i=!1;for(let a of r)a.parentTaskId&&s.has(a.parentTaskId)&&!s.has(a.id)&&(s.add(a.id),i=!0)}let o=r.filter(a=>s.has(a.id)).flatMap(a=>a.ptyTabs.map(l=>l.id));try{let a=await cc(e,t,n);return await go(e,o),a}catch(a){throw a instanceof g&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await go(e,o),a}}import{randomUUID as ph}from"node:crypto";import{readFile as oI,realpath as uh}from"node:fs/promises";import tu from"node:path";var ne={type:"system",component:"orchestration-supervisor"},aI=/\$\{\{\s*steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)\s*\}\}/g;async function lI(e,t,n,r,s,i){await xn(e);let o=await RI(e,t);if(await P.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 Ye(e,i,"fury.plan",r)}let a=await Gc(t,n);PI(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_${ph()}`,planHash:xl(c),createdBy:s,createdAt:l};await pf(e,a.definitionHash,await oI(t,"utf8"));let u=await ff(e,d);try{await xe(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 cI(e,t,n){if(await xn(e),n.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can approve a Fury plan.",{});let r=await hi(e,t),s={schemaVersion:1,planId:r.id,planHash:r.planHash,approvedBy:n,approvedAt:new Date().toISOString()},i=await gf(e,s);try{await xe(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 uI(e,t,n,r){await xn(e);let s=await hi(e,t);if((await yf(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 Ye(e,r,"fury.run",s.rootTaskId)}await et(e,await P.getTask(e,s.rootTaskId));let o=new Date,l={schemaVersion:1,id:`fury_${ph()}`,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 wf(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 _n(e,c.run.id),await Ft(e),{kind:"runFury",run:await pe(e,c.run.id),created:c.created}}async function dI(e,t){return await xn(e),await _n(e,t),{kind:"showFury",run:await pe(e,t)}}async function Ro(e,t={}){let n=await T.load(e);if(T.previews.isEnabled(n,"agentOrchestration"))for(let r of await kf(e))await _n(e,r.id,t)}async function _n(e,t,n={}){let r=await pe(e,t);if(await CI(e,r),Pt(r))return;if(Date.now()>=Date.parse(r.deadlineAt)){r=await Ge(e,t,o=>vI(o));for(let o of Object.values(r.stepRuns))o.reviewId&&await Qr(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 He(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 dh(e,r,a);continue}a.state==="running"&&a.commandId&&s.get(a.commandId)?.state==="failed"&&(r=await bo(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 bo(e,r.id,a.id,`Agent session ${a.agentTabId} disappeared.`,ne)),a.state==="running"&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(r=await Ge(e,r.id,c=>ln(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 Qr(e,a.reviewId,c=>({...c,state:"timed_out",version:c.version+1,updatedAt:new Date().toISOString()})),r=await Ge(e,r.id,c=>ln(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 Po(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 pI(e,r,a):(r=await dh(e,r,a),i+=1))}await II(e,r.id)}async function dh(e,t,n){let r=new Date;t=await Ge(e,t.id,o=>ln(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=`${Dn(s.plan.prompt,t)}
212
212
 
213
- ${TI(t.id,n.id,s.plan.outputSchema)}`;try{let o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await wo(e,{parentTaskId:t.rootTaskId,...s.plan.target.repo?{repoId:Dn(s.plan.target.repo,t)}:{},...s.plan.target.workspace?{workspaceId:Dn(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 P.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=Dn(s.plan.target.task,t);let c=await P.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 et(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 Ge(e,t.id,c=>ln(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 To(e,t.id,n.id,o instanceof Error?o.message:"Step dispatch failed.",ne)}}async function lI(e,t,n){let r=n.plan.review,s=new Date,i=`review_${t.id.slice(5)}_${n.id}`,o=r.feedbackTask?Dn(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:Dn(r.title,t),summary:Dn(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 kf(e,l),t=await Ge(e,t.id,c=>ln(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 cI(e,t,n,r,s,i){let o=await pe(e,t),a=ph(o,n);await dh(e,a,s,i,"fury.step.complete"),yI(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await Ge(e,t,c=>{if(Pt(c)||c.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return ln(c,n,{state:"succeeded",output:r,completedAt:l,completedBy:s})}),await ce(e,o,n,"fury.step.succeeded",s,{taskId:a.taskId}),await _n(e,t),o=await pe(e,t),{kind:"completeFuryStep",run:o,step:o.stepRuns[n]}}async function uI(e,t,n,r,s,i){let o=await pe(e,t),a=ph(o,n);await dh(e,a,s,i,"fury.step.fail");let l=await To(e,t,n,r,s);return await Ro(e,t,"failed",s),{kind:"failFuryStep",run:await pe(e,t),step:l.stepRuns[n]}}async function dI(e,t,n,r){let s=await pe(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury cancellation requires an agent capability.",{});await Ye(e,r,"fury.cancel",s.rootTaskId)}if(Pt(s))return{kind:"cancelFury",run:s,changed:!1};let i=new Date().toISOString(),o=!1,a=await Ge(e,t,c=>Pt(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 He(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 ko(e,c.taskId).catch(()=>{}),c.reviewId&&await Qr(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 pI(e,t,n,r){let s=await pe(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury resume requires an agent capability.",{});await Ye(e,r,"fury.resume",s.rootTaskId)}if(Pt(s))throw new g("FURY_STATE_CONFLICT",`Cannot resume ${s.id} while it is ${s.state}.`,{});return await _n(e,t),await Lt(e),{kind:"resumeFury",run:await pe(e,t)}}async function fI(e,t,n){return await xn(e),{kind:"listFuryReviews",reviews:(await gi(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function mI(e,t){return await xn(e),{kind:"showFuryReview",review:await sr(e,t)}}async function hI(e,t,n,r,s,i){let o=await sr(e,t),a=await pe(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 Ye(e,i,"fury.review.resubmit",s.taskId)}if(!(n==="resubmit"?o.state==="changes_requested":o.state==="waiting_for_review"))throw new g("FURY_STATE_CONFLICT",`Review ${t} cannot ${n} while ${o.state}.`,{});if((n==="reject"||n==="request_changes")&&!r?.trim())throw new g("CLI_USAGE",`${n} requires a reason.`,{});if(n==="request_changes"&&!o.feedbackTarget)throw new g("FURY_STATE_CONFLICT",`Review ${t} has no feedback target.`,{});let c=null;if(n==="request_changes"){let h=await P.getTask(e,o.feedbackTarget.taskId),m=o.feedbackTarget.agentTabId?h.ptyTabs.find(y=>y.kind==="agent"&&y.id===o.feedbackTarget.agentTabId):h.ptyTabs.find(y=>y.kind==="agent");if(!m)throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${h.id} has no agent tab.`,{});c=(await ae.create(e,{taskId:h.id,agentTabId:m.id,prompt:{source:"inline",text:`Fury review changes requested:
213
+ ${SI(t.id,n.id,s.plan.outputSchema)}`;try{let o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await ko(e,{parentTaskId:t.rootTaskId,...s.plan.target.repo?{repoId:Dn(s.plan.target.repo,t)}:{},...s.plan.target.workspace?{workspaceId:Dn(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 P.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=Dn(s.plan.target.task,t);let c=await P.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 et(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 Ge(e,t.id,c=>ln(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 bo(e,t.id,n.id,o instanceof Error?o.message:"Step dispatch failed.",ne)}}async function pI(e,t,n){let r=n.plan.review,s=new Date,i=`review_${t.id.slice(5)}_${n.id}`,o=r.feedbackTask?Dn(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:Dn(r.title,t),summary:Dn(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 bf(e,l),t=await Ge(e,t.id,c=>ln(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 fI(e,t,n,r,s,i){let o=await pe(e,t),a=mh(o,n);await fh(e,a,s,i,"fury.step.complete"),bI(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await Ge(e,t,c=>{if(Pt(c)||c.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return ln(c,n,{state:"succeeded",output:r,completedAt:l,completedBy:s})}),await ce(e,o,n,"fury.step.succeeded",s,{taskId:a.taskId}),await _n(e,t),o=await pe(e,t),{kind:"completeFuryStep",run:o,step:o.stepRuns[n]}}async function mI(e,t,n,r,s,i){let o=await pe(e,t),a=mh(o,n);await fh(e,a,s,i,"fury.step.fail");let l=await bo(e,t,n,r,s);return await Po(e,t,"failed",s),{kind:"failFuryStep",run:await pe(e,t),step:l.stepRuns[n]}}async function hI(e,t,n,r){let s=await pe(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury cancellation requires an agent capability.",{});await Ye(e,r,"fury.cancel",s.rootTaskId)}if(Pt(s))return{kind:"cancelFury",run:s,changed:!1};let i=new Date().toISOString(),o=!1,a=await Ge(e,t,c=>Pt(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 He(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 To(e,c.taskId).catch(()=>{}),c.reviewId&&await Qr(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 gI(e,t,n,r){let s=await pe(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury resume requires an agent capability.",{});await Ye(e,r,"fury.resume",s.rootTaskId)}if(Pt(s))throw new g("FURY_STATE_CONFLICT",`Cannot resume ${s.id} while it is ${s.state}.`,{});return await _n(e,t),await Ft(e),{kind:"resumeFury",run:await pe(e,t)}}async function yI(e,t,n){return await xn(e),{kind:"listFuryReviews",reviews:(await gi(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function wI(e,t){return await xn(e),{kind:"showFuryReview",review:await sr(e,t)}}async function kI(e,t,n,r,s,i){let o=await sr(e,t),a=await pe(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 Ye(e,i,"fury.review.resubmit",s.taskId)}if(!(n==="resubmit"?o.state==="changes_requested":o.state==="waiting_for_review"))throw new g("FURY_STATE_CONFLICT",`Review ${t} cannot ${n} while ${o.state}.`,{});if((n==="reject"||n==="request_changes")&&!r?.trim())throw new g("CLI_USAGE",`${n} requires a reason.`,{});if(n==="request_changes"&&!o.feedbackTarget)throw new g("FURY_STATE_CONFLICT",`Review ${t} has no feedback target.`,{});let c=null;if(n==="request_changes"){let h=await P.getTask(e,o.feedbackTarget.taskId),m=o.feedbackTarget.agentTabId?h.ptyTabs.find(y=>y.kind==="agent"&&y.id===o.feedbackTarget.agentTabId):h.ptyTabs.find(y=>y.kind==="agent");if(!m)throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${h.id} has no agent tab.`,{});c=(await ae.create(e,{taskId:h.id,agentTabId:m.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 Qr(e,t,h=>{if(!(n==="resubmit"?h.state==="changes_requested":h.state==="waiting_for_review")||h.version!==o.version)throw new g("FURY_STATE_CONFLICT",`Review ${t} changed concurrently.`,{});return{...h,state:p,round:n==="resubmit"?h.round+1:h.round,version:h.version+1,lastDecision:u,history:[...h.history,u],updatedAt:d}}),a=await Ge(e,a.id,h=>{if(Pt(h))throw new g("FURY_STATE_CONFLICT",`Run ${h.id} is ${h.state}.`,{});return ln(h,o.stepId,n==="approve"?{state:"succeeded",completedAt:d,completedBy:s}:n==="reject"?{state:"failed",error:r,completedAt:d,completedBy:s}:n==="request_changes"?{state:"changes_requested"}:{state:"waiting_for_review"})}),await ce(e,a,o.stepId,`fury.review.${n}`,s,{reviewId:t,round:o.round,feedbackCommandId:c}),n==="reject"?await Ro(e,a.id,"failed",s):await _n(e,a.id),c&&await Lt(e),{kind:"actFuryReview",review:o,run:await pe(e,a.id)}}async function gI(e,t,n,r){await xn(e),await pe(e,t);let s=n,i=0,o=0;for(;!r.signal?.aborted;){await _n(e,t);let a=await Sn(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,Pt(await pe(e,t)))return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!1};await SI(250,r.signal)}return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!0}}function Dn(e,t){return e.replace(rI,(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=Nn(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 yI(e,t){if(!t){if(e!=null)throw new g("FURY_OUTPUT_INVALID","This step does not declare output.",{});return}let n=[];if(eu(e,t,"$",n),n.length)throw new g("FURY_OUTPUT_INVALID","Fury step output does not match its schema.",{details:{issues:n}})}function eu(e,t,n,r){let s=t.type;if(!(s==="null"?e===null:s==="array"?Array.isArray(e):s==="object"?Nn(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"&&Nn(e)){let o=Nn(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))Nn(o[a])?eu(l,o[a],`${n}.${a}`,r):t.additionalProperties===!1&&r.push(`${n}.${a} is not allowed.`)}s==="array"&&Array.isArray(e)&&Nn(t.items)&&e.forEach((o,a)=>eu(o,t.items,`${n}[${a}]`,r))}async function dh(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 Ye(e,r,s,n.taskId)}}function ph(e,t){if(Pt(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 wI(e,t){let[n,r]=await Promise.all([lh(ge(e).root),lh(t)]),s=Zc.relative(n,r);if(!s||s.startsWith("..")||Zc.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:ge(e).root}});return Zc.join(".craig","fury",s)}function kI(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 TI(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
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 Qr(e,t,h=>{if(!(n==="resubmit"?h.state==="changes_requested":h.state==="waiting_for_review")||h.version!==o.version)throw new g("FURY_STATE_CONFLICT",`Review ${t} changed concurrently.`,{});return{...h,state:p,round:n==="resubmit"?h.round+1:h.round,version:h.version+1,lastDecision:u,history:[...h.history,u],updatedAt:d}}),a=await Ge(e,a.id,h=>{if(Pt(h))throw new g("FURY_STATE_CONFLICT",`Run ${h.id} is ${h.state}.`,{});return ln(h,o.stepId,n==="approve"?{state:"succeeded",completedAt:d,completedBy:s}:n==="reject"?{state:"failed",error:r,completedAt:d,completedBy:s}:n==="request_changes"?{state:"changes_requested"}:{state:"waiting_for_review"})}),await ce(e,a,o.stepId,`fury.review.${n}`,s,{reviewId:t,round:o.round,feedbackCommandId:c}),n==="reject"?await Po(e,a.id,"failed",s):await _n(e,a.id),c&&await Ft(e),{kind:"actFuryReview",review:o,run:await pe(e,a.id)}}async function TI(e,t,n,r){await xn(e),await pe(e,t);let s=n,i=0,o=0;for(;!r.signal?.aborted;){await _n(e,t);let a=await Sn(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,Pt(await pe(e,t)))return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!1};await AI(250,r.signal)}return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!0}}function Dn(e,t){return e.replace(aI,(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=Nn(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 bI(e,t){if(!t){if(e!=null)throw new g("FURY_OUTPUT_INVALID","This step does not declare output.",{});return}let n=[];if(nu(e,t,"$",n),n.length)throw new g("FURY_OUTPUT_INVALID","Fury step output does not match its schema.",{details:{issues:n}})}function nu(e,t,n,r){let s=t.type;if(!(s==="null"?e===null:s==="array"?Array.isArray(e):s==="object"?Nn(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"&&Nn(e)){let o=Nn(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))Nn(o[a])?nu(l,o[a],`${n}.${a}`,r):t.additionalProperties===!1&&r.push(`${n}.${a} is not allowed.`)}s==="array"&&Array.isArray(e)&&Nn(t.items)&&e.forEach((o,a)=>nu(o,t.items,`${n}[${a}]`,r))}async function fh(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 Ye(e,r,s,n.taskId)}}function mh(e,t){if(Pt(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 RI(e,t){let[n,r]=await Promise.all([uh(ge(e).root),uh(t)]),s=tu.relative(n,r);if(!s||s.startsWith("..")||tu.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:ge(e).root}});return tu.join(".craig","fury",s)}function PI(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 SI(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 To(e,t,n,r,s){let i=new Date().toISOString(),o=!1,a=await Ge(e,t,l=>{if(l.stepRuns[n]?.state==="failed")return l;if(Pt(l)||l.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,ln(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 ln(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function bI(e,t){let n=await pe(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 Ro(e,t,s,ne)}async function Ro(e,t,n,r){let s=await pe(e,t);if(s.state===n)return s;let i=["succeeded","failed","cancelled","timed_out"].includes(n),o=new Date().toISOString(),a=await Ge(e,t,l=>Pt(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 RI(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=Nn(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 xe(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 PI(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 sr(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 xn(e){if(!T.previews.isEnabled(await T.load(e),"agentOrchestration"))throw new g("CLI_USAGE","Fury execution is a feature preview. Enable agentOrchestration first.",{details:{preview:"agentOrchestration"}})}function Pt(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function Nn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function SI(e,t){return new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var je={plan:sI,approve:iI,run:oI,show:aI,watch:gI,cancel:dI,resume:pI,completeStep:cI,failStep:uI,listReviews:fI,showReview:mI,actOnReview:hI,reconcile:bo};import{access as II,stat as vI}from"node:fs/promises";import CI from"node:path";import{constants as AI}from"node:fs";async function tu(e,t){let n=CI.resolve(e,t),r;try{r=await vI(n),await II(n,AI.R_OK)}catch(s){throw new g("CLI_USAGE",`File is not readable: ${n}`,{cause:s,details:{path:n}})}if(!r.isFile())throw new g("CLI_USAGE",`Path is not a regular file: ${n}`,{details:{path:n}});return n}import{createConnection as EI}from"node:net";async function mh(e,t){let n=await $I(_e(e).socketPath).catch(()=>null);if(!n)return!1;try{return(await fh(n,{type:"ping"})).protocolVersion!==Pn?!1:((await fh(n,{type:"openFile",path:t})).deliveredCount??0)>0}catch{return!1}finally{n.end()}}var OI=1;function fh(e,t){let n=OI++;return new Promise((r,s)=>{let i="",o=setTimeout(()=>{l(),e.destroy(),s(new Error("Craig UI navigation request timed out."))},1e3),a=c=>{i+=String(c);let d=i.indexOf(`
217
+ If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function bo(e,t,n,r,s){let i=new Date().toISOString(),o=!1,a=await Ge(e,t,l=>{if(l.stepRuns[n]?.state==="failed")return l;if(Pt(l)||l.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,ln(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 ln(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function II(e,t){let n=await pe(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 pe(e,t);if(s.state===n)return s;let i=["succeeded","failed","cancelled","timed_out"].includes(n),o=new Date().toISOString(),a=await Ge(e,t,l=>Pt(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 vI(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=Nn(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 xe(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 CI(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 sr(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 xn(e){if(!T.previews.isEnabled(await T.load(e),"agentOrchestration"))throw new g("CLI_USAGE","Fury execution is a feature preview. Enable agentOrchestration first.",{details:{preview:"agentOrchestration"}})}function Pt(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function Nn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function AI(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 je={plan:lI,approve:cI,run:uI,show:dI,watch:TI,cancel:hI,resume:gI,completeStep:fI,failStep:mI,listReviews:yI,showReview:wI,actOnReview:kI,reconcile:Ro};import{access as EI,stat as OI}from"node:fs/promises";import $I from"node:path";import{constants as NI}from"node:fs";async function ru(e,t){let n=$I.resolve(e,t),r;try{r=await OI(n),await EI(n,NI.R_OK)}catch(s){throw new g("CLI_USAGE",`File is not readable: ${n}`,{cause:s,details:{path:n}})}if(!r.isFile())throw new g("CLI_USAGE",`Path is not a regular file: ${n}`,{details:{path:n}});return n}import{createConnection as DI}from"node:net";async function gh(e,t){let n=await xI(_e(e).socketPath).catch(()=>null);if(!n)return!1;try{return(await hh(n,{type:"ping"})).protocolVersion!==Pn?!1:((await hh(n,{type:"openFile",path:t})).deliveredCount??0)>0}catch{return!1}finally{n.end()}}var _I=1;function hh(e,t){let n=_I++;return new Promise((r,s)=>{let i="",o=setTimeout(()=>{l(),e.destroy(),s(new Error("Craig UI navigation request timed out."))},1e3),a=c=>{i+=String(c);let d=i.indexOf(`
218
218
  `);if(d===-1)return;l();let u=JSON.parse(i.slice(0,d));u.ok?r(u):s(new Error(u.error??"Craig UI navigation request failed."))},l=()=>{clearTimeout(o),e.off("data",a)};e.on("data",a),e.write(`${JSON.stringify({...t,id:n})}
219
- `)})}function $I(e){return new Promise((t,n)=>{let r=EI(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function gh(e,t){switch(e.kind){case"addWorkspace":{let n=await Te.addWorkspace(t.paths,e.path),r=n.workspace.kind==="project"?n.workspace.discoveredRepoIds?.[0]??null:n.repos[0]?.id??null;return await nu(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await Te.repos.addRepo(t.paths,e.path);return await nu(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return Te.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await qn({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await Ie(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await Te.repos.removeRepo(t.paths,e.repoId,{listTasks:P.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await Vt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await Vt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return Te.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await Te.archiveWorkspace(t.paths,e.workspaceId);return await _I(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await Te.restoreWorkspace(t.paths,e.workspaceId);return await nu(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return Te.removeWorkspace(t.paths,e.workspaceId,{listTasks:P.listTasks});case"createTask":return oh(t.paths,e.repoId??e.workspaceId??"",e.prompt,{...e.runner?{runner:e.runner}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}});case"createChildTask":{let n=await T.load(t.paths);if(!T.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 Fn(t),wo(t.paths,{parentTaskId:e.parentTaskId??Mt(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 Fn(t),oc(t.paths,e.taskId??Mt(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return Fn(t),ko(t.paths,e.taskId??Mt(t).task.id,t.agentCapabilityId);case"validateFury":return await hh(t),Bc(ru.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await hh(t),je.plan(t.paths,ru.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??Mt(t).task.id,cn(t),t.agentCapabilityId);case"approveFury":return je.approve(t.paths,e.planId,cn(t));case"runFury":return Fn(t),je.run(t.paths,e.planId,cn(t),t.agentCapabilityId);case"showFury":return je.show(t.paths,e.runId);case"watchFury":return je.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return je.cancel(t.paths,e.runId,cn(t),t.agentCapabilityId);case"resumeFury":return je.resume(t.paths,e.runId,cn(t),t.agentCapabilityId);case"completeFuryStep":return Fn(t),je.completeStep(t.paths,e.runId,e.stepId,await DI(e.output,t),cn(t),t.agentCapabilityId);case"failFuryStep":return Fn(t),je.failStep(t.paths,e.runId,e.stepId,e.reason,cn(t),t.agentCapabilityId);case"listFuryReviews":return je.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return je.showReview(t.paths,e.reviewId);case"actFuryReview":return Fn(t),je.actOnReview(t.paths,e.reviewId,e.action,e.message??null,cn(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=Mt(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"renameTask":return P.renameTask(t.paths,e.taskId??Mt(t).task.id,e.title);case"addTaskLink":return P.addTaskLink(t.paths,e.taskId,e.repoId);case"addTaskRepoTarget":return P.addTaskRepoTarget(t.paths,e.taskId,e.repoId);case"listTaskLinks":return P.listTaskLinks(t.paths,e.taskId);case"openFile":{let n=await T.load(t.paths);if(!T.previews.isEnabled(n,"fileOpen"))throw new g("CLI_USAGE","Opening files in the Craig TUI is a feature preview. Enable fileOpen before using this command.",{details:{preview:"fileOpen"}});let r=await tu(t.cwd??process.cwd(),e.path),s=await mh(t.paths,r);if(!s)throw new g("EXTERNAL_DEPENDENCY_FAILED","No compatible Craig TUI is connected to this workspace. Restart Craig and try again.",{retryable:!0,details:{path:r}});return{kind:"openFile",path:r,delivered:s}}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,Mt(t).task.id);case"showTaskPr":return P.prs.show(t.paths,Ln(e.taskId,t),e.repoId);case"discoverTaskPr":return P.prs.discover(t.paths,Ln(e.taskId,t),e.repoId);case"linkTaskPr":return P.prs.link(t.paths,Ln(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return P.prs.refreshAssociation(t.paths,Ln(e.taskId,t),e.repoId);case"unlinkTaskPr":return P.prs.unlink(t.paths,Ln(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return $t.listAgents(t.paths,e.taskId);case"showAgentStatus":return $t.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=Ln(e.taskId,t),s=await T.load(t.paths);return T.previews.isEnabled(s,"agentOrchestration")?po.waitForTaskState(t.paths,r,n):$t.waitForTask(t.paths,r,n)}case"listEvents":return po.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return po.watch(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}},{onEvent:t.emitEvent??(()=>{}),...t.signal?{signal:t.signal}:{}});case"sendAgentPrompt":return Tr.send(t.paths,{taskId:Ln(e.taskId,t),...e.tabId?{tabId:e.tabId}:t.taskContext?.agentTabId?{tabId:t.taskContext.agentTabId}:{},prompt:e.prompt,delivery:e.delivery,timeoutMs:e.timeoutMs,...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.readStdin?{readStdin:t.readStdin}:{}});case"showPromptCommand":return Tr.show(t.paths,e.commandId);case"listPromptCommands":return Tr.list(t.paths,e.taskId);case"cancelPromptCommand":return Tr.cancel(t.paths,e.commandId);case"waitPromptCommand":return Tr.wait(t.paths,e.commandId,{...e.states?{states:e.states}:{},timeoutMs:e.timeoutMs,...t.signal?{signal:t.signal}:{}});case"showSelectedTask":return P.showTask(t.paths,br(t,"show"));case"streamTaskLogs":return P.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return P.prepareTaskLogs(t.paths,br(t,"logs"));case"showTaskDiff":return P.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return P.showTaskDiff(t.paths,br(t,"diff"));case"openTask":return P.openTask(t.paths,e.taskId);case"openSelectedTask":return P.openTask(t.paths,br(t,"open"));case"runChecks":return P.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return P.runChecks(t.paths,br(t,"check"));case"commitTask":return P.commitTask(t.paths,e.taskId);case"commitSelectedTask":return P.commitTask(t.paths,br(t,"commit"));case"showContext":{let n=FI(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:ha()};case"exit":return{kind:"exit"};default:return xI(e)}}function Fn(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 hh(e){let t=await T.load(e.paths);if(!T.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 cn(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=Mt(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 DI(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await NI(ru.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 nu(e,t,n){let r=await qn({uiStateFile:e.uiStateFile})??Ms();await Vt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function _I(e,t){let n=await qn({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await Vt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function xI(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function br(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 Mt(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Ln(e,t){return e??Mt(t).task.id}function FI(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function wh(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(`
219
+ `)})}function xI(e){return new Promise((t,n)=>{let r=DI(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function wh(e,t){switch(e.kind){case"addWorkspace":{let n=await Te.addWorkspace(t.paths,e.path),r=n.workspace.kind==="project"?n.workspace.discoveredRepoIds?.[0]??null:n.repos[0]?.id??null;return await su(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await Te.repos.addRepo(t.paths,e.path);return await su(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return Te.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await qn({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await Ie(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await Te.repos.removeRepo(t.paths,e.repoId,{listTasks:P.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await Vt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await Vt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return Te.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await Te.archiveWorkspace(t.paths,e.workspaceId);return await MI(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await Te.restoreWorkspace(t.paths,e.workspaceId);return await su(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return Te.removeWorkspace(t.paths,e.workspaceId,{listTasks:P.listTasks});case"createTask":return lh(t.paths,e.repoId??e.workspaceId??"",e.prompt,{...e.runner?{runner:e.runner}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}});case"createChildTask":{let n=await T.load(t.paths);if(!T.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 Ln(t),ko(t.paths,{parentTaskId:e.parentTaskId??Mt(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 Ln(t),lc(t.paths,e.taskId??Mt(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return Ln(t),To(t.paths,e.taskId??Mt(t).task.id,t.agentCapabilityId);case"validateFury":return await yh(t),Kc(iu.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await yh(t),je.plan(t.paths,iu.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??Mt(t).task.id,cn(t),t.agentCapabilityId);case"approveFury":return je.approve(t.paths,e.planId,cn(t));case"runFury":return Ln(t),je.run(t.paths,e.planId,cn(t),t.agentCapabilityId);case"showFury":return je.show(t.paths,e.runId);case"watchFury":return je.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return je.cancel(t.paths,e.runId,cn(t),t.agentCapabilityId);case"resumeFury":return je.resume(t.paths,e.runId,cn(t),t.agentCapabilityId);case"completeFuryStep":return Ln(t),je.completeStep(t.paths,e.runId,e.stepId,await FI(e.output,t),cn(t),t.agentCapabilityId);case"failFuryStep":return Ln(t),je.failStep(t.paths,e.runId,e.stepId,e.reason,cn(t),t.agentCapabilityId);case"listFuryReviews":return je.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return je.showReview(t.paths,e.reviewId);case"actFuryReview":return Ln(t),je.actOnReview(t.paths,e.reviewId,e.action,e.message??null,cn(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=Mt(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"renameTask":return P.renameTask(t.paths,e.taskId??Mt(t).task.id,e.title);case"addTaskLink":return P.addTaskLink(t.paths,e.taskId,e.repoId);case"addTaskRepoTarget":return P.addTaskRepoTarget(t.paths,e.taskId,e.repoId);case"listTaskLinks":return P.listTaskLinks(t.paths,e.taskId);case"openFile":{let n=await T.load(t.paths);if(!T.previews.isEnabled(n,"fileOpen"))throw new g("CLI_USAGE","Opening files in the Craig TUI is a feature preview. Enable fileOpen before using this command.",{details:{preview:"fileOpen"}});let r=await ru(t.cwd??process.cwd(),e.path),s=await gh(t.paths,r);if(!s)throw new g("EXTERNAL_DEPENDENCY_FAILED","No compatible Craig TUI is connected to this workspace. Restart Craig and try again.",{retryable:!0,details:{path:r}});return{kind:"openFile",path:r,delivered:s}}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,Mt(t).task.id);case"showTaskPr":return P.prs.show(t.paths,Fn(e.taskId,t),e.repoId);case"discoverTaskPr":return P.prs.discover(t.paths,Fn(e.taskId,t),e.repoId);case"linkTaskPr":return P.prs.link(t.paths,Fn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return P.prs.refreshAssociation(t.paths,Fn(e.taskId,t),e.repoId);case"unlinkTaskPr":return P.prs.unlink(t.paths,Fn(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return $t.listAgents(t.paths,e.taskId);case"showAgentStatus":return $t.showAgentStatus(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.tabId?{tabId:e.tabId}:{}});case"waitTask":{let n={states:e.states,timeoutMs:e.timeoutMs,...e.tabId?{tabId:e.tabId}:{},...t.signal?{signal:t.signal}:{}},r=Fn(e.taskId,t),s=await T.load(t.paths);return T.previews.isEnabled(s,"agentOrchestration")?po.waitForTaskState(t.paths,r,n):$t.waitForTask(t.paths,r,n)}case"listEvents":return po.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return po.watch(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}},{onEvent:t.emitEvent??(()=>{}),...t.signal?{signal:t.signal}:{}});case"sendAgentPrompt":return Tr.send(t.paths,{taskId:Fn(e.taskId,t),...e.tabId?{tabId:e.tabId}:t.taskContext?.agentTabId?{tabId:t.taskContext.agentTabId}:{},prompt:e.prompt,delivery:e.delivery,timeoutMs:e.timeoutMs,...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.readStdin?{readStdin:t.readStdin}:{}});case"showPromptCommand":return Tr.show(t.paths,e.commandId);case"listPromptCommands":return Tr.list(t.paths,e.taskId);case"cancelPromptCommand":return Tr.cancel(t.paths,e.commandId);case"waitPromptCommand":return Tr.wait(t.paths,e.commandId,{...e.states?{states:e.states}:{},timeoutMs:e.timeoutMs,...t.signal?{signal:t.signal}:{}});case"showSelectedTask":return P.showTask(t.paths,br(t,"show"));case"streamTaskLogs":return P.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return P.prepareTaskLogs(t.paths,br(t,"logs"));case"showTaskDiff":return P.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return P.showTaskDiff(t.paths,br(t,"diff"));case"openTask":return P.openTask(t.paths,e.taskId);case"openSelectedTask":return P.openTask(t.paths,br(t,"open"));case"runChecks":return P.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return P.runChecks(t.paths,br(t,"check"));case"commitTask":return P.commitTask(t.paths,e.taskId);case"commitSelectedTask":return P.commitTask(t.paths,br(t,"commit"));case"showContext":{let n=qI(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:ya()};case"exit":return{kind:"exit"};default:return jI(e)}}function Ln(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 yh(e){let t=await T.load(e.paths);if(!T.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 cn(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=Mt(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 FI(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await LI(iu.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 su(e,t,n){let r=await qn({uiStateFile:e.uiStateFile})??Ms();await Vt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function MI(e,t){let n=await qn({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await Vt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function jI(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function br(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 Mt(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Fn(e,t){return e??Mt(t).task.id}function qI(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Th(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(`
220
220
  `);case"createRepo":return[`${e.created?"Registered":"Already registered"} repo ${e.repo.id}`,`Path: ${e.repo.rootPath}`,`Branch: ${e.repo.defaultBranch}`,`Workspace: ${e.workspaceId}`].join(`
221
221
  `);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(`
222
222
  `);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(`
@@ -226,60 +226,61 @@ If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>
226
226
  `);case"cancelTaskTree":return[`Cancelled task tree ${e.taskId}`,...e.cancelled.map(t=>`${t.taskId}: ${t.disposition}`)].join(`
227
227
  `);case"validateFury":return[`Valid fury ${e.name}`,`Definition: ${e.definitionHash}`,`Steps: ${e.stepCount}`,`Order: ${e.order.join(" -> ")}`].join(`
228
228
  `);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(`
229
- `);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 LI(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(`
230
- `);case"showFuryReview":return yh(e.review);case"actFuryReview":return`${yh(e.review)}
229
+ `);case"approveFury":return`${e.created?"Approved":"Already approved"} fury plan ${e.plan.id}: ${e.plan.planHash}`;case"runFury":return`${e.created?"Started":"Found"} fury ${e.run.id}: ${e.run.state}`;case"showFury":case"cancelFury":case"resumeFury":return UI(e.run);case"completeFuryStep":case"failFuryStep":return`${e.run.id} step ${e.step.id}: ${e.step.state}`;case"listFuryReviews":return e.reviews.length===0?"No fury reviews found.":["ID RUN STEP STATE ROUND TITLE",...e.reviews.map(t=>`${t.id} ${t.runId} ${t.stepId} ${t.state} ${t.round} ${t.title}`)].join(`
230
+ `);case"showFuryReview":return kh(e.review);case"actFuryReview":return`${kh(e.review)}
231
231
  Run: ${e.run.state}`;case"watchFury":return"";case"addTaskLink":return[`Added contextual repo link ${e.repoId} to task ${e.taskId}: ${e.linkedRepoIds.join(", ")}`,`This does not provision a project task target. Use 'craig task repo add ${e.taskId} ${e.repoId}' for that.`].join(`
232
232
  `);case"addTaskRepoTarget":return[`${e.disposition==="added"?"Added":"Found"} repo target ${e.repoId} for task ${e.taskId}`,`Branch: ${e.branch}`,`Worktree: ${e.worktreePath}`].join(`
233
233
  `);case"listTaskLinks":return e.repos.length===0?`Task ${e.taskId} has no linked repos.`:["ID NAME BRANCH PATH",...e.repos.map(t=>`${t.id} ${t.name} ${t.defaultBranch} ${t.rootPath}`)].join(`
234
- `);case"help":return e.text;case"exit":return"";case"listTasks":return e.tasks.length===0?`No Craig tasks yet. Use 'task new --repo <repo-id> <prompt>' to create one.${e.missingTaskIds.length>0?` (${e.missingTaskIds.length} referenced task file(s) missing from .craig/tasks)`:""}`:["ID REPO STATUS CHECKS PR TITLE",...e.tasks.map(t=>`${t.id} ${t.repoId} ${t.status} ${BI(t)} ${VI(t)} ${t.title}`)].join(`
235
- `);case"showTask":return[`${e.task.id}: ${e.task.title}`,`Status: ${e.task.status}`,`Runner: ${e.task.runner}`,`Repo: ${e.task.repoId}`,`Workspace: ${e.task.workspaceId}`,`Branch: ${e.task.branch}`,`Worktree: ${e.task.worktreePath}`,`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}`,...UI(e)].join(`
234
+ `);case"help":return e.text;case"exit":return"";case"listTasks":return e.tasks.length===0?`No Craig tasks yet. Use 'task new --repo <repo-id> <prompt>' to create one.${e.missingTaskIds.length>0?` (${e.missingTaskIds.length} referenced task file(s) missing from .craig/tasks)`:""}`:["ID REPO STATUS CHECKS PR TITLE",...e.tasks.map(t=>`${t.id} ${t.repoId} ${t.status} ${HI(t)} ${YI(t)} ${t.title}`)].join(`
235
+ `);case"showTask":return[`${e.task.id}: ${e.task.title}`,`Status: ${e.task.status}`,`Runner: ${e.task.runner}`,`Repo: ${e.task.repoId}`,`Workspace: ${e.task.workspaceId}`,`Branch: ${e.task.branch}`,`Worktree: ${e.task.worktreePath}`,`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}`,...KI(e)].join(`
236
236
  `);case"currentTask":return[`${e.task.id}: ${e.task.title}`,`Workspace: ${e.task.workspaceId}`,`Repo: ${e.task.repoId}`,`Worktree: ${e.task.worktreePath}`,`Context source: ${e.context.source}`,`Agent tab: ${e.context.agentTabId??"none"}`].join(`
237
- `);case"renameTask":return`Renamed task ${e.taskId} from ${JSON.stringify(e.previousTitle)} to ${JSON.stringify(e.title)}.`;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return qI(e);case"listAgents":case"showAgentStatus":return jI(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(su).join(`
238
- `);case"watchEvents":return"";case"sendAgentPrompt":return`${e.created?"Queued":"Found"} command ${e.command.id} for task ${e.command.taskId} tab ${e.command.agentTabId}.`;case"showPromptCommand":return MI(e.command);case"listPromptCommands":return e.commands.length===0?"No prompt commands found.":["ID TASK TAB STATE DELIVERY ATTEMPTS",...e.commands.map(t=>`${t.id} ${t.taskId} ${t.agentTabId} ${t.state} ${t.delivery} ${t.attempts}`)].join(`
237
+ `);case"renameTask":return`Renamed task ${e.taskId} from ${JSON.stringify(e.previousTitle)} to ${JSON.stringify(e.title)}.`;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return VI(e);case"listAgents":case"showAgentStatus":return BI(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(ou).join(`
238
+ `);case"watchEvents":return"";case"sendAgentPrompt":return`${e.created?"Queued":"Found"} command ${e.command.id} for task ${e.command.taskId} tab ${e.command.agentTabId}.`;case"showPromptCommand":return WI(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(`
239
239
  `);case"cancelPromptCommand":return`${e.changed?"Cancelled":"Command already cancelled:"} ${e.command.id}`;case"waitPromptCommand":return`Command ${e.command.id} reached ${e.command.state}.`;case"showContext":return[`Workspace: ${e.workspace.root}`,`Workspace source: ${e.workspace.source}`,`Initialized: ${e.workspace.initialized?"yes":"no"}`,`Task: ${e.task?.id??"none"}`,`Task source: ${e.task?.source??"none"}`,`Agent tab: ${e.task?.agentTabId??"none"}`].join(`
240
240
  `);case"streamTaskLogs":return`Streaming logs for ${e.taskId} from ${e.logPath}`;case"showTaskDiff":return e.isEmpty?`Task ${e.taskId} has no uncommitted diff.`:e.diffText;case"openTask":return e.launched?`Opened task ${e.taskId} at ${e.worktreePath}`:e.worktreePath;case"openFile":return`Opened ${e.path} in Craig.`;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(`
241
- `);default:return WI(e)}}function LI(e){return[`${e.id}: ${e.state}`,`Definition: ${e.name} (${e.definitionHash})`,`Root task: ${e.rootTaskId}`,...e.order.map(t=>{let n=e.stepRuns[t];return`${t}: ${n.state}${n.taskId?` (${n.taskId})`:""}${n.error?` - ${n.error}`:""}`})].join(`
242
- `)}function yh(e){return[`${e.id}: ${e.state}`,`Run: ${e.runId}`,`Step: ${e.stepId}`,`Round: ${e.round}`,`Title: ${e.title}`,`Summary: ${e.summary}`,`Deadline: ${e.deadlineAt}`].join(`
243
- `)}function MI(e){return[`${e.id}: ${e.state}`,`Task: ${e.taskId}`,`Agent tab: ${e.agentTabId}`,`Delivery: ${e.delivery}`,`Attempts: ${e.attempts}`,`Prompt source: ${e.prompt.source}`,`Prompt bytes: ${Buffer.byteLength(e.prompt.text)}`,`Created: ${e.createdAt}`,`Updated: ${e.updatedAt}`,`Error: ${e.lastError?.message??"none"}`].join(`
244
- `)}function su(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function jI(e){return e.agents.length===0?"No agent tabs found.":["TASK TAB RUNNER STATE SESSION ERROR",...e.agents.map(t=>`${t.taskId} ${t.tabId} ${t.runner} ${t.state} ${t.sessionState??"none"} ${t.error??""}`),...e.daemonAvailable?[]:["Warning: PTY daemon unavailable; live agent tabs report idle unless a durable startup failure exists."]].join(`
245
- `)}function qI(e){let t=`${e.taskId} (${e.repoId}): ${e.disposition}`,n=e.pullRequests.length===0?["No pull requests associated."]:["PR STATUS HEAD URL",...e.pullRequests.map(r=>`#${r.number??"-"} ${r.status??"unknown"} ${r.headBranch??"-"} ${r.url??"-"}`)];return[t,...n,...e.warnings.map(r=>`Warning: ${r}`)].join(`
246
- `)}function UI(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 WI(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function BI(e){return e.checks.status}function VI(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 kh(e,t){let{data:n,warnings:r}=KI(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:n,warnings:r})}function KI(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...n}=e;return{data:n,warnings:t}}return{data:e,warnings:[]}}function Th(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 iu(e){let t=await Te.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=Ae(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 P.resolveContext(n,{cwd:e.cwd,...e.explicitTaskId!==void 0?{explicitTaskId:e.explicitTaskId}:{},...e.environmentTaskId!==void 0?{environmentTaskId:e.environmentTaskId}:{},...e.environmentAgentTabId!==void 0?{environmentAgentTabId:e.environmentAgentTabId}:{},...e.requireTask!==void 0?{required:e.requireTask}:{}}):null;return{paths:n,workspace:t,task:s}}async function bh(e){let t="cli",n=qd(e.argv);try{let r=jd(e.argv);if(n=r.options.json,r.mode==="interactive"){if(r.options.noInput||r.options.json||ZI(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 iu({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.",{});YI(r.command,r.options.taskId);let s=JI(r.command,r.options.taskId),i=HI(s);zI(s,r.options.taskId,i);let o=i!=="none",a=await iu({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:GI(s),resolveTask:i!=="none",requireTask:i==="required"}),l=XI(s,e.signal),c;try{c=await gh(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):su(u)}
247
- `)}:{},...e.readStdin?{readStdin:e.readStdin}:{},...e.env.CRAIG_AGENT_TAB_ID?{agentContext:!0}:{},...e.env.CRAIG_AGENT_CAPABILITY?{agentCapabilityId:e.env.CRAIG_AGENT_CAPABILITY}:{}})}finally{l.dispose()}let d=n?kh(t,c):wh(c);return d.length>0&&e.writeStdout(`${d}
248
- `),0}catch(r){let s=pa(r),i=n?Th(t,s):s.message;return e.writeStderr(`${i}
249
- `),s.exitCode}}function GI(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function HI(e){return e.kind==="showContext"?"optional":e.kind==="currentTask"||e.kind==="showCurrentTask"?"required":e.kind==="renameTask"?e.taskId?"none":"required":e.kind==="createChildTask"?e.parentTaskId?"none":"required":e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||QI(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 YI(e,t){let n=Rh(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 zI(e,t,n){if(!(t===void 0||n!=="none"||Rh(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 Rh(e){switch(e.kind){case"showTask":case"renameTask":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":case"addTaskRepoTarget":return e.taskId;default:return}}function JI(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==="renameTask")?e.kind==="createChildTask"?{...e,parentTaskId:e.parentTaskId??t}:{...e,taskId:e.taskId??t}:e}function XI(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 QI(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function ZI(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as UE}from"node:module";import{readFile as ev,stat as tv}from"node:fs/promises";import ou from"node:path";var nv=200*1024,rv=500*1024,Po="100000";async function Sh(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return sv(e,t,n);try{let r=un(n.selectedFilePath??null,t.filePaths),s=un(n.selectedDiffPath??null,t.diffPaths),i=s?await Ps(e.worktreePath):null,[o,a]=await Promise.all([Io(e.worktreePath,r),s?au(e.worktreePath,s,t.diffRows,i):Promise.resolve(Ce("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 sv(e,t,n){let r=un(n.selectedFilePath??null,t.filePaths),s=un(n.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([vh(e,r),(async()=>{if(!s)return Ce("No diff selected","No local changes found.","empty");let l=So(e,s),c=l?await Ps(l.target.worktreePath).catch(()=>null):null;return Ch(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function Ih(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return iv(e,t);try{await he(e);let n=await Ps(e.worktreePath),[r,s]=await Promise.all([Ah(e.worktreePath),Eh(e.worktreePath,n)]),i=[...new Set(s.map(u=>u.path))],o=un(t.selectedFilePath??null,r),a=un(t.selectedDiffPath??null,i),[l,c]=await Promise.all([Io(e.worktreePath,o),a?au(e.worktreePath,a,s,n):Promise.resolve(Ce("No diff selected","No local changes found.","empty"))]),d=a?{[a]:c}:{};return{taskId:e.id,fileRows:_h(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:Ce("Files unavailable",r,"error"),selectedDiff:Ce("Diff unavailable",r,"error"),error:r}}}async function iv(e,t){let n=(e.repoTargets??[]).filter(p=>p.status==="ready"),r=await Promise.all(n.map(async p=>{let h=await Ps(p.worktreePath).catch(()=>null),[m,f]=await Promise.all([Ah(p.worktreePath).catch(()=>[]),Eh(p.worktreePath,h).catch(()=>[])]);return{target:p,baseRef:h,targetFiles:m,targetDiffRows:f}})),s=[],i=[];for(let{target:p,targetFiles:h,targetDiffRows:m}of r)s.push(...h.map(f=>`${p.repoId}/${f}`)),i.push(...m.map(f=>({...f,path:`${p.repoId}/${f.path}`})));let o=[...new Set(i.map(p=>p.path))].sort(),a=un(t.selectedFilePath??null,s),l=un(t.selectedDiffPath??null,o),[c,d]=await Promise.all([vh(e,a),(async()=>{if(!l)return Ce("No diff selected","No local changes found.","empty");let p=So(e,l),h=p?r.find(m=>m.target.repoId===p.target.repoId):null;return Ch(e,l,i,h?.baseRef??null)})()]),u=l?{[l]:d}:{};return{taskId:e.id,fileRows:_h(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:u,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:d,error:null}}async function vh(e,t){let n=So(e,t);if(!n)return Ce("No file selected","No Git-visible files found.","empty");let r=await Io(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function Ch(e,t,n,r=null){let s=So(e,t);return s?{...await au(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}:Ce(t,"Repo target is unavailable.","error",t)}function So(e,t){if(!t)return null;let[n,...r]=t.split("/"),s=r.join("/"),i=(e.repoTargets??[]).find(o=>o.repoId===n&&o.status==="ready")??null;return!i||s.length===0?null:{target:i,relativePath:s}}async function Ah(e){let t=await G("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return xh(t.stdout)}async function Eh(e,t){let[n,r,s,i]=await Promise.all([ov(e,t),Ph(e,"staged"),Ph(e,"unstaged"),av(e)]);return[...n,...r,...s,...i]}async function ov(e,t){if(!t)return[];let[n,r]=await Promise.all([G("git",["diff","--name-status",`${t}...HEAD`],{cwd:e}),G("git",["diff","--numstat",`${t}...HEAD`],{cwd:e})]),s=Oh(n.stdout),i=$h(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 Ph(e,t){let n=t==="staged"?["diff","--cached"]:["diff"],[r,s]=await Promise.all([G("git",[...n,"--name-status"],{cwd:e}),G("git",[...n,"--numstat"],{cwd:e})]),i=Oh(r.stdout),o=$h(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 av(e){let t=await G("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=xh(t.stdout);return await Promise.all(n.map(async s=>{let i=await Io(e,s),o=i.status==="ready"?lv(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function Oh(e){return e.split(`
250
- `).map(t=>t.trim()).filter(t=>t.length>0).map(t=>{let[n="M",...r]=t.split(" ");return{status:n,path:r.at(-1)??""}}).filter(t=>t.path.length>0)}function $h(e){let t=new Map;for(let n of e.split(`
251
- `)){let r=n.trim();if(!r)continue;let[s="-",i="-",...o]=r.split(" "),a=o.join(" ");a&&t.set(a,{additions:s==="-"?null:Number(s),deletions:i==="-"?null:Number(i)})}return t}async function Ps(e){return(await z("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await z("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function Io(e,t){if(!t)return Ce("No file selected","No Git-visible files found.","empty");let n=cv(e,t);return Dh(n,t)}async function Nh(e){return Dh(e,e)}async function Dh(e,t){try{let n=await tv(e);if(n.size>nv)return Ce(t,`File is ${n.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,n.size);let r=await ev(e);return uv(r)?Ce(t,"Binary file preview is not available in Craig.","binary",t,r.byteLength):{path:t,status:"ready",title:t,lines:r.toString("utf8").split(`
252
- `),byteLength:r.byteLength}}catch(n){let r=n instanceof Error?n.message:"Unable to read file.";return Ce(t,r,"missing",t,null)}}async function au(e,t,n,r=null){if(!t)return Ce("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 Ps(e);if(a){let l=await G("git",["diff","--stat","--patch",`--unified=${Po}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
253
- ${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await G("git",["diff","--cached","--stat","--patch",`--unified=${Po}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
254
- ${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await G("git",["diff","--stat","--patch",`--unified=${Po}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
255
- ${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await z("git",["diff","--no-index","--stat","--patch",`--unified=${Po}`,"--","/dev/null",t],{cwd:e});a.stdout.trim().length>0&&s.push(`untracked
241
+ `);default:return GI(e)}}function UI(e){return[`${e.id}: ${e.state}`,`Definition: ${e.name} (${e.definitionHash})`,`Root task: ${e.rootTaskId}`,...e.order.map(t=>{let n=e.stepRuns[t];return`${t}: ${n.state}${n.taskId?` (${n.taskId})`:""}${n.error?` - ${n.error}`:""}`})].join(`
242
+ `)}function kh(e){return[`${e.id}: ${e.state}`,`Run: ${e.runId}`,`Step: ${e.stepId}`,`Round: ${e.round}`,`Title: ${e.title}`,`Summary: ${e.summary}`,`Deadline: ${e.deadlineAt}`].join(`
243
+ `)}function WI(e){return[`${e.id}: ${e.state}`,`Task: ${e.taskId}`,`Agent tab: ${e.agentTabId}`,`Delivery: ${e.delivery}`,`Attempts: ${e.attempts}`,`Prompt source: ${e.prompt.source}`,`Prompt bytes: ${Buffer.byteLength(e.prompt.text)}`,`Created: ${e.createdAt}`,`Updated: ${e.updatedAt}`,`Error: ${e.lastError?.message??"none"}`].join(`
244
+ `)}function ou(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function BI(e){return e.agents.length===0?"No agent tabs found.":["TASK TAB RUNNER STATE SESSION ERROR",...e.agents.map(t=>`${t.taskId} ${t.tabId} ${t.runner} ${t.state} ${t.sessionState??"none"} ${t.error??""}`),...e.daemonAvailable?[]:["Warning: PTY daemon unavailable; live agent tabs report idle unless a durable startup failure exists."]].join(`
245
+ `)}function VI(e){let t=`${e.taskId} (${e.repoId}): ${e.disposition}`,n=e.pullRequests.length===0?["No pull requests associated."]:["PR STATUS HEAD URL",...e.pullRequests.map(r=>`#${r.number??"-"} ${r.status??"unknown"} ${r.headBranch??"-"} ${r.url??"-"}`)];return[t,...n,...e.warnings.map(r=>`Warning: ${r}`)].join(`
246
+ `)}function KI(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 GI(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function HI(e){return e.checks.status}function YI(e){if(e.type==="project"&&e.repoTargets?.length){let n=e.repoTargets.filter(s=>s.pullRequest.number);if(n.length===0)return"-";let r=n.reduce((s,i)=>{let o=i.pullRequest.status??"unknown";return s[o]=(s[o]??0)+1,s},{});return Object.entries(r).map(([s,i])=>`${i} ${s}`).join(", ")}let t=e.prs[0];return t?.number?`#${t.number}:${t.status??"unknown"}`:"-"}function bh(e,t){let{data:n,warnings:r}=zI(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:n,warnings:r})}function zI(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...n}=e;return{data:n,warnings:t}}return{data:e,warnings:[]}}function Rh(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 au(e){let t=await Te.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=Ae(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 P.resolveContext(n,{cwd:e.cwd,...e.explicitTaskId!==void 0?{explicitTaskId:e.explicitTaskId}:{},...e.environmentTaskId!==void 0?{environmentTaskId:e.environmentTaskId}:{},...e.environmentAgentTabId!==void 0?{environmentAgentTabId:e.environmentAgentTabId}:{},...e.requireTask!==void 0?{required:e.requireTask}:{}}):null;return{paths:n,workspace:t,task:s}}async function Ph(e){let t="cli",n=Wd(e.argv);try{let r=Ud(e.argv);if(n=r.options.json,r.mode==="interactive"){if(r.options.noInput||r.options.json||rv(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 au({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.",{});QI(r.command,r.options.taskId);let s=ev(r.command,r.options.taskId),i=XI(s);ZI(s,r.options.taskId,i);let o=i!=="none",a=await au({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:JI(s),resolveTask:i!=="none",requireTask:i==="required"}),l=tv(s,e.signal),c;try{c=await wh(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):ou(u)}
247
+ `)}:{},...e.readStdin?{readStdin:e.readStdin}:{},...e.env.CRAIG_AGENT_TAB_ID?{agentContext:!0}:{},...e.env.CRAIG_AGENT_CAPABILITY?{agentCapabilityId:e.env.CRAIG_AGENT_CAPABILITY}:{}})}finally{l.dispose()}let d=n?bh(t,c):Th(c);return d.length>0&&e.writeStdout(`${d}
248
+ `),0}catch(r){let s=ma(r),i=n?Rh(t,s):s.message;return e.writeStderr(`${i}
249
+ `),s.exitCode}}function JI(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function XI(e){return e.kind==="showContext"?"optional":e.kind==="currentTask"||e.kind==="showCurrentTask"?"required":e.kind==="renameTask"?e.taskId?"none":"required":e.kind==="createChildTask"?e.parentTaskId?"none":"required":e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||nv(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 QI(e,t){let n=Sh(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 ZI(e,t,n){if(!(t===void 0||n!=="none"||Sh(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 Sh(e){switch(e.kind){case"showTask":case"renameTask":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":case"addTaskRepoTarget":return e.taskId;default:return}}function ev(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==="renameTask")?e.kind==="createChildTask"?{...e,parentTaskId:e.parentTaskId??t}:{...e,taskId:e.taskId??t}:e}function tv(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 nv(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function rv(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as GE}from"node:module";import{readFile as sv,stat as iv}from"node:fs/promises";import lu from"node:path";var ov=200*1024,av=500*1024,So="100000";async function vh(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return lv(e,t,n);try{let r=un(n.selectedFilePath??null,t.filePaths),s=un(n.selectedDiffPath??null,t.diffPaths),i=s?await Ps(e.worktreePath):null,[o,a]=await Promise.all([vo(e.worktreePath,r),s?cu(e.worktreePath,s,t.diffRows,i):Promise.resolve(Ce("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 lv(e,t,n){let r=un(n.selectedFilePath??null,t.filePaths),s=un(n.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([Ah(e,r),(async()=>{if(!s)return Ce("No diff selected","No local changes found.","empty");let l=Io(e,s),c=l?await Ps(l.target.worktreePath).catch(()=>null):null;return Eh(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function Ch(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return cv(e,t);try{await he(e);let n=await Ps(e.worktreePath),[r,s]=await Promise.all([Oh(e.worktreePath),$h(e.worktreePath,n)]),i=[...new Set(s.map(u=>u.path))],o=un(t.selectedFilePath??null,r),a=un(t.selectedDiffPath??null,i),[l,c]=await Promise.all([vo(e.worktreePath,o),a?cu(e.worktreePath,a,s,n):Promise.resolve(Ce("No diff selected","No local changes found.","empty"))]),d=a?{[a]:c}:{};return{taskId:e.id,fileRows:Lh(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:Ce("Files unavailable",r,"error"),selectedDiff:Ce("Diff unavailable",r,"error"),error:r}}}async function cv(e,t){let n=(e.repoTargets??[]).filter(p=>p.status==="ready"),r=await Promise.all(n.map(async p=>{let h=await Ps(p.worktreePath).catch(()=>null),[m,f]=await Promise.all([Oh(p.worktreePath).catch(()=>[]),$h(p.worktreePath,h).catch(()=>[])]);return{target:p,baseRef:h,targetFiles:m,targetDiffRows:f}})),s=[],i=[];for(let{target:p,targetFiles:h,targetDiffRows:m}of r)s.push(...h.map(f=>`${p.repoId}/${f}`)),i.push(...m.map(f=>({...f,path:`${p.repoId}/${f.path}`})));let o=[...new Set(i.map(p=>p.path))].sort(),a=un(t.selectedFilePath??null,s),l=un(t.selectedDiffPath??null,o),[c,d]=await Promise.all([Ah(e,a),(async()=>{if(!l)return Ce("No diff selected","No local changes found.","empty");let p=Io(e,l),h=p?r.find(m=>m.target.repoId===p.target.repoId):null;return Eh(e,l,i,h?.baseRef??null)})()]),u=l?{[l]:d}:{};return{taskId:e.id,fileRows:Lh(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:u,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:d,error:null}}async function Ah(e,t){let n=Io(e,t);if(!n)return Ce("No file selected","No Git-visible files found.","empty");let r=await vo(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function Eh(e,t,n,r=null){let s=Io(e,t);return s?{...await cu(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}:Ce(t,"Repo target is unavailable.","error",t)}function Io(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 Oh(e){let t=await G("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return Fh(t.stdout)}async function $h(e,t){let[n,r,s,i]=await Promise.all([uv(e,t),Ih(e,"staged"),Ih(e,"unstaged"),dv(e)]);return[...n,...r,...s,...i]}async function uv(e,t){if(!t)return[];let[n,r]=await Promise.all([G("git",["diff","--name-status",`${t}...HEAD`],{cwd:e}),G("git",["diff","--numstat",`${t}...HEAD`],{cwd:e})]),s=Nh(n.stdout),i=Dh(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 Ih(e,t){let n=t==="staged"?["diff","--cached"]:["diff"],[r,s]=await Promise.all([G("git",[...n,"--name-status"],{cwd:e}),G("git",[...n,"--numstat"],{cwd:e})]),i=Nh(r.stdout),o=Dh(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 dv(e){let t=await G("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=Fh(t.stdout);return await Promise.all(n.map(async s=>{let i=await vo(e,s),o=i.status==="ready"?pv(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function Nh(e){return e.split(`
250
+ `).map(t=>t.trim()).filter(t=>t.length>0).map(t=>{let[n="M",...r]=t.split(" ");return{status:n,path:r.at(-1)??""}}).filter(t=>t.path.length>0)}function Dh(e){let t=new Map;for(let n of e.split(`
251
+ `)){let r=n.trim();if(!r)continue;let[s="-",i="-",...o]=r.split(" "),a=o.join(" ");a&&t.set(a,{additions:s==="-"?null:Number(s),deletions:i==="-"?null:Number(i)})}return t}async function Ps(e){return(await z("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await z("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function vo(e,t){if(!t)return Ce("No file selected","No Git-visible files found.","empty");let n=fv(e,t);return xh(n,t)}async function _h(e){return xh(e,e)}async function xh(e,t){try{let n=await iv(e);if(n.size>ov)return Ce(t,`File is ${n.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,n.size);let r=await sv(e);return mv(r)?Ce(t,"Binary file preview is not available in Craig.","binary",t,r.byteLength):{path:t,status:"ready",title:t,lines:r.toString("utf8").split(`
252
+ `),byteLength:r.byteLength}}catch(n){let r=n instanceof Error?n.message:"Unable to read file.";return Ce(t,r,"missing",t,null)}}async function cu(e,t,n,r=null){if(!t)return Ce("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 Ps(e);if(a){let l=await G("git",["diff","--stat","--patch",`--unified=${So}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
253
+ ${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await G("git",["diff","--cached","--stat","--patch",`--unified=${So}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
254
+ ${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await G("git",["diff","--stat","--patch",`--unified=${So}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
255
+ ${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await z("git",["diff","--no-index","--stat","--patch",`--unified=${So}`,"--","/dev/null",t],{cwd:e});a.stdout.trim().length>0&&s.push(`untracked
256
256
  ${a.stdout.trimEnd()}`)}let o=s.join(`
257
257
 
258
- `);return o.length>rv?Ce(t,"Diff is above the 500 KB inline preview limit.","too_large",t,o.length):o.includes("\0")?Ce(t,"Binary diff preview is not available in Craig.","binary",t,o.length):{path:t,status:o.length>0?"ready":"empty",title:t,lines:o.length>0?o.split(`
259
- `):["No diff for this file."],byteLength:o.length}}function _h(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 un(e,t){return e&&t.includes(e)?e:t[0]??null}function lv(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function xh(e){return[...new Set(e.split(`
260
- `).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function cv(e,t){let n=ou.resolve(e,t),r=ou.resolve(e);if(n!==r&&!n.startsWith(`${r}${ou.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function uv(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function Ce(e,t,n,r=null,s=null){return{path:r,status:n,title:e,lines:[t],byteLength:s}}var dv=["tasks","center","inspector","actions"],Fh=["agent","terminal"],Lh=[],B="inspection",uV=[...Fh,...Lh],lu=["commit","push","refresh-checks","close-task"],Mh=["refresh-checks","close-task"],jh=["task","checks","pr","setup-run","actions","next-action"],cu=["files","review"];function qh(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=yv(e?.openInspectionKind)??n,s=T.runners.getEnabled(t);return{inputMode:kv(e?.inputMode),focusedRegion:hv(e?.focusedRegion),selectedRepoId:jt(e?.selectedRepoId),selectedWorkspaceId:jt(e?.selectedWorkspaceId),selectedTaskId:jt(e?.selectedTaskId),selectedPtyTabId:jt(e?.selectedPtyTabId),selectedLeftItemId:vv(jt(e?.selectedTaskId)),activeTab:n?B:jt(e?.activeTab)??"agent",preferredPtyTabKind:wv(e?.preferredPtyTabKind),inspectorSection:Ss(e?.inspectorSection,jh,"task"),inspectionMode:gv(e?.inspectionMode,n==="diff"?"review":"files"),openInspectionKind:r,selectedFileTreePath:jt(e?.selectedFileTreePath),selectedFilePath:jt(e?.selectedFilePath),selectedDiffPath:jt(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:Ss(e?.selectedActionId,lu,"commit"),selectedProjectTargetId:null,selectedRunner:Tv(e?.selectedRunner,s,T.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:pv(),centerZoomed:!1}}function pv(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function Uh(e,t){return{...e??Ms(),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 vs(e,t,n={}){let r=Sv(e,t),s=pu(r),i=s?.kind==="task"?t.tasks.find(p=>p.id===s.id)??null:null,o=i?Iv(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?Co(t.tasks,a.id):c?Ao(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,...bv(u,e.activeTab,e.selectedPtyTabId),selectedFilePath:mv(e,t,u?.id??null),...Rv(e,t,u?.id??null),selectedDiffPath:fv(e,t,u?.id??null),inspectorSection:Ss(e.inspectorSection,jh,"task")}}function qt(e,t){return{...e,terminal:t}}function Wh(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function Bh(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function ut(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
261
- `}function uu(e){return e.length===1&&e>=" "&&e!=="\x7F"}function du(e){return Kh(e)||Rr(e)!==null}function Vh(e){return Lh.includes(e)}function Kh(e){return Fh.includes(e)}function Gh(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[B]:[]]}function fv(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function mv(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function Ss(e,t,n){return t.includes(e??"")?e:n}function hv(e){return e==="tabs"?"center":Ss(e,dv,"tasks")}function gv(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":Ss(e,cu,t)}function yv(e){return e==="file"||e==="diff"?e:null}function wv(e){return e==="terminal"?"terminal":"agent"}function kv(e){return e==="terminal"?"terminal":"control"}function Tv(e,t=[...mt],n="codex"){return e&&T.runners.isRunnerType(e)&&t.includes(e)?e:n}function vo(e,t=mt){let n=t.length>0?t:mt,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function Rr(e){let t=ue.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function bv(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(Kh(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 Rv(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?Pv(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function Pv(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 Sv(e,t){let n=Mn(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 Mn(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of Is(Co(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 Is(Ao(e.tasks,n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function Co(e,t){return Hh(e,n=>n.workspaceId===t)}function Ao(e,t){return Hh(e,n=>n.repoId===t)}function Iv(e,t){return t.rootTaskId===t.id?t:e.find(n=>n.id===t.rootTaskId)??t}function Hh(e,t){let n=new Map(e.map(r=>[r.id,r]));return e.filter(r=>t(n.get(r.rootTaskId)??r))}function Is(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 pu(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 jt(e){return typeof e=="string"?e:null}function vv(e){return e?`task:${e}`:null}function Cs(e){return typeof e=="string"&&e.startsWith("task:")}function Eo(e){return typeof e=="string"&&e.startsWith("new-task:")}function Oo(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function Yh(e){return typeof e=="string"&&e.startsWith("workspace:")}function fu(e){return Eo(e)?e.slice(9):null}function mu(e){return Oo(e)?e.slice(19):null}async function Pr(e,t,n){let r=Ae(e),[s,i]=await Promise.all([Te.repos.listRegisteredRepos(r),Te.listWorkspaces(r,{archived:!1})]),o=await P.listTasks(r),a={},l=await T.load(r),c=0;if(T.previews.isEnabled(l,"agentOrchestration")){let h=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(k=>k.kind==="agent").map(async k=>({agentTab:k,environment:await et(r,y,void 0,k.id)}))));for(let{agentTab:y,environment:k}of h)k.CRAIG_AGENT_CAPABILITY&&(a[y.id]=k.CRAIG_AGENT_CAPABILITY);o=await P.listTasks(r);let[m,f]=await Promise.all([ff(r),gi(r)]);c=m.length+f.filter(y=>y.state==="waiting_for_review").length}let d=hu(o.tasks,t),u=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},p=d?await Ih(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 hu(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function zh(e,t){return vs(e,t)}import Iu from"node:path";import bV from"picocolors";var Cv=[" \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 gu(){return[...Cv]}var $o={width:120,height:36},Z={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function qe(e,t){return{width:Math.max(e??$o.width,$o.width),height:Math.max(t??$o.height,$o.height)}}var Av=["Start","Options","Exit"],Ev=["Resume","Options","Exit"],Do=2,_o=2,xo=2,Ov=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),$v=new RegExp("\x1B\\[(?:0)?m","g"),Nv=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),Dv=/https?:\/\/[^\s<>"']+/g,wu="\x1B[0m",ku="\x1B]8;;\x1B\\",D={panelBg:{bg:"0a0a0a",fg:"c0caf5"},panelMuted:{bg:"0a0a0a",fg:"565f89"},panelSelected:{bg:"1a1b26",fg:"c0caf5"},panelFocused:{bg:"1a1b26",fg:"7aa2f7"},divider:{bg:"0a0a0a",fg:"292e42"},rail:{bg:"0a0a0a",fg:"c0caf5"},overlay:{bg:"06060f",fg:"565f89"},overlayTitle:{bg:"06060f",fg:"565f89"},overlayLogo:{bg:"06060f",fg:"9ece6a"},overlaySubtitle:{bg:"06060f",fg:"41a6b5"},overlayMenuSelected:{bg:"06060f",fg:"7aa2f7"},accent:{fg:"7aa2f7"},success:{fg:"9ece6a"},pending:{fg:"e0af68"},error:{fg:"f7768e"},mutedfg:{fg:"565f89"},disabled:{fg:"3b4261"}},yu=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function Qh(e,t={}){return bu(e,{subtitle:"crAIg is that you?",menuItems:Av,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function Zh(e,t={}){return bu(e,{subtitle:"Control mode is paused.",menuItems:Ev,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}var No=[" 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."],_v=["Help"],xv=5;function Mo(e,t={}){return bu(e,{subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??_v,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function eg(e,t={}){let n=t.color??!0,r=D.overlay,s=new Array(e.height).fill(re(" ".repeat(e.width),n,r)),i=gu(),o=Math.max(1,Math.floor((e.height-i.length-2-No.length)/2));for(let d=0;d<i.length&&!(o+d>=e.height);d+=1)s[o+d]=re(cg(i[d]??"",e.width),n,D.overlayLogo);let a=Math.max(...No.map(d=>d.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let d=0;d<No.length;d+=1){let u=c+d;if(u>=e.height)break;let p=No[d]??"";s[u]=re(St(" ".repeat(l)+p,e.width),n,r)}return s.join(`
262
- `)}function tg(e,t={}){let n=t.color??!0,r=D.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"},dt(),...a.length>0?a.map(h=>({text:h,tone:Fv(h)})):[{text:"No Craig activity has been logged.",tone:"muted"}],dt(),{text:"Esc returns to Options.",tone:"muted"}],u=As(d,e.height-2),p=Math.max(1,Math.floor((e.height-u.length)/2));for(let h=0;h<u.length;h+=1){let m=p+h;if(m>=e.height)break;let f=u[h]??dt(),y=`${" ".repeat(c)}${jo(f.text,l)}`,k=f.tone==="selected"?D.overlayMenuSelected:f.tone==="info"?{...D.overlay,fg:D.accent.fg}:f.tone==="warning"?{...D.overlay,fg:D.pending.fg}:f.tone==="error"?{...D.overlay,fg:D.error.fg}:f.tone==="muted"?D.overlay:D.panelBg;s[m]=re(St(y,e.width),n,k)}return s.join(`
263
- `)}function Fv(e){return e.includes(" ERROR ")?"error":e.includes(" WARN ")?"warning":e.includes(" INFO ")?"info":"muted"}function ng(e,t,n={}){let r=n.color??!0,s=Z.leftWidth,i=Z.rightWidth,o=n.centerOnly??!1,a=e.height-Z.topRailHeight-1,l=n.focusFlashActive??!1,c={bg:D.divider.bg,fg:"9ece6a"},d=l&&(t.focusedRegion==="tasks"||t.focusedRegion==="center")?c:D.divider,u=l&&(t.focusedRegion==="center"||t.focusedRegion==="inspector")?c:D.divider,p=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,h=re(St(p,e.width),r,D.rail),m=Mv(t,s-Do-_o,a,r),f=Tu(e,t,{color:r,centerOnly:o}),y=Uv(t,i,a,r),k=t.inputMode==="terminal",R=[],b=[];for(let ye=0;ye<a;ye+=1)if(!o){let Y=Fo(m[ye]??dt(),s,r,"left"),gn=re("\u2502",r,d),ra=re("\u2502",r,u),_s=Fo(y[ye]??dt(),i,r,"right");R.push(`${Y}${gn}`),b.push(`${ra}${_s}`)}let $=k||t.modalInput?D.panelBg:D.panelMuted,O=Lv(t.footerText,t.footerToast,e.width,r,$),N={row:1,column:1,width:e.width,rows:[h]},x=o?null:{row:Z.topRailHeight+1,column:1,width:s+Z.dividerWidth,rows:R},v=o?null:{row:Z.topRailHeight+1,column:f.column+f.width,width:Z.dividerWidth+i,rows:b},w={row:e.height,column:1,width:e.width,rows:[O]},Se=o?f.rows:f.rows.map((ye,Y)=>`${R[Y]??""}${ye}${b[Y]??""}`);return{frame:[h,...Se,O].join(`
264
- `),center:f,regions:{rail:N,left:x,center:f,right:v,footer:w}}}function Tu(e,t,n={}){let r=n.color??!0,s=sg(e,n.centerOnly??!1),i=jv(t,s.width,s.rowCount,r);return{row:s.row,column:s.column,width:s.width,rows:i.map(o=>Fo(o,s.width,r,"center"))}}function rg(e,t,n,r={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!du(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=sg(e,r.centerOnly??!1),a=ig(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:Fo(og(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function sg(e,t){return{row:Z.topRailHeight+1,column:t?1:Z.leftWidth+Z.dividerWidth+1,width:t?e.width:e.width-Z.leftWidth-Z.rightWidth-Z.dividerWidth*2,rowCount:e.height-Z.topRailHeight-1}}function Lv(e,t,n,r,s){let i=` ${e}`;if(!t)return re(St(i,n),r,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=Ne(o),l=Ne(i),c=Math.max(1,n-l-a-2),d=l+c+a+2>n?jo(i,Math.max(0,n-a-3)):i,u=Math.max(1,n-Ne(d)-a-2),p=t.tone==="error"?oC(o,r,s):Sr(o,r,s),h=`${d}${" ".repeat(u)}${p} `;return re(St(h,n),r,s)}function bu(e,t){let n=new Array(e.height).fill(re(" ".repeat(e.width),t.color,D.overlay)),r=gu(),s=t.menuItems.map((c,d)=>`${d===t.menuIndex?">":" "} ${c}`),i=t.optionsMessage?["",t.optionsMessage]:[],o=[...s,...i];for(;o.length<xv;)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=cg(a[c]??"",e.width);if(c<r.length){n[l+c]=re(d,t.color,D.overlayLogo);continue}if(c===r.length+1){n[l+c]=re(d,t.color,D.overlaySubtitle);continue}let u=c-(r.length+3),h=u>=0&&u<t.menuItems.length&&u===t.menuIndex?D.overlayMenuSelected:D.overlay;n[l+c]=re(d,t.color,h)}if(t.versionText){let c=t.updateText?" (update available)":"",d=`${t.versionText}${c} `,u=" ".repeat(Math.max(0,e.width-Ne(d)));n[e.height-1]=re(`${u}${Su(d,t.color,D.overlay)}`,t.color,D.overlay)}return n.join(`
265
- `)}function Mv(e,t,n,r){let s=Vv(e.runners),i=1,o=e.leftTree.map(l=>Bv(l,t,r));return[...As(o,n-i),s]}function jv(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!du(s)?e.centerTranscript.map(o=>({...o})):qv(e);return As([...ig(e,t,r),...i],n)}function ig(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:rC(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?Sr(a,n,D.panelBg):Lo(a,n,D.panelMuted)}`,c=[`${Lo(e.centerHeader.tabLabel,n,D.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),d=Kv(e.tabs,n,e.focusedRegion==="center"),u=" engaged ",p=u.length+2,h=e.inputMode==="terminal"?Sr(`${u}\u25CF `,n,D.panelBg):"",m=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Ne(d)-p)):"";return[{text:e.inputMode==="terminal"?`${d}${m}${h}`:d},{text:l,tone:"muted"},{text:c},dt()]}function qv(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},dt(),{text:e.terminal.error},dt(),{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(og)}function og(e){return{text:Pu(e.segments),segments:e.segments,fullBleed:!0}}function Uv(e,t,n,r){let s=e.rightInspection?Wv(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):As([{text:"CONTEXT"},dt(),...e.rightContext.map(i=>Gv(i,r)),...e.actionMessage?[dt(),{text:e.actionMessage}]:[]],n);return As(s,n)}function Wv(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:iC(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>Jh(a)),...r.slice(o,o+s).map(a=>Jh(a))]}function Jh(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 Bv(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${Sr("\u25CF",n,e.selected?D.panelSelected:D.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((m,f)=>m+Ne(f.text),0):0,l=t-Ne(i)-Ne(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",d=e.selected?e.text:e.focused?Sr(e.text,n,D.panelBg):e.panelHeader?Lo(e.text,n,D.panelMuted):e.text,u=St(`${r}${c}${d}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let m=`${r}${e.selected?"\u25B8":" "} `,f=u.slice(m.length+2),y=[{text:m},ag(e.activity,e.activityAnimationFrame??0),{text:` ${f}${i}${o}`},...e.prBadge??[]];return{text:Pu(y),segments:y,tone:p}}if(e.prBadge){let m=[{text:`${u}${i}${o}`},...e.prBadge];return{text:`${u}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:m,tone:p}}return{text:`${u}${i}${o}`,tone:p}}function Vv(e){let t=e.map(r=>{let s=r.health>=1,i=parseInt(r.count,10),o=i>1?` (${i})`:"";return{text:`${s?"\u25CF":"\u25CB"} ${r.name}${o}`,active:s}}),n=[];for(let r=0;r<t.length;r++){let s=t[r];r>0&&n.push({text:" "}),s.active?n.push({text:s.text,style:{fg:D.success.fg}}):n.push({text:s.text,style:{fg:D.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function Kv(e,t,n){return e.map(r=>{let s=r.active?n?Sr(r.label,t,D.panelBg):Lo(r.label,t,D.panelBg):Su(r.label,t,D.panelBg),i=r.activity?Ru(ag(r.activity,r.activityAnimationFrame??0),t,D.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function ag(e,t){return{text:"\u25CF",style:{fg:e==="working"?yu[t%yu.length]??yu[0]:e==="ready"?D.success.fg:e==="error"?D.error.fg:D.panelMuted.fg}}}function Gv(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?Su(e.value,t,D.panelBg):e.value}`}}function Fo(e,t,n,r){let s=Hv(r,e.tone??"default"),i=Yv(e,n,s);if(r==="left"){if(e.fullBleed)return re(St(i,t),n,s);let a=t-Do-_o;if(e.rightAlign){let c=Ne(i),d=Math.max(0,a-c),u=`${" ".repeat(Do)}${" ".repeat(d)}${i}${" ".repeat(_o)}`;return re(u,n,s)}let l=`${" ".repeat(Do)}${St(i,a)}${" ".repeat(_o)}`;return re(l,n,s)}return r==="center"&&e.fullBleed?zv(e,t,n,s):re(St(` ${i}`,t),n,s)}function Hv(e,t){return t==="selected"||t==="focused"?D.panelSelected:t==="muted"?D.panelMuted:D.panelBg}function As(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(dt());return n}function dt(){return{text:""}}function Yv(e,t,n){return e.segments?e.segments.map(r=>Ru(r,t,n)).join(""):e.text}function zv(e,t,n,r){let s=" ".repeat(xo),i=Math.max(0,t-xo*2);if(!e.segments)return re(`${s}${St(e.text,i)}${s}`,n,r);let o=Qv(e.segments,i),a=`${s}${o.map(l=>Ru(l,n,r)).join("")}${s}${n?ku:""}`;return re(a,n,r)}function Ru(e,t,n){let r=e.href?`${lg(e.href)}${e.text}${ku}`:Jv(e.text);return!t||!e.style?r:`${Es(tC(e.style,n))}${nC(e.style)}${r}${wu}${Es(n)}`}function Jv(e){return e.replace(Dv,t=>{let[n,r]=Xv(t);return`${lg(n)}${n}${ku}${r}`})}function Xv(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function lg(e){return`\x1B]8;;${e}\x1B\\`}function Qv(e,t){let n=Zv(e,t);return eC(n,t)}function Zv(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=Ne(s.text);if(i<=r){n.push(s),r-=i;continue}let o=jo(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function eC(e,t){let n=Ne(Pu(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 tC(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 nC(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 rC(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 cg(e,t){let n=Math.max(0,t-Ne(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function St(e,t){let n=Ne(e);return n>=t?sC(e,t):e+" ".repeat(t-n)}function sC(e,t){if(t<=0)return"";if(Ne(e)<=t)return e;let n=dg(e);return jo(n,Math.max(0,t-1))+"\u2026"}function Ne(e){let t=0;for(let n of Array.from(dg(e)))t+=ug(n);return t}function jo(e,t){let n="",r=0;for(let s of Array.from(e)){let i=ug(s);if(r+i>t)break;n+=s,r+=i}return n}function ug(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 iC(e,t,n){return Math.min(Math.max(e,t),n)}function dg(e){return e.replace(Nv,"").replace(Ov,"")}function Pu(e){return e.map(t=>t.text).join("")}function re(e,t,n){if(!t)return e;let r=Es(n),s=e.replace($v,`${wu}${r}`);return`${r}${s}${wu}`}function Es(e){let t=[];return e.fg&&t.push(`38;2;${Xh(e.fg).join(";")}`),e.bg&&t.push(`48;2;${Xh(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function Xh(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function Sr(e,t,n){return qo(e,t,D.success.fg,n)}function oC(e,t,n){return qo(e,t,D.error.fg,n)}function Lo(e,t,n){return qo(e,t,D.accent.fg,n)}function Su(e,t,n){return qo(e,t,D.mutedfg.fg,n)}function qo(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${Es(s)}${e}${Es(r)}`}function pg(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"?lC(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:aC(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function aC(e,t){let n=(e??"").split(Iu.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(Iu.delimiter):[...n,t].join(Iu.delimiter)}function lC(e){return e.command.length>0?e.command:["codex"]}function fg(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 dn(e){return{columns:Math.max(20,e.width-Z.leftWidth-Z.rightWidth-Z.dividerWidth-xo*2),rows:Math.max(5,e.height-Z.topRailHeight-5)}}function mg(e){return e.length===1||ut(e)||e==="BACKSPACE"||e==="TAB"}function Ut(e){return typeof e=="string"&&new RegExp(`:(?:agent|${ue.join("|")})(?:-\\d+)?$`).test(e)}function hg(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 vu(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function gg(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 Os(e){return wg.includes(e)?"SHIFT_ENTER":null}function Cu(e){return wg.some(t=>t.startsWith(e))}function yg(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var wg=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function kg(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
258
+ `);return o.length>av?Ce(t,"Diff is above the 500 KB inline preview limit.","too_large",t,o.length):o.includes("\0")?Ce(t,"Binary diff preview is not available in Craig.","binary",t,o.length):{path:t,status:o.length>0?"ready":"empty",title:t,lines:o.length>0?o.split(`
259
+ `):["No diff for this file."],byteLength:o.length}}function Lh(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 un(e,t){return e&&t.includes(e)?e:t[0]??null}function pv(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function Fh(e){return[...new Set(e.split(`
260
+ `).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function fv(e,t){let n=lu.resolve(e,t),r=lu.resolve(e);if(n!==r&&!n.startsWith(`${r}${lu.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function mv(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function Ce(e,t,n,r=null,s=null){return{path:r,status:n,title:e,lines:[t],byteLength:s}}var hv=["tasks","center","inspector","actions"],Mh=["agent","terminal"],jh=[],B="inspection",yV=[...Mh,...jh],uu=["commit","push","refresh-checks","close-task"],qh=["refresh-checks","close-task"],Uh=["task","checks","pr","setup-run","actions","next-action"],du=["files","review"];function Wh(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=bv(e?.openInspectionKind)??n,s=T.runners.getEnabled(t);return{inputMode:Pv(e?.inputMode),focusedRegion:kv(e?.focusedRegion),selectedRepoId:jt(e?.selectedRepoId),selectedWorkspaceId:jt(e?.selectedWorkspaceId),selectedTaskId:jt(e?.selectedTaskId),selectedPtyTabId:jt(e?.selectedPtyTabId),selectedLeftItemId:Ov(jt(e?.selectedTaskId)),activeTab:n?B:jt(e?.activeTab)??"agent",preferredPtyTabKind:Rv(e?.preferredPtyTabKind),inspectorSection:Ss(e?.inspectorSection,Uh,"task"),inspectionMode:Tv(e?.inspectionMode,n==="diff"?"review":"files"),openInspectionKind:r,selectedFileTreePath:jt(e?.selectedFileTreePath),selectedFilePath:jt(e?.selectedFilePath),selectedDiffPath:jt(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:Ss(e?.selectedActionId,uu,"commit"),selectedProjectTargetId:null,selectedRunner:Sv(e?.selectedRunner,s,T.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:gv(),centerZoomed:!1}}function gv(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function Bh(e,t){return{...e??Ms(),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 vs(e,t,n={}){let r=Av(e,t),s=mu(r),i=s?.kind==="task"?t.tasks.find(p=>p.id===s.id)??null:null,o=i?Ev(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?Ao(t.tasks,a.id):c?Eo(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,...Iv(u,e.activeTab,e.selectedPtyTabId),selectedFilePath:wv(e,t,u?.id??null),...vv(e,t,u?.id??null),selectedDiffPath:yv(e,t,u?.id??null),inspectorSection:Ss(e.inspectorSection,Uh,"task")}}function qt(e,t){return{...e,terminal:t}}function Vh(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function Kh(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function ut(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
261
+ `}function pu(e){return e.length===1&&e>=" "&&e!=="\x7F"}function fu(e){return Hh(e)||Rr(e)!==null}function Gh(e){return jh.includes(e)}function Hh(e){return Mh.includes(e)}function Yh(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[B]:[]]}function yv(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function wv(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function Ss(e,t,n){return t.includes(e??"")?e:n}function kv(e){return e==="tabs"?"center":Ss(e,hv,"tasks")}function Tv(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":Ss(e,du,t)}function bv(e){return e==="file"||e==="diff"?e:null}function Rv(e){return e==="terminal"?"terminal":"agent"}function Pv(e){return e==="terminal"?"terminal":"control"}function Sv(e,t=[...mt],n="codex"){return e&&T.runners.isRunnerType(e)&&t.includes(e)?e:n}function Co(e,t=mt){let n=t.length>0?t:mt,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function Rr(e){let t=ue.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function Iv(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(Hh(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 vv(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?Cv(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function Cv(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 Av(e,t){let n=Mn(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 Mn(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of Is(Ao(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 Is(Eo(e.tasks,n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function Ao(e,t){return zh(e,n=>n.workspaceId===t)}function Eo(e,t){return zh(e,n=>n.repoId===t)}function Ev(e,t){return t.rootTaskId===t.id?t:e.find(n=>n.id===t.rootTaskId)??t}function zh(e,t){let n=new Map(e.map(r=>[r.id,r]));return e.filter(r=>t(n.get(r.rootTaskId)??r))}function Is(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 mu(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 jt(e){return typeof e=="string"?e:null}function Ov(e){return e?`task:${e}`:null}function Cs(e){return typeof e=="string"&&e.startsWith("task:")}function Oo(e){return typeof e=="string"&&e.startsWith("new-task:")}function $o(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function Jh(e){return typeof e=="string"&&e.startsWith("workspace:")}function hu(e){return Oo(e)?e.slice(9):null}function gu(e){return $o(e)?e.slice(19):null}async function Pr(e,t,n){let r=Ae(e),[s,i]=await Promise.all([Te.repos.listRegisteredRepos(r),Te.listWorkspaces(r,{archived:!1})]),o=await P.listTasks(r),a={},l=await T.load(r),c=0;if(T.previews.isEnabled(l,"agentOrchestration")){let h=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(k=>k.kind==="agent").map(async k=>({agentTab:k,environment:await et(r,y,void 0,k.id)}))));for(let{agentTab:y,environment:k}of h)k.CRAIG_AGENT_CAPABILITY&&(a[y.id]=k.CRAIG_AGENT_CAPABILITY);o=await P.listTasks(r);let[m,f]=await Promise.all([hf(r),gi(r)]);c=m.length+f.filter(y=>y.state==="waiting_for_review").length}let d=yu(o.tasks,t),u=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},p=d?await Ch(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 yu(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function Xh(e,t){return vs(e,t)}import Cu from"node:path";import AV from"picocolors";var $v=[" \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 wu(){return[...$v]}var No={width:120,height:36},Z={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function qe(e,t){return{width:Math.max(e??No.width,No.width),height:Math.max(t??No.height,No.height)}}var Nv=["Start","Options","Exit"],Dv=["Resume","Options","Exit"],_o=2,xo=2,Lo=2,_v=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),xv=new RegExp("\x1B\\[(?:0)?m","g"),Lv=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),Fv=/https?:\/\/[^\s<>"']+/g,Tu="\x1B[0m",bu="\x1B]8;;\x1B\\",D={panelBg:{bg:"0a0a0a",fg:"c0caf5"},panelMuted:{bg:"0a0a0a",fg:"565f89"},panelSelected:{bg:"1a1b26",fg:"c0caf5"},panelFocused:{bg:"1a1b26",fg:"7aa2f7"},divider:{bg:"0a0a0a",fg:"292e42"},rail:{bg:"0a0a0a",fg:"c0caf5"},overlay:{bg:"06060f",fg:"565f89"},overlayTitle:{bg:"06060f",fg:"565f89"},overlayLogo:{bg:"06060f",fg:"9ece6a"},overlaySubtitle:{bg:"06060f",fg:"41a6b5"},overlayMenuSelected:{bg:"06060f",fg:"7aa2f7"},accent:{fg:"7aa2f7"},success:{fg:"9ece6a"},pending:{fg:"e0af68"},error:{fg:"f7768e"},mutedfg:{fg:"565f89"},disabled:{fg:"3b4261"}},ku=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function eg(e,t={}){return Pu(e,{subtitle:"crAIg is that you?",menuItems:Nv,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function tg(e,t={}){return Pu(e,{subtitle:"Control mode is paused.",menuItems:Dv,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}var Do=[" 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."],Mv=["Help"],jv=5;function jo(e,t={}){return Pu(e,{subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??Mv,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function ng(e,t={}){let n=t.color??!0,r=D.overlay,s=new Array(e.height).fill(re(" ".repeat(e.width),n,r)),i=wu(),o=Math.max(1,Math.floor((e.height-i.length-2-Do.length)/2));for(let d=0;d<i.length&&!(o+d>=e.height);d+=1)s[o+d]=re(dg(i[d]??"",e.width),n,D.overlayLogo);let a=Math.max(...Do.map(d=>d.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let d=0;d<Do.length;d+=1){let u=c+d;if(u>=e.height)break;let p=Do[d]??"";s[u]=re(St(" ".repeat(l)+p,e.width),n,r)}return s.join(`
262
+ `)}function rg(e,t={}){let n=t.color??!0,r=D.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"},dt(),...a.length>0?a.map(h=>({text:h,tone:qv(h)})):[{text:"No Craig activity has been logged.",tone:"muted"}],dt(),{text:"Esc returns to Options.",tone:"muted"}],u=As(d,e.height-2),p=Math.max(1,Math.floor((e.height-u.length)/2));for(let h=0;h<u.length;h+=1){let m=p+h;if(m>=e.height)break;let f=u[h]??dt(),y=`${" ".repeat(c)}${qo(f.text,l)}`,k=f.tone==="selected"?D.overlayMenuSelected:f.tone==="info"?{...D.overlay,fg:D.accent.fg}:f.tone==="warning"?{...D.overlay,fg:D.pending.fg}:f.tone==="error"?{...D.overlay,fg:D.error.fg}:f.tone==="muted"?D.overlay:D.panelBg;s[m]=re(St(y,e.width),n,k)}return s.join(`
263
+ `)}function qv(e){return e.includes(" ERROR ")?"error":e.includes(" WARN ")?"warning":e.includes(" INFO ")?"info":"muted"}function sg(e,t,n={}){let r=n.color??!0,s=Z.leftWidth,i=Z.rightWidth,o=n.centerOnly??!1,a=e.height-Z.topRailHeight-1,l=n.focusFlashActive??!1,c={bg:D.divider.bg,fg:"9ece6a"},d=l&&(t.focusedRegion==="tasks"||t.focusedRegion==="center")?c:D.divider,u=l&&(t.focusedRegion==="center"||t.focusedRegion==="inspector")?c:D.divider,p=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,h=re(St(p,e.width),r,D.rail),m=Wv(t,s-_o-xo,a,r),f=Ru(e,t,{color:r,centerOnly:o}),y=Kv(t,i,a,r),k=t.inputMode==="terminal",R=[],b=[];for(let ye=0;ye<a;ye+=1)if(!o){let Y=Fo(m[ye]??dt(),s,r,"left"),gn=re("\u2502",r,d),ia=re("\u2502",r,u),_s=Fo(y[ye]??dt(),i,r,"right");R.push(`${Y}${gn}`),b.push(`${ia}${_s}`)}let $=k||t.modalInput?D.panelBg:D.panelMuted,O=Uv(t.footerText,t.footerToast,e.width,r,$),N={row:1,column:1,width:e.width,rows:[h]},x=o?null:{row:Z.topRailHeight+1,column:1,width:s+Z.dividerWidth,rows:R},v=o?null:{row:Z.topRailHeight+1,column:f.column+f.width,width:Z.dividerWidth+i,rows:b},w={row:e.height,column:1,width:e.width,rows:[O]},Se=o?f.rows:f.rows.map((ye,Y)=>`${R[Y]??""}${ye}${b[Y]??""}`);return{frame:[h,...Se,O].join(`
264
+ `),center:f,regions:{rail:N,left:x,center:f,right:v,footer:w}}}function Ru(e,t,n={}){let r=n.color??!0,s=og(e,n.centerOnly??!1),i=Bv(t,s.width,s.rowCount,r);return{row:s.row,column:s.column,width:s.width,rows:i.map(o=>Fo(o,s.width,r,"center"))}}function ig(e,t,n,r={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!fu(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=og(e,r.centerOnly??!1),a=ag(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:Fo(lg(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function og(e,t){return{row:Z.topRailHeight+1,column:t?1:Z.leftWidth+Z.dividerWidth+1,width:t?e.width:e.width-Z.leftWidth-Z.rightWidth-Z.dividerWidth*2,rowCount:e.height-Z.topRailHeight-1}}function Uv(e,t,n,r,s){let i=` ${e}`;if(!t)return re(St(i,n),r,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=Ne(o),l=Ne(i),c=Math.max(1,n-l-a-2),d=l+c+a+2>n?qo(i,Math.max(0,n-a-3)):i,u=Math.max(1,n-Ne(d)-a-2),p=t.tone==="error"?uC(o,r,s):Sr(o,r,s),h=`${d}${" ".repeat(u)}${p} `;return re(St(h,n),r,s)}function Pu(e,t){let n=new Array(e.height).fill(re(" ".repeat(e.width),t.color,D.overlay)),r=wu(),s=t.menuItems.map((c,d)=>`${d===t.menuIndex?">":" "} ${c}`),i=t.optionsMessage?["",t.optionsMessage]:[],o=[...s,...i];for(;o.length<jv;)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=dg(a[c]??"",e.width);if(c<r.length){n[l+c]=re(d,t.color,D.overlayLogo);continue}if(c===r.length+1){n[l+c]=re(d,t.color,D.overlaySubtitle);continue}let u=c-(r.length+3),h=u>=0&&u<t.menuItems.length&&u===t.menuIndex?D.overlayMenuSelected:D.overlay;n[l+c]=re(d,t.color,h)}if(t.versionText){let c=t.updateText?" (update available)":"",d=`${t.versionText}${c} `,u=" ".repeat(Math.max(0,e.width-Ne(d)));n[e.height-1]=re(`${u}${vu(d,t.color,D.overlay)}`,t.color,D.overlay)}return n.join(`
265
+ `)}function Wv(e,t,n,r){let s=Yv(e.runners),i=1,o=e.leftTree.map(l=>Hv(l,t,r));return[...As(o,n-i),s]}function Bv(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!fu(s)?e.centerTranscript.map(o=>({...o})):Vv(e);return As([...ag(e,t,r),...i],n)}function ag(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:aC(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?Sr(a,n,D.panelBg):Mo(a,n,D.panelMuted)}`,c=[`${Mo(e.centerHeader.tabLabel,n,D.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),d=zv(e.tabs,n,e.focusedRegion==="center"),u=" engaged ",p=u.length+2,h=e.inputMode==="terminal"?Sr(`${u}\u25CF `,n,D.panelBg):"",m=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Ne(d)-p)):"";return[{text:e.inputMode==="terminal"?`${d}${m}${h}`:d},{text:l,tone:"muted"},{text:c},dt()]}function Vv(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},dt(),{text:e.terminal.error},dt(),{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(lg)}function lg(e){return{text:Iu(e.segments),segments:e.segments,fullBleed:!0}}function Kv(e,t,n,r){let s=e.rightInspection?Gv(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):As([{text:"CONTEXT"},dt(),...e.rightContext.map(i=>Jv(i,r)),...e.actionMessage?[dt(),{text:e.actionMessage}]:[]],n);return As(s,n)}function Gv(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:cC(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>Qh(a)),...r.slice(o,o+s).map(a=>Qh(a))]}function Qh(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 Hv(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${Sr("\u25CF",n,e.selected?D.panelSelected:D.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((m,f)=>m+Ne(f.text),0):0,l=t-Ne(i)-Ne(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",d=e.selected?e.text:e.focused?Sr(e.text,n,D.panelBg):e.panelHeader?Mo(e.text,n,D.panelMuted):e.text,u=St(`${r}${c}${d}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let m=`${r}${e.selected?"\u25B8":" "} `,f=u.slice(m.length+2),y=[{text:m},cg(e.activity,e.activityAnimationFrame??0),{text:` ${f}${i}${o}`},...e.prBadge??[]];return{text:Iu(y),segments:y,tone:p}}if(e.prBadge){let m=[{text:`${u}${i}${o}`},...e.prBadge];return{text:`${u}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:m,tone:p}}return{text:`${u}${i}${o}`,tone:p}}function Yv(e){let t=e.map(r=>{let s=r.health>=1,i=parseInt(r.count,10),o=i>1?` (${i})`:"";return{text:`${s?"\u25CF":"\u25CB"} ${r.name}${o}`,active:s}}),n=[];for(let r=0;r<t.length;r++){let s=t[r];r>0&&n.push({text:" "}),s.active?n.push({text:s.text,style:{fg:D.success.fg}}):n.push({text:s.text,style:{fg:D.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function zv(e,t,n){return e.map(r=>{let s=r.active?n?Sr(r.label,t,D.panelBg):Mo(r.label,t,D.panelBg):vu(r.label,t,D.panelBg),i=r.activity?Su(cg(r.activity,r.activityAnimationFrame??0),t,D.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function cg(e,t){return{text:"\u25CF",style:{fg:e==="working"?ku[t%ku.length]??ku[0]:e==="ready"?D.success.fg:e==="error"?D.error.fg:D.panelMuted.fg}}}function Jv(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?vu(e.value,t,D.panelBg):e.value}`}}function Fo(e,t,n,r){let s=Xv(r,e.tone??"default"),i=Qv(e,n,s);if(r==="left"){if(e.fullBleed)return re(St(i,t),n,s);let a=t-_o-xo;if(e.rightAlign){let c=Ne(i),d=Math.max(0,a-c),u=`${" ".repeat(_o)}${" ".repeat(d)}${i}${" ".repeat(xo)}`;return re(u,n,s)}let l=`${" ".repeat(_o)}${St(i,a)}${" ".repeat(xo)}`;return re(l,n,s)}return r==="center"&&e.fullBleed?Zv(e,t,n,s):re(St(` ${i}`,t),n,s)}function Xv(e,t){return t==="selected"||t==="focused"?D.panelSelected:t==="muted"?D.panelMuted:D.panelBg}function As(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(dt());return n}function dt(){return{text:""}}function Qv(e,t,n){return e.segments?e.segments.map(r=>Su(r,t,n)).join(""):e.text}function Zv(e,t,n,r){let s=" ".repeat(Lo),i=Math.max(0,t-Lo*2);if(!e.segments)return re(`${s}${St(e.text,i)}${s}`,n,r);let o=nC(e.segments,i),a=`${s}${o.map(l=>Su(l,n,r)).join("")}${s}${n?bu:""}`;return re(a,n,r)}function Su(e,t,n){let r=e.href?`${ug(e.href)}${e.text}${bu}`:eC(e.text);return!t||!e.style?r:`${Es(iC(e.style,n))}${oC(e.style)}${r}${Tu}${Es(n)}`}function eC(e){return e.replace(Fv,t=>{let[n,r]=tC(t);return`${ug(n)}${n}${bu}${r}`})}function tC(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function ug(e){return`\x1B]8;;${e}\x1B\\`}function nC(e,t){let n=rC(e,t);return sC(n,t)}function rC(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=Ne(s.text);if(i<=r){n.push(s),r-=i;continue}let o=qo(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function sC(e,t){let n=Ne(Iu(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 iC(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 oC(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 aC(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 dg(e,t){let n=Math.max(0,t-Ne(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function St(e,t){let n=Ne(e);return n>=t?lC(e,t):e+" ".repeat(t-n)}function lC(e,t){if(t<=0)return"";if(Ne(e)<=t)return e;let n=fg(e);return qo(n,Math.max(0,t-1))+"\u2026"}function Ne(e){let t=0;for(let n of Array.from(fg(e)))t+=pg(n);return t}function qo(e,t){let n="",r=0;for(let s of Array.from(e)){let i=pg(s);if(r+i>t)break;n+=s,r+=i}return n}function pg(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 cC(e,t,n){return Math.min(Math.max(e,t),n)}function fg(e){return e.replace(Lv,"").replace(_v,"")}function Iu(e){return e.map(t=>t.text).join("")}function re(e,t,n){if(!t)return e;let r=Es(n),s=e.replace(xv,`${Tu}${r}`);return`${r}${s}${Tu}`}function Es(e){let t=[];return e.fg&&t.push(`38;2;${Zh(e.fg).join(";")}`),e.bg&&t.push(`48;2;${Zh(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function Zh(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function Sr(e,t,n){return Uo(e,t,D.success.fg,n)}function uC(e,t,n){return Uo(e,t,D.error.fg,n)}function Mo(e,t,n){return Uo(e,t,D.accent.fg,n)}function vu(e,t,n){return Uo(e,t,D.mutedfg.fg,n)}function Uo(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${Es(s)}${e}${Es(r)}`}function mg(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"?pC(s,r?.runner):[],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:dC(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function dC(e,t){let n=(e??"").split(Cu.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(Cu.delimiter):[...n,t].join(Cu.delimiter)}function pC(e,t){let n=e.command.length>0?e.command:["codex"];return wo(n,e.runner??t??"codex")}function hg(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 dn(e){return{columns:Math.max(20,e.width-Z.leftWidth-Z.rightWidth-Z.dividerWidth-Lo*2),rows:Math.max(5,e.height-Z.topRailHeight-5)}}function gg(e){return e.length===1||ut(e)||e==="BACKSPACE"||e==="TAB"}function Ut(e){return typeof e=="string"&&new RegExp(`:(?:agent|${ue.join("|")})(?:-\\d+)?$`).test(e)}function yg(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 Au(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function wg(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 Os(e){return Tg.includes(e)?"SHIFT_ENTER":null}function Eu(e){return Tg.some(t=>t.startsWith(e))}function kg(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var Tg=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function bg(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
266
266
  `||n===`\r
267
- `)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function Tg(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function bg(e,t=null){let n=t?.split(`
267
+ `)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function Rg(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function Pg(e,t=null){let n=t?.split(`
268
268
  `)??[];return e.split(`
269
- `).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function Uo(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{createServer as nA,createConnection as Dg}from"node:net";import{mkdir as rA,readFile as _g,rm as Ns,writeFile as sA}from"node:fs/promises";import iA from"node:path";import{setTimeout as TC}from"node:timers/promises";var pn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=Au(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:Au(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=Au(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 Au(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as Rg,readFile as cC,rm as Eu,stat as uC,writeFile as dC}from"node:fs/promises";import Ou from"node:path";async function $u(e){let t=Ou.join(e.runtimeDir,"orchestration-supervisor.lock");await Rg(e.runtimeDir,{recursive:!0});try{await Rg(t)}catch(r){if(!fC(r))throw r;let s=await cC(Ou.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await uC(t).catch(()=>null);if(typeof s?.pid=="number"&&!pC(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await Eu(t,{recursive:!0,force:!0}),$u(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await dC(Ou.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await Eu(t,{recursive:!0,force:!0}),r}let n=!1;return{async release(){n||(n=!0,await Eu(t,{recursive:!0,force:!0}))}}}function pC(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 fC=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var mC="\x1B[200~",hC="\x1B[201~";function Pg(e,t){switch(e){case"codex":return Wo(t,50);case"cursor":return Wo(t,50);case"claude":return Wo(t,50);case"pi":return Wo(t,50);default:return gC(e)}}function Wo(e,t){return{paste:`${mC}${e}${hC}`,submit:"\r",submitDelayMs:t}}function gC(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import yC from"node:path";var wC={type:"system",component:"orchestration-supervisor"};async function Sg(e){let t=yC.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Fs(t)??{version:1,commands:{}},r=await He(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of kC(i))o.has(a)||(await In(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:wC),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await q(t,n)}function kC(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 Bo=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new pn({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 $u(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 bo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await Sg(this.paths);let t=await He(this.paths);for(let n of t){if(await this.reconcileInitialPromptTask(n),n.state==="delivering"){await this.failCommand(n,$s("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 bo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await this.failCommand(t,$s("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let n=await P.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,$s("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,$s("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(!this.runtime.hasRunningSession(t.agentTabId)||t.delivery==="when-ready"&&Yt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")return;await ae.beginDelivery(this.paths,t.id);try{let o=Pg(r.runner??n.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,o.paste),await TC(o.submitDelayMs),this.runtime.writeToSession(t.agentTabId,o.submit)}catch(o){await this.failCommand(t,$s("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(!bC(t)||t.state==="queued"||t.state==="delivering")return;let n=await P.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 P.markTaskStarted(this.paths,n.id);return}n.runnerSession.lastKnownState!=="failed"&&await P.recordStartupFailure(this.paths,n.id,t.lastError?.message??`Initial prompt ${t.state}.`)}}},bC=e=>e.idempotencyKey===`task-start:${e.taskId}`,$s=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var RC={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},Ir=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...RC,...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 Be,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=PC(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(SC);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 PC(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 SC(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as IC}from"node:fs";var Vo=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=Ot(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=IC(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 vC={selectedTaskId:null,reviewVisible:!1},CC={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))))},Ko=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??CC,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new Ir({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new Vo(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=EC(s);i.length>0&&await this.onTasksChanged(i);let o=AC(s);o.length>0&&await this.wake(o)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new pn({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=vC;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,Ig(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)!==Ig(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 AC(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=NC(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&$C.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 EC(e){let t=new Set;for(let n of e)n.taskId&&OC(n)&&t.add(n.taskId);return[...t]}function OC(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var $C=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),NC=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function Ig(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as WC}from"node:module";import DC from"@xterm/headless";var _C=1e3,xC=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function Cg(e){return new DC.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:_C,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}})}function Ag(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function Du(e,t){return new Promise(n=>{e.write(t,n)})}function Eg(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:MC(u,o+a===i&&d===n.cursorX)})}r.push({segments:FC(LC(c))})}return r}function FC(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&UC(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 LC(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 MC(e,t){let n={},r=vg(e,"fg"),s=vg(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 vg(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"):xC[s]??jC(s)}function jC(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(qC).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 qC(e){return e===0?0:55+e*40}function UC(e,t){return Nu(e)===Nu(t)}function Nu(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 Nu(e)===""}var BC=WC(import.meta.url),VC=/^CTRL_([A-Z])$/,KC="\x1B[6n",GC="\x1B[c",HC="\x1B[?u",YC={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
270
- `,TAB:" ",SHIFT_TAB:"\x1B[Z",BACK_TAB:"\x1B[Z",BACKSPACE:"\x7F",DELETE:"\x1B[3~",ESCAPE:"\x1B",UP:"\x1B[A",DOWN:"\x1B[B",RIGHT:"\x1B[C",LEFT:"\x1B[D",HOME:"\x1B[H",END:"\x1B[F",PAGE_UP:"\x1B[5~",PAGE_DOWN:"\x1B[6~",CTRL_C:"",CTRL_D:""},Go=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")_u(i),this.sessions.delete(n);else return this.attachedTabId=n,i.scrollbackLines=0,$g(i,r),this.getViewState(n);let o;try{o=this.createSession(t,n,r,s)}catch(a){throw this.recordActivity({taskId:t,tabId:n,sessionState:"failed",lastActivityAt:Date.now(),exitCode:null,error:a instanceof Error?a.message:String(a)}),a}return this.sessions.set(n,o),this.notifyActivity(o),this.attachedTabId=n,this.getViewState(n)}write(t){let n=this.getAttachedSession();!n||n.status!=="running"||(n.pty.write(t),(t.includes("\r")||t.includes(`
271
- `))&&this.touchActivity(n))}writeKey(t){let n=zC(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&&$g(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&&(_u(n),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())_u(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:JC(n),error:n.error,scrolledBack:n.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}createSession(t,n,r,s){let i=this.spawn??QC().spawn,o=Cg(r),a=s??this.resolveSessionSpec(t,n),l=fo({...this.env,...a.env??{}}),{executable:c,args:d}=ZC(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:eA(l)}),p={taskId:t,tabId:n,pty:u,terminal:o,status:"running",error:null,disposables:[],scrollbackLines:0,rows:[],renderedScrollbackLines:null,screenDirty:!0,lastActivityAt:Date.now(),exitCode:null};return p.disposables.push(u.onData(h=>{this.touchActivity(p),tA(u,h),Du(p.terminal,h).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p.disposables.push(u.onExit(h=>{p.status="exited",p.exitCode=h.exitCode,p.lastActivityAt=Date.now(),this.notifyActivity(p),Du(p.terminal,`\r
272
- [process exited ${h.exitCode}]`).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p}getAttachedSession(){return this.attachedTabId?this.sessions.get(this.attachedTabId)??null:null}touchActivity(t){t.lastActivityAt=Date.now(),this.activityEnabled&&this.notifyActivity(t)}notifyActivity(t){this.activityEnabled&&this.recordActivity(this.buildActivitySnapshot(t))}recordActivity(t){this.activityEnabled&&(this.activitySnapshots.set(t.tabId,t),this.onActivity?.(t))}removeActivity(t){this.activitySnapshots.delete(t)&&this.onActivityRemoved?.(t)}buildActivitySnapshot(t){return{taskId:t.taskId,tabId:t.tabId,sessionState:t.status==="failed"?"failed":t.status==="exited"?"exited":"running",lastActivityAt:t.lastActivityAt,exitCode:t.exitCode,error:t.error}}};function zC(e){if(e.length===1)return e;let t=YC[e];if(t!==void 0)return t;let n=VC.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function $g(e,t){XC(e.pty,t),Ag(e.terminal,t),e.screenDirty=!0}function JC(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=Eg(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function _u(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function XC(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function QC(){return BC("node-pty")}function ZC(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[mo(t[0],n),...t.slice(1)].map(Ng).join(" ")}; exec ${Ng(e)} -l`;return{executable:e,args:["-lc",s]}}function Ng(e){return`'${e.replaceAll("'","'\\''")}'`}function eA(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 tA(e,t){for(let n=0;n<xu(t,KC);n+=1)e.write("\x1B[1;1R");for(let n=0;n<xu(t,GC);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<xu(t,HC);n+=1)e.write("\x1B[?0u")}function xu(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 Ho=Pn,oA=16,aA=250;async function xg(e){let t=_e(e.paths);await dA(t,e.paths,e.spawnDaemon);let n=await Bg(t.socketPath),r=new Fu(n,e);return await r.ready(),r}async function Fg(e,t={}){let n=_e(e);await rA(e.runtimeDir,{recursive:!0}),await Ns(n.socketPath,{force:!0});let r=new Lu(e,t),s=nA(i=>r.handleConnection(i));try{await r.start(),await hA(s,n.socketPath),await sA(n.pidPath,String(process.pid),"utf8"),await de.appendLogBestEffort(e,{level:"info",component:"daemon",event:"started",message:`PTY daemon started with protocol ${Ho}.`,details:{pid:process.pid,protocolVersion:Ho}}),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 de.appendLogBestEffort(e,{level:"error",component:"daemon",event:"failed",message:i instanceof Error?i.message:String(i),details:{pid:process.pid}}),i}finally{await de.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 Ns(n.socketPath,{force:!0}),await Ns(n.pidPath,{force:!0}),await r.stop(),r.disposeAll()}}async function Lg(e){let t=_e(e);return await qg(t.socketPath)?(await mA(t.socketPath),!0):!1}var Fu=class{constructor(t,n){this.socket=t;this.options=n,this.activityEnabled=n.activityEnabled??!1,this.tasksChangedHandler=n.onTasksChanged,this.openFileHandler=n.onOpenFile,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;openFileHandler;buffer="";closed=!1;protocolVersion=Ho;options;async ready(){let t=await this.send({type:"ping"});if(!jg(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.protocolVersion>=10&&await this.send({type:"subscribeNavigation"}),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"&&de.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}setOpenFileHandler(t){this.openFileHandler=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
+ `).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function Wo(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{createServer as aA,createConnection as Fg}from"node:net";import{mkdir as lA,readFile as Mg,rm as Ns,writeFile as cA}from"node:fs/promises";import uA from"node:path";import{setTimeout as SC}from"node:timers/promises";var pn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=Ou(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:Ou(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=Ou(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 Ou(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as Sg,readFile as fC,rm as $u,stat as mC,writeFile as hC}from"node:fs/promises";import Nu from"node:path";async function Du(e){let t=Nu.join(e.runtimeDir,"orchestration-supervisor.lock");await Sg(e.runtimeDir,{recursive:!0});try{await Sg(t)}catch(r){if(!yC(r))throw r;let s=await fC(Nu.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await mC(t).catch(()=>null);if(typeof s?.pid=="number"&&!gC(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await $u(t,{recursive:!0,force:!0}),Du(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await hC(Nu.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await $u(t,{recursive:!0,force:!0}),r}let n=!1;return{async release(){n||(n=!0,await $u(t,{recursive:!0,force:!0}))}}}function gC(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 yC=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var wC="\x1B[200~",kC="\x1B[201~";function Ig(e,t){switch(e){case"codex":return Bo(t,50);case"cursor":return Bo(t,50);case"claude":return Bo(t,50);case"pi":return Bo(t,50);default:return TC(e)}}function Bo(e,t){return{paste:`${wC}${e}${kC}`,submit:"\r",submitDelayMs:t}}function TC(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import bC from"node:path";var RC={type:"system",component:"orchestration-supervisor"};async function vg(e){let t=bC.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Ls(t)??{version:1,commands:{}},r=await He(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of PC(i))o.has(a)||(await In(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:RC),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await q(t,n)}function PC(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 Vo=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new pn({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 Du(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 Ro(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await vg(this.paths);let t=await He(this.paths);for(let n of t){if(await this.reconcileInitialPromptTask(n),n.state==="delivering"){await this.failCommand(n,$s("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 Ro(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await this.failCommand(t,$s("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let n=await P.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,$s("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,$s("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(!this.runtime.hasRunningSession(t.agentTabId)||t.delivery==="when-ready"&&Yt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")return;await ae.beginDelivery(this.paths,t.id);try{let o=Ig(r.runner??n.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,o.paste),await SC(o.submitDelayMs),this.runtime.writeToSession(t.agentTabId,o.submit)}catch(o){await this.failCommand(t,$s("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(!IC(t)||t.state==="queued"||t.state==="delivering")return;let n=await P.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 P.markTaskStarted(this.paths,n.id);return}n.runnerSession.lastKnownState!=="failed"&&await P.recordStartupFailure(this.paths,n.id,t.lastError?.message??`Initial prompt ${t.state}.`)}}},IC=e=>e.idempotencyKey===`task-start:${e.taskId}`,$s=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var vC={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},Ir=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...vC,...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 Be,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=CC(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(AC);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 CC(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 AC(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as EC}from"node:fs";var Ko=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=Ot(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=EC(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 OC={selectedTaskId:null,reviewVisible:!1},$C={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))))},Go=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??$C,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new Ir({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new Ko(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=DC(s);i.length>0&&await this.onTasksChanged(i);let o=NC(s);o.length>0&&await this.wake(o)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new pn({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=OC;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,Cg(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)!==Cg(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 NC(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=LC(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&xC.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 DC(e){let t=new Set;for(let n of e)n.taskId&&_C(n)&&t.add(n.taskId);return[...t]}function _C(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var xC=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),LC=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function Cg(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as HC}from"node:module";import MC from"@xterm/headless";var FC=new RegExp("^\x1B\\[(\\d*)S$"),Ho=class{constructor(t){this.terminal=t;t.onResize(()=>{this.top=0,this.bottom=null}),t.parser.registerCsiHandler({final:"r"},n=>{if(t.buffer.active.type!=="normal")return!1;let r=Number(n[0]||1)-1,s=Math.min(Number(n[1]||t.rows),t.rows)-1;return r>=0&&r<s&&s<t.rows&&(this.top=r,this.bottom=s),!1});for(let n of["h","l"])t.parser.registerCsiHandler({prefix:"?",final:n},r=>(t.buffer.active.type==="normal"&&r.includes(6)&&(this.originMode=n==="h"),!1));t.parser.registerEscHandler({final:"c"},()=>(this.top=0,this.bottom=null,this.originMode=!1,!1)),t.parser.registerCsiHandler({intermediates:"!",final:"p"},()=>(t.buffer.active.type==="normal"&&(this.top=0,this.bottom=null,this.originMode=!1),!1))}terminal;top=0;bottom=null;originMode=!1;state="text";pending="";queue=Promise.resolve();write(t){return this.queue=this.queue.then(()=>this.writeChunk(t)),this.queue}async writeChunk(t){let n="";for(let r of t){if(this.state==="string"||this.state==="stringEscape"){n+=r,r==="\x07"||this.state==="stringEscape"&&r==="\\"?this.state="text":this.state=r==="\x1B"?"stringEscape":"string";continue}if(this.state==="text"){r==="\x1B"?(this.pending=r,this.state="escape"):n+=r;continue}if(this.pending+=r,this.state==="escape"){r==="["?this.state="csi":("]PX^_".includes(r)?this.state="string":this.state="text",n+=this.pending,this.pending="");continue}if(r<"@"||r>"~")continue;let s=this.pending;this.pending="",this.state="text";let i=FC.exec(s);if(!i){n+=s;continue}await this.writeRaw(n),n="",await this.scrollUp(s,Number(i[1])||1)}await this.writeRaw(n)}async scrollUp(t,n){let r=this.terminal;if(r.buffer.active.type!=="normal"||this.top!==0){await this.writeRaw(t);return}let s=Math.min(this.bottom??r.rows-1,r.rows-1),{cursorX:i,cursorY:o}=r.buffer.active,a=Math.min(n,s+1),l=this.originMode?"\x1B[?6l":"",c=this.originMode?"\x1B[?6h":"";await this.writeRaw(`${l}\x1B[${s+1};1H${`
270
+ `.repeat(a)}${c}\x1B[${o+1};${i+1}H`)}writeRaw(t){return t?new Promise(n=>this.terminal.write(t,n)):Promise.resolve()}};function Ag(e,t){let n=t;if(!n.hasExtendedAttrs?.())return;let r=n.extended?.urlId;if(!r)return;let s=e._core?._oscLinkService?.getLinkData(r)?.uri;if(!(!s||!/^(https?:|file:|mailto:)/i.test(s))&&![...s].some(i=>i.charCodeAt(0)<32||i.charCodeAt(0)>=127&&i.charCodeAt(0)<=159))return s}var jC=1e3,Og=new WeakMap,qC=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function $g(e){let t=new MC.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:jC,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}});return Og.set(t,new Ho(t)),t}function Ng(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function xu(e,t){let n=Og.get(e);return n?n.write(t):new Promise(r=>{e.write(t,r)})}function Dg(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);if(!u||u.getWidth()===0)continue;let p=Ag(e,u);c.push({text:u.getChars()||" ",style:BC(u,o+a===i&&d===n.cursorX),...p?{href:p}:{}})}r.push({segments:UC(WC(c))})}return r}function UC(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&r.href===n.href&&GC(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};n.href&&(s.href=n.href),_g(n.style)||(s.style=n.style),t.push(s)}return t}function WC(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||n.href||!_g(n.style))break;t-=1}return e.slice(0,t)}function BC(e,t){let n={},r=Eg(e,"fg"),s=Eg(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 Eg(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"):qC[s]??VC(s)}function VC(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(KC).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 KC(e){return e===0?0:55+e*40}function GC(e,t){return _u(e)===_u(t)}function _u(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function _g(e){return _u(e)===""}var YC=HC(import.meta.url),zC=/^CTRL_([A-Z])$/,JC="\x1B[6n",XC="\x1B[c",QC="\x1B[?u",ZC={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
271
+ `,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:""},Yo=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")Lu(i),this.sessions.delete(n);else return this.attachedTabId=n,i.scrollbackLines=0,xg(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(`
272
+ `))&&this.touchActivity(n))}writeKey(t){let n=eA(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&&xg(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&&(Lu(n),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())Lu(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:tA(n),error:n.error,scrolledBack:n.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}createSession(t,n,r,s){let i=this.spawn??rA().spawn,o=$g(r),a=s??this.resolveSessionSpec(t,n),l=fo({...this.env,...a.env??{}}),{executable:c,args:d}=sA(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:iA(l)}),p={taskId:t,tabId:n,pty:u,terminal:o,status:"running",error:null,disposables:[],scrollbackLines:0,rows:[],renderedScrollbackLines:null,screenDirty:!0,lastActivityAt:Date.now(),exitCode:null};return p.disposables.push(u.onData(h=>{this.touchActivity(p),oA(u,h),xu(p.terminal,h).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p.disposables.push(u.onExit(h=>{p.status="exited",p.exitCode=h.exitCode,p.lastActivityAt=Date.now(),this.notifyActivity(p),xu(p.terminal,`\r
273
+ [process exited ${h.exitCode}]`).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p}getAttachedSession(){return this.attachedTabId?this.sessions.get(this.attachedTabId)??null:null}touchActivity(t){t.lastActivityAt=Date.now(),this.activityEnabled&&this.notifyActivity(t)}notifyActivity(t){this.activityEnabled&&this.recordActivity(this.buildActivitySnapshot(t))}recordActivity(t){this.activityEnabled&&(this.activitySnapshots.set(t.tabId,t),this.onActivity?.(t))}removeActivity(t){this.activitySnapshots.delete(t)&&this.onActivityRemoved?.(t)}buildActivitySnapshot(t){return{taskId:t.taskId,tabId:t.tabId,sessionState:t.status==="failed"?"failed":t.status==="exited"?"exited":"running",lastActivityAt:t.lastActivityAt,exitCode:t.exitCode,error:t.error}}};function eA(e){if(e.length===1)return e;let t=ZC[e];if(t!==void 0)return t;let n=zC.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function xg(e,t){nA(e.pty,t),Ng(e.terminal,t),e.screenDirty=!0}function tA(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=Dg(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function Lu(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function nA(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function rA(){return YC("node-pty")}function sA(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[mo(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 iA(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 oA(e,t){for(let n=0;n<Fu(t,JC);n+=1)e.write("\x1B[1;1R");for(let n=0;n<Fu(t,XC);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<Fu(t,QC);n+=1)e.write("\x1B[?0u")}function Fu(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 zo=Pn,dA=16,pA=250;async function jg(e){let t=_e(e.paths);await gA(t,e.paths,e.spawnDaemon);let n=await Hg(t.socketPath),r=new Mu(n,e);return await r.ready(),r}async function qg(e,t={}){let n=_e(e);await lA(e.runtimeDir,{recursive:!0}),await Ns(n.socketPath,{force:!0});let r=new ju(e,t),s=aA(i=>r.handleConnection(i));try{await r.start(),await TA(s,n.socketPath),await cA(n.pidPath,String(process.pid),"utf8"),await de.appendLogBestEffort(e,{level:"info",component:"daemon",event:"started",message:`PTY daemon started with protocol ${zo}.`,details:{pid:process.pid,protocolVersion:zo}}),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 de.appendLogBestEffort(e,{level:"error",component:"daemon",event:"failed",message:i instanceof Error?i.message:String(i),details:{pid:process.pid}}),i}finally{await de.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 Ns(n.socketPath,{force:!0}),await Ns(n.pidPath,{force:!0}),await r.stop(),r.disposeAll()}}async function Ug(e){let t=_e(e);return await Vg(t.socketPath)?(await kA(t.socketPath),!0):!1}var Mu=class{constructor(t,n){this.socket=t;this.options=n,this.activityEnabled=n.activityEnabled??!1,this.tasksChangedHandler=n.onTasksChanged,this.openFileHandler=n.onOpenFile,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;openFileHandler;buffer="";closed=!1;protocolVersion=zo;options;async ready(){let t=await this.send({type:"ping"});if(!Bg(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.protocolVersion>=10&&await this.send({type:"subscribeNavigation"}),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"&&de.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}setOpenFileHandler(t){this.openFileHandler=t}disposeSession(t){this.viewCache.delete(t),this.removeCachedActivity(t),this.attachedTabId===t&&(this.attachedTabId=null),this.send({type:"disposeSession",tabId:t}).catch(()=>{})}disposeAll(){this.attachedTabId=null,!this.closed&&(this.socket.end(),this.closed=!0)}getViewState(t){return t?this.viewCache.get(t)??{status:"idle",rows:[],error:null,scrolledBack:!1}:{status:"idle",rows:[],error:null,scrolledBack:!1}}getActivitySnapshots(){return[...this.activityCache.values()]}async requestShutdown(){await this.send({type:"shutdown"})}async send(t){if(this.closed)throw new Error("Craig PTY daemon connection is closed.");let n=this.nextRequestId;this.nextRequestId+=1;let r={...t,id:n},s=new Promise((o,a)=>{this.pending.set(n,{resolve:o,reject:a})});if(this.socket.destroyed)throw this.pending.delete(n),new Error("Craig PTY daemon connection is closed.");this.socket.write(`${JSON.stringify(r)}
273
274
  `);let i=await s;if(!i.ok)throw new Error(i.error);return i}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
274
275
  `);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
275
- `)}}handleMessage(t){if(t.trim().length===0)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n){let r=this.pending.get(n.id);if(!r)return;this.pending.delete(n.id),r.resolve(n);return}if(n.type==="update"){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=uA(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),n.type==="openFile"&&this.openFileHandler?.(n.path)}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)}}},Lu=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 Go({...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 T.load(this.paths);if(this.pullRequestSyncOptions!==!1){let r=this.pullRequestSyncOptions??{},s=r.reconcileEvents===!1?!1:r.reconcileEvents??(()=>on(this.paths,{agentObserver:{daemonAvailable:!0,getSnapshots:()=>this.runtime.getActivitySnapshots(),subscribe:()=>()=>{},close:()=>{}}}));this.pullRequestEventReconciliationEnabled=!!s,this.pullRequestSyncSupervisor=new Ko(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 de.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 He(this.paths)).some(r=>r.state==="queued"||r.state==="delivering");(T.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},navigationEnabled:!1}),t.setEncoding("utf8"),t.on("data",s=>{n+=String(s);let i=n.indexOf(`
276
+ `)}}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=hA(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),n.type==="openFile"&&this.openFileHandler?.(n.path)}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)}}},ju=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 Yo({...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 T.load(this.paths);if(this.pullRequestSyncOptions!==!1){let r=this.pullRequestSyncOptions??{},s=r.reconcileEvents===!1?!1:r.reconcileEvents??(()=>on(this.paths,{agentObserver:{daemonAvailable:!0,getSnapshots:()=>this.runtime.getActivitySnapshots(),subscribe:()=>()=>{},close:()=>{}}}));this.pullRequestEventReconciliationEnabled=!!s,this.pullRequestSyncSupervisor=new Go(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 de.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 He(this.paths)).some(r=>r.state==="queued"||r.state==="delivering");(T.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},navigationEnabled:!1}),t.setEncoding("utf8"),t.on("data",s=>{n+=String(s);let i=n.indexOf(`
276
277
  `);for(;i!==-1;){let o=n.slice(0,i);n=n.slice(i+1),this.handleLine(t,o),i=n.indexOf(`
277
- `)}});let r=()=>{this.clients.delete(t),this.subscriptions.delete(t),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()),this.hasActivitySubscribers()||(this.updateRuntimeActivityEnabled(),this.clearPendingActivityBroadcasts())};t.on("close",r),t.on("error",r)}disposeAll(){for(let t of this.updateTimers.values())clearTimeout(t);this.updateTimers.clear();for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear(),this.runtime.disposeAll()}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{fn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);fn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion:Ho,sessionCount:this.runtime.sessionTabIds().length}:{},...r.type==="getActivitySnapshots"?{activities:this.runtime.getActivitySnapshots()}:{},...typeof s=="number"?{deliveredCount:s}:s?{view:s}:{}})}catch(s){let i=s instanceof Error?s.message:String(s);fn(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"subscribeNavigation":{let r=this.subscriptions.get(t);return r&&this.subscriptions.set(t,{...r,navigationEnabled:!0}),null}case"openFile":return this.broadcastOpenFile(t,n.path);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 yA(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(Mu),pullRequestPollView:s?.pullRequestPollView??{selectedTaskId:null,reviewVisible:!1},navigationEnabled:s?.navigationEnabled??!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)fn(n,{type:"tasksChanged",taskIds:t})}broadcastOpenFile(t,n){let r=0;for(let[s,i]of this.subscriptions)s===t||!i.navigationEnabled||(fn(s,{type:"openFile",path:n}),r+=1);return r}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)},aA))}}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&&fn(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&&fn(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 Bo(this.paths,this.runtime,{onError:n=>de.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor",message:n instanceof Error?n.message:String(n)})});try{return await t.start(),await de.appendLogBestEffort(this.paths,{level:"info",component:"orchestration",event:"supervisor.started",message:"Orchestration supervisor is ready."}),t}catch(n){throw await de.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){de.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)},oA))}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=lA(s,n),o=cA(s.view,n);s.view=n,s.rowKeys=n.rows.map(Mu),(i.rows.length>0||o)&&fn(r,{type:"update",tabId:t,patch:i})}}};function lA(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==Mu(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 cA(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 uA(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function Mu(e){return JSON.stringify(e)}async function dA(e,t,n){if(await pA(e.socketPath,1e3))return;if(await qg(e.socketPath)){let i=await Ug(e.socketPath).catch(()=>null),o=i?.ok?i.protocolVersion??"unknown":"unknown",a=i?.ok?i.sessionCount??"unknown":"unknown";throw await de.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 fA(e,t),ho(t,n);let r=Date.now();for(;Date.now()-r<5e3;){if(await Mg(e.socketPath))return;await Vg(50)}let s=await _g(iA.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${s?`
278
- ${s.slice(-2e3)}`:""}`)}async function Mg(e){let t=await Ug(e).catch(()=>null);return t?.ok===!0&&jg(t.protocolVersion)}function jg(e){return zt(e)}async function pA(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await Mg(e))return!0;await Vg(50)}return!1}async function fA(e,t){let n=await _g(e.pidPath,"utf8").catch(()=>null);if(n){let r=Number(n.trim());if(Number.isInteger(r)&&r>0&&gA(r))return;await de.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 Ns(e.socketPath,{force:!0}),await Ns(e.pidPath,{force:!0})}async function qg(e){let t=await Bg(e).catch(()=>null);return t?(t.end(),!0):!1}async function mA(e){await Wg(e,{id:1,type:"shutdown"}).catch(()=>null)}async function Ug(e){return Wg(e,{id:1,type:"ping"})}function Wg(e,t){return new Promise((n,r)=>{let s=Dg(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)}
278
+ `)}});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{fn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);fn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion:zo,sessionCount:this.runtime.sessionTabIds().length}:{},...r.type==="getActivitySnapshots"?{activities:this.runtime.getActivitySnapshots()}:{},...typeof s=="number"?{deliveredCount:s}:s?{view:s}:{}})}catch(s){let i=s instanceof Error?s.message:String(s);fn(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"subscribeNavigation":{let r=this.subscriptions.get(t);return r&&this.subscriptions.set(t,{...r,navigationEnabled:!0}),null}case"openFile":return this.broadcastOpenFile(t,n.path);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 RA(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(qu),pullRequestPollView:s?.pullRequestPollView??{selectedTaskId:null,reviewVisible:!1},navigationEnabled:s?.navigationEnabled??!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)fn(n,{type:"tasksChanged",taskIds:t})}broadcastOpenFile(t,n){let r=0;for(let[s,i]of this.subscriptions)s===t||!i.navigationEnabled||(fn(s,{type:"openFile",path:n}),r+=1);return r}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)},pA))}}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&&fn(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&&fn(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 Vo(this.paths,this.runtime,{onError:n=>de.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor",message:n instanceof Error?n.message:String(n)})});try{return await t.start(),await de.appendLogBestEffort(this.paths,{level:"info",component:"orchestration",event:"supervisor.started",message:"Orchestration supervisor is ready."}),t}catch(n){throw await de.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){de.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)},dA))}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=fA(s,n),o=mA(s.view,n);s.view=n,s.rowKeys=n.rows.map(qu),(i.rows.length>0||o)&&fn(r,{type:"update",tabId:t,patch:i})}}};function fA(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==qu(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 mA(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 hA(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function qu(e){return JSON.stringify(e)}async function gA(e,t,n){if(await yA(e.socketPath,1e3))return;if(await Vg(e.socketPath)){let i=await Kg(e.socketPath).catch(()=>null),o=i?.ok?i.protocolVersion??"unknown":"unknown",a=i?.ok?i.sessionCount??"unknown":"unknown";throw await de.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 wA(e,t),ho(t,n);let r=Date.now();for(;Date.now()-r<5e3;){if(await Wg(e.socketPath))return;await Yg(50)}let s=await Mg(uA.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${s?`
279
+ ${s.slice(-2e3)}`:""}`)}async function Wg(e){let t=await Kg(e).catch(()=>null);return t?.ok===!0&&Bg(t.protocolVersion)}function Bg(e){return zt(e)}async function yA(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await Wg(e))return!0;await Yg(50)}return!1}async function wA(e,t){let n=await Mg(e.pidPath,"utf8").catch(()=>null);if(n){let r=Number(n.trim());if(Number.isInteger(r)&&r>0&&bA(r))return;await de.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 Ns(e.socketPath,{force:!0}),await Ns(e.pidPath,{force:!0})}async function Vg(e){let t=await Hg(e).catch(()=>null);return t?(t.end(),!0):!1}async function kA(e){await Gg(e,{id:1,type:"shutdown"}).catch(()=>null)}async function Kg(e){return Gg(e,{id:1,type:"ping"})}function Gg(e,t){return new Promise((n,r)=>{let s=Fg(e),i="",o=setTimeout(()=>{s.destroy(),r(new Error("Craig PTY daemon request timed out."))},500),a=()=>clearTimeout(o);s.setEncoding("utf8"),s.once("connect",()=>s.write(`${JSON.stringify(t)}
279
280
  `)),s.once("error",l=>{a(),r(l)}),s.on("data",l=>{i+=String(l);let c=i.indexOf(`
280
- `);if(c===-1)return;let d=i.slice(0,c);a(),s.end();try{n(JSON.parse(d))}catch(u){r(u instanceof Error?u:new Error(String(u)))}}),s.once("close",()=>a())})}function Bg(e){return new Promise((t,n)=>{let r=Dg(e);r.once("connect",()=>t(r)),r.once("error",n)})}function hA(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,n)})}function fn(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
281
- `)}catch{}}function gA(e){try{return process.kill(e,0),!0}catch{return!1}}function Vg(e){return new Promise(t=>setTimeout(t,e))}function yA(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var qu=["Runners","Feature Previews","Logs","Help"],Gg={agentOrchestration:"Agent orchestration",fileOpen:"Agent file opening",piRunner:"Pi coding agent runner"};function Uu(e,t){return ju(e).map(n=>{let r=T.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 Hg(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 Yg(e){return Xe.map(t=>`${T.previews.isEnabled(e,t)?"[x]":"[ ]"} ${Gg[t]}`)}function zg(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function Jg(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(qu.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:Yo(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"logs"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function Xg(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(Xe.length-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(!Yo(n))return{kind:"noop",state:e};let r=Xe[e.menuIndex]??Xe[0],s=!T.previews.isEnabled(t,r);return{kind:"save-enabled",feature:r,enabled:s,state:{...e,message:`${Gg[r]} ${s?"enabled":"disabled"}.`}}}function Qg(e,t,n,r){if(e.pathEdit)return wA({...e,pathEdit:e.pathEdit},t,n);let s=Uu(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=ju(t)[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:a,value:t.runners?.[a]?.path??""}}}}if(!Yo(n))return{kind:"noop",state:e};let i=ju(t)[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:`${T.runners.getProfile(i).displayName} ${o?"disabled":"enabled"}.`}}}function ju(e){return ue.filter(t=>t!=="pi"||T.previews.isEnabled(e,"piRunner"))}function wA(e,t,n){if(n==="ESCAPE")return{kind:"render",state:Kg({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(Yo(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:r,path:s.length>0?s:null,state:Kg({...e,message:s.length>0?`${T.runners.getProfile(r).displayName} executable saved.`:`${T.runners.getProfile(r).displayName} executable reset to default.`})}}return kA(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function Kg(e){let t={...e};return delete t.pathEdit,t}function Yo(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
282
- `}function kA(e){return e.length===1&&e>=" "&&e!==""}import Ds from"node:path";function Zg(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 ey="\u{F024B} ",ty="\u{F0DCF} ",ny="\u25CB",Wu="\uEA64",ry="\uEAFE",sy="\uEBDA",Bu="\u25CB",Vu="\u25CF",Ku="\u2713",Gu="\u2715";function iy(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 Hu=150,oy=6;var Jo="empty",fe={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function uy(e,t,n){let r=RA(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=iE(t.tasks),d=IA(e,a),u=SA(e,a,d,n),p=u.find(y=>y.id===d)??u[0]??{id:"agent",label:"CODEX"},h=t.inspection?.taskId===a?.id?t.inspection:null,m=s?.name??"no repo",f=a?T.runners.getDisplayName(a.runner):T.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 ${T.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 [${T.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:Cs(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 ${T.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:Ds.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${Ds.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:f},leftTree:TA(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>oE(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:m,agent:f},centerTranscript:PA(d,e,s,a,e.workspaceBrowser,h,r),tabs:u,rightContext:sE(s,a),rightInspection:MA(e,a,h)}}function TA(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 bA(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=Co(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 Is(c)){let p=e.selectedLeftItemId===`task:${d.id}`,h=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,m={id:`task:${d.id}`,taskId:d.id,text:n?h:`${p?"\u25B8":"\u2022"} ${h}`,indent:u===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:nr(d,n.snapshots,n.now),activityAnimationFrame:n.animationFrame}:{}},f=py(d);f&&(m.prBadge=f),r.push(m)}if(o.kind==="project"){let d=`new-task-workspace:${o.id}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Project Task [${T.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 [${T.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 bA(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=Ao(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 Is(l)){let h=t.selectedLeftItemId===`task:${u.id}`,m=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,f={id:`task:${u.id}`,taskId:u.id,text:s?m:`${h?"\u25B8":"\u2022"} ${m}`,indent:p===0?2:4,selected:h,focused:h&&t.focusedRegion==="tasks",...s?{activity:nr(u,s.snapshots,s.now),activityAnimationFrame:s.animationFrame}:{}},y=py(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 [${T.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 RA(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 PA(e,t,n,r,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(u=>u.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((u,p)=>{let h=p===s.selectedIndex?"\u25B8":" ",m=u.kind==="repo"?" [git repo]":"/";return`${h} ${u.name}${m}`}),d=s.query!==null?`Search: ${s.query}\u2588`:"";return pt(["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 pt(["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 pt([`No tasks in ${c}.`,"",`Press n or choose + New ${d} to create one with ${T.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?pt([`${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."]):pt([`${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"?AA(r,i,t.fileScrollOffset):e===B&&t.openInspectionKind==="diff"?EA(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?pt(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):pt(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function SA(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:vA(o),...o.kind==="agent"&&r&&t?{activity:Yt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame}:{}}))??[];if(!t)return[{id:Jo,label:"EMPTY",active:n===Jo,focused:e.focusedRegion==="center"&&n===Jo}];let i=e.openInspectionKind||n===B?[{id:B,label:CA(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function IA(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:Jo}function vA(e){return e.title.toUpperCase()}function CA(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?Ds.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function AA(e,t,n){if(!e)return pt(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return pt(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=dy(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:""},...OA(r.lines,n,s)]}function EA(e,t,n){if(!e)return pt(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return pt(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=dy(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:""},...$A(r.lines,n,s)]}function pt(e){return e.map(t=>({text:t}))}function OA(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:fe.lineNumber}},{text:" \u2502 ",style:{fg:fe.gutter}},...Yu(i,n)],tone:"default"}})}function $A(e,t,n){let r=NA(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>DA(i,n))}function NA(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 DA(e,t){let n=ay(e.oldNumber),r=ay(e.newNumber),s=e.kind==="delete"?n:r,i=e.kind==="delete"?{bg:"2a1111",fallbackFg:fe.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:fe.diffAdd}:null,o=`${s} \u2502 ${e.text}`,a=i?xA(Yu(e.text,t),i.bg,i.fallbackFg):Yu(e.text,t),l=i?{fg:fe.lineNumber,bg:i.bg}:{fg:fe.lineNumber},c=i?{fg:fe.gutter,bg:i.bg}:{fg:fe.gutter};return{text:o,segments:[{text:s,style:l},{text:" \u2502 ",style:c},...a],fullBleed:i!==null}}function ay(e){return e===null?" ":String(e).padStart(4," ")}function dy(e){let t=Ds.extname(e).toLowerCase();return[".ts",".tsx",".js",".jsx",".mjs",".cjs"].includes(t)?"javascript":[".json",".jsonc"].includes(t)?"json":[".md",".mdx"].includes(t)?"markdown":[".css",".scss"].includes(t)?"css":"plain"}function Yu(e,t){return t==="diff"?_A(e):t==="markdown"?FA(e):t==="json"?zu(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?zu(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 _A(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:fe.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:fe.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:fe.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:fe.diffMeta}}]:[{text:e}]}function xA(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function FA(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:fe.markup,bold:!0}}]:zu(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function zu(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:LA(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function LA(e){return e.startsWith("//")||e.startsWith("/*")?{fg:fe.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:fe.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:fe.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:fe.markup}:{fg:fe.keyword}}function MA(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"?fy(t.repoTargets??[]):s?.pullRequest??(t?K(t):null),o=[jA(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=gy(e,t,n),l=Ju(e,n),c=HA([{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,...tE(e,n)]}:{title:"",rows:[...o,...Ju(e,n)]}}function jA(e,t){let n=e.inspectionMode,r=[{label:"FILES",active:n==="files"},{label:"REVIEW",active:n==="review"}],s=[];for(let l=0;l<r.length;l++){let c=r[l];l>0&&s.push({text:" "});let d=c.active?e.focusedRegion==="inspector"||e.focusedRegion==="actions"?"9ece6a":"7aa2f7":"565f89";s.push({text:c.label,style:{fg:d}})}let i=Xu(t),o=Qu(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function ly(e){return[{text:" "},Xu(e),{text:" "},Qu(e)]}function py(e){if(e.type==="project"&&e.repoTargets?.length){let n=fy(e.repoTargets);return n?ly(n):null}let t=K(e);return t?.number?ly(t):null}function fy(e){let t=e.filter(s=>s.status==="ready"),n=t.map(s=>s.pullRequest).filter(s=>!!s.number);if(n.length===0)return null;let r=UA(n);return{number:-1,status:qA(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 qA(e){return e.some(t=>t.status==="open")?"open":e.every(t=>t.status==="merged")?"merged":e.some(t=>t.status==="closed")?"closed":e[0]?.status??null}function UA(e){let t=e.map(n=>my(n));return t.some(n=>n==="failed")?"failed":t.some(n=>n==="pending")?"pending":t.length>0&&t.every(n=>n==="success")?"success":"none"}function Xu(e){return!e||!e.number?{text:ny,style:{fg:"565f89"}}:e.status==="merged"?{text:ry,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:sy,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:Wu,style:{fg:"565f89"}}:{text:Wu,style:{fg:"9ece6a"}}}function Qu(e){return e?.aggregateReadiness?cy(e.aggregateReadiness):cy(my(e))}function cy(e){return e==="failed"?{text:Gu,style:{fg:"f7768e"}}:e==="pending"?{text:Vu,style:{fg:"e0af68"}}:e==="success"?{text:Ku,style:{fg:"9ece6a"}}:{text:Bu,style:{fg:"565f89"}}}function my(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")?hy(e)?"failed":WA(e)?"success":"pending":"pending"}function WA(e){return!!(e.mergeable&&!e.draft&&!hy(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function hy(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function gy(e,t,n){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return BA(e,t,n);let r=K(t),s=ky("pr",t.branch,r??{number:null,url:null,baseBranch:null,headBranch:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,lastSyncedAt:null,requiredChecks:[],comments:[]}),i=t.prs.filter(o=>o!==r&&(o.status==="merged"||o.status==="closed")).length;return i>0&&s.push({id:"pr-history",text:`+ ${i} previous PR${i!==1?"s":""}`,muted:!0}),s}var zo=32;function BA(e,t,n){let r=[],s=Zu(t,n),i=e.selectedProjectTargetId??s[0]?.repoId??null,o=s.some(c=>c.repoId===i)?i:s[0]?.repoId??null;if(s.length===0)return[{id:"project-review-empty",text:"No repos with changes or pull requests.",muted:!0}];for(let c of s){let d=o===c.repoId,u=e.focusedRegion==="inspector"&&d,p=c.repoId.startsWith("repo_")?c.repoId.slice(5):c.repoId;if(c.status!=="ready"){let m=c.failureReason?c.failureReason.slice(0,14):c.status,f=zo-m.length-1,y=p.length>f?p.slice(0,f-1)+"\u2026":p,k=zo-y.length-m.length;r.push({id:`project-review:${c.repoId}`,text:y+" ".repeat(Math.max(1,k))+m,selected:d,focused:u,muted:!0})}else{let h=Xu(c.pullRequest),m=Qu(c.pullRequest),f=`${h.text} ${m.text}`,y=zo-f.length-1,k=p.length>y?p.slice(0,y-1)+"\u2026":p,R=zo-k.length-f.length,b=k+" ".repeat(Math.max(1,R));r.push({id:`project-review:${c.repoId}`,text:b+f,selected:d,focused:u,segments:[{text:b},{...h,text:h.text},{text:" "},{...m,text:m.text}]})}}let a=s.find(c=>c.repoId===o)??null,l=a?VA(t,a):[];return a?.status==="ready"&&(a.pullRequest.number||l.length>0)&&(r.push({id:"target-detail-spacer",text:""}),r.push(...ky("target",a.branch,a.pullRequest)),l.length>0&&r.push({id:"target-pr-history",text:`+ ${l.length} previous PR${l.length!==1?"s":""}`,muted:!0})),r}function Zu(e,t){if(e?.type!=="project")return[];let n=new Set(t?.taskId===e.id?t.diffRows.map(r=>r.path.split("/")[0]).filter(r=>!!r):[]);return(e.repoTargets??[]).filter(r=>!!r.pullRequest.number||n.has(r.repoId)||yy(e,r).length>0)}function VA(e,t){return yy(e,t).filter(n=>n.number!==t.pullRequest.number&&(n.status==="merged"||n.status==="closed"))}function yy(e,t){let n=KA(t,e.prs);return n?e.prs.filter(r=>r.owner?.toLowerCase()===n.owner&&r.repo?.toLowerCase()===n.repo):[]}function KA(e,t){if(e.pullRequest.owner&&e.pullRequest.repo)return{owner:e.pullRequest.owner.toLowerCase(),repo:e.pullRequest.repo.toLowerCase()};let n=GA(e.pullRequest.url);if(n)return n;let r=t.filter(i=>e.pullRequest.number!==null&&i.number===e.pullRequest.number),s=r.length===1?r[0]:null;return s?.owner&&s.repo?{owner:s.owner.toLowerCase(),repo:s.repo.toLowerCase()}:null}function GA(e){let t=e?.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/\d+(?:[/?#].*)?$/i);return t?.[1]&&t[2]?{owner:t[1].toLowerCase(),repo:t[2].toLowerCase()}:null}function wy(e,t,n=null){return 3+gy(e,t,n).length+Ju(e,n).length}function ky(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=YA(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:zA(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${Ty(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(JA)):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)=>XA(u,r(`comment:${p}`))))),s}function HA(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 YA(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function zA(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function Ty(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 JA(e){let{icon:t,color:n}=ZA(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," ")} ${eE(e.status)}`,color:n,muted:!1}}function XA(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${Ty(e.createdAt)}`:"",s=QA(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 QA(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 ZA(e){switch(e){case"success":return{icon:Ku,color:"9ece6a"};case"pending":return{icon:Vu,color:"e0af68"};case"failed":return{icon:Gu,color:"f7768e"};case"skipped":return{icon:Bu,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function eE(e){return e==="success"?"passing":e==="failed"?"failing":e}function tE(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=ed(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)?ey:ty:Zg(l.label),p=l.kind==="directory"?"7aa2f7":iy(l.label),h=" ".repeat(l.depth),m=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:h},m,f];return{id:l.path,text:`${h}${u}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:y}})]}function ed(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 Ju(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(nE(t))return rE(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=>by(i,e,t))))}return n}function nE(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function rE(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=>by(c,e,t,s.length+1))))}}return n}function by(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 sE(e,t){return e?t?[{label:"Task",value:t.id},{label:"Repo",value:e.name},{label:"Agent",value:T.runners.getDisplayName(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:Ds.basename(t.worktreePath)}]:[{label:"Repo",value:e.name},{label:"Branch",value:e.defaultBranch},{label:"Task",value:"none",mutedValue:!0}]:[{label:"Repo",value:"none",mutedValue:!0}]}function iE(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0,pi:0})}function oE(e,t){return{name:T.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function Ry(e,t,n,r,s=null){if(s)return aE(e,t,n,r,s);let i=Tu(e,t,{centerOnly:r});return lE(n,i)?{output:Uo(i.rows,n.rows,i.row,i.column),region:i}:null}function aE(e,t,n,r,s){let i=rg(e,t,s,{centerOnly:r});if(!i||!cE(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 lE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function cE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function Py(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!uE(o,a))return null;!o||!a||(s+=Uo(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function uE(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 dE=["tasks","center","inspector"];function pE(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 nd(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return sd({...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 sd(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return Bh(t)?A({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):A({state:e});if(e.fileSearchQuery!==null)return pE(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"&&(Eo(e.selectedLeftItemId)||Oo(e.selectedLeftItemId)))return A({state:{...e,selectedRunner:vo(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return Sy(e,1);if(t==="SHIFT_TAB"||t==="[")return Sy(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?mn(e,-1,n):nd(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===B?mn(e,1,n):nd(e,1,n);if(t==="PAGE_UP")return mn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return mn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return mn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return mn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??mt,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=TE(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"&&Cs(e.selectedLeftItemId)&&e.selectedTaskId)return A({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Yh(e.selectedLeftItemId)&&e.selectedWorkspaceId)return A({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&Cy(e.activeTab,n.ptyTabIds??[]))return A({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return td(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return Iy(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return td(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return Iy(e,1)}if(ut(t)){if(e.focusedRegion==="tasks"&&(Eo(e.selectedLeftItemId)||Oo(e.selectedLeftItemId))){let r=fu(e.selectedLeftItemId),s=mu(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"&&Cs(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return A({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:Rr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&Cy(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return A({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:Rr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===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:hE({...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 mn(e,t,n){if(t===0)return A({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?Ay(e,t,n):e.inspectionMode==="review"?vy(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):A({state:e});if(e.focusedRegion==="center"&&e.activeTab===B){if(e.openInspectionKind==="file")return vy(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return gE(e,t,n)}return A({state:e})}function Sy(e,t){return Xo(e,"focusedRegion",dE,t)}function td(e,t,n){let r=Xo(e,"activeTab",n&&n.length>0?n:bE(e),t);return!r.changed||Vh(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:Rr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function nd(e,t,n){if(e.focusedRegion==="tasks")return fE(e,t,n.leftItemIds);if(e.focusedRegion==="center")return td(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return Ay(e,t,n);if(n.projectTargetIds?.length){let s=rd(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=rd(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:B,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:Xo(e,"selectedActionId",Mh,t)}return Xo(e,"selectedActionId",lu,t)}function fE(e,t,n){let r=rd(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=pu(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=fu(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=mu(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function mE(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 Iy(e,t){return mE(e,kE(e.inspectionMode,cu,t))}function Ay(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=Wt(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 hE(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 vy(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=Wt(e[t]+n,0,i);return o===e[t]?A({state:e}):A({state:{...e,[t]:o,actionMessage:null},changed:!0})}function gE(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return yE(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=Wt(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=Wt(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=Wt(o,0,i);return c===e.diffScrollOffset?A({state:e}):A({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function yE(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=Wt(e.diffScrollOffset+t,0,i),a=wE(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 wE(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function Xo(e,t,n,r){let s=n.indexOf(e[t]),i=Wt(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 rd(e,t,n,r,s=!1){if(n.length===0)return A({state:e});let i=n.indexOf(e[t]??n[0]??""),o=Wt(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 kE(e,t,n){let r=t.indexOf(e);return t[Wt(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 Cy(e,t){return t.includes(e)}function TE(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Rr(e.activeTab)??e.preferredPtyTabKind}function bE(e){return[e.selectedPtyTabId,e.openInspectionKind?B:null].filter(t=>typeof t=="string")}function Wt(e,t,n){return Math.min(n,Math.max(t,e))}var Ey=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??RE(i,e.activeTab,e.preferredPtyTabKind),a=Dy(i,o,n??void 0,r.config);return{...i,ptyTabs:[...i.ptyTabs,a],selectedPtyTabId:a.id}}));return{updatedTask:s,nextShell:{activeTab:s.selectedPtyTabId??e.activeTab,selectedPtyTabId:s.selectedPtyTabId,preferredPtyTabKind:s.ptyTabs.at(-1)?.kind??e.preferredPtyTabKind,focusedRegion:"center",actionMessage:`Created tab: ${s.ptyTabs.at(-1)?.title??"tab"}`}}},Oy=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing a tab.");let{closedTab:n,nextSelectedTab:r}=await t.queueTaskMutation(async()=>{let s={closedTab:null,nextSelectedTab:null};if(await 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}`}}},$y=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})})},Ny=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=Dy(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 RE(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function Dy(e,t,n,r={}){let s=n??e.runner,i=T.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(h=>h.id)),c=1,d=a;for(;l.has(d);)c+=1,d=`${a}-${c}`;let u=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:d,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?T.runners.buildCommand(s,void 0,r):[],createdAt:u,updatedAt:u}}var vr=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},_y=async(e,t,n,r,s)=>{T.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});T.previews.isEnabled(s.config,"agentOrchestration")&&await et(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=fo();mo(T.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",d=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new vr(c,d)}let o=await s.taskService.markTaskStarted(s.paths,i.task.id),a={selectedRepoId:o.repoId,selectedWorkspaceId:o.workspaceId,selectedTaskId:o.id,selectedPtyTabId:o.selectedPtyTabId,inputMode:"control",focusedRegion:"center",activeTab:o.selectedPtyTabId??"agent",selectedActionId:"commit"};return{task:o,nextShell:a}},xy=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},Fy=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 Nr(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}`}}},Ly=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Nr(t.paths,n.id)))),Cr=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await de.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var My=async(e,t)=>{if(!e.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");if((await t.taskService.listTasks(t.paths,{workspaceId:e.selectedWorkspaceId,includeClosed:!0})).tasks.length>0)throw new Error(`Cannot remove workspace ${e.selectedWorkspaceId} while task records still reference it.`);return await t.workspaceService.archiveWorkspace(t.paths,e.selectedWorkspaceId),{nextShell:{selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:`Removed workspace ${(await t.workspaceService.removeWorkspace(t.paths,e.selectedWorkspaceId,{listTasks:t.taskService.listTasks})).workspaceId}`}}};var jy=async(e,t,n)=>{let r=T.runners.setRunnerEnabled(n.config,e,t);return await T.save(n.paths,r),r},qy=async(e,t,n)=>{let r=T.runners.setRunnerPath(n.config,e,t);return await T.save(n.paths,r),r},Uy=async(e,t,n)=>{let r=T.previews.setEnabled(n.config,e,t);return await T.save(n.paths,r),r};var PE=250;function Bt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function hn(e,t){return qt(t,e.ptyRuntime.getViewState(Ar(e,t)))}function Ar(e,t){let n=Bt(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 hn(e,zh(t,e.model))}function Wy(e,t,n){return e.footerToastTimer&&(clearTimeout(e.footerToastTimer),e.footerToastTimer=null),n?(e.footerToastTimer=setTimeout(()=>{e.footerToastTimer=null,!(e.state.mode!=="main"||e.state.shell.footerToast!==n)&&(e.state={mode:"main",shell:I(e,{...e.state.shell,footerToast:null})},e.render())},600),{...t,footerToast:n}):{...t,footerToast:null}}function By(e,t,n){return Wy(e,t,n?{tone:"success",message:n}:null)}function se(e,t,n){return Wy(e,t,{tone:"error",message:n})}function ie(e,t,n,r){let s=n instanceof Error?n.message:r,i=n instanceof Error?n.stack??n.message:String(n);return de.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function J(e,t){if(!e.uiStateFile)return;e.runtimeState=Uh(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>Vt({uiStateFile:e.uiStateFile},n),()=>Vt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function SE(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:Te,queueTaskMutation:t=>SE(e,t)}}function id(e,t){let n=Bt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?ed(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:Mn(e.model),centerTabIds:Gh(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:wy(t,n,s),pageRows:Math.max(5,qe(e.activeTerminal.width,e.activeTerminal.height).height-Z.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:Zu(n,s).map(a=>a.repoId)}}async function Vy(e,t){await $y(t,oe(e))}async function Pe(e){e.model=await Pr(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 Qo(e,t){e.model={...e.model,tasks:[...e.model.tasks.filter(n=>n.id!==t.id),...t.status==="closed"?[]:[t]].sort((n,r)=>n.id.localeCompare(r.id))}}async function Zo(e,t){let n=++e.inspectionRefreshSequence,r=hu(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 Sh(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await Pr(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)},J(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)&&Zo(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()})},PE))}function Gy(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=mn(e.state.shell,n,id(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:I(e,r.state)},J(e,e.state.shell),e.render(),Zo(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)},J(e,e.state.shell),e.render()}},16)))}function od(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function ad(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 Yy(e){ad(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.render())})}async function zy(e,t){let n=I(e,t),r=Bt(e.model.tasks,n),s=Ar(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 qt(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,dn(qe(e.activeTerminal.width,e.activeTerminal.height)));return qt({...n,inputMode:"control"},o)}function ld(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 cd(e,t){try{let n=I(e,t),r=Bt(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 Hy(e,r),await Pe(e),s=r.selectedPtyTabId)}r&&!s&&(r=await Hy(e,r),await Pe(e),s=r.selectedPtyTabId);let i=I(e,{...n,activeTab:s??n.activeTab,selectedPtyTabId:s,focusedRegion:s?"center":n.focusedRegion});if(!i.selectedTaskId||!s){e.state={mode:"main",shell:i},e.render();return}e.state={mode:"main",shell:qt({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},J(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,dn(qe(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Ut(s),e.lastTerminalKey=null,e.state={mode:"main",shell:qt({...i,inputMode:"terminal"},o)},J(e,e.state.shell)}catch(n){let r=ie(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&Ut(t.selectedPtyTabId)&&(await IE(e,t.selectedTaskId,r).catch(()=>{}),await Pe(e).catch(()=>{})),e.state={mode:"main",shell:se(e,Wh(I(e,t),r),r)},J(e,e.state.shell)}e.render()}async function IE(e,t,n){await xy(t,n,oe(e))}async function Jy(e,t,n,r){let s=I(e,t),{nextShell:i}=await Ey(s,n,r,oe(e));return await Pe(e),I(e,{...s,...i})}async function Xy(e,t){let n=I(e,t),{closedTab:r,nextShell:s}=await Oy(n,oe(e));return e.ptyRuntime.disposeSession(r.id),await Pe(e),I(e,{...n,...s})}async function Qy(e,t){let n=I(e,t),r=Mn(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await Fy(n,oe(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Pe(e),I(e,{...n,...o,selectedLeftItemId:vE(r,Mn(e.model),s)})}async function Zy(e,t){let n=I(e,t),{nextShell:r}=await My(n,oe(e));return await Pe(e),I(e,{...n,...r})}async function Hy(e,t){return Ny(t,oe(e))}function ea(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:hn(e,e.state.shell)},e.render())},16))}function ew(e){e.scrollRenderTimer&&(clearTimeout(e.scrollRenderTimer),e.scrollRenderTimer=null),e.pendingScrollLines=0,e.ptyRuntime.scrollViewport(Number.MAX_SAFE_INTEGER),e.state.mode==="main"&&(e.state={mode:"main",shell:hn(e,e.state.shell)},e.render())}function vE(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 nw(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=tw(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await Ly(s,oe(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)Qo(e,o);t.recordSuccess(i,tw(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,Cr("background PR polling",i,oe(e)))}}function tw(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function rw(e,t){let n=I(e,t),r=Bt(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 Pe(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 Pe(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${K(a)?.requiredChecks.length??0} reported`)}return I(e,{...By(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import $E from"node:path";import{readdir as CE,stat as AE}from"node:fs/promises";import sw from"node:path";async function EE(e){let t=await CE(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=sw.join(e,r.name);n.push({name:r.name,path:s,kind:await OE(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 iw(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function ow(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 ta(e,t){let n=await EE(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 OE(e){let t=sw.join(e,".git");return await AE(t).catch(()=>null)!==null}function aw(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function lw(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function NE(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 _y(t.selectedRepoId,t.selectedWorkspaceId,n,t.selectedRunner,oe(e));r=s.task,await Pe(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??fg(r,"agent"),dn(qe(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Ut(i.selectedPtyTabId),e.state={mode:"main",shell:qt(i,o)},J(e,e.state.shell)}catch(s){s instanceof vr&&(r=s.task);let i=ie(e,"create task",s,"Failed to create task.");r&&!(s instanceof vr)?(await V(e.paths,r.id,o=>({...o,status:"draft",runnerSession:{...o.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:i})).catch(()=>{}),await Pe(e).catch(()=>{})):r&&(await V(e.paths,r.id,o=>({...o,lastFailureReason:i})).catch(()=>{}),await Pe(e).catch(()=>{})),e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,inputMode:"control",selectedTaskId:r?.id??e.state.shell.selectedTaskId,selectedPtyTabId:r?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:r?`task:${r.id}`:e.state.shell.selectedLeftItemId,activeTab:r?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:r?null:"",taskPromptError:i,actionMessage:null}),i)}}finally{e.creatingTask=!1,e.render()}}function DE(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(ut(t)){NE(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:vo(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}uu(t)&&(e.state={mode:"main",shell:I(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function _E(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=iw(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"){ta(e,$E.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"||ut(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){ta(e,s.path).catch(o=>{let a=ie(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()});return}let{workspaceService:i}=oe(e);i.addWorkspace(e.paths,s.path).then(async o=>{await Pe(e);let a=o.repos[0]??null,l=I(e,{...e.state.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${o.workspace.id}`,selectedWorkspaceId:o.workspace.id,selectedRepoId:a?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${o.workspace.name??o.workspace.id}`});e.state={mode:"main",shell:l},J(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 xE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=Jg(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;FE(e,r)}}}async function FE(e,t){let n;try{n=await de.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 LE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=Qg(aw(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"?jy(n.runner,n.enabled,oe(e)):qy(n.runner,n.path,oe(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=T.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:T.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:{...aw(e),message:i}},e.render()})}function ME(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=Xg(lw(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}Uy(n.feature,n.enabled,oe(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,e.enabledRunnerIds=T.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:T.runners.getDefault(e.config)}),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:{...lw(e),message:s}},e.render()})}}function cw(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){DE(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){_E(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){qE(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=sd(e.state.shell,n,id(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)},J(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)},J(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&ut(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Os(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(jE(e,n))return;e.lastTerminalKey=mg(n)?{key:n,at:Date.now()}:null;let i=hg(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){ea(e,i);return}uu(n)&&(e.state.shell.terminal.scrolledBack||e.pendingScrollLines<0)&&Ut(e.state.shell.selectedPtyTabId)&&ew(e),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)},J(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){ta(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){Jy(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{cd(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){Xy(e,r.state).then(s=>{e.state={mode:"main",shell:s},J(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){rw(e,r.state).then(s=>{e.state={mode:"main",shell:s},J(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=Bt(e.model.tasks,r.state),i=s?K(s)?.url??null:null;i?ow(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){Qy(e,r.state).then(s=>{e.state={mode:"main",shell:s},J(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){Zy(e,r.state).then(s=>{e.state={mode:"main",shell:s},J(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){cd(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:I(e,r.state)},J(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){Ky(e,e.state.shell);return}Zo(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)},Vy(e,e.state.shell).catch(()=>{}),J(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"){xE(e,n);return}if(e.state.variant==="runners"){LE(e,n);return}if(e.state.variant==="previews"){ME(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||ut(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"||ut(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(ut(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;zy(e,s).then(i=>{e.state.mode!=="main"||e.state.shell!==s||(e.state={mode:"main",shell:i},J(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)},J(e,e.state.shell),e.render()})}):Yy(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 uw(e,t){let n=Tg(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=Os(i);if(o){pw(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(Cu(i)){e.pendingTerminalKeySequence.raw=i,dw(e);return}na(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"})},J(e,e.state.shell),e.render();return}let r=gg(n);if(r!==0){ea(e,r);return}let s=Os(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
281
+ `);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 Hg(e){return new Promise((t,n)=>{let r=Fg(e);r.once("connect",()=>t(r)),r.once("error",n)})}function TA(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,n)})}function fn(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
282
+ `)}catch{}}function bA(e){try{return process.kill(e,0),!0}catch{return!1}}function Yg(e){return new Promise(t=>setTimeout(t,e))}function RA(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var Wu=["Runners","Feature Previews","Logs","Help"],Jg={agentOrchestration:"Agent orchestration",fileOpen:"Agent file opening",piRunner:"Pi coding agent runner"};function Bu(e,t){return Uu(e).map(n=>{let r=T.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 Xg(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 Qg(e){return Xe.map(t=>`${T.previews.isEnabled(e,t)?"[x]":"[ ]"} ${Jg[t]}`)}function Zg(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function ey(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(Wu.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:Jo(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"logs"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function ty(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(Xe.length-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(!Jo(n))return{kind:"noop",state:e};let r=Xe[e.menuIndex]??Xe[0],s=!T.previews.isEnabled(t,r);return{kind:"save-enabled",feature:r,enabled:s,state:{...e,message:`${Jg[r]} ${s?"enabled":"disabled"}.`}}}function ny(e,t,n,r){if(e.pathEdit)return PA({...e,pathEdit:e.pathEdit},t,n);let s=Bu(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=Uu(t)[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:a,value:t.runners?.[a]?.path??""}}}}if(!Jo(n))return{kind:"noop",state:e};let i=Uu(t)[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:`${T.runners.getProfile(i).displayName} ${o?"disabled":"enabled"}.`}}}function Uu(e){return ue.filter(t=>t!=="pi"||T.previews.isEnabled(e,"piRunner"))}function PA(e,t,n){if(n==="ESCAPE")return{kind:"render",state:zg({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(Jo(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:r,path:s.length>0?s:null,state:zg({...e,message:s.length>0?`${T.runners.getProfile(r).displayName} executable saved.`:`${T.runners.getProfile(r).displayName} executable reset to default.`})}}return SA(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function zg(e){let t={...e};return delete t.pathEdit,t}function Jo(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
283
+ `}function SA(e){return e.length===1&&e>=" "&&e!==""}import Ds from"node:path";function ry(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 sy="\u{F024B} ",iy="\u{F0DCF} ",oy="\u25CB",Vu="\uEA64",ay="\uEAFE",ly="\uEBDA",Ku="\u25CB",Gu="\u25CF",Hu="\u2713",Yu="\u2715";function cy(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 zu=150,uy=6;var Qo="empty",fe={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function my(e,t,n){let r=CA(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=uE(t.tasks),d=OA(e,a),u=EA(e,a,d,n),p=u.find(y=>y.id===d)??u[0]??{id:"agent",label:"CODEX"},h=t.inspection?.taskId===a?.id?t.inspection:null,m=s?.name??"no repo",f=a?T.runners.getDisplayName(a.runner):T.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 ${T.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 [${T.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:Cs(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 ${T.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:Ds.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${Ds.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:f},leftTree:IA(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>dE(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:m,agent:f},centerTranscript:AA(d,e,s,a,e.workspaceBrowser,h,r),tabs:u,rightContext:cE(s,a),rightInspection:BA(e,a,h)}}function IA(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 vA(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=Ao(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 Is(c)){let p=e.selectedLeftItemId===`task:${d.id}`,h=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,m={id:`task:${d.id}`,taskId:d.id,text:n?h:`${p?"\u25B8":"\u2022"} ${h}`,indent:u===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:nr(d,n.snapshots,n.now),activityAnimationFrame:n.animationFrame}:{}},f=gy(d);f&&(m.prBadge=f),r.push(m)}if(o.kind==="project"){let d=`new-task-workspace:${o.id}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Project Task [${T.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 [${T.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 vA(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=Eo(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 Is(l)){let h=t.selectedLeftItemId===`task:${u.id}`,m=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,f={id:`task:${u.id}`,taskId:u.id,text:s?m:`${h?"\u25B8":"\u2022"} ${m}`,indent:p===0?2:4,selected:h,focused:h&&t.focusedRegion==="tasks",...s?{activity:nr(u,s.snapshots,s.now),activityAnimationFrame:s.animationFrame}:{}},y=gy(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 [${T.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 CA(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 AA(e,t,n,r,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(u=>u.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((u,p)=>{let h=p===s.selectedIndex?"\u25B8":" ",m=u.kind==="repo"?" [git repo]":"/";return`${h} ${u.name}${m}`}),d=s.query!==null?`Search: ${s.query}\u2588`:"";return pt(["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 pt(["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 pt([`No tasks in ${c}.`,"",`Press n or choose + New ${d} to create one with ${T.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?pt([`${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."]):pt([`${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"?DA(r,i,t.fileScrollOffset):e===B&&t.openInspectionKind==="diff"?_A(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?pt(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):pt(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function EA(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:$A(o),...o.kind==="agent"&&r&&t?{activity:Yt(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:NA(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function OA(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 $A(e){return e.title.toUpperCase()}function NA(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?Ds.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function DA(e,t,n){if(!e)return pt(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return pt(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=hy(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:""},...xA(r.lines,n,s)]}function _A(e,t,n){if(!e)return pt(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return pt(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=hy(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:""},...LA(r.lines,n,s)]}function pt(e){return e.map(t=>({text:t}))}function xA(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:fe.lineNumber}},{text:" \u2502 ",style:{fg:fe.gutter}},...Ju(i,n)],tone:"default"}})}function LA(e,t,n){let r=FA(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>MA(i,n))}function FA(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 MA(e,t){let n=dy(e.oldNumber),r=dy(e.newNumber),s=e.kind==="delete"?n:r,i=e.kind==="delete"?{bg:"2a1111",fallbackFg:fe.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:fe.diffAdd}:null,o=`${s} \u2502 ${e.text}`,a=i?qA(Ju(e.text,t),i.bg,i.fallbackFg):Ju(e.text,t),l=i?{fg:fe.lineNumber,bg:i.bg}:{fg:fe.lineNumber},c=i?{fg:fe.gutter,bg:i.bg}:{fg:fe.gutter};return{text:o,segments:[{text:s,style:l},{text:" \u2502 ",style:c},...a],fullBleed:i!==null}}function dy(e){return e===null?" ":String(e).padStart(4," ")}function hy(e){let t=Ds.extname(e).toLowerCase();return[".ts",".tsx",".js",".jsx",".mjs",".cjs"].includes(t)?"javascript":[".json",".jsonc"].includes(t)?"json":[".md",".mdx"].includes(t)?"markdown":[".css",".scss"].includes(t)?"css":"plain"}function Ju(e,t){return t==="diff"?jA(e):t==="markdown"?UA(e):t==="json"?Xu(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?Xu(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 jA(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:fe.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:fe.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:fe.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:fe.diffMeta}}]:[{text:e}]}function qA(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function UA(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:fe.markup,bold:!0}}]:Xu(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function Xu(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:WA(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function WA(e){return e.startsWith("//")||e.startsWith("/*")?{fg:fe.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:fe.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:fe.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:fe.markup}:{fg:fe.keyword}}function BA(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"?yy(t.repoTargets??[]):s?.pullRequest??(t?K(t):null),o=[VA(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=Ty(e,t,n),l=Qu(e,n),c=QA([{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,...oE(e,n)]}:{title:"",rows:[...o,...Qu(e,n)]}}function VA(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=Zu(t),o=ed(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function py(e){return[{text:" "},Zu(e),{text:" "},ed(e)]}function gy(e){if(e.type==="project"&&e.repoTargets?.length){let n=yy(e.repoTargets);return n?py(n):null}let t=K(e);return t?.number?py(t):null}function yy(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=GA(n);return{number:-1,status:KA(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 KA(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 GA(e){let t=e.map(n=>wy(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 Zu(e){return!e||!e.number?{text:oy,style:{fg:"565f89"}}:e.status==="merged"?{text:ay,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:ly,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:Vu,style:{fg:"565f89"}}:{text:Vu,style:{fg:"9ece6a"}}}function ed(e){return e?.aggregateReadiness?fy(e.aggregateReadiness):fy(wy(e))}function fy(e){return e==="failed"?{text:Yu,style:{fg:"f7768e"}}:e==="pending"?{text:Gu,style:{fg:"e0af68"}}:e==="success"?{text:Hu,style:{fg:"9ece6a"}}:{text:Ku,style:{fg:"565f89"}}}function wy(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")?ky(e)?"failed":HA(e)?"success":"pending":"pending"}function HA(e){return!!(e.mergeable&&!e.draft&&!ky(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function ky(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function Ty(e,t,n){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return YA(e,t,n);let r=K(t),s=Py("pr",t.branch,r??{number:null,url:null,baseBranch:null,headBranch:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,lastSyncedAt:null,requiredChecks:[],comments:[]}),i=t.prs.filter(o=>o!==r&&(o.status==="merged"||o.status==="closed")).length;return i>0&&s.push({id:"pr-history",text:`+ ${i} previous PR${i!==1?"s":""}`,muted:!0}),s}var Xo=32;function YA(e,t,n){let r=[],s=td(t,n),i=e.selectedProjectTargetId??s[0]?.repoId??null,o=s.some(c=>c.repoId===i)?i:s[0]?.repoId??null;if(s.length===0)return[{id:"project-review-empty",text:"No repos with changes or pull requests.",muted:!0}];for(let c of s){let d=o===c.repoId,u=e.focusedRegion==="inspector"&&d,p=c.repoId.startsWith("repo_")?c.repoId.slice(5):c.repoId;if(c.status!=="ready"){let m=c.failureReason?c.failureReason.slice(0,14):c.status,f=Xo-m.length-1,y=p.length>f?p.slice(0,f-1)+"\u2026":p,k=Xo-y.length-m.length;r.push({id:`project-review:${c.repoId}`,text:y+" ".repeat(Math.max(1,k))+m,selected:d,focused:u,muted:!0})}else{let h=Zu(c.pullRequest),m=ed(c.pullRequest),f=`${h.text} ${m.text}`,y=Xo-f.length-1,k=p.length>y?p.slice(0,y-1)+"\u2026":p,R=Xo-k.length-f.length,b=k+" ".repeat(Math.max(1,R));r.push({id:`project-review:${c.repoId}`,text:b+f,selected:d,focused:u,segments:[{text:b},{...h,text:h.text},{text:" "},{...m,text:m.text}]})}}let a=s.find(c=>c.repoId===o)??null,l=a?zA(t,a):[];return a?.status==="ready"&&(a.pullRequest.number||l.length>0)&&(r.push({id:"target-detail-spacer",text:""}),r.push(...Py("target",a.branch,a.pullRequest)),l.length>0&&r.push({id:"target-pr-history",text:`+ ${l.length} previous PR${l.length!==1?"s":""}`,muted:!0})),r}function td(e,t){if(e?.type!=="project")return[];let n=new Set(t?.taskId===e.id?t.diffRows.map(r=>r.path.split("/")[0]).filter(r=>!!r):[]);return(e.repoTargets??[]).filter(r=>!!r.pullRequest.number||n.has(r.repoId)||by(e,r).length>0)}function zA(e,t){return by(e,t).filter(n=>n.number!==t.pullRequest.number&&(n.status==="merged"||n.status==="closed"))}function by(e,t){let n=JA(t,e.prs);return n?e.prs.filter(r=>r.owner?.toLowerCase()===n.owner&&r.repo?.toLowerCase()===n.repo):[]}function JA(e,t){if(e.pullRequest.owner&&e.pullRequest.repo)return{owner:e.pullRequest.owner.toLowerCase(),repo:e.pullRequest.repo.toLowerCase()};let n=XA(e.pullRequest.url);if(n)return n;let r=t.filter(i=>e.pullRequest.number!==null&&i.number===e.pullRequest.number),s=r.length===1?r[0]:null;return s?.owner&&s.repo?{owner:s.owner.toLowerCase(),repo:s.repo.toLowerCase()}:null}function XA(e){let t=e?.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/\d+(?:[/?#].*)?$/i);return t?.[1]&&t[2]?{owner:t[1].toLowerCase(),repo:t[2].toLowerCase()}:null}function Ry(e,t,n=null){return 3+Ty(e,t,n).length+Qu(e,n).length}function Py(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=ZA(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:eE(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${Sy(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(tE)):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)=>nE(u,r(`comment:${p}`))))),s}function QA(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 ZA(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function eE(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function Sy(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 tE(e){let{icon:t,color:n}=sE(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," ")} ${iE(e.status)}`,color:n,muted:!1}}function nE(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${Sy(e.createdAt)}`:"",s=rE(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 rE(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 sE(e){switch(e){case"success":return{icon:Hu,color:"9ece6a"};case"pending":return{icon:Gu,color:"e0af68"};case"failed":return{icon:Yu,color:"f7768e"};case"skipped":return{icon:Ku,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function iE(e){return e==="success"?"passing":e==="failed"?"failing":e}function oE(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=nd(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)?sy:iy:ry(l.label),p=l.kind==="directory"?"7aa2f7":cy(l.label),h=" ".repeat(l.depth),m=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:h},m,f];return{id:l.path,text:`${h}${u}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:y}})]}function nd(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 Qu(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(aE(t))return lE(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=>Iy(i,e,t))))}return n}function aE(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function lE(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=>Iy(c,e,t,s.length+1))))}}return n}function Iy(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 cE(e,t){return e?t?[{label:"Task",value:t.id},{label:"Repo",value:e.name},{label:"Agent",value:T.runners.getDisplayName(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:Ds.basename(t.worktreePath)}]:[{label:"Repo",value:e.name},{label:"Branch",value:e.defaultBranch},{label:"Task",value:"none",mutedValue:!0}]:[{label:"Repo",value:"none",mutedValue:!0}]}function uE(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0,pi:0})}function dE(e,t){return{name:T.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function vy(e,t,n,r,s=null){if(s)return pE(e,t,n,r,s);let i=Ru(e,t,{centerOnly:r});return fE(n,i)?{output:Wo(i.rows,n.rows,i.row,i.column),region:i}:null}function pE(e,t,n,r,s){let i=ig(e,t,s,{centerOnly:r});if(!i||!mE(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 fE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function mE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function Cy(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!hE(o,a))return null;!o||!a||(s+=Wo(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function hE(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 gE=["tasks","center","inspector"];function yE(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 sd(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return od({...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 od(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return Kh(t)?A({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):A({state:e});if(e.fileSearchQuery!==null)return yE(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"&&(Oo(e.selectedLeftItemId)||$o(e.selectedLeftItemId)))return A({state:{...e,selectedRunner:Co(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return Ay(e,1);if(t==="SHIFT_TAB"||t==="[")return Ay(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?mn(e,-1,n):sd(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===B?mn(e,1,n):sd(e,1,n);if(t==="PAGE_UP")return mn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return mn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return mn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return mn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??mt,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=IE(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"&&Cs(e.selectedLeftItemId)&&e.selectedTaskId)return A({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Jh(e.selectedLeftItemId)&&e.selectedWorkspaceId)return A({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&$y(e.activeTab,n.ptyTabIds??[]))return A({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return rd(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return Ey(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return rd(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return Ey(e,1)}if(ut(t)){if(e.focusedRegion==="tasks"&&(Oo(e.selectedLeftItemId)||$o(e.selectedLeftItemId))){let r=hu(e.selectedLeftItemId),s=gu(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"&&Cs(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return A({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:Rr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&$y(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return A({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:Rr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===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:TE({...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 mn(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"?Oy(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):A({state:e});if(e.focusedRegion==="center"&&e.activeTab===B){if(e.openInspectionKind==="file")return Oy(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return bE(e,t,n)}return A({state:e})}function Ay(e,t){return Zo(e,"focusedRegion",gE,t)}function rd(e,t,n){let r=Zo(e,"activeTab",n&&n.length>0?n:vE(e),t);return!r.changed||Gh(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:Rr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function sd(e,t,n){if(e.focusedRegion==="tasks")return wE(e,t,n.leftItemIds);if(e.focusedRegion==="center")return rd(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return Ny(e,t,n);if(n.projectTargetIds?.length){let s=id(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=id(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:B,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:Zo(e,"selectedActionId",qh,t)}return Zo(e,"selectedActionId",uu,t)}function wE(e,t,n){let r=id(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=mu(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=hu(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=gu(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function kE(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 kE(e,SE(e.inspectionMode,du,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=Wt(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 TE(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 Oy(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=Wt(e[t]+n,0,i);return o===e[t]?A({state:e}):A({state:{...e,[t]:o,actionMessage:null},changed:!0})}function bE(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return RE(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=Wt(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=Wt(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=Wt(o,0,i);return c===e.diffScrollOffset?A({state:e}):A({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function RE(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=Wt(e.diffScrollOffset+t,0,i),a=PE(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 PE(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function Zo(e,t,n,r){let s=n.indexOf(e[t]),i=Wt(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 id(e,t,n,r,s=!1){if(n.length===0)return A({state:e});let i=n.indexOf(e[t]??n[0]??""),o=Wt(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 SE(e,t,n){let r=t.indexOf(e);return t[Wt(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 $y(e,t){return t.includes(e)}function IE(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Rr(e.activeTab)??e.preferredPtyTabKind}function vE(e){return[e.selectedPtyTabId,e.openInspectionKind?B:null].filter(t=>typeof t=="string")}function Wt(e,t,n){return Math.min(n,Math.max(t,e))}var Dy=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??CE(i,e.activeTab,e.preferredPtyTabKind),a=Fy(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"}`}}},_y=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}`}}},xy=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})})},Ly=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=Fy(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 CE(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function Fy(e,t,n,r={}){let s=n??e.runner,i=T.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(h=>h.id)),c=1,d=a;for(;l.has(d);)c+=1,d=`${a}-${c}`;let u=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:d,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?T.runners.buildCommand(s,void 0,r):[],createdAt:u,updatedAt:u}}var vr=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},My=async(e,t,n,r,s)=>{T.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});T.previews.isEnabled(s.config,"agentOrchestration")&&await et(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=fo();mo(T.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",d=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new vr(c,d)}let o=await s.taskService.markTaskStarted(s.paths,i.task.id),a={selectedRepoId:o.repoId,selectedWorkspaceId:o.workspaceId,selectedTaskId:o.id,selectedPtyTabId:o.selectedPtyTabId,inputMode:"control",focusedRegion:"center",activeTab:o.selectedPtyTabId??"agent",selectedActionId:"commit"};return{task:o,nextShell:a}},jy=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},qy=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 Nr(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}`}}},Uy=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Nr(t.paths,n.id)))),Cr=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await de.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var Wy=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 By=async(e,t,n)=>{let r=T.runners.setRunnerEnabled(n.config,e,t);return await T.save(n.paths,r),r},Vy=async(e,t,n)=>{let r=T.runners.setRunnerPath(n.config,e,t);return await T.save(n.paths,r),r},Ky=async(e,t,n)=>{let r=T.previews.setEnabled(n.config,e,t);return await T.save(n.paths,r),r};var AE=250;function Bt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function hn(e,t){return qt(t,e.ptyRuntime.getViewState(Ar(e,t)))}function Ar(e,t){let n=Bt(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 hn(e,Xh(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 Hy(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 de.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function J(e,t){if(!e.uiStateFile)return;e.runtimeState=Bh(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>Vt({uiStateFile:e.uiStateFile},n),()=>Vt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function EE(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:Te,queueTaskMutation:t=>EE(e,t)}}function ad(e,t){let n=Bt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?nd(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:Mn(e.model),centerTabIds:Yh(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:Ry(t,n,s),pageRows:Math.max(5,qe(e.activeTerminal.width,e.activeTerminal.height).height-Z.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:td(n,s).map(a=>a.repoId)}}async function Yy(e,t){await xy(t,oe(e))}async function Pe(e){e.model=await Pr(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 ea(e,t){e.model={...e.model,tasks:[...e.model.tasks.filter(n=>n.id!==t.id),...t.status==="closed"?[]:[t]].sort((n,r)=>n.id.localeCompare(r.id))}}async function ta(e,t){let n=++e.inspectionRefreshSequence,r=yu(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 vh(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await Pr(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)},J(e,e.state.shell),e.render())}function zy(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)&&ta(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()})},AE))}function Jy(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=mn(e.state.shell,n,ad(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:I(e,r.state)},J(e,e.state.shell),e.render(),ta(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)},J(e,e.state.shell),e.render()}},16)))}function ld(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function cd(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 Qy(e){cd(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.render())})}async function Zy(e,t){let n=I(e,t),r=Bt(e.model.tasks,n),s=Ar(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 qt(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,dn(qe(e.activeTerminal.width,e.activeTerminal.height)));return qt({...n,inputMode:"control"},o)}function ud(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 dd(e,t){try{let n=I(e,t),r=Bt(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 Xy(e,r),await Pe(e),s=r.selectedPtyTabId)}r&&!s&&(r=await Xy(e,r),await Pe(e),s=r.selectedPtyTabId);let i=I(e,{...n,activeTab:s??n.activeTab,selectedPtyTabId:s,focusedRegion:s?"center":n.focusedRegion});if(!i.selectedTaskId||!s){e.state={mode:"main",shell:i},e.render();return}e.state={mode:"main",shell:qt({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},J(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,dn(qe(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Ut(s),e.lastTerminalKey=null,e.state={mode:"main",shell:qt({...i,inputMode:"terminal"},o)},J(e,e.state.shell)}catch(n){let r=ie(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&Ut(t.selectedPtyTabId)&&(await OE(e,t.selectedTaskId,r).catch(()=>{}),await Pe(e).catch(()=>{})),e.state={mode:"main",shell:se(e,Vh(I(e,t),r),r)},J(e,e.state.shell)}e.render()}async function OE(e,t,n){await jy(t,n,oe(e))}async function ew(e,t,n,r){let s=I(e,t),{nextShell:i}=await Dy(s,n,r,oe(e));return await Pe(e),I(e,{...s,...i})}async function tw(e,t){let n=I(e,t),{closedTab:r,nextShell:s}=await _y(n,oe(e));return e.ptyRuntime.disposeSession(r.id),await Pe(e),I(e,{...n,...s})}async function nw(e,t){let n=I(e,t),r=Mn(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await qy(n,oe(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Pe(e),I(e,{...n,...o,selectedLeftItemId:$E(r,Mn(e.model),s)})}async function rw(e,t){let n=I(e,t),{nextShell:r}=await Wy(n,oe(e));return await Pe(e),I(e,{...n,...r})}async function Xy(e,t){return Ly(t,oe(e))}function na(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:hn(e,e.state.shell)},e.render())},16))}function sw(e){e.scrollRenderTimer&&(clearTimeout(e.scrollRenderTimer),e.scrollRenderTimer=null),e.pendingScrollLines=0,e.ptyRuntime.scrollViewport(Number.MAX_SAFE_INTEGER),e.state.mode==="main"&&(e.state={mode:"main",shell:hn(e,e.state.shell)},e.render())}function $E(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 ow(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=iw(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await Uy(s,oe(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)ea(e,o);t.recordSuccess(i,iw(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,Cr("background PR polling",i,oe(e)))}}function iw(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function aw(e,t){let n=I(e,t),r=Bt(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 Pe(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 Pe(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${K(a)?.requiredChecks.length??0} reported`)}return I(e,{...Hy(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import LE from"node:path";import{readdir as NE,stat as DE}from"node:fs/promises";import lw from"node:path";async function _E(e){let t=await NE(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=lw.join(e,r.name);n.push({name:r.name,path:s,kind:await xE(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 cw(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function uw(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 ra(e,t){let n=await _E(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 xE(e){let t=lw.join(e,".git");return await DE(t).catch(()=>null)!==null}function dw(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function pw(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function FE(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 My(t.selectedRepoId,t.selectedWorkspaceId,n,t.selectedRunner,oe(e));r=s.task,await Pe(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??hg(r,"agent"),dn(qe(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Ut(i.selectedPtyTabId),e.state={mode:"main",shell:qt(i,o)},J(e,e.state.shell)}catch(s){s instanceof vr&&(r=s.task);let i=ie(e,"create task",s,"Failed to create task.");r&&!(s instanceof vr)?(await V(e.paths,r.id,o=>({...o,status:"draft",runnerSession:{...o.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:i})).catch(()=>{}),await Pe(e).catch(()=>{})):r&&(await V(e.paths,r.id,o=>({...o,lastFailureReason:i})).catch(()=>{}),await Pe(e).catch(()=>{})),e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,inputMode:"control",selectedTaskId:r?.id??e.state.shell.selectedTaskId,selectedPtyTabId:r?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:r?`task:${r.id}`:e.state.shell.selectedLeftItemId,activeTab:r?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:r?null:"",taskPromptError:i,actionMessage:null}),i)}}finally{e.creatingTask=!1,e.render()}}function ME(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(ut(t)){FE(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:Co(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}pu(t)&&(e.state={mode:"main",shell:I(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function jE(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=cw(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"){ra(e,LE.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"||ut(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){ra(e,s.path).catch(o=>{let a=ie(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()});return}let{workspaceService:i}=oe(e);i.addWorkspace(e.paths,s.path).then(async o=>{await Pe(e);let a=o.repos[0]??null,l=I(e,{...e.state.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${o.workspace.id}`,selectedWorkspaceId:o.workspace.id,selectedRepoId:a?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${o.workspace.name??o.workspace.id}`});e.state={mode:"main",shell:l},J(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 qE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=ey(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;UE(e,r)}}}async function UE(e,t){let n;try{n=await de.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 WE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=ny(dw(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"?By(n.runner,n.enabled,oe(e)):Vy(n.runner,n.path,oe(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=T.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:T.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:{...dw(e),message:i}},e.render()})}function BE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=ty(pw(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}Ky(n.feature,n.enabled,oe(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,e.enabledRunnerIds=T.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:T.runners.getDefault(e.config)}),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:{...pw(e),message:s}},e.render()})}}function fw(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){ME(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){jE(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){KE(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=od(e.state.shell,n,ad(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)},J(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)},J(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&ut(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Os(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(VE(e,n))return;e.lastTerminalKey=gg(n)?{key:n,at:Date.now()}:null;let i=yg(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){na(e,i);return}pu(n)&&(e.state.shell.terminal.scrolledBack||e.pendingScrollLines<0)&&Ut(e.state.shell.selectedPtyTabId)&&sw(e),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)},J(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){ra(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){ew(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{dd(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){tw(e,r.state).then(s=>{e.state={mode:"main",shell:s},J(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){aw(e,r.state).then(s=>{e.state={mode:"main",shell:s},J(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=Bt(e.model.tasks,r.state),i=s?K(s)?.url??null:null;i?uw(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){nw(e,r.state).then(s=>{e.state={mode:"main",shell:s},J(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){rw(e,r.state).then(s=>{e.state={mode:"main",shell:s},J(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){dd(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:I(e,r.state)},J(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){zy(e,e.state.shell);return}ta(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)},Yy(e,e.state.shell).catch(()=>{}),J(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"){qE(e,n);return}if(e.state.variant==="runners"){WE(e,n);return}if(e.state.variant==="previews"){BE(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||ut(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"||ut(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(ut(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;Zy(e,s).then(i=>{e.state.mode!=="main"||e.state.shell!==s||(e.state={mode:"main",shell:i},J(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)},J(e,e.state.shell),e.render()})}):Qy(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 mw(e,t){let n=Rg(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=Os(i);if(o){gw(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(Eu(i)){e.pendingTerminalKeySequence.raw=i,hw(e);return}sa(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"})},J(e,e.state.shell),e.render();return}let r=wg(n);if(r!==0){na(e,r);return}let s=Os(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
283
284
  `&&n!==`\r
284
- `&&(e.suppressTerminalEnterOnAttach=!1),kg(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function jE(e,t){if(e.pendingTerminalKeySequence){let n=yg(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Os(r);if(s)return pw(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(Cu(r))return e.pendingTerminalKeySequence.raw=r,dw(e),!0}return na(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>na(e),30)},!0)}function dw(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>na(e),30))}function na(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function pw(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function fw(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){Gy(e,vu(t));return}let n=vu(t);n!==0&&ea(e,n)}function qE(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var WE=UE(import.meta.url),BE=WE("terminal-kit"),VE=BE.terminal;function ud(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function mw(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function hw(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function KE(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 gw(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=Ae(t),r=await T.load(n),s=T.runners.getEnabled(r),i=e.uiStateFile?await qn({uiStateFile:e.uiStateFile}):null,o=await Pr(t,void 0,s),a=vs(qh(i,r),o);o=await Pr(t,a,s);let l={current:o},c=()=>{},d=()=>{},u=()=>{},p={workspaceRoot:t,onUpdate:m=>c(m),onActivity:m=>d(m),onActivityRemoved:m=>u(m),resolveSessionSpec:(m,f)=>pg(l.current,f,t)},h=e.ptyRuntime??await xg({...p,paths:n,activityEnabled:!0});return new Promise(m=>{let f=e.terminal??VE,y=null,k=null,R=null,b=null,$=null,O=0,N=!1,x=new Map,v=h.managesPullRequestSync?null:new Ir({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,Se=new pn({resolutionMs:Hu,onError:(C,U)=>Cr(`heartbeat job "${C}"`,U,oe(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:vs(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${T.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:h,resolve:m,render:()=>{},renderTaskNavigation:()=>!1,exit:C=>m(C)},w.ptyRuntime.setActivityEnabled?.(!0),c=C=>{w.state.mode==="main"&&($=KE($,C),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let U=$;if($=null,w.state.mode==="main"){let ee=hn(w,w.state.shell);if(w.state={mode:"main",shell:ee},!b||!k){w.render();return}let we=qe(f.width,f.height),me={...b,terminal:ee.terminal},ft=Ry(we,me,k,ee.centerZoomed,U?.kind==="rows"?U.rowIndices:null);if(!ft){w.render();return}ft.output.length>0&&f.noFormat(ft.output),b=me,k=ft.region,R&&(R={...R,center:ft.region}),y=null,f.hideCursor(!0)}},0)))},d=C=>{w.state.mode==="main"&&Ut(C.tabId)&&x.get(C.tabId)!==Ot(C.tabId,[C],Date.now())&&w.render()},u=C=>{w.state.mode==="main"&&Ut(C)&&x.get(C)!=="idle"&&w.render()};let ye=Promise.resolve(),Y=C=>{ye=ye.then(async()=>{let U=await Promise.all([...new Set(C)].map(ee=>P.getTask(w.paths,ee)));for(let ee of U)Qo(w,ee);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(U=>Cr("daemon task-state refresh",U,oe(w)))};w.ptyRuntime.setTasksChangedHandler?.(Y);let gn=Promise.resolve(),ra=C=>{gn=gn.then(async()=>{let U=w.state.shell,ee=w.model.tasks.find(sa=>sa.id===U.selectedTaskId)??null,we=ee&&w.model.inspection?.taskId===ee.id?w.model.inspection:null;if(!ee||!we)throw new Error("Craig needs an active task before it can open a file from an agent session.");let me=await Nh(C);w.model={...w.model,inspection:{...we,filePaths:[...new Set([...we.filePaths,C])],selectedFilePath:C,selectedFile:me,error:null}},w.ptyRuntime.detach();let ft=I(w,{...U,inputMode:"control",focusedRegion:"center",activeTab:B,inspectionMode:"files",openInspectionKind:"file",selectedFileTreePath:C,selectedFilePath:C,fileScrollOffset:0,actionMessage:null});w.state={mode:"main",shell:ft},J(w,ft),w.render()}).catch(U=>Cr("open file from agent",U,oe(w)))};w.ptyRuntime.setOpenFileHandler?.(ra);let _s=C=>{let U=qe(f.width,f.height),ee=w.ptyRuntime.getActivitySnapshots?.()??[],we=Date.now(),me=uy(I(w,C.shell),w.model,{snapshots:ee,now:we,animationFrame:O});x.clear();for(let sa of w.model.tasks)for(let ia of sa.ptyTabs)ia.kind==="agent"&&x.set(ia.id,Ot(ia.id,ee,we));let ft=ng(U,me,{centerOnly:C.shell.centerZoomed,focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:me,presentation:ft}},dd=(C,U,ee,we)=>{if(!R)return!1;let me=Py(R,U.regions,ee);return me?(me.output.length>0&&f.noFormat(me.output),b=C,R=me.regions,k=me.regions.center,y=we?U.frame:null,f.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;ld(w),w.ptyRuntime.setPullRequestPollView?.(hw(w.state)),w.ptyRuntime.setViewedTab?.(Ar(w,w.state.shell));let{data:C,presentation:U}=_s(w.state);return dd(C,U,["rail","left","center","footer"],!1)},w.render=()=>{ld(w);let C=w.state;w.ptyRuntime.setPullRequestPollView?.(hw(C)),w.ptyRuntime.setViewedTab?.(C.mode==="main"?Ar(w,C.shell):null);let U=qe(f.width,f.height),ee,we=null;if(C.mode==="main"){let me=_s(C);if(we=me.presentation,ee=we.frame,!w.pendingClear&&dd(me.data,we,["rail","left","center","right","footer"],!0))return;b=me.data,k=we.center}else ee=C.variant==="boot"?Qh(U,{menuIndex:C.menuIndex,optionsMessage:C.optionsMessage,versionText:w.versionText,updateText:w.updateText}):C.variant==="pause"?Zh(U,{menuIndex:C.menuIndex,optionsMessage:C.optionsMessage,versionText:w.versionText,updateText:w.updateText}):C.variant==="options"?Mo(U,{menuIndex:C.menuIndex,optionsMenuItems:qu}):C.variant==="runners"?Mo(U,{menuIndex:ud(C).menuIndex,optionsMenuItems:Uu(w.config,ud(C)),optionsMessage:Hg(ud(C)),optionsSubtitle:"Runners"}):C.variant==="previews"?Mo(U,{menuIndex:mw(C).menuIndex,optionsMenuItems:Yg(w.config),optionsMessage:zg(mw(C)),optionsSubtitle:"Feature Previews - Experimental"}):C.variant==="logs"?tg(U,{logPath:C.log?.path??n.logFile,logLines:C.log?.lines??[]}):eg(U),b=null,k=null,R=null;w.pendingClear&&(f.moveTo(1,1),f.eraseDisplayBelow(),w.pendingClear=!1,y=null),f.noFormat(bg(ee,y)),y=ee,R=we?.regions??null,f.hideCursor(!0)};let pd=C=>cw(w,C),fd=C=>uw(w,C),md=C=>fw(w,C),ww=()=>{process.stdout.off("resize",hd),process.off("SIGCONT",gd),f.removeListener("key",pd),f.removeListener("unknown",fd),f.removeListener("mouse",md),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),Se.stop(),w.ptyRuntime.disposeAll(),f.grabInput(!1),f.hideCursor(!1),f.fullscreen(!1)};w.exit=C=>{ww(),m(C)};let hd=()=>{od(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(dn(qe(f.width,f.height))),w.state={mode:"main",shell:hn(w,w.state.shell)}),w.render()},gd=()=>{od(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(dn(qe(f.width,f.height))),w.state={mode:"main",shell:hn(w,w.state.shell)}),w.render()};process.stdout.on("resize",hd),process.on("SIGCONT",gd),f.grabInput(!0),w.inputCaptureMode="control",f.hideCursor(!0),f.fullscreen(!0),f.on("key",pd),f.on("unknown",fd),f.on("mouse",md),v&&Se.register({id:"github.pull-requests",intervalMs:1e3,run:C=>nw(w,v,C)}),Se.register({id:"agent.activity-indicators",intervalMs:Hu,run:()=>{let C=Date.now(),U=mi(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],C);(U||N)&&(O=(O+1)%oy,w.state.mode==="main"&&w.render()),N=U}}),Se.start(),T.version.checkForUpdate().then(C=>{C.updateAvailable&&C.latest&&(w.updateText=`Update available: v${C.latest}`,w.render())}),w.bootHydrationReady=ad(w).catch(()=>{}),w.render()})}async function HE(){try{if(process.argv[2]==="__craig-daemon"){let e=await yw(process.argv[3]??process.cwd()),t=Ae(e);return await Fg(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await yw(process.argv[3]??process.cwd()),t=Ae(e);return await Lg(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
285
- `),1}return bh({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=>gw({uiStateFile:Ae(e).uiStateFile,workspaceRoot:e})})}async function yw(e){return GE(e)}var YE=await HE();process.exit(YE);
285
+ `&&(e.suppressTerminalEnterOnAttach=!1),bg(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function VE(e,t){if(e.pendingTerminalKeySequence){let n=kg(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Os(r);if(s)return gw(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(Eu(r))return e.pendingTerminalKeySequence.raw=r,hw(e),!0}return sa(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>sa(e),30)},!0)}function hw(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>sa(e),30))}function sa(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function gw(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function yw(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){Jy(e,Au(t));return}let n=Au(t);n!==0&&na(e,n)}function KE(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var HE=GE(import.meta.url),YE=HE("terminal-kit"),zE=YE.terminal;function pd(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function ww(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function kw(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function JE(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 Tw(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=Ae(t),r=await T.load(n),s=T.runners.getEnabled(r),i=e.uiStateFile?await qn({uiStateFile:e.uiStateFile}):null,o=await Pr(t,void 0,s),a=vs(Wh(i,r),o);o=await Pr(t,a,s);let l={current:o},c=()=>{},d=()=>{},u=()=>{},p={workspaceRoot:t,onUpdate:m=>c(m),onActivity:m=>d(m),onActivityRemoved:m=>u(m),resolveSessionSpec:(m,f)=>mg(l.current,f,t)},h=e.ptyRuntime??await jg({...p,paths:n,activityEnabled:!0});return new Promise(m=>{let f=e.terminal??zE,y=null,k=null,R=null,b=null,$=null,O=0,N=!1,x=new Map,v=h.managesPullRequestSync?null:new Ir({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,Se=new pn({resolutionMs:zu,onError:(C,U)=>Cr(`heartbeat job "${C}"`,U,oe(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:vs(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${T.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:h,resolve:m,render:()=>{},renderTaskNavigation:()=>!1,exit:C=>m(C)},w.ptyRuntime.setActivityEnabled?.(!0),c=C=>{w.state.mode==="main"&&($=JE($,C),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let U=$;if($=null,w.state.mode==="main"){let ee=hn(w,w.state.shell);if(w.state={mode:"main",shell:ee},!b||!k){w.render();return}let we=qe(f.width,f.height),me={...b,terminal:ee.terminal},ft=vy(we,me,k,ee.centerZoomed,U?.kind==="rows"?U.rowIndices:null);if(!ft){w.render();return}ft.output.length>0&&f.noFormat(ft.output),b=me,k=ft.region,R&&(R={...R,center:ft.region}),y=null,f.hideCursor(!0)}},0)))},d=C=>{w.state.mode==="main"&&Ut(C.tabId)&&x.get(C.tabId)!==Ot(C.tabId,[C],Date.now())&&w.render()},u=C=>{w.state.mode==="main"&&Ut(C)&&x.get(C)!=="idle"&&w.render()};let ye=Promise.resolve(),Y=C=>{ye=ye.then(async()=>{let U=await Promise.all([...new Set(C)].map(ee=>P.getTask(w.paths,ee)));for(let ee of U)ea(w,ee);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(U=>Cr("daemon task-state refresh",U,oe(w)))};w.ptyRuntime.setTasksChangedHandler?.(Y);let gn=Promise.resolve(),ia=C=>{gn=gn.then(async()=>{let U=w.state.shell,ee=w.model.tasks.find(oa=>oa.id===U.selectedTaskId)??null,we=ee&&w.model.inspection?.taskId===ee.id?w.model.inspection:null;if(!ee||!we)throw new Error("Craig needs an active task before it can open a file from an agent session.");let me=await _h(C);w.model={...w.model,inspection:{...we,filePaths:[...new Set([...we.filePaths,C])],selectedFilePath:C,selectedFile:me,error:null}},w.ptyRuntime.detach();let ft=I(w,{...U,inputMode:"control",focusedRegion:"center",activeTab:B,inspectionMode:"files",openInspectionKind:"file",selectedFileTreePath:C,selectedFilePath:C,fileScrollOffset:0,actionMessage:null});w.state={mode:"main",shell:ft},J(w,ft),w.render()}).catch(U=>Cr("open file from agent",U,oe(w)))};w.ptyRuntime.setOpenFileHandler?.(ia);let _s=C=>{let U=qe(f.width,f.height),ee=w.ptyRuntime.getActivitySnapshots?.()??[],we=Date.now(),me=my(I(w,C.shell),w.model,{snapshots:ee,now:we,animationFrame:O});x.clear();for(let oa of w.model.tasks)for(let aa of oa.ptyTabs)aa.kind==="agent"&&x.set(aa.id,Ot(aa.id,ee,we));let ft=sg(U,me,{centerOnly:C.shell.centerZoomed,focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:me,presentation:ft}},fd=(C,U,ee,we)=>{if(!R)return!1;let me=Cy(R,U.regions,ee);return me?(me.output.length>0&&f.noFormat(me.output),b=C,R=me.regions,k=me.regions.center,y=we?U.frame:null,f.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;ud(w),w.ptyRuntime.setPullRequestPollView?.(kw(w.state)),w.ptyRuntime.setViewedTab?.(Ar(w,w.state.shell));let{data:C,presentation:U}=_s(w.state);return fd(C,U,["rail","left","center","footer"],!1)},w.render=()=>{ud(w);let C=w.state;w.ptyRuntime.setPullRequestPollView?.(kw(C)),w.ptyRuntime.setViewedTab?.(C.mode==="main"?Ar(w,C.shell):null);let U=qe(f.width,f.height),ee,we=null;if(C.mode==="main"){let me=_s(C);if(we=me.presentation,ee=we.frame,!w.pendingClear&&fd(me.data,we,["rail","left","center","right","footer"],!0))return;b=me.data,k=we.center}else ee=C.variant==="boot"?eg(U,{menuIndex:C.menuIndex,optionsMessage:C.optionsMessage,versionText:w.versionText,updateText:w.updateText}):C.variant==="pause"?tg(U,{menuIndex:C.menuIndex,optionsMessage:C.optionsMessage,versionText:w.versionText,updateText:w.updateText}):C.variant==="options"?jo(U,{menuIndex:C.menuIndex,optionsMenuItems:Wu}):C.variant==="runners"?jo(U,{menuIndex:pd(C).menuIndex,optionsMenuItems:Bu(w.config,pd(C)),optionsMessage:Xg(pd(C)),optionsSubtitle:"Runners"}):C.variant==="previews"?jo(U,{menuIndex:ww(C).menuIndex,optionsMenuItems:Qg(w.config),optionsMessage:Zg(ww(C)),optionsSubtitle:"Feature Previews - Experimental"}):C.variant==="logs"?rg(U,{logPath:C.log?.path??n.logFile,logLines:C.log?.lines??[]}):ng(U),b=null,k=null,R=null;w.pendingClear&&(f.moveTo(1,1),f.eraseDisplayBelow(),w.pendingClear=!1,y=null),f.noFormat(Pg(ee,y)),y=ee,R=we?.regions??null,f.hideCursor(!0)};let md=C=>fw(w,C),hd=C=>mw(w,C),gd=C=>yw(w,C),Rw=()=>{process.stdout.off("resize",yd),process.off("SIGCONT",wd),f.removeListener("key",md),f.removeListener("unknown",hd),f.removeListener("mouse",gd),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),Se.stop(),w.ptyRuntime.disposeAll(),f.grabInput(!1),f.hideCursor(!1),f.fullscreen(!1)};w.exit=C=>{Rw(),m(C)};let yd=()=>{ld(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(dn(qe(f.width,f.height))),w.state={mode:"main",shell:hn(w,w.state.shell)}),w.render()},wd=()=>{ld(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(dn(qe(f.width,f.height))),w.state={mode:"main",shell:hn(w,w.state.shell)}),w.render()};process.stdout.on("resize",yd),process.on("SIGCONT",wd),f.grabInput(!0),w.inputCaptureMode="control",f.hideCursor(!0),f.fullscreen(!0),f.on("key",md),f.on("unknown",hd),f.on("mouse",gd),v&&Se.register({id:"github.pull-requests",intervalMs:1e3,run:C=>ow(w,v,C)}),Se.register({id:"agent.activity-indicators",intervalMs:zu,run:()=>{let C=Date.now(),U=mi(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],C);(U||N)&&(O=(O+1)%uy,w.state.mode==="main"&&w.render()),N=U}}),Se.start(),T.version.checkForUpdate().then(C=>{C.updateAvailable&&C.latest&&(w.updateText=`Update available: v${C.latest}`,w.render())}),w.bootHydrationReady=cd(w).catch(()=>{}),w.render()})}async function QE(){try{if(process.argv[2]==="__craig-daemon"){let e=await bw(process.argv[3]??process.cwd()),t=Ae(e);return await qg(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await bw(process.argv[3]??process.cwd()),t=Ae(e);return await Ug(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
286
+ `),1}return Ph({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=>Tw({uiStateFile:Ae(e).uiStateFile,workspaceRoot:e})})}async function bw(e){return XE(e)}var ZE=await QE();process.exit(ZE);