craig-cli 0.17.6 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.js +123 -121
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
- var Mw=Object.defineProperty;var qs=(e,t)=>{for(var n in t)Mw(e,n,{get:t[n],enumerable:!0})};import{realpath as o0}from"node:fs/promises";import ke from"node:path";function Ee(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 lu from"node:path";import{readFile as XI}from"node:fs/promises";import{readFile as Gw}from"node:fs/promises";import{randomUUID as jw}from"node:crypto";import{chmod as qw,open as Bw,readFile as Uw,rename as Ww,rm as Vw}from"node:fs/promises";import da from"node:path";async function U(e,t,n={}){let r=da.dirname(e),s=da.join(r,`.${da.basename(e)}.${process.pid}.${Date.now()}.${jw()}.tmp`),i=await Bw(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 Ww(s,e),n.mode!==void 0&&await qw(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await Vw(s,{force:!0}).catch(()=>{}),o}}async function Bs(e){try{let t=await Uw(e,"utf8");return JSON.parse(t)}catch(t){if(Kw(t))return null;throw t}}function Kw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}async function Un(e){try{let t=await Gw(e.uiStateFile,"utf8"),n=JSON.parse(t);return Hw(n,e.uiStateFile)}catch(t){if(zw(t))return null;throw t}}async function Gt(e,t){await U(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function Ws(){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 Hw(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")||!Bn(e,"inputMode")||!Bn(e,"focusedRegion")||!Bn(e,"activeTab")||!Bn(e,"inspectorSection")||!Bn(e,"inspectionMode")||!Us(e,"openInspectionKind")||!Us(e,"selectedFileTreePath")||!Us(e,"selectedFilePath")||!Us(e,"selectedDiffPath")||!Yw(e,"collapsedFileTreePaths")||!Bn(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 Bn(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function Us(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function Yw(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function zw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var pa={};qs(pa,{RUNNER_IDS:()=>ue,STABLE_RUNNER_IDS:()=>ht,assertEnabled:()=>Pd,buildCommand:()=>vd,getConfiguredProfile:()=>Vs,getDefault:()=>Rd,getDisplayName:()=>Id,getEnabled:()=>Ks,getProfile:()=>Wn,isRunnerType:()=>Gs,parse:()=>Sd,setRunnerEnabled:()=>Cd,setRunnerPath:()=>Ad});var ht=["codex","cursor","claude"],ue=[...ht,"pi"];var bd={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 Wn=e=>bd[e];var Vs=(e,t={})=>{let n=Wn(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}};var Ks=(e={})=>ue.filter(t=>t!=="pi"||e.previews?.piRunner===!0).filter(t=>e.runners?.[t]?.enabled!==!1);var Rd=(e={})=>{let t=Ks(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 Pd=(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 Gs=e=>ue.includes(e);var Sd=e=>{if(!e||e.length===0)return"codex";if(!Gs(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${ue.join(", ")}.`);return e};var Id=e=>Wn(e).displayName;var vd=(e,t,n={})=>{let r=[Vs(e,n).executable];return t&&t.length>0&&r.push(t),r};var Cd=(e,t,n)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}});var Ad=(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 fa={};qs(fa,{PREVIEW_FEATURE_IDS:()=>Xe,isEnabled:()=>Ed,setEnabled:()=>Od});var Xe=["agentOrchestration","piRunner","fileOpen","panelPolish"];function Ed(e,t){return e.previews?.[t]===!0}function Od(e,t,n){return{...e,previews:{...e.previews,[t]:n}}}import{mkdir as Jw,readFile as Xw,writeFile as Qw}from"node:fs/promises";import Zw from"node:path";var ek=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",$d=async e=>{try{return await Xw(e,"utf8")}catch(t){if(ek(t))return null;throw t}},Nd=async(e,t)=>{await Jw(Zw.dirname(e),{recursive:!0}),await Qw(e,t,"utf8")};var tk=["incrementalCenterPane","agentActivityIndicators"],Hs=(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(!tk.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 ma=async(e,t={readConfigFile:$d})=>{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 Hs(r,e.configFile)};var ha=async(e,t,n={writeConfigFile:Nd})=>{Hs(t,e.configFile),await n.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
4
- `)};var ga={};qs(ga,{checkForUpdate:()=>Dd,getCurrent:()=>Ys});var Ys=()=>{try{return"0.17.6"}catch{return"unknown"}};var nk="https://registry.npmjs.org/craig-cli/latest",rk=3600*1e3,sk={value:null},ik=(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},Dd=async(e={fetch:globalThis.fetch,getCurrent:Ys,cache:sk})=>{let t=e.getCurrent(),n=Date.now();if(e.cache.value&&n-e.cache.value.cachedAt<rk)return e.cache.value.result;let r=null;try{let i=await e.fetch(nk,{signal:AbortSignal.timeout(5e3)});i.ok&&(r=(await i.json()).version??null)}catch{}let s={current:t,latest:r,updateAvailable:r!==null&&r!==t&&ik(r,t)};return e.cache.value={result:s,cachedAt:n},s};var k={load:ma,save:ha,previews:fa,runners:pa,version:ga};var _d={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=_d[t],this.retryable=r.retryable??!1,this.details=r.details??{}}};function ya(e){return e instanceof g?e:new g("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as ok,mkdir as ak,readFile as lk}from"node:fs/promises";import ck from"node:path";var xd=80,zs=async(e,t)=>{await ak(ck.dirname(e.logFile),{recursive:!0});let n={timestamp:new Date().toISOString(),...t};await ok(e.logFile,`${JSON.stringify(n)}
5
- `,"utf8")},Fd=async(e,t)=>{try{await zs(e,t)}catch{}},Js=async(e,t=xd)=>{try{let s=(await lk(e.logFile,"utf8")).trimEnd().split(`
6
- `).filter(i=>i.length>0).map(uk);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(pk(n))return{path:e.logFile,lines:[],empty:!0};throw n}},wa=async(e,t)=>zs(e,{level:"error",component:"application",event:dk(t.context),message:t.message,...t.details?{details:t.details}:{}}),Ld=async(e,t)=>{try{await wa(e,t)}catch{}},Md=Js,jd=async(e,t=xd)=>Js(e,t);function uk(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 dk(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function pk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var de={appendErrorLog:wa,appendErrorLogBestEffort:Ld,appendLog:zs,appendLogBestEffort:Fd,readLog:Js,readErrorLog:Md,readRecentErrorLines:jd};function Wd(e){let{commandTokens:t,options:n,help:r}=mk(e);if(r)return Bd({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":_r(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:ka(o,"Repo path")};break;case"repo:list":_r(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:Z(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:ka(o,"Workspace path")};break;case"workspace:list":a=hk(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:Z(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:Z(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:Z(o,"Workspace id")};break;case"file:open":a={kind:"openFile",path:Z(o,"File path")};break;case"task:new":a=yk(o);break;case"task:create-child":a=wk(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:Z(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:Z(o,"Task id")}};break;case"task:list":a=gk(o);break;case"task:current":_r(o,"task current"),a={kind:"currentTask"};break;case"task:rename":a={kind:"renameTask",title:ka(o,"Task title")};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:Z(o,"Task id")};break;case"task:pr":a=kk(o);break;case"task:repo":if(o[0]!=="add")throw S(`Unsupported task repo command: ${o.join(" ")}`);Qs(o,3,"task repo add"),a={kind:"addTaskRepoTarget",taskId:Xs(o,1,"Task id"),repoId:Xs(o,2,"Repo id")};break;case"task:wait":a=vk(o);break;case"agent:list":_r(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=Rk(o);break;case"agent:send":a=Pk(o);break;case"command:show":a={kind:"showPromptCommand",commandId:Z(o,"Command id")};break;case"command:list":_r(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:Z(o,"Command id")};break;case"command:wait":a=Sk(o);break;case"events:list":a=qd(o,!1);break;case"events:watch":a=qd(o,!0);break;case"fury:validate":a={kind:"validateFury",file:Z(o,"Fury file")};break;case"fury:plan":a=Ck(o);break;case"fury:approve":a={kind:"approveFury",planId:Z(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:Z(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:Z(o,"Fury run id")};break;case"fury:watch":a=Ak(o);break;case"fury:cancel":a={kind:"cancelFury",runId:Z(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:Z(o,"Fury run id")};break;case"fury:step":a=Ek(o);break;case"fury:reviews":a=Ok(o);break;case"fury:review":a=$k(o);break;case"task:logs":a={kind:"streamTaskLogs",taskId:Z(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:Z(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:Z(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:Z(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:Z(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:Xs(o,0,"Task id"),repoId:Xs(o,1,"Repo id")},Qs(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:Z(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw S(`Unsupported command: ${t.join(" ")}`)}return Bd(a,n)}function Vd(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 fk(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 Ta(){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 mk(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||!Ud(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==="--"||Ud(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 hk(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 gk(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 yk(e){let t,n,r,s=[],i=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){i=!1;continue}if(!i||!["--repo","--workspace","--runner"].includes(l)){if(i&&l.startsWith("--"))throw S(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw S(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw S("Task option --repo may only be provided once.");t=L(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw S("Task option --workspace may only be provided once.");n=L(c,"Workspace id")}else{if(r!==void 0)throw S("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(d){throw S(d instanceof Error?d.message:"Unsupported runner.")}}}if(!t&&!n)throw S("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw S("Task creation accepts either '--repo' or '--workspace', not both.");let o=L(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function wk(e){let t,n,r,s,i,o=[],a=!0;for(let l=0;l<e.length;l+=1){let c=e[l];if(c==="--"){a=!1;continue}if(!a||!["--parent","--repo","--workspace","--runner","--idempotency-key"].includes(c)){if(a&&c.startsWith("--"))throw S(`Unsupported task create-child option: ${c}`);o.push(c);continue}let d=e[l+1];if(d===void 0||d==="--")throw S(`Task option ${c} requires a value.`);if(l+=1,c==="--parent"){if(t)throw S("Task option --parent may only be provided once.");t=L(d,"Parent task id")}else if(c==="--repo"){if(n)throw S("Task option --repo may only be provided once.");n=L(d,"Repo id")}else if(c==="--workspace"){if(r)throw S("Task option --workspace may only be provided once.");r=L(d,"Workspace id")}else if(c==="--runner"){if(s)throw S("Task option --runner may only be provided once.");try{s=k.runners.parse(d)}catch(u){throw S(u instanceof Error?u.message:"Unsupported runner.")}}else{if(i)throw S("Task option --idempotency-key may only be provided once.");i=L(d,"Idempotency key")}}if(n&&r)throw S("Child task creation accepts only one of --repo or --workspace.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},...n?{repoId:n}:{},...r?{workspaceId:r}:{},prompt:L(o.join(" "),"Child task prompt"),...s?{runner:s}:{},...i?{idempotencyKey:i}:{}}}function kk(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 ba=300*1e3,Tk=new Set(["idle","working","ready","error"]),bk=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 Pk(e){let t,n,r="when-ready",s=ba,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=Pa(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 Sk(e){let t=L(e[0]??"","Command id"),n,r=ba,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=Ik(a):r=Pa(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function Ik(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!bk.has(n)))throw S(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function qd(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 vk(e){let t,n,r,s=ba,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=Nk(l):a==="--tab"?r=L(l,"Agent tab id"):s=Pa(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 Ck(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 Ak(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 Ek(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw S("fury step requires complete or fail.");let n=Ra(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 Ok(e){if(e[0]!=="list")throw S("fury reviews requires list.");let t=Ra(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 $k(e){let t=e[0],n=L(e[1]??"","Fury review id");if(t==="show")return Qs(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=Ra(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 Ra(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 Nk(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 Pa(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 Bd(e,t){return{mode:"command",command:e,commandName:fk(e),options:t}}function Ud(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function _r(e,t){Qs(e,0,t)}function Qs(e,t,n){if(e.length!==t)throw S(`Command ${n} received an unexpected number of arguments.`)}function Z(e,t){if(e.length!==1)throw S(`${t} is required and must be provided once.`);return L(e[0],t)}function ka(e,t){return L(e.join(" "),t)}function Xs(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 Yw=Object.defineProperty;var qs=(e,t)=>{for(var n in t)Yw(e,n,{get:t[n],enumerable:!0})};import{realpath as y0}from"node:fs/promises";import ke from"node:path";function Ee(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 pu from"node:path";import{readFile as iv}from"node:fs/promises";import{readFile as nk}from"node:fs/promises";import{randomUUID as zw}from"node:crypto";import{chmod as Jw,open as Xw,readFile as Qw,rename as Zw,rm as ek}from"node:fs/promises";import ma from"node:path";async function B(e,t,n={}){let r=ma.dirname(e),s=ma.join(r,`.${ma.basename(e)}.${process.pid}.${Date.now()}.${zw()}.tmp`),i=await Xw(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 Zw(s,e),n.mode!==void 0&&await Jw(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await ek(s,{force:!0}).catch(()=>{}),o}}async function Us(e){try{let t=await Qw(e,"utf8");return JSON.parse(t)}catch(t){if(tk(t))return null;throw t}}function tk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}async function Bn(e){try{let t=await nk(e.uiStateFile,"utf8"),n=JSON.parse(t);return rk(n,e.uiStateFile)}catch(t){if(sk(t))return null;throw t}}async function ht(e,t){await B(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function Ws(){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 rk(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")||!yn(e,"inputMode")||!yn(e,"focusedRegion")||!yn(e,"activeTab")||!yn(e,"inspectorSection")||!yn(e,"inspectionMode")||!Bs(e,"openInspectionKind")||!Bs(e,"selectedFileTreePath")||!Bs(e,"selectedFilePath")||!Bs(e,"selectedDiffPath")||!Sd(e,"collapsedFileTreePaths")||!yn(e,"ignoredUpdateVersion")||!Sd(e,"seenPreviewIds")||!yn(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 yn(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function Bs(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function Sd(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function sk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var ha={};qs(ha,{RUNNER_IDS:()=>ue,STABLE_RUNNER_IDS:()=>gt,assertEnabled:()=>Cd,buildCommand:()=>Od,getConfiguredProfile:()=>Vs,getDefault:()=>vd,getDisplayName:()=>Ed,getEnabled:()=>Ks,getProfile:()=>Wn,isRunnerType:()=>Gs,parse:()=>Ad,setRunnerEnabled:()=>$d,setRunnerPath:()=>Nd});var gt=["codex","cursor","claude"],ue=[...gt,"pi"];var Id={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 Wn=e=>Id[e];var Vs=(e,t={})=>{let n=Wn(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}};var Ks=(e={})=>ue.filter(t=>t!=="pi"||e.previews?.piRunner===!0).filter(t=>e.runners?.[t]?.enabled!==!1);var vd=(e={})=>{let t=Ks(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 Cd=(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 Gs=e=>ue.includes(e);var Ad=e=>{if(!e||e.length===0)return"codex";if(!Gs(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${ue.join(", ")}.`);return e};var Ed=e=>Wn(e).displayName;var Od=(e,t,n={})=>{let r=[Vs(e,n).executable];return t&&t.length>0&&r.push(t),r};var $d=(e,t,n)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}});var Nd=(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 ga={};qs(ga,{PREVIEW_FEATURE_IDS:()=>De,isEnabled:()=>Dd,setEnabled:()=>_d});var De=["agentOrchestration","piRunner","fileOpen","panelPolish"];function Dd(e,t){return e.previews?.[t]===!0}function _d(e,t,n){return{...e,previews:{...e.previews,[t]:n}}}import{mkdir as ik,readFile as ok,writeFile as ak}from"node:fs/promises";import lk from"node:path";var ck=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",xd=async e=>{try{return await ok(e,"utf8")}catch(t){if(ck(t))return null;throw t}},Fd=async(e,t)=>{await ik(lk.dirname(e),{recursive:!0}),await ak(e,t,"utf8")};var uk=["incrementalCenterPane","agentActivityIndicators"],Hs=(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(!uk.includes(r)&&!De.includes(r))throw new Error(`Craig config at ${t} is invalid. "previews.${r}" is not supported. Expected one of: ${De.join(", ")}.`);if(typeof s!="boolean")throw new Error(`Craig config at ${t} is invalid. "previews.${r}" must be a boolean.`)}}return n};var ya=async(e,t={readConfigFile:xd})=>{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 Hs(r,e.configFile)};var wa=async(e,t,n={writeConfigFile:Fd})=>{Hs(t,e.configFile),await n.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
4
+ `)};var Ta={};qs(Ta,{checkForUpdate:()=>Md,getCurrent:()=>Ys,isNewer:()=>ka});var Ys=()=>{try{return"0.18.0"}catch{return"unknown"}};var dk="https://registry.npmjs.org/craig-cli/latest",pk=3600*1e3,fk={value:null},Ld=/^\d+\.\d+\.\d+$/,ka=(e,t)=>{if(!Ld.test(e)||!Ld.test(t))return!1;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},Md=async(e={fetch:globalThis.fetch,getCurrent:Ys,cache:fk})=>{let t=e.getCurrent(),n=Date.now();if(e.cache.value&&n-e.cache.value.cachedAt<pk)return e.cache.value.result;let r=null;try{let i=await e.fetch(dk,{signal:AbortSignal.timeout(5e3)});i.ok&&(r=(await i.json()).version??null)}catch{}let s={current:t,latest:r,updateAvailable:r!==null&&r!==t&&ka(r,t)};return e.cache.value={result:s,cachedAt:n},s};var k={load:ya,save:wa,previews:ga,runners:ha,version:Ta};var jd={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=jd[t],this.retryable=r.retryable??!1,this.details=r.details??{}}};function ba(e){return e instanceof g?e:new g("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as mk,mkdir as hk,readFile as gk}from"node:fs/promises";import yk from"node:path";var qd=80,zs=async(e,t)=>{await hk(yk.dirname(e.logFile),{recursive:!0});let n={timestamp:new Date().toISOString(),...t};await mk(e.logFile,`${JSON.stringify(n)}
5
+ `,"utf8")},Ud=async(e,t)=>{try{await zs(e,t)}catch{}},Js=async(e,t=qd)=>{try{let s=(await gk(e.logFile,"utf8")).trimEnd().split(`
6
+ `).filter(i=>i.length>0).map(wk);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(Tk(n))return{path:e.logFile,lines:[],empty:!0};throw n}},Ra=async(e,t)=>zs(e,{level:"error",component:"application",event:kk(t.context),message:t.message,...t.details?{details:t.details}:{}}),Bd=async(e,t)=>{try{await Ra(e,t)}catch{}},Wd=Js,Vd=async(e,t=qd)=>Js(e,t);function wk(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 kk(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function Tk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var de={appendErrorLog:Ra,appendErrorLogBestEffort:Bd,appendLog:zs,appendLogBestEffort:Ud,readLog:Js,readErrorLog:Wd,readRecentErrorLines:Vd};function Yd(e){let{commandTokens:t,options:n,help:r}=Rk(e);if(r)return Gd({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":_r(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:Pa(o,"Repo path")};break;case"repo:list":_r(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:Z(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:Pa(o,"Workspace path")};break;case"workspace:list":a=Pk(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:Z(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:Z(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:Z(o,"Workspace id")};break;case"file:open":a={kind:"openFile",path:Z(o,"File path")};break;case"task:new":a=Ik(o);break;case"task:create-child":a=vk(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:Z(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:Z(o,"Task id")}};break;case"task:list":a=Sk(o);break;case"task:current":_r(o,"task current"),a={kind:"currentTask"};break;case"task:rename":a={kind:"renameTask",title:Pa(o,"Task title")};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:Z(o,"Task id")};break;case"task:pr":a=Ck(o);break;case"task:repo":if(o[0]!=="add")throw I(`Unsupported task repo command: ${o.join(" ")}`);Qs(o,3,"task repo add"),a={kind:"addTaskRepoTarget",taskId:Xs(o,1,"Task id"),repoId:Xs(o,2,"Repo id")};break;case"task:wait":a=_k(o);break;case"agent:list":_r(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=Ok(o);break;case"agent:send":a=$k(o);break;case"command:show":a={kind:"showPromptCommand",commandId:Z(o,"Command id")};break;case"command:list":_r(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:Z(o,"Command id")};break;case"command:wait":a=Nk(o);break;case"events:list":a=Kd(o,!1);break;case"events:watch":a=Kd(o,!0);break;case"fury:validate":a={kind:"validateFury",file:Z(o,"Fury file")};break;case"fury:plan":a=xk(o);break;case"fury:approve":a={kind:"approveFury",planId:Z(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:Z(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:Z(o,"Fury run id")};break;case"fury:watch":a=Fk(o);break;case"fury:cancel":a={kind:"cancelFury",runId:Z(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:Z(o,"Fury run id")};break;case"fury:step":a=Lk(o);break;case"fury:reviews":a=Mk(o);break;case"fury:review":a=jk(o);break;case"task:logs":a={kind:"streamTaskLogs",taskId:Z(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:Z(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:Z(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:Z(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:Z(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:Xs(o,0,"Task id"),repoId:Xs(o,1,"Repo id")},Qs(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:Z(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw I(`Unsupported command: ${t.join(" ")}`)}return Gd(a,n)}function zd(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 bk(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 Sa(){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 Rk(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||!Hd(l)){n.push(l);continue}if(s.has(l))throw I(`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==="--"||Hd(c))throw I(`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 Pk(e){if(e.length===0)return{kind:"listWorkspaces",archived:!1};if(e.length===1&&e[0]==="--archived")return{kind:"listWorkspaces",archived:!0};throw I(`Unsupported command: workspace list ${e.join(" ")}`)}function Sk(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 I(`Unsupported command: task list ${e.join(" ")}`)}function Ik(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 I(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw I(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw I("Task option --repo may only be provided once.");t=L(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw I("Task option --workspace may only be provided once.");n=L(c,"Workspace id")}else{if(r!==void 0)throw I("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(d){throw I(d instanceof Error?d.message:"Unsupported runner.")}}}if(!t&&!n)throw I("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw I("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 vk(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 I(`Unsupported task create-child option: ${c}`);o.push(c);continue}let d=e[l+1];if(d===void 0||d==="--")throw I(`Task option ${c} requires a value.`);if(l+=1,c==="--parent"){if(t)throw I("Task option --parent may only be provided once.");t=L(d,"Parent task id")}else if(c==="--repo"){if(n)throw I("Task option --repo may only be provided once.");n=L(d,"Repo id")}else if(c==="--workspace"){if(r)throw I("Task option --workspace may only be provided once.");r=L(d,"Workspace id")}else if(c==="--runner"){if(s)throw I("Task option --runner may only be provided once.");try{s=k.runners.parse(d)}catch(u){throw I(u instanceof Error?u.message:"Unsupported runner.")}}else{if(i)throw I("Task option --idempotency-key may only be provided once.");i=L(d,"Idempotency key")}}if(n&&r)throw I("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 Ck(e){let[t,...n]=e;if(!["show","discover","link","refresh","unlink"].includes(t??""))throw I(`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 I(`Unsupported task pr ${t} option: ${l}`);if(r!==void 0)throw I(`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 I(`Task PR option ${l} requires a value.`);if(a+=1,l==="--repo"){if(s!==void 0)throw I("Task PR option --repo may only be provided once.");s=L(c,"Repo id")}else{if(i!==void 0)throw I("Task PR option --pr may only be provided once.");i=L(c,"Pull request selector")}}if((t==="link"||t==="unlink")&&i===void 0)throw I(`task pr ${t} requires --pr <url|number>.`);if(t!=="link"&&t!=="unlink"&&i!==void 0)throw I(`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 I(`Unsupported command: task pr ${e.join(" ")}`)}}var Ia=300*1e3,Ak=new Set(["idle","working","ready","error"]),Ek=new Set(["queued","delivering","delivered","failed","cancelled"]);function Ok(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 I(`Unsupported command: agent status ${e.join(" ")}`)}function $k(e){let t,n,r="when-ready",s=Ia,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 I(`Unsupported agent send option: ${l}`);if(o.has(l))throw I(`Agent send option ${l} may only be provided once.`);if(o.add(l),l==="--stdin"){if(t)throw I("Agent send accepts exactly one prompt source.");t={source:"stdin"};continue}let c=e[a+1];if(c===void 0||c.startsWith("--"))throw I(`Agent send option ${l} requires a value.`);if(a+=1,l==="--prompt"||l==="--prompt-file"){if(t)throw I("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 I('Agent send delivery must be "when-ready" or "immediate".');r=c}else l==="--timeout"?s=Ca(c):i=L(c,"Idempotency key")}if(!t)throw I("Agent send requires --prompt, --prompt-file, or --stdin.");return{kind:"sendAgentPrompt",prompt:t,delivery:r,timeoutMs:s,...n?{tabId:n}:{},...i?{idempotencyKey:i}:{}}}function Nk(e){let t=L(e[0]??"","Command id"),n,r=Ia,s=new Set;for(let i=1;i<e.length;i+=1){let o=e[i];if(o!=="--state"&&o!=="--timeout")throw I(`Unsupported command wait option: ${o}`);if(s.has(o))throw I(`Command wait option ${o} may only be provided once.`);s.add(o);let a=e[i+1];if(a===void 0||a.startsWith("--"))throw I(`Command wait option ${o} requires a value.`);i+=1,o==="--state"?n=Dk(a):r=Ca(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function Dk(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Ek.has(n)))throw I(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function Kd(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 I(`Unsupported events ${t?"watch":"list"} option: ${l}`);if(!t&&l==="--format")throw I("--format is supported only by events watch.");if(i.has(l))throw I(`Events option ${l} may only be provided once.`);i.add(l);let c=e[a+1];if(c===void 0||c.startsWith("--"))throw I(`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 I('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 _k(e){let t,n,r,s=Ia,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 I(`Unsupported task wait option: ${a}`);if(t!==void 0)throw I("task wait accepts at most one task id.");t=L(a,"Task id");continue}if(i.has(a))throw I(`Task wait option ${a} may only be provided once.`);i.add(a);let l=e[o+1];if(l===void 0||l.startsWith("--"))throw I(`Task wait option ${a} requires a value.`);o+=1,a==="--state"?n=qk(l):a==="--tab"?r=L(l,"Agent tab id"):s=Ca(l)}if(!n)throw I("task wait requires --state <idle|working|ready|error>[,...].");return{kind:"waitTask",...t?{taskId:t}:{},states:n,...r?{tabId:r}:{},timeoutMs:s}}function xk(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 I(`Unsupported fury plan option: ${i}`);if(t!==void 0)throw I("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 I(`Fury plan option ${i} requires a value.`);if(s+=1,i==="--root-task"){if(n)throw I("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 I(`Invalid fury input "${o}". Use key=value.`);let l=L(o.slice(0,a),"Fury input name");if(Object.hasOwn(r,l))throw I(`Fury input "${l}" may only be provided once.`);r[l]=o.slice(a+1)}if(!t)throw I("fury plan requires a definition file.");return{kind:"planFury",file:t,inputs:r,...n?{rootTaskId:n}:{}}}function Fk(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 I("fury watch supports --after and --format jsonl.");if(i==="--after")n=L(o,"Event cursor");else if(o==="jsonl")r=o;else throw I("fury watch format must be jsonl.")}return{kind:"watchFury",runId:t,...n?{after:n}:{},format:r}}function Lk(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw I("fury step requires complete or fail.");let n=va(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 I("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 I("fury step complete does not accept --reason.");let i=["--output","--output-file","--stdin"].filter(a=>n.has(a));if(i.length>1)throw I("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 Mk(e){if(e[0]!=="list")throw I("fury reviews requires list.");let t=va(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 I(`Unsupported fury review state: ${r}`);return{kind:"listFuryReviews",...n?{runId:n}:{},...r?{state:r}:{}}}function jk(e){let t=e[0],n=L(e[1]??"","Fury review id");if(t==="show")return Qs(e,2,"fury review show"),{kind:"showFuryReview",reviewId:n};if(!t||!["approve","reject","request-changes","resubmit"].includes(t))throw I("Unsupported fury review action.");let r=va(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 I(`fury review ${t} accepts only ${o}.`);return{kind:"actFuryReview",reviewId:n,action:s,...i?{message:i}:{}}}function va(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 I(`Unsupported or duplicate option: ${s}`);if(s==="--stdin"){n.set(s,"true");continue}let i=e[++r];if(i===void 0||i.startsWith("--"))throw I(`Option ${s} requires a value.`);n.set(s,L(i,s))}return n}function qk(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Ak.has(n)))throw I(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function Ca(e){let t=/^(\d+)(ms|s|m|h)$/.exec(e.trim());if(!t)throw I(`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 I(`Duration "${e}" is too large.`);return s}function Gd(e,t){return{mode:"command",command:e,commandName:bk(e),options:t}}function Hd(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function _r(e,t){Qs(e,0,t)}function Qs(e,t,n){if(e.length!==t)throw I(`Command ${n} received an unexpected number of arguments.`)}function Z(e,t){if(e.length!==1)throw I(`${t} is required and must be provided once.`);return L(e[0],t)}function Pa(e,t){return L(e.join(" "),t)}function Xs(e,t,n){return L(e[t]??"",n)}function L(e,t){let n=e.trim();if(n.length===0)throw I(`${t} cannot be empty.`);return n}function I(e){return new g("CLI_USAGE",`${e}
8
8
 
9
- ${Ta()}`,{})}var Be=(e,t)=>{let n=Sa(e);if(!_k(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},Sa=e=>{if(typeof e!="object"||e===null)return e;let t=e,n=e,r={...n};return delete r.swarmRunId,delete r.swarmStepId,delete r.tmuxWindowTarget,delete r.tmuxPage,delete r.tmuxTarget,delete r.layoutSlot,delete r.sessionId,{...r,runner:Ia(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:Lk(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:xk(t.repoTargets),runnerSession:t.runnerSession??Dk(t),checks:Vk(t),lastCommit:t.lastCommit??null,prs:Kk(t),artifacts:zk(t),cleanup:Jk(t)}},Dk=e=>{if(typeof e.title!="string")return null;let t=Ia(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},_k=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.id=="string"&&typeof t.title=="string"&&typeof t.slug=="string"&&(t.type==="repo"||t.type==="project")&&typeof t.status=="string"&&k.runners.isRunnerType(t.runner??"")&&typeof t.repoId=="string"&&typeof t.workspaceId=="string"&&(typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null)&&Array.isArray(t.linkedRepoIds)&&t.linkedRepoIds.every(n=>typeof n=="string")&&(typeof t.parentTaskId=="string"||t.parentTaskId===null)&&typeof t.rootTaskId=="string"&&Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0&&(typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null)&&(typeof t.furyRunId=="string"||t.furyRunId===null)&&(typeof t.furyStepId=="string"||t.furyStepId===null)&&typeof t.repoRoot=="string"&&typeof t.worktreePath=="string"&&typeof t.branch=="string"&&Gd(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||Fk(t.repoTargets))&&jk(t.runnerSession)&&qk(t.prompt)&&Hd(t.checks)&&Yd(t.lastCommit)&&Uk(t.prs)&&Wk(t.artifacts)&&Jd(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},xk=e=>{if(Array.isArray(e))return e.filter(Kd)},Fk=e=>Array.isArray(e)&&e.every(Kd),Kd=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)&&Hd(t.checks)&&Yd(t.lastCommit)&&zd(t.pullRequest)&&Jd(t.cleanup)},Lk=e=>{if(Gd(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 Mk(e.id,e.title,t,Ia(e.runner))},Mk=(e,t,n,r)=>{let s=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",title:s.defaultAgentTitle,command:k.runners.buildCommand(r),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},Ia=e=>e&&k.runners.isRunnerType(e)?e:"codex",Gd=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"),jk=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),qk=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",Hd=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"),Yd=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",zd=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&Bk(e.requiredChecks),Bk=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)),Uk=e=>Array.isArray(e)&&e.every(zd),Wk=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),Jd=e=>typeof e=="object"&&e!==null&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),Vk=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},Kk=e=>{if(Array.isArray(e.prs))return e.prs.map(Gk);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:Xd(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:Qd(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},Gk=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:Xd(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:Hk(t.reviewDecision),requiredChecks:Qd(t.requiredChecks),comments:Yk(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},Xd=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,Hk=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Yk=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}]}):[],Qd=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})):[],zk=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},Jk=e=>{let t=e.cleanup;return{worktreeRemovedAt:t?.worktreeRemovedAt??null,preservedWorktree:t?.preservedWorktree??!1,warning:t?.warning??null}};import{readFile as _T}from"node:fs/promises";import{readFile as Xk,readdir as Qk,rm as Zk}from"node:fs/promises";import Zd from"node:path";var va=(e,t)=>Zd.join(e.workspacesDir,`${t}.json`),eT=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"):[]}},ep=(e,t)=>{let n=eT(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=va(e,t);try{let r=await Xk(n,"utf8");return ep(JSON.parse(r),n)}catch(r){throw tT(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 U(va(e,t.id),{...t,updatedAt:new Date().toISOString()})},Ie=async e=>{let t=await Qk(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))},tp=async(e,t)=>{await Zk(va(e,t),{force:!0})},tT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as nT,readdir as rT,rm as sT}from"node:fs/promises";import np from"node:path";var Ca=(e,t)=>np.join(e.reposDir,`${t}.json`),rp=(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=Ca(e,t);try{let r=await nT(n,"utf8");return rp(JSON.parse(r),n)}catch(r){throw iT(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}},Aa=async(e,t)=>{await U(Ca(e,t.id),{...t,updatedAt:new Date().toISOString()})},xr=async e=>{let t=await rT(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>De(e,np.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},sp=async(e,t)=>{await sT(Ca(e,t),{force:!0})},iT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as oT}from"node:fs/promises";var aT=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"},Vn=(e,t,n)=>{if(!aT(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},Oe=async e=>{let t=await oT(e.indexFile,"utf8");return Vn(JSON.parse(t),e.workspaceRoot,e.indexFile)},It=async(e,t)=>{await U(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as pT,stat as fT}from"node:fs/promises";import Gn from"node:path";import{realpath as ap}from"node:fs/promises";import Zs from"node:path";import{execFile as lT}from"node:child_process";import{promisify as cT}from"node:util";var ip=cT(lT);async function H(e,t,n={}){try{let r=await ip(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(op(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function J(e,t,n={}){try{let r=await ip(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(op(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function op(e){return e instanceof Error}var Ea=async e=>{try{let n=(await H("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([ap(n).catch(()=>Zs.resolve(n)),ap(e).catch(()=>Zs.resolve(e))]);return r===s}catch{return!1}},Oa=async e=>{let t=await J("git",["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"],{cwd:e}),n=t.stdout.trim().replace(/^origin\//,"");if(t.exitCode===0&&n.length>0)return n;for(let i of["main","master","trunk"])if((await J("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await H("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},lp=async e=>{let t=await J("git",["rev-parse","--path-format=absolute","--git-common-dir"],{cwd:e}),n=t.stdout.trim();if(t.exitCode!==0||n.length===0)return null;let r=Zs.resolve(e,n);return Zs.dirname(r)};import{mkdir as Ue,readFile as uT}from"node:fs/promises";var dT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Kn=async e=>{let t=Ee(e);await Ue(t.craigDir,{recursive:!0}),await Promise.all([Ue(t.reposDir,{recursive:!0}),Ue(t.workspacesDir,{recursive:!0}),Ue(t.runtimeDir,{recursive:!0}),Ue(t.tasksDir,{recursive:!0}),Ue(t.jobsDir,{recursive:!0}),Ue(t.commandsDir,{recursive:!0}),Ue(t.eventsDir,{recursive:!0}),Ue(t.orchestrationDir,{recursive:!0}),Ue(t.logsDir,{recursive:!0}),Ue(t.artifactsDir,{recursive:!0}),Ue(t.worktreesDir,{recursive:!0})]);try{let s=await uT(t.indexFile,"utf8"),i=JSON.parse(s);return Vn(i,e,t.indexFile)}catch(s){if(!dT(s))throw s instanceof SyntaxError?new Error(`Craig index at ${t.indexFile} is malformed. Remove or repair the file before rerunning Craig.`):s}let n=new Date().toISOString(),r={version:2,workspaceRoot:e,repoIds:[],workspaceIds:[],taskIds:[],jobIds:[],createdAt:n,updatedAt:n};return await U(t.indexFile,r),r};var cp=(e,t,n)=>{let r=new Date().toISOString();return{id:mT(e,Gn.basename(t)),name:Gn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},up=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},mT=(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},hT=(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},dp=async(e,t)=>{let n=await Oe(e);await It(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},gT=async(e,t)=>{let n=await pT(t,{withFileTypes:!0}),r=await xr(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Gn.join(t,i.name);if(!await Ea(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await Oa(o);s.push(a?up(a,l):cp([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},yT=async(e,t)=>{let n=await Oa(t),r=await xr(e),s=r.find(u=>u.rootPath===t)??null,i=s?up(s,n):cp(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 Aa(e,i),l||await wn(e,d),await dp(e,{repoIds:[i.id],workspaceIds:[d.id]}),{kind:"createWorkspace",workspace:d,repos:[i],created:!l}},wT=async(e,t)=>{let n=await gT(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=hT(r,Gn.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:Gn.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=>Aa(e,c))),await wn(e,l),await dp(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},Fr=async(e,t)=>{await Kn(e.workspaceRoot);let n=Gn.resolve(e.workspaceRoot,t);if(!(await fT(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await Ea(n)?yT(e,n):wT(e,n)};var $a=async(e,t,n={listWorkspaceRecords:Ie,ensureCraigState:Kn})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var Na=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 Da=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:tp,readCraigIndex:Oe,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 kT,realpath as mp,stat as TT}from"node:fs/promises";import ei from"node:path";async function xa(e){let t=await gp(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return pp(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return pp(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await fp(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await lp(t);if(r){let s=await fp(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 pp(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await gp(ei.resolve(n,e),s),o=await hp(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 fp(e){let t=e;for(;;){let n=await hp(t);if(n)return n;let r=ei.dirname(t);if(r===t)return null;t=r}}async function hp(e){let t=Ee(e);try{let n=await kT(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Vn(r,s,t.indexFile);if(await mp(i.workspaceRoot).catch(()=>ei.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(bT(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 gp(e,t){let n=ei.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 mp(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 bT(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var Fa={};qs(Fa,{addRepo:()=>yp,listRegisteredRepos:()=>wp,removeRepo:()=>kp});import RT from"node:path";import{stat as PT}from"node:fs/promises";var yp=async(e,t)=>{let n=RT.resolve(e.workspaceRoot,t);if(!(await PT(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await Fr(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 wp=async(e,t={listRepos:xr,ensureCraigState:Kn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var kp=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 sp(e,t);let l=await Oe(e);return await It(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var Te={addWorkspace:Fr,listWorkspaces:$a,archiveWorkspace:Na,restoreWorkspace:Da,removeWorkspace:_a,removeWorkspaceRecord:kn,resolveContext:xa,repos:Fa};import{mkdir as Tp,readFile as ST,rm as ni,stat as IT,writeFile as vT}from"node:fs/promises";import ti from"node:path";var CT=25,AT=3e4,ET=5e3;async function Qe(e,t,n){let r=ti.join(e.runtimeDir,"task-locks"),s=ti.join(r,`${t}.lock`);await Tp(r,{recursive:!0});let i=Date.now();for(;;)try{await Tp(s);try{await vT(ti.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await ni(s,{recursive:!0,force:!0}),o}break}catch(o){if(!NT(o))throw o;if(await OT(s))continue;if(Date.now()-i>=AT)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await DT(CT)}try{return await n()}finally{await ni(s,{recursive:!0,force:!0})}}async function OT(e){let t=await ST(ti.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return $T(t.pid)?!1:(await ni(e,{recursive:!0,force:!0}),!0);let n=await IT(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<ET?!1:(await ni(e,{recursive:!0,force:!0}),!0)}function $T(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 NT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",DT=e=>new Promise(t=>setTimeout(t,e));var vt=async(e,t)=>{let n=await _T(ri(e,t),"utf8");return JSON.parse(n)},Lr=async(e,t)=>{let n=await vt(e,t);return Be(n,ri(e,t))},Ze=async(e,t)=>{let n=bp(t);await U(ri(e,t.id),n)},K=async(e,t,n)=>Qe(e,t,async()=>{let r=await Lr(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=bp(s);return await U(ri(e,t),i),i}),La=async(e,t)=>{let n=await Oe(e);n.taskIds.includes(t)||await It(e,{...n,taskIds:[...n.taskIds,t]})},ri=(e,t)=>`${e.tasksDir}/${t}.json`,bp=e=>({...e,updatedAt:new Date().toISOString()});var G=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Ht=e=>e.status==="merged"||e.status==="closed",Ct=(e,t)=>{let n=e.prs.findIndex(s=>Hn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},Hn=(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 ii(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},ii=e=>e.mergeable&&!xT(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),xT=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Ma=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=FT(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:LT(e.reviewDecision??null),requiredChecks:ja(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:BT(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}},FT=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,LT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,ja=e=>{let t=e.map(r=>MT(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||jT(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},MT=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:Pp(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:qT(t)}:null},jT=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):si(e)&&!si(t)?!0:!si(e)&&si(t)?!1:Rp(t.status)>=Rp(e.status),si=e=>e.conclusion?.toUpperCase()==="CANCELLED",Rp=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},qT=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},BT=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(UT).filter(n=>n!==null).slice(-4):[]},UT=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=WT(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},WT=e=>e.replace(/\s+/g," ").trim(),Pp=(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?Pp(r,r):"unknown"};var We=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as VT}from"node:fs/promises";import Sp from"node:path";var F=async(e,t,n={readRawTask:vt,validateTaskRecord:Be})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw zT(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):JT(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 qa(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Yn=(e,t)=>t.artifacts.logPath?Sp.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:Sp.join(e.workspaceRoot,t.artifacts.logPath):null,Mr=async(e,t)=>{let n=await qa(t.worktreePath),r=Yn(e,t),s=r?await qa(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:KT(t),lastCommitSummary:GT(t),prSummary:HT(t),cleanupSummary:YT(t)}},qa=async e=>{try{return await VT(e),!0}catch{return!1}},KT=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}`},GT=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",HT=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
+ ${Sa()}`,{})}var Be=(e,t)=>{let n=Aa(e);if(!Bk(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},Aa=e=>{if(typeof e!="object"||e===null)return e;let t=e,n=e,r={...n};return delete r.swarmRunId,delete r.swarmStepId,delete r.tmuxWindowTarget,delete r.tmuxPage,delete r.tmuxTarget,delete r.layoutSlot,delete r.sessionId,{...r,runner:Ea(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:Kk(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:Wk(t.repoTargets),runnerSession:t.runnerSession??Uk(t),checks:Qk(t),lastCommit:t.lastCommit??null,prs:Zk(t),artifacts:rT(t),cleanup:sT(t)}},Uk=e=>{if(typeof e.title!="string")return null;let t=Ea(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},Bk=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.id=="string"&&typeof t.title=="string"&&typeof t.slug=="string"&&(t.type==="repo"||t.type==="project")&&typeof t.status=="string"&&k.runners.isRunnerType(t.runner??"")&&typeof t.repoId=="string"&&typeof t.workspaceId=="string"&&(typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null)&&Array.isArray(t.linkedRepoIds)&&t.linkedRepoIds.every(n=>typeof n=="string")&&(typeof t.parentTaskId=="string"||t.parentTaskId===null)&&typeof t.rootTaskId=="string"&&Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0&&(typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null)&&(typeof t.furyRunId=="string"||t.furyRunId===null)&&(typeof t.furyStepId=="string"||t.furyStepId===null)&&typeof t.repoRoot=="string"&&typeof t.worktreePath=="string"&&typeof t.branch=="string"&&Xd(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||Vk(t.repoTargets))&&Hk(t.runnerSession)&&Yk(t.prompt)&&Qd(t.checks)&&Zd(t.lastCommit)&&Jk(t.prs)&&Xk(t.artifacts)&&tp(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Wk=e=>{if(Array.isArray(e))return e.filter(Jd)},Vk=e=>Array.isArray(e)&&e.every(Jd),Jd=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)&&Qd(t.checks)&&Zd(t.lastCommit)&&ep(t.pullRequest)&&tp(t.cleanup)},Kk=e=>{if(Xd(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 Gk(e.id,e.title,t,Ea(e.runner))},Gk=(e,t,n,r)=>{let s=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",title:s.defaultAgentTitle,command:k.runners.buildCommand(r),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},Ea=e=>e&&k.runners.isRunnerType(e)?e:"codex",Xd=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"),Hk=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),Yk=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",Qd=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"),Zd=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",ep=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&zk(e.requiredChecks),zk=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)),Jk=e=>Array.isArray(e)&&e.every(ep),Xk=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),tp=e=>typeof e=="object"&&e!==null&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),Qk=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},Zk=e=>{if(Array.isArray(e.prs))return e.prs.map(eT);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:np(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:rp(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},eT=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:np(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:tT(t.reviewDecision),requiredChecks:rp(t.requiredChecks),comments:nT(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},np=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,tT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,nT=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}]}):[],rp=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})):[],rT=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},sT=e=>{let t=e.cleanup;return{worktreeRemovedAt:t?.worktreeRemovedAt??null,preservedWorktree:t?.preservedWorktree??!1,warning:t?.warning??null}};import{readFile as BT}from"node:fs/promises";import{readFile as iT,readdir as oT,rm as aT}from"node:fs/promises";import sp from"node:path";var Oa=(e,t)=>sp.join(e.workspacesDir,`${t}.json`),lT=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"):[]}},ip=(e,t)=>{let n=lT(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},wn=async(e,t)=>{let n=Oa(e,t);try{let r=await iT(n,"utf8");return ip(JSON.parse(r),n)}catch(r){throw cT(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}},kn=async(e,t)=>{await B(Oa(e,t.id),{...t,updatedAt:new Date().toISOString()})},Ie=async e=>{let t=await oT(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>wn(e,sp.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},op=async(e,t)=>{await aT(Oa(e,t),{force:!0})},cT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as uT,readdir as dT,rm as pT}from"node:fs/promises";import ap from"node:path";var $a=(e,t)=>ap.join(e.reposDir,`${t}.json`),lp=(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},_e=async(e,t)=>{let n=$a(e,t);try{let r=await uT(n,"utf8");return lp(JSON.parse(r),n)}catch(r){throw fT(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}},Na=async(e,t)=>{await B($a(e,t.id),{...t,updatedAt:new Date().toISOString()})},xr=async e=>{let t=await dT(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>_e(e,ap.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},cp=async(e,t)=>{await pT($a(e,t),{force:!0})},fT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as mT}from"node:fs/promises";var hT=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"},Vn=(e,t,n)=>{if(!hT(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},Oe=async e=>{let t=await mT(e.indexFile,"utf8");return Vn(JSON.parse(t),e.workspaceRoot,e.indexFile)},vt=async(e,t)=>{await B(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as TT,stat as bT}from"node:fs/promises";import Gn from"node:path";import{realpath as pp}from"node:fs/promises";import Zs from"node:path";import{execFile as gT}from"node:child_process";import{promisify as yT}from"node:util";var up=yT(gT);async function K(e,t,n={}){try{let r=await up(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(dp(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function J(e,t,n={}){try{let r=await up(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(dp(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function dp(e){return e instanceof Error}var Da=async e=>{try{let n=(await K("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([pp(n).catch(()=>Zs.resolve(n)),pp(e).catch(()=>Zs.resolve(e))]);return r===s}catch{return!1}},_a=async e=>{let t=await J("git",["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"],{cwd:e}),n=t.stdout.trim().replace(/^origin\//,"");if(t.exitCode===0&&n.length>0)return n;for(let i of["main","master","trunk"])if((await J("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await K("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},fp=async e=>{let t=await J("git",["rev-parse","--path-format=absolute","--git-common-dir"],{cwd:e}),n=t.stdout.trim();if(t.exitCode!==0||n.length===0)return null;let r=Zs.resolve(e,n);return Zs.dirname(r)};import{mkdir as We,readFile as wT}from"node:fs/promises";var kT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Kn=async e=>{let t=Ee(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 wT(t.indexFile,"utf8"),i=JSON.parse(s);return Vn(i,e,t.indexFile)}catch(s){if(!kT(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 B(t.indexFile,r),r};var mp=(e,t,n)=>{let r=new Date().toISOString();return{id:RT(e,Gn.basename(t)),name:Gn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},hp=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},RT=(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},PT=(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},gp=async(e,t)=>{let n=await Oe(e);await vt(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},ST=async(e,t)=>{let n=await TT(t,{withFileTypes:!0}),r=await xr(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Gn.join(t,i.name);if(!await Da(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await _a(o);s.push(a?hp(a,l):mp([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},IT=async(e,t)=>{let n=await _a(t),r=await xr(e),s=r.find(u=>u.rootPath===t)??null,i=s?hp(s,n):mp(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 Na(e,i),l||await kn(e,d),await gp(e,{repoIds:[i.id],workspaceIds:[d.id]}),{kind:"createWorkspace",workspace:d,repos:[i],created:!l}},vT=async(e,t)=>{let n=await ST(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=PT(r,Gn.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:Gn.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=>Na(e,c))),await kn(e,l),await gp(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},Fr=async(e,t)=>{await Kn(e.workspaceRoot);let n=Gn.resolve(e.workspaceRoot,t);if(!(await bT(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await Da(n)?IT(e,n):vT(e,n)};var xa=async(e,t,n={listWorkspaceRecords:Ie,ensureCraigState:Kn})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var Fa=async(e,t,n={readWorkspace:wn,writeWorkspace:kn})=>{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 La=async(e,t)=>{let r={...await wn(e,t),status:"active",archivedAt:null};await kn(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 Tn=async(e,t,n={deleteWorkspace:op,readCraigIndex:Oe,writeCraigIndex:vt})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var Ma=async(e,t,n)=>{let r=await wn(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 Tn(e,t),{kind:"removeWorkspace",workspaceId:r.id,rootPath:r.rootPath??""}};import{readFile as CT,realpath as kp,stat as AT}from"node:fs/promises";import ei from"node:path";async function ja(e){let t=await bp(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return yp(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return yp(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await wp(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await fp(t);if(r){let s=await wp(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 yp(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await bp(ei.resolve(n,e),s),o=await Tp(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 wp(e){let t=e;for(;;){let n=await Tp(t);if(n)return n;let r=ei.dirname(t);if(r===t)return null;t=r}}async function Tp(e){let t=Ee(e);try{let n=await CT(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Vn(r,s,t.indexFile);if(await kp(i.workspaceRoot).catch(()=>ei.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(ET(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 bp(e,t){let n=ei.resolve(e);try{if(!(await AT(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await kp(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 ET(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var qa={};qs(qa,{addRepo:()=>Rp,listRegisteredRepos:()=>Pp,removeRepo:()=>Sp});import OT from"node:path";import{stat as $T}from"node:fs/promises";var Rp=async(e,t)=>{let n=OT.resolve(e.workspaceRoot,t);if(!(await $T(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await Fr(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 Pp=async(e,t={listRepos:xr,ensureCraigState:Kn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var Sp=async(e,t,n)=>{let r=await _e(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=>Tn(e,c.id))),await cp(e,t);let l=await Oe(e);return await vt(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var Te={addWorkspace:Fr,listWorkspaces:xa,archiveWorkspace:Fa,restoreWorkspace:La,removeWorkspace:Ma,removeWorkspaceRecord:Tn,resolveContext:ja,repos:qa};import{mkdir as Ip,readFile as NT,rm as ni,stat as DT,writeFile as _T}from"node:fs/promises";import ti from"node:path";var xT=25,FT=3e4,LT=5e3;async function Ze(e,t,n){let r=ti.join(e.runtimeDir,"task-locks"),s=ti.join(r,`${t}.lock`);await Ip(r,{recursive:!0});let i=Date.now();for(;;)try{await Ip(s);try{await _T(ti.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await ni(s,{recursive:!0,force:!0}),o}break}catch(o){if(!qT(o))throw o;if(await MT(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 UT(xT)}try{return await n()}finally{await ni(s,{recursive:!0,force:!0})}}async function MT(e){let t=await NT(ti.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return jT(t.pid)?!1:(await ni(e,{recursive:!0,force:!0}),!0);let n=await DT(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<LT?!1:(await ni(e,{recursive:!0,force:!0}),!0)}function jT(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 qT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",UT=e=>new Promise(t=>setTimeout(t,e));var Ct=async(e,t)=>{let n=await BT(ri(e,t),"utf8");return JSON.parse(n)},Lr=async(e,t)=>{let n=await Ct(e,t);return Be(n,ri(e,t))},et=async(e,t)=>{let n=vp(t);await B(ri(e,t.id),n)},G=async(e,t,n)=>Ze(e,t,async()=>{let r=await Lr(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=vp(s);return await B(ri(e,t),i),i}),Ua=async(e,t)=>{let n=await Oe(e);n.taskIds.includes(t)||await vt(e,{...n,taskIds:[...n.taskIds,t]})},ri=(e,t)=>`${e.tasksDir}/${t}.json`,vp=e=>({...e,updatedAt:new Date().toISOString()});var H=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Ht=e=>e.status==="merged"||e.status==="closed",At=(e,t)=>{let n=e.prs.findIndex(s=>Hn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},Hn=(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(),bn=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return ii(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},ii=e=>e.mergeable&&!WT(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),WT=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Ba=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),Et=(e,t,n)=>{let r=e.isDraft??!1,s=VT(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:KT(e.reviewDecision??null),requiredChecks:Wa(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:zT(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}},VT=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,KT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Wa=e=>{let t=e.map(r=>GT(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||HT(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},GT=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:Ap(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:YT(t)}:null},HT=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):si(e)&&!si(t)?!0:!si(e)&&si(t)?!1:Cp(t.status)>=Cp(e.status),si=e=>e.conclusion?.toUpperCase()==="CANCELLED",Cp=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},YT=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},zT=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(JT).filter(n=>n!==null).slice(-4):[]},JT=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=XT(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},XT=e=>e.replace(/\s+/g," ").trim(),Ap=(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?Ap(r,r):"unknown"};var Ve=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as QT}from"node:fs/promises";import Ep from"node:path";var F=async(e,t,n={readRawTask:Ct,validateTaskRecord:Be})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw rb(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):sb(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 Va(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Yn=(e,t)=>t.artifacts.logPath?Ep.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:Ep.join(e.workspaceRoot,t.artifacts.logPath):null,Mr=async(e,t)=>{let n=await Va(t.worktreePath),r=Yn(e,t),s=r?await Va(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:ZT(t),lastCommitSummary:eb(t),prSummary:tb(t),cleanupSummary:nb(t)}},Va=async e=>{try{return await QT(e),!0}catch{return!1}},ZT=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}`},eb=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",tb=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=G(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})`},YT=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",zT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",JT=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var jr=async(e,t)=>{let n=await J("git",["show-ref","--verify","--quiet",`refs/heads/${t}`],{cwd:e});if(n.exitCode===0)return!0;if(n.exitCode===1)return!1;throw new Error(n.stderr.trim()||n.stdout.trim()||"Unable to check git branch state.")},Ba=async(e,t,n,r="main")=>{let s=r.trim()||"main";if((await J("git",["show-ref","--verify","--quiet",`refs/heads/${s}`],{cwd:e})).exitCode!==0)throw new Error(`Base branch '${s}' does not exist locally.`);let o=await XT(e,s);await H("git",["worktree","add","-b",t,n,o],{cwd:e})},XT=async(e,t)=>(await J("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await J("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await J("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t,oi=async e=>{let t=await J("git",["status","--short"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"Unable to inspect git status.");return t.stdout.trim().length>0},Ip=async e=>{await H("git",["add","-A"],{cwd:e})},vp=async(e,t)=>{await H("git",["commit","-m",t],{cwd:e})},Cp=async e=>{let t=await H("git",["show","-s","--format=%H%n%s","HEAD"],{cwd:e}),[n="",r=""]=t.stdout.trim().split(`
12
- `);if(!n||!r)throw new Error("Unable to read git HEAD commit metadata.");return{sha:n,message:r}},Ap=async e=>{let t=await J("git",["branch","--show-current"],{cwd:e});if(t.exitCode!==0)return null;let n=t.stdout.trim();return n.length>0?n:null};var ai=async(e,t)=>{await H("git",["worktree","remove","--force",t],{cwd:e})},Ep=async(e,t)=>{await H("git",["branch","-D",t],{cwd:e})};var Ua=async e=>zn(e,e.repoRoot),zn=async(e,t)=>{let n=await Oe(e),r=Op(new Date),s=$p(n.taskIds,r);for(;;){let i=`task_${r}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await jr(t,o))return i;s+=1}},qr=async e=>{let t=await Oe(e),n=Op(new Date),r=$p(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`},Op=e=>{let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}${n}${r}`},$p=(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 Br=async(e,t,n={readRawTask:vt,validateTaskRecord:Be})=>{let r=await Oe(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(QT(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}},QT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var Np=["merge_ready","pr_open","checked","review","running","draft"],Wa=e=>[...e].sort((t,n)=>t.id.localeCompare(n.id)),Va=(e,t)=>t&&e.some(r=>r.id===t)?t:e.length===0?null:[...e].sort(ZT)[0]?.id??null,ZT=(e,t)=>{let n=Dp(e.status),r=Dp(t.status);return n!==r?n-r:t.updatedAt.localeCompare(e.updatedAt)},Dp=e=>{let t=Np.indexOf(e);return t>=0?t:Np.length};import _p from"node:path";var bn=(e,t)=>t?_p.isAbsolute(t)?t:_p.join(e.repoRoot,t):null;import{randomUUID as eb}from"node:crypto";import{mkdir as Wr,rm as tb,writeFile as li}from"node:fs/promises";import Y from"node:path";var Ur=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");var xp=["AGENTS","md"].join("."),Jn=async(e,t,n,r={})=>{let s=await De(e,t),[i,o]=await Promise.all([ob(e,s.id,r.workspaceId,r.allowLinkedProjectRepo??!1),zn(e,s.rootPath)]),a=`craig/${o}`,l=Y.join(e.worktreesDir,s.id,o),c=Y.join(e.logsDir,`${o}.log`),d=Y.join(e.artifactsDir,o);await Promise.all([Wr(Y.dirname(l),{recursive:!0}),Wr(d,{recursive:!0}),li(c,"","utf8")]);let u=nb(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 La(e,o),await Ba(s.rootPath,a,l,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,workspaceId:i.id,task:u}},Vr=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 Jn(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 qr(e),a=new Date().toISOString(),l=r.runner??"codex",c=`craig/${o}`,d=Y.join(e.craigDir,"task-bundles",o),u=Y.join(e.logsDir,`${o}.log`),p=Y.join(e.artifactsDir,o);await Wr(d,{recursive:!0}),await Wr(p,{recursive:!0}),await li(u,"","utf8");let h=await Promise.all(i.map(b=>De(e,b))),f=sb(h),m=await Promise.all(h.map(b=>rb(e,b,o,c,Y.join(d,f.get(b.id))))),y=m.find(b=>b.status==="ready")??m[0];if(!m.some(b=>b.status==="ready"))throw await tb(d,{recursive:!0,force:!0}),new Error(`No project repo targets could be provisioned for ${t}: ${m.map(b=>`${b.repoId}: ${b.failureReason??"unknown error"}`).join("; ")}`);await Ga({taskId:o,workspaceId:t,prompt:n,repos:h,repoTargets:m,bundlePath:d});let T=Kr(o,n,a,l,r.config??{}),R={id:o,title:n,slug:Ur(n),type:"project",status:"draft",runner:l,repoId:y.repoId,workspaceId:s.id,selectedPtyTabId:T[0]?.id??null,linkedRepoIds:i.filter(b=>b!==y.repoId),...Lp(o,r.lineage),repoRoot:d,worktreePath:d,branch:c,bundlePath:d,selectedRepoTargetId:y.repoId,repoTargets:m,ptyTabs:T,runnerSession:{command:k.runners.buildCommand(l,n,r.config??{}),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:n},checks:y.checks,lastCommit:null,prs:[],artifacts:{logPath:Y.relative(e.workspaceRoot,u),checkSummaryPath:Y.relative(e.workspaceRoot,Y.join(p,"check-summary.json")),prDraftPath:null,prStatusPath:Y.relative(e.workspaceRoot,Y.join(p,"pr-status.json"))},cleanup:ci(),lastFailureReason:m.every(b=>b.status==="unavailable")?"No project repo targets could be provisioned.":null,createdAt:a,updatedAt:a};return await Ze(e,R),await La(e,o),{repoId:y.repoId,repoRoot:d,workspaceId:s.id,task:R,bundlePath:d,repoTargets:m}},Kr=(e,t,n,r="codex",s={})=>{let i=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",...s.previews?.agentOrchestration?{capabilityId:`capability_${eb()}`}:{},title:i.defaultAgentTitle,command:k.runners.buildCommand(r,void 0,s),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},nb=(e,t)=>{let n=new Date().toISOString(),r=Kr(t.taskId,t.prompt,n,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:Ur(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,selectedPtyTabId:r[0]?.id??null,linkedRepoIds:[],...Lp(t.taskId,t.lineage),repoRoot:t.repoRoot,worktreePath:t.worktreePath,branch:t.branch,ptyTabs:r,runnerSession:{command:k.runners.buildCommand(t.runner,t.prompt,t.config),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:t.prompt},checks:{...Ha(Y.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:Y.relative(e.workspaceRoot,Y.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:Y.relative(e.workspaceRoot,Y.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:Y.relative(e.workspaceRoot,Y.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:ci(),lastFailureReason:null,createdAt:n,updatedAt:n}},rb=async(e,t,n,r,s)=>{try{return await Ka(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:Ha(Y.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Fp(),cleanup:ci()}}},Ka=async(e,t,n,r)=>(await Wr(Y.dirname(r),{recursive:!0}),await Ba(t.rootPath,n,r,t.defaultBranch),{repoId:t.id,branch:n,repoRoot:t.rootPath,worktreePath:r,status:"ready",failureReason:null,checks:Ha(Y.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Fp(),cleanup:ci()}),sb=e=>{let t=new Set(["manifest.json",xp]),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},ib=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=Y.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=H(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})`},nb=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",rb=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",sb=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var jr=async(e,t)=>{let n=await J("git",["show-ref","--verify","--quiet",`refs/heads/${t}`],{cwd:e});if(n.exitCode===0)return!0;if(n.exitCode===1)return!1;throw new Error(n.stderr.trim()||n.stdout.trim()||"Unable to check git branch state.")},Ka=async(e,t,n,r="main")=>{let s=r.trim()||"main";if((await J("git",["show-ref","--verify","--quiet",`refs/heads/${s}`],{cwd:e})).exitCode!==0)throw new Error(`Base branch '${s}' does not exist locally.`);let o=await ib(e,s);await K("git",["worktree","add","-b",t,n,o],{cwd:e})},ib=async(e,t)=>(await J("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await J("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await J("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t,oi=async e=>{let t=await J("git",["status","--short"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"Unable to inspect git status.");return t.stdout.trim().length>0},Op=async e=>{await K("git",["add","-A"],{cwd:e})},$p=async(e,t)=>{await K("git",["commit","-m",t],{cwd:e})},Np=async e=>{let t=await K("git",["show","-s","--format=%H%n%s","HEAD"],{cwd:e}),[n="",r=""]=t.stdout.trim().split(`
12
+ `);if(!n||!r)throw new Error("Unable to read git HEAD commit metadata.");return{sha:n,message:r}},Dp=async e=>{let t=await J("git",["branch","--show-current"],{cwd:e});if(t.exitCode!==0)return null;let n=t.stdout.trim();return n.length>0?n:null};var ai=async(e,t)=>{await K("git",["worktree","remove","--force",t],{cwd:e})},_p=async(e,t)=>{await K("git",["branch","-D",t],{cwd:e})};var Ga=async e=>zn(e,e.repoRoot),zn=async(e,t)=>{let n=await Oe(e),r=xp(new Date),s=Fp(n.taskIds,r);for(;;){let i=`task_${r}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await jr(t,o))return i;s+=1}},qr=async e=>{let t=await Oe(e),n=xp(new Date),r=Fp(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`},xp=e=>{let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}${n}${r}`},Fp=(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 Ur=async(e,t,n={readRawTask:Ct,validateTaskRecord:Be})=>{let r=await Oe(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(ob(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}},ob=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var Lp=["merge_ready","pr_open","checked","review","running","draft"],Ha=e=>[...e].sort((t,n)=>t.id.localeCompare(n.id)),Ya=(e,t)=>t&&e.some(r=>r.id===t)?t:e.length===0?null:[...e].sort(ab)[0]?.id??null,ab=(e,t)=>{let n=Mp(e.status),r=Mp(t.status);return n!==r?n-r:t.updatedAt.localeCompare(e.updatedAt)},Mp=e=>{let t=Lp.indexOf(e);return t>=0?t:Lp.length};import jp from"node:path";var Rn=(e,t)=>t?jp.isAbsolute(t)?t:jp.join(e.repoRoot,t):null;import{randomUUID as lb}from"node:crypto";import{mkdir as Wr,rm as cb,writeFile as li}from"node:fs/promises";import Y from"node:path";var Br=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");var qp=["AGENTS","md"].join("."),Jn=async(e,t,n,r={})=>{let s=await _e(e,t),[i,o]=await Promise.all([mb(e,s.id,r.workspaceId,r.allowLinkedProjectRepo??!1),zn(e,s.rootPath)]),a=`craig/${o}`,l=Y.join(e.worktreesDir,s.id,o),c=Y.join(e.logsDir,`${o}.log`),d=Y.join(e.artifactsDir,o);await Promise.all([Wr(Y.dirname(l),{recursive:!0}),Wr(d,{recursive:!0}),li(c,"","utf8")]);let u=ub(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 et(e,u),await Ua(e,o),await Ka(s.rootPath,a,l,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,workspaceId:i.id,task:u}},Vr=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 Jn(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 qr(e),a=new Date().toISOString(),l=r.runner??"codex",c=`craig/${o}`,d=Y.join(e.craigDir,"task-bundles",o),u=Y.join(e.logsDir,`${o}.log`),p=Y.join(e.artifactsDir,o);await Wr(d,{recursive:!0}),await Wr(p,{recursive:!0}),await li(u,"","utf8");let h=await Promise.all(i.map(b=>_e(e,b))),f=pb(h),m=await Promise.all(h.map(b=>db(e,b,o,c,Y.join(d,f.get(b.id))))),y=m.find(b=>b.status==="ready")??m[0];if(!m.some(b=>b.status==="ready"))throw await cb(d,{recursive:!0,force:!0}),new Error(`No project repo targets could be provisioned for ${t}: ${m.map(b=>`${b.repoId}: ${b.failureReason??"unknown error"}`).join("; ")}`);await Ja({taskId:o,workspaceId:t,prompt:n,repos:h,repoTargets:m,bundlePath:d});let T=Kr(o,n,a,l,r.config??{}),R={id:o,title:n,slug:Br(n),type:"project",status:"draft",runner:l,repoId:y.repoId,workspaceId:s.id,selectedPtyTabId:T[0]?.id??null,linkedRepoIds:i.filter(b=>b!==y.repoId),...Bp(o,r.lineage),repoRoot:d,worktreePath:d,branch:c,bundlePath:d,selectedRepoTargetId:y.repoId,repoTargets:m,ptyTabs:T,runnerSession:{command:k.runners.buildCommand(l,n,r.config??{}),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:n},checks:y.checks,lastCommit:null,prs:[],artifacts:{logPath:Y.relative(e.workspaceRoot,u),checkSummaryPath:Y.relative(e.workspaceRoot,Y.join(p,"check-summary.json")),prDraftPath:null,prStatusPath:Y.relative(e.workspaceRoot,Y.join(p,"pr-status.json"))},cleanup:ci(),lastFailureReason:m.every(b=>b.status==="unavailable")?"No project repo targets could be provisioned.":null,createdAt:a,updatedAt:a};return await et(e,R),await Ua(e,o),{repoId:y.repoId,repoRoot:d,workspaceId:s.id,task:R,bundlePath:d,repoTargets:m}},Kr=(e,t,n,r="codex",s={})=>{let i=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",...s.previews?.agentOrchestration?{capabilityId:`capability_${lb()}`}:{},title:i.defaultAgentTitle,command:k.runners.buildCommand(r,void 0,s),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},ub=(e,t)=>{let n=new Date().toISOString(),r=Kr(t.taskId,t.prompt,n,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:Br(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,selectedPtyTabId:r[0]?.id??null,linkedRepoIds:[],...Bp(t.taskId,t.lineage),repoRoot:t.repoRoot,worktreePath:t.worktreePath,branch:t.branch,ptyTabs:r,runnerSession:{command:k.runners.buildCommand(t.runner,t.prompt,t.config),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:t.prompt},checks:{...Xa(Y.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:Y.relative(e.workspaceRoot,Y.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:Y.relative(e.workspaceRoot,Y.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:Y.relative(e.workspaceRoot,Y.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:ci(),lastFailureReason:null,createdAt:n,updatedAt:n}},db=async(e,t,n,r,s)=>{try{return await za(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:Xa(Y.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Up(),cleanup:ci()}}},za=async(e,t,n,r)=>(await Wr(Y.dirname(r),{recursive:!0}),await Ka(t.rootPath,n,r,t.defaultBranch),{repoId:t.id,branch:n,repoRoot:t.rootPath,worktreePath:r,status:"ready",failureReason:null,checks:Xa(Y.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Up(),cleanup:ci()}),pb=e=>{let t=new Set(["manifest.json",qp]),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},fb=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=Y.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
- `)},Ga=async e=>{await li(Y.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:Y.relative(e.bundlePath,t.worktreePath),status:t.status,worktreePath:t.worktreePath,failureReason:t.failureReason}))},null,2),"utf8"),await li(Y.join(e.bundlePath,xp),ib(e),"utf8")},Ha=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),Fp=()=>({provider:"github",number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null}),ci=()=>({worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),Lp=(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}),ob=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 Ya=async(e,t,n)=>{await K(e,t,r=>({...r,status:r.status==="running"?"draft":r.status,runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n}))},Gr=async(e,t,n)=>K(e,t,r=>({...r,status:"draft",runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n})),Hr=async(e,t)=>K(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 za=async(e,t,n,r={})=>{let s=n.trim(),i=await k.load(e),o=r.runner??k.runners.getDefault(i);if(k.runners.assertEnabled(o,i),t.trim().length===0)throw new Error(r.workspaceId?"Workspace id cannot be empty.":"Repo id cannot be empty.");if(s.length===0)throw new Error("Task prompt cannot be empty.");let l=(r.workspaceId?await Vr(e,r.workspaceId,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}):await Jn(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 Hr(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 Gr(e,l.id,c instanceof Error?c.message:"Unknown Craig error"),c}};import{mkdir as db}from"node:fs/promises";import pb from"node:path";var Et=async e=>{let t=await J("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var Mp=async(e,t,n)=>{let r=n==="merge"?"--merge":n==="rebase"?"--rebase":"--squash";await H("gh",["pr","merge",String(t),r,"--delete-branch=false"],{cwd:e})},Xn=async(e,t)=>{let n=await H("gh",Ja(e),{cwd:t});return JSON.parse(n.stdout)},Qn=async(e,t)=>{let n=await J("gh",Ja(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Bp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},jp=async(e,t)=>{let n=await J("gh",Ja(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Bp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},qp=async(e,t,n)=>{if(n.length===0)return[];let r=cb(n),s;try{s=await H("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw ab(a)?new We(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=ub(c);return{id:a.id,found:d!==null,view:d}})},ui=async e=>{let t=await J("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:lb(t.stdout.trim())},Yt=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])}},ab=e=>{let t=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase();return t.includes("rate limit")||t.includes("secondary rate limit")||t.includes("abuse detection")||t.includes("api rate limit exceeded")||t.includes("you have exceeded")},Bp=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},Ja=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],lb=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},cb=e=>`
14
+ `)},Ja=async e=>{await li(Y.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:Y.relative(e.bundlePath,t.worktreePath),status:t.status,worktreePath:t.worktreePath,failureReason:t.failureReason}))},null,2),"utf8"),await li(Y.join(e.bundlePath,qp),fb(e),"utf8")},Xa=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),Up=()=>({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}),ci=()=>({worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),Bp=(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}),mb=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 Qa=async(e,t,n)=>{await G(e,t,r=>({...r,status:r.status==="running"?"draft":r.status,runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n}))},Gr=async(e,t,n)=>G(e,t,r=>({...r,status:"draft",runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n})),Hr=async(e,t)=>G(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 Za=async(e,t,n,r={})=>{let s=n.trim(),i=await k.load(e),o=r.runner??k.runners.getDefault(i);if(k.runners.assertEnabled(o,i),t.trim().length===0)throw new Error(r.workspaceId?"Workspace id cannot be empty.":"Repo id cannot be empty.");if(s.length===0)throw new Error("Task prompt cannot be empty.");let l=(r.workspaceId?await Vr(e,r.workspaceId,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}):await Jn(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 Hr(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 Gr(e,l.id,c instanceof Error?c.message:"Unknown Craig error"),c}};import{mkdir as kb}from"node:fs/promises";import Tb from"node:path";var Ot=async e=>{let t=await J("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var Wp=async(e,t,n)=>{let r=n==="merge"?"--merge":n==="rebase"?"--rebase":"--squash";await K("gh",["pr","merge",String(t),r,"--delete-branch=false"],{cwd:e})},Xn=async(e,t)=>{let n=await K("gh",el(e),{cwd:t});return JSON.parse(n.stdout)},Qn=async(e,t)=>{let n=await J("gh",el(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Gp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Vp=async(e,t)=>{let n=await J("gh",el(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Gp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Kp=async(e,t,n)=>{if(n.length===0)return[];let r=yb(n),s;try{s=await K("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw hb(a)?new Ve(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=wb(c);return{id:a.id,found:d!==null,view:d}})},ui=async e=>{let t=await J("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:gb(t.stdout.trim())},Yt=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])}},hb=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")},Gp=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},el=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],gb=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},yb=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,85 +65,85 @@ fragment PrFields on PullRequest {
65
65
  }
66
66
  }
67
67
  }
68
- `,ub=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 db(pb.dirname(n),{recursive:!0}),await U(n,{taskId:t.id,prs:t.prs}))},Zn=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},Yr=async(e,t,n,r,s={readRawTask:vt,validateTaskRecord:Be,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 Zn(e,u,s)}),zr=async(e,t)=>{let n=G(t),r=n?.number?String(n.number):t.branch,s=await Xn(r,t.worktreePath);return Yr(e,t,s,n)},Jr=async(e,t)=>{for(let n of await Xa(t)){let r=await Qn(n,t.worktreePath);if(!r)continue;return{discovered:!0,task:await Yr(e,t,r,null)}}return{discovered:!1,task:t}},Xa=async e=>{let t=await Ap(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(n=>!!n))]};async function Xr(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=Yt(r.url),a=s.prs.find(h=>o?Hn(h,{owner:o.owner,repo:o.name,number:r.number}):h.number===r.number)??null,l=At(r,a,o??void 0),c=fb(r),d=Ct(s,l),u={...d,repoTargets:(d.repoTargets??[]).map(h=>h.repoId===n?{...h,pullRequest:r.headRefName===h.branch?c:er(h)?h.pullRequest:Up(h.pullRequest)}:h)},p={...u,status:u.status==="closed"?u.status:pi(u)};return Zn(e,p)})}async function di(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||er(s))return r;let i={...r,repoTargets:(r.repoTargets??[]).map(a=>a.repoId===n?{...a,pullRequest:Up(a.pullRequest)}:a)},o={...i,status:i.status==="closed"?i.status:pi(i)};return Zn(e,o)})}function er(e){return e.pullRequest.number!==null&&e.pullRequest.headBranch===e.branch}function fb(e){let t=Yt(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:mb(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:hb(e.reviewDecision??null),requiredChecks:ja(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function pi(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 mb=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,hb=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Up=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 tr=async(e,t,n)=>{if(er(n)){let s=String(n.pullRequest.number),i=await Xn(s,n.worktreePath);return await Xr(e,t.id,n.repoId,i),"synced"}let r=await Qn(n.branch,n.worktreePath);return r?(await Xr(e,t.id,n.repoId,r),"discovered"):(await di(e,t.id,n.repoId),"not_found")};var Qr=async(e,t)=>{let n=await F(e,t),r=G(n);return r?.number?(await Et(n.worktreePath),Ht(r)?(await Jr(e,n)).task:zr(e,n)):n},Za=async(e,t)=>{let n=await F(e,t);if(n.type==="project"&&n.repoTargets?.length)return await nr(e,t),F(e,t);let r=G(n);if(await he(n),await Et(n.worktreePath),!r?.number||Ht(r)){let i=await Jr(e,n);if(!i.discovered&&!r?.number)throw new Error(`No PR found for ${n.branch}.`);return i.task}return await zr(e,n)},nr=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 tr(e,n,i):await tr(e,n,i).catch(()=>"not_found");s[o==="not_found"?"notFound":o]++}return s},el=async(e,t)=>{let n=new Map,r=new Map,s=[];for(let i of t){let o=Qa(n,i);if(i.type==="project"&&i.repoTargets?.length){for(let u of i.repoTargets.filter(p=>p.status==="ready")){let p=er(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 Wp(r,h).catch(async()=>{try{await Et(u.worktreePath);let f=u.pullRequest.number?await tr(e,i,u):await tr(e,i,u);fi(o,f,u.pullRequest.number??null,u.pullRequest.url??null)}catch(f){if(f instanceof We)throw f;s.push(f)}})}continue}let a=G(i),l=a?.number&&!Ht(a),c=l?[]:await Xa(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 Wp(r,d).catch(async()=>{try{let{disposition:u,task:p}=await mi(e,i.id),h=G(p);fi(o,u,h?.number??null,h?.url??null)}catch(u){if(u instanceof We)throw u;s.push(u)}})}for(let i of r.values())try{await Et(i.worktreePath);let o=await qp(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=Qa(n,l.task),u=a.get(l.id)?.view??await gb(i.worktreePath,l);if(!u){l.targetRepoId&&l.mode==="head"&&await di(e,l.task.id,l.targetRepoId),fi(c,"not_found",null,null);continue}if(l.targetRepoId)await Xr(e,l.task.id,l.targetRepoId,u);else{let p=await vt(e,l.task.id),h=Be(p,`${e.tasksDir}/${l.task.id}.json`);await Yr(e,h,u,l.mode==="number"?G(h):null)}fi(c,l.mode==="number"?"synced":"discovered",u.number,u.url)}}catch(o){if(o instanceof We)throw o;s.push(o)}return yb(s),t.map(i=>Qa(n,i))},mi=async(e,t)=>{let n=await F(e,t);await he(n),await Et(n.worktreePath);let r=G(n);if(r?.number&&!Ht(r))return{disposition:"synced",task:await zr(e,n)};let s=await Jr(e,n);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},gb=async(e,t)=>{if(t.mode!=="head")return null;for(let n of t.fallbackSelectors){let r=await Qn(n,e);if(r)return r}return null},Wp=async(e,t)=>{let n=await ui(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]})},Qa=(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):!!G(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,r),r},fi=(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},yb=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var tl=async(e,t)=>{let n=await F(e,t);try{n.type==="project"&&n.repoTargets?.length?(await nr(e,t),n=await F(e,t)):n.prs.some(s=>s.number)&&(n=await Qr(e,t))}catch{}let r=await Mr(e,n);return{kind:"showTask",task:n,inspection:r}};var nl=async(e,t)=>{let n=await F(e,t);if(await he(n),(await H("git",["status","--short"],{cwd:n.worktreePath})).stdout.trim().length===0)return{kind:"showTaskDiff",taskId:n.id,diffText:"",isEmpty:!0};let s=await wb(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}},wb=async e=>{let t=[],n=await H("git",["diff","--stat","--patch","HEAD"],{cwd:e});n.stdout.trim().length>0&&t.push(n.stdout.trimEnd());let r=await kb(e);for(let s of r){let i=await J("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(i.stdout.trimEnd())}return t.join(`
68
+ `,wb=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 Pn=async(e,t)=>{let n=Rn(e,t.artifacts.prStatusPath);n&&(await kb(Tb.dirname(n),{recursive:!0}),await B(n,{taskId:t.id,prs:t.prs}))},Zn=async(e,t,n={writeTask:et,writePrStatusArtifact:Pn})=>{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},Yr=async(e,t,n,r,s={readRawTask:Ct,validateTaskRecord:Be,writeTask:et,writePrStatusArtifact:Pn,withTaskLock:Ze})=>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=Et(n,a),c=At(o,l),d=o.status==="closed"?o.status:bn(c.prs),u={...c,status:d};return Zn(e,u,s)}),zr=async(e,t)=>{let n=H(t),r=n?.number?String(n.number):t.branch,s=await Xn(r,t.worktreePath);return Yr(e,t,s,n)},Jr=async(e,t)=>{for(let n of await tl(t)){let r=await Qn(n,t.worktreePath);if(!r)continue;return{discovered:!0,task:await Yr(e,t,r,null)}}return{discovered:!1,task:t}},tl=async e=>{let t=await Dp(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(n=>!!n))]};async function Xr(e,t,n,r){return Ze(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=Yt(r.url),a=s.prs.find(h=>o?Hn(h,{owner:o.owner,repo:o.name,number:r.number}):h.number===r.number)??null,l=Et(r,a,o??void 0),c=bb(r),d=At(s,l),u={...d,repoTargets:(d.repoTargets??[]).map(h=>h.repoId===n?{...h,pullRequest:r.headRefName===h.branch?c:er(h)?h.pullRequest:Hp(h.pullRequest)}:h)},p={...u,status:u.status==="closed"?u.status:pi(u)};return Zn(e,p)})}async function di(e,t,n){return Ze(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||er(s))return r;let i={...r,repoTargets:(r.repoTargets??[]).map(a=>a.repoId===n?{...a,pullRequest:Hp(a.pullRequest)}:a)},o={...i,status:i.status==="closed"?i.status:pi(i)};return Zn(e,o)})}function er(e){return e.pullRequest.number!==null&&e.pullRequest.headBranch===e.branch}function bb(e){let t=Yt(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:Rb(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:Pb(e.reviewDecision??null),requiredChecks:Wa(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function pi(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 Rb=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,Pb=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Hp=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 tr=async(e,t,n)=>{if(er(n)){let s=String(n.pullRequest.number),i=await Xn(s,n.worktreePath);return await Xr(e,t.id,n.repoId,i),"synced"}let r=await Qn(n.branch,n.worktreePath);return r?(await Xr(e,t.id,n.repoId,r),"discovered"):(await di(e,t.id,n.repoId),"not_found")};var Qr=async(e,t)=>{let n=await F(e,t),r=H(n);return r?.number?(await Ot(n.worktreePath),Ht(r)?(await Jr(e,n)).task:zr(e,n)):n},rl=async(e,t)=>{let n=await F(e,t);if(n.type==="project"&&n.repoTargets?.length)return await nr(e,t),F(e,t);let r=H(n);if(await he(n),await Ot(n.worktreePath),!r?.number||Ht(r)){let i=await Jr(e,n);if(!i.discovered&&!r?.number)throw new Error(`No PR found for ${n.branch}.`);return i.task}return await zr(e,n)},nr=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 Ot(i.worktreePath);let o=i.pullRequest.number?await tr(e,n,i):await tr(e,n,i).catch(()=>"not_found");s[o==="not_found"?"notFound":o]++}return s},sl=async(e,t)=>{let n=new Map,r=new Map,s=[];for(let i of t){let o=nl(n,i);if(i.type==="project"&&i.repoTargets?.length){for(let u of i.repoTargets.filter(p=>p.status==="ready")){let p=er(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 Yp(r,h).catch(async()=>{try{await Ot(u.worktreePath);let f=u.pullRequest.number?await tr(e,i,u):await tr(e,i,u);fi(o,f,u.pullRequest.number??null,u.pullRequest.url??null)}catch(f){if(f instanceof Ve)throw f;s.push(f)}})}continue}let a=H(i),l=a?.number&&!Ht(a),c=l?[]:await tl(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 Yp(r,d).catch(async()=>{try{let{disposition:u,task:p}=await mi(e,i.id),h=H(p);fi(o,u,h?.number??null,h?.url??null)}catch(u){if(u instanceof Ve)throw u;s.push(u)}})}for(let i of r.values())try{await Ot(i.worktreePath);let o=await Kp(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=nl(n,l.task),u=a.get(l.id)?.view??await Sb(i.worktreePath,l);if(!u){l.targetRepoId&&l.mode==="head"&&await di(e,l.task.id,l.targetRepoId),fi(c,"not_found",null,null);continue}if(l.targetRepoId)await Xr(e,l.task.id,l.targetRepoId,u);else{let p=await Ct(e,l.task.id),h=Be(p,`${e.tasksDir}/${l.task.id}.json`);await Yr(e,h,u,l.mode==="number"?H(h):null)}fi(c,l.mode==="number"?"synced":"discovered",u.number,u.url)}}catch(o){if(o instanceof Ve)throw o;s.push(o)}return Ib(s),t.map(i=>nl(n,i))},mi=async(e,t)=>{let n=await F(e,t);await he(n),await Ot(n.worktreePath);let r=H(n);if(r?.number&&!Ht(r))return{disposition:"synced",task:await zr(e,n)};let s=await Jr(e,n);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},Sb=async(e,t)=>{if(t.mode!=="head")return null;for(let n of t.fallbackSelectors){let r=await Qn(n,e);if(r)return r}return null},Yp=async(e,t)=>{let n=await ui(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]})},nl=(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):!!H(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,r),r},fi=(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},Ib=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var il=async(e,t)=>{let n=await F(e,t);try{n.type==="project"&&n.repoTargets?.length?(await nr(e,t),n=await F(e,t)):n.prs.some(s=>s.number)&&(n=await Qr(e,t))}catch{}let r=await Mr(e,n);return{kind:"showTask",task:n,inspection:r}};var ol=async(e,t)=>{let n=await F(e,t);if(await he(n),(await K("git",["status","--short"],{cwd:n.worktreePath})).stdout.trim().length===0)return{kind:"showTaskDiff",taskId:n.id,diffText:"",isEmpty:!0};let s=await vb(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}},vb=async e=>{let t=[],n=await K("git",["diff","--stat","--patch","HEAD"],{cwd:e});n.stdout.trim().length>0&&t.push(n.stdout.trimEnd());let r=await Cb(e);for(let s of r){let i=await J("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(i.stdout.trimEnd())}return t.join(`
69
69
 
70
- `)},kb=async e=>(await H("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 bb}from"node:fs/promises";var rl=async(e,t)=>{let n=await F(e,t),r=Yn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await bb(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},sl=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 Pb from"node:path";var il=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 oi(n.worktreePath)&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);let s=(await k.load(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);await K(e,n.id,a=>({...a,status:a.status==="running"?n.status:a.status,checks:{...a.checks,status:"running",commands:[...s],results:[]}}));let i=[];for(let a of s){let l=new Date().toISOString(),c=await J("sh",["-lc",a],{cwd:n.worktreePath}),d=new Date().toISOString(),u=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:d,exitCode:u}),u!==0){let p=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,h=await K(e,n.id,f=>({...f,status:"review",checks:{...f.checks,results:i,status:"failed",lastRunAt:d},lastFailureReason:p}));return await Vp(e,h),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await K(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 Vp(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},Vp=async(e,t)=>{let n=bn(e,t.artifacts.checkSummaryPath);n&&(await Rb(Pb.dirname(n),{recursive:!0}),await U(n,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))};var ol=async(e,t)=>{let n=await F(e,t);await he(n);let r=await oi(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 Ip(n.worktreePath),await vp(n.worktreePath,s);let i=await Cp(n.worktreePath),o=new Date().toISOString(),a=await K(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 Sb}from"node:fs/promises";var al=async(e,t)=>{let n=await F(e,t),r=await Ib(n.worktreePath);return K(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},Ib=async e=>{try{return await Sb(e),!0}catch{return!1}};var ll=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await ai(e.repoRoot,t.worktreePath),s=new Date().toISOString()}catch(i){r.push(i instanceof Error?i.message:"Failed to remove worktree.")}await K(e,t.id,i=>({...i,cleanup:{...i.cleanup,worktreeRemovedAt:s??i.cleanup.worktreeRemovedAt,preservedWorktree:n.preserveWorktree,warning:r.length>0?r.join(" "):null}}))};var cl=async(e,t,n)=>{let r=await De(e,n),s=await K(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}},ul=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 vb,readFile as Kp,rm as Cb,writeFile as Gp}from"node:fs/promises";import hi from"node:path";var Yp=["AGENTS","md"].join("."),dl=async(e,t,n)=>Qe(e,t,async()=>{let r=await F(e,t);Ab(r);let s=r.repoTargets?.find(f=>f.repoId===n);if(s)return Hp(r.id,s.repoId,s.branch,s.worktreePath,"unchanged");let[i,o]=await Promise.all([De(e,n),Ie(e).then(f=>f.find(m=>m.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=hi.join(a,Eb(i.name,r)),c=hi.join(a,"manifest.json"),d=hi.join(a,Yp),[u,p,h]=await Promise.all([Kp(c,"utf8"),Kp(d,"utf8"),jr(i.rootPath,r.branch)]);try{let f=await Ka(e,i,r.branch,l),m={...r,linkedRepoIds:i.id===r.repoId||r.linkedRepoIds.includes(i.id)?r.linkedRepoIds:[...r.linkedRepoIds,i.id],repoTargets:[...r.repoTargets??[],f]},y=await Promise.all((m.repoTargets??[]).map(T=>De(e,T.repoId)));return await Ga({taskId:r.id,workspaceId:r.workspaceId,prompt:Ob(u)??r.title,repos:y,repoTargets:m.repoTargets??[],bundlePath:a}),await Ze(e,m),Hp(r.id,i.id,f.branch,f.worktreePath,"added")}catch(f){let m=await $b({repoRoot:i.rootPath,branch:r.branch,worktreePath:l,branchAlreadyExisted:h,manifestPath:c,manifestBackup:u,guidePath:d,guideBackup:p});throw m.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:m.map(y=>y instanceof Error?y.message:String(y))},cause:f}):f}}),Ab=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}})},Eb=(e,t)=>{let n=new Set(["manifest.json",Yp,...(t.repoTargets??[]).map(o=>hi.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},Ob=e=>{try{let t=JSON.parse(e);return typeof t.prompt=="string"?t.prompt:null}catch{return null}},$b=async e=>{let t=[];return await Gp(e.manifestPath,e.manifestBackup,"utf8").catch(r=>t.push(r)),await Gp(e.guidePath,e.guideBackup,"utf8").catch(r=>t.push(r)),await vb(e.worktreePath).then(()=>!0).catch(()=>!1)&&await ai(e.repoRoot,e.worktreePath).catch(async r=>{t.push(r),await Cb(e.worktreePath,{recursive:!0,force:!0}).catch(s=>t.push(s))}),e.branchAlreadyExisted||await jr(e.repoRoot,e.branch).catch(s=>(t.push(s),!1))&&await Ep(e.repoRoot,e.branch).catch(s=>t.push(s)),t},Hp=(e,t,n,r,s)=>({kind:"addTaskRepoTarget",disposition:s,taskId:e,repoId:t,branch:n,worktreePath:r});import{spawn as Nb}from"node:child_process";var pl=async(e,t)=>{let n=await F(e,t);await he(n);let s=(await k.load(e)).open?.command??[];if(s.length===0)return{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!1,command:null};let i=[...s,n.worktreePath];return await Db(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},Db=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=Nb(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 Jp}from"node:fs/promises";import Zr from"node:path";async function ml(e,t){if(t.explicitTaskId!==void 0){let l=await zp(e,t.explicitTaskId,"explicit");return fl(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await zp(e,t.environmentTaskId,"environment");return fl(l,"environment",t.environmentAgentTabId)}let n=await Jp(t.cwd).catch(()=>Zr.resolve(t.cwd)),r=await Br(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await xb(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 fl(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 zp(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 fl(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 _b(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function xb(e,t){return(await Promise.all(_b(e).map(r=>Jp(r).catch(()=>Zr.resolve(r))))).some(r=>Fb(r,t))}function Fb(e,t){let n=Zr.relative(Zr.resolve(e),t);return n===""||!n.startsWith("..")&&!Zr.isAbsolute(n)}var hl=async(e,t,n)=>{let r=n.trim();if(r.length===0)throw new Error("Task title cannot be empty.");let s="",i=await K(e,t,o=>(s=o.title,{...o,title:r,slug:Ur(r)}));return{kind:"renameTask",taskId:i.id,previousTitle:s,title:i.title,slug:i.slug}};var gl=async(e,t,n="merge",r)=>{let s=await F(e,t),i=r??G(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await Mp(s.worktreePath,i,n)};var es={readTask:F,writeTask:Ze,withTaskLock:Qe,ensureGhAuthenticated:Et,fetchPrView:Xn,discoverPrView:jp,getGitHubRepositoryLocator:ui,writePrStatusArtifact:Rn};async function wl(e,t,n,r=es){let s=await r.readTask(e,t),i=await Mb(s,n,r);return zt(s,i,"showTaskPr","shown",[])}async function kl(e,t,n,r=es){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Sl(s,n,null,r);await Il(i,r);let o=await yi(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return zt(s,i,"discoverTaskPr","not_found",[]);vl(o,i);let a=wi(s,i,o.number),l=await Cl(e,s,i,o,r);return zt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function Tl(e,t,n,r,s=es){let i=Pl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Sl(o,r,i.repository,s);Qp(i.repository,a),await Il(a,s);let l=await yi(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));jb(l,i),vl(l,a);let c=wi(o,a,l.number),d=Al(o,a),u=d&&!Hn(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 Cl(e,o,a,l,s);return zt(p,a,"linkTaskPr",c?"unchanged":"linked",u)})}async function Lb(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw rr(e,t);let o=e.prs.find(a=>a.number===n.number)??G(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await gi(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw rr(e,t);let a=Xp(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&gt({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await gi(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&&gt({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&gt({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 bl(e,t,n,r=es){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Sl(s,n,null,r),o=Al(s,i);if(!o?.number)return zt(s,i,"refreshTaskPr","not_found",[]);await Il(i,r);let a=await yi(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));vl(a,i);let l=await Cl(e,s,i,a,r);return zt(l,i,"refreshTaskPr","synced",[])})}async function Rl(e,t,n,r,s=es){let i=Pl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Lb(o,r,i,s);if(Qp(i.repository,a),!wi(o,a,i.number))return zt(o,a,"unlinkTaskPr","unchanged",[]);let c=qb(o,a,i.number),d=await ef(e,c,s);return zt(d,a,"unlinkTaskPr","unlinked",[])})}function Pl(e){let t=e.trim(),n=Yt(t);if(n)return{number:n.number,repository:n};if(/^[1-9]\d*$/.test(t))return{number:Number(t),repository:null};throw new g("CLI_USAGE",`Invalid pull request selector "${e}". Use a GitHub pull request URL or positive number.`,{details:{selector:e}})}async function Sl(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw rr(e,t);return yl(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 rr(e,t);return yl(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 yl(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&&gt(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 Mb(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw rr(e,t);let s=G(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await gi(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 rr(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await gi(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function gi(e,t,n,r){let s=Xp(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function Xp(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Yt(e.url):null}async function yl(e,t,n,r,s){let i=await s.getGitHubRepositoryLocator(n);if(!i)throw new g("EXTERNAL_DEPENDENCY_FAILED",`Repo ${e} does not have a supported GitHub origin remote.`,{details:{repoId:e,worktreePath:n}});return{repoId:e,branch:t,worktreePath:n,repository:i,projectTarget:r}}async function Il(e,t){await yi("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function yi(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 Qp(e,t){if(e&&!gt(e,t.repository))throw Zp(e,t)}function jb(e,t){let n=Yt(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&&!gt(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 vl(e,t){let n=Yt(e.url);if(!n||!gt(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 rr(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 gt(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function Cl(e,t,n,r,s){let i=wi(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:rf(o)}:l)}),ef(e,a,s)}function qb(e,t,n){let r=e.prs.filter(i=>!nf(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=tf(r.filter(o=>o.owner&&o.repo&&gt({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?rf(i):Ub(t.repository)}:o)}}return s}async function ef(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?pi(t):Tn(t.prs),s={...t,status:r};return Zn(e,s,n)}function wi(e,t,n){return El(e,t).find(r=>nf(r,t,n))??null}function Al(e,t){if(!t.projectTarget)return G(e);let n=El(e,t);return tf(n)}function tf(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function El(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&gt({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?Bb(r.pullRequest,t.repository):null;return s&&!n.some(i=>Hn(i,s))?[...n,s]:n}function nf(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||gt({owner:e.owner,name:e.repo},t.repository)}function zt(e,t,n,r,s){let i=El(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:Al(e,t),warnings:s}}function rf(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 Bb(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 Ub(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:Br,getTask:F,provisionTask:Jn,provisionProjectTask:Vr,createTask:za,showTask:tl,showTaskDiff:nl,prepareTaskLogs:rl,streamTaskLogs:sl,runChecks:il,commitTask:ol,closeTask:al,cleanupTask:ll,addTaskLink:cl,addTaskRepoTarget:dl,listTaskLinks:ul,sortTasksForDisplay:Wa,resolveSelectedTaskId:Va,allocateTaskId:Ua,allocateTaskIdForRepo:zn,allocateProjectTaskId:qr,createDefaultTaskPtyTabs:Kr,assertTaskWorktreeExists:he,resolveTaskLogPath:Yn,buildTaskInspection:Mr,resolveArtifactPath:bn,openTask:pl,markRunnerFailed:Ya,recordStartupFailure:Gr,markTaskStarted:Hr,renameTask:hl,resolveContext:ml,prs:{refresh:Qr,refreshChecks:Za,discoverOrRefresh:mi,discoverOrRefreshAll:nr,discoverOrRefreshMany:el,show:wl,discover:kl,link:Tl,refreshAssociation:bl,unlink:Rl,merge:gl,getPrimaryPr:G,isPrTerminal:Ht,isMergeReady:ii,deriveTaskStatus:Tn,upsertPr:Ct,normalizePr:At,summarizeRequiredChecks:Ma,writePrStatusArtifact:Rn}};var sf={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 Jt(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 sr(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=Jt(e,s.id,t,n);sf[i]>sf[r]&&(r=i)}return r}function ki(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&Ot(s.id,t,n)==="working"))}function yt(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=Jt(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:sr(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function Ol(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=yt([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 of(e.id);let u=a-r();if(u<=0)throw Wb(e.id,n.states,n.timeoutMs);let p=s;await new Promise((h,f)=>{let m=()=>{clearTimeout(T),n.signal?.removeEventListener("abort",y),h()},y=()=>{clearTimeout(T),f(of(e.id))},T=setTimeout(m,u);i=m,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var Wb=(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}}),of=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as Hb}from"node:net";import{createHash as Vb}from"node:crypto";import{tmpdir as Kb}from"node:os";import af from"node:path";var Pn=10,Gb=new Set([6,7,8,9,Pn]);function Xt(e){return e!==void 0&&Gb.has(e)}function _e(e){let t=Vb("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:af.join(Kb(),`craig-${t}.sock`),pidPath:af.join(e.runtimeDir,"pty-daemon.pid")}}async function lf(e){let t=null;try{let n=await Yb(_e(e.paths).socketPath);return t=new Nl(n,e),await t.ready(),t}catch{return t?.close(),null}}var Nl=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
+ `)},Cb=async e=>(await K("git",["ls-files","--others","--exclude-standard"],{cwd:e})).stdout.split(`
71
+ `).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as Ab}from"node:child_process";import{access as Eb}from"node:fs/promises";var al=async(e,t)=>{let n=await F(e,t),r=Yn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await Eb(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},ll=async e=>{await new Promise((t,n)=>{let r=!1,s=Ab("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 Ob}from"node:fs/promises";import $b from"node:path";var cl=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 oi(n.worktreePath)&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);let s=(await k.load(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);await G(e,n.id,a=>({...a,status:a.status==="running"?n.status:a.status,checks:{...a.checks,status:"running",commands:[...s],results:[]}}));let i=[];for(let a of s){let l=new Date().toISOString(),c=await J("sh",["-lc",a],{cwd:n.worktreePath}),d=new Date().toISOString(),u=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:d,exitCode:u}),u!==0){let p=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,h=await G(e,n.id,f=>({...f,status:"review",checks:{...f.checks,results:i,status:"failed",lastRunAt:d},lastFailureReason:p}));return await zp(e,h),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await G(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 zp(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},zp=async(e,t)=>{let n=Rn(e,t.artifacts.checkSummaryPath);n&&(await Ob($b.dirname(n),{recursive:!0}),await B(n,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))};var ul=async(e,t)=>{let n=await F(e,t);await he(n);let r=await oi(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 Op(n.worktreePath),await $p(n.worktreePath,s);let i=await Np(n.worktreePath),o=new Date().toISOString(),a=await G(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 Nb}from"node:fs/promises";var dl=async(e,t)=>{let n=await F(e,t),r=await Db(n.worktreePath);return G(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},Db=async e=>{try{return await Nb(e),!0}catch{return!1}};var pl=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await ai(e.repoRoot,t.worktreePath),s=new Date().toISOString()}catch(i){r.push(i instanceof Error?i.message:"Failed to remove worktree.")}await G(e,t.id,i=>({...i,cleanup:{...i.cleanup,worktreeRemovedAt:s??i.cleanup.worktreeRemovedAt,preservedWorktree:n.preserveWorktree,warning:r.length>0?r.join(" "):null}}))};var fl=async(e,t,n)=>{let r=await _e(e,n),s=await G(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}},ml=async(e,t)=>{let n=await F(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>_e(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};import{access as _b,readFile as Jp,rm as xb,writeFile as Xp}from"node:fs/promises";import hi from"node:path";var Zp=["AGENTS","md"].join("."),hl=async(e,t,n)=>Ze(e,t,async()=>{let r=await F(e,t);Fb(r);let s=r.repoTargets?.find(f=>f.repoId===n);if(s)return Qp(r.id,s.repoId,s.branch,s.worktreePath,"unchanged");let[i,o]=await Promise.all([_e(e,n),Ie(e).then(f=>f.find(m=>m.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=hi.join(a,Lb(i.name,r)),c=hi.join(a,"manifest.json"),d=hi.join(a,Zp),[u,p,h]=await Promise.all([Jp(c,"utf8"),Jp(d,"utf8"),jr(i.rootPath,r.branch)]);try{let f=await za(e,i,r.branch,l),m={...r,linkedRepoIds:i.id===r.repoId||r.linkedRepoIds.includes(i.id)?r.linkedRepoIds:[...r.linkedRepoIds,i.id],repoTargets:[...r.repoTargets??[],f]},y=await Promise.all((m.repoTargets??[]).map(T=>_e(e,T.repoId)));return await Ja({taskId:r.id,workspaceId:r.workspaceId,prompt:Mb(u)??r.title,repos:y,repoTargets:m.repoTargets??[],bundlePath:a}),await et(e,m),Qp(r.id,i.id,f.branch,f.worktreePath,"added")}catch(f){let m=await jb({repoRoot:i.rootPath,branch:r.branch,worktreePath:l,branchAlreadyExisted:h,manifestPath:c,manifestBackup:u,guidePath:d,guideBackup:p});throw m.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:m.map(y=>y instanceof Error?y.message:String(y))},cause:f}):f}}),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}})},Lb=(e,t)=>{let n=new Set(["manifest.json",Zp,...(t.repoTargets??[]).map(o=>hi.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},Mb=e=>{try{let t=JSON.parse(e);return typeof t.prompt=="string"?t.prompt:null}catch{return null}},jb=async e=>{let t=[];return await Xp(e.manifestPath,e.manifestBackup,"utf8").catch(r=>t.push(r)),await Xp(e.guidePath,e.guideBackup,"utf8").catch(r=>t.push(r)),await _b(e.worktreePath).then(()=>!0).catch(()=>!1)&&await ai(e.repoRoot,e.worktreePath).catch(async r=>{t.push(r),await xb(e.worktreePath,{recursive:!0,force:!0}).catch(s=>t.push(s))}),e.branchAlreadyExisted||await jr(e.repoRoot,e.branch).catch(s=>(t.push(s),!1))&&await _p(e.repoRoot,e.branch).catch(s=>t.push(s)),t},Qp=(e,t,n,r,s)=>({kind:"addTaskRepoTarget",disposition:s,taskId:e,repoId:t,branch:n,worktreePath:r});import{spawn as qb}from"node:child_process";var gl=async(e,t)=>{let n=await F(e,t);await he(n);let s=(await k.load(e)).open?.command??[];if(s.length===0)return{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!1,command:null};let i=[...s,n.worktreePath];return await Ub(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},Ub=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=qb(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 tf}from"node:fs/promises";import Zr from"node:path";async function wl(e,t){if(t.explicitTaskId!==void 0){let l=await ef(e,t.explicitTaskId,"explicit");return yl(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await ef(e,t.environmentTaskId,"environment");return yl(l,"environment",t.environmentAgentTabId)}let n=await tf(t.cwd).catch(()=>Zr.resolve(t.cwd)),r=await Ur(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await Wb(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 yl(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 ef(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 yl(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 Bb(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function Wb(e,t){return(await Promise.all(Bb(e).map(r=>tf(r).catch(()=>Zr.resolve(r))))).some(r=>Vb(r,t))}function Vb(e,t){let n=Zr.relative(Zr.resolve(e),t);return n===""||!n.startsWith("..")&&!Zr.isAbsolute(n)}var kl=async(e,t,n)=>{let r=n.trim();if(r.length===0)throw new Error("Task title cannot be empty.");let s="",i=await G(e,t,o=>(s=o.title,{...o,title:r,slug:Br(r)}));return{kind:"renameTask",taskId:i.id,previousTitle:s,title:i.title,slug:i.slug}};var Tl=async(e,t,n="merge",r)=>{let s=await F(e,t),i=r??H(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await Wp(s.worktreePath,i,n)};var es={readTask:F,writeTask:et,withTaskLock:Ze,ensureGhAuthenticated:Ot,fetchPrView:Xn,discoverPrView:Vp,getGitHubRepositoryLocator:ui,writePrStatusArtifact:Pn};async function Rl(e,t,n,r=es){let s=await r.readTask(e,t),i=await Gb(s,n,r);return zt(s,i,"showTaskPr","shown",[])}async function Pl(e,t,n,r=es){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Al(s,n,null,r);await El(i,r);let o=await yi(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return zt(s,i,"discoverTaskPr","not_found",[]);Ol(o,i);let a=wi(s,i,o.number),l=await $l(e,s,i,o,r);return zt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function Sl(e,t,n,r,s=es){let i=Cl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Al(o,r,i.repository,s);rf(i.repository,a),await El(a,s);let l=await yi(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));Hb(l,i),Ol(l,a);let c=wi(o,a,l.number),d=Nl(o,a),u=d&&!Hn(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 $l(e,o,a,l,s);return zt(p,a,"linkTaskPr",c?"unchanged":"linked",u)})}async function Kb(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw rr(e,t);let o=e.prs.find(a=>a.number===n.number)??H(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await gi(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw rr(e,t);let a=nf(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&yt({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await gi(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&&yt({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&yt({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 Il(e,t,n,r=es){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Al(s,n,null,r),o=Nl(s,i);if(!o?.number)return zt(s,i,"refreshTaskPr","not_found",[]);await El(i,r);let a=await yi(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));Ol(a,i);let l=await $l(e,s,i,a,r);return zt(l,i,"refreshTaskPr","synced",[])})}async function vl(e,t,n,r,s=es){let i=Cl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Kb(o,r,i,s);if(rf(i.repository,a),!wi(o,a,i.number))return zt(o,a,"unlinkTaskPr","unchanged",[]);let c=Yb(o,a,i.number),d=await of(e,c,s);return zt(d,a,"unlinkTaskPr","unlinked",[])})}function Cl(e){let t=e.trim(),n=Yt(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 Al(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw rr(e,t);return bl(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 rr(e,t);return bl(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 bl(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&&yt(a.repository,n)&&i.push(a)}if(i.length!==1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.owner}/${n.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.owner,repo:n.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function Gb(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw rr(e,t);let s=H(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await gi(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 rr(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await gi(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function gi(e,t,n,r){let s=nf(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function nf(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Yt(e.url):null}async function bl(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 El(e,t){await yi("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function yi(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 rf(e,t){if(e&&!yt(e,t.repository))throw sf(e,t)}function Hb(e,t){let n=Yt(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&&!yt(t.repository,n))throw new g("PR_REPOSITORY_MISMATCH",`GitHub returned a pull request from ${n.owner}/${n.name}, not ${t.repository.owner}/${t.repository.name}.`,{details:{selectorRepository:t.repository,returnedRepository:n}})}function Ol(e,t){let n=Yt(e.url);if(!n||!yt(n,t.repository))throw sf(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 sf(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 rr(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 yt(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function $l(e,t,n,r,s){let i=wi(t,n,r.number),o=Et(r,i,n.repository),a=At(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:cf(o)}:l)}),of(e,a,s)}function Yb(e,t,n){let r=e.prs.filter(i=>!lf(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=af(r.filter(o=>o.owner&&o.repo&&yt({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?cf(i):Jb(t.repository)}:o)}}return s}async function of(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?pi(t):bn(t.prs),s={...t,status:r};return Zn(e,s,n)}function wi(e,t,n){return Dl(e,t).find(r=>lf(r,t,n))??null}function Nl(e,t){if(!t.projectTarget)return H(e);let n=Dl(e,t);return af(n)}function af(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function Dl(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&yt({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?zb(r.pullRequest,t.repository):null;return s&&!n.some(i=>Hn(i,s))?[...n,s]:n}function lf(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||yt({owner:e.owner,name:e.repo},t.repository)}function zt(e,t,n,r,s){let i=Dl(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:Nl(e,t),warnings:s}}function cf(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 zb(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 Jb(e){return{provider:"github",owner:e.owner,repo:e.name,number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null}}var S={listTasks:Ur,getTask:F,provisionTask:Jn,provisionProjectTask:Vr,createTask:Za,showTask:il,showTaskDiff:ol,prepareTaskLogs:al,streamTaskLogs:ll,runChecks:cl,commitTask:ul,closeTask:dl,cleanupTask:pl,addTaskLink:fl,addTaskRepoTarget:hl,listTaskLinks:ml,sortTasksForDisplay:Ha,resolveSelectedTaskId:Ya,allocateTaskId:Ga,allocateTaskIdForRepo:zn,allocateProjectTaskId:qr,createDefaultTaskPtyTabs:Kr,assertTaskWorktreeExists:he,resolveTaskLogPath:Yn,buildTaskInspection:Mr,resolveArtifactPath:Rn,openTask:gl,markRunnerFailed:Qa,recordStartupFailure:Gr,markTaskStarted:Hr,renameTask:kl,resolveContext:wl,prs:{refresh:Qr,refreshChecks:rl,discoverOrRefresh:mi,discoverOrRefreshAll:nr,discoverOrRefreshMany:sl,show:Rl,discover:Pl,link:Sl,refreshAssociation:Il,unlink:vl,merge:Tl,getPrimaryPr:H,isPrTerminal:Ht,isMergeReady:ii,deriveTaskStatus:bn,upsertPr:At,normalizePr:Et,summarizeRequiredChecks:Ba,writePrStatusArtifact:Pn}};var uf={idle:0,ready:1,working:2,error:3};function $t(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 Jt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return $t(t,n,r,i)}function sr(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=Jt(e,s.id,t,n);uf[i]>uf[r]&&(r=i)}return r}function ki(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&$t(s.id,t,n)==="working"))}function wt(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=Jt(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:sr(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function _l(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=wt([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 df(e.id);let u=a-r();if(u<=0)throw Xb(e.id,n.states,n.timeoutMs);let p=s;await new Promise((h,f)=>{let m=()=>{clearTimeout(T),n.signal?.removeEventListener("abort",y),h()},y=()=>{clearTimeout(T),f(df(e.id))},T=setTimeout(m,u);i=m,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var Xb=(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}}),df=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as tR}from"node:net";import{createHash as Qb}from"node:crypto";import{tmpdir as Zb}from"node:os";import pf from"node:path";var Sn=10,eR=new Set([6,7,8,9,Sn]);function Xt(e){return e!==void 0&&eR.has(e)}function xe(e){let t=Qb("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:pf.join(Zb(),`craig-${t}.sock`),pidPath:pf.join(e.runtimeDir,"pty-daemon.pid")}}async function ff(e){let t=null;try{let n=await nR(xe(e.paths).socketPath);return t=new Fl(n,e),await t.ready(),t}catch{return t?.close(),null}}var Fl=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!==Sn)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 Yb(e){return new Promise((t,n)=>{let r=Hb(e);r.once("connect",()=>t(r)),r.once("error",n)})}var _l={openObserver:uf,listTasks:e=>P.listTasks(e),getTask:(e,t)=>P.getTask(e,t),now:Date.now};async function zb(e,t,n=_l){let r=await cf(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...yt(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function Jb(e,t,n=_l){let r=await cf(e,t.taskId,n),s=await n.openObserver(e);try{let i=yt(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 Xb(e,t,n,r=_l){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await Ol(s,i,{...n,now:r.now})}finally{i.close()}}async function cf(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function uf(e){return Dl.open(e)}async function Qb(e){return uf(e)}var Dl=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 lf({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:zb,showAgentStatus:Jb,waitForTask:Xb,openObserver:Qb};import{randomUUID as kR}from"node:crypto";import{mkdir as Nf,open as Kl,readdir as Gl,readFile as is,rm as TR,stat as bR}from"node:fs/promises";import Si from"node:path";import{createHash as rR}from"node:crypto";import{mkdir as ts,readdir as Ll,readFile as ns,writeFile as sR}from"node:fs/promises";import Ve from"node:path";import{mkdir as df,readFile as Zb,rm as xl,stat as eR,writeFile as tR}from"node:fs/promises";import Fl from"node:path";async function ir(e,t){let n=Fl.join(e.runtimeDir,"fury-store.lock");await df(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await df(n);try{await tR(Fl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await xl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!pf(s,"EEXIST"))throw s;let i=await Zb(Fl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await eR(n).catch(()=>null);if(typeof i?.pid=="number"&&!nR(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await xl(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 xl(n,{recursive:!0,force:!0})}}function nR(e){try{return process.kill(e,0),!0}catch(t){return pf(t,"EPERM")}}var pf=(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 Ml(e){return rR("sha256").update(JSON.stringify(e)).digest("hex")}async function mf(e,t,n){let r=ge(e);await ts(r.definitions,{recursive:!0});let s=Ve.join(r.definitions,`${t}.yaml`);await sR(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!Qt(i,"EEXIST"))throw i})}async function hf(e,t){return ir(e,async()=>{let n=await gf(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 ts(ge(e).plans,{recursive:!0}),await U(vf(e,i.id),i),i})}async function Ti(e,t){Ri(t,"plan");try{return iR(JSON.parse(await ns(vf(e,t),"utf8")),t)}catch(n){throw Qt(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function gf(e){let t=ge(e).plans,n=await Ll(t).catch(s=>Qt(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>Ti(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function yf(e){let t=await gf(e),n=await Promise.all(t.map(s=>Bl(e,s.id))),r=new Map;for(let[s,i]of t.entries())n[s]===null&&r.set(`${i.rootTaskId}\0${i.sourceFile}`,i);return[...r.values()].sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function wf(e,t){return ir(e,async()=>{let n=await Bl(e,t.planId);if(n){if(n.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after approval.`,{});return{approval:n,created:!1}}return await ts(ge(e).approvals,{recursive:!0}),await U(Cf(e,t.planId),t),{approval:t,created:!0}})}async function kf(e,t){Ri(t,"plan");let n=await Bl(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function Tf(e,t){return ir(e,async()=>{let r=(await Rf(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 ts(ge(e).runs,{recursive:!0}),await U(jl(e,t.id),t),{run:t,created:!0}})}async function pe(e,t){Ri(t,"run");try{return Sf(JSON.parse(await ns(jl(e,t),"utf8")),t)}catch(n){throw Qt(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function bf(e){return Rf(e)}async function Rf(e){let t=ge(e).runs,n=await Ll(t).catch(s=>Qt(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 Sf(JSON.parse(await ns(Ve.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ge(e,t,n){return ir(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 U(jl(e,t),s),s})}async function Pf(e,t){await ts(ge(e).reviews,{recursive:!0}),await U(ql(e,t.id),t)}async function rs(e,t,n){return ir(e,async()=>{let r=await or(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await U(ql(e,t),s),s})}async function or(e,t){Ri(t,"review");try{return oR(JSON.parse(await ns(ql(e,t),"utf8")),t)}catch(n){throw Qt(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function bi(e){let t=ge(e).reviews,n=await Ll(t).catch(r=>Qt(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>or(e,r.slice(0,-5))))}function Sf(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!$e(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))||!$e(e.inputs)||!If(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!aR(e.stepRuns,e.order)||!ss(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 iR(e,t){if(!$e(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||!$e(e.inputs)||!If(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||!ss(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,Ml(n)!==e.planHash)throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function oR(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!$e(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&&(!$e(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=>!ff(r))||e.lastDecision!==null&&!ff(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function aR(e,t){return $e(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&lR(e[n],n))}function lR(e,t){return!$e(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")||!$e(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||ss(e.completedBy))}function ff(e){return $e(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")&&ss(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Ke(e.occurredAt)}function If(e){return $e(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 ss(e){return $e(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 jl=(e,t)=>Ve.join(ge(e).runs,`${t}.json`),vf=(e,t)=>Ve.join(ge(e).plans,`${t}.json`),Cf=(e,t)=>Ve.join(ge(e).approvals,`${t}.json`),ql=(e,t)=>Ve.join(ge(e).reviews,`${t}.json`),Ri=(e,t)=>{if(!(t==="plan"?/^fury_plan_[A-Za-z0-9_-]+$/:t==="run"?/^fury_[A-Za-z0-9_-]+$/:/^review_[A-Za-z0-9_-]+$/).test(e))throw new g("CLI_USAGE",`Invalid fury ${t} id "${e}".`,{})};async function Bl(e,t){try{let n=JSON.parse(await ns(Cf(e,t),"utf8"));if(!$e(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!ss(n.approvedBy)||!$e(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(Qt(n,"ENOENT"))return null;throw n}}var $e=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ke=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Qt=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as Af,readFile as cR,rm as Pi,stat as uR,writeFile as dR}from"node:fs/promises";import Ul from"node:path";var pR=20,fR=3e4,mR=5e3;async function Ef(e,t){let n=Ul.join(e.runtimeDir,"event-journal.lock");await Af(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Af(n);try{await dR(Ul.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Pi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!yR(s))throw s;if(await hR(n))continue;if(Date.now()-r>=fR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await wR(pR)}try{return await t()}finally{await Pi(n,{recursive:!0,force:!0})}}async function hR(e){let t=await cR(Ul.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return gR(t.pid)?!1:(await Pi(e,{recursive:!0,force:!0}),!0);let n=await uR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<mR?!1:(await Pi(e,{recursive:!0,force:!0}),!0)}function gR(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 yR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",wR=e=>new Promise(t=>setTimeout(t,e));var RR=256*1024,PR=16,SR=64*1024;async function xe(e,t,n={}){let r=Vl(n.maxSegmentBytes??RR,"Event journal segment size"),s=Vl(n.maxSegments??PR,"Event journal retention"),i=Vl(n.maxRecordBytes??SR,"Event record size");return Ef(e,async()=>{await Nf(e.eventsDir,{recursive:!0}),await OR(e);let o=await Hl(e),a=t.id??kR(),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:DR(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 Ii(e)).at(-1),f=!h||await IR(h.path,u,r);if(f&&(h={name:$f(c),path:Si.join(e.eventsDir,$f(c)),startSequence:c}),!h)throw new g("INTERNAL_ERROR","Failed to select an event journal segment.",{});let m=await Kl(h.path,"a");try{await m.writeFile(u,"utf8"),await m.sync()}finally{await m.close()}return f&&await _f(e.eventsDir),await vR(e,s),d})}async function Sn(e,t={}){let n=await Hl(e),r=$R(n.events,t.after,n.earliestSequence,n.events.at(-1)?.sequence??null),s=t.typeGlob?NR(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 Df(e){return(await Hl(e)).events}async function Hl(e){await Nf(e.eventsDir,{recursive:!0});let t=await Ii(e),n=[],r=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await is(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 nR(e){return new Promise((t,n)=>{let r=tR(e);r.once("connect",()=>t(r)),r.once("error",n)})}var Ml={openObserver:hf,listTasks:e=>S.listTasks(e),getTask:(e,t)=>S.getTask(e,t),now:Date.now};async function rR(e,t,n=Ml){let r=await mf(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...wt(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function sR(e,t,n=Ml){let r=await mf(e,t.taskId,n),s=await n.openObserver(e);try{let i=wt(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 iR(e,t,n,r=Ml){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await _l(s,i,{...n,now:r.now})}finally{i.close()}}async function mf(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function hf(e){return Ll.open(e)}async function oR(e){return hf(e)}var Ll=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 ff({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()}},Nt={listAgents:rR,showAgentStatus:sR,waitForTask:iR,openObserver:oR};import{randomUUID as CR}from"node:crypto";import{mkdir as Lf,open as zl,readdir as Jl,readFile as is,rm as AR,stat as ER}from"node:fs/promises";import Si from"node:path";import{createHash as dR}from"node:crypto";import{mkdir as ts,readdir as Ul,readFile as ns,writeFile as pR}from"node:fs/promises";import Ke from"node:path";import{mkdir as gf,readFile as aR,rm as jl,stat as lR,writeFile as cR}from"node:fs/promises";import ql from"node:path";async function ir(e,t){let n=ql.join(e.runtimeDir,"fury-store.lock");await gf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await gf(n);try{await cR(ql.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await jl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!yf(s,"EEXIST"))throw s;let i=await aR(ql.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await lR(n).catch(()=>null);if(typeof i?.pid=="number"&&!uR(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await jl(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 jl(n,{recursive:!0,force:!0})}}function uR(e){try{return process.kill(e,0),!0}catch(t){return yf(t,"EPERM")}}var yf=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var ge=e=>({root:Ke.join(e.craigDir,"fury"),definitions:Ke.join(e.craigDir,"fury","definitions"),plans:Ke.join(e.craigDir,"fury","plans"),approvals:Ke.join(e.craigDir,"fury","approvals"),runs:Ke.join(e.craigDir,"fury","runs"),reviews:Ke.join(e.craigDir,"fury","reviews")});function Bl(e){return dR("sha256").update(JSON.stringify(e)).digest("hex")}async function kf(e,t,n){let r=ge(e);await ts(r.definitions,{recursive:!0});let s=Ke.join(r.definitions,`${t}.yaml`);await pR(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!Qt(i,"EEXIST"))throw i})}async function Tf(e,t){return ir(e,async()=>{let n=await bf(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 ts(ge(e).plans,{recursive:!0}),await B($f(e,i.id),i),i})}async function Ti(e,t){Ri(t,"plan");try{return fR(JSON.parse(await ns($f(e,t),"utf8")),t)}catch(n){throw Qt(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function bf(e){let t=ge(e).plans,n=await Ul(t).catch(s=>Qt(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>Ti(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Rf(e){let t=await bf(e),n=await Promise.all(t.map(s=>Kl(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 Pf(e,t){return ir(e,async()=>{let n=await Kl(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 ts(ge(e).approvals,{recursive:!0}),await B(Nf(e,t.planId),t),{approval:t,created:!0}})}async function Sf(e,t){Ri(t,"plan");let n=await Kl(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function If(e,t){return ir(e,async()=>{let r=(await Cf(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 ts(ge(e).runs,{recursive:!0}),await B(Wl(e,t.id),t),{run:t,created:!0}})}async function pe(e,t){Ri(t,"run");try{return Ef(JSON.parse(await ns(Wl(e,t),"utf8")),t)}catch(n){throw Qt(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function vf(e){return Cf(e)}async function Cf(e){let t=ge(e).runs,n=await Ul(t).catch(s=>Qt(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 Ef(JSON.parse(await ns(Ke.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function He(e,t,n){return ir(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 B(Wl(e,t),s),s})}async function Af(e,t){await ts(ge(e).reviews,{recursive:!0}),await B(Vl(e,t.id),t)}async function rs(e,t,n){return ir(e,async()=>{let r=await or(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await B(Vl(e,t),s),s})}async function or(e,t){Ri(t,"review");try{return mR(JSON.parse(await ns(Vl(e,t),"utf8")),t)}catch(n){throw Qt(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function bi(e){let t=ge(e).reviews,n=await Ul(t).catch(r=>Qt(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>or(e,r.slice(0,-5))))}function Ef(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!$e(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))||!$e(e.inputs)||!Of(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!hR(e.stepRuns,e.order)||!ss(e.actor)||!Ge(e.createdAt)||!Ge(e.updatedAt)||!Ge(e.stateChangedAt)||!Ge(e.deadlineAt)||e.completedAt!==null&&!Ge(e.completedAt))throw new g("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function fR(e,t){if(!$e(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||!$e(e.inputs)||!Of(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||!ss(e.createdBy)||!Ge(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,Bl(n)!==e.planHash)throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function mR(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!$e(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&&(!$e(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||!Ge(e.requestedAt)||!Ge(e.deadlineAt)||!Ge(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!wf(r))||e.lastDecision!==null&&!wf(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function hR(e,t){return $e(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&gR(e[n],n))}function gR(e,t){return!$e(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")||!$e(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||Ge(n))&&(e.completedBy===null||ss(e.completedBy))}function wf(e){return $e(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")&&ss(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Ge(e.occurredAt)}function Of(e){return $e(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 ss(e){return $e(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 Wl=(e,t)=>Ke.join(ge(e).runs,`${t}.json`),$f=(e,t)=>Ke.join(ge(e).plans,`${t}.json`),Nf=(e,t)=>Ke.join(ge(e).approvals,`${t}.json`),Vl=(e,t)=>Ke.join(ge(e).reviews,`${t}.json`),Ri=(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 Kl(e,t){try{let n=JSON.parse(await ns(Nf(e,t),"utf8"));if(!$e(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!ss(n.approvedBy)||!$e(n.approvedBy)||n.approvedBy.type!=="human"||!Ge(n.approvedAt))throw new g("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(Qt(n,"ENOENT"))return null;throw n}}var $e=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ge=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Qt=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as Df,readFile as yR,rm as Pi,stat as wR,writeFile as kR}from"node:fs/promises";import Gl from"node:path";var TR=20,bR=3e4,RR=5e3;async function _f(e,t){let n=Gl.join(e.runtimeDir,"event-journal.lock");await Df(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Df(n);try{await kR(Gl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Pi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!IR(s))throw s;if(await PR(n))continue;if(Date.now()-r>=bR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await vR(TR)}try{return await t()}finally{await Pi(n,{recursive:!0,force:!0})}}async function PR(e){let t=await yR(Gl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return SR(t.pid)?!1:(await Pi(e,{recursive:!0,force:!0}),!0);let n=await wR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<RR?!1:(await Pi(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));var OR=256*1024,$R=16,NR=64*1024;async function Fe(e,t,n={}){let r=Yl(n.maxSegmentBytes??OR,"Event journal segment size"),s=Yl(n.maxSegments??$R,"Event journal retention"),i=Yl(n.maxRecordBytes??NR,"Event record size");return _f(e,async()=>{await Lf(e.eventsDir,{recursive:!0}),await MR(e);let o=await Xl(e),a=t.id??CR(),l=o.events.find(y=>y.id===a);if(l)return l;let c=(o.events.at(-1)?.sequence??0)+1,d={schemaVersion:1,id:a,sequence:c,workspaceId:t.workspaceId??null,taskId:t.taskId??null,agentTabId:t.agentTabId??null,commandId:t.commandId??null,furyRunId:t.furyRunId??null,furyStepId:t.furyStepId??null,type:t.type,occurredAt:t.occurredAt??new Date().toISOString(),actor:t.actor,data:UR(t.data)},u=`${JSON.stringify(d)}
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 Ii(e)).at(-1),f=!h||await DR(h.path,u,r);if(f&&(h={name:Ff(c),path:Si.join(e.eventsDir,Ff(c)),startSequence:c}),!h)throw new g("INTERNAL_ERROR","Failed to select an event journal segment.",{});let m=await zl(h.path,"a");try{await m.writeFile(u,"utf8"),await m.sync()}finally{await m.close()}return f&&await jf(e.eventsDir),await _R(e,s),d})}async function In(e,t={}){let n=await Xl(e),r=jR(n.events,t.after,n.earliestSequence,n.events.at(-1)?.sequence??null),s=t.typeGlob?qR(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 Mf(e){return(await Xl(e)).events}async function Xl(e){await Lf(e.eventsDir,{recursive:!0});let t=await Ii(e),n=[],r=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await is(i.path,"utf8"),a=s===t.length-1,l=o.split(`
76
76
  `);if(o.endsWith(`
77
- `))l.pop();else{if(!a)throw Zt(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 Zt(i.name,`empty record at line ${c+1}`);let u;try{u=JSON.parse(d)}catch{throw Zt(i.name,`invalid JSON at line ${c+1}`)}let p=_R(u,i.name,c+1);if(c===0&&p.sequence!==i.startSequence)throw Zt(i.name,`first record sequence ${p.sequence} does not match segment name`);if(r.has(p.id))throw Zt(i.name,`duplicate event id ${p.id}`);r.add(p.id);let h=n.at(-1);if(h&&p.sequence!==h.sequence+1)throw Zt(i.name,`non-monotonic sequence ${p.sequence} after ${h.sequence}`);n.push(p)}}return{events:n,earliestSequence:n[0]?.sequence??null}}async function Ii(e){return(await Gl(e.eventsDir).catch(n=>{if(Yl(n))return[];throw n})).flatMap(n=>{let r=/^segment-(\d{16})\.jsonl$/.exec(n);return r?[{name:n,path:Si.join(e.eventsDir,n),startSequence:Number(r[1])}]:[]}).sort((n,r)=>n.startSequence-r.startSequence)}async function IR(e,t,n){let r=await bR(e).catch(()=>null);return r!==null&&r.size>0&&r.size+Buffer.byteLength(t)>n}async function vR(e,t){let n=await Ii(e),r=Math.max(0,n.length-t),s=await AR(e),i=await CR(e);if(s===null||i===null)return;for(let a=0;a<r;a+=1)if(await ER(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 _f(e.eventsDir)}async function CR(e){let t=ge(e).runs,n=await Gl(t).catch(s=>{if(Yl(s))return[];throw s}),r=new Set;for(let s of n.filter(i=>i.endsWith(".json")))try{let i=JSON.parse(await is(Si.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 AR(e){let t=await Gl(e.commandsDir).catch(r=>{if(Yl(r))return[];throw r}),n=new Set;for(let r of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await is(Si.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 ER(e,t,n){if(t.size===0&&n.size===0)return!1;let r=await is(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 OR(e){let t=(await Ii(e)).at(-1);if(!t)return;let n=await is(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await Kl(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function $R(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 Wl(t);return Of(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}}):Wl(t);return Of(t,s.sequence,n),s.sequence}function Of(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 NR(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 DR(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 _R(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw Zt(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))||!ar(i.workspaceId)||!ar(i.taskId)||!ar(i.agentTabId)||!ar(i.commandId)||!ar(i.furyRunId)||!ar(i.furyStepId)||!xR(i.actor)||!("data"in i))throw Zt(t,`record at line ${n} has an invalid schema`);return i}function xR(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 ar=e=>e===null||typeof e=="string",$f=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,Zt=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),Wl=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),Yl=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Vl(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 _f(e){let t=await Kl(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as Lf,readdir as GR,readFile as Mf}from"node:fs/promises";import jf from"node:path";import{mkdir as xf,readFile as FR,rm as vi,stat as LR,writeFile as MR}from"node:fs/promises";import zl from"node:path";var jR=20,qR=3e4,BR=5e3;async function Jl(e,t){let n=zl.join(e.runtimeDir,"command-store.lock");await xf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await xf(n);try{await MR(zl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await vi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!VR(s))throw s;if(await UR(n))continue;if(Date.now()-r>=qR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await KR(jR)}try{return await t()}finally{await vi(n,{recursive:!0,force:!0})}}async function UR(e){let t=await FR(zl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return WR(t.pid)?!1:(await vi(e,{recursive:!0,force:!0}),!0);let n=await LR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<BR?!1:(await vi(e,{recursive:!0,force:!0}),!0)}function WR(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 VR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",KR=e=>new Promise(t=>setTimeout(t,e));async function Ei(e,t){Xl(t);try{let n=JSON.parse(await Mf(os(e,t),"utf8"));return Bf(n,os(e,t),t)}catch(n){throw JR(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?Ai(t,os(e,t),n):n}}async function He(e){await Lf(e.commandsDir,{recursive:!0});let t=await GR(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=jf.join(e.commandsDir,r);try{n.push(Bf(JSON.parse(await Mf(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:Ai(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function qf(e,t){return Xl(t.id),Jl(e,async()=>{await Lf(e.commandsDir,{recursive:!0});let n=await He(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!HR(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 U(os(e,t.id),t),{command:t,created:!0}})}async function as(e,t,n){return Xl(t),Jl(e,async()=>{let r=await Ei(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await U(os(e,t),s),s})}function HR(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 Bf(e,t,n){if(!Ci(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw Ai("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||!Ci(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!zR(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||!lr(e.expiresAt)||!lr(e.createdAt)||!lr(e.updatedAt)||e.deliveryStartedAt!==null&&!lr(e.deliveryStartedAt)||e.deliveredAt!==null&&!lr(e.deliveredAt)||e.cancelledAt!==null&&!lr(e.cancelledAt)||e.cancelledBy!==null&&!Ff(e.cancelledBy)||!Ff(e.actor)||!YR(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 Ai(r,t);return e}function Ff(e){return!Ci(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 YR(e){return e===null||Ci(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var os=(e,t)=>jf.join(e.commandsDir,`${t}.json`),Xl=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},lr=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),zR=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}),Ci=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),JR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",Ai=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function Uf(e,t=new Date){return Oi(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function Wf(e,t=new Date){return e.state==="delivered"?e:(Oi(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function Vf(e,t,n=new Date){return e.state==="failed"?e:(Oi(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function Kf(e,t,n=new Date){return e.state==="cancelled"?e:(Oi(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function Oi(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 XR}from"node:crypto";var Ql=32*1024,Gf=1440*60*1e3,Zl=256,QR=["delivered","failed","cancelled"],ec={type:"system",component:"orchestration-supervisor"};async function ZR(e,t){if(aP(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>Gf)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:Gf}});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)>Zl)throw new g("CLI_USAGE",`Idempotency key exceeds ${Zl} characters.`,{details:{maxIdempotencyKeyLength:Zl}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${XR()}`,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 qf(e,r);if(s.created)try{await In(e,s.command,"command.queued")}catch(i){throw Hf(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function eP(e,t){return{kind:"showPromptCommand",command:await Ei(e,t)}}async function tP(e,t){let n=await He(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function nP(e,t,n){let r=!1,s=await as(e,t,i=>{if(i.state==="cancelled")return i;let o=Kf(i,n??i.actor);return r=!0,o});if(r)try{await In(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw Hf(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function rP(e,t){let n=await as(e,t,r=>Uf(r));return await In(e,n,"command.delivering",ec),n}async function sP(e,t){let n=await as(e,t,r=>Wf(r));return await In(e,n,"command.delivered",ec),n}async function iP(e,t,n){let r=await as(e,t,s=>Vf(s,n));return await In(e,r,"command.failed",ec),r}async function oP(e,t,n){let r=[...n.states??QR],s=Date.now()+n.timeoutMs;for(;;){let i=await Ei(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 lP(Math.min(n.pollIntervalMs??100,o),n.signal)}}function aP(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>Ql)throw new g("CLI_USAGE",`Prompt exceeds the ${Ql}-byte limit.`,{details:{maxPromptBytes:Ql,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 lP(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 Hf=(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:ZR,show:eP,list:tP,cancel:nP,wait:oP,beginDelivery:rP,completeDelivery:sP,fail:iP};import{randomUUID as zf,timingSafeEqual as cP}from"node:crypto";import{mkdir as uP,readFile as dP,readdir as pP}from"node:fs/promises";import Jf from"node:path";var fP=10080*60*1e3,mP={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},hP=["task.create-child","task.children","task.cancel-tree"],gP=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 uP(sc(e),{recursive:!0,mode:448}),await K(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_${zf()}`,c=await $i(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 yP(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 yP(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${zf()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...hP],targetPolicy:"children-only",limits:{...mP},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+fP).toISOString(),revokedAt:null,revokedBy:null};return await U(ic(e,o.id),o,{mode:384}),o}async function Ye(e,t,n,r){let s=await kP(e,t);return s.revokedAt&&vn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&vn(s.id,"expired"),!gP.has(n)&&!s.allowedCommandFamilies.includes(n)&&vn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await wP(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 wP(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 Xf(e,t,n){let r=await $i(e,t);r&&(r.revokedAt||await U(ic(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function rc(e,t,n){let r=await pP(sc(e)).catch(i=>Qf(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 $i(e,o[1]);!a||!t.has(a.taskId)||(await Xf(e,a.id,n),s.push(a.id))}return s}async function kP(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 $i(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||!cP(i,o))&&vn(r,"token is invalid"),s}async function $i(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||vn(t,"identifier is invalid");try{let n=JSON.parse(await dP(ic(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(Qf(n))return null;throw n}}function TP(e,t){if(!nc(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"&&bP(r))&&e.targetPolicy==="children-only"&&nc(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&tc(e.createdAt)&&tc(e.expiresAt)&&Yf(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||tc(e.revokedAt)&&Yf(e.revokedBy))}function Yf(e){return nc(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 sc=e=>Jf.join(e.orchestrationDir,"capabilities"),ic=(e,t)=>Jf.join(sc(e),`${t}.json`),bP=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),nc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),tc=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Qf=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as Zf,readFile as RP,rm as oc,stat as PP,writeFile as SP}from"node:fs/promises";import ac from"node:path";var IP=20,vP=3e4,CP=5e3;async function lc(e,t){let n=ac.join(e.runtimeDir,"delegation.lock");await Zf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Zf(n);try{await SP(ac.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await oc(n,{recursive:!0,force:!0}),s}break}catch(s){if(!OP(s))throw s;if(await AP(n))continue;if(Date.now()-r>=vP)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,IP))}try{return await t()}finally{await oc(n,{recursive:!0,force:!0})}}async function AP(e){let t=await RP(ac.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&EP(t.pid))return!1;let n=await PP(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<CP?!1:(await oc(e,{recursive:!0,force:!0}),!0)}function EP(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 OP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var $P={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function cc(e,t,n,r={}){let s=await k.load(e);return k.previews.isEnabled(s,"agentOrchestration")?P.createTask(e,t,n,{...r,onProvisioned:async i=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:i.id,CRAIG_AGENT_TAB_ID:i.ptyTabs.find(o=>o.kind==="agent")?.id??"",...await et(e,i,{type:"human",source:"cli",processId:process.pid})})}):P.createTask(e,t,n,r)}async function uc(e,t,n={}){return lc(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??$P,a=NP(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&&Ni("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&Ni("delegation depth",o.maxDepth);let c=new Set([r.repoId,...r.linkedRepoIds,...(r.repoTargets??[]).map(y=>y.repoId)]);if(a.type==="repo"&&!c.has(a.id))throw new g("CAPABILITY_DENIED",`Repo ${a.id} is outside parent task ${r.id}.`,{details:{parentTaskId:r.id,repoId:a.id}});let u=(await P.listTasks(e,{includeClosed:!0})).tasks.filter(y=>y.parentTaskId===r.id),p=t.idempotencyKey?.trim()||null;if(p){if(p.length>256)throw new g("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let y=u.find(T=>T.delegationIdempotencyKey===p);if(y){if(!DP(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 em(y,!0)}}u.length>=o.maxChildren&&Ni("children",o.maxChildren),u.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&Ni("concurrent children",o.maxConcurrentChildren);let f=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(T=>T.kind==="agent")?.id??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await et(e,y,i)})}),m=await P.getTask(e,f.taskId);try{await xe(e,{workspaceId:m.workspaceId,taskId:m.id,agentTabId:i.type==="agent"?i.agentTabId:null,type:"task.child.created",actor:i,data:{parentTaskId:r.id,rootTaskId:m.rootTaskId,delegationDepth:m.delegationDepth,targetType:a.type,targetId:a.id}})}catch(y){throw new g("PARTIAL_RESULT",`Child ${m.id} was created, but its audit event could not be recorded.`,{details:{taskId:m.id,parentTaskId:r.id,persisted:!0},cause:y})}return em(m,!1)})}async function dc(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 pc(e,t,n){return lc(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(f=>[f.id,f])),a=new Map;for(let f of i)f.parentTaskId&&a.set(f.parentTaskId,[...a.get(f.parentTaskId)??[],f]);let l=[],c=new Set,d=f=>{if(c.has(f))throw new g("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${f}.`,{details:{taskId:f,rootTaskId:t}});let m=o.get(f);if(m){c.add(f),l.push(m);for(let y of(a.get(f)??[]).sort((T,R)=>T.id.localeCompare(R.id)))d(y.id)}};d(t);let u=[],p=[],h=[];try{await rc(e,new Set(l.map(f=>f.id)),s)}catch{h.push(...l.map(f=>f.id))}for(let f of l){let m=f.status;if(m==="closed"){u.push({taskId:f.id,previousStatus:m,status:"closed",disposition:"already-closed"});continue}await P.cleanupTask(e,f,{preserveWorktree:!0});let y=await P.closeTask(e,f.id);u.push({taskId:f.id,previousStatus:m,status:y.status,disposition:"cancelled"});try{await xe(e,{workspaceId:f.workspaceId,taskId:f.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:m}})}catch{p.push(f.id)}}if(p.length>0||h.length>0)throw new g("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:u,auditFailures:p,revocationFailures:h,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:u}})}function em(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 NP(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 DP(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function Ni(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var Di=Symbol.for("yaml.alias"),_i=Symbol.for("yaml.document"),tt=Symbol.for("yaml.map"),fc=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]===Di,wt=e=>!!e&&typeof e=="object"&&e[ve]===_i,nt=e=>!!e&&typeof e=="object"&&e[ve]===tt,M=e=>!!e&&typeof e=="object"&&e[ve]===fc,x=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 q(e){if(e&&typeof e=="object")switch(e[ve]){case Di:case tt:case Fe:case Nt:return!0}return!1}var xi=e=>(x(e)||W(e))&&!!e.anchor;var Ne=Symbol("break visit"),tm=Symbol("skip children"),kt=Symbol("remove node");function ze(e,t){let n=nm(t);wt(e)?cr(null,e.contents,n,Object.freeze([e]))===kt&&(e.contents=null):cr(null,e,n,Object.freeze([]))}ze.BREAK=Ne;ze.SKIP=tm;ze.REMOVE=kt;function cr(e,t,n,r){let s=rm(e,t,n,r);if(q(s)||M(s))return sm(e,r,s),cr(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=cr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ne)return Ne;o===kt&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=cr("key",t.key,n,r);if(i===Ne)return Ne;i===kt&&(t.key=null);let o=cr("value",t.value,n,r);if(o===Ne)return Ne;o===kt&&(t.value=null)}}return s}async function Fi(e,t){let n=nm(t);wt(e)?await ur(null,e.contents,n,Object.freeze([e]))===kt&&(e.contents=null):await ur(null,e,n,Object.freeze([]))}Fi.BREAK=Ne;Fi.SKIP=tm;Fi.REMOVE=kt;async function ur(e,t,n,r){let s=await rm(e,t,n,r);if(q(s)||M(s))return sm(e,r,s),ur(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 ur(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ne)return Ne;o===kt&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=await ur("key",t.key,n,r);if(i===Ne)return Ne;i===kt&&(t.key=null);let o=await ur("value",t.value,n,r);if(o===Ne)return Ne;o===kt&&(t.value=null)}}return s}function nm(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 rm(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(x(t))return n.Scalar?.(e,t,r);if(Le(t))return n.Alias?.(e,t,r)}function sm(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(wt(r))r.contents=n;else{let s=Le(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var _P={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},xP=e=>e.replace(/[!,[\]{}]/g,t=>_P[t]),Tt=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+xP(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&&q(t.contents)){let i={};ze(t.contents,(o,a)=>{q(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
- `)}};Tt.defaultYaml={explicit:!1,version:"1.2"};Tt.defaultTags={"!!":"tag:yaml.org,2002:"};function Li(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 mc(e){let t=new Set;return ze(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function hc(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function im(e,t){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=mc(e));let o=hc(t,s);return s.add(o),o},setAnchors:()=>{for(let i of n){let o=r.get(i);if(typeof o=="object"&&o.anchor&&(x(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 en(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=en(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=en(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=en(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=en(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||!xi(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 tn=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(!wt(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"?en(i,{"":a},"",a):a}};var Dt=class extends tn{constructor(t){super(Di),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)||xi(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=Mi(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(Li(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 Mi(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=Mi(e,s,n);i>r&&(r=i)}return r}else if(M(t)){let r=Mi(e,t.key,n),s=Mi(e,t.value,n);return Math.max(r,s)}return 1}var ji=e=>!e||typeof e!="function"&&typeof e!="object",O=class extends tn{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)}};O.BLOCK_FOLDED="BLOCK_FOLDED";O.BLOCK_LITERAL="BLOCK_LITERAL";O.PLAIN="PLAIN";O.QUOTE_DOUBLE="QUOTE_DOUBLE";O.QUOTE_SINGLE="QUOTE_SINGLE";var FP="tag:yaml.org,2002:";function LP(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(wt(e)&&(e=e.contents),q(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=FP+t.slice(2));let c=LP(e,t,o.tags);if(!c){if(e&&typeof e.toJSON=="function"&&(e=e.toJSON()),!e||typeof e!="object"){let u=new O(e);return l&&(l.node=u),u}c=e instanceof Map?o[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 O(e);return t?d.tag=t:c.default||(d.tag=c.tag),l&&(l.node=d),d}function ls(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 pr=e=>e==null||typeof e=="object"&&!!e[Symbol.iterator]().next().done,dr=class extends tn{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=>q(r)||M(r)?r.clone(t):r),this.range&&(n.range=this.range.slice()),n}addIn(t,n){if(pr(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,ls(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&&x(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&&x(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,ls(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};var om=e=>e.replace(/^(?!$)(?: $)?/gm,"#");function Je(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var bt=(e,t,n)=>e.endsWith(`
80
- `)?Je(n,t):n.includes(`
77
+ `))l.pop();else{if(!a)throw Zt(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 Zt(i.name,`empty record at line ${c+1}`);let u;try{u=JSON.parse(d)}catch{throw Zt(i.name,`invalid JSON at line ${c+1}`)}let p=BR(u,i.name,c+1);if(c===0&&p.sequence!==i.startSequence)throw Zt(i.name,`first record sequence ${p.sequence} does not match segment name`);if(r.has(p.id))throw Zt(i.name,`duplicate event id ${p.id}`);r.add(p.id);let h=n.at(-1);if(h&&p.sequence!==h.sequence+1)throw Zt(i.name,`non-monotonic sequence ${p.sequence} after ${h.sequence}`);n.push(p)}}return{events:n,earliestSequence:n[0]?.sequence??null}}async function Ii(e){return(await Jl(e.eventsDir).catch(n=>{if(Ql(n))return[];throw n})).flatMap(n=>{let r=/^segment-(\d{16})\.jsonl$/.exec(n);return r?[{name:n,path:Si.join(e.eventsDir,n),startSequence:Number(r[1])}]:[]}).sort((n,r)=>n.startSequence-r.startSequence)}async function DR(e,t,n){let r=await ER(e).catch(()=>null);return r!==null&&r.size>0&&r.size+Buffer.byteLength(t)>n}async function _R(e,t){let n=await Ii(e),r=Math.max(0,n.length-t),s=await FR(e),i=await xR(e);if(s===null||i===null)return;for(let a=0;a<r;a+=1)if(await LR(n[a].path,s,i)){r=a;break}let o=n.slice(0,r);for(let a of o)await AR(a.path,{force:!0});o.length>0&&await jf(e.eventsDir)}async function xR(e){let t=ge(e).runs,n=await Jl(t).catch(s=>{if(Ql(s))return[];throw s}),r=new Set;for(let s of n.filter(i=>i.endsWith(".json")))try{let i=JSON.parse(await is(Si.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 Jl(e.commandsDir).catch(r=>{if(Ql(r))return[];throw r}),n=new Set;for(let r of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await is(Si.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 LR(e,t,n){if(t.size===0&&n.size===0)return!1;let r=await is(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 MR(e){let t=(await Ii(e)).at(-1);if(!t)return;let n=await is(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await zl(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function jR(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 Hl(t);return xf(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}}):Hl(t);return xf(t,s.sequence,n),s.sequence}function xf(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 qR(e){if(e.length===0||e.length>256)throw new g("CLI_USAGE","Event type glob must contain between 1 and 256 characters.",{});let t=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replaceAll("*",".*");return new RegExp(`^${t}$`)}function UR(e){let t=JSON.stringify(e,(n,r)=>/prompt|token|secret|password|authorization|capability/i.test(n)?"[REDACTED]":r);return t===void 0?null:JSON.parse(t)}function BR(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw Zt(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))||!ar(i.workspaceId)||!ar(i.taskId)||!ar(i.agentTabId)||!ar(i.commandId)||!ar(i.furyRunId)||!ar(i.furyStepId)||!WR(i.actor)||!("data"in i))throw Zt(t,`record at line ${n} has an invalid schema`);return i}function WR(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 ar=e=>e===null||typeof e=="string",Ff=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,Zt=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),Hl=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),Ql=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Yl(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 jf(e){let t=await zl(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as Bf,readdir as eP,readFile as Wf}from"node:fs/promises";import Vf from"node:path";import{mkdir as qf,readFile as VR,rm as vi,stat as KR,writeFile as GR}from"node:fs/promises";import Zl from"node:path";var HR=20,YR=3e4,zR=5e3;async function ec(e,t){let n=Zl.join(e.runtimeDir,"command-store.lock");await qf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await qf(n);try{await GR(Zl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await vi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!QR(s))throw s;if(await JR(n))continue;if(Date.now()-r>=YR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await ZR(HR)}try{return await t()}finally{await vi(n,{recursive:!0,force:!0})}}async function JR(e){let t=await VR(Zl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return XR(t.pid)?!1:(await vi(e,{recursive:!0,force:!0}),!0);let n=await KR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<zR?!1:(await vi(e,{recursive:!0,force:!0}),!0)}function XR(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 QR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",ZR=e=>new Promise(t=>setTimeout(t,e));async function Ei(e,t){tc(t);try{let n=JSON.parse(await Wf(os(e,t),"utf8"));return Gf(n,os(e,t),t)}catch(n){throw sP(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?Ai(t,os(e,t),n):n}}async function Ye(e){await Bf(e.commandsDir,{recursive:!0});let t=await eP(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=Vf.join(e.commandsDir,r);try{n.push(Gf(JSON.parse(await Wf(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:Ai(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function Kf(e,t){return tc(t.id),ec(e,async()=>{await Bf(e.commandsDir,{recursive:!0});let n=await Ye(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!tP(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 B(os(e,t.id),t),{command:t,created:!0}})}async function as(e,t,n){return tc(t),ec(e,async()=>{let r=await Ei(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await B(os(e,t),s),s})}function tP(e,t){return e.taskId===t.taskId&&e.agentTabId===t.agentTabId&&e.prompt.source===t.prompt.source&&e.prompt.text===t.prompt.text&&e.delivery===t.delivery&&e.timeoutMs===t.timeoutMs}function Gf(e,t,n){if(!Ci(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw Ai("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||!Ci(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!rP(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||!lr(e.expiresAt)||!lr(e.createdAt)||!lr(e.updatedAt)||e.deliveryStartedAt!==null&&!lr(e.deliveryStartedAt)||e.deliveredAt!==null&&!lr(e.deliveredAt)||e.cancelledAt!==null&&!lr(e.cancelledAt)||e.cancelledBy!==null&&!Uf(e.cancelledBy)||!Uf(e.actor)||!nP(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 Ai(r,t);return e}function Uf(e){return!Ci(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 nP(e){return e===null||Ci(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var os=(e,t)=>Vf.join(e.commandsDir,`${t}.json`),tc=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},lr=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),rP=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}),Ci=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),sP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",Ai=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function Hf(e,t=new Date){return Oi(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function Yf(e,t=new Date){return e.state==="delivered"?e:(Oi(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function zf(e,t,n=new Date){return e.state==="failed"?e:(Oi(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function Jf(e,t,n=new Date){return e.state==="cancelled"?e:(Oi(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function Oi(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 iP}from"node:crypto";var nc=32*1024,Xf=1440*60*1e3,rc=256,oP=["delivered","failed","cancelled"],sc={type:"system",component:"orchestration-supervisor"};async function aP(e,t){if(hP(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>Xf)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:Xf}});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)>rc)throw new g("CLI_USAGE",`Idempotency key exceeds ${rc} characters.`,{details:{maxIdempotencyKeyLength:rc}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${iP()}`,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 Kf(e,r);if(s.created)try{await vn(e,s.command,"command.queued")}catch(i){throw Qf(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function lP(e,t){return{kind:"showPromptCommand",command:await Ei(e,t)}}async function cP(e,t){let n=await Ye(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function uP(e,t,n){let r=!1,s=await as(e,t,i=>{if(i.state==="cancelled")return i;let o=Jf(i,n??i.actor);return r=!0,o});if(r)try{await vn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw Qf(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function dP(e,t){let n=await as(e,t,r=>Hf(r));return await vn(e,n,"command.delivering",sc),n}async function pP(e,t){let n=await as(e,t,r=>Yf(r));return await vn(e,n,"command.delivered",sc),n}async function fP(e,t,n){let r=await as(e,t,s=>zf(s,n));return await vn(e,r,"command.failed",sc),r}async function mP(e,t,n){let r=[...n.states??oP],s=Date.now()+n.timeoutMs;for(;;){let i=await Ei(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 gP(Math.min(n.pollIntervalMs??100,o),n.signal)}}function hP(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>nc)throw new g("CLI_USAGE",`Prompt exceeds the ${nc}-byte limit.`,{details:{maxPromptBytes:nc,promptBytes:t}});if([...e].some(n=>{let r=n.charCodeAt(0);return r<=8||r>=11&&r<=31||r>=127&&r<=159}))throw new g("CLI_USAGE","Prompt contains unsupported control characters.",{})}async function vn(e,t,n,r=t.actor){await Fe(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 gP(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 Qf=(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:aP,show:lP,list:cP,cancel:uP,wait:mP,beginDelivery:dP,completeDelivery:pP,fail:fP};import{randomUUID as em,timingSafeEqual as yP}from"node:crypto";import{mkdir as wP,readFile as kP,readdir as TP}from"node:fs/promises";import tm from"node:path";var bP=10080*60*1e3,RP={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},PP=["task.create-child","task.children","task.cancel-tree"],SP=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function tt(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 wP(lc(e),{recursive:!0,mode:448}),await G(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_${em()}`,c=await $i(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 IP(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 IP(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${em()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...PP],targetPolicy:"children-only",limits:{...RP},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+bP).toISOString(),revokedAt:null,revokedBy:null};return await B(cc(e,o.id),o,{mode:384}),o}async function ze(e,t,n,r){let s=await CP(e,t);return s.revokedAt&&Cn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&Cn(s.id,"expired"),!SP.has(n)&&!s.allowedCommandFamilies.includes(n)&&Cn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await vP(e,s.taskId,r)&&Cn(s.id,`target task ${r} is outside the capability task subtree`),{capability:s,actor:{type:"agent",taskId:s.taskId,agentTabId:s.agentTabId,capabilityId:s.id}}}async function vP(e,t,n){if(t===n)return!0;let r=(await S.listTasks(e,{includeClosed:!0})).tasks,s=new Map(r.map(a=>[a.id,a])),i=s.get(n),o=new Set;for(;i?.parentTaskId&&!o.has(i.id);){if(i.parentTaskId===t)return!0;o.add(i.id),i=s.get(i.parentTaskId)}return!1}async function nm(e,t,n){let r=await $i(e,t);r&&(r.revokedAt||await B(cc(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function ac(e,t,n){let r=await TP(lc(e)).catch(i=>rm(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 $i(e,o[1]);!a||!t.has(a.taskId)||(await nm(e,a.id,n),s.push(a.id))}return s}async function CP(e,t){let n=t.indexOf("."),r=n>0?t.slice(0,n):"";/^capability_[A-Za-z0-9-]+$/.test(r)||Cn("<redacted>","token is invalid");let s=await $i(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||!yP(i,o))&&Cn(r,"token is invalid"),s}async function $i(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||Cn(t,"identifier is invalid");try{let n=JSON.parse(await kP(cc(e,t),"utf8"));if(!AP(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(rm(n))return null;throw n}}function AP(e,t){if(!oc(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"&&EP(r))&&e.targetPolicy==="children-only"&&oc(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&ic(e.createdAt)&&ic(e.expiresAt)&&Zf(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||ic(e.revokedAt)&&Zf(e.revokedBy))}function Zf(e){return oc(e)?e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component)):!1}function Cn(e,t){throw new g("CAPABILITY_DENIED",`Craig capability ${e} was denied: ${t}.`,{details:{capabilityId:e,reason:t}})}var lc=e=>tm.join(e.orchestrationDir,"capabilities"),cc=(e,t)=>tm.join(lc(e),`${t}.json`),EP=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),oc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),ic=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),rm=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as sm,readFile as OP,rm as uc,stat as $P,writeFile as NP}from"node:fs/promises";import dc from"node:path";var DP=20,_P=3e4,xP=5e3;async function pc(e,t){let n=dc.join(e.runtimeDir,"delegation.lock");await sm(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await sm(n);try{await NP(dc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await uc(n,{recursive:!0,force:!0}),s}break}catch(s){if(!MP(s))throw s;if(await FP(n))continue;if(Date.now()-r>=_P)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,DP))}try{return await t()}finally{await uc(n,{recursive:!0,force:!0})}}async function FP(e){let t=await OP(dc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&LP(t.pid))return!1;let n=await $P(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<xP?!1:(await uc(e,{recursive:!0,force:!0}),!0)}function LP(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 MP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var jP={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function fc(e,t,n,r={}){let s=await k.load(e);return k.previews.isEnabled(s,"agentOrchestration")?S.createTask(e,t,n,{...r,onProvisioned:async i=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:i.id,CRAIG_AGENT_TAB_ID:i.ptyTabs.find(o=>o.kind==="agent")?.id??"",...await tt(e,i,{type:"human",source:"cli",processId:process.pid})})}):S.createTask(e,t,n,r)}async function mc(e,t,n={}){return pc(e,async()=>{let r=await S.getTask(e,t.parentTaskId),s=t.capabilityId?await ze(e,t.capabilityId,"task.create-child",r.id):null,i=s?.actor??{type:"human",source:"cli",processId:process.pid},o=s?.capability.limits??jP,a=qP(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&&Ni("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&Ni("delegation depth",o.maxDepth);let c=new Set([r.repoId,...r.linkedRepoIds,...(r.repoTargets??[]).map(y=>y.repoId)]);if(a.type==="repo"&&!c.has(a.id))throw new g("CAPABILITY_DENIED",`Repo ${a.id} is outside parent task ${r.id}.`,{details:{parentTaskId:r.id,repoId:a.id}});let u=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(y=>y.parentTaskId===r.id),p=t.idempotencyKey?.trim()||null;if(p){if(p.length>256)throw new g("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let y=u.find(T=>T.delegationIdempotencyKey===p);if(y){if(!UP(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 im(y,!0)}}u.length>=o.maxChildren&&Ni("children",o.maxChildren),u.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&Ni("concurrent children",o.maxConcurrentChildren);let f=await(n.createTask??S.createTask)(e,a.id,l,{...t.runner?{runner:t.runner}:{},...a.type==="workspace"?{workspaceId:a.id}:{owningWorkspaceId:r.workspaceId,...r.type==="project"&&r.linkedRepoIds.includes(a.id)?{allowLinkedProjectRepo:!0}:{}},lineage:{parentTaskId:r.id,rootTaskId:r.rootTaskId,delegationDepth:r.delegationDepth+1,delegationIdempotencyKey:p,furyRunId:t.fury?.runId??r.furyRunId,furyStepId:t.fury?.stepId??null},onProvisioned:async y=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:y.id,CRAIG_AGENT_TAB_ID:y.ptyTabs.find(T=>T.kind==="agent")?.id??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await tt(e,y,i)})}),m=await S.getTask(e,f.taskId);try{await Fe(e,{workspaceId:m.workspaceId,taskId:m.id,agentTabId:i.type==="agent"?i.agentTabId:null,type:"task.child.created",actor:i,data:{parentTaskId:r.id,rootTaskId:m.rootTaskId,delegationDepth:m.delegationDepth,targetType:a.type,targetId:a.id}})}catch(y){throw new g("PARTIAL_RESULT",`Child ${m.id} was created, but its audit event could not be recorded.`,{details:{taskId:m.id,parentTaskId:r.id,persisted:!0},cause:y})}return im(m,!1)})}async function hc(e,t,n){n&&await ze(e,n,"task.children",t),await S.getTask(e,t);let r=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(s=>s.parentTaskId===t).sort((s,i)=>s.id.localeCompare(i.id));return{kind:"listTaskChildren",taskId:t,children:r}}async function gc(e,t,n){return pc(e,async()=>{let s=(n?await ze(e,n,"task.cancel-tree",t):null)?.actor??{type:"human",source:"cli",processId:process.pid};await S.getTask(e,t);let i=(await S.listTasks(e,{includeClosed:!0})).tasks,o=new Map(i.map(f=>[f.id,f])),a=new Map;for(let f of i)f.parentTaskId&&a.set(f.parentTaskId,[...a.get(f.parentTaskId)??[],f]);let l=[],c=new Set,d=f=>{if(c.has(f))throw new g("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${f}.`,{details:{taskId:f,rootTaskId:t}});let m=o.get(f);if(m){c.add(f),l.push(m);for(let y of(a.get(f)??[]).sort((T,R)=>T.id.localeCompare(R.id)))d(y.id)}};d(t);let u=[],p=[],h=[];try{await ac(e,new Set(l.map(f=>f.id)),s)}catch{h.push(...l.map(f=>f.id))}for(let f of l){let m=f.status;if(m==="closed"){u.push({taskId:f.id,previousStatus:m,status:"closed",disposition:"already-closed"});continue}await S.cleanupTask(e,f,{preserveWorktree:!0});let y=await S.closeTask(e,f.id);u.push({taskId:f.id,previousStatus:m,status:y.status,disposition:"cancelled"});try{await Fe(e,{workspaceId:f.workspaceId,taskId:f.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:m}})}catch{p.push(f.id)}}if(p.length>0||h.length>0)throw new g("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:u,auditFailures:p,revocationFailures:h,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:u}})}function im(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 qP(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 UP(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function Ni(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var Di=Symbol.for("yaml.alias"),_i=Symbol.for("yaml.document"),nt=Symbol.for("yaml.map"),yc=Symbol.for("yaml.pair"),Le=Symbol.for("yaml.scalar"),Dt=Symbol.for("yaml.seq"),ve=Symbol.for("yaml.node.type"),Me=e=>!!e&&typeof e=="object"&&e[ve]===Di,kt=e=>!!e&&typeof e=="object"&&e[ve]===_i,rt=e=>!!e&&typeof e=="object"&&e[ve]===nt,M=e=>!!e&&typeof e=="object"&&e[ve]===yc,x=e=>!!e&&typeof e=="object"&&e[ve]===Le,st=e=>!!e&&typeof e=="object"&&e[ve]===Dt;function W(e){if(e&&typeof e=="object")switch(e[ve]){case nt:case Dt:return!0}return!1}function U(e){if(e&&typeof e=="object")switch(e[ve]){case Di:case nt:case Le:case Dt:return!0}return!1}var xi=e=>(x(e)||W(e))&&!!e.anchor;var Ne=Symbol("break visit"),om=Symbol("skip children"),Tt=Symbol("remove node");function Je(e,t){let n=am(t);kt(e)?cr(null,e.contents,n,Object.freeze([e]))===Tt&&(e.contents=null):cr(null,e,n,Object.freeze([]))}Je.BREAK=Ne;Je.SKIP=om;Je.REMOVE=Tt;function cr(e,t,n,r){let s=lm(e,t,n,r);if(U(s)||M(s))return cm(e,r,s),cr(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=cr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ne)return Ne;o===Tt&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=cr("key",t.key,n,r);if(i===Ne)return Ne;i===Tt&&(t.key=null);let o=cr("value",t.value,n,r);if(o===Ne)return Ne;o===Tt&&(t.value=null)}}return s}async function Fi(e,t){let n=am(t);kt(e)?await ur(null,e.contents,n,Object.freeze([e]))===Tt&&(e.contents=null):await ur(null,e,n,Object.freeze([]))}Fi.BREAK=Ne;Fi.SKIP=om;Fi.REMOVE=Tt;async function ur(e,t,n,r){let s=await lm(e,t,n,r);if(U(s)||M(s))return cm(e,r,s),ur(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 ur(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ne)return Ne;o===Tt&&(t.items.splice(i,1),i-=1)}}}else if(M(t)){r=Object.freeze(r.concat(t));let i=await ur("key",t.key,n,r);if(i===Ne)return Ne;i===Tt&&(t.key=null);let o=await ur("value",t.value,n,r);if(o===Ne)return Ne;o===Tt&&(t.value=null)}}return s}function am(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 lm(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(rt(t))return n.Map?.(e,t,r);if(st(t))return n.Seq?.(e,t,r);if(M(t))return n.Pair?.(e,t,r);if(x(t))return n.Scalar?.(e,t,r);if(Me(t))return n.Alias?.(e,t,r)}function cm(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(kt(r))r.contents=n;else{let s=Me(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var BP={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},WP=e=>e.replace(/[!,[\]{}]/g,t=>BP[t]),bt=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+WP(t.substring(r.length));return t[0]==="!"?t:`!<${t}>`}toString(t){let n=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],r=Object.entries(this.tags),s;if(t&&r.length>0&&U(t.contents)){let i={};Je(t.contents,(o,a)=>{U(a)&&a.tag&&(i[a.tag]=!0)}),s=Object.keys(i)}else s=[];for(let[i,o]of r)i==="!!"&&o==="tag:yaml.org,2002:"||(!t||s.some(a=>a.startsWith(o)))&&n.push(`%TAG ${i} ${o}`);return n.join(`
79
+ `)}};bt.defaultYaml={explicit:!1,version:"1.2"};bt.defaultTags={"!!":"tag:yaml.org,2002:"};function Li(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 wc(e){let t=new Set;return Je(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function kc(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function um(e,t){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=wc(e));let o=kc(t,s);return s.add(o),o},setAnchors:()=>{for(let i of n){let o=r.get(i);if(typeof o=="object"&&o.anchor&&(x(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 en(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=en(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=en(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=en(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=en(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||!xi(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 tn=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(!kt(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"?en(i,{"":a},"",a):a}};var _t=class extends tn{constructor(t){super(Di),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=[],Je(t,{Node:(i,o)=>{(Me(o)||xi(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=Mi(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(Li(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 Mi(e,t,n){if(Me(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=Mi(e,s,n);i>r&&(r=i)}return r}else if(M(t)){let r=Mi(e,t.key,n),s=Mi(e,t.value,n);return Math.max(r,s)}return 1}var ji=e=>!e||typeof e!="function"&&typeof e!="object",O=class extends tn{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)}};O.BLOCK_FOLDED="BLOCK_FOLDED";O.BLOCK_LITERAL="BLOCK_LITERAL";O.PLAIN="PLAIN";O.QUOTE_DOUBLE="QUOTE_DOUBLE";O.QUOTE_SINGLE="QUOTE_SINGLE";var VP="tag:yaml.org,2002:";function KP(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 xt(e,t,n){if(kt(e)&&(e=e.contents),U(e))return e;if(M(e)){let u=n.schema[nt].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 _t(l.anchor);l={anchor:null,node:null},a.set(e,l)}t?.startsWith("!!")&&(t=VP+t.slice(2));let c=KP(e,t,o.tags);if(!c){if(e&&typeof e.toJSON=="function"&&(e=e.toJSON()),!e||typeof e!="object"){let u=new O(e);return l&&(l.node=u),u}c=e instanceof Map?o[nt]:Symbol.iterator in Object(e)?o[Dt]:o[nt]}i&&(i(c),delete n.onTagObj);let d=c?.createNode?c.createNode(n.schema,e,n):typeof c?.nodeClass?.from=="function"?c.nodeClass.from(n.schema,e,n):new O(e);return t?d.tag=t:c.default||(d.tag=c.tag),l&&(l.node=d),d}function ls(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 xt(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 pr=e=>e==null||typeof e=="object"&&!!e[Symbol.iterator]().next().done,dr=class extends tn{constructor(t,n){super(t),Object.defineProperty(this,"schema",{value:n,configurable:!0,enumerable:!1,writable:!0})}clone(t){let n=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return t&&(n.schema=t),n.items=n.items.map(r=>U(r)||M(r)?r.clone(t):r),this.range&&(n.range=this.range.slice()),n}addIn(t,n){if(pr(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,ls(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&&x(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&&x(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,ls(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};var dm=e=>e.replace(/^(?!$)(?: $)?/gm,"#");function Xe(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var Rt=(e,t,n)=>e.endsWith(`
80
+ `)?Xe(n,t):n.includes(`
81
81
  `)?`
82
- `+Je(n,t):(e.endsWith(" ")?"":" ")+n;var gc="flow",qi="block",cs="quoted";function us(e,t,n="flow",{indentAtStart:r,lineWidth:s=80,minContentWidth:i=20,onFold:o,onOverflow:a}={}){if(!s||s<0)return e;s<i&&(i=0);let l=Math.max(1+i,1+s-t.length);if(e.length<=l)return e;let c=[],d={},u=s-t.length;typeof r=="number"&&(r>s-Math.max(2,i)?c.push(0):u=s-r);let p,h,f=!1,m=-1,y=-1,T=-1;n===qi&&(m=am(e,m,t.length),m!==-1&&(u=m+l));for(let b;b=e[m+=1];){if(n===cs&&b==="\\"){switch(y=m,e[m+1]){case"x":m+=3;break;case"u":m+=5;break;case"U":m+=9;break;default:m+=1}T=m}if(b===`
83
- `)n===qi&&(m=am(e,m,t.length)),u=m+t.length+l,p=void 0;else{if(b===" "&&h&&h!==" "&&h!==`
82
+ `+Xe(n,t):(e.endsWith(" ")?"":" ")+n;var Tc="flow",qi="block",cs="quoted";function us(e,t,n="flow",{indentAtStart:r,lineWidth:s=80,minContentWidth:i=20,onFold:o,onOverflow:a}={}){if(!s||s<0)return e;s<i&&(i=0);let l=Math.max(1+i,1+s-t.length);if(e.length<=l)return e;let c=[],d={},u=s-t.length;typeof r=="number"&&(r>s-Math.max(2,i)?c.push(0):u=s-r);let p,h,f=!1,m=-1,y=-1,T=-1;n===qi&&(m=pm(e,m,t.length),m!==-1&&(u=m+l));for(let b;b=e[m+=1];){if(n===cs&&b==="\\"){switch(y=m,e[m+1]){case"x":m+=3;break;case"u":m+=5;break;case"U":m+=9;break;default:m+=1}T=m}if(b===`
83
+ `)n===qi&&(m=pm(e,m,t.length)),u=m+t.length+l,p=void 0;else{if(b===" "&&h&&h!==" "&&h!==`
84
84
  `&&h!==" "){let $=e[m+1];$&&$!==" "&&$!==`
85
85
  `&&$!==" "&&(p=m)}if(m>=u)if(p)c.push(p),u=p+l,p=void 0;else if(n===cs){for(;h===" "||h===" ";)h=b,b=e[m+=1],f=!0;let $=m>T+1?m-2:y-1;if(d[$])return e;c.push($),d[$]=!0,u=$+l,p=void 0}else f=!0}h=b}if(f&&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],N=c[b+1]||e.length;$===0?R=`
86
86
  ${t}${e.slice(0,N)}`:(n===cs&&d[$]&&(R+=`${e[$]}\\`),R+=`
87
- ${t}${e.slice($+1,N)}`)}return R}function am(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 Ui=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),Wi=e=>/^(%|---|\.\.\.)/m.test(e);function MP(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,N)}`)}return R}function pm(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 Bi=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),Wi=e=>/^(%|---|\.\.\.)/m.test(e);function GP(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 ds(e,t){let n=JSON.stringify(e);if(t.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=t,s=t.options.doubleQuotedMinMultiLineLength,i=t.indent||(Wi(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:us(o,i,cs,Ui(t,!1))}function yc(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:us(o,i,cs,Bi(t,!1))}function bc(e,t){if(t.options.singleQuote===!1||t.implicitKey&&e.includes(`
93
93
  `)||/[ \t]\n|\n[ \t]/.test(e))return ds(e,t);let n=t.indent||(Wi(e)?" ":""),r="'"+e.replace(/'/g,"''").replace(/\n+/g,`$&
94
- ${n}`)+"'";return t.implicitKey?r:us(r,n,gc,Ui(t,!1))}function fr(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=ds;else{let s=e.includes('"'),i=e.includes("'");s&&!i?r=yc:i&&!s?r=ds:r=n?yc:ds}return r(e,t)}var wc;try{wc=new RegExp(`(^|(?<!
94
+ ${n}`)+"'";return t.implicitKey?r:us(r,n,Tc,Bi(t,!1))}function fr(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=ds;else{let s=e.includes('"'),i=e.includes("'");s&&!i?r=bc:i&&!s?r=ds:r=n?bc:ds}return r(e,t)}var Rc;try{Rc=new RegExp(`(^|(?<!
95
95
  ))
96
96
  +(?!
97
- |$)`,"g")}catch{wc=/\n+(?!\n|$)/g}function Bi({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 fr(n,r);let c=r.indent||(r.forceBlockIndent||Wi(n)?" ":""),d=o==="literal"?!0:o==="folded"||t===O.BLOCK_FOLDED?!1:t===O.BLOCK_LITERAL?!0:!MP(n,l,c.length);if(!n)return d?`|
97
+ |$)`,"g")}catch{Rc=/\n+(?!\n|$)/g}function Ui({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 fr(n,r);let c=r.indent||(r.forceBlockIndent||Wi(n)?" ":""),d=o==="literal"?!0:o==="folded"||t===O.BLOCK_FOLDED?!1:t===O.BLOCK_LITERAL?!0:!GP(n,l,c.length);if(!n)return d?`|
98
98
  `:`>
99
99
  `;let u,p;for(p=n.length;p>0;--p){let N=n[p-1];if(N!==`
100
100
  `&&N!==" "&&N!==" ")break}let h=n.substring(p),f=h.indexOf(`
101
101
  `);f===-1?u="-":n===h||f!==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(wc,`$&${c}`));let m=!1,y,T=-1;for(y=0;y<n.length;++y){let N=n[y];if(N===" ")m=!0;else if(N===`
102
+ `&&(h=h.slice(0,-1)),h=h.replace(Rc,`$&${c}`));let m=!1,y,T=-1;for(y=0;y<n.length;++y){let N=n[y];if(N===" ")m=!0;else if(N===`
103
103
  `)T=y;else break}let R=n.substring(0,T<y?T+1:y);R&&(n=n.substring(R.length),R=R.replace(/\n+/g,`$&${c}`));let $=(m?c?"2":"1":"")+u;if(e&&($+=" "+a(e.replace(/ ?[\r\n]+/g," ")),s&&s()),!d){let N=n.replace(/\n+/g,`
104
- $&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),D=!1,_=Ui(r,!0);o!=="folded"&&t!==O.BLOCK_FOLDED&&(_.onOverflow=()=>{D=!0});let A=us(`${R}${N}${h}`,c,qi,_);if(!D)return`>${$}
104
+ $&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),D=!1,_=Bi(r,!0);o!=="folded"&&t!==O.BLOCK_FOLDED&&(_.onOverflow=()=>{D=!0});let A=us(`${R}${N}${h}`,c,qi,_);if(!D)return`>${$}
105
105
  ${c}${A}`}return n=n.replace(/\n+/g,`$&${c}`),`|${$}
106
- ${c}${R}${n}${h}`}function jP(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 HP(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 fr(i,t);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(i))return a||d||!i.includes(`
108
- `)?fr(i,t):Bi(e,t,n,r);if(!a&&!d&&s!==O.PLAIN&&i.includes(`
109
- `))return Bi(e,t,n,r);if(Wi(i)){if(l==="")return t.forceBlockIndent=!0,Bi(e,t,n,r);if(a&&l===c)return fr(i,t)}let u=i.replace(/\n+/g,`$&
110
- ${l}`);if(o){let p=m=>m.default&&m.tag!=="tag:yaml.org,2002:str"&&m.test?.test(u),{compat:h,tags:f}=t.doc.schema;if(f.some(p)||h?.some(p))return fr(i,t)}return a?u:us(u,l,gc,Ui(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!==O.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(o.value)&&(a=O.QUOTE_DOUBLE);let l=d=>{switch(d){case O.BLOCK_FOLDED:case O.BLOCK_LITERAL:return s||i?fr(o.value,t):Bi(o,t,n,r);case O.QUOTE_DOUBLE:return ds(o.value,t);case O.QUOTE_SINGLE:return yc(o.value,t);case O.PLAIN:return jP(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 Vi(e,t){let n=Object.assign({blockQuote:!0,commentString:om,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 qP(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(x(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 BP(e,t,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(x(e)||W(e))&&e.anchor;i&&Li(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=q(e)?e:t.doc.createNode(e,{onTagObj:l=>s=l});s??(s=qP(t.doc.schema.tags,i));let o=BP(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):x(i)?Cn(i,t,n,r):i.toString(t,n,r);return o?x(i)||a[0]==="{"||a[0]==="["?`${o} ${a}`:`${o}
111
- ${t.indent}${a}`:a}function lm({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=q(e)&&e.comment||null;if(u){if(p)throw new Error("With simple keys, key nodes cannot have comments");if(W(e)||!q(e)&&typeof e=="object"){let _="With simple keys, collection cannot be used as a key value";throw new Error(_)}}let h=!u&&(!e||p&&t==null&&!n.inFlow||W(e)||(x(e)?e.type===O.BLOCK_FOLDED||e.type===O.BLOCK_LITERAL:typeof e=="object"));n=Object.assign({},n,{allNullValues:!1,implicitKey:!h&&(u||!i),indent:a+l});let f=!1,m=!1,y=xt(e,n,()=>f=!0,()=>m=!0);if(!h&&!n.inFlow&&y.length>1024){if(u)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");h=!0}if(n.inFlow){if(i||t==null)return f&&r&&r(),y===""?"?":h?`? ${y}`:y}else if(i&&!u||t==null&&h)return y=`? ${y}`,p&&!f?y+=bt(y,n.indent,c(p)):m&&s&&s(),y;f&&(p=null),h?(p&&(y+=bt(y,n.indent,c(p))),y=`? ${y}
112
- ${a}:`):(y=`${y}:`,p&&(y+=bt(y,n.indent,c(p))));let T,R,b;q(t)?(T=!!t.spaceBefore,R=t.commentBefore,b=t.comment):(T=!1,R=null,b=null,t&&typeof t=="object"&&(t=o.createNode(t))),n.implicitKey=!1,!h&&!p&&x(t)&&(n.indentAtStart=y.length+1),m=!1,!d&&l.length>=2&&!n.inFlow&&!h&&rt(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let $=!1,N=xt(t,n,()=>$=!0,()=>m=!0),D=" ";if(p||T||R){if(D=T?`
108
+ `)?fr(i,t):Ui(e,t,n,r);if(!a&&!d&&s!==O.PLAIN&&i.includes(`
109
+ `))return Ui(e,t,n,r);if(Wi(i)){if(l==="")return t.forceBlockIndent=!0,Ui(e,t,n,r);if(a&&l===c)return fr(i,t)}let u=i.replace(/\n+/g,`$&
110
+ ${l}`);if(o){let p=m=>m.default&&m.tag!=="tag:yaml.org,2002:str"&&m.test?.test(u),{compat:h,tags:f}=t.doc.schema;if(f.some(p)||h?.some(p))return fr(i,t)}return a?u:us(u,l,Tc,Bi(t,!1))}function An(e,t,n,r){let{implicitKey:s,inFlow:i}=t,o=typeof e.value=="string"?e:Object.assign({},e,{value:String(e.value)}),{type:a}=e;a!==O.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(o.value)&&(a=O.QUOTE_DOUBLE);let l=d=>{switch(d){case O.BLOCK_FOLDED:case O.BLOCK_LITERAL:return s||i?fr(o.value,t):Ui(o,t,n,r);case O.QUOTE_DOUBLE:return ds(o.value,t);case O.QUOTE_SINGLE:return bc(o.value,t);case O.PLAIN:return HP(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 Vi(e,t){let n=Object.assign({blockQuote:!0,commentString:dm,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 YP(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(x(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 zP(e,t,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(x(e)||W(e))&&e.anchor;i&&Li(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 Ft(e,t,n,r){if(M(e))return e.toString(t,n,r);if(Me(e)){if(t.doc.directives)return e.toString(t);if(t.resolvedAliases?.has(e))throw new TypeError("Cannot stringify circular structure without alias nodes");t.resolvedAliases?t.resolvedAliases.add(e):t.resolvedAliases=new Set([e]),e=e.resolve(t.doc)}let s,i=U(e)?e:t.doc.createNode(e,{onTagObj:l=>s=l});s??(s=YP(t.doc.schema.tags,i));let o=zP(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):x(i)?An(i,t,n,r):i.toString(t,n,r);return o?x(i)||a[0]==="{"||a[0]==="["?`${o} ${a}`:`${o}
111
+ ${t.indent}${a}`:a}function fm({key:e,value:t},n,r,s){let{allNullValues:i,doc:o,indent:a,indentStep:l,options:{commentString:c,indentSeq:d,simpleKeys:u}}=n,p=U(e)&&e.comment||null;if(u){if(p)throw new Error("With simple keys, key nodes cannot have comments");if(W(e)||!U(e)&&typeof e=="object"){let _="With simple keys, collection cannot be used as a key value";throw new Error(_)}}let h=!u&&(!e||p&&t==null&&!n.inFlow||W(e)||(x(e)?e.type===O.BLOCK_FOLDED||e.type===O.BLOCK_LITERAL:typeof e=="object"));n=Object.assign({},n,{allNullValues:!1,implicitKey:!h&&(u||!i),indent:a+l});let f=!1,m=!1,y=Ft(e,n,()=>f=!0,()=>m=!0);if(!h&&!n.inFlow&&y.length>1024){if(u)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");h=!0}if(n.inFlow){if(i||t==null)return f&&r&&r(),y===""?"?":h?`? ${y}`:y}else if(i&&!u||t==null&&h)return y=`? ${y}`,p&&!f?y+=Rt(y,n.indent,c(p)):m&&s&&s(),y;f&&(p=null),h?(p&&(y+=Rt(y,n.indent,c(p))),y=`? ${y}
112
+ ${a}:`):(y=`${y}:`,p&&(y+=Rt(y,n.indent,c(p))));let T,R,b;U(t)?(T=!!t.spaceBefore,R=t.commentBefore,b=t.comment):(T=!1,R=null,b=null,t&&typeof t=="object"&&(t=o.createNode(t))),n.implicitKey=!1,!h&&!p&&x(t)&&(n.indentAtStart=y.length+1),m=!1,!d&&l.length>=2&&!n.inFlow&&!h&&st(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let $=!1,N=Ft(t,n,()=>$=!0,()=>m=!0),D=" ";if(p||T||R){if(D=T?`
113
113
  `:"",R){let _=c(R);D+=`
114
- ${Je(_,n.indent)}`}N===""&&!n.inFlow?D===`
114
+ ${Xe(_,n.indent)}`}N===""&&!n.inFlow?D===`
115
115
  `&&b&&(D=`
116
116
 
117
117
  `):D+=`
118
118
  ${n.indent}`}else if(!h&&W(t)){let _=N[0],A=N.indexOf(`
119
119
  `),w=A!==-1,Se=n.inFlow??t.flow??t.items.length===0;if(w||!Se){let ye=!1;if(w&&(_==="&"||_==="!")){let z=N.indexOf(" ");_==="&"&&z!==-1&&z<A&&N[z+1]==="!"&&(z=N.indexOf(" ",z+1)),(z===-1||A<z)&&(ye=!0)}ye||(D=`
120
120
  ${n.indent}`)}}else(N===""||N[0]===`
121
- `)&&(D="");return y+=D+N,n.inFlow?$&&r&&r():b&&!$?y+=bt(y,n.indent,c(b)):m&&s&&s(),y}function kc(e,t){(e==="debug"||e==="warn")&&console.warn(t)}var Ki="<<",st={identify:e=>e===Ki||typeof e=="symbol"&&e.description===Ki,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new O(Symbol(Ki)),{addToJSMap:bc}),stringify:()=>Ki},cm=(e,t)=>(st.identify(t)||x(t)&&(!t.type||t.type===O.PLAIN)&&st.identify(t.value))&&e?.doc.schema.tags.some(n=>n.tag===st.tag&&n.default);function bc(e,t,n){let r=um(e,n);if(rt(r))for(let s of r.items)Tc(e,t,s);else if(Array.isArray(r))for(let s of r)Tc(e,t,s);else Tc(e,t,r)}function Tc(e,t,n){let r=um(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 um(e,t){return e&&Le(t)?t.resolve(e.doc,e):t}function Gi(e,t,{key:n,value:r}){if(q(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(cm(e,n))bc(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=UP(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 UP(e,t,n){if(t===null)return"";if(typeof t!="object")return String(t);if(q(e)&&n?.doc){let r=Vi(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)+'..."'),kc(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 mr(e,t,n){let r=_t(e,void 0,n),s=_t(t,void 0,n);return new ee(r,s)}var ee=class e{constructor(t,n=null){Object.defineProperty(this,ve,{value:fc}),this.key=t,this.value=n}clone(t){let{key:n,value:r}=this;return q(n)&&(n=n.clone(t)),q(r)&&(r=r.clone(t)),new e(n,r)}toJSON(t,n){let r=n?.mapAsMap?new Map:{};return Gi(n,r,this)}toString(t,n,r){return t?.doc?lm(this,t,n,r):JSON.stringify(this)}};function Yi(e,t,n){return(t.inFlow??e.flow?VP:WP)(e,t,n)}function WP({comment:e,items:t},n,{blockItemPrefix:r,flowChars:s,itemIndent:i,onChompKeep:o,onComment:a}){let{indent:l,options:{commentString:c}}=n,d=Object.assign({},n,{indent:i,type:null}),u=!1,p=[];for(let f=0;f<t.length;++f){let m=t[f],y=null;if(q(m))!u&&m.spaceBefore&&p.push(""),Hi(n,p,m.commentBefore,u),m.comment&&(y=m.comment);else if(M(m)){let R=q(m.key)?m.key:null;R&&(!u&&R.spaceBefore&&p.push(""),Hi(n,p,R.commentBefore,u))}u=!1;let T=xt(m,d,()=>y=null,()=>u=!0);y&&(T+=bt(T,i,c(y))),u&&y&&(u=!1),p.push(r+T)}let h;if(p.length===0)h=s.start+s.end;else{h=p[0];for(let f=1;f<p.length;++f){let m=p[f];h+=m?`
121
+ `)&&(D="");return y+=D+N,n.inFlow?$&&r&&r():b&&!$?y+=Rt(y,n.indent,c(b)):m&&s&&s(),y}function Pc(e,t){(e==="debug"||e==="warn")&&console.warn(t)}var Ki="<<",it={identify:e=>e===Ki||typeof e=="symbol"&&e.description===Ki,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new O(Symbol(Ki)),{addToJSMap:Ic}),stringify:()=>Ki},mm=(e,t)=>(it.identify(t)||x(t)&&(!t.type||t.type===O.PLAIN)&&it.identify(t.value))&&e?.doc.schema.tags.some(n=>n.tag===it.tag&&n.default);function Ic(e,t,n){let r=hm(e,n);if(st(r))for(let s of r.items)Sc(e,t,s);else if(Array.isArray(r))for(let s of r)Sc(e,t,s);else Sc(e,t,r)}function Sc(e,t,n){let r=hm(e,n);if(!rt(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 hm(e,t){return e&&Me(t)?t.resolve(e.doc,e):t}function Gi(e,t,{key:n,value:r}){if(U(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(mm(e,n))Ic(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=JP(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 JP(e,t,n){if(t===null)return"";if(typeof t!="object")return String(t);if(U(e)&&n?.doc){let r=Vi(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)+'..."'),Pc(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 mr(e,t,n){let r=xt(e,void 0,n),s=xt(t,void 0,n);return new ee(r,s)}var ee=class e{constructor(t,n=null){Object.defineProperty(this,ve,{value:yc}),this.key=t,this.value=n}clone(t){let{key:n,value:r}=this;return U(n)&&(n=n.clone(t)),U(r)&&(r=r.clone(t)),new e(n,r)}toJSON(t,n){let r=n?.mapAsMap?new Map:{};return Gi(n,r,this)}toString(t,n,r){return t?.doc?fm(this,t,n,r):JSON.stringify(this)}};function Yi(e,t,n){return(t.inFlow??e.flow?QP:XP)(e,t,n)}function XP({comment:e,items:t},n,{blockItemPrefix:r,flowChars:s,itemIndent:i,onChompKeep:o,onComment:a}){let{indent:l,options:{commentString:c}}=n,d=Object.assign({},n,{indent:i,type:null}),u=!1,p=[];for(let f=0;f<t.length;++f){let m=t[f],y=null;if(U(m))!u&&m.spaceBefore&&p.push(""),Hi(n,p,m.commentBefore,u),m.comment&&(y=m.comment);else if(M(m)){let R=U(m.key)?m.key:null;R&&(!u&&R.spaceBefore&&p.push(""),Hi(n,p,R.commentBefore,u))}u=!1;let T=Ft(m,d,()=>y=null,()=>u=!0);y&&(T+=Rt(T,i,c(y))),u&&y&&(u=!1),p.push(r+T)}let h;if(p.length===0)h=s.start+s.end;else{h=p[0];for(let f=1;f<p.length;++f){let m=p[f];h+=m?`
122
122
  ${l}${m}`:`
123
123
  `}}return e?(h+=`
124
- `+Je(c(e),l),a&&a()):u&&o&&o(),h}function VP({items:e},t,{flowChars:n,itemIndent:r}){let{indent:s,indentStep:i,flowCollectionPadding:o,options:{commentString:a}}=t;r+=i;let l=Object.assign({},t,{indent:r,inFlow:!0,type:null}),c=!1,d=0,u=[];for(let f=0;f<e.length;++f){let m=e[f],y=null;if(q(m))m.spaceBefore&&u.push(""),Hi(t,u,m.commentBefore,!1),m.comment&&(y=m.comment);else if(M(m)){let R=q(m.key)?m.key:null;R&&(R.spaceBefore&&u.push(""),Hi(t,u,R.commentBefore,!1),R.comment&&(c=!0));let b=q(m.value)?m.value:null;b?(b.comment&&(y=b.comment),b.commentBefore&&(c=!0)):m.value==null&&R?.comment&&(y=R.comment)}y&&(c=!0);let T=xt(m,l,()=>y=null);c||(c=u.length>d||T.includes(`
125
- `)),f<e.length-1?T+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=u.reduce((R,b)=>R+b.length+2,2)+(T.length+2)>t.options.lineWidth)),c&&(T+=",")),y&&(T+=bt(T,r,a(y))),u.push(T),d=u.length}let{start:p,end:h}=n;if(u.length===0)return p+h;if(!c){let f=u.reduce((m,y)=>m+y.length+2,2);c=t.options.lineWidth>0&&f>t.options.lineWidth}if(c){let f=p;for(let m of u)f+=m?`
124
+ `+Xe(c(e),l),a&&a()):u&&o&&o(),h}function QP({items:e},t,{flowChars:n,itemIndent:r}){let{indent:s,indentStep:i,flowCollectionPadding:o,options:{commentString:a}}=t;r+=i;let l=Object.assign({},t,{indent:r,inFlow:!0,type:null}),c=!1,d=0,u=[];for(let f=0;f<e.length;++f){let m=e[f],y=null;if(U(m))m.spaceBefore&&u.push(""),Hi(t,u,m.commentBefore,!1),m.comment&&(y=m.comment);else if(M(m)){let R=U(m.key)?m.key:null;R&&(R.spaceBefore&&u.push(""),Hi(t,u,R.commentBefore,!1),R.comment&&(c=!0));let b=U(m.value)?m.value:null;b?(b.comment&&(y=b.comment),b.commentBefore&&(c=!0)):m.value==null&&R?.comment&&(y=R.comment)}y&&(c=!0);let T=Ft(m,l,()=>y=null);c||(c=u.length>d||T.includes(`
125
+ `)),f<e.length-1?T+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=u.reduce((R,b)=>R+b.length+2,2)+(T.length+2)>t.options.lineWidth)),c&&(T+=",")),y&&(T+=Rt(T,r,a(y))),u.push(T),d=u.length}let{start:p,end:h}=n;if(u.length===0)return p+h;if(!c){let f=u.reduce((m,y)=>m+y.length+2,2);c=t.options.lineWidth>0&&f>t.options.lineWidth}if(c){let f=p;for(let m of u)f+=m?`
126
126
  ${i}${s}${m}`:`
127
127
  `;return`${f}
128
- ${s}${h}`}else return`${p}${o}${u.join(" ")}${o}${h}`}function Hi({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 nn(e,t){let n=x(t)?t.value:t;for(let r of e)if(M(r)&&(r.key===t||r.key===n||x(r.key)&&r.key.value===n))return r}var ne=class extends dr{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(mr(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 ee(t,t?.value):r=new ee(t.key,t.value);let s=nn(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);x(s.value)&&ji(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=nn(this.items,t);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(t,n){let s=nn(this.items,t)?.value;return(!n&&x(s)?s.value:s)??void 0}has(t){return!!nn(this.items,t)}set(t,n){this.add(new ee(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)Gi(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})),Yi(this,t,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:t.indent||"",onChompKeep:r,onComment:n})}};var it={collection:"map",default:!0,nodeClass:ne,tag:"tag:yaml.org,2002:map",resolve(e,t){return nt(e)||t("Expected a mapping for this tag"),e},createNode:(e,t,n)=>ne.from(e,t,n)};var be=class extends dr{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=zi(t);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(t,n){let r=zi(t);if(typeof r!="number")return;let s=this.items[r];return!n&&x(s)?s.value:s}has(t){let n=zi(t);return typeof n=="number"&&n<this.items.length}set(t,n){let r=zi(t);if(typeof r!="number")throw new Error(`Expected a valid index, not ${t}.`);let s=this.items[r];x(s)&&ji(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?Yi(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 zi(e){let t=x(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 rn={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 O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new O(null),stringify:({source:e},t)=>typeof e=="string"&&An.test.test(e)?e:t.options.nullStr};var ps={identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:e=>new O(e[0]==="t"||e[0]==="T"),stringify({source:e,value:t},n){if(e&&ps.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 Ji={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:e=>e.slice(-3).toLowerCase()==="nan"?NaN:e[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:Re},Xi={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)}},Qi={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(e){let t=new O(parseFloat(e)),n=e.indexOf(".");return n!==-1&&e[e.length-1]==="0"&&(t.minFractionDigits=e.length-n-1),t},stringify:Re};var Zi=e=>typeof e=="bigint"||Number.isInteger(e),Rc=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function dm(e,t,n){let{value:r}=e;return Zi(r)&&r>=0?n+r.toString(t):Re(e)}var eo={identify:e=>Zi(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(e,t,n)=>Rc(e,2,8,n),stringify:e=>dm(e,8,"0o")},to={identify:Zi,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>Rc(e,0,10,n),stringify:Re},no={identify:e=>Zi(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>Rc(e,2,16,n),stringify:e=>dm(e,16,"0x")};var pm=[it,ot,rn,An,ps,eo,to,no,Ji,Xi,Qi];function fm(e){return typeof e=="bigint"||Number.isInteger(e)}var ro=({value:e})=>JSON.stringify(e),KP=[{identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify:ro},{identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:ro},{identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:e=>e==="true",stringify:ro},{identify:fm,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})=>fm(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:ro}],GP={default:!0,tag:"",test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}},mm=[it,ot].concat(KP,GP);var fs={identify:e=>e instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(e,t){if(typeof atob=="function"){let n=atob(e.replace(/[\n\r]/g,"")),r=new Uint8Array(n.length);for(let s=0;s<n.length;++s)r[s]=n.charCodeAt(s);return r}else return t("This environment does not support reading binary tags; either Buffer or atob is required"),e},stringify({comment:e,type:t,value:n},r,s,i){if(!n)return"";let o=n,a;if(typeof btoa=="function"){let l="";for(let c=0;c<o.length;++c)l+=String.fromCharCode(o[c]);a=btoa(l)}else throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required");if(t??(t=O.BLOCK_LITERAL),t!==O.QUOTE_DOUBLE){let l=Math.max(r.options.lineWidth-r.indent.length,r.options.minContentWidth),c=Math.ceil(a.length/l),d=new Array(c);for(let u=0,p=0;u<c;++u,p+=l)d[u]=a.substr(p,l);a=d.join(t===O.BLOCK_LITERAL?`
129
- `:" ")}return Cn({comment:e,type:t,value:a},r,s,i)}};function Pc(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 ee(new O(null));if(r.commentBefore&&(s.key.commentBefore=s.key.commentBefore?`${r.commentBefore}
128
+ ${s}${h}`}else return`${p}${o}${u.join(" ")}${o}${h}`}function Hi({indent:e,options:{commentString:t}},n,r,s){if(r&&s&&(r=r.replace(/^\n+/,"")),r){let i=Xe(t(r),e);n.push(i.trimStart())}}function nn(e,t){let n=x(t)?t.value:t;for(let r of e)if(M(r)&&(r.key===t||r.key===n||x(r.key)&&r.key.value===n))return r}var re=class extends dr{static get tagName(){return"tag:yaml.org,2002:map"}constructor(t){super(nt,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(mr(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 ee(t,t?.value):r=new ee(t.key,t.value);let s=nn(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);x(s.value)&&ji(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=nn(this.items,t);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(t,n){let s=nn(this.items,t)?.value;return(!n&&x(s)?s.value:s)??void 0}has(t){return!!nn(this.items,t)}set(t,n){this.add(new ee(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)Gi(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})),Yi(this,t,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:t.indent||"",onChompKeep:r,onComment:n})}};var ot={collection:"map",default:!0,nodeClass:re,tag:"tag:yaml.org,2002:map",resolve(e,t){return rt(e)||t("Expected a mapping for this tag"),e},createNode:(e,t,n)=>re.from(e,t,n)};var be=class extends dr{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(t){super(Dt,t),this.items=[]}add(t){this.items.push(t)}delete(t){let n=zi(t);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(t,n){let r=zi(t);if(typeof r!="number")return;let s=this.items[r];return!n&&x(s)?s.value:s}has(t){let n=zi(t);return typeof n=="number"&&n<this.items.length}set(t,n){let r=zi(t);if(typeof r!="number")throw new Error(`Expected a valid index, not ${t}.`);let s=this.items[r];x(s)&&ji(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?Yi(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(xt(a,void 0,r))}}return i}};function zi(e){let t=x(e)?e.value:e;return t&&typeof t=="string"&&(t=Number(t)),typeof t=="number"&&Number.isInteger(t)&&t>=0?t:null}var at={collection:"seq",default:!0,nodeClass:be,tag:"tag:yaml.org,2002:seq",resolve(e,t){return st(e)||t("Expected a sequence for this tag"),e},createNode:(e,t,n)=>be.from(e,t,n)};var rn={identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify(e,t,n,r){return t=Object.assign({actualString:!0},t),An(e,t,n,r)}};var En={identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new O(null),stringify:({source:e},t)=>typeof e=="string"&&En.test.test(e)?e:t.options.nullStr};var ps={identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:e=>new O(e[0]==="t"||e[0]==="T"),stringify({source:e,value:t},n){if(e&&ps.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 Ji={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:e=>e.slice(-3).toLowerCase()==="nan"?NaN:e[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:Re},Xi={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)}},Qi={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(e){let t=new O(parseFloat(e)),n=e.indexOf(".");return n!==-1&&e[e.length-1]==="0"&&(t.minFractionDigits=e.length-n-1),t},stringify:Re};var Zi=e=>typeof e=="bigint"||Number.isInteger(e),vc=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function gm(e,t,n){let{value:r}=e;return Zi(r)&&r>=0?n+r.toString(t):Re(e)}var eo={identify:e=>Zi(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(e,t,n)=>vc(e,2,8,n),stringify:e=>gm(e,8,"0o")},to={identify:Zi,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>vc(e,0,10,n),stringify:Re},no={identify:e=>Zi(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>vc(e,2,16,n),stringify:e=>gm(e,16,"0x")};var ym=[ot,at,rn,En,ps,eo,to,no,Ji,Xi,Qi];function wm(e){return typeof e=="bigint"||Number.isInteger(e)}var ro=({value:e})=>JSON.stringify(e),ZP=[{identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify:ro},{identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:ro},{identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:e=>e==="true",stringify:ro},{identify:wm,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})=>wm(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:ro}],eS={default:!0,tag:"",test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}},km=[ot,at].concat(ZP,eS);var fs={identify:e=>e instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(e,t){if(typeof atob=="function"){let n=atob(e.replace(/[\n\r]/g,"")),r=new Uint8Array(n.length);for(let s=0;s<n.length;++s)r[s]=n.charCodeAt(s);return r}else return t("This environment does not support reading binary tags; either Buffer or atob is required"),e},stringify({comment:e,type:t,value:n},r,s,i){if(!n)return"";let o=n,a;if(typeof btoa=="function"){let l="";for(let c=0;c<o.length;++c)l+=String.fromCharCode(o[c]);a=btoa(l)}else throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required");if(t??(t=O.BLOCK_LITERAL),t!==O.QUOTE_DOUBLE){let l=Math.max(r.options.lineWidth-r.indent.length,r.options.minContentWidth),c=Math.ceil(a.length/l),d=new Array(c);for(let u=0,p=0;u<c;++u,p+=l)d[u]=a.substr(p,l);a=d.join(t===O.BLOCK_LITERAL?`
129
+ `:" ")}return An({comment:e,type:t,value:a},r,s,i)}};function Cc(e,t){if(st(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!M(r)){if(rt(r)){r.items.length>1&&t("Each pair must have its own sequence indicator");let s=r.items[0]||new ee(new O(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 ee(r)}}else t("Expected a sequence for this tag");return e}function Sc(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(mr(a,l,n))}return s}var ms={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:Pc,createNode:Sc};var hr=class e extends be{constructor(){super(),this.add=ne.prototype.add.bind(this),this.delete=ne.prototype.delete.bind(this),this.get=ne.prototype.get.bind(this),this.has=ne.prototype.has.bind(this),this.set=ne.prototype.set.bind(this),this.tag=e.tag}toJSON(t,n){if(!n)return super.toJSON(t);let r=new Map;n?.onCreate&&n.onCreate(r);for(let s of this.items){let i,o;if(M(s)?(i=le(s.key,"",n),o=le(s.value,i,n)):i=le(s,"",n),r.has(i))throw new Error("Ordered maps must not include duplicate keys");r.set(i,o)}return r}static from(t,n,r){let s=Sc(t,n,r),i=new this;return i.items=s.items,i}};hr.tag="tag:yaml.org,2002:omap";var hs={collection:"seq",identify:e=>e instanceof Map,nodeClass:hr,default:!1,tag:"tag:yaml.org,2002:omap",resolve(e,t){let n=Pc(e,t),r=[];for(let{key:s}of n.items)x(s)&&(r.includes(s.value)?t(`Ordered maps must not include duplicate keys: ${s.value}`):r.push(s.value));return Object.assign(new hr,n)},createNode:(e,t,n)=>hr.from(e,t,n)};function hm({value:e,source:t},n){return t&&(e?Ic:vc).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}var Ic={identify:e=>e===!0,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new O(!0),stringify:hm},vc={identify:e=>e===!1,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new O(!1),stringify:hm};var gm={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},ym={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)}},wm={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(e){let t=new O(parseFloat(e.replace(/_/g,""))),n=e.indexOf(".");if(n!==-1){let r=e.substring(n+1).replace(/_/g,"");r[r.length-1]==="0"&&(t.minFractionDigits=r.length)}return t},stringify:Re};var gs=e=>typeof e=="bigint"||Number.isInteger(e);function so(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 Cc(e,t,n){let{value:r}=e;if(gs(r)){let s=r.toString(t);return r<0?"-"+n+s.substr(1):n+s}return Re(e)}var km={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>so(e,2,2,n),stringify:e=>Cc(e,2,"0b")},Tm={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>so(e,1,8,n),stringify:e=>Cc(e,8,"0")},bm={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>so(e,0,10,n),stringify:Re},Rm={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>so(e,2,16,n),stringify:e=>Cc(e,16,"0x")};var gr=class e extends ne{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 ee(t.key,null):n=new ee(t,null),nn(this.items,n.key)||this.items.push(n)}get(t,n){let r=nn(this.items,t);return!n&&M(r)?x(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=nn(this.items,t);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new ee(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(mr(o,null,r));return i}};gr.tag="tag:yaml.org,2002:set";var ys={collection:"map",identify:e=>e instanceof Set,nodeClass:gr,default:!1,tag:"tag:yaml.org,2002:set",createNode:(e,t,n)=>gr.from(e,t,n),resolve(e,t){if(nt(e)){if(e.hasAllNullValues(!0))return Object.assign(new gr,e);t("Set items must all have null values")}else t("Expected a mapping for this tag");return e}};function Ac(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 Pm(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 io={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})=>Ac(e,n),stringify:Pm},oo={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=>Ac(e,!1),stringify:Pm},yr={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(yr.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=Ac(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 Ec=[it,ot,rn,An,Ic,vc,km,Tm,bm,Rm,gm,ym,wm,fs,st,hs,ms,ys,io,oo,yr];var Sm=new Map([["core",pm],["failsafe",[it,ot,rn]],["json",mm],["yaml11",Ec],["yaml-1.1",Ec]]),Im={binary:fs,bool:ps,float:Qi,floatExp:Xi,floatNaN:Ji,floatTime:oo,int:to,intHex:no,intOct:eo,intTime:io,map:it,merge:st,null:An,omap:hs,pairs:ms,seq:ot,set:ys,timestamp:yr},vm={"tag:yaml.org,2002:binary":fs,"tag:yaml.org,2002:merge":st,"tag:yaml.org,2002:omap":hs,"tag:yaml.org,2002:pairs":ms,"tag:yaml.org,2002:set":ys,"tag:yaml.org,2002:timestamp":yr};function ao(e,t,n){let r=Sm.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(Sm.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"?Im[o]:o;if(!a){let l=JSON.stringify(o),c=Object.keys(Im).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 HP=(e,t)=>e.key<t.key?-1:e.key>t.key?1:0,ws=class e{constructor({compat:t,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(t)?ao(t,"compat"):t?ao(null,t):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?vm:{},this.tags=ao(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,tt,{value:it}),Object.defineProperty(this,Fe,{value:rn}),Object.defineProperty(this,Nt,{value:ot}),this.sortMapEntries=typeof o=="function"?o:o===!0?HP:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function Cm(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=Vi(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(q(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+=bt(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
- `)?(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(`
131
+ ${i.comment}`:r.comment}r=s}e.items[n]=M(r)?r:new ee(r)}}else t("Expected a sequence for this tag");return e}function Ac(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(mr(a,l,n))}return s}var ms={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:Cc,createNode:Ac};var hr=class e extends be{constructor(){super(),this.add=re.prototype.add.bind(this),this.delete=re.prototype.delete.bind(this),this.get=re.prototype.get.bind(this),this.has=re.prototype.has.bind(this),this.set=re.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=Ac(t,n,r),i=new this;return i.items=s.items,i}};hr.tag="tag:yaml.org,2002:omap";var hs={collection:"seq",identify:e=>e instanceof Map,nodeClass:hr,default:!1,tag:"tag:yaml.org,2002:omap",resolve(e,t){let n=Cc(e,t),r=[];for(let{key:s}of n.items)x(s)&&(r.includes(s.value)?t(`Ordered maps must not include duplicate keys: ${s.value}`):r.push(s.value));return Object.assign(new hr,n)},createNode:(e,t,n)=>hr.from(e,t,n)};function Tm({value:e,source:t},n){return t&&(e?Ec:Oc).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}var Ec={identify:e=>e===!0,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new O(!0),stringify:Tm},Oc={identify:e=>e===!1,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new O(!1),stringify:Tm};var bm={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},Rm={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)}},Pm={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(e){let t=new O(parseFloat(e.replace(/_/g,""))),n=e.indexOf(".");if(n!==-1){let r=e.substring(n+1).replace(/_/g,"");r[r.length-1]==="0"&&(t.minFractionDigits=r.length)}return t},stringify:Re};var gs=e=>typeof e=="bigint"||Number.isInteger(e);function so(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 $c(e,t,n){let{value:r}=e;if(gs(r)){let s=r.toString(t);return r<0?"-"+n+s.substr(1):n+s}return Re(e)}var Sm={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>so(e,2,2,n),stringify:e=>$c(e,2,"0b")},Im={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>so(e,1,8,n),stringify:e=>$c(e,8,"0")},vm={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>so(e,0,10,n),stringify:Re},Cm={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>so(e,2,16,n),stringify:e=>$c(e,16,"0x")};var gr=class e extends re{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 ee(t.key,null):n=new ee(t,null),nn(this.items,n.key)||this.items.push(n)}get(t,n){let r=nn(this.items,t);return!n&&M(r)?x(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=nn(this.items,t);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new ee(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(mr(o,null,r));return i}};gr.tag="tag:yaml.org,2002:set";var ys={collection:"map",identify:e=>e instanceof Set,nodeClass:gr,default:!1,tag:"tag:yaml.org,2002:set",createNode:(e,t,n)=>gr.from(e,t,n),resolve(e,t){if(rt(e)){if(e.hasAllNullValues(!0))return Object.assign(new gr,e);t("Set items must all have null values")}else t("Expected a mapping for this tag");return e}};function Nc(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 Am(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 io={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})=>Nc(e,n),stringify:Am},oo={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=>Nc(e,!1),stringify:Am},yr={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(yr.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=Nc(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 Dc=[ot,at,rn,En,Ec,Oc,Sm,Im,vm,Cm,bm,Rm,Pm,fs,it,hs,ms,ys,io,oo,yr];var Em=new Map([["core",ym],["failsafe",[ot,at,rn]],["json",km],["yaml11",Dc],["yaml-1.1",Dc]]),Om={binary:fs,bool:ps,float:Qi,floatExp:Xi,floatNaN:Ji,floatTime:oo,int:to,intHex:no,intOct:eo,intTime:io,map:ot,merge:it,null:En,omap:hs,pairs:ms,seq:at,set:ys,timestamp:yr},$m={"tag:yaml.org,2002:binary":fs,"tag:yaml.org,2002:merge":it,"tag:yaml.org,2002:omap":hs,"tag:yaml.org,2002:pairs":ms,"tag:yaml.org,2002:set":ys,"tag:yaml.org,2002:timestamp":yr};function ao(e,t,n){let r=Em.get(t);if(r&&!e)return n&&!r.includes(it)?r.concat(it):r.slice();let s=r;if(!s)if(Array.isArray(e))s=[];else{let i=Array.from(Em.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(it)),s.reduce((i,o)=>{let a=typeof o=="string"?Om[o]:o;if(!a){let l=JSON.stringify(o),c=Object.keys(Om).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 tS=(e,t)=>e.key<t.key?-1:e.key>t.key?1:0,ws=class e{constructor({compat:t,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(t)?ao(t,"compat"):t?ao(null,t):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?$m:{},this.tags=ao(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,nt,{value:ot}),Object.defineProperty(this,Le,{value:rn}),Object.defineProperty(this,Dt,{value:at}),this.sortMapEntries=typeof o=="function"?o:o===!0?tS:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function Nm(e,t){let n=[],r=t.directives===!0;if(t.directives!==!1&&e.directives){let l=e.directives.toString(e);l?(n.push(l),r=!0):e.directives.docStart&&(r=!0)}r&&n.push("---");let s=Vi(e,t),{commentString:i}=s.options;if(e.commentBefore){n.length!==1&&n.unshift("");let l=i(e.commentBefore);n.unshift(Xe(l,""))}let o=!1,a=null;if(e.contents){if(U(e.contents)){if(e.contents.spaceBefore&&r&&n.push(""),e.contents.commentBefore){let d=i(e.contents.commentBefore);n.push(Xe(d,""))}s.forceBlockIndent=!!e.comment,a=e.contents.comment}let l=a?void 0:()=>o=!0,c=Ft(e.contents,s,()=>a=null,l);a&&(c+=Rt(c,"",i(a))),(c[0]==="|"||c[0]===">")&&n[n.length-1]==="---"?n[n.length-1]=`--- ${c}`:n.push(c)}else n.push(Ft(e.contents,s));if(e.directives?.docEnd)if(e.comment){let l=i(e.comment);l.includes(`
132
+ `)?(n.push("..."),n.push(Xe(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(Xe(i(l),"")))}return n.join(`
133
133
  `)+`
134
- `}var sn=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,ve,{value:_i});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 Tt({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:_i}});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=q(this.contents)?this.contents.clone(t.schema):this.contents,this.range&&(t.range=this.range.slice()),t}add(t){wr(this.contents)&&this.contents.add(t)}addIn(t,n){wr(this.contents)&&this.contents.addIn(t,n)}createAlias(t,n){if(!t.anchor){let r=mc(this);t.anchor=!n||r.has(n)?hc(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,T=n.filter(y).map(String);T.length>0&&(n=n.concat(T)),s=n}else r===void 0&&n&&(r=n,n=void 0);let{aliasDuplicateObjects:i,anchorPrefix:o,flow:a,keepUndefined:l,onTagObj:c,tag:d}=r??{},{onAnchor:u,setAnchors:p,sourceObjects:h}=im(this,o||"a"),f={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:u,onTagObj:c,replacer:s,schema:this.schema,sourceObjects:h},m=_t(t,d,f);return a&&W(m)&&(m.flow=!0),p(),m}createPair(t,n,r={}){let s=this.createNode(t,null,r),i=this.createNode(n,null,r);return new ee(s,i)}delete(t){return wr(this.contents)?this.contents.delete(t):!1}deleteIn(t){return pr(t)?this.contents==null?!1:(this.contents=null,!0):wr(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 pr(t)?!n&&x(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 pr(t)?this.contents!==void 0:W(this.contents)?this.contents.hasIn(t):!1}set(t,n){this.contents==null?this.contents=ls(this.schema,[t],n):wr(this.contents)&&this.contents.set(t,n)}setIn(t,n){pr(t)?this.contents=n:this.contents==null?this.contents=ls(this.schema,Array.from(t),n):wr(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 Tt({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 Tt({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 ws(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"?en(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 Cm(this,t)}};function wr(e){if(W(e))return!0;throw new Error("Expected a YAML collection as document contents")}var ks=class extends Error{constructor(t,n,r,s){super(),this.name=t,this.code=r,this.message=s,this.pos=n}},at=class extends ks{constructor(t,n,r){super("YAMLParseError",t,n,r)}},Ts=class extends ks{constructor(t,n,r){super("YAMLWarning",t,n,r)}},Oc=(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 sn=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,ve,{value:_i});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 bt({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:_i}});return t.commentBefore=this.commentBefore,t.comment=this.comment,t.errors=this.errors.slice(),t.warnings=this.warnings.slice(),t.options=Object.assign({},this.options),this.directives&&(t.directives=this.directives.clone()),t.schema=this.schema.clone(),t.contents=U(this.contents)?this.contents.clone(t.schema):this.contents,this.range&&(t.range=this.range.slice()),t}add(t){wr(this.contents)&&this.contents.add(t)}addIn(t,n){wr(this.contents)&&this.contents.addIn(t,n)}createAlias(t,n){if(!t.anchor){let r=wc(this);t.anchor=!n||r.has(n)?kc(n||"a",r):n}return new _t(t.anchor)}createNode(t,n,r){let s;if(typeof n=="function")t=n.call({"":t},"",t),s=n;else if(Array.isArray(n)){let y=R=>typeof R=="number"||R instanceof String||R instanceof Number,T=n.filter(y).map(String);T.length>0&&(n=n.concat(T)),s=n}else r===void 0&&n&&(r=n,n=void 0);let{aliasDuplicateObjects:i,anchorPrefix:o,flow:a,keepUndefined:l,onTagObj:c,tag:d}=r??{},{onAnchor:u,setAnchors:p,sourceObjects:h}=um(this,o||"a"),f={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:u,onTagObj:c,replacer:s,schema:this.schema,sourceObjects:h},m=xt(t,d,f);return a&&W(m)&&(m.flow=!0),p(),m}createPair(t,n,r={}){let s=this.createNode(t,null,r),i=this.createNode(n,null,r);return new ee(s,i)}delete(t){return wr(this.contents)?this.contents.delete(t):!1}deleteIn(t){return pr(t)?this.contents==null?!1:(this.contents=null,!0):wr(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 pr(t)?!n&&x(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 pr(t)?this.contents!==void 0:W(this.contents)?this.contents.hasIn(t):!1}set(t,n){this.contents==null?this.contents=ls(this.schema,[t],n):wr(this.contents)&&this.contents.set(t,n)}setIn(t,n){pr(t)?this.contents=n:this.contents==null?this.contents=ls(this.schema,Array.from(t),n):wr(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 bt({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 bt({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 ws(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"?en(o,{"":l},"",l):l}toJSON(t,n){return this.toJS({json:!0,jsonArg:t,mapAsMap:!1,onAnchor:n})}toString(t={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in t&&(!Number.isInteger(t.indent)||Number(t.indent)<=0)){let n=JSON.stringify(t.indent);throw new Error(`"indent" option must be a positive integer, not ${n}`)}return Nm(this,t)}};function wr(e){if(W(e))return!0;throw new Error("Expected a YAML collection as document contents")}var ks=class extends Error{constructor(t,n,r,s){super(),this.name=t,this.code=r,this.message=s,this.pos=n}},lt=class extends ks{constructor(t,n,r){super("YAMLParseError",t,n,r)}},Ts=class extends ks{constructor(t,n,r){super("YAMLWarning",t,n,r)}},_c=(e,t)=>n=>{if(n.pos[0]===-1)return;n.linePos=n.pos.map(a=>t.linePos(a));let{line:r,col:s}=n.linePos[0];n.message+=` at line ${r}, column ${s}`;let i=s-1,o=e.substring(t.lineStarts[r-1],t.lineStarts[r]).replace(/[\n\r]+$/,"");if(i>=60&&o.length>80){let a=Math.min(i-39,o.length-79);o="\u2026"+o.substring(a),i-=a-1}if(o.length>80&&(o=o.substring(0,79)+"\u2026"),r>1&&/^ *$/.test(o.substring(0,i))){let a=e.substring(t.lineStarts[r-2],t.lineStarts[r-1]);a.length>80&&(a=a.substring(0,79)+`\u2026
135
135
  `),o=a+o}if(/[^ ]/.test(o)){let a=1,l=n.linePos[1];l?.line===r&&l.col>s&&(a=Math.max(1,Math.min(l.col-s,80-i)));let c=" ".repeat(i)+"^".repeat(a);n.message+=`:
136
136
 
137
137
  ${o}
138
138
  ${c}
139
- `}};function Rt(e,{flow:t,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let l=!1,c=a,d=a,u="",p="",h=!1,f=!1,m=null,y=null,T=null,R=null,b=null,$=null,N=null;for(let A of e)switch(f&&(A.type!=="space"&&A.type!=="newline"&&A.type!=="comma"&&i(A.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),f=!1),m&&(c&&A.type!=="comment"&&A.type!=="newline"&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),m=null),A.type){case"space":!t&&(n!=="doc-start"||r?.type!=="flow-collection")&&A.source.includes(" ")&&(m=A),d=!0;break;case"comment":{d||i(A,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let w=A.source.substring(1)||" ";u?u+=p+w:u=w,p="",c=!1;break}case"newline":c?u?u+=A.source:(!$||n!=="seq-item-ind")&&(l=!0):p+=A.source,c=!0,h=!0,(y||T)&&(R=A),d=!0;break;case"anchor":y&&i(A,"MULTIPLE_ANCHORS","A node can have at most one anchor"),A.source.endsWith(":")&&i(A.offset+A.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),y=A,N??(N=A.offset),c=!1,d=!1,f=!0;break;case"tag":{T&&i(A,"MULTIPLE_TAGS","A node can have at most one tag"),T=A,N??(N=A.offset),c=!1,d=!1,f=!0;break}case n:(y||T)&&i(A,"BAD_PROP_ORDER",`Anchors and tags must be after the ${A.source} indicator`),$&&i(A,"UNEXPECTED_TOKEN",`Unexpected ${A.source} in ${t??"collection"}`),$=A,c=n==="seq-item-ind"||n==="explicit-key-ind",d=!1;break;case"comma":if(t){b&&i(A,"UNEXPECTED_TOKEN",`Unexpected , in ${t}`),b=A,c=!1,d=!1;break}default:i(A,"UNEXPECTED_TOKEN",`Unexpected ${A.type} token`),c=!1,d=!1}let D=e[e.length-1],_=D?D.offset+D.source.length:s;return f&&r&&r.type!=="space"&&r.type!=="newline"&&r.type!=="comma"&&(r.type!=="scalar"||r.source!=="")&&i(r.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),m&&(c&&m.indent<=o||r?.type==="block-map"||r?.type==="block-seq")&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:b,found:$,spaceBefore:l,comment:u,hasNewline:h,anchor:y,tag:T,newlineAfterProp:R,end:_,start:N??_}}function on(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(on(t.key)||on(t.value))return!0}return!1;default:return!0}}function bs(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&on(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function lo(e,t,n){let{uniqueKeys:r}=e.options;if(r===!1)return!1;let s=typeof r=="function"?r:(i,o)=>i===o||x(i)&&x(o)&&i.value===o.value;return t.some(i=>s(i.key,n))}var Am="All mapping items must start at the same column";function Em({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??ne,a=new o(n.schema);n.atRoot&&(n.atRoot=!1);let l=r.offset,c=null;for(let d of r.items){let{start:u,key:p,sep:h,value:f}=d,m=Rt(u,{indicator:"explicit-key-ind",next:p??h?.[0],offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0}),y=!m.found;if(y){if(p&&(p.type==="block-seq"?s(l,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in p&&p.indent!==r.indent&&s(l,"BAD_INDENT",Am)),!m.anchor&&!m.tag&&!h){c=m.end,m.comment&&(a.comment?a.comment+=`
141
- `+m.comment:a.comment=m.comment);continue}(m.newlineAfterProp||on(p))&&s(p??u[u.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else m.found?.indent!==r.indent&&s(l,"BAD_INDENT",Am);n.atKey=!0;let T=m.end,R=p?e(n,p,m,s):t(n,T,u,null,m,s);n.schema.compat&&bs(r.indent,p,s),n.atKey=!1,lo(n,a.items,R)&&s(T,"DUPLICATE_KEY","Map keys must be unique");let b=Rt(h??[],{indicator:"map-value-ind",next:f,offset:R.range[2],onError:s,parentIndent:r.indent,startOnNewline:!p||p.type==="block-scalar"});if(l=b.end,b.found){y&&(f?.type==="block-map"&&!b.hasNewline&&s(l,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),n.options.strict&&m.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 $=f?e(n,f,b,s):t(n,l,h,null,b,s);n.schema.compat&&bs(r.indent,f,s),l=$.range[2];let N=new ee(R,$);n.options.keepSourceTokens&&(N.srcToken=d),a.items.push(N)}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 ee(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 Om({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=Rt(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&&bs(r.indent,u,s),l=h.range[2],a.items.push(h)}return a.range=[r.offset,l,c??l],a}function Pt(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 $c="Block collections are not allowed within flow collections",Nc=e=>e&&(e.type==="block-map"||e.type==="block-seq");function $m({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",l=i?.nodeClass??(o?ne: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 T=r.items[y],{start:R,key:b,sep:$,value:N}=T,D=Rt(R,{flow:a,indicator:"explicit-key-ind",next:b??$?.[0],offset:u,onError:s,parentIndent:r.indent,startOnNewline:!1});if(!D.found){if(!D.anchor&&!D.tag&&!$&&!N){y===0&&D.comma?s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`):y<r.items.length-1&&s(D.start,"UNEXPECTED_TOKEN",`Unexpected empty item in ${a}`),D.comment&&(c.comment?c.comment+=`
139
+ `}};function Pt(e,{flow:t,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let l=!1,c=a,d=a,u="",p="",h=!1,f=!1,m=null,y=null,T=null,R=null,b=null,$=null,N=null;for(let A of e)switch(f&&(A.type!=="space"&&A.type!=="newline"&&A.type!=="comma"&&i(A.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),f=!1),m&&(c&&A.type!=="comment"&&A.type!=="newline"&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),m=null),A.type){case"space":!t&&(n!=="doc-start"||r?.type!=="flow-collection")&&A.source.includes(" ")&&(m=A),d=!0;break;case"comment":{d||i(A,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let w=A.source.substring(1)||" ";u?u+=p+w:u=w,p="",c=!1;break}case"newline":c?u?u+=A.source:(!$||n!=="seq-item-ind")&&(l=!0):p+=A.source,c=!0,h=!0,(y||T)&&(R=A),d=!0;break;case"anchor":y&&i(A,"MULTIPLE_ANCHORS","A node can have at most one anchor"),A.source.endsWith(":")&&i(A.offset+A.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),y=A,N??(N=A.offset),c=!1,d=!1,f=!0;break;case"tag":{T&&i(A,"MULTIPLE_TAGS","A node can have at most one tag"),T=A,N??(N=A.offset),c=!1,d=!1,f=!0;break}case n:(y||T)&&i(A,"BAD_PROP_ORDER",`Anchors and tags must be after the ${A.source} indicator`),$&&i(A,"UNEXPECTED_TOKEN",`Unexpected ${A.source} in ${t??"collection"}`),$=A,c=n==="seq-item-ind"||n==="explicit-key-ind",d=!1;break;case"comma":if(t){b&&i(A,"UNEXPECTED_TOKEN",`Unexpected , in ${t}`),b=A,c=!1,d=!1;break}default:i(A,"UNEXPECTED_TOKEN",`Unexpected ${A.type} token`),c=!1,d=!1}let D=e[e.length-1],_=D?D.offset+D.source.length:s;return f&&r&&r.type!=="space"&&r.type!=="newline"&&r.type!=="comma"&&(r.type!=="scalar"||r.source!=="")&&i(r.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),m&&(c&&m.indent<=o||r?.type==="block-map"||r?.type==="block-seq")&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:b,found:$,spaceBefore:l,comment:u,hasNewline:h,anchor:y,tag:T,newlineAfterProp:R,end:_,start:N??_}}function on(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(on(t.key)||on(t.value))return!0}return!1;default:return!0}}function bs(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&on(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function lo(e,t,n){let{uniqueKeys:r}=e.options;if(r===!1)return!1;let s=typeof r=="function"?r:(i,o)=>i===o||x(i)&&x(o)&&i.value===o.value;return t.some(i=>s(i.key,n))}var Dm="All mapping items must start at the same column";function _m({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??re,a=new o(n.schema);n.atRoot&&(n.atRoot=!1);let l=r.offset,c=null;for(let d of r.items){let{start:u,key:p,sep:h,value:f}=d,m=Pt(u,{indicator:"explicit-key-ind",next:p??h?.[0],offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0}),y=!m.found;if(y){if(p&&(p.type==="block-seq"?s(l,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in p&&p.indent!==r.indent&&s(l,"BAD_INDENT",Dm)),!m.anchor&&!m.tag&&!h){c=m.end,m.comment&&(a.comment?a.comment+=`
141
+ `+m.comment:a.comment=m.comment);continue}(m.newlineAfterProp||on(p))&&s(p??u[u.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else m.found?.indent!==r.indent&&s(l,"BAD_INDENT",Dm);n.atKey=!0;let T=m.end,R=p?e(n,p,m,s):t(n,T,u,null,m,s);n.schema.compat&&bs(r.indent,p,s),n.atKey=!1,lo(n,a.items,R)&&s(T,"DUPLICATE_KEY","Map keys must be unique");let b=Pt(h??[],{indicator:"map-value-ind",next:f,offset:R.range[2],onError:s,parentIndent:r.indent,startOnNewline:!p||p.type==="block-scalar"});if(l=b.end,b.found){y&&(f?.type==="block-map"&&!b.hasNewline&&s(l,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),n.options.strict&&m.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 $=f?e(n,f,b,s):t(n,l,h,null,b,s);n.schema.compat&&bs(r.indent,f,s),l=$.range[2];let N=new ee(R,$);n.options.keepSourceTokens&&(N.srcToken=d),a.items.push(N)}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 ee(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 xm({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=Pt(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&&bs(r.indent,u,s),l=h.range[2],a.items.push(h)}return a.range=[r.offset,l,c??l],a}function St(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 xc="Block collections are not allowed within flow collections",Fc=e=>e&&(e.type==="block-map"||e.type==="block-seq");function Fm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",l=i?.nodeClass??(o?re: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 T=r.items[y],{start:R,key:b,sep:$,value:N}=T,D=Pt(R,{flow:a,indicator:"explicit-key-ind",next:b??$?.[0],offset:u,onError:s,parentIndent:r.indent,startOnNewline:!1});if(!D.found){if(!D.anchor&&!D.tag&&!$&&!N){y===0&&D.comma?s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`):y<r.items.length-1&&s(D.start,"UNEXPECTED_TOKEN",`Unexpected empty item in ${a}`),D.comment&&(c.comment?c.comment+=`
143
143
  `+D.comment:c.comment=D.comment),u=D.end;continue}!o&&n.options.strict&&on(b)&&s(b,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line")}if(y===0)D.comma&&s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`);else if(D.comma||s(D.start,"MISSING_CHAR",`Missing , between ${a} items`),D.comment){let _="";e:for(let A of R)switch(A.type){case"comma":case"space":break;case"comment":_=A.source.substring(1);break e;default:break e}if(_){let A=c.items[c.items.length-1];M(A)&&(A=A.value??A.key),A.comment?A.comment+=`
144
- `+_:A.comment=_,D.comment=D.comment.substring(_.length+1)}}if(!o&&!$&&!D.found){let _=N?e(n,N,D,s):t(n,D.end,$,null,D,s);c.items.push(_),u=_.range[2],Nc(N)&&s(_.range,"BLOCK_IN_FLOW",$c)}else{n.atKey=!0;let _=D.end,A=b?e(n,b,D,s):t(n,_,R,null,D,s);Nc(b)&&s(A.range,"BLOCK_IN_FLOW",$c),n.atKey=!1;let w=Rt($??[],{flow:a,indicator:"map-value-ind",next:N,offset:A.range[2],onError:s,parentIndent:r.indent,startOnNewline:!1});if(w.found){if(!o&&!D.found&&n.options.strict){if($)for(let z of $){if(z===w.found)break;if(z.type==="newline"){s(z,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}D.start<w.found.offset-1024&&s(w.found,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit flow sequence key")}}else N&&("source"in N&&N.source?.[0]===":"?s(N,"MISSING_CHAR",`Missing space after : in ${a}`):s(w.start,"MISSING_CHAR",`Missing , or : between ${a} items`));let Se=N?e(n,N,w,s):w.found?t(n,w.end,$,null,w,s):null;Se?Nc(N)&&s(Se.range,"BLOCK_IN_FLOW",$c):w.comment&&(A.comment?A.comment+=`
145
- `+w.comment:A.comment=w.comment);let ye=new ee(A,Se);if(n.options.keepSourceTokens&&(ye.srcToken=T),o){let z=c;lo(n,z.items,A)&&s(_,"DUPLICATE_KEY","Map keys must be unique"),z.items.push(ye)}else{let z=new ne(n.schema);z.flow=!0,z.items.push(ye);let gn=(Se??A).range;z.range=[A.range[0],gn[1],gn[2]],c.items.push(z)}u=Se?Se.range[2]:w.end}}let p=o?"}":"]",[h,...f]=r.end,m=u;if(h?.source===p)m=h.offset+h.source.length;else{let y=a[0].toUpperCase()+a.substring(1),T=d?`${y} must end with a ${p}`:`${y} in block collection must be sufficiently indented and end with a ${p}`;s(u,d?"MISSING_CHAR":"BAD_INDENT",T),h&&h.source.length!==1&&f.unshift(h)}if(f.length>0){let y=Pt(f,m,n.options.strict,s);y.comment&&(c.comment?c.comment+=`
146
- `+y.comment:c.comment=y.comment),c.range=[r.offset,m,y.offset]}else c.range=[r.offset,m,m];return c}function Dc(e,t,n,r,s,i){let o=n.type==="block-map"?Em(e,t,n,r,i):n.type==="block-seq"?Om(e,t,n,r,i):$m(e,t,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function Nm(e,t,n,r,s){let i=r.tag,o=i?t.directives.tagName(i.source,p=>s(i,"TAG_RESOLVE_FAILED",p)):null;if(n.type==="block-seq"){let{anchor:p,newlineAfterProp:h}=r,f=p&&i?p.offset>i.offset?p:i:p??i;f&&(!h||h.offset<f.offset)&&s(f,"MISSING_CHAR","Missing newline after block sequence props")}let a=n.type==="block-map"?"map":n.type==="block-seq"?"seq":n.start.source==="{"?"map":"seq";if(!i||!o||o==="!"||o===ne.tagName&&a==="map"||o===be.tagName&&a==="seq")return Dc(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),Dc(e,t,n,s,o)}let c=Dc(e,t,n,s,o,l),d=l.resolve?.(c,p=>s(i,"TAG_RESOLVE_FAILED",p),t.options)??c,u=q(d)?d:new O(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=YP(t,e.options.strict,n);if(!s)return{value:"",type:null,comment:"",range:[r,r,r]};let i=s.mode===">"?O.BLOCK_FOLDED:O.BLOCK_LITERAL,o=t.source?zP(t.source):[],a=o.length;for(let m=o.length-1;m>=0;--m){let y=o[m][1];if(y===""||y==="\r")a=m;else break}if(a===0){let m=s.chomp==="+"&&o.length>0?`
144
+ `+_:A.comment=_,D.comment=D.comment.substring(_.length+1)}}if(!o&&!$&&!D.found){let _=N?e(n,N,D,s):t(n,D.end,$,null,D,s);c.items.push(_),u=_.range[2],Fc(N)&&s(_.range,"BLOCK_IN_FLOW",xc)}else{n.atKey=!0;let _=D.end,A=b?e(n,b,D,s):t(n,_,R,null,D,s);Fc(b)&&s(A.range,"BLOCK_IN_FLOW",xc),n.atKey=!1;let w=Pt($??[],{flow:a,indicator:"map-value-ind",next:N,offset:A.range[2],onError:s,parentIndent:r.indent,startOnNewline:!1});if(w.found){if(!o&&!D.found&&n.options.strict){if($)for(let z of $){if(z===w.found)break;if(z.type==="newline"){s(z,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}D.start<w.found.offset-1024&&s(w.found,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit flow sequence key")}}else N&&("source"in N&&N.source?.[0]===":"?s(N,"MISSING_CHAR",`Missing space after : in ${a}`):s(w.start,"MISSING_CHAR",`Missing , or : between ${a} items`));let Se=N?e(n,N,w,s):w.found?t(n,w.end,$,null,w,s):null;Se?Fc(N)&&s(Se.range,"BLOCK_IN_FLOW",xc):w.comment&&(A.comment?A.comment+=`
145
+ `+w.comment:A.comment=w.comment);let ye=new ee(A,Se);if(n.options.keepSourceTokens&&(ye.srcToken=T),o){let z=c;lo(n,z.items,A)&&s(_,"DUPLICATE_KEY","Map keys must be unique"),z.items.push(ye)}else{let z=new re(n.schema);z.flow=!0,z.items.push(ye);let gn=(Se??A).range;z.range=[A.range[0],gn[1],gn[2]],c.items.push(z)}u=Se?Se.range[2]:w.end}}let p=o?"}":"]",[h,...f]=r.end,m=u;if(h?.source===p)m=h.offset+h.source.length;else{let y=a[0].toUpperCase()+a.substring(1),T=d?`${y} must end with a ${p}`:`${y} in block collection must be sufficiently indented and end with a ${p}`;s(u,d?"MISSING_CHAR":"BAD_INDENT",T),h&&h.source.length!==1&&f.unshift(h)}if(f.length>0){let y=St(f,m,n.options.strict,s);y.comment&&(c.comment?c.comment+=`
146
+ `+y.comment:c.comment=y.comment),c.range=[r.offset,m,y.offset]}else c.range=[r.offset,m,m];return c}function Lc(e,t,n,r,s,i){let o=n.type==="block-map"?_m(e,t,n,r,i):n.type==="block-seq"?xm(e,t,n,r,i):Fm(e,t,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function Lm(e,t,n,r,s){let i=r.tag,o=i?t.directives.tagName(i.source,p=>s(i,"TAG_RESOLVE_FAILED",p)):null;if(n.type==="block-seq"){let{anchor:p,newlineAfterProp:h}=r,f=p&&i?p.offset>i.offset?p:i:p??i;f&&(!h||h.offset<f.offset)&&s(f,"MISSING_CHAR","Missing newline after block sequence props")}let a=n.type==="block-map"?"map":n.type==="block-seq"?"seq":n.start.source==="{"?"map":"seq";if(!i||!o||o==="!"||o===re.tagName&&a==="map"||o===be.tagName&&a==="seq")return Lc(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),Lc(e,t,n,s,o)}let c=Lc(e,t,n,s,o,l),d=l.resolve?.(c,p=>s(i,"TAG_RESOLVE_FAILED",p),t.options)??c,u=U(d)?d:new O(d);return u.range=c.range,u.tag=o,l?.format&&(u.format=l.format),u}function Mc(e,t,n){let r=t.offset,s=nS(t,e.options.strict,n);if(!s)return{value:"",type:null,comment:"",range:[r,r,r]};let i=s.mode===">"?O.BLOCK_FOLDED:O.BLOCK_LITERAL,o=t.source?rS(t.source):[],a=o.length;for(let m=o.length-1;m>=0;--m){let y=o[m][1];if(y===""||y==="\r")a=m;else break}if(a===0){let m=s.chomp==="+"&&o.length>0?`
147
147
  `.repeat(Math.max(1,o.length-1)):"",y=r+s.length;return t.source&&(y+=t.source.length),{value:m,type:i,comment:s.comment,range:[r,y,y]}}let l=t.indent+s.indent,c=t.offset+s.length,d=0;for(let m=0;m<a;++m){let[y,T]=o[m];if(T===""||T==="\r")s.indent===0&&y.length>l&&(l=y.length);else{y.length<l&&n(c+y.length,"MISSING_CHAR","Block scalars with more-indented leading empty lines must use an explicit indentation indicator"),s.indent===0&&(l=y.length),d=m,l===0&&!e.atRoot&&n(c,"BAD_INDENT","Block scalar values in collections must be indented");break}c+=y.length+T.length+1}for(let m=o.length-1;m>=a;--m)o[m][0].length>l&&(a=m+1);let u="",p="",h=!1;for(let m=0;m<d;++m)u+=o[m][0].slice(l)+`
148
148
  `;for(let m=d;m<a;++m){let[y,T]=o[m];c+=y.length+T.length+1;let R=T[T.length-1]==="\r";if(R&&(T=T.slice(0,-1)),T&&y.length<l){let $=`Block scalar lines must not be less indented than their ${s.indent?"explicit indentation indicator":"first line"}`;n(c-T.length-(R?2:1),"BAD_INDENT",$),y=""}i===O.BLOCK_LITERAL?(u+=p+y.slice(l)+T,p=`
149
149
  `):y.length>l||T[0]===" "?(p===" "?p=`
@@ -158,65 +158,65 @@ ${c}
158
158
  `+o[m][0].slice(l);u[u.length-1]!==`
159
159
  `&&(u+=`
160
160
  `);break;default:u+=`
161
- `}let f=r+s.length+t.source.length;return{value:u,type:i,comment:s.comment,range:[r,f,f]}}function YP({offset:e,props:t},n,r){if(t[0].type!=="block-scalar-header")return r(t[0],"IMPOSSIBLE","Block scalar header not found"),null;let{source:s}=t[0],i=s[0],o=0,a="",l=-1;for(let p=1;p<s.length;++p){let h=s[p];if(!a&&(h==="-"||h==="+"))a=h;else{let f=Number(h);!o&&f?o=f:l===-1&&(l=e+p)}}l!==-1&&r(l,"UNEXPECTED_TOKEN",`Block scalar header includes extra characters: ${s}`);let c=!1,d="",u=s.length;for(let p=1;p<t.length;++p){let h=t[p];switch(h.type){case"space":c=!0;case"newline":u+=h.source.length;break;case"comment":n&&!c&&r(h,"MISSING_CHAR","Comments must be separated from other tokens by white space characters"),u+=h.source.length,d=h.source.substring(1);break;case"error":r(h,"UNEXPECTED_TOKEN",h.message),u+=h.source.length;break;default:{let f=`Unexpected token in block scalar header: ${h.type}`;r(h,"UNEXPECTED_TOKEN",f);let m=h.source;m&&typeof m=="string"&&(u+=m.length)}}}return{mode:i,indent:o,chomp:a,comment:d,length:u}}function zP(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 xc(e,t,n){let{offset:r,type:s,source:i,end:o}=e,a,l,c=(p,h,f)=>n(r+p,h,f);switch(s){case"scalar":a=O.PLAIN,l=JP(i,c);break;case"single-quoted-scalar":a=O.QUOTE_SINGLE,l=XP(i,c);break;case"double-quoted-scalar":a=O.QUOTE_DOUBLE,l=QP(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=Pt(o,d,t,n);return{value:l,type:a,comment:u.comment,range:[r,d,u.offset]}}function JP(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}`),Dm(e)}function XP(e,t){return(e[e.length-1]!=="'"||e.length===1)&&t(e.length,"MISSING_CHAR","Missing closing 'quote"),Dm(e.slice(1,-1)).replace(/''/g,"'")}function Dm(e){let t,n;try{t=new RegExp(`(.*?)(?<![ ])[ ]*\r?
161
+ `}let f=r+s.length+t.source.length;return{value:u,type:i,comment:s.comment,range:[r,f,f]}}function nS({offset:e,props:t},n,r){if(t[0].type!=="block-scalar-header")return r(t[0],"IMPOSSIBLE","Block scalar header not found"),null;let{source:s}=t[0],i=s[0],o=0,a="",l=-1;for(let p=1;p<s.length;++p){let h=s[p];if(!a&&(h==="-"||h==="+"))a=h;else{let f=Number(h);!o&&f?o=f:l===-1&&(l=e+p)}}l!==-1&&r(l,"UNEXPECTED_TOKEN",`Block scalar header includes extra characters: ${s}`);let c=!1,d="",u=s.length;for(let p=1;p<t.length;++p){let h=t[p];switch(h.type){case"space":c=!0;case"newline":u+=h.source.length;break;case"comment":n&&!c&&r(h,"MISSING_CHAR","Comments must be separated from other tokens by white space characters"),u+=h.source.length,d=h.source.substring(1);break;case"error":r(h,"UNEXPECTED_TOKEN",h.message),u+=h.source.length;break;default:{let f=`Unexpected token in block scalar header: ${h.type}`;r(h,"UNEXPECTED_TOKEN",f);let m=h.source;m&&typeof m=="string"&&(u+=m.length)}}}return{mode:i,indent:o,chomp:a,comment:d,length:u}}function rS(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 jc(e,t,n){let{offset:r,type:s,source:i,end:o}=e,a,l,c=(p,h,f)=>n(r+p,h,f);switch(s){case"scalar":a=O.PLAIN,l=sS(i,c);break;case"single-quoted-scalar":a=O.QUOTE_SINGLE,l=iS(i,c);break;case"double-quoted-scalar":a=O.QUOTE_DOUBLE,l=oS(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=St(o,d,t,n);return{value:l,type:a,comment:u.comment,range:[r,d,u.offset]}}function sS(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}`),Mm(e)}function iS(e,t){return(e[e.length-1]!=="'"||e.length===1)&&t(e.length,"MISSING_CHAR","Missing closing 'quote"),Mm(e.slice(1,-1)).replace(/''/g,"'")}function Mm(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 QP(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 oS(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}=ZP(e,r);n+=i,r=o}else if(s==="\\"){let i=e[++r],o=eS[i];if(o)n+=o;else if(i===`
167
+ `){let{fold:i,offset:o}=aS(e,r);n+=i,r=o}else if(s==="\\"){let i=e[++r],o=lS[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+=tS(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+=cS(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 ZP(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 aS(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 eS={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 tS(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 Fc(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?_c(e,t,r):xc(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=nS(e.schema,s,l,n,r):t.type==="scalar"?c=rS(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=x(u)?u:new O(u)}catch(u){let p=u instanceof Error?u.message:String(u);r(n??t,"TAG_RESOLVE_FAILED",p),d=new O(s)}return d.range=a,d.source=s,i&&(d.type=i),l&&(d.tag=l),c.format&&(d.format=c.format),o&&(d.comment=o),d}function nS(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 rS({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 _m(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 sS={composeNode:Lc,composeEmptyNode:co};function Lc(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=iS(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=Fc(e,t,l,r),a&&(c.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{c=Nm(sS,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=co(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&&(!x(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 co(e,t,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:l},c){let d={type:"scalar",offset:_m(t,n,r),indent:-1,source:""},u=Fc(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 iS({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=Pt(r,o,e.strict,s);return i.range=[t,o,a.offset],a.comment&&(i.comment=a.comment),i}function xm(e,t,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:t},e),l=new sn(void 0,a),c={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},d=Rt(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?Lc(c,s,d,o):co(c,d.end,r,null,d,o);let u=l.contents.range[2],p=Pt(i,u,!1,o);return p.comment&&(l.comment=p.comment),l.range=[n,u,p.offset],l}function Rs(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 Fm(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 lS={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 cS(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 qc(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?Mc(e,t,r):jc(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=uS(e.schema,s,l,n,r):t.type==="scalar"?c=dS(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=x(u)?u:new O(u)}catch(u){let p=u instanceof Error?u.message:String(u);r(n??t,"TAG_RESOLVE_FAILED",p),d=new O(s)}return d.range=a,d.source=s,i&&(d.type=i),l&&(d.tag=l),c.format&&(d.format=c.format),o&&(d.comment=o),d}function uS(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 dS({atKey:e,directives:t,schema:n},r,s,i){let o=n.tags.find(a=>(a.default===!0||e&&a.default==="key")&&a.test?.test(r))||n[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 jm(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 pS={composeNode:Uc,composeEmptyNode:co};function Uc(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=fS(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=qc(e,t,l,r),a&&(c.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{c=Lm(pS,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=co(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&&(!x(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 co(e,t,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:l},c){let d={type:"scalar",offset:jm(t,n,r),indent:-1,source:""},u=qc(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 fS({options:e},{offset:t,source:n,end:r},s){let i=new _t(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=St(r,o,e.strict,s);return i.range=[t,o,a.offset],a.comment&&(i.comment=a.comment),i}function qm(e,t,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:t},e),l=new sn(void 0,a),c={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},d=Pt(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?Uc(c,s,d,o):co(c,d.end,r,null,d,o);let u=l.contents.range[2],p=St(i,u,!1,o);return p.comment&&(l.comment=p.comment),l.range=[n,u,p.offset],l}function Rs(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 Um(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 Ps=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=Rs(n);i?this.warnings.push(new Ts(o,r,s)):this.errors.push(new at(o,r,s))},this.directives=new Tt({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=Fm(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 Ps=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=Rs(n);i?this.warnings.push(new Ts(o,r,s)):this.errors.push(new lt(o,r,s))},this.directives=new bt({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=Um(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:Fm(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=Rs(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=xm(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(Rs(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(Rs(t),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=Pt(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(Rs(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 sn(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 Mc=Symbol("break visit"),oS=Symbol("skip children"),Lm=Symbol("remove item");function En(e,t){"type"in e&&e.type==="document"&&(e={start:e.start,value:e.value}),Mm(Object.freeze([]),e,t)}En.BREAK=Mc;En.SKIP=oS;En.REMOVE=Lm;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 Mm(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=Mm(Object.freeze(e.concat([[s,o]])),i.items[o],n);if(typeof a=="number")o=a-1;else{if(a===Mc)return Mc;a===Lm&&(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 jc="\uFEFF",qc="",Bc="",uo="";function jm(e){switch(e){case jc:return"byte-order-mark";case qc:return"doc-mode";case Bc:return"flow-error-end";case uo: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:Um(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=Rs(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=qm(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 lt(Rs(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 lt(Rs(t),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=St(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 lt(Rs(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 sn(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 Bc=Symbol("break visit"),mS=Symbol("skip children"),Bm=Symbol("remove item");function On(e,t){"type"in e&&e.type==="document"&&(e={start:e.start,value:e.value}),Wm(Object.freeze([]),e,t)}On.BREAK=Bc;On.SKIP=mS;On.REMOVE=Bm;On.itemAtPath=(e,t)=>{let n=e;for(let[r,s]of t){let i=n?.[r];if(i&&"items"in i)n=i.items[s];else return}return n};On.parentCollection=(e,t)=>{let n=On.itemAtPath(e,t.slice(0,-1)),r=t[t.length-1][0],s=n?.[r];if(s&&"items"in s)return s;throw new Error("Parent collection not found")};function Wm(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=Wm(Object.freeze(e.concat([[s,o]])),i.items[o],n);if(typeof a=="number")o=a-1;else{if(a===Bc)return Bc;a===Bm&&(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 Wc="\uFEFF",Vc="",Kc="",uo="";function Vm(e){switch(e){case Wc:return"byte-order-mark";case Vc:return"doc-mode";case Kc:return"flow-error-end";case uo:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case`
184
184
  `:case`\r
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 qm=new Set("0123456789ABCDEFabcdef"),lS=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),po=new Set(",[]{}"),cS=new Set(` ,[]{}
187
- \r `),Uc=e=>!e||cS.has(e),Ss=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===`
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 ct(e){switch(e){case void 0:case" ":case`
186
+ `:case"\r":case" ":return!0;default:return!1}}var Km=new Set("0123456789ABCDEFabcdef"),gS=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),po=new Set(",[]{}"),yS=new Set(` ,[]{}
187
+ \r `),Gc=e=>!e||yS.has(e),Ss=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
- `||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]===jc&&(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 qc,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(Uc),"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 Bc,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(Uc),"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(`
191
+ `||r>=this.indentNext||!n&&!this.atEnd?t+r:-1}if(n==="-"||n==="."){let r=this.buffer.substr(t,3);if((r==="---"||r==="...")&&ct(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]===Wc&&(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 Vc,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==="...")&&ct(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&&!ct(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===":")&&ct(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(Gc),"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("..."))&&ct(s[3]))&&!(r===this.indentNext-1&&this.flowLevel===1&&(s[0]==="]"||s[0]==="}")))return this.flowLevel=0,yield Kc,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(Gc),"flow";case'"':case"'":return this.flowKey=!0,yield*this.parseQuotedScalar();case":":{let o=this.charAt(1);if(this.flowKey||ct(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
- `,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`
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=>ct(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===`
196
196
  `)break}default:break e}if(!r&&!this.atEnd)return this.setNext("block-scalar");if(n>=this.indentNext){this.blockScalarIndent===-1?this.indentNext=n:this.indentNext=this.blockScalarIndent+(this.indentNext===0?1:this.indentNext);do{let i=this.continueScalar(t+1);if(i===-1)break;t=this.buffer.indexOf(`
197
197
  `,i)}while(t!==-1);if(t===-1){if(!this.atEnd)return this.setNext("block-scalar");t=this.buffer.length}}let s=t+1;for(r=this.buffer[s];r===" ";)r=this.buffer[++s];if(r===" "){for(;r===" "||r===" "||r==="\r"||r===`
198
198
  `;)r=this.buffer[++s];t=s-1}else if(!this.blockScalarKeep)do{let i=t-1,o=this.buffer[i];o==="\r"&&(o=this.buffer[--i]);let a=i;for(;o===" ";)o=this.buffer[--i];if(o===`
199
- `&&i>=this.pos&&i+1+n>a)t=i;else break}while(!0);return yield uo,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&&po.has(i))break;n=r}else if(lt(s)){let i=this.buffer[r+1];if(s==="\r"&&(i===`
199
+ `&&i>=this.pos&&i+1+n>a)t=i;else break}while(!0);return yield uo,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(ct(i)||t&&po.has(i))break;n=r}else if(ct(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&&po.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&&po.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield uo,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(Uc),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(lt(r)||n&&po.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(lS.has(n))n=this.buffer[++t];else if(n==="%"&&qm.has(this.buffer[t+1])&&qm.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&&po.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield uo,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(Gc),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(ct(r)||n&&po.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(;!ct(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(gS.has(n))n=this.buffer[++t];else if(n==="%"&&Km.has(this.buffer[t+1])&&Km.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 Is=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 an(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function Bm(e){for(let t=0;t<e.length;++t)switch(e[t].type){case"space":case"comment":case"newline":break;default:return t}return-1}function Wm(e){switch(e?.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"flow-collection":return!0;default:return!1}}function fo(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 kr(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 mo(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 Um(e){if(e.start.type==="flow-seq-start")for(let t of e.items)t.sep&&!t.value&&!an(t.start,"explicit-key-ind")&&!an(t.sep,"map-value-ind")&&(t.key&&(t.value=t.key),delete t.key,Wm(t.value)?t.value.end?mo(t.value.end,t.sep):t.value.end=t.sep:mo(t.start,t.sep),delete t.sep)}var vs=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 Ss,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=jm(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"&&Um(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&&Bm(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":{Bm(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=fo(this.peek(2)),r=kr(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 Is=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 an(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function Gm(e){for(let t=0;t<e.length;++t)switch(e[t].type){case"space":case"comment":case"newline":break;default:return t}return-1}function Ym(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 fo(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 kr(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 mo(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 Hm(e){if(e.start.type==="flow-seq-start")for(let t of e.items)t.sep&&!t.value&&!an(t.start,"explicit-key-ind")&&!an(t.sep,"map-value-ind")&&(t.key&&(t.value=t.key),delete t.key,Ym(t.value)?t.value.end?mo(t.value.end,t.sep):t.value.end=t.sep:mo(t.start,t.sep),delete t.sep)}var vs=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 Ss,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=Vm(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"&&Hm(n),r.type){case"document":r.value=n;break;case"block-scalar":r.props.push(n);break;case"block-map":{let s=r.items[r.items.length-1];if(s.value){r.items.push({start:[],key:n,sep:[]}),this.onKeyLine=!0;return}else if(s.sep)s.value=n;else{Object.assign(s,{key:n,sep:[]}),this.onKeyLine=!s.explicitKey;return}break}case"block-seq":{let s=r.items[r.items.length-1];s.value?r.items.push({start:[],value:n}):s.value=n;break}case"flow-collection":{let s=r.items[r.items.length-1];!s||s.value?r.items.push({start:[],key:n,sep:[]}):s.sep?s.value=n:Object.assign(s,{key:n,sep:[]});return}default:yield*this.pop(),yield*this.pop(n)}if((r.type==="document"||r.type==="block-map"||r.type==="block-seq")&&(n.type==="block-map"||n.type==="block-seq")){let s=n.items[n.items.length-1];s&&!s.sep&&!s.value&&s.start.length>0&&Gm(s.start)===-1&&(n.indent===0||s.start.every(i=>i.type!=="comment"||i.indent<n.indent))&&(r.type==="document"?r.end=s.start:r.items.push({start:s.start}),n.items.splice(-1,1))}}}*stream(){switch(this.type){case"directive-line":yield{type:"directive",offset:this.offset,source:this.source};return;case"byte-order-mark":case"space":case"comment":case"newline":yield this.sourceToken;return;case"doc-mode":case"doc-start":{let t={type:"document",offset:this.offset,start:[]};this.type==="doc-start"&&t.start.push(this.sourceToken),this.stack.push(t);return}}yield{type:"error",offset:this.offset,message:`Unexpected ${this.type} token in YAML stream`,source:this.source}}*document(t){if(t.value)return yield*this.lineEnd(t);switch(this.type){case"doc-start":{Gm(t.start)!==-1?(yield*this.pop(),yield*this.step()):t.start.push(this.sourceToken);return}case"anchor":case"tag":case"space":case"comment":case"newline":t.start.push(this.sourceToken);return}let n=this.startBlockValue(t);n?this.stack.push(n):yield{type:"error",offset:this.offset,message:`Unexpected ${this.type} token in YAML document`,source:this.source}}*scalar(t){if(this.type==="map-value-ind"){let n=fo(this.peek(2)),r=kr(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)){mo(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(an(n.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]});else if(Wm(n.key)&&!an(n.sep,"newline")){let o=kr(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(an(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=kr(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]}):an(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&&!an(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)){mo(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||an(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=fo(r),i=kr(s);Um(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)){mo(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(an(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(Ym(n.key)&&!an(n.sep,"newline")){let o=kr(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(an(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=kr(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]}):an(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&&!an(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)){mo(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||an(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=fo(r),i=kr(s);Hm(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=fo(t),r=kr(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=fo(t),r=kr(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 uS(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new Is||null,prettyErrors:t}}function Wc(e,t={}){let{lineCounter:n,prettyErrors:r}=uS(t),s=new vs(n?.addNewLine),i=new Ps(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(Oc(e,n)),o.warnings.forEach(Oc(e,n))),o}var Cs=1024*1024;function Vc(e,t){Buffer.byteLength(e)>Cs&&ho(t,[`Definition exceeds ${Cs} bytes.`]);let n=Wc(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&&ho(t,s),n.contents===null&&ho(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){ho(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function ho(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 pS}from"node:crypto";var Tr=/^[a-z][a-z0-9_-]{0,63}$/,Vm=/\$\{\{\s*([^{}]+?)\s*\}\}/g,Km=32,Gm=128,fS=16,mS=32,hS=10080*60*1e3,br=32*1024,Hm=16;function Hc(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=vS(r.name,"$.name",n),i=yS(r.limits,n),o=wS(r.inputs,n),a=kS(r.steps,n);a.length>Gm&&n.push(`$.steps may contain at most ${Gm} 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&&PS(a,o,c.ancestors,n),n.length>0&&ES(t,n);let d={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:d,hash:pS("sha256").update(Gc(d)).digest("hex"),order:c.order,waves:gS(c.waves,i.maxConcurrency)}}function gS(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 yS(e,t){let n=Me(e,"$.limits",t);ct(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=Ym(n.max_concurrency,"$.limits.max_concurrency",1,fS,t),s=Ym(n.max_tasks,"$.limits.max_tasks",1,mS,t),i=Xm(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function wS(e,t){if(e===void 0)return{};let n=Me(e,"$.inputs",t),r=Object.entries(n);r.length>Km&&t.push(`$.inputs may contain at most ${Km} inputs.`);let s={};for(let[i,o]of r){Tr.test(i)||t.push(`$.inputs key "${i}" must match ${Tr}.`);let a=Me(o,`$.inputs.${i}`,t);ct(a,["type","required","default"],`$.inputs.${i}`,t);let l=AS(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:CS(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&&!zm(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&zm(a.default,l)?{defaultValue:a.default}:{}}}return s}function kS(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])=>{Tr.test(s)||t.push(`$.steps key "${s}" must match ${Tr}.`);let o=Me(i,`$.steps.${s}`,t),a=Jm(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?bS(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=k.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)>br&&r.push(`$.steps.${e}.prompt exceeds ${br} 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=Kc(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 bS(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:Xm(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function Kc(e,t,n,r){if(r>Hm)return n.push(`${t} exceeds the maximum schema depth of ${Hm}.`),{};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&&Jm(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))Kc(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&Kc(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,f)=>r.get(h)-r.get(f));let u=o;l.push(u),a.push(...u);let p=[];for(let h of u)for(let f of i.get(h)??[]){let m=s.get(f)-1;s.set(f,m),m===0&&p.push(f)}o=p}if(a.length!==e.length)return t.push("$.steps must form an acyclic graph."),null;let c=new Map(e.map(u=>[u.id,u])),d=new Map;for(let u of a){let p=new Set;for(let h of c.get(u).needs){p.add(h);for(let f of d.get(h)??[])p.add(f)}d.set(u,p)}return{order:a,waves:l,ancestors:d}}function PS(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(Vm)],c=a.replace(Vm,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let d of l)SS(d[1].trim(),i,t,n,s,r)}}}function SS(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&&IS(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function IS(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(!go(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(!go(a))return;i=a}}function Gc(e){return Array.isArray(e)?`[${e.map(Gc).join(",")}]`:go(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Gc(e[t])}`).join(",")}}`:JSON.stringify(e)}function Me(e,t,n){return go(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 vS(e,t,n){let r=Ft(e,t,n);return Tr.test(r)||n.push(`${t} must match ${Tr}.`),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 Jm(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 Ym(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 CS(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function AS(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function zm(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function Xm(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>hS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function ES(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var go=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as OS,stat as $S}from"node:fs/promises";var NS=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function Yc(e){let t=await Qm(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 zc(e,t){let n=await Qm(e),r=DS(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:FS(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 Qm(e){let t;try{let n=await $S(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>Cs)throw new Error(`Definition exceeds ${Cs} bytes.`);t=await OS(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return Hc(Vc(t,e),e)}function DS(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]=_S(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 _S(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 xS(e,t){return e.replace(NS,(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=xS(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 FS(e,t,n){let r=`$.steps.${n}.prompt`,s=On(e,t,r);if(Buffer.byteLength(s)>br)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${br} bytes.`,{details:{location:r,maxBytes:br}});return s}import{createHash as Zm}from"node:crypto";import LS from"node:path";import{mkdir as MS}from"node:fs/promises";var Jc={type:"system",component:"heartbeat"};async function ln(e,t={}){await MS(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),Df(e),KS(e)]),o=r??yt(n.tasks.filter(f=>f.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=VS(i),l=a!==i,c=[],d=Xc(s.filter(WS),f=>f.taskId),u=Xc(s.filter(f=>f.type.startsWith("task.pr.")),f=>f.taskId),p=Xc(s.filter(f=>f.type==="agent.state.changed"),f=>f.agentTabId);for(let f of n.tasks){let m=jS(f),y=d.get(f.id),T=Zc(y?.data)??a.tasks[f.id]??null,R=y?.id??a.tasks[f.id]?.eventId??null;if(T?.signature!==m.signature){let _=T?f.status==="closed"&&T?.status!=="closed"?"task.closed":"task.updated":"task.created",A=await xe(e,{id:Qc(_,f.id,m.signature),type:_,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:Jc,data:{...m,changedFields:T?BS(T,m):[]}});c.push(A),R=A.id}a.tasks[f.id]={...m,eventId:R};let b=US(f.prs),$=u.get(f.id),N=Zc($?.data)??a.pullRequests[f.id]??null,D=$?.id??a.pullRequests[f.id]?.eventId??null;if((N||b.associations.length>0)&&N?.signature!==b.signature){let _=Array.isArray(N?.associations)?N.associations.length:0,A=b.associations.length>_?"task.pr.linked":b.associations.length<_?"task.pr.unlinked":"task.pr.refreshed",w=await xe(e,{id:Qc(A,f.id,b.signature),type:A,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:Jc,data:b});c.push(w),D=w.id}a.pullRequests[f.id]={...b,eventId:D}}let h=new Map(o.tasks.map(f=>[f.taskId,f.state]));for(let f of o.agents){let m=p.get(f.tabId),y=Zc(m?.data)??a.agents[f.tabId]??null;if(y?.state===f.state){a.agents[f.tabId]={state:f.state,eventId:m?.id??a.agents[f.tabId]?.eventId??null};continue}let T=[m?.id??a.agents[f.tabId]?.eventId??"initial",f.state,f.sessionState??"none",f.lastActivityAt??"none",f.exitCode??"none",f.error??"none"].join(":"),R=await xe(e,{id:Qc("agent.state.changed",f.tabId,T),type:"agent.state.changed",taskId:f.taskId,agentTabId:f.tabId,actor:Jc,data:{previousState:typeof y?.state=="string"?y.state:null,state:f.state,taskState:h.get(f.taskId)??"idle",sessionState:f.sessionState,lastActivityAt:f.lastActivityAt,exitCode:f.exitCode,error:f.error}});c.push(R),a.agents[f.tabId]={state:f.state,eventId:R.id}}return(c.length>0||l)&&await U(th(e),a),c}function jS(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:eh(t)}}var qS=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function BS(e,t){return qS.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function US(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:eh(t)}}function Xc(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var WS=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",eh=e=>Zm("sha256").update(JSON.stringify(e)).digest("hex"),Qc=(...e)=>Zm("sha256").update(e.join("\0")).digest("hex"),Zc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,th=e=>LS.join(e.orchestrationDir,"event-reconciliation.json");function VS(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 KS(e){try{return await Bs(th(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function GS(e,t){return await eu(e),await ln(e),Sn(e,t)}async function HS(e,t,n){await eu(e);let r=await $t.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await ln(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 nh(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function YS(e,t,n){await eu(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 ln(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=yt([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 JS(t);let u=a-Date.now();if(u<=0)throw zS(t,n.states,n.timeoutMs);await ln(e,{agentObserver:s}),o=(await Sn(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await nh(Math.min(250,u),n.signal)}}finally{s.close()}}async function eu(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Event orchestration is a feature preview. Enable agentOrchestration before using events commands.",{details:{preview:"agentOrchestration"}})}function nh(e,t){return t?.aborted?Promise.resolve():new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var zS=(e,t,n)=>new g("OPERATION_TIMEOUT",`Timed out after ${n}ms waiting for task ${e} agent state ${t.join(",")}.`,{retryable:!0,details:{taskId:e,states:t,timeoutMs:n}}),JS=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),yo={list:GS,watch:HS,waitForTaskState:YS,reconcile:ln};import{readFile as dI}from"node:fs/promises";import{mkdir as iI,readFile as oh,rm as ah}from"node:fs/promises";import{createConnection as oI}from"node:net";import aI from"node:path";import{spawn as tI}from"node:child_process";import{closeSync as nI,openSync as rI}from"node:fs";import nu from"node:path";import{accessSync as XS,constants as QS}from"node:fs";import{homedir as rh}from"node:os";import cn from"node:path";var ZS=[cn.join(rh(),".local","bin"),cn.join(rh(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function ih(e=process.env){return eI([...(e.PATH??"").split(cn.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:ZS])}function wo(e=process.env){return{...e,PATH:ih(e).join(cn.delimiter)}}function tu(e,t={}){if(e.includes(cn.sep)){let n=cn.isAbsolute(e)?e:cn.resolve(t.cwd??process.cwd(),e);return sh(n)?n:null}for(let n of ih(t.env)){let r=cn.join(n,e);if(sh(r))return r}return null}function ko(e,t={}){let n=tu(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 sh(e){try{return XS(e,QS.X_OK),!0}catch{return!1}}function eI(e){return[...new Set(e)]}function To(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=sI(e.workspaceRoot),s=rI(nu.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return tI(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{nI(s)}})().unref()}function sI(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=nu.resolve(nu.dirname(t),"..","node_modules",".bin","tsx");return{command:tu("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 Ro(_e(e).socketPath).catch(()=>null);if(!t)return!1;try{let n=await $n(t,{type:"ping"});return Xt(n.protocolVersion)?(await $n(t,{type:"wakeOrchestration"}),!0):!1}catch{return!1}finally{t.end()}}async function bo(e,t){if(t.length===0)return!0;let n=await Ro(_e(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await $n(n,{type:"ping"});if(!Xt(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 ch(e,t){await lI(e);let n=await Ro(_e(e).socketPath);try{let r=await $n(n,{type:"ping"});if(!Xt(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 lI(e){let t=_e(e),n=await lh(t.socketPath).catch(()=>null);if(Xt(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 iI(e.runtimeDir,{recursive:!0});let r=await oh(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&cI(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([ah(t.socketPath,{force:!0}),ah(t.pidPath,{force:!0})]),To(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await lh(t.socketPath).catch(()=>null);if(Xt(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await oh(aI.join(e.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
209
- ${o.slice(-2e3)}`:""}`)}async function lh(e){let t=await Ro(e);try{return await $n(t,{type:"ping"})}finally{t.end()}}function cI(e){try{return process.kill(e,0),!0}catch{return!1}}var uI=1;function $n(e,t){let n=uI++;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=fo(t),r=kr(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=fo(t),r=kr(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 wS(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new Is||null,prettyErrors:t}}function Hc(e,t={}){let{lineCounter:n,prettyErrors:r}=wS(t),s=new vs(n?.addNewLine),i=new Ps(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 lt(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(_c(e,n)),o.warnings.forEach(_c(e,n))),o}var Cs=1024*1024;function Yc(e,t){Buffer.byteLength(e)>Cs&&ho(t,[`Definition exceeds ${Cs} bytes.`]);let n=Hc(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];Je(n,(i,o)=>{Me(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&&ho(t,s),n.contents===null&&ho(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){ho(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function ho(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 TS}from"node:crypto";var Tr=/^[a-z][a-z0-9_-]{0,63}$/,zm=/\$\{\{\s*([^{}]+?)\s*\}\}/g,Jm=32,Xm=128,bS=16,RS=32,PS=10080*60*1e3,br=32*1024,Qm=16;function Xc(e,t){let n=[],r=je(e,"$",n);ut(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=_S(r.name,"$.name",n),i=IS(r.limits,n),o=vS(r.inputs,n),a=CS(r.steps,n);a.length>Xm&&n.push(`$.steps may contain at most ${Xm} 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=OS(a,n);c&&$S(a,o,c.ancestors,n),n.length>0&&LS(t,n);let d={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:d,hash:TS("sha256").update(Jc(d)).digest("hex"),order:c.order,waves:SS(c.waves,i.maxConcurrency)}}function SS(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 IS(e,t){let n=je(e,"$.limits",t);ut(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=Zm(n.max_concurrency,"$.limits.max_concurrency",1,bS,t),s=Zm(n.max_tasks,"$.limits.max_tasks",1,RS,t),i=nh(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function vS(e,t){if(e===void 0)return{};let n=je(e,"$.inputs",t),r=Object.entries(n);r.length>Jm&&t.push(`$.inputs may contain at most ${Jm} inputs.`);let s={};for(let[i,o]of r){Tr.test(i)||t.push(`$.inputs key "${i}" must match ${Tr}.`);let a=je(o,`$.inputs.${i}`,t);ut(a,["type","required","default"],`$.inputs.${i}`,t);let l=FS(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:xS(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&&!eh(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&eh(a.default,l)?{defaultValue:a.default}:{}}}return s}function CS(e,t){let n=je(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{Tr.test(s)||t.push(`$.steps key "${s}" must match ${Tr}.`);let o=je(i,`$.steps.${s}`,t),a=th(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?ES(s,o,a,t):AS(s,o,a,t)})}function AS(e,t,n,r){ut(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=je(t.create_child,`$.steps.${e}.create_child`,r);ut(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=je(t.agent,`$.steps.${e}.agent`,r);if(ut(u,["runner"],`$.steps.${e}.agent`,r),u.runner!==void 0)try{l=k.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)>br&&r.push(`$.steps.${e}.prompt exceeds ${br} bytes.`);let d;if(t.output!==void 0){let u=je(t.output,`$.steps.${e}.output`,r);ut(u,["schema"],`$.steps.${e}.output`,r),d=zc(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 ES(e,t,n,r){ut(t,["needs","human_review"],`$.steps.${e}`,r);let s=je(t.human_review,`$.steps.${e}.human_review`,r);ut(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=je(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);ut(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:nh(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function zc(e,t,n,r){if(r>Qm)return n.push(`${t} exceeds the maximum schema depth of ${Qm}.`),{};let s=je(e,t,n);ut(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&&th(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=je(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))zc(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&zc(s.items,`${t}.items`,n,r+1),s}function OS(e,t){let n=new Set(e.map(u=>u.id));if(e.some(u=>u.needs.some(p=>!n.has(p))))return null;let r=new Map(e.map((u,p)=>[u.id,p])),s=new Map(e.map(u=>[u.id,u.needs.length])),i=new Map;for(let u of e)for(let p of u.needs)i.set(p,[...i.get(p)??[],u.id]);let o=e.filter(u=>u.needs.length===0).map(u=>u.id),a=[],l=[];for(;o.length>0;){o.sort((h,f)=>r.get(h)-r.get(f));let u=o;l.push(u),a.push(...u);let p=[];for(let h of u)for(let f of i.get(h)??[]){let m=s.get(f)-1;s.set(f,m),m===0&&p.push(f)}o=p}if(a.length!==e.length)return t.push("$.steps must form an acyclic graph."),null;let c=new Map(e.map(u=>[u.id,u])),d=new Map;for(let u of a){let p=new Set;for(let h of c.get(u).needs){p.add(h);for(let f of d.get(h)??[])p.add(f)}d.set(u,p)}return{order:a,waves:l,ancestors:d}}function $S(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(zm)],c=a.replace(zm,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let d of l)NS(d[1].trim(),i,t,n,s,r)}}}function NS(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&&DS(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function DS(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(!go(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(!go(a))return;i=a}}function Jc(e){return Array.isArray(e)?`[${e.map(Jc).join(",")}]`:go(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Jc(e[t])}`).join(",")}}`:JSON.stringify(e)}function je(e,t,n){return go(e)?e:(n.push(`${t} must be an object.`),{})}function ut(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 _S(e,t,n){let r=Lt(e,t,n);return Tr.test(r)||n.push(`${t} must match ${Tr}.`),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 th(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 Zm(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 xS(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 eh(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function nh(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>PS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function LS(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var go=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as MS,stat as jS}from"node:fs/promises";var qS=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function Qc(e){let t=await rh(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 Zc(e,t){let n=await rh(e),r=US(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:$n(l.title,r,`$.steps.${a}.human_review.title`),summary:$n(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?$n(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:$n(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",...l.createChild?.repo?{repo:$n(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)}:{},...l.createChild?.workspace?{workspace:$n(l.createChild.workspace,r,`$.steps.${a}.create_child.workspace`)}:{}},runner:l.runner??null,prompt:VS(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 rh(e){let t;try{let n=await jS(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>Cs)throw new Error(`Definition exceeds ${Cs} bytes.`);t=await MS(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return Xc(Yc(t,e),e)}function US(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]=BS(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 BS(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 WS(e,t){return e.replace(qS,(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 $n(e,t,n){let r=WS(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 VS(e,t,n){let r=`$.steps.${n}.prompt`,s=$n(e,t,r);if(Buffer.byteLength(s)>br)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${br} bytes.`,{details:{location:r,maxBytes:br}});return s}import{createHash as sh}from"node:crypto";import KS from"node:path";import{mkdir as GS}from"node:fs/promises";var eu={type:"system",component:"heartbeat"};async function ln(e,t={}){await GS(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([S.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):Nt.listAgents(e),Mf(e),ZS(e)]),o=r??wt(n.tasks.filter(f=>f.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=QS(i),l=a!==i,c=[],d=tu(s.filter(XS),f=>f.taskId),u=tu(s.filter(f=>f.type.startsWith("task.pr.")),f=>f.taskId),p=tu(s.filter(f=>f.type==="agent.state.changed"),f=>f.agentTabId);for(let f of n.tasks){let m=HS(f),y=d.get(f.id),T=ru(y?.data)??a.tasks[f.id]??null,R=y?.id??a.tasks[f.id]?.eventId??null;if(T?.signature!==m.signature){let _=T?f.status==="closed"&&T?.status!=="closed"?"task.closed":"task.updated":"task.created",A=await Fe(e,{id:nu(_,f.id,m.signature),type:_,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:eu,data:{...m,changedFields:T?zS(T,m):[]}});c.push(A),R=A.id}a.tasks[f.id]={...m,eventId:R};let b=JS(f.prs),$=u.get(f.id),N=ru($?.data)??a.pullRequests[f.id]??null,D=$?.id??a.pullRequests[f.id]?.eventId??null;if((N||b.associations.length>0)&&N?.signature!==b.signature){let _=Array.isArray(N?.associations)?N.associations.length:0,A=b.associations.length>_?"task.pr.linked":b.associations.length<_?"task.pr.unlinked":"task.pr.refreshed",w=await Fe(e,{id:nu(A,f.id,b.signature),type:A,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:eu,data:b});c.push(w),D=w.id}a.pullRequests[f.id]={...b,eventId:D}}let h=new Map(o.tasks.map(f=>[f.taskId,f.state]));for(let f of o.agents){let m=p.get(f.tabId),y=ru(m?.data)??a.agents[f.tabId]??null;if(y?.state===f.state){a.agents[f.tabId]={state:f.state,eventId:m?.id??a.agents[f.tabId]?.eventId??null};continue}let T=[m?.id??a.agents[f.tabId]?.eventId??"initial",f.state,f.sessionState??"none",f.lastActivityAt??"none",f.exitCode??"none",f.error??"none"].join(":"),R=await Fe(e,{id:nu("agent.state.changed",f.tabId,T),type:"agent.state.changed",taskId:f.taskId,agentTabId:f.tabId,actor:eu,data:{previousState:typeof y?.state=="string"?y.state:null,state:f.state,taskState:h.get(f.taskId)??"idle",sessionState:f.sessionState,lastActivityAt:f.lastActivityAt,exitCode:f.exitCode,error:f.error}});c.push(R),a.agents[f.tabId]={state:f.state,eventId:R.id}}return(c.length>0||l)&&await B(oh(e),a),c}function HS(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:ih(t)}}var YS=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function zS(e,t){return YS.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function JS(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:ih(t)}}function tu(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var XS=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",ih=e=>sh("sha256").update(JSON.stringify(e)).digest("hex"),nu=(...e)=>sh("sha256").update(e.join("\0")).digest("hex"),ru=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,oh=e=>KS.join(e.orchestrationDir,"event-reconciliation.json");function QS(e){return e?.schemaVersion===1&&typeof e.tasks=="object"&&e.tasks!==null&&typeof e.pullRequests=="object"&&e.pullRequests!==null&&typeof e.agents=="object"&&e.agents!==null?e:{schemaVersion:1,tasks:{},pullRequests:{},agents:{}}}async function ZS(e){try{return await Us(oh(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function eI(e,t){return await su(e),await ln(e),In(e,t)}async function tI(e,t,n){await su(e);let r=await Nt.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await ln(e,{agentObserver:r});let a=await In(e,{...t,...s?{after:s}:{}});for(let l of a.events)n.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,n.signal?.aborted)break;await ah(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function nI(e,t,n){await su(e);let r=await S.getTask(e,t);if(n.tabId&&!r.ptyTabs.some(i=>i.kind==="agent"&&i.id===n.tabId))throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${t}.`,{details:{taskId:t,tabId:n.tabId}});let s=await Nt.openObserver(e);try{await ln(e,{agentObserver:s});let o=(await In(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=wt([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 sI(t);let u=a-Date.now();if(u<=0)throw rI(t,n.states,n.timeoutMs);await ln(e,{agentObserver:s}),o=(await In(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await ah(Math.min(250,u),n.signal)}}finally{s.close()}}async function su(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Event orchestration is a feature preview. Enable agentOrchestration before using events commands.",{details:{preview:"agentOrchestration"}})}function ah(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 rI=(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}}),sI=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),yo={list:eI,watch:tI,waitForTaskState:nI,reconcile:ln};import{readFile as kI}from"node:fs/promises";import{mkdir as fI,readFile as dh,rm as ph}from"node:fs/promises";import{createConnection as mI}from"node:net";import hI from"node:path";import{spawn as cI}from"node:child_process";import{closeSync as uI,openSync as dI}from"node:fs";import ou from"node:path";import{accessSync as iI,constants as oI}from"node:fs";import{homedir as lh}from"node:os";import cn from"node:path";var aI=[cn.join(lh(),".local","bin"),cn.join(lh(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function uh(e=process.env){return lI([...(e.PATH??"").split(cn.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:aI])}function wo(e=process.env){return{...e,PATH:uh(e).join(cn.delimiter)}}function iu(e,t={}){if(e.includes(cn.sep)){let n=cn.isAbsolute(e)?e:cn.resolve(t.cwd??process.cwd(),e);return ch(n)?n:null}for(let n of uh(t.env)){let r=cn.join(n,e);if(ch(r))return r}return null}function ko(e,t={}){let n=iu(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 ch(e){try{return iI(e,oI.X_OK),!0}catch{return!1}}function lI(e){return[...new Set(e)]}function To(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=pI(e.workspaceRoot),s=dI(ou.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return cI(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{uI(s)}})().unref()}function pI(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=ou.resolve(ou.dirname(t),"..","node_modules",".bin","tsx");return{command:iu("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 Mt(e){let t=await Ro(xe(e).socketPath).catch(()=>null);if(!t)return!1;try{let n=await Nn(t,{type:"ping"});return Xt(n.protocolVersion)?(await Nn(t,{type:"wakeOrchestration"}),!0):!1}catch{return!1}finally{t.end()}}async function bo(e,t){if(t.length===0)return!0;let n=await Ro(xe(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await Nn(n,{type:"ping"});if(!Xt(r.protocolVersion))return!1;for(let s of t)await Nn(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function mh(e,t){await gI(e);let n=await Ro(xe(e).socketPath);try{let r=await Nn(n,{type:"ping"});if(!Xt(r.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await Nn(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 gI(e){let t=xe(e),n=await fh(t.socketPath).catch(()=>null);if(Xt(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 fI(e.runtimeDir,{recursive:!0});let r=await dh(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&yI(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([ph(t.socketPath,{force:!0}),ph(t.pidPath,{force:!0})]),To(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await fh(t.socketPath).catch(()=>null);if(Xt(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await dh(hI.join(e.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
209
+ ${o.slice(-2e3)}`:""}`)}async function fh(e){let t=await Ro(e);try{return await Nn(t,{type:"ping"})}finally{t.end()}}function yI(e){try{return process.kill(e,0),!0}catch{return!1}}var wI=1;function Nn(e,t){let n=wI++;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 Ro(e){return new Promise((t,n)=>{let r=oI(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function pI(e,t){await wI(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 yI(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 ru(e,o.command.id),o}async function ru(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 fI(e,t){return ae.show(e,t)}async function mI(e,t){return ae.list(e,t)}async function hI(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 gI(e,t,n){return ae.wait(e,t,n)}async function yI(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await dI(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 wI(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Prompt dispatch is a feature preview. Enable agentOrchestration before sending prompts.",{details:{preview:"agentOrchestration"}})}var Rr={send:pI,show:fI,list:mI,cancel:hI,wait:gI};function Po(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 kI=6e4;async function So(e,t){return uc(e,t,{createTask:TI})}async function uh(e,t,n,r={}){return cc(e,t,n,{...r,launchProvisioned:(s,i)=>dh(e,s,i,!1)})}async function TI(e,t,n,r={}){return P.createTask(e,t,n,{...r,markStartedAfterLaunch:!1,launchProvisioned:(s,i)=>dh(e,s,i,!0)})}async function dh(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 ch(e,{taskId:t.id,tabId:s.id,cwd:t.worktreePath,command:Po(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:kI,idempotencyKey:`task-start:${t.id}`,actor:{type:"system",component:"orchestration-supervisor"}});await ru(e,i.command.id)}catch(i){throw await bo(e,[s.id]),i}}async function Io(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 pc(e,t,n);return await bo(e,o),a}catch(a){throw a instanceof g&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await bo(e,o),a}}import{randomUUID as mh}from"node:crypto";import{readFile as bI,realpath as ph}from"node:fs/promises";import su from"node:path";var re={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 PI(e,t,n,r,s,i){await xn(e);let o=await LI(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 zc(t,n);MI(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_${mh()}`,planHash:Ml(c),createdBy:s,createdAt:l};await mf(e,a.definitionHash,await bI(t,"utf8"));let u=await hf(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 SI(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 Ti(e,t),s={schemaVersion:1,planId:r.id,planHash:r.planHash,approvedBy:n,approvedAt:new Date().toISOString()},i=await wf(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 II(e,t,n,r){await xn(e);let s=await Ti(e,t);if((await kf(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_${mh()}`,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 Tf(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 vI(e,t){return await xn(e),await _n(e,t),{kind:"showFury",run:await pe(e,t)}}async function Co(e,t={}){let n=await k.load(e);if(k.previews.isEnabled(n,"agentOrchestration"))for(let r of await bf(e))await _n(e,r.id,t)}async function _n(e,t,n={}){let r=await pe(e,t);if(await UI(e,r),St(r))return;if(Date.now()>=Date.parse(r.deadlineAt)){r=await Ge(e,t,o=>BI(o));for(let o of Object.values(r.stepRuns))o.reviewId&&await rs(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",re,{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 fh(e,r,a);continue}a.state==="running"&&a.commandId&&s.get(a.commandId)?.state==="failed"&&(r=await vo(e,r.id,a.id,s.get(a.commandId)?.lastError?.message??"Prompt delivery failed.",re));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 vo(e,r.id,a.id,`Agent session ${a.agentTabId} disappeared.`,re)),a.state==="running"&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(r=await Ge(e,r.id,c=>un(c,a.id,{state:"timed_out",error:"Step timed out.",completedAt:new Date().toISOString(),completedBy:re})),await ce(e,r,a.id,"fury.step.timed_out",re,{})),(a.state==="waiting_for_review"||a.state==="changes_requested")&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(a.reviewId&&await rs(e,a.reviewId,c=>({...c,state:"timed_out",version:c.version+1,updatedAt:new Date().toISOString()})),r=await Ge(e,r.id,c=>un(c,a.id,{state:"timed_out",error:"Review timed out.",completedAt:new Date().toISOString(),completedBy:re})),await ce(e,r,a.id,"fury.review.timed_out",re,{reviewId:a.reviewId}))}if(Object.values(r.stepRuns).some(o=>o.state==="failed"||o.state==="timed_out")){await Ao(e,r.id,"failed",re);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 CI(e,r,a):(r=await fh(e,r,a),i+=1))}await qI(e,r.id)}async function fh(e,t,n){let r=new Date;t=await Ge(e,t.id,o=>un(o,n.id,{state:"running",startedAt:r.toISOString(),deadlineAt:o.deadlineAt})),await ce(e,t,n.id,"fury.step.started",re,{});let s=t.stepRuns[n.id];if(s.taskId)return t;let i=`${Dn(s.plan.prompt,t)}
211
+ `)})}function Ro(e){return new Promise((t,n)=>{let r=mI(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function TI(e,t){await vI(e);let n=await S.getTask(e,t.taskId);if(n.status==="closed")throw new g("COMMAND_STATE_CONFLICT",`Task ${n.id} is ${n.status} and cannot receive prompts.`,{details:{taskId:n.id,taskStatus:n.status}});let r=n.ptyTabs.filter(a=>a.kind==="agent"),s=t.tabId?r.find(a=>a.id===t.tabId):r[0];if(!s)throw new g("TASK_CONTEXT_CONFLICT",t.tabId?`Agent tab ${t.tabId} does not belong to task ${n.id}.`:`Task ${n.id} has no agent tab.`,{details:{taskId:n.id,tabId:t.tabId??null}});let i=await II(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 Mt(e),a}return await au(e,o.command.id),o}async function au(e,t){if((await ae.show(e,t)).command.state==="delivered"||await Mt(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 bI(e,t){return ae.show(e,t)}async function RI(e,t){return ae.list(e,t)}async function PI(e,t){let n;try{n=await ae.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await Mt(e),r}return await Mt(e),n}async function SI(e,t,n){return ae.wait(e,t,n)}async function II(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await kI(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 vI(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Prompt dispatch is a feature preview. Enable agentOrchestration before sending prompts.",{details:{preview:"agentOrchestration"}})}var Rr={send:TI,show:bI,list:RI,cancel:PI,wait:SI};function Po(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 CI=6e4;async function So(e,t){return mc(e,t,{createTask:AI})}async function hh(e,t,n,r={}){return fc(e,t,n,{...r,launchProvisioned:(s,i)=>gh(e,s,i,!1)})}async function AI(e,t,n,r={}){return S.createTask(e,t,n,{...r,markStartedAfterLaunch:!1,launchProvisioned:(s,i)=>gh(e,s,i,!0)})}async function gh(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 mh(e,{taskId:t.id,tabId:s.id,cwd:t.worktreePath,command:Po(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:CI,idempotencyKey:`task-start:${t.id}`,actor:{type:"system",component:"orchestration-supervisor"}});await au(e,i.command.id)}catch(i){throw await bo(e,[s.id]),i}}async function Io(e,t,n){let r=(await S.listTasks(e,{includeClosed:!0})).tasks,s=new Set([t]),i=!0;for(;i;){i=!1;for(let a of r)a.parentTaskId&&s.has(a.parentTaskId)&&!s.has(a.id)&&(s.add(a.id),i=!0)}let o=r.filter(a=>s.has(a.id)).flatMap(a=>a.ptyTabs.map(l=>l.id));try{let a=await gc(e,t,n);return await bo(e,o),a}catch(a){throw a instanceof g&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await bo(e,o),a}}import{randomUUID as kh}from"node:crypto";import{readFile as EI,realpath as yh}from"node:fs/promises";import lu from"node:path";var se={type:"system",component:"orchestration-supervisor"},OI=/\$\{\{\s*steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)\s*\}\}/g;async function $I(e,t,n,r,s,i){await Fn(e);let o=await KI(e,t);if(await S.getTask(e,r),s.type==="agent"){if(!i||s.taskId!==r)throw new g("CAPABILITY_DENIED","An agent may only plan Fury work rooted at its own task.",{});await ze(e,i,"fury.plan",r)}let a=await Zc(t,n);GI(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_${kh()}`,planHash:Bl(c),createdBy:s,createdAt:l};await kf(e,a.definitionHash,await EI(t,"utf8"));let u=await Tf(e,d);try{await Fe(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 NI(e,t,n){if(await Fn(e),n.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can approve a Fury plan.",{});let r=await Ti(e,t),s={schemaVersion:1,planId:r.id,planHash:r.planHash,approvedBy:n,approvedAt:new Date().toISOString()},i=await Pf(e,s);try{await Fe(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 DI(e,t,n,r){await Fn(e);let s=await Ti(e,t);if((await Sf(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 ze(e,r,"fury.run",s.rootTaskId)}await tt(e,await S.getTask(e,s.rootTaskId));let o=new Date,l={schemaVersion:1,id:`fury_${kh()}`,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 If(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 xn(e,c.run.id),await Mt(e),{kind:"runFury",run:await pe(e,c.run.id),created:c.created}}async function _I(e,t){return await Fn(e),await xn(e,t),{kind:"showFury",run:await pe(e,t)}}async function Co(e,t={}){let n=await k.load(e);if(k.previews.isEnabled(n,"agentOrchestration"))for(let r of await vf(e))await xn(e,r.id,t)}async function xn(e,t,n={}){let r=await pe(e,t);if(await JI(e,r),It(r))return;if(Date.now()>=Date.parse(r.deadlineAt)){r=await He(e,t,o=>zI(o));for(let o of Object.values(r.stepRuns))o.reviewId&&await rs(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",se,{state:r.state});return}let s=new Map((await Ye(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 wh(e,r,a);continue}a.state==="running"&&a.commandId&&s.get(a.commandId)?.state==="failed"&&(r=await vo(e,r.id,a.id,s.get(a.commandId)?.lastError?.message??"Prompt delivery failed.",se));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 vo(e,r.id,a.id,`Agent session ${a.agentTabId} disappeared.`,se)),a.state==="running"&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(r=await He(e,r.id,c=>un(c,a.id,{state:"timed_out",error:"Step timed out.",completedAt:new Date().toISOString(),completedBy:se})),await ce(e,r,a.id,"fury.step.timed_out",se,{})),(a.state==="waiting_for_review"||a.state==="changes_requested")&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(a.reviewId&&await rs(e,a.reviewId,c=>({...c,state:"timed_out",version:c.version+1,updatedAt:new Date().toISOString()})),r=await He(e,r.id,c=>un(c,a.id,{state:"timed_out",error:"Review timed out.",completedAt:new Date().toISOString(),completedBy:se})),await ce(e,r,a.id,"fury.review.timed_out",se,{reviewId:a.reviewId}))}if(Object.values(r.stepRuns).some(o=>o.state==="failed"||o.state==="timed_out")){await Ao(e,r.id,"failed",se);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 xI(e,r,a):(r=await wh(e,r,a),i+=1))}await YI(e,r.id)}async function wh(e,t,n){let r=new Date;t=await He(e,t.id,o=>un(o,n.id,{state:"running",startedAt:r.toISOString(),deadlineAt:o.deadlineAt})),await ce(e,t,n.id,"fury.step.started",se,{});let s=t.stepRuns[n.id];if(s.taskId)return t;let i=`${_n(s.plan.prompt,t)}
212
212
 
213
- ${jI(t.id,n.id,s.plan.outputSchema)}`;try{let o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await So(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,re,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:re})).command.id}return t=await Ge(e,t.id,c=>un(c,n.id,{taskId:o,agentTabId:a,commandId:l})),await ce(e,t,n.id,"fury.step.dispatched",re,{taskId:o,agentTabId:a,commandId:l}),t}catch(o){return vo(e,t.id,n.id,o instanceof Error?o.message:"Step dispatch failed.",re)}}async function CI(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 Pf(e,l),t=await Ge(e,t.id,c=>un(c,n.id,{state:"waiting_for_review",reviewId:i,startedAt:s.toISOString(),deadlineAt:l.deadlineAt})),await ce(e,t,n.id,"fury.review.requested",re,{reviewId:i,title:l.title}),t}async function AI(e,t,n,r,s,i){let o=await pe(e,t),a=gh(o,n);await hh(e,a,s,i,"fury.step.complete"),FI(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await Ge(e,t,c=>{if(St(c)||c.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return un(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 EI(e,t,n,r,s,i){let o=await pe(e,t),a=gh(o,n);await hh(e,a,s,i,"fury.step.fail");let l=await vo(e,t,n,r,s);return await Ao(e,t,"failed",s),{kind:"failFuryStep",run:await pe(e,t),step:l.stepRuns[n]}}async function OI(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(St(s))return{kind:"cancelFury",run:s,changed:!1};let i=new Date().toISOString(),o=!1,a=await Ge(e,t,c=>St(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 Io(e,c.taskId).catch(()=>{}),c.reviewId&&await rs(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 $I(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(St(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 NI(e,t,n){return await xn(e),{kind:"listFuryReviews",reviews:(await bi(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function DI(e,t){return await xn(e),{kind:"showFuryReview",review:await or(e,t)}}async function _I(e,t,n,r,s,i){let o=await or(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),f=o.feedbackTarget.agentTabId?h.ptyTabs.find(y=>y.kind==="agent"&&y.id===o.feedbackTarget.agentTabId):h.ptyTabs.find(y=>y.kind==="agent");if(!f)throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${h.id} has no agent tab.`,{});c=(await ae.create(e,{taskId:h.id,agentTabId:f.id,prompt:{source:"inline",text:`Fury review changes requested:
213
+ ${HI(t.id,n.id,s.plan.outputSchema)}`;try{let o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await So(e,{parentTaskId:t.rootTaskId,...s.plan.target.repo?{repoId:_n(s.plan.target.repo,t)}:{},...s.plan.target.workspace?{workspaceId:_n(s.plan.target.workspace,t)}:{},prompt:i,...s.plan.runner?{runner:s.plan.runner}:{},idempotencyKey:`fury:${t.id}:${n.id}`,fury:{runId:t.id,stepId:n.id}}),d=await S.getTask(e,c.taskId),u=d.ptyTabs.find(p=>p.kind==="agent");if(!u)throw new g("TASK_CONTEXT_CONFLICT",`Created task ${d.id} has no agent tab.`,{});o=d.id,a=u.id}else{o=_n(s.plan.target.task,t);let c=await S.getTask(e,o),d=c.ptyTabs.find(p=>p.kind==="agent"&&(!s.plan.runner||(p.runner??c.runner)===s.plan.runner));if(!d)throw new g("TASK_CONTEXT_CONFLICT",s.plan.runner?`Task ${c.id} has no ${s.plan.runner} agent tab for fury step ${n.id}.`:`Task ${c.id} has no agent tab.`,{});await tt(e,c,se,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:se})).command.id}return t=await He(e,t.id,c=>un(c,n.id,{taskId:o,agentTabId:a,commandId:l})),await ce(e,t,n.id,"fury.step.dispatched",se,{taskId:o,agentTabId:a,commandId:l}),t}catch(o){return vo(e,t.id,n.id,o instanceof Error?o.message:"Step dispatch failed.",se)}}async function xI(e,t,n){let r=n.plan.review,s=new Date,i=`review_${t.id.slice(5)}_${n.id}`,o=r.feedbackTask?_n(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:_n(r.title,t),summary:_n(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 Af(e,l),t=await He(e,t.id,c=>un(c,n.id,{state:"waiting_for_review",reviewId:i,startedAt:s.toISOString(),deadlineAt:l.deadlineAt})),await ce(e,t,n.id,"fury.review.requested",se,{reviewId:i,title:l.title}),t}async function FI(e,t,n,r,s,i){let o=await pe(e,t),a=bh(o,n);await Th(e,a,s,i,"fury.step.complete"),VI(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await He(e,t,c=>{if(It(c)||c.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return un(c,n,{state:"succeeded",output:r,completedAt:l,completedBy:s})}),await ce(e,o,n,"fury.step.succeeded",s,{taskId:a.taskId}),await xn(e,t),o=await pe(e,t),{kind:"completeFuryStep",run:o,step:o.stepRuns[n]}}async function LI(e,t,n,r,s,i){let o=await pe(e,t),a=bh(o,n);await Th(e,a,s,i,"fury.step.fail");let l=await vo(e,t,n,r,s);return await Ao(e,t,"failed",s),{kind:"failFuryStep",run:await pe(e,t),step:l.stepRuns[n]}}async function MI(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 ze(e,r,"fury.cancel",s.rootTaskId)}if(It(s))return{kind:"cancelFury",run:s,changed:!1};let i=new Date().toISOString(),o=!1,a=await He(e,t,c=>It(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 Ye(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 Io(e,c.taskId).catch(()=>{}),c.reviewId&&await rs(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 jI(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 ze(e,r,"fury.resume",s.rootTaskId)}if(It(s))throw new g("FURY_STATE_CONFLICT",`Cannot resume ${s.id} while it is ${s.state}.`,{});return await xn(e,t),await Mt(e),{kind:"resumeFury",run:await pe(e,t)}}async function qI(e,t,n){return await Fn(e),{kind:"listFuryReviews",reviews:(await bi(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function UI(e,t){return await Fn(e),{kind:"showFuryReview",review:await or(e,t)}}async function BI(e,t,n,r,s,i){let o=await or(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 ze(e,i,"fury.review.resubmit",s.taskId)}if(!(n==="resubmit"?o.state==="changes_requested":o.state==="waiting_for_review"))throw new g("FURY_STATE_CONFLICT",`Review ${t} cannot ${n} while ${o.state}.`,{});if((n==="reject"||n==="request_changes")&&!r?.trim())throw new g("CLI_USAGE",`${n} requires a reason.`,{});if(n==="request_changes"&&!o.feedbackTarget)throw new g("FURY_STATE_CONFLICT",`Review ${t} has no feedback target.`,{});let c=null;if(n==="request_changes"){let h=await S.getTask(e,o.feedbackTarget.taskId),f=o.feedbackTarget.agentTabId?h.ptyTabs.find(y=>y.kind==="agent"&&y.id===o.feedbackTarget.agentTabId):h.ptyTabs.find(y=>y.kind==="agent");if(!f)throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${h.id} has no agent tab.`,{});c=(await ae.create(e,{taskId:h.id,agentTabId:f.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 rs(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(St(h))throw new g("FURY_STATE_CONFLICT",`Run ${h.id} is ${h.state}.`,{});return un(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 Ao(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 xI(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,St(await pe(e,t)))return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!1};await WI(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 FI(e,t){if(!t){if(e!=null)throw new g("FURY_OUTPUT_INVALID","This step does not declare output.",{});return}let n=[];if(iu(e,t,"$",n),n.length)throw new g("FURY_OUTPUT_INVALID","Fury step output does not match its schema.",{details:{issues:n}})}function iu(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])?iu(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)=>iu(o,t.items,`${n}[${a}]`,r))}async function hh(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 gh(e,t){if(St(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 LI(e,t){let[n,r]=await Promise.all([ph(ge(e).root),ph(t)]),s=su.relative(n,r);if(!s||s.startsWith("..")||su.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 su.join(".craig","fury",s)}function MI(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 jI(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 rs(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 He(e,a.id,h=>{if(It(h))throw new g("FURY_STATE_CONFLICT",`Run ${h.id} is ${h.state}.`,{});return un(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 Ao(e,a.id,"failed",s):await xn(e,a.id),c&&await Mt(e),{kind:"actFuryReview",review:o,run:await pe(e,a.id)}}async function WI(e,t,n,r){await Fn(e),await pe(e,t);let s=n,i=0,o=0;for(;!r.signal?.aborted;){await xn(e,t);let a=await In(e,{typeGlob:"fury.*",...s?{after:s}:{}});for(let l of a.events.filter(c=>c.furyRunId===t))r.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,It(await pe(e,t)))return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!1};await XI(250,r.signal)}return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!0}}function _n(e,t){return e.replace(OI,(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=Dn(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 VI(e,t){if(!t){if(e!=null)throw new g("FURY_OUTPUT_INVALID","This step does not declare output.",{});return}let n=[];if(cu(e,t,"$",n),n.length)throw new g("FURY_OUTPUT_INVALID","Fury step output does not match its schema.",{details:{issues:n}})}function cu(e,t,n,r){let s=t.type;if(!(s==="null"?e===null:s==="array"?Array.isArray(e):s==="object"?Dn(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"&&Dn(e)){let o=Dn(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))Dn(o[a])?cu(l,o[a],`${n}.${a}`,r):t.additionalProperties===!1&&r.push(`${n}.${a} is not allowed.`)}s==="array"&&Array.isArray(e)&&Dn(t.items)&&e.forEach((o,a)=>cu(o,t.items,`${n}[${a}]`,r))}async function Th(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 ze(e,r,s,n.taskId)}}function bh(e,t){if(It(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 KI(e,t){let[n,r]=await Promise.all([yh(ge(e).root),yh(t)]),s=lu.relative(n,r);if(!s||s.startsWith("..")||lu.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 lu.join(".craig","fury",s)}function GI(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 HI(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 vo(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(St(l)||l.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,un(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 un(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function qI(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 Ao(e,t,s,re)}async function Ao(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=>St(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 BI(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:re}]))}}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 UI(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}`,re,{state:t.state});for(let n of Object.values(t.stepRuns)){if(n.startedAt&&await ce(e,t,n.id,"fury.step.started",re,{}),n.taskId&&await ce(e,t,n.id,"fury.step.dispatched",re,{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??re,{reason:n.error}),!n.reviewId)continue;let r=await or(e,n.reviewId);await ce(e,t,n.id,"fury.review.requested",re,{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(!k.previews.isEnabled(await k.load(e),"agentOrchestration"))throw new g("CLI_USAGE","Fury execution is a feature preview. Enable agentOrchestration first.",{details:{preview:"agentOrchestration"}})}function St(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function Nn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function WI(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:PI,approve:SI,run:II,show:vI,watch:xI,cancel:OI,resume:$I,completeStep:AI,failStep:EI,listReviews:NI,showReview:DI,actOnReview:_I,reconcile:Co};import{access as VI,stat as KI}from"node:fs/promises";import GI from"node:path";import{constants as HI}from"node:fs";async function ou(e,t){let n=GI.resolve(e,t),r;try{r=await KI(n),await VI(n,HI.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 YI}from"node:net";async function wh(e,t){let n=await JI(_e(e).socketPath).catch(()=>null);if(!n)return!1;try{return(await yh(n,{type:"ping"})).protocolVersion!==Pn?!1:((await yh(n,{type:"openFile",path:t})).deliveredCount??0)>0}catch{return!1}finally{n.end()}}var zI=1;function yh(e,t){let n=zI++;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 vo(e,t,n,r,s){let i=new Date().toISOString(),o=!1,a=await He(e,t,l=>{if(l.stepRuns[n]?.state==="failed")return l;if(It(l)||l.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,un(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 un(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function YI(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 Ao(e,t,s,se)}async function Ao(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 He(e,t,l=>It(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 zI(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:se}]))}}async function ce(e,t,n,r,s,i){let o=Dn(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 Fe(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 JI(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}`,se,{state:t.state});for(let n of Object.values(t.stepRuns)){if(n.startedAt&&await ce(e,t,n.id,"fury.step.started",se,{}),n.taskId&&await ce(e,t,n.id,"fury.step.dispatched",se,{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??se,{reason:n.error}),!n.reviewId)continue;let r=await or(e,n.reviewId);await ce(e,t,n.id,"fury.review.requested",se,{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 Fn(e){if(!k.previews.isEnabled(await k.load(e),"agentOrchestration"))throw new g("CLI_USAGE","Fury execution is a feature preview. Enable agentOrchestration first.",{details:{preview:"agentOrchestration"}})}function It(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function Dn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function XI(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 qe={plan:$I,approve:NI,run:DI,show:_I,watch:WI,cancel:MI,resume:jI,completeStep:FI,failStep:LI,listReviews:qI,showReview:UI,actOnReview:BI,reconcile:Co};import{access as QI,stat as ZI}from"node:fs/promises";import ev from"node:path";import{constants as tv}from"node:fs";async function uu(e,t){let n=ev.resolve(e,t),r;try{r=await ZI(n),await QI(n,tv.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 nv}from"node:net";async function Ph(e,t){let n=await sv(xe(e).socketPath).catch(()=>null);if(!n)return!1;try{return(await Rh(n,{type:"ping"})).protocolVersion!==Sn?!1:((await Rh(n,{type:"openFile",path:t})).deliveredCount??0)>0}catch{return!1}finally{n.end()}}var rv=1;function Rh(e,t){let n=rv++;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 JI(e){return new Promise((t,n)=>{let r=YI(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function Th(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 au(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await Te.repos.addRepo(t.paths,e.path);return await au(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return Te.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await Un({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 Gt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await Gt({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 ZI(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await Te.restoreWorkspace(t.paths,e.workspaceId);return await au(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return Te.removeWorkspace(t.paths,e.workspaceId,{listTasks:P.listTasks});case"createTask":return uh(t.paths,e.repoId??e.workspaceId??"",e.prompt,{...e.runner?{runner:e.runner}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}});case"createChildTask":{let n=await k.load(t.paths);if(!k.previews.isEnabled(n,"agentOrchestration"))throw new g("CLI_USAGE","Child delegation is a feature preview. Enable agentOrchestration before creating child tasks.",{details:{preview:"agentOrchestration"}});return Fn(t),So(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),dc(t.paths,e.taskId??Mt(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return Fn(t),Io(t.paths,e.taskId??Mt(t).task.id,t.agentCapabilityId);case"validateFury":return await kh(t),Yc(lu.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await kh(t),je.plan(t.paths,lu.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??Mt(t).task.id,dn(t),t.agentCapabilityId);case"approveFury":return je.approve(t.paths,e.planId,dn(t));case"runFury":return Fn(t),je.run(t.paths,e.planId,dn(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,dn(t),t.agentCapabilityId);case"resumeFury":return je.resume(t.paths,e.runId,dn(t),t.agentCapabilityId);case"completeFuryStep":return Fn(t),je.completeStep(t.paths,e.runId,e.stepId,await QI(e.output,t),dn(t),t.agentCapabilityId);case"failFuryStep":return Fn(t),je.failStep(t.paths,e.runId,e.stepId,e.reason,dn(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,dn(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 k.load(t.paths);if(!k.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 ou(t.cwd??process.cwd(),e.path),s=await wh(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 k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?yo.waitForTaskState(t.paths,r,n):$t.waitForTask(t.paths,r,n)}case"listEvents":return yo.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return yo.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 Rr.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 Rr.show(t.paths,e.commandId);case"listPromptCommands":return Rr.list(t.paths,e.taskId);case"cancelPromptCommand":return Rr.cancel(t.paths,e.commandId);case"waitPromptCommand":return Rr.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,Pr(t,"show"));case"streamTaskLogs":return P.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return P.prepareTaskLogs(t.paths,Pr(t,"logs"));case"showTaskDiff":return P.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return P.showTaskDiff(t.paths,Pr(t,"diff"));case"openTask":return P.openTask(t.paths,e.taskId);case"openSelectedTask":return P.openTask(t.paths,Pr(t,"open"));case"runChecks":return P.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return P.runChecks(t.paths,Pr(t,"check"));case"commitTask":return P.commitTask(t.paths,e.taskId);case"commitSelectedTask":return P.commitTask(t.paths,Pr(t,"commit"));case"showContext":{let n=tv(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:Ta()};case"exit":return{kind:"exit"};default:return ev(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 kh(e){let t=await k.load(e.paths);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Fury planning is a feature preview. Enable agentOrchestration before validating or planning a fury.",{details:{preview:"agentOrchestration"}})}function dn(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 QI(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await XI(lu.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 au(e,t,n){let r=await Un({uiStateFile:e.uiStateFile})??Ws();await Gt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function ZI(e,t){let n=await Un({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await Gt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function ev(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function Pr(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 tv(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Rh(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 sv(e){return new Promise((t,n)=>{let r=nv(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function Ih(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 du(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await Te.repos.addRepo(t.paths,e.path);return await du(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return Te.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await Bn({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await Ie(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await Te.repos.removeRepo(t.paths,e.repoId,{listTasks:S.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await ht({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await ht({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 av(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await Te.restoreWorkspace(t.paths,e.workspaceId);return await du(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return Te.removeWorkspace(t.paths,e.workspaceId,{listTasks:S.listTasks});case"createTask":return hh(t.paths,e.repoId??e.workspaceId??"",e.prompt,{...e.runner?{runner:e.runner}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}});case"createChildTask":{let n=await k.load(t.paths);if(!k.previews.isEnabled(n,"agentOrchestration"))throw new g("CLI_USAGE","Child delegation is a feature preview. Enable agentOrchestration before creating child tasks.",{details:{preview:"agentOrchestration"}});return Ln(t),So(t.paths,{parentTaskId:e.parentTaskId??jt(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),hc(t.paths,e.taskId??jt(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return Ln(t),Io(t.paths,e.taskId??jt(t).task.id,t.agentCapabilityId);case"validateFury":return await Sh(t),Qc(pu.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await Sh(t),qe.plan(t.paths,pu.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??jt(t).task.id,dn(t),t.agentCapabilityId);case"approveFury":return qe.approve(t.paths,e.planId,dn(t));case"runFury":return Ln(t),qe.run(t.paths,e.planId,dn(t),t.agentCapabilityId);case"showFury":return qe.show(t.paths,e.runId);case"watchFury":return qe.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return qe.cancel(t.paths,e.runId,dn(t),t.agentCapabilityId);case"resumeFury":return qe.resume(t.paths,e.runId,dn(t),t.agentCapabilityId);case"completeFuryStep":return Ln(t),qe.completeStep(t.paths,e.runId,e.stepId,await ov(e.output,t),dn(t),t.agentCapabilityId);case"failFuryStep":return Ln(t),qe.failStep(t.paths,e.runId,e.stepId,e.reason,dn(t),t.agentCapabilityId);case"listFuryReviews":return qe.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return qe.showReview(t.paths,e.reviewId);case"actFuryReview":return Ln(t),qe.actOnReview(t.paths,e.reviewId,e.action,e.message??null,dn(t),t.agentCapabilityId);case"listTasks":return e.repoId||e.workspaceId?S.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):S.listTasks(t.paths);case"currentTask":{let n=jt(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"renameTask":return S.renameTask(t.paths,e.taskId??jt(t).task.id,e.title);case"addTaskLink":return S.addTaskLink(t.paths,e.taskId,e.repoId);case"addTaskRepoTarget":return S.addTaskRepoTarget(t.paths,e.taskId,e.repoId);case"listTaskLinks":return S.listTaskLinks(t.paths,e.taskId);case"openFile":{let n=await k.load(t.paths);if(!k.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 uu(t.cwd??process.cwd(),e.path),s=await Ph(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 S.showTask(t.paths,e.taskId);case"showCurrentTask":return S.showTask(t.paths,jt(t).task.id);case"showTaskPr":return S.prs.show(t.paths,Mn(e.taskId,t),e.repoId);case"discoverTaskPr":return S.prs.discover(t.paths,Mn(e.taskId,t),e.repoId);case"linkTaskPr":return S.prs.link(t.paths,Mn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return S.prs.refreshAssociation(t.paths,Mn(e.taskId,t),e.repoId);case"unlinkTaskPr":return S.prs.unlink(t.paths,Mn(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return Nt.listAgents(t.paths,e.taskId);case"showAgentStatus":return Nt.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=Mn(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?yo.waitForTaskState(t.paths,r,n):Nt.waitForTask(t.paths,r,n)}case"listEvents":return yo.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return yo.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 Rr.send(t.paths,{taskId:Mn(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 Rr.show(t.paths,e.commandId);case"listPromptCommands":return Rr.list(t.paths,e.taskId);case"cancelPromptCommand":return Rr.cancel(t.paths,e.commandId);case"waitPromptCommand":return Rr.wait(t.paths,e.commandId,{...e.states?{states:e.states}:{},timeoutMs:e.timeoutMs,...t.signal?{signal:t.signal}:{}});case"showSelectedTask":return S.showTask(t.paths,Pr(t,"show"));case"streamTaskLogs":return S.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return S.prepareTaskLogs(t.paths,Pr(t,"logs"));case"showTaskDiff":return S.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return S.showTaskDiff(t.paths,Pr(t,"diff"));case"openTask":return S.openTask(t.paths,e.taskId);case"openSelectedTask":return S.openTask(t.paths,Pr(t,"open"));case"runChecks":return S.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return S.runChecks(t.paths,Pr(t,"check"));case"commitTask":return S.commitTask(t.paths,e.taskId);case"commitSelectedTask":return S.commitTask(t.paths,Pr(t,"commit"));case"showContext":{let n=cv(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:Sa()};case"exit":return{kind:"exit"};default:return lv(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 Sh(e){let t=await k.load(e.paths);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Fury planning is a feature preview. Enable agentOrchestration before validating or planning a fury.",{details:{preview:"agentOrchestration"}})}function dn(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=jt(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 ov(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await iv(pu.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 du(e,t,n){let r=await Bn({uiStateFile:e.uiStateFile})??Ws();await ht({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function av(e,t){let n=await Bn({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await ht({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function lv(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function Pr(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 jt(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Mn(e,t){return e??jt(t).task.id}function cv(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Ch(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,64 +226,66 @@ 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 nv(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 bh(e.review);case"actFuryReview":return`${bh(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 uv(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 vh(e.review);case"actFuryReview":return`${vh(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} ${lv(t)} ${cv(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}`,...ov(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} ${gv(t)} ${yv(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}`,...mv(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 iv(e);case"listAgents":case"showAgentStatus":return sv(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(cu).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 rv(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 fv(e);case"listAgents":case"showAgentStatus":return pv(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(fu).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 dv(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 av(e)}}function nv(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 bh(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 rv(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 cu(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function sv(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 iv(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 ov(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 av(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function lv(e){return e.checks.status}function cv(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 Ph(e,t){let{data:n,warnings:r}=uv(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:n,warnings:r})}function uv(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...n}=e;return{data:n,warnings:t}}return{data:e,warnings:[]}}function Sh(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 uu(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=Ee(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 Ih(e){let t="cli",n=Vd(e.argv);try{let r=Wd(e.argv);if(n=r.options.json,r.mode==="interactive"){if(r.options.noInput||r.options.json||wv(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 uu({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.",{});fv(r.command,r.options.taskId);let s=hv(r.command,r.options.taskId),i=pv(s);mv(s,r.options.taskId,i);let o=i!=="none",a=await uu({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:dv(s),resolveTask:i!=="none",requireTask:i==="required"}),l=gv(s,e.signal),c;try{c=await Th(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):cu(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?Ph(t,c):Rh(c);return d.length>0&&e.writeStdout(`${d}
248
- `),0}catch(r){let s=ya(r),i=n?Sh(t,s):s.message;return e.writeStderr(`${i}
249
- `),s.exitCode}}function dv(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function pv(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"||yv(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 fv(e,t){let n=vh(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 mv(e,t,n){if(!(t===void 0||n!=="none"||vh(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 vh(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 hv(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 gv(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 yv(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function wv(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as t0}from"node:module";import{readFile as kv,stat as Tv}from"node:fs/promises";import du from"node:path";var bv=200*1024,Rv=500*1024,Eo="100000";async function Ah(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return Pv(e,t,n);try{let r=pn(n.selectedFilePath??null,t.filePaths),s=pn(n.selectedDiffPath??null,t.diffPaths),i=s?await As(e.worktreePath):null,[o,a]=await Promise.all([$o(e.worktreePath,r),s?pu(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 Pv(e,t,n){let r=pn(n.selectedFilePath??null,t.filePaths),s=pn(n.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([Oh(e,r),(async()=>{if(!s)return Ce("No diff selected","No local changes found.","empty");let l=Oo(e,s),c=l?await As(l.target.worktreePath).catch(()=>null):null;return $h(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function Eh(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return Sv(e,t);try{await he(e);let n=await As(e.worktreePath),[r,s]=await Promise.all([Nh(e.worktreePath),Dh(e.worktreePath,n)]),i=[...new Set(s.map(u=>u.path))],o=pn(t.selectedFilePath??null,r),a=pn(t.selectedDiffPath??null,i),[l,c]=await Promise.all([$o(e.worktreePath,o),a?pu(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:Mh(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 Sv(e,t){let n=(e.repoTargets??[]).filter(p=>p.status==="ready"),r=await Promise.all(n.map(async p=>{let h=await As(p.worktreePath).catch(()=>null),[f,m]=await Promise.all([Nh(p.worktreePath).catch(()=>[]),Dh(p.worktreePath,h).catch(()=>[])]);return{target:p,baseRef:h,targetFiles:f,targetDiffRows:m}})),s=[],i=[];for(let{target:p,targetFiles:h,targetDiffRows:f}of r)s.push(...h.map(m=>`${p.repoId}/${m}`)),i.push(...f.map(m=>({...m,path:`${p.repoId}/${m.path}`})));let o=[...new Set(i.map(p=>p.path))].sort(),a=pn(t.selectedFilePath??null,s),l=pn(t.selectedDiffPath??null,o),[c,d]=await Promise.all([Oh(e,a),(async()=>{if(!l)return Ce("No diff selected","No local changes found.","empty");let p=Oo(e,l),h=p?r.find(f=>f.target.repoId===p.target.repoId):null;return $h(e,l,i,h?.baseRef??null)})()]),u=l?{[l]:d}:{};return{taskId:e.id,fileRows:Mh(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:u,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:d,error:null}}async function Oh(e,t){let n=Oo(e,t);if(!n)return Ce("No file selected","No Git-visible files found.","empty");let r=await $o(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function $h(e,t,n,r=null){let s=Oo(e,t);return s?{...await pu(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 Oo(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 Nh(e){let t=await H("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return jh(t.stdout)}async function Dh(e,t){let[n,r,s,i]=await Promise.all([Iv(e,t),Ch(e,"staged"),Ch(e,"unstaged"),vv(e)]);return[...n,...r,...s,...i]}async function Iv(e,t){if(!t)return[];let[n,r]=await Promise.all([H("git",["diff","--name-status",`${t}...HEAD`],{cwd:e}),H("git",["diff","--numstat",`${t}...HEAD`],{cwd:e})]),s=_h(n.stdout),i=xh(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 Ch(e,t){let n=t==="staged"?["diff","--cached"]:["diff"],[r,s]=await Promise.all([H("git",[...n,"--name-status"],{cwd:e}),H("git",[...n,"--numstat"],{cwd:e})]),i=_h(r.stdout),o=xh(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 vv(e){let t=await H("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=jh(t.stdout);return await Promise.all(n.map(async s=>{let i=await $o(e,s),o=i.status==="ready"?Cv(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function _h(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 xh(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 As(e){return(await J("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await J("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function $o(e,t){if(!t)return Ce("No file selected","No Git-visible files found.","empty");let n=Av(e,t);return Lh(n,t)}async function Fh(e){return Lh(e,e)}async function Lh(e,t){try{let n=await Tv(e);if(n.size>bv)return Ce(t,`File is ${n.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,n.size);let r=await kv(e);return Ev(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 pu(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 As(e);if(a){let l=await H("git",["diff","--stat","--patch",`--unified=${Eo}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
253
- ${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await H("git",["diff","--cached","--stat","--patch",`--unified=${Eo}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
254
- ${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await H("git",["diff","--stat","--patch",`--unified=${Eo}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
241
+ `);default:return hv(e)}}function uv(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 vh(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 dv(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 fu(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function pv(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 fv(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 mv(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 hv(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function gv(e){return e.checks.status}function yv(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 Ah(e,t){let{data:n,warnings:r}=wv(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:n,warnings:r})}function wv(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...n}=e;return{data:n,warnings:t}}return{data:e,warnings:[]}}function Eh(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 mu(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=Ee(t.workspaceRoot),r=e.resolveTask===!0||e.requireTask===!0||e.explicitTaskId!==void 0||e.environmentTaskId!==void 0||e.environmentAgentTabId!==void 0;if(r&&!t.initialized)throw new g("TASK_CONTEXT_NOT_FOUND",`Task context cannot be resolved because ${t.workspaceRoot} is not an initialized Craig workspace.`,{details:{workspaceRoot:t.workspaceRoot}});let s=r&&t.initialized?await S.resolveContext(n,{cwd:e.cwd,...e.explicitTaskId!==void 0?{explicitTaskId:e.explicitTaskId}:{},...e.environmentTaskId!==void 0?{environmentTaskId:e.environmentTaskId}:{},...e.environmentAgentTabId!==void 0?{environmentAgentTabId:e.environmentAgentTabId}:{},...e.requireTask!==void 0?{required:e.requireTask}:{}}):null;return{paths:n,workspace:t,task:s}}async function Oh(e){let t="cli",n=zd(e.argv);try{let r=Yd(e.argv);if(n=r.options.json,r.mode==="interactive"){if(r.options.noInput||r.options.json||vv(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 mu({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.",{});bv(r.command,r.options.taskId);let s=Pv(r.command,r.options.taskId),i=Tv(s);Rv(s,r.options.taskId,i);let o=i!=="none",a=await mu({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:kv(s),resolveTask:i!=="none",requireTask:i==="required"}),l=Sv(s,e.signal),c;try{c=await Ih(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):fu(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?Ah(t,c):Ch(c);return d.length>0&&e.writeStdout(`${d}
248
+ `),0}catch(r){let s=ba(r),i=n?Eh(t,s):s.message;return e.writeStderr(`${i}
249
+ `),s.exitCode}}function kv(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function Tv(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"||Iv(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 bv(e,t){let n=$h(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 Rv(e,t,n){if(!(t===void 0||n!=="none"||$h(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 $h(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 Pv(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 Sv(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 Iv(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function vv(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as p0}from"node:module";import{readFile as Cv,stat as Av}from"node:fs/promises";import hu from"node:path";var Ev=200*1024,Ov=500*1024,Eo="100000";async function Dh(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return $v(e,t,n);try{let r=pn(n.selectedFilePath??null,t.filePaths),s=pn(n.selectedDiffPath??null,t.diffPaths),i=s?await As(e.worktreePath):null,[o,a]=await Promise.all([$o(e.worktreePath,r),s?gu(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 $v(e,t,n){let r=pn(n.selectedFilePath??null,t.filePaths),s=pn(n.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([xh(e,r),(async()=>{if(!s)return Ce("No diff selected","No local changes found.","empty");let l=Oo(e,s),c=l?await As(l.target.worktreePath).catch(()=>null):null;return Fh(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function _h(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return Nv(e,t);try{await he(e);let n=await As(e.worktreePath),[r,s]=await Promise.all([Lh(e.worktreePath),Mh(e.worktreePath,n)]),i=[...new Set(s.map(u=>u.path))],o=pn(t.selectedFilePath??null,r),a=pn(t.selectedDiffPath??null,i),[l,c]=await Promise.all([$o(e.worktreePath,o),a?gu(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:Wh(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 Nv(e,t){let n=(e.repoTargets??[]).filter(p=>p.status==="ready"),r=await Promise.all(n.map(async p=>{let h=await As(p.worktreePath).catch(()=>null),[f,m]=await Promise.all([Lh(p.worktreePath).catch(()=>[]),Mh(p.worktreePath,h).catch(()=>[])]);return{target:p,baseRef:h,targetFiles:f,targetDiffRows:m}})),s=[],i=[];for(let{target:p,targetFiles:h,targetDiffRows:f}of r)s.push(...h.map(m=>`${p.repoId}/${m}`)),i.push(...f.map(m=>({...m,path:`${p.repoId}/${m.path}`})));let o=[...new Set(i.map(p=>p.path))].sort(),a=pn(t.selectedFilePath??null,s),l=pn(t.selectedDiffPath??null,o),[c,d]=await Promise.all([xh(e,a),(async()=>{if(!l)return Ce("No diff selected","No local changes found.","empty");let p=Oo(e,l),h=p?r.find(f=>f.target.repoId===p.target.repoId):null;return Fh(e,l,i,h?.baseRef??null)})()]),u=l?{[l]:d}:{};return{taskId:e.id,fileRows:Wh(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:u,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:d,error:null}}async function xh(e,t){let n=Oo(e,t);if(!n)return Ce("No file selected","No Git-visible files found.","empty");let r=await $o(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function Fh(e,t,n,r=null){let s=Oo(e,t);return s?{...await gu(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 Oo(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 Lh(e){let t=await K("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return Vh(t.stdout)}async function Mh(e,t){let[n,r,s,i]=await Promise.all([Dv(e,t),Nh(e,"staged"),Nh(e,"unstaged"),_v(e)]);return[...n,...r,...s,...i]}async function Dv(e,t){if(!t)return[];let[n,r]=await Promise.all([K("git",["diff","--name-status",`${t}...HEAD`],{cwd:e}),K("git",["diff","--numstat",`${t}...HEAD`],{cwd:e})]),s=jh(n.stdout),i=qh(r.stdout);return s.map(o=>{let a=i.get(o.path)??{additions:null,deletions:null};return{group:"branch",path:o.path,status:o.status,additions:a.additions,deletions:a.deletions}}).sort((o,a)=>o.path.localeCompare(a.path))}async function Nh(e,t){let n=t==="staged"?["diff","--cached"]:["diff"],[r,s]=await Promise.all([K("git",[...n,"--name-status"],{cwd:e}),K("git",[...n,"--numstat"],{cwd:e})]),i=jh(r.stdout),o=qh(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 _v(e){let t=await K("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=Vh(t.stdout);return await Promise.all(n.map(async s=>{let i=await $o(e,s),o=i.status==="ready"?xv(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function jh(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 qh(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 As(e){return(await J("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await J("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function $o(e,t){if(!t)return Ce("No file selected","No Git-visible files found.","empty");let n=Fv(e,t);return Bh(n,t)}async function Uh(e){return Bh(e,e)}async function Bh(e,t){try{let n=await Av(e);if(n.size>Ev)return Ce(t,`File is ${n.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,n.size);let r=await Cv(e);return Lv(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 gu(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 As(e);if(a){let l=await K("git",["diff","--stat","--patch",`--unified=${Eo}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
253
+ ${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await K("git",["diff","--cached","--stat","--patch",`--unified=${Eo}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
254
+ ${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await K("git",["diff","--stat","--patch",`--unified=${Eo}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
255
255
  ${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await J("git",["diff","--no-index","--stat","--patch",`--unified=${Eo}`,"--","/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 Mh(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 pn(e,t){return e&&t.includes(e)?e:t[0]??null}function Cv(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function jh(e){return[...new Set(e.split(`
260
- `).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function Av(e,t){let n=du.resolve(e,t),r=du.resolve(e);if(n!==r&&!n.startsWith(`${r}${du.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function Ev(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 Ov=["tasks","center","inspector","actions"],qh=["agent","terminal"],Bh=[],V="inspection",vV=[...qh,...Bh],fu=["commit","push","refresh-checks","close-task"],Uh=["refresh-checks","close-task"],Wh=["task","checks","pr","setup-run","actions","next-action"],mu=["files","review"];function Vh(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=Fv(e?.openInspectionKind)??n,s=k.runners.getEnabled(t);return{inputMode:Mv(e?.inputMode),focusedRegion:_v(e?.focusedRegion),selectedRepoId:jt(e?.selectedRepoId),selectedWorkspaceId:jt(e?.selectedWorkspaceId),selectedTaskId:jt(e?.selectedTaskId),selectedPtyTabId:jt(e?.selectedPtyTabId),selectedLeftItemId:Kv(jt(e?.selectedTaskId)),activeTab:n?V:jt(e?.activeTab)??"agent",preferredPtyTabKind:Lv(e?.preferredPtyTabKind),inspectorSection:Es(e?.inspectorSection,Wh,"task"),inspectionMode:xv(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:Es(e?.selectedActionId,fu,"commit"),selectedProjectTargetId:null,selectedRunner:jv(e?.selectedRunner,s,k.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:$v(),centerZoomed:!1}}function $v(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function Kh(e,t){return{...e??Ws(),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 $s(e,t,n={}){let r=Wv(e,t),s=gu(r),i=s?.kind==="task"?t.tasks.find(f=>f.id===s.id)??null:null,o=i?Vv(t.tasks,i):null,a=jo(r),l=Mo(r),c=t.workspaces?.find(f=>f.id===a)??(l?t.workspaces?.find(f=>f.kind==="repo"&&f.primaryRepoId===l):null)??(s?.kind==="workspace"?t.workspaces?.find(f=>f.id===s.id)??null:null)??(o?t.workspaces?.find(f=>f.id===o.workspaceId)??null:null)??t.workspaces?.find(f=>f.id===e.selectedWorkspaceId)??t.workspaces?.[0]??null,u=(t.repos.find(f=>f.id===l)??(s?.kind==="repo"?t.repos.find(f=>f.id===s.id)??null:o?t.repos.find(f=>f.id===o.repoId)??null:null)??(c?.kind==="project"?t.repos.find(f=>f.id===e.selectedRepoId&&c.discoveredRepoIds?.includes(f.id))??null:null)??(c?.kind!=="project"?t.repos.find(f=>f.id===c?.primaryRepoId)??null:null)??t.repos.find(f=>f.id===e.selectedRepoId)??t.repos[0]??null)?.id??null,p=c?_o(t.tasks,c.id):u?xo(t.tasks,u):[],h=(s?.kind==="task"?p.find(f=>f.id===s.id)??null:null)??p.find(f=>f.id===e.selectedTaskId)??p[0]??null;return{...e,inputMode:n.resetInputMode?"control":e.inputMode,selectedLeftItemId:r,selectedWorkspaceId:c?.id??null,selectedRepoId:u,selectedTaskId:h?.id??null,...qv(h,e.activeTab,e.selectedPtyTabId),selectedFilePath:Dv(e,t,h?.id??null),...Bv(e,t,h?.id??null),selectedDiffPath:Nv(e,t,h?.id??null),inspectorSection:Es(e.inspectorSection,Wh,"task")}}function qt(e,t){return{...e,terminal:t}}function Gh(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function Hh(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 hu(e){return e.length===1&&e>=" "&&e!=="\x7F"}function No(e){return zh(e)||Sr(e)!==null}function Yh(e){return Bh.includes(e)}function zh(e){return qh.includes(e)}function Jh(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[V]:[]]}function Nv(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function Dv(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function Es(e,t,n){return t.includes(e??"")?e:n}function _v(e){return e==="tabs"?"center":Es(e,Ov,"tasks")}function xv(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":Es(e,mu,t)}function Fv(e){return e==="file"||e==="diff"?e:null}function Lv(e){return e==="terminal"?"terminal":"agent"}function Mv(e){return e==="terminal"?"terminal":"control"}function jv(e,t=[...ht],n="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:n}function Do(e,t=ht){let n=t.length>0?t:ht,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function Sr(e){let t=ue.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function qv(e,t,n){if(!e)return{activeTab:t===V?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(zh(t)){let l=e.ptyTabs.find(c=>c.kind===t)??null??s??r??e.ptyTabs[0]??null;return{activeTab:l?.id??V,selectedPtyTabId:l?.id??null}}if(t===V)return{activeTab:V,selectedPtyTabId:r?.id??s?.id??e.ptyTabs[0]?.id??null};let o=s??r??e.ptyTabs[0]??null;return{activeTab:o?.id??V,selectedPtyTabId:o?.id??null}}function Bv(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?Uv(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function Uv(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 Wv(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 Os(_o(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 Os(xo(e.tasks,n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function _o(e,t){return Xh(e,n=>n.workspaceId===t)}function xo(e,t){return Xh(e,n=>n.repoId===t)}function Vv(e,t){return t.rootTaskId===t.id?t:e.find(n=>n.id===t.rootTaskId)??t}function Xh(e,t){let n=new Map(e.map(r=>[r.id,r]));return e.filter(r=>t(n.get(r.rootTaskId)??r))}function Os(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 gu(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 Kv(e){return e?`task:${e}`:null}function Ns(e){return typeof e=="string"&&e.startsWith("task:")}function Fo(e){return typeof e=="string"&&e.startsWith("new-task:")}function Lo(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function Qh(e){return typeof e=="string"&&e.startsWith("workspace:")}function Mo(e){return Fo(e)?e.slice(9):null}function jo(e){return Lo(e)?e.slice(19):null}async function Ir(e,t,n){let r=Ee(e),[s,i]=await Promise.all([Te.repos.listRegisteredRepos(r),Te.listWorkspaces(r,{archived:!1})]),o=await P.listTasks(r),a={},l=await k.load(r),c=0;if(k.previews.isEnabled(l,"agentOrchestration")){let h=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(T=>T.kind==="agent").map(async T=>({agentTab:T,environment:await et(r,y,void 0,T.id)}))));for(let{agentTab:y,environment:T}of h)T.CRAIG_AGENT_CAPABILITY&&(a[y.id]=T.CRAIG_AGENT_CAPABILITY);o=await P.listTasks(r);let[f,m]=await Promise.all([yf(r),bi(r)]);c=f.length+m.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 Eh(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 Zh(e,t){return $s(e,t)}import Au from"node:path";import LV from"picocolors";var Gv=[" \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[...Gv]}var qo={width:120,height:36},X={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function qe(e,t){return{width:Math.max(e??qo.width,qo.width),height:Math.max(t??qo.height,qo.height)}}function Ds(e,t=!1){let s=X.topRailHeight+1,i=e.height-X.topRailHeight-1,o={row:s,height:i,column:t?2:35,width:t?e.width-2:e.width-32-34-4};return{left:t?null:{row:s,height:i,column:2,width:32},center:o,right:t?null:{row:s,height:i,column:e.width-34,width:34}}}function eg(e,t=!1){let n=Ds(e,t).center;return{row:n.row+2,column:n.column+3,width:n.width-6,height:n.height-3}}var Hv=["Start","Options","Exit"],Yv=["Resume","Options","Exit"],sg=2,ig=2,Uo=2,zv=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),Jv=new RegExp("\x1B\\[(?:0)?m","g"),Xv=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),Qv=/https?:\/\/[^\s<>"']+/g,Tu="\x1B[0m",Pu="\x1B]8;;\x1B\\",C={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 og(e,t={}){return Iu(e,{panelPolish:t.panelPolish??!1,subtitle:"crAIg is that you?",menuItems:Hv,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function ag(e,t={}){return Iu(e,{panelPolish:t.panelPolish??!1,subtitle:"Control mode is paused.",menuItems:Yv,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}var Bo=[" 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."],Zv=["Help"],eC=5;function Wo(e,t={}){return Iu(e,{panelPolish:t.panelPolish??!1,subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??Zv,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function lg(e,t={}){let n=t.color??!0,r=C.overlay,s=new Array(e.height).fill(j(" ".repeat(e.width),n,r)),i=wu(),o=Math.max(1,Math.floor((e.height-i.length-2-Bo.length)/2));for(let d=0;d<i.length&&!(o+d>=e.height);d+=1)s[o+d]=j(Ig(i[d]??"",e.width),n,C.overlayLogo);let a=Math.max(...Bo.map(d=>d.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let d=0;d<Bo.length;d+=1){let u=c+d;if(u>=e.height)break;let p=Bo[d]??"";s[u]=j(pt(" ".repeat(l)+p,e.width),n,r)}return s.join(`
262
- `)}function cg(e,t={}){let n=t.color??!0,r=C.overlay,s=new Array(e.height).fill(j(" ".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:tC(h)})):[{text:"No Craig activity has been logged.",tone:"muted"}],dt(),{text:"Esc returns to Options.",tone:"muted"}],u=Cr(d,e.height-2),p=Math.max(1,Math.floor((e.height-u.length)/2));for(let h=0;h<u.length;h+=1){let f=p+h;if(f>=e.height)break;let m=u[h]??dt(),y=`${" ".repeat(c)}${Vo(m.text,l)}`,T=m.tone==="selected"?C.overlayMenuSelected:m.tone==="info"?{...C.overlay,fg:C.accent.fg}:m.tone==="warning"?{...C.overlay,fg:C.pending.fg}:m.tone==="error"?{...C.overlay,fg:C.error.fg}:m.tone==="muted"?C.overlay:C.panelBg;s[f]=j(pt(y,e.width),n,T)}return s.join(`
263
- `)}function tC(e){return e.includes(" ERROR ")?"error":e.includes(" WARN ")?"warning":e.includes(" INFO ")?"info":"muted"}function ug(e,t,n={}){if(n.panelPolish)return nC(e,t,n);let r=n.color??!0,s=X.leftWidth,i=X.rightWidth,o=n.centerOnly??!1,a=e.height-X.topRailHeight-1,l=n.focusFlashActive??!1,c={bg:C.divider.bg,fg:"9ece6a"},d=l&&(t.focusedRegion==="tasks"||t.focusedRegion==="center")?c:C.divider,u=l&&(t.focusedRegion==="center"||t.focusedRegion==="inspector")?c:C.divider,p=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,h=j(pt(p,e.width),r,C.rail),f=yg(t,s-sg-ig,a,r),m=Su(e,t,{color:r,centerOnly:o}),y=Tg(t,i,a,r),T=t.inputMode==="terminal",R=[],b=[];for(let ye=0;ye<a;ye+=1)if(!o){let z=vr(f[ye]??dt(),s,r,"left"),gn=j("\u2502",r,d),ca=j("\u2502",r,u),Dr=vr(y[ye]??dt(),i,r,"right");R.push(`${z}${gn}`),b.push(`${ca}${Dr}`)}let $=T||t.modalInput?C.panelBg:C.panelMuted,N=gg(t.footerText,t.footerToast,e.width,r,$),D={row:1,column:1,width:e.width,rows:[h]},_=o?null:{row:X.topRailHeight+1,column:1,width:s+X.dividerWidth,rows:R},A=o?null:{row:X.topRailHeight+1,column:m.column+m.width,width:X.dividerWidth+i,rows:b},w={row:e.height,column:1,width:e.width,rows:[N]},Se=o?m.rows:m.rows.map((ye,z)=>`${R[z]??""}${ye}${b[z]??""}`);return{frame:[h,...Se,N].join(`
264
- `),center:m,regions:{rail:D,left:_,center:m,right:A,footer:w}}}function Su(e,t,n={}){if(n.panelPolish)return pg(e,t,n);let r=n.color??!0,s=hg(e,n.centerOnly??!1),i=rC(t,s.width,s.rowCount,r);return{row:s.row,column:s.column,width:s.width,rows:i.map(o=>vr(o,s.width,r,"center"))}}function dg(e,t,n,r={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!No(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;if(r.panelPolish){let c=Ds(e,r.centerOnly).center;return{row:c.row,column:c.column,width:c.width,rowCount:c.height,rows:[...new Set(n)].filter(d=>d+2<c.height-1).map(d=>({index:d+2,row:mg(Ru(t.terminal.rows[d]),c.width,t.focusedRegion==="center",r.color??!0,"center",t.inputMode==="terminal")}))}}let i=r.color??!0,o=hg(e,r.centerOnly??!1),a=wg(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:vr(Ru(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function nC(e,t,n){let r=n.color??!0,s=Ds(e,n.centerOnly),i=pg(e,t,n),o=j(" ",r,C.panelBg),a=` CRAIG ${xs("/",r,C.panelBg)} ${xs(t.topRail.workspacePath,r,C.panelBg)}`,l={row:1,column:1,width:e.width,rows:[j(pt(a,e.width),r,C.rail)]},c=null,d=null;if(s.left&&s.right){let y=t.leftTree.filter(_=>!_.panelHeader).map(_=>({..._,indent:Math.floor((_.indent??0)/2)})),T=yg({...t,leftTree:y},s.left.width-4,s.left.height-2,r),R=t.focusedRegion==="tasks"?jn("WORKSPACES",r,C.panelBg):_s("WORKSPACES",r,C.panelBg),b=bu(T,R,s.left,t.focusedRegion==="tasks",r,"left");c={row:s.left.row,column:1,width:s.left.width+2,rows:b.map(_=>`${o}${_}${o}`)};let $=Tg(t,s.right.width-2,s.right.height-1,r),N=Pg($[0]??{text:"Inspector"},r,C.panelBg).trim(),D=bu($.slice(1),N,s.right,t.focusedRegion==="inspector"||t.focusedRegion==="actions",r,"right");d={row:s.right.row,column:i.column+i.width,width:s.right.width+2,rows:D.map(_=>`${o}${_}${o}`)}}let u=t.modalInput?C.panelBg:C.panelMuted,p=gg(t.footerText,t.footerToast,e.width,r,u),h=t.modalInput?p:p.replace(/( {2,})(Tab|Enter|Esc|Ctrl\+\]|[ntxar?q+z]|↑↓\/PgUp\/PgDn)(?= )/g,(y,T,R)=>`${T}${j(R,r,C.panelSelected)}${r?Ar(u):""}`),f={row:e.height,column:1,width:e.width,rows:[h]},m=i.rows.map((y,T)=>c&&d?`${c.rows[T]}${y}${d.rows[T]}`:`${o}${y}${o}`);return{frame:[l.rows[0],...m,f.rows[0]].join(`
265
- `),center:i,regions:{rail:l,left:c,center:i,right:d,footer:f}}}function pg(e,t,n){let r=n.color??!0,s=Ds(e,n.centerOnly).center,i=t.tabs.find(d=>d.active)?.id??"agent",o=t.centerHeader.tabLabel==="BROWSER"||!No(i)?t.centerTranscript.map(d=>({...d})):kg(t),a=[t.centerHeader.repo,t.centerHeader.taskId].filter(Boolean).join(" \xB7 "),l=bg(t.tabs,r,t.focusedRegion==="center"),c=bu([{text:a,tone:"muted"},...o],l,s,t.focusedRegion==="center",r,"center",t.inputMode==="terminal");return{row:s.row,column:s.column,width:s.width,rows:c}}function fg(e,t){return{bg:C.panelBg.bg,fg:t?C.success.fg:e?C.accent.fg:"3b4261"}}function bu(e,t,n,r,s,i,o=!1){let a=fg(r,o),l=vg(t,n.width-6),c=`${j("\u256D\u2500 ",s,a)}${j(l,s,r?a:C.panelMuted)}${j(` ${"\u2500".repeat(Math.max(0,n.width-Ae(l)-5))}\u256E`,s,a)}`,d=Cr(e,n.height-2).map(u=>mg(u,n.width,r,s,i,o));return[c,...d,j(`\u2570${"\u2500".repeat(n.width-2)}\u256F`,s,a)]}function mg(e,t,n,r,s,i=!1){let o=j("\u2502",r,fg(n,i)),a=s==="right"?`${vr(e,t-3,r,s)}${j(" ",r,C.panelBg)}`:vr(e,t-2,r,s,s==="left");return`${o}${a}${o}`}function hg(e,t){return{row:X.topRailHeight+1,column:t?1:X.leftWidth+X.dividerWidth+1,width:t?e.width:e.width-X.leftWidth-X.rightWidth-X.dividerWidth*2,rowCount:e.height-X.topRailHeight-1}}function gg(e,t,n,r,s){let i=` ${e}`;if(!t)return j(pt(i,n),r,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=Ae(o),l=Ae(i),c=Math.max(1,n-l-a-2),d=l+c+a+2>n?Vo(i,Math.max(0,n-a-3)):i,u=Math.max(1,n-Ae(d)-a-2),p=t.tone==="error"?kC(o,r,s):jn(o,r,s),h=`${d}${" ".repeat(u)}${p} `;return j(pt(h,n),r,s)}function Iu(e,t){if(!t.panelPolish)return tg(e,t);let n=e.width-4,r=tg({width:n,height:e.height-4},t).split(`
258
+ `);return o.length>Ov?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 Wh(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 pn(e,t){return e&&t.includes(e)?e:t[0]??null}function xv(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function Vh(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=hu.resolve(e,t),r=hu.resolve(e);if(n!==r&&!n.startsWith(`${r}${hu.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function Lv(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 Mv=["tasks","center","inspector","actions"],Kh=["agent","terminal"],Gh=[],V="inspection",LV=[...Kh,...Gh],yu=["commit","push","refresh-checks","close-task"],Hh=["refresh-checks","close-task"],Yh=["task","checks","pr","setup-run","actions","next-action"],wu=["files","review"];function zh(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=Vv(e?.openInspectionKind)??n,s=k.runners.getEnabled(t);return{inputMode:Gv(e?.inputMode),focusedRegion:Bv(e?.focusedRegion),selectedRepoId:qt(e?.selectedRepoId),selectedWorkspaceId:qt(e?.selectedWorkspaceId),selectedTaskId:qt(e?.selectedTaskId),selectedPtyTabId:qt(e?.selectedPtyTabId),selectedLeftItemId:Zv(qt(e?.selectedTaskId)),activeTab:n?V:qt(e?.activeTab)??"agent",preferredPtyTabKind:Kv(e?.preferredPtyTabKind),inspectorSection:Es(e?.inspectorSection,Yh,"task"),inspectionMode:Wv(e?.inspectionMode,n==="diff"?"review":"files"),openInspectionKind:r,selectedFileTreePath:qt(e?.selectedFileTreePath),selectedFilePath:qt(e?.selectedFilePath),selectedDiffPath:qt(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:Es(e?.selectedActionId,yu,"commit"),selectedProjectTargetId:null,selectedRunner:Hv(e?.selectedRunner,s,k.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:jv(),centerZoomed:!1}}function jv(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function No(e,t){return{...e??Ws(),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 $s(e,t,n={}){let r=Xv(e,t),s=Tu(r),i=s?.kind==="task"?t.tasks.find(f=>f.id===s.id)??null:null,o=i?Qv(t.tasks,i):null,a=qo(r),l=jo(r),c=t.workspaces?.find(f=>f.id===a)??(l?t.workspaces?.find(f=>f.kind==="repo"&&f.primaryRepoId===l):null)??(s?.kind==="workspace"?t.workspaces?.find(f=>f.id===s.id)??null:null)??(o?t.workspaces?.find(f=>f.id===o.workspaceId)??null:null)??t.workspaces?.find(f=>f.id===e.selectedWorkspaceId)??t.workspaces?.[0]??null,u=(t.repos.find(f=>f.id===l)??(s?.kind==="repo"?t.repos.find(f=>f.id===s.id)??null:o?t.repos.find(f=>f.id===o.repoId)??null:null)??(c?.kind==="project"?t.repos.find(f=>f.id===e.selectedRepoId&&c.discoveredRepoIds?.includes(f.id))??null:null)??(c?.kind!=="project"?t.repos.find(f=>f.id===c?.primaryRepoId)??null:null)??t.repos.find(f=>f.id===e.selectedRepoId)??t.repos[0]??null)?.id??null,p=c?xo(t.tasks,c.id):u?Fo(t.tasks,u):[],h=(s?.kind==="task"?p.find(f=>f.id===s.id)??null:null)??p.find(f=>f.id===e.selectedTaskId)??p[0]??null;return{...e,inputMode:n.resetInputMode?"control":e.inputMode,selectedLeftItemId:r,selectedWorkspaceId:c?.id??null,selectedRepoId:u,selectedTaskId:h?.id??null,...Yv(h,e.activeTab,e.selectedPtyTabId),selectedFilePath:Uv(e,t,h?.id??null),...zv(e,t,h?.id??null),selectedDiffPath:qv(e,t,h?.id??null),inspectorSection:Es(e.inspectorSection,Yh,"task")}}function Ut(e,t){return{...e,terminal:t}}function Jh(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function Xh(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function Qe(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
261
+ `}function ku(e){return e.length===1&&e>=" "&&e!=="\x7F"}function Do(e){return Zh(e)||Sr(e)!==null}function Qh(e){return Gh.includes(e)}function Zh(e){return Kh.includes(e)}function eg(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[V]:[]]}function qv(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function Uv(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function Es(e,t,n){return t.includes(e??"")?e:n}function Bv(e){return e==="tabs"?"center":Es(e,Mv,"tasks")}function Wv(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":Es(e,wu,t)}function Vv(e){return e==="file"||e==="diff"?e:null}function Kv(e){return e==="terminal"?"terminal":"agent"}function Gv(e){return e==="terminal"?"terminal":"control"}function Hv(e,t=[...gt],n="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:n}function _o(e,t=gt){let n=t.length>0?t:gt,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function Sr(e){let t=ue.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function Yv(e,t,n){if(!e)return{activeTab:t===V?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(Zh(t)){let l=e.ptyTabs.find(c=>c.kind===t)??null??s??r??e.ptyTabs[0]??null;return{activeTab:l?.id??V,selectedPtyTabId:l?.id??null}}if(t===V)return{activeTab:V,selectedPtyTabId:r?.id??s?.id??e.ptyTabs[0]?.id??null};let o=s??r??e.ptyTabs[0]??null;return{activeTab:o?.id??V,selectedPtyTabId:o?.id??null}}function zv(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?Jv(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function Jv(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 Xv(e,t){let n=jn(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 jn(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of Os(xo(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 Os(Fo(e.tasks,n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function xo(e,t){return tg(e,n=>n.workspaceId===t)}function Fo(e,t){return tg(e,n=>n.repoId===t)}function Qv(e,t){return t.rootTaskId===t.id?t:e.find(n=>n.id===t.rootTaskId)??t}function tg(e,t){let n=new Map(e.map(r=>[r.id,r]));return e.filter(r=>t(n.get(r.rootTaskId)??r))}function Os(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 Tu(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 qt(e){return typeof e=="string"?e:null}function Zv(e){return e?`task:${e}`:null}function Ns(e){return typeof e=="string"&&e.startsWith("task:")}function Lo(e){return typeof e=="string"&&e.startsWith("new-task:")}function Mo(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function ng(e){return typeof e=="string"&&e.startsWith("workspace:")}function jo(e){return Lo(e)?e.slice(9):null}function qo(e){return Mo(e)?e.slice(19):null}async function Ir(e,t,n){let r=Ee(e),[s,i]=await Promise.all([Te.repos.listRegisteredRepos(r),Te.listWorkspaces(r,{archived:!1})]),o=await S.listTasks(r),a={},l=await k.load(r),c=0;if(k.previews.isEnabled(l,"agentOrchestration")){let h=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(T=>T.kind==="agent").map(async T=>({agentTab:T,environment:await tt(r,y,void 0,T.id)}))));for(let{agentTab:y,environment:T}of h)T.CRAIG_AGENT_CAPABILITY&&(a[y.id]=T.CRAIG_AGENT_CAPABILITY);o=await S.listTasks(r);let[f,m]=await Promise.all([Rf(r),bi(r)]);c=f.length+m.filter(y=>y.state==="waiting_for_review").length}let d=bu(o.tasks,t),u=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},p=d?await _h(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 bu(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function rg(e,t){return $s(e,t)}import $u from"node:path";import YV from"picocolors";var eC=[" \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 Ru(){return[...eC]}var Uo={width:120,height:36},X={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function Ue(e,t){return{width:Math.max(e??Uo.width,Uo.width),height:Math.max(t??Uo.height,Uo.height)}}function Ds(e,t=!1){let s=X.topRailHeight+1,i=e.height-X.topRailHeight-1,o={row:s,height:i,column:t?2:35,width:t?e.width-2:e.width-32-34-4};return{left:t?null:{row:s,height:i,column:2,width:32},center:o,right:t?null:{row:s,height:i,column:e.width-34,width:34}}}function sg(e,t=!1){let n=Ds(e,t).center;return{row:n.row+2,column:n.column+3,width:n.width-6,height:n.height-3}}var tC=["Start","Options","Exit"],nC=["Resume","Options","Exit"],lg=2,cg=2,Wo=2,rC=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),sC=new RegExp("\x1B\\[(?:0)?m","g"),iC=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),oC=/https?:\/\/[^\s<>"']+/g,Su="\x1B[0m",Cu="\x1B]8;;\x1B\\",C={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"}},Pu=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function ug(e,t={}){return Ko(e,{panelPolish:t.panelPolish??!1,subtitle:"crAIg is that you?",menuItems:tC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function dg(e,t={}){return Ko(e,{panelPolish:t.panelPolish??!1,subtitle:"Control mode is paused.",menuItems:nC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function pg(e,t,n={}){let r=`npm install -g craig-cli@${t.latest}`,i=t.phase==="installing"?{subtitle:`Updating Craig \xB7 ${t.current} \u2192 ${t.latest}`,menuItems:["Updating\u2026"],message:r}:t.phase==="success"?{subtitle:`Craig ${t.latest} installed \xB7 restart to use it`,menuItems:["Continue","Exit Craig"],message:"The current Craig session is still running the previous version."}:t.phase==="error"?{subtitle:"Craig update failed",menuItems:["Retry","Continue"],message:t.error??"npm could not install the update."}:{subtitle:`Update available \xB7 ${t.current} \u2192 ${t.latest}`,menuItems:["Update now","Continue","Ignore this version"],message:`Release notes: https://github.com/hallsamuel90/craig/releases/latest
262
+ Runs: ${r}`};return Ko(e,{subtitle:i.subtitle,menuItems:i.menuItems,menuIndex:n.menuIndex??0,optionsMessage:i.message,color:n.color??!0})}var Bo=[" 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."],aC=["Help"],lC=5;function Vo(e,t={}){return Ko(e,{panelPolish:t.panelPolish??!1,subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??aC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function fg(e,t={}){let n=t.color??!0,r=C.overlay,s=new Array(e.height).fill(j(" ".repeat(e.width),n,r)),i=Ru(),o=Math.max(1,Math.floor((e.height-i.length-2-Bo.length)/2));for(let d=0;d<i.length&&!(o+d>=e.height);d+=1)s[o+d]=j(Og(i[d]??"",e.width),n,C.overlayLogo);let a=Math.max(...Bo.map(d=>d.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let d=0;d<Bo.length;d+=1){let u=c+d;if(u>=e.height)break;let p=Bo[d]??"";s[u]=j(pt(" ".repeat(l)+p,e.width),n,r)}return s.join(`
263
+ `)}function mg(e,t={}){let n=t.color??!0,r=C.overlay,s=new Array(e.height).fill(j(" ".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:cC(h)})):[{text:"No Craig activity has been logged.",tone:"muted"}],dt(),{text:"Esc returns to Options.",tone:"muted"}],u=Cr(d,e.height-2),p=Math.max(1,Math.floor((e.height-u.length)/2));for(let h=0;h<u.length;h+=1){let f=p+h;if(f>=e.height)break;let m=u[h]??dt(),y=`${" ".repeat(c)}${Go(m.text,l)}`,T=m.tone==="selected"?C.overlayMenuSelected:m.tone==="info"?{...C.overlay,fg:C.accent.fg}:m.tone==="warning"?{...C.overlay,fg:C.pending.fg}:m.tone==="error"?{...C.overlay,fg:C.error.fg}:m.tone==="muted"?C.overlay:C.panelBg;s[f]=j(pt(y,e.width),n,T)}return s.join(`
264
+ `)}function cC(e){return e.includes(" ERROR ")?"error":e.includes(" WARN ")?"warning":e.includes(" INFO ")?"info":"muted"}function hg(e,t,n={}){if(n.panelPolish)return uC(e,t,n);let r=n.color??!0,s=X.leftWidth,i=X.rightWidth,o=n.centerOnly??!1,a=e.height-X.topRailHeight-1,l=n.focusFlashActive??!1,c={bg:C.divider.bg,fg:"9ece6a"},d=l&&(t.focusedRegion==="tasks"||t.focusedRegion==="center")?c:C.divider,u=l&&(t.focusedRegion==="center"||t.focusedRegion==="inspector")?c:C.divider,p=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,h=j(pt(p,e.width),r,C.rail),f=Rg(t,s-lg-cg,a,r),m=Au(e,t,{color:r,centerOnly:o}),y=Ig(t,i,a,r),T=t.inputMode==="terminal",R=[],b=[];for(let ye=0;ye<a;ye+=1)if(!o){let z=vr(f[ye]??dt(),s,r,"left"),gn=j("\u2502",r,d),pa=j("\u2502",r,u),Dr=vr(y[ye]??dt(),i,r,"right");R.push(`${z}${gn}`),b.push(`${pa}${Dr}`)}let $=T||t.modalInput?C.panelBg:C.panelMuted,N=bg(t.footerText,t.footerToast,e.width,r,$),D={row:1,column:1,width:e.width,rows:[h]},_=o?null:{row:X.topRailHeight+1,column:1,width:s+X.dividerWidth,rows:R},A=o?null:{row:X.topRailHeight+1,column:m.column+m.width,width:X.dividerWidth+i,rows:b},w={row:e.height,column:1,width:e.width,rows:[N]},Se=o?m.rows:m.rows.map((ye,z)=>`${R[z]??""}${ye}${b[z]??""}`);return{frame:[h,...Se,N].join(`
265
+ `),center:m,regions:{rail:D,left:_,center:m,right:A,footer:w}}}function Au(e,t,n={}){if(n.panelPolish)return yg(e,t,n);let r=n.color??!0,s=Tg(e,n.centerOnly??!1),i=dC(t,s.width,s.rowCount,r);return{row:s.row,column:s.column,width:s.width,rows:i.map(o=>vr(o,s.width,r,"center"))}}function gg(e,t,n,r={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!Do(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;if(r.panelPolish){let c=Ds(e,r.centerOnly).center;return{row:c.row,column:c.column,width:c.width,rowCount:c.height,rows:[...new Set(n)].filter(d=>d+2<c.height-1).map(d=>({index:d+2,row:kg(vu(t.terminal.rows[d]),c.width,t.focusedRegion==="center",r.color??!0,"center",t.inputMode==="terminal")}))}}let i=r.color??!0,o=Tg(e,r.centerOnly??!1),a=Pg(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:vr(vu(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function uC(e,t,n){let r=n.color??!0,s=Ds(e,n.centerOnly),i=yg(e,t,n),o=j(" ",r,C.panelBg),a=` CRAIG ${xs("/",r,C.panelBg)} ${xs(t.topRail.workspacePath,r,C.panelBg)}`,l={row:1,column:1,width:e.width,rows:[j(pt(a,e.width),r,C.rail)]},c=null,d=null;if(s.left&&s.right){let y=t.leftTree.filter(_=>!_.panelHeader).map(_=>({..._,indent:Math.floor((_.indent??0)/2)})),T=Rg({...t,leftTree:y},s.left.width-4,s.left.height-2,r),R=t.focusedRegion==="tasks"?qn("WORKSPACES",r,C.panelBg):_s("WORKSPACES",r,C.panelBg),b=Iu(T,R,s.left,t.focusedRegion==="tasks",r,"left");c={row:s.left.row,column:1,width:s.left.width+2,rows:b.map(_=>`${o}${_}${o}`)};let $=Ig(t,s.right.width-2,s.right.height-1,r),N=Ag($[0]??{text:"Inspector"},r,C.panelBg).trim(),D=Iu($.slice(1),N,s.right,t.focusedRegion==="inspector"||t.focusedRegion==="actions",r,"right");d={row:s.right.row,column:i.column+i.width,width:s.right.width+2,rows:D.map(_=>`${o}${_}${o}`)}}let u=t.modalInput?C.panelBg:C.panelMuted,p=bg(t.footerText,t.footerToast,e.width,r,u),h=t.modalInput?p:p.replace(/( {2,})(Tab|Enter|Esc|Ctrl\+\]|[ntxar?q+z]|↑↓\/PgUp\/PgDn)(?= )/g,(y,T,R)=>`${T}${j(R,r,C.panelSelected)}${r?Ar(u):""}`),f={row:e.height,column:1,width:e.width,rows:[h]},m=i.rows.map((y,T)=>c&&d?`${c.rows[T]}${y}${d.rows[T]}`:`${o}${y}${o}`);return{frame:[l.rows[0],...m,f.rows[0]].join(`
266
+ `),center:i,regions:{rail:l,left:c,center:i,right:d,footer:f}}}function yg(e,t,n){let r=n.color??!0,s=Ds(e,n.centerOnly).center,i=t.tabs.find(d=>d.active)?.id??"agent",o=t.centerHeader.tabLabel==="BROWSER"||!Do(i)?t.centerTranscript.map(d=>({...d})):Sg(t),a=[t.centerHeader.repo,t.centerHeader.taskId].filter(Boolean).join(" \xB7 "),l=vg(t.tabs,r,t.focusedRegion==="center"),c=Iu([{text:a,tone:"muted"},...o],l,s,t.focusedRegion==="center",r,"center",t.inputMode==="terminal");return{row:s.row,column:s.column,width:s.width,rows:c}}function wg(e,t){return{bg:C.panelBg.bg,fg:t?C.success.fg:e?C.accent.fg:"3b4261"}}function Iu(e,t,n,r,s,i,o=!1){let a=wg(r,o),l=$g(t,n.width-6),c=`${j("\u256D\u2500 ",s,a)}${j(l,s,r?a:C.panelMuted)}${j(` ${"\u2500".repeat(Math.max(0,n.width-Ae(l)-5))}\u256E`,s,a)}`,d=Cr(e,n.height-2).map(u=>kg(u,n.width,r,s,i,o));return[c,...d,j(`\u2570${"\u2500".repeat(n.width-2)}\u256F`,s,a)]}function kg(e,t,n,r,s,i=!1){let o=j("\u2502",r,wg(n,i)),a=s==="right"?`${vr(e,t-3,r,s)}${j(" ",r,C.panelBg)}`:vr(e,t-2,r,s,s==="left");return`${o}${a}${o}`}function Tg(e,t){return{row:X.topRailHeight+1,column:t?1:X.leftWidth+X.dividerWidth+1,width:t?e.width:e.width-X.leftWidth-X.rightWidth-X.dividerWidth*2,rowCount:e.height-X.topRailHeight-1}}function bg(e,t,n,r,s){let i=` ${e}`;if(!t)return j(pt(i,n),r,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=Ae(o),l=Ae(i),c=Math.max(1,n-l-a-2),d=l+c+a+2>n?Go(i,Math.max(0,n-a-3)):i,u=Math.max(1,n-Ae(d)-a-2),p=t.tone==="error"?CC(o,r,s):qn(o,r,s),h=`${d}${" ".repeat(u)}${p} `;return j(pt(h,n),r,s)}function Ko(e,t){if(!t.panelPolish)return ig(e,t);let n=e.width-4,r=ig({width:n,height:e.height-4},t).split(`
266
267
  `),s={bg:C.overlay.bg,fg:C.accent.fg},i=j(" ",t.color,C.overlay),o=j("\u2502",t.color,s);return[j(" ".repeat(e.width),t.color,C.overlay),`${i}${j(`\u256D${"\u2500".repeat(n)}\u256E`,t.color,s)}${i}`,...r.map(a=>`${i}${o}${a}${o}${i}`),`${i}${j(`\u2570${"\u2500".repeat(n)}\u256F`,t.color,s)}${i}`,j(" ".repeat(e.width),t.color,C.overlay)].join(`
267
- `)}function tg(e,t){let n=new Array(e.height).fill(j(" ".repeat(e.width),t.color,C.overlay)),r=wu(),s=t.menuItems.map((c,d)=>`${d===t.menuIndex?">":" "} ${c}`),i=t.optionsMessage?["",t.optionsMessage]:[],o=[...s,...i];for(;o.length<eC;)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=Ig(a[c]??"",e.width);if(c<r.length){n[l+c]=j(d,t.color,C.overlayLogo);continue}if(c===r.length+1){n[l+c]=j(d,t.color,C.overlaySubtitle);continue}let u=c-(r.length+3),h=u>=0&&u<t.menuItems.length&&u===t.menuIndex?t.panelPolish?{...C.overlayMenuSelected,fg:C.success.fg}:C.overlayMenuSelected:C.overlay;n[l+c]=j(d,t.color,h)}if(t.versionText){let c=t.updateText?" (update available)":"",d=`${t.versionText}${c} `,u=" ".repeat(Math.max(0,e.width-Ae(d)));n[e.height-1]=j(`${u}${xs(d,t.color,C.overlay)}`,t.color,C.overlay)}return n.join(`
268
- `)}function yg(e,t,n,r){let s=oC(e.runners),i=1,o=e.leftTree.map(l=>iC(l,t,r));return[...Cr(o,n-i),s]}function rC(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!No(s)?e.centerTranscript.map(o=>({...o})):kg(e);return Cr([...wg(e,t,r),...i],n)}function wg(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:yC(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?jn(a,n,C.panelBg):_s(a,n,C.panelMuted)}`,c=[`${_s(e.centerHeader.tabLabel,n,C.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),d=bg(e.tabs,n,e.focusedRegion==="center"),u=" engaged ",p=u.length+2,h=e.inputMode==="terminal"?jn(`${u}\u25CF `,n,C.panelBg):"",f=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Ae(d)-p)):"";return[{text:e.inputMode==="terminal"?`${d}${f}${h}`:d},{text:l,tone:"muted"},{text:c},dt()]}function kg(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(Ru)}function Ru(e){return{text:Cu(e.segments),segments:e.segments,fullBleed:!0}}function Tg(e,t,n,r){let s=e.rightInspection?sC(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):Cr([{text:"CONTEXT"},dt(),...e.rightContext.map(i=>aC(i,r)),...e.actionMessage?[dt(),{text:e.actionMessage}]:[]],n);return Cr(s,n)}function sC(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:wC(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>ng(a)),...r.slice(o,o+s).map(a=>ng(a))]}function ng(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 iC(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${jn("\u25CF",n,e.selected?C.panelSelected:C.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((f,m)=>f+Ae(m.text),0):0,l=t-Ae(i)-Ae(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",d=e.selected?e.text:e.focused?jn(e.text,n,C.panelBg):e.panelHeader?_s(e.text,n,C.panelMuted):e.text,u=pt(`${r}${c}${d}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let f=`${r}${e.selected?"\u25B8":" "} `,m=u.slice(f.length+2),y=[{text:f},Rg(e.activity,e.activityAnimationFrame??0),{text:` ${m}${i}${o}`},...e.prBadge??[]];return{text:Cu(y),segments:y,tone:p}}if(e.prBadge){let f=[{text:`${u}${i}${o}`},...e.prBadge];return{text:`${u}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:f,tone:p}}return{text:`${u}${i}${o}`,tone:p}}function oC(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:C.success.fg}}):n.push({text:s.text,style:{fg:C.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function bg(e,t,n){return e.map(r=>{let s=r.active?n?jn(r.label,t,C.panelBg):_s(r.label,t,C.panelBg):xs(r.label,t,C.panelBg),i=r.activity?vu(Rg(r.activity,r.activityAnimationFrame??0),t,C.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function Rg(e,t){return{text:"\u25CF",style:{fg:e==="working"?ku[t%ku.length]??ku[0]:e==="ready"?C.success.fg:e==="error"?C.error.fg:C.panelMuted.fg}}}function aC(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?xs(e.value,t,C.panelBg):e.value}`}}function vr(e,t,n,r,s=!1){let i=lC(r,e.tone??"default"),o=Pg(e,n,i);if(r==="left"){let l=s?1:sg,c=s?1:ig;if(e.fullBleed)return j(pt(o,t),n,i);let d=t-l-c;if(e.rightAlign){let p=Ae(o),h=Math.max(0,d-p),f=`${" ".repeat(l)}${" ".repeat(h)}${o}${" ".repeat(c)}`;return j(f,n,i)}let u=`${" ".repeat(l)}${pt(o,d)}${" ".repeat(c)}`;return j(u,n,i)}return r==="center"&&e.fullBleed?cC(e,t,n,i):j(pt(` ${o}`,t),n,i)}function lC(e,t){return t==="selected"||t==="focused"?C.panelSelected:t==="muted"?C.panelMuted:C.panelBg}function Cr(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(dt());return n}function dt(){return{text:""}}function Pg(e,t,n){return e.segments?e.segments.map(r=>vu(r,t,n)).join(""):e.text}function cC(e,t,n,r){let s=" ".repeat(Uo),i=Math.max(0,t-Uo*2);if(!e.segments)return j(`${s}${pt(e.text,i)}${s}`,n,r);let o=pC(e.segments,i),a=`${s}${o.map(l=>vu(l,n,r)).join("")}${s}${n?Pu:""}`;return j(a,n,r)}function vu(e,t,n){let r=e.href?`${Sg(e.href)}${e.text}${Pu}`:uC(e.text);return!t||!e.style?r:`${Ar(hC(e.style,n))}${gC(e.style)}${r}${Tu}${Ar(n)}`}function uC(e){return e.replace(Qv,t=>{let[n,r]=dC(t);return`${Sg(n)}${n}${Pu}${r}`})}function dC(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function Sg(e){return`\x1B]8;;${e}\x1B\\`}function pC(e,t){let n=fC(e,t);return mC(n,t)}function fC(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=Ae(s.text);if(i<=r){n.push(s),r-=i;continue}let o=Vo(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function mC(e,t){let n=Ae(Cu(e));if(n>=t)return e;let r=[...e].reverse().find(s=>s.style?.bg)?.style;return r?.bg?[...e,{text:" ".repeat(t-n),style:r}]:[...e,{text:" ".repeat(t-n)}]}function hC(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 gC(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 yC(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 Ig(e,t){let n=Math.max(0,t-Ae(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function pt(e,t){let n=Ae(e);return n>=t?vg(e,t):e+" ".repeat(t-n)}function vg(e,t){if(t<=0)return"";if(Ae(e)<=t)return e;let n=Ag(e);return Vo(n,Math.max(0,t-1))+"\u2026"}function Ae(e){let t=0;for(let n of Array.from(Ag(e)))t+=Cg(n);return t}function Vo(e,t){let n="",r=0;for(let s of Array.from(e)){let i=Cg(s);if(r+i>t)break;n+=s,r+=i}return n}function Cg(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 wC(e,t,n){return Math.min(Math.max(e,t),n)}function Ag(e){return e.replace(Xv,"").replace(zv,"")}function Cu(e){return e.map(t=>t.text).join("")}function j(e,t,n){if(!t)return e;let r=Ar(n),s=e.replace(Jv,`${Tu}${r}`);return`${r}${s}${Tu}`}function Ar(e){let t=[];return e.fg&&t.push(`38;2;${rg(e.fg).join(";")}`),e.bg&&t.push(`48;2;${rg(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function rg(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function jn(e,t,n){return Ko(e,t,C.success.fg,n)}function kC(e,t,n){return Ko(e,t,C.error.fg,n)}function _s(e,t,n){return Ko(e,t,C.accent.fg,n)}function xs(e,t,n){return Ko(e,t,C.mutedfg.fg,n)}function Ko(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${Ar(s)}${e}${Ar(r)}`}function Eg(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"?bC(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:TC(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function TC(e,t){let n=(e??"").split(Au.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(Au.delimiter):[...n,t].join(Au.delimiter)}function bC(e,t){let n=e.command.length>0?e.command:["codex"];return Po(n,e.runner??t??"codex")}function Og(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 Bt(e,t=!1,n=!1){if(t){let r=eg(e,n);return{columns:r.width,rows:r.height}}return{columns:Math.max(20,e.width-X.leftWidth-X.rightWidth-X.dividerWidth-Uo*2),rows:Math.max(5,e.height-X.topRailHeight-5)}}function $g(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 Ng(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 Eu(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function Dg(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 Fs(e){return xg.includes(e)?"SHIFT_ENTER":null}function Ou(e){return xg.some(t=>t.startsWith(e))}function _g(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var xg=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function Fg(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
268
+ `)}function ig(e,t){let n=new Array(e.height).fill(j(" ".repeat(e.width),t.color,C.overlay)),r=Ru(),s=t.menuItems.map((c,d)=>`${d===t.menuIndex?">":" "} ${c}`),i=t.optionsMessage?["",...t.optionsMessage.split(`
269
+ `)]:[],o=[...s,...i];for(;o.length<lC;)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=Og(a[c]??"",e.width);if(c<r.length){n[l+c]=j(d,t.color,C.overlayLogo);continue}if(c===r.length+1){n[l+c]=j(d,t.color,C.overlaySubtitle);continue}let u=c-(r.length+3),h=u>=0&&u<t.menuItems.length&&u===t.menuIndex?t.panelPolish?{...C.overlayMenuSelected,fg:C.success.fg}:C.overlayMenuSelected:C.overlay;n[l+c]=j(d,t.color,h)}if(t.versionText){let c=t.updateText?" (update available)":"",d=`${t.versionText}${c} `,u=" ".repeat(Math.max(0,e.width-Ae(d)));n[e.height-1]=j(`${u}${xs(d,t.color,C.overlay)}`,t.color,C.overlay)}return n.join(`
270
+ `)}function Rg(e,t,n,r){let s=mC(e.runners),i=1,o=e.leftTree.map(l=>fC(l,t,r));return[...Cr(o,n-i),s]}function dC(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!Do(s)?e.centerTranscript.map(o=>({...o})):Sg(e);return Cr([...Pg(e,t,r),...i],n)}function Pg(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:IC(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?qn(a,n,C.panelBg):_s(a,n,C.panelMuted)}`,c=[`${_s(e.centerHeader.tabLabel,n,C.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),d=vg(e.tabs,n,e.focusedRegion==="center"),u=" engaged ",p=u.length+2,h=e.inputMode==="terminal"?qn(`${u}\u25CF `,n,C.panelBg):"",f=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Ae(d)-p)):"";return[{text:e.inputMode==="terminal"?`${d}${f}${h}`:d},{text:l,tone:"muted"},{text:c},dt()]}function Sg(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(vu)}function vu(e){return{text:Ou(e.segments),segments:e.segments,fullBleed:!0}}function Ig(e,t,n,r){let s=e.rightInspection?pC(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):Cr([{text:"CONTEXT"},dt(),...e.rightContext.map(i=>hC(i,r)),...e.actionMessage?[dt(),{text:e.actionMessage}]:[]],n);return Cr(s,n)}function pC(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:vC(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>og(a)),...r.slice(o,o+s).map(a=>og(a))]}function og(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 fC(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${qn("\u25CF",n,e.selected?C.panelSelected:C.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((f,m)=>f+Ae(m.text),0):0,l=t-Ae(i)-Ae(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",d=e.selected?e.text:e.focused?qn(e.text,n,C.panelBg):e.panelHeader?_s(e.text,n,C.panelMuted):e.text,u=pt(`${r}${c}${d}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let f=`${r}${e.selected?"\u25B8":" "} `,m=u.slice(f.length+2),y=[{text:f},Cg(e.activity,e.activityAnimationFrame??0),{text:` ${m}${i}${o}`},...e.prBadge??[]];return{text:Ou(y),segments:y,tone:p}}if(e.prBadge){let f=[{text:`${u}${i}${o}`},...e.prBadge];return{text:`${u}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:f,tone:p}}return{text:`${u}${i}${o}`,tone:p}}function mC(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:C.success.fg}}):n.push({text:s.text,style:{fg:C.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function vg(e,t,n){return e.map(r=>{let s=r.active?n?qn(r.label,t,C.panelBg):_s(r.label,t,C.panelBg):xs(r.label,t,C.panelBg),i=r.activity?Eu(Cg(r.activity,r.activityAnimationFrame??0),t,C.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function Cg(e,t){return{text:"\u25CF",style:{fg:e==="working"?Pu[t%Pu.length]??Pu[0]:e==="ready"?C.success.fg:e==="error"?C.error.fg:C.panelMuted.fg}}}function hC(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?xs(e.value,t,C.panelBg):e.value}`}}function vr(e,t,n,r,s=!1){let i=gC(r,e.tone??"default"),o=Ag(e,n,i);if(r==="left"){let l=s?1:lg,c=s?1:cg;if(e.fullBleed)return j(pt(o,t),n,i);let d=t-l-c;if(e.rightAlign){let p=Ae(o),h=Math.max(0,d-p),f=`${" ".repeat(l)}${" ".repeat(h)}${o}${" ".repeat(c)}`;return j(f,n,i)}let u=`${" ".repeat(l)}${pt(o,d)}${" ".repeat(c)}`;return j(u,n,i)}return r==="center"&&e.fullBleed?yC(e,t,n,i):j(pt(` ${o}`,t),n,i)}function gC(e,t){return t==="selected"||t==="focused"?C.panelSelected:t==="muted"?C.panelMuted:C.panelBg}function Cr(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(dt());return n}function dt(){return{text:""}}function Ag(e,t,n){return e.segments?e.segments.map(r=>Eu(r,t,n)).join(""):e.text}function yC(e,t,n,r){let s=" ".repeat(Wo),i=Math.max(0,t-Wo*2);if(!e.segments)return j(`${s}${pt(e.text,i)}${s}`,n,r);let o=TC(e.segments,i),a=`${s}${o.map(l=>Eu(l,n,r)).join("")}${s}${n?Cu:""}`;return j(a,n,r)}function Eu(e,t,n){let r=e.href?`${Eg(e.href)}${e.text}${Cu}`:wC(e.text);return!t||!e.style?r:`${Ar(PC(e.style,n))}${SC(e.style)}${r}${Su}${Ar(n)}`}function wC(e){return e.replace(oC,t=>{let[n,r]=kC(t);return`${Eg(n)}${n}${Cu}${r}`})}function kC(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function Eg(e){return`\x1B]8;;${e}\x1B\\`}function TC(e,t){let n=bC(e,t);return RC(n,t)}function bC(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=Ae(s.text);if(i<=r){n.push(s),r-=i;continue}let o=Go(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function RC(e,t){let n=Ae(Ou(e));if(n>=t)return e;let r=[...e].reverse().find(s=>s.style?.bg)?.style;return r?.bg?[...e,{text:" ".repeat(t-n),style:r}]:[...e,{text:" ".repeat(t-n)}]}function PC(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 SC(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 IC(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 Og(e,t){let n=Math.max(0,t-Ae(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function pt(e,t){let n=Ae(e);return n>=t?$g(e,t):e+" ".repeat(t-n)}function $g(e,t){if(t<=0)return"";if(Ae(e)<=t)return e;let n=Dg(e);return Go(n,Math.max(0,t-1))+"\u2026"}function Ae(e){let t=0;for(let n of Array.from(Dg(e)))t+=Ng(n);return t}function Go(e,t){let n="",r=0;for(let s of Array.from(e)){let i=Ng(s);if(r+i>t)break;n+=s,r+=i}return n}function Ng(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 vC(e,t,n){return Math.min(Math.max(e,t),n)}function Dg(e){return e.replace(iC,"").replace(rC,"")}function Ou(e){return e.map(t=>t.text).join("")}function j(e,t,n){if(!t)return e;let r=Ar(n),s=e.replace(sC,`${Su}${r}`);return`${r}${s}${Su}`}function Ar(e){let t=[];return e.fg&&t.push(`38;2;${ag(e.fg).join(";")}`),e.bg&&t.push(`48;2;${ag(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function ag(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function qn(e,t,n){return Ho(e,t,C.success.fg,n)}function CC(e,t,n){return Ho(e,t,C.error.fg,n)}function _s(e,t,n){return Ho(e,t,C.accent.fg,n)}function xs(e,t,n){return Ho(e,t,C.mutedfg.fg,n)}function Ho(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${Ar(s)}${e}${Ar(r)}`}function _g(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"?EC(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: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($u.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join($u.delimiter):[...n,t].join($u.delimiter)}function EC(e,t){let n=e.command.length>0?e.command:["codex"];return Po(n,e.runner??t??"codex")}function xg(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 Bt(e,t=!1,n=!1){if(t){let r=sg(e,n);return{columns:r.width,rows:r.height}}return{columns:Math.max(20,e.width-X.leftWidth-X.rightWidth-X.dividerWidth-Wo*2),rows:Math.max(5,e.height-X.topRailHeight-5)}}function Fg(e){return e.length===1||Qe(e)||e==="BACKSPACE"||e==="TAB"}function Wt(e){return typeof e=="string"&&new RegExp(`:(?:agent|${ue.join("|")})(?:-\\d+)?$`).test(e)}function Lg(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 Nu(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function Mg(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 Fs(e){return qg.includes(e)?"SHIFT_ENTER":null}function Du(e){return qg.some(t=>t.startsWith(e))}function jg(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var qg=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function Ug(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
269
271
  `||n===`\r
270
- `)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function Lg(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function Mg(e,t=null){let n=t?.split(`
272
+ `)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function Bg(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function Wg(e,t=null){let n=t?.split(`
271
273
  `)??[];return e.split(`
272
- `).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function Go(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{createServer as gA,createConnection as Qg}from"node:net";import{mkdir as yA,readFile as Zg,rm as Ms,writeFile as wA}from"node:fs/promises";import kA from"node:path";import{setTimeout as DC}from"node:timers/promises";var fn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=$u(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:$u(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=$u(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 $u(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as jg,readFile as RC,rm as Nu,stat as PC,writeFile as SC}from"node:fs/promises";import Du from"node:path";async function _u(e){let t=Du.join(e.runtimeDir,"orchestration-supervisor.lock");await jg(e.runtimeDir,{recursive:!0});try{await jg(t)}catch(r){if(!vC(r))throw r;let s=await RC(Du.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await PC(t).catch(()=>null);if(typeof s?.pid=="number"&&!IC(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await Nu(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 SC(Du.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await Nu(t,{recursive:!0,force:!0}),r}let n=!1;return{async release(){n||(n=!0,await Nu(t,{recursive:!0,force:!0}))}}}function IC(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 vC=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var CC="\x1B[200~",AC="\x1B[201~";function qg(e,t){switch(e){case"codex":return Ho(t,50);case"cursor":return Ho(t,50);case"claude":return Ho(t,50);case"pi":return Ho(t,50);default:return EC(e)}}function Ho(e,t){return{paste:`${CC}${e}${AC}`,submit:"\r",submitDelayMs:t}}function EC(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import OC from"node:path";var $C={type:"system",component:"orchestration-supervisor"};async function Bg(e){let t=OC.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Bs(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 NC(i))o.has(a)||(await In(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:$C),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await U(t,n)}function NC(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 Yo=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new fn({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 Co(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await Bg(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,Ls("PROMPT_DELIVERY_UNCERTAIN","Craig resumed after prompt delivery began; the prompt was not replayed.",!1,!0));continue}n.state==="queued"&&await this.reconcileCommand(n)}await Co(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await this.failCommand(t,Ls("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,Ls("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,Ls("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(!this.runtime.hasRunningSession(t.agentTabId)||t.delivery==="when-ready"&&Jt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")return;await ae.beginDelivery(this.paths,t.id);try{let o=qg(r.runner??n.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,o.paste),await DC(o.submitDelayMs),this.runtime.writeToSession(t.agentTabId,o.submit)}catch(o){await this.failCommand(t,Ls("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(!_C(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}.`)}}},_C=e=>e.idempotencyKey===`task-start:${e.taskId}`,Ls=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var xC={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},Er=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...xC,...t.intervals},this.now=t.now??Date.now}takeDueTasks(t,n){let r=this.now(),s=new Set(t.map(o=>o.id));for(let o of this.scheduledTasks.keys())s.has(o)||this.scheduledTasks.delete(o);let i=[];for(let o of t){let a=this.getTaskIntervalMs(o,n);if(a===null){this.scheduledTasks.delete(o.id);continue}let l=this.scheduledTasks.get(o.id);if(!l){this.scheduledTasks.set(o.id,{intervalMs:a,nextPollAt:r,lastPollAt:null}),r>=this.notBefore&&i.push(o);continue}a<l.intervalMs&&(l.nextPollAt=Math.min(l.nextPollAt,r+a)),l.intervalMs=a,r>=this.notBefore&&r>=l.nextPollAt&&i.push(o)}return i}requestImmediate(t){let n=this.now();for(let r of t){let s=this.scheduledTasks.get(r);if(!s)continue;let i=s.lastPollAt===null?n:Math.max(n,s.lastPollAt+this.minimumIntervalMs);s.nextPollAt=Math.min(s.nextPollAt,i)}}recordSuccess(t,n){let r=this.now();this.rateLimitFailures=0,this.notBefore=0;for(let s of t){let i=this.getTaskIntervalMs(s,n);i===null?this.scheduledTasks.delete(s.id):this.scheduledTasks.set(s.id,{intervalMs:i,nextPollAt:r+i,lastPollAt:r})}}recordFailure(t,n){let r=this.now(),s=n instanceof We,i=s?Math.min(this.intervals.rateLimitBaseMs*2**this.rateLimitFailures,this.intervals.rateLimitMaxMs):Math.max(this.minimumIntervalMs,this.intervals.pendingBackgroundMs);s&&(this.rateLimitFailures+=1,this.notBefore=r+i);for(let o of t){let a=this.scheduledTasks.get(o.id);a&&(a.nextPollAt=r+i,a.lastPollAt=r)}}getTaskIntervalMs(t,n){let r=FC(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(LC);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 FC(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 LC(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as MC}from"node:fs";var zo=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=MC(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 jC={selectedTaskId:null,reviewVisible:!1},qC={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))))},Jo=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??qC,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new Er({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new zo(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=UC(s);i.length>0&&await this.onTasksChanged(i);let o=BC(s);o.length>0&&await this.wake(o)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new fn({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=jC;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,Ug(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)!==Ug(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 BC(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=KC(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&VC.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 UC(e){let t=new Set;for(let n of e)n.taskId&&WC(n)&&t.add(n.taskId);return[...t]}function WC(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var VC=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),KC=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function Ug(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as nA}from"node:module";import HC from"@xterm/headless";var GC=new RegExp("^\x1B\\[(\\d*)S$"),Xo=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=GC.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${`
273
- `.repeat(a)}${c}\x1B[${o+1};${i+1}H`)}writeRaw(t){return t?new Promise(n=>this.terminal.write(t,n)):Promise.resolve()}};function Wg(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 YC=1e3,Kg=new WeakMap,zC=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function Gg(e){let t=new HC.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:YC,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}});return Kg.set(t,new Xo(t)),t}function Hg(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function Fu(e,t){let n=Kg.get(e);return n?n.write(t):new Promise(r=>{e.write(t,r)})}function Yg(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=Wg(e,u);c.push({text:u.getChars()||" ",style:QC(u,o+a===i&&d===n.cursorX),...p?{href:p}:{}})}r.push({segments:JC(XC(c))})}return r}function JC(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&r.href===n.href&&tA(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};n.href&&(s.href=n.href),zg(n.style)||(s.style=n.style),t.push(s)}return t}function XC(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||n.href||!zg(n.style))break;t-=1}return e.slice(0,t)}function QC(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"):zC[s]??ZC(s)}function ZC(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(eA).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 eA(e){return e===0?0:55+e*40}function tA(e,t){return xu(e)===xu(t)}function xu(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function zg(e){return xu(e)===""}var rA=nA(import.meta.url),sA=/^CTRL_([A-Z])$/,iA="\x1B[6n",oA="\x1B[c",aA="\x1B[?u",lA={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
274
- `,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:""},Qo=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,Jg(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(`
275
- `))&&this.touchActivity(n))}writeKey(t){let n=cA(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&&Jg(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:uA(n),error:n.error,scrolledBack:n.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}createSession(t,n,r,s){let i=this.spawn??pA().spawn,o=Gg(r),a=s??this.resolveSessionSpec(t,n),l=wo({...this.env,...a.env??{}}),{executable:c,args:d}=fA(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:mA(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),hA(u,h),Fu(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),Fu(p.terminal,`\r
276
- [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 cA(e){if(e.length===1)return e;let t=lA[e];if(t!==void 0)return t;let n=sA.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function Jg(e,t){dA(e.pty,t),Hg(e.terminal,t),e.screenDirty=!0}function uA(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=Yg(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 dA(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function pA(){return rA("node-pty")}function fA(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[ko(t[0],n),...t.slice(1)].map(Xg).join(" ")}; exec ${Xg(e)} -l`;return{executable:e,args:["-lc",s]}}function Xg(e){return`'${e.replaceAll("'","'\\''")}'`}function mA(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 hA(e,t){for(let n=0;n<Mu(t,iA);n+=1)e.write("\x1B[1;1R");for(let n=0;n<Mu(t,oA);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<Mu(t,aA);n+=1)e.write("\x1B[?0u")}function Mu(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,TA=16,bA=250;async function ey(e){let t=_e(e.paths);await IA(t,e.paths,e.spawnDaemon);let n=await ly(t.socketPath),r=new ju(n,e);return await r.ready(),r}async function ty(e,t={}){let n=_e(e);await yA(e.runtimeDir,{recursive:!0}),await Ms(n.socketPath,{force:!0});let r=new qu(e,t),s=gA(i=>r.handleConnection(i));try{await r.start(),await EA(s,n.socketPath),await wA(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 Ms(n.socketPath,{force:!0}),await Ms(n.pidPath,{force:!0}),await r.stop(),r.disposeAll()}}async function ny(e){let t=_e(e);return await iy(t.socketPath)?(await AA(t.socketPath),!0):!1}var ju=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(!sy(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)}
274
+ `).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function Yo(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{createServer as SA,createConnection as ry}from"node:net";import{mkdir as IA,readFile as sy,rm as Ms,writeFile as vA}from"node:fs/promises";import CA from"node:path";import{setTimeout as UC}from"node:timers/promises";var fn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=_u(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:_u(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=_u(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 _u(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as Vg,readFile as OC,rm as xu,stat as $C,writeFile as NC}from"node:fs/promises";import Fu from"node:path";async function Lu(e){let t=Fu.join(e.runtimeDir,"orchestration-supervisor.lock");await Vg(e.runtimeDir,{recursive:!0});try{await Vg(t)}catch(r){if(!_C(r))throw r;let s=await OC(Fu.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await $C(t).catch(()=>null);if(typeof s?.pid=="number"&&!DC(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await xu(t,{recursive:!0,force:!0}),Lu(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await NC(Fu.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await xu(t,{recursive:!0,force:!0}),r}let n=!1;return{async release(){n||(n=!0,await xu(t,{recursive:!0,force:!0}))}}}function DC(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 _C=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var xC="\x1B[200~",FC="\x1B[201~";function Kg(e,t){switch(e){case"codex":return zo(t,50);case"cursor":return zo(t,50);case"claude":return zo(t,50);case"pi":return zo(t,50);default:return LC(e)}}function zo(e,t){return{paste:`${xC}${e}${FC}`,submit:"\r",submitDelayMs:t}}function LC(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import MC from"node:path";var jC={type:"system",component:"orchestration-supervisor"};async function Gg(e){let t=MC.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Us(t)??{version:1,commands:{}},r=await Ye(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of qC(i))o.has(a)||(await vn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:jC),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await B(t,n)}function qC(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 Jo=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new fn({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 Lu(this.paths);try{await this.reconcile(),this.heartbeat.start()}catch(t){throw await this.lease.release(),this.lease=null,t}}}async wake(){await this.reconcile()}async stop(){this.heartbeat.stop(),await this.reconciliation?.catch(()=>{}),await this.lease?.release(),this.lease=null}reconcile(){return this.reconciliation?this.reconciliation:(this.reconciliation=this.reconcileCommands().finally(()=>{this.reconciliation=null}),this.reconciliation)}async reconcileCommands(){await Co(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await Gg(this.paths);let t=await Ye(this.paths);for(let n of t){if(await this.reconcileInitialPromptTask(n),n.state==="delivering"){await this.failCommand(n,Ls("PROMPT_DELIVERY_UNCERTAIN","Craig resumed after prompt delivery began; the prompt was not replayed.",!1,!0));continue}n.state==="queued"&&await this.reconcileCommand(n)}await Co(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await this.failCommand(t,Ls("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let n=await S.getTask(this.paths,t.taskId).catch(o=>{if(o instanceof g&&o.code==="TASK_NOT_FOUND")return null;throw o}),r=n?.ptyTabs.find(o=>o.id===t.agentTabId);if(!n||!r||r.kind!=="agent"||n.status==="closed"){await this.failCommand(t,Ls("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,Ls("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(!this.runtime.hasRunningSession(t.agentTabId)||t.delivery==="when-ready"&&Jt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")return;await ae.beginDelivery(this.paths,t.id);try{let o=Kg(r.runner??n.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,o.paste),await UC(o.submitDelayMs),this.runtime.writeToSession(t.agentTabId,o.submit)}catch(o){await this.failCommand(t,Ls("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 S.getTask(this.paths,t.taskId).catch(r=>{if(r instanceof g&&r.code==="TASK_NOT_FOUND")return null;throw r});if(!(!n||n.status==="closed")){if(t.state==="delivered"){(n.status==="draft"||n.runnerSession.lastKnownState==="starting")&&await S.markTaskStarted(this.paths,n.id);return}n.runnerSession.lastKnownState!=="failed"&&await S.recordStartupFailure(this.paths,n.id,t.lastError?.message??`Initial prompt ${t.state}.`)}}},BC=e=>e.idempotencyKey===`task-start:${e.taskId}`,Ls=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var WC={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},Er=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...WC,...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 Ve,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=VC(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(KC);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 VC(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 KC(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as GC}from"node:fs";var Xo=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=$t(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=GC(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 HC={selectedTaskId:null,reviewVisible:!1},YC={listTasks:async e=>(await S.listTasks(e)).tasks,syncTasks:async(e,t)=>(await S.prs.discoverOrRefreshMany(e,t),Promise.all(t.map(n=>S.getTask(e,n.id))))},Qo=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??YC,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new Er({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new Xo(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=JC(s);i.length>0&&await this.onTasksChanged(i);let o=zC(s);o.length>0&&await this.wake(o)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new fn({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=HC;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,Hg(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)!==Hg(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 zC(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=ZC(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&QC.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 JC(e){let t=new Set;for(let n of e)n.taskId&&XC(n)&&t.add(n.taskId);return[...t]}function XC(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var QC=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),ZC=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function Hg(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as uA}from"node:module";import tA from"@xterm/headless";var eA=new RegExp("^\x1B\\[(\\d*)S$"),Zo=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=eA.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${`
275
+ `.repeat(a)}${c}\x1B[${o+1};${i+1}H`)}writeRaw(t){return t?new Promise(n=>this.terminal.write(t,n)):Promise.resolve()}};function Yg(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 nA=1e3,Jg=new WeakMap,rA=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function Xg(e){let t=new tA.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:nA,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}});return Jg.set(t,new Zo(t)),t}function Qg(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function ju(e,t){let n=Jg.get(e);return n?n.write(t):new Promise(r=>{e.write(t,r)})}function Zg(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=Yg(e,u);c.push({text:u.getChars()||" ",style:oA(u,o+a===i&&d===n.cursorX),...p?{href:p}:{}})}r.push({segments:sA(iA(c))})}return r}function sA(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&r.href===n.href&&cA(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};n.href&&(s.href=n.href),ey(n.style)||(s.style=n.style),t.push(s)}return t}function iA(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||n.href||!ey(n.style))break;t-=1}return e.slice(0,t)}function oA(e,t){let n={},r=zg(e,"fg"),s=zg(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 zg(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"):rA[s]??aA(s)}function aA(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(lA).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 lA(e){return e===0?0:55+e*40}function cA(e,t){return Mu(e)===Mu(t)}function Mu(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function ey(e){return Mu(e)===""}var dA=uA(import.meta.url),pA=/^CTRL_([A-Z])$/,fA="\x1B[6n",mA="\x1B[c",hA="\x1B[?u",gA={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
276
+ `,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:""},ea=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")qu(i),this.sessions.delete(n);else return this.attachedTabId=n,i.scrollbackLines=0,ty(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(`
277
+ `))&&this.touchActivity(n))}writeKey(t){let n=yA(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&&ty(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&&(qu(n),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())qu(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:wA(n),error:n.error,scrolledBack:n.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}createSession(t,n,r,s){let i=this.spawn??TA().spawn,o=Xg(r),a=s??this.resolveSessionSpec(t,n),l=wo({...this.env,...a.env??{}}),{executable:c,args:d}=bA(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:RA(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),PA(u,h),ju(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),ju(p.terminal,`\r
278
+ [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 yA(e){if(e.length===1)return e;let t=gA[e];if(t!==void 0)return t;let n=pA.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function ty(e,t){kA(e.pty,t),Qg(e.terminal,t),e.screenDirty=!0}function wA(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=Zg(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function qu(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function kA(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function TA(){return dA("node-pty")}function bA(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[ko(t[0],n),...t.slice(1)].map(ny).join(" ")}; exec ${ny(e)} -l`;return{executable:e,args:["-lc",s]}}function ny(e){return`'${e.replaceAll("'","'\\''")}'`}function RA(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 PA(e,t){for(let n=0;n<Uu(t,fA);n+=1)e.write("\x1B[1;1R");for(let n=0;n<Uu(t,mA);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<Uu(t,hA);n+=1)e.write("\x1B[?0u")}function Uu(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 ta=Sn,AA=16,EA=250;async function iy(e){let t=xe(e.paths);await DA(t,e.paths,e.spawnDaemon);let n=await fy(t.socketPath),r=new Bu(n,e);return await r.ready(),r}async function oy(e,t={}){let n=xe(e);await IA(e.runtimeDir,{recursive:!0}),await Ms(n.socketPath,{force:!0});let r=new Wu(e,t),s=SA(i=>r.handleConnection(i));try{await r.start(),await LA(s,n.socketPath),await vA(n.pidPath,String(process.pid),"utf8"),await de.appendLogBestEffort(e,{level:"info",component:"daemon",event:"started",message:`PTY daemon started with protocol ${ta}.`,details:{pid:process.pid,protocolVersion:ta}}),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 Ms(n.socketPath,{force:!0}),await Ms(n.pidPath,{force:!0}),await r.stop(),r.disposeAll()}}async function ay(e){let t=xe(e);return await uy(t.socketPath)?(await FA(t.socketPath),!0):!1}var Bu=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=ta;options;async ready(){let t=await this.send({type:"ping"});if(!cy(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)}
277
279
  `);let i=await s;if(!i.ok)throw new Error(i.error);return i}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
278
280
  `);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
279
- `)}}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=SA(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)}}},qu=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 Qo({...r,workspaceRoot:t.workspaceRoot,activityEnabled:!1,onUpdate:s=>this.handleRuntimeUpdate(s.tabId),onActivity:s=>this.handleActivityUpdate(s),onActivityRemoved:s=>this.handleActivityRemoved(s)})}async start(){let t=await k.load(this.paths);if(this.pullRequestSyncOptions!==!1){let r=this.pullRequestSyncOptions??{},s=r.reconcileEvents===!1?!1:r.reconcileEvents??(()=>ln(this.paths,{agentObserver:{daemonAvailable:!0,getSnapshots:()=>this.runtime.getActivitySnapshots(),subscribe:()=>()=>{},close:()=>{}}}));this.pullRequestEventReconciliationEnabled=!!s,this.pullRequestSyncSupervisor=new Jo(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");(k.previews.isEnabled(t,"agentOrchestration")||n)&&await this.ensureOrchestrationSupervisor()}async stop(){await this.pullRequestSyncSupervisor?.stop(),this.pullRequestSyncSupervisor=null,this.pullRequestEventReconciliationEnabled=!1,this.updateRuntimeActivityEnabled(),await this.orchestrationSupervisor?.stop(),this.orchestrationSupervisor=null}handleConnection(t){let n="";this.clients.add(t),this.subscriptions.set(t,{activityEnabled:!1,tabId:null,view:null,rowKeys:[],pullRequestPollView:{selectedTaskId:null,reviewVisible:!1},navigationEnabled:!1}),t.setEncoding("utf8"),t.on("data",s=>{n+=String(s);let i=n.indexOf(`
281
+ `)}}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=NA(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)}}},Wu=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 ea({...r,workspaceRoot:t.workspaceRoot,activityEnabled:!1,onUpdate:s=>this.handleRuntimeUpdate(s.tabId),onActivity:s=>this.handleActivityUpdate(s),onActivityRemoved:s=>this.handleActivityRemoved(s)})}async start(){let t=await k.load(this.paths);if(this.pullRequestSyncOptions!==!1){let r=this.pullRequestSyncOptions??{},s=r.reconcileEvents===!1?!1:r.reconcileEvents??(()=>ln(this.paths,{agentObserver:{daemonAvailable:!0,getSnapshots:()=>this.runtime.getActivitySnapshots(),subscribe:()=>()=>{},close:()=>{}}}));this.pullRequestEventReconciliationEnabled=!!s,this.pullRequestSyncSupervisor=new Qo(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 Ye(this.paths)).some(r=>r.state==="queued"||r.state==="delivering");(k.previews.isEnabled(t,"agentOrchestration")||n)&&await this.ensureOrchestrationSupervisor()}async stop(){await this.pullRequestSyncSupervisor?.stop(),this.pullRequestSyncSupervisor=null,this.pullRequestEventReconciliationEnabled=!1,this.updateRuntimeActivityEnabled(),await this.orchestrationSupervisor?.stop(),this.orchestrationSupervisor=null}handleConnection(t){let n="";this.clients.add(t),this.subscriptions.set(t,{activityEnabled:!1,tabId:null,view:null,rowKeys:[],pullRequestPollView:{selectedTaskId:null,reviewVisible:!1},navigationEnabled:!1}),t.setEncoding("utf8"),t.on("data",s=>{n+=String(s);let i=n.indexOf(`
280
282
  `);for(;i!==-1;){let o=n.slice(0,i);n=n.slice(i+1),this.handleLine(t,o),i=n.indexOf(`
281
- `)}});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{mn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);mn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion: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);mn(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 $A(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(Bu),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)mn(n,{type:"tasksChanged",taskIds:t})}broadcastOpenFile(t,n){let r=0;for(let[s,i]of this.subscriptions)s===t||!i.navigationEnabled||(mn(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)},bA))}}handleActivityRemoved(t){this.pullRequestSyncSupervisor?.notifyActivityRemoved(t);let n=this.activityTimers.get(t);n&&(clearTimeout(n),this.activityTimers.delete(t)),this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&mn(r,{type:"activityRemoved",tabId:t})}broadcastActivity(t){let n=this.pendingActivities.get(t);if(n){this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&mn(r,{type:"activity",snapshot:n})}}hasActivitySubscribers(){return[...this.subscriptions.values()].some(t=>t.activityEnabled)}clearPendingActivityBroadcasts(){for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear()}async ensureOrchestrationSupervisor(){this.orchestrationSupervisor||(this.orchestrationSupervisorStartup||(this.orchestrationSupervisorStartup=this.startOrchestrationSupervisor().finally(()=>{this.orchestrationSupervisorStartup=null})),this.orchestrationSupervisor=await this.orchestrationSupervisorStartup,this.updateRuntimeActivityEnabled())}async startOrchestrationSupervisor(){let t=new Yo(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)},TA))}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=RA(s,n),o=PA(s.view,n);s.view=n,s.rowKeys=n.rows.map(Bu),(i.rows.length>0||o)&&mn(r,{type:"update",tabId:t,patch:i})}}};function RA(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==Bu(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 PA(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 SA(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function Bu(e){return JSON.stringify(e)}async function IA(e,t,n){if(await vA(e.socketPath,1e3))return;if(await iy(e.socketPath)){let i=await oy(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 CA(e,t),To(t,n);let r=Date.now();for(;Date.now()-r<5e3;){if(await ry(e.socketPath))return;await cy(50)}let s=await Zg(kA.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${s?`
282
- ${s.slice(-2e3)}`:""}`)}async function ry(e){let t=await oy(e).catch(()=>null);return t?.ok===!0&&sy(t.protocolVersion)}function sy(e){return Xt(e)}async function vA(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await ry(e))return!0;await cy(50)}return!1}async function CA(e,t){let n=await Zg(e.pidPath,"utf8").catch(()=>null);if(n){let r=Number(n.trim());if(Number.isInteger(r)&&r>0&&OA(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 Ms(e.socketPath,{force:!0}),await Ms(e.pidPath,{force:!0})}async function iy(e){let t=await ly(e).catch(()=>null);return t?(t.end(),!0):!1}async function AA(e){await ay(e,{id:1,type:"shutdown"}).catch(()=>null)}async function oy(e){return ay(e,{id:1,type:"ping"})}function ay(e,t){return new Promise((n,r)=>{let s=Qg(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)}
283
+ `)}});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{mn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);mn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion:ta,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);mn(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 jA(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(Vu),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)mn(n,{type:"tasksChanged",taskIds:t})}broadcastOpenFile(t,n){let r=0;for(let[s,i]of this.subscriptions)s===t||!i.navigationEnabled||(mn(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)},EA))}}handleActivityRemoved(t){this.pullRequestSyncSupervisor?.notifyActivityRemoved(t);let n=this.activityTimers.get(t);n&&(clearTimeout(n),this.activityTimers.delete(t)),this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&mn(r,{type:"activityRemoved",tabId:t})}broadcastActivity(t){let n=this.pendingActivities.get(t);if(n){this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&mn(r,{type:"activity",snapshot:n})}}hasActivitySubscribers(){return[...this.subscriptions.values()].some(t=>t.activityEnabled)}clearPendingActivityBroadcasts(){for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear()}async ensureOrchestrationSupervisor(){this.orchestrationSupervisor||(this.orchestrationSupervisorStartup||(this.orchestrationSupervisorStartup=this.startOrchestrationSupervisor().finally(()=>{this.orchestrationSupervisorStartup=null})),this.orchestrationSupervisor=await this.orchestrationSupervisorStartup,this.updateRuntimeActivityEnabled())}async startOrchestrationSupervisor(){let t=new Jo(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)},AA))}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=OA(s,n),o=$A(s.view,n);s.view=n,s.rowKeys=n.rows.map(Vu),(i.rows.length>0||o)&&mn(r,{type:"update",tabId:t,patch:i})}}};function OA(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==Vu(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 $A(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 NA(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function Vu(e){return JSON.stringify(e)}async function DA(e,t,n){if(await _A(e.socketPath,1e3))return;if(await uy(e.socketPath)){let i=await dy(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 xA(e,t),To(t,n);let r=Date.now();for(;Date.now()-r<5e3;){if(await ly(e.socketPath))return;await my(50)}let s=await sy(CA.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${s?`
284
+ ${s.slice(-2e3)}`:""}`)}async function ly(e){let t=await dy(e).catch(()=>null);return t?.ok===!0&&cy(t.protocolVersion)}function cy(e){return Xt(e)}async function _A(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await ly(e))return!0;await my(50)}return!1}async function xA(e,t){let n=await sy(e.pidPath,"utf8").catch(()=>null);if(n){let r=Number(n.trim());if(Number.isInteger(r)&&r>0&&MA(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 Ms(e.socketPath,{force:!0}),await Ms(e.pidPath,{force:!0})}async function uy(e){let t=await fy(e).catch(()=>null);return t?(t.end(),!0):!1}async function FA(e){await py(e,{id:1,type:"shutdown"}).catch(()=>null)}async function dy(e){return py(e,{id:1,type:"ping"})}function py(e,t){return new Promise((n,r)=>{let s=ry(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)}
283
285
  `)),s.once("error",l=>{a(),r(l)}),s.on("data",l=>{i+=String(l);let c=i.indexOf(`
284
- `);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 ly(e){return new Promise((t,n)=>{let r=Qg(e);r.once("connect",()=>t(r)),r.once("error",n)})}function EA(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,n)})}function mn(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
285
- `)}catch{}}function OA(e){try{return process.kill(e,0),!0}catch{return!1}}function cy(e){return new Promise(t=>setTimeout(t,e))}function $A(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var Wu=["Runners","Feature Previews","Logs","Help"],dy={agentOrchestration:"Agent orchestration",fileOpen:"Agent file opening",piRunner:"Pi coding agent runner",panelPolish:"Panel polish"};function Vu(e,t){return Uu(e).map(n=>{let r=k.runners.getProfile(n),s=e.runners?.[n]?.enabled!==!1,i=e.runners?.[n]?.path?.trim(),o=t.pathEdit?.runner===n?`${t.pathEdit.value}_`:i&&i.length>0?i:`default (${r.executable})`;return`${r.displayName} ${s?"enabled":"disabled"} ${o}`})}function py(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 fy(e){return Xe.map(t=>`${k.previews.isEnabled(e,t)?"[x]":"[ ]"} ${dy[t]}`)}function my(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function hy(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"}:ea(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"logs"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function gy(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(!ea(n))return{kind:"noop",state:e};let r=Xe[e.menuIndex]??Xe[0],s=!k.previews.isEnabled(t,r);return{kind:"save-enabled",feature:r,enabled:s,state:{...e,message:`${dy[r]} ${s?"enabled":"disabled"}.`}}}function yy(e,t,n,r){if(e.pathEdit)return NA({...e,pathEdit:e.pathEdit},t,n);let s=Vu(t,e).length;if(n==="UP"||n==="k")return{kind:"render",state:{...e,menuIndex:Math.max(0,e.menuIndex-1),message:null}};if(n==="DOWN"||n==="j")return{kind:"render",state:{...e,menuIndex:Math.min(s-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(n==="e"){let a=Uu(t)[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:a,value:t.runners?.[a]?.path??""}}}}if(!ea(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:`${k.runners.getProfile(i).displayName} ${o?"disabled":"enabled"}.`}}}function Uu(e){return ue.filter(t=>t!=="pi"||k.previews.isEnabled(e,"piRunner"))}function NA(e,t,n){if(n==="ESCAPE")return{kind:"render",state:uy({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(ea(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:r,path:s.length>0?s:null,state:uy({...e,message:s.length>0?`${k.runners.getProfile(r).displayName} executable saved.`:`${k.runners.getProfile(r).displayName} executable reset to default.`})}}return DA(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function uy(e){let t={...e};return delete t.pathEdit,t}function ea(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
286
- `}function DA(e){return e.length===1&&e>=" "&&e!==""}import js from"node:path";function wy(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 ky="\u{F024B} ",Ty="\u{F0DCF} ",by="\u25CB",Ku="\uEA64",Ry="\uEAFE",Py="\uEBDA",Gu="\u25CB",Hu="\u25CF",Yu="\u2713",zu="\u2715";function Sy(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 Ju=150,Iy=6;var na="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 Ey(e,t,n){let r=FA(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=kE(t.tasks),d=jA(e,a),u=MA(e,a,d,n),p=u.find(y=>y.id===d)??u[0]??{id:"agent",label:"CODEX"},h=t.inspection?.taskId===a?.id?t.inspection:null,f=s?.name??"no repo",m=a?k.runners.getDisplayName(a.runner):k.runners.getDisplayName(e.selectedRunner);return{inputMode:e.inputMode,modalInput:e.taskPromptInput!==null||e.workspaceBrowser!==null,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,footerToast:e.footerToast,terminal:e.terminal,footerText:e.workspaceBrowser!==null?e.workspaceBrowser.query!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} Search: ${e.workspaceBrowser.query} \u2191\u2193 move Enter select Esc clear search`:`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up / search Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK [${e.taskPromptTarget?.name??s?.name??"no workspace"}] \xB7 ${k.runners.getDisplayName(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${k.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:Ns(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===V?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${k.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:js.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${js.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:m},leftTree:_A(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>TE(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:f,agent:m},centerTranscript:LA(d,e,s,a,e.workspaceBrowser,h,r),tabs:u,rightContext:wE(s,a),rightInspection:QA(e,a,h)}}function _A(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 xA(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=_o(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 Os(c)){let p=e.selectedLeftItemId===`task:${d.id}`,h=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,f={id:`task:${d.id}`,taskId:d.id,text:n?h:`${p?"\u25B8":"\u2022"} ${h}`,indent:u===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:sr(d,n.snapshots,n.now),activityAnimationFrame:n.animationFrame}:{}},m=$y(d);m&&(f.prBadge=m),r.push(f)}if(o.kind==="project"){let d=`new-task-workspace:${o.id}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Project Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}if(o.kind==="repo"){let d=`new-task:${o.primaryRepoId}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}else{r.push({text:` Repos (${l.length})`,indent:0,muted:!0});for(let d of l.slice(0,6)){let u=t.repos.find(p=>p.id===d);r.push({text:` \xB7 ${u?.name??d}`,indent:0,muted:!0})}l.length>6&&r.push({text:` \xB7 ${l.length-6} more`,indent:0,muted:!0})}}let i=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&e.focusedRegion==="tasks"}),r}function xA(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=xo(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 Os(l)){let h=t.selectedLeftItemId===`task:${u.id}`,f=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,m={id:`task:${u.id}`,taskId:u.id,text:s?f:`${h?"\u25B8":"\u2022"} ${f}`,indent:p===0?2:4,selected:h,focused:h&&t.focusedRegion==="tasks",...s?{activity:sr(u,s.snapshots,s.now),activityAnimationFrame:s.animationFrame}:{}},y=$y(u);y&&(m.prBadge=y),e.push(m)}let c=`new-task:${o.id}`,d=t.selectedLeftItemId===c;e.push({id:c,text:`+ New Task [${k.runners.getDisplayName(t.selectedRunner)}]`,indent:2,selected:d,focused:d&&t.focusedRegion==="tasks",muted:!d})}let i=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&t.focusedRegion==="tasks"}),e}function FA(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 LA(e,t,n,r,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(u=>u.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((u,p)=>{let h=p===s.selectedIndex?"\u25B8":" ",f=u.kind==="repo"?" [git repo]":"/";return`${h} ${u.name}${f}`}),d=s.query!==null?`Search: ${s.query}\u2588`:"";return ft(["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 ft(["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 ft([`No tasks in ${c}.`,"",`Press n or choose + New ${d} to create one with ${k.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?ft([`${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."]):ft([`${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===V&&t.openInspectionKind==="file"?UA(r,i,t.fileScrollOffset):e===V&&t.openInspectionKind==="diff"?WA(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?ft(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):ft(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function MA(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:qA(o),...o.kind==="agent"&&r&&t?{activity:Jt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame}:{}}))??[];if(!t)return[{id:na,label:"EMPTY",active:n===na,focused:e.focusedRegion==="center"&&n===na}];let i=e.openInspectionKind||n===V?[{id:V,label:BA(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function jA(e,t){return t?t.ptyTabs.some(n=>n.id===e.activeTab)||e.activeTab===V&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??V:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??V:na}function qA(e){return e.title.toUpperCase()}function BA(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?js.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function UA(e,t,n){if(!e)return ft(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return ft(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=Oy(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:""},...VA(r.lines,n,s)]}function WA(e,t,n){if(!e)return ft(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return ft(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=Oy(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:""},...KA(r.lines,n,s)]}function ft(e){return e.map(t=>({text:t}))}function VA(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}},...Xu(i,n)],tone:"default"}})}function KA(e,t,n){let r=GA(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>HA(i,n))}function GA(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 HA(e,t){let n=vy(e.oldNumber),r=vy(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?zA(Xu(e.text,t),i.bg,i.fallbackFg):Xu(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 vy(e){return e===null?" ":String(e).padStart(4," ")}function Oy(e){let t=js.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 Xu(e,t){return t==="diff"?YA(e):t==="markdown"?JA(e):t==="json"?Qu(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?Qu(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 YA(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 zA(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function JA(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:fe.markup,bold:!0}}]:Qu(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function Qu(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:XA(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function XA(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 QA(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"?Ny(t.repoTargets??[]):s?.pullRequest??(t?G(t):null),o=[ZA(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=xy(e,t,n),l=Zu(e,n),c=aE([{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,...hE(e,n)]}:{title:"",rows:[...o,...Zu(e,n)]}}function ZA(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=ed(t),o=td(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function Cy(e){return[{text:" "},ed(e),{text:" "},td(e)]}function $y(e){if(e.type==="project"&&e.repoTargets?.length){let n=Ny(e.repoTargets);return n?Cy(n):null}let t=G(e);return t?.number?Cy(t):null}function Ny(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=tE(n);return{number:-1,status:eE(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 eE(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 tE(e){let t=e.map(n=>Dy(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 ed(e){return!e||!e.number?{text:by,style:{fg:"565f89"}}:e.status==="merged"?{text:Ry,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:Py,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:Ku,style:{fg:"565f89"}}:{text:Ku,style:{fg:"9ece6a"}}}function td(e){return e?.aggregateReadiness?Ay(e.aggregateReadiness):Ay(Dy(e))}function Ay(e){return e==="failed"?{text:zu,style:{fg:"f7768e"}}:e==="pending"?{text:Hu,style:{fg:"e0af68"}}:e==="success"?{text:Yu,style:{fg:"9ece6a"}}:{text:Gu,style:{fg:"565f89"}}}function Dy(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")?_y(e)?"failed":nE(e)?"success":"pending":"pending"}function nE(e){return!!(e.mergeable&&!e.draft&&!_y(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function _y(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function xy(e,t,n){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return rE(e,t,n);let r=G(t),s=My("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 ta=32;function rE(e,t,n){let r=[],s=nd(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 f=c.failureReason?c.failureReason.slice(0,14):c.status,m=ta-f.length-1,y=p.length>m?p.slice(0,m-1)+"\u2026":p,T=ta-y.length-f.length;r.push({id:`project-review:${c.repoId}`,text:y+" ".repeat(Math.max(1,T))+f,selected:d,focused:u,muted:!0})}else{let h=ed(c.pullRequest),f=td(c.pullRequest),m=`${h.text} ${f.text}`,y=ta-m.length-1,T=p.length>y?p.slice(0,y-1)+"\u2026":p,R=ta-T.length-m.length,b=T+" ".repeat(Math.max(1,R));r.push({id:`project-review:${c.repoId}`,text:b+m,selected:d,focused:u,segments:[{text:b},{...h,text:h.text},{text:" "},{...f,text:f.text}]})}}let a=s.find(c=>c.repoId===o)??null,l=a?sE(t,a):[];return a?.status==="ready"&&(a.pullRequest.number||l.length>0)&&(r.push({id:"target-detail-spacer",text:""}),r.push(...My("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 nd(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)||Fy(e,r).length>0)}function sE(e,t){return Fy(e,t).filter(n=>n.number!==t.pullRequest.number&&(n.status==="merged"||n.status==="closed"))}function Fy(e,t){let n=iE(t,e.prs);return n?e.prs.filter(r=>r.owner?.toLowerCase()===n.owner&&r.repo?.toLowerCase()===n.repo):[]}function iE(e,t){if(e.pullRequest.owner&&e.pullRequest.repo)return{owner:e.pullRequest.owner.toLowerCase(),repo:e.pullRequest.repo.toLowerCase()};let n=oE(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 oE(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 Ly(e,t,n=null){return 3+xy(e,t,n).length+Zu(e,n).length}function My(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=lE(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:cE(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${jy(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(uE)):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)=>dE(u,r(`comment:${p}`))))),s}function aE(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 lE(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function cE(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function jy(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 uE(e){let{icon:t,color:n}=fE(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," ")} ${mE(e.status)}`,color:n,muted:!1}}function dE(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${jy(e.createdAt)}`:"",s=pE(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 pE(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 fE(e){switch(e){case"success":return{icon:Yu,color:"9ece6a"};case"pending":return{icon:Hu,color:"e0af68"};case"failed":return{icon:zu,color:"f7768e"};case"skipped":return{icon:Gu,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function mE(e){return e==="success"?"passing":e==="failed"?"failing":e}function hE(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=rd(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)?ky:Ty:wy(l.label),p=l.kind==="directory"?"7aa2f7":Sy(l.label),h=" ".repeat(l.depth),f=p?{text:u,style:{fg:p}}:{text:u},m=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:d?{text:l.label,style:{fg:d}}:{text:l.label},y=[{text:h},f,m];return{id:l.path,text:`${h}${u}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:y}})]}function rd(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 Zu(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(gE(t))return yE(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=>qy(i,e,t))))}return n}function gE(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function yE(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=>qy(c,e,t,s.length+1))))}}return n}function qy(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 wE(e,t){return e?t?[{label:"Task",value:t.id},{label:"Repo",value:e.name},{label:"Agent",value:k.runners.getDisplayName(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:js.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 kE(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0,pi:0})}function TE(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function By(e,t,n,r,s=null,i=!1){if(s)return bE(e,t,n,r,s,i);let o=Su(e,t,{centerOnly:r,panelPolish:i});return RE(n,o)?{output:Go(o.rows,n.rows,o.row,o.column),region:o}:null}function bE(e,t,n,r,s,i){let o=dg(e,t,s,{centerOnly:r,panelPolish:i});if(!o||!PE(n,o))return null;let a=n.rows.slice();return{output:o.rows.map(({index:c,row:d})=>a[c]===d?"":(a[c]=d,`\x1B[${o.row+c};${o.column}H${d}`)).join(""),region:{row:o.row,column:o.column,width:o.width,rows:a}}}function RE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function PE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function Uy(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!SE(o,a))return null;!o||!a||(s+=Go(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function SE(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 IE=["tasks","center","inspector"];function vE(e,t,n){if(t==="ESCAPE")return E({state:{...e,fileSearchQuery:null},changed:!0});if(t==="BACKSPACE"||t==="DELETE"){let r=e.fileSearchQuery??"";return E({state:{...e,fileSearchQuery:r.slice(0,-1)},changed:!0})}if(t==="UP"||t==="k"||t==="DOWN"||t==="j")return id(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return ad({...e,fileSearchQuery:null},t,n);if(t.length===1&&t>=" "){let r=(e.fileSearchQuery??"")+t;return E({state:{...e,fileSearchQuery:r},changed:!0})}return E({state:e})}function ad(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return Hh(t)?E({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):E({state:e});if(e.fileSearchQuery!==null)return vE(e,t,n);if(t==="/"&&e.focusedRegion==="inspector"&&e.inspectionMode==="files")return E({state:{...e,fileSearchQuery:""},changed:!0});if(t==="q"||t==="Q")return E({state:e,exit:!0});if(t==="ESCAPE")return E({state:{...e,actionMessage:null},changed:e.actionMessage!==null,pause:!0});if(t==="n"||t==="N")return E({state:{...e,focusedRegion:"tasks",actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0});if((t==="r"||t==="R")&&e.focusedRegion==="tasks"&&(Fo(e.selectedLeftItemId)||Lo(e.selectedLeftItemId)))return E({state:{...e,selectedRunner:Do(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return Wy(e,1);if(t==="SHIFT_TAB"||t==="[")return Wy(e,-1);if(t==="z"||t==="Z")return E({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===V?hn(e,-1,n):id(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===V?hn(e,1,n):id(e,1,n);if(t==="PAGE_UP")return hn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return hn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return hn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return hn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??ht,s=e.centerTabRunner?r.indexOf(e.centerTabRunner):-1,i=s===r.length-1?null:r[s+1];return E({state:{...e,centerTabRunner:i,actionMessage:null},changed:!0})}if((t==="+"||t==="a"||t==="A"||t==="t"||t==="T")&&e.focusedRegion==="center"&&e.selectedTaskId){let r=_E(e,t);return E({state:{...e,preferredPtyTabKind:r,actionMessage:null},changed:!0,createPtyTab:!0,createPtyTabKind:r,createPtyTabRunner:r==="agent"?e.centerTabRunner:null})}if(t==="R"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0});if(t==="o"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review"&&e.selectedTaskId)return E({state:e,openPrUrl:!0});if(t==="X"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Ns(e.selectedLeftItemId)&&e.selectedTaskId)return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Qh(e.selectedLeftItemId)&&e.selectedWorkspaceId)return E({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&Gy(e.activeTab,n.ptyTabIds??[]))return E({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return sd(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return Vy(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return sd(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return Vy(e,1)}if(ut(t)){if(e.focusedRegion==="tasks"&&(Fo(e.selectedLeftItemId)||Lo(e.selectedLeftItemId))){let r=Mo(e.selectedLeftItemId),s=jo(e.selectedLeftItemId);return E({state:{...e,selectedRepoId:r??e.selectedRepoId,selectedWorkspaceId:s??e.selectedWorkspaceId,actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0})}if(e.focusedRegion==="tasks"&&e.selectedLeftItemId==="new-workspace")return E({state:{...e,actionMessage:null},changed:!0,openWorkspaceBrowser:!0});if(e.focusedRegion==="tasks"&&Ns(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return E({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:Sr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&Gy(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return E({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:Sr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===V)return E({state:{...e,actionMessage:null},changed:!0,refreshInspection:!0});if(e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="files"){let r=e.selectedFileTreePath??e.selectedFilePath;if(r&&(n.fileTreeDirectoryIds??[]).includes(r))return E({state:EE({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return E({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:V,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}if(e.focusedRegion==="inspector"&&e.inspectionMode==="review"){let r=e.selectedDiffPath??n.diffPathIds?.[0]??null;return r?E({state:{...e,selectedDiffPath:r,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!n.projectTargetIds?.length?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?E({state:e}):e.selectedActionId==="refresh-checks"?E({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return E({state:e})}function hn(e,t,n){if(t===0)return E({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?Hy(e,t,n):e.inspectionMode==="review"?Ky(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):E({state:e});if(e.focusedRegion==="center"&&e.activeTab===V){if(e.openInspectionKind==="file")return Ky(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return OE(e,t,n)}return E({state:e})}function Wy(e,t){return ra(e,"focusedRegion",IE,t)}function sd(e,t,n){let r=ra(e,"activeTab",n&&n.length>0?n:xE(e),t);return!r.changed||Yh(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:Sr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function id(e,t,n){if(e.focusedRegion==="tasks")return CE(e,t,n.leftItemIds);if(e.focusedRegion==="center")return sd(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return Hy(e,t,n);if(n.projectTargetIds?.length){let s=od(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=od(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:ra(e,"selectedActionId",Uh,t)}return ra(e,"selectedActionId",fu,t)}function CE(e,t,n){let r=od(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=gu(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=Mo(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=jo(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function AE(e,t){if(e.inspectionMode===t)return E({state:e});let n=t==="files"?"file":e.openInspectionKind,r=t==="files"?V:e.activeTab;return E({state:{...e,inspectionMode:t,activeTab:r,openInspectionKind:n,fileScrollOffset:t==="files"?0:e.fileScrollOffset,reviewScrollOffset:t==="review"?0:e.reviewScrollOffset,actionMessage:null},changed:!0,refreshInspection:!0})}function Vy(e,t){return AE(e,DE(e.inspectionMode,mu,t))}function Hy(e,t,n){let r=n.fileTreeRowIds&&n.fileTreeRowIds.length>0?n.fileTreeRowIds:n.filePathIds??[];if(r.length===0)return E({state:e});let s=e.selectedFileTreePath??e.selectedFilePath??r[0]??null,i=r.indexOf(s??""),o=Wt(i===-1?0:i+t,0,r.length-1),a=r[o]??null;if(a===e.selectedFileTreePath)return E({state:e});let l=a!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(a);return E({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?V:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function EE(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 Ky(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]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function OE(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return $E(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?E({state:e}):E({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?E({state:e}):E({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}if(t>0&&o>i){let d=a[l+1]??null;return d?E({state:{...e,selectedDiffPath:d,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===i?E({state:e}):E({state:{...e,diffScrollOffset:i,actionMessage:null},changed:!0})}if(t<0&&o<0){let d=a[l-1]??null;return d?E({state:{...e,selectedDiffPath:d,activeTab:V,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?E({state:e}):E({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let c=Wt(o,0,i);return c===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function $E(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=NE(n.diffPathRanges??[],o)??e.selectedDiffPath;return o===e.diffScrollOffset&&a===e.selectedDiffPath?E({state:e}):E({state:{...e,diffScrollOffset:o,selectedDiffPath:a,actionMessage:null},changed:!0})}function NE(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function ra(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]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function od(e,t,n,r,s=!1){if(n.length===0)return E({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]?E({state:e}):E({state:{...e,[t]:a,actionMessage:null},changed:!0,refreshInspection:s})}function DE(e,t,n){let r=t.indexOf(e);return t[Wt(r+n,0,t.length-1)]??e}function E(e){return{state:e.state,changed:e.changed??!1,exit:e.exit??!1,pause:e.pause??!1,attachTerminal:e.attachTerminal??!1,detachTerminal:e.detachTerminal??!1,beginTaskPrompt:e.beginTaskPrompt??!1,openWorkspaceBrowser:e.openWorkspaceBrowser??!1,createWorkspaceTask:e.createWorkspaceTask??!1,createPtyTab:e.createPtyTab??!1,createPtyTabKind:e.createPtyTabKind??null,createPtyTabRunner:e.createPtyTabRunner??null,closePtyTab:e.closePtyTab??!1,refreshPullRequestChecks:e.refreshPullRequestChecks??!1,closeTask:e.closeTask??!1,removeWorkspace:e.removeWorkspace??!1,refreshInspection:e.refreshInspection??!1,openPrUrl:e.openPrUrl??!1}}function Gy(e,t){return t.includes(e)}function _E(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Sr(e.activeTab)??e.preferredPtyTabKind}function xE(e){return[e.selectedPtyTabId,e.openInspectionKind?V:null].filter(t=>typeof t=="string")}function Wt(e,t,n){return Math.min(n,Math.max(t,e))}var Yy=async(e,t,n,r)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await r.queueTaskMutation(async()=>K(r.paths,e.selectedTaskId,i=>{let o=t??FE(i,e.activeTab,e.preferredPtyTabKind),a=Qy(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"}`}}},zy=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 K(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}`}}},Jy=async(e,t)=>{let n=e.selectedTaskId;n&&await t.queueTaskMutation(async()=>{await K(t.paths,n,r=>!r.ptyTabs.some(s=>s.id===e.activeTab)||r.selectedPtyTabId===e.activeTab?r:{...r,selectedPtyTabId:e.activeTab})})},Xy=async(e,t)=>{let n=e.ptyTabs.find(s=>s.kind==="agent")??null;if(n)return await t.queueTaskMutation(async()=>{await K(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=Qy(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await K(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 FE(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function Qy(e,t,n,r={}){let s=n??e.runner,i=k.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(h=>h.id)),c=1,d=a;for(;l.has(d);)c+=1,d=`${a}-${c}`;let u=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:d,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,r):[],createdAt:u,updatedAt:u}}var Or=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},Zy=async(e,t,n,r,s)=>{k.runners.assertEnabled(r,s.config);let i=t?await s.taskService.provisionProjectTask(s.paths,t,n,{runner:r,config:s.config}):await s.taskService.provisionTask(s.paths,e??"",n,{runner:r,config:s.config});k.previews.isEnabled(s.config,"agentOrchestration")&&await et(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=wo();ko(k.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",d=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new Or(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}},ew=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},tw=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 Lr(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}`}}},nw=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Lr(t.paths,n.id)))),$r=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 rw=async(e,t)=>{if(!e.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");let n=await t.taskService.listTasks(t.paths,{workspaceId:e.selectedWorkspaceId,includeClosed:!0}),r=n.tasks.filter(i=>i.status!=="closed");if(r.length>0)throw new Error(`Close tasks before removing workspace: ${r.map(i=>`${i.id} (${i.status})`).join(", ")}.`);await t.workspaceService.archiveWorkspace(t.paths,e.selectedWorkspaceId);let s=n.tasks.length>0;return s||await t.workspaceService.removeWorkspace(t.paths,e.selectedWorkspaceId,{listTasks:t.taskService.listTasks}),{nextShell:{selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:s?`Archived workspace ${e.selectedWorkspaceId}; closed task history preserved.`:`Removed workspace ${e.selectedWorkspaceId}`}}};var sw=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},iw=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},ow=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var LE=250;function Vt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function Kt(e,t){return qt(t,e.ptyRuntime.getViewState(Nr(e,t)))}function Nr(e,t){let n=Vt(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 Kt(e,Zh(t,e.model))}function aw(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 lw(e,t,n){return aw(e,t,n?{tone:"success",message:n}:null)}function se(e,t,n){return aw(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 Q(e,t){if(!e.uiStateFile)return;e.runtimeState=Kh(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>Gt({uiStateFile:e.uiStateFile},n),()=>Gt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function ME(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=>ME(e,t)}}function ld(e,t){let n=Vt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?rd(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:Mn(e.model),centerTabIds:Jh(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:Ly(t,n,s),pageRows:Math.max(5,qe(e.activeTerminal.width,e.activeTerminal.height).height-X.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:nd(n,s).map(a=>a.repoId)}}async function cw(e,t){await Jy(t,oe(e))}async function Pe(e){e.model=await Ir(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 sa(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 ia(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 Ah(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await Ir(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)},Q(e,e.state.shell),e.render())}function uw(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)&&ia(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()})},LE))}function dw(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=hn(e.state.shell,n,ld(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:I(e,r.state)},Q(e,e.state.shell),e.render(),ia(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)},Q(e,e.state.shell),e.render()}},16)))}function cd(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function ud(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 fw(e){ud(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.render())})}async function mw(e,t){let n=I(e,t),r=Vt(e.model.tasks,n),s=Nr(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,Bt(qe(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),n.centerZoomed));return qt({...n,inputMode:"control"},o)}function dd(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 pd(e,t){try{let n=I(e,t),r=Vt(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 pw(e,r),await Pe(e),s=r.selectedPtyTabId)}r&&!s&&(r=await pw(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))},Q(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,Bt(qe(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),i.centerZoomed));e.suppressTerminalEnterOnAttach=Ut(s),e.lastTerminalKey=null,e.state={mode:"main",shell:qt({...i,inputMode:"terminal"},o)},Q(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 jE(e,t.selectedTaskId,r).catch(()=>{}),await Pe(e).catch(()=>{})),e.state={mode:"main",shell:se(e,Gh(I(e,t),r),r)},Q(e,e.state.shell)}e.render()}async function jE(e,t,n){await ew(t,n,oe(e))}async function hw(e,t,n,r){let s=I(e,t),{nextShell:i}=await Yy(s,n,r,oe(e));return await Pe(e),I(e,{...s,...i})}async function gw(e,t){let n=I(e,t),{closedTab:r,nextShell:s}=await zy(n,oe(e));return e.ptyRuntime.disposeSession(r.id),await Pe(e),I(e,{...n,...s})}async function yw(e,t){let n=I(e,t),r=Mn(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await tw(n,oe(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Pe(e),I(e,{...n,...o,selectedLeftItemId:qE(r,Mn(e.model),s)})}async function ww(e,t){let n=I(e,t),{nextShell:r}=await rw(n,oe(e));return await Pe(e),I(e,{...n,...r})}async function pw(e,t){return Xy(t,oe(e))}function oa(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:Kt(e,e.state.shell)},e.render())},16))}function kw(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:Kt(e,e.state.shell)},e.render())}function qE(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 bw(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 nw(s,oe(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)sa(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,$r("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=Vt(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: ${G(a)?.requiredChecks.length??0} reported`)}return I(e,{...lw(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import KE from"node:path";import{readdir as BE,stat as UE}from"node:fs/promises";import Pw from"node:path";async function WE(e){let t=await BE(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=Pw.join(e,r.name);n.push({name:r.name,path:s,kind:await VE(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 Sw(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function Iw(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 aa(e,t){let n=await WE(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 VE(e){let t=Pw.join(e,".git");return await UE(t).catch(()=>null)!==null}function vw(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function Cw(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function GE(e){if(e.state.mode!=="main"||e.creatingTask)return;let t=e.state.shell,n=t.taskPromptInput?.trim()??"",r=t.taskPromptTarget;if(!r||!r.repoId&&!r.workspaceId){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 ${r.name}...`})},e.render();let s=null;try{let i=await Zy(r.repoId,r.workspaceId,n,t.selectedRunner,oe(e));s=i.task,await Pe(e);let o=I(e,{...e.state.shell,...i.nextShell,selectedLeftItemId:`task:${s.id}`,inputMode:"terminal",taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null}),a=await e.ptyRuntime.ensureSession(s.id,o.selectedPtyTabId??Og(s,"agent"),Bt(qe(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Ut(o.selectedPtyTabId),e.state={mode:"main",shell:qt(o,a)},Q(e,e.state.shell)}catch(i){i instanceof Or&&(s=i.task);let o=ie(e,"create task",i,"Failed to create task.");s&&!(i instanceof Or)?(await K(e.paths,s.id,a=>({...a,status:"draft",runnerSession:{...a.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:o})).catch(()=>{}),await Pe(e).catch(()=>{})):s&&(await K(e.paths,s.id,a=>({...a,lastFailureReason:o})).catch(()=>{}),await Pe(e).catch(()=>{})),e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,inputMode:"control",selectedTaskId:s?.id??e.state.shell.selectedTaskId,selectedPtyTabId:s?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:s?`task:${s.id}`:e.state.shell.selectedLeftItemId,activeTab:s?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:s?null:"",taskPromptError:o,actionMessage:null}),o)}}finally{e.creatingTask=!1,e.render()}}function HE(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,taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(ut(t)){GE(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:Do(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}hu(t)&&(e.state={mode:"main",shell:I(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function YE(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=Sw(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"){aa(e,KE.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")){aa(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},Q(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 zE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=hy(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;JE(e,r)}}}async function JE(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 XE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=yy(vw(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"?sw(n.runner,n.enabled,oe(e)):iw(n.runner,n.path,oe(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:I(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),runnerOptions:n.state},e.render())}).catch(s=>{if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let i=ie(e,"save runner option",s,"Failed to save runner option.");e.state={...e.state,shell:se(e,I(e,e.state.shell),i),runnerOptions:{...vw(e),message:i}},e.render()})}function QE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=gy(Cw(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}ow(n.feature,n.enabled,oe(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:I(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),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:{...Cw(e),message:s}},e.render()})}}function Aw(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){HE(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){YE(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){e0(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=ad(e.state.shell,n,ld(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)},Q(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)},Q(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&ut(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Fs(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(ZE(e,n))return;e.lastTerminalKey=$g(n)?{key:n,at:Date.now()}:null;let i=Ng(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){oa(e,i);return}hu(n)&&(e.state.shell.terminal.scrolledBack||e.pendingScrollLines<0)&&Ut(e.state.shell.selectedPtyTabId)&&kw(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){let s=I(e,r.state),i=e.model.workspaces?.find(a=>a.id===s.selectedWorkspaceId),o=e.model.repos.find(a=>a.id===s.selectedRepoId);e.state={mode:"main",shell:{...s,taskPromptTarget:{workspaceId:i?.id??null,repoId:o?.id??null,name:i?.name??o?.name??"no workspace"}}},Q(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){aa(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){hw(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{pd(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){gw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Q(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},Q(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=Vt(e.model.tasks,r.state),i=s?G(s)?.url??null:null;i?Iw(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){yw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Q(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){ww(e,r.state).then(s=>{e.state={mode:"main",shell:s},Q(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){pd(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:I(e,r.state)},Q(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){uw(e,e.state.shell);return}ia(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)},cw(e,e.state.shell).catch(()=>{}),Q(e,e.state.shell),e.render());return}if(e.state.variant==="help"){e.state.viaOptions&&e.state.parentVariant?e.state={mode:"overlay",variant:"options",menuIndex:3,optionsMessage:null,shell:e.state.shell,parentVariant:e.state.parentVariant}:e.state.parentVariant?e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell}:e.state={mode:"main",shell:I(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){zE(e,n);return}if(e.state.variant==="runners"){XE(e,n);return}if(e.state.variant==="previews"){QE(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;mw(e,s).then(i=>{e.state.mode!=="main"||e.state.shell!==s||(e.state={mode:"main",shell:i},Q(e,e.state.shell),e.render())}).catch(i=>{if(e.state.mode!=="main"||e.state.shell!==s)return;let o=ie(e,"warm selected PTY",i,"Failed to start selected PTY.");e.state={mode:"main",shell:se(e,I(e,e.state.shell),o)},Q(e,e.state.shell),e.render()})}):fw(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 Ew(e,t){let n=Lg(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=Fs(i);if(o){$w(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(Ou(i)){e.pendingTerminalKeySequence.raw=i,Ow(e);return}la(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"})},Q(e,e.state.shell),e.render();return}let r=Dg(n);if(r!==0){oa(e,r);return}let s=Fs(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
286
+ `);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 fy(e){return new Promise((t,n)=>{let r=ry(e);r.once("connect",()=>t(r)),r.once("error",n)})}function LA(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,n)})}function mn(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
287
+ `)}catch{}}function MA(e){try{return process.kill(e,0),!0}catch{return!1}}function my(e){return new Promise(t=>setTimeout(t,e))}function jA(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var gy=["Runners","Feature Previews","Logs","Help"],yy=["piRunner","fileOpen","panelPolish"],wy={agentOrchestration:"Agent orchestration",fileOpen:"Agent file opening",piRunner:"Pi coding agent runner",panelPolish:"Panel polish"};function Gu(e,t){return Ku(e).map(n=>{let r=k.runners.getProfile(n),s=e.runners?.[n]?.enabled!==!1,i=e.runners?.[n]?.path?.trim(),o=t.pathEdit?.runner===n?`${t.pathEdit.value}_`:i&&i.length>0?i:`default (${r.executable})`;return`${r.displayName} ${s?"enabled":"disabled"} ${o}`})}function ky(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 Ty(e=[]){let t=yy.some(n=>!e.includes(n));return gy.map((n,r)=>r===1&&t?`${n} \xB7 NEW`:n)}function by(e,t=[]){return De.map(n=>{let r=k.previews.isEnabled(e,n),s=yy.includes(n)&&!t.includes(n);return`${r?"[x]":"[ ]"} ${wy[n]}${s?" \xB7 NEW":""}`})}function Ry(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function Py(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(gy.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:na(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"logs"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function Sy(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(De.length-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(!na(n))return{kind:"noop",state:e};let r=De[e.menuIndex]??De[0],s=!k.previews.isEnabled(t,r);return{kind:"save-enabled",feature:r,enabled:s,state:{...e,message:`${wy[r]} ${s?"enabled":"disabled"}.`}}}function Iy(e,t,n,r){if(e.pathEdit)return qA({...e,pathEdit:e.pathEdit},t,n);let s=Gu(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=Ku(t)[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:a,value:t.runners?.[a]?.path??""}}}}if(!na(n))return{kind:"noop",state:e};let i=Ku(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:`${k.runners.getProfile(i).displayName} ${o?"disabled":"enabled"}.`}}}function Ku(e){return ue.filter(t=>t!=="pi"||k.previews.isEnabled(e,"piRunner"))}function qA(e,t,n){if(n==="ESCAPE")return{kind:"render",state:hy({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(na(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:r,path:s.length>0?s:null,state:hy({...e,message:s.length>0?`${k.runners.getProfile(r).displayName} executable saved.`:`${k.runners.getProfile(r).displayName} executable reset to default.`})}}return UA(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function hy(e){let t={...e};return delete t.pathEdit,t}function na(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
288
+ `}function UA(e){return e.length===1&&e>=" "&&e!==""}var BA=/^\d+\.\d+\.\d+$/;async function vy(e,t={runCommand:K}){if(!BA.test(e))throw new Error(`Cannot install invalid Craig version: ${e}`);await t.runCommand("npm",["install","--global",`craig-cli@${e}`])}import js from"node:path";function Cy(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 Ay="\u{F024B} ",Ey="\u{F0DCF} ",Oy="\u25CB",Hu="\uEA64",$y="\uEAFE",Ny="\uEBDA",Yu="\u25CB",zu="\u25CF",Ju="\u2713",Xu="\u2715";function Dy(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 Qu=150,_y=6;var sa="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=KA(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=AE(t.tasks),d=YA(e,a),u=HA(e,a,d,n),p=u.find(y=>y.id===d)??u[0]??{id:"agent",label:"CODEX"},h=t.inspection?.taskId===a?.id?t.inspection:null,f=s?.name??"no repo",m=a?k.runners.getDisplayName(a.runner):k.runners.getDisplayName(e.selectedRunner);return{inputMode:e.inputMode,modalInput:e.taskPromptInput!==null||e.workspaceBrowser!==null,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,footerToast:e.footerToast,terminal:e.terminal,footerText:e.workspaceBrowser!==null?e.workspaceBrowser.query!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} Search: ${e.workspaceBrowser.query} \u2191\u2193 move Enter select Esc clear search`:`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up / search Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK [${e.taskPromptTarget?.name??s?.name??"no workspace"}] \xB7 ${k.runners.getDisplayName(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${k.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:Ns(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===V?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${k.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:js.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${js.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:m},leftTree:WA(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>EE(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:f,agent:m},centerTranscript:GA(d,e,s,a,e.workspaceBrowser,h,r),tabs:u,rightContext:CE(s,a),rightInspection:aE(e,a,h)}}function WA(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=xo(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 Os(c)){let p=e.selectedLeftItemId===`task:${d.id}`,h=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,f={id:`task:${d.id}`,taskId:d.id,text:n?h:`${p?"\u25B8":"\u2022"} ${h}`,indent:u===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:sr(d,n.snapshots,n.now),activityAnimationFrame:n.animationFrame}:{}},m=qy(d);m&&(f.prBadge=m),r.push(f)}if(o.kind==="project"){let d=`new-task-workspace:${o.id}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Project Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}if(o.kind==="repo"){let d=`new-task:${o.primaryRepoId}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}else{r.push({text:` Repos (${l.length})`,indent:0,muted:!0});for(let d of l.slice(0,6)){let u=t.repos.find(p=>p.id===d);r.push({text:` \xB7 ${u?.name??d}`,indent:0,muted:!0})}l.length>6&&r.push({text:` \xB7 ${l.length-6} more`,indent:0,muted:!0})}}let i=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&e.focusedRegion==="tasks"}),r}function 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=Fo(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 Os(l)){let h=t.selectedLeftItemId===`task:${u.id}`,f=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,m={id:`task:${u.id}`,taskId:u.id,text:s?f:`${h?"\u25B8":"\u2022"} ${f}`,indent:p===0?2:4,selected:h,focused:h&&t.focusedRegion==="tasks",...s?{activity:sr(u,s.snapshots,s.now),activityAnimationFrame:s.animationFrame}:{}},y=qy(u);y&&(m.prBadge=y),e.push(m)}let c=`new-task:${o.id}`,d=t.selectedLeftItemId===c;e.push({id:c,text:`+ New Task [${k.runners.getDisplayName(t.selectedRunner)}]`,indent:2,selected:d,focused:d&&t.focusedRegion==="tasks",muted:!d})}let i=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&t.focusedRegion==="tasks"}),e}function KA(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 GA(e,t,n,r,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(u=>u.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((u,p)=>{let h=p===s.selectedIndex?"\u25B8":" ",f=u.kind==="repo"?" [git repo]":"/";return`${h} ${u.name}${f}`}),d=s.query!==null?`Search: ${s.query}\u2588`:"";return ft(["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 ft(["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 ft([`No tasks in ${c}.`,"",`Press n or choose + New ${d} to create one with ${k.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?ft([`${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."]):ft([`${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===V&&t.openInspectionKind==="file"?XA(r,i,t.fileScrollOffset):e===V&&t.openInspectionKind==="diff"?QA(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?ft(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):ft(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function HA(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:zA(o),...o.kind==="agent"&&r&&t?{activity:Jt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame}:{}}))??[];if(!t)return[{id:sa,label:"EMPTY",active:n===sa,focused:e.focusedRegion==="center"&&n===sa}];let i=e.openInspectionKind||n===V?[{id:V,label:JA(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function YA(e,t){return t?t.ptyTabs.some(n=>n.id===e.activeTab)||e.activeTab===V&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??V:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??V:sa}function zA(e){return e.title.toUpperCase()}function JA(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?js.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function XA(e,t,n){if(!e)return ft(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return ft(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=jy(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:""},...ZA(r.lines,n,s)]}function QA(e,t,n){if(!e)return ft(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return ft(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=jy(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:""},...eE(r.lines,n,s)]}function ft(e){return e.map(t=>({text:t}))}function ZA(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}},...Zu(i,n)],tone:"default"}})}function eE(e,t,n){let r=tE(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>nE(i,n))}function tE(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 nE(e,t){let n=xy(e.oldNumber),r=xy(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?sE(Zu(e.text,t),i.bg,i.fallbackFg):Zu(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 xy(e){return e===null?" ":String(e).padStart(4," ")}function jy(e){let t=js.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 Zu(e,t){return t==="diff"?rE(e):t==="markdown"?iE(e):t==="json"?ed(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?ed(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 rE(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 sE(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function iE(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:fe.markup,bold:!0}}]:ed(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function ed(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:oE(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function oE(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 aE(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"?Uy(t.repoTargets??[]):s?.pullRequest??(t?H(t):null),o=[lE(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=Vy(e,t,n),l=td(e,n),c=gE([{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,...SE(e,n)]}:{title:"",rows:[...o,...td(e,n)]}}function lE(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=nd(t),o=rd(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function Fy(e){return[{text:" "},nd(e),{text:" "},rd(e)]}function qy(e){if(e.type==="project"&&e.repoTargets?.length){let n=Uy(e.repoTargets);return n?Fy(n):null}let t=H(e);return t?.number?Fy(t):null}function Uy(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=uE(n);return{number:-1,status:cE(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 cE(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 uE(e){let t=e.map(n=>By(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 nd(e){return!e||!e.number?{text:Oy,style:{fg:"565f89"}}:e.status==="merged"?{text:$y,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:Ny,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:Hu,style:{fg:"565f89"}}:{text:Hu,style:{fg:"9ece6a"}}}function rd(e){return e?.aggregateReadiness?Ly(e.aggregateReadiness):Ly(By(e))}function Ly(e){return e==="failed"?{text:Xu,style:{fg:"f7768e"}}:e==="pending"?{text:zu,style:{fg:"e0af68"}}:e==="success"?{text:Ju,style:{fg:"9ece6a"}}:{text:Yu,style:{fg:"565f89"}}}function By(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")?Wy(e)?"failed":dE(e)?"success":"pending":"pending"}function dE(e){return!!(e.mergeable&&!e.draft&&!Wy(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function Wy(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function Vy(e,t,n){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return pE(e,t,n);let r=H(t),s=Hy("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 ra=32;function pE(e,t,n){let r=[],s=sd(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 f=c.failureReason?c.failureReason.slice(0,14):c.status,m=ra-f.length-1,y=p.length>m?p.slice(0,m-1)+"\u2026":p,T=ra-y.length-f.length;r.push({id:`project-review:${c.repoId}`,text:y+" ".repeat(Math.max(1,T))+f,selected:d,focused:u,muted:!0})}else{let h=nd(c.pullRequest),f=rd(c.pullRequest),m=`${h.text} ${f.text}`,y=ra-m.length-1,T=p.length>y?p.slice(0,y-1)+"\u2026":p,R=ra-T.length-m.length,b=T+" ".repeat(Math.max(1,R));r.push({id:`project-review:${c.repoId}`,text:b+m,selected:d,focused:u,segments:[{text:b},{...h,text:h.text},{text:" "},{...f,text:f.text}]})}}let a=s.find(c=>c.repoId===o)??null,l=a?fE(t,a):[];return a?.status==="ready"&&(a.pullRequest.number||l.length>0)&&(r.push({id:"target-detail-spacer",text:""}),r.push(...Hy("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 sd(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)||Ky(e,r).length>0)}function fE(e,t){return Ky(e,t).filter(n=>n.number!==t.pullRequest.number&&(n.status==="merged"||n.status==="closed"))}function Ky(e,t){let n=mE(t,e.prs);return n?e.prs.filter(r=>r.owner?.toLowerCase()===n.owner&&r.repo?.toLowerCase()===n.repo):[]}function mE(e,t){if(e.pullRequest.owner&&e.pullRequest.repo)return{owner:e.pullRequest.owner.toLowerCase(),repo:e.pullRequest.repo.toLowerCase()};let n=hE(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 hE(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 Gy(e,t,n=null){return 3+Vy(e,t,n).length+td(e,n).length}function Hy(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=yE(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:wE(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${Yy(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(kE)):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)=>TE(u,r(`comment:${p}`))))),s}function gE(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 yE(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function wE(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function Yy(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 kE(e){let{icon:t,color:n}=RE(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," ")} ${PE(e.status)}`,color:n,muted:!1}}function TE(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${Yy(e.createdAt)}`:"",s=bE(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 bE(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 RE(e){switch(e){case"success":return{icon:Ju,color:"9ece6a"};case"pending":return{icon:zu,color:"e0af68"};case"failed":return{icon:Xu,color:"f7768e"};case"skipped":return{icon:Yu,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function PE(e){return e==="success"?"passing":e==="failed"?"failing":e}function SE(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=id(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)?Ay:Ey:Cy(l.label),p=l.kind==="directory"?"7aa2f7":Dy(l.label),h=" ".repeat(l.depth),f=p?{text:u,style:{fg:p}}:{text:u},m=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:d?{text:l.label,style:{fg:d}}:{text:l.label},y=[{text:h},f,m];return{id:l.path,text:`${h}${u}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:y}})]}function id(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 td(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(IE(t))return vE(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=>zy(i,e,t))))}return n}function IE(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function vE(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=>zy(c,e,t,s.length+1))))}}return n}function zy(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:k.runners.getDisplayName(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:js.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 AE(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0,pi:0})}function EE(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function Jy(e,t,n,r,s=null,i=!1){if(s)return OE(e,t,n,r,s,i);let o=Au(e,t,{centerOnly:r,panelPolish:i});return $E(n,o)?{output:Yo(o.rows,n.rows,o.row,o.column),region:o}:null}function OE(e,t,n,r,s,i){let o=gg(e,t,s,{centerOnly:r,panelPolish:i});if(!o||!NE(n,o))return null;let a=n.rows.slice();return{output:o.rows.map(({index:c,row:d})=>a[c]===d?"":(a[c]=d,`\x1B[${o.row+c};${o.column}H${d}`)).join(""),region:{row:o.row,column:o.column,width:o.width,rows:a}}}function $E(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function NE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function Xy(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!DE(o,a))return null;!o||!a||(s+=Yo(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function DE(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 _E=["tasks","center","inspector"];function xE(e,t,n){if(t==="ESCAPE")return E({state:{...e,fileSearchQuery:null},changed:!0});if(t==="BACKSPACE"||t==="DELETE"){let r=e.fileSearchQuery??"";return E({state:{...e,fileSearchQuery:r.slice(0,-1)},changed:!0})}if(t==="UP"||t==="k"||t==="DOWN"||t==="j")return ad(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return cd({...e,fileSearchQuery:null},t,n);if(t.length===1&&t>=" "){let r=(e.fileSearchQuery??"")+t;return E({state:{...e,fileSearchQuery:r},changed:!0})}return E({state:e})}function cd(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return Xh(t)?E({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):E({state:e});if(e.fileSearchQuery!==null)return xE(e,t,n);if(t==="/"&&e.focusedRegion==="inspector"&&e.inspectionMode==="files")return E({state:{...e,fileSearchQuery:""},changed:!0});if(t==="q"||t==="Q")return E({state:e,exit:!0});if(t==="ESCAPE")return E({state:{...e,actionMessage:null},changed:e.actionMessage!==null,pause:!0});if(t==="n"||t==="N")return E({state:{...e,focusedRegion:"tasks",actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0});if((t==="r"||t==="R")&&e.focusedRegion==="tasks"&&(Lo(e.selectedLeftItemId)||Mo(e.selectedLeftItemId)))return E({state:{...e,selectedRunner:_o(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return Qy(e,1);if(t==="SHIFT_TAB"||t==="[")return Qy(e,-1);if(t==="z"||t==="Z")return E({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===V?hn(e,-1,n):ad(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===V?hn(e,1,n):ad(e,1,n);if(t==="PAGE_UP")return hn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return hn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return hn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return hn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??gt,s=e.centerTabRunner?r.indexOf(e.centerTabRunner):-1,i=s===r.length-1?null:r[s+1];return E({state:{...e,centerTabRunner:i,actionMessage:null},changed:!0})}if((t==="+"||t==="a"||t==="A"||t==="t"||t==="T")&&e.focusedRegion==="center"&&e.selectedTaskId){let r=WE(e,t);return E({state:{...e,preferredPtyTabKind:r,actionMessage:null},changed:!0,createPtyTab:!0,createPtyTabKind:r,createPtyTabRunner:r==="agent"?e.centerTabRunner:null})}if(t==="R"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0});if(t==="o"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review"&&e.selectedTaskId)return E({state:e,openPrUrl:!0});if(t==="X"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Ns(e.selectedLeftItemId)&&e.selectedTaskId)return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&ng(e.selectedLeftItemId)&&e.selectedWorkspaceId)return E({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&tw(e.activeTab,n.ptyTabIds??[]))return E({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return od(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return Zy(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return od(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return Zy(e,1)}if(Qe(t)){if(e.focusedRegion==="tasks"&&(Lo(e.selectedLeftItemId)||Mo(e.selectedLeftItemId))){let r=jo(e.selectedLeftItemId),s=qo(e.selectedLeftItemId);return E({state:{...e,selectedRepoId:r??e.selectedRepoId,selectedWorkspaceId:s??e.selectedWorkspaceId,actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0})}if(e.focusedRegion==="tasks"&&e.selectedLeftItemId==="new-workspace")return E({state:{...e,actionMessage:null},changed:!0,openWorkspaceBrowser:!0});if(e.focusedRegion==="tasks"&&Ns(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return E({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:Sr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&tw(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return E({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:Sr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===V)return E({state:{...e,actionMessage:null},changed:!0,refreshInspection:!0});if(e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="files"){let r=e.selectedFileTreePath??e.selectedFilePath;if(r&&(n.fileTreeDirectoryIds??[]).includes(r))return E({state:ME({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return E({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:V,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}if(e.focusedRegion==="inspector"&&e.inspectionMode==="review"){let r=e.selectedDiffPath??n.diffPathIds?.[0]??null;return r?E({state:{...e,selectedDiffPath:r,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!n.projectTargetIds?.length?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?E({state:e}):e.selectedActionId==="refresh-checks"?E({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return E({state:e})}function hn(e,t,n){if(t===0)return E({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?nw(e,t,n):e.inspectionMode==="review"?ew(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):E({state:e});if(e.focusedRegion==="center"&&e.activeTab===V){if(e.openInspectionKind==="file")return ew(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return jE(e,t,n)}return E({state:e})}function Qy(e,t){return ia(e,"focusedRegion",_E,t)}function od(e,t,n){let r=ia(e,"activeTab",n&&n.length>0?n:VE(e),t);return!r.changed||Qh(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:Sr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function ad(e,t,n){if(e.focusedRegion==="tasks")return FE(e,t,n.leftItemIds);if(e.focusedRegion==="center")return od(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return nw(e,t,n);if(n.projectTargetIds?.length){let s=ld(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=ld(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:ia(e,"selectedActionId",Hh,t)}return ia(e,"selectedActionId",yu,t)}function FE(e,t,n){let r=ld(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=Tu(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=jo(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=qo(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function LE(e,t){if(e.inspectionMode===t)return E({state:e});let n=t==="files"?"file":e.openInspectionKind,r=t==="files"?V:e.activeTab;return E({state:{...e,inspectionMode:t,activeTab:r,openInspectionKind:n,fileScrollOffset:t==="files"?0:e.fileScrollOffset,reviewScrollOffset:t==="review"?0:e.reviewScrollOffset,actionMessage:null},changed:!0,refreshInspection:!0})}function Zy(e,t){return LE(e,BE(e.inspectionMode,wu,t))}function nw(e,t,n){let r=n.fileTreeRowIds&&n.fileTreeRowIds.length>0?n.fileTreeRowIds:n.filePathIds??[];if(r.length===0)return E({state:e});let s=e.selectedFileTreePath??e.selectedFilePath??r[0]??null,i=r.indexOf(s??""),o=Vt(i===-1?0:i+t,0,r.length-1),a=r[o]??null;if(a===e.selectedFileTreePath)return E({state:e});let l=a!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(a);return E({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?V:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function ME(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 ew(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=Vt(e[t]+n,0,i);return o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function jE(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return qE(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=Vt(o,0,i);return d===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}let l=a.indexOf(e.selectedDiffPath);if(l===-1){let d=Vt(o,0,i);return d===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}if(t>0&&o>i){let d=a[l+1]??null;return d?E({state:{...e,selectedDiffPath:d,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===i?E({state:e}):E({state:{...e,diffScrollOffset:i,actionMessage:null},changed:!0})}if(t<0&&o<0){let d=a[l-1]??null;return d?E({state:{...e,selectedDiffPath:d,activeTab:V,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?E({state:e}):E({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let c=Vt(o,0,i);return c===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function qE(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=Vt(e.diffScrollOffset+t,0,i),a=UE(n.diffPathRanges??[],o)??e.selectedDiffPath;return o===e.diffScrollOffset&&a===e.selectedDiffPath?E({state:e}):E({state:{...e,diffScrollOffset:o,selectedDiffPath:a,actionMessage:null},changed:!0})}function UE(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function ia(e,t,n,r){let s=n.indexOf(e[t]),i=Vt(s+r,0,n.length-1),o=n[i];return!o||o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function ld(e,t,n,r,s=!1){if(n.length===0)return E({state:e});let i=n.indexOf(e[t]??n[0]??""),o=Vt(i===-1?0:i+r,0,n.length-1),a=n[o]??null;return a===e[t]?E({state:e}):E({state:{...e,[t]:a,actionMessage:null},changed:!0,refreshInspection:s})}function BE(e,t,n){let r=t.indexOf(e);return t[Vt(r+n,0,t.length-1)]??e}function E(e){return{state:e.state,changed:e.changed??!1,exit:e.exit??!1,pause:e.pause??!1,attachTerminal:e.attachTerminal??!1,detachTerminal:e.detachTerminal??!1,beginTaskPrompt:e.beginTaskPrompt??!1,openWorkspaceBrowser:e.openWorkspaceBrowser??!1,createWorkspaceTask:e.createWorkspaceTask??!1,createPtyTab:e.createPtyTab??!1,createPtyTabKind:e.createPtyTabKind??null,createPtyTabRunner:e.createPtyTabRunner??null,closePtyTab:e.closePtyTab??!1,refreshPullRequestChecks:e.refreshPullRequestChecks??!1,closeTask:e.closeTask??!1,removeWorkspace:e.removeWorkspace??!1,refreshInspection:e.refreshInspection??!1,openPrUrl:e.openPrUrl??!1}}function tw(e,t){return t.includes(e)}function WE(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Sr(e.activeTab)??e.preferredPtyTabKind}function VE(e){return[e.selectedPtyTabId,e.openInspectionKind?V:null].filter(t=>typeof t=="string")}function Vt(e,t,n){return Math.min(n,Math.max(t,e))}var rw=async(e,t,n,r)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await r.queueTaskMutation(async()=>G(r.paths,e.selectedTaskId,i=>{let o=t??KE(i,e.activeTab,e.preferredPtyTabKind),a=aw(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"}`}}},sw=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 G(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}`}}},iw=async(e,t)=>{let n=e.selectedTaskId;n&&await t.queueTaskMutation(async()=>{await G(t.paths,n,r=>!r.ptyTabs.some(s=>s.id===e.activeTab)||r.selectedPtyTabId===e.activeTab?r:{...r,selectedPtyTabId:e.activeTab})})},ow=async(e,t)=>{let n=e.ptyTabs.find(s=>s.kind==="agent")??null;if(n)return await t.queueTaskMutation(async()=>{await G(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=aw(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await G(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 KE(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function aw(e,t,n,r={}){let s=n??e.runner,i=k.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(h=>h.id)),c=1,d=a;for(;l.has(d);)c+=1,d=`${a}-${c}`;let u=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:d,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,r):[],createdAt:u,updatedAt:u}}var Or=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},lw=async(e,t,n,r,s)=>{k.runners.assertEnabled(r,s.config);let i=t?await s.taskService.provisionProjectTask(s.paths,t,n,{runner:r,config:s.config}):await s.taskService.provisionTask(s.paths,e??"",n,{runner:r,config:s.config});k.previews.isEnabled(s.config,"agentOrchestration")&&await tt(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=wo();ko(k.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",d=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new Or(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}},cw=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},uw=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 Lr(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}`}}},dw=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Lr(t.paths,n.id)))),$r=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 pw=async(e,t)=>{if(!e.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");let n=await t.taskService.listTasks(t.paths,{workspaceId:e.selectedWorkspaceId,includeClosed:!0}),r=n.tasks.filter(i=>i.status!=="closed");if(r.length>0)throw new Error(`Close tasks before removing workspace: ${r.map(i=>`${i.id} (${i.status})`).join(", ")}.`);await t.workspaceService.archiveWorkspace(t.paths,e.selectedWorkspaceId);let s=n.tasks.length>0;return s||await t.workspaceService.removeWorkspace(t.paths,e.selectedWorkspaceId,{listTasks:t.taskService.listTasks}),{nextShell:{selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:s?`Archived workspace ${e.selectedWorkspaceId}; closed task history preserved.`:`Removed workspace ${e.selectedWorkspaceId}`}}};var fw=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},mw=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},hw=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var GE=250;function Kt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function Gt(e,t){return Ut(t,e.ptyRuntime.getViewState(Nr(e,t)))}function Nr(e,t){let n=Kt(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 v(e,t){return Gt(e,rg(t,e.model))}function gw(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:v(e,{...e.state.shell,footerToast:null})},e.render())},600),{...t,footerToast:n}):{...t,footerToast:null}}function yw(e,t,n){return gw(e,t,n?{tone:"success",message:n}:null)}function ie(e,t,n){return gw(e,t,{tone:"error",message:n})}function te(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 Q(e,t){if(!e.uiStateFile)return;e.runtimeState=No(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>ht({uiStateFile:e.uiStateFile},n),()=>ht({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function ud(e,t){if(!e.uiStateFile){e.runtimeState={...No(e.runtimeState,e.state.shell),...t};return}e.runtimeState={...No(e.runtimeState,e.state.shell),...t};let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>ht({uiStateFile:e.uiStateFile},n),()=>ht({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function HE(e,t){let n=e.taskMutationQueue.then(t,t);return e.taskMutationQueue=n.then(()=>{},()=>{}),n}function oe(e){return{paths:e.paths,config:e.config,taskService:S,workspaceService:Te,queueTaskMutation:t=>HE(e,t)}}function dd(e,t){let n=Kt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?id(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:jn(e.model),centerTabIds:eg(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:Gy(t,n,s),pageRows:Math.max(5,Ue(e.activeTerminal.width,e.activeTerminal.height).height-X.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:sd(n,s).map(a=>a.repoId)}}async function ww(e,t){await iw(t,oe(e))}async function Pe(e){e.model=await Ir(e.workspaceRoot,e.state.shell,e.enabledRunnerIds),e.state.mode==="main"?e.state={mode:"main",shell:v(e,e.state.shell)}:e.state={...e.state,shell:v(e,e.state.shell)}}function oa(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 aa(e,t){let n=++e.inspectionRefreshSequence,r=bu(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 Dh(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await Ir(e.workspaceRoot,t,e.enabledRunnerIds),n!==e.inspectionRefreshSequence)return;e.model=o,e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,e.state.shell)},Q(e,e.state.shell),e.render())}function kw(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)&&aa(e,n).catch(r=>{let s=te(e,"refresh inspection",r,"Failed to refresh inspection.");e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,actionMessage:s}),s)},e.render()})},GE))}function Tw(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=hn(e.state.shell,n,dd(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:v(e,r.state)},Q(e,e.state.shell),e.render(),aa(e,e.state.shell).catch(s=>{let i=te(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:v(e,r.state)},Q(e,e.state.shell),e.render()}},16)))}function pd(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function fd(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 Rw(e){fd(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,e.state.shell)},e.render())})}async function Pw(e,t){let n=v(e,t),r=Kt(e.model.tasks,n),s=Nr(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 Ut(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,Bt(Ue(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),n.centerZoomed));return Ut({...n,inputMode:"control"},o)}function md(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 hd(e,t){try{let n=v(e,t),r=Kt(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 bw(e,r),await Pe(e),s=r.selectedPtyTabId)}r&&!s&&(r=await bw(e,r),await Pe(e),s=r.selectedPtyTabId);let i=v(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:Ut({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},Q(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,Bt(Ue(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),i.centerZoomed));e.suppressTerminalEnterOnAttach=Wt(s),e.lastTerminalKey=null,e.state={mode:"main",shell:Ut({...i,inputMode:"terminal"},o)},Q(e,e.state.shell)}catch(n){let r=te(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&Wt(t.selectedPtyTabId)&&(await YE(e,t.selectedTaskId,r).catch(()=>{}),await Pe(e).catch(()=>{})),e.state={mode:"main",shell:ie(e,Jh(v(e,t),r),r)},Q(e,e.state.shell)}e.render()}async function YE(e,t,n){await cw(t,n,oe(e))}async function Sw(e,t,n,r){let s=v(e,t),{nextShell:i}=await rw(s,n,r,oe(e));return await Pe(e),v(e,{...s,...i})}async function Iw(e,t){let n=v(e,t),{closedTab:r,nextShell:s}=await sw(n,oe(e));return e.ptyRuntime.disposeSession(r.id),await Pe(e),v(e,{...n,...s})}async function vw(e,t){let n=v(e,t),r=jn(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await uw(n,oe(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Pe(e),v(e,{...n,...o,selectedLeftItemId:zE(r,jn(e.model),s)})}async function Cw(e,t){let n=v(e,t),{nextShell:r}=await pw(n,oe(e));return await Pe(e),v(e,{...n,...r})}async function bw(e,t){return ow(t,oe(e))}function la(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:Gt(e,e.state.shell)},e.render())},16))}function Aw(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:Gt(e,e.state.shell)},e.render())}function zE(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=Ew(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await dw(s,oe(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)oa(e,o);t.recordSuccess(i,Ew(e)),e.state={mode:"main",shell:v(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,$r("background PR polling",i,oe(e)))}}function Ew(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function $w(e,t){let n=v(e,t),r=Kt(e.model.tasks,n),s=null,i=null;if(r?.type==="project"&&r.repoTargets?.length){let o=await S.prs.discoverOrRefreshAll(e.paths,n.selectedTaskId);await Pe(e);let a=o.synced+o.discovered+o.notFound;i=`Refreshed ${o.synced}/${a} targets`}else{let{disposition:o,task:a}=await S.prs.discoverOrRefresh(e.paths,n.selectedTaskId);await Pe(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${H(a)?.requiredChecks.length??0} reported`)}return v(e,{...yw(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import e0 from"node:path";import{readdir as JE,stat as XE}from"node:fs/promises";import Nw from"node:path";async function QE(e){let t=await JE(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=Nw.join(e,r.name);n.push({name:r.name,path:s,kind:await ZE(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 Dw(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function _w(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 ca(e,t){let n=await QE(t);e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:n,activeTab:e.state.shell.selectedPtyTabId??e.state.shell.activeTab,actionMessage:null})},e.render())}async function ZE(e){let t=Nw.join(e,".git");return await XE(t).catch(()=>null)!==null}function xw(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function Fw(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function t0(e){if(e.state.mode!=="main"||e.creatingTask)return;let t=e.state.shell,n=t.taskPromptInput?.trim()??"",r=t.taskPromptTarget;if(!r||!r.repoId&&!r.workspaceId){e.state={mode:"main",shell:v(e,{...t,taskPromptError:"Select a workspace first."})},e.render();return}if(n.length===0){e.state={mode:"main",shell:v(e,{...t,taskPromptError:"Task prompt cannot be empty."})},e.render();return}e.creatingTask=!0,e.state={mode:"main",shell:v(e,{...t,actionMessage:`Creating ${t.selectedRunner} task in ${r.name}...`})},e.render();let s=null;try{let i=await lw(r.repoId,r.workspaceId,n,t.selectedRunner,oe(e));s=i.task,await Pe(e);let o=v(e,{...e.state.shell,...i.nextShell,selectedLeftItemId:`task:${s.id}`,inputMode:"terminal",taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null}),a=await e.ptyRuntime.ensureSession(s.id,o.selectedPtyTabId??xg(s,"agent"),Bt(Ue(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Wt(o.selectedPtyTabId),e.state={mode:"main",shell:Ut(o,a)},Q(e,e.state.shell)}catch(i){i instanceof Or&&(s=i.task);let o=te(e,"create task",i,"Failed to create task.");s&&!(i instanceof Or)?(await G(e.paths,s.id,a=>({...a,status:"draft",runnerSession:{...a.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:o})).catch(()=>{}),await Pe(e).catch(()=>{})):s&&(await G(e.paths,s.id,a=>({...a,lastFailureReason:o})).catch(()=>{}),await Pe(e).catch(()=>{})),e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,inputMode:"control",selectedTaskId:s?.id??e.state.shell.selectedTaskId,selectedPtyTabId:s?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:s?`task:${s.id}`:e.state.shell.selectedLeftItemId,activeTab:s?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:s?null:"",taskPromptError:o,actionMessage:null}),o)}}finally{e.creatingTask=!1,e.render()}}function n0(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:v(e,{...n,taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(Qe(t)){t0(e);return}if(t==="BACKSPACE"){e.state={mode:"main",shell:v(e,{...n,taskPromptInput:n.taskPromptInput.slice(0,-1),taskPromptError:null})},e.render();return}if(t==="CTRL_R"){e.state={mode:"main",shell:v(e,{...n,selectedRunner:_o(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}ku(t)&&(e.state={mode:"main",shell:v(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function r0(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:v(e,{...e.state.shell,workspaceBrowser:{...n,query:null,selectedIndex:0}})},e.render();return}e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:null,actionMessage:null})},e.render();return}if(t==="/"){e.state={mode:"main",shell:v(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:v(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:v(e,{...e.state.shell,workspaceBrowser:{...n,query:s,selectedIndex:0}})},e.render();return}let r=Dw(n);if(t==="UP"||t==="k"){e.state={mode:"main",shell:v(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:v(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"){ca(e,e0.dirname(n.cwd)).catch(s=>{let i=te(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:i}}),i)},e.render()});return}if(t==="RIGHT"||t==="l"||Qe(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){ca(e,s.path).catch(o=>{let a=te(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:ie(e,v(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=v(e,{...e.state.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${o.workspace.id}`,selectedWorkspaceId:o.workspace.id,selectedRepoId:a?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${o.workspace.name??o.workspace.id}`});e.state={mode:"main",shell:l},Q(e,e.state.shell),e.render()}).catch(o=>{let a=te(e,"add workspace",o,"Failed to add workspace.");e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()})}}function s0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=Py(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;i0(e,r)}}}async function i0(e,t){let n;try{n=await de.readLog(e.paths)}catch(r){let s=te(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 o0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=Iy(xw(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"?fw(n.runner,n.enabled,oe(e)):mw(n.runner,n.path,oe(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:v(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),runnerOptions:n.state},e.render())}).catch(s=>{if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let i=te(e,"save runner option",s,"Failed to save runner option.");e.state={...e.state,shell:ie(e,v(e,e.state.shell),i),runnerOptions:{...xw(e),message:i}},e.render()})}function a0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=Sy(Fw(e),e.config,t);if(n.kind!=="noop"){if(n.kind==="back"){ud(e,{seenPreviewIds:[...De]});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}hw(n.feature,n.enabled,oe(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:v(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),previewOptions:n.state},e.render())}).catch(r=>{if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let s=te(e,"save feature preview",r,"Failed to save feature preview.");e.state={...e.state,shell:ie(e,v(e,e.state.shell),s),previewOptions:{...Fw(e),message:s}},e.render()})}}function ua(e){let t=v(e,{...e.state.shell,inputMode:"control"});e.state={mode:"main",shell:t},e.pendingClear=!0,e.render(),e.bootHydrationReady.then(()=>{e.state.mode!=="main"||e.state.shell!==t||Pw(e,t).then(n=>{e.state.mode!=="main"||e.state.shell!==t||(e.state={mode:"main",shell:n},Q(e,e.state.shell),e.render())}).catch(n=>{if(e.state.mode!=="main"||e.state.shell!==t)return;let r=te(e,"warm selected PTY",n,"Failed to start selected PTY.");e.state={mode:"main",shell:ie(e,v(e,e.state.shell),r)},Q(e,e.state.shell),e.render()})})}function l0(e){return[...e instanceof Error?e.message:"npm could not install the update."].map(r=>{let s=r.charCodeAt(0);return s<=31||s>=127&&s<=159?" ":r}).join("").replace(/\s+/g," ").trim().slice(0,160)}function Lw(e){if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let t=e.state.update.latest;e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"installing"}},e.render(),e.installUpdate(t).then(()=>{e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update||(e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"success"}},e.pendingClear=!0,e.render())}).catch(n=>{if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let r=l0(n);te(e,"update Craig",n,r),e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"error",error:r}},e.pendingClear=!0,e.render()})}function c0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let n=e.state.update.phase;if(n==="installing")return;if(t==="ESCAPE"){ua(e);return}let r=n==="ready"?2:1;if(t==="UP"||t==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(t==="DOWN"||t==="j"){e.state={...e.state,menuIndex:Math.min(r,e.state.menuIndex+1)},e.render();return}if(Qe(t)){if(n==="ready"&&e.state.menuIndex===0){Lw(e);return}if(n==="ready"&&e.state.menuIndex===2){ud(e,{ignoredUpdateVersion:e.state.update.latest}),ua(e);return}if(n==="error"&&e.state.menuIndex===0){Lw(e);return}if(n==="success"&&e.state.menuIndex===1){e.exit(0);return}ua(e)}}function Mw(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){n0(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){r0(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){d0(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=cd(e.state.shell,n,dd(e,e.state.shell));if(r.exit){e.exit(0);return}if(r.detachTerminal){e.ptyRuntime.detach(),e.state={mode:"main",shell:v(e,r.state)},Q(e,e.state.shell),e.render();return}if(e.state.shell.inputMode==="terminal"){if(r.changed){e.state={mode:"main",shell:v(e,r.state)},Q(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&Qe(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Fs(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(u0(e,n))return;e.lastTerminalKey=Fg(n)?{key:n,at:Date.now()}:null;let i=Lg(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){la(e,i);return}ku(n)&&(e.state.shell.terminal.scrolledBack||e.pendingScrollLines<0)&&Wt(e.state.shell.selectedPtyTabId)&&Aw(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:v(e,r.state)},e.pendingClear=!0,e.render();return}if(r.beginTaskPrompt){let s=v(e,r.state),i=e.model.workspaces?.find(a=>a.id===s.selectedWorkspaceId),o=e.model.repos.find(a=>a.id===s.selectedRepoId);e.state={mode:"main",shell:{...s,taskPromptTarget:{workspaceId:i?.id??null,repoId:o?.id??null,name:i?.name??o?.name??"no workspace"}}},Q(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){ca(e,e.workspaceRoot).catch(s=>{let i=te(e,"browse workspaces",s,"Failed to browse workspaces.");e.state={mode:"main",shell:ie(e,v(e,{...r.state,workspaceBrowser:{cwd:e.workspaceRoot,entries:[],selectedIndex:0,query:null,error:i}}),i)},e.render()});return}if(r.createPtyTab){Sw(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{hd(e,s)}).catch(s=>{let i=te(e,"create PTY tab",s,"Failed to create tab.");e.state={mode:"main",shell:ie(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.closePtyTab){Iw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Q(e,e.state.shell),e.render()}).catch(s=>{let i=te(e,"close PTY tab",s,"Failed to close tab.");e.state={mode:"main",shell:ie(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.refreshPullRequestChecks){$w(e,r.state).then(s=>{e.state={mode:"main",shell:s},Q(e,e.state.shell),e.render()}).catch(s=>{let i=te(e,"refresh PR checks",s,"Failed to refresh PR checks.");e.state={mode:"main",shell:ie(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.openPrUrl){let s=Kt(e.model.tasks,r.state),i=s?H(s)?.url??null:null;i?_w(i).catch(o=>{let a=te(e,"open PR URL",o,"Failed to open PR in browser.");e.state={mode:"main",shell:ie(e,v(e,r.state),a)},e.render()}):(e.state={mode:"main",shell:ie(e,v(e,r.state),"No PR URL available.")},e.render());return}if(r.closeTask){vw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Q(e,e.state.shell),e.render()}).catch(s=>{let i=te(e,"close task",s,"Failed to close task.");e.state={mode:"main",shell:ie(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.removeWorkspace){Cw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Q(e,e.state.shell),e.render()}).catch(s=>{let i=te(e,"remove workspace",s,"Failed to remove workspace.");e.state={mode:"main",shell:ie(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.attachTerminal){hd(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:v(e,r.state)},Q(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){kw(e,e.state.shell);return}aa(e,e.state.shell).catch(s=>{let i=te(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}r.changed&&(e.state={mode:"main",shell:v(e,r.state)},ww(e,e.state.shell).catch(()=>{}),Q(e,e.state.shell),e.render());return}if(e.state.variant==="help"){e.state.viaOptions&&e.state.parentVariant?e.state={mode:"overlay",variant:"options",menuIndex:3,optionsMessage:null,shell:e.state.shell,parentVariant:e.state.parentVariant}:e.state.parentVariant?e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell}:e.state={mode:"main",shell:v(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){s0(e,n);return}if(e.state.variant==="runners"){o0(e,n);return}if(e.state.variant==="previews"){a0(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||Qe(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.variant==="update"){c0(e,n);return}if(e.state.optionsMessage){(n==="ESCAPE"||Qe(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:v(e,e.state.shell)},e.pendingClear=!0,e.render());return}if(Qe(n)){if(e.state.menuIndex===0){e.state.variant==="boot"?ua(e):(e.state={mode:"main",shell:v(e,{...e.state.shell,inputMode:"control"})},e.pendingClear=!0,e.render(),Rw(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 jw(e,t){let n=Bg(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=Fs(i);if(o){Uw(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(Du(i)){e.pendingTerminalKeySequence.raw=i,qw(e);return}da(e)}if(n.includes("")){e.ptyRuntime.detach(),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey=null,e.state={mode:"main",shell:v(e,{...e.state.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},Q(e,e.state.shell),e.render();return}let r=Mg(n);if(r!==0){la(e,r);return}let s=Fs(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
287
289
  `&&n!==`\r
288
- `&&(e.suppressTerminalEnterOnAttach=!1),Fg(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function ZE(e,t){if(e.pendingTerminalKeySequence){let n=_g(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Fs(r);if(s)return $w(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(Ou(r))return e.pendingTerminalKeySequence.raw=r,Ow(e),!0}return la(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>la(e),30)},!0)}function Ow(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>la(e),30))}function la(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function $w(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function Nw(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){dw(e,Eu(t));return}let n=Eu(t);n!==0&&oa(e,n)}function e0(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var n0=t0(import.meta.url),r0=n0("terminal-kit"),s0=r0.terminal;function fd(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Dw(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function _w(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function i0(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 xw(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=Ee(t),r=await k.load(n),s=k.runners.getEnabled(r),i=e.uiStateFile?await Un({uiStateFile:e.uiStateFile}):null,o=await Ir(t,void 0,s),a=$s(Vh(i,r),o);o=await Ir(t,a,s);let l={current:o},c=()=>{},d=()=>{},u=()=>{},p={workspaceRoot:t,onUpdate:f=>c(f),onActivity:f=>d(f),onActivityRemoved:f=>u(f),resolveSessionSpec:(f,m)=>Eg(l.current,m,t)},h=e.ptyRuntime??await ey({...p,paths:n,activityEnabled:!0});return new Promise(f=>{let m=e.terminal??s0,y=null,T=null,R=null,b=null,$=null,N=0,D=!1,_=new Map,A=h.managesPullRequestSync?null:new Er({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,Se=new fn({resolutionMs:Ju,onError:(v,B)=>$r(`heartbeat job "${v}"`,B,oe(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:$s(a,o)},get model(){return l.current},set model(v){l.current=v},config:r,enabledRunnerIds:s,creatingTask:!1,suppressTerminalEnterOnAttach:!1,lastTerminalKey:null,pendingScrollLines:0,pendingInspectionScrollLines:0,leftNavInspectionTimer:null,pendingLeftNavInspectionShell:null,pendingTerminalKeySequence:null,scrollRenderTimer:null,inspectionScrollRenderTimer:null,ptyRenderTimer:null,footerToastTimer:null,focusFlashUntil:null,focusFlashTimer:null,lastBackgroundPrPollError:null,versionText:`Craig v${k.version.getCurrent()}`,updateText:null,inspectionRefreshSequence:0,pendingClear:!0,inputCaptureMode:null,runtimeState:i,persistQueue:Promise.resolve(),taskMutationQueue:Promise.resolve(),bootHydrationReady:Promise.resolve(),paths:n,workspaceRoot:t,uiStateFile:e.uiStateFile,activeTerminal:m,ptyRuntime:h,resolve:f,render:()=>{},renderTaskNavigation:()=>!1,exit:v=>f(v)},w.ptyRuntime.setActivityEnabled?.(!0),c=v=>{w.state.mode==="main"&&($=i0($,v),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let B=$;if($=null,w.state.mode==="main"){let te=Kt(w,w.state.shell);if(w.state={mode:"main",shell:te},!b||!T){w.render();return}let we=qe(m.width,m.height),me={...b,terminal:te.terminal},mt=By(we,me,T,te.centerZoomed,B?.kind==="rows"?B.rowIndices:null,k.previews.isEnabled(w.config,"panelPolish"));if(!mt){w.render();return}mt.output.length>0&&m.noFormat(mt.output),b=me,T=mt.region,R&&(R={...R,center:mt.region}),y=null,m.hideCursor(!0)}},0)))},d=v=>{w.state.mode==="main"&&Ut(v.tabId)&&_.get(v.tabId)!==Ot(v.tabId,[v],Date.now())&&w.render()},u=v=>{w.state.mode==="main"&&Ut(v)&&_.get(v)!=="idle"&&w.render()};let ye=Promise.resolve(),z=v=>{ye=ye.then(async()=>{let B=await Promise.all([...new Set(v)].map(te=>P.getTask(w.paths,te)));for(let te of B)sa(w,te);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(B=>$r("daemon task-state refresh",B,oe(w)))};w.ptyRuntime.setTasksChangedHandler?.(z);let gn=Promise.resolve(),ca=v=>{gn=gn.then(async()=>{let B=w.state.shell,te=w.model.tasks.find(qn=>qn.id===B.selectedTaskId)??null,we=te&&w.model.inspection?.taskId===te.id?w.model.inspection:null;if(!te||!we)throw new Error("Craig needs an active task before it can open a file from an agent session.");let me=await Fh(v);w.model={...w.model,inspection:{...we,filePaths:[...new Set([...we.filePaths,v])],selectedFilePath:v,selectedFile:me,error:null}},w.ptyRuntime.detach();let mt=I(w,{...B,inputMode:"control",focusedRegion:"center",activeTab:V,inspectionMode:"files",openInspectionKind:"file",selectedFileTreePath:v,selectedFilePath:v,fileScrollOffset:0,actionMessage:null});w.state={mode:"main",shell:mt},Q(w,mt),w.render()}).catch(B=>$r("open file from agent",B,oe(w)))};w.ptyRuntime.setOpenFileHandler?.(ca);let Dr=null,md=v=>{let B=qe(m.width,m.height);if(k.previews.isEnabled(w.config,"panelPolish")){let qn=`${B.width}:${B.height}:${v.shell.centerZoomed}`;Dr!==qn&&(Dr=qn,w.ptyRuntime.resize(Bt(B,!0,v.shell.centerZoomed)),v.shell=Kt(w,v.shell))}else Dr=null;let te=w.ptyRuntime.getActivitySnapshots?.()??[],we=Date.now(),me=Ey(I(w,v.shell),w.model,{snapshots:te,now:we,animationFrame:N});_.clear();for(let qn of w.model.tasks)for(let ua of qn.ptyTabs)ua.kind==="agent"&&_.set(ua.id,Ot(ua.id,te,we));let mt=ug(B,me,{centerOnly:v.shell.centerZoomed,panelPolish:k.previews.isEnabled(w.config,"panelPolish"),focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:me,presentation:mt}},hd=(v,B,te,we)=>{if(!R)return!1;let me=Uy(R,B.regions,te);return me?(me.output.length>0&&m.noFormat(me.output),b=v,R=me.regions,T=me.regions.center,y=we?B.frame:null,m.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;dd(w),w.ptyRuntime.setPullRequestPollView?.(_w(w.state)),w.ptyRuntime.setViewedTab?.(Nr(w,w.state.shell));let{data:v,presentation:B}=md(w.state);return hd(v,B,["rail","left","center","footer"],!1)},w.render=()=>{dd(w);let v=w.state;w.ptyRuntime.setPullRequestPollView?.(_w(v)),w.ptyRuntime.setViewedTab?.(v.mode==="main"?Nr(w,v.shell):null);let B=qe(m.width,m.height),te,we=null;if(v.mode==="main"){let me=md(v);if(we=me.presentation,te=we.frame,!w.pendingClear&&hd(me.data,we,["rail","left","center","right","footer"],!0))return;b=me.data,T=we.center}else te=v.variant==="boot"?og(B,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:v.menuIndex,optionsMessage:v.optionsMessage,versionText:w.versionText,updateText:w.updateText}):v.variant==="pause"?ag(B,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:v.menuIndex,optionsMessage:v.optionsMessage,versionText:w.versionText,updateText:w.updateText}):v.variant==="options"?Wo(B,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:v.menuIndex,optionsMenuItems:Wu}):v.variant==="runners"?Wo(B,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:fd(v).menuIndex,optionsMenuItems:Vu(w.config,fd(v)),optionsMessage:py(fd(v)),optionsSubtitle:"Runners"}):v.variant==="previews"?Wo(B,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:Dw(v).menuIndex,optionsMenuItems:fy(w.config),optionsMessage:my(Dw(v)),optionsSubtitle:"Feature Previews - Experimental"}):v.variant==="logs"?cg(B,{logPath:v.log?.path??n.logFile,logLines:v.log?.lines??[]}):lg(B),b=null,T=null,R=null;w.pendingClear&&(m.moveTo(1,1),m.eraseDisplayBelow(),w.pendingClear=!1,y=null),m.noFormat(Mg(te,y)),y=te,R=we?.regions??null,m.hideCursor(!0)};let gd=v=>Aw(w,v),yd=v=>Ew(w,v),wd=v=>Nw(w,v),Lw=()=>{process.stdout.off("resize",kd),process.off("SIGCONT",Td),m.removeListener("key",gd),m.removeListener("unknown",yd),m.removeListener("mouse",wd),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(),m.grabInput(!1),m.hideCursor(!1),m.fullscreen(!1)};w.exit=v=>{Lw(),f(v)};let kd=()=>{cd(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Bt(qe(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Kt(w,w.state.shell)}),w.render()},Td=()=>{cd(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Bt(qe(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Kt(w,w.state.shell)}),w.render()};process.stdout.on("resize",kd),process.on("SIGCONT",Td),m.grabInput(!0),w.inputCaptureMode="control",m.hideCursor(!0),m.fullscreen(!0),m.on("key",gd),m.on("unknown",yd),m.on("mouse",wd),A&&Se.register({id:"github.pull-requests",intervalMs:1e3,run:v=>bw(w,A,v)}),Se.register({id:"agent.activity-indicators",intervalMs:Ju,run:()=>{let v=Date.now(),B=ki(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],v);(B||D)&&(N=(N+1)%Iy,w.state.mode==="main"&&w.render()),D=B}}),Se.start(),k.version.checkForUpdate().then(v=>{v.updateAvailable&&v.latest&&(w.updateText=`Update available: v${v.latest}`,w.render())}),w.bootHydrationReady=ud(w).catch(()=>{}),w.render()})}async function a0(){try{if(process.argv[2]==="__craig-daemon"){let e=await Fw(process.argv[3]??process.cwd()),t=Ee(e);return await ty(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await Fw(process.argv[3]??process.cwd()),t=Ee(e);return await ny(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
289
- `),1}return Ih({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=>xw({uiStateFile:Ee(e).uiStateFile,workspaceRoot:e})})}async function Fw(e){return o0(e)}var l0=await a0();process.exit(l0);
290
+ `&&(e.suppressTerminalEnterOnAttach=!1),Ug(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function u0(e,t){if(e.pendingTerminalKeySequence){let n=jg(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Fs(r);if(s)return Uw(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(Du(r))return e.pendingTerminalKeySequence.raw=r,qw(e),!0}return da(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>da(e),30)},!0)}function qw(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>da(e),30))}function da(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function Uw(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function Bw(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){Tw(e,Nu(t));return}let n=Nu(t);n!==0&&la(e,n)}function d0(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var f0=p0(import.meta.url),m0=f0("terminal-kit"),h0=m0.terminal;function gd(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Ww(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Vw(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function g0(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 Kw(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=Ee(t),r=await k.load(n),s=k.runners.getEnabled(r),i=e.uiStateFile?await Bn({uiStateFile:e.uiStateFile}):null,o=await Ir(t,void 0,s),a=$s(zh(i,r),o);o=await Ir(t,a,s);let l={current:o},c=()=>{},d=()=>{},u=()=>{},p={workspaceRoot:t,onUpdate:f=>c(f),onActivity:f=>d(f),onActivityRemoved:f=>u(f),resolveSessionSpec:(f,m)=>_g(l.current,m,t)},h=e.ptyRuntime??await iy({...p,paths:n,activityEnabled:!0});return new Promise(f=>{let m=e.terminal??h0,y=null,T=null,R=null,b=null,$=null,N=0,D=!1,_=new Map,A=h.managesPullRequestSync?null:new Er({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,Se=new fn({resolutionMs:Qu,onError:(P,q)=>$r(`heartbeat job "${P}"`,q,oe(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:$s(a,o)},get model(){return l.current},set model(P){l.current=P},config:r,enabledRunnerIds:s,creatingTask:!1,suppressTerminalEnterOnAttach:!1,lastTerminalKey:null,pendingScrollLines:0,pendingInspectionScrollLines:0,leftNavInspectionTimer:null,pendingLeftNavInspectionShell:null,pendingTerminalKeySequence:null,scrollRenderTimer:null,inspectionScrollRenderTimer:null,ptyRenderTimer:null,footerToastTimer:null,focusFlashUntil:null,focusFlashTimer:null,lastBackgroundPrPollError:null,versionText:`Craig v${k.version.getCurrent()}`,updateText:null,inspectionRefreshSequence:0,pendingClear:!0,inputCaptureMode:null,runtimeState:i,persistQueue:Promise.resolve(),taskMutationQueue:Promise.resolve(),bootHydrationReady:Promise.resolve(),paths:n,workspaceRoot:t,uiStateFile:e.uiStateFile,activeTerminal:m,ptyRuntime:h,resolve:f,render:()=>{},renderTaskNavigation:()=>!1,exit:P=>f(P),installUpdate:e.installUpdate??vy},w.ptyRuntime.setActivityEnabled?.(!0),c=P=>{w.state.mode==="main"&&($=g0($,P),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let q=$;if($=null,w.state.mode==="main"){let ne=Gt(w,w.state.shell);if(w.state={mode:"main",shell:ne},!b||!T){w.render();return}let we=Ue(m.width,m.height),me={...b,terminal:ne.terminal},mt=Jy(we,me,T,ne.centerZoomed,q?.kind==="rows"?q.rowIndices:null,k.previews.isEnabled(w.config,"panelPolish"));if(!mt){w.render();return}mt.output.length>0&&m.noFormat(mt.output),b=me,T=mt.region,R&&(R={...R,center:mt.region}),y=null,m.hideCursor(!0)}},0)))},d=P=>{w.state.mode==="main"&&Wt(P.tabId)&&_.get(P.tabId)!==$t(P.tabId,[P],Date.now())&&w.render()},u=P=>{w.state.mode==="main"&&Wt(P)&&_.get(P)!=="idle"&&w.render()};let ye=Promise.resolve(),z=P=>{ye=ye.then(async()=>{let q=await Promise.all([...new Set(P)].map(ne=>S.getTask(w.paths,ne)));for(let ne of q)oa(w,ne);w.state.mode==="main"?w.state={mode:"main",shell:v(w,w.state.shell)}:w.state={...w.state,shell:v(w,w.state.shell)},w.render()}).catch(q=>$r("daemon task-state refresh",q,oe(w)))};w.ptyRuntime.setTasksChangedHandler?.(z);let gn=Promise.resolve(),pa=P=>{gn=gn.then(async()=>{let q=w.state.shell,ne=w.model.tasks.find(Un=>Un.id===q.selectedTaskId)??null,we=ne&&w.model.inspection?.taskId===ne.id?w.model.inspection:null;if(!ne||!we)throw new Error("Craig needs an active task before it can open a file from an agent session.");let me=await Uh(P);w.model={...w.model,inspection:{...we,filePaths:[...new Set([...we.filePaths,P])],selectedFilePath:P,selectedFile:me,error:null}},w.ptyRuntime.detach();let mt=v(w,{...q,inputMode:"control",focusedRegion:"center",activeTab:V,inspectionMode:"files",openInspectionKind:"file",selectedFileTreePath:P,selectedFilePath:P,fileScrollOffset:0,actionMessage:null});w.state={mode:"main",shell:mt},Q(w,mt),w.render()}).catch(q=>$r("open file from agent",q,oe(w)))};w.ptyRuntime.setOpenFileHandler?.(pa);let Dr=null,yd=P=>{let q=Ue(m.width,m.height);if(k.previews.isEnabled(w.config,"panelPolish")){let Un=`${q.width}:${q.height}:${P.shell.centerZoomed}`;Dr!==Un&&(Dr=Un,w.ptyRuntime.resize(Bt(q,!0,P.shell.centerZoomed)),P.shell=Gt(w,P.shell))}else Dr=null;let ne=w.ptyRuntime.getActivitySnapshots?.()??[],we=Date.now(),me=My(v(w,P.shell),w.model,{snapshots:ne,now:we,animationFrame:N});_.clear();for(let Un of w.model.tasks)for(let fa of Un.ptyTabs)fa.kind==="agent"&&_.set(fa.id,$t(fa.id,ne,we));let mt=hg(q,me,{centerOnly:P.shell.centerZoomed,panelPolish:k.previews.isEnabled(w.config,"panelPolish"),focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:me,presentation:mt}},wd=(P,q,ne,we)=>{if(!R)return!1;let me=Xy(R,q.regions,ne);return me?(me.output.length>0&&m.noFormat(me.output),b=P,R=me.regions,T=me.regions.center,y=we?q.frame:null,m.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;md(w),w.ptyRuntime.setPullRequestPollView?.(Vw(w.state)),w.ptyRuntime.setViewedTab?.(Nr(w,w.state.shell));let{data:P,presentation:q}=yd(w.state);return wd(P,q,["rail","left","center","footer"],!1)},w.render=()=>{md(w);let P=w.state;w.ptyRuntime.setPullRequestPollView?.(Vw(P)),w.ptyRuntime.setViewedTab?.(P.mode==="main"?Nr(w,P.shell):null);let q=Ue(m.width,m.height),ne,we=null;if(P.mode==="main"){let me=yd(P);if(we=me.presentation,ne=we.frame,!w.pendingClear&&wd(me.data,we,["rail","left","center","right","footer"],!0))return;b=me.data,T=we.center}else ne=P.variant==="boot"?ug(q,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMessage:P.optionsMessage,versionText:w.versionText,updateText:w.updateText}):P.variant==="pause"?dg(q,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMessage:P.optionsMessage,versionText:w.versionText,updateText:w.updateText}):P.variant==="options"?Vo(q,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMenuItems:Ty(w.runtimeState?.seenPreviewIds)}):P.variant==="runners"?Vo(q,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:gd(P).menuIndex,optionsMenuItems:Gu(w.config,gd(P)),optionsMessage:ky(gd(P)),optionsSubtitle:"Runners"}):P.variant==="previews"?Vo(q,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:Ww(P).menuIndex,optionsMenuItems:by(w.config,w.runtimeState?.seenPreviewIds),optionsMessage:Ry(Ww(P)),optionsSubtitle:"Feature Previews - Experimental"}):P.variant==="update"&&P.update?pg(q,P.update,{menuIndex:P.menuIndex}):P.variant==="logs"?mg(q,{logPath:P.log?.path??n.logFile,logLines:P.log?.lines??[]}):fg(q),b=null,T=null,R=null;w.pendingClear&&(m.moveTo(1,1),m.eraseDisplayBelow(),w.pendingClear=!1,y=null),m.noFormat(Wg(ne,y)),y=ne,R=we?.regions??null,m.hideCursor(!0)};let kd=P=>Mw(w,P),Td=P=>jw(w,P),bd=P=>Bw(w,P),Hw=()=>{process.stdout.off("resize",Rd),process.off("SIGCONT",Pd),m.removeListener("key",kd),m.removeListener("unknown",Td),m.removeListener("mouse",bd),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(),m.grabInput(!1),m.hideCursor(!1),m.fullscreen(!1)};w.exit=P=>{Hw(),f(P)};let Rd=()=>{pd(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Bt(Ue(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Gt(w,w.state.shell)}),w.render()},Pd=()=>{pd(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Bt(Ue(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Gt(w,w.state.shell)}),w.render()};process.stdout.on("resize",Rd),process.on("SIGCONT",Pd),m.grabInput(!0),w.inputCaptureMode="control",m.hideCursor(!0),m.fullscreen(!0),m.on("key",kd),m.on("unknown",Td),m.on("mouse",bd),A&&Se.register({id:"github.pull-requests",intervalMs:1e3,run:P=>Ow(w,A,P)}),Se.register({id:"agent.activity-indicators",intervalMs:Qu,run:()=>{let P=Date.now(),q=ki(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],P);(q||D)&&(N=(N+1)%_y,w.state.mode==="main"&&w.render()),D=q}}),Se.start(),(e.checkForUpdate??k.version.checkForUpdate)().then(P=>{if(P.updateAvailable&&P.latest){if(w.runtimeState?.ignoredUpdateVersion===P.latest)return;w.updateText=`Update available: v${P.latest}`,w.state.mode==="overlay"&&w.state.variant==="boot"&&(w.state={mode:"overlay",variant:"update",menuIndex:0,optionsMessage:null,shell:w.state.shell,update:{current:P.current,latest:P.latest,phase:"ready"}},w.pendingClear=!0),w.render()}}),w.bootHydrationReady=fd(w).catch(()=>{}),w.render()})}async function w0(){try{if(process.argv[2]==="__craig-daemon"){let e=await Gw(process.argv[3]??process.cwd()),t=Ee(e);return await oy(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await Gw(process.argv[3]??process.cwd()),t=Ee(e);return await ay(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
291
+ `),1}return Oh({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=>Kw({uiStateFile:Ee(e).uiStateFile,workspaceRoot:e})})}async function Gw(e){return y0(e)}var k0=await w0();process.exit(k0);