craig-cli 0.13.4 → 0.13.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +135 -135
  3. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
- var tw=Object.defineProperty;var Ls=(e,t)=>{for(var n in t)tw(e,n,{get:t[n],enumerable:!0})};import{realpath as yE}from"node:fs/promises";import fe from"node:path";function ve(e){let t=fe.join(e,".craig");return{workspaceRoot:e,repoRoot:e,craigDir:t,indexFile:fe.join(t,"index.json"),reposDir:fe.join(t,"repos"),workspacesDir:fe.join(t,"workspaces"),sessionsDir:fe.join(t,"sessions"),runtimeDir:fe.join(t,"runtime"),uiStateFile:fe.join(t,"runtime","ui-state.json"),tasksDir:fe.join(t,"tasks"),jobsDir:fe.join(t,"jobs"),commandsDir:fe.join(t,"commands"),eventsDir:fe.join(t,"events"),orchestrationDir:fe.join(t,"orchestration"),logsDir:fe.join(t,"logs"),logFile:fe.join(t,"logs","craig.jsonl"),artifactsDir:fe.join(t,"artifacts"),worktreesDir:fe.join(t,"worktrees"),configFile:fe.join(t,"config.json")}}import Gc from"node:path";import{readFile as dI}from"node:fs/promises";import{readFile as cw}from"node:fs/promises";import{randomUUID as nw}from"node:crypto";import{chmod as rw,open as sw,readFile as iw,rename as ow,rm as aw}from"node:fs/promises";import Ho from"node:path";async function M(e,t,n={}){let r=Ho.dirname(e),s=Ho.join(r,`.${Ho.basename(e)}.${process.pid}.${Date.now()}.${nw()}.tmp`),i=await sw(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 ow(s,e),n.mode!==void 0&&await rw(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await aw(s,{force:!0}).catch(()=>{}),o}}async function Ms(e){try{let t=await iw(e,"utf8");return JSON.parse(t)}catch(t){if(lw(t))return null;throw t}}function lw(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 cw(e.uiStateFile,"utf8"),n=JSON.parse(t);return dw(n,e.uiStateFile)}catch(t){if(pw(t))return null;throw t}}async function jt(e,t){await M(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function qs(){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 dw(e,t){if(typeof e!="object"||e===null||e.version!==1||!(e.selectedRepoId===null||typeof e.selectedRepoId=="string")||!(e.selectedWorkspaceId===null||typeof e.selectedWorkspaceId=="string")||!(e.selectedTaskId===null||typeof e.selectedTaskId=="string")||!(e.selectedPtyTabId===void 0||e.selectedPtyTabId===null||typeof e.selectedPtyTabId=="string")||!qn(e,"inputMode")||!qn(e,"focusedRegion")||!qn(e,"activeTab")||!qn(e,"inspectorSection")||!qn(e,"inspectionMode")||!js(e,"openInspectionKind")||!js(e,"selectedFileTreePath")||!js(e,"selectedFilePath")||!js(e,"selectedDiffPath")||!uw(e,"collapsedFileTreePaths")||!qn(e,"selectedActionId")||typeof e.updatedAt!="string")throw new Error(`Craig UI state at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return e}function qn(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function js(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function uw(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function pw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var Yo={};Ls(Yo,{RUNNER_IDS:()=>J,assertEnabled:()=>nu,buildCommand:()=>iu,getConfiguredProfile:()=>Us,getDefault:()=>tu,getDisplayName:()=>su,getEnabled:()=>Ws,getProfile:()=>Wn,isRunnerType:()=>Bs,parse:()=>ru,setRunnerEnabled:()=>ou,setRunnerPath:()=>au});var J=["codex","cursor","claude"];var eu={codex:{id:"codex",displayName:"Codex",executable:"codex",defaultAgentTitle:"Codex"},cursor:{id:"cursor",displayName:"Cursor",executable:"cursor-agent",defaultAgentTitle:"Cursor"},claude:{id:"claude",displayName:"Claude",executable:"claude",defaultAgentTitle:"Claude"}};var Wn=e=>eu[e];var Us=(e,t={})=>{let n=Wn(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}};var Ws=(e={})=>J.filter(t=>e.runners?.[t]?.enabled!==!1);var tu=(e={})=>{let t=Ws(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 nu=(e,t={})=>{if(t.runners?.[e]?.enabled===!1)throw new Error(`Runner "${e}" is disabled in .craig/config.json.`)};var Bs=e=>J.includes(e);var ru=e=>{if(!e||e.length===0)return"codex";if(!Bs(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${J.join(", ")}.`);return e};var su=e=>Wn(e).displayName;var iu=(e,t,n={})=>{let r=[Us(e,n).executable];return t&&t.length>0&&r.push(t),r};var ou=(e,t,n)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}});var au=(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 zo={};Ls(zo,{PREVIEW_FEATURE_IDS:()=>Je,isEnabled:()=>lu,setEnabled:()=>cu});var Je=["agentActivityIndicators","agentOrchestration"];function lu(e,t){return e.previews?.[t]===!0}function cu(e,t,n){return{...e,previews:{...e.previews,[t]:n}}}import{mkdir as fw,readFile as mw,writeFile as hw}from"node:fs/promises";import gw from"node:path";var yw=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",du=async e=>{try{return await mw(e,"utf8")}catch(t){if(yw(t))return null;throw t}},uu=async(e,t)=>{await fw(gw.dirname(e),{recursive:!0}),await hw(e,t,"utf8")};var Vs=(e,t)=>{if(typeof e!="object"||e===null)throw new Error(`Craig config at ${t} is invalid. Expected a JSON object.`);let n=e;if(n.runners!==void 0){if(typeof n.runners!="object"||n.runners===null||Array.isArray(n.runners))throw new Error(`Craig config at ${t} is invalid. "runners" must be an object.`);for(let[r,s]of Object.entries(n.runners)){if(!J.includes(r))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" is not supported. Expected one of: ${J.join(", ")}.`);if(typeof s!="object"||s===null||Array.isArray(s))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" must be an object.`);let i=s;if(i.enabled!==void 0&&typeof i.enabled!="boolean")throw new Error(`Craig config at ${t} is invalid. "runners.${r}.enabled" must be a boolean.`);if(i.path!==void 0&&(typeof i.path!="string"||i.path.trim().length===0))throw new Error(`Craig config at ${t} is invalid. "runners.${r}.path" must be a non-empty string.`)}}if(n.checks!==void 0&&(typeof n.checks!="object"||n.checks===null||!Array.isArray(n.checks.commands)||!n.checks.commands.every(r=>typeof r=="string")))throw new Error(`Craig config at ${t} is invalid. "checks.commands" must be an array of strings.`);if(n.open!==void 0&&(typeof n.open!="object"||n.open===null||!Array.isArray(n.open.command)||!n.open.command.every(r=>typeof r=="string")))throw new Error(`Craig config at ${t} is invalid. "open.command" must be an array of strings.`);if(n.github!==void 0){if(typeof n.github!="object"||n.github===null)throw new Error(`Craig config at ${t} is invalid. "github" must be an object.`);if(n.github.mergeMethod!==void 0&&n.github.mergeMethod!=="merge"&&n.github.mergeMethod!=="rebase"&&n.github.mergeMethod!=="squash")throw new Error(`Craig config at ${t} is invalid. "github.mergeMethod" must be "merge", "rebase", or "squash".`);if(n.github.watchIntervalSeconds!==void 0&&(!Number.isInteger(n.github.watchIntervalSeconds)||n.github.watchIntervalSeconds<=0))throw new Error(`Craig config at ${t} is invalid. "github.watchIntervalSeconds" must be a positive integer.`)}if(n.previews!==void 0){if(typeof n.previews!="object"||n.previews===null||Array.isArray(n.previews))throw new Error(`Craig config at ${t} is invalid. "previews" must be an object.`);for(let[r,s]of Object.entries(n.previews)){if(r!=="incrementalCenterPane"&&!Je.includes(r))throw new Error(`Craig config at ${t} is invalid. "previews.${r}" is not supported. Expected one of: ${Je.join(", ")}.`);if(typeof s!="boolean")throw new Error(`Craig config at ${t} is invalid. "previews.${r}" must be a boolean.`)}}return n};var Jo=async(e,t={readConfigFile:du})=>{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 Vs(r,e.configFile)};var Xo=async(e,t,n={writeConfigFile:uu})=>{Vs(t,e.configFile),await n.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
4
- `)};var Qo={};Ls(Qo,{checkForUpdate:()=>pu,getCurrent:()=>Ks});var Ks=()=>{try{return"0.13.4"}catch{return"unknown"}};var ww="https://registry.npmjs.org/craig-cli/latest",kw=3600*1e3,Tw={value:null},bw=(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},pu=async(e={fetch:globalThis.fetch,getCurrent:Ks,cache:Tw})=>{let t=e.getCurrent(),n=Date.now();if(e.cache.value&&n-e.cache.value.cachedAt<kw)return e.cache.value.result;let r=null;try{let i=await e.fetch(ww,{signal:AbortSignal.timeout(5e3)});i.ok&&(r=(await i.json()).version??null)}catch{}let s={current:t,latest:r,updateAvailable:r!==null&&r!==t&&bw(r,t)};return e.cache.value={result:s,cachedAt:n},s};var k={load:Jo,save:Xo,previews:zo,runners:Yo,version:Qo};var fu={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=fu[t],this.retryable=r.retryable??!1,this.details=r.details??{}}};function Zo(e){return e instanceof g?e:new g("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as Rw,mkdir as Sw,readFile as Pw}from"node:fs/promises";import Iw from"node:path";var mu=80,Gs=async(e,t)=>{await Sw(Iw.dirname(e.logFile),{recursive:!0});let n={timestamp:new Date().toISOString(),...t};await Rw(e.logFile,`${JSON.stringify(n)}
5
- `,"utf8")},hu=async(e,t)=>{try{await Gs(e,t)}catch{}},Hs=async(e,t=mu)=>{try{let s=(await Pw(e.logFile,"utf8")).trimEnd().split(`
6
- `).filter(i=>i.length>0).map(vw);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(Aw(n))return{path:e.logFile,lines:[],empty:!0};throw n}},ea=async(e,t)=>Gs(e,{level:"error",component:"application",event:Cw(t.context),message:t.message,...t.details?{details:t.details}:{}}),gu=async(e,t)=>{try{await ea(e,t)}catch{}},yu=Hs,wu=async(e,t=mu)=>Hs(e,t);function vw(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 Cw(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function Aw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var we={appendErrorLog:ea,appendErrorLogBestEffort:gu,appendLog:Gs,appendLogBestEffort:hu,readLog:Hs,readErrorLog:yu,readRecentErrorLines:wu};function Pu(e){let{commandTokens:t,options:n,help:r}=Ow(e);if(r)return Tu({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":Er(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:Ru(o,"Repo path")};break;case"repo:list":Er(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:X(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:Ru(o,"Workspace path")};break;case"workspace:list":a=$w(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:X(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:X(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:X(o,"Workspace id")};break;case"task:new":a=Dw(o);break;case"task:create-child":a=xw(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:X(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:X(o,"Task id")}};break;case"task:list":a=Nw(o);break;case"task:current":Er(o,"task current"),a={kind:"currentTask"};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:X(o,"Task id")};break;case"task:pr":a=_w(o);break;case"task:wait":a=Ww(o);break;case"agent:list":Er(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=Mw(o);break;case"agent:send":a=jw(o);break;case"command:show":a={kind:"showPromptCommand",commandId:X(o,"Command id")};break;case"command:list":Er(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:X(o,"Command id")};break;case"command:wait":a=qw(o);break;case"events:list":a=ku(o,!1);break;case"events:watch":a=ku(o,!0);break;case"fury:validate":a={kind:"validateFury",file:X(o,"Fury file")};break;case"fury:plan":a=Bw(o);break;case"fury:approve":a={kind:"approveFury",planId:X(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:X(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:X(o,"Fury run id")};break;case"fury:watch":a=Vw(o);break;case"fury:cancel":a={kind:"cancelFury",runId:X(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:X(o,"Fury run id")};break;case"fury:step":a=Kw(o);break;case"fury:reviews":a=Gw(o);break;case"fury:review":a=Hw(o);break;case"task:attach":a={kind:"attachTask",taskId:X(o,"Task id")};break;case"task:logs":a={kind:"streamTaskLogs",taskId:X(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:X(o,"Task id")};break;case"task:focus":a={kind:"focusTask",taskId:X(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:X(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:X(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:X(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:Su(o,0,"Task id"),repoId:Su(o,1,"Repo id")},ia(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:X(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw P(`Unsupported command: ${t.join(" ")}`)}return Tu(a,n)}function Iu(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 Ew(e){return e.kind==="actFuryReview"?`fury.review.${e.action==="request_changes"?"request-changes":e.action}`:{addWorkspace:"workspace.add",addRepo:"repo.add",listRepos:"repo.list",removeRepo:"repo.remove",listWorkspaces:"workspace.list",archiveWorkspace:"workspace.archive",restoreWorkspace:"workspace.restore",removeWorkspace:"workspace.remove",createTask:"task.new",createChildTask:"task.create-child",listTaskChildren:"task.children",cancelTaskTree:"task.cancel-tree",validateFury:"fury.validate",planFury:"fury.plan",approveFury:"fury.approve",runFury:"fury.run",showFury:"fury.status",watchFury:"fury.watch",cancelFury:"fury.cancel",resumeFury:"fury.resume",completeFuryStep:"fury.step.complete",failFuryStep:"fury.step.fail",listFuryReviews:"fury.reviews.list",showFuryReview:"fury.review.show",actFuryReview:"fury.review.action",listTasks:"task.list",currentTask:"task.current",showTask:"task.show",showCurrentTask:"task.show",showTaskPr:"task.pr.show",discoverTaskPr:"task.pr.discover",linkTaskPr:"task.pr.link",refreshTaskPr:"task.pr.refresh",unlinkTaskPr:"task.pr.unlink",listAgents:"agent.list",showAgentStatus:"agent.status",sendAgentPrompt:"agent.send",showPromptCommand:"command.show",listPromptCommands:"command.list",cancelPromptCommand:"command.cancel",waitPromptCommand:"command.wait",waitTask:"task.wait",listEvents:"events.list",watchEvents:"events.watch",attachTask:"task.attach",addTaskLink:"link.add",listTaskLinks:"link.list",refreshInteractiveState:"interactive.refresh",showSelectedTask:"task.show",streamTaskLogs:"task.logs",streamSelectedTaskLogs:"task.logs",showTaskDiff:"task.diff",showSelectedTaskDiff:"task.diff",focusTask:"task.focus",focusSelectedTask:"task.focus",openTask:"task.open",openSelectedTask:"task.open",runChecks:"task.check",runSelectedTaskChecks:"task.check",commitTask:"task.commit",commitSelectedTask:"task.commit",showContext:"context.show",help:"help",exit:"exit"}[e.kind]}function 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 task new --repo <repo-id> [--runner codex|cursor|claude] <prompt>"," craig task new --workspace <workspace-id> [--runner codex|cursor|claude] <prompt>"," craig task create-child --parent <task-id> --repo <repo-id> [--runner codex|cursor|claude] [--idempotency-key <key>] <prompt>"," craig task children [<task-id>] List direct child tasks"," craig task cancel-tree [<task-id>] Cancel a task and all descendants"," craig task list [--repo <repo-id>] List known Craig tasks"," craig task current Show the task resolved from flags, environment, or cwd"," craig task show [<id>] Show task details; omit id to use resolved context"," craig task pr show [<id>] [--repo <repo-id>]"," craig task pr discover [<id>] [--repo <repo-id>]"," craig task pr link [<id>] --pr <url|number> [--repo <repo-id>]"," craig task pr refresh [<id>] [--repo <repo-id>]"," craig task pr unlink [<id>] --pr <url|number> [--repo <repo-id>]"," craig agent list [--task <task-id>] List agent-tab and task roll-up states"," craig agent status [--task <task-id>] [--tab <tab-id>] Show agent state details"," craig agent send --task <task-id> [--tab <tab-id>] (--prompt <text> | --prompt-file <path> | --stdin)"," [--delivery when-ready|immediate] [--timeout <duration>] [--idempotency-key <key>]"," craig command show <command-id> Show a durable prompt command"," craig command list [--task <task-id>] List durable prompt commands"," craig command cancel <command-id> Cancel a queued prompt command"," craig command wait <command-id> [--state <states>] [--timeout <duration>]"," craig task wait [<id>] --state <states> [--tab <tab-id>] [--timeout <duration>]"," craig events list [--task <task-id>] [--type <glob>] [--after <cursor>] --json"," craig events watch [--task <task-id>] [--type <glob>] [--after <cursor>] [--format jsonl]"," craig fury validate <file> Validate a versioned fury YAML definition"," craig fury plan <file> [--root-task <id>] [--input key=value] Create an immutable approval plan"," craig fury approve <plan-id> Approve an exact validated plan (human only)"," craig fury run <plan-id> Start the single run authorized by an approved plan"," craig fury status|watch|cancel|resume <run-id> Inspect or control a durable run"," craig fury step complete|fail --run <run-id> --step <step-id> Explicitly finish agent work"," craig fury reviews list [--run <run-id>] [--state <state>] List human checkpoints"," craig fury review show|approve|reject|request-changes|resubmit <review-id>"," craig task logs <id> Stream Craig-managed logs for a task"," craig task diff <id> Show the current worktree diff for a task"," craig task attach <id> Attach to a live task session"," craig task focus <id> Focus the tmux pane for a task"," craig task open <id> Open the task worktree or print its path"," craig task check <id> Run configured checks for a task"," craig task commit <id> Commit all task worktree changes"," craig link add <task-id> <repo-id> Add a linked repo to a task"," craig link list <task-id> List linked repos for a task"].join(`
7
- `)}function Ow(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||!bu(l)){n.push(l);continue}if(s.has(l))throw P(`Global option ${l} may only be provided once.`);if(s.add(l),l==="--json"){r.json=!0;continue}if(l==="--no-input"){r.noInput=!0;continue}if(l==="--help"||l==="-h"){i=!0;continue}let c=t[a+1];if(c===void 0||c==="--"||bu(c))throw P(`Global option ${l} requires a value.`);a+=1,l==="--workspace-root"?r.workspaceRoot=j(c,"Workspace root"):r.taskId=j(c,"Task id")}return{commandTokens:n,options:r,help:i}}function $w(e){if(e.length===0)return{kind:"listWorkspaces",archived:!1};if(e.length===1&&e[0]==="--archived")return{kind:"listWorkspaces",archived:!0};throw P(`Unsupported command: workspace list ${e.join(" ")}`)}function Nw(e){if(e.length===0)return{kind:"listTasks"};if(e.length===2&&e[0]==="--repo")return{kind:"listTasks",repoId:j(e[1],"Repo id")};throw P(`Unsupported command: task list ${e.join(" ")}`)}function Dw(e){let t,n,r,s=[],i=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){i=!1;continue}if(!i||!["--repo","--workspace","--runner"].includes(l)){if(i&&l.startsWith("--"))throw P(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw P(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw P("Task option --repo may only be provided once.");t=j(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw P("Task option --workspace may only be provided once.");n=j(c,"Workspace id")}else{if(r!==void 0)throw P("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(u){throw P(u instanceof Error?u.message:"Unsupported runner.")}}}if(!t&&!n)throw P("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw P("Task creation accepts either '--repo' or '--workspace', not both.");let o=j(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function xw(e){let t,n,r,s,i=[],o=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){o=!1;continue}if(!o||!["--parent","--repo","--runner","--idempotency-key"].includes(l)){if(o&&l.startsWith("--"))throw P(`Unsupported task create-child option: ${l}`);i.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw P(`Task option ${l} requires a value.`);if(a+=1,l==="--parent"){if(t)throw P("Task option --parent may only be provided once.");t=j(c,"Parent task id")}else if(l==="--repo"){if(n)throw P("Task option --repo may only be provided once.");n=j(c,"Repo id")}else if(l==="--runner"){if(r)throw P("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(u){throw P(u instanceof Error?u.message:"Unsupported runner.")}}else{if(s)throw P("Task option --idempotency-key may only be provided once.");s=j(c,"Idempotency key")}}if(!n)throw P("Child task creation requires '--repo <repo-id>'.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},repoId:n,prompt:j(i.join(" "),"Child task prompt"),...r?{runner:r}:{},...s?{idempotencyKey:s}:{}}}function _w(e){let[t,...n]=e;if(!["show","discover","link","refresh","unlink"].includes(t??""))throw P(`Unsupported command: task pr ${e.join(" ")}`);let r,s,i;for(let a=0;a<n.length;a+=1){let l=n[a];if(l!=="--repo"&&l!=="--pr"){if(l.startsWith("--"))throw P(`Unsupported task pr ${t} option: ${l}`);if(r!==void 0)throw P(`task pr ${t} accepts at most one task id.`);r=j(l,"Task id");continue}let c=n[a+1];if(c===void 0||c==="--")throw P(`Task PR option ${l} requires a value.`);if(a+=1,l==="--repo"){if(s!==void 0)throw P("Task PR option --repo may only be provided once.");s=j(c,"Repo id")}else{if(i!==void 0)throw P("Task PR option --pr may only be provided once.");i=j(c,"Pull request selector")}}if((t==="link"||t==="unlink")&&i===void 0)throw P(`task pr ${t} requires --pr <url|number>.`);if(t!=="link"&&t!=="unlink"&&i!==void 0)throw P(`task pr ${t} does not accept --pr.`);let o={...r?{taskId:r}:{},...s?{repoId:s}:{}};switch(t){case"show":return{kind:"showTaskPr",...o};case"discover":return{kind:"discoverTaskPr",...o};case"link":return{kind:"linkTaskPr",...o,pullRequest:i};case"refresh":return{kind:"refreshTaskPr",...o};case"unlink":return{kind:"unlinkTaskPr",...o,pullRequest:i};default:throw P(`Unsupported command: task pr ${e.join(" ")}`)}}var na=300*1e3,Fw=new Set(["idle","working","ready","error"]),Lw=new Set(["queued","delivering","delivered","failed","cancelled"]);function Mw(e){if(e.length===0)return{kind:"showAgentStatus"};if(e.length===2&&e[0]==="--tab")return{kind:"showAgentStatus",tabId:j(e[1],"Agent tab id")};throw P(`Unsupported command: agent status ${e.join(" ")}`)}function jw(e){let t,n,r="when-ready",s=na,i,o=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--prompt","--prompt-file","--stdin","--tab","--delivery","--timeout","--idempotency-key"].includes(l))throw P(`Unsupported agent send option: ${l}`);if(o.has(l))throw P(`Agent send option ${l} may only be provided once.`);if(o.add(l),l==="--stdin"){if(t)throw P("Agent send accepts exactly one prompt source.");t={source:"stdin"};continue}let c=e[a+1];if(c===void 0||c.startsWith("--"))throw P(`Agent send option ${l} requires a value.`);if(a+=1,l==="--prompt"||l==="--prompt-file"){if(t)throw P("Agent send accepts exactly one prompt source.");t=l==="--prompt"?{source:"inline",text:j(c,"Prompt")}:{source:"file",path:j(c,"Prompt file")}}else if(l==="--tab")n=j(c,"Agent tab id");else if(l==="--delivery"){if(c!=="when-ready"&&c!=="immediate")throw P('Agent send delivery must be "when-ready" or "immediate".');r=c}else l==="--timeout"?s=sa(c):i=j(c,"Idempotency key")}if(!t)throw P("Agent send requires --prompt, --prompt-file, or --stdin.");return{kind:"sendAgentPrompt",prompt:t,delivery:r,timeoutMs:s,...n?{tabId:n}:{},...i?{idempotencyKey:i}:{}}}function qw(e){let t=j(e[0]??"","Command id"),n,r=na,s=new Set;for(let i=1;i<e.length;i+=1){let o=e[i];if(o!=="--state"&&o!=="--timeout")throw P(`Unsupported command wait option: ${o}`);if(s.has(o))throw P(`Command wait option ${o} may only be provided once.`);s.add(o);let a=e[i+1];if(a===void 0||a.startsWith("--"))throw P(`Command wait option ${o} requires a value.`);i+=1,o==="--state"?n=Uw(a):r=sa(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function Uw(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Lw.has(n)))throw P(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function ku(e,t){let n,r,s="human",i=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--type","--after","--format"].includes(l))throw P(`Unsupported events ${t?"watch":"list"} option: ${l}`);if(!t&&l==="--format")throw P("--format is supported only by events watch.");if(i.has(l))throw P(`Events option ${l} may only be provided once.`);i.add(l);let c=e[a+1];if(c===void 0||c.startsWith("--"))throw P(`Events option ${l} requires a value.`);if(a+=1,l==="--type")n=j(c,"Event type glob");else if(l==="--after")r=j(c,"Event cursor");else if(c==="jsonl")s="jsonl";else throw P('Events watch format must be "jsonl".')}let o={...n?{typeGlob:n}:{},...r?{after:r}:{}};return t?{kind:"watchEvents",...o,format:s}:{kind:"listEvents",...o}}function Ww(e){let t,n,r,s=na,i=new Set;for(let o=0;o<e.length;o+=1){let a=e[o];if(!["--state","--tab","--timeout"].includes(a)){if(a.startsWith("--"))throw P(`Unsupported task wait option: ${a}`);if(t!==void 0)throw P("task wait accepts at most one task id.");t=j(a,"Task id");continue}if(i.has(a))throw P(`Task wait option ${a} may only be provided once.`);i.add(a);let l=e[o+1];if(l===void 0||l.startsWith("--"))throw P(`Task wait option ${a} requires a value.`);o+=1,a==="--state"?n=Yw(l):a==="--tab"?r=j(l,"Agent tab id"):s=sa(l)}if(!n)throw P("task wait requires --state <idle|working|ready|error>[,...].");return{kind:"waitTask",...t?{taskId:t}:{},states:n,...r?{tabId:r}:{},timeoutMs:s}}function Bw(e){let t,n,r={};for(let s=0;s<e.length;s+=1){let i=e[s];if(i!=="--input"&&i!=="--root-task"){if(i.startsWith("--"))throw P(`Unsupported fury plan option: ${i}`);if(t!==void 0)throw P("fury plan accepts exactly one definition file.");t=j(i,"Fury file");continue}let o=e[s+1];if(o===void 0||o.startsWith("--"))throw P(`Fury plan option ${i} requires a value.`);if(s+=1,i==="--root-task"){if(n)throw P("Fury plan option --root-task may only be provided once.");n=j(o,"Root task id");continue}let a=o.indexOf("=");if(a<1)throw P(`Invalid fury input "${o}". Use key=value.`);let l=j(o.slice(0,a),"Fury input name");if(Object.hasOwn(r,l))throw P(`Fury input "${l}" may only be provided once.`);r[l]=o.slice(a+1)}if(!t)throw P("fury plan requires a definition file.");return{kind:"planFury",file:t,inputs:r,...n?{rootTaskId:n}:{}}}function Vw(e){let t=j(e[0]??"","Fury run id"),n,r="human";for(let s=1;s<e.length;s+=2){let i=e[s],o=e[s+1];if(!o||!["--after","--format"].includes(i??""))throw P("fury watch supports --after and --format jsonl.");if(i==="--after")n=j(o,"Event cursor");else if(o==="jsonl")r=o;else throw P("fury watch format must be jsonl.")}return{kind:"watchFury",runId:t,...n?{after:n}:{},format:r}}function Kw(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw P("fury step requires complete or fail.");let n=ra(e.slice(1),["--run","--step","--output","--output-file","--stdin","--reason"]),r=j(n.get("--run")??"","Fury run id"),s=j(n.get("--step")??"","Fury step id");if(t==="fail"){if(["--output","--output-file","--stdin"].some(a=>n.has(a)))throw P("fury step fail accepts only --reason.");return{kind:"failFuryStep",runId:r,stepId:s,reason:j(n.get("--reason")??"","Failure reason")}}if(n.has("--reason"))throw P("fury step complete does not accept --reason.");let i=["--output","--output-file","--stdin"].filter(a=>n.has(a));if(i.length>1)throw P("fury step complete accepts only one output source.");let o=i[0];return{kind:"completeFuryStep",runId:r,stepId:s,...o==="--output"?{output:{source:"inline",text:n.get(o)}}:o==="--output-file"?{output:{source:"file",path:n.get(o)}}:o==="--stdin"?{output:{source:"stdin"}}:{}}}function Gw(e){if(e[0]!=="list")throw P("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 P(`Unsupported fury review state: ${r}`);return{kind:"listFuryReviews",...n?{runId:n}:{},...r?{state:r}:{}}}function Hw(e){let t=e[0],n=j(e[1]??"","Fury review id");if(t==="show")return ia(e,2,"fury review show"),{kind:"showFuryReview",reviewId:n};if(!t||!["approve","reject","request-changes","resubmit"].includes(t))throw P("Unsupported fury review action.");let r=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 P(`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 P(`Unsupported or duplicate option: ${s}`);if(s==="--stdin"){n.set(s,"true");continue}let i=e[++r];if(i===void 0||i.startsWith("--"))throw P(`Option ${s} requires a value.`);n.set(s,j(i,s))}return n}function Yw(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Fw.has(n)))throw P(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function sa(e){let t=/^(\d+)(ms|s|m|h)$/.exec(e.trim());if(!t)throw P(`Invalid duration "${e}". Use values such as 500ms, 30s, 5m, or 1h.`);let n=Number(t[1]),r={ms:1,s:1e3,m:6e4,h:36e5}[t[2]],s=n*r;if(!Number.isSafeInteger(s))throw P(`Duration "${e}" is too large.`);return s}function Tu(e,t){return{mode:"command",command:e,commandName:Ew(e),options:t}}function bu(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function Er(e,t){ia(e,0,t)}function ia(e,t,n){if(e.length!==t)throw P(`Command ${n} received an unexpected number of arguments.`)}function X(e,t){if(e.length!==1)throw P(`${t} is required and must be provided once.`);return j(e[0],t)}function Ru(e,t){return j(e.join(" "),t)}function Su(e,t,n){return j(e[t]??"",n)}function j(e,t){let n=e.trim();if(n.length===0)throw P(`${t} cannot be empty.`);return n}function P(e){return new g("CLI_USAGE",`${e}
2
+ var sw=Object.defineProperty;var Ls=(e,t)=>{for(var n in t)sw(e,n,{get:t[n],enumerable:!0})};import{realpath as PE}from"node:fs/promises";import fe from"node:path";function ve(e){let t=fe.join(e,".craig");return{workspaceRoot:e,repoRoot:e,craigDir:t,indexFile:fe.join(t,"index.json"),reposDir:fe.join(t,"repos"),workspacesDir:fe.join(t,"workspaces"),sessionsDir:fe.join(t,"sessions"),runtimeDir:fe.join(t,"runtime"),uiStateFile:fe.join(t,"runtime","ui-state.json"),tasksDir:fe.join(t,"tasks"),jobsDir:fe.join(t,"jobs"),commandsDir:fe.join(t,"commands"),eventsDir:fe.join(t,"events"),orchestrationDir:fe.join(t,"orchestration"),logsDir:fe.join(t,"logs"),logFile:fe.join(t,"logs","craig.jsonl"),artifactsDir:fe.join(t,"artifacts"),worktreesDir:fe.join(t,"worktrees"),configFile:fe.join(t,"config.json")}}import Yc from"node:path";import{readFile as mI}from"node:fs/promises";import{readFile as pw}from"node:fs/promises";import{randomUUID as iw}from"node:crypto";import{chmod as ow,open as aw,readFile as lw,rename as cw,rm as dw}from"node:fs/promises";import Ho from"node:path";async function M(e,t,n={}){let r=Ho.dirname(e),s=Ho.join(r,`.${Ho.basename(e)}.${process.pid}.${Date.now()}.${iw()}.tmp`),i=await aw(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 cw(s,e),n.mode!==void 0&&await ow(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await dw(s,{force:!0}).catch(()=>{}),o}}async function Ms(e){try{let t=await lw(e,"utf8");return JSON.parse(t)}catch(t){if(uw(t))return null;throw t}}function uw(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 pw(e.uiStateFile,"utf8"),n=JSON.parse(t);return fw(n,e.uiStateFile)}catch(t){if(gw(t))return null;throw t}}async function jt(e,t){await M(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function qs(){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 fw(e,t){if(typeof e!="object"||e===null||e.version!==1||!(e.selectedRepoId===null||typeof e.selectedRepoId=="string")||!(e.selectedWorkspaceId===null||typeof e.selectedWorkspaceId=="string")||!(e.selectedTaskId===null||typeof e.selectedTaskId=="string")||!(e.selectedPtyTabId===void 0||e.selectedPtyTabId===null||typeof e.selectedPtyTabId=="string")||!qn(e,"inputMode")||!qn(e,"focusedRegion")||!qn(e,"activeTab")||!qn(e,"inspectorSection")||!qn(e,"inspectionMode")||!js(e,"openInspectionKind")||!js(e,"selectedFileTreePath")||!js(e,"selectedFilePath")||!js(e,"selectedDiffPath")||!mw(e,"collapsedFileTreePaths")||!qn(e,"selectedActionId")||typeof e.updatedAt!="string")throw new Error(`Craig UI state at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return e}function qn(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function js(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function mw(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function gw(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var Yo={};Ls(Yo,{RUNNER_IDS:()=>J,assertEnabled:()=>iu,buildCommand:()=>lu,getConfiguredProfile:()=>Us,getDefault:()=>su,getDisplayName:()=>au,getEnabled:()=>Ws,getProfile:()=>Wn,isRunnerType:()=>Bs,parse:()=>ou,setRunnerEnabled:()=>cu,setRunnerPath:()=>du});var J=["codex","cursor","claude"];var ru={codex:{id:"codex",displayName:"Codex",executable:"codex",defaultAgentTitle:"Codex"},cursor:{id:"cursor",displayName:"Cursor",executable:"cursor-agent",defaultAgentTitle:"Cursor"},claude:{id:"claude",displayName:"Claude",executable:"claude",defaultAgentTitle:"Claude"}};var Wn=e=>ru[e];var Us=(e,t={})=>{let n=Wn(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}};var Ws=(e={})=>J.filter(t=>e.runners?.[t]?.enabled!==!1);var su=(e={})=>{let t=Ws(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 iu=(e,t={})=>{if(t.runners?.[e]?.enabled===!1)throw new Error(`Runner "${e}" is disabled in .craig/config.json.`)};var Bs=e=>J.includes(e);var ou=e=>{if(!e||e.length===0)return"codex";if(!Bs(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${J.join(", ")}.`);return e};var au=e=>Wn(e).displayName;var lu=(e,t,n={})=>{let r=[Us(e,n).executable];return t&&t.length>0&&r.push(t),r};var cu=(e,t,n)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}});var du=(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 zo={};Ls(zo,{PREVIEW_FEATURE_IDS:()=>Je,isEnabled:()=>uu,setEnabled:()=>pu});var Je=["agentActivityIndicators","agentOrchestration"];function uu(e,t){return e.previews?.[t]===!0}function pu(e,t,n){return{...e,previews:{...e.previews,[t]:n}}}import{mkdir as hw,readFile as yw,writeFile as ww}from"node:fs/promises";import kw from"node:path";var Tw=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",fu=async e=>{try{return await yw(e,"utf8")}catch(t){if(Tw(t))return null;throw t}},mu=async(e,t)=>{await hw(kw.dirname(e),{recursive:!0}),await ww(e,t,"utf8")};var Vs=(e,t)=>{if(typeof e!="object"||e===null)throw new Error(`Craig config at ${t} is invalid. Expected a JSON object.`);let n=e;if(n.runners!==void 0){if(typeof n.runners!="object"||n.runners===null||Array.isArray(n.runners))throw new Error(`Craig config at ${t} is invalid. "runners" must be an object.`);for(let[r,s]of Object.entries(n.runners)){if(!J.includes(r))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" is not supported. Expected one of: ${J.join(", ")}.`);if(typeof s!="object"||s===null||Array.isArray(s))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" must be an object.`);let i=s;if(i.enabled!==void 0&&typeof i.enabled!="boolean")throw new Error(`Craig config at ${t} is invalid. "runners.${r}.enabled" must be a boolean.`);if(i.path!==void 0&&(typeof i.path!="string"||i.path.trim().length===0))throw new Error(`Craig config at ${t} is invalid. "runners.${r}.path" must be a non-empty string.`)}}if(n.checks!==void 0&&(typeof n.checks!="object"||n.checks===null||!Array.isArray(n.checks.commands)||!n.checks.commands.every(r=>typeof r=="string")))throw new Error(`Craig config at ${t} is invalid. "checks.commands" must be an array of strings.`);if(n.open!==void 0&&(typeof n.open!="object"||n.open===null||!Array.isArray(n.open.command)||!n.open.command.every(r=>typeof r=="string")))throw new Error(`Craig config at ${t} is invalid. "open.command" must be an array of strings.`);if(n.github!==void 0){if(typeof n.github!="object"||n.github===null)throw new Error(`Craig config at ${t} is invalid. "github" must be an object.`);if(n.github.mergeMethod!==void 0&&n.github.mergeMethod!=="merge"&&n.github.mergeMethod!=="rebase"&&n.github.mergeMethod!=="squash")throw new Error(`Craig config at ${t} is invalid. "github.mergeMethod" must be "merge", "rebase", or "squash".`);if(n.github.watchIntervalSeconds!==void 0&&(!Number.isInteger(n.github.watchIntervalSeconds)||n.github.watchIntervalSeconds<=0))throw new Error(`Craig config at ${t} is invalid. "github.watchIntervalSeconds" must be a positive integer.`)}if(n.previews!==void 0){if(typeof n.previews!="object"||n.previews===null||Array.isArray(n.previews))throw new Error(`Craig config at ${t} is invalid. "previews" must be an object.`);for(let[r,s]of Object.entries(n.previews)){if(r!=="incrementalCenterPane"&&!Je.includes(r))throw new Error(`Craig config at ${t} is invalid. "previews.${r}" is not supported. Expected one of: ${Je.join(", ")}.`);if(typeof s!="boolean")throw new Error(`Craig config at ${t} is invalid. "previews.${r}" must be a boolean.`)}}return n};var Jo=async(e,t={readConfigFile:fu})=>{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 Vs(r,e.configFile)};var Xo=async(e,t,n={writeConfigFile:mu})=>{Vs(t,e.configFile),await n.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
4
+ `)};var Qo={};Ls(Qo,{checkForUpdate:()=>gu,getCurrent:()=>Ks});var Ks=()=>{try{return"0.13.5"}catch{return"unknown"}};var bw="https://registry.npmjs.org/craig-cli/latest",Rw=3600*1e3,Sw={value:null},Pw=(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},gu=async(e={fetch:globalThis.fetch,getCurrent:Ks,cache:Sw})=>{let t=e.getCurrent(),n=Date.now();if(e.cache.value&&n-e.cache.value.cachedAt<Rw)return e.cache.value.result;let r=null;try{let i=await e.fetch(bw,{signal:AbortSignal.timeout(5e3)});i.ok&&(r=(await i.json()).version??null)}catch{}let s={current:t,latest:r,updateAvailable:r!==null&&r!==t&&Pw(r,t)};return e.cache.value={result:s,cachedAt:n},s};var k={load:Jo,save:Xo,previews:zo,runners:Yo,version:Qo};var hu={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},h=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=hu[t],this.retryable=r.retryable??!1,this.details=r.details??{}}};function Zo(e){return e instanceof h?e:new h("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as Iw,mkdir as vw,readFile as Cw}from"node:fs/promises";import Aw from"node:path";var yu=80,Gs=async(e,t)=>{await vw(Aw.dirname(e.logFile),{recursive:!0});let n={timestamp:new Date().toISOString(),...t};await Iw(e.logFile,`${JSON.stringify(n)}
5
+ `,"utf8")},wu=async(e,t)=>{try{await Gs(e,t)}catch{}},Hs=async(e,t=yu)=>{try{let s=(await Cw(e.logFile,"utf8")).trimEnd().split(`
6
+ `).filter(i=>i.length>0).map(Ew);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if($w(n))return{path:e.logFile,lines:[],empty:!0};throw n}},ea=async(e,t)=>Gs(e,{level:"error",component:"application",event:Ow(t.context),message:t.message,...t.details?{details:t.details}:{}}),ku=async(e,t)=>{try{await ea(e,t)}catch{}},Tu=Hs,bu=async(e,t=yu)=>Hs(e,t);function Ew(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 Ow(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function $w(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var we={appendErrorLog:ea,appendErrorLogBestEffort:ku,appendLog:Gs,appendLogBestEffort:wu,readLog:Hs,readErrorLog:Tu,readRecentErrorLines:bu};function Cu(e){let{commandTokens:t,options:n,help:r}=Nw(e);if(r)return Su({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":Or(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:Iu(o,"Repo path")};break;case"repo:list":Or(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:X(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:Iu(o,"Workspace path")};break;case"workspace:list":a=xw(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:X(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:X(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:X(o,"Workspace id")};break;case"task:new":a=Fw(o);break;case"task:create-child":a=Lw(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:X(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:X(o,"Task id")}};break;case"task:list":a=_w(o);break;case"task:current":Or(o,"task current"),a={kind:"currentTask"};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:X(o,"Task id")};break;case"task:pr":a=Mw(o);break;case"task:wait":a=Kw(o);break;case"agent:list":Or(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=Uw(o);break;case"agent:send":a=Ww(o);break;case"command:show":a={kind:"showPromptCommand",commandId:X(o,"Command id")};break;case"command:list":Or(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:X(o,"Command id")};break;case"command:wait":a=Bw(o);break;case"events:list":a=Ru(o,!1);break;case"events:watch":a=Ru(o,!0);break;case"fury:validate":a={kind:"validateFury",file:X(o,"Fury file")};break;case"fury:plan":a=Gw(o);break;case"fury:approve":a={kind:"approveFury",planId:X(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:X(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:X(o,"Fury run id")};break;case"fury:watch":a=Hw(o);break;case"fury:cancel":a={kind:"cancelFury",runId:X(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:X(o,"Fury run id")};break;case"fury:step":a=Yw(o);break;case"fury:reviews":a=zw(o);break;case"fury:review":a=Jw(o);break;case"task:attach":a={kind:"attachTask",taskId:X(o,"Task id")};break;case"task:logs":a={kind:"streamTaskLogs",taskId:X(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:X(o,"Task id")};break;case"task:focus":a={kind:"focusTask",taskId:X(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:X(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:X(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:X(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:vu(o,0,"Task id"),repoId:vu(o,1,"Repo id")},ia(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:X(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw P(`Unsupported command: ${t.join(" ")}`)}return Su(a,n)}function Au(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 Dw(e){return e.kind==="actFuryReview"?`fury.review.${e.action==="request_changes"?"request-changes":e.action}`:{addWorkspace:"workspace.add",addRepo:"repo.add",listRepos:"repo.list",removeRepo:"repo.remove",listWorkspaces:"workspace.list",archiveWorkspace:"workspace.archive",restoreWorkspace:"workspace.restore",removeWorkspace:"workspace.remove",createTask:"task.new",createChildTask:"task.create-child",listTaskChildren:"task.children",cancelTaskTree:"task.cancel-tree",validateFury:"fury.validate",planFury:"fury.plan",approveFury:"fury.approve",runFury:"fury.run",showFury:"fury.status",watchFury:"fury.watch",cancelFury:"fury.cancel",resumeFury:"fury.resume",completeFuryStep:"fury.step.complete",failFuryStep:"fury.step.fail",listFuryReviews:"fury.reviews.list",showFuryReview:"fury.review.show",actFuryReview:"fury.review.action",listTasks:"task.list",currentTask:"task.current",showTask:"task.show",showCurrentTask:"task.show",showTaskPr:"task.pr.show",discoverTaskPr:"task.pr.discover",linkTaskPr:"task.pr.link",refreshTaskPr:"task.pr.refresh",unlinkTaskPr:"task.pr.unlink",listAgents:"agent.list",showAgentStatus:"agent.status",sendAgentPrompt:"agent.send",showPromptCommand:"command.show",listPromptCommands:"command.list",cancelPromptCommand:"command.cancel",waitPromptCommand:"command.wait",waitTask:"task.wait",listEvents:"events.list",watchEvents:"events.watch",attachTask:"task.attach",addTaskLink:"link.add",listTaskLinks:"link.list",refreshInteractiveState:"interactive.refresh",showSelectedTask:"task.show",streamTaskLogs:"task.logs",streamSelectedTaskLogs:"task.logs",showTaskDiff:"task.diff",showSelectedTaskDiff:"task.diff",focusTask:"task.focus",focusSelectedTask:"task.focus",openTask:"task.open",openSelectedTask:"task.open",runChecks:"task.check",runSelectedTaskChecks:"task.check",commitTask:"task.commit",commitSelectedTask:"task.commit",showContext:"context.show",help:"help",exit:"exit"}[e.kind]}function 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 task new --repo <repo-id> [--runner codex|cursor|claude] <prompt>"," craig task new --workspace <workspace-id> [--runner codex|cursor|claude] <prompt>"," craig task create-child --parent <task-id> --repo <repo-id> [--runner codex|cursor|claude] [--idempotency-key <key>] <prompt>"," craig task children [<task-id>] List direct child tasks"," craig task cancel-tree [<task-id>] Cancel a task and all descendants"," craig task list [--repo <repo-id>] List known Craig tasks"," craig task current Show the task resolved from flags, environment, or cwd"," craig task show [<id>] Show task details; omit id to use resolved context"," craig task pr show [<id>] [--repo <repo-id>]"," craig task pr discover [<id>] [--repo <repo-id>]"," craig task pr link [<id>] --pr <url|number> [--repo <repo-id>]"," craig task pr refresh [<id>] [--repo <repo-id>]"," craig task pr unlink [<id>] --pr <url|number> [--repo <repo-id>]"," craig agent list [--task <task-id>] List agent-tab and task roll-up states"," craig agent status [--task <task-id>] [--tab <tab-id>] Show agent state details"," craig agent send --task <task-id> [--tab <tab-id>] (--prompt <text> | --prompt-file <path> | --stdin)"," [--delivery when-ready|immediate] [--timeout <duration>] [--idempotency-key <key>]"," craig command show <command-id> Show a durable prompt command"," craig command list [--task <task-id>] List durable prompt commands"," craig command cancel <command-id> Cancel a queued prompt command"," craig command wait <command-id> [--state <states>] [--timeout <duration>]"," craig task wait [<id>] --state <states> [--tab <tab-id>] [--timeout <duration>]"," craig events list [--task <task-id>] [--type <glob>] [--after <cursor>] --json"," craig events watch [--task <task-id>] [--type <glob>] [--after <cursor>] [--format jsonl]"," craig fury validate <file> Validate a versioned fury YAML definition"," craig fury plan <file> [--root-task <id>] [--input key=value] Create an immutable approval plan"," craig fury approve <plan-id> Approve an exact validated plan (human only)"," craig fury run <plan-id> Start the single run authorized by an approved plan"," craig fury status|watch|cancel|resume <run-id> Inspect or control a durable run"," craig fury step complete|fail --run <run-id> --step <step-id> Explicitly finish agent work"," craig fury reviews list [--run <run-id>] [--state <state>] List human checkpoints"," craig fury review show|approve|reject|request-changes|resubmit <review-id>"," craig task logs <id> Stream Craig-managed logs for a task"," craig task diff <id> Show the current worktree diff for a task"," craig task attach <id> Attach to a live task session"," craig task focus <id> Focus the tmux pane for a task"," craig task open <id> Open the task worktree or print its path"," craig task check <id> Run configured checks for a task"," craig task commit <id> Commit all task worktree changes"," craig link add <task-id> <repo-id> Add a linked repo to a task"," craig link list <task-id> List linked repos for a task"].join(`
7
+ `)}function Nw(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||!Pu(l)){n.push(l);continue}if(s.has(l))throw P(`Global option ${l} may only be provided once.`);if(s.add(l),l==="--json"){r.json=!0;continue}if(l==="--no-input"){r.noInput=!0;continue}if(l==="--help"||l==="-h"){i=!0;continue}let c=t[a+1];if(c===void 0||c==="--"||Pu(c))throw P(`Global option ${l} requires a value.`);a+=1,l==="--workspace-root"?r.workspaceRoot=j(c,"Workspace root"):r.taskId=j(c,"Task id")}return{commandTokens:n,options:r,help:i}}function xw(e){if(e.length===0)return{kind:"listWorkspaces",archived:!1};if(e.length===1&&e[0]==="--archived")return{kind:"listWorkspaces",archived:!0};throw P(`Unsupported command: workspace list ${e.join(" ")}`)}function _w(e){if(e.length===0)return{kind:"listTasks"};if(e.length===2&&e[0]==="--repo")return{kind:"listTasks",repoId:j(e[1],"Repo id")};throw P(`Unsupported command: task list ${e.join(" ")}`)}function Fw(e){let t,n,r,s=[],i=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){i=!1;continue}if(!i||!["--repo","--workspace","--runner"].includes(l)){if(i&&l.startsWith("--"))throw P(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw P(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw P("Task option --repo may only be provided once.");t=j(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw P("Task option --workspace may only be provided once.");n=j(c,"Workspace id")}else{if(r!==void 0)throw P("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(u){throw P(u instanceof Error?u.message:"Unsupported runner.")}}}if(!t&&!n)throw P("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw P("Task creation accepts either '--repo' or '--workspace', not both.");let o=j(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function Lw(e){let t,n,r,s,i=[],o=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){o=!1;continue}if(!o||!["--parent","--repo","--runner","--idempotency-key"].includes(l)){if(o&&l.startsWith("--"))throw P(`Unsupported task create-child option: ${l}`);i.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw P(`Task option ${l} requires a value.`);if(a+=1,l==="--parent"){if(t)throw P("Task option --parent may only be provided once.");t=j(c,"Parent task id")}else if(l==="--repo"){if(n)throw P("Task option --repo may only be provided once.");n=j(c,"Repo id")}else if(l==="--runner"){if(r)throw P("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(u){throw P(u instanceof Error?u.message:"Unsupported runner.")}}else{if(s)throw P("Task option --idempotency-key may only be provided once.");s=j(c,"Idempotency key")}}if(!n)throw P("Child task creation requires '--repo <repo-id>'.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},repoId:n,prompt:j(i.join(" "),"Child task prompt"),...r?{runner:r}:{},...s?{idempotencyKey:s}:{}}}function Mw(e){let[t,...n]=e;if(!["show","discover","link","refresh","unlink"].includes(t??""))throw P(`Unsupported command: task pr ${e.join(" ")}`);let r,s,i;for(let a=0;a<n.length;a+=1){let l=n[a];if(l!=="--repo"&&l!=="--pr"){if(l.startsWith("--"))throw P(`Unsupported task pr ${t} option: ${l}`);if(r!==void 0)throw P(`task pr ${t} accepts at most one task id.`);r=j(l,"Task id");continue}let c=n[a+1];if(c===void 0||c==="--")throw P(`Task PR option ${l} requires a value.`);if(a+=1,l==="--repo"){if(s!==void 0)throw P("Task PR option --repo may only be provided once.");s=j(c,"Repo id")}else{if(i!==void 0)throw P("Task PR option --pr may only be provided once.");i=j(c,"Pull request selector")}}if((t==="link"||t==="unlink")&&i===void 0)throw P(`task pr ${t} requires --pr <url|number>.`);if(t!=="link"&&t!=="unlink"&&i!==void 0)throw P(`task pr ${t} does not accept --pr.`);let o={...r?{taskId:r}:{},...s?{repoId:s}:{}};switch(t){case"show":return{kind:"showTaskPr",...o};case"discover":return{kind:"discoverTaskPr",...o};case"link":return{kind:"linkTaskPr",...o,pullRequest:i};case"refresh":return{kind:"refreshTaskPr",...o};case"unlink":return{kind:"unlinkTaskPr",...o,pullRequest:i};default:throw P(`Unsupported command: task pr ${e.join(" ")}`)}}var na=300*1e3,jw=new Set(["idle","working","ready","error"]),qw=new Set(["queued","delivering","delivered","failed","cancelled"]);function Uw(e){if(e.length===0)return{kind:"showAgentStatus"};if(e.length===2&&e[0]==="--tab")return{kind:"showAgentStatus",tabId:j(e[1],"Agent tab id")};throw P(`Unsupported command: agent status ${e.join(" ")}`)}function Ww(e){let t,n,r="when-ready",s=na,i,o=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--prompt","--prompt-file","--stdin","--tab","--delivery","--timeout","--idempotency-key"].includes(l))throw P(`Unsupported agent send option: ${l}`);if(o.has(l))throw P(`Agent send option ${l} may only be provided once.`);if(o.add(l),l==="--stdin"){if(t)throw P("Agent send accepts exactly one prompt source.");t={source:"stdin"};continue}let c=e[a+1];if(c===void 0||c.startsWith("--"))throw P(`Agent send option ${l} requires a value.`);if(a+=1,l==="--prompt"||l==="--prompt-file"){if(t)throw P("Agent send accepts exactly one prompt source.");t=l==="--prompt"?{source:"inline",text:j(c,"Prompt")}:{source:"file",path:j(c,"Prompt file")}}else if(l==="--tab")n=j(c,"Agent tab id");else if(l==="--delivery"){if(c!=="when-ready"&&c!=="immediate")throw P('Agent send delivery must be "when-ready" or "immediate".');r=c}else l==="--timeout"?s=sa(c):i=j(c,"Idempotency key")}if(!t)throw P("Agent send requires --prompt, --prompt-file, or --stdin.");return{kind:"sendAgentPrompt",prompt:t,delivery:r,timeoutMs:s,...n?{tabId:n}:{},...i?{idempotencyKey:i}:{}}}function Bw(e){let t=j(e[0]??"","Command id"),n,r=na,s=new Set;for(let i=1;i<e.length;i+=1){let o=e[i];if(o!=="--state"&&o!=="--timeout")throw P(`Unsupported command wait option: ${o}`);if(s.has(o))throw P(`Command wait option ${o} may only be provided once.`);s.add(o);let a=e[i+1];if(a===void 0||a.startsWith("--"))throw P(`Command wait option ${o} requires a value.`);i+=1,o==="--state"?n=Vw(a):r=sa(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function Vw(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!qw.has(n)))throw P(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function Ru(e,t){let n,r,s="human",i=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--type","--after","--format"].includes(l))throw P(`Unsupported events ${t?"watch":"list"} option: ${l}`);if(!t&&l==="--format")throw P("--format is supported only by events watch.");if(i.has(l))throw P(`Events option ${l} may only be provided once.`);i.add(l);let c=e[a+1];if(c===void 0||c.startsWith("--"))throw P(`Events option ${l} requires a value.`);if(a+=1,l==="--type")n=j(c,"Event type glob");else if(l==="--after")r=j(c,"Event cursor");else if(c==="jsonl")s="jsonl";else throw P('Events watch format must be "jsonl".')}let o={...n?{typeGlob:n}:{},...r?{after:r}:{}};return t?{kind:"watchEvents",...o,format:s}:{kind:"listEvents",...o}}function Kw(e){let t,n,r,s=na,i=new Set;for(let o=0;o<e.length;o+=1){let a=e[o];if(!["--state","--tab","--timeout"].includes(a)){if(a.startsWith("--"))throw P(`Unsupported task wait option: ${a}`);if(t!==void 0)throw P("task wait accepts at most one task id.");t=j(a,"Task id");continue}if(i.has(a))throw P(`Task wait option ${a} may only be provided once.`);i.add(a);let l=e[o+1];if(l===void 0||l.startsWith("--"))throw P(`Task wait option ${a} requires a value.`);o+=1,a==="--state"?n=Xw(l):a==="--tab"?r=j(l,"Agent tab id"):s=sa(l)}if(!n)throw P("task wait requires --state <idle|working|ready|error>[,...].");return{kind:"waitTask",...t?{taskId:t}:{},states:n,...r?{tabId:r}:{},timeoutMs:s}}function Gw(e){let t,n,r={};for(let s=0;s<e.length;s+=1){let i=e[s];if(i!=="--input"&&i!=="--root-task"){if(i.startsWith("--"))throw P(`Unsupported fury plan option: ${i}`);if(t!==void 0)throw P("fury plan accepts exactly one definition file.");t=j(i,"Fury file");continue}let o=e[s+1];if(o===void 0||o.startsWith("--"))throw P(`Fury plan option ${i} requires a value.`);if(s+=1,i==="--root-task"){if(n)throw P("Fury plan option --root-task may only be provided once.");n=j(o,"Root task id");continue}let a=o.indexOf("=");if(a<1)throw P(`Invalid fury input "${o}". Use key=value.`);let l=j(o.slice(0,a),"Fury input name");if(Object.hasOwn(r,l))throw P(`Fury input "${l}" may only be provided once.`);r[l]=o.slice(a+1)}if(!t)throw P("fury plan requires a definition file.");return{kind:"planFury",file:t,inputs:r,...n?{rootTaskId:n}:{}}}function Hw(e){let t=j(e[0]??"","Fury run id"),n,r="human";for(let s=1;s<e.length;s+=2){let i=e[s],o=e[s+1];if(!o||!["--after","--format"].includes(i??""))throw P("fury watch supports --after and --format jsonl.");if(i==="--after")n=j(o,"Event cursor");else if(o==="jsonl")r=o;else throw P("fury watch format must be jsonl.")}return{kind:"watchFury",runId:t,...n?{after:n}:{},format:r}}function Yw(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw P("fury step requires complete or fail.");let n=ra(e.slice(1),["--run","--step","--output","--output-file","--stdin","--reason"]),r=j(n.get("--run")??"","Fury run id"),s=j(n.get("--step")??"","Fury step id");if(t==="fail"){if(["--output","--output-file","--stdin"].some(a=>n.has(a)))throw P("fury step fail accepts only --reason.");return{kind:"failFuryStep",runId:r,stepId:s,reason:j(n.get("--reason")??"","Failure reason")}}if(n.has("--reason"))throw P("fury step complete does not accept --reason.");let i=["--output","--output-file","--stdin"].filter(a=>n.has(a));if(i.length>1)throw P("fury step complete accepts only one output source.");let o=i[0];return{kind:"completeFuryStep",runId:r,stepId:s,...o==="--output"?{output:{source:"inline",text:n.get(o)}}:o==="--output-file"?{output:{source:"file",path:n.get(o)}}:o==="--stdin"?{output:{source:"stdin"}}:{}}}function zw(e){if(e[0]!=="list")throw P("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 P(`Unsupported fury review state: ${r}`);return{kind:"listFuryReviews",...n?{runId:n}:{},...r?{state:r}:{}}}function Jw(e){let t=e[0],n=j(e[1]??"","Fury review id");if(t==="show")return ia(e,2,"fury review show"),{kind:"showFuryReview",reviewId:n};if(!t||!["approve","reject","request-changes","resubmit"].includes(t))throw P("Unsupported fury review action.");let r=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 P(`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 P(`Unsupported or duplicate option: ${s}`);if(s==="--stdin"){n.set(s,"true");continue}let i=e[++r];if(i===void 0||i.startsWith("--"))throw P(`Option ${s} requires a value.`);n.set(s,j(i,s))}return n}function Xw(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!jw.has(n)))throw P(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function sa(e){let t=/^(\d+)(ms|s|m|h)$/.exec(e.trim());if(!t)throw P(`Invalid duration "${e}". Use values such as 500ms, 30s, 5m, or 1h.`);let n=Number(t[1]),r={ms:1,s:1e3,m:6e4,h:36e5}[t[2]],s=n*r;if(!Number.isSafeInteger(s))throw P(`Duration "${e}" is too large.`);return s}function Su(e,t){return{mode:"command",command:e,commandName:Dw(e),options:t}}function Pu(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function Or(e,t){ia(e,0,t)}function ia(e,t,n){if(e.length!==t)throw P(`Command ${n} received an unexpected number of arguments.`)}function X(e,t){if(e.length!==1)throw P(`${t} is required and must be provided once.`);return j(e[0],t)}function Iu(e,t){return j(e.join(" "),t)}function vu(e,t,n){return j(e[t]??"",n)}function j(e,t){let n=e.trim();if(n.length===0)throw P(`${t} cannot be empty.`);return n}function P(e){return new h("CLI_USAGE",`${e}
8
8
 
9
- ${ta()}`,{})}var qe=(e,t)=>{let n=oa(e);if(!Jw(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},oa=e=>{if(typeof e!="object"||e===null)return e;let t=e,n=e,r={...n};return delete r.swarmRunId,delete r.swarmStepId,{...r,runner:aa(t.runner),repoId:typeof t.repoId=="string"?t.repoId:"legacy_repo",workspaceId:typeof t.workspaceId=="string"?t.workspaceId:"legacy_workspace",sessionId:typeof t.sessionId=="string"||t.sessionId===null?t.sessionId:null,selectedPtyTabId:typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null?t.selectedPtyTabId:null,linkedRepoIds:Array.isArray(t.linkedRepoIds)?t.linkedRepoIds.filter(s=>typeof s=="string"):[],parentTaskId:typeof t.parentTaskId=="string"||t.parentTaskId===null?t.parentTaskId:null,rootTaskId:typeof t.rootTaskId=="string"?t.rootTaskId:t.id,delegationDepth:Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0?t.delegationDepth:0,delegationIdempotencyKey:typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null?t.delegationIdempotencyKey:null,furyRunId:typeof t.furyRunId=="string"||t.furyRunId===null?t.furyRunId:typeof n.swarmRunId=="string"?n.swarmRunId:null,furyStepId:typeof t.furyStepId=="string"||t.furyStepId===null?t.furyStepId:typeof n.swarmStepId=="string"?n.swarmStepId:null,ptyTabs:Zw(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:Xw(t.repoTargets),runnerSession:t.runnerSession??zw(t),checks:ok(t),lastCommit:t.lastCommit??null,prs:ak(t),artifacts:uk(t),cleanup:pk(t)}},zw=e=>{if(typeof e.title!="string")return null;let t=aa(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},Jw=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.id=="string"&&typeof t.title=="string"&&typeof t.slug=="string"&&(t.type==="repo"||t.type==="project")&&typeof t.status=="string"&&k.runners.isRunnerType(t.runner??"")&&typeof t.repoId=="string"&&typeof t.workspaceId=="string"&&(typeof t.sessionId=="string"||t.sessionId===null)&&(typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null)&&Array.isArray(t.linkedRepoIds)&&t.linkedRepoIds.every(n=>typeof n=="string")&&(typeof t.parentTaskId=="string"||t.parentTaskId===null)&&typeof t.rootTaskId=="string"&&Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0&&(typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null)&&(typeof t.furyRunId=="string"||t.furyRunId===null)&&(typeof t.furyStepId=="string"||t.furyStepId===null)&&typeof t.repoRoot=="string"&&typeof t.worktreePath=="string"&&typeof t.branch=="string"&&Cu(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||Qw(t.repoTargets))&&tk(t.runnerSession)&&nk(t.prompt)&&Au(t.checks)&&Eu(t.lastCommit)&&sk(t.prs)&&ik(t.artifacts)&&$u(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Xw=e=>{if(Array.isArray(e))return e.filter(vu)},Qw=e=>Array.isArray(e)&&e.every(vu),vu=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)&&Au(t.checks)&&Eu(t.lastCommit)&&Ou(t.pullRequest)&&$u(t.cleanup)},Zw=e=>{if(Cu(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 ek(e.id,e.title,t,aa(e.runner))},ek=(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}]},aa=e=>e&&k.runners.isRunnerType(e)?e:"codex",Cu=e=>Array.isArray(e)&&e.every(t=>typeof t=="object"&&t!==null&&typeof t.id=="string"&&(t.kind==="agent"||t.kind==="terminal")&&(t.capabilityId===void 0||typeof t.capabilityId=="string")&&typeof t.title=="string"&&Array.isArray(t.command)&&t.command.every(n=>typeof n=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"),tk=e=>typeof e=="object"&&e!==null&&Array.isArray(e.command)&&e.command.every(t=>typeof t=="string")&&(typeof e.pid=="number"||e.pid===null)&&(typeof e.startedAt=="string"||e.startedAt===null)&&(e.lastKnownState==="starting"||e.lastKnownState==="running"||e.lastKnownState==="exited"||e.lastKnownState==="failed")&&(typeof e.exitCode=="number"||e.exitCode===null)&&(typeof e.exitedAt=="string"||e.exitedAt===null),nk=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",Au=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"),Eu=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",Ou=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&rk(e.requiredChecks),rk=e=>Array.isArray(e)&&e.every(t=>typeof t=="object"&&t!==null&&typeof t.name=="string"&&(t.status==="pending"||t.status==="success"||t.status==="failed"||t.status==="skipped"||t.status==="unknown")&&(typeof t.conclusion=="string"||t.conclusion===null)),sk=e=>Array.isArray(e)&&e.every(Ou),ik=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),$u=e=>typeof e=="object"&&e!==null&&(typeof e.paneClosedAt=="string"||e.paneClosedAt===null)&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),ok=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},ak=e=>{if(Array.isArray(e.prs))return e.prs.map(lk);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:Nu(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:Du(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},lk=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:Nu(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:ck(t.reviewDecision),requiredChecks:Du(t.requiredChecks),comments:dk(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},Nu=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,ck=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,dk=e=>Array.isArray(e)?e.flatMap(t=>{if(typeof t!="object"||t===null)return[];let n=t;return typeof n.body!="string"||!n.body.trim()?[]:[{author:typeof n.author=="string"?n.author:null,body:n.body,createdAt:typeof n.createdAt=="string"?n.createdAt:null,url:typeof n.url=="string"?n.url:null}]}):[],Du=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})):[],uk=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},pk=e=>e.cleanup??{paneClosedAt:null,worktreeRemovedAt:null,preservedWorktree:!1,warning:null};import{readFile as Jk}from"node:fs/promises";import{readFile as fk,readdir as mk,rm as hk}from"node:fs/promises";import xu from"node:path";var la=(e,t)=>xu.join(e.workspacesDir,`${t}.json`),gk=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"):[]}},_u=(e,t)=>{let n=gk(e);if(typeof n!="object"||n===null||typeof n.id!="string"||n.kind!=="repo"&&n.kind!=="project"||typeof n.name!="string"||typeof n.rootPath!="string"||typeof n.primaryRepoId!="string"||typeof n.branch!="string"||n.status!=="active"&&n.status!=="archived"||!Array.isArray(n.linkedRepoIds)||!(n.linkedRepoIds??[]).every(r=>typeof r=="string")||!(n.repoId===void 0||typeof n.repoId=="string")||!Array.isArray(n.discoveredRepoIds)||!(n.discoveredRepoIds??[]).every(r=>typeof r=="string")||!(n.archivedAt===null||typeof n.archivedAt=="string")||typeof n.createdAt!="string"||typeof n.updatedAt!="string")throw new Error(`Craig workspace record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},mn=async(e,t)=>{let n=la(e,t);try{let r=await fk(n,"utf8");return _u(JSON.parse(r),n)}catch(r){throw yk(r)?new g("WORKSPACE_NOT_FOUND",`Craig workspace "${t}" was not found.`,{details:{workspaceId:t}}):r instanceof SyntaxError||r instanceof Error&&r.message.startsWith("Craig workspace record at ")?new g("WORKSPACE_RECORD_INVALID",r instanceof Error?r.message:`Craig workspace "${t}" is invalid.`,{details:{workspaceId:t},cause:r}):r}},hn=async(e,t)=>{await M(la(e,t.id),{...t,updatedAt:new Date().toISOString()})},$e=async e=>{let t=await mk(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>mn(e,xu.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},Fu=async(e,t)=>{await hk(la(e,t),{force:!0})},yk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as wk,readdir as kk,rm as Tk}from"node:fs/promises";import Lu from"node:path";var ca=(e,t)=>Lu.join(e.reposDir,`${t}.json`),Mu=(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},Ue=async(e,t)=>{let n=ca(e,t);try{let r=await wk(n,"utf8");return Mu(JSON.parse(r),n)}catch(r){throw bk(r)?new g("REPO_NOT_FOUND",`Craig repo "${t}" was not found.`,{details:{repoId:t}}):r instanceof SyntaxError||r instanceof Error&&r.message.startsWith("Craig repo record at ")?new g("REPO_RECORD_INVALID",r instanceof Error?r.message:`Craig repo "${t}" is invalid.`,{details:{repoId:t},cause:r}):r}},da=async(e,t)=>{await M(ca(e,t.id),{...t,updatedAt:new Date().toISOString()})},Or=async e=>{let t=await kk(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>Ue(e,Lu.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},ju=async(e,t)=>{await Tk(ca(e,t),{force:!0})},bk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as Rk}from"node:fs/promises";var Sk=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return t.version===2&&typeof t.workspaceRoot=="string"&&Array.isArray(t.repoIds)&&t.repoIds.every(n=>typeof n=="string")&&Array.isArray(t.workspaceIds)&&t.workspaceIds.every(n=>typeof n=="string")&&Array.isArray(t.taskIds)&&t.taskIds.every(n=>typeof n=="string")&&Array.isArray(t.jobIds)&&t.jobIds.every(n=>typeof n=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Bn=(e,t,n)=>{if(!Sk(e))throw new Error(`Craig index at ${n} is invalid. Remove or repair the file before rerunning Craig.`);if(e.workspaceRoot!==t)throw new Error(`Craig index at ${n} belongs to ${e.workspaceRoot}, not ${t}. Remove or repair the file before rerunning Craig.`);return e},Ce=async e=>{let t=await Rk(e.indexFile,"utf8");return Bn(JSON.parse(t),e.workspaceRoot,e.indexFile)},Tt=async(e,t)=>{await M(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as Ak,stat as Ek}from"node:fs/promises";import Kn from"node:path";import{realpath as Wu}from"node:fs/promises";import Ys from"node:path";import{execFile as Pk}from"node:child_process";import{promisify as Ik}from"node:util";var qu=Ik(Pk);async function F(e,t,n={}){try{let r=await qu(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(Uu(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function G(e,t,n={}){try{let r=await qu(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(Uu(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function Uu(e){return e instanceof Error}var ua=async e=>{try{let n=(await F("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([Wu(n).catch(()=>Ys.resolve(n)),Wu(e).catch(()=>Ys.resolve(e))]);return r===s}catch{return!1}},pa=async e=>{let t=await G("git",["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"],{cwd:e}),n=t.stdout.trim().replace(/^origin\//,"");if(t.exitCode===0&&n.length>0)return n;for(let i of["main","master","trunk"])if((await G("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await F("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},Bu=async e=>{let t=await G("git",["rev-parse","--path-format=absolute","--git-common-dir"],{cwd:e}),n=t.stdout.trim();if(t.exitCode!==0||n.length===0)return null;let r=Ys.resolve(e,n);return Ys.dirname(r)};import{mkdir as Ne,readFile as vk}from"node:fs/promises";var Ck=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Vn=async e=>{let t=ve(e);await Ne(t.craigDir,{recursive:!0}),await Promise.all([Ne(t.reposDir,{recursive:!0}),Ne(t.workspacesDir,{recursive:!0}),Ne(t.sessionsDir,{recursive:!0}),Ne(t.runtimeDir,{recursive:!0}),Ne(t.tasksDir,{recursive:!0}),Ne(t.jobsDir,{recursive:!0}),Ne(t.commandsDir,{recursive:!0}),Ne(t.eventsDir,{recursive:!0}),Ne(t.orchestrationDir,{recursive:!0}),Ne(t.logsDir,{recursive:!0}),Ne(t.artifactsDir,{recursive:!0}),Ne(t.worktreesDir,{recursive:!0})]);try{let s=await vk(t.indexFile,"utf8"),i=JSON.parse(s);return Bn(i,e,t.indexFile)}catch(s){if(!Ck(s))throw s instanceof SyntaxError?new Error(`Craig index at ${t.indexFile} is malformed. Remove or repair the file before rerunning Craig.`):s}let n=new Date().toISOString(),r={version:2,workspaceRoot:e,repoIds:[],workspaceIds:[],taskIds:[],jobIds:[],createdAt:n,updatedAt:n};return await M(t.indexFile,r),r};var Vu=(e,t,n)=>{let r=new Date().toISOString();return{id:Ok(e,Kn.basename(t)),name:Kn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},Ku=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},Ok=(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},$k=(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},Gu=async(e,t)=>{let n=await Ce(e);await Tt(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},Nk=async(e,t)=>{let n=await Ak(t,{withFileTypes:!0}),r=await Or(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Kn.join(t,i.name);if(!await ua(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await pa(o);s.push(a?Ku(a,l):Vu([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},Dk=async(e,t)=>{let n=await pa(t),r=await Or(e),s=r.find(d=>d.rootPath===t)??null,i=s?Ku(s,n):Vu(r,t,n),o=`workspace_${i.id}`,l=(await $e(e)).find(d=>d.id===o)??null,c=new Date().toISOString(),u=l??{id:o,kind:"repo",name:i.name,rootPath:t,primaryRepoId:i.id,repoId:i.id,discoveredRepoIds:[i.id],branch:n,status:"active",linkedRepoIds:[],archivedAt:null,createdAt:c,updatedAt:c};return await da(e,i),l||await hn(e,u),await Gu(e,{repoIds:[i.id],workspaceIds:[u.id]}),{kind:"createWorkspace",workspace:u,repos:[i],created:!l}},xk=async(e,t)=>{let n=await Nk(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await $e(e),s=$k(r,Kn.basename(t)),i=r.find(c=>c.kind==="project"&&c.rootPath===t)??null,o=new Date().toISOString(),a=n.map(c=>c.id),l=i?{...i,discoveredRepoIds:a,primaryRepoId:a[0]??i.primaryRepoId,status:"active",archivedAt:null}:{id:s,kind:"project",name:Kn.basename(t),rootPath:t,primaryRepoId:a[0]??"",discoveredRepoIds:a,branch:"project",status:"active",linkedRepoIds:a,archivedAt:null,createdAt:o,updatedAt:o};return await Promise.all(n.map(c=>da(e,c))),await hn(e,l),await Gu(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},$r=async(e,t)=>{await Vn(e.workspaceRoot);let n=Kn.resolve(e.workspaceRoot,t);if(!(await Ek(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await ua(n)?Dk(e,n):xk(e,n)};var fa=async(e,t,n={listWorkspaceRecords:$e,ensureCraigState:Vn})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var ma=async(e,t,n={readWorkspace:mn,writeWorkspace:hn})=>{let s={...await n.readWorkspace(e,t),status:"archived",archivedAt:new Date().toISOString()};return await n.writeWorkspace(e,s),{kind:"archiveWorkspace",workspaceId:s.id,status:s.status,branch:s.branch}};var ha=async(e,t)=>{let r={...await mn(e,t),status:"active",archivedAt:null};await hn(e,r);let s=r.kind==="project"?r.discoveredRepoIds?.[0]??null:r.primaryRepoId;return{kind:"restoreWorkspace",workspaceId:r.id,status:r.status,branch:r.branch,primaryRepoId:s}};var gn=async(e,t,n={deleteWorkspace:Fu,readCraigIndex:Ce,writeCraigIndex:Tt})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var ga=async(e,t,n)=>{let r=await mn(e,t),s=await n.listTasks(e,{workspaceId:t,includeClosed:!0});if(r.status==="active")throw new Error(`Cannot remove workspace ${t} while it is active. Archive it first.`);if(s.tasks.length>0)throw new Error(`Cannot remove workspace ${t} while task records still reference it.`);return await gn(e,t),{kind:"removeWorkspace",workspaceId:r.id,rootPath:r.rootPath??""}};import{readFile as _k,realpath as zu,stat as Fk}from"node:fs/promises";import zs from"node:path";async function ya(e){let t=await Xu(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return Hu(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return Hu(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await Yu(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await Bu(t);if(r){let s=await Yu(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 Hu(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await Xu(zs.resolve(n,e),s),o=await Ju(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 Yu(e){let t=e;for(;;){let n=await Ju(t);if(n)return n;let r=zs.dirname(t);if(r===t)return null;t=r}}async function Ju(e){let t=ve(e);try{let n=await _k(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Bn(r,s,t.indexFile);if(await zu(i.workspaceRoot).catch(()=>zs.resolve(i.workspaceRoot))!==e)throw new Error(`Craig index at ${t.indexFile} belongs to ${i.workspaceRoot}, not ${e}. Remove or repair the file before rerunning Craig.`);return i.workspaceRoot}catch(n){if(Lk(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 Xu(e,t){let n=zs.resolve(e);try{if(!(await Fk(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await zu(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 Lk(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var wa={};Ls(wa,{addRepo:()=>Qu,listRegisteredRepos:()=>Zu,removeRepo:()=>ep});import Mk from"node:path";import{stat as jk}from"node:fs/promises";var Qu=async(e,t)=>{let n=Mk.resolve(e.workspaceRoot,t);if(!(await jk(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await $r(e,t),i=s.repos[0];if(!i||s.workspace.kind==="project")throw new Error(`Repo path is not a git repository: ${n}`);return{kind:"createRepo",repo:i,workspaceId:s.workspace.id,created:s.created}};var Zu=async(e,t={listRepos:Or,ensureCraigState:Vn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var ep=async(e,t,n)=>{let r=await Ue(e,t),i=(await $e(e)).filter(c=>c.primaryRepoId===t),o=i.filter(c=>c.status==="active"),a=await n.listTasks(e,{repoId:t});if(o.length>0)throw new Error(`Cannot remove repo ${t} while active workspace records still reference it.`);if(a.tasks.length>0)throw new Error(`Cannot remove repo ${t} while task records still reference it.`);await Promise.all(i.map(c=>gn(e,c.id))),await ju(e,t);let l=await Ce(e);return await Tt(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var ke={addWorkspace:$r,listWorkspaces:fa,archiveWorkspace:ma,restoreWorkspace:ha,removeWorkspace:ga,removeWorkspaceRecord:gn,resolveContext:ya,repos:wa};import{mkdir as tp,readFile as qk,rm as Xs,stat as Uk,writeFile as Wk}from"node:fs/promises";import Js from"node:path";var Bk=25,Vk=3e4,Kk=5e3;async function qt(e,t,n){let r=Js.join(e.runtimeDir,"task-locks"),s=Js.join(r,`${t}.lock`);await tp(r,{recursive:!0});let i=Date.now();for(;;)try{await tp(s);try{await Wk(Js.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await Xs(s,{recursive:!0,force:!0}),o}break}catch(o){if(!Yk(o))throw o;if(await Gk(s))continue;if(Date.now()-i>=Vk)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await zk(Bk)}try{return await n()}finally{await Xs(s,{recursive:!0,force:!0})}}async function Gk(e){let t=await qk(Js.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return Hk(t.pid)?!1:(await Xs(e,{recursive:!0,force:!0}),!0);let n=await Uk(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<Kk?!1:(await Xs(e,{recursive:!0,force:!0}),!0)}function Hk(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 Yk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",zk=e=>new Promise(t=>setTimeout(t,e));var bt=async(e,t)=>{let n=await Jk(Qs(e,t),"utf8");return JSON.parse(n)},Nr=async(e,t)=>{let n=await bt(e,t);return qe(n,Qs(e,t))},Rt=async(e,t)=>{let n=np(t);await M(Qs(e,t.id),n)},W=async(e,t,n)=>qt(e,t,async()=>{let r=await Nr(e,t),s=await n(r);if(s.id!==t)throw new Error(`Task mutation cannot change task id ${t} to ${s.id}.`);let i=np(s);return await M(Qs(e,t),i),i}),ka=async(e,t)=>{let n=await Ce(e);n.taskIds.includes(t)||await Tt(e,{...n,taskIds:[...n.taskIds,t]})},Qs=(e,t)=>`${e.tasksDir}/${t}.json`,np=e=>({...e,updatedAt:new Date().toISOString()});var V=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Ut=e=>e.status==="merged"||e.status==="closed",St=(e,t)=>{let n=e.prs.findIndex(s=>Gn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},Gn=(e,t)=>e.number===null||t.number===null||e.number!==t.number?!1:!e.owner||!e.repo||!t.owner||!t.repo?!0:e.owner.toLowerCase()===t.owner.toLowerCase()&&e.repo.toLowerCase()===t.repo.toLowerCase(),yn=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return ei(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},ei=e=>e.mergeable&&!Xk(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),Xk=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Ta=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),Pt=(e,t,n)=>{let r=e.isDraft??!1,s=Qk(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:Zk(e.reviewDecision??null),requiredChecks:ba(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:rT(e.comments),createdAt:e.createdAt??t?.createdAt??null,updatedAt:e.updatedAt??t?.updatedAt??null,mergedAt:e.mergedAt??t?.mergedAt??null,lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}},Qk=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,Zk=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,ba=e=>{let t=e.map(r=>eT(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||tT(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},eT=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:sp(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:nT(t)}:null},tT=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):Zs(e)&&!Zs(t)?!0:!Zs(e)&&Zs(t)?!1:rp(t.status)>=rp(e.status),Zs=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}},nT=e=>{let t=e.completedAt??e.startedAt??e.createdAt??null;if(!t)return null;let n=new Date(t).getTime();return Number.isFinite(n)?n:null},rT=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(sT).filter(n=>n!==null).slice(-4):[]},sT=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=iT(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},iT=e=>e.replace(/\s+/g," ").trim(),sp=(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?sp(r,r):"unknown"};var We=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as oT}from"node:fs/promises";import ip from"node:path";var L=async(e,t,n={readRawTask:bt,validateTaskRecord:qe})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw uT(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):pT(r)?new g("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},me=async e=>{if(!await Ra(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Hn=(e,t)=>t.artifacts.logPath?ip.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:ip.join(e.workspaceRoot,t.artifacts.logPath):null,Dr=async(e,t)=>{let n=await Ra(t.worktreePath),r=Hn(e,t),s=r?await Ra(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:aT(t),lastCommitSummary:lT(t),prSummary:cT(t),cleanupSummary:dT(t)}},Ra=async e=>{try{return await oT(e),!0}catch{return!1}},aT=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}`},lT=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",cT=e=>{if(e.type==="project"&&e.repoTargets?.length){let s=e.repoTargets.filter(l=>l.pullRequest.number);if(s.length===0)return"not linked";let i=s.map(l=>` ${l.repoId} #${l.pullRequest.number} ${l.pullRequest.status??"unknown"}`),o=s.reduce((l,c)=>{let u=c.pullRequest.status??"unknown";return l[u]=(l[u]??0)+1,l},{}),a=Object.entries(o).map(([l,c])=>`${c} ${l}`).join(", ");return`${s.length} PR${s.length!==1?"s":""} (${a})
9
+ ${ta()}`,{})}var qe=(e,t)=>{let n=oa(e);if(!Zw(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},oa=e=>{if(typeof e!="object"||e===null)return e;let t=e,n=e,r={...n};return delete r.swarmRunId,delete r.swarmStepId,{...r,runner:aa(t.runner),repoId:typeof t.repoId=="string"?t.repoId:"legacy_repo",workspaceId:typeof t.workspaceId=="string"?t.workspaceId:"legacy_workspace",sessionId:typeof t.sessionId=="string"||t.sessionId===null?t.sessionId:null,selectedPtyTabId:typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null?t.selectedPtyTabId:null,linkedRepoIds:Array.isArray(t.linkedRepoIds)?t.linkedRepoIds.filter(s=>typeof s=="string"):[],parentTaskId:typeof t.parentTaskId=="string"||t.parentTaskId===null?t.parentTaskId:null,rootTaskId:typeof t.rootTaskId=="string"?t.rootTaskId:t.id,delegationDepth:Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0?t.delegationDepth:0,delegationIdempotencyKey:typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null?t.delegationIdempotencyKey:null,furyRunId:typeof t.furyRunId=="string"||t.furyRunId===null?t.furyRunId:typeof n.swarmRunId=="string"?n.swarmRunId:null,furyStepId:typeof t.furyStepId=="string"||t.furyStepId===null?t.furyStepId:typeof n.swarmStepId=="string"?n.swarmStepId:null,ptyTabs:nk(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:ek(t.repoTargets),runnerSession:t.runnerSession??Qw(t),checks:ck(t),lastCommit:t.lastCommit??null,prs:dk(t),artifacts:mk(t),cleanup:gk(t)}},Qw=e=>{if(typeof e.title!="string")return null;let t=aa(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},Zw=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.id=="string"&&typeof t.title=="string"&&typeof t.slug=="string"&&(t.type==="repo"||t.type==="project")&&typeof t.status=="string"&&k.runners.isRunnerType(t.runner??"")&&typeof t.repoId=="string"&&typeof t.workspaceId=="string"&&(typeof t.sessionId=="string"||t.sessionId===null)&&(typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null)&&Array.isArray(t.linkedRepoIds)&&t.linkedRepoIds.every(n=>typeof n=="string")&&(typeof t.parentTaskId=="string"||t.parentTaskId===null)&&typeof t.rootTaskId=="string"&&Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0&&(typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null)&&(typeof t.furyRunId=="string"||t.furyRunId===null)&&(typeof t.furyStepId=="string"||t.furyStepId===null)&&typeof t.repoRoot=="string"&&typeof t.worktreePath=="string"&&typeof t.branch=="string"&&Ou(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||tk(t.repoTargets))&&sk(t.runnerSession)&&ik(t.prompt)&&$u(t.checks)&&Du(t.lastCommit)&&ak(t.prs)&&lk(t.artifacts)&&xu(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},ek=e=>{if(Array.isArray(e))return e.filter(Eu)},tk=e=>Array.isArray(e)&&e.every(Eu),Eu=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)&&$u(t.checks)&&Du(t.lastCommit)&&Nu(t.pullRequest)&&xu(t.cleanup)},nk=e=>{if(Ou(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 rk(e.id,e.title,t,aa(e.runner))},rk=(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}]},aa=e=>e&&k.runners.isRunnerType(e)?e:"codex",Ou=e=>Array.isArray(e)&&e.every(t=>typeof t=="object"&&t!==null&&typeof t.id=="string"&&(t.kind==="agent"||t.kind==="terminal")&&(t.capabilityId===void 0||typeof t.capabilityId=="string")&&typeof t.title=="string"&&Array.isArray(t.command)&&t.command.every(n=>typeof n=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"),sk=e=>typeof e=="object"&&e!==null&&Array.isArray(e.command)&&e.command.every(t=>typeof t=="string")&&(typeof e.pid=="number"||e.pid===null)&&(typeof e.startedAt=="string"||e.startedAt===null)&&(e.lastKnownState==="starting"||e.lastKnownState==="running"||e.lastKnownState==="exited"||e.lastKnownState==="failed")&&(typeof e.exitCode=="number"||e.exitCode===null)&&(typeof e.exitedAt=="string"||e.exitedAt===null),ik=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",$u=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"),Du=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",Nu=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&ok(e.requiredChecks),ok=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)),ak=e=>Array.isArray(e)&&e.every(Nu),lk=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),xu=e=>typeof e=="object"&&e!==null&&(typeof e.paneClosedAt=="string"||e.paneClosedAt===null)&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),ck=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},dk=e=>{if(Array.isArray(e.prs))return e.prs.map(uk);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:_u(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:Fu(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},uk=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:_u(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:pk(t.reviewDecision),requiredChecks:Fu(t.requiredChecks),comments:fk(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},_u=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,pk=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,fk=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}]}):[],Fu=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})):[],mk=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},gk=e=>e.cleanup??{paneClosedAt:null,worktreeRemovedAt:null,preservedWorktree:!1,warning:null};import{readFile as Zk}from"node:fs/promises";import{readFile as hk,readdir as yk,rm as wk}from"node:fs/promises";import Lu from"node:path";var la=(e,t)=>Lu.join(e.workspacesDir,`${t}.json`),kk=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"):[]}},Mu=(e,t)=>{let n=kk(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},gn=async(e,t)=>{let n=la(e,t);try{let r=await hk(n,"utf8");return Mu(JSON.parse(r),n)}catch(r){throw Tk(r)?new h("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 h("WORKSPACE_RECORD_INVALID",r instanceof Error?r.message:`Craig workspace "${t}" is invalid.`,{details:{workspaceId:t},cause:r}):r}},hn=async(e,t)=>{await M(la(e,t.id),{...t,updatedAt:new Date().toISOString()})},$e=async e=>{let t=await yk(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>gn(e,Lu.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},ju=async(e,t)=>{await wk(la(e,t),{force:!0})},Tk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as bk,readdir as Rk,rm as Sk}from"node:fs/promises";import qu from"node:path";var ca=(e,t)=>qu.join(e.reposDir,`${t}.json`),Uu=(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},Ue=async(e,t)=>{let n=ca(e,t);try{let r=await bk(n,"utf8");return Uu(JSON.parse(r),n)}catch(r){throw Pk(r)?new h("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 h("REPO_RECORD_INVALID",r instanceof Error?r.message:`Craig repo "${t}" is invalid.`,{details:{repoId:t},cause:r}):r}},da=async(e,t)=>{await M(ca(e,t.id),{...t,updatedAt:new Date().toISOString()})},$r=async e=>{let t=await Rk(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>Ue(e,qu.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},Wu=async(e,t)=>{await Sk(ca(e,t),{force:!0})},Pk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as Ik}from"node:fs/promises";var vk=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return t.version===2&&typeof t.workspaceRoot=="string"&&Array.isArray(t.repoIds)&&t.repoIds.every(n=>typeof n=="string")&&Array.isArray(t.workspaceIds)&&t.workspaceIds.every(n=>typeof n=="string")&&Array.isArray(t.taskIds)&&t.taskIds.every(n=>typeof n=="string")&&Array.isArray(t.jobIds)&&t.jobIds.every(n=>typeof n=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Bn=(e,t,n)=>{if(!vk(e))throw new Error(`Craig index at ${n} is invalid. Remove or repair the file before rerunning Craig.`);if(e.workspaceRoot!==t)throw new Error(`Craig index at ${n} belongs to ${e.workspaceRoot}, not ${t}. Remove or repair the file before rerunning Craig.`);return e},Ce=async e=>{let t=await Ik(e.indexFile,"utf8");return Bn(JSON.parse(t),e.workspaceRoot,e.indexFile)},bt=async(e,t)=>{await M(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as $k,stat as Dk}from"node:fs/promises";import Kn from"node:path";import{realpath as Ku}from"node:fs/promises";import Ys from"node:path";import{execFile as Ck}from"node:child_process";import{promisify as Ak}from"node:util";var Bu=Ak(Ck);async function F(e,t,n={}){try{let r=await Bu(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(Vu(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function G(e,t,n={}){try{let r=await Bu(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(Vu(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function Vu(e){return e instanceof Error}var ua=async e=>{try{let n=(await F("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([Ku(n).catch(()=>Ys.resolve(n)),Ku(e).catch(()=>Ys.resolve(e))]);return r===s}catch{return!1}},pa=async e=>{let t=await G("git",["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"],{cwd:e}),n=t.stdout.trim().replace(/^origin\//,"");if(t.exitCode===0&&n.length>0)return n;for(let i of["main","master","trunk"])if((await G("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await F("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},Gu=async e=>{let t=await G("git",["rev-parse","--path-format=absolute","--git-common-dir"],{cwd:e}),n=t.stdout.trim();if(t.exitCode!==0||n.length===0)return null;let r=Ys.resolve(e,n);return Ys.dirname(r)};import{mkdir as De,readFile as Ek}from"node:fs/promises";var Ok=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Vn=async e=>{let t=ve(e);await De(t.craigDir,{recursive:!0}),await Promise.all([De(t.reposDir,{recursive:!0}),De(t.workspacesDir,{recursive:!0}),De(t.sessionsDir,{recursive:!0}),De(t.runtimeDir,{recursive:!0}),De(t.tasksDir,{recursive:!0}),De(t.jobsDir,{recursive:!0}),De(t.commandsDir,{recursive:!0}),De(t.eventsDir,{recursive:!0}),De(t.orchestrationDir,{recursive:!0}),De(t.logsDir,{recursive:!0}),De(t.artifactsDir,{recursive:!0}),De(t.worktreesDir,{recursive:!0})]);try{let s=await Ek(t.indexFile,"utf8"),i=JSON.parse(s);return Bn(i,e,t.indexFile)}catch(s){if(!Ok(s))throw s instanceof SyntaxError?new Error(`Craig index at ${t.indexFile} is malformed. Remove or repair the file before rerunning Craig.`):s}let n=new Date().toISOString(),r={version:2,workspaceRoot:e,repoIds:[],workspaceIds:[],taskIds:[],jobIds:[],createdAt:n,updatedAt:n};return await M(t.indexFile,r),r};var Hu=(e,t,n)=>{let r=new Date().toISOString();return{id:Nk(e,Kn.basename(t)),name:Kn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},Yu=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},Nk=(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},xk=(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},zu=async(e,t)=>{let n=await Ce(e);await bt(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},_k=async(e,t)=>{let n=await $k(t,{withFileTypes:!0}),r=await $r(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Kn.join(t,i.name);if(!await ua(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await pa(o);s.push(a?Yu(a,l):Hu([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},Fk=async(e,t)=>{let n=await pa(t),r=await $r(e),s=r.find(d=>d.rootPath===t)??null,i=s?Yu(s,n):Hu(r,t,n),o=`workspace_${i.id}`,l=(await $e(e)).find(d=>d.id===o)??null,c=new Date().toISOString(),u=l??{id:o,kind:"repo",name:i.name,rootPath:t,primaryRepoId:i.id,repoId:i.id,discoveredRepoIds:[i.id],branch:n,status:"active",linkedRepoIds:[],archivedAt:null,createdAt:c,updatedAt:c};return await da(e,i),l||await hn(e,u),await zu(e,{repoIds:[i.id],workspaceIds:[u.id]}),{kind:"createWorkspace",workspace:u,repos:[i],created:!l}},Lk=async(e,t)=>{let n=await _k(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await $e(e),s=xk(r,Kn.basename(t)),i=r.find(c=>c.kind==="project"&&c.rootPath===t)??null,o=new Date().toISOString(),a=n.map(c=>c.id),l=i?{...i,discoveredRepoIds:a,primaryRepoId:a[0]??i.primaryRepoId,status:"active",archivedAt:null}:{id:s,kind:"project",name:Kn.basename(t),rootPath:t,primaryRepoId:a[0]??"",discoveredRepoIds:a,branch:"project",status:"active",linkedRepoIds:a,archivedAt:null,createdAt:o,updatedAt:o};return await Promise.all(n.map(c=>da(e,c))),await hn(e,l),await zu(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},Dr=async(e,t)=>{await Vn(e.workspaceRoot);let n=Kn.resolve(e.workspaceRoot,t);if(!(await Dk(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await ua(n)?Fk(e,n):Lk(e,n)};var fa=async(e,t,n={listWorkspaceRecords:$e,ensureCraigState:Vn})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var ma=async(e,t,n={readWorkspace:gn,writeWorkspace:hn})=>{let s={...await n.readWorkspace(e,t),status:"archived",archivedAt:new Date().toISOString()};return await n.writeWorkspace(e,s),{kind:"archiveWorkspace",workspaceId:s.id,status:s.status,branch:s.branch}};var ga=async(e,t)=>{let r={...await gn(e,t),status:"active",archivedAt:null};await hn(e,r);let s=r.kind==="project"?r.discoveredRepoIds?.[0]??null:r.primaryRepoId;return{kind:"restoreWorkspace",workspaceId:r.id,status:r.status,branch:r.branch,primaryRepoId:s}};var yn=async(e,t,n={deleteWorkspace:ju,readCraigIndex:Ce,writeCraigIndex:bt})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var ha=async(e,t,n)=>{let r=await gn(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 yn(e,t),{kind:"removeWorkspace",workspaceId:r.id,rootPath:r.rootPath??""}};import{readFile as Mk,realpath as Qu,stat as jk}from"node:fs/promises";import zs from"node:path";async function ya(e){let t=await ep(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return Ju(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return Ju(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await Xu(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await Gu(t);if(r){let s=await Xu(r);if(s)return{workspaceRoot:s,source:"git_common_dir",initialized:!0}}if(e.allowUninitializedCwd)return{workspaceRoot:t,source:"cwd",initialized:!1};throw new h("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 Ju(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await ep(zs.resolve(n,e),s),o=await Zu(i);if(o)return{workspaceRoot:o,source:t,initialized:!0};if(r)return{workspaceRoot:i,source:t,initialized:!1};throw new h("WORKSPACE_CONTEXT_NOT_FOUND",`${s} ${i} is not an initialized Craig workspace.`,{details:{workspaceRoot:i,source:t}})}async function Xu(e){let t=e;for(;;){let n=await Zu(t);if(n)return n;let r=zs.dirname(t);if(r===t)return null;t=r}}async function Zu(e){let t=ve(e);try{let n=await Mk(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Bn(r,s,t.indexFile);if(await Qu(i.workspaceRoot).catch(()=>zs.resolve(i.workspaceRoot))!==e)throw new Error(`Craig index at ${t.indexFile} belongs to ${i.workspaceRoot}, not ${e}. Remove or repair the file before rerunning Craig.`);return i.workspaceRoot}catch(n){if(qk(n))return null;throw n instanceof h?n:new h("WORKSPACE_CONTEXT_INVALID",n instanceof Error?n.message:`Craig workspace at ${e} is invalid.`,{details:{workspaceRoot:e},cause:n})}}async function ep(e,t){let n=zs.resolve(e);try{if(!(await jk(n)).isDirectory())throw new h("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await Qu(n)}catch(r){throw r instanceof h?r:new h("WORKSPACE_CONTEXT_NOT_FOUND",`${t} ${n} does not exist or cannot be read.`,{details:{path:n},cause:r})}}function qk(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var wa={};Ls(wa,{addRepo:()=>tp,listRegisteredRepos:()=>np,removeRepo:()=>rp});import Uk from"node:path";import{stat as Wk}from"node:fs/promises";var tp=async(e,t)=>{let n=Uk.resolve(e.workspaceRoot,t);if(!(await Wk(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await Dr(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 np=async(e,t={listRepos:$r,ensureCraigState:Vn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var rp=async(e,t,n)=>{let r=await Ue(e,t),i=(await $e(e)).filter(c=>c.primaryRepoId===t),o=i.filter(c=>c.status==="active"),a=await n.listTasks(e,{repoId:t});if(o.length>0)throw new Error(`Cannot remove repo ${t} while active workspace records still reference it.`);if(a.tasks.length>0)throw new Error(`Cannot remove repo ${t} while task records still reference it.`);await Promise.all(i.map(c=>yn(e,c.id))),await Wu(e,t);let l=await Ce(e);return await bt(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var ke={addWorkspace:Dr,listWorkspaces:fa,archiveWorkspace:ma,restoreWorkspace:ga,removeWorkspace:ha,removeWorkspaceRecord:yn,resolveContext:ya,repos:wa};import{mkdir as sp,readFile as Bk,rm as Xs,stat as Vk,writeFile as Kk}from"node:fs/promises";import Js from"node:path";var Gk=25,Hk=3e4,Yk=5e3;async function qt(e,t,n){let r=Js.join(e.runtimeDir,"task-locks"),s=Js.join(r,`${t}.lock`);await sp(r,{recursive:!0});let i=Date.now();for(;;)try{await sp(s);try{await Kk(Js.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await Xs(s,{recursive:!0,force:!0}),o}break}catch(o){if(!Xk(o))throw o;if(await zk(s))continue;if(Date.now()-i>=Hk)throw new h("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await Qk(Gk)}try{return await n()}finally{await Xs(s,{recursive:!0,force:!0})}}async function zk(e){let t=await Bk(Js.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return Jk(t.pid)?!1:(await Xs(e,{recursive:!0,force:!0}),!0);let n=await Vk(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<Yk?!1:(await Xs(e,{recursive:!0,force:!0}),!0)}function Jk(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 Xk=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",Qk=e=>new Promise(t=>setTimeout(t,e));var Rt=async(e,t)=>{let n=await Zk(Qs(e,t),"utf8");return JSON.parse(n)},Nr=async(e,t)=>{let n=await Rt(e,t);return qe(n,Qs(e,t))},St=async(e,t)=>{let n=ip(t);await M(Qs(e,t.id),n)},W=async(e,t,n)=>qt(e,t,async()=>{let r=await Nr(e,t),s=await n(r);if(s.id!==t)throw new Error(`Task mutation cannot change task id ${t} to ${s.id}.`);let i=ip(s);return await M(Qs(e,t),i),i}),ka=async(e,t)=>{let n=await Ce(e);n.taskIds.includes(t)||await bt(e,{...n,taskIds:[...n.taskIds,t]})},Qs=(e,t)=>`${e.tasksDir}/${t}.json`,ip=e=>({...e,updatedAt:new Date().toISOString()});var V=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Ut=e=>e.status==="merged"||e.status==="closed",Pt=(e,t)=>{let n=e.prs.findIndex(s=>Gn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},Gn=(e,t)=>e.number===null||t.number===null||e.number!==t.number?!1:!e.owner||!e.repo||!t.owner||!t.repo?!0:e.owner.toLowerCase()===t.owner.toLowerCase()&&e.repo.toLowerCase()===t.repo.toLowerCase(),wn=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return ei(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},ei=e=>e.mergeable&&!eT(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),eT=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Ta=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),It=(e,t,n)=>{let r=e.isDraft??!1,s=tT(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:nT(e.reviewDecision??null),requiredChecks:ba(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:oT(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}},tT=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,nT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,ba=e=>{let t=e.map(r=>rT(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||sT(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},rT=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:iT(t)}:null},sT=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):Zs(e)&&!Zs(t)?!0:!Zs(e)&&Zs(t)?!1:op(t.status)>=op(e.status),Zs=e=>e.conclusion?.toUpperCase()==="CANCELLED",op=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},iT=e=>{let t=e.completedAt??e.startedAt??e.createdAt??null;if(!t)return null;let n=new Date(t).getTime();return Number.isFinite(n)?n:null},oT=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(aT).filter(n=>n!==null).slice(-4):[]},aT=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=lT(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},lT=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 We=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as cT}from"node:fs/promises";import lp from"node:path";var L=async(e,t,n={readRawTask:Rt,validateTaskRecord:qe})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw mT(r)?new h("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):gT(r)?new h("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},me=async e=>{if(!await Ra(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Hn=(e,t)=>t.artifacts.logPath?lp.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:lp.join(e.workspaceRoot,t.artifacts.logPath):null,xr=async(e,t)=>{let n=await Ra(t.worktreePath),r=Hn(e,t),s=r?await Ra(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:dT(t),lastCommitSummary:uT(t),prSummary:pT(t),cleanupSummary:fT(t)}},Ra=async e=>{try{return await cT(e),!0}catch{return!1}},dT=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}`},uT=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",pT=e=>{if(e.type==="project"&&e.repoTargets?.length){let s=e.repoTargets.filter(l=>l.pullRequest.number);if(s.length===0)return"not linked";let i=s.map(l=>` ${l.repoId} #${l.pullRequest.number} ${l.pullRequest.status??"unknown"}`),o=s.reduce((l,c)=>{let u=c.pullRequest.status??"unknown";return l[u]=(l[u]??0)+1,l},{}),a=Object.entries(o).map(([l,c])=>`${c} ${l}`).join(", ");return`${s.length} PR${s.length!==1?"s":""} (${a})
10
10
  ${i.join(`
11
- `)}`}let t=V(e);if(!t?.number||!t.url)return"not linked";let n=t.requiredChecks.length,r=n===1?"check":"checks";return`#${t.number} ${t.status??"unknown"} mergeable=${t.mergeable} mergeState=${t.mergeStateStatus??"unknown"} (${n} ${r})`},dT=e=>e.status!=="merged"?"not merged":e.cleanup.warning?`warning: ${e.cleanup.warning}`:e.cleanup.preservedWorktree?"preserved worktree":e.cleanup.worktreeRemovedAt?`worktree removed at ${e.cleanup.worktreeRemovedAt}`:"cleanup pending",uT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",pT=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var op=async(e,t)=>{let n=await G("git",["show-ref","--verify","--quiet",`refs/heads/${t}`],{cwd:e});if(n.exitCode===0)return!0;if(n.exitCode===1)return!1;throw new Error(n.stderr.trim()||n.stdout.trim()||"Unable to check git branch state.")},Sa=async(e,t,n,r="main")=>{let s=r.trim()||"main";if((await G("git",["show-ref","--verify","--quiet",`refs/heads/${s}`],{cwd:e})).exitCode!==0)throw new Error(`Base branch '${s}' does not exist locally.`);let o=await fT(e,s);await F("git",["worktree","add","-b",t,n,o],{cwd:e})},fT=async(e,t)=>(await G("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await G("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await G("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t,ti=async e=>{let t=await G("git",["status","--short"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"Unable to inspect git status.");return t.stdout.trim().length>0},ap=async e=>{await F("git",["add","-A"],{cwd:e})},lp=async(e,t)=>{await F("git",["commit","-m",t],{cwd:e})},cp=async e=>{let t=await F("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 G("git",["branch","--show-current"],{cwd:e});if(t.exitCode!==0)return null;let n=t.stdout.trim();return n.length>0?n:null};var up=async(e,t)=>{await F("git",["worktree","remove","--force",t],{cwd:e})};var Pa=async e=>Yn(e,e.repoRoot),Yn=async(e,t)=>{let n=await Ce(e),r=pp(new Date),s=fp(n.taskIds,r);for(;;){let i=`task_${r}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await op(t,o))return i;s+=1}},xr=async e=>{let t=await Ce(e),n=pp(new Date),r=fp(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`},pp=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 _r=async(e,t,n={readRawTask:bt,validateTaskRecord:qe})=>{let r=await Ce(e),s=[],i=[];await Promise.all(r.taskIds.map(async l=>{try{let c=await n.readRawTask(e,l);s.push(n.validateTaskRecord(c,`${e.tasksDir}/${l}.json`))}catch(c){if(mT(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}},mT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var mp=["merge_ready","pr_open","checked","review","running","draft"],Ia=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(hT)[0]?.id??null,hT=(e,t)=>{let n=hp(e.status),r=hp(t.status);return n!==r?n-r:t.updatedAt.localeCompare(e.updatedAt)},hp=e=>{let t=mp.indexOf(e);return t>=0?t:mp.length};import gp from"node:path";var wn=(e,t)=>t?gp.isAbsolute(t)?t:gp.join(e.repoRoot,t):null;import{randomUUID as gT}from"node:crypto";import{mkdir as Fr,rm as yT,writeFile as ni}from"node:fs/promises";import H from"node:path";var wp=["AGENTS","md"].join("."),zn=async(e,t,n,r={})=>{let s=await Ue(e,t),[i,o]=await Promise.all([RT(e,s.id),Yn(e,s.rootPath)]),a=r.sessionId??null,l=`craig/${o}`,c=H.join(e.worktreesDir,s.id,o),u=H.join(e.logsDir,`${o}.log`),d=H.join(e.artifactsDir,o);await Promise.all([Fr(H.dirname(c),{recursive:!0}),Fr(d,{recursive:!0}),ni(u,"","utf8")]);let p=wT(e,{taskId:o,repoId:s.id,workspaceId:i.id,sessionId:a,repoRoot:s.rootPath,prompt:n,runner:r.runner??"codex",config:r.config??{},branch:l,worktreePath:c,...r.lineage?{lineage:r.lineage}:{}});return await Rt(e,p),await ka(e,o),await Sa(s.rootPath,l,c,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,sessionId:a,workspaceId:i.id,task:p}},Lr=async(e,t,n,r={})=>{let s=(await $e(e)).find(b=>b.id===t&&b.status==="active");if(!s)throw new Error(`Workspace ${t} does not exist or is archived.`);if(s.kind!=="project"){if(!s.primaryRepoId)throw new Error(`Workspace ${t} is not task-capable.`);let b=await zn(e,s.primaryRepoId,n,r);return{...b,bundlePath:b.task.worktreePath,repoTargets:[]}}let i=s.discoveredRepoIds??[];if(i.length===0)throw new Error(`Project workspace ${t} has no discovered repos.`);let o=await xr(e),a=new Date().toISOString(),l=r.runner??"codex",c=r.sessionId??null,u=`craig/${o}`,d=H.join(e.craigDir,"task-bundles",o),p=H.join(e.logsDir,`${o}.log`),h=H.join(e.artifactsDir,o);await Fr(d,{recursive:!0}),await Fr(h,{recursive:!0}),await ni(p,"","utf8");let f=await Promise.all(i.map(b=>Ue(e,b))),m=TT(f),y=await Promise.all(f.map(b=>kT(e,b,o,u,H.join(d,m.get(b.id))))),T=y.find(b=>b.status==="ready")??y[0];if(!y.some(b=>b.status==="ready"))throw await yT(d,{recursive:!0,force:!0}),new Error(`No project repo targets could be provisioned for ${t}: ${y.map(b=>`${b.repoId}: ${b.failureReason??"unknown error"}`).join("; ")}`);await ni(H.join(d,"manifest.json"),JSON.stringify({taskId:o,workspaceId:t,prompt:n,repos:y.map(b=>({repoId:b.repoId,repoName:f.find($=>$.id===b.repoId)?.name??b.repoId,path:H.relative(d,b.worktreePath),status:b.status,worktreePath:b.worktreePath,failureReason:b.failureReason}))},null,2),"utf8"),await ni(H.join(d,wp),bT({taskId:o,workspaceId:t,prompt:n,repos:f,repoTargets:y,bundlePath:d}),"utf8");let R=Mr(o,n,a,l,r.config??{}),v={id:o,title:n,slug:Tp(n),type:"project",status:"draft",runner:l,repoId:T.repoId,workspaceId:s.id,sessionId:c,selectedPtyTabId:R[0]?.id??null,linkedRepoIds:i.filter(b=>b!==T.repoId),...kp(o,r.lineage),repoRoot:d,worktreePath:d,branch:u,bundlePath:d,selectedRepoTargetId:T.repoId,repoTargets:y,ptyTabs:R,runnerSession:{command:k.runners.buildCommand(l,n,r.config??{}),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:n},checks:T.checks,lastCommit:null,prs:[],artifacts:{logPath:H.relative(e.workspaceRoot,p),checkSummaryPath:H.relative(e.workspaceRoot,H.join(h,"check-summary.json")),prDraftPath:null,prStatusPath:H.relative(e.workspaceRoot,H.join(h,"pr-status.json"))},cleanup:ri(),lastFailureReason:y.every(b=>b.status==="unavailable")?"No project repo targets could be provisioned.":null,createdAt:a,updatedAt:a};return await Rt(e,v),await ka(e,o),{repoId:T.repoId,repoRoot:d,sessionId:c,workspaceId:s.id,task:v,bundlePath:d,repoTargets:y}},Mr=(e,t,n,r="codex",s={})=>{let i=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",...s.previews?.agentOrchestration?{capabilityId:`capability_${gT()}`}:{},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}]},wT=(e,t)=>{let n=new Date().toISOString(),r=Mr(t.taskId,t.prompt,n,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:Tp(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,sessionId:t.sessionId,selectedPtyTabId:r[0]?.id??null,linkedRepoIds:[],...kp(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:{...Ca(H.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:H.relative(e.workspaceRoot,H.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:H.relative(e.workspaceRoot,H.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:H.relative(e.workspaceRoot,H.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:ri(),lastFailureReason:null,createdAt:n,updatedAt:n}},kT=async(e,t,n,r,s)=>{await Fr(H.dirname(s),{recursive:!0});try{return await Sa(t.rootPath,r,s,t.defaultBranch),{repoId:t.id,branch:r,repoRoot:t.rootPath,worktreePath:s,status:"ready",failureReason:null,checks:Ca(H.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:yp(),cleanup:ri()}}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:Ca(H.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:yp(),cleanup:ri()}}},TT=e=>{let t=new Set(["manifest.json",wp]),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},bT=e=>{let t=new Map(e.repos.map(r=>[r.id,r.name])),n=e.repoTargets.map(r=>{let s=t.get(r.repoId)??r.repoId,i=H.relative(e.bundlePath,r.worktreePath),o=r.status==="ready"?"ready":`unavailable: ${r.failureReason??"unknown error"}`;return`- \`${i}/\` - ${s} (${r.repoId}, ${o})`}).join(`
11
+ `)}`}let t=V(e);if(!t?.number||!t.url)return"not linked";let n=t.requiredChecks.length,r=n===1?"check":"checks";return`#${t.number} ${t.status??"unknown"} mergeable=${t.mergeable} mergeState=${t.mergeStateStatus??"unknown"} (${n} ${r})`},fT=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",mT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",gT=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var cp=async(e,t)=>{let n=await G("git",["show-ref","--verify","--quiet",`refs/heads/${t}`],{cwd:e});if(n.exitCode===0)return!0;if(n.exitCode===1)return!1;throw new Error(n.stderr.trim()||n.stdout.trim()||"Unable to check git branch state.")},Sa=async(e,t,n,r="main")=>{let s=r.trim()||"main";if((await G("git",["show-ref","--verify","--quiet",`refs/heads/${s}`],{cwd:e})).exitCode!==0)throw new Error(`Base branch '${s}' does not exist locally.`);let o=await hT(e,s);await F("git",["worktree","add","-b",t,n,o],{cwd:e})},hT=async(e,t)=>(await G("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await G("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await G("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t,ti=async e=>{let t=await G("git",["status","--short"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"Unable to inspect git status.");return t.stdout.trim().length>0},dp=async e=>{await F("git",["add","-A"],{cwd:e})},up=async(e,t)=>{await F("git",["commit","-m",t],{cwd:e})},pp=async e=>{let t=await F("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}},fp=async e=>{let t=await G("git",["branch","--show-current"],{cwd:e});if(t.exitCode!==0)return null;let n=t.stdout.trim();return n.length>0?n:null};var mp=async(e,t)=>{await F("git",["worktree","remove","--force",t],{cwd:e})};var Pa=async e=>Yn(e,e.repoRoot),Yn=async(e,t)=>{let n=await Ce(e),r=gp(new Date),s=hp(n.taskIds,r);for(;;){let i=`task_${r}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await cp(t,o))return i;s+=1}},_r=async e=>{let t=await Ce(e),n=gp(new Date),r=hp(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`},gp=e=>{let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}${n}${r}`},hp=(e,t)=>{let n=e.filter(r=>r.startsWith(`task_${t}_`)).map(r=>Number.parseInt(r.slice(-2),10)).filter(r=>Number.isInteger(r));return n.length===0?1:Math.max(...n)+1};var Fr=async(e,t,n={readRawTask:Rt,validateTaskRecord:qe})=>{let r=await Ce(e),s=[],i=[];await Promise.all(r.taskIds.map(async l=>{try{let c=await n.readRawTask(e,l);s.push(n.validateTaskRecord(c,`${e.tasksDir}/${l}.json`))}catch(c){if(yT(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}},yT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var yp=["merge_ready","pr_open","checked","review","running","draft"],Ia=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(wT)[0]?.id??null,wT=(e,t)=>{let n=wp(e.status),r=wp(t.status);return n!==r?n-r:t.updatedAt.localeCompare(e.updatedAt)},wp=e=>{let t=yp.indexOf(e);return t>=0?t:yp.length};import kp from"node:path";var kn=(e,t)=>t?kp.isAbsolute(t)?t:kp.join(e.repoRoot,t):null;import{randomUUID as kT}from"node:crypto";import{mkdir as Lr,rm as TT,writeFile as ni}from"node:fs/promises";import H from"node:path";var bp=["AGENTS","md"].join("."),zn=async(e,t,n,r={})=>{let s=await Ue(e,t),[i,o]=await Promise.all([IT(e,s.id),Yn(e,s.rootPath)]),a=r.sessionId??null,l=`craig/${o}`,c=H.join(e.worktreesDir,s.id,o),u=H.join(e.logsDir,`${o}.log`),d=H.join(e.artifactsDir,o);await Promise.all([Lr(H.dirname(c),{recursive:!0}),Lr(d,{recursive:!0}),ni(u,"","utf8")]);let p=bT(e,{taskId:o,repoId:s.id,workspaceId:i.id,sessionId:a,repoRoot:s.rootPath,prompt:n,runner:r.runner??"codex",config:r.config??{},branch:l,worktreePath:c,...r.lineage?{lineage:r.lineage}:{}});return await St(e,p),await ka(e,o),await Sa(s.rootPath,l,c,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,sessionId:a,workspaceId:i.id,task:p}},Mr=async(e,t,n,r={})=>{let s=(await $e(e)).find(b=>b.id===t&&b.status==="active");if(!s)throw new Error(`Workspace ${t} does not exist or is archived.`);if(s.kind!=="project"){if(!s.primaryRepoId)throw new Error(`Workspace ${t} is not task-capable.`);let b=await zn(e,s.primaryRepoId,n,r);return{...b,bundlePath:b.task.worktreePath,repoTargets:[]}}let i=s.discoveredRepoIds??[];if(i.length===0)throw new Error(`Project workspace ${t} has no discovered repos.`);let o=await _r(e),a=new Date().toISOString(),l=r.runner??"codex",c=r.sessionId??null,u=`craig/${o}`,d=H.join(e.craigDir,"task-bundles",o),p=H.join(e.logsDir,`${o}.log`),m=H.join(e.artifactsDir,o);await Lr(d,{recursive:!0}),await Lr(m,{recursive:!0}),await ni(p,"","utf8");let g=await Promise.all(i.map(b=>Ue(e,b))),f=ST(g),y=await Promise.all(g.map(b=>RT(e,b,o,u,H.join(d,f.get(b.id))))),T=y.find(b=>b.status==="ready")??y[0];if(!y.some(b=>b.status==="ready"))throw await TT(d,{recursive:!0,force:!0}),new Error(`No project repo targets could be provisioned for ${t}: ${y.map(b=>`${b.repoId}: ${b.failureReason??"unknown error"}`).join("; ")}`);await ni(H.join(d,"manifest.json"),JSON.stringify({taskId:o,workspaceId:t,prompt:n,repos:y.map(b=>({repoId:b.repoId,repoName:g.find($=>$.id===b.repoId)?.name??b.repoId,path:H.relative(d,b.worktreePath),status:b.status,worktreePath:b.worktreePath,failureReason:b.failureReason}))},null,2),"utf8"),await ni(H.join(d,bp),PT({taskId:o,workspaceId:t,prompt:n,repos:g,repoTargets:y,bundlePath:d}),"utf8");let S=jr(o,n,a,l,r.config??{}),v={id:o,title:n,slug:Sp(n),type:"project",status:"draft",runner:l,repoId:T.repoId,workspaceId:s.id,sessionId:c,selectedPtyTabId:S[0]?.id??null,linkedRepoIds:i.filter(b=>b!==T.repoId),...Rp(o,r.lineage),repoRoot:d,worktreePath:d,branch:u,bundlePath:d,selectedRepoTargetId:T.repoId,repoTargets:y,ptyTabs:S,runnerSession:{command:k.runners.buildCommand(l,n,r.config??{}),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:n},checks:T.checks,lastCommit:null,prs:[],artifacts:{logPath:H.relative(e.workspaceRoot,p),checkSummaryPath:H.relative(e.workspaceRoot,H.join(m,"check-summary.json")),prDraftPath:null,prStatusPath:H.relative(e.workspaceRoot,H.join(m,"pr-status.json"))},cleanup:ri(),lastFailureReason:y.every(b=>b.status==="unavailable")?"No project repo targets could be provisioned.":null,createdAt:a,updatedAt:a};return await St(e,v),await ka(e,o),{repoId:T.repoId,repoRoot:d,sessionId:c,workspaceId:s.id,task:v,bundlePath:d,repoTargets:y}},jr=(e,t,n,r="codex",s={})=>{let i=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",...s.previews?.agentOrchestration?{capabilityId:`capability_${kT()}`}:{},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}]},bT=(e,t)=>{let n=new Date().toISOString(),r=jr(t.taskId,t.prompt,n,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:Sp(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,sessionId:t.sessionId,selectedPtyTabId:r[0]?.id??null,linkedRepoIds:[],...Rp(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:{...Ca(H.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:H.relative(e.workspaceRoot,H.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:H.relative(e.workspaceRoot,H.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:H.relative(e.workspaceRoot,H.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:ri(),lastFailureReason:null,createdAt:n,updatedAt:n}},RT=async(e,t,n,r,s)=>{await Lr(H.dirname(s),{recursive:!0});try{return await Sa(t.rootPath,r,s,t.defaultBranch),{repoId:t.id,branch:r,repoRoot:t.rootPath,worktreePath:s,status:"ready",failureReason:null,checks:Ca(H.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Tp(),cleanup:ri()}}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:Ca(H.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Tp(),cleanup:ri()}}},ST=e=>{let t=new Set(["manifest.json",bp]),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},PT=e=>{let t=new Map(e.repos.map(r=>[r.id,r.name])),n=e.repoTargets.map(r=>{let s=t.get(r.repoId)??r.repoId,i=H.relative(e.bundlePath,r.worktreePath),o=r.status==="ready"?"ready":`unavailable: ${r.failureReason??"unknown error"}`;return`- \`${i}/\` - ${s} (${r.repoId}, ${o})`}).join(`
13
13
  `);return["# Craig Project Task Bundle","","This directory is a Craig project task bundle. Repo work must happen inside the child repo worktrees listed below.","","Run repo Git commands from a repo worktree directory, not from the bundle root. Use `manifest.json` as the machine-readable source of truth for this bundle.","",`Task: \`${e.taskId}\``,`Workspace: \`${e.workspaceId}\``,`Prompt: ${e.prompt}`,"","## Repo Worktrees","",n,""].join(`
14
- `)},Ca=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),yp=()=>({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}),ri=()=>({paneClosedAt:null,worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),kp=(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}),RT=async(e,t)=>{let r=(await $e(e)).find(s=>s.kind!=="project"&&s.primaryRepoId===t&&s.status==="active");if(!r)throw new Error(`Repo ${t} does not have an active workspace.`);return r},Tp=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");import $p from"node:path";import{readFile as ST,rm as pN}from"node:fs/promises";import PT from"node:path";var Wt=async(e,t)=>{let n=await ST(Aa(e,t),"utf8"),r=JSON.parse(n);return IT(r,Aa(e,t))},kn=async(e,t)=>{await M(Aa(e,t.id),{...t,updatedAt:new Date().toISOString()})};var Aa=(e,t)=>PT.join(e.sessionsDir,`${t}.json`);function IT(e,t){let n=AT(e);if(typeof n!="object"||n===null||typeof n.id!="string"||typeof n.taskId!="string"||typeof n.repoId!="string"||typeof n.workspaceId!="string"||n.substrate!=="tmux"||typeof n.sessionName!="string"||typeof n.paneId!="string"||!(n.windowTarget===null||typeof n.windowTarget=="string")||typeof n.worktreePath!="string"||!(n.logPath===null||typeof n.logPath=="string")||!Array.isArray(n.command)||!n.command.every(r=>typeof r=="string")||!["starting","running","exited","failed"].includes(n.status)||!(n.startedAt===null||typeof n.startedAt=="string")||!(n.exitedAt===null||typeof n.exitedAt=="string")||!(n.exitCode===null||typeof n.exitCode=="number")||!(n.lastAttachedAt===null||typeof n.lastAttachedAt=="string")||!CT(n.attach)||!vT(n.snapshot)||typeof n.createdAt!="string"||typeof n.updatedAt!="string")throw new Error(`Craig session record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n}function vT(e){return e===null||typeof e=="object"&&e!==null&&typeof e.paneId=="string"&&(typeof e.windowTarget=="string"||e.windowTarget===null)&&typeof e.alive=="boolean"&&typeof e.capturedAt=="string"}function CT(e){return typeof e=="object"&&e!==null&&e.detachChord==="ctrl+]"&&(e.lastSize===null||typeof e.lastSize=="object"&&e.lastSize!==null&&typeof e.lastSize.columns=="number"&&typeof e.lastSize.rows=="number")}function AT(e){let t=typeof e=="object"&&e!==null?e:{};return{id:t.id??"",taskId:t.taskId??"",repoId:t.repoId??"",workspaceId:t.workspaceId??"",substrate:t.substrate??"tmux",sessionName:t.sessionName??"",paneId:t.paneId??"",windowTarget:typeof t.windowTarget=="string"?t.windowTarget:null,worktreePath:t.worktreePath??"",logPath:typeof t.logPath=="string"?t.logPath:null,command:Array.isArray(t.command)?t.command.filter(n=>typeof n=="string"):[],status:t.status??"starting",startedAt:typeof t.startedAt=="string"?t.startedAt:null,exitedAt:typeof t.exitedAt=="string"?t.exitedAt:null,exitCode:typeof t.exitCode=="number"?t.exitCode:null,lastAttachedAt:typeof t.lastAttachedAt=="string"?t.lastAttachedAt:null,attach:{detachChord:"ctrl+]",lastSize:typeof t.attach=="object"&&t.attach!==null&&t.attach.lastSize&&typeof t.attach.lastSize.columns=="number"&&typeof t.attach.lastSize.rows=="number"?t.attach.lastSize:null},snapshot:t.snapshot&&typeof t.snapshot=="object"?{paneId:typeof t.snapshot.paneId=="string"?t.snapshot.paneId:t.paneId??"",windowTarget:typeof t.snapshot.windowTarget=="string"?t.snapshot.windowTarget:null,alive:!!t.snapshot.alive,capturedAt:typeof t.snapshot.capturedAt=="string"?t.snapshot.capturedAt:new Date().toISOString()}:null,createdAt:t.createdAt??"",updatedAt:t.updatedAt??""}}import{randomUUID as BT}from"node:crypto";import{mkdir as VT,rm as KT,writeFile as GT}from"node:fs/promises";import $a from"node:path";import{spawn as ET}from"node:child_process";import{createHash as OT}from"node:crypto";import $T from"node:path";function Tn(e){return`'${e.replace(/'/g,"'\\''")}'`}var NT="craig",bp=async(e,t,n)=>{let r=Ea(e,t),s=xT(),i=await F("tmux",["new-session","-d","-P","-F","#{session_name} #{window_id} #{pane_id}","-s",r,"-n","runner",...s,"-c",n],{cwd:e}),o=FT(i.stdout);return await DT(e,r),o};var DT=async(e,t)=>{let n=[["set-option","-t",t,"status","off"],["set-option","-t",t,"detach-on-destroy","off"],["set-window-option","-t",t,"pane-border-status","off"],["set-window-option","-t",t,"aggressive-resize","on"]];for(let r of n)await F("tmux",r,{cwd:e})},Rp=async(e,t,n)=>{await F("tmux",["resize-window","-t",t,"-x",`${n.columns}`,"-y",`${n.rows}`],{cwd:e})},Sp=async(e,t,n)=>{await F("tmux",["send-keys","-t",e,t,"C-m"],{cwd:n})};var Pp=async(e,t,n)=>{await F("tmux",["pipe-pane","-o","-t",e,`cat >> ${Tn(t)}`],{cwd:n})},si=async(e,t,n,r)=>{let s=r??vp(e);if(n?await F("tmux",["select-window","-t",n],{cwd:e}):await F("tmux",["select-window","-t",t],{cwd:e}),await F("tmux",["select-pane","-t",t],{cwd:e}),process.env.TMUX){await F("tmux",["switch-client","-t",s],{cwd:e});return}await MT(e,["attach-session","-t",s])};var Ip=async(e,t)=>{await F("tmux",["kill-session","-t",t],{cwd:e})};var vp=e=>{let n=$T.basename(e).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"repo",r=OT("sha1").update(e).digest("hex").slice(0,8);return`${NT}-${n}-${r}`},Ea=(e,t)=>`${vp(e)}-${t.toLowerCase()}`,xT=()=>{let e=_T();return e?["-x",`${e.columns}`,"-y",`${e.rows}`]:[]},_T=()=>{let e=[process.stdout,process.stderr,process.stdin];for(let t of e){let n="columns"in t?t.columns:void 0,r="rows"in t?t.rows:void 0;if(typeof n=="number"&&n>0&&typeof r=="number"&&r>0)return{columns:n,rows:r}}return null},FT=e=>{let t=LT(e);if(t.length<3)throw new Error("tmux did not return the expected session, window, and pane targets for the Craig task session.");return{sessionName:t[0],windowTarget:t[1],paneId:t[2]}},LT=e=>e.split(/\s+/).map(t=>t.trim()).filter(t=>t.length>0),MT=async(e,t)=>{await new Promise((n,r)=>{let s=ET("tmux",t,{cwd:e,stdio:"inherit"});s.on("error",r),s.on("exit",i=>{if(i===0){n();return}r(new Error(`tmux ${t.join(" ")} failed with exit code ${i??"unknown"}.`))})})};import{accessSync as jT,constants as qT}from"node:fs";import{homedir as Cp}from"node:os";import Bt from"node:path";var UT=[Bt.join(Cp(),".local","bin"),Bt.join(Cp(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function Ep(e=process.env){return WT([...(e.PATH??"").split(Bt.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:UT])}function bn(e=process.env){return{...e,PATH:Ep(e).join(Bt.delimiter)}}function Oa(e,t={}){if(e.includes(Bt.sep)){let n=Bt.isAbsolute(e)?e:Bt.resolve(t.cwd??process.cwd(),e);return Ap(n)?n:null}for(let n of Ep(t.env)){let r=Bt.join(n,e);if(Ap(r))return r}return null}function Rn(e,t={}){let n=Oa(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 Ap(e){try{return jT(e,qT.X_OK),!0}catch{return!1}}function WT(e){return[...new Set(e)]}var jr={async create(e,t){let n=await bp(t.repoRoot,t.taskId,t.worktreePath);t.logPath&&await Pp(n.paneId,t.logPath,t.repoRoot);let r=await Op({paneId:n.paneId,windowTarget:n.windowTarget,alive:!0}),s={id:t.sessionId,taskId:t.taskId,repoId:t.repoId,workspaceId:t.workspaceId,substrate:"tmux",sessionName:n.sessionName||Ea(t.repoRoot,t.taskId),paneId:n.paneId,windowTarget:n.windowTarget,worktreePath:t.worktreePath,logPath:t.logPath,command:t.command,status:"starting",startedAt:null,exitedAt:null,exitCode:null,lastAttachedAt:null,attach:{detachChord:"ctrl+]",lastSize:null},snapshot:r,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return await kn(e,s),s},async attach(e,t,n){let r=await jr.snapshot(t,n);if(!r.alive)throw new Error(`Session ${t.id} is no longer live and cannot be attached.`);await si(n,t.paneId,t.windowTarget,t.sessionName);let s={...t,status:"running",lastAttachedAt:new Date().toISOString(),snapshot:r};return await kn(e,s),s},async resize(e,t,n,r){await Rp(r,t.sessionName,n);let s={...t,attach:{...t.attach,lastSize:n}};return await kn(e,s),s},async write(){throw new Error("Direct session writes are owned by the terminal bridge.")},async read(){throw new Error("Direct session reads are owned by the terminal bridge.")},async terminate(e,t,n){let r={...t,status:"failed",exitedAt:new Date().toISOString(),snapshot:{...t.snapshot??{paneId:t.paneId,windowTarget:t.windowTarget,alive:!1,capturedAt:new Date().toISOString()},alive:!1,capturedAt:new Date().toISOString()},command:t.command};return await kn(e,r),r},async snapshot(e,t){return YT(e,t)}},Na={async prepare(e,t){let r=e.runnerSession.command[0],s=bn();Rn(r,{cwd:t.repoRoot,env:s})},async launch(e,t){let n=e.runnerSession.command,r=Rn(n[0],{cwd:e.worktreePath,env:bn()}),s=Object.keys(t.environment??{}).length>0?await HT(t.session,t.environment):null,i=[r,...n.slice(1)].map(a=>Tn(a)).join(" "),o=s?`. ${Tn(s)} && rm -f ${Tn(s)} && exec ${i}`:`exec ${i}`;try{await Sp(t.session.paneId,o,t.repoRoot)}catch(a){throw s&&await KT(s,{force:!0}).catch(()=>{}),a}},async status(e){return e.runnerSession.lastKnownState},async stop(){},async collectArtifacts(){}};async function HT(e,t){let n=$a.join($a.dirname(e.logPath??e.worktreePath),".launch-environment");await VT(n,{recursive:!0,mode:448});let r=$a.join(n,`${e.id}.${BT()}.sh`),s=Object.entries(t).map(([i,o])=>{if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(i))throw new Error(`Invalid launch environment variable name: ${i}`);return`export ${i}=${Tn(o)}`}).join(`
15
- `);return await GT(r,`${s}
16
- `,{encoding:"utf8",mode:384,flag:"wx"}),r}var YT=async(e,t)=>{let n=await G("tmux",["list-panes","-F","#{pane_id}","-t",e.paneId],{cwd:t});return Op({paneId:e.paneId,windowTarget:e.windowTarget,alive:n.exitCode===0&&n.stdout.split(/\s+/).some(r=>r.trim()===e.paneId)})},Op=async e=>({paneId:e.paneId,windowTarget:e.windowTarget,alive:e.alive,capturedAt:new Date().toISOString()});var Da=async(e,t,n,r={})=>{let s=n.trim(),i=await k.load(e),o=r.runner??k.runners.getDefault(i);if(k.runners.assertEnabled(o,i),t.trim().length===0)throw new Error(r.workspaceId?"Workspace id cannot be empty.":"Repo id cannot be empty.");if(s.length===0)throw new Error("Task prompt cannot be empty.");let a=r.workspaceId?await Lr(e,r.workspaceId,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}):await zn(e,t,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}),l=a.task,c=k.runners.buildCommand(o,s,i),u=`session_${l.id}`,d=l.artifacts.logPath?$p.resolve(e.workspaceRoot,l.artifacts.logPath):$p.join(e.logsDir,`${l.id}.log`);try{let p=await r.onProvisioned?.(l);await Na.prepare(l,{repoRoot:a.repoRoot});let h=await jr.create(e,{sessionId:u,taskId:l.id,repoId:a.repoId,workspaceId:a.workspaceId,repoRoot:a.repoRoot,worktreePath:l.worktreePath,logPath:d,command:c});await Na.launch(l,{repoRoot:a.repoRoot,session:h,...p?{environment:p}:{}});let f=new Date().toISOString();h={...h,status:"running",startedAt:f,command:c};let m=await W(e,l.id,y=>({...y,status:"running",runner:o,sessionId:h.id,selectedPtyTabId:y.selectedPtyTabId,runnerSession:{command:h.command,pid:null,startedAt:f,lastKnownState:"running",exitCode:null,exitedAt:null}}));return await kn(e,h),{kind:"createTask",taskId:m.id,repoId:m.repoId,workspaceId:m.workspaceId,sessionId:h.id,status:m.status,branch:m.branch,worktreePath:m.worktreePath,runner:m.runner}}catch(p){throw await W(e,l.id,h=>({...h,sessionId:null,status:"draft",runnerSession:{...h.runnerSession,lastKnownState:"failed"},lastFailureReason:p instanceof Error?p.message:"Unknown Craig error"})),p}};import{mkdir as ZT}from"node:fs/promises";import eb from"node:path";var It=async e=>{let t=await G("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var Np=async(e,t,n)=>{let r=n==="merge"?"--merge":n==="rebase"?"--rebase":"--squash";await F("gh",["pr","merge",String(t),r,"--delete-branch=false"],{cwd:e})},Jn=async(e,t)=>{let n=await F("gh",xa(e),{cwd:t});return JSON.parse(n.stdout)},Xn=async(e,t)=>{let n=await G("gh",xa(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(_p(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Dp=async(e,t)=>{let n=await G("gh",xa(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(_p(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},xp=async(e,t,n)=>{if(n.length===0)return[];let r=XT(n),s;try{s=await F("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw zT(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}`],u=QT(c);return{id:a.id,found:u!==null,view:u}})},ii=async e=>{let t=await G("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:JT(t.stdout.trim())},Vt=e=>{let t=e.trim().match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/([1-9]\d*)(?:[/?#].*)?$/);return!t?.[1]||!t[2]||!t[3]?null:{owner:t[1],name:t[2],number:Number(t[3])}},zT=e=>{let t=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase();return t.includes("rate limit")||t.includes("secondary rate limit")||t.includes("abuse detection")||t.includes("api rate limit exceeded")||t.includes("you have exceeded")},_p=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},xa=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],JT=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},XT=e=>`
14
+ `)},Ca=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),Tp=()=>({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}),ri=()=>({paneClosedAt:null,worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),Rp=(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}),IT=async(e,t)=>{let r=(await $e(e)).find(s=>s.kind!=="project"&&s.primaryRepoId===t&&s.status==="active");if(!r)throw new Error(`Repo ${t} does not have an active workspace.`);return r},Sp=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");import xp from"node:path";import{readFile as vT,rm as kD}from"node:fs/promises";import CT from"node:path";var Wt=async(e,t)=>{let n=await vT(Aa(e,t),"utf8"),r=JSON.parse(n);return AT(r,Aa(e,t))},Tn=async(e,t)=>{await M(Aa(e,t.id),{...t,updatedAt:new Date().toISOString()})};var Aa=(e,t)=>CT.join(e.sessionsDir,`${t}.json`);function AT(e,t){let n=$T(e);if(typeof n!="object"||n===null||typeof n.id!="string"||typeof n.taskId!="string"||typeof n.repoId!="string"||typeof n.workspaceId!="string"||n.substrate!=="tmux"||typeof n.sessionName!="string"||typeof n.paneId!="string"||!(n.windowTarget===null||typeof n.windowTarget=="string")||typeof n.worktreePath!="string"||!(n.logPath===null||typeof n.logPath=="string")||!Array.isArray(n.command)||!n.command.every(r=>typeof r=="string")||!["starting","running","exited","failed"].includes(n.status)||!(n.startedAt===null||typeof n.startedAt=="string")||!(n.exitedAt===null||typeof n.exitedAt=="string")||!(n.exitCode===null||typeof n.exitCode=="number")||!(n.lastAttachedAt===null||typeof n.lastAttachedAt=="string")||!OT(n.attach)||!ET(n.snapshot)||typeof n.createdAt!="string"||typeof n.updatedAt!="string")throw new Error(`Craig session record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n}function ET(e){return e===null||typeof e=="object"&&e!==null&&typeof e.paneId=="string"&&(typeof e.windowTarget=="string"||e.windowTarget===null)&&typeof e.alive=="boolean"&&typeof e.capturedAt=="string"}function OT(e){return typeof e=="object"&&e!==null&&e.detachChord==="ctrl+]"&&(e.lastSize===null||typeof e.lastSize=="object"&&e.lastSize!==null&&typeof e.lastSize.columns=="number"&&typeof e.lastSize.rows=="number")}function $T(e){let t=typeof e=="object"&&e!==null?e:{};return{id:t.id??"",taskId:t.taskId??"",repoId:t.repoId??"",workspaceId:t.workspaceId??"",substrate:t.substrate??"tmux",sessionName:t.sessionName??"",paneId:t.paneId??"",windowTarget:typeof t.windowTarget=="string"?t.windowTarget:null,worktreePath:t.worktreePath??"",logPath:typeof t.logPath=="string"?t.logPath:null,command:Array.isArray(t.command)?t.command.filter(n=>typeof n=="string"):[],status:t.status??"starting",startedAt:typeof t.startedAt=="string"?t.startedAt:null,exitedAt:typeof t.exitedAt=="string"?t.exitedAt:null,exitCode:typeof t.exitCode=="number"?t.exitCode:null,lastAttachedAt:typeof t.lastAttachedAt=="string"?t.lastAttachedAt:null,attach:{detachChord:"ctrl+]",lastSize:typeof t.attach=="object"&&t.attach!==null&&t.attach.lastSize&&typeof t.attach.lastSize.columns=="number"&&typeof t.attach.lastSize.rows=="number"?t.attach.lastSize:null},snapshot:t.snapshot&&typeof t.snapshot=="object"?{paneId:typeof t.snapshot.paneId=="string"?t.snapshot.paneId:t.paneId??"",windowTarget:typeof t.snapshot.windowTarget=="string"?t.snapshot.windowTarget:null,alive:!!t.snapshot.alive,capturedAt:typeof t.snapshot.capturedAt=="string"?t.snapshot.capturedAt:new Date().toISOString()}:null,createdAt:t.createdAt??"",updatedAt:t.updatedAt??""}}import{randomUUID as GT}from"node:crypto";import{mkdir as HT,rm as YT,writeFile as zT}from"node:fs/promises";import $a from"node:path";import{spawn as DT}from"node:child_process";import{createHash as NT}from"node:crypto";import xT from"node:path";function bn(e){return`'${e.replace(/'/g,"'\\''")}'`}var _T="craig",Pp=async(e,t,n)=>{let r=Ea(e,t),s=LT(),i=await F("tmux",["new-session","-d","-P","-F","#{session_name} #{window_id} #{pane_id}","-s",r,"-n","runner",...s,"-c",n],{cwd:e}),o=jT(i.stdout);return await FT(e,r),o};var FT=async(e,t)=>{let n=[["set-option","-t",t,"status","off"],["set-option","-t",t,"detach-on-destroy","off"],["set-window-option","-t",t,"pane-border-status","off"],["set-window-option","-t",t,"aggressive-resize","on"]];for(let r of n)await F("tmux",r,{cwd:e})},Ip=async(e,t,n)=>{await F("tmux",["resize-window","-t",t,"-x",`${n.columns}`,"-y",`${n.rows}`],{cwd:e})},vp=async(e,t,n)=>{await F("tmux",["send-keys","-t",e,t,"C-m"],{cwd:n})};var Cp=async(e,t,n)=>{await F("tmux",["pipe-pane","-o","-t",e,`cat >> ${bn(t)}`],{cwd:n})},si=async(e,t,n,r)=>{let s=r??Ep(e);if(n?await F("tmux",["select-window","-t",n],{cwd:e}):await F("tmux",["select-window","-t",t],{cwd:e}),await F("tmux",["select-pane","-t",t],{cwd:e}),process.env.TMUX){await F("tmux",["switch-client","-t",s],{cwd:e});return}await UT(e,["attach-session","-t",s])};var Ap=async(e,t)=>{await F("tmux",["kill-session","-t",t],{cwd:e})};var Ep=e=>{let n=xT.basename(e).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"repo",r=NT("sha1").update(e).digest("hex").slice(0,8);return`${_T}-${n}-${r}`},Ea=(e,t)=>`${Ep(e)}-${t.toLowerCase()}`,LT=()=>{let e=MT();return e?["-x",`${e.columns}`,"-y",`${e.rows}`]:[]},MT=()=>{let e=[process.stdout,process.stderr,process.stdin];for(let t of e){let n="columns"in t?t.columns:void 0,r="rows"in t?t.rows:void 0;if(typeof n=="number"&&n>0&&typeof r=="number"&&r>0)return{columns:n,rows:r}}return null},jT=e=>{let t=qT(e);if(t.length<3)throw new Error("tmux did not return the expected session, window, and pane targets for the Craig task session.");return{sessionName:t[0],windowTarget:t[1],paneId:t[2]}},qT=e=>e.split(/\s+/).map(t=>t.trim()).filter(t=>t.length>0),UT=async(e,t)=>{await new Promise((n,r)=>{let s=DT("tmux",t,{cwd:e,stdio:"inherit"});s.on("error",r),s.on("exit",i=>{if(i===0){n();return}r(new Error(`tmux ${t.join(" ")} failed with exit code ${i??"unknown"}.`))})})};import{accessSync as WT,constants as BT}from"node:fs";import{homedir as Op}from"node:os";import Bt from"node:path";var VT=[Bt.join(Op(),".local","bin"),Bt.join(Op(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function Dp(e=process.env){return KT([...(e.PATH??"").split(Bt.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:VT])}function Rn(e=process.env){return{...e,PATH:Dp(e).join(Bt.delimiter)}}function Oa(e,t={}){if(e.includes(Bt.sep)){let n=Bt.isAbsolute(e)?e:Bt.resolve(t.cwd??process.cwd(),e);return $p(n)?n:null}for(let n of Dp(t.env)){let r=Bt.join(n,e);if($p(r))return r}return null}function Sn(e,t={}){let n=Oa(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 $p(e){try{return WT(e,BT.X_OK),!0}catch{return!1}}function KT(e){return[...new Set(e)]}var qr={async create(e,t){let n=await Pp(t.repoRoot,t.taskId,t.worktreePath);t.logPath&&await Cp(n.paneId,t.logPath,t.repoRoot);let r=await Np({paneId:n.paneId,windowTarget:n.windowTarget,alive:!0}),s={id:t.sessionId,taskId:t.taskId,repoId:t.repoId,workspaceId:t.workspaceId,substrate:"tmux",sessionName:n.sessionName||Ea(t.repoRoot,t.taskId),paneId:n.paneId,windowTarget:n.windowTarget,worktreePath:t.worktreePath,logPath:t.logPath,command:t.command,status:"starting",startedAt:null,exitedAt:null,exitCode:null,lastAttachedAt:null,attach:{detachChord:"ctrl+]",lastSize:null},snapshot:r,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return await Tn(e,s),s},async attach(e,t,n){let r=await qr.snapshot(t,n);if(!r.alive)throw new Error(`Session ${t.id} is no longer live and cannot be attached.`);await si(n,t.paneId,t.windowTarget,t.sessionName);let s={...t,status:"running",lastAttachedAt:new Date().toISOString(),snapshot:r};return await Tn(e,s),s},async resize(e,t,n,r){await Ip(r,t.sessionName,n);let s={...t,attach:{...t.attach,lastSize:n}};return await Tn(e,s),s},async write(){throw new Error("Direct session writes are owned by the terminal bridge.")},async read(){throw new Error("Direct session reads are owned by the terminal bridge.")},async terminate(e,t,n){let r={...t,status:"failed",exitedAt:new Date().toISOString(),snapshot:{...t.snapshot??{paneId:t.paneId,windowTarget:t.windowTarget,alive:!1,capturedAt:new Date().toISOString()},alive:!1,capturedAt:new Date().toISOString()},command:t.command};return await Tn(e,r),r},async snapshot(e,t){return XT(e,t)}},Da={async prepare(e,t){let r=e.runnerSession.command[0],s=Rn();Sn(r,{cwd:t.repoRoot,env:s})},async launch(e,t){let n=e.runnerSession.command,r=Sn(n[0],{cwd:e.worktreePath,env:Rn()}),s=Object.keys(t.environment??{}).length>0?await JT(t.session,t.environment):null,i=[r,...n.slice(1)].map(a=>bn(a)).join(" "),o=s?`. ${bn(s)} && rm -f ${bn(s)} && exec ${i}`:`exec ${i}`;try{await vp(t.session.paneId,o,t.repoRoot)}catch(a){throw s&&await YT(s,{force:!0}).catch(()=>{}),a}},async status(e){return e.runnerSession.lastKnownState},async stop(){},async collectArtifacts(){}};async function JT(e,t){let n=$a.join($a.dirname(e.logPath??e.worktreePath),".launch-environment");await HT(n,{recursive:!0,mode:448});let r=$a.join(n,`${e.id}.${GT()}.sh`),s=Object.entries(t).map(([i,o])=>{if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(i))throw new Error(`Invalid launch environment variable name: ${i}`);return`export ${i}=${bn(o)}`}).join(`
15
+ `);return await zT(r,`${s}
16
+ `,{encoding:"utf8",mode:384,flag:"wx"}),r}var XT=async(e,t)=>{let n=await G("tmux",["list-panes","-F","#{pane_id}","-t",e.paneId],{cwd:t});return Np({paneId:e.paneId,windowTarget:e.windowTarget,alive:n.exitCode===0&&n.stdout.split(/\s+/).some(r=>r.trim()===e.paneId)})},Np=async e=>({paneId:e.paneId,windowTarget:e.windowTarget,alive:e.alive,capturedAt:new Date().toISOString()});var Na=async(e,t,n,r={})=>{let s=n.trim(),i=await k.load(e),o=r.runner??k.runners.getDefault(i);if(k.runners.assertEnabled(o,i),t.trim().length===0)throw new Error(r.workspaceId?"Workspace id cannot be empty.":"Repo id cannot be empty.");if(s.length===0)throw new Error("Task prompt cannot be empty.");let a=r.workspaceId?await Mr(e,r.workspaceId,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}):await zn(e,t,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}),l=a.task,c=k.runners.buildCommand(o,s,i),u=`session_${l.id}`,d=l.artifacts.logPath?xp.resolve(e.workspaceRoot,l.artifacts.logPath):xp.join(e.logsDir,`${l.id}.log`);try{let p=await r.onProvisioned?.(l);await Da.prepare(l,{repoRoot:a.repoRoot});let m=await qr.create(e,{sessionId:u,taskId:l.id,repoId:a.repoId,workspaceId:a.workspaceId,repoRoot:a.repoRoot,worktreePath:l.worktreePath,logPath:d,command:c});await Da.launch(l,{repoRoot:a.repoRoot,session:m,...p?{environment:p}:{}});let g=new Date().toISOString();m={...m,status:"running",startedAt:g,command:c};let f=await W(e,l.id,y=>({...y,status:"running",runner:o,sessionId:m.id,selectedPtyTabId:y.selectedPtyTabId,runnerSession:{command:m.command,pid:null,startedAt:g,lastKnownState:"running",exitCode:null,exitedAt:null}}));return await Tn(e,m),{kind:"createTask",taskId:f.id,repoId:f.repoId,workspaceId:f.workspaceId,sessionId:m.id,status:f.status,branch:f.branch,worktreePath:f.worktreePath,runner:f.runner}}catch(p){throw await W(e,l.id,m=>({...m,sessionId:null,status:"draft",runnerSession:{...m.runnerSession,lastKnownState:"failed"},lastFailureReason:p instanceof Error?p.message:"Unknown Craig error"})),p}};import{mkdir as nb}from"node:fs/promises";import rb from"node:path";var vt=async e=>{let t=await G("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var _p=async(e,t,n)=>{let r=n==="merge"?"--merge":n==="rebase"?"--rebase":"--squash";await F("gh",["pr","merge",String(t),r,"--delete-branch=false"],{cwd:e})},Jn=async(e,t)=>{let n=await F("gh",xa(e),{cwd:t});return JSON.parse(n.stdout)},Xn=async(e,t)=>{let n=await G("gh",xa(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Mp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Fp=async(e,t)=>{let n=await G("gh",xa(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Mp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Lp=async(e,t,n)=>{if(n.length===0)return[];let r=eb(n),s;try{s=await F("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw QT(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}`],u=tb(c);return{id:a.id,found:u!==null,view:u}})},ii=async e=>{let t=await G("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:ZT(t.stdout.trim())},Vt=e=>{let t=e.trim().match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/([1-9]\d*)(?:[/?#].*)?$/);return!t?.[1]||!t[2]||!t[3]?null:{owner:t[1],name:t[2],number:Number(t[3])}},QT=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")},Mp=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},xa=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],ZT=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},eb=e=>`
17
17
  query CraigPullRequestBatch($owner: String!, $name: String!) {
18
18
  repository(owner: $owner, name: $name) {
19
19
  ${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(`
@@ -67,131 +67,131 @@ fragment PrFields on PullRequest {
67
67
  }
68
68
  }
69
69
  }
70
- `,QT=e=>{if(!e||typeof e!="object")return null;let t="nodes"in e?e.nodes?.[0]??null:e;if(!t||typeof t!="object")return null;let n=t,r=n.statusCheckRollup?.contexts?.nodes??[];return{number:n.number,url:n.url,baseRefName:n.baseRefName,headRefName:n.headRefName,headRefOid:n.headRefOid??null,state:n.state,isDraft:n.isDraft??!1,title:n.title??null,createdAt:n.createdAt??null,updatedAt:n.updatedAt??null,mergedAt:n.mergedAt??null,mergeable:n.mergeable,mergeStateStatus:n.mergeStateStatus,reviewDecision:n.reviewDecision??null,statusCheckRollup:r,comments:n.comments?.nodes??[]}};var Sn=async(e,t)=>{let n=wn(e,t.artifacts.prStatusPath);n&&(await ZT(eb.dirname(n),{recursive:!0}),await M(n,{taskId:t.id,prs:t.prs}))},qr=async(e,t,n={writeTask:Rt,writePrStatusArtifact:Sn})=>{await n.writeTask(e,t);try{await n.writePrStatusArtifact(e,t)}catch(r){throw new g("PARTIAL_RESULT",`Task ${t.id} was updated, but its PR status artifact could not be written.`,{retryable:!0,details:{taskId:t.id},cause:r})}return t},Ur=async(e,t,n,r,s={readRawTask:bt,validateTaskRecord:qe,writeTask:Rt,writePrStatusArtifact:Sn,withTaskLock:qt})=>s.withTaskLock(e,t.id,async()=>{let i=await s.readRawTask(e,t.id),o=s.validateTaskRecord(i,`${e.tasksDir}/${t.id}.json`),a=o.prs.find(p=>r?.number!==null&&p.number===r?.number)??r,l=Pt(n,a),c=St(o,l),u=o.status==="closed"?o.status:yn(c.prs),d={...c,status:u};return qr(e,d,s)}),Wr=async(e,t)=>{let n=V(t),r=n?.number?String(n.number):t.branch,s=await Jn(r,t.worktreePath);return Ur(e,t,s,n)},Br=async(e,t)=>{for(let n of await _a(t)){let r=await Xn(n,t.worktreePath);if(!r)continue;return{discovered:!0,task:await Ur(e,t,r,null)}}return{discovered:!1,task:t}},_a=async e=>{let t=await dp(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(n=>!!n))]};async function Vr(e,t,n,r){return qt(e,t,async()=>{let s=await L(e,t);if(!s.repoTargets?.find(h=>h.repoId===n))throw new Error(`Project task ${t} has no repo target ${n}.`);let o=Vt(r.url),a=s.prs.find(h=>o?Gn(h,{owner:o.owner,repo:o.name,number:r.number}):h.number===r.number)??null,l=Pt(r,a,o??void 0),c=tb(r),u=St(s,l),d={...u,repoTargets:(u.repoTargets??[]).map(h=>h.repoId===n?{...h,pullRequest:c}:h)},p={...d,status:d.status==="closed"?d.status:Fa(d)};return qr(e,p)})}function tb(e){let t=Vt(e.url);return{provider:"github",owner:t?.owner??null,repo:t?.name??null,number:e.number,url:e.url,baseBranch:e.baseRefName,headBranch:e.headRefName,status:nb(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:rb(e.reviewDecision??null),requiredChecks:ba(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function Fa(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 nb=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,rb=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null;var Qn=async(e,t,n)=>{let r=n.pullRequest.number?String(n.pullRequest.number):n.branch;if(n.pullRequest.number){let i=await Jn(r,n.worktreePath);return await Vr(e,t.id,n.repoId,i),"synced"}let s=await Xn(r,n.worktreePath);return s?(await Vr(e,t.id,n.repoId,s),"discovered"):"not_found"};var Kr=async(e,t)=>{let n=await L(e,t),r=V(n);return r?.number?(await It(n.worktreePath),Ut(r)?(await Br(e,n)).task:Wr(e,n)):n},Ma=async(e,t)=>{let n=await L(e,t);if(n.type==="project"&&n.repoTargets?.length)return await Zn(e,t),L(e,t);let r=V(n);if(await me(n),await It(n.worktreePath),!r?.number||Ut(r)){let i=await Br(e,n);if(!i.discovered&&!r?.number)throw new Error(`No PR found for ${n.branch}.`);return i.task}return await Wr(e,n)},Zn=async(e,t)=>{let n=await L(e,t),r=(n.repoTargets??[]).filter(i=>i.status==="ready"),s={synced:0,discovered:0,notFound:0};for(let i of r){await It(i.worktreePath);let o=i.pullRequest.number?await Qn(e,n,i):await Qn(e,n,i).catch(()=>"not_found");s[o==="not_found"?"notFound":o]++}return s},ja=async(e,t)=>{let n=new Map,r=new Map,s=[];for(let i of t){let o=La(n,i);if(i.type==="project"&&i.repoTargets?.length){for(let d of i.repoTargets.filter(p=>p.status==="ready")){let p={id:`${i.id}:${d.repoId}`,task:i,targetRepoId:d.repoId,worktreePath:d.worktreePath,selector:d.pullRequest.number?String(d.pullRequest.number):d.branch,mode:d.pullRequest.number?"number":"head",fallbackSelectors:[]};await Fp(r,p).catch(async()=>{try{await It(d.worktreePath);let h=d.pullRequest.number?await Qn(e,i,d):await Qn(e,i,d);oi(o,h,d.pullRequest.number??null,d.pullRequest.url??null)}catch(h){if(h instanceof We)throw h;s.push(h)}})}continue}let a=V(i),l=a?.number&&!Ut(a),c=l?[]:await _a(i),u={id:i.id,task:i,worktreePath:i.worktreePath,selector:l?String(a.number):c[0]??i.branch,mode:l?"number":"head",fallbackSelectors:l?[]:c.slice(1)};await Fp(r,u).catch(async()=>{try{let{disposition:d,task:p}=await ai(e,i.id),h=V(p);oi(o,d,h?.number??null,h?.url??null)}catch(d){if(d instanceof We)throw d;s.push(d)}})}for(let i of r.values())try{await It(i.worktreePath);let o=await xp(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=La(n,l.task),d=a.get(l.id)?.view??await sb(i.worktreePath,l);if(!d){oi(c,"not_found",null,null);continue}if(l.targetRepoId)await Vr(e,l.task.id,l.targetRepoId,d);else{let p=await bt(e,l.task.id),h=qe(p,`${e.tasksDir}/${l.task.id}.json`);await Ur(e,h,d,l.mode==="number"?V(h):null)}oi(c,l.mode==="number"?"synced":"discovered",d.number,d.url)}}catch(o){if(o instanceof We)throw o;s.push(o)}return ib(s),t.map(i=>La(n,i))},ai=async(e,t)=>{let n=await L(e,t);await me(n),await It(n.worktreePath);let r=V(n);if(r?.number&&!Ut(r))return{disposition:"synced",task:await Wr(e,n)};let s=await Br(e,n);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},sb=async(e,t)=>{if(t.mode!=="head")return null;for(let n of t.fallbackSelectors){let r=await Xn(n,e);if(r)return r}return null},Fp=async(e,t)=>{let n=await ii(t.worktreePath);if(!n)throw new Error("GitHub repository remote could not be parsed.");let r=`${n.owner}/${n.name}`,s=e.get(r);if(s){s.items.push(t);return}e.set(r,{worktreePath:t.worktreePath,repository:n,items:[t]})},La=(e,t)=>{let n=e.get(t.id);if(n)return n;let r={taskId:t.id,synced:0,discovered:0,notFound:0,hadPr:t.type==="project"?!!t.repoTargets?.some(s=>s.pullRequest.number):!!V(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,r),r},oi=(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 qa=async(e,t)=>{let n=await L(e,t);try{n.type==="project"&&n.repoTargets?.length?(await Zn(e,t),n=await L(e,t)):n.prs.some(i=>i.number)&&(n=await Kr(e,t))}catch{}let r=await Dr(e,n),s=n.sessionId?await Wt(e,n.sessionId).catch(()=>null):null;return{kind:"showTask",task:n,inspection:r,session:s}};var Ua=async(e,t)=>{let n=await L(e,t);if(await me(n),(await F("git",["status","--short"],{cwd:n.worktreePath})).stdout.trim().length===0)return{kind:"showTaskDiff",taskId:n.id,diffText:"",isEmpty:!0};let s=await ob(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}},ob=async e=>{let t=[],n=await F("git",["diff","--stat","--patch","HEAD"],{cwd:e});n.stdout.trim().length>0&&t.push(n.stdout.trimEnd());let r=await ab(e);for(let s of r){let i=await G("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(i.stdout.trimEnd())}return t.join(`
70
+ `,tb=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=kn(e,t.artifacts.prStatusPath);n&&(await nb(rb.dirname(n),{recursive:!0}),await M(n,{taskId:t.id,prs:t.prs}))},Ur=async(e,t,n={writeTask:St,writePrStatusArtifact:Pn})=>{await n.writeTask(e,t);try{await n.writePrStatusArtifact(e,t)}catch(r){throw new h("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},Wr=async(e,t,n,r,s={readRawTask:Rt,validateTaskRecord:qe,writeTask:St,writePrStatusArtifact:Pn,withTaskLock:qt})=>s.withTaskLock(e,t.id,async()=>{let i=await s.readRawTask(e,t.id),o=s.validateTaskRecord(i,`${e.tasksDir}/${t.id}.json`),a=o.prs.find(p=>r?.number!==null&&p.number===r?.number)??r,l=It(n,a),c=Pt(o,l),u=o.status==="closed"?o.status:wn(c.prs),d={...c,status:u};return Ur(e,d,s)}),Br=async(e,t)=>{let n=V(t),r=n?.number?String(n.number):t.branch,s=await Jn(r,t.worktreePath);return Wr(e,t,s,n)},Vr=async(e,t)=>{for(let n of await _a(t)){let r=await Xn(n,t.worktreePath);if(!r)continue;return{discovered:!0,task:await Wr(e,t,r,null)}}return{discovered:!1,task:t}},_a=async e=>{let t=await fp(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(n=>!!n))]};async function Kr(e,t,n,r){return qt(e,t,async()=>{let s=await L(e,t);if(!s.repoTargets?.find(m=>m.repoId===n))throw new Error(`Project task ${t} has no repo target ${n}.`);let o=Vt(r.url),a=s.prs.find(m=>o?Gn(m,{owner:o.owner,repo:o.name,number:r.number}):m.number===r.number)??null,l=It(r,a,o??void 0),c=sb(r),u=Pt(s,l),d={...u,repoTargets:(u.repoTargets??[]).map(m=>m.repoId===n?{...m,pullRequest:c}:m)},p={...d,status:d.status==="closed"?d.status:Fa(d)};return Ur(e,p)})}function sb(e){let t=Vt(e.url);return{provider:"github",owner:t?.owner??null,repo:t?.name??null,number:e.number,url:e.url,baseBranch:e.baseRefName,headBranch:e.headRefName,status:ib(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:ob(e.reviewDecision??null),requiredChecks:ba(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function Fa(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 ib=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,ob=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null;var Qn=async(e,t,n)=>{let r=n.pullRequest.number?String(n.pullRequest.number):n.branch;if(n.pullRequest.number){let i=await Jn(r,n.worktreePath);return await Kr(e,t.id,n.repoId,i),"synced"}let s=await Xn(r,n.worktreePath);return s?(await Kr(e,t.id,n.repoId,s),"discovered"):"not_found"};var Gr=async(e,t)=>{let n=await L(e,t),r=V(n);return r?.number?(await vt(n.worktreePath),Ut(r)?(await Vr(e,n)).task:Br(e,n)):n},Ma=async(e,t)=>{let n=await L(e,t);if(n.type==="project"&&n.repoTargets?.length)return await Zn(e,t),L(e,t);let r=V(n);if(await me(n),await vt(n.worktreePath),!r?.number||Ut(r)){let i=await Vr(e,n);if(!i.discovered&&!r?.number)throw new Error(`No PR found for ${n.branch}.`);return i.task}return await Br(e,n)},Zn=async(e,t)=>{let n=await L(e,t),r=(n.repoTargets??[]).filter(i=>i.status==="ready"),s={synced:0,discovered:0,notFound:0};for(let i of r){await vt(i.worktreePath);let o=i.pullRequest.number?await Qn(e,n,i):await Qn(e,n,i).catch(()=>"not_found");s[o==="not_found"?"notFound":o]++}return s},ja=async(e,t)=>{let n=new Map,r=new Map,s=[];for(let i of t){let o=La(n,i);if(i.type==="project"&&i.repoTargets?.length){for(let d of i.repoTargets.filter(p=>p.status==="ready")){let p={id:`${i.id}:${d.repoId}`,task:i,targetRepoId:d.repoId,worktreePath:d.worktreePath,selector:d.pullRequest.number?String(d.pullRequest.number):d.branch,mode:d.pullRequest.number?"number":"head",fallbackSelectors:[]};await jp(r,p).catch(async()=>{try{await vt(d.worktreePath);let m=d.pullRequest.number?await Qn(e,i,d):await Qn(e,i,d);oi(o,m,d.pullRequest.number??null,d.pullRequest.url??null)}catch(m){if(m instanceof We)throw m;s.push(m)}})}continue}let a=V(i),l=a?.number&&!Ut(a),c=l?[]:await _a(i),u={id:i.id,task:i,worktreePath:i.worktreePath,selector:l?String(a.number):c[0]??i.branch,mode:l?"number":"head",fallbackSelectors:l?[]:c.slice(1)};await jp(r,u).catch(async()=>{try{let{disposition:d,task:p}=await ai(e,i.id),m=V(p);oi(o,d,m?.number??null,m?.url??null)}catch(d){if(d instanceof We)throw d;s.push(d)}})}for(let i of r.values())try{await vt(i.worktreePath);let o=await Lp(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=La(n,l.task),d=a.get(l.id)?.view??await ab(i.worktreePath,l);if(!d){oi(c,"not_found",null,null);continue}if(l.targetRepoId)await Kr(e,l.task.id,l.targetRepoId,d);else{let p=await Rt(e,l.task.id),m=qe(p,`${e.tasksDir}/${l.task.id}.json`);await Wr(e,m,d,l.mode==="number"?V(m):null)}oi(c,l.mode==="number"?"synced":"discovered",d.number,d.url)}}catch(o){if(o instanceof We)throw o;s.push(o)}return lb(s),t.map(i=>La(n,i))},ai=async(e,t)=>{let n=await L(e,t);await me(n),await vt(n.worktreePath);let r=V(n);if(r?.number&&!Ut(r))return{disposition:"synced",task:await Br(e,n)};let s=await Vr(e,n);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},ab=async(e,t)=>{if(t.mode!=="head")return null;for(let n of t.fallbackSelectors){let r=await Xn(n,e);if(r)return r}return null},jp=async(e,t)=>{let n=await ii(t.worktreePath);if(!n)throw new Error("GitHub repository remote could not be parsed.");let r=`${n.owner}/${n.name}`,s=e.get(r);if(s){s.items.push(t);return}e.set(r,{worktreePath:t.worktreePath,repository:n,items:[t]})},La=(e,t)=>{let n=e.get(t.id);if(n)return n;let r={taskId:t.id,synced:0,discovered:0,notFound:0,hadPr:t.type==="project"?!!t.repoTargets?.some(s=>s.pullRequest.number):!!V(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,r),r},oi=(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},lb=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var qa=async(e,t)=>{let n=await L(e,t);try{n.type==="project"&&n.repoTargets?.length?(await Zn(e,t),n=await L(e,t)):n.prs.some(i=>i.number)&&(n=await Gr(e,t))}catch{}let r=await xr(e,n),s=n.sessionId?await Wt(e,n.sessionId).catch(()=>null):null;return{kind:"showTask",task:n,inspection:r,session:s}};var Ua=async(e,t)=>{let n=await L(e,t);if(await me(n),(await F("git",["status","--short"],{cwd:n.worktreePath})).stdout.trim().length===0)return{kind:"showTaskDiff",taskId:n.id,diffText:"",isEmpty:!0};let s=await cb(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}},cb=async e=>{let t=[],n=await F("git",["diff","--stat","--patch","HEAD"],{cwd:e});n.stdout.trim().length>0&&t.push(n.stdout.trimEnd());let r=await db(e);for(let s of r){let i=await G("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(i.stdout.trimEnd())}return t.join(`
71
71
 
72
- `)},ab=async e=>(await F("git",["ls-files","--others","--exclude-standard"],{cwd:e})).stdout.split(`
73
- `).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as lb}from"node:child_process";import{access as cb}from"node:fs/promises";var Wa=async(e,t)=>{let n=await L(e,t),r=Hn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await cb(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},Ba=async e=>{await new Promise((t,n)=>{let r=!1,s=lb("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 db}from"node:fs/promises";import ub from"node:path";var Va=async(e,t)=>{let n=await L(e,t);if(await me(n),n.status==="draft"||n.status==="merged")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);if(n.status==="running"&&await ti(n.worktreePath)&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);let s=(await k.load(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);await W(e,n.id,a=>({...a,status:a.status==="running"?n.status:a.status,checks:{...a.checks,status:"running",commands:[...s],results:[]}}));let i=[];for(let a of s){let l=new Date().toISOString(),c=await G("sh",["-lc",a],{cwd:n.worktreePath}),u=new Date().toISOString(),d=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:u,exitCode:d}),d!==0){let p=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,h=await W(e,n.id,f=>({...f,status:"review",checks:{...f.checks,results:i,status:"failed",lastRunAt:u},lastFailureReason:p}));return await Lp(e,h),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await W(e,n.id,a=>({...a,status:a.status==="review"||a.status==="checked"?"checked":a.status,checks:{...a.checks,results:i,status:"passed",lastRunAt:new Date().toISOString()},lastFailureReason:null}));return await Lp(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},Lp=async(e,t)=>{let n=wn(e,t.artifacts.checkSummaryPath);n&&(await db(ub.dirname(n),{recursive:!0}),await M(n,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))};var Ka=async(e,t)=>{let n=await L(e,t);await me(n);let r=await ti(n.worktreePath);if(n.status==="running"&&r&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot commit from status "${n.status}".`);if(!r)throw new Error(`Task ${n.id} has no uncommitted diff to commit.`);let s=n.prompt.value.trim();await ap(n.worktreePath),await lp(n.worktreePath,s);let i=await cp(n.worktreePath),o=new Date().toISOString(),a=await W(e,n.id,l=>({...l,status:l.status==="running"?n.status:l.status,lastCommit:{sha:i.sha,message:i.message,committedAt:o},lastFailureReason:null}));return{kind:"commitTask",taskId:n.id,status:a.status,commitSha:i.sha,message:i.message}};import{access as pb}from"node:fs/promises";var Ga=async(e,t)=>{let n=await L(e,t),r=await fb(n.worktreePath);return W(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},fb=async e=>{try{return await pb(e),!0}catch{return!1}};var Ha=async(e,t,n)=>{let r=[],s=null,i=null;try{if(t.sessionId){let o=await Wt(e,t.sessionId);await Ip(e.repoRoot,o.sessionName),s=new Date().toISOString()}}catch(o){r.push(o instanceof Error?o.message:"Failed to close tmux session.")}if(!n.preserveWorktree)try{await up(e.repoRoot,t.worktreePath),i=new Date().toISOString()}catch(o){r.push(o instanceof Error?o.message:"Failed to remove worktree.")}await W(e,t.id,o=>({...o,cleanup:{...o.cleanup,paneClosedAt:s??o.cleanup.paneClosedAt,worktreeRemovedAt:i??o.cleanup.worktreeRemovedAt,preservedWorktree:n.preserveWorktree,warning:r.length>0?r.join(" "):null}}))};var Ya=async(e,t,n)=>{let r=await Ue(e,n),s=await W(e,t,i=>{if(i.repoId===r.id)throw new Error(`Repo ${r.id} is already the primary repo for task ${i.id}.`);return{...i,linkedRepoIds:i.linkedRepoIds.includes(r.id)?i.linkedRepoIds:[...i.linkedRepoIds,r.id]}});return{kind:"addTaskLink",taskId:s.id,repoId:r.id,linkedRepoIds:s.linkedRepoIds}},za=async(e,t)=>{let n=await L(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>Ue(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};var Ja=async(e,t)=>{let n=await L(e,t);if(!n.sessionId)throw new Error(`Task ${n.id} does not have a Craig session to attach.`);let[r,s]=await Promise.all([Ue(e,n.repoId),Wt(e,n.sessionId)]),i=await jr.attach(e,s,r.rootPath);return{kind:"attachTask",taskId:n.id,sessionId:i.id,disposition:"attached"}};var Xa=async(e,t)=>{let n=await L(e,t);if(!n.sessionId)throw new Error(`Task ${n.id} does not have a Craig session.`);let r=await Wt(e,n.sessionId).catch(s=>{throw mb(s)?new Error(`Task ${n.id} does not have a Craig session.`):s});if(!r.paneId)throw new Error(`Task ${n.id} does not have a tmux target.`);return await si(e.repoRoot,r.paneId,r.windowTarget,r.sessionName),{kind:"focusTask",taskId:n.id,tmuxTarget:r.paneId}},mb=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";import{spawn as hb}from"node:child_process";var Qa=async(e,t)=>{let n=await L(e,t);await me(n);let s=(await k.load(e)).open?.command??[];if(s.length===0)return{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!1,command:null};let i=[...s,n.worktreePath];return await gb(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},gb=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=hb(s,i,{cwd:t,stdio:"inherit"});o.on("error",r),o.on("exit",a=>{if(a===0){n();return}r(new Error(`${e.join(" ")} failed with exit code ${a??"unknown"}.`))})})};var Za=async(e,t,n)=>{await W(e,t,r=>({...r,status:r.status==="running"?"draft":r.status,runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n}))},el=async(e,t,n)=>W(e,t,r=>({...r,status:"draft",runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n})),tl=async(e,t)=>W(e,t,n=>{let r=n.ptyTabs.find(s=>s.kind==="agent");if(!r)throw new Error(`Task ${t} is missing its agent PTY tab.`);return{...n,status:"running",selectedPtyTabId:r.id,runnerSession:{...n.runnerSession,startedAt:new Date().toISOString(),lastKnownState:"running"}}});import{realpath as jp}from"node:fs/promises";import Gr from"node:path";async function rl(e,t){if(t.explicitTaskId!==void 0){let l=await Mp(e,t.explicitTaskId,"explicit");return nl(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await Mp(e,t.environmentTaskId,"environment");return nl(l,"environment",t.environmentAgentTabId)}let n=await jp(t.cwd).catch(()=>Gr.resolve(t.cwd)),r=await _r(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 nl(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 Mp(e,t,n){try{return await L(e,t)}catch(r){throw!(r instanceof g)||r.code!=="TASK_NOT_FOUND"?r:new g("TASK_CONTEXT_NOT_FOUND",`Craig task "${t}" from ${n==="explicit"?"--task":"CRAIG_TASK_ID"} was not found.`,{details:{taskId:t,source:n},cause:r})}}function nl(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 yb(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function wb(e,t){return(await Promise.all(yb(e).map(r=>jp(r).catch(()=>Gr.resolve(r))))).some(r=>kb(r,t))}function kb(e,t){let n=Gr.relative(Gr.resolve(e),t);return n===""||!n.startsWith("..")&&!Gr.isAbsolute(n)}var sl=async(e,t,n="merge",r)=>{let s=await L(e,t),i=r??V(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await Np(s.worktreePath,i,n)};var Hr={readTask:L,writeTask:Rt,withTaskLock:qt,ensureGhAuthenticated:It,fetchPrView:Jn,discoverPrView:Dp,getGitHubRepositoryLocator:ii,writePrStatusArtifact:Sn};async function ol(e,t,n,r=Hr){let s=await r.readTask(e,t),i=await bb(s,n,r);return Kt(s,i,"showTaskPr","shown",[])}async function al(e,t,n,r=Hr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await pl(s,n,null,r);await fl(i,r);let o=await ci(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return Kt(s,i,"discoverTaskPr","not_found",[]);ml(o,i);let a=di(s,i,o.number),l=await hl(e,s,i,o,r);return Kt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function ll(e,t,n,r,s=Hr){let i=ul(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await pl(o,r,i.repository,s);Up(i.repository,a),await fl(a,s);let l=await ci(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));Rb(l,i),ml(l,a);let c=di(o,a,l.number),u=gl(o,a),d=u&&!Gn(u,{owner:a.repository.owner,repo:a.repository.name,number:l.number})&&u.status!=="closed"&&u.status!=="merged"?[`Pull request #${l.number} becomes active; #${u.number} remains in task history.`]:[],p=await hl(e,o,a,l,s);return Kt(p,a,"linkTaskPr",c?"unchanged":"linked",d)})}async function Tb(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw er(e,t);let o=e.prs.find(a=>a.number===n.number)??V(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await li(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw er(e,t);let a=qp(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&dt({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await li(l,o.worktreePath,t,r),projectTarget:o}}if(!n.repository)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for a numeric pull request selector.`,{details:{taskId:e.id,pullRequestNumber:n.number}});let s=n.repository,i=[];for(let o of e.repoTargets??[]){let a=o.pullRequest.owner&&o.pullRequest.repo&&dt({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&dt({owner:c.owner,name:c.repo},s)&&(!c.headBranch||c.headBranch===o.branch));(a||l)&&i.push({repoId:o.repoId,branch:o.branch,worktreePath:o.worktreePath,repository:s,projectTarget:o})}if(i.length!==1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.repository.owner}/${n.repository.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.repository.owner,repo:n.repository.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function cl(e,t,n,r=Hr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await pl(s,n,null,r),o=gl(s,i);if(!o?.number)return Kt(s,i,"refreshTaskPr","not_found",[]);await fl(i,r);let a=await ci(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));ml(a,i);let l=await hl(e,s,i,a,r);return Kt(l,i,"refreshTaskPr","synced",[])})}async function dl(e,t,n,r,s=Hr){let i=ul(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Tb(o,r,i,s);if(Up(i.repository,a),!di(o,a,i.number))return Kt(o,a,"unlinkTaskPr","unchanged",[]);let c=Sb(o,a,i.number),u=await Bp(e,c,s);return Kt(u,a,"unlinkTaskPr","unlinked",[])})}function ul(e){let t=e.trim(),n=Vt(t);if(n)return{number:n.number,repository:n};if(/^[1-9]\d*$/.test(t))return{number:Number(t),repository:null};throw new g("CLI_USAGE",`Invalid pull request selector "${e}". Use a GitHub pull request URL or positive number.`,{details:{selector:e}})}async function pl(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw er(e,t);return il(e.repoId,e.branch,e.worktreePath,null,r)}let s=e.repoTargets??[];if(t){let o=s.find(a=>a.repoId===t);if(!o)throw er(e,t);return il(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 il(o.repoId,o.branch,o.worktreePath,o,r).catch(l=>{if(l instanceof g&&l.code==="EXTERNAL_DEPENDENCY_FAILED"&&l.message.includes("does not have a supported GitHub origin remote"))return null;throw l});a&&dt(a.repository,n)&&i.push(a)}if(i.length!==1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.owner}/${n.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.owner,repo:n.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function bb(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw er(e,t);let s=V(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await li(s,e.worktreePath,e.repoId,n),projectTarget:null}}if(!t)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for pull request commands.`,{details:{taskId:e.id,repoIds:(e.repoTargets??[]).map(s=>s.repoId)}});let r=e.repoTargets?.find(s=>s.repoId===t);if(!r)throw er(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await li(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function li(e,t,n,r){let s=qp(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function qp(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Vt(e.url):null}async function il(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 fl(e,t){await ci("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function ci(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 Up(e,t){if(e&&!dt(e,t.repository))throw Wp(e,t)}function Rb(e,t){let n=Vt(e.url);if(!n||n.number!==t.number)throw new g("TASK_CONTEXT_CONFLICT",`GitHub returned ${e.url} for pull request selector #${t.number}.`,{details:{selectorNumber:t.number,returnedUrl:e.url}});if(t.repository&&!dt(t.repository,n))throw new g("PR_REPOSITORY_MISMATCH",`GitHub returned a pull request from ${n.owner}/${n.name}, not ${t.repository.owner}/${t.repository.name}.`,{details:{selectorRepository:t.repository,returnedRepository:n}})}function ml(e,t){let n=Vt(e.url);if(!n||!dt(n,t.repository))throw Wp(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 Wp(e,t){return new g("PR_REPOSITORY_MISMATCH",`Pull request repository ${e?`${e.owner}/${e.name}`:"is invalid"} does not match task repo ${t.repository.owner}/${t.repository.name}.`,{details:{repoId:t.repoId,expectedOwner:t.repository.owner,expectedRepo:t.repository.name,actualOwner:e?.owner??null,actualRepo:e?.name??null}})}function er(e,t){return new g("TASK_CONTEXT_CONFLICT",`Repo ${t} is not a target of task ${e.id}.`,{details:{taskId:e.id,repoId:t}})}function dt(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function hl(e,t,n,r,s){let i=di(t,n,r.number),o=Pt(r,i,n.repository),a=St(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:Gp(o)}:l)}),Bp(e,a,s)}function Sb(e,t,n){let r=e.prs.filter(i=>!Kp(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=Vp(r.filter(o=>o.owner&&o.repo&&dt({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?Gp(i):Ib(t.repository)}:o)}}return s}async function Bp(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?Fa(t):yn(t.prs),s={...t,status:r};return qr(e,s,n)}function di(e,t,n){return yl(e,t).find(r=>Kp(r,t,n))??null}function gl(e,t){if(!t.projectTarget)return V(e);let n=yl(e,t);return Vp(n)}function Vp(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function yl(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&dt({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?Pb(r.pullRequest,t.repository):null;return s&&!n.some(i=>Gn(i,s))?[...n,s]:n}function Kp(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||dt({owner:e.owner,name:e.repo},t.repository)}function Kt(e,t,n,r,s){let i=yl(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:gl(e,t),warnings:s}}function Gp(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 Pb(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 Ib(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:_r,getTask:L,provisionTask:zn,provisionProjectTask:Lr,createTask:Da,showTask:qa,showTaskDiff:Ua,prepareTaskLogs:Wa,streamTaskLogs:Ba,runChecks:Va,commitTask:Ka,closeTask:Ga,cleanupTask:Ha,addTaskLink:Ya,listTaskLinks:za,sortTasksForDisplay:Ia,resolveSelectedTaskId:va,allocateTaskId:Pa,allocateTaskIdForRepo:Yn,allocateProjectTaskId:xr,createDefaultTaskPtyTabs:Mr,assertTaskWorktreeExists:me,resolveTaskLogPath:Hn,buildTaskInspection:Dr,resolveArtifactPath:wn,attachTask:Ja,focusTask:Xa,openTask:Qa,markRunnerFailed:Za,recordStartupFailure:el,markTaskStarted:tl,resolveContext:rl,prs:{refresh:Kr,refreshChecks:Ma,discoverOrRefresh:ai,discoverOrRefreshAll:Zn,discoverOrRefreshMany:ja,show:ol,discover:al,link:ll,refreshAssociation:cl,unlink:dl,merge:sl,getPrimaryPr:V,isPrTerminal:Ut,isMergeReady:ei,deriveTaskStatus:yn,upsertPr:St,normalizePr:Pt,summarizeRequiredChecks:Ta,writePrStatusArtifact:Sn}};var Hp={idle:0,ready:1,working:2,error:3};function vt(e,t,n,r="idle"){let s=t.find(i=>i.tabId===e);return s?s.sessionState==="failed"||s.sessionState==="exited"&&s.exitCode!==0?"error":s.sessionState==="exited"?"ready":n-s.lastActivityAt<5e3?"working":"ready":r}function Gt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return vt(t,n,r,i)}function tr(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=Gt(e,s.id,t,n);Hp[i]>Hp[r]&&(r=i)}return r}function ui(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&vt(s.id,t,n)==="working"))}function ut(e,t,n){let r=e.flatMap(i=>i.ptyTabs.filter(o=>o.kind==="agent").map(o=>{let a=t.find(c=>c.tabId===o.id),l=Gt(i,o.id,t,n);return{taskId:i.id,tabId:o.id,title:o.title,runner:o.runner??i.runner,state:l,sessionState:a?.sessionState??null,lastActivityAt:a?.lastActivityAt??null,exitCode:a?.exitCode??null,error:a?.error??(l==="error"?i.lastFailureReason??null:null)}})),s=e.map(i=>({taskId:i.id,state:tr(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function wl(e,t,n){let r=n.now??Date.now;if(n.tabId&&!e.ptyTabs.some(l=>l.kind==="agent"&&l.id===n.tabId))throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${e.id}.`,{details:{taskId:e.id,tabId:n.tabId}});let s=0,i=null,o=t.subscribe(()=>{s+=1,i?.()}),a=r()+n.timeoutMs;try{for(;;){let l=r(),c=ut([e],t.getSnapshots(),l),u=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(u))return{kind:"waitTask",taskId:e.id,tabId:n.tabId??null,state:u,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw Yp(e.id);let d=a-r();if(d<=0)throw vb(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(Yp(e.id))},T=setTimeout(m,d);i=m,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var vb=(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}}),Yp=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as Eb}from"node:net";import{createHash as Cb}from"node:crypto";import{tmpdir as Ab}from"node:os";import zp from"node:path";var Pn=9;function Ct(e){let t=Cb("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:zp.join(Ab(),`craig-${t}.sock`),pidPath:zp.join(e.runtimeDir,"pty-daemon.pid")}}async function Jp(e){let t=null;try{let n=await Ob(Ct(e.paths).socketPath);return t=new Tl(n,e),await t.ready(),t}catch{return t?.close(),null}}var Tl=class{constructor(t,n){this.socket=t;this.options=n;t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>this.handleClose())}socket;options;pending=new Map;snapshots=new Map;revisionByTabId=new Map;nextRequestId=1;revision=0;buffer="";closed=!1;async ready(){if((await this.send({type:"ping"})).protocolVersion!==Pn)throw new Error("Craig PTY daemon protocol mismatch.");await this.send({type:"setActivityEnabled",enabled:!0});let n=this.revision,r=await this.send({type:"getActivitySnapshots"});this.replaceSnapshots(r.activities??[],n)}getSnapshots(){return[...this.snapshots.values()]}close(){this.closed||(this.closed=!0,this.socket.end(),this.rejectAll(new Error("Craig PTY daemon activity connection closed.")))}async send(t){if(this.closed||this.socket.destroyed)throw new Error("Craig PTY daemon activity connection is closed.");let n=this.nextRequestId++,r=new Promise((i,o)=>{this.pending.set(n,{resolve:i,reject:o})});this.socket.write(`${JSON.stringify({...t,id:n})}
72
+ `)},db=async e=>(await F("git",["ls-files","--others","--exclude-standard"],{cwd:e})).stdout.split(`
73
+ `).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as ub}from"node:child_process";import{access as pb}from"node:fs/promises";var Wa=async(e,t)=>{let n=await L(e,t),r=Hn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await pb(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},Ba=async e=>{await new Promise((t,n)=>{let r=!1,s=ub("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 fb}from"node:fs/promises";import mb from"node:path";var Va=async(e,t)=>{let n=await L(e,t);if(await me(n),n.status==="draft"||n.status==="merged")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);if(n.status==="running"&&await ti(n.worktreePath)&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);let s=(await k.load(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);await W(e,n.id,a=>({...a,status:a.status==="running"?n.status:a.status,checks:{...a.checks,status:"running",commands:[...s],results:[]}}));let i=[];for(let a of s){let l=new Date().toISOString(),c=await G("sh",["-lc",a],{cwd:n.worktreePath}),u=new Date().toISOString(),d=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:u,exitCode:d}),d!==0){let p=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,m=await W(e,n.id,g=>({...g,status:"review",checks:{...g.checks,results:i,status:"failed",lastRunAt:u},lastFailureReason:p}));return await qp(e,m),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await W(e,n.id,a=>({...a,status:a.status==="review"||a.status==="checked"?"checked":a.status,checks:{...a.checks,results:i,status:"passed",lastRunAt:new Date().toISOString()},lastFailureReason:null}));return await qp(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},qp=async(e,t)=>{let n=kn(e,t.artifacts.checkSummaryPath);n&&(await fb(mb.dirname(n),{recursive:!0}),await M(n,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))};var Ka=async(e,t)=>{let n=await L(e,t);await me(n);let r=await ti(n.worktreePath);if(n.status==="running"&&r&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot commit from status "${n.status}".`);if(!r)throw new Error(`Task ${n.id} has no uncommitted diff to commit.`);let s=n.prompt.value.trim();await dp(n.worktreePath),await up(n.worktreePath,s);let i=await pp(n.worktreePath),o=new Date().toISOString(),a=await W(e,n.id,l=>({...l,status:l.status==="running"?n.status:l.status,lastCommit:{sha:i.sha,message:i.message,committedAt:o},lastFailureReason:null}));return{kind:"commitTask",taskId:n.id,status:a.status,commitSha:i.sha,message:i.message}};import{access as gb}from"node:fs/promises";var Ga=async(e,t)=>{let n=await L(e,t),r=await hb(n.worktreePath);return W(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},hb=async e=>{try{return await gb(e),!0}catch{return!1}};var Ha=async(e,t,n)=>{let r=[],s=null,i=null;try{if(t.sessionId){let o=await Wt(e,t.sessionId);await Ap(e.repoRoot,o.sessionName),s=new Date().toISOString()}}catch(o){r.push(o instanceof Error?o.message:"Failed to close tmux session.")}if(!n.preserveWorktree)try{await mp(e.repoRoot,t.worktreePath),i=new Date().toISOString()}catch(o){r.push(o instanceof Error?o.message:"Failed to remove worktree.")}await W(e,t.id,o=>({...o,cleanup:{...o.cleanup,paneClosedAt:s??o.cleanup.paneClosedAt,worktreeRemovedAt:i??o.cleanup.worktreeRemovedAt,preservedWorktree:n.preserveWorktree,warning:r.length>0?r.join(" "):null}}))};var Ya=async(e,t,n)=>{let r=await Ue(e,n),s=await W(e,t,i=>{if(i.repoId===r.id)throw new Error(`Repo ${r.id} is already the primary repo for task ${i.id}.`);return{...i,linkedRepoIds:i.linkedRepoIds.includes(r.id)?i.linkedRepoIds:[...i.linkedRepoIds,r.id]}});return{kind:"addTaskLink",taskId:s.id,repoId:r.id,linkedRepoIds:s.linkedRepoIds}},za=async(e,t)=>{let n=await L(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>Ue(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};var Ja=async(e,t)=>{let n=await L(e,t);if(!n.sessionId)throw new Error(`Task ${n.id} does not have a Craig session to attach.`);let[r,s]=await Promise.all([Ue(e,n.repoId),Wt(e,n.sessionId)]),i=await qr.attach(e,s,r.rootPath);return{kind:"attachTask",taskId:n.id,sessionId:i.id,disposition:"attached"}};var Xa=async(e,t)=>{let n=await L(e,t);if(!n.sessionId)throw new Error(`Task ${n.id} does not have a Craig session.`);let r=await Wt(e,n.sessionId).catch(s=>{throw yb(s)?new Error(`Task ${n.id} does not have a Craig session.`):s});if(!r.paneId)throw new Error(`Task ${n.id} does not have a tmux target.`);return await si(e.repoRoot,r.paneId,r.windowTarget,r.sessionName),{kind:"focusTask",taskId:n.id,tmuxTarget:r.paneId}},yb=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";import{spawn as wb}from"node:child_process";var Qa=async(e,t)=>{let n=await L(e,t);await me(n);let s=(await k.load(e)).open?.command??[];if(s.length===0)return{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!1,command:null};let i=[...s,n.worktreePath];return await kb(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},kb=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=wb(s,i,{cwd:t,stdio:"inherit"});o.on("error",r),o.on("exit",a=>{if(a===0){n();return}r(new Error(`${e.join(" ")} failed with exit code ${a??"unknown"}.`))})})};var Za=async(e,t,n)=>{await W(e,t,r=>({...r,status:r.status==="running"?"draft":r.status,runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n}))},el=async(e,t,n)=>W(e,t,r=>({...r,status:"draft",runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n})),tl=async(e,t)=>W(e,t,n=>{let r=n.ptyTabs.find(s=>s.kind==="agent");if(!r)throw new Error(`Task ${t} is missing its agent PTY tab.`);return{...n,status:"running",selectedPtyTabId:r.id,runnerSession:{...n.runnerSession,startedAt:new Date().toISOString(),lastKnownState:"running"}}});import{realpath as Wp}from"node:fs/promises";import Hr from"node:path";async function rl(e,t){if(t.explicitTaskId!==void 0){let l=await Up(e,t.explicitTaskId,"explicit");return nl(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await Up(e,t.environmentTaskId,"environment");return nl(l,"environment",t.environmentAgentTabId)}let n=await Wp(t.cwd).catch(()=>Hr.resolve(t.cwd)),r=await Fr(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await bb(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 h("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 nl(a,"cwd",t.environmentAgentTabId);if(t.environmentAgentTabId!==void 0)throw new h("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 h("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 Up(e,t,n){try{return await L(e,t)}catch(r){throw!(r instanceof h)||r.code!=="TASK_NOT_FOUND"?r:new h("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 nl(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 h("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 Tb(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function bb(e,t){return(await Promise.all(Tb(e).map(r=>Wp(r).catch(()=>Hr.resolve(r))))).some(r=>Rb(r,t))}function Rb(e,t){let n=Hr.relative(Hr.resolve(e),t);return n===""||!n.startsWith("..")&&!Hr.isAbsolute(n)}var sl=async(e,t,n="merge",r)=>{let s=await L(e,t),i=r??V(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await _p(s.worktreePath,i,n)};var Yr={readTask:L,writeTask:St,withTaskLock:qt,ensureGhAuthenticated:vt,fetchPrView:Jn,discoverPrView:Fp,getGitHubRepositoryLocator:ii,writePrStatusArtifact:Pn};async function ol(e,t,n,r=Yr){let s=await r.readTask(e,t),i=await Pb(s,n,r);return Kt(s,i,"showTaskPr","shown",[])}async function al(e,t,n,r=Yr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await pl(s,n,null,r);await fl(i,r);let o=await ci(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return Kt(s,i,"discoverTaskPr","not_found",[]);ml(o,i);let a=di(s,i,o.number),l=await gl(e,s,i,o,r);return Kt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function ll(e,t,n,r,s=Yr){let i=ul(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await pl(o,r,i.repository,s);Vp(i.repository,a),await fl(a,s);let l=await ci(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));Ib(l,i),ml(l,a);let c=di(o,a,l.number),u=hl(o,a),d=u&&!Gn(u,{owner:a.repository.owner,repo:a.repository.name,number:l.number})&&u.status!=="closed"&&u.status!=="merged"?[`Pull request #${l.number} becomes active; #${u.number} remains in task history.`]:[],p=await gl(e,o,a,l,s);return Kt(p,a,"linkTaskPr",c?"unchanged":"linked",d)})}async function Sb(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw er(e,t);let o=e.prs.find(a=>a.number===n.number)??V(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await li(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw er(e,t);let a=Bp(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&dt({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await li(l,o.worktreePath,t,r),projectTarget:o}}if(!n.repository)throw new h("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for a numeric pull request selector.`,{details:{taskId:e.id,pullRequestNumber:n.number}});let s=n.repository,i=[];for(let o of e.repoTargets??[]){let a=o.pullRequest.owner&&o.pullRequest.repo&&dt({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&dt({owner:c.owner,name:c.repo},s)&&(!c.headBranch||c.headBranch===o.branch));(a||l)&&i.push({repoId:o.repoId,branch:o.branch,worktreePath:o.worktreePath,repository:s,projectTarget:o})}if(i.length!==1)throw new h("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 cl(e,t,n,r=Yr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await pl(s,n,null,r),o=hl(s,i);if(!o?.number)return Kt(s,i,"refreshTaskPr","not_found",[]);await fl(i,r);let a=await ci(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));ml(a,i);let l=await gl(e,s,i,a,r);return Kt(l,i,"refreshTaskPr","synced",[])})}async function dl(e,t,n,r,s=Yr){let i=ul(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Sb(o,r,i,s);if(Vp(i.repository,a),!di(o,a,i.number))return Kt(o,a,"unlinkTaskPr","unchanged",[]);let c=vb(o,a,i.number),u=await Gp(e,c,s);return Kt(u,a,"unlinkTaskPr","unlinked",[])})}function ul(e){let t=e.trim(),n=Vt(t);if(n)return{number:n.number,repository:n};if(/^[1-9]\d*$/.test(t))return{number:Number(t),repository:null};throw new h("CLI_USAGE",`Invalid pull request selector "${e}". Use a GitHub pull request URL or positive number.`,{details:{selector:e}})}async function pl(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw er(e,t);return il(e.repoId,e.branch,e.worktreePath,null,r)}let s=e.repoTargets??[];if(t){let o=s.find(a=>a.repoId===t);if(!o)throw er(e,t);return il(o.repoId,o.branch,o.worktreePath,o,r)}if(!n)throw new h("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 il(o.repoId,o.branch,o.worktreePath,o,r).catch(l=>{if(l instanceof h&&l.code==="EXTERNAL_DEPENDENCY_FAILED"&&l.message.includes("does not have a supported GitHub origin remote"))return null;throw l});a&&dt(a.repository,n)&&i.push(a)}if(i.length!==1)throw new h("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.owner}/${n.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.owner,repo:n.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function Pb(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw er(e,t);let s=V(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await li(s,e.worktreePath,e.repoId,n),projectTarget:null}}if(!t)throw new h("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for pull request commands.`,{details:{taskId:e.id,repoIds:(e.repoTargets??[]).map(s=>s.repoId)}});let r=e.repoTargets?.find(s=>s.repoId===t);if(!r)throw er(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await li(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function li(e,t,n,r){let s=Bp(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function Bp(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Vt(e.url):null}async function il(e,t,n,r,s){let i=await s.getGitHubRepositoryLocator(n);if(!i)throw new h("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 fl(e,t){await ci("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function ci(e,t){try{return await t()}catch(n){throw n instanceof h?n:new h("EXTERNAL_DEPENDENCY_FAILED",`Failed to ${e}: ${n instanceof Error?n.message:String(n)}`,{retryable:!0,cause:n})}}function Vp(e,t){if(e&&!dt(e,t.repository))throw Kp(e,t)}function Ib(e,t){let n=Vt(e.url);if(!n||n.number!==t.number)throw new h("TASK_CONTEXT_CONFLICT",`GitHub returned ${e.url} for pull request selector #${t.number}.`,{details:{selectorNumber:t.number,returnedUrl:e.url}});if(t.repository&&!dt(t.repository,n))throw new h("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 ml(e,t){let n=Vt(e.url);if(!n||!dt(n,t.repository))throw Kp(n,t);if(e.headRefName!==t.branch)throw new h("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 Kp(e,t){return new h("PR_REPOSITORY_MISMATCH",`Pull request repository ${e?`${e.owner}/${e.name}`:"is invalid"} does not match task repo ${t.repository.owner}/${t.repository.name}.`,{details:{repoId:t.repoId,expectedOwner:t.repository.owner,expectedRepo:t.repository.name,actualOwner:e?.owner??null,actualRepo:e?.name??null}})}function er(e,t){return new h("TASK_CONTEXT_CONFLICT",`Repo ${t} is not a target of task ${e.id}.`,{details:{taskId:e.id,repoId:t}})}function dt(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function gl(e,t,n,r,s){let i=di(t,n,r.number),o=It(r,i,n.repository),a=Pt(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:zp(o)}:l)}),Gp(e,a,s)}function vb(e,t,n){let r=e.prs.filter(i=>!Yp(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=Hp(r.filter(o=>o.owner&&o.repo&&dt({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?zp(i):Ab(t.repository)}:o)}}return s}async function Gp(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?Fa(t):wn(t.prs),s={...t,status:r};return Ur(e,s,n)}function di(e,t,n){return yl(e,t).find(r=>Yp(r,t,n))??null}function hl(e,t){if(!t.projectTarget)return V(e);let n=yl(e,t);return Hp(n)}function Hp(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function yl(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&dt({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?Cb(r.pullRequest,t.repository):null;return s&&!n.some(i=>Gn(i,s))?[...n,s]:n}function Yp(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||dt({owner:e.owner,name:e.repo},t.repository)}function Kt(e,t,n,r,s){let i=yl(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:hl(e,t),warnings:s}}function zp(e){return{provider:"github",owner:e.owner,repo:e.repo,number:e.number,url:e.url,baseBranch:e.baseBranch,headBranch:e.headBranch,status:e.status==="draft"?"open":e.status,draft:e.draft,mergeable:e.mergeable,mergeStateStatus:e.mergeStateStatus,reviewDecision:e.reviewDecision??null,requiredChecks:e.requiredChecks,comments:e.comments??[],lastSyncedAt:e.lastSyncedAt,lastSyncedHeadSha:e.lastSyncedHeadSha}}function Cb(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 Ab(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 R={listTasks:Fr,getTask:L,provisionTask:zn,provisionProjectTask:Mr,createTask:Na,showTask:qa,showTaskDiff:Ua,prepareTaskLogs:Wa,streamTaskLogs:Ba,runChecks:Va,commitTask:Ka,closeTask:Ga,cleanupTask:Ha,addTaskLink:Ya,listTaskLinks:za,sortTasksForDisplay:Ia,resolveSelectedTaskId:va,allocateTaskId:Pa,allocateTaskIdForRepo:Yn,allocateProjectTaskId:_r,createDefaultTaskPtyTabs:jr,assertTaskWorktreeExists:me,resolveTaskLogPath:Hn,buildTaskInspection:xr,resolveArtifactPath:kn,attachTask:Ja,focusTask:Xa,openTask:Qa,markRunnerFailed:Za,recordStartupFailure:el,markTaskStarted:tl,resolveContext:rl,prs:{refresh:Gr,refreshChecks:Ma,discoverOrRefresh:ai,discoverOrRefreshAll:Zn,discoverOrRefreshMany:ja,show:ol,discover:al,link:ll,refreshAssociation:cl,unlink:dl,merge:sl,getPrimaryPr:V,isPrTerminal:Ut,isMergeReady:ei,deriveTaskStatus:wn,upsertPr:Pt,normalizePr:It,summarizeRequiredChecks:Ta,writePrStatusArtifact:Pn}};var Jp={idle:0,ready:1,working:2,error:3};function Ct(e,t,n,r="idle"){let s=t.find(i=>i.tabId===e);return s?s.sessionState==="failed"||s.sessionState==="exited"&&s.exitCode!==0?"error":s.sessionState==="exited"?"ready":n-s.lastActivityAt<5e3?"working":"ready":r}function Gt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return Ct(t,n,r,i)}function tr(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=Gt(e,s.id,t,n);Jp[i]>Jp[r]&&(r=i)}return r}function ui(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&Ct(s.id,t,n)==="working"))}function ut(e,t,n){let r=e.flatMap(i=>i.ptyTabs.filter(o=>o.kind==="agent").map(o=>{let a=t.find(c=>c.tabId===o.id),l=Gt(i,o.id,t,n);return{taskId:i.id,tabId:o.id,title:o.title,runner:o.runner??i.runner,state:l,sessionState:a?.sessionState??null,lastActivityAt:a?.lastActivityAt??null,exitCode:a?.exitCode??null,error:a?.error??(l==="error"?i.lastFailureReason??null:null)}})),s=e.map(i=>({taskId:i.id,state:tr(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function wl(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 h("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${e.id}.`,{details:{taskId:e.id,tabId:n.tabId}});let s=0,i=null,o=t.subscribe(()=>{s+=1,i?.()}),a=r()+n.timeoutMs;try{for(;;){let l=r(),c=ut([e],t.getSnapshots(),l),u=n.tabId?c.agents.find(m=>m.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(u))return{kind:"waitTask",taskId:e.id,tabId:n.tabId??null,state:u,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw Xp(e.id);let d=a-r();if(d<=0)throw Eb(e.id,n.states,n.timeoutMs);let p=s;await new Promise((m,g)=>{let f=()=>{clearTimeout(T),n.signal?.removeEventListener("abort",y),m()},y=()=>{clearTimeout(T),g(Xp(e.id))},T=setTimeout(f,d);i=f,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var Eb=(e,t,n)=>new h("OPERATION_TIMEOUT",`Timed out after ${n}ms waiting for task ${e} agent state ${t.join(",")}.`,{retryable:!0,details:{taskId:e,states:t,timeoutMs:n}}),Xp=e=>new h("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as Db}from"node:net";import{createHash as Ob}from"node:crypto";import{tmpdir as $b}from"node:os";import Qp from"node:path";var Ht=9;function pt(e){let t=Ob("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:Qp.join($b(),`craig-${t}.sock`),pidPath:Qp.join(e.runtimeDir,"pty-daemon.pid")}}async function Zp(e){let t=null;try{let n=await Nb(pt(e.paths).socketPath);return t=new Tl(n,e),await t.ready(),t}catch{return t?.close(),null}}var Tl=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!==Ht)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})}
74
74
  `);let s=await r;if(!s.ok)throw new Error(s.error);return s}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
75
75
  `);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
76
- `)}}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 Ob(e){return new Promise((t,n)=>{let r=Eb(e);r.once("connect",()=>t(r)),r.once("error",n)})}var Rl={openObserver:Qp,listTasks:e=>S.listTasks(e),getTask:(e,t)=>S.getTask(e,t),now:Date.now};async function $b(e,t,n=Rl){let r=await Xp(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...ut(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function Nb(e,t,n=Rl){let r=await Xp(e,t.taskId,n),s=await n.openObserver(e);try{let i=ut(r,s.getSnapshots(),n.now()),o=t.tabId?i.agents.filter(l=>l.tabId===t.tabId):i.agents;if(t.tabId&&o.length===0)throw new g("TASK_CONTEXT_NOT_FOUND",`Agent tab ${t.tabId} was not found${t.taskId?` in task ${t.taskId}`:""}.`,{details:{taskId:t.taskId??null,tabId:t.tabId}});let a=new Set(o.map(l=>l.taskId));return{kind:"showAgentStatus",agents:o,tasks:t.tabId?i.tasks.filter(l=>a.has(l.taskId)):i.tasks,daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function Db(e,t,n,r=Rl){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await wl(s,i,{...n,now:r.now})}finally{i.close()}}async function Xp(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function Qp(e){return bl.open(e)}async function xb(e){return Qp(e)}var bl=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 Jp({paths:this.paths,onActivity:n=>{this.snapshots.set(n.tabId,n),this.notify()},onActivityRemoved:n=>{this.snapshots.delete(n),this.notify()},onDaemonClose:()=>{this.client=null,this.notify(),this.scheduleReconnect()}});if(this.closed){t?.close();return}if(this.client=t,t){this.reconnectDelayMs=250,this.snapshots.clear();for(let n of t.getSnapshots())this.snapshots.set(n.tabId,n);this.notify()}else this.scheduleReconnect()}scheduleReconnect(){if(this.closed||this.reconnectTimer)return;let t=this.reconnectDelayMs;this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,1e3),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},t)}notify(){for(let t of this.listeners)t()}},At={listAgents:$b,showAgentStatus:Nb,waitForTask:Db,openObserver:xb};import{randomUUID as tR}from"node:crypto";import{mkdir as bf,open as Dl,readdir as xl,readFile as Qr,rm as nR,stat as rR}from"node:fs/promises";import gi from"node:path";import{createHash as jb}from"node:crypto";import{mkdir as Yr,readdir as Il,readFile as zr,writeFile as qb}from"node:fs/promises";import Be from"node:path";import{mkdir as Zp,readFile as _b,rm as Sl,stat as Fb,writeFile as Lb}from"node:fs/promises";import Pl from"node:path";async function nr(e,t){let n=Pl.join(e.runtimeDir,"fury-store.lock");await Zp(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Zp(n);try{await Lb(Pl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await Sl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!ef(s,"EEXIST"))throw s;let i=await _b(Pl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await Fb(n).catch(()=>null);if(typeof i?.pid=="number"&&!Mb(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await Sl(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 Sl(n,{recursive:!0,force:!0})}}function Mb(e){try{return process.kill(e,0),!0}catch(t){return ef(t,"EPERM")}}var ef=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var he=e=>({root:Be.join(e.craigDir,"fury"),definitions:Be.join(e.craigDir,"fury","definitions"),plans:Be.join(e.craigDir,"fury","plans"),approvals:Be.join(e.craigDir,"fury","approvals"),runs:Be.join(e.craigDir,"fury","runs"),reviews:Be.join(e.craigDir,"fury","reviews")});function vl(e){return jb("sha256").update(JSON.stringify(e)).digest("hex")}async function nf(e,t,n){let r=he(e);await Yr(r.definitions,{recursive:!0});let s=Be.join(r.definitions,`${t}.yaml`);await qb(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!Ht(i,"EEXIST"))throw i})}async function rf(e,t){return nr(e,async()=>{let n=await sf(e),r=n.find(o=>o.planHash===t.planHash);if(r)return r;let s=n.filter(o=>o.rootTaskId===t.rootTaskId&&o.sourceFile===t.sourceFile).at(-1),i=s&&Date.parse(t.createdAt)<=Date.parse(s.createdAt)?{...t,createdAt:new Date(Date.parse(s.createdAt)+1).toISOString()}:t;return await Yr(he(e).plans,{recursive:!0}),await M(hf(e,i.id),i),i})}async function pi(e,t){mi(t,"plan");try{return Ub(JSON.parse(await zr(hf(e,t),"utf8")),t)}catch(n){throw Ht(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function sf(e){let t=he(e).plans,n=await Il(t).catch(s=>Ht(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>pi(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function of(e){let t=await sf(e),n=await Promise.all(t.map(s=>El(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 af(e,t){return nr(e,async()=>{let n=await El(e,t.planId);if(n){if(n.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after approval.`,{});return{approval:n,created:!1}}return await Yr(he(e).approvals,{recursive:!0}),await M(gf(e,t.planId),t),{approval:t,created:!0}})}async function lf(e,t){mi(t,"plan");let n=await El(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function cf(e,t){return nr(e,async()=>{let r=(await uf(e)).find(s=>s.planId===t.planId);if(r){if(r.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after its run was created.`,{});return{run:r,created:!1}}return await Yr(he(e).runs,{recursive:!0}),await M(Cl(e,t.id),t),{run:t,created:!0}})}async function de(e,t){mi(t,"run");try{return ff(JSON.parse(await zr(Cl(e,t),"utf8")),t)}catch(n){throw Ht(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function df(e){return uf(e)}async function uf(e){let t=he(e).runs,n=await Il(t).catch(s=>Ht(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(async s=>{let i=s.slice(0,-5);return ff(JSON.parse(await zr(Be.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ke(e,t,n){return nr(e,async()=>{let r=await de(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury mutation cannot change its id.",{});return await M(Cl(e,t),s),s})}async function pf(e,t){await Yr(he(e).reviews,{recursive:!0}),await M(Al(e,t.id),t)}async function Jr(e,t,n){return nr(e,async()=>{let r=await rr(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await M(Al(e,t),s),s})}async function rr(e,t){mi(t,"review");try{return Wb(JSON.parse(await zr(Al(e,t),"utf8")),t)}catch(n){throw Ht(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function fi(e){let t=he(e).reviews,n=await Il(t).catch(r=>Ht(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>rr(e,r.slice(0,-5))))}function ff(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!Ae(e)||e.schemaVersion!==1||e.id!==t||typeof e.planId!="string"||!/^fury_plan_[A-Za-z0-9_-]+$/.test(e.planId)||typeof e.planHash!="string"||!/^[a-f0-9]{64}$/.test(e.planHash)||typeof e.definitionHash!="string"||!/^[a-f0-9]{64}$/.test(e.definitionHash)||typeof e.name!="string"||!e.name||typeof e.sourceFile!="string"||!e.sourceFile||typeof e.rootTaskId!="string"||!e.rootTaskId||!n.includes(String(e.state))||!Ae(e.inputs)||!mf(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!Bb(e.stepRuns,e.order)||!Xr(e.actor)||!Ve(e.createdAt)||!Ve(e.updatedAt)||!Ve(e.stateChangedAt)||!Ve(e.deadlineAt)||e.completedAt!==null&&!Ve(e.completedAt))throw new g("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function Ub(e,t){if(!Ae(e)||e.schemaVersion!==1||e.id!==t||typeof e.planHash!="string"||!/^[a-f0-9]{64}$/.test(e.planHash)||typeof e.definitionHash!="string"||!/^[a-f0-9]{64}$/.test(e.definitionHash)||typeof e.name!="string"||!e.name||typeof e.sourceFile!="string"||!e.sourceFile||typeof e.rootTaskId!="string"||!e.rootTaskId||!Ae(e.inputs)||!mf(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||!Array.isArray(e.waves)||e.waves.some(r=>!Array.isArray(r)||r.some(s=>typeof s!="string"))||!Array.isArray(e.steps)||e.steps.length!==e.order.length||!Xr(e.createdBy)||!Ve(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,vl(n)!==e.planHash)throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function Wb(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!Ae(e)||e.schemaVersion!==1||e.id!==t||typeof e.runId!="string"||typeof e.stepId!="string"||!n.includes(String(e.state))||typeof e.title!="string"||typeof e.summary!="string"||e.feedbackTarget!==null&&(!Ae(e.feedbackTarget)||typeof e.feedbackTarget.taskId!="string"||e.feedbackTarget.agentTabId!==null&&typeof e.feedbackTarget.agentTabId!="string")||!Number.isInteger(e.round)||Number(e.round)<1||!Number.isInteger(e.version)||Number(e.version)<1||!Ve(e.requestedAt)||!Ve(e.deadlineAt)||!Ve(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!tf(r))||e.lastDecision!==null&&!tf(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function Bb(e,t){return Ae(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&Vb(e[n],n))}function Vb(e,t){return!Ae(e)||e.id!==t||!["agent","human_review"].includes(String(e.kind))||!["pending","running","waiting_for_review","changes_requested","succeeded","failed","cancelled","timed_out"].includes(String(e.state))||!Array.isArray(e.needs)||e.needs.some(n=>typeof n!="string")||!Ae(e.plan)?!1:[e.taskId,e.agentTabId,e.commandId,e.reviewId,e.error].every(n=>n===null||typeof n=="string")&&[e.startedAt,e.completedAt,e.deadlineAt].every(n=>n===null||Ve(n))&&(e.completedBy===null||Xr(e.completedBy))}function tf(e){return Ae(e)&&Number.isInteger(e.sequence)&&Number.isInteger(e.round)&&["approve","reject","request_changes","resubmit"].includes(String(e.action))&&(e.message===null||typeof e.message=="string")&&Xr(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Ve(e.occurredAt)}function mf(e){return Ae(e)&&Number.isInteger(e.maxConcurrency)&&Number(e.maxConcurrency)>0&&Number.isInteger(e.maxTasks)&&Number(e.maxTasks)>0&&Number.isInteger(e.timeoutMs)&&Number(e.timeoutMs)>0}function Xr(e){return Ae(e)?e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component)):!1}var Cl=(e,t)=>Be.join(he(e).runs,`${t}.json`),hf=(e,t)=>Be.join(he(e).plans,`${t}.json`),gf=(e,t)=>Be.join(he(e).approvals,`${t}.json`),Al=(e,t)=>Be.join(he(e).reviews,`${t}.json`),mi=(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 El(e,t){try{let n=JSON.parse(await zr(gf(e,t),"utf8"));if(!Ae(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!Xr(n.approvedBy)||!Ae(n.approvedBy)||n.approvedBy.type!=="human"||!Ve(n.approvedAt))throw new g("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(Ht(n,"ENOENT"))return null;throw n}}var Ae=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ve=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Ht=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as yf,readFile as Kb,rm as hi,stat as Gb,writeFile as Hb}from"node:fs/promises";import Ol from"node:path";var Yb=20,zb=3e4,Jb=5e3;async function wf(e,t){let n=Ol.join(e.runtimeDir,"event-journal.lock");await yf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await yf(n);try{await Hb(Ol.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await hi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!Zb(s))throw s;if(await Xb(n))continue;if(Date.now()-r>=zb)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await eR(Yb)}try{return await t()}finally{await hi(n,{recursive:!0,force:!0})}}async function Xb(e){let t=await Kb(Ol.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return Qb(t.pid)?!1:(await hi(e,{recursive:!0,force:!0}),!0);let n=await Gb(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<Jb?!1:(await hi(e,{recursive:!0,force:!0}),!0)}function Qb(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 Zb=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",eR=e=>new Promise(t=>setTimeout(t,e));var sR=256*1024,iR=16,oR=64*1024;async function De(e,t,n={}){let r=Nl(n.maxSegmentBytes??sR,"Event journal segment size"),s=Nl(n.maxSegments??iR,"Event journal retention"),i=Nl(n.maxRecordBytes??oR,"Event record size");return wf(e,async()=>{await bf(e.eventsDir,{recursive:!0}),await pR(e);let o=await _l(e),a=t.id??tR(),l=o.events.find(y=>y.id===a);if(l)return l;let c=(o.events.at(-1)?.sequence??0)+1,u={schemaVersion:1,id:a,sequence:c,workspaceId:t.workspaceId??null,taskId:t.taskId??null,agentTabId:t.agentTabId??null,commandId:t.commandId??null,furyRunId:t.furyRunId??null,furyStepId:t.furyStepId??null,type:t.type,occurredAt:t.occurredAt??new Date().toISOString(),actor:t.actor,data:hR(t.data)},d=`${JSON.stringify(u)}
77
- `;if(Buffer.byteLength(d)>i)throw new g("CLI_USAGE",`Event record exceeds the ${i}-byte limit.`,{details:{eventType:t.type,maxRecordBytes:i}});let h=(await yi(e)).at(-1),f=!h||await aR(h.path,d,r);if(f&&(h={name:Tf(c),path:gi.join(e.eventsDir,Tf(c)),startSequence:c}),!h)throw new g("INTERNAL_ERROR","Failed to select an event journal segment.",{});let m=await Dl(h.path,"a");try{await m.writeFile(d,"utf8"),await m.sync()}finally{await m.close()}return f&&await Sf(e.eventsDir),await lR(e,s),u})}async function In(e,t={}){let n=await _l(e),r=fR(n.events,t.after,n.earliestSequence,n.events.at(-1)?.sequence??null),s=t.typeGlob?mR(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 Rf(e){return(await _l(e)).events}async function _l(e){await bf(e.eventsDir,{recursive:!0});let t=await yi(e),n=[],r=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await Qr(i.path,"utf8"),a=s===t.length-1,l=o.split(`
76
+ `)}}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 Nb(e){return new Promise((t,n)=>{let r=Db(e);r.once("connect",()=>t(r)),r.once("error",n)})}var Rl={openObserver:tf,listTasks:e=>R.listTasks(e),getTask:(e,t)=>R.getTask(e,t),now:Date.now};async function xb(e,t,n=Rl){let r=await ef(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...ut(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function _b(e,t,n=Rl){let r=await ef(e,t.taskId,n),s=await n.openObserver(e);try{let i=ut(r,s.getSnapshots(),n.now()),o=t.tabId?i.agents.filter(l=>l.tabId===t.tabId):i.agents;if(t.tabId&&o.length===0)throw new h("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 Fb(e,t,n,r=Rl){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await wl(s,i,{...n,now:r.now})}finally{i.close()}}async function ef(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function tf(e){return bl.open(e)}async function Lb(e){return tf(e)}var bl=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 Zp({paths:this.paths,onActivity:n=>{this.snapshots.set(n.tabId,n),this.notify()},onActivityRemoved:n=>{this.snapshots.delete(n),this.notify()},onDaemonClose:()=>{this.client=null,this.notify(),this.scheduleReconnect()}});if(this.closed){t?.close();return}if(this.client=t,t){this.reconnectDelayMs=250,this.snapshots.clear();for(let n of t.getSnapshots())this.snapshots.set(n.tabId,n);this.notify()}else this.scheduleReconnect()}scheduleReconnect(){if(this.closed||this.reconnectTimer)return;let t=this.reconnectDelayMs;this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,1e3),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},t)}notify(){for(let t of this.listeners)t()}},At={listAgents:xb,showAgentStatus:_b,waitForTask:Fb,openObserver:Lb};import{randomUUID as sR}from"node:crypto";import{mkdir as Pf,open as Nl,readdir as xl,readFile as Zr,rm as iR,stat as oR}from"node:fs/promises";import hi from"node:path";import{createHash as Wb}from"node:crypto";import{mkdir as zr,readdir as Il,readFile as Jr,writeFile as Bb}from"node:fs/promises";import Be from"node:path";import{mkdir as nf,readFile as Mb,rm as Sl,stat as jb,writeFile as qb}from"node:fs/promises";import Pl from"node:path";async function nr(e,t){let n=Pl.join(e.runtimeDir,"fury-store.lock");await nf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await nf(n);try{await qb(Pl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await Sl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!rf(s,"EEXIST"))throw s;let i=await Mb(Pl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await jb(n).catch(()=>null);if(typeof i?.pid=="number"&&!Ub(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await Sl(n,{recursive:!0,force:!0});continue}if(Date.now()-r>3e4)throw new h("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 Sl(n,{recursive:!0,force:!0})}}function Ub(e){try{return process.kill(e,0),!0}catch(t){return rf(t,"EPERM")}}var rf=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var ge=e=>({root:Be.join(e.craigDir,"fury"),definitions:Be.join(e.craigDir,"fury","definitions"),plans:Be.join(e.craigDir,"fury","plans"),approvals:Be.join(e.craigDir,"fury","approvals"),runs:Be.join(e.craigDir,"fury","runs"),reviews:Be.join(e.craigDir,"fury","reviews")});function vl(e){return Wb("sha256").update(JSON.stringify(e)).digest("hex")}async function of(e,t,n){let r=ge(e);await zr(r.definitions,{recursive:!0});let s=Be.join(r.definitions,`${t}.yaml`);await Bb(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!Yt(i,"EEXIST"))throw i})}async function af(e,t){return nr(e,async()=>{let n=await lf(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 zr(ge(e).plans,{recursive:!0}),await M(wf(e,i.id),i),i})}async function pi(e,t){mi(t,"plan");try{return Vb(JSON.parse(await Jr(wf(e,t),"utf8")),t)}catch(n){throw Yt(n,"ENOENT")?new h("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function lf(e){let t=ge(e).plans,n=await Il(t).catch(s=>Yt(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>pi(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function cf(e){let t=await lf(e),n=await Promise.all(t.map(s=>El(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 df(e,t){return nr(e,async()=>{let n=await El(e,t.planId);if(n){if(n.planHash!==t.planHash)throw new h("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after approval.`,{});return{approval:n,created:!1}}return await zr(ge(e).approvals,{recursive:!0}),await M(kf(e,t.planId),t),{approval:t,created:!0}})}async function uf(e,t){mi(t,"plan");let n=await El(e,t);if(!n)throw new h("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function pf(e,t){return nr(e,async()=>{let r=(await mf(e)).find(s=>s.planId===t.planId);if(r){if(r.planHash!==t.planHash)throw new h("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after its run was created.`,{});return{run:r,created:!1}}return await zr(ge(e).runs,{recursive:!0}),await M(Cl(e,t.id),t),{run:t,created:!0}})}async function de(e,t){mi(t,"run");try{return hf(JSON.parse(await Jr(Cl(e,t),"utf8")),t)}catch(n){throw Yt(n,"ENOENT")?new h("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function ff(e){return mf(e)}async function mf(e){let t=ge(e).runs,n=await Il(t).catch(s=>Yt(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 hf(JSON.parse(await Jr(Be.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ke(e,t,n){return nr(e,async()=>{let r=await de(e,t),s=n(r);if(s.id!==t)throw new h("INTERNAL_ERROR","Fury mutation cannot change its id.",{});return await M(Cl(e,t),s),s})}async function gf(e,t){await zr(ge(e).reviews,{recursive:!0}),await M(Al(e,t.id),t)}async function Xr(e,t,n){return nr(e,async()=>{let r=await rr(e,t),s=n(r);if(s.id!==t)throw new h("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await M(Al(e,t),s),s})}async function rr(e,t){mi(t,"review");try{return Kb(JSON.parse(await Jr(Al(e,t),"utf8")),t)}catch(n){throw Yt(n,"ENOENT")?new h("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function fi(e){let t=ge(e).reviews,n=await Il(t).catch(r=>Yt(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>rr(e,r.slice(0,-5))))}function hf(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!Ae(e)||e.schemaVersion!==1||e.id!==t||typeof e.planId!="string"||!/^fury_plan_[A-Za-z0-9_-]+$/.test(e.planId)||typeof e.planHash!="string"||!/^[a-f0-9]{64}$/.test(e.planHash)||typeof e.definitionHash!="string"||!/^[a-f0-9]{64}$/.test(e.definitionHash)||typeof e.name!="string"||!e.name||typeof e.sourceFile!="string"||!e.sourceFile||typeof e.rootTaskId!="string"||!e.rootTaskId||!n.includes(String(e.state))||!Ae(e.inputs)||!yf(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!Gb(e.stepRuns,e.order)||!Qr(e.actor)||!Ve(e.createdAt)||!Ve(e.updatedAt)||!Ve(e.stateChangedAt)||!Ve(e.deadlineAt)||e.completedAt!==null&&!Ve(e.completedAt))throw new h("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function Vb(e,t){if(!Ae(e)||e.schemaVersion!==1||e.id!==t||typeof e.planHash!="string"||!/^[a-f0-9]{64}$/.test(e.planHash)||typeof e.definitionHash!="string"||!/^[a-f0-9]{64}$/.test(e.definitionHash)||typeof e.name!="string"||!e.name||typeof e.sourceFile!="string"||!e.sourceFile||typeof e.rootTaskId!="string"||!e.rootTaskId||!Ae(e.inputs)||!yf(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||!Qr(e.createdBy)||!Ve(e.createdAt))throw new h("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,vl(n)!==e.planHash)throw new h("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function Kb(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!Ae(e)||e.schemaVersion!==1||e.id!==t||typeof e.runId!="string"||typeof e.stepId!="string"||!n.includes(String(e.state))||typeof e.title!="string"||typeof e.summary!="string"||e.feedbackTarget!==null&&(!Ae(e.feedbackTarget)||typeof e.feedbackTarget.taskId!="string"||e.feedbackTarget.agentTabId!==null&&typeof e.feedbackTarget.agentTabId!="string")||!Number.isInteger(e.round)||Number(e.round)<1||!Number.isInteger(e.version)||Number(e.version)<1||!Ve(e.requestedAt)||!Ve(e.deadlineAt)||!Ve(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!sf(r))||e.lastDecision!==null&&!sf(e.lastDecision))throw new h("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function Gb(e,t){return Ae(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&Hb(e[n],n))}function Hb(e,t){return!Ae(e)||e.id!==t||!["agent","human_review"].includes(String(e.kind))||!["pending","running","waiting_for_review","changes_requested","succeeded","failed","cancelled","timed_out"].includes(String(e.state))||!Array.isArray(e.needs)||e.needs.some(n=>typeof n!="string")||!Ae(e.plan)?!1:[e.taskId,e.agentTabId,e.commandId,e.reviewId,e.error].every(n=>n===null||typeof n=="string")&&[e.startedAt,e.completedAt,e.deadlineAt].every(n=>n===null||Ve(n))&&(e.completedBy===null||Qr(e.completedBy))}function sf(e){return Ae(e)&&Number.isInteger(e.sequence)&&Number.isInteger(e.round)&&["approve","reject","request_changes","resubmit"].includes(String(e.action))&&(e.message===null||typeof e.message=="string")&&Qr(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Ve(e.occurredAt)}function yf(e){return Ae(e)&&Number.isInteger(e.maxConcurrency)&&Number(e.maxConcurrency)>0&&Number.isInteger(e.maxTasks)&&Number(e.maxTasks)>0&&Number.isInteger(e.timeoutMs)&&Number(e.timeoutMs)>0}function Qr(e){return Ae(e)?e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component)):!1}var Cl=(e,t)=>Be.join(ge(e).runs,`${t}.json`),wf=(e,t)=>Be.join(ge(e).plans,`${t}.json`),kf=(e,t)=>Be.join(ge(e).approvals,`${t}.json`),Al=(e,t)=>Be.join(ge(e).reviews,`${t}.json`),mi=(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 h("CLI_USAGE",`Invalid fury ${t} id "${e}".`,{})};async function El(e,t){try{let n=JSON.parse(await Jr(kf(e,t),"utf8"));if(!Ae(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!Qr(n.approvedBy)||!Ae(n.approvedBy)||n.approvedBy.type!=="human"||!Ve(n.approvedAt))throw new h("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(Yt(n,"ENOENT"))return null;throw n}}var Ae=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ve=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Yt=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as Tf,readFile as Yb,rm as gi,stat as zb,writeFile as Jb}from"node:fs/promises";import Ol from"node:path";var Xb=20,Qb=3e4,Zb=5e3;async function bf(e,t){let n=Ol.join(e.runtimeDir,"event-journal.lock");await Tf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Tf(n);try{await Jb(Ol.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await gi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!nR(s))throw s;if(await eR(n))continue;if(Date.now()-r>=Qb)throw new h("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await rR(Xb)}try{return await t()}finally{await gi(n,{recursive:!0,force:!0})}}async function eR(e){let t=await Yb(Ol.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return tR(t.pid)?!1:(await gi(e,{recursive:!0,force:!0}),!0);let n=await zb(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<Zb?!1:(await gi(e,{recursive:!0,force:!0}),!0)}function tR(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var nR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",rR=e=>new Promise(t=>setTimeout(t,e));var aR=256*1024,lR=16,cR=64*1024;async function Ne(e,t,n={}){let r=Dl(n.maxSegmentBytes??aR,"Event journal segment size"),s=Dl(n.maxSegments??lR,"Event journal retention"),i=Dl(n.maxRecordBytes??cR,"Event record size");return bf(e,async()=>{await Pf(e.eventsDir,{recursive:!0}),await gR(e);let o=await _l(e),a=t.id??sR(),l=o.events.find(y=>y.id===a);if(l)return l;let c=(o.events.at(-1)?.sequence??0)+1,u={schemaVersion:1,id:a,sequence:c,workspaceId:t.workspaceId??null,taskId:t.taskId??null,agentTabId:t.agentTabId??null,commandId:t.commandId??null,furyRunId:t.furyRunId??null,furyStepId:t.furyStepId??null,type:t.type,occurredAt:t.occurredAt??new Date().toISOString(),actor:t.actor,data:wR(t.data)},d=`${JSON.stringify(u)}
77
+ `;if(Buffer.byteLength(d)>i)throw new h("CLI_USAGE",`Event record exceeds the ${i}-byte limit.`,{details:{eventType:t.type,maxRecordBytes:i}});let m=(await yi(e)).at(-1),g=!m||await dR(m.path,d,r);if(g&&(m={name:Sf(c),path:hi.join(e.eventsDir,Sf(c)),startSequence:c}),!m)throw new h("INTERNAL_ERROR","Failed to select an event journal segment.",{});let f=await Nl(m.path,"a");try{await f.writeFile(d,"utf8"),await f.sync()}finally{await f.close()}return g&&await vf(e.eventsDir),await uR(e,s),u})}async function In(e,t={}){let n=await _l(e),r=hR(n.events,t.after,n.earliestSequence,n.events.at(-1)?.sequence??null),s=t.typeGlob?yR(t.typeGlob):null,i=n.events.filter(l=>l.sequence>r&&(!t.taskId||l.taskId===t.taskId)&&(!s||s.test(l.type))),o=n.events.at(-1)?.sequence??null,a=n.events.filter(l=>l.sequence>r).at(-1);return{kind:"listEvents",events:i,cursor:{after:a?.id??t.after??null,sequence:a?.sequence??r,earliestAvailableSequence:n.earliestSequence,latestSequence:o}}}async function If(e){return(await _l(e)).events}async function _l(e){await Pf(e.eventsDir,{recursive:!0});let t=await yi(e),n=[],r=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await Zr(i.path,"utf8"),a=s===t.length-1,l=o.split(`
78
78
  `);if(o.endsWith(`
79
- `))l.pop();else{if(!a)throw Yt(i.name,"segment has a truncated tail");l.pop()}for(let c=0;c<l.length;c+=1){let u=l[c];if(u.length===0)throw Yt(i.name,`empty record at line ${c+1}`);let d;try{d=JSON.parse(u)}catch{throw Yt(i.name,`invalid JSON at line ${c+1}`)}let p=gR(d,i.name,c+1);if(c===0&&p.sequence!==i.startSequence)throw Yt(i.name,`first record sequence ${p.sequence} does not match segment name`);if(r.has(p.id))throw Yt(i.name,`duplicate event id ${p.id}`);r.add(p.id);let h=n.at(-1);if(h&&p.sequence!==h.sequence+1)throw Yt(i.name,`non-monotonic sequence ${p.sequence} after ${h.sequence}`);n.push(p)}}return{events:n,earliestSequence:n[0]?.sequence??null}}async function yi(e){return(await xl(e.eventsDir).catch(n=>{if(Fl(n))return[];throw n})).flatMap(n=>{let r=/^segment-(\d{16})\.jsonl$/.exec(n);return r?[{name:n,path:gi.join(e.eventsDir,n),startSequence:Number(r[1])}]:[]}).sort((n,r)=>n.startSequence-r.startSequence)}async function aR(e,t,n){let r=await rR(e).catch(()=>null);return r!==null&&r.size>0&&r.size+Buffer.byteLength(t)>n}async function lR(e,t){let n=await yi(e),r=Math.max(0,n.length-t),s=await dR(e),i=await cR(e);if(s===null||i===null)return;for(let a=0;a<r;a+=1)if(await uR(n[a].path,s,i)){r=a;break}let o=n.slice(0,r);for(let a of o)await nR(a.path,{force:!0});o.length>0&&await Sf(e.eventsDir)}async function cR(e){let t=he(e).runs,n=await xl(t).catch(s=>{if(Fl(s))return[];throw s}),r=new Set;for(let s of n.filter(i=>i.endsWith(".json")))try{let i=JSON.parse(await Qr(gi.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 dR(e){let t=await xl(e.commandsDir).catch(r=>{if(Fl(r))return[];throw r}),n=new Set;for(let r of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await Qr(gi.join(e.commandsDir,r),"utf8"));typeof s.id=="string"&&(s.state==="queued"||s.state==="delivering")&&n.add(s.id)}catch{return null}return n}async function uR(e,t,n){if(t.size===0&&n.size===0)return!1;let r=await Qr(e,"utf8");for(let s of r.split(`
80
- `))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 pR(e){let t=(await yi(e)).at(-1);if(!t)return;let n=await Qr(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await Dl(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function fR(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 $l(t);return kf(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}}):$l(t);return kf(t,s.sequence,n),s.sequence}function kf(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 mR(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 hR(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 gR(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw Yt(t,`record at line ${n} is not an object`);let r=e,s={...r,furyRunId:r.furyRunId??r.swarmRunId??null,furyStepId:r.furyStepId??r.swarmStepId??null,type:typeof r.type=="string"&&r.type.startsWith("swarm.")?`fury.${r.type.slice(6)}`:r.type};delete s.swarmRunId,delete s.swarmStepId;let i=s;if(i.schemaVersion!==1||typeof i.id!="string"||i.id.length===0||i.id.length>256||!Number.isSafeInteger(i.sequence)||(i.sequence??0)<1||typeof i.type!="string"||i.type.length===0||i.type.length>256||typeof i.occurredAt!="string"||!Number.isFinite(Date.parse(i.occurredAt))||!sr(i.workspaceId)||!sr(i.taskId)||!sr(i.agentTabId)||!sr(i.commandId)||!sr(i.furyRunId)||!sr(i.furyStepId)||!yR(i.actor)||!("data"in i))throw Yt(t,`record at line ${n} has an invalid schema`);return i}function yR(e){if(typeof e!="object"||e===null||Array.isArray(e)||!("type"in e))return!1;let t=e;return t.type==="human"?(t.source==="cli"||t.source==="tui")&&Number.isInteger(t.processId):t.type==="agent"?typeof t.taskId=="string"&&typeof t.agentTabId=="string"&&typeof t.capabilityId=="string":t.type==="system"&&(t.component==="orchestration-supervisor"||t.component==="heartbeat")}var sr=e=>e===null||typeof e=="string",Tf=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,Yt=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),$l=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),Fl=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Nl(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 Sf(e){let t=await Dl(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as vf,readdir as AR,readFile as Cf}from"node:fs/promises";import Af from"node:path";import{mkdir as Pf,readFile as wR,rm as wi,stat as kR,writeFile as TR}from"node:fs/promises";import Ll from"node:path";var bR=20,RR=3e4,SR=5e3;async function Ml(e,t){let n=Ll.join(e.runtimeDir,"command-store.lock");await Pf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Pf(n);try{await TR(Ll.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await wi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!vR(s))throw s;if(await PR(n))continue;if(Date.now()-r>=RR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await CR(bR)}try{return await t()}finally{await wi(n,{recursive:!0,force:!0})}}async function PR(e){let t=await wR(Ll.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return IR(t.pid)?!1:(await wi(e,{recursive:!0,force:!0}),!0);let n=await kR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<SR?!1:(await wi(e,{recursive:!0,force:!0}),!0)}function IR(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",CR=e=>new Promise(t=>setTimeout(t,e));async function bi(e,t){jl(t);try{let n=JSON.parse(await Cf(Zr(e,t),"utf8"));return Of(n,Zr(e,t),t)}catch(n){throw NR(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?Ti(t,Zr(e,t),n):n}}async function Ge(e){await vf(e.commandsDir,{recursive:!0});let t=await AR(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=Af.join(e.commandsDir,r);try{n.push(Of(JSON.parse(await Cf(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:Ti(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function Ef(e,t){return jl(t.id),Ml(e,async()=>{await vf(e.commandsDir,{recursive:!0});let n=await Ge(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!ER(r,t))throw new g("COMMAND_STATE_CONFLICT",`Idempotency key "${t.idempotencyKey}" is already used by command ${r.id}.`,{details:{commandId:r.id,idempotencyKey:t.idempotencyKey}});return{command:r,created:!1}}}return await M(Zr(e,t.id),t),{command:t,created:!0}})}async function es(e,t,n){return jl(t),Ml(e,async()=>{let r=await bi(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await M(Zr(e,t),s),s})}function ER(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 Of(e,t,n){if(!ki(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw Ti("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||!ki(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!$R(e.prompt.text)||!["when-ready","immediate"].includes(String(e.delivery))||!s.includes(e.state)||!Number.isInteger(e.attempts)||Number(e.attempts)<0||!Number.isInteger(e.timeoutMs)||Number(e.timeoutMs)<=0||Number(e.timeoutMs)>864e5||!ir(e.expiresAt)||!ir(e.createdAt)||!ir(e.updatedAt)||e.deliveryStartedAt!==null&&!ir(e.deliveryStartedAt)||e.deliveredAt!==null&&!ir(e.deliveredAt)||e.cancelledAt!==null&&!ir(e.cancelledAt)||e.cancelledBy!==null&&!If(e.cancelledBy)||!If(e.actor)||!OR(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 Ti(r,t);return e}function If(e){return!ki(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 OR(e){return e===null||ki(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var Zr=(e,t)=>Af.join(e.commandsDir,`${t}.json`),jl=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},ir=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),$R=e=>e.trim().length>0&&Buffer.byteLength(e)<=32*1024&&![...e].some(t=>{let n=t.charCodeAt(0);return n<=8||n>=11&&n<=31||n>=127&&n<=159}),ki=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),NR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",Ti=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function $f(e,t=new Date){return Ri(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function Nf(e,t=new Date){return e.state==="delivered"?e:(Ri(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function Df(e,t,n=new Date){return e.state==="failed"?e:(Ri(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function xf(e,t,n=new Date){return e.state==="cancelled"?e:(Ri(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function Ri(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 DR}from"node:crypto";var ql=32*1024,_f=1440*60*1e3,Ul=256,xR=["delivered","failed","cancelled"],Wl={type:"system",component:"orchestration-supervisor"};async function _R(e,t){if(BR(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>_f)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:_f}});if(t.idempotencyKey!==void 0&&t.idempotencyKey!==null&&t.idempotencyKey.trim().length===0)throw new g("CLI_USAGE","Idempotency key cannot be empty.",{});if((t.idempotencyKey?.length??0)>Ul)throw new g("CLI_USAGE",`Idempotency key exceeds ${Ul} characters.`,{details:{maxIdempotencyKeyLength:Ul}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${DR()}`,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 Ef(e,r);if(s.created)try{await vn(e,s.command,"command.queued")}catch(i){throw Ff(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function FR(e,t){return{kind:"showPromptCommand",command:await bi(e,t)}}async function LR(e,t){let n=await Ge(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function MR(e,t,n){let r=!1,s=await es(e,t,i=>{if(i.state==="cancelled")return i;let o=xf(i,n??i.actor);return r=!0,o});if(r)try{await vn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw Ff(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function jR(e,t){let n=await es(e,t,r=>$f(r));return await vn(e,n,"command.delivering",Wl),n}async function qR(e,t){let n=await es(e,t,r=>Nf(r));return await vn(e,n,"command.delivered",Wl),n}async function UR(e,t,n){let r=await es(e,t,s=>Df(s,n));return await vn(e,r,"command.failed",Wl),r}async function WR(e,t,n){let r=[...n.states??xR],s=Date.now()+n.timeoutMs;for(;;){let i=await bi(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 VR(Math.min(n.pollIntervalMs??100,o),n.signal)}}function BR(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 vn(e,t,n,r=t.actor){await De(e,{id:`${t.id}:${n}`,taskId:t.taskId,agentTabId:t.agentTabId,commandId:t.id,type:n,occurredAt:n==="command.queued"?t.createdAt:n==="command.delivering"?t.deliveryStartedAt??t.updatedAt:n==="command.delivered"?t.deliveredAt??t.updatedAt:n==="command.cancelled"?t.cancelledAt??t.updatedAt:t.updatedAt,actor:r,data:{state:t.state,delivery:t.delivery,attempts:t.attempts,errorCode:t.lastError?.code??null,deliveryUncertain:t.lastError?.deliveryUncertain??!1}})}function VR(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 Ff=(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}),ue={create:_R,show:FR,list:LR,cancel:MR,wait:WR,beginDelivery:jR,completeDelivery:qR,fail:UR};import{randomUUID as Mf,timingSafeEqual as KR}from"node:crypto";import{mkdir as GR,readFile as HR,readdir as YR}from"node:fs/promises";import jf from"node:path";var zR=10080*60*1e3,JR={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},XR=["task.create-child","task.children","task.cancel-tree"],QR=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function Xe(e,t,n={type:"system",component:"orchestration-supervisor"},r){let s=t.ptyTabs.find(o=>o.kind==="agent"&&(!r||o.id===r));if(!s)return{};let i=null;if(await GR(Gl(e),{recursive:!0,mode:448}),await W(e,t.id,async o=>{let a=o.ptyTabs.find(d=>d.id===s.id&&d.kind==="agent");if(!a)throw new g("CAPABILITY_DENIED",`Agent tab ${s.id} no longer exists.`,{});let l=a.capabilityId??`capability_${Mf()}`,c=await Si(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 ZR(e,l,o.id,a.id,n)).token,a.capabilityId?o:{...o,ptyTabs:o.ptyTabs.map(d=>d.id===a.id?{...d,capabilityId:l}:d)}}),!i)throw new g("INTERNAL_ERROR",`Failed to issue a capability for ${s.id}.`,{});return{CRAIG_AGENT_CAPABILITY:i}}async function ZR(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${Mf()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...XR],targetPolicy:"children-only",limits:{...JR},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+zR).toISOString(),revokedAt:null,revokedBy:null};return await M(Hl(e,o.id),o,{mode:384}),o}async function He(e,t,n,r){let s=await tS(e,t);return s.revokedAt&&Cn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&Cn(s.id,"expired"),!QR.has(n)&&!s.allowedCommandFamilies.includes(n)&&Cn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await eS(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 eS(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 qf(e,t,n){let r=await Si(e,t);r&&(r.revokedAt||await M(Hl(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function Kl(e,t,n){let r=await YR(Gl(e)).catch(i=>Uf(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 Si(e,o[1]);!a||!t.has(a.taskId)||(await qf(e,a.id,n),s.push(a.id))}return s}async function tS(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 Si(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||!KR(i,o))&&Cn(r,"token is invalid"),s}async function Si(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||Cn(t,"identifier is invalid");try{let n=JSON.parse(await HR(Hl(e,t),"utf8"));if(!nS(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(Uf(n))return null;throw n}}function nS(e,t){if(!Vl(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"&&rS(r))&&e.targetPolicy==="children-only"&&Vl(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&Bl(e.createdAt)&&Bl(e.expiresAt)&&Lf(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||Bl(e.revokedAt)&&Lf(e.revokedBy))}function Lf(e){return Vl(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 Gl=e=>jf.join(e.orchestrationDir,"capabilities"),Hl=(e,t)=>jf.join(Gl(e),`${t}.json`),rS=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),Vl=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Bl=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Uf=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as Wf,readFile as sS,rm as Yl,stat as iS,writeFile as oS}from"node:fs/promises";import zl from"node:path";var aS=20,lS=3e4,cS=5e3;async function Jl(e,t){let n=zl.join(e.runtimeDir,"delegation.lock");await Wf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Wf(n);try{await oS(zl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Yl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!pS(s))throw s;if(await dS(n))continue;if(Date.now()-r>=lS)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,aS))}try{return await t()}finally{await Yl(n,{recursive:!0,force:!0})}}async function dS(e){let t=await sS(zl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&uS(t.pid))return!1;let n=await iS(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<cS?!1:(await Yl(e,{recursive:!0,force:!0}),!0)}function uS(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 pS=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var fS={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function Xl(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 Xe(e,i,{type:"human",source:"cli",processId:process.pid})})}):S.createTask(e,t,n,r)}async function ts(e,t){return Jl(e,async()=>{let n=await S.getTask(e,t.parentTaskId),r=t.capabilityId?await He(e,t.capabilityId,"task.create-child",n.id):null,s=r?.actor??{type:"human",source:"cli",processId:process.pid},i=r?.capability.limits??fS,o=t.prompt.trim();if(o.length===0)throw new g("CLI_USAGE","Child task prompt cannot be empty.",{});if(Buffer.byteLength(o)>i.maxPromptBytes&&Pi("prompt bytes",i.maxPromptBytes),n.delegationDepth+1>i.maxDepth&&Pi("delegation depth",i.maxDepth),!new Set([n.repoId,...n.linkedRepoIds,...(n.repoTargets??[]).map(f=>f.repoId)]).has(t.repoId))throw new g("CAPABILITY_DENIED",`Repo ${t.repoId} is outside parent task ${n.id}.`,{details:{parentTaskId:n.id,repoId:t.repoId}});let c=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(f=>f.parentTaskId===n.id),u=t.idempotencyKey?.trim()||null;if(u){if(u.length>256)throw new g("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let f=c.find(m=>m.delegationIdempotencyKey===u);if(f){if(f.repoId!==t.repoId||f.prompt.value!==o||t.runner&&f.runner!==t.runner)throw new g("COMMAND_STATE_CONFLICT",`Idempotency key "${u}" is already used by child ${f.id}.`,{details:{idempotencyKey:u,taskId:f.id}});return Bf(f,!0)}}c.length>=i.maxChildren&&Pi("children",i.maxChildren),c.filter(f=>f.status!=="closed"&&f.status!=="merged").length>=i.maxConcurrentChildren&&Pi("concurrent children",i.maxConcurrentChildren);let p=await S.createTask(e,t.repoId,o,{...t.runner?{runner:t.runner}:{},lineage:{parentTaskId:n.id,rootTaskId:n.rootTaskId,delegationDepth:n.delegationDepth+1,delegationIdempotencyKey:u,furyRunId:t.fury?.runId??n.furyRunId,furyStepId:t.fury?.stepId??null},onProvisioned:async f=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:f.id,CRAIG_AGENT_TAB_ID:f.ptyTabs.find(m=>m.kind==="agent")?.id??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await Xe(e,f,s)})}),h=await S.getTask(e,p.taskId);try{await De(e,{workspaceId:h.workspaceId,taskId:h.id,agentTabId:s.type==="agent"?s.agentTabId:null,type:"task.child.created",actor:s,data:{parentTaskId:n.id,rootTaskId:h.rootTaskId,delegationDepth:h.delegationDepth}})}catch(f){throw new g("PARTIAL_RESULT",`Child ${h.id} was created, but its audit event could not be recorded.`,{details:{taskId:h.id,parentTaskId:n.id,persisted:!0},cause:f})}return Bf(h,!1)})}async function Ql(e,t,n){n&&await He(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 Zl(e,t,n){return Jl(e,async()=>{let s=(n?await He(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,u=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)))u(y.id)}};u(t);let d=[],p=[],h=[];try{await Kl(e,new Set(l.map(f=>f.id)),s)}catch{h.push(...l.map(f=>f.id))}for(let f of l){let m=f.status;if(m==="closed"){d.push({taskId:f.id,previousStatus:m,status:"closed",disposition:"already-closed"});continue}await S.cleanupTask(e,f,{preserveWorktree:!0});let y=await S.closeTask(e,f.id);d.push({taskId:f.id,previousStatus:m,status:y.status,disposition:"cancelled"});try{await De(e,{workspaceId:f.workspaceId,taskId:f.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:m}})}catch{p.push(f.id)}}if(p.length>0||h.length>0)throw new g("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:d,auditFailures:p,revocationFailures:h,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:d}})}function Bf(e,t){return{kind:"createChildTask",taskId:e.id,parentTaskId:e.parentTaskId,rootTaskId:e.rootTaskId,delegationDepth:e.delegationDepth,repoId:e.repoId,workspaceId:e.workspaceId,sessionId:e.sessionId,status:e.status,branch:e.branch,worktreePath:e.worktreePath,runner:e.runner,idempotentReplay:t}}function Pi(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var Ii=Symbol.for("yaml.alias"),vi=Symbol.for("yaml.document"),Qe=Symbol.for("yaml.map"),ec=Symbol.for("yaml.pair"),xe=Symbol.for("yaml.scalar"),Et=Symbol.for("yaml.seq"),Se=Symbol.for("yaml.node.type"),_e=e=>!!e&&typeof e=="object"&&e[Se]===Ii,pt=e=>!!e&&typeof e=="object"&&e[Se]===vi,Ze=e=>!!e&&typeof e=="object"&&e[Se]===Qe,q=e=>!!e&&typeof e=="object"&&e[Se]===ec,x=e=>!!e&&typeof e=="object"&&e[Se]===xe,et=e=>!!e&&typeof e=="object"&&e[Se]===Et;function B(e){if(e&&typeof e=="object")switch(e[Se]){case Qe:case Et:return!0}return!1}function U(e){if(e&&typeof e=="object")switch(e[Se]){case Ii:case Qe:case xe:case Et:return!0}return!1}var Ci=e=>(x(e)||B(e))&&!!e.anchor;var Ee=Symbol("break visit"),Vf=Symbol("skip children"),ft=Symbol("remove node");function Ye(e,t){let n=Kf(t);pt(e)?or(null,e.contents,n,Object.freeze([e]))===ft&&(e.contents=null):or(null,e,n,Object.freeze([]))}Ye.BREAK=Ee;Ye.SKIP=Vf;Ye.REMOVE=ft;function or(e,t,n,r){let s=Gf(e,t,n,r);if(U(s)||q(s))return Hf(e,r,s),or(e,s,n,r);if(typeof s!="symbol"){if(B(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=or(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ee)return Ee;o===ft&&(t.items.splice(i,1),i-=1)}}}else if(q(t)){r=Object.freeze(r.concat(t));let i=or("key",t.key,n,r);if(i===Ee)return Ee;i===ft&&(t.key=null);let o=or("value",t.value,n,r);if(o===Ee)return Ee;o===ft&&(t.value=null)}}return s}async function Ai(e,t){let n=Kf(t);pt(e)?await ar(null,e.contents,n,Object.freeze([e]))===ft&&(e.contents=null):await ar(null,e,n,Object.freeze([]))}Ai.BREAK=Ee;Ai.SKIP=Vf;Ai.REMOVE=ft;async function ar(e,t,n,r){let s=await Gf(e,t,n,r);if(U(s)||q(s))return Hf(e,r,s),ar(e,s,n,r);if(typeof s!="symbol"){if(B(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=await ar(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ee)return Ee;o===ft&&(t.items.splice(i,1),i-=1)}}}else if(q(t)){r=Object.freeze(r.concat(t));let i=await ar("key",t.key,n,r);if(i===Ee)return Ee;i===ft&&(t.key=null);let o=await ar("value",t.value,n,r);if(o===Ee)return Ee;o===ft&&(t.value=null)}}return s}function Kf(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 Gf(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(Ze(t))return n.Map?.(e,t,r);if(et(t))return n.Seq?.(e,t,r);if(q(t))return n.Pair?.(e,t,r);if(x(t))return n.Scalar?.(e,t,r);if(_e(t))return n.Alias?.(e,t,r)}function Hf(e,t,n){let r=t[t.length-1];if(B(r))r.items[e]=n;else if(q(r))e==="key"?r.key=n:r.value=n;else if(pt(r))r.contents=n;else{let s=_e(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var mS={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},hS=e=>e.replace(/[!,[\]{}]/g,t=>mS[t]),mt=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+hS(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={};Ye(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(`
81
- `)}};mt.defaultYaml={explicit:!1,version:"1.2"};mt.defaultTags={"!!":"tag:yaml.org,2002:"};function Ei(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 tc(e){let t=new Set;return Ye(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function nc(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function Yf(e,t){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=tc(e));let o=nc(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)||B(o.node)))o.node.anchor=o.anchor;else{let a=new Error("Failed to resolve repeated object (this should not happen)");throw a.source=i,a}}},sourceObjects:r}}function zt(e,t,n,r){if(r&&typeof r=="object")if(Array.isArray(r))for(let s=0,i=r.length;s<i;++s){let o=r[s],a=zt(e,r,String(s),o);a===void 0?delete r[s]:a!==o&&(r[s]=a)}else if(r instanceof Map)for(let s of Array.from(r.keys())){let i=r.get(s),o=zt(e,r,s,i);o===void 0?r.delete(s):o!==i&&r.set(s,o)}else if(r instanceof Set)for(let s of Array.from(r)){let i=zt(e,r,s,s);i===void 0?r.delete(s):i!==s&&(r.delete(s),r.add(i))}else for(let[s,i]of Object.entries(r)){let o=zt(e,r,s,i);o===void 0?delete r[s]:o!==i&&(r[s]=o)}return e.call(t,n,r)}function ae(e,t,n){if(Array.isArray(e))return e.map((r,s)=>ae(r,String(s),n));if(e&&typeof e.toJSON=="function"){if(!n||!Ci(e))return e.toJSON(t,n);let r={aliasCount:0,count:1,res:void 0};n.anchors.set(e,r),n.onCreate=i=>{r.res=i,delete n.onCreate};let s=e.toJSON(t,n);return n.onCreate&&n.onCreate(s),s}return typeof e=="bigint"&&!n?.keep?Number(e):e}var Jt=class{constructor(t){Object.defineProperty(this,Se,{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(!pt(t))throw new TypeError("A document argument is required");let o={anchors:new Map,doc:t,keep:!0,mapAsMap:n===!0,mapKeyWarned:!1,maxAliasCount:typeof r=="number"?r:100},a=ae(this,"",o);if(typeof s=="function")for(let{count:l,res:c}of o.anchors.values())s(c,l);return typeof i=="function"?zt(i,{"":a},"",a):a}};var Ot=class extends Jt{constructor(t){super(Ii),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=[],Ye(t,{Node:(i,o)=>{(_e(o)||Ci(o))&&r.push(o)}}),n&&(n.aliasResolveCache=r));let s;for(let i of r){if(i===this)break;i.anchor===this.source&&(s=i)}return s}toJSON(t,n){if(!n)return{source:this.source};let{anchors:r,doc:s,maxAliasCount:i}=n,o=this.resolve(s,n);if(!o){let l=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(l)}let a=r.get(o);if(a||(ae(o,null,n),a=r.get(o)),a?.res===void 0){let l="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(l)}if(i>=0&&(a.count+=1,a.aliasCount===0&&(a.aliasCount=Oi(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(Ei(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 Oi(e,t,n){if(_e(t)){let r=t.resolve(e),s=n&&r&&n.get(r);return s?s.count*s.aliasCount:0}else if(B(t)){let r=0;for(let s of t.items){let i=Oi(e,s,n);i>r&&(r=i)}return r}else if(q(t)){let r=Oi(e,t.key,n),s=Oi(e,t.value,n);return Math.max(r,s)}return 1}var $i=e=>!e||typeof e!="function"&&typeof e!="object",O=class extends Jt{constructor(t){super(xe),this.value=t}toJSON(t,n){return n?.keep?this.value:ae(this.value,t,n)}toString(){return String(this.value)}};O.BLOCK_FOLDED="BLOCK_FOLDED";O.BLOCK_LITERAL="BLOCK_LITERAL";O.PLAIN="PLAIN";O.QUOTE_DOUBLE="QUOTE_DOUBLE";O.QUOTE_SINGLE="QUOTE_SINGLE";var gS="tag:yaml.org,2002:";function yS(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(pt(e)&&(e=e.contents),U(e))return e;if(q(e)){let d=n.schema[Qe].createNode?.(n.schema,null,n);return d.items.push(e),d}(e instanceof String||e instanceof Number||e instanceof Boolean||typeof BigInt<"u"&&e instanceof BigInt)&&(e=e.valueOf());let{aliasDuplicateObjects:r,onAnchor:s,onTagObj:i,schema:o,sourceObjects:a}=n,l;if(r&&e&&typeof e=="object"){if(l=a.get(e),l)return l.anchor??(l.anchor=s(e)),new Ot(l.anchor);l={anchor:null,node:null},a.set(e,l)}t?.startsWith("!!")&&(t=gS+t.slice(2));let c=yS(e,t,o.tags);if(!c){if(e&&typeof e.toJSON=="function"&&(e=e.toJSON()),!e||typeof e!="object"){let d=new O(e);return l&&(l.node=d),d}c=e instanceof Map?o[Qe]:Symbol.iterator in Object(e)?o[Et]:o[Qe]}i&&(i(c),delete n.onTagObj);let u=c?.createNode?c.createNode(n.schema,e,n):typeof c?.nodeClass?.from=="function"?c.nodeClass.from(n.schema,e,n):new O(e);return t?u.tag=t:c.default||(u.tag=c.tag),l&&(l.node=u),u}function ns(e,t,n){let r=n;for(let s=t.length-1;s>=0;--s){let i=t[s];if(typeof i=="number"&&Number.isInteger(i)&&i>=0){let o=[];o[i]=r,r=o}else r=new Map([[i,r]])}return $t(r,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:e,sourceObjects:new Map})}var cr=e=>e==null||typeof e=="object"&&!!e[Symbol.iterator]().next().done,lr=class extends Jt{constructor(t,n){super(t),Object.defineProperty(this,"schema",{value:n,configurable:!0,enumerable:!1,writable:!0})}clone(t){let n=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return t&&(n.schema=t),n.items=n.items.map(r=>U(r)||q(r)?r.clone(t):r),this.range&&(n.range=this.range.slice()),n}addIn(t,n){if(cr(t))this.add(n);else{let[r,...s]=t,i=this.get(r,!0);if(B(i))i.addIn(s,n);else if(i===void 0&&this.schema)this.set(r,ns(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}deleteIn(t){let[n,...r]=t;if(r.length===0)return this.delete(n);let s=this.get(n,!0);if(B(s))return s.deleteIn(r);throw new Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}getIn(t,n){let[r,...s]=t,i=this.get(r,!0);return s.length===0?!n&&x(i)?i.value:i:B(i)?i.getIn(s,n):void 0}hasAllNullValues(t){return this.items.every(n=>{if(!q(n))return!1;let r=n.value;return r==null||t&&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 B(s)?s.hasIn(r):!1}setIn(t,n){let[r,...s]=t;if(s.length===0)this.set(r,n);else{let i=this.get(r,!0);if(B(i))i.setIn(s,n);else if(i===void 0&&this.schema)this.set(r,ns(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};var zf=e=>e.replace(/^(?!$)(?: $)?/gm,"#");function ze(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var ht=(e,t,n)=>e.endsWith(`
79
+ `))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 u=l[c];if(u.length===0)throw zt(i.name,`empty record at line ${c+1}`);let d;try{d=JSON.parse(u)}catch{throw zt(i.name,`invalid JSON at line ${c+1}`)}let p=kR(d,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 m=n.at(-1);if(m&&p.sequence!==m.sequence+1)throw zt(i.name,`non-monotonic sequence ${p.sequence} after ${m.sequence}`);n.push(p)}}return{events:n,earliestSequence:n[0]?.sequence??null}}async function yi(e){return(await xl(e.eventsDir).catch(n=>{if(Fl(n))return[];throw n})).flatMap(n=>{let r=/^segment-(\d{16})\.jsonl$/.exec(n);return r?[{name:n,path:hi.join(e.eventsDir,n),startSequence:Number(r[1])}]:[]}).sort((n,r)=>n.startSequence-r.startSequence)}async function dR(e,t,n){let r=await oR(e).catch(()=>null);return r!==null&&r.size>0&&r.size+Buffer.byteLength(t)>n}async function uR(e,t){let n=await yi(e),r=Math.max(0,n.length-t),s=await fR(e),i=await pR(e);if(s===null||i===null)return;for(let a=0;a<r;a+=1)if(await mR(n[a].path,s,i)){r=a;break}let o=n.slice(0,r);for(let a of o)await iR(a.path,{force:!0});o.length>0&&await vf(e.eventsDir)}async function pR(e){let t=ge(e).runs,n=await xl(t).catch(s=>{if(Fl(s))return[];throw s}),r=new Set;for(let s of n.filter(i=>i.endsWith(".json")))try{let i=JSON.parse(await Zr(hi.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 xl(e.commandsDir).catch(r=>{if(Fl(r))return[];throw r}),n=new Set;for(let r of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await Zr(hi.join(e.commandsDir,r),"utf8"));typeof s.id=="string"&&(s.state==="queued"||s.state==="delivering")&&n.add(s.id)}catch{return null}return n}async function mR(e,t,n){if(t.size===0&&n.size===0)return!1;let r=await Zr(e,"utf8");for(let s of r.split(`
80
+ `))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 gR(e){let t=(await yi(e)).at(-1);if(!t)return;let n=await Zr(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await Nl(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function hR(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 $l(t);return Rf(t,i,n),i}let s=e.find(i=>i.id===t);if(!s)throw n!==null&&n>1?new h("EVENT_CURSOR_EXPIRED",`Event cursor ${t} has expired.`,{details:{cursor:t,earliestAvailableSequence:n,resumeAfter:n-1}}):$l(t);return Rf(t,s.sequence,n),s.sequence}function Rf(e,t,n){if(n!==null&&t<n-1)throw new h("EVENT_CURSOR_EXPIRED",`Event cursor ${e} has expired.`,{details:{cursor:e,earliestAvailableSequence:n,resumeAfter:n-1}})}function yR(e){if(e.length===0||e.length>256)throw new h("CLI_USAGE","Event type glob must contain between 1 and 256 characters.",{});let t=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replaceAll("*",".*");return new RegExp(`^${t}$`)}function wR(e){let t=JSON.stringify(e,(n,r)=>/prompt|token|secret|password|authorization|capability/i.test(n)?"[REDACTED]":r);return t===void 0?null:JSON.parse(t)}function kR(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw 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))||!sr(i.workspaceId)||!sr(i.taskId)||!sr(i.agentTabId)||!sr(i.commandId)||!sr(i.furyRunId)||!sr(i.furyStepId)||!TR(i.actor)||!("data"in i))throw zt(t,`record at line ${n} has an invalid schema`);return i}function TR(e){if(typeof e!="object"||e===null||Array.isArray(e)||!("type"in e))return!1;let t=e;return t.type==="human"?(t.source==="cli"||t.source==="tui")&&Number.isInteger(t.processId):t.type==="agent"?typeof t.taskId=="string"&&typeof t.agentTabId=="string"&&typeof t.capabilityId=="string":t.type==="system"&&(t.component==="orchestration-supervisor"||t.component==="heartbeat")}var sr=e=>e===null||typeof e=="string",Sf=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,zt=(e,t)=>new h("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),$l=e=>new h("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),Fl=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Dl(e,t){if(!Number.isSafeInteger(e)||e<1)throw new h("CLI_USAGE",`${t} must be a positive integer.`,{details:{value:e}});return e}async function vf(e){let t=await Nl(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as Ef,readdir as $R,readFile as Of}from"node:fs/promises";import $f from"node:path";import{mkdir as Cf,readFile as bR,rm as wi,stat as RR,writeFile as SR}from"node:fs/promises";import Ll from"node:path";var PR=20,IR=3e4,vR=5e3;async function Ml(e,t){let n=Ll.join(e.runtimeDir,"command-store.lock");await Cf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Cf(n);try{await SR(Ll.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await wi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!ER(s))throw s;if(await CR(n))continue;if(Date.now()-r>=IR)throw new h("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await OR(PR)}try{return await t()}finally{await wi(n,{recursive:!0,force:!0})}}async function CR(e){let t=await bR(Ll.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return AR(t.pid)?!1:(await wi(e,{recursive:!0,force:!0}),!0);let n=await RR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<vR?!1:(await wi(e,{recursive:!0,force:!0}),!0)}function AR(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var ER=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",OR=e=>new Promise(t=>setTimeout(t,e));async function bi(e,t){jl(t);try{let n=JSON.parse(await Of(es(e,t),"utf8"));return Nf(n,es(e,t),t)}catch(n){throw _R(n)?new h("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?Ti(t,es(e,t),n):n}}async function Ge(e){await Ef(e.commandsDir,{recursive:!0});let t=await $R(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=$f.join(e.commandsDir,r);try{n.push(Nf(JSON.parse(await Of(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof h?i:Ti(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function Df(e,t){return jl(t.id),Ml(e,async()=>{await Ef(e.commandsDir,{recursive:!0});let n=await Ge(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!DR(r,t))throw new h("COMMAND_STATE_CONFLICT",`Idempotency key "${t.idempotencyKey}" is already used by command ${r.id}.`,{details:{commandId:r.id,idempotencyKey:t.idempotencyKey}});return{command:r,created:!1}}}return await M(es(e,t.id),t),{command:t,created:!0}})}async function ts(e,t,n){return jl(t),Ml(e,async()=>{let r=await bi(e,t),s=n(r);if(s.id!==r.id)throw new h("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await M(es(e,t),s),s})}function DR(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 Nf(e,t,n){if(!ki(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw Ti("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||!ki(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!xR(e.prompt.text)||!["when-ready","immediate"].includes(String(e.delivery))||!s.includes(e.state)||!Number.isInteger(e.attempts)||Number(e.attempts)<0||!Number.isInteger(e.timeoutMs)||Number(e.timeoutMs)<=0||Number(e.timeoutMs)>864e5||!ir(e.expiresAt)||!ir(e.createdAt)||!ir(e.updatedAt)||e.deliveryStartedAt!==null&&!ir(e.deliveryStartedAt)||e.deliveredAt!==null&&!ir(e.deliveredAt)||e.cancelledAt!==null&&!ir(e.cancelledAt)||e.cancelledBy!==null&&!Af(e.cancelledBy)||!Af(e.actor)||!NR(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 Ti(r,t);return e}function Af(e){return!ki(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 NR(e){return e===null||ki(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var es=(e,t)=>$f.join(e.commandsDir,`${t}.json`),jl=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new h("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},ir=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),xR=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}),ki=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),_R=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",Ti=(e,t,n)=>new h("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function xf(e,t=new Date){return Ri(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function _f(e,t=new Date){return e.state==="delivered"?e:(Ri(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function Ff(e,t,n=new Date){return e.state==="failed"?e:(Ri(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function Lf(e,t,n=new Date){return e.state==="cancelled"?e:(Ri(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function Ri(e,t,n){if(!t.includes(e.state))throw new h("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 FR}from"node:crypto";var ql=32*1024,Mf=1440*60*1e3,Ul=256,LR=["delivered","failed","cancelled"],Wl={type:"system",component:"orchestration-supervisor"};async function MR(e,t){if(GR(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>Mf)throw new h("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:Mf}});if(t.idempotencyKey!==void 0&&t.idempotencyKey!==null&&t.idempotencyKey.trim().length===0)throw new h("CLI_USAGE","Idempotency key cannot be empty.",{});if((t.idempotencyKey?.length??0)>Ul)throw new h("CLI_USAGE",`Idempotency key exceeds ${Ul} characters.`,{details:{maxIdempotencyKeyLength:Ul}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${FR()}`,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 Df(e,r);if(s.created)try{await vn(e,s.command,"command.queued")}catch(i){throw jf(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function jR(e,t){return{kind:"showPromptCommand",command:await bi(e,t)}}async function qR(e,t){let n=await Ge(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function UR(e,t,n){let r=!1,s=await ts(e,t,i=>{if(i.state==="cancelled")return i;let o=Lf(i,n??i.actor);return r=!0,o});if(r)try{await vn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw jf(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function WR(e,t){let n=await ts(e,t,r=>xf(r));return await vn(e,n,"command.delivering",Wl),n}async function BR(e,t){let n=await ts(e,t,r=>_f(r));return await vn(e,n,"command.delivered",Wl),n}async function VR(e,t,n){let r=await ts(e,t,s=>Ff(s,n));return await vn(e,r,"command.failed",Wl),r}async function KR(e,t,n){let r=[...n.states??LR],s=Date.now()+n.timeoutMs;for(;;){let i=await bi(e,t);if(r.includes(i.state))return{kind:"waitPromptCommand",command:i,matchedStates:r};if(n.signal?.aborted)throw new h("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 h("OPERATION_TIMEOUT",`Timed out after ${n.timeoutMs}ms waiting for command ${t}.`,{retryable:!0,details:{commandId:t,states:r,timeoutMs:n.timeoutMs}});await HR(Math.min(n.pollIntervalMs??100,o),n.signal)}}function GR(e){if(e.trim().length===0)throw new h("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>ql)throw new h("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 h("CLI_USAGE","Prompt contains unsupported control characters.",{})}async function vn(e,t,n,r=t.actor){await Ne(e,{id:`${t.id}:${n}`,taskId:t.taskId,agentTabId:t.agentTabId,commandId:t.id,type:n,occurredAt:n==="command.queued"?t.createdAt:n==="command.delivering"?t.deliveryStartedAt??t.updatedAt:n==="command.delivered"?t.deliveredAt??t.updatedAt:n==="command.cancelled"?t.cancelledAt??t.updatedAt:t.updatedAt,actor:r,data:{state:t.state,delivery:t.delivery,attempts:t.attempts,errorCode:t.lastError?.code??null,deliveryUncertain:t.lastError?.deliveryUncertain??!1}})}function HR(e,t){return t?.aborted?Promise.resolve():new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var jf=(e,t)=>new h("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}),ue={create:MR,show:jR,list:qR,cancel:UR,wait:KR,beginDelivery:WR,completeDelivery:BR,fail:VR};import{randomUUID as Uf,timingSafeEqual as YR}from"node:crypto";import{mkdir as zR,readFile as JR,readdir as XR}from"node:fs/promises";import Wf from"node:path";var QR=10080*60*1e3,ZR={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},eS=["task.create-child","task.children","task.cancel-tree"],tS=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function Xe(e,t,n={type:"system",component:"orchestration-supervisor"},r){let s=t.ptyTabs.find(o=>o.kind==="agent"&&(!r||o.id===r));if(!s)return{};let i=null;if(await zR(Gl(e),{recursive:!0,mode:448}),await W(e,t.id,async o=>{let a=o.ptyTabs.find(d=>d.id===s.id&&d.kind==="agent");if(!a)throw new h("CAPABILITY_DENIED",`Agent tab ${s.id} no longer exists.`,{});let l=a.capabilityId??`capability_${Uf()}`,c=await Si(e,l);if(c&&(c.taskId!==o.id||c.agentTabId!==a.id))throw new h("CAPABILITY_DENIED",`Capability ${l} is bound to another agent.`,{details:{capabilityId:l,taskId:o.id,agentTabId:a.id}});return i=(c??await nS(e,l,o.id,a.id,n)).token,a.capabilityId?o:{...o,ptyTabs:o.ptyTabs.map(d=>d.id===a.id?{...d,capabilityId:l}:d)}}),!i)throw new h("INTERNAL_ERROR",`Failed to issue a capability for ${s.id}.`,{});return{CRAIG_AGENT_CAPABILITY:i}}async function nS(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${Uf()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...eS],targetPolicy:"children-only",limits:{...ZR},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+QR).toISOString(),revokedAt:null,revokedBy:null};return await M(Hl(e,o.id),o,{mode:384}),o}async function He(e,t,n,r){let s=await sS(e,t);return s.revokedAt&&Cn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&Cn(s.id,"expired"),!tS.has(n)&&!s.allowedCommandFamilies.includes(n)&&Cn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await rS(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 rS(e,t,n){if(t===n)return!0;let r=(await R.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 Bf(e,t,n){let r=await Si(e,t);r&&(r.revokedAt||await M(Hl(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function Kl(e,t,n){let r=await XR(Gl(e)).catch(i=>Vf(i)?[]:Promise.reject(i)),s=[];for(let i of r){let o=/^(capability_[A-Za-z0-9-]+)\.json$/.exec(i);if(!o)continue;let a=await Si(e,o[1]);!a||!t.has(a.taskId)||(await Bf(e,a.id,n),s.push(a.id))}return s}async function sS(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 Si(e,r);if(!s)throw new h("CAPABILITY_NOT_FOUND",`Craig capability "${r}" was not found.`,{details:{capabilityId:r}});let i=Buffer.from(s.token),o=Buffer.from(t);return(i.length!==o.length||!YR(i,o))&&Cn(r,"token is invalid"),s}async function Si(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||Cn(t,"identifier is invalid");try{let n=JSON.parse(await JR(Hl(e,t),"utf8"));if(!iS(n,t))throw new h("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(Vf(n))return null;throw n}}function iS(e,t){if(!Vl(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"&&oS(r))&&e.targetPolicy==="children-only"&&Vl(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&Bl(e.createdAt)&&Bl(e.expiresAt)&&qf(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||Bl(e.revokedAt)&&qf(e.revokedBy))}function qf(e){return Vl(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 h("CAPABILITY_DENIED",`Craig capability ${e} was denied: ${t}.`,{details:{capabilityId:e,reason:t}})}var Gl=e=>Wf.join(e.orchestrationDir,"capabilities"),Hl=(e,t)=>Wf.join(Gl(e),`${t}.json`),oS=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),Vl=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Bl=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Vf=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as Kf,readFile as aS,rm as Yl,stat as lS,writeFile as cS}from"node:fs/promises";import zl from"node:path";var dS=20,uS=3e4,pS=5e3;async function Jl(e,t){let n=zl.join(e.runtimeDir,"delegation.lock");await Kf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Kf(n);try{await cS(zl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Yl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!gS(s))throw s;if(await fS(n))continue;if(Date.now()-r>=uS)throw new h("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,dS))}try{return await t()}finally{await Yl(n,{recursive:!0,force:!0})}}async function fS(e){let t=await aS(zl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&mS(t.pid))return!1;let n=await lS(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<pS?!1:(await Yl(e,{recursive:!0,force:!0}),!0)}function mS(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 gS=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var hS={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function Xl(e,t,n,r={}){let s=await k.load(e);return k.previews.isEnabled(s,"agentOrchestration")?R.createTask(e,t,n,{...r,onProvisioned:async i=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:i.id,CRAIG_AGENT_TAB_ID:i.ptyTabs.find(o=>o.kind==="agent")?.id??"",...await Xe(e,i,{type:"human",source:"cli",processId:process.pid})})}):R.createTask(e,t,n,r)}async function Ql(e,t,n={}){return Jl(e,async()=>{let r=await R.getTask(e,t.parentTaskId),s=t.capabilityId?await He(e,t.capabilityId,"task.create-child",r.id):null,i=s?.actor??{type:"human",source:"cli",processId:process.pid},o=s?.capability.limits??hS,a=t.prompt.trim();if(a.length===0)throw new h("CLI_USAGE","Child task prompt cannot be empty.",{});if(Buffer.byteLength(a)>o.maxPromptBytes&&Pi("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&Pi("delegation depth",o.maxDepth),!new Set([r.repoId,...r.linkedRepoIds,...(r.repoTargets??[]).map(f=>f.repoId)]).has(t.repoId))throw new h("CAPABILITY_DENIED",`Repo ${t.repoId} is outside parent task ${r.id}.`,{details:{parentTaskId:r.id,repoId:t.repoId}});let u=(await R.listTasks(e,{includeClosed:!0})).tasks.filter(f=>f.parentTaskId===r.id),d=t.idempotencyKey?.trim()||null;if(d){if(d.length>256)throw new h("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let f=u.find(y=>y.delegationIdempotencyKey===d);if(f){if(f.repoId!==t.repoId||f.prompt.value!==a||t.runner&&f.runner!==t.runner)throw new h("COMMAND_STATE_CONFLICT",`Idempotency key "${d}" is already used by child ${f.id}.`,{details:{idempotencyKey:d,taskId:f.id}});return Gf(f,!0)}}u.length>=o.maxChildren&&Pi("children",o.maxChildren),u.filter(f=>f.status!=="closed"&&f.status!=="merged").length>=o.maxConcurrentChildren&&Pi("concurrent children",o.maxConcurrentChildren);let m=await(n.createTask??R.createTask)(e,t.repoId,a,{...t.runner?{runner:t.runner}:{},lineage:{parentTaskId:r.id,rootTaskId:r.rootTaskId,delegationDepth:r.delegationDepth+1,delegationIdempotencyKey:d,furyRunId:t.fury?.runId??r.furyRunId,furyStepId:t.fury?.stepId??null},onProvisioned:async f=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:f.id,CRAIG_AGENT_TAB_ID:f.ptyTabs.find(y=>y.kind==="agent")?.id??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await Xe(e,f,i)})}),g=await R.getTask(e,m.taskId);try{await Ne(e,{workspaceId:g.workspaceId,taskId:g.id,agentTabId:i.type==="agent"?i.agentTabId:null,type:"task.child.created",actor:i,data:{parentTaskId:r.id,rootTaskId:g.rootTaskId,delegationDepth:g.delegationDepth}})}catch(f){throw new h("PARTIAL_RESULT",`Child ${g.id} was created, but its audit event could not be recorded.`,{details:{taskId:g.id,parentTaskId:r.id,persisted:!0},cause:f})}return Gf(g,!1)})}async function Zl(e,t,n){n&&await He(e,n,"task.children",t),await R.getTask(e,t);let r=(await R.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 ec(e,t,n){return Jl(e,async()=>{let s=(n?await He(e,n,"task.cancel-tree",t):null)?.actor??{type:"human",source:"cli",processId:process.pid};await R.getTask(e,t);let i=(await R.listTasks(e,{includeClosed:!0})).tasks,o=new Map(i.map(g=>[g.id,g])),a=new Map;for(let g of i)g.parentTaskId&&a.set(g.parentTaskId,[...a.get(g.parentTaskId)??[],g]);let l=[],c=new Set,u=g=>{if(c.has(g))throw new h("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${g}.`,{details:{taskId:g,rootTaskId:t}});let f=o.get(g);if(f){c.add(g),l.push(f);for(let y of(a.get(g)??[]).sort((T,S)=>T.id.localeCompare(S.id)))u(y.id)}};u(t);let d=[],p=[],m=[];try{await Kl(e,new Set(l.map(g=>g.id)),s)}catch{m.push(...l.map(g=>g.id))}for(let g of l){let f=g.status;if(f==="closed"){d.push({taskId:g.id,previousStatus:f,status:"closed",disposition:"already-closed"});continue}await R.cleanupTask(e,g,{preserveWorktree:!0});let y=await R.closeTask(e,g.id);d.push({taskId:g.id,previousStatus:f,status:y.status,disposition:"cancelled"});try{await Ne(e,{workspaceId:g.workspaceId,taskId:g.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:f}})}catch{p.push(g.id)}}if(p.length>0||m.length>0)throw new h("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:d,auditFailures:p,revocationFailures:m,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:d}})}function Gf(e,t){return{kind:"createChildTask",taskId:e.id,parentTaskId:e.parentTaskId,rootTaskId:e.rootTaskId,delegationDepth:e.delegationDepth,repoId:e.repoId,workspaceId:e.workspaceId,sessionId:e.sessionId,status:e.status,branch:e.branch,worktreePath:e.worktreePath,runner:e.runner,idempotentReplay:t}}function Pi(e,t){throw new h("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var Ii=Symbol.for("yaml.alias"),vi=Symbol.for("yaml.document"),Qe=Symbol.for("yaml.map"),tc=Symbol.for("yaml.pair"),xe=Symbol.for("yaml.scalar"),Et=Symbol.for("yaml.seq"),Se=Symbol.for("yaml.node.type"),_e=e=>!!e&&typeof e=="object"&&e[Se]===Ii,ft=e=>!!e&&typeof e=="object"&&e[Se]===vi,Ze=e=>!!e&&typeof e=="object"&&e[Se]===Qe,q=e=>!!e&&typeof e=="object"&&e[Se]===tc,x=e=>!!e&&typeof e=="object"&&e[Se]===xe,et=e=>!!e&&typeof e=="object"&&e[Se]===Et;function B(e){if(e&&typeof e=="object")switch(e[Se]){case Qe:case Et:return!0}return!1}function U(e){if(e&&typeof e=="object")switch(e[Se]){case Ii:case Qe:case xe:case Et:return!0}return!1}var Ci=e=>(x(e)||B(e))&&!!e.anchor;var Ee=Symbol("break visit"),Hf=Symbol("skip children"),mt=Symbol("remove node");function Ye(e,t){let n=Yf(t);ft(e)?or(null,e.contents,n,Object.freeze([e]))===mt&&(e.contents=null):or(null,e,n,Object.freeze([]))}Ye.BREAK=Ee;Ye.SKIP=Hf;Ye.REMOVE=mt;function or(e,t,n,r){let s=zf(e,t,n,r);if(U(s)||q(s))return Jf(e,r,s),or(e,s,n,r);if(typeof s!="symbol"){if(B(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=or(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ee)return Ee;o===mt&&(t.items.splice(i,1),i-=1)}}}else if(q(t)){r=Object.freeze(r.concat(t));let i=or("key",t.key,n,r);if(i===Ee)return Ee;i===mt&&(t.key=null);let o=or("value",t.value,n,r);if(o===Ee)return Ee;o===mt&&(t.value=null)}}return s}async function Ai(e,t){let n=Yf(t);ft(e)?await ar(null,e.contents,n,Object.freeze([e]))===mt&&(e.contents=null):await ar(null,e,n,Object.freeze([]))}Ai.BREAK=Ee;Ai.SKIP=Hf;Ai.REMOVE=mt;async function ar(e,t,n,r){let s=await zf(e,t,n,r);if(U(s)||q(s))return Jf(e,r,s),ar(e,s,n,r);if(typeof s!="symbol"){if(B(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=await ar(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===Ee)return Ee;o===mt&&(t.items.splice(i,1),i-=1)}}}else if(q(t)){r=Object.freeze(r.concat(t));let i=await ar("key",t.key,n,r);if(i===Ee)return Ee;i===mt&&(t.key=null);let o=await ar("value",t.value,n,r);if(o===Ee)return Ee;o===mt&&(t.value=null)}}return s}function Yf(e){return typeof e=="object"&&(e.Collection||e.Node||e.Value)?Object.assign({Alias:e.Node,Map:e.Node,Scalar:e.Node,Seq:e.Node},e.Value&&{Map:e.Value,Scalar:e.Value,Seq:e.Value},e.Collection&&{Map:e.Collection,Seq:e.Collection},e):e}function zf(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(Ze(t))return n.Map?.(e,t,r);if(et(t))return n.Seq?.(e,t,r);if(q(t))return n.Pair?.(e,t,r);if(x(t))return n.Scalar?.(e,t,r);if(_e(t))return n.Alias?.(e,t,r)}function Jf(e,t,n){let r=t[t.length-1];if(B(r))r.items[e]=n;else if(q(r))e==="key"?r.key=n:r.value=n;else if(ft(r))r.contents=n;else{let s=_e(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var yS={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},wS=e=>e.replace(/[!,[\]{}]/g,t=>yS[t]),gt=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+wS(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={};Ye(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(`
81
+ `)}};gt.defaultYaml={explicit:!1,version:"1.2"};gt.defaultTags={"!!":"tag:yaml.org,2002:"};function Ei(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 nc(e){let t=new Set;return Ye(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function rc(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function Xf(e,t){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=nc(e));let o=rc(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)||B(o.node)))o.node.anchor=o.anchor;else{let a=new Error("Failed to resolve repeated object (this should not happen)");throw a.source=i,a}}},sourceObjects:r}}function Jt(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=Jt(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=Jt(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=Jt(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=Jt(e,r,s,i);o===void 0?delete r[s]:o!==i&&(r[s]=o)}return e.call(t,n,r)}function ae(e,t,n){if(Array.isArray(e))return e.map((r,s)=>ae(r,String(s),n));if(e&&typeof e.toJSON=="function"){if(!n||!Ci(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 Xt=class{constructor(t){Object.defineProperty(this,Se,{value:t})}clone(){let t=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(t.range=this.range.slice()),t}toJS(t,{mapAsMap:n,maxAliasCount:r,onAnchor:s,reviver:i}={}){if(!ft(t))throw new TypeError("A document argument is required");let o={anchors:new Map,doc:t,keep:!0,mapAsMap:n===!0,mapKeyWarned:!1,maxAliasCount:typeof r=="number"?r:100},a=ae(this,"",o);if(typeof s=="function")for(let{count:l,res:c}of o.anchors.values())s(c,l);return typeof i=="function"?Jt(i,{"":a},"",a):a}};var Ot=class extends Xt{constructor(t){super(Ii),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=[],Ye(t,{Node:(i,o)=>{(_e(o)||Ci(o))&&r.push(o)}}),n&&(n.aliasResolveCache=r));let s;for(let i of r){if(i===this)break;i.anchor===this.source&&(s=i)}return s}toJSON(t,n){if(!n)return{source:this.source};let{anchors:r,doc:s,maxAliasCount:i}=n,o=this.resolve(s,n);if(!o){let l=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(l)}let a=r.get(o);if(a||(ae(o,null,n),a=r.get(o)),a?.res===void 0){let l="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(l)}if(i>=0&&(a.count+=1,a.aliasCount===0&&(a.aliasCount=Oi(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(Ei(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 Oi(e,t,n){if(_e(t)){let r=t.resolve(e),s=n&&r&&n.get(r);return s?s.count*s.aliasCount:0}else if(B(t)){let r=0;for(let s of t.items){let i=Oi(e,s,n);i>r&&(r=i)}return r}else if(q(t)){let r=Oi(e,t.key,n),s=Oi(e,t.value,n);return Math.max(r,s)}return 1}var $i=e=>!e||typeof e!="function"&&typeof e!="object",O=class extends Xt{constructor(t){super(xe),this.value=t}toJSON(t,n){return n?.keep?this.value:ae(this.value,t,n)}toString(){return String(this.value)}};O.BLOCK_FOLDED="BLOCK_FOLDED";O.BLOCK_LITERAL="BLOCK_LITERAL";O.PLAIN="PLAIN";O.QUOTE_DOUBLE="QUOTE_DOUBLE";O.QUOTE_SINGLE="QUOTE_SINGLE";var kS="tag:yaml.org,2002:";function TS(e,t,n){if(t){let r=n.filter(i=>i.tag===t),s=r.find(i=>!i.format)??r[0];if(!s)throw new Error(`Tag ${t} not found`);return s}return n.find(r=>r.identify?.(e)&&!r.format)}function $t(e,t,n){if(ft(e)&&(e=e.contents),U(e))return e;if(q(e)){let d=n.schema[Qe].createNode?.(n.schema,null,n);return d.items.push(e),d}(e instanceof String||e instanceof Number||e instanceof Boolean||typeof BigInt<"u"&&e instanceof BigInt)&&(e=e.valueOf());let{aliasDuplicateObjects:r,onAnchor:s,onTagObj:i,schema:o,sourceObjects:a}=n,l;if(r&&e&&typeof e=="object"){if(l=a.get(e),l)return l.anchor??(l.anchor=s(e)),new Ot(l.anchor);l={anchor:null,node:null},a.set(e,l)}t?.startsWith("!!")&&(t=kS+t.slice(2));let c=TS(e,t,o.tags);if(!c){if(e&&typeof e.toJSON=="function"&&(e=e.toJSON()),!e||typeof e!="object"){let d=new O(e);return l&&(l.node=d),d}c=e instanceof Map?o[Qe]:Symbol.iterator in Object(e)?o[Et]:o[Qe]}i&&(i(c),delete n.onTagObj);let u=c?.createNode?c.createNode(n.schema,e,n):typeof c?.nodeClass?.from=="function"?c.nodeClass.from(n.schema,e,n):new O(e);return t?u.tag=t:c.default||(u.tag=c.tag),l&&(l.node=u),u}function ns(e,t,n){let r=n;for(let s=t.length-1;s>=0;--s){let i=t[s];if(typeof i=="number"&&Number.isInteger(i)&&i>=0){let o=[];o[i]=r,r=o}else r=new Map([[i,r]])}return $t(r,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:e,sourceObjects:new Map})}var cr=e=>e==null||typeof e=="object"&&!!e[Symbol.iterator]().next().done,lr=class extends Xt{constructor(t,n){super(t),Object.defineProperty(this,"schema",{value:n,configurable:!0,enumerable:!1,writable:!0})}clone(t){let n=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return t&&(n.schema=t),n.items=n.items.map(r=>U(r)||q(r)?r.clone(t):r),this.range&&(n.range=this.range.slice()),n}addIn(t,n){if(cr(t))this.add(n);else{let[r,...s]=t,i=this.get(r,!0);if(B(i))i.addIn(s,n);else if(i===void 0&&this.schema)this.set(r,ns(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}deleteIn(t){let[n,...r]=t;if(r.length===0)return this.delete(n);let s=this.get(n,!0);if(B(s))return s.deleteIn(r);throw new Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}getIn(t,n){let[r,...s]=t,i=this.get(r,!0);return s.length===0?!n&&x(i)?i.value:i:B(i)?i.getIn(s,n):void 0}hasAllNullValues(t){return this.items.every(n=>{if(!q(n))return!1;let r=n.value;return r==null||t&&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 B(s)?s.hasIn(r):!1}setIn(t,n){let[r,...s]=t;if(s.length===0)this.set(r,n);else{let i=this.get(r,!0);if(B(i))i.setIn(s,n);else if(i===void 0&&this.schema)this.set(r,ns(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};var Qf=e=>e.replace(/^(?!$)(?: $)?/gm,"#");function ze(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var ht=(e,t,n)=>e.endsWith(`
82
82
  `)?ze(n,t):n.includes(`
83
83
  `)?`
84
- `+ze(n,t):(e.endsWith(" ")?"":" ")+n;var rc="flow",Ni="block",rs="quoted";function ss(e,t,n="flow",{indentAtStart:r,lineWidth:s=80,minContentWidth:i=20,onFold:o,onOverflow:a}={}){if(!s||s<0)return e;s<i&&(i=0);let l=Math.max(1+i,1+s-t.length);if(e.length<=l)return e;let c=[],u={},d=s-t.length;typeof r=="number"&&(r>s-Math.max(2,i)?c.push(0):d=s-r);let p,h,f=!1,m=-1,y=-1,T=-1;n===Ni&&(m=Jf(e,m,t.length),m!==-1&&(d=m+l));for(let v;v=e[m+=1];){if(n===rs&&v==="\\"){switch(y=m,e[m+1]){case"x":m+=3;break;case"u":m+=5;break;case"U":m+=9;break;default:m+=1}T=m}if(v===`
85
- `)n===Ni&&(m=Jf(e,m,t.length)),d=m+t.length+l,p=void 0;else{if(v===" "&&h&&h!==" "&&h!==`
86
- `&&h!==" "){let b=e[m+1];b&&b!==" "&&b!==`
87
- `&&b!==" "&&(p=m)}if(m>=d)if(p)c.push(p),d=p+l,p=void 0;else if(n===rs){for(;h===" "||h===" ";)h=v,v=e[m+=1],f=!0;let b=m>T+1?m-2:y-1;if(u[b])return e;c.push(b),u[b]=!0,d=b+l,p=void 0}else f=!0}h=v}if(f&&a&&a(),c.length===0)return e;o&&o();let R=e.slice(0,c[0]);for(let v=0;v<c.length;++v){let b=c[v],$=c[v+1]||e.length;b===0?R=`
88
- ${t}${e.slice(0,$)}`:(n===rs&&u[b]&&(R+=`${e[b]}\\`),R+=`
89
- ${t}${e.slice(b+1,$)}`)}return R}function Jf(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!==`
90
- `);r=t,s=t+1,i=e[s]}return r}var xi=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),_i=e=>/^(%|---|\.\.\.)/m.test(e);function wS(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]===`
84
+ `+ze(n,t):(e.endsWith(" ")?"":" ")+n;var sc="flow",Di="block",rs="quoted";function ss(e,t,n="flow",{indentAtStart:r,lineWidth:s=80,minContentWidth:i=20,onFold:o,onOverflow:a}={}){if(!s||s<0)return e;s<i&&(i=0);let l=Math.max(1+i,1+s-t.length);if(e.length<=l)return e;let c=[],u={},d=s-t.length;typeof r=="number"&&(r>s-Math.max(2,i)?c.push(0):d=s-r);let p,m,g=!1,f=-1,y=-1,T=-1;n===Di&&(f=Zf(e,f,t.length),f!==-1&&(d=f+l));for(let v;v=e[f+=1];){if(n===rs&&v==="\\"){switch(y=f,e[f+1]){case"x":f+=3;break;case"u":f+=5;break;case"U":f+=9;break;default:f+=1}T=f}if(v===`
85
+ `)n===Di&&(f=Zf(e,f,t.length)),d=f+t.length+l,p=void 0;else{if(v===" "&&m&&m!==" "&&m!==`
86
+ `&&m!==" "){let b=e[f+1];b&&b!==" "&&b!==`
87
+ `&&b!==" "&&(p=f)}if(f>=d)if(p)c.push(p),d=p+l,p=void 0;else if(n===rs){for(;m===" "||m===" ";)m=v,v=e[f+=1],g=!0;let b=f>T+1?f-2:y-1;if(u[b])return e;c.push(b),u[b]=!0,d=b+l,p=void 0}else g=!0}m=v}if(g&&a&&a(),c.length===0)return e;o&&o();let S=e.slice(0,c[0]);for(let v=0;v<c.length;++v){let b=c[v],$=c[v+1]||e.length;b===0?S=`
88
+ ${t}${e.slice(0,$)}`:(n===rs&&u[b]&&(S+=`${e[b]}\\`),S+=`
89
+ ${t}${e.slice(b+1,$)}`)}return S}function Zf(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!==`
90
+ `);r=t,s=t+1,i=e[s]}return r}var xi=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),_i=e=>/^(%|---|\.\.\.)/m.test(e);function bS(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]===`
91
91
  `){if(i-o>r)return!0;if(o=i+1,s-o<=r)return!1}return!0}function is(e,t){let n=JSON.stringify(e);if(t.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=t,s=t.options.doubleQuotedMinMultiLineLength,i=t.indent||(_i(e)?" ":""),o="",a=0;for(let l=0,c=n[l];c;c=n[++l])if(c===" "&&n[l+1]==="\\"&&n[l+2]==="n"&&(o+=n.slice(a,l)+"\\ ",l+=1,a=l,c="\\"),c==="\\")switch(n[l+1]){case"u":{o+=n.slice(a,l);let u=n.substr(l+2,4);switch(u){case"0000":o+="\\0";break;case"0007":o+="\\a";break;case"000b":o+="\\v";break;case"001b":o+="\\e";break;case"0085":o+="\\N";break;case"00a0":o+="\\_";break;case"2028":o+="\\L";break;case"2029":o+="\\P";break;default:u.substr(0,2)==="00"?o+="\\x"+u.substr(2):o+=n.substr(l,6)}l+=5,a=l+1}break;case"n":if(r||n[l+2]==='"'||n.length<s)l+=1;else{for(o+=n.slice(a,l)+`
92
92
 
93
93
  `;n[l+2]==="\\"&&n[l+3]==="n"&&n[l+4]!=='"';)o+=`
94
- `,l+=2;o+=i,n[l+2]===" "&&(o+="\\"),l+=1,a=l+1}break;default:l+=1}return o=a?o+n.slice(a):n,r?o:ss(o,i,rs,xi(t,!1))}function sc(e,t){if(t.options.singleQuote===!1||t.implicitKey&&e.includes(`
94
+ `,l+=2;o+=i,n[l+2]===" "&&(o+="\\"),l+=1,a=l+1}break;default:l+=1}return o=a?o+n.slice(a):n,r?o:ss(o,i,rs,xi(t,!1))}function ic(e,t){if(t.options.singleQuote===!1||t.implicitKey&&e.includes(`
95
95
  `)||/[ \t]\n|\n[ \t]/.test(e))return is(e,t);let n=t.indent||(_i(e)?" ":""),r="'"+e.replace(/'/g,"''").replace(/\n+/g,`$&
96
- ${n}`)+"'";return t.implicitKey?r:ss(r,n,rc,xi(t,!1))}function dr(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=is;else{let s=e.includes('"'),i=e.includes("'");s&&!i?r=sc:i&&!s?r=is:r=n?sc:is}return r(e,t)}var ic;try{ic=new RegExp(`(^|(?<!
96
+ ${n}`)+"'";return t.implicitKey?r:ss(r,n,sc,xi(t,!1))}function dr(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=is;else{let s=e.includes('"'),i=e.includes("'");s&&!i?r=ic:i&&!s?r=is:r=n?ic:is}return r(e,t)}var oc;try{oc=new RegExp(`(^|(?<!
97
97
  ))
98
98
  +(?!
99
- |$)`,"g")}catch{ic=/\n+(?!\n|$)/g}function Di({comment:e,type:t,value:n},r,s,i){let{blockQuote:o,commentString:a,lineWidth:l}=r.options;if(!o||/\n[\t ]+$/.test(n))return dr(n,r);let c=r.indent||(r.forceBlockIndent||_i(n)?" ":""),u=o==="literal"?!0:o==="folded"||t===O.BLOCK_FOLDED?!1:t===O.BLOCK_LITERAL?!0:!wS(n,l,c.length);if(!n)return u?`|
99
+ |$)`,"g")}catch{oc=/\n+(?!\n|$)/g}function Ni({comment:e,type:t,value:n},r,s,i){let{blockQuote:o,commentString:a,lineWidth:l}=r.options;if(!o||/\n[\t ]+$/.test(n))return dr(n,r);let c=r.indent||(r.forceBlockIndent||_i(n)?" ":""),u=o==="literal"?!0:o==="folded"||t===O.BLOCK_FOLDED?!1:t===O.BLOCK_LITERAL?!0:!bS(n,l,c.length);if(!n)return u?`|
100
100
  `:`>
101
101
  `;let d,p;for(p=n.length;p>0;--p){let $=n[p-1];if($!==`
102
- `&&$!==" "&&$!==" ")break}let h=n.substring(p),f=h.indexOf(`
103
- `);f===-1?d="-":n===h||f!==h.length-1?(d="+",i&&i()):d="",h&&(n=n.slice(0,-h.length),h[h.length-1]===`
104
- `&&(h=h.slice(0,-1)),h=h.replace(ic,`$&${c}`));let m=!1,y,T=-1;for(y=0;y<n.length;++y){let $=n[y];if($===" ")m=!0;else if($===`
105
- `)T=y;else break}let R=n.substring(0,T<y?T+1:y);R&&(n=n.substring(R.length),R=R.replace(/\n+/g,`$&${c}`));let b=(m?c?"2":"1":"")+d;if(e&&(b+=" "+a(e.replace(/ ?[\r\n]+/g," ")),s&&s()),!u){let $=n.replace(/\n+/g,`
106
- $&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),N=!1,_=xi(r,!0);o!=="folded"&&t!==O.BLOCK_FOLDED&&(_.onOverflow=()=>{N=!0});let C=ss(`${R}${$}${h}`,c,Ni,_);if(!N)return`>${b}
102
+ `&&$!==" "&&$!==" ")break}let m=n.substring(p),g=m.indexOf(`
103
+ `);g===-1?d="-":n===m||g!==m.length-1?(d="+",i&&i()):d="",m&&(n=n.slice(0,-m.length),m[m.length-1]===`
104
+ `&&(m=m.slice(0,-1)),m=m.replace(oc,`$&${c}`));let f=!1,y,T=-1;for(y=0;y<n.length;++y){let $=n[y];if($===" ")f=!0;else if($===`
105
+ `)T=y;else break}let S=n.substring(0,T<y?T+1:y);S&&(n=n.substring(S.length),S=S.replace(/\n+/g,`$&${c}`));let b=(f?c?"2":"1":"")+d;if(e&&(b+=" "+a(e.replace(/ ?[\r\n]+/g," ")),s&&s()),!u){let $=n.replace(/\n+/g,`
106
+ $&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),D=!1,_=xi(r,!0);o!=="folded"&&t!==O.BLOCK_FOLDED&&(_.onOverflow=()=>{D=!0});let C=ss(`${S}${$}${m}`,c,Di,_);if(!D)return`>${b}
107
107
  ${c}${C}`}return n=n.replace(/\n+/g,`$&${c}`),`|${b}
108
- ${c}${R}${n}${h}`}function kS(e,t,n,r){let{type:s,value:i}=e,{actualString:o,implicitKey:a,indent:l,indentStep:c,inFlow:u}=t;if(a&&i.includes(`
108
+ ${c}${S}${n}${m}`}function RS(e,t,n,r){let{type:s,value:i}=e,{actualString:o,implicitKey:a,indent:l,indentStep:c,inFlow:u}=t;if(a&&i.includes(`
109
109
  `)||u&&/[[\]{},]/.test(i))return dr(i,t);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(i))return a||u||!i.includes(`
110
- `)?dr(i,t):Di(e,t,n,r);if(!a&&!u&&s!==O.PLAIN&&i.includes(`
111
- `))return Di(e,t,n,r);if(_i(i)){if(l==="")return t.forceBlockIndent=!0,Di(e,t,n,r);if(a&&l===c)return dr(i,t)}let d=i.replace(/\n+/g,`$&
112
- ${l}`);if(o){let p=m=>m.default&&m.tag!=="tag:yaml.org,2002:str"&&m.test?.test(d),{compat:h,tags:f}=t.doc.schema;if(f.some(p)||h?.some(p))return dr(i,t)}return a?d:ss(d,l,rc,xi(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=u=>{switch(u){case O.BLOCK_FOLDED:case O.BLOCK_LITERAL:return s||i?dr(o.value,t):Di(o,t,n,r);case O.QUOTE_DOUBLE:return is(o.value,t);case O.QUOTE_SINGLE:return sc(o.value,t);case O.PLAIN:return kS(o,t,n,r);default:return null}},c=l(a);if(c===null){let{defaultKeyType:u,defaultStringType:d}=t.options,p=s&&u||d;if(c=l(p),c===null)throw new Error(`Unsupported default string type ${p}`)}return c}function Fi(e,t){let n=Object.assign({blockQuote:!0,commentString:zf,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 TS(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 bS(e,t,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(x(e)||B(e))&&e.anchor;i&&Ei(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 Nt(e,t,n,r){if(q(e))return e.toString(t,n,r);if(_e(e)){if(t.doc.directives)return e.toString(t);if(t.resolvedAliases?.has(e))throw new TypeError("Cannot stringify circular structure without alias nodes");t.resolvedAliases?t.resolvedAliases.add(e):t.resolvedAliases=new Set([e]),e=e.resolve(t.doc)}let s,i=U(e)?e:t.doc.createNode(e,{onTagObj:l=>s=l});s??(s=TS(t.doc.schema.tags,i));let o=bS(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}
113
- ${t.indent}${a}`:a}function Xf({key:e,value:t},n,r,s){let{allNullValues:i,doc:o,indent:a,indentStep:l,options:{commentString:c,indentSeq:u,simpleKeys:d}}=n,p=U(e)&&e.comment||null;if(d){if(p)throw new Error("With simple keys, key nodes cannot have comments");if(B(e)||!U(e)&&typeof e=="object"){let _="With simple keys, collection cannot be used as a key value";throw new Error(_)}}let h=!d&&(!e||p&&t==null&&!n.inFlow||B(e)||(x(e)?e.type===O.BLOCK_FOLDED||e.type===O.BLOCK_LITERAL:typeof e=="object"));n=Object.assign({},n,{allNullValues:!1,implicitKey:!h&&(d||!i),indent:a+l});let f=!1,m=!1,y=Nt(e,n,()=>f=!0,()=>m=!0);if(!h&&!n.inFlow&&y.length>1024){if(d)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");h=!0}if(n.inFlow){if(i||t==null)return f&&r&&r(),y===""?"?":h?`? ${y}`:y}else if(i&&!d||t==null&&h)return y=`? ${y}`,p&&!f?y+=ht(y,n.indent,c(p)):m&&s&&s(),y;f&&(p=null),h?(p&&(y+=ht(y,n.indent,c(p))),y=`? ${y}
114
- ${a}:`):(y=`${y}:`,p&&(y+=ht(y,n.indent,c(p))));let T,R,v;U(t)?(T=!!t.spaceBefore,R=t.commentBefore,v=t.comment):(T=!1,R=null,v=null,t&&typeof t=="object"&&(t=o.createNode(t))),n.implicitKey=!1,!h&&!p&&x(t)&&(n.indentAtStart=y.length+1),m=!1,!u&&l.length>=2&&!n.inFlow&&!h&&et(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let b=!1,$=Nt(t,n,()=>b=!0,()=>m=!0),N=" ";if(p||T||R){if(N=T?`
115
- `:"",R){let _=c(R);N+=`
116
- ${ze(_,n.indent)}`}$===""&&!n.inFlow?N===`
117
- `&&v&&(N=`
110
+ `)?dr(i,t):Ni(e,t,n,r);if(!a&&!u&&s!==O.PLAIN&&i.includes(`
111
+ `))return Ni(e,t,n,r);if(_i(i)){if(l==="")return t.forceBlockIndent=!0,Ni(e,t,n,r);if(a&&l===c)return dr(i,t)}let d=i.replace(/\n+/g,`$&
112
+ ${l}`);if(o){let p=f=>f.default&&f.tag!=="tag:yaml.org,2002:str"&&f.test?.test(d),{compat:m,tags:g}=t.doc.schema;if(g.some(p)||m?.some(p))return dr(i,t)}return a?d:ss(d,l,sc,xi(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=u=>{switch(u){case O.BLOCK_FOLDED:case O.BLOCK_LITERAL:return s||i?dr(o.value,t):Ni(o,t,n,r);case O.QUOTE_DOUBLE:return is(o.value,t);case O.QUOTE_SINGLE:return ic(o.value,t);case O.PLAIN:return RS(o,t,n,r);default:return null}},c=l(a);if(c===null){let{defaultKeyType:u,defaultStringType:d}=t.options,p=s&&u||d;if(c=l(p),c===null)throw new Error(`Unsupported default string type ${p}`)}return c}function Fi(e,t){let n=Object.assign({blockQuote:!0,commentString:Qf,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 SS(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 PS(e,t,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(x(e)||B(e))&&e.anchor;i&&Ei(i)&&(n.add(i),s.push(`&${i}`));let o=e.tag??(t.default?null:t.tag);return o&&s.push(r.directives.tagString(o)),s.join(" ")}function Dt(e,t,n,r){if(q(e))return e.toString(t,n,r);if(_e(e)){if(t.doc.directives)return e.toString(t);if(t.resolvedAliases?.has(e))throw new TypeError("Cannot stringify circular structure without alias nodes");t.resolvedAliases?t.resolvedAliases.add(e):t.resolvedAliases=new Set([e]),e=e.resolve(t.doc)}let s,i=U(e)?e:t.doc.createNode(e,{onTagObj:l=>s=l});s??(s=SS(t.doc.schema.tags,i));let o=PS(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}
113
+ ${t.indent}${a}`:a}function em({key:e,value:t},n,r,s){let{allNullValues:i,doc:o,indent:a,indentStep:l,options:{commentString:c,indentSeq:u,simpleKeys:d}}=n,p=U(e)&&e.comment||null;if(d){if(p)throw new Error("With simple keys, key nodes cannot have comments");if(B(e)||!U(e)&&typeof e=="object"){let _="With simple keys, collection cannot be used as a key value";throw new Error(_)}}let m=!d&&(!e||p&&t==null&&!n.inFlow||B(e)||(x(e)?e.type===O.BLOCK_FOLDED||e.type===O.BLOCK_LITERAL:typeof e=="object"));n=Object.assign({},n,{allNullValues:!1,implicitKey:!m&&(d||!i),indent:a+l});let g=!1,f=!1,y=Dt(e,n,()=>g=!0,()=>f=!0);if(!m&&!n.inFlow&&y.length>1024){if(d)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");m=!0}if(n.inFlow){if(i||t==null)return g&&r&&r(),y===""?"?":m?`? ${y}`:y}else if(i&&!d||t==null&&m)return y=`? ${y}`,p&&!g?y+=ht(y,n.indent,c(p)):f&&s&&s(),y;g&&(p=null),m?(p&&(y+=ht(y,n.indent,c(p))),y=`? ${y}
114
+ ${a}:`):(y=`${y}:`,p&&(y+=ht(y,n.indent,c(p))));let T,S,v;U(t)?(T=!!t.spaceBefore,S=t.commentBefore,v=t.comment):(T=!1,S=null,v=null,t&&typeof t=="object"&&(t=o.createNode(t))),n.implicitKey=!1,!m&&!p&&x(t)&&(n.indentAtStart=y.length+1),f=!1,!u&&l.length>=2&&!n.inFlow&&!m&&et(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let b=!1,$=Dt(t,n,()=>b=!0,()=>f=!0),D=" ";if(p||T||S){if(D=T?`
115
+ `:"",S){let _=c(S);D+=`
116
+ ${ze(_,n.indent)}`}$===""&&!n.inFlow?D===`
117
+ `&&v&&(D=`
118
118
 
119
- `):N+=`
120
- ${n.indent}`}else if(!h&&B(t)){let _=$[0],C=$.indexOf(`
121
- `),w=C!==-1,ge=n.inFlow??t.flow??t.items.length===0;if(w||!ge){let ye=!1;if(w&&(_==="&"||_==="!")){let Y=$.indexOf(" ");_==="&"&&Y!==-1&&Y<C&&$[Y+1]==="!"&&(Y=$.indexOf(" ",Y+1)),(Y===-1||C<Y)&&(ye=!0)}ye||(N=`
119
+ `):D+=`
120
+ ${n.indent}`}else if(!m&&B(t)){let _=$[0],C=$.indexOf(`
121
+ `),w=C!==-1,he=n.inFlow??t.flow??t.items.length===0;if(w||!he){let ye=!1;if(w&&(_==="&"||_==="!")){let Y=$.indexOf(" ");_==="&"&&Y!==-1&&Y<C&&$[Y+1]==="!"&&(Y=$.indexOf(" ",Y+1)),(Y===-1||C<Y)&&(ye=!0)}ye||(D=`
122
122
  ${n.indent}`)}}else($===""||$[0]===`
123
- `)&&(N="");return y+=N+$,n.inFlow?b&&r&&r():v&&!b?y+=ht(y,n.indent,c(v)):m&&s&&s(),y}function oc(e,t){(e==="debug"||e==="warn")&&console.warn(t)}var Li="<<",tt={identify:e=>e===Li||typeof e=="symbol"&&e.description===Li,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new O(Symbol(Li)),{addToJSMap:lc}),stringify:()=>Li},Qf=(e,t)=>(tt.identify(t)||x(t)&&(!t.type||t.type===O.PLAIN)&&tt.identify(t.value))&&e?.doc.schema.tags.some(n=>n.tag===tt.tag&&n.default);function lc(e,t,n){let r=Zf(e,n);if(et(r))for(let s of r.items)ac(e,t,s);else if(Array.isArray(r))for(let s of r)ac(e,t,s);else ac(e,t,r)}function ac(e,t,n){let r=Zf(e,n);if(!Ze(r))throw new Error("Merge sources must be maps or map aliases");let s=r.toJSON(null,e,Map);for(let[i,o]of s)t instanceof Map?t.has(i)||t.set(i,o):t instanceof Set?t.add(i):Object.prototype.hasOwnProperty.call(t,i)||Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0});return t}function Zf(e,t){return e&&_e(t)?t.resolve(e.doc,e):t}function Mi(e,t,{key:n,value:r}){if(U(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(Qf(e,n))lc(e,t,r);else{let s=ae(n,"",e);if(t instanceof Map)t.set(s,ae(r,s,e));else if(t instanceof Set)t.add(s);else{let i=RS(n,s,e),o=ae(r,i,e);i in t?Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0}):t[i]=o}}return t}function RS(e,t,n){if(t===null)return"";if(typeof t!="object")return String(t);if(U(e)&&n?.doc){let r=Fi(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)+'..."'),oc(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 ur(e,t,n){let r=$t(e,void 0,n),s=$t(t,void 0,n);return new Q(r,s)}var Q=class e{constructor(t,n=null){Object.defineProperty(this,Se,{value:ec}),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 Mi(n,r,this)}toString(t,n,r){return t?.doc?Xf(this,t,n,r):JSON.stringify(this)}};function qi(e,t,n){return(t.inFlow??e.flow?PS:SS)(e,t,n)}function SS({comment:e,items:t},n,{blockItemPrefix:r,flowChars:s,itemIndent:i,onChompKeep:o,onComment:a}){let{indent:l,options:{commentString:c}}=n,u=Object.assign({},n,{indent:i,type:null}),d=!1,p=[];for(let f=0;f<t.length;++f){let m=t[f],y=null;if(U(m))!d&&m.spaceBefore&&p.push(""),ji(n,p,m.commentBefore,d),m.comment&&(y=m.comment);else if(q(m)){let R=U(m.key)?m.key:null;R&&(!d&&R.spaceBefore&&p.push(""),ji(n,p,R.commentBefore,d))}d=!1;let T=Nt(m,u,()=>y=null,()=>d=!0);y&&(T+=ht(T,i,c(y))),d&&y&&(d=!1),p.push(r+T)}let h;if(p.length===0)h=s.start+s.end;else{h=p[0];for(let f=1;f<p.length;++f){let m=p[f];h+=m?`
124
- ${l}${m}`:`
125
- `}}return e?(h+=`
126
- `+ze(c(e),l),a&&a()):d&&o&&o(),h}function PS({items:e},t,{flowChars:n,itemIndent:r}){let{indent:s,indentStep:i,flowCollectionPadding:o,options:{commentString:a}}=t;r+=i;let l=Object.assign({},t,{indent:r,inFlow:!0,type:null}),c=!1,u=0,d=[];for(let f=0;f<e.length;++f){let m=e[f],y=null;if(U(m))m.spaceBefore&&d.push(""),ji(t,d,m.commentBefore,!1),m.comment&&(y=m.comment);else if(q(m)){let R=U(m.key)?m.key:null;R&&(R.spaceBefore&&d.push(""),ji(t,d,R.commentBefore,!1),R.comment&&(c=!0));let v=U(m.value)?m.value:null;v?(v.comment&&(y=v.comment),v.commentBefore&&(c=!0)):m.value==null&&R?.comment&&(y=R.comment)}y&&(c=!0);let T=Nt(m,l,()=>y=null);c||(c=d.length>u||T.includes(`
127
- `)),f<e.length-1?T+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=d.reduce((R,v)=>R+v.length+2,2)+(T.length+2)>t.options.lineWidth)),c&&(T+=",")),y&&(T+=ht(T,r,a(y))),d.push(T),u=d.length}let{start:p,end:h}=n;if(d.length===0)return p+h;if(!c){let f=d.reduce((m,y)=>m+y.length+2,2);c=t.options.lineWidth>0&&f>t.options.lineWidth}if(c){let f=p;for(let m of d)f+=m?`
128
- ${i}${s}${m}`:`
129
- `;return`${f}
130
- ${s}${h}`}else return`${p}${o}${d.join(" ")}${o}${h}`}function ji({indent:e,options:{commentString:t}},n,r,s){if(r&&s&&(r=r.replace(/^\n+/,"")),r){let i=ze(t(r),e);n.push(i.trimStart())}}function Xt(e,t){let n=x(t)?t.value:t;for(let r of e)if(q(r)&&(r.key===t||r.key===n||x(r.key)&&r.key.value===n))return r}var te=class extends lr{static get tagName(){return"tag:yaml.org,2002:map"}constructor(t){super(Qe,t),this.items=[]}static from(t,n,r){let{keepUndefined:s,replacer:i}=r,o=new this(t),a=(l,c)=>{if(typeof i=="function")c=i.call(n,l,c);else if(Array.isArray(i)&&!i.includes(l))return;(c!==void 0||s)&&o.items.push(ur(l,c,r))};if(n instanceof Map)for(let[l,c]of n)a(l,c);else if(n&&typeof n=="object")for(let l of Object.keys(n))a(l,n[l]);return typeof t.sortMapEntries=="function"&&o.items.sort(t.sortMapEntries),o}add(t,n){let r;q(t)?r=t:!t||typeof t!="object"||!("key"in t)?r=new Q(t,t?.value):r=new Q(t.key,t.value);let s=Xt(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);x(s.value)&&$i(r.value)?s.value.value=r.value:s.value=r.value}else if(i){let o=this.items.findIndex(a=>i(r,a)<0);o===-1?this.items.push(r):this.items.splice(o,0,r)}else this.items.push(r)}delete(t){let n=Xt(this.items,t);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(t,n){let s=Xt(this.items,t)?.value;return(!n&&x(s)?s.value:s)??void 0}has(t){return!!Xt(this.items,t)}set(t,n){this.add(new Q(t,n),!0)}toJSON(t,n,r){let s=r?new r:n?.mapAsMap?new Map:{};n?.onCreate&&n.onCreate(s);for(let i of this.items)Mi(n,s,i);return s}toString(t,n,r){if(!t)return JSON.stringify(this);for(let s of this.items)if(!q(s))throw new Error(`Map items must all be pairs; found ${JSON.stringify(s)} instead`);return!t.allNullValues&&this.hasAllNullValues(!1)&&(t=Object.assign({},t,{allNullValues:!0})),qi(this,t,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:t.indent||"",onChompKeep:r,onComment:n})}};var nt={collection:"map",default:!0,nodeClass:te,tag:"tag:yaml.org,2002:map",resolve(e,t){return Ze(e)||t("Expected a mapping for this tag"),e},createNode:(e,t,n)=>te.from(e,t,n)};var Te=class extends lr{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(t){super(Et,t),this.items=[]}add(t){this.items.push(t)}delete(t){let n=Ui(t);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(t,n){let r=Ui(t);if(typeof r!="number")return;let s=this.items[r];return!n&&x(s)?s.value:s}has(t){let n=Ui(t);return typeof n=="number"&&n<this.items.length}set(t,n){let r=Ui(t);if(typeof r!="number")throw new Error(`Expected a valid index, not ${t}.`);let s=this.items[r];x(s)&&$i(n)?s.value=n:this.items[r]=n}toJSON(t,n){let r=[];n?.onCreate&&n.onCreate(r);let s=0;for(let i of this.items)r.push(ae(i,String(s++),n));return r}toString(t,n,r){return t?qi(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 Ui(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 rt={collection:"seq",default:!0,nodeClass:Te,tag:"tag:yaml.org,2002:seq",resolve(e,t){return et(e)||t("Expected a sequence for this tag"),e},createNode:(e,t,n)=>Te.from(e,t,n)};var Qt={identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify(e,t,n,r){return t=Object.assign({actualString:!0},t),An(e,t,n,r)}};var En={identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new O(null),stringify:({source:e},t)=>typeof e=="string"&&En.test.test(e)?e:t.options.nullStr};var os={identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:e=>new O(e[0]==="t"||e[0]==="T"),stringify({source:e,value:t},n){if(e&&os.test.test(e)){let r=e[0]==="t"||e[0]==="T";if(t===r)return e}return t?n.options.trueStr:n.options.falseStr}};function be({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 Wi={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:be},Bi={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():be(e)}},Vi={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:be};var Ki=e=>typeof e=="bigint"||Number.isInteger(e),cc=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function em(e,t,n){let{value:r}=e;return Ki(r)&&r>=0?n+r.toString(t):be(e)}var Gi={identify:e=>Ki(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(e,t,n)=>cc(e,2,8,n),stringify:e=>em(e,8,"0o")},Hi={identify:Ki,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>cc(e,0,10,n),stringify:be},Yi={identify:e=>Ki(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>cc(e,2,16,n),stringify:e=>em(e,16,"0x")};var tm=[nt,rt,Qt,En,os,Gi,Hi,Yi,Wi,Bi,Vi];function nm(e){return typeof e=="bigint"||Number.isInteger(e)}var zi=({value:e})=>JSON.stringify(e),IS=[{identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify:zi},{identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:zi},{identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:e=>e==="true",stringify:zi},{identify:nm,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})=>nm(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:zi}],vS={default:!0,tag:"",test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}},rm=[nt,rt].concat(IS,vS);var as={identify:e=>e instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(e,t){if(typeof atob=="function"){let n=atob(e.replace(/[\n\r]/g,"")),r=new Uint8Array(n.length);for(let s=0;s<n.length;++s)r[s]=n.charCodeAt(s);return r}else return t("This environment does not support reading binary tags; either Buffer or atob is required"),e},stringify({comment:e,type:t,value:n},r,s,i){if(!n)return"";let o=n,a;if(typeof btoa=="function"){let l="";for(let c=0;c<o.length;++c)l+=String.fromCharCode(o[c]);a=btoa(l)}else throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required");if(t??(t=O.BLOCK_LITERAL),t!==O.QUOTE_DOUBLE){let l=Math.max(r.options.lineWidth-r.indent.length,r.options.minContentWidth),c=Math.ceil(a.length/l),u=new Array(c);for(let d=0,p=0;d<c;++d,p+=l)u[d]=a.substr(p,l);a=u.join(t===O.BLOCK_LITERAL?`
131
- `:" ")}return An({comment:e,type:t,value:a},r,s,i)}};function dc(e,t){if(et(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!q(r)){if(Ze(r)){r.items.length>1&&t("Each pair must have its own sequence indicator");let s=r.items[0]||new Q(new O(null));if(r.commentBefore&&(s.key.commentBefore=s.key.commentBefore?`${r.commentBefore}
123
+ `)&&(D="");return y+=D+$,n.inFlow?b&&r&&r():v&&!b?y+=ht(y,n.indent,c(v)):f&&s&&s(),y}function ac(e,t){(e==="debug"||e==="warn")&&console.warn(t)}var Li="<<",tt={identify:e=>e===Li||typeof e=="symbol"&&e.description===Li,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new O(Symbol(Li)),{addToJSMap:cc}),stringify:()=>Li},tm=(e,t)=>(tt.identify(t)||x(t)&&(!t.type||t.type===O.PLAIN)&&tt.identify(t.value))&&e?.doc.schema.tags.some(n=>n.tag===tt.tag&&n.default);function cc(e,t,n){let r=nm(e,n);if(et(r))for(let s of r.items)lc(e,t,s);else if(Array.isArray(r))for(let s of r)lc(e,t,s);else lc(e,t,r)}function lc(e,t,n){let r=nm(e,n);if(!Ze(r))throw new Error("Merge sources must be maps or map aliases");let s=r.toJSON(null,e,Map);for(let[i,o]of s)t instanceof Map?t.has(i)||t.set(i,o):t instanceof Set?t.add(i):Object.prototype.hasOwnProperty.call(t,i)||Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0});return t}function nm(e,t){return e&&_e(t)?t.resolve(e.doc,e):t}function Mi(e,t,{key:n,value:r}){if(U(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(tm(e,n))cc(e,t,r);else{let s=ae(n,"",e);if(t instanceof Map)t.set(s,ae(r,s,e));else if(t instanceof Set)t.add(s);else{let i=IS(n,s,e),o=ae(r,i,e);i in t?Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0}):t[i]=o}}return t}function IS(e,t,n){if(t===null)return"";if(typeof t!="object")return String(t);if(U(e)&&n?.doc){let r=Fi(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)+'..."'),ac(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 ur(e,t,n){let r=$t(e,void 0,n),s=$t(t,void 0,n);return new Q(r,s)}var Q=class e{constructor(t,n=null){Object.defineProperty(this,Se,{value:tc}),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 Mi(n,r,this)}toString(t,n,r){return t?.doc?em(this,t,n,r):JSON.stringify(this)}};function qi(e,t,n){return(t.inFlow??e.flow?CS:vS)(e,t,n)}function vS({comment:e,items:t},n,{blockItemPrefix:r,flowChars:s,itemIndent:i,onChompKeep:o,onComment:a}){let{indent:l,options:{commentString:c}}=n,u=Object.assign({},n,{indent:i,type:null}),d=!1,p=[];for(let g=0;g<t.length;++g){let f=t[g],y=null;if(U(f))!d&&f.spaceBefore&&p.push(""),ji(n,p,f.commentBefore,d),f.comment&&(y=f.comment);else if(q(f)){let S=U(f.key)?f.key:null;S&&(!d&&S.spaceBefore&&p.push(""),ji(n,p,S.commentBefore,d))}d=!1;let T=Dt(f,u,()=>y=null,()=>d=!0);y&&(T+=ht(T,i,c(y))),d&&y&&(d=!1),p.push(r+T)}let m;if(p.length===0)m=s.start+s.end;else{m=p[0];for(let g=1;g<p.length;++g){let f=p[g];m+=f?`
124
+ ${l}${f}`:`
125
+ `}}return e?(m+=`
126
+ `+ze(c(e),l),a&&a()):d&&o&&o(),m}function CS({items:e},t,{flowChars:n,itemIndent:r}){let{indent:s,indentStep:i,flowCollectionPadding:o,options:{commentString:a}}=t;r+=i;let l=Object.assign({},t,{indent:r,inFlow:!0,type:null}),c=!1,u=0,d=[];for(let g=0;g<e.length;++g){let f=e[g],y=null;if(U(f))f.spaceBefore&&d.push(""),ji(t,d,f.commentBefore,!1),f.comment&&(y=f.comment);else if(q(f)){let S=U(f.key)?f.key:null;S&&(S.spaceBefore&&d.push(""),ji(t,d,S.commentBefore,!1),S.comment&&(c=!0));let v=U(f.value)?f.value:null;v?(v.comment&&(y=v.comment),v.commentBefore&&(c=!0)):f.value==null&&S?.comment&&(y=S.comment)}y&&(c=!0);let T=Dt(f,l,()=>y=null);c||(c=d.length>u||T.includes(`
127
+ `)),g<e.length-1?T+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=d.reduce((S,v)=>S+v.length+2,2)+(T.length+2)>t.options.lineWidth)),c&&(T+=",")),y&&(T+=ht(T,r,a(y))),d.push(T),u=d.length}let{start:p,end:m}=n;if(d.length===0)return p+m;if(!c){let g=d.reduce((f,y)=>f+y.length+2,2);c=t.options.lineWidth>0&&g>t.options.lineWidth}if(c){let g=p;for(let f of d)g+=f?`
128
+ ${i}${s}${f}`:`
129
+ `;return`${g}
130
+ ${s}${m}`}else return`${p}${o}${d.join(" ")}${o}${m}`}function ji({indent:e,options:{commentString:t}},n,r,s){if(r&&s&&(r=r.replace(/^\n+/,"")),r){let i=ze(t(r),e);n.push(i.trimStart())}}function Qt(e,t){let n=x(t)?t.value:t;for(let r of e)if(q(r)&&(r.key===t||r.key===n||x(r.key)&&r.key.value===n))return r}var te=class extends lr{static get tagName(){return"tag:yaml.org,2002:map"}constructor(t){super(Qe,t),this.items=[]}static from(t,n,r){let{keepUndefined:s,replacer:i}=r,o=new this(t),a=(l,c)=>{if(typeof i=="function")c=i.call(n,l,c);else if(Array.isArray(i)&&!i.includes(l))return;(c!==void 0||s)&&o.items.push(ur(l,c,r))};if(n instanceof Map)for(let[l,c]of n)a(l,c);else if(n&&typeof n=="object")for(let l of Object.keys(n))a(l,n[l]);return typeof t.sortMapEntries=="function"&&o.items.sort(t.sortMapEntries),o}add(t,n){let r;q(t)?r=t:!t||typeof t!="object"||!("key"in t)?r=new Q(t,t?.value):r=new Q(t.key,t.value);let s=Qt(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);x(s.value)&&$i(r.value)?s.value.value=r.value:s.value=r.value}else if(i){let o=this.items.findIndex(a=>i(r,a)<0);o===-1?this.items.push(r):this.items.splice(o,0,r)}else this.items.push(r)}delete(t){let n=Qt(this.items,t);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(t,n){let s=Qt(this.items,t)?.value;return(!n&&x(s)?s.value:s)??void 0}has(t){return!!Qt(this.items,t)}set(t,n){this.add(new Q(t,n),!0)}toJSON(t,n,r){let s=r?new r:n?.mapAsMap?new Map:{};n?.onCreate&&n.onCreate(s);for(let i of this.items)Mi(n,s,i);return s}toString(t,n,r){if(!t)return JSON.stringify(this);for(let s of this.items)if(!q(s))throw new Error(`Map items must all be pairs; found ${JSON.stringify(s)} instead`);return!t.allNullValues&&this.hasAllNullValues(!1)&&(t=Object.assign({},t,{allNullValues:!0})),qi(this,t,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:t.indent||"",onChompKeep:r,onComment:n})}};var nt={collection:"map",default:!0,nodeClass:te,tag:"tag:yaml.org,2002:map",resolve(e,t){return Ze(e)||t("Expected a mapping for this tag"),e},createNode:(e,t,n)=>te.from(e,t,n)};var Te=class extends lr{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(t){super(Et,t),this.items=[]}add(t){this.items.push(t)}delete(t){let n=Ui(t);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(t,n){let r=Ui(t);if(typeof r!="number")return;let s=this.items[r];return!n&&x(s)?s.value:s}has(t){let n=Ui(t);return typeof n=="number"&&n<this.items.length}set(t,n){let r=Ui(t);if(typeof r!="number")throw new Error(`Expected a valid index, not ${t}.`);let s=this.items[r];x(s)&&$i(n)?s.value=n:this.items[r]=n}toJSON(t,n){let r=[];n?.onCreate&&n.onCreate(r);let s=0;for(let i of this.items)r.push(ae(i,String(s++),n));return r}toString(t,n,r){return t?qi(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 Ui(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 rt={collection:"seq",default:!0,nodeClass:Te,tag:"tag:yaml.org,2002:seq",resolve(e,t){return et(e)||t("Expected a sequence for this tag"),e},createNode:(e,t,n)=>Te.from(e,t,n)};var Zt={identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify(e,t,n,r){return t=Object.assign({actualString:!0},t),An(e,t,n,r)}};var En={identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new O(null),stringify:({source:e},t)=>typeof e=="string"&&En.test.test(e)?e:t.options.nullStr};var os={identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:e=>new O(e[0]==="t"||e[0]==="T"),stringify({source:e,value:t},n){if(e&&os.test.test(e)){let r=e[0]==="t"||e[0]==="T";if(t===r)return e}return t?n.options.trueStr:n.options.falseStr}};function be({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 Wi={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:be},Bi={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():be(e)}},Vi={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:be};var Ki=e=>typeof e=="bigint"||Number.isInteger(e),dc=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function rm(e,t,n){let{value:r}=e;return Ki(r)&&r>=0?n+r.toString(t):be(e)}var Gi={identify:e=>Ki(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(e,t,n)=>dc(e,2,8,n),stringify:e=>rm(e,8,"0o")},Hi={identify:Ki,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>dc(e,0,10,n),stringify:be},Yi={identify:e=>Ki(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>dc(e,2,16,n),stringify:e=>rm(e,16,"0x")};var sm=[nt,rt,Zt,En,os,Gi,Hi,Yi,Wi,Bi,Vi];function im(e){return typeof e=="bigint"||Number.isInteger(e)}var zi=({value:e})=>JSON.stringify(e),AS=[{identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify:zi},{identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:zi},{identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:e=>e==="true",stringify:zi},{identify:im,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})=>im(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:zi}],ES={default:!0,tag:"",test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}},om=[nt,rt].concat(AS,ES);var as={identify:e=>e instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(e,t){if(typeof atob=="function"){let n=atob(e.replace(/[\n\r]/g,"")),r=new Uint8Array(n.length);for(let s=0;s<n.length;++s)r[s]=n.charCodeAt(s);return r}else return t("This environment does not support reading binary tags; either Buffer or atob is required"),e},stringify({comment:e,type:t,value:n},r,s,i){if(!n)return"";let o=n,a;if(typeof btoa=="function"){let l="";for(let c=0;c<o.length;++c)l+=String.fromCharCode(o[c]);a=btoa(l)}else throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required");if(t??(t=O.BLOCK_LITERAL),t!==O.QUOTE_DOUBLE){let l=Math.max(r.options.lineWidth-r.indent.length,r.options.minContentWidth),c=Math.ceil(a.length/l),u=new Array(c);for(let d=0,p=0;d<c;++d,p+=l)u[d]=a.substr(p,l);a=u.join(t===O.BLOCK_LITERAL?`
131
+ `:" ")}return An({comment:e,type:t,value:a},r,s,i)}};function uc(e,t){if(et(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!q(r)){if(Ze(r)){r.items.length>1&&t("Each pair must have its own sequence indicator");let s=r.items[0]||new Q(new O(null));if(r.commentBefore&&(s.key.commentBefore=s.key.commentBefore?`${r.commentBefore}
132
132
  ${s.key.commentBefore}`:r.commentBefore),r.comment){let i=s.value??s.key;i.comment=i.comment?`${r.comment}
133
- ${i.comment}`:r.comment}r=s}e.items[n]=q(r)?r:new Q(r)}}else t("Expected a sequence for this tag");return e}function uc(e,t,n){let{replacer:r}=n,s=new Te(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(ur(a,l,n))}return s}var ls={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:dc,createNode:uc};var pr=class e extends Te{constructor(){super(),this.add=te.prototype.add.bind(this),this.delete=te.prototype.delete.bind(this),this.get=te.prototype.get.bind(this),this.has=te.prototype.has.bind(this),this.set=te.prototype.set.bind(this),this.tag=e.tag}toJSON(t,n){if(!n)return super.toJSON(t);let r=new Map;n?.onCreate&&n.onCreate(r);for(let s of this.items){let i,o;if(q(s)?(i=ae(s.key,"",n),o=ae(s.value,i,n)):i=ae(s,"",n),r.has(i))throw new Error("Ordered maps must not include duplicate keys");r.set(i,o)}return r}static from(t,n,r){let s=uc(t,n,r),i=new this;return i.items=s.items,i}};pr.tag="tag:yaml.org,2002:omap";var cs={collection:"seq",identify:e=>e instanceof Map,nodeClass:pr,default:!1,tag:"tag:yaml.org,2002:omap",resolve(e,t){let n=dc(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 pr,n)},createNode:(e,t,n)=>pr.from(e,t,n)};function sm({value:e,source:t},n){return t&&(e?pc:fc).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}var pc={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:sm},fc={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:sm};var im={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:be},om={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():be(e)}},am={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:be};var ds=e=>typeof e=="bigint"||Number.isInteger(e);function Ji(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 mc(e,t,n){let{value:r}=e;if(ds(r)){let s=r.toString(t);return r<0?"-"+n+s.substr(1):n+s}return be(e)}var lm={identify:ds,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>Ji(e,2,2,n),stringify:e=>mc(e,2,"0b")},cm={identify:ds,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>Ji(e,1,8,n),stringify:e=>mc(e,8,"0")},dm={identify:ds,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>Ji(e,0,10,n),stringify:be},um={identify:ds,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>Ji(e,2,16,n),stringify:e=>mc(e,16,"0x")};var fr=class e extends te{constructor(t){super(t),this.tag=e.tag}add(t){let n;q(t)?n=t:t&&typeof t=="object"&&"key"in t&&"value"in t&&t.value===null?n=new Q(t.key,null):n=new Q(t,null),Xt(this.items,n.key)||this.items.push(n)}get(t,n){let r=Xt(this.items,t);return!n&&q(r)?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=Xt(this.items,t);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new Q(t))}toJSON(t,n){return super.toJSON(t,n,Set)}toString(t,n,r){if(!t)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},t,{allNullValues:!0}),n,r);throw new Error("Set items must all have null values")}static from(t,n,r){let{replacer:s}=r,i=new this(t);if(n&&Symbol.iterator in Object(n))for(let o of n)typeof s=="function"&&(o=s.call(n,o,o)),i.items.push(ur(o,null,r));return i}};fr.tag="tag:yaml.org,2002:set";var us={collection:"map",identify:e=>e instanceof Set,nodeClass:fr,default:!1,tag:"tag:yaml.org,2002:set",createNode:(e,t,n)=>fr.from(e,t,n),resolve(e,t){if(Ze(e)){if(e.hasAllNullValues(!0))return Object.assign(new fr,e);t("Set items must all have null values")}else t("Expected a mapping for this tag");return e}};function hc(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 be(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 Xi={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})=>hc(e,n),stringify:pm},Qi={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=>hc(e,!1),stringify:pm},mr={identify:e=>e instanceof Date,default:!0,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(e){let t=e.match(mr.test);if(!t)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,n,r,s,i,o,a]=t.map(Number),l=t[7]?Number((t[7]+"00").substr(1,3)):0,c=Date.UTC(n,r-1,s,i||0,o||0,a||0,l),u=t[8];if(u&&u!=="Z"){let d=hc(u,!1);Math.abs(d)<30&&(d*=60),c-=6e4*d}return new Date(c)},stringify:({value:e})=>e?.toISOString().replace(/(T00:00:00)?\.000Z$/,"")??""};var gc=[nt,rt,Qt,En,pc,fc,lm,cm,dm,um,im,om,am,as,tt,cs,ls,us,Xi,Qi,mr];var fm=new Map([["core",tm],["failsafe",[nt,rt,Qt]],["json",rm],["yaml11",gc],["yaml-1.1",gc]]),mm={binary:as,bool:os,float:Vi,floatExp:Bi,floatNaN:Wi,floatTime:Qi,int:Hi,intHex:Yi,intOct:Gi,intTime:Xi,map:nt,merge:tt,null:En,omap:cs,pairs:ls,seq:rt,set:us,timestamp:mr},hm={"tag:yaml.org,2002:binary":as,"tag:yaml.org,2002:merge":tt,"tag:yaml.org,2002:omap":cs,"tag:yaml.org,2002:pairs":ls,"tag:yaml.org,2002:set":us,"tag:yaml.org,2002:timestamp":mr};function Zi(e,t,n){let r=fm.get(t);if(r&&!e)return n&&!r.includes(tt)?r.concat(tt):r.slice();let s=r;if(!s)if(Array.isArray(e))s=[];else{let i=Array.from(fm.keys()).filter(o=>o!=="yaml11").map(o=>JSON.stringify(o)).join(", ");throw new Error(`Unknown schema "${t}"; use one of ${i} or define customTags array`)}if(Array.isArray(e))for(let i of e)s=s.concat(i);else typeof e=="function"&&(s=e(s.slice()));return n&&(s=s.concat(tt)),s.reduce((i,o)=>{let a=typeof o=="string"?mm[o]:o;if(!a){let l=JSON.stringify(o),c=Object.keys(mm).map(u=>JSON.stringify(u)).join(", ");throw new Error(`Unknown custom tag ${l}; use one of ${c}`)}return i.includes(a)||i.push(a),i},[])}var CS=(e,t)=>e.key<t.key?-1:e.key>t.key?1:0,ps=class e{constructor({compat:t,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(t)?Zi(t,"compat"):t?Zi(null,t):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?hm:{},this.tags=Zi(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,Qe,{value:nt}),Object.defineProperty(this,xe,{value:Qt}),Object.defineProperty(this,Et,{value:rt}),this.sortMapEntries=typeof o=="function"?o:o===!0?CS:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function gm(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=Fi(e,t),{commentString:i}=s.options;if(e.commentBefore){n.length!==1&&n.unshift("");let l=i(e.commentBefore);n.unshift(ze(l,""))}let o=!1,a=null;if(e.contents){if(U(e.contents)){if(e.contents.spaceBefore&&r&&n.push(""),e.contents.commentBefore){let u=i(e.contents.commentBefore);n.push(ze(u,""))}s.forceBlockIndent=!!e.comment,a=e.contents.comment}let l=a?void 0:()=>o=!0,c=Nt(e.contents,s,()=>a=null,l);a&&(c+=ht(c,"",i(a))),(c[0]==="|"||c[0]===">")&&n[n.length-1]==="---"?n[n.length-1]=`--- ${c}`:n.push(c)}else n.push(Nt(e.contents,s));if(e.directives?.docEnd)if(e.comment){let l=i(e.comment);l.includes(`
133
+ ${i.comment}`:r.comment}r=s}e.items[n]=q(r)?r:new Q(r)}}else t("Expected a sequence for this tag");return e}function pc(e,t,n){let{replacer:r}=n,s=new Te(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(ur(a,l,n))}return s}var ls={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:uc,createNode:pc};var pr=class e extends Te{constructor(){super(),this.add=te.prototype.add.bind(this),this.delete=te.prototype.delete.bind(this),this.get=te.prototype.get.bind(this),this.has=te.prototype.has.bind(this),this.set=te.prototype.set.bind(this),this.tag=e.tag}toJSON(t,n){if(!n)return super.toJSON(t);let r=new Map;n?.onCreate&&n.onCreate(r);for(let s of this.items){let i,o;if(q(s)?(i=ae(s.key,"",n),o=ae(s.value,i,n)):i=ae(s,"",n),r.has(i))throw new Error("Ordered maps must not include duplicate keys");r.set(i,o)}return r}static from(t,n,r){let s=pc(t,n,r),i=new this;return i.items=s.items,i}};pr.tag="tag:yaml.org,2002:omap";var cs={collection:"seq",identify:e=>e instanceof Map,nodeClass:pr,default:!1,tag:"tag:yaml.org,2002:omap",resolve(e,t){let n=uc(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 pr,n)},createNode:(e,t,n)=>pr.from(e,t,n)};function am({value:e,source:t},n){return t&&(e?fc:mc).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}var fc={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:am},mc={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:am};var lm={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:be},cm={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():be(e)}},dm={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:be};var ds=e=>typeof e=="bigint"||Number.isInteger(e);function Ji(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 gc(e,t,n){let{value:r}=e;if(ds(r)){let s=r.toString(t);return r<0?"-"+n+s.substr(1):n+s}return be(e)}var um={identify:ds,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>Ji(e,2,2,n),stringify:e=>gc(e,2,"0b")},pm={identify:ds,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>Ji(e,1,8,n),stringify:e=>gc(e,8,"0")},fm={identify:ds,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>Ji(e,0,10,n),stringify:be},mm={identify:ds,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>Ji(e,2,16,n),stringify:e=>gc(e,16,"0x")};var fr=class e extends te{constructor(t){super(t),this.tag=e.tag}add(t){let n;q(t)?n=t:t&&typeof t=="object"&&"key"in t&&"value"in t&&t.value===null?n=new Q(t.key,null):n=new Q(t,null),Qt(this.items,n.key)||this.items.push(n)}get(t,n){let r=Qt(this.items,t);return!n&&q(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=Qt(this.items,t);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new Q(t))}toJSON(t,n){return super.toJSON(t,n,Set)}toString(t,n,r){if(!t)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},t,{allNullValues:!0}),n,r);throw new Error("Set items must all have null values")}static from(t,n,r){let{replacer:s}=r,i=new this(t);if(n&&Symbol.iterator in Object(n))for(let o of n)typeof s=="function"&&(o=s.call(n,o,o)),i.items.push(ur(o,null,r));return i}};fr.tag="tag:yaml.org,2002:set";var us={collection:"map",identify:e=>e instanceof Set,nodeClass:fr,default:!1,tag:"tag:yaml.org,2002:set",createNode:(e,t,n)=>fr.from(e,t,n),resolve(e,t){if(Ze(e)){if(e.hasAllNullValues(!0))return Object.assign(new fr,e);t("Set items must all have null values")}else t("Expected a mapping for this tag");return e}};function hc(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 gm(e){let{value:t}=e,n=o=>o;if(typeof t=="bigint")n=o=>BigInt(o);else if(isNaN(t)||!isFinite(t))return be(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 Xi={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})=>hc(e,n),stringify:gm},Qi={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=>hc(e,!1),stringify:gm},mr={identify:e=>e instanceof Date,default:!0,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(e){let t=e.match(mr.test);if(!t)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,n,r,s,i,o,a]=t.map(Number),l=t[7]?Number((t[7]+"00").substr(1,3)):0,c=Date.UTC(n,r-1,s,i||0,o||0,a||0,l),u=t[8];if(u&&u!=="Z"){let d=hc(u,!1);Math.abs(d)<30&&(d*=60),c-=6e4*d}return new Date(c)},stringify:({value:e})=>e?.toISOString().replace(/(T00:00:00)?\.000Z$/,"")??""};var yc=[nt,rt,Zt,En,fc,mc,um,pm,fm,mm,lm,cm,dm,as,tt,cs,ls,us,Xi,Qi,mr];var hm=new Map([["core",sm],["failsafe",[nt,rt,Zt]],["json",om],["yaml11",yc],["yaml-1.1",yc]]),ym={binary:as,bool:os,float:Vi,floatExp:Bi,floatNaN:Wi,floatTime:Qi,int:Hi,intHex:Yi,intOct:Gi,intTime:Xi,map:nt,merge:tt,null:En,omap:cs,pairs:ls,seq:rt,set:us,timestamp:mr},wm={"tag:yaml.org,2002:binary":as,"tag:yaml.org,2002:merge":tt,"tag:yaml.org,2002:omap":cs,"tag:yaml.org,2002:pairs":ls,"tag:yaml.org,2002:set":us,"tag:yaml.org,2002:timestamp":mr};function Zi(e,t,n){let r=hm.get(t);if(r&&!e)return n&&!r.includes(tt)?r.concat(tt):r.slice();let s=r;if(!s)if(Array.isArray(e))s=[];else{let i=Array.from(hm.keys()).filter(o=>o!=="yaml11").map(o=>JSON.stringify(o)).join(", ");throw new Error(`Unknown schema "${t}"; use one of ${i} or define customTags array`)}if(Array.isArray(e))for(let i of e)s=s.concat(i);else typeof e=="function"&&(s=e(s.slice()));return n&&(s=s.concat(tt)),s.reduce((i,o)=>{let a=typeof o=="string"?ym[o]:o;if(!a){let l=JSON.stringify(o),c=Object.keys(ym).map(u=>JSON.stringify(u)).join(", ");throw new Error(`Unknown custom tag ${l}; use one of ${c}`)}return i.includes(a)||i.push(a),i},[])}var OS=(e,t)=>e.key<t.key?-1:e.key>t.key?1:0,ps=class e{constructor({compat:t,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(t)?Zi(t,"compat"):t?Zi(null,t):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?wm:{},this.tags=Zi(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,Qe,{value:nt}),Object.defineProperty(this,xe,{value:Zt}),Object.defineProperty(this,Et,{value:rt}),this.sortMapEntries=typeof o=="function"?o:o===!0?OS:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function km(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=Fi(e,t),{commentString:i}=s.options;if(e.commentBefore){n.length!==1&&n.unshift("");let l=i(e.commentBefore);n.unshift(ze(l,""))}let o=!1,a=null;if(e.contents){if(U(e.contents)){if(e.contents.spaceBefore&&r&&n.push(""),e.contents.commentBefore){let u=i(e.contents.commentBefore);n.push(ze(u,""))}s.forceBlockIndent=!!e.comment,a=e.contents.comment}let l=a?void 0:()=>o=!0,c=Dt(e.contents,s,()=>a=null,l);a&&(c+=ht(c,"",i(a))),(c[0]==="|"||c[0]===">")&&n[n.length-1]==="---"?n[n.length-1]=`--- ${c}`:n.push(c)}else n.push(Dt(e.contents,s));if(e.directives?.docEnd)if(e.comment){let l=i(e.comment);l.includes(`
134
134
  `)?(n.push("..."),n.push(ze(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(ze(i(l),"")))}return n.join(`
135
135
  `)+`
136
- `}var Zt=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,Se,{value:vi});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 mt({version:o}),this.setSchema(o,r),this.contents=t===void 0?null:this.createNode(t,s,r)}clone(){let t=Object.create(e.prototype,{[Se]:{value:vi}});return t.commentBefore=this.commentBefore,t.comment=this.comment,t.errors=this.errors.slice(),t.warnings=this.warnings.slice(),t.options=Object.assign({},this.options),this.directives&&(t.directives=this.directives.clone()),t.schema=this.schema.clone(),t.contents=U(this.contents)?this.contents.clone(t.schema):this.contents,this.range&&(t.range=this.range.slice()),t}add(t){hr(this.contents)&&this.contents.add(t)}addIn(t,n){hr(this.contents)&&this.contents.addIn(t,n)}createAlias(t,n){if(!t.anchor){let r=tc(this);t.anchor=!n||r.has(n)?nc(n||"a",r):n}return new Ot(t.anchor)}createNode(t,n,r){let s;if(typeof n=="function")t=n.call({"":t},"",t),s=n;else if(Array.isArray(n)){let y=R=>typeof R=="number"||R instanceof String||R instanceof Number,T=n.filter(y).map(String);T.length>0&&(n=n.concat(T)),s=n}else r===void 0&&n&&(r=n,n=void 0);let{aliasDuplicateObjects:i,anchorPrefix:o,flow:a,keepUndefined:l,onTagObj:c,tag:u}=r??{},{onAnchor:d,setAnchors:p,sourceObjects:h}=Yf(this,o||"a"),f={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:d,onTagObj:c,replacer:s,schema:this.schema,sourceObjects:h},m=$t(t,u,f);return a&&B(m)&&(m.flow=!0),p(),m}createPair(t,n,r={}){let s=this.createNode(t,null,r),i=this.createNode(n,null,r);return new Q(s,i)}delete(t){return hr(this.contents)?this.contents.delete(t):!1}deleteIn(t){return cr(t)?this.contents==null?!1:(this.contents=null,!0):hr(this.contents)?this.contents.deleteIn(t):!1}get(t,n){return B(this.contents)?this.contents.get(t,n):void 0}getIn(t,n){return cr(t)?!n&&x(this.contents)?this.contents.value:this.contents:B(this.contents)?this.contents.getIn(t,n):void 0}has(t){return B(this.contents)?this.contents.has(t):!1}hasIn(t){return cr(t)?this.contents!==void 0:B(this.contents)?this.contents.hasIn(t):!1}set(t,n){this.contents==null?this.contents=ns(this.schema,[t],n):hr(this.contents)&&this.contents.set(t,n)}setIn(t,n){cr(t)?this.contents=n:this.contents==null?this.contents=ns(this.schema,Array.from(t),n):hr(this.contents)&&this.contents.setIn(t,n)}setSchema(t,n={}){typeof t=="number"&&(t=String(t));let r;switch(t){case"1.1":this.directives?this.directives.yaml.version="1.1":this.directives=new mt({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 mt({version:t}),r={resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,r=null;break;default:{let s=JSON.stringify(t);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${s}`)}}if(n.schema instanceof Object)this.schema=n.schema;else if(r)this.schema=new ps(Object.assign(r,n));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:t,jsonArg:n,mapAsMap:r,maxAliasCount:s,onAnchor:i,reviver:o}={}){let a={anchors:new Map,doc:this,keep:!t,mapAsMap:r===!0,mapKeyWarned:!1,maxAliasCount:typeof s=="number"?s:100},l=ae(this.contents,n??"",a);if(typeof i=="function")for(let{count:c,res:u}of a.anchors.values())i(u,c);return typeof o=="function"?zt(o,{"":l},"",l):l}toJSON(t,n){return this.toJS({json:!0,jsonArg:t,mapAsMap:!1,onAnchor:n})}toString(t={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in t&&(!Number.isInteger(t.indent)||Number(t.indent)<=0)){let n=JSON.stringify(t.indent);throw new Error(`"indent" option must be a positive integer, not ${n}`)}return gm(this,t)}};function hr(e){if(B(e))return!0;throw new Error("Expected a YAML collection as document contents")}var fs=class extends Error{constructor(t,n,r,s){super(),this.name=t,this.code=r,this.message=s,this.pos=n}},st=class extends fs{constructor(t,n,r){super("YAMLParseError",t,n,r)}},ms=class extends fs{constructor(t,n,r){super("YAMLWarning",t,n,r)}},yc=(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
136
+ `}var en=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,Se,{value:vi});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 gt({version:o}),this.setSchema(o,r),this.contents=t===void 0?null:this.createNode(t,s,r)}clone(){let t=Object.create(e.prototype,{[Se]:{value:vi}});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){gr(this.contents)&&this.contents.add(t)}addIn(t,n){gr(this.contents)&&this.contents.addIn(t,n)}createAlias(t,n){if(!t.anchor){let r=nc(this);t.anchor=!n||r.has(n)?rc(n||"a",r):n}return new Ot(t.anchor)}createNode(t,n,r){let s;if(typeof n=="function")t=n.call({"":t},"",t),s=n;else if(Array.isArray(n)){let y=S=>typeof S=="number"||S instanceof String||S 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:u}=r??{},{onAnchor:d,setAnchors:p,sourceObjects:m}=Xf(this,o||"a"),g={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:d,onTagObj:c,replacer:s,schema:this.schema,sourceObjects:m},f=$t(t,u,g);return a&&B(f)&&(f.flow=!0),p(),f}createPair(t,n,r={}){let s=this.createNode(t,null,r),i=this.createNode(n,null,r);return new Q(s,i)}delete(t){return gr(this.contents)?this.contents.delete(t):!1}deleteIn(t){return cr(t)?this.contents==null?!1:(this.contents=null,!0):gr(this.contents)?this.contents.deleteIn(t):!1}get(t,n){return B(this.contents)?this.contents.get(t,n):void 0}getIn(t,n){return cr(t)?!n&&x(this.contents)?this.contents.value:this.contents:B(this.contents)?this.contents.getIn(t,n):void 0}has(t){return B(this.contents)?this.contents.has(t):!1}hasIn(t){return cr(t)?this.contents!==void 0:B(this.contents)?this.contents.hasIn(t):!1}set(t,n){this.contents==null?this.contents=ns(this.schema,[t],n):gr(this.contents)&&this.contents.set(t,n)}setIn(t,n){cr(t)?this.contents=n:this.contents==null?this.contents=ns(this.schema,Array.from(t),n):gr(this.contents)&&this.contents.setIn(t,n)}setSchema(t,n={}){typeof t=="number"&&(t=String(t));let r;switch(t){case"1.1":this.directives?this.directives.yaml.version="1.1":this.directives=new gt({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 gt({version:t}),r={resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,r=null;break;default:{let s=JSON.stringify(t);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${s}`)}}if(n.schema instanceof Object)this.schema=n.schema;else if(r)this.schema=new ps(Object.assign(r,n));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:t,jsonArg:n,mapAsMap:r,maxAliasCount:s,onAnchor:i,reviver:o}={}){let a={anchors:new Map,doc:this,keep:!t,mapAsMap:r===!0,mapKeyWarned:!1,maxAliasCount:typeof s=="number"?s:100},l=ae(this.contents,n??"",a);if(typeof i=="function")for(let{count:c,res:u}of a.anchors.values())i(u,c);return typeof o=="function"?Jt(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 km(this,t)}};function gr(e){if(B(e))return!0;throw new Error("Expected a YAML collection as document contents")}var fs=class extends Error{constructor(t,n,r,s){super(),this.name=t,this.code=r,this.message=s,this.pos=n}},st=class extends fs{constructor(t,n,r){super("YAMLParseError",t,n,r)}},ms=class extends fs{constructor(t,n,r){super("YAMLWarning",t,n,r)}},wc=(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
137
137
  `),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+=`:
138
138
 
139
139
  ${o}
140
140
  ${c}
141
- `}};function gt(e,{flow:t,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let l=!1,c=a,u=a,d="",p="",h=!1,f=!1,m=null,y=null,T=null,R=null,v=null,b=null,$=null;for(let C of e)switch(f&&(C.type!=="space"&&C.type!=="newline"&&C.type!=="comma"&&i(C.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),f=!1),m&&(c&&C.type!=="comment"&&C.type!=="newline"&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),m=null),C.type){case"space":!t&&(n!=="doc-start"||r?.type!=="flow-collection")&&C.source.includes(" ")&&(m=C),u=!0;break;case"comment":{u||i(C,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let w=C.source.substring(1)||" ";d?d+=p+w:d=w,p="",c=!1;break}case"newline":c?d?d+=C.source:(!b||n!=="seq-item-ind")&&(l=!0):p+=C.source,c=!0,h=!0,(y||T)&&(R=C),u=!0;break;case"anchor":y&&i(C,"MULTIPLE_ANCHORS","A node can have at most one anchor"),C.source.endsWith(":")&&i(C.offset+C.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),y=C,$??($=C.offset),c=!1,u=!1,f=!0;break;case"tag":{T&&i(C,"MULTIPLE_TAGS","A node can have at most one tag"),T=C,$??($=C.offset),c=!1,u=!1,f=!0;break}case n:(y||T)&&i(C,"BAD_PROP_ORDER",`Anchors and tags must be after the ${C.source} indicator`),b&&i(C,"UNEXPECTED_TOKEN",`Unexpected ${C.source} in ${t??"collection"}`),b=C,c=n==="seq-item-ind"||n==="explicit-key-ind",u=!1;break;case"comma":if(t){v&&i(C,"UNEXPECTED_TOKEN",`Unexpected , in ${t}`),v=C,c=!1,u=!1;break}default:i(C,"UNEXPECTED_TOKEN",`Unexpected ${C.type} token`),c=!1,u=!1}let N=e[e.length-1],_=N?N.offset+N.source.length:s;return f&&r&&r.type!=="space"&&r.type!=="newline"&&r.type!=="comma"&&(r.type!=="scalar"||r.source!=="")&&i(r.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),m&&(c&&m.indent<=o||r?.type==="block-map"||r?.type==="block-seq")&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:v,found:b,spaceBefore:l,comment:d,hasNewline:h,anchor:y,tag:T,newlineAfterProp:R,end:_,start:$??_}}function en(e){if(!e)return null;switch(e.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(e.source.includes(`
142
- `))return!0;if(e.end){for(let t of e.end)if(t.type==="newline")return!0}return!1;case"flow-collection":for(let t of e.items){for(let n of t.start)if(n.type==="newline")return!0;if(t.sep){for(let n of t.sep)if(n.type==="newline")return!0}if(en(t.key)||en(t.value))return!0}return!1;default:return!0}}function hs(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&en(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function eo(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 ym="All mapping items must start at the same column";function wm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??te,a=new o(n.schema);n.atRoot&&(n.atRoot=!1);let l=r.offset,c=null;for(let u of r.items){let{start:d,key:p,sep:h,value:f}=u,m=gt(d,{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",ym)),!m.anchor&&!m.tag&&!h){c=m.end,m.comment&&(a.comment?a.comment+=`
143
- `+m.comment:a.comment=m.comment);continue}(m.newlineAfterProp||en(p))&&s(p??d[d.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else m.found?.indent!==r.indent&&s(l,"BAD_INDENT",ym);n.atKey=!0;let T=m.end,R=p?e(n,p,m,s):t(n,T,d,null,m,s);n.schema.compat&&hs(r.indent,p,s),n.atKey=!1,eo(n,a.items,R)&&s(T,"DUPLICATE_KEY","Map keys must be unique");let v=gt(h??[],{indicator:"map-value-ind",next:f,offset:R.range[2],onError:s,parentIndent:r.indent,startOnNewline:!p||p.type==="block-scalar"});if(l=v.end,v.found){y&&(f?.type==="block-map"&&!v.hasNewline&&s(l,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),n.options.strict&&m.start<v.found.offset-1024&&s(R.range,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit block mapping key"));let b=f?e(n,f,v,s):t(n,l,h,null,v,s);n.schema.compat&&hs(r.indent,f,s),l=b.range[2];let $=new Q(R,b);n.options.keepSourceTokens&&($.srcToken=u),a.items.push($)}else{y&&s(R.range,"MISSING_CHAR","Implicit map keys need to be followed by map values"),v.comment&&(R.comment?R.comment+=`
144
- `+v.comment:R.comment=v.comment);let b=new Q(R);n.options.keepSourceTokens&&(b.srcToken=u),a.items.push(b)}}return c&&c<l&&s(c,"IMPOSSIBLE","Map comment with trailing content"),a.range=[r.offset,l,c??l],a}function km({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??Te,a=new o(n.schema);n.atRoot&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let l=r.offset,c=null;for(let{start:u,value:d}of r.items){let p=gt(u,{indicator:"seq-item-ind",next:d,offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0});if(!p.found)if(p.anchor||p.tag||d)d?.type==="block-seq"?s(p.end,"BAD_INDENT","All sequence items must start at the same column"):s(l,"MISSING_CHAR","Sequence item without - indicator");else{c=p.end,p.comment&&(a.comment=p.comment);continue}let h=d?e(n,d,p,s):t(n,p.end,u,null,p,s);n.schema.compat&&hs(r.indent,d,s),l=h.range[2],a.items.push(h)}return a.range=[r.offset,l,c??l],a}function yt(e,t,n,r){let s="";if(e){let i=!1,o="";for(let a of e){let{source:l,type:c}=a;switch(c){case"space":i=!0;break;case"comment":{n&&!i&&r(a,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let u=l.substring(1)||" ";s?s+=o+u:s=u,o="";break}case"newline":s&&(o+=l),i=!0;break;default:r(a,"UNEXPECTED_TOKEN",`Unexpected ${c} at node end`)}t+=l.length}}return{comment:s,offset:t}}var wc="Block collections are not allowed within flow collections",kc=e=>e&&(e.type==="block-map"||e.type==="block-seq");function Tm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",l=i?.nodeClass??(o?te:Te),c=new l(n.schema);c.flow=!0;let u=n.atRoot;u&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let d=r.offset+r.start.source.length;for(let y=0;y<r.items.length;++y){let T=r.items[y],{start:R,key:v,sep:b,value:$}=T,N=gt(R,{flow:a,indicator:"explicit-key-ind",next:v??b?.[0],offset:d,onError:s,parentIndent:r.indent,startOnNewline:!1});if(!N.found){if(!N.anchor&&!N.tag&&!b&&!$){y===0&&N.comma?s(N.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`):y<r.items.length-1&&s(N.start,"UNEXPECTED_TOKEN",`Unexpected empty item in ${a}`),N.comment&&(c.comment?c.comment+=`
145
- `+N.comment:c.comment=N.comment),d=N.end;continue}!o&&n.options.strict&&en(v)&&s(v,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line")}if(y===0)N.comma&&s(N.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`);else if(N.comma||s(N.start,"MISSING_CHAR",`Missing , between ${a} items`),N.comment){let _="";e:for(let C of R)switch(C.type){case"comma":case"space":break;case"comment":_=C.source.substring(1);break e;default:break e}if(_){let C=c.items[c.items.length-1];q(C)&&(C=C.value??C.key),C.comment?C.comment+=`
146
- `+_:C.comment=_,N.comment=N.comment.substring(_.length+1)}}if(!o&&!b&&!N.found){let _=$?e(n,$,N,s):t(n,N.end,b,null,N,s);c.items.push(_),d=_.range[2],kc($)&&s(_.range,"BLOCK_IN_FLOW",wc)}else{n.atKey=!0;let _=N.end,C=v?e(n,v,N,s):t(n,_,R,null,N,s);kc(v)&&s(C.range,"BLOCK_IN_FLOW",wc),n.atKey=!1;let w=gt(b??[],{flow:a,indicator:"map-value-ind",next:$,offset:C.range[2],onError:s,parentIndent:r.indent,startOnNewline:!1});if(w.found){if(!o&&!N.found&&n.options.strict){if(b)for(let Y of b){if(Y===w.found)break;if(Y.type==="newline"){s(Y,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}N.start<w.found.offset-1024&&s(w.found,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit flow sequence key")}}else $&&("source"in $&&$.source?.[0]===":"?s($,"MISSING_CHAR",`Missing space after : in ${a}`):s(w.start,"MISSING_CHAR",`Missing , or : between ${a} items`));let ge=$?e(n,$,w,s):w.found?t(n,w.end,b,null,w,s):null;ge?kc($)&&s(ge.range,"BLOCK_IN_FLOW",wc):w.comment&&(C.comment?C.comment+=`
147
- `+w.comment:C.comment=w.comment);let ye=new Q(C,ge);if(n.options.keepSourceTokens&&(ye.srcToken=T),o){let Y=c;eo(n,Y.items,C)&&s(_,"DUPLICATE_KEY","Map keys must be unique"),Y.items.push(ye)}else{let Y=new te(n.schema);Y.flow=!0,Y.items.push(ye);let fn=(ge??C).range;Y.range=[C.range[0],fn[1],fn[2]],c.items.push(Y)}d=ge?ge.range[2]:w.end}}let p=o?"}":"]",[h,...f]=r.end,m=d;if(h?.source===p)m=h.offset+h.source.length;else{let y=a[0].toUpperCase()+a.substring(1),T=u?`${y} must end with a ${p}`:`${y} in block collection must be sufficiently indented and end with a ${p}`;s(d,u?"MISSING_CHAR":"BAD_INDENT",T),h&&h.source.length!==1&&f.unshift(h)}if(f.length>0){let y=yt(f,m,n.options.strict,s);y.comment&&(c.comment?c.comment+=`
148
- `+y.comment:c.comment=y.comment),c.range=[r.offset,m,y.offset]}else c.range=[r.offset,m,m];return c}function Tc(e,t,n,r,s,i){let o=n.type==="block-map"?wm(e,t,n,r,i):n.type==="block-seq"?km(e,t,n,r,i):Tm(e,t,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function bm(e,t,n,r,s){let i=r.tag,o=i?t.directives.tagName(i.source,p=>s(i,"TAG_RESOLVE_FAILED",p)):null;if(n.type==="block-seq"){let{anchor:p,newlineAfterProp:h}=r,f=p&&i?p.offset>i.offset?p:i:p??i;f&&(!h||h.offset<f.offset)&&s(f,"MISSING_CHAR","Missing newline after block sequence props")}let a=n.type==="block-map"?"map":n.type==="block-seq"?"seq":n.start.source==="{"?"map":"seq";if(!i||!o||o==="!"||o===te.tagName&&a==="map"||o===Te.tagName&&a==="seq")return Tc(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),Tc(e,t,n,s,o)}let c=Tc(e,t,n,s,o,l),u=l.resolve?.(c,p=>s(i,"TAG_RESOLVE_FAILED",p),t.options)??c,d=U(u)?u:new O(u);return d.range=c.range,d.tag=o,l?.format&&(d.format=l.format),d}function bc(e,t,n){let r=t.offset,s=AS(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?ES(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?`
149
- `.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,u=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),u=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 d="",p="",h=!1;for(let m=0;m<u;++m)d+=o[m][0].slice(l)+`
150
- `;for(let m=u;m<a;++m){let[y,T]=o[m];c+=y.length+T.length+1;let R=T[T.length-1]==="\r";if(R&&(T=T.slice(0,-1)),T&&y.length<l){let b=`Block scalar lines must not be less indented than their ${s.indent?"explicit indentation indicator":"first line"}`;n(c-T.length-(R?2:1),"BAD_INDENT",b),y=""}i===O.BLOCK_LITERAL?(d+=p+y.slice(l)+T,p=`
141
+ `}};function yt(e,{flow:t,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let l=!1,c=a,u=a,d="",p="",m=!1,g=!1,f=null,y=null,T=null,S=null,v=null,b=null,$=null;for(let C of e)switch(g&&(C.type!=="space"&&C.type!=="newline"&&C.type!=="comma"&&i(C.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),g=!1),f&&(c&&C.type!=="comment"&&C.type!=="newline"&&i(f,"TAB_AS_INDENT","Tabs are not allowed as indentation"),f=null),C.type){case"space":!t&&(n!=="doc-start"||r?.type!=="flow-collection")&&C.source.includes(" ")&&(f=C),u=!0;break;case"comment":{u||i(C,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let w=C.source.substring(1)||" ";d?d+=p+w:d=w,p="",c=!1;break}case"newline":c?d?d+=C.source:(!b||n!=="seq-item-ind")&&(l=!0):p+=C.source,c=!0,m=!0,(y||T)&&(S=C),u=!0;break;case"anchor":y&&i(C,"MULTIPLE_ANCHORS","A node can have at most one anchor"),C.source.endsWith(":")&&i(C.offset+C.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),y=C,$??($=C.offset),c=!1,u=!1,g=!0;break;case"tag":{T&&i(C,"MULTIPLE_TAGS","A node can have at most one tag"),T=C,$??($=C.offset),c=!1,u=!1,g=!0;break}case n:(y||T)&&i(C,"BAD_PROP_ORDER",`Anchors and tags must be after the ${C.source} indicator`),b&&i(C,"UNEXPECTED_TOKEN",`Unexpected ${C.source} in ${t??"collection"}`),b=C,c=n==="seq-item-ind"||n==="explicit-key-ind",u=!1;break;case"comma":if(t){v&&i(C,"UNEXPECTED_TOKEN",`Unexpected , in ${t}`),v=C,c=!1,u=!1;break}default:i(C,"UNEXPECTED_TOKEN",`Unexpected ${C.type} token`),c=!1,u=!1}let D=e[e.length-1],_=D?D.offset+D.source.length:s;return g&&r&&r.type!=="space"&&r.type!=="newline"&&r.type!=="comma"&&(r.type!=="scalar"||r.source!=="")&&i(r.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),f&&(c&&f.indent<=o||r?.type==="block-map"||r?.type==="block-seq")&&i(f,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:v,found:b,spaceBefore:l,comment:d,hasNewline:m,anchor:y,tag:T,newlineAfterProp:S,end:_,start:$??_}}function tn(e){if(!e)return null;switch(e.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(e.source.includes(`
142
+ `))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(tn(t.key)||tn(t.value))return!0}return!1;default:return!0}}function gs(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&tn(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function eo(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 Tm="All mapping items must start at the same column";function bm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??te,a=new o(n.schema);n.atRoot&&(n.atRoot=!1);let l=r.offset,c=null;for(let u of r.items){let{start:d,key:p,sep:m,value:g}=u,f=yt(d,{indicator:"explicit-key-ind",next:p??m?.[0],offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0}),y=!f.found;if(y){if(p&&(p.type==="block-seq"?s(l,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in p&&p.indent!==r.indent&&s(l,"BAD_INDENT",Tm)),!f.anchor&&!f.tag&&!m){c=f.end,f.comment&&(a.comment?a.comment+=`
143
+ `+f.comment:a.comment=f.comment);continue}(f.newlineAfterProp||tn(p))&&s(p??d[d.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else f.found?.indent!==r.indent&&s(l,"BAD_INDENT",Tm);n.atKey=!0;let T=f.end,S=p?e(n,p,f,s):t(n,T,d,null,f,s);n.schema.compat&&gs(r.indent,p,s),n.atKey=!1,eo(n,a.items,S)&&s(T,"DUPLICATE_KEY","Map keys must be unique");let v=yt(m??[],{indicator:"map-value-ind",next:g,offset:S.range[2],onError:s,parentIndent:r.indent,startOnNewline:!p||p.type==="block-scalar"});if(l=v.end,v.found){y&&(g?.type==="block-map"&&!v.hasNewline&&s(l,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),n.options.strict&&f.start<v.found.offset-1024&&s(S.range,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit block mapping key"));let b=g?e(n,g,v,s):t(n,l,m,null,v,s);n.schema.compat&&gs(r.indent,g,s),l=b.range[2];let $=new Q(S,b);n.options.keepSourceTokens&&($.srcToken=u),a.items.push($)}else{y&&s(S.range,"MISSING_CHAR","Implicit map keys need to be followed by map values"),v.comment&&(S.comment?S.comment+=`
144
+ `+v.comment:S.comment=v.comment);let b=new Q(S);n.options.keepSourceTokens&&(b.srcToken=u),a.items.push(b)}}return c&&c<l&&s(c,"IMPOSSIBLE","Map comment with trailing content"),a.range=[r.offset,l,c??l],a}function Rm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??Te,a=new o(n.schema);n.atRoot&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let l=r.offset,c=null;for(let{start:u,value:d}of r.items){let p=yt(u,{indicator:"seq-item-ind",next:d,offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0});if(!p.found)if(p.anchor||p.tag||d)d?.type==="block-seq"?s(p.end,"BAD_INDENT","All sequence items must start at the same column"):s(l,"MISSING_CHAR","Sequence item without - indicator");else{c=p.end,p.comment&&(a.comment=p.comment);continue}let m=d?e(n,d,p,s):t(n,p.end,u,null,p,s);n.schema.compat&&gs(r.indent,d,s),l=m.range[2],a.items.push(m)}return a.range=[r.offset,l,c??l],a}function wt(e,t,n,r){let s="";if(e){let i=!1,o="";for(let a of e){let{source:l,type:c}=a;switch(c){case"space":i=!0;break;case"comment":{n&&!i&&r(a,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let u=l.substring(1)||" ";s?s+=o+u:s=u,o="";break}case"newline":s&&(o+=l),i=!0;break;default:r(a,"UNEXPECTED_TOKEN",`Unexpected ${c} at node end`)}t+=l.length}}return{comment:s,offset:t}}var kc="Block collections are not allowed within flow collections",Tc=e=>e&&(e.type==="block-map"||e.type==="block-seq");function Sm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",l=i?.nodeClass??(o?te:Te),c=new l(n.schema);c.flow=!0;let u=n.atRoot;u&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let d=r.offset+r.start.source.length;for(let y=0;y<r.items.length;++y){let T=r.items[y],{start:S,key:v,sep:b,value:$}=T,D=yt(S,{flow:a,indicator:"explicit-key-ind",next:v??b?.[0],offset:d,onError:s,parentIndent:r.indent,startOnNewline:!1});if(!D.found){if(!D.anchor&&!D.tag&&!b&&!$){y===0&&D.comma?s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`):y<r.items.length-1&&s(D.start,"UNEXPECTED_TOKEN",`Unexpected empty item in ${a}`),D.comment&&(c.comment?c.comment+=`
145
+ `+D.comment:c.comment=D.comment),d=D.end;continue}!o&&n.options.strict&&tn(v)&&s(v,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line")}if(y===0)D.comma&&s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`);else if(D.comma||s(D.start,"MISSING_CHAR",`Missing , between ${a} items`),D.comment){let _="";e:for(let C of S)switch(C.type){case"comma":case"space":break;case"comment":_=C.source.substring(1);break e;default:break e}if(_){let C=c.items[c.items.length-1];q(C)&&(C=C.value??C.key),C.comment?C.comment+=`
146
+ `+_:C.comment=_,D.comment=D.comment.substring(_.length+1)}}if(!o&&!b&&!D.found){let _=$?e(n,$,D,s):t(n,D.end,b,null,D,s);c.items.push(_),d=_.range[2],Tc($)&&s(_.range,"BLOCK_IN_FLOW",kc)}else{n.atKey=!0;let _=D.end,C=v?e(n,v,D,s):t(n,_,S,null,D,s);Tc(v)&&s(C.range,"BLOCK_IN_FLOW",kc),n.atKey=!1;let w=yt(b??[],{flow:a,indicator:"map-value-ind",next:$,offset:C.range[2],onError:s,parentIndent:r.indent,startOnNewline:!1});if(w.found){if(!o&&!D.found&&n.options.strict){if(b)for(let Y of b){if(Y===w.found)break;if(Y.type==="newline"){s(Y,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}D.start<w.found.offset-1024&&s(w.found,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit flow sequence key")}}else $&&("source"in $&&$.source?.[0]===":"?s($,"MISSING_CHAR",`Missing space after : in ${a}`):s(w.start,"MISSING_CHAR",`Missing , or : between ${a} items`));let he=$?e(n,$,w,s):w.found?t(n,w.end,b,null,w,s):null;he?Tc($)&&s(he.range,"BLOCK_IN_FLOW",kc):w.comment&&(C.comment?C.comment+=`
147
+ `+w.comment:C.comment=w.comment);let ye=new Q(C,he);if(n.options.keepSourceTokens&&(ye.srcToken=T),o){let Y=c;eo(n,Y.items,C)&&s(_,"DUPLICATE_KEY","Map keys must be unique"),Y.items.push(ye)}else{let Y=new te(n.schema);Y.flow=!0,Y.items.push(ye);let mn=(he??C).range;Y.range=[C.range[0],mn[1],mn[2]],c.items.push(Y)}d=he?he.range[2]:w.end}}let p=o?"}":"]",[m,...g]=r.end,f=d;if(m?.source===p)f=m.offset+m.source.length;else{let y=a[0].toUpperCase()+a.substring(1),T=u?`${y} must end with a ${p}`:`${y} in block collection must be sufficiently indented and end with a ${p}`;s(d,u?"MISSING_CHAR":"BAD_INDENT",T),m&&m.source.length!==1&&g.unshift(m)}if(g.length>0){let y=wt(g,f,n.options.strict,s);y.comment&&(c.comment?c.comment+=`
148
+ `+y.comment:c.comment=y.comment),c.range=[r.offset,f,y.offset]}else c.range=[r.offset,f,f];return c}function bc(e,t,n,r,s,i){let o=n.type==="block-map"?bm(e,t,n,r,i):n.type==="block-seq"?Rm(e,t,n,r,i):Sm(e,t,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function Pm(e,t,n,r,s){let i=r.tag,o=i?t.directives.tagName(i.source,p=>s(i,"TAG_RESOLVE_FAILED",p)):null;if(n.type==="block-seq"){let{anchor:p,newlineAfterProp:m}=r,g=p&&i?p.offset>i.offset?p:i:p??i;g&&(!m||m.offset<g.offset)&&s(g,"MISSING_CHAR","Missing newline after block sequence props")}let a=n.type==="block-map"?"map":n.type==="block-seq"?"seq":n.start.source==="{"?"map":"seq";if(!i||!o||o==="!"||o===te.tagName&&a==="map"||o===Te.tagName&&a==="seq")return bc(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),bc(e,t,n,s,o)}let c=bc(e,t,n,s,o,l),u=l.resolve?.(c,p=>s(i,"TAG_RESOLVE_FAILED",p),t.options)??c,d=U(u)?u:new O(u);return d.range=c.range,d.tag=o,l?.format&&(d.format=l.format),d}function Rc(e,t,n){let r=t.offset,s=$S(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?DS(t.source):[],a=o.length;for(let f=o.length-1;f>=0;--f){let y=o[f][1];if(y===""||y==="\r")a=f;else break}if(a===0){let f=s.chomp==="+"&&o.length>0?`
149
+ `.repeat(Math.max(1,o.length-1)):"",y=r+s.length;return t.source&&(y+=t.source.length),{value:f,type:i,comment:s.comment,range:[r,y,y]}}let l=t.indent+s.indent,c=t.offset+s.length,u=0;for(let f=0;f<a;++f){let[y,T]=o[f];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),u=f,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 f=o.length-1;f>=a;--f)o[f][0].length>l&&(a=f+1);let d="",p="",m=!1;for(let f=0;f<u;++f)d+=o[f][0].slice(l)+`
150
+ `;for(let f=u;f<a;++f){let[y,T]=o[f];c+=y.length+T.length+1;let S=T[T.length-1]==="\r";if(S&&(T=T.slice(0,-1)),T&&y.length<l){let b=`Block scalar lines must not be less indented than their ${s.indent?"explicit indentation indicator":"first line"}`;n(c-T.length-(S?2:1),"BAD_INDENT",b),y=""}i===O.BLOCK_LITERAL?(d+=p+y.slice(l)+T,p=`
151
151
  `):y.length>l||T[0]===" "?(p===" "?p=`
152
- `:!h&&p===`
152
+ `:!m&&p===`
153
153
  `&&(p=`
154
154
 
155
155
  `),d+=p+y.slice(l)+T,p=`
156
- `,h=!0):T===""?p===`
156
+ `,m=!0):T===""?p===`
157
157
  `?d+=`
158
158
  `:p=`
159
- `:(d+=p+T,p=" ",h=!1)}switch(s.chomp){case"-":break;case"+":for(let m=a;m<o.length;++m)d+=`
160
- `+o[m][0].slice(l);d[d.length-1]!==`
159
+ `:(d+=p+T,p=" ",m=!1)}switch(s.chomp){case"-":break;case"+":for(let f=a;f<o.length;++f)d+=`
160
+ `+o[f][0].slice(l);d[d.length-1]!==`
161
161
  `&&(d+=`
162
162
  `);break;default:d+=`
163
- `}let f=r+s.length+t.source.length;return{value:d,type:i,comment:s.comment,range:[r,f,f]}}function AS({offset:e,props:t},n,r){if(t[0].type!=="block-scalar-header")return r(t[0],"IMPOSSIBLE","Block scalar header not found"),null;let{source:s}=t[0],i=s[0],o=0,a="",l=-1;for(let p=1;p<s.length;++p){let h=s[p];if(!a&&(h==="-"||h==="+"))a=h;else{let f=Number(h);!o&&f?o=f:l===-1&&(l=e+p)}}l!==-1&&r(l,"UNEXPECTED_TOKEN",`Block scalar header includes extra characters: ${s}`);let c=!1,u="",d=s.length;for(let p=1;p<t.length;++p){let h=t[p];switch(h.type){case"space":c=!0;case"newline":d+=h.source.length;break;case"comment":n&&!c&&r(h,"MISSING_CHAR","Comments must be separated from other tokens by white space characters"),d+=h.source.length,u=h.source.substring(1);break;case"error":r(h,"UNEXPECTED_TOKEN",h.message),d+=h.source.length;break;default:{let f=`Unexpected token in block scalar header: ${h.type}`;r(h,"UNEXPECTED_TOKEN",f);let m=h.source;m&&typeof m=="string"&&(d+=m.length)}}}return{mode:i,indent:o,chomp:a,comment:u,length:d}}function ES(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 Rc(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=OS(i,c);break;case"single-quoted-scalar":a=O.QUOTE_SINGLE,l=$S(i,c);break;case"double-quoted-scalar":a=O.QUOTE_DOUBLE,l=NS(i,c);break;default:return n(e,"UNEXPECTED_TOKEN",`Expected a flow scalar value, but found: ${s}`),{value:"",type:null,comment:"",range:[r,r+i.length,r+i.length]}}let u=r+i.length,d=yt(o,u,t,n);return{value:l,type:a,comment:d.comment,range:[r,u,d.offset]}}function OS(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}`),Rm(e)}function $S(e,t){return(e[e.length-1]!=="'"||e.length===1)&&t(e.length,"MISSING_CHAR","Missing closing 'quote"),Rm(e.slice(1,-1)).replace(/''/g,"'")}function Rm(e){let t,n;try{t=new RegExp(`(.*?)(?<![ ])[ ]*\r?
163
+ `}let g=r+s.length+t.source.length;return{value:d,type:i,comment:s.comment,range:[r,g,g]}}function $S({offset:e,props:t},n,r){if(t[0].type!=="block-scalar-header")return r(t[0],"IMPOSSIBLE","Block scalar header not found"),null;let{source:s}=t[0],i=s[0],o=0,a="",l=-1;for(let p=1;p<s.length;++p){let m=s[p];if(!a&&(m==="-"||m==="+"))a=m;else{let g=Number(m);!o&&g?o=g:l===-1&&(l=e+p)}}l!==-1&&r(l,"UNEXPECTED_TOKEN",`Block scalar header includes extra characters: ${s}`);let c=!1,u="",d=s.length;for(let p=1;p<t.length;++p){let m=t[p];switch(m.type){case"space":c=!0;case"newline":d+=m.source.length;break;case"comment":n&&!c&&r(m,"MISSING_CHAR","Comments must be separated from other tokens by white space characters"),d+=m.source.length,u=m.source.substring(1);break;case"error":r(m,"UNEXPECTED_TOKEN",m.message),d+=m.source.length;break;default:{let g=`Unexpected token in block scalar header: ${m.type}`;r(m,"UNEXPECTED_TOKEN",g);let f=m.source;f&&typeof f=="string"&&(d+=f.length)}}}return{mode:i,indent:o,chomp:a,comment:u,length:d}}function DS(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 Sc(e,t,n){let{offset:r,type:s,source:i,end:o}=e,a,l,c=(p,m,g)=>n(r+p,m,g);switch(s){case"scalar":a=O.PLAIN,l=NS(i,c);break;case"single-quoted-scalar":a=O.QUOTE_SINGLE,l=xS(i,c);break;case"double-quoted-scalar":a=O.QUOTE_DOUBLE,l=_S(i,c);break;default:return n(e,"UNEXPECTED_TOKEN",`Expected a flow scalar value, but found: ${s}`),{value:"",type:null,comment:"",range:[r,r+i.length,r+i.length]}}let u=r+i.length,d=wt(o,u,t,n);return{value:l,type:a,comment:d.comment,range:[r,u,d.offset]}}function NS(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}`),Im(e)}function xS(e,t){return(e[e.length-1]!=="'"||e.length===1)&&t(e.length,"MISSING_CHAR","Missing closing 'quote"),Im(e.slice(1,-1)).replace(/''/g,"'")}function Im(e){let t,n;try{t=new RegExp(`(.*?)(?<![ ])[ ]*\r?
164
164
  `,"sy"),n=new RegExp(`[ ]*(.*?)(?:(?<![ ])[ ]*)?\r?
165
165
  `,"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===`
166
166
  `?s+=i:i=`
167
- `:(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 NS(e,t){let n="";for(let r=1;r<e.length-1;++r){let s=e[r];if(!(s==="\r"&&e[r+1]===`
167
+ `:(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 _S(e,t){let n="";for(let r=1;r<e.length-1;++r){let s=e[r];if(!(s==="\r"&&e[r+1]===`
168
168
  `))if(s===`
169
- `){let{fold:i,offset:o}=DS(e,r);n+=i,r=o}else if(s==="\\"){let i=e[++r],o=xS[i];if(o)n+=o;else if(i===`
169
+ `){let{fold:i,offset:o}=FS(e,r);n+=i,r=o}else if(s==="\\"){let i=e[++r],o=LS[i];if(o)n+=o;else if(i===`
170
170
  `)for(i=e[r+1];i===" "||i===" ";)i=e[++r+1];else if(i==="\r"&&e[r+1]===`
171
- `)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+=_S(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!==`
171
+ `)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+=MS(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!==`
172
172
  `&&!(o==="\r"&&e[r+2]===`
173
- `)&&(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 DS(e,t){let n="",r=e[t+1];for(;(r===" "||r===" "||r===`
173
+ `)&&(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 FS(e,t){let n="",r=e[t+1];for(;(r===" "||r===" "||r===`
174
174
  `||r==="\r")&&!(r==="\r"&&e[t+2]!==`
175
175
  `);)r===`
176
176
  `&&(n+=`
177
- `),t+=1,r=e[t+1];return n||(n=" "),{fold:n,offset:t}}var xS={0:"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:`
178
- `,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function _S(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 Sc(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?bc(e,t,r):Rc(t,e.options.strict,r),l=n?e.directives.tagName(n.source,d=>r(n,"TAG_RESOLVE_FAILED",d)):null,c;e.options.stringKeys&&e.atKey?c=e.schema[xe]:l?c=FS(e.schema,s,l,n,r):t.type==="scalar"?c=LS(e,s,t,r):c=e.schema[xe];let u;try{let d=c.resolve(s,p=>r(n??t,"TAG_RESOLVE_FAILED",p),e.options);u=x(d)?d:new O(d)}catch(d){let p=d instanceof Error?d.message:String(d);r(n??t,"TAG_RESOLVE_FAILED",p),u=new O(s)}return u.range=a,u.source=s,i&&(u.type=i),l&&(u.tag=l),c.format&&(u.format=c.format),o&&(u.comment=o),u}function FS(e,t,n,r,s){if(n==="!")return e[xe];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[xe])}function LS({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[xe];if(n.compat){let a=n.compat.find(l=>l.default&&l.test?.test(r))??n[xe];if(o.tag!==a.tag){let l=t.tagString(o.tag),c=t.tagString(a.tag),u=`Value may be parsed as either ${l} or ${c}`;i(s,"TAG_RESOLVE_FAILED",u,!0)}}return o}function Sm(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 MS={composeNode:Pc,composeEmptyNode:to};function Pc(e,t,n,r){let s=e.atKey,{spaceBefore:i,comment:o,anchor:a,tag:l}=n,c,u=!0;switch(t.type){case"alias":c=jS(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=Sc(e,t,l,r),a&&(c.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{c=bm(MS,e,t,n,r),a&&(c.anchor=a.source.substring(1))}catch(d){let p=d instanceof Error?d.message:String(d);r(t,"RESOURCE_EXHAUSTION",p)}break;default:{let d=t.type==="error"?t.message:`Unsupported token (type: ${t.type})`;r(t,"UNEXPECTED_TOKEN",d),u=!1}}return c??(c=to(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&&u&&(c.srcToken=t),c}function to(e,t,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:l},c){let u={type:"scalar",offset:Sm(t,n,r),indent:-1,source:""},d=Sc(e,u,a,c);return o&&(d.anchor=o.source.substring(1),d.anchor===""&&c(o,"BAD_ALIAS","Anchor cannot be an empty string")),s&&(d.spaceBefore=!0),i&&(d.comment=i,d.range[2]=l),d}function jS({options:e},{offset:t,source:n,end:r},s){let i=new Ot(n.substring(1));i.source===""&&s(t,"BAD_ALIAS","Alias cannot be an empty string"),i.source.endsWith(":")&&s(t+n.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let o=t+n.length,a=yt(r,o,e.strict,s);return i.range=[t,o,a.offset],a.comment&&(i.comment=a.comment),i}function Pm(e,t,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:t},e),l=new Zt(void 0,a),c={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},u=gt(r,{indicator:"doc-start",next:s??i?.[0],offset:n,onError:o,parentIndent:0,startOnNewline:!0});u.found&&(l.directives.docStart=!0,s&&(s.type==="block-map"||s.type==="block-seq")&&!u.hasNewline&&o(u.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),l.contents=s?Pc(c,s,u,o):to(c,u.end,r,null,u,o);let d=l.contents.range[2],p=yt(i,d,!1,o);return p.comment&&(l.comment=p.comment),l.range=[n,d,p.offset],l}function gs(e){if(typeof e=="number")return[e,e+1];if(Array.isArray(e))return e.length===2?e:[e[0],e[1]];let{offset:t,source:n}=e;return[t,t+(typeof n=="string"?n.length:1)]}function Im(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
+ `),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:`
178
+ `,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function MS(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 Pc(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?Rc(e,t,r):Sc(t,e.options.strict,r),l=n?e.directives.tagName(n.source,d=>r(n,"TAG_RESOLVE_FAILED",d)):null,c;e.options.stringKeys&&e.atKey?c=e.schema[xe]:l?c=jS(e.schema,s,l,n,r):t.type==="scalar"?c=qS(e,s,t,r):c=e.schema[xe];let u;try{let d=c.resolve(s,p=>r(n??t,"TAG_RESOLVE_FAILED",p),e.options);u=x(d)?d:new O(d)}catch(d){let p=d instanceof Error?d.message:String(d);r(n??t,"TAG_RESOLVE_FAILED",p),u=new O(s)}return u.range=a,u.source=s,i&&(u.type=i),l&&(u.tag=l),c.format&&(u.format=c.format),o&&(u.comment=o),u}function jS(e,t,n,r,s){if(n==="!")return e[xe];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[xe])}function qS({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[xe];if(n.compat){let a=n.compat.find(l=>l.default&&l.test?.test(r))??n[xe];if(o.tag!==a.tag){let l=t.tagString(o.tag),c=t.tagString(a.tag),u=`Value may be parsed as either ${l} or ${c}`;i(s,"TAG_RESOLVE_FAILED",u,!0)}}return o}function vm(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 US={composeNode:Ic,composeEmptyNode:to};function Ic(e,t,n,r){let s=e.atKey,{spaceBefore:i,comment:o,anchor:a,tag:l}=n,c,u=!0;switch(t.type){case"alias":c=WS(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=Pc(e,t,l,r),a&&(c.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{c=Pm(US,e,t,n,r),a&&(c.anchor=a.source.substring(1))}catch(d){let p=d instanceof Error?d.message:String(d);r(t,"RESOURCE_EXHAUSTION",p)}break;default:{let d=t.type==="error"?t.message:`Unsupported token (type: ${t.type})`;r(t,"UNEXPECTED_TOKEN",d),u=!1}}return c??(c=to(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&&u&&(c.srcToken=t),c}function to(e,t,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:l},c){let u={type:"scalar",offset:vm(t,n,r),indent:-1,source:""},d=Pc(e,u,a,c);return o&&(d.anchor=o.source.substring(1),d.anchor===""&&c(o,"BAD_ALIAS","Anchor cannot be an empty string")),s&&(d.spaceBefore=!0),i&&(d.comment=i,d.range[2]=l),d}function WS({options:e},{offset:t,source:n,end:r},s){let i=new Ot(n.substring(1));i.source===""&&s(t,"BAD_ALIAS","Alias cannot be an empty string"),i.source.endsWith(":")&&s(t+n.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let o=t+n.length,a=wt(r,o,e.strict,s);return i.range=[t,o,a.offset],a.comment&&(i.comment=a.comment),i}function Cm(e,t,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:t},e),l=new en(void 0,a),c={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},u=yt(r,{indicator:"doc-start",next:s??i?.[0],offset:n,onError:o,parentIndent:0,startOnNewline:!0});u.found&&(l.directives.docStart=!0,s&&(s.type==="block-map"||s.type==="block-seq")&&!u.hasNewline&&o(u.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),l.contents=s?Ic(c,s,u,o):to(c,u.end,r,null,u,o);let d=l.contents.range[2],p=wt(i,d,!1,o);return p.comment&&(l.comment=p.comment),l.range=[n,d,p.offset],l}function hs(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 Am(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?`
179
179
 
180
180
  `:`
181
- `)+(i.substring(1)||" "),n=!0,r=!1;break;case"%":e[s+1]?.[0]!=="#"&&(s+=1),n=!1;break;default:n||(r=!0),n=!1}}return{comment:t,afterEmptyLine:r}}var ys=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=gs(n);i?this.warnings.push(new ms(o,r,s)):this.errors.push(new st(o,r,s))},this.directives=new mt({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=Im(this.prelude);if(r){let i=t.contents;if(n)t.comment=t.comment?`${t.comment}
181
+ `)+(i.substring(1)||" "),n=!0,r=!1;break;case"%":e[s+1]?.[0]!=="#"&&(s+=1),n=!1;break;default:n||(r=!0),n=!1}}return{comment:t,afterEmptyLine:r}}var ys=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=hs(n);i?this.warnings.push(new ms(o,r,s)):this.errors.push(new st(o,r,s))},this.directives=new gt({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=Am(this.prelude);if(r){let i=t.contents;if(n)t.comment=t.comment?`${t.comment}
182
182
  ${r}`:r;else if(s||t.directives.docStart||!i)t.commentBefore=r;else if(B(i)&&!i.flow&&i.items.length>0){let o=i.items[0];q(o)&&(o=o.key);let a=o.commentBefore;o.commentBefore=a?`${r}
183
183
  ${a}`:r}else{let o=i.commentBefore;i.commentBefore=o?`${r}
184
- ${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:Im(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(t,n=!1,r=-1){for(let s of t)yield*this.next(s);yield*this.end(n,r)}*next(t){switch(t.type){case"directive":this.directives.add(t.source,(n,r,s)=>{let i=gs(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=Pm(this.options,this.directives,t,this.onError);this.atDirectives&&!n.directives.docStart&&this.onError(t,"MISSING_CHAR","Missing directives-end/doc-start indicator line"),this.decorate(n,!1),this.doc&&(yield this.doc),this.doc=n,this.atDirectives=!1;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(t.source);break;case"error":{let n=t.source?`${t.message}: ${JSON.stringify(t.source)}`:t.message,r=new st(gs(t),"UNEXPECTED_TOKEN",n);this.atDirectives||!this.doc?this.errors.push(r):this.doc.errors.push(r);break}case"doc-end":{if(!this.doc){let r="Unexpected doc-end without preceding document";this.errors.push(new st(gs(t),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=yt(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}
185
- ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.push(new st(gs(t),"UNEXPECTED_TOKEN",`Unsupported token ${t.type}`))}}*end(t=!1,n=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(t){let r=Object.assign({_directives:this.directives},this.options),s=new Zt(void 0,r);this.atDirectives&&this.onError(n,"MISSING_CHAR","Missing directives-end indicator line"),s.range=[0,n,n],this.decorate(s,!1),yield s}}};var Ic=Symbol("break visit"),qS=Symbol("skip children"),vm=Symbol("remove item");function On(e,t){"type"in e&&e.type==="document"&&(e={start:e.start,value:e.value}),Cm(Object.freeze([]),e,t)}On.BREAK=Ic;On.SKIP=qS;On.REMOVE=vm;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 Cm(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=Cm(Object.freeze(e.concat([[s,o]])),i.items[o],n);if(typeof a=="number")o=a-1;else{if(a===Ic)return Ic;a===vm&&(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 vc="\uFEFF",Cc="",Ac="",no="";function Am(e){switch(e){case vc:return"byte-order-mark";case Cc:return"doc-mode";case Ac:return"flow-error-end";case no:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case`
184
+ ${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:Am(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=hs(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=Cm(this.options,this.directives,t,this.onError);this.atDirectives&&!n.directives.docStart&&this.onError(t,"MISSING_CHAR","Missing directives-end/doc-start indicator line"),this.decorate(n,!1),this.doc&&(yield this.doc),this.doc=n,this.atDirectives=!1;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(t.source);break;case"error":{let n=t.source?`${t.message}: ${JSON.stringify(t.source)}`:t.message,r=new st(hs(t),"UNEXPECTED_TOKEN",n);this.atDirectives||!this.doc?this.errors.push(r):this.doc.errors.push(r);break}case"doc-end":{if(!this.doc){let r="Unexpected doc-end without preceding document";this.errors.push(new st(hs(t),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=wt(t.end,t.offset+t.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),n.comment){let r=this.doc.comment;this.doc.comment=r?`${r}
185
+ ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.push(new st(hs(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 en(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 vc=Symbol("break visit"),BS=Symbol("skip children"),Em=Symbol("remove item");function On(e,t){"type"in e&&e.type==="document"&&(e={start:e.start,value:e.value}),Om(Object.freeze([]),e,t)}On.BREAK=vc;On.SKIP=BS;On.REMOVE=Em;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 Om(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=Om(Object.freeze(e.concat([[s,o]])),i.items[o],n);if(typeof a=="number")o=a-1;else{if(a===vc)return vc;a===Em&&(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 Cc="\uFEFF",Ac="",Ec="",no="";function $m(e){switch(e){case Cc:return"byte-order-mark";case Ac:return"doc-mode";case Ec:return"flow-error-end";case no:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case`
186
186
  `:case`\r
187
187
  `:return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(e[0]){case" ":case" ":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}function it(e){switch(e){case void 0:case" ":case`
188
- `:case"\r":case" ":return!0;default:return!1}}var Em=new Set("0123456789ABCDEFabcdef"),WS=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),ro=new Set(",[]{}"),BS=new Set(` ,[]{}
189
- \r `),Ec=e=>!e||BS.has(e),ws=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(t,n=!1){if(t){if(typeof t!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+t:t,this.lineEndPos=null}this.atEnd=!n;let r=this.next??"stream";for(;r&&(n||this.hasChars(1));)r=yield*this.parseNext(r)}atLineEnd(){let t=this.pos,n=this.buffer[t];for(;n===" "||n===" ";)n=this.buffer[++t];return!n||n==="#"||n===`
188
+ `:case"\r":case" ":return!0;default:return!1}}var Dm=new Set("0123456789ABCDEFabcdef"),KS=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),ro=new Set(",[]{}"),GS=new Set(` ,[]{}
189
+ \r `),Oc=e=>!e||GS.has(e),ws=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(t,n=!1){if(t){if(typeof t!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+t:t,this.lineEndPos=null}this.atEnd=!n;let r=this.next??"stream";for(;r&&(n||this.hasChars(1));)r=yield*this.parseNext(r)}atLineEnd(){let t=this.pos,n=this.buffer[t];for(;n===" "||n===" ";)n=this.buffer[++t];return!n||n==="#"||n===`
190
190
  `?!0:n==="\r"?this.buffer[t+1]===`
191
191
  `:!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===`
192
192
  `||!s&&!this.atEnd)return t+r+1}return n===`
193
193
  `||r>=this.indentNext||!n&&!this.atEnd?t+r:-1}if(n==="-"||n==="."){let r=this.buffer.substr(t,3);if((r==="---"||r==="...")&&it(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(`
194
- `,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]===vc&&(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 Cc,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==="...")&&it(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&&!it(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===":")&&it(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(Ec),"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("..."))&&it(s[3]))&&!(r===this.indentNext-1&&this.flowLevel===1&&(s[0]==="]"||s[0]==="}")))return this.flowLevel=0,yield Ac,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(Ec),"flow";case'"':case"'":return this.flowKey=!0,yield*this.parseQuotedScalar();case":":{let o=this.charAt(1);if(this.flowKey||it(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(`
194
+ `,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]===Cc&&(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 Ac,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==="...")&&it(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&&!it(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===":")&&it(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(Oc),"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("..."))&&it(s[3]))&&!(r===this.indentNext-1&&this.flowLevel===1&&(s[0]==="]"||s[0]==="}")))return this.flowLevel=0,yield Ec,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(Oc),"flow";case'"':case"'":return this.flowKey=!0,yield*this.parseQuotedScalar();case":":{let o=this.charAt(1);if(this.flowKey||it(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(`
195
195
  `,this.pos);if(s!==-1){for(;s!==-1;){let i=this.continueScalar(s+1);if(i===-1)break;s=r.indexOf(`
196
196
  `,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=>it(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`
197
197
  `:t=i,n=0;break;case"\r":{let o=this.buffer[i+1];if(!o&&!this.atEnd)return this.setNext("block-scalar");if(o===`
@@ -201,21 +201,21 @@ ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.pus
201
201
  `&&i>=this.pos&&i+1+n>a)t=i;else break}while(!0);return yield no,yield*this.pushToIndex(t+1,!0),yield*this.parseLineStart()}*parsePlainScalar(){let t=this.flowLevel>0,n=this.pos-1,r=this.pos-1,s;for(;s=this.buffer[++r];)if(s===":"){let i=this.buffer[r+1];if(it(i)||t&&ro.has(i))break;n=r}else if(it(s)){let i=this.buffer[r+1];if(s==="\r"&&(i===`
202
202
  `?(r+=1,s=`
203
203
  `,i=this.buffer[r+1]):n=r),i==="#"||t&&ro.has(i))break;if(s===`
204
- `){let o=this.continueScalar(r+1);if(o===-1)break;r=Math.max(r,o-2)}}else{if(t&&ro.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield no,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(Ec),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(it(r)||n&&ro.has(r)){n?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,t+=yield*this.pushCount(1),t+=yield*this.pushSpaces(!0);continue e}}}break e}return t}*pushTag(){if(this.charAt(1)==="<"){let t=this.pos+2,n=this.buffer[t];for(;!it(n)&&n!==">";)n=this.buffer[++t];return yield*this.pushToIndex(n===">"?t+1:t,!1)}else{let t=this.pos+1,n=this.buffer[t];for(;n;)if(WS.has(n))n=this.buffer[++t];else if(n==="%"&&Em.has(this.buffer[t+1])&&Em.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===`
204
+ `){let o=this.continueScalar(r+1);if(o===-1)break;r=Math.max(r,o-2)}}else{if(t&&ro.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield no,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(Oc),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(it(r)||n&&ro.has(r)){n?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,t+=yield*this.pushCount(1),t+=yield*this.pushSpaces(!0);continue e}}}break e}return t}*pushTag(){if(this.charAt(1)==="<"){let t=this.pos+2,n=this.buffer[t];for(;!it(n)&&n!==">";)n=this.buffer[++t];return yield*this.pushToIndex(n===">"?t+1:t,!1)}else{let t=this.pos+1,n=this.buffer[t];for(;n;)if(KS.has(n))n=this.buffer[++t];else if(n==="%"&&Dm.has(this.buffer[t+1])&&Dm.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===`
205
205
  `?yield*this.pushCount(1):t==="\r"&&this.charAt(1)===`
206
- `?yield*this.pushCount(2):0}*pushSpaces(t){let n=this.pos-1,r;do r=this.buffer[++n];while(r===" "||t&&r===" ");let s=n-this.pos;return s>0&&(yield this.buffer.substr(this.pos,s),this.pos=n),s}*pushUntil(t){let n=this.pos,r=this.buffer[n];for(;!t(r);)r=this.buffer[++n];return yield*this.pushToIndex(n,!1)}};var ks=class{constructor(){this.lineStarts=[],this.addNewLine=t=>this.lineStarts.push(t),this.linePos=t=>{let n=0,r=this.lineStarts.length;for(;n<r;){let i=n+r>>1;this.lineStarts[i]<t?n=i+1:r=i}if(this.lineStarts[n]===t)return{line:n+1,col:1};if(n===0)return{line:0,col:t};let s=this.lineStarts[n-1];return{line:n,col:t-s+1}}}};function tn(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function Om(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 Nm(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 so(e){switch(e.type){case"document":return e.start;case"block-map":{let t=e.items[e.items.length-1];return t.sep??t.start}case"block-seq":return e.items[e.items.length-1].start;default:return[]}}function gr(e){if(e.length===0)return[];let t=e.length;e:for(;--t>=0;)switch(e[t].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break e}for(;e[++t]?.type==="space";);return e.splice(t,e.length)}function io(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 $m(e){if(e.start.type==="flow-seq-start")for(let t of e.items)t.sep&&!t.value&&!tn(t.start,"explicit-key-ind")&&!tn(t.sep,"map-value-ind")&&(t.key&&(t.value=t.key),delete t.key,Nm(t.value)?t.value.end?io(t.value.end,t.sep):t.value.end=t.sep:io(t.start,t.sep),delete t.sep)}var Ts=class{constructor(t){this.atNewLine=!0,this.atScalar=!1,this.indent=0,this.offset=0,this.onKeyLine=!1,this.stack=[],this.source="",this.type="",this.lexer=new ws,this.onNewLine=t}*parse(t,n=!1){this.onNewLine&&this.offset===0&&this.onNewLine(0);for(let r of this.lexer.lex(t,n))yield*this.next(r);n||(yield*this.end())}*next(t){if(this.source=t,this.atScalar){this.atScalar=!1,yield*this.step(),this.offset+=t.length;return}let n=Am(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"&&$m(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&&Om(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":{Om(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=so(this.peek(2)),r=gr(n),s;t.end?(s=t.end,s.push(this.sourceToken),delete t.end):s=[this.sourceToken];let i={type:"block-map",offset:t.offset,indent:t.indent,items:[{start:r,key:t,sep:s}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=i}else yield*this.lineEnd(t)}*blockScalar(t){switch(this.type){case"space":case"comment":case"newline":t.props.push(this.sourceToken);return;case"scalar":if(t.source=this.source,this.atNewLine=!0,this.indent=0,this.onNewLine){let n=this.source.indexOf(`
206
+ `?yield*this.pushCount(2):0}*pushSpaces(t){let n=this.pos-1,r;do r=this.buffer[++n];while(r===" "||t&&r===" ");let s=n-this.pos;return s>0&&(yield this.buffer.substr(this.pos,s),this.pos=n),s}*pushUntil(t){let n=this.pos,r=this.buffer[n];for(;!t(r);)r=this.buffer[++n];return yield*this.pushToIndex(n,!1)}};var ks=class{constructor(){this.lineStarts=[],this.addNewLine=t=>this.lineStarts.push(t),this.linePos=t=>{let n=0,r=this.lineStarts.length;for(;n<r;){let i=n+r>>1;this.lineStarts[i]<t?n=i+1:r=i}if(this.lineStarts[n]===t)return{line:n+1,col:1};if(n===0)return{line:0,col:t};let s=this.lineStarts[n-1];return{line:n,col:t-s+1}}}};function nn(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function Nm(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 _m(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 so(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 hr(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 io(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 xm(e){if(e.start.type==="flow-seq-start")for(let t of e.items)t.sep&&!t.value&&!nn(t.start,"explicit-key-ind")&&!nn(t.sep,"map-value-ind")&&(t.key&&(t.value=t.key),delete t.key,_m(t.value)?t.value.end?io(t.value.end,t.sep):t.value.end=t.sep:io(t.start,t.sep),delete t.sep)}var Ts=class{constructor(t){this.atNewLine=!0,this.atScalar=!1,this.indent=0,this.offset=0,this.onKeyLine=!1,this.stack=[],this.source="",this.type="",this.lexer=new ws,this.onNewLine=t}*parse(t,n=!1){this.onNewLine&&this.offset===0&&this.onNewLine(0);for(let r of this.lexer.lex(t,n))yield*this.next(r);n||(yield*this.end())}*next(t){if(this.source=t,this.atScalar){this.atScalar=!1,yield*this.step(),this.offset+=t.length;return}let n=$m(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"&&xm(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&&Nm(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":{Nm(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=so(this.peek(2)),r=hr(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(`
207
207
  `)+1;for(;n!==0;)this.onNewLine(this.offset+n),n=this.source.indexOf(`
208
- `,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)){io(s,n.start),s.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return}if(this.indent>=t.indent){let r=!this.onKeyLine&&this.indent===t.indent,s=r&&(n.sep||n.explicitKey)&&this.type!=="seq-item-ind",i=[];if(s&&n.sep&&!n.value){let o=[];for(let a=0;a<n.sep.length;++a){let l=n.sep[a];switch(l.type){case"newline":o.push(a);break;case"space":break;case"comment":l.indent>t.indent&&(o.length=0);break;default:o.length=0}}o.length>=2&&(i=n.sep.splice(o[1]))}switch(this.type){case"anchor":case"tag":s||n.value?(i.push(this.sourceToken),t.items.push({start:i}),this.onKeyLine=!0):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"explicit-key-ind":!n.sep&&!n.explicitKey?(n.start.push(this.sourceToken),n.explicitKey=!0):s||n.value?(i.push(this.sourceToken),t.items.push({start:i,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(n.explicitKey)if(n.sep)if(n.value)t.items.push({start:[],key:null,sep:[this.sourceToken]});else if(tn(n.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]});else if(Nm(n.key)&&!tn(n.sep,"newline")){let o=gr(n.start),a=n.key,l=n.sep;l.push(this.sourceToken),delete n.key,delete n.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:a,sep:l}]})}else i.length>0?n.sep=n.sep.concat(i,this.sourceToken):n.sep.push(this.sourceToken);else if(tn(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=gr(n.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]})}else n.sep?n.value||s?t.items.push({start:i,key:null,sep:[this.sourceToken]}):tn(n.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let o=this.flowScalar(this.type);s||n.value?(t.items.push({start:i,key:o,sep:[]}),this.onKeyLine=!0):n.sep?this.stack.push(o):(Object.assign(n,{key:o,sep:[]}),this.onKeyLine=!0);return}default:{let o=this.startBlockValue(t);if(o){if(o.type==="block-seq"){if(!n.explicitKey&&n.sep&&!tn(n.sep,"newline")){yield*this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source});return}}else r&&t.items.push({start:i});this.stack.push(o);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(t){let n=t.items[t.items.length-1];switch(this.type){case"newline":if(n.value){let r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):t.items.push({start:[this.sourceToken]})}else n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)t.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(n.start,t.indent)){let s=t.items[t.items.length-2]?.value?.end;if(Array.isArray(s)){io(s,n.start),s.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return;case"anchor":case"tag":if(n.value||this.indent<=t.indent)break;n.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==t.indent)break;n.value||tn(n.start,"seq-item-ind")?t.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return}if(this.indent>t.indent){let r=this.startBlockValue(t);if(r){this.stack.push(r);return}}yield*this.pop(),yield*this.step()}*flowCollection(t){let n=t.items[t.items.length-1];if(this.type==="flow-error-end"){let r;do yield*this.pop(),r=this.peek(1);while(r?.type==="flow-collection")}else if(t.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!n||n.sep?t.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return;case"map-value-ind":!n||n.value?t.items.push({start:[],key:null,sep:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!n||n.value?t.items.push({start:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let s=this.flowScalar(this.type);!n||n.value?t.items.push({start:[],key:s,sep:[]}):n.sep?this.stack.push(s):Object.assign(n,{key:s,sep:[]});return}case"flow-map-end":case"flow-seq-end":t.end.push(this.sourceToken);return}let r=this.startBlockValue(t);r?this.stack.push(r):(yield*this.pop(),yield*this.step())}else{let r=this.peek(2);if(r.type==="block-map"&&(this.type==="map-value-ind"&&r.indent===t.indent||this.type==="newline"&&!r.items[r.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type==="map-value-ind"&&r.type!=="flow-collection"){let s=so(r),i=gr(s);$m(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(`
208
+ `,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)){io(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(nn(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(_m(n.key)&&!nn(n.sep,"newline")){let o=hr(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(nn(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=hr(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]}):nn(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&&!nn(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)){io(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||nn(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=so(r),i=hr(s);xm(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(`
209
209
  `)+1;for(;n!==0;)this.onNewLine(this.offset+n),n=this.source.indexOf(`
210
- `,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=so(t),r=gr(n);return r.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let n=so(t),r=gr(n);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(t,n){return this.type!=="comment"||this.indent<=n?!1:t.every(r=>r.type==="newline"||r.type==="space")}*documentEnd(t){this.type!=="doc-mode"&&(t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(t){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;default:t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};function VS(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new ks||null,prettyErrors:t}}function Oc(e,t={}){let{lineCounter:n,prettyErrors:r}=VS(t),s=new Ts(n?.addNewLine),i=new ys(t),o=null;for(let a of i.compose(s.parse(e),!0,e.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new st(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(yc(e,n)),o.warnings.forEach(yc(e,n))),o}var bs=1024*1024;function $c(e,t){Buffer.byteLength(e)>bs&&oo(t,[`Definition exceeds ${bs} bytes.`]);let n=Oc(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];Ye(n,(i,o)=>{_e(o)&&r.push("YAML aliases are not supported."),typeof o=="object"&&o!==null&&"anchor"in o&&typeof o.anchor=="string"&&r.push("YAML anchors are not supported.")});let s=[...n.errors.map(i=>i.message),...n.warnings.map(i=>i.message),...r];s.length>0&&oo(t,s),n.contents===null&&oo(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){oo(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function oo(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}import{createHash as GS}from"node:crypto";var yr=/^[a-z][a-z0-9_-]{0,63}$/,Dm=/\$\{\{\s*([^{}]+?)\s*\}\}/g,xm=32,_m=128,HS=16,YS=32,zS=10080*60*1e3,wr=32*1024,Fm=16;function xc(e,t){let n=[],r=Fe(e,"$",n);ot(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=oP(r.name,"$.name",n),i=XS(r.limits,n),o=QS(r.inputs,n),a=ZS(r.steps,n);a.length>_m&&n.push(`$.steps may contain at most ${_m} steps.`),a.filter(d=>d.kind==="agent"&&d.createChild).length>i.maxTasks&&n.push("$.steps creates more child tasks than limits.max_tasks allows.");let l=new Set(a.map(d=>d.id));for(let d of a)for(let p of d.needs)l.has(p)||n.push(`$.steps.${d.id}.needs references missing step "${p}".`),p===d.id&&n.push(`$.steps.${d.id}.needs cannot reference itself.`);let c=nP(a,n);c&&rP(a,o,c.ancestors,n),n.length>0&&cP(t,n);let u={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:u,hash:GS("sha256").update(Dc(u)).digest("hex"),order:c.order,waves:JS(c.waves,i.maxConcurrency)}}function JS(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 XS(e,t){let n=Fe(e,"$.limits",t);ot(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=Lm(n.max_concurrency,"$.limits.max_concurrency",1,HS,t),s=Lm(n.max_tasks,"$.limits.max_tasks",1,YS,t),i=qm(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function QS(e,t){if(e===void 0)return{};let n=Fe(e,"$.inputs",t),r=Object.entries(n);r.length>xm&&t.push(`$.inputs may contain at most ${xm} inputs.`);let s={};for(let[i,o]of r){yr.test(i)||t.push(`$.inputs key "${i}" must match ${yr}.`);let a=Fe(o,`$.inputs.${i}`,t);ot(a,["type","required","default"],`$.inputs.${i}`,t);let l=lP(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:aP(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&&!Mm(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&Mm(a.default,l)?{defaultValue:a.default}:{}}}return s}function ZS(e,t){let n=Fe(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{yr.test(s)||t.push(`$.steps key "${s}" must match ${yr}.`);let o=Fe(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?tP(s,o,a,t):eP(s,o,a,t)})}function eP(e,t,n,r){ot(t,["needs","task","create_child","agent","prompt","output"],`$.steps.${e}`,r);let s=t.task!==void 0,i=t.create_child!==void 0;s===i&&r.push(`$.steps.${e} must define exactly one of task or create_child.`);let o=s?nn(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let d=Fe(t.create_child,`$.steps.${e}.create_child`,r);ot(d,["repo"],`$.steps.${e}.create_child`,r),a={repo:nn(d.repo,`$.steps.${e}.create_child.repo`,r)}}let l;if(t.agent!==void 0){let d=Fe(t.agent,`$.steps.${e}.agent`,r);if(ot(d,["runner"],`$.steps.${e}.agent`,r),d.runner!==void 0)try{l=k.runners.parse(nn(d.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=nn(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>wr&&r.push(`$.steps.${e}.prompt exceeds ${wr} bytes.`);let u;if(t.output!==void 0){let d=Fe(t.output,`$.steps.${e}.output`,r);ot(d,["schema"],`$.steps.${e}.output`,r),u=Nc(d.schema,`$.steps.${e}.output.schema`,r,0)}return{kind:"agent",id:e,needs:n,prompt:c,...o!==void 0?{task:o}:{},...a?{createChild:a}:{},...l?{runner:l}:{},...u?{outputSchema:u}:{}}}function tP(e,t,n,r){ot(t,["needs","human_review"],`$.steps.${e}`,r);let s=Fe(t.human_review,`$.steps.${e}.human_review`,r);ot(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=Fe(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);ot(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=nn(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:nn(s.title,`$.steps.${e}.human_review.title`,r),summary:nn(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:qm(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function Nc(e,t,n,r){if(r>Fm)return n.push(`${t} exceeds the maximum schema depth of ${Fm}.`),{};let s=Fe(e,t,n);ot(s,["type","properties","required","items","enum","additionalProperties","description"],t,n);let i=["object","array","string","number","integer","boolean","null"];if((typeof s.type!="string"||!i.includes(s.type))&&n.push(`${t}.type is unsupported.`),s.required!==void 0&&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=Fe(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))Nc(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&Nc(s.items,`${t}.items`,n,r+1),s}function nP(e,t){let n=new Set(e.map(d=>d.id));if(e.some(d=>d.needs.some(p=>!n.has(p))))return null;let r=new Map(e.map((d,p)=>[d.id,p])),s=new Map(e.map(d=>[d.id,d.needs.length])),i=new Map;for(let d of e)for(let p of d.needs)i.set(p,[...i.get(p)??[],d.id]);let o=e.filter(d=>d.needs.length===0).map(d=>d.id),a=[],l=[];for(;o.length>0;){o.sort((h,f)=>r.get(h)-r.get(f));let d=o;l.push(d),a.push(...d);let p=[];for(let h of d)for(let f of i.get(h)??[]){let m=s.get(f)-1;s.set(f,m),m===0&&p.push(f)}o=p}if(a.length!==e.length)return t.push("$.steps must form an acyclic graph."),null;let c=new Map(e.map(d=>[d.id,d])),u=new Map;for(let d of a){let p=new Set;for(let h of c.get(d).needs){p.add(h);for(let f of u.get(h)??[])p.add(f)}u.set(d,p)}return{order:a,waves:l,ancestors:u}}function rP(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(Dm)],c=a.replace(Dm,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let u of l)sP(u[1].trim(),i,t,n,s,r)}}}function sP(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&&iP(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function iP(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(!ao(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(!ao(a))return;i=a}}function Dc(e){return Array.isArray(e)?`[${e.map(Dc).join(",")}]`:ao(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Dc(e[t])}`).join(",")}}`:JSON.stringify(e)}function Fe(e,t,n){return ao(e)?e:(n.push(`${t} must be an object.`),{})}function ot(e,t,n,r){let s=new Set(t);for(let i of Object.keys(e))s.has(i)||r.push(`${n}.${i} is not supported.`)}function oP(e,t,n){let r=nn(e,t,n);return yr.test(r)||n.push(`${t} must match ${yr}.`),r}function nn(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function 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 Lm(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 aP(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function lP(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function Mm(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function qm(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>zS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function cP(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var ao=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as dP,stat as uP}from"node:fs/promises";var pP=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function _c(e){let t=await Um(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 Fc(e,t){let n=await Um(e),r=fP(n.definition.inputs,t),s=new Map(n.waves.flatMap((a,l)=>a.map(c=>[c,l]))),i=new Map(n.definition.steps.map(a=>[a.id,a])),o=n.order.map(a=>{let l=i.get(a);return l.kind==="human_review"?{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:null,runner:null,prompt:null,outputSchema:null,review:{title:kr(l.title,r,`$.steps.${a}.human_review.title`),summary:kr(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?kr(l.feedbackTask,r,`$.steps.${a}.human_review.feedback_target.task`):null,timeoutMs:l.timeoutMs??n.definition.limits.timeoutMs}}:{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:l.task?{type:"task",task:kr(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",repo:kr(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)},runner:l.runner??null,prompt:gP(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 Um(e){let t;try{let n=await uP(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>bs)throw new Error(`Definition exceeds ${bs} bytes.`);t=await dP(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return xc($c(t,e),e)}function fP(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]=mP(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 mP(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 hP(e,t){return e.replace(pP,(n,r)=>{if(!Object.hasOwn(t,r))throw new g("FURY_INPUT_INVALID",`Input "${r}" is required by a template but has no value.`,{details:{input:r}});return String(t[r])})}function kr(e,t,n){let r=hP(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 gP(e,t,n){let r=`$.steps.${n}.prompt`,s=kr(e,t,r);if(Buffer.byteLength(s)>wr)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${wr} bytes.`,{details:{location:r,maxBytes:wr}});return s}import{createHash as Wm}from"node:crypto";import yP from"node:path";import{mkdir as wP}from"node:fs/promises";var Lc={type:"system",component:"heartbeat"};async function rn(e,t={}){await wP(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([S.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):At.listAgents(e),Rf(e),IP(e)]),o=r??ut(n.tasks.filter(f=>f.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=PP(i),l=a!==i,c=[],u=Mc(s.filter(SP),f=>f.taskId),d=Mc(s.filter(f=>f.type.startsWith("task.pr.")),f=>f.taskId),p=Mc(s.filter(f=>f.type==="agent.state.changed"),f=>f.agentTabId);for(let f of n.tasks){let m=kP(f),y=u.get(f.id),T=qc(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",C=await De(e,{id:jc(_,f.id,m.signature),type:_,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:Lc,data:{...m,changedFields:T?bP(T,m):[]}});c.push(C),R=C.id}a.tasks[f.id]={...m,eventId:R};let v=RP(f.prs),b=d.get(f.id),$=qc(b?.data)??a.pullRequests[f.id]??null,N=b?.id??a.pullRequests[f.id]?.eventId??null;if(($||v.associations.length>0)&&$?.signature!==v.signature){let _=Array.isArray($?.associations)?$.associations.length:0,C=v.associations.length>_?"task.pr.linked":v.associations.length<_?"task.pr.unlinked":"task.pr.refreshed",w=await De(e,{id:jc(C,f.id,v.signature),type:C,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:Lc,data:v});c.push(w),N=w.id}a.pullRequests[f.id]={...v,eventId:N}}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=qc(m?.data)??a.agents[f.tabId]??null;if(y?.state===f.state){a.agents[f.tabId]={state:f.state,eventId:m?.id??a.agents[f.tabId]?.eventId??null};continue}let T=[m?.id??a.agents[f.tabId]?.eventId??"initial",f.state,f.sessionState??"none",f.lastActivityAt??"none",f.exitCode??"none",f.error??"none"].join(":"),R=await De(e,{id:jc("agent.state.changed",f.tabId,T),type:"agent.state.changed",taskId:f.taskId,agentTabId:f.tabId,actor:Lc,data:{previousState:typeof y?.state=="string"?y.state:null,state:f.state,taskState:h.get(f.taskId)??"idle",sessionState:f.sessionState,lastActivityAt:f.lastActivityAt,exitCode:f.exitCode,error:f.error}});c.push(R),a.agents[f.tabId]={state:f.state,eventId:R.id}}return(c.length>0||l)&&await M(Vm(e),a),c}function kP(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:Bm(t)}}var TP=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function bP(e,t){return TP.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function RP(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:Bm(t)}}function Mc(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var SP=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",Bm=e=>Wm("sha256").update(JSON.stringify(e)).digest("hex"),jc=(...e)=>Wm("sha256").update(e.join("\0")).digest("hex"),qc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,Vm=e=>yP.join(e.orchestrationDir,"event-reconciliation.json");function PP(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 IP(e){try{return await Ms(Vm(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function vP(e,t){return await Uc(e),await rn(e),In(e,t)}async function CP(e,t,n){await Uc(e);let r=await At.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await rn(e,{agentObserver:r});let a=await In(e,{...t,...s?{after:s}:{}});for(let l of a.events)n.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,n.signal?.aborted)break;await Km(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function AP(e,t,n){await Uc(e);let r=await S.getTask(e,t);if(n.tabId&&!r.ptyTabs.some(i=>i.kind==="agent"&&i.id===n.tabId))throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${t}.`,{details:{taskId:t,tabId:n.tabId}});let s=await At.openObserver(e);try{await rn(e,{agentObserver:s});let o=(await In(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=ut([r],s.getSnapshots(),l),u=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(u))return{kind:"waitTask",taskId:t,tabId:n.tabId??null,state:u,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw OP(t);let d=a-Date.now();if(d<=0)throw EP(t,n.states,n.timeoutMs);await rn(e,{agentObserver:s}),o=(await In(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await Km(Math.min(250,d),n.signal)}}finally{s.close()}}async function Uc(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 Km(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 EP=(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}}),OP=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),lo={list:vP,watch:CP,waitForTaskState:AP,reconcile:rn};import{readFile as DP}from"node:fs/promises";import{createConnection as $P}from"node:net";async function Dt(e){let t=await Gm(Ct(e).socketPath).catch(()=>null);if(!t)return!1;try{return(await co(t,{type:"ping"})).protocolVersion!==Pn?!1:(await co(t,{type:"wakeOrchestration"}),!0)}catch{return!1}finally{t.end()}}async function Wc(e,t){if(t.length===0)return!0;let n=await Gm(Ct(e).socketPath).catch(()=>null);if(!n)return!1;try{if((await co(n,{type:"ping"})).protocolVersion!==Pn)return!1;for(let s of t)await co(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}var NP=1;function co(e,t){let n=NP++;return new Promise((r,s)=>{let i="",o=setTimeout(()=>s(new Error("Craig PTY daemon request timed out.")),1e3),a=c=>{i+=String(c);let u=i.indexOf(`
210
+ `,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=so(t),r=hr(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=so(t),r=hr(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 HS(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new ks||null,prettyErrors:t}}function $c(e,t={}){let{lineCounter:n,prettyErrors:r}=HS(t),s=new Ts(n?.addNewLine),i=new ys(t),o=null;for(let a of i.compose(s.parse(e),!0,e.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new st(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(wc(e,n)),o.warnings.forEach(wc(e,n))),o}var bs=1024*1024;function Dc(e,t){Buffer.byteLength(e)>bs&&oo(t,[`Definition exceeds ${bs} bytes.`]);let n=$c(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];Ye(n,(i,o)=>{_e(o)&&r.push("YAML aliases are not supported."),typeof o=="object"&&o!==null&&"anchor"in o&&typeof o.anchor=="string"&&r.push("YAML anchors are not supported.")});let s=[...n.errors.map(i=>i.message),...n.warnings.map(i=>i.message),...r];s.length>0&&oo(t,s),n.contents===null&&oo(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){oo(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function oo(e,t){throw new h("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}import{createHash as zS}from"node:crypto";var yr=/^[a-z][a-z0-9_-]{0,63}$/,Fm=/\$\{\{\s*([^{}]+?)\s*\}\}/g,Lm=32,Mm=128,JS=16,XS=32,QS=10080*60*1e3,wr=32*1024,jm=16;function _c(e,t){let n=[],r=Fe(e,"$",n);ot(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=cP(r.name,"$.name",n),i=eP(r.limits,n),o=tP(r.inputs,n),a=nP(r.steps,n);a.length>Mm&&n.push(`$.steps may contain at most ${Mm} steps.`),a.filter(d=>d.kind==="agent"&&d.createChild).length>i.maxTasks&&n.push("$.steps creates more child tasks than limits.max_tasks allows.");let l=new Set(a.map(d=>d.id));for(let d of a)for(let p of d.needs)l.has(p)||n.push(`$.steps.${d.id}.needs references missing step "${p}".`),p===d.id&&n.push(`$.steps.${d.id}.needs cannot reference itself.`);let c=iP(a,n);c&&oP(a,o,c.ancestors,n),n.length>0&&pP(t,n);let u={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:u,hash:zS("sha256").update(xc(u)).digest("hex"),order:c.order,waves:ZS(c.waves,i.maxConcurrency)}}function ZS(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 eP(e,t){let n=Fe(e,"$.limits",t);ot(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=qm(n.max_concurrency,"$.limits.max_concurrency",1,JS,t),s=qm(n.max_tasks,"$.limits.max_tasks",1,XS,t),i=Bm(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function tP(e,t){if(e===void 0)return{};let n=Fe(e,"$.inputs",t),r=Object.entries(n);r.length>Lm&&t.push(`$.inputs may contain at most ${Lm} inputs.`);let s={};for(let[i,o]of r){yr.test(i)||t.push(`$.inputs key "${i}" must match ${yr}.`);let a=Fe(o,`$.inputs.${i}`,t);ot(a,["type","required","default"],`$.inputs.${i}`,t);let l=uP(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:dP(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&&!Um(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&Um(a.default,l)?{defaultValue:a.default}:{}}}return s}function nP(e,t){let n=Fe(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{yr.test(s)||t.push(`$.steps key "${s}" must match ${yr}.`);let o=Fe(i,`$.steps.${s}`,t),a=Wm(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?sP(s,o,a,t):rP(s,o,a,t)})}function rP(e,t,n,r){ot(t,["needs","task","create_child","agent","prompt","output"],`$.steps.${e}`,r);let s=t.task!==void 0,i=t.create_child!==void 0;s===i&&r.push(`$.steps.${e} must define exactly one of task or create_child.`);let o=s?rn(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let d=Fe(t.create_child,`$.steps.${e}.create_child`,r);ot(d,["repo"],`$.steps.${e}.create_child`,r),a={repo:rn(d.repo,`$.steps.${e}.create_child.repo`,r)}}let l;if(t.agent!==void 0){let d=Fe(t.agent,`$.steps.${e}.agent`,r);if(ot(d,["runner"],`$.steps.${e}.agent`,r),d.runner!==void 0)try{l=k.runners.parse(rn(d.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=rn(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>wr&&r.push(`$.steps.${e}.prompt exceeds ${wr} bytes.`);let u;if(t.output!==void 0){let d=Fe(t.output,`$.steps.${e}.output`,r);ot(d,["schema"],`$.steps.${e}.output`,r),u=Nc(d.schema,`$.steps.${e}.output.schema`,r,0)}return{kind:"agent",id:e,needs:n,prompt:c,...o!==void 0?{task:o}:{},...a?{createChild:a}:{},...l?{runner:l}:{},...u?{outputSchema:u}:{}}}function sP(e,t,n,r){ot(t,["needs","human_review"],`$.steps.${e}`,r);let s=Fe(t.human_review,`$.steps.${e}.human_review`,r);ot(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=Fe(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);ot(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=rn(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:rn(s.title,`$.steps.${e}.human_review.title`,r),summary:rn(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:Bm(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function Nc(e,t,n,r){if(r>jm)return n.push(`${t} exceeds the maximum schema depth of ${jm}.`),{};let s=Fe(e,t,n);ot(s,["type","properties","required","items","enum","additionalProperties","description"],t,n);let i=["object","array","string","number","integer","boolean","null"];if((typeof s.type!="string"||!i.includes(s.type))&&n.push(`${t}.type is unsupported.`),s.required!==void 0&&Wm(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=Fe(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))Nc(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&Nc(s.items,`${t}.items`,n,r+1),s}function iP(e,t){let n=new Set(e.map(d=>d.id));if(e.some(d=>d.needs.some(p=>!n.has(p))))return null;let r=new Map(e.map((d,p)=>[d.id,p])),s=new Map(e.map(d=>[d.id,d.needs.length])),i=new Map;for(let d of e)for(let p of d.needs)i.set(p,[...i.get(p)??[],d.id]);let o=e.filter(d=>d.needs.length===0).map(d=>d.id),a=[],l=[];for(;o.length>0;){o.sort((m,g)=>r.get(m)-r.get(g));let d=o;l.push(d),a.push(...d);let p=[];for(let m of d)for(let g of i.get(m)??[]){let f=s.get(g)-1;s.set(g,f),f===0&&p.push(g)}o=p}if(a.length!==e.length)return t.push("$.steps must form an acyclic graph."),null;let c=new Map(e.map(d=>[d.id,d])),u=new Map;for(let d of a){let p=new Set;for(let m of c.get(d).needs){p.add(m);for(let g of u.get(m)??[])p.add(g)}u.set(d,p)}return{order:a,waves:l,ancestors:u}}function oP(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(Fm)],c=a.replace(Fm,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let u of l)aP(u[1].trim(),i,t,n,s,r)}}}function aP(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&&lP(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function lP(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(!ao(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(!ao(a))return;i=a}}function xc(e){return Array.isArray(e)?`[${e.map(xc).join(",")}]`:ao(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${xc(e[t])}`).join(",")}}`:JSON.stringify(e)}function Fe(e,t,n){return ao(e)?e:(n.push(`${t} must be an object.`),{})}function ot(e,t,n,r){let s=new Set(t);for(let i of Object.keys(e))s.has(i)||r.push(`${n}.${i} is not supported.`)}function cP(e,t,n){let r=rn(e,t,n);return yr.test(r)||n.push(`${t} must match ${yr}.`),r}function rn(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function Wm(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 qm(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 dP(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function uP(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function Um(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function Bm(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>QS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function pP(e,t){throw new h("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var ao=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as fP,stat as mP}from"node:fs/promises";var gP=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function Fc(e){let t=await Vm(e);return{kind:"validateFury",schemaVersion:1,valid:!0,file:e,definitionHash:t.hash,name:t.definition.name,inputNames:Object.keys(t.definition.inputs),stepCount:t.definition.steps.length,order:t.order,limits:t.definition.limits}}async function Lc(e,t){let n=await Vm(e),r=hP(n.definition.inputs,t),s=new Map(n.waves.flatMap((a,l)=>a.map(c=>[c,l]))),i=new Map(n.definition.steps.map(a=>[a.id,a])),o=n.order.map(a=>{let l=i.get(a);return l.kind==="human_review"?{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:null,runner:null,prompt:null,outputSchema:null,review:{title:kr(l.title,r,`$.steps.${a}.human_review.title`),summary:kr(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?kr(l.feedbackTask,r,`$.steps.${a}.human_review.feedback_target.task`):null,timeoutMs:l.timeoutMs??n.definition.limits.timeoutMs}}:{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:l.task?{type:"task",task:kr(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",repo:kr(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)},runner:l.runner??null,prompt:kP(l.prompt,r,a),outputSchema:l.outputSchema??null,review:null}});return{schemaVersion:1,file:e,definitionHash:n.hash,name:n.definition.name,inputs:r,limits:n.definition.limits,order:n.order,waves:n.waves,steps:o}}async function Vm(e){let t;try{let n=await mP(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>bs)throw new Error(`Definition exceeds ${bs} bytes.`);t=await fP(e,"utf8")}catch(n){throw new h("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return _c(Dc(t,e),e)}function hP(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]=yP(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 h("FURY_INPUT_INVALID","Fury inputs are invalid.",{details:{issues:n}});return r}function yP(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 wP(e,t){return e.replace(gP,(n,r)=>{if(!Object.hasOwn(t,r))throw new h("FURY_INPUT_INVALID",`Input "${r}" is required by a template but has no value.`,{details:{input:r}});return String(t[r])})}function kr(e,t,n){let r=wP(e,t);if(r.trim().length===0)throw new h("FURY_INPUT_INVALID",`Resolved ${n} must be a non-empty string.`,{details:{location:n}});return r}function kP(e,t,n){let r=`$.steps.${n}.prompt`,s=kr(e,t,r);if(Buffer.byteLength(s)>wr)throw new h("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${wr} bytes.`,{details:{location:r,maxBytes:wr}});return s}import{createHash as Km}from"node:crypto";import TP from"node:path";import{mkdir as bP}from"node:fs/promises";var Mc={type:"system",component:"heartbeat"};async function sn(e,t={}){await bP(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([R.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):At.listAgents(e),If(e),AP(e)]),o=r??ut(n.tasks.filter(g=>g.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=CP(i),l=a!==i,c=[],u=jc(s.filter(vP),g=>g.taskId),d=jc(s.filter(g=>g.type.startsWith("task.pr.")),g=>g.taskId),p=jc(s.filter(g=>g.type==="agent.state.changed"),g=>g.agentTabId);for(let g of n.tasks){let f=RP(g),y=u.get(g.id),T=Uc(y?.data)??a.tasks[g.id]??null,S=y?.id??a.tasks[g.id]?.eventId??null;if(T?.signature!==f.signature){let _=T?g.status==="closed"&&T?.status!=="closed"?"task.closed":"task.updated":"task.created",C=await Ne(e,{id:qc(_,g.id,f.signature),type:_,taskId:g.id,workspaceId:g.workspaceId||null,occurredAt:g.updatedAt,actor:Mc,data:{...f,changedFields:T?PP(T,f):[]}});c.push(C),S=C.id}a.tasks[g.id]={...f,eventId:S};let v=IP(g.prs),b=d.get(g.id),$=Uc(b?.data)??a.pullRequests[g.id]??null,D=b?.id??a.pullRequests[g.id]?.eventId??null;if(($||v.associations.length>0)&&$?.signature!==v.signature){let _=Array.isArray($?.associations)?$.associations.length:0,C=v.associations.length>_?"task.pr.linked":v.associations.length<_?"task.pr.unlinked":"task.pr.refreshed",w=await Ne(e,{id:qc(C,g.id,v.signature),type:C,taskId:g.id,workspaceId:g.workspaceId||null,occurredAt:g.updatedAt,actor:Mc,data:v});c.push(w),D=w.id}a.pullRequests[g.id]={...v,eventId:D}}let m=new Map(o.tasks.map(g=>[g.taskId,g.state]));for(let g of o.agents){let f=p.get(g.tabId),y=Uc(f?.data)??a.agents[g.tabId]??null;if(y?.state===g.state){a.agents[g.tabId]={state:g.state,eventId:f?.id??a.agents[g.tabId]?.eventId??null};continue}let T=[f?.id??a.agents[g.tabId]?.eventId??"initial",g.state,g.sessionState??"none",g.lastActivityAt??"none",g.exitCode??"none",g.error??"none"].join(":"),S=await Ne(e,{id:qc("agent.state.changed",g.tabId,T),type:"agent.state.changed",taskId:g.taskId,agentTabId:g.tabId,actor:Mc,data:{previousState:typeof y?.state=="string"?y.state:null,state:g.state,taskState:m.get(g.taskId)??"idle",sessionState:g.sessionState,lastActivityAt:g.lastActivityAt,exitCode:g.exitCode,error:g.error}});c.push(S),a.agents[g.tabId]={state:g.state,eventId:S.id}}return(c.length>0||l)&&await M(Hm(e),a),c}function RP(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:Gm(t)}}var SP=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function PP(e,t){return SP.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function IP(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:Gm(t)}}function jc(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var vP=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",Gm=e=>Km("sha256").update(JSON.stringify(e)).digest("hex"),qc=(...e)=>Km("sha256").update(e.join("\0")).digest("hex"),Uc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,Hm=e=>TP.join(e.orchestrationDir,"event-reconciliation.json");function CP(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 AP(e){try{return await Ms(Hm(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function EP(e,t){return await Wc(e),await sn(e),In(e,t)}async function OP(e,t,n){await Wc(e);let r=await At.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await sn(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 Ym(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function $P(e,t,n){await Wc(e);let r=await R.getTask(e,t);if(n.tabId&&!r.ptyTabs.some(i=>i.kind==="agent"&&i.id===n.tabId))throw new h("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${t}.`,{details:{taskId:t,tabId:n.tabId}});let s=await At.openObserver(e);try{await sn(e,{agentObserver:s});let o=(await In(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=ut([r],s.getSnapshots(),l),u=n.tabId?c.agents.find(m=>m.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(u))return{kind:"waitTask",taskId:t,tabId:n.tabId??null,state:u,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw NP(t);let d=a-Date.now();if(d<=0)throw DP(t,n.states,n.timeoutMs);await sn(e,{agentObserver:s}),o=(await In(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await Ym(Math.min(250,d),n.signal)}}finally{s.close()}}async function Wc(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new h("CLI_USAGE","Event orchestration is a feature preview. Enable agentOrchestration before using events commands.",{details:{preview:"agentOrchestration"}})}function Ym(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 DP=(e,t,n)=>new h("OPERATION_TIMEOUT",`Timed out after ${n}ms waiting for task ${e} agent state ${t.join(",")}.`,{retryable:!0,details:{taskId:e,states:t,timeoutMs:n}}),NP=e=>new h("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),lo={list:EP,watch:OP,waitForTaskState:$P,reconcile:sn};import{readFile as FP}from"node:fs/promises";import{createConnection as xP}from"node:net";async function Nt(e){let t=await Vc(pt(e).socketPath).catch(()=>null);if(!t)return!1;try{return(await Tr(t,{type:"ping"})).protocolVersion!==Ht?!1:(await Tr(t,{type:"wakeOrchestration"}),!0)}catch{return!1}finally{t.end()}}async function Bc(e,t){if(t.length===0)return!0;let n=await Vc(pt(e).socketPath).catch(()=>null);if(!n)return!1;try{if((await Tr(n,{type:"ping"})).protocolVersion!==Ht)return!1;for(let s of t)await Tr(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function zm(e,t){let n=await Vc(pt(e).socketPath).catch(()=>null);if(!n)throw new Error("Craig PTY daemon is unavailable for delegated agent startup.");try{if((await Tr(n,{type:"ping"})).protocolVersion!==Ht)throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await Tr(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()}}var _P=1;function Tr(e,t){let n=_P++;return new Promise((r,s)=>{let i="",o=setTimeout(()=>s(new Error("Craig PTY daemon request timed out.")),1e3),a=c=>{i+=String(c);let u=i.indexOf(`
211
211
  `);if(u===-1)return;l();let d=JSON.parse(i.slice(0,u));d.ok?r(d):s(new Error(d.error??"Craig PTY daemon request failed."))},l=()=>{clearTimeout(o),e.off("data",a)};e.on("data",a),e.write(`${JSON.stringify({...t,id:n})}
212
- `)})}function Gm(e){return new Promise((t,n)=>{let r=$P(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function xP(e,t){await qP(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 jP(t.prompt,t.readStdin),o;try{o=await ue.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 Dt(e),a}return await Dt(e),o}async function _P(e,t){return ue.show(e,t)}async function FP(e,t){return ue.list(e,t)}async function LP(e,t){let n;try{n=await ue.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await Dt(e),r}return await Dt(e),n}async function MP(e,t,n){return ue.wait(e,t,n)}async function jP(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await DP(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 qP(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Prompt dispatch is a feature preview. Enable agentOrchestration before sending prompts.",{details:{preview:"agentOrchestration"}})}var Tr={send:xP,show:_P,list:FP,cancel:LP,wait:MP};async function uo(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 Zl(e,t,n);return await Wc(e,o),a}catch(a){throw a instanceof g&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await Wc(e,o),a}}import{randomUUID as zm}from"node:crypto";import{readFile as UP,realpath as Hm}from"node:fs/promises";import Bc from"node:path";var ne={type:"system",component:"orchestration-supervisor"},WP=/\$\{\{\s*steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)\s*\}\}/g;async function BP(e,t,n,r,s,i){await Dn(e);let o=await rI(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 He(e,i,"fury.plan",r)}let a=await Fc(t,n);sI(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},u={...c,id:`fury_plan_${zm()}`,planHash:vl(c),createdBy:s,createdAt:l};await nf(e,a.definitionHash,await UP(t,"utf8"));let d=await rf(e,u);try{await De(e,{id:`${d.id}:fury.plan.created`,taskId:r,type:"fury.plan.created",occurredAt:d.createdAt,actor:d.createdBy,data:{planId:d.id,planHash:d.planHash,name:d.name}})}catch(p){throw new g("PARTIAL_RESULT",`Fury plan ${d.id} was persisted, but its audit event could not be recorded.`,{details:{planId:d.id,planHash:d.planHash,persisted:!0},cause:p})}return{kind:"planFury",plan:d}}async function VP(e,t,n){if(await Dn(e),n.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can approve a Fury plan.",{});let r=await pi(e,t),s={schemaVersion:1,planId:r.id,planHash:r.planHash,approvedBy:n,approvedAt:new Date().toISOString()},i=await af(e,s);try{await De(e,{id:`${r.id}:fury.plan.approved`,taskId:r.rootTaskId,type:"fury.plan.approved",occurredAt:i.approval.approvedAt,actor:i.approval.approvedBy,data:{planId:r.id,planHash:r.planHash}})}catch(o){throw new g("PARTIAL_RESULT",`Fury plan ${r.id} was approved, but its audit event could not be recorded.`,{details:{planId:r.id,planHash:r.planHash,persisted:!0,approved:!0},cause:o})}return{kind:"approveFury",plan:r,approval:i.approval,created:i.created}}async function KP(e,t,n,r){await Dn(e);let s=await pi(e,t);if((await lf(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 He(e,r,"fury.run",s.rootTaskId)}await Xe(e,await S.getTask(e,s.rootTaskId));let o=new Date,l={schemaVersion:1,id:`fury_${zm()}`,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(u=>[u.id,{id:u.id,kind:u.kind,needs:u.needs,state:"pending",plan:u,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 cf(e,l);try{await le(e,c.run,null,"fury.run.created",c.run.actor,{state:"pending"})}catch(u){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:u})}return await Nn(e,c.run.id),await Dt(e),{kind:"runFury",run:await de(e,c.run.id),created:c.created}}async function GP(e,t){return await Dn(e),await Nn(e,t),{kind:"showFury",run:await de(e,t)}}async function fo(e,t={}){let n=await k.load(e);if(k.previews.isEnabled(n,"agentOrchestration"))for(let r of await df(e))await Nn(e,r.id,t)}async function Nn(e,t,n={}){let r=await de(e,t);if(await lI(e,r),wt(r))return;if(Date.now()>=Date.parse(r.deadlineAt)){r=await Ke(e,t,o=>aI(o));for(let o of Object.values(r.stepRuns))o.reviewId&&await Jr(e,o.reviewId,a=>({...a,state:"timed_out",version:a.version+1,updatedAt:new Date().toISOString()}));await le(e,r,null,"fury.run.timed_out",ne,{state:r.state});return}let s=new Map((await Ge(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 Ym(e,r,a);continue}a.state==="running"&&a.commandId&&s.get(a.commandId)?.state==="failed"&&(r=await po(e,r.id,a.id,s.get(a.commandId)?.lastError?.message??"Prompt delivery failed.",ne));let l=!a.commandId||s.get(a.commandId)?.state==="delivered";a.state==="running"&&a.agentTabId&&l&&n.isAgentAvailable&&a.startedAt&&Date.now()-Date.parse(a.startedAt)>2e3&&!n.isAgentAvailable(a.agentTabId)&&(r=await po(e,r.id,a.id,`Agent session ${a.agentTabId} disappeared.`,ne)),a.state==="running"&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(r=await Ke(e,r.id,c=>sn(c,a.id,{state:"timed_out",error:"Step timed out.",completedAt:new Date().toISOString(),completedBy:ne})),await le(e,r,a.id,"fury.step.timed_out",ne,{})),(a.state==="waiting_for_review"||a.state==="changes_requested")&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(a.reviewId&&await Jr(e,a.reviewId,c=>({...c,state:"timed_out",version:c.version+1,updatedAt:new Date().toISOString()})),r=await Ke(e,r.id,c=>sn(c,a.id,{state:"timed_out",error:"Review timed out.",completedAt:new Date().toISOString(),completedBy:ne})),await le(e,r,a.id,"fury.review.timed_out",ne,{reviewId:a.reviewId}))}if(Object.values(r.stepRuns).some(o=>o.state==="failed"||o.state==="timed_out")){await mo(e,r.id,"failed",ne);return}let i=Object.values(r.stepRuns).filter(o=>o.state==="running").length;for(let o of r.order){if(i>=r.limits.maxConcurrency)break;let a=r.stepRuns[o];a.state!=="pending"||!a.needs.every(l=>r.stepRuns[l]?.state==="succeeded")||(a.kind==="human_review"?r=await HP(e,r,a):(r=await Ym(e,r,a),i+=1))}await oI(e,r.id)}async function Ym(e,t,n){let r=new Date;t=await Ke(e,t.id,o=>sn(o,n.id,{state:"running",startedAt:r.toISOString(),deadlineAt:o.deadlineAt})),await le(e,t,n.id,"fury.step.started",ne,{});let s=t.stepRuns[n.id];if(s.taskId)return t;let i=`${br(s.plan.prompt,t)}
212
+ `)})}function Vc(e){return new Promise((t,n)=>{let r=xP(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function LP(e,t){await BP(e);let n=await R.getTask(e,t.taskId);if(n.status==="closed")throw new h("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 h("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 WP(t.prompt,t.readStdin),o;try{o=await ue.create(e,{taskId:n.id,agentTabId:s.id,prompt:i,delivery:t.delivery,timeoutMs:t.timeoutMs,idempotencyKey:t.idempotencyKey??null,actor:{type:"human",source:"cli",processId:process.pid}})}catch(a){throw await Nt(e),a}return await Nt(e),o}async function MP(e,t){return ue.show(e,t)}async function jP(e,t){return ue.list(e,t)}async function qP(e,t){let n;try{n=await ue.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await Nt(e),r}return await Nt(e),n}async function UP(e,t,n){return ue.wait(e,t,n)}async function WP(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await FP(e.path,"utf8")}}catch(n){throw new h("CLI_USAGE",`Unable to read prompt file ${e.path}.`,{details:{promptFile:e.path},cause:n})}if(!t)throw new h("INPUT_REQUIRED","Prompt input from stdin is unavailable.",{});return{source:"stdin",text:await t()}}async function BP(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new h("CLI_USAGE","Prompt dispatch is a feature preview. Enable agentOrchestration before sending prompts.",{details:{preview:"agentOrchestration"}})}var br={send:LP,show:MP,list:jP,cancel:qP,wait:UP};async function co(e,t){return Ql(e,t,{createTask:VP})}async function VP(e,t,n,r={}){let s=await k.load(e),i=r.runner??k.runners.getDefault(s);k.runners.assertEnabled(i,s);let o=await R.provisionTask(e,t,n,{runner:i,config:s,...r.lineage?{lineage:r.lineage}:{}});try{let a=await r.onProvisioned?.(o.task),l=await R.getTask(e,o.task.id),c=l.ptyTabs.find(d=>d.kind==="agent");if(!c)throw new Error(`Task ${l.id} is missing its agent PTY tab.`);return await zm(e,{taskId:l.id,tabId:c.id,cwd:l.worktreePath,command:l.runnerSession.command,...a?{env:a}:{}}),{taskId:(await R.markTaskStarted(e,l.id)).id}}catch(a){throw await R.recordStartupFailure(e,o.task.id,a instanceof Error?a.message:"Failed to start delegated agent."),a}}async function uo(e,t,n){let r=(await R.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 ec(e,t,n);return await Bc(e,o),a}catch(a){throw a instanceof h&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await Bc(e,o),a}}import{randomUUID as Qm}from"node:crypto";import{readFile as KP,realpath as Jm}from"node:fs/promises";import Kc from"node:path";var ne={type:"system",component:"orchestration-supervisor"},GP=/\$\{\{\s*steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)\s*\}\}/g;async function HP(e,t,n,r,s,i){await Nn(e);let o=await aI(e,t);if(await R.getTask(e,r),s.type==="agent"){if(!i||s.taskId!==r)throw new h("CAPABILITY_DENIED","An agent may only plan Fury work rooted at its own task.",{});await He(e,i,"fury.plan",r)}let a=await Lc(t,n);lI(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},u={...c,id:`fury_plan_${Qm()}`,planHash:vl(c),createdBy:s,createdAt:l};await of(e,a.definitionHash,await KP(t,"utf8"));let d=await af(e,u);try{await Ne(e,{id:`${d.id}:fury.plan.created`,taskId:r,type:"fury.plan.created",occurredAt:d.createdAt,actor:d.createdBy,data:{planId:d.id,planHash:d.planHash,name:d.name}})}catch(p){throw new h("PARTIAL_RESULT",`Fury plan ${d.id} was persisted, but its audit event could not be recorded.`,{details:{planId:d.id,planHash:d.planHash,persisted:!0},cause:p})}return{kind:"planFury",plan:d}}async function YP(e,t,n){if(await Nn(e),n.type!=="human")throw new h("CAPABILITY_DENIED","Only a human can approve a Fury plan.",{});let r=await pi(e,t),s={schemaVersion:1,planId:r.id,planHash:r.planHash,approvedBy:n,approvedAt:new Date().toISOString()},i=await df(e,s);try{await Ne(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 h("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 zP(e,t,n,r){await Nn(e);let s=await pi(e,t);if((await uf(e,t)).planHash!==s.planHash)throw new h("FURY_APPROVAL_REQUIRED",`Fury plan ${t} changed after approval.`,{});if(n.type==="agent"){if(!r)throw new h("CAPABILITY_DENIED","Fury run requires an agent capability.",{});await He(e,r,"fury.run",s.rootTaskId)}await Xe(e,await R.getTask(e,s.rootTaskId));let o=new Date,l={schemaVersion:1,id:`fury_${Qm()}`,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(u=>[u.id,{id:u.id,kind:u.kind,needs:u.needs,state:"pending",plan:u,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 pf(e,l);try{await le(e,c.run,null,"fury.run.created",c.run.actor,{state:"pending"})}catch(u){throw new h("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:u})}return await Dn(e,c.run.id),await Nt(e),{kind:"runFury",run:await de(e,c.run.id),created:c.created}}async function JP(e,t){return await Nn(e),await Dn(e,t),{kind:"showFury",run:await de(e,t)}}async function fo(e,t={}){let n=await k.load(e);if(k.previews.isEnabled(n,"agentOrchestration"))for(let r of await ff(e))await Dn(e,r.id,t)}async function Dn(e,t,n={}){let r=await de(e,t);if(await pI(e,r),kt(r))return;if(Date.now()>=Date.parse(r.deadlineAt)){r=await Ke(e,t,o=>uI(o));for(let o of Object.values(r.stepRuns))o.reviewId&&await Xr(e,o.reviewId,a=>({...a,state:"timed_out",version:a.version+1,updatedAt:new Date().toISOString()}));await le(e,r,null,"fury.run.timed_out",ne,{state:r.state});return}let s=new Map((await Ge(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 Xm(e,r,a);continue}a.state==="running"&&a.commandId&&s.get(a.commandId)?.state==="failed"&&(r=await po(e,r.id,a.id,s.get(a.commandId)?.lastError?.message??"Prompt delivery failed.",ne));let l=!a.commandId||s.get(a.commandId)?.state==="delivered";a.state==="running"&&a.agentTabId&&l&&n.isAgentAvailable&&a.startedAt&&Date.now()-Date.parse(a.startedAt)>2e3&&!n.isAgentAvailable(a.agentTabId)&&(r=await po(e,r.id,a.id,`Agent session ${a.agentTabId} disappeared.`,ne)),a.state==="running"&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(r=await Ke(e,r.id,c=>on(c,a.id,{state:"timed_out",error:"Step timed out.",completedAt:new Date().toISOString(),completedBy:ne})),await le(e,r,a.id,"fury.step.timed_out",ne,{})),(a.state==="waiting_for_review"||a.state==="changes_requested")&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(a.reviewId&&await Xr(e,a.reviewId,c=>({...c,state:"timed_out",version:c.version+1,updatedAt:new Date().toISOString()})),r=await Ke(e,r.id,c=>on(c,a.id,{state:"timed_out",error:"Review timed out.",completedAt:new Date().toISOString(),completedBy:ne})),await le(e,r,a.id,"fury.review.timed_out",ne,{reviewId:a.reviewId}))}if(Object.values(r.stepRuns).some(o=>o.state==="failed"||o.state==="timed_out")){await mo(e,r.id,"failed",ne);return}let i=Object.values(r.stepRuns).filter(o=>o.state==="running").length;for(let o of r.order){if(i>=r.limits.maxConcurrency)break;let a=r.stepRuns[o];a.state!=="pending"||!a.needs.every(l=>r.stepRuns[l]?.state==="succeeded")||(a.kind==="human_review"?r=await XP(e,r,a):(r=await Xm(e,r,a),i+=1))}await dI(e,r.id)}async function Xm(e,t,n){let r=new Date;t=await Ke(e,t.id,o=>on(o,n.id,{state:"running",startedAt:r.toISOString(),deadlineAt:o.deadlineAt})),await le(e,t,n.id,"fury.step.started",ne,{});let s=t.stepRuns[n.id];if(s.taskId)return t;let i=`${Rr(s.plan.prompt,t)}
213
213
 
214
- ${iI(t.id,n.id,s.plan.outputSchema)}`;try{let o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await ts(e,{parentTaskId:t.rootTaskId,repoId:br(s.plan.target.repo,t),prompt:i,...s.plan.runner?{runner:s.plan.runner}:{},idempotencyKey:`fury:${t.id}:${n.id}`,fury:{runId:t.id,stepId:n.id}}),u=await S.getTask(e,c.taskId),d=u.ptyTabs.find(p=>p.kind==="agent");if(!d)throw new g("TASK_CONTEXT_CONFLICT",`Created task ${u.id} has no agent tab.`,{});o=u.id,a=d.id}else{o=br(s.plan.target.task,t);let c=await S.getTask(e,o),u=c.ptyTabs.find(p=>p.kind==="agent"&&(!s.plan.runner||(p.runner??c.runner)===s.plan.runner));if(!u)throw new g("TASK_CONTEXT_CONFLICT",s.plan.runner?`Task ${c.id} has no ${s.plan.runner} agent tab for fury step ${n.id}.`:`Task ${c.id} has no agent tab.`,{});await Xe(e,c,ne,u.id),a=u.id,l=(await ue.create(e,{taskId:o,agentTabId:a,prompt:{source:"inline",text:i},delivery:"when-ready",timeoutMs:Math.min(t.limits.timeoutMs,864e5),idempotencyKey:`fury:${t.id}:${n.id}`,actor:ne})).command.id}return t=await Ke(e,t.id,c=>sn(c,n.id,{taskId:o,agentTabId:a,commandId:l})),await le(e,t,n.id,"fury.step.dispatched",ne,{taskId:o,agentTabId:a,commandId:l}),t}catch(o){return po(e,t.id,n.id,o instanceof Error?o.message:"Step dispatch failed.",ne)}}async function HP(e,t,n){let r=n.plan.review,s=new Date,i=`review_${t.id.slice(5)}_${n.id}`,o=r.feedbackTask?br(r.feedbackTask,t):null,a=o?Object.values(t.stepRuns).find(c=>c.taskId===o&&c.agentTabId):null,l={schemaVersion:1,id:i,runId:t.id,stepId:n.id,state:"waiting_for_review",title:br(r.title,t),summary:br(r.summary,t),feedbackTarget:o?{taskId:o,agentTabId:a?.agentTabId??null}:null,round:1,requestedAt:s.toISOString(),deadlineAt:new Date(Math.min(Date.parse(t.deadlineAt),s.getTime()+r.timeoutMs)).toISOString(),version:1,lastDecision:null,history:[],updatedAt:s.toISOString()};return await pf(e,l),t=await Ke(e,t.id,c=>sn(c,n.id,{state:"waiting_for_review",reviewId:i,startedAt:s.toISOString(),deadlineAt:l.deadlineAt})),await le(e,t,n.id,"fury.review.requested",ne,{reviewId:i,title:l.title}),t}async function YP(e,t,n,r,s,i){let o=await de(e,t),a=Xm(o,n);await Jm(e,a,s,i,"fury.step.complete"),nI(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await Ke(e,t,c=>{if(wt(c)||c.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return sn(c,n,{state:"succeeded",output:r,completedAt:l,completedBy:s})}),await le(e,o,n,"fury.step.succeeded",s,{taskId:a.taskId}),await Nn(e,t),o=await de(e,t),{kind:"completeFuryStep",run:o,step:o.stepRuns[n]}}async function zP(e,t,n,r,s,i){let o=await de(e,t),a=Xm(o,n);await Jm(e,a,s,i,"fury.step.fail");let l=await po(e,t,n,r,s);return await mo(e,t,"failed",s),{kind:"failFuryStep",run:await de(e,t),step:l.stepRuns[n]}}async function JP(e,t,n,r){let s=await de(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury cancellation requires an agent capability.",{});await He(e,r,"fury.cancel",s.rootTaskId)}if(wt(s))return{kind:"cancelFury",run:s,changed:!1};let i=new Date().toISOString(),o=!1,a=await Ke(e,t,c=>wt(c)?c:(o=!0,{...c,state:"cancelled",completedAt:i,updatedAt:i,stateChangedAt:i,stepRuns:Object.fromEntries(Object.entries(c.stepRuns).map(([u,d])=>[u,d.state==="succeeded"?d:{...d,state:"cancelled",completedAt:i,completedBy:n}]))}));if(!o)return{kind:"cancelFury",run:a,changed:!1};let l=await Ge(e);for(let c of Object.values(a.stepRuns)){let u=c.commandId?l.find(d=>d.id===c.commandId):null;u?.state==="queued"&&await ue.cancel(e,u.id,n),c.taskId&&c.plan.target?.type==="create_child"&&await uo(e,c.taskId).catch(()=>{}),c.reviewId&&await Jr(e,c.reviewId,d=>({...d,state:"cancelled",version:d.version+1,updatedAt:i}))}return await le(e,a,null,"fury.run.cancelled",n,{}),{kind:"cancelFury",run:a,changed:o}}async function XP(e,t,n,r){let s=await de(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury resume requires an agent capability.",{});await He(e,r,"fury.resume",s.rootTaskId)}if(wt(s))throw new g("FURY_STATE_CONFLICT",`Cannot resume ${s.id} while it is ${s.state}.`,{});return await Nn(e,t),await Dt(e),{kind:"resumeFury",run:await de(e,t)}}async function QP(e,t,n){return await Dn(e),{kind:"listFuryReviews",reviews:(await fi(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function ZP(e,t){return await Dn(e),{kind:"showFuryReview",review:await rr(e,t)}}async function eI(e,t,n,r,s,i){let o=await rr(e,t),a=await de(e,o.runId);if(n!=="resubmit"&&s.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can decide a fury review.",{});if(n==="resubmit"&&s.type==="agent"){if(!o.feedbackTarget||s.taskId!==o.feedbackTarget.taskId||!i)throw new g("CAPABILITY_DENIED","Only the feedback-target agent can resubmit this review.",{});await He(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 ue.create(e,{taskId:h.id,agentTabId:f.id,prompt:{source:"inline",text:`Fury review changes requested:
214
+ ${cI(t.id,n.id,s.plan.outputSchema)}`;try{let o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await co(e,{parentTaskId:t.rootTaskId,repoId:Rr(s.plan.target.repo,t),prompt:i,...s.plan.runner?{runner:s.plan.runner}:{},idempotencyKey:`fury:${t.id}:${n.id}`,fury:{runId:t.id,stepId:n.id}}),u=await R.getTask(e,c.taskId),d=u.ptyTabs.find(p=>p.kind==="agent");if(!d)throw new h("TASK_CONTEXT_CONFLICT",`Created task ${u.id} has no agent tab.`,{});o=u.id,a=d.id}else{o=Rr(s.plan.target.task,t);let c=await R.getTask(e,o),u=c.ptyTabs.find(p=>p.kind==="agent"&&(!s.plan.runner||(p.runner??c.runner)===s.plan.runner));if(!u)throw new h("TASK_CONTEXT_CONFLICT",s.plan.runner?`Task ${c.id} has no ${s.plan.runner} agent tab for fury step ${n.id}.`:`Task ${c.id} has no agent tab.`,{});await Xe(e,c,ne,u.id),a=u.id,l=(await ue.create(e,{taskId:o,agentTabId:a,prompt:{source:"inline",text:i},delivery:"when-ready",timeoutMs:Math.min(t.limits.timeoutMs,864e5),idempotencyKey:`fury:${t.id}:${n.id}`,actor:ne})).command.id}return t=await Ke(e,t.id,c=>on(c,n.id,{taskId:o,agentTabId:a,commandId:l})),await le(e,t,n.id,"fury.step.dispatched",ne,{taskId:o,agentTabId:a,commandId:l}),t}catch(o){return po(e,t.id,n.id,o instanceof Error?o.message:"Step dispatch failed.",ne)}}async function XP(e,t,n){let r=n.plan.review,s=new Date,i=`review_${t.id.slice(5)}_${n.id}`,o=r.feedbackTask?Rr(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:Rr(r.title,t),summary:Rr(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 gf(e,l),t=await Ke(e,t.id,c=>on(c,n.id,{state:"waiting_for_review",reviewId:i,startedAt:s.toISOString(),deadlineAt:l.deadlineAt})),await le(e,t,n.id,"fury.review.requested",ne,{reviewId:i,title:l.title}),t}async function QP(e,t,n,r,s,i){let o=await de(e,t),a=eg(o,n);await Zm(e,a,s,i,"fury.step.complete"),oI(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await Ke(e,t,c=>{if(kt(c)||c.stepRuns[n]?.state!=="running")throw new h("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return on(c,n,{state:"succeeded",output:r,completedAt:l,completedBy:s})}),await le(e,o,n,"fury.step.succeeded",s,{taskId:a.taskId}),await Dn(e,t),o=await de(e,t),{kind:"completeFuryStep",run:o,step:o.stepRuns[n]}}async function ZP(e,t,n,r,s,i){let o=await de(e,t),a=eg(o,n);await Zm(e,a,s,i,"fury.step.fail");let l=await po(e,t,n,r,s);return await mo(e,t,"failed",s),{kind:"failFuryStep",run:await de(e,t),step:l.stepRuns[n]}}async function eI(e,t,n,r){let s=await de(e,t);if(n.type==="agent"){if(!r)throw new h("CAPABILITY_DENIED","Fury cancellation requires an agent capability.",{});await He(e,r,"fury.cancel",s.rootTaskId)}if(kt(s))return{kind:"cancelFury",run:s,changed:!1};let i=new Date().toISOString(),o=!1,a=await Ke(e,t,c=>kt(c)?c:(o=!0,{...c,state:"cancelled",completedAt:i,updatedAt:i,stateChangedAt:i,stepRuns:Object.fromEntries(Object.entries(c.stepRuns).map(([u,d])=>[u,d.state==="succeeded"?d:{...d,state:"cancelled",completedAt:i,completedBy:n}]))}));if(!o)return{kind:"cancelFury",run:a,changed:!1};let l=await Ge(e);for(let c of Object.values(a.stepRuns)){let u=c.commandId?l.find(d=>d.id===c.commandId):null;u?.state==="queued"&&await ue.cancel(e,u.id,n),c.taskId&&c.plan.target?.type==="create_child"&&await uo(e,c.taskId).catch(()=>{}),c.reviewId&&await Xr(e,c.reviewId,d=>({...d,state:"cancelled",version:d.version+1,updatedAt:i}))}return await le(e,a,null,"fury.run.cancelled",n,{}),{kind:"cancelFury",run:a,changed:o}}async function tI(e,t,n,r){let s=await de(e,t);if(n.type==="agent"){if(!r)throw new h("CAPABILITY_DENIED","Fury resume requires an agent capability.",{});await He(e,r,"fury.resume",s.rootTaskId)}if(kt(s))throw new h("FURY_STATE_CONFLICT",`Cannot resume ${s.id} while it is ${s.state}.`,{});return await Dn(e,t),await Nt(e),{kind:"resumeFury",run:await de(e,t)}}async function nI(e,t,n){return await Nn(e),{kind:"listFuryReviews",reviews:(await fi(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function rI(e,t){return await Nn(e),{kind:"showFuryReview",review:await rr(e,t)}}async function sI(e,t,n,r,s,i){let o=await rr(e,t),a=await de(e,o.runId);if(n!=="resubmit"&&s.type!=="human")throw new h("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 h("CAPABILITY_DENIED","Only the feedback-target agent can resubmit this review.",{});await He(e,i,"fury.review.resubmit",s.taskId)}if(!(n==="resubmit"?o.state==="changes_requested":o.state==="waiting_for_review"))throw new h("FURY_STATE_CONFLICT",`Review ${t} cannot ${n} while ${o.state}.`,{});if((n==="reject"||n==="request_changes")&&!r?.trim())throw new h("CLI_USAGE",`${n} requires a reason.`,{});if(n==="request_changes"&&!o.feedbackTarget)throw new h("FURY_STATE_CONFLICT",`Review ${t} has no feedback target.`,{});let c=null;if(n==="request_changes"){let m=await R.getTask(e,o.feedbackTarget.taskId),g=o.feedbackTarget.agentTabId?m.ptyTabs.find(y=>y.kind==="agent"&&y.id===o.feedbackTarget.agentTabId):m.ptyTabs.find(y=>y.kind==="agent");if(!g)throw new h("TASK_CONTEXT_CONFLICT",`Feedback task ${m.id} has no agent tab.`,{});c=(await ue.create(e,{taskId:m.id,agentTabId:g.id,prompt:{source:"inline",text:`Fury review changes requested:
215
215
 
216
- ${r}`},delivery:"when-ready",timeoutMs:Math.min(a.limits.timeoutMs,864e5),idempotencyKey:`fury-review:${t}:${o.round}`,actor:s})).command.id}let u=new Date().toISOString(),d={sequence:o.history.length+1,round:o.round,action:n,message:r,actor:s,feedbackCommandId:c,occurredAt:u},p=n==="approve"?"approved":n==="reject"?"rejected":n==="request_changes"?"changes_requested":"waiting_for_review";return o=await Jr(e,t,h=>{if(!(n==="resubmit"?h.state==="changes_requested":h.state==="waiting_for_review")||h.version!==o.version)throw new g("FURY_STATE_CONFLICT",`Review ${t} changed concurrently.`,{});return{...h,state:p,round:n==="resubmit"?h.round+1:h.round,version:h.version+1,lastDecision:d,history:[...h.history,d],updatedAt:u}}),a=await Ke(e,a.id,h=>{if(wt(h))throw new g("FURY_STATE_CONFLICT",`Run ${h.id} is ${h.state}.`,{});return sn(h,o.stepId,n==="approve"?{state:"succeeded",completedAt:u,completedBy:s}:n==="reject"?{state:"failed",error:r,completedAt:u,completedBy:s}:n==="request_changes"?{state:"changes_requested"}:{state:"waiting_for_review"})}),await le(e,a,o.stepId,`fury.review.${n}`,s,{reviewId:t,round:o.round,feedbackCommandId:c}),n==="reject"?await mo(e,a.id,"failed",s):await Nn(e,a.id),c&&await Dt(e),{kind:"actFuryReview",review:o,run:await de(e,a.id)}}async function tI(e,t,n,r){await Dn(e),await de(e,t);let s=n,i=0,o=0;for(;!r.signal?.aborted;){await Nn(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,wt(await de(e,t)))return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!1};await cI(250,r.signal)}return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!0}}function br(e,t){return e.replace(WP,(n,r,s)=>{let i=t.stepRuns[r];if(!i||i.state!=="succeeded")throw new g("FURY_STATE_CONFLICT",`Step ${r} is not complete.`,{});if(s==="task_id")return i.taskId??"";let o=i.output;for(let a of s.split(".").slice(1))o=$n(o)?o[a]:void 0;if(o===void 0)throw new g("FURY_OUTPUT_INVALID",`Step ${r} has no output at ${s}.`,{});return typeof o=="string"?o:JSON.stringify(o)})}function nI(e,t){if(!t){if(e!=null)throw new g("FURY_OUTPUT_INVALID","This step does not declare output.",{});return}let n=[];if(Vc(e,t,"$",n),n.length)throw new g("FURY_OUTPUT_INVALID","Fury step output does not match its schema.",{details:{issues:n}})}function Vc(e,t,n,r){let s=t.type;if(!(s==="null"?e===null:s==="array"?Array.isArray(e):s==="object"?$n(e):s==="integer"?Number.isInteger(e):s==="number"?typeof e=="number"&&Number.isFinite(e):typeof e===s)){r.push(`${n} must be ${String(s)}.`);return}if(Array.isArray(t.enum)&&!t.enum.some(o=>JSON.stringify(o)===JSON.stringify(e))&&r.push(`${n} is not in enum.`),s==="object"&&$n(e)){let o=$n(t.properties)?t.properties:{};for(let a of Array.isArray(t.required)?t.required:[])typeof a=="string"&&!Object.hasOwn(e,a)&&r.push(`${n}.${a} is required.`);for(let[a,l]of Object.entries(e))$n(o[a])?Vc(l,o[a],`${n}.${a}`,r):t.additionalProperties===!1&&r.push(`${n}.${a} is not allowed.`)}s==="array"&&Array.isArray(e)&&$n(t.items)&&e.forEach((o,a)=>Vc(o,t.items,`${n}[${a}]`,r))}async function Jm(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 He(e,r,s,n.taskId)}}function Xm(e,t){if(wt(e))throw new g("FURY_STATE_CONFLICT",`Run ${e.id} is ${e.state}.`,{});let n=e.stepRuns[t];if(!n)throw new g("FURY_STATE_CONFLICT",`Run ${e.id} has no step ${t}.`,{});if(n.kind!=="agent"||n.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${t} is ${n.state}.`,{});return n}async function rI(e,t){let[n,r]=await Promise.all([Hm(he(e).root),Hm(t)]),s=Bc.relative(n,r);if(!s||s.startsWith("..")||Bc.isAbsolute(s)||!/\.ya?ml$/i.test(s))throw new g("FURY_DEFINITION_INVALID","Fury plans must use a YAML definition stored under .craig/fury/.",{details:{file:t,furyRoot:he(e).root}});return Bc.join(".craig","fury",s)}function sI(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 iI(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
+ ${r}`},delivery:"when-ready",timeoutMs:Math.min(a.limits.timeoutMs,864e5),idempotencyKey:`fury-review:${t}:${o.round}`,actor:s})).command.id}let u=new Date().toISOString(),d={sequence:o.history.length+1,round:o.round,action:n,message:r,actor:s,feedbackCommandId:c,occurredAt:u},p=n==="approve"?"approved":n==="reject"?"rejected":n==="request_changes"?"changes_requested":"waiting_for_review";return o=await Xr(e,t,m=>{if(!(n==="resubmit"?m.state==="changes_requested":m.state==="waiting_for_review")||m.version!==o.version)throw new h("FURY_STATE_CONFLICT",`Review ${t} changed concurrently.`,{});return{...m,state:p,round:n==="resubmit"?m.round+1:m.round,version:m.version+1,lastDecision:d,history:[...m.history,d],updatedAt:u}}),a=await Ke(e,a.id,m=>{if(kt(m))throw new h("FURY_STATE_CONFLICT",`Run ${m.id} is ${m.state}.`,{});return on(m,o.stepId,n==="approve"?{state:"succeeded",completedAt:u,completedBy:s}:n==="reject"?{state:"failed",error:r,completedAt:u,completedBy:s}:n==="request_changes"?{state:"changes_requested"}:{state:"waiting_for_review"})}),await le(e,a,o.stepId,`fury.review.${n}`,s,{reviewId:t,round:o.round,feedbackCommandId:c}),n==="reject"?await mo(e,a.id,"failed",s):await Dn(e,a.id),c&&await Nt(e),{kind:"actFuryReview",review:o,run:await de(e,a.id)}}async function iI(e,t,n,r){await Nn(e),await de(e,t);let s=n,i=0,o=0;for(;!r.signal?.aborted;){await Dn(e,t);let a=await In(e,{typeGlob:"fury.*",...s?{after:s}:{}});for(let l of a.events.filter(c=>c.furyRunId===t))r.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,kt(await de(e,t)))return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!1};await fI(250,r.signal)}return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!0}}function Rr(e,t){return e.replace(GP,(n,r,s)=>{let i=t.stepRuns[r];if(!i||i.state!=="succeeded")throw new h("FURY_STATE_CONFLICT",`Step ${r} is not complete.`,{});if(s==="task_id")return i.taskId??"";let o=i.output;for(let a of s.split(".").slice(1))o=$n(o)?o[a]:void 0;if(o===void 0)throw new h("FURY_OUTPUT_INVALID",`Step ${r} has no output at ${s}.`,{});return typeof o=="string"?o:JSON.stringify(o)})}function oI(e,t){if(!t){if(e!=null)throw new h("FURY_OUTPUT_INVALID","This step does not declare output.",{});return}let n=[];if(Gc(e,t,"$",n),n.length)throw new h("FURY_OUTPUT_INVALID","Fury step output does not match its schema.",{details:{issues:n}})}function Gc(e,t,n,r){let s=t.type;if(!(s==="null"?e===null:s==="array"?Array.isArray(e):s==="object"?$n(e):s==="integer"?Number.isInteger(e):s==="number"?typeof e=="number"&&Number.isFinite(e):typeof e===s)){r.push(`${n} must be ${String(s)}.`);return}if(Array.isArray(t.enum)&&!t.enum.some(o=>JSON.stringify(o)===JSON.stringify(e))&&r.push(`${n} is not in enum.`),s==="object"&&$n(e)){let o=$n(t.properties)?t.properties:{};for(let a of Array.isArray(t.required)?t.required:[])typeof a=="string"&&!Object.hasOwn(e,a)&&r.push(`${n}.${a} is required.`);for(let[a,l]of Object.entries(e))$n(o[a])?Gc(l,o[a],`${n}.${a}`,r):t.additionalProperties===!1&&r.push(`${n}.${a} is not allowed.`)}s==="array"&&Array.isArray(e)&&$n(t.items)&&e.forEach((o,a)=>Gc(o,t.items,`${n}[${a}]`,r))}async function Zm(e,t,n,r,s){if(n.type!=="human"){if(n.type!=="agent"||!r||n.taskId!==t.taskId)throw new h("CAPABILITY_DENIED","The step actor does not own this fury step.",{});await He(e,r,s,n.taskId)}}function eg(e,t){if(kt(e))throw new h("FURY_STATE_CONFLICT",`Run ${e.id} is ${e.state}.`,{});let n=e.stepRuns[t];if(!n)throw new h("FURY_STATE_CONFLICT",`Run ${e.id} has no step ${t}.`,{});if(n.kind!=="agent"||n.state!=="running")throw new h("FURY_STATE_CONFLICT",`Step ${t} is ${n.state}.`,{});return n}async function aI(e,t){let[n,r]=await Promise.all([Jm(ge(e).root),Jm(t)]),s=Kc.relative(n,r);if(!s||s.startsWith("..")||Kc.isAbsolute(s)||!/\.ya?ml$/i.test(s))throw new h("FURY_DEFINITION_INVALID","Fury plans must use a YAML definition stored under .craig/fury/.",{details:{file:t,furyRoot:ge(e).root}});return Kc.join(".craig","fury",s)}function lI(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 h("FURY_DEFINITION_INVALID",`Fury step ${n.id} has an unsafe dynamic task target.`,{details:{stepId:n.id,target:r}})}if(r!==t)throw new h("FURY_DEFINITION_INVALID",`Fury step ${n.id} targets ${r} outside its planning task.`,{details:{stepId:n.id,targetTaskId:r,rootTaskId:t}})}}}function cI(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
217
217
  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
218
- If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function po(e,t,n,r,s){let i=new Date().toISOString(),o=!1,a=await Ke(e,t,l=>{if(l.stepRuns[n]?.state==="failed")return l;if(wt(l)||l.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,sn(l,n,{state:"failed",error:r,completedAt:i,completedBy:s})});return o&&await le(e,a,n,"fury.step.failed",s,{reason:r}),a}function sn(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function oI(e,t){let n=await de(e,t),r=Object.values(n.stepRuns),s=r.every(i=>i.state==="succeeded")?"succeeded":r.some(i=>i.state==="failed"||i.state==="timed_out")?"failed":r.some(i=>i.state==="running")?"running":r.some(i=>i.state==="waiting_for_review"||i.state==="changes_requested")?"waiting_for_review":r.some(i=>i.state==="pending")?"running":n.state;await mo(e,t,s,ne)}async function mo(e,t,n,r){let s=await de(e,t);if(s.state===n)return s;let i=["succeeded","failed","cancelled","timed_out"].includes(n),o=new Date().toISOString(),a=await Ke(e,t,l=>wt(l)?l:{...l,state:n,updatedAt:o,stateChangedAt:o,completedAt:i?o:null});return a.state!==n||await le(e,a,null,`fury.run.${n}`,r,{state:n}),a}function aI(e){let t=new Date().toISOString();return{...e,state:"timed_out",updatedAt:t,stateChangedAt:t,completedAt:t,stepRuns:Object.fromEntries(Object.entries(e.stepRuns).map(([n,r])=>[n,r.state==="succeeded"?r:{...r,state:"timed_out",completedAt:t,completedBy:ne}]))}}async function le(e,t,n,r,s,i){let o=$n(i)&&Number.isInteger(i.round)?`:round-${String(i.round)}`:"",a=n?t.stepRuns[n]:null,l=r==="fury.run.created"?t.createdAt:r.startsWith("fury.run.")?t.stateChangedAt:r==="fury.step.started"||r==="fury.review.requested"?a?.startedAt:r==="fury.step.dispatched"?`${a?.taskId??"task"}:${a?.commandId??"launch"}`:r.startsWith("fury.step.")?a?.completedAt:o||t.updatedAt;await De(e,{id:`${t.id}:${n??"run"}:${r}:${l??"unknown"}${o}`,furyRunId:t.id,furyStepId:n,taskId:n?t.stepRuns[n]?.taskId??t.rootTaskId:t.rootTaskId,type:r,occurredAt:typeof l=="string"&&Number.isFinite(Date.parse(l))?l:t.updatedAt,actor:s,data:i})}async function lI(e,t){await le(e,t,null,"fury.run.created",t.actor,{state:"pending"}),t.state!=="pending"&&await le(e,t,null,`fury.run.${t.state}`,ne,{state:t.state});for(let n of Object.values(t.stepRuns)){if(n.startedAt&&await le(e,t,n.id,"fury.step.started",ne,{}),n.taskId&&await le(e,t,n.id,"fury.step.dispatched",ne,{taskId:n.taskId,agentTabId:n.agentTabId,commandId:n.commandId}),["succeeded","failed","timed_out","cancelled"].includes(n.state)&&await le(e,t,n.id,`fury.step.${n.state}`,n.completedBy??ne,{reason:n.error}),!n.reviewId)continue;let r=await rr(e,n.reviewId);await le(e,t,n.id,"fury.review.requested",ne,{reviewId:r.id,title:r.title});for(let s of r.history)await le(e,t,n.id,`fury.review.${s.action}`,s.actor,{reviewId:r.id,round:s.round,feedbackCommandId:s.feedbackCommandId})}}async function Dn(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 wt(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function $n(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function cI(e,t){return new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var Le={plan:BP,approve:VP,run:KP,show:GP,watch:tI,cancel:JP,resume:XP,completeStep:YP,failStep:zP,listReviews:QP,showReview:ZP,actOnReview:eI,reconcile:fo};async function Zm(e,t){switch(e.kind){case"addWorkspace":{let n=await ke.addWorkspace(t.paths,e.path),r=n.workspace.kind==="project"?n.workspace.discoveredRepoIds?.[0]??null:n.repos[0]?.id??null;return await Kc(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await ke.repos.addRepo(t.paths,e.path);return await Kc(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return ke.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await Un({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await $e(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await ke.repos.removeRepo(t.paths,e.repoId,{listTasks:S.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await jt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await jt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return ke.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await ke.archiveWorkspace(t.paths,e.workspaceId);return await pI(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await ke.restoreWorkspace(t.paths,e.workspaceId);return await Kc(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return ke.removeWorkspace(t.paths,e.workspaceId,{listTasks:S.listTasks});case"createTask":return Xl(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 xn(t),ts(t.paths,{parentTaskId:e.parentTaskId??an(t).task.id,repoId:e.repoId,prompt:e.prompt,...e.runner?{runner:e.runner}:{},...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.agentCapabilityId?{capabilityId:t.agentCapabilityId}:{}})}case"listTaskChildren":return xn(t),Ql(t.paths,e.taskId??an(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return xn(t),uo(t.paths,e.taskId??an(t).task.id,t.agentCapabilityId);case"validateFury":return await Qm(t),_c(Gc.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await Qm(t),Le.plan(t.paths,Gc.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??an(t).task.id,on(t),t.agentCapabilityId);case"approveFury":return Le.approve(t.paths,e.planId,on(t));case"runFury":return xn(t),Le.run(t.paths,e.planId,on(t),t.agentCapabilityId);case"showFury":return Le.show(t.paths,e.runId);case"watchFury":return Le.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return Le.cancel(t.paths,e.runId,on(t),t.agentCapabilityId);case"resumeFury":return Le.resume(t.paths,e.runId,on(t),t.agentCapabilityId);case"completeFuryStep":return xn(t),Le.completeStep(t.paths,e.runId,e.stepId,await uI(e.output,t),on(t),t.agentCapabilityId);case"failFuryStep":return xn(t),Le.failStep(t.paths,e.runId,e.stepId,e.reason,on(t),t.agentCapabilityId);case"listFuryReviews":return Le.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return Le.showReview(t.paths,e.reviewId);case"actFuryReview":return xn(t),Le.actOnReview(t.paths,e.reviewId,e.action,e.message??null,on(t),t.agentCapabilityId);case"listTasks":return e.repoId||e.workspaceId?S.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):S.listTasks(t.paths);case"currentTask":{let n=an(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"attachTask":return S.attachTask(t.paths,e.taskId);case"addTaskLink":return S.addTaskLink(t.paths,e.taskId,e.repoId);case"listTaskLinks":return S.listTaskLinks(t.paths,e.taskId);case"refreshInteractiveState":throw new Error("Interactive refresh should be handled by the interactive app.");case"showTask":return S.showTask(t.paths,e.taskId);case"showCurrentTask":return S.showTask(t.paths,an(t).task.id);case"showTaskPr":return S.prs.show(t.paths,Fn(e.taskId,t),e.repoId);case"discoverTaskPr":return S.prs.discover(t.paths,Fn(e.taskId,t),e.repoId);case"linkTaskPr":return S.prs.link(t.paths,Fn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return S.prs.refreshAssociation(t.paths,Fn(e.taskId,t),e.repoId);case"unlinkTaskPr":return S.prs.unlink(t.paths,Fn(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return At.listAgents(t.paths,e.taskId);case"showAgentStatus":return At.showAgentStatus(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.tabId?{tabId:e.tabId}:{}});case"waitTask":{let n={states:e.states,timeoutMs:e.timeoutMs,...e.tabId?{tabId:e.tabId}:{},...t.signal?{signal:t.signal}:{}},r=Fn(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?lo.waitForTaskState(t.paths,r,n):At.waitForTask(t.paths,r,n)}case"listEvents":return lo.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return lo.watch(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}},{onEvent:t.emitEvent??(()=>{}),...t.signal?{signal:t.signal}:{}});case"sendAgentPrompt":return Tr.send(t.paths,{taskId:Fn(e.taskId,t),...e.tabId?{tabId:e.tabId}:t.taskContext?.agentTabId?{tabId:t.taskContext.agentTabId}:{},prompt:e.prompt,delivery:e.delivery,timeoutMs:e.timeoutMs,...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.readStdin?{readStdin:t.readStdin}:{}});case"showPromptCommand":return Tr.show(t.paths,e.commandId);case"listPromptCommands":return Tr.list(t.paths,e.taskId);case"cancelPromptCommand":return Tr.cancel(t.paths,e.commandId);case"waitPromptCommand":return Tr.wait(t.paths,e.commandId,{...e.states?{states:e.states}:{},timeoutMs:e.timeoutMs,...t.signal?{signal:t.signal}:{}});case"showSelectedTask":return S.showTask(t.paths,_n(t,"show"));case"streamTaskLogs":return S.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return S.prepareTaskLogs(t.paths,_n(t,"logs"));case"showTaskDiff":return S.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return S.showTaskDiff(t.paths,_n(t,"diff"));case"focusTask":return S.focusTask(t.paths,e.taskId);case"focusSelectedTask":return S.focusTask(t.paths,_n(t,"focus"));case"openTask":return S.openTask(t.paths,e.taskId);case"openSelectedTask":return S.openTask(t.paths,_n(t,"open"));case"runChecks":return S.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return S.runChecks(t.paths,_n(t,"check"));case"commitTask":return S.commitTask(t.paths,e.taskId);case"commitSelectedTask":return S.commitTask(t.paths,_n(t,"commit"));case"showContext":{let n=mI(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 fI(e)}}function xn(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 Qm(e){let t=await k.load(e.paths);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Fury planning is a feature preview. Enable agentOrchestration before validating or planning a fury.",{details:{preview:"agentOrchestration"}})}function on(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=an(e);if(!e.agentCapabilityId||!t.agentTabId)throw new g("CAPABILITY_DENIED","This agent session has no scoped capability.",{});return{type:"agent",taskId:t.task.id,agentTabId:t.agentTabId,capabilityId:e.agentCapabilityId.split(".",1)[0]}}async function uI(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await dI(Gc.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 Kc(e,t,n){let r=await Un({uiStateFile:e.uiStateFile})??qs();await jt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function pI(e,t){let n=await Un({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await jt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function fI(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function _n(e,t){if(e.selectedTaskId)return e.selectedTaskId;throw new Error(`No task selected. Create a task with 'task new --repo <repo-id> <prompt>' or use '${t} <id>'.`)}function an(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Fn(e,t){return e??an(t).task.id}function mI(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function th(e){switch(e.kind){case"createWorkspace":return[`${e.created?"Registered":"Updated"} ${e.workspace.kind??"repo"} workspace ${e.workspace.id}`,`Path: ${e.workspace.rootPath??""}`,`Repos: ${e.repos.map(t=>t.id).join(", ")}`].join(`
218
+ If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function po(e,t,n,r,s){let i=new Date().toISOString(),o=!1,a=await Ke(e,t,l=>{if(l.stepRuns[n]?.state==="failed")return l;if(kt(l)||l.stepRuns[n]?.state!=="running")throw new h("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,on(l,n,{state:"failed",error:r,completedAt:i,completedBy:s})});return o&&await le(e,a,n,"fury.step.failed",s,{reason:r}),a}function on(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function dI(e,t){let n=await de(e,t),r=Object.values(n.stepRuns),s=r.every(i=>i.state==="succeeded")?"succeeded":r.some(i=>i.state==="failed"||i.state==="timed_out")?"failed":r.some(i=>i.state==="running")?"running":r.some(i=>i.state==="waiting_for_review"||i.state==="changes_requested")?"waiting_for_review":r.some(i=>i.state==="pending")?"running":n.state;await mo(e,t,s,ne)}async function mo(e,t,n,r){let s=await de(e,t);if(s.state===n)return s;let i=["succeeded","failed","cancelled","timed_out"].includes(n),o=new Date().toISOString(),a=await Ke(e,t,l=>kt(l)?l:{...l,state:n,updatedAt:o,stateChangedAt:o,completedAt:i?o:null});return a.state!==n||await le(e,a,null,`fury.run.${n}`,r,{state:n}),a}function uI(e){let t=new Date().toISOString();return{...e,state:"timed_out",updatedAt:t,stateChangedAt:t,completedAt:t,stepRuns:Object.fromEntries(Object.entries(e.stepRuns).map(([n,r])=>[n,r.state==="succeeded"?r:{...r,state:"timed_out",completedAt:t,completedBy:ne}]))}}async function le(e,t,n,r,s,i){let o=$n(i)&&Number.isInteger(i.round)?`:round-${String(i.round)}`:"",a=n?t.stepRuns[n]:null,l=r==="fury.run.created"?t.createdAt:r.startsWith("fury.run.")?t.stateChangedAt:r==="fury.step.started"||r==="fury.review.requested"?a?.startedAt:r==="fury.step.dispatched"?`${a?.taskId??"task"}:${a?.commandId??"launch"}`:r.startsWith("fury.step.")?a?.completedAt:o||t.updatedAt;await Ne(e,{id:`${t.id}:${n??"run"}:${r}:${l??"unknown"}${o}`,furyRunId:t.id,furyStepId:n,taskId:n?t.stepRuns[n]?.taskId??t.rootTaskId:t.rootTaskId,type:r,occurredAt:typeof l=="string"&&Number.isFinite(Date.parse(l))?l:t.updatedAt,actor:s,data:i})}async function pI(e,t){await le(e,t,null,"fury.run.created",t.actor,{state:"pending"}),t.state!=="pending"&&await le(e,t,null,`fury.run.${t.state}`,ne,{state:t.state});for(let n of Object.values(t.stepRuns)){if(n.startedAt&&await le(e,t,n.id,"fury.step.started",ne,{}),n.taskId&&await le(e,t,n.id,"fury.step.dispatched",ne,{taskId:n.taskId,agentTabId:n.agentTabId,commandId:n.commandId}),["succeeded","failed","timed_out","cancelled"].includes(n.state)&&await le(e,t,n.id,`fury.step.${n.state}`,n.completedBy??ne,{reason:n.error}),!n.reviewId)continue;let r=await rr(e,n.reviewId);await le(e,t,n.id,"fury.review.requested",ne,{reviewId:r.id,title:r.title});for(let s of r.history)await le(e,t,n.id,`fury.review.${s.action}`,s.actor,{reviewId:r.id,round:s.round,feedbackCommandId:s.feedbackCommandId})}}async function Nn(e){if(!k.previews.isEnabled(await k.load(e),"agentOrchestration"))throw new h("CLI_USAGE","Fury execution is a feature preview. Enable agentOrchestration first.",{details:{preview:"agentOrchestration"}})}function kt(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function $n(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function fI(e,t){return new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var Le={plan:HP,approve:YP,run:zP,show:JP,watch:iI,cancel:eI,resume:tI,completeStep:QP,failStep:ZP,listReviews:nI,showReview:rI,actOnReview:sI,reconcile:fo};async function ng(e,t){switch(e.kind){case"addWorkspace":{let n=await ke.addWorkspace(t.paths,e.path),r=n.workspace.kind==="project"?n.workspace.discoveredRepoIds?.[0]??null:n.repos[0]?.id??null;return await Hc(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await ke.repos.addRepo(t.paths,e.path);return await Hc(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return ke.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await Un({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await $e(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await ke.repos.removeRepo(t.paths,e.repoId,{listTasks:R.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await jt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await jt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return ke.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await ke.archiveWorkspace(t.paths,e.workspaceId);return await hI(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await ke.restoreWorkspace(t.paths,e.workspaceId);return await Hc(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return ke.removeWorkspace(t.paths,e.workspaceId,{listTasks:R.listTasks});case"createTask":return Xl(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 h("CLI_USAGE","Child delegation is a feature preview. Enable agentOrchestration before creating child tasks.",{details:{preview:"agentOrchestration"}});return xn(t),co(t.paths,{parentTaskId:e.parentTaskId??ln(t).task.id,repoId:e.repoId,prompt:e.prompt,...e.runner?{runner:e.runner}:{},...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.agentCapabilityId?{capabilityId:t.agentCapabilityId}:{}})}case"listTaskChildren":return xn(t),Zl(t.paths,e.taskId??ln(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return xn(t),uo(t.paths,e.taskId??ln(t).task.id,t.agentCapabilityId);case"validateFury":return await tg(t),Fc(Yc.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await tg(t),Le.plan(t.paths,Yc.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??ln(t).task.id,an(t),t.agentCapabilityId);case"approveFury":return Le.approve(t.paths,e.planId,an(t));case"runFury":return xn(t),Le.run(t.paths,e.planId,an(t),t.agentCapabilityId);case"showFury":return Le.show(t.paths,e.runId);case"watchFury":return Le.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return Le.cancel(t.paths,e.runId,an(t),t.agentCapabilityId);case"resumeFury":return Le.resume(t.paths,e.runId,an(t),t.agentCapabilityId);case"completeFuryStep":return xn(t),Le.completeStep(t.paths,e.runId,e.stepId,await gI(e.output,t),an(t),t.agentCapabilityId);case"failFuryStep":return xn(t),Le.failStep(t.paths,e.runId,e.stepId,e.reason,an(t),t.agentCapabilityId);case"listFuryReviews":return Le.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return Le.showReview(t.paths,e.reviewId);case"actFuryReview":return xn(t),Le.actOnReview(t.paths,e.reviewId,e.action,e.message??null,an(t),t.agentCapabilityId);case"listTasks":return e.repoId||e.workspaceId?R.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):R.listTasks(t.paths);case"currentTask":{let n=ln(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"attachTask":return R.attachTask(t.paths,e.taskId);case"addTaskLink":return R.addTaskLink(t.paths,e.taskId,e.repoId);case"listTaskLinks":return R.listTaskLinks(t.paths,e.taskId);case"refreshInteractiveState":throw new Error("Interactive refresh should be handled by the interactive app.");case"showTask":return R.showTask(t.paths,e.taskId);case"showCurrentTask":return R.showTask(t.paths,ln(t).task.id);case"showTaskPr":return R.prs.show(t.paths,Fn(e.taskId,t),e.repoId);case"discoverTaskPr":return R.prs.discover(t.paths,Fn(e.taskId,t),e.repoId);case"linkTaskPr":return R.prs.link(t.paths,Fn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return R.prs.refreshAssociation(t.paths,Fn(e.taskId,t),e.repoId);case"unlinkTaskPr":return R.prs.unlink(t.paths,Fn(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return At.listAgents(t.paths,e.taskId);case"showAgentStatus":return At.showAgentStatus(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.tabId?{tabId:e.tabId}:{}});case"waitTask":{let n={states:e.states,timeoutMs:e.timeoutMs,...e.tabId?{tabId:e.tabId}:{},...t.signal?{signal:t.signal}:{}},r=Fn(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?lo.waitForTaskState(t.paths,r,n):At.waitForTask(t.paths,r,n)}case"listEvents":return lo.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return lo.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 br.send(t.paths,{taskId:Fn(e.taskId,t),...e.tabId?{tabId:e.tabId}:t.taskContext?.agentTabId?{tabId:t.taskContext.agentTabId}:{},prompt:e.prompt,delivery:e.delivery,timeoutMs:e.timeoutMs,...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.readStdin?{readStdin:t.readStdin}:{}});case"showPromptCommand":return br.show(t.paths,e.commandId);case"listPromptCommands":return br.list(t.paths,e.taskId);case"cancelPromptCommand":return br.cancel(t.paths,e.commandId);case"waitPromptCommand":return br.wait(t.paths,e.commandId,{...e.states?{states:e.states}:{},timeoutMs:e.timeoutMs,...t.signal?{signal:t.signal}:{}});case"showSelectedTask":return R.showTask(t.paths,_n(t,"show"));case"streamTaskLogs":return R.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return R.prepareTaskLogs(t.paths,_n(t,"logs"));case"showTaskDiff":return R.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return R.showTaskDiff(t.paths,_n(t,"diff"));case"focusTask":return R.focusTask(t.paths,e.taskId);case"focusSelectedTask":return R.focusTask(t.paths,_n(t,"focus"));case"openTask":return R.openTask(t.paths,e.taskId);case"openSelectedTask":return R.openTask(t.paths,_n(t,"open"));case"runChecks":return R.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return R.runChecks(t.paths,_n(t,"check"));case"commitTask":return R.commitTask(t.paths,e.taskId);case"commitSelectedTask":return R.commitTask(t.paths,_n(t,"commit"));case"showContext":{let n=wI(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 yI(e)}}function xn(e){if(!(!e.agentContext||e.agentCapabilityId))throw new h("CAPABILITY_DENIED","This agent session has no delegation capability. Restart the agent session to receive one.",{details:{reason:"agent capability is missing"}})}async function tg(e){let t=await k.load(e.paths);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new h("CLI_USAGE","Fury planning is a feature preview. Enable agentOrchestration before validating or planning a fury.",{details:{preview:"agentOrchestration"}})}function an(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=ln(e);if(!e.agentCapabilityId||!t.agentTabId)throw new h("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 gI(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await mI(Yc.resolve(t.cwd??process.cwd(),e.path),"utf8");else{if(!t.readStdin)throw new h("INPUT_REQUIRED","Fury output from stdin is unavailable.",{});n=await t.readStdin()}try{return JSON.parse(n)}catch(r){throw new h("FURY_OUTPUT_INVALID","Fury step output must be valid JSON.",{cause:r})}}async function Hc(e,t,n){let r=await Un({uiStateFile:e.uiStateFile})??qs();await jt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function hI(e,t){let n=await Un({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await jt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function yI(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function _n(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 ln(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Fn(e,t){return e??ln(t).task.id}function wI(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function sg(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
219
  `);case"createRepo":return[`${e.created?"Registered":"Already registered"} repo ${e.repo.id}`,`Path: ${e.repo.rootPath}`,`Branch: ${e.repo.defaultBranch}`,`Workspace: ${e.workspaceId}`].join(`
220
220
  `);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(`
221
221
  `);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(`
@@ -225,58 +225,58 @@ If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>
225
225
  `);case"cancelTaskTree":return[`Cancelled task tree ${e.taskId}`,...e.cancelled.map(t=>`${t.taskId}: ${t.disposition}`)].join(`
226
226
  `);case"validateFury":return[`Valid fury ${e.name}`,`Definition: ${e.definitionHash}`,`Steps: ${e.stepCount}`,`Order: ${e.order.join(" -> ")}`].join(`
227
227
  `);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(`
228
- `);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 hI(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(`
229
- `);case"showFuryReview":return eh(e.review);case"actFuryReview":return`${eh(e.review)}
228
+ `);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 kI(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(`
229
+ `);case"showFuryReview":return rg(e.review);case"actFuryReview":return`${rg(e.review)}
230
230
  Run: ${e.run.state}`;case"watchFury":return"";case"attachTask":return`Attached to task ${e.taskId} via session ${e.sessionId}`;case"addTaskLink":return`Linked repo ${e.repoId} to task ${e.taskId}: ${e.linkedRepoIds.join(", ")}`;case"listTaskLinks":return e.repos.length===0?`Task ${e.taskId} has no linked repos.`:["ID NAME BRANCH PATH",...e.repos.map(t=>`${t.id} ${t.name} ${t.defaultBranch} ${t.rootPath}`)].join(`
231
- `);case"help":return e.text;case"exit":return"";case"listTasks":return e.tasks.length===0?`No Craig tasks yet. Use 'task new --repo <repo-id> <prompt>' to create one.${e.missingTaskIds.length>0?` (${e.missingTaskIds.length} referenced task file(s) missing from .craig/tasks)`:""}`:["ID REPO STATUS CHECKS PR TITLE",...e.tasks.map(t=>`${t.id} ${t.repoId} ${t.status} ${bI(t)} ${RI(t)} ${t.title}`)].join(`
232
- `);case"showTask":return[`${e.task.id}: ${e.task.title}`,`Status: ${e.task.status}`,`Runner: ${e.task.runner}`,`Repo: ${e.task.repoId}`,`Workspace: ${e.task.workspaceId}`,`Branch: ${e.task.branch}`,`Worktree: ${e.task.worktreePath}`,`Session: ${e.task.sessionId??"<missing>"}`,`tmux: ${e.session?.paneId??"<missing>"}`,`Linked repos: ${e.task.linkedRepoIds.length>0?e.task.linkedRepoIds.join(", "):"none"}`,`Prompt: ${e.task.prompt.source} ${JSON.stringify(e.task.prompt.value)}`,`Runner command: ${e.inspection.runnerCommandText||"<none>"}`,`Runner state: ${e.task.runnerSession.lastKnownState}`,`Started: ${e.task.runnerSession.startedAt??"not started"}`,`Exited: ${e.task.runnerSession.exitedAt??"still running"}`,`Checks: ${e.inspection.checksSummary}`,`Last commit: ${e.inspection.lastCommitSummary}`,`PR: ${e.inspection.prSummary}`,`Cleanup: ${e.inspection.cleanupSummary}`,...kI(e)].join(`
231
+ `);case"help":return e.text;case"exit":return"";case"listTasks":return e.tasks.length===0?`No Craig tasks yet. Use 'task new --repo <repo-id> <prompt>' to create one.${e.missingTaskIds.length>0?` (${e.missingTaskIds.length} referenced task file(s) missing from .craig/tasks)`:""}`:["ID REPO STATUS CHECKS PR TITLE",...e.tasks.map(t=>`${t.id} ${t.repoId} ${t.status} ${II(t)} ${vI(t)} ${t.title}`)].join(`
232
+ `);case"showTask":return[`${e.task.id}: ${e.task.title}`,`Status: ${e.task.status}`,`Runner: ${e.task.runner}`,`Repo: ${e.task.repoId}`,`Workspace: ${e.task.workspaceId}`,`Branch: ${e.task.branch}`,`Worktree: ${e.task.worktreePath}`,`Session: ${e.task.sessionId??"<missing>"}`,`tmux: ${e.session?.paneId??"<missing>"}`,`Linked repos: ${e.task.linkedRepoIds.length>0?e.task.linkedRepoIds.join(", "):"none"}`,`Prompt: ${e.task.prompt.source} ${JSON.stringify(e.task.prompt.value)}`,`Runner command: ${e.inspection.runnerCommandText||"<none>"}`,`Runner state: ${e.task.runnerSession.lastKnownState}`,`Started: ${e.task.runnerSession.startedAt??"not started"}`,`Exited: ${e.task.runnerSession.exitedAt??"still running"}`,`Checks: ${e.inspection.checksSummary}`,`Last commit: ${e.inspection.lastCommitSummary}`,`PR: ${e.inspection.prSummary}`,`Cleanup: ${e.inspection.cleanupSummary}`,...SI(e)].join(`
233
233
  `);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(`
234
- `);case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return wI(e);case"listAgents":case"showAgentStatus":return yI(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(Hc).join(`
235
- `);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 gI(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(`
234
+ `);case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return RI(e);case"listAgents":case"showAgentStatus":return bI(e);case"waitTask":return`Task ${e.taskId}${e.tabId?` tab ${e.tabId}`:""} reached ${e.state}.`;case"listEvents":return e.events.length===0?"No events found.":e.events.map(zc).join(`
235
+ `);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 TI(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(`
236
236
  `);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(`
237
237
  `);case"streamTaskLogs":return`Streaming logs for ${e.taskId} from ${e.logPath}`;case"showTaskDiff":return e.isEmpty?`Task ${e.taskId} has no uncommitted diff.`:e.diffText;case"focusTask":return`Focused task ${e.taskId} on ${e.tmuxTarget}`;case"openTask":return e.launched?`Opened task ${e.taskId} at ${e.worktreePath}`:e.worktreePath;case"runChecks":return`Checks ${e.status} for ${e.taskId}: ${e.commands.join(", ")}`;case"commitTask":return[`Committed task ${e.taskId}`,`Status: ${e.status}`,`Commit: ${e.commitSha}`,`Message: ${e.message}`].join(`
238
- `);default:return TI(e)}}function hI(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(`
239
- `)}function eh(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(`
240
- `)}function gI(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(`
241
- `)}function Hc(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function yI(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(`
242
- `)}function wI(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(`
243
- `)}function kI(e){let t=[];return e.inspection.worktreeExists||e.task.status==="merged"&&!e.task.cleanup.preservedWorktree&&e.task.cleanup.worktreeRemovedAt||t.push(`Warning: worktree is missing at ${e.task.worktreePath}`),e.task.cleanup.warning&&!(e.task.status==="merged"&&!e.task.cleanup.worktreeRemovedAt)&&t.push(`Cleanup warning: ${e.task.cleanup.warning}`),e.task.artifacts.logPath&&!e.inspection.logExists&&t.push(`Warning: log file is missing at ${e.task.artifacts.logPath}`),e.inspection.recentFailureReason&&t.push(`Last failure: ${e.inspection.recentFailureReason}`),t}function TI(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function bI(e){return e.checks.status}function RI(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 nh(e,t){let{data:n,warnings:r}=SI(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:n,warnings:r})}function SI(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...n}=e;return{data:n,warnings:t}}return{data:e,warnings:[]}}function rh(e,t){let n={schemaVersion:1,command:e,ok:!1,error:{code:t.code,message:t.message,retryable:t.retryable,details:t.details}};return JSON.stringify(n)}async function Yc(e){let t=await ke.resolveContext({cwd:e.cwd,...e.explicitWorkspaceRoot!==void 0?{explicitWorkspaceRoot:e.explicitWorkspaceRoot}:{},...e.environmentWorkspaceRoot!==void 0?{environmentWorkspaceRoot:e.environmentWorkspaceRoot}:{},...e.allowUninitializedWorkspace!==void 0?{allowUninitializedCwd:e.allowUninitializedWorkspace}:{}}),n=ve(t.workspaceRoot),r=e.resolveTask===!0||e.requireTask===!0||e.explicitTaskId!==void 0||e.environmentTaskId!==void 0||e.environmentAgentTabId!==void 0;if(r&&!t.initialized)throw new g("TASK_CONTEXT_NOT_FOUND",`Task context cannot be resolved because ${t.workspaceRoot} is not an initialized Craig workspace.`,{details:{workspaceRoot:t.workspaceRoot}});let s=r&&t.initialized?await S.resolveContext(n,{cwd:e.cwd,...e.explicitTaskId!==void 0?{explicitTaskId:e.explicitTaskId}:{},...e.environmentTaskId!==void 0?{environmentTaskId:e.environmentTaskId}:{},...e.environmentAgentTabId!==void 0?{environmentAgentTabId:e.environmentAgentTabId}:{},...e.requireTask!==void 0?{required:e.requireTask}:{}}):null;return{paths:n,workspace:t,task:s}}async function sh(e){let t="cli",n=Iu(e.argv);try{let r=Pu(e.argv);if(n=r.options.json,r.mode==="interactive"){if(r.options.noInput||r.options.json||$I(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 d=await Yc({cwd:e.cwd,...r.options.workspaceRoot!==void 0?{explicitWorkspaceRoot:r.options.workspaceRoot}:{},...e.env.CRAIG_WORKSPACE_ROOT!==void 0?{environmentWorkspaceRoot:e.env.CRAIG_WORKSPACE_ROOT}:{},allowUninitializedWorkspace:!0});return e.runInteractive(d.workspace.workspaceRoot)}if(!r.command||!r.commandName)throw new 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.",{});vI(r.command,r.options.taskId);let s=AI(r.command,r.options.taskId),i=II(s);CI(s,r.options.taskId,i);let o=i!=="none",a=await Yc({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:PI(s),resolveTask:i!=="none",requireTask:i==="required"}),l=EI(s,e.signal),c;try{c=await Zm(s,{paths:a.paths,cwd:e.cwd,workspaceContext:a.workspace,taskContext:a.task,...l.signal?{signal:l.signal}:{},...s.kind==="watchEvents"||s.kind==="watchFury"?{emitEvent:d=>e.writeStdout(`${s.format==="jsonl"?JSON.stringify(d):Hc(d)}
244
- `)}:{},...e.readStdin?{readStdin:e.readStdin}:{},...e.env.CRAIG_AGENT_TAB_ID?{agentContext:!0}:{},...e.env.CRAIG_AGENT_CAPABILITY?{agentCapabilityId:e.env.CRAIG_AGENT_CAPABILITY}:{}})}finally{l.dispose()}let u=n?nh(t,c):th(c);return u.length>0&&e.writeStdout(`${u}
245
- `),0}catch(r){let s=Zo(r),i=n?rh(t,s):s.message;return e.writeStderr(`${i}
246
- `),s.exitCode}}function PI(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function II(e){return e.kind==="showContext"?"optional":e.kind==="currentTask"||e.kind==="showCurrentTask"?"required":e.kind==="createChildTask"?e.parentTaskId?"none":"required":e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||OI(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 vI(e,t){let n=ih(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 CI(e,t,n){if(!(t===void 0||n!=="none"||ih(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 ih(e){switch(e.kind){case"showTask":case"attachTask":case"listTaskLinks":case"listTaskChildren":case"cancelTaskTree":case"streamTaskLogs":case"showTaskDiff":case"focusTask":case"openTask":case"runChecks":case"commitTask":case"waitTask":case"listAgents":case"showAgentStatus":case"listEvents":case"watchEvents":case"sendAgentPrompt":case"listPromptCommands":return e.taskId;case"createChildTask":return e.parentTaskId;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return e.taskId;case"addTaskLink":return e.taskId;default:return}}function AI(e,t){return t&&(e.kind==="listAgents"||e.kind==="showAgentStatus"||e.kind==="waitTask"||e.kind==="listEvents"||e.kind==="watchEvents"||e.kind==="sendAgentPrompt"||e.kind==="listPromptCommands"||e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||e.kind==="createChildTask")?e.kind==="createChildTask"?{...e,parentTaskId:e.parentTaskId??t}:{...e,taskId:e.taskId??t}:e}function EI(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 OI(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function $I(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as pE}from"node:module";import{readFile as NI,stat as DI}from"node:fs/promises";import zc from"node:path";var xI=200*1024,_I=500*1024,ho="100000";async function ah(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return FI(e,t,n);try{let r=ln(n.selectedFilePath??null,t.filePaths),s=ln(n.selectedDiffPath??null,t.diffPaths),i=s?await Rs(e.worktreePath):null,[o,a]=await Promise.all([yo(e.worktreePath,r),s?Jc(e.worktreePath,s,t.diffRows,i):Promise.resolve(Pe("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 FI(e,t,n){let r=ln(n.selectedFilePath??null,t.filePaths),s=ln(n.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([ch(e,r),(async()=>{if(!s)return Pe("No diff selected","No local changes found.","empty");let l=go(e,s),c=l?await Rs(l.target.worktreePath).catch(()=>null):null;return dh(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function lh(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return LI(e,t);try{await me(e);let n=await Rs(e.worktreePath),[r,s]=await Promise.all([uh(e.worktreePath),ph(e.worktreePath,n)]),i=[...new Set(s.map(d=>d.path))],o=ln(t.selectedFilePath??null,r),a=ln(t.selectedDiffPath??null,i),[l,c]=await Promise.all([yo(e.worktreePath,o),a?Jc(e.worktreePath,a,s,n):Promise.resolve(Pe("No diff selected","No local changes found.","empty"))]),u=a?{[a]:c}:{};return{taskId:e.id,fileRows:hh(r),filePaths:r,diffRows:s,diffPaths:i,diffContents:u,selectedFilePath:o,selectedDiffPath:a,selectedFile:l,selectedDiff:c,error:null}}catch(n){let r=n instanceof Error?n.message:"Unable to inspect task worktree.";return{taskId:e.id,fileRows:[],filePaths:[],diffRows:[],diffPaths:[],diffContents:{},selectedFilePath:null,selectedDiffPath:null,selectedFile:Pe("Files unavailable",r,"error"),selectedDiff:Pe("Diff unavailable",r,"error"),error:r}}}async function LI(e,t){let n=(e.repoTargets??[]).filter(p=>p.status==="ready"),r=await Promise.all(n.map(async p=>{let h=await Rs(p.worktreePath).catch(()=>null),[f,m]=await Promise.all([uh(p.worktreePath).catch(()=>[]),ph(p.worktreePath,h).catch(()=>[])]);return{target:p,baseRef:h,targetFiles:f,targetDiffRows:m}})),s=[],i=[];for(let{target:p,targetFiles:h,targetDiffRows:f}of r)s.push(...h.map(m=>`${p.repoId}/${m}`)),i.push(...f.map(m=>({...m,path:`${p.repoId}/${m.path}`})));let o=[...new Set(i.map(p=>p.path))].sort(),a=ln(t.selectedFilePath??null,s),l=ln(t.selectedDiffPath??null,o),[c,u]=await Promise.all([ch(e,a),(async()=>{if(!l)return Pe("No diff selected","No local changes found.","empty");let p=go(e,l),h=p?r.find(f=>f.target.repoId===p.target.repoId):null;return dh(e,l,i,h?.baseRef??null)})()]),d=l?{[l]:u}:{};return{taskId:e.id,fileRows:hh(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:d,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:u,error:null}}async function ch(e,t){let n=go(e,t);if(!n)return Pe("No file selected","No Git-visible files found.","empty");let r=await yo(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function dh(e,t,n,r=null){let s=go(e,t);return s?{...await Jc(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}:Pe(t,"Repo target is unavailable.","error",t)}function go(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 uh(e){let t=await F("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return gh(t.stdout)}async function ph(e,t){let[n,r,s,i]=await Promise.all([MI(e,t),oh(e,"staged"),oh(e,"unstaged"),jI(e)]);return[...n,...r,...s,...i]}async function MI(e,t){if(!t)return[];let[n,r]=await Promise.all([F("git",["diff","--name-status",`${t}...HEAD`],{cwd:e}),F("git",["diff","--numstat",`${t}...HEAD`],{cwd:e})]),s=fh(n.stdout),i=mh(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 oh(e,t){let n=t==="staged"?["diff","--cached"]:["diff"],[r,s]=await Promise.all([F("git",[...n,"--name-status"],{cwd:e}),F("git",[...n,"--numstat"],{cwd:e})]),i=fh(r.stdout),o=mh(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 jI(e){let t=await F("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=gh(t.stdout);return await Promise.all(n.map(async s=>{let i=await yo(e,s),o=i.status==="ready"?qI(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function fh(e){return e.split(`
247
- `).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 mh(e){let t=new Map;for(let n of e.split(`
248
- `)){let r=n.trim();if(!r)continue;let[s="-",i="-",...o]=r.split(" "),a=o.join(" ");a&&t.set(a,{additions:s==="-"?null:Number(s),deletions:i==="-"?null:Number(i)})}return t}async function Rs(e){return(await G("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await G("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function yo(e,t){if(!t)return Pe("No file selected","No Git-visible files found.","empty");let n=UI(e,t);try{let r=await DI(n);if(r.size>xI)return Pe(t,`File is ${r.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,r.size);let s=await NI(n);return WI(s)?Pe(t,"Binary file preview is not available in Craig.","binary",t,s.byteLength):{path:t,status:"ready",title:t,lines:s.toString("utf8").split(`
249
- `),byteLength:s.byteLength}}catch(r){let s=r instanceof Error?r.message:"Unable to read file.";return Pe(t,s,"missing",t,null)}}async function Jc(e,t,n,r=null){if(!t)return Pe("No diff selected","No local changes found.","empty");let s=[],i=n.filter(a=>a.path===t).map(a=>a.group);if(i.includes("branch")){let a=r??await Rs(e);if(a){let l=await F("git",["diff","--stat","--patch",`--unified=${ho}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
250
- ${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await F("git",["diff","--cached","--stat","--patch",`--unified=${ho}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
251
- ${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await F("git",["diff","--stat","--patch",`--unified=${ho}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
252
- ${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await G("git",["diff","--no-index","--stat","--patch",`--unified=${ho}`,"--","/dev/null",t],{cwd:e});a.stdout.trim().length>0&&s.push(`untracked
238
+ `);default:return PI(e)}}function kI(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(`
239
+ `)}function rg(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(`
240
+ `)}function TI(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(`
241
+ `)}function zc(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function bI(e){return e.agents.length===0?"No agent tabs found.":["TASK TAB RUNNER STATE SESSION ERROR",...e.agents.map(t=>`${t.taskId} ${t.tabId} ${t.runner} ${t.state} ${t.sessionState??"none"} ${t.error??""}`),...e.daemonAvailable?[]:["Warning: PTY daemon unavailable; live agent tabs report idle unless a durable startup failure exists."]].join(`
242
+ `)}function RI(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(`
243
+ `)}function SI(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 PI(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function II(e){return e.checks.status}function vI(e){if(e.type==="project"&&e.repoTargets?.length){let n=e.repoTargets.filter(s=>s.pullRequest.number);if(n.length===0)return"-";let r=n.reduce((s,i)=>{let o=i.pullRequest.status??"unknown";return s[o]=(s[o]??0)+1,s},{});return Object.entries(r).map(([s,i])=>`${i} ${s}`).join(", ")}let t=e.prs[0];return t?.number?`#${t.number}:${t.status??"unknown"}`:"-"}function ig(e,t){let{data:n,warnings:r}=CI(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:n,warnings:r})}function CI(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...n}=e;return{data:n,warnings:t}}return{data:e,warnings:[]}}function og(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 Jc(e){let t=await ke.resolveContext({cwd:e.cwd,...e.explicitWorkspaceRoot!==void 0?{explicitWorkspaceRoot:e.explicitWorkspaceRoot}:{},...e.environmentWorkspaceRoot!==void 0?{environmentWorkspaceRoot:e.environmentWorkspaceRoot}:{},...e.allowUninitializedWorkspace!==void 0?{allowUninitializedCwd:e.allowUninitializedWorkspace}:{}}),n=ve(t.workspaceRoot),r=e.resolveTask===!0||e.requireTask===!0||e.explicitTaskId!==void 0||e.environmentTaskId!==void 0||e.environmentAgentTabId!==void 0;if(r&&!t.initialized)throw new h("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 R.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 ag(e){let t="cli",n=Au(e.argv);try{let r=Cu(e.argv);if(n=r.options.json,r.mode==="interactive"){if(r.options.noInput||r.options.json||_I(e.env)||!e.isInputTty||!e.isOutputTty)throw new h("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 h("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 d=await Jc({cwd:e.cwd,...r.options.workspaceRoot!==void 0?{explicitWorkspaceRoot:r.options.workspaceRoot}:{},...e.env.CRAIG_WORKSPACE_ROOT!==void 0?{environmentWorkspaceRoot:e.env.CRAIG_WORKSPACE_ROOT}:{},allowUninitializedWorkspace:!0});return e.runInteractive(d.workspace.workspaceRoot)}if(!r.command||!r.commandName)throw new h("CLI_USAGE","Command mode requires a command.",{});if(t=r.commandName,(r.command.kind==="watchEvents"||r.command.kind==="watchFury")&&r.options.json)throw new h("CLI_USAGE","watch commands stream output; use --format jsonl instead of --json.",{});OI(r.command,r.options.taskId);let s=DI(r.command,r.options.taskId),i=EI(s);$I(s,r.options.taskId,i);let o=i!=="none",a=await Jc({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:AI(s),resolveTask:i!=="none",requireTask:i==="required"}),l=NI(s,e.signal),c;try{c=await ng(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:d=>e.writeStdout(`${s.format==="jsonl"?JSON.stringify(d):zc(d)}
244
+ `)}:{},...e.readStdin?{readStdin:e.readStdin}:{},...e.env.CRAIG_AGENT_TAB_ID?{agentContext:!0}:{},...e.env.CRAIG_AGENT_CAPABILITY?{agentCapabilityId:e.env.CRAIG_AGENT_CAPABILITY}:{}})}finally{l.dispose()}let u=n?ig(t,c):sg(c);return u.length>0&&e.writeStdout(`${u}
245
+ `),0}catch(r){let s=Zo(r),i=n?og(t,s):s.message;return e.writeStderr(`${i}
246
+ `),s.exitCode}}function AI(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function EI(e){return e.kind==="showContext"?"optional":e.kind==="currentTask"||e.kind==="showCurrentTask"?"required":e.kind==="createChildTask"?e.parentTaskId?"none":"required":e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||xI(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 OI(e,t){let n=lg(e);if(!(n===void 0||t===void 0||t===n))throw new h("CLI_USAGE",`Task ${n} conflicts with --task ${t}. Provide only one task target.`,{details:{positionalTaskId:n,globalTaskId:t}})}function $I(e,t,n){if(!(t===void 0||n!=="none"||lg(e)===t))throw new h("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 lg(e){switch(e.kind){case"showTask":case"attachTask":case"listTaskLinks":case"listTaskChildren":case"cancelTaskTree":case"streamTaskLogs":case"showTaskDiff":case"focusTask":case"openTask":case"runChecks":case"commitTask":case"waitTask":case"listAgents":case"showAgentStatus":case"listEvents":case"watchEvents":case"sendAgentPrompt":case"listPromptCommands":return e.taskId;case"createChildTask":return e.parentTaskId;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return e.taskId;case"addTaskLink":return e.taskId;default:return}}function DI(e,t){return t&&(e.kind==="listAgents"||e.kind==="showAgentStatus"||e.kind==="waitTask"||e.kind==="listEvents"||e.kind==="watchEvents"||e.kind==="sendAgentPrompt"||e.kind==="listPromptCommands"||e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||e.kind==="createChildTask")?e.kind==="createChildTask"?{...e,parentTaskId:e.parentTaskId??t}:{...e,taskId:e.taskId??t}:e}function NI(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 xI(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function _I(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as kE}from"node:module";import{readFile as FI,stat as LI}from"node:fs/promises";import Xc from"node:path";var MI=200*1024,jI=500*1024,go="100000";async function dg(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return qI(e,t,n);try{let r=cn(n.selectedFilePath??null,t.filePaths),s=cn(n.selectedDiffPath??null,t.diffPaths),i=s?await Rs(e.worktreePath):null,[o,a]=await Promise.all([yo(e.worktreePath,r),s?Qc(e.worktreePath,s,t.diffRows,i):Promise.resolve(Pe("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 qI(e,t,n){let r=cn(n.selectedFilePath??null,t.filePaths),s=cn(n.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([pg(e,r),(async()=>{if(!s)return Pe("No diff selected","No local changes found.","empty");let l=ho(e,s),c=l?await Rs(l.target.worktreePath).catch(()=>null):null;return fg(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function ug(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return UI(e,t);try{await me(e);let n=await Rs(e.worktreePath),[r,s]=await Promise.all([mg(e.worktreePath),gg(e.worktreePath,n)]),i=[...new Set(s.map(d=>d.path))],o=cn(t.selectedFilePath??null,r),a=cn(t.selectedDiffPath??null,i),[l,c]=await Promise.all([yo(e.worktreePath,o),a?Qc(e.worktreePath,a,s,n):Promise.resolve(Pe("No diff selected","No local changes found.","empty"))]),u=a?{[a]:c}:{};return{taskId:e.id,fileRows:wg(r),filePaths:r,diffRows:s,diffPaths:i,diffContents:u,selectedFilePath:o,selectedDiffPath:a,selectedFile:l,selectedDiff:c,error:null}}catch(n){let r=n instanceof Error?n.message:"Unable to inspect task worktree.";return{taskId:e.id,fileRows:[],filePaths:[],diffRows:[],diffPaths:[],diffContents:{},selectedFilePath:null,selectedDiffPath:null,selectedFile:Pe("Files unavailable",r,"error"),selectedDiff:Pe("Diff unavailable",r,"error"),error:r}}}async function UI(e,t){let n=(e.repoTargets??[]).filter(p=>p.status==="ready"),r=await Promise.all(n.map(async p=>{let m=await Rs(p.worktreePath).catch(()=>null),[g,f]=await Promise.all([mg(p.worktreePath).catch(()=>[]),gg(p.worktreePath,m).catch(()=>[])]);return{target:p,baseRef:m,targetFiles:g,targetDiffRows:f}})),s=[],i=[];for(let{target:p,targetFiles:m,targetDiffRows:g}of r)s.push(...m.map(f=>`${p.repoId}/${f}`)),i.push(...g.map(f=>({...f,path:`${p.repoId}/${f.path}`})));let o=[...new Set(i.map(p=>p.path))].sort(),a=cn(t.selectedFilePath??null,s),l=cn(t.selectedDiffPath??null,o),[c,u]=await Promise.all([pg(e,a),(async()=>{if(!l)return Pe("No diff selected","No local changes found.","empty");let p=ho(e,l),m=p?r.find(g=>g.target.repoId===p.target.repoId):null;return fg(e,l,i,m?.baseRef??null)})()]),d=l?{[l]:u}:{};return{taskId:e.id,fileRows:wg(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:d,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:u,error:null}}async function pg(e,t){let n=ho(e,t);if(!n)return Pe("No file selected","No Git-visible files found.","empty");let r=await yo(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function fg(e,t,n,r=null){let s=ho(e,t);return s?{...await Qc(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}:Pe(t,"Repo target is unavailable.","error",t)}function ho(e,t){if(!t)return null;let[n,...r]=t.split("/"),s=r.join("/"),i=(e.repoTargets??[]).find(o=>o.repoId===n&&o.status==="ready")??null;return!i||s.length===0?null:{target:i,relativePath:s}}async function mg(e){let t=await F("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return kg(t.stdout)}async function gg(e,t){let[n,r,s,i]=await Promise.all([WI(e,t),cg(e,"staged"),cg(e,"unstaged"),BI(e)]);return[...n,...r,...s,...i]}async function WI(e,t){if(!t)return[];let[n,r]=await Promise.all([F("git",["diff","--name-status",`${t}...HEAD`],{cwd:e}),F("git",["diff","--numstat",`${t}...HEAD`],{cwd:e})]),s=hg(n.stdout),i=yg(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 cg(e,t){let n=t==="staged"?["diff","--cached"]:["diff"],[r,s]=await Promise.all([F("git",[...n,"--name-status"],{cwd:e}),F("git",[...n,"--numstat"],{cwd:e})]),i=hg(r.stdout),o=yg(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 BI(e){let t=await F("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=kg(t.stdout);return await Promise.all(n.map(async s=>{let i=await yo(e,s),o=i.status==="ready"?VI(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function hg(e){return e.split(`
247
+ `).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 yg(e){let t=new Map;for(let n of e.split(`
248
+ `)){let r=n.trim();if(!r)continue;let[s="-",i="-",...o]=r.split(" "),a=o.join(" ");a&&t.set(a,{additions:s==="-"?null:Number(s),deletions:i==="-"?null:Number(i)})}return t}async function Rs(e){return(await G("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await G("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function yo(e,t){if(!t)return Pe("No file selected","No Git-visible files found.","empty");let n=KI(e,t);try{let r=await LI(n);if(r.size>MI)return Pe(t,`File is ${r.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,r.size);let s=await FI(n);return GI(s)?Pe(t,"Binary file preview is not available in Craig.","binary",t,s.byteLength):{path:t,status:"ready",title:t,lines:s.toString("utf8").split(`
249
+ `),byteLength:s.byteLength}}catch(r){let s=r instanceof Error?r.message:"Unable to read file.";return Pe(t,s,"missing",t,null)}}async function Qc(e,t,n,r=null){if(!t)return Pe("No diff selected","No local changes found.","empty");let s=[],i=n.filter(a=>a.path===t).map(a=>a.group);if(i.includes("branch")){let a=r??await Rs(e);if(a){let l=await F("git",["diff","--stat","--patch",`--unified=${go}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
250
+ ${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await F("git",["diff","--cached","--stat","--patch",`--unified=${go}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
251
+ ${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await F("git",["diff","--stat","--patch",`--unified=${go}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
252
+ ${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await G("git",["diff","--no-index","--stat","--patch",`--unified=${go}`,"--","/dev/null",t],{cwd:e});a.stdout.trim().length>0&&s.push(`untracked
253
253
  ${a.stdout.trimEnd()}`)}let o=s.join(`
254
254
 
255
- `);return o.length>_I?Pe(t,"Diff is above the 500 KB inline preview limit.","too_large",t,o.length):o.includes("\0")?Pe(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(`
256
- `):["No diff for this file."],byteLength:o.length}}function hh(e){let t=[],n=new Set;for(let r of e){let s=r.split("/");for(let i=0;i<s.length-1;i+=1){let o=s.slice(0,i+1).join("/");n.has(o)||(n.add(o),t.push({kind:"directory",path:o,depth:i,label:s[i]??o}))}t.push({kind:"file",path:r,depth:s.length-1,label:s.at(-1)??r})}return t}function ln(e,t){return e&&t.includes(e)?e:t[0]??null}function qI(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function gh(e){return[...new Set(e.split(`
257
- `).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function UI(e,t){let n=zc.resolve(e,t),r=zc.resolve(e);if(n!==r&&!n.startsWith(`${r}${zc.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function WI(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function Pe(e,t,n,r=null,s=null){return{path:r,status:n,title:e,lines:[t],byteLength:s}}var BI=["tasks","center","inspector","actions"],yh=["agent","terminal"],wh=[],K="inspection",_B=[...yh,...wh],Xc=["commit","push","refresh-checks","close-task"],kh=["refresh-checks","close-task"],Th=["task","checks","pr","setup-run","actions","next-action"],Qc=["files","review"];function bh(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=zI(e?.openInspectionKind)??n,s=k.runners.getEnabled(t);return{inputMode:XI(e?.inputMode),focusedRegion:HI(e?.focusedRegion),selectedRepoId:xt(e?.selectedRepoId),selectedWorkspaceId:xt(e?.selectedWorkspaceId),selectedTaskId:xt(e?.selectedTaskId),selectedPtyTabId:xt(e?.selectedPtyTabId),selectedLeftItemId:rv(xt(e?.selectedTaskId)),activeTab:n?K:xt(e?.activeTab)??"agent",preferredPtyTabKind:JI(e?.preferredPtyTabKind),inspectorSection:Ss(e?.inspectorSection,Th,"task"),inspectionMode:YI(e?.inspectionMode,n==="diff"?"review":"files"),openInspectionKind:r,selectedFileTreePath:xt(e?.selectedFileTreePath),selectedFilePath:xt(e?.selectedFilePath),selectedDiffPath:xt(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:Ss(e?.selectedActionId,Xc,"commit"),selectedProjectTargetId:null,selectedRunner:QI(e?.selectedRunner,s,k.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:VI(),centerZoomed:!1}}function VI(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function Rh(e,t){return{...e??qs(),selectedRepoId:t.selectedRepoId,selectedWorkspaceId:t.selectedWorkspaceId,selectedTaskId:t.selectedTaskId,selectedPtyTabId:t.selectedPtyTabId,inputMode:t.inputMode,focusedRegion:t.focusedRegion,activeTab:t.activeTab,preferredPtyTabKind:t.preferredPtyTabKind,inspectorSection:t.inspectorSection,inspectionMode:t.inspectionMode,openInspectionKind:t.openInspectionKind,selectedFileTreePath:t.selectedFileTreePath,selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath,collapsedFileTreePaths:t.collapsedFileTreePaths,selectedActionId:t.selectedActionId,selectedRunner:t.selectedRunner}}function Is(e,t,n={}){let r=nv(e,t),s=ed(r),i=(s?.kind==="workspace"?t.workspaces?.find(u=>u.id===s.id)??null:null)??(s?.kind==="task"?t.workspaces?.find(u=>u.id===t.tasks.find(d=>d.id===s.id)?.workspaceId)??null:null)??t.workspaces?.find(u=>u.id===e.selectedWorkspaceId)??t.workspaces?.[0]??null,a=((s?.kind==="repo"?t.repos.find(u=>u.id===s.id)??null:s?.kind==="task"?t.repos.find(u=>u.id===t.tasks.find(d=>d.id===s.id)?.repoId)??null:null)??(i?.kind==="project"?t.repos.find(u=>u.id===e.selectedRepoId&&i.discoveredRepoIds?.includes(u.id))??null:null)??(i?.kind!=="project"?t.repos.find(u=>u.id===i?.primaryRepoId)??null:null)??t.repos.find(u=>u.id===e.selectedRepoId)??t.repos[0]??null)?.id??null,l=i?t.tasks.filter(u=>u.workspaceId===i.id):a?t.tasks.filter(u=>u.repoId===a):[],c=(s?.kind==="task"?l.find(u=>u.id===s.id)??null:null)??l.find(u=>u.id===e.selectedTaskId)??l[0]??null;return{...e,inputMode:n.resetInputMode?"control":e.inputMode,selectedLeftItemId:r,selectedWorkspaceId:i?.id??null,selectedRepoId:a,selectedTaskId:c?.id??null,...ZI(c,e.activeTab,e.selectedPtyTabId),selectedFilePath:GI(e,t,c?.id??null),...ev(e,t,c?.id??null),selectedDiffPath:KI(e,t,c?.id??null),inspectorSection:Ss(e.inspectorSection,Th,"task")}}function _t(e,t){return{...e,terminal:t}}function Sh(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function Ph(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function at(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
258
- `}function Ih(e){return e.length===1&&e>=" "&&e!=="\x7F"}function Zc(e){return Ch(e)||Rr(e)!==null}function vh(e){return wh.includes(e)}function Ch(e){return yh.includes(e)}function Ah(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[K]:[]]}function KI(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function GI(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function Ss(e,t,n){return t.includes(e??"")?e:n}function HI(e){return e==="tabs"?"center":Ss(e,BI,"tasks")}function YI(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":Ss(e,Qc,t)}function zI(e){return e==="file"||e==="diff"?e:null}function JI(e){return e==="terminal"?"terminal":"agent"}function XI(e){return e==="terminal"?"terminal":"control"}function QI(e,t=[...J],n="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:n}function wo(e,t=J){let n=t.length>0?t:J,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function Rr(e){let t=J.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function ZI(e,t,n){if(!e)return{activeTab:t===K?t:"agent",selectedPtyTabId:null};let r=e.ptyTabs.find(a=>a.id===n)??null,s=e.selectedPtyTabId?e.ptyTabs.find(a=>a.id===e.selectedPtyTabId)??null:null,i=e.ptyTabs.find(a=>a.id===t)??null;if(i)return{activeTab:i.id,selectedPtyTabId:i.id};if(Ch(t)){let l=e.ptyTabs.find(c=>c.kind===t)??null??s??r??e.ptyTabs[0]??null;return{activeTab:l?.id??K,selectedPtyTabId:l?.id??null}}if(t===K)return{activeTab:K,selectedPtyTabId:r?.id??s?.id??e.ptyTabs[0]?.id??null};let o=s??r??e.ptyTabs[0]??null;return{activeTab:o?.id??K,selectedPtyTabId:o?.id??null}}function ev(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?tv(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function tv(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 nv(e,t){let n=Ln(t);return e.selectedLeftItemId&&n.includes(e.selectedLeftItemId)?e.selectedLeftItemId:e.selectedWorkspaceId&&n.includes(`workspace:${e.selectedWorkspaceId}`)?`workspace:${e.selectedWorkspaceId}`:e.selectedTaskId&&n.includes(`task:${e.selectedTaskId}`)?`task:${e.selectedTaskId}`:e.selectedRepoId&&n.includes(`repo:${e.selectedRepoId}`)?`repo:${e.selectedRepoId}`:n[0]??null}function Ln(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of Ps(e.tasks.filter(s=>s.workspaceId===n.id)))t.push(`task:${r.id}`);n.kind==="project"&&t.push(`new-task-workspace:${n.id}`),n.kind==="repo"&&t.push(`new-task:${n.primaryRepoId}`)}else for(let n of e.repos){t.push(`repo:${n.id}`);for(let{task:r}of Ps(e.tasks.filter(s=>s.repoId===n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function Ps(e){let t=new Set(e.map(i=>i.id)),n=new Set,r=[],s=new Map;for(let i of e){if(i.rootTaskId===i.id||!t.has(i.rootTaskId))continue;let o=s.get(i.rootTaskId)??[];o.push(i),s.set(i.rootTaskId,o)}for(let i of e)if(!(i.rootTaskId!==i.id&&t.has(i.rootTaskId))){r.push({task:i,visualDepth:0}),n.add(i.id);for(let a of s.get(i.id)??[])n.has(a.id)||(r.push({task:a,visualDepth:1}),n.add(a.id))}for(let i of e)n.has(i.id)||r.push({task:i,visualDepth:0});return r}function ed(e){return e?e.startsWith("workspace:")?{kind:"workspace",id:e.slice(10)}:e.startsWith("repo:")?{kind:"repo",id:e.slice(5)}:e.startsWith("task:")?{kind:"task",id:e.slice(5)}:null:null}function xt(e){return typeof e=="string"?e:null}function rv(e){return e?`task:${e}`:null}function vs(e){return typeof e=="string"&&e.startsWith("task:")}function ko(e){return typeof e=="string"&&e.startsWith("new-task:")}function To(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function Eh(e){return typeof e=="string"&&e.startsWith("workspace:")}function td(e){return ko(e)?e.slice(9):null}function nd(e){return To(e)?e.slice(19):null}async function Sr(e,t,n){let r=ve(e),[s,i]=await Promise.all([ke.repos.listRegisteredRepos(r),ke.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 Xe(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([of(r),fi(r)]);c=f.length+m.filter(y=>y.state==="waiting_for_review").length}let u=rd(o.tasks,t),d=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},p=u?await lh(u,d):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 rd(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function Oh(e,t){return Is(e,t)}import fd from"node:path";import GB from"picocolors";var sv=[" \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 sd(){return[...sv]}var bo={width:120,height:36},Z={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function Me(e,t){return{width:Math.max(e??bo.width,bo.width),height:Math.max(t??bo.height,bo.height)}}var iv=["Start","Options","Exit"],ov=["Resume","Options","Exit"],So=2,Po=2,Io=2,av=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),lv=new RegExp("\x1B\\[(?:0)?m","g"),cv=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),dv=/https?:\/\/[^\s<>"']+/g,od="\x1B[0m",ad="\x1B]8;;\x1B\\",D={panelBg:{bg:"0a0a0a",fg:"c0caf5"},panelMuted:{bg:"0a0a0a",fg:"565f89"},panelSelected:{bg:"1a1b26",fg:"c0caf5"},panelFocused:{bg:"1a1b26",fg:"7aa2f7"},divider:{bg:"0a0a0a",fg:"292e42"},rail:{bg:"0a0a0a",fg:"c0caf5"},overlay:{bg:"06060f",fg:"565f89"},overlayTitle:{bg:"06060f",fg:"565f89"},overlayLogo:{bg:"06060f",fg:"9ece6a"},overlaySubtitle:{bg:"06060f",fg:"41a6b5"},overlayMenuSelected:{bg:"06060f",fg:"7aa2f7"},accent:{fg:"7aa2f7"},success:{fg:"9ece6a"},pending:{fg:"e0af68"},error:{fg:"f7768e"},mutedfg:{fg:"565f89"},disabled:{fg:"3b4261"}},id=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function Dh(e,t={}){return cd(e,{subtitle:"crAIg is that you?",menuItems:iv,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function xh(e,t={}){return cd(e,{subtitle:"Control mode is paused.",menuItems:ov,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}var Ro=[" GLOBAL CENTER PANEL INSPECTOR"," ? help \u2190\u2192 / hl switch tab \u2191\u2193 / jk navigate"," Esc pause / back + new tab \u2190\u2192 / hl switch mode"," Tab cycle panels a codex tab R sync PR"," q quit t terminal tab R sync PR"," x close tab X close task"," TASKS Enter attach PTY X close task"," \u2191\u2193 / jk navigate"," n new task TERMINAL MODE"," Enter attach Ctrl+] return to control mode"," Wheel / PgUp / PgDn scroll",""," Press Esc to return."],uv=["Help"],pv=5;function Ao(e,t={}){return cd(e,{subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??uv,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function _h(e,t={}){let n=t.color??!0,r=D.overlay,s=new Array(e.height).fill(re(" ".repeat(e.width),n,r)),i=sd(),o=Math.max(1,Math.floor((e.height-i.length-2-Ro.length)/2));for(let u=0;u<i.length&&!(o+u>=e.height);u+=1)s[o+u]=re(Vh(i[u]??"",e.width),n,D.overlayLogo);let a=Math.max(...Ro.map(u=>u.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let u=0;u<Ro.length;u+=1){let d=c+u;if(d>=e.height)break;let p=Ro[u]??"";s[d]=re(kt(" ".repeat(l)+p,e.width),n,r)}return s.join(`
259
- `)}function Fh(e,t={}){let n=t.color??!0,r=D.overlay,s=new Array(e.height).fill(re(" ".repeat(e.width),n,r)),i="Logs",o=t.logPath??"",a=t.logLines??[],l=Math.max(20,e.width-8),c=Math.max(0,Math.floor((e.width-l)/2)),u=[{text:i,tone:"selected"},{text:o,tone:"muted"},lt(),...a.length>0?a.map(h=>({text:h,tone:fv(h)})):[{text:"No Craig activity has been logged.",tone:"muted"}],lt(),{text:"Esc returns to Options.",tone:"muted"}],d=Cs(u,e.height-2),p=Math.max(1,Math.floor((e.height-d.length)/2));for(let h=0;h<d.length;h+=1){let f=p+h;if(f>=e.height)break;let m=d[h]??lt(),y=`${" ".repeat(c)}${Eo(m.text,l)}`,T=m.tone==="selected"?D.overlayMenuSelected:m.tone==="info"?{...D.overlay,fg:D.accent.fg}:m.tone==="warning"?{...D.overlay,fg:D.pending.fg}:m.tone==="error"?{...D.overlay,fg:D.error.fg}:m.tone==="muted"?D.overlay:D.panelBg;s[f]=re(kt(y,e.width),n,T)}return s.join(`
260
- `)}function fv(e){return e.includes(" ERROR ")?"error":e.includes(" WARN ")?"warning":e.includes(" INFO ")?"info":"muted"}function Lh(e,t,n={}){let r=n.color??!0,s=Z.leftWidth,i=Z.rightWidth,o=n.centerOnly??!1,a=e.height-Z.topRailHeight-1,l=n.focusFlashActive??!1,c={bg:D.divider.bg,fg:"9ece6a"},u=l&&(t.focusedRegion==="tasks"||t.focusedRegion==="center")?c:D.divider,d=l&&(t.focusedRegion==="center"||t.focusedRegion==="inspector")?c:D.divider,p=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,h=re(kt(p,e.width),r,D.rail),f=hv(t,s-So-Po,a,r),m=ld(e,t,{color:r,centerOnly:o}),y=wv(t,i,a,r),T=t.inputMode==="terminal",R=[],v=[];for(let ye=0;ye<a;ye+=1)if(!o){let Y=vo(f[ye]??lt(),s,r,"left"),fn=re("\u2502",r,u),_s=re("\u2502",r,d),Fs=vo(y[ye]??lt(),i,r,"right");R.push(`${Y}${fn}`),v.push(`${_s}${Fs}`)}let b=T||t.modalInput?D.panelBg:D.panelMuted,$=mv(t.footerText,t.footerToast,e.width,r,b),N={row:1,column:1,width:e.width,rows:[h]},_=o?null:{row:Z.topRailHeight+1,column:1,width:s+Z.dividerWidth,rows:R},C=o?null:{row:Z.topRailHeight+1,column:m.column+m.width,width:Z.dividerWidth+i,rows:v},w={row:e.height,column:1,width:e.width,rows:[$]},ge=o?m.rows:m.rows.map((ye,Y)=>`${R[Y]??""}${ye}${v[Y]??""}`);return{frame:[h,...ge,$].join(`
261
- `),center:m,regions:{rail:N,left:_,center:m,right:C,footer:w}}}function ld(e,t,n={}){let r=n.color??!0,s=jh(e,n.centerOnly??!1),i=gv(t,s.width,s.rowCount,r);return{row:s.row,column:s.column,width:s.width,rows:i.map(o=>vo(o,s.width,r,"center"))}}function Mh(e,t,n,r={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!Zc(s)||t.centerHeader.tabLabel==="BROWSER"||t.terminal.error||t.terminal.rows.length===0||n.some(c=>c<0||c>=t.terminal.rows.length))return null;let i=r.color??!0,o=jh(e,r.centerOnly??!1),a=qh(t,o.width,i).length,l=[...new Set(n)].map(c=>({terminalIndex:c,index:a+c})).filter(({index:c})=>c<o.rowCount).map(({terminalIndex:c,index:u})=>({index:u,row:vo(Uh(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function jh(e,t){return{row:Z.topRailHeight+1,column:t?1:Z.leftWidth+Z.dividerWidth+1,width:t?e.width:e.width-Z.leftWidth-Z.rightWidth-Z.dividerWidth*2,rowCount:e.height-Z.topRailHeight-1}}function mv(e,t,n,r,s){let i=` ${e}`;if(!t)return re(kt(i,n),r,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=Oe(o),l=Oe(i),c=Math.max(1,n-l-a-2),u=l+c+a+2>n?Eo(i,Math.max(0,n-a-3)):i,d=Math.max(1,n-Oe(u)-a-2),p=t.tone==="error"?Lv(o,r,s):Pr(o,r,s),h=`${u}${" ".repeat(d)}${p} `;return re(kt(h,n),r,s)}function cd(e,t){let n=new Array(e.height).fill(re(" ".repeat(e.width),t.color,D.overlay)),r=sd(),s=t.menuItems.map((c,u)=>`${u===t.menuIndex?">":" "} ${c}`),i=t.optionsMessage?["",t.optionsMessage]:[],o=[...s,...i];for(;o.length<pv;)o.push("");let a=[...r,"",t.subtitle,"",...o],l=Math.max(1,Math.floor((e.height-a.length)/2));for(let c=0;c<a.length;c+=1){let u=Vh(a[c]??"",e.width);if(c<r.length){n[l+c]=re(u,t.color,D.overlayLogo);continue}if(c===r.length+1){n[l+c]=re(u,t.color,D.overlaySubtitle);continue}let d=c-(r.length+3),h=d>=0&&d<t.menuItems.length&&d===t.menuIndex?D.overlayMenuSelected:D.overlay;n[l+c]=re(u,t.color,h)}if(t.versionText){let c=t.updateText?" (update available)":"",u=`${t.versionText}${c} `,d=" ".repeat(Math.max(0,e.width-Oe(u)));n[e.height-1]=re(`${d}${pd(u,t.color,D.overlay)}`,t.color,D.overlay)}return n.join(`
262
- `)}function hv(e,t,n,r){let s=bv(e.runners),i=1,o=e.leftTree.map(l=>Tv(l,t,r));return[...Cs(o,n-i),s]}function gv(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!Zc(s)?e.centerTranscript.map(o=>({...o})):yv(e);return Cs([...qh(e,t,r),...i],n)}function qh(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:xv(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?Pr(a,n,D.panelBg):Co(a,n,D.panelMuted)}`,c=[`${Co(e.centerHeader.tabLabel,n,D.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),u=Rv(e.tabs,n,e.focusedRegion==="center"),d=" engaged ",p=d.length+2,h=e.inputMode==="terminal"?Pr(`${d}\u25CF `,n,D.panelBg):"",f=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Oe(u)-p)):"";return[{text:e.inputMode==="terminal"?`${u}${f}${h}`:u},{text:l,tone:"muted"},{text:c},lt()]}function yv(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},lt(),{text:e.terminal.error},lt(),{text:"Fix the native dependency setup, then re-enter terminal mode."}];let t=e.tabs.find(r=>r.active)?.id??"",n=t==="agent"||/:agent(?:-\d+)?$/.test(t)?"agent":"terminal";return e.terminal.rows.length===0?[{text:`Press Enter on the ${n.toUpperCase()} tab to attach a PTY.`}]:e.terminal.rows.map(Uh)}function Uh(e){return{text:ud(e.segments),segments:e.segments,fullBleed:!0}}function wv(e,t,n,r){let s=e.rightInspection?kv(e.actionMessage?[...e.rightInspection.rows.slice(0,2),{id:"action-message",text:e.actionMessage},{id:"action-message-spacer",text:""},...e.rightInspection.rows.slice(2)]:e.rightInspection.rows,n):Cs([{text:"CONTEXT"},lt(),...e.rightContext.map(i=>Sv(i,r)),...e.actionMessage?[lt(),{text:e.actionMessage}]:[]],n);return Cs(s,n)}function kv(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:Fv(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>$h(a)),...r.slice(o,o+s).map(a=>$h(a))]}function $h(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 Tv(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${Pr("\u25CF",n,e.selected?D.panelSelected:D.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((f,m)=>f+Oe(m.text),0):0,l=t-Oe(i)-Oe(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",u=e.selected?e.text:e.focused?Pr(e.text,n,D.panelBg):e.panelHeader?Co(e.text,n,D.panelMuted):e.text,d=kt(`${r}${c}${u}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let f=`${r}${e.selected?"\u25B8":" "} `,m=d.slice(f.length+2),y=[{text:f},Wh(e.activity,e.activityAnimationFrame??0),{text:` ${m}${i}${o}`},...e.prBadge??[]];return{text:ud(y),segments:y,tone:p}}if(e.prBadge){let f=[{text:`${d}${i}${o}`},...e.prBadge];return{text:`${d}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:f,tone:p}}return{text:`${d}${i}${o}`,tone:p}}function bv(e){let t=e.map(r=>{let s=r.health>=1,i=parseInt(r.count,10),o=i>1?` (${i})`:"";return{text:`${s?"\u25CF":"\u25CB"} ${r.name}${o}`,active:s}}),n=[];for(let r=0;r<t.length;r++){let s=t[r];r>0&&n.push({text:" "}),s.active?n.push({text:s.text,style:{fg:D.success.fg}}):n.push({text:s.text,style:{fg:D.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function Rv(e,t,n){return e.map(r=>{let s=r.active?n?Pr(r.label,t,D.panelBg):Co(r.label,t,D.panelBg):pd(r.label,t,D.panelBg),i=r.activity?dd(Wh(r.activity,r.activityAnimationFrame??0),t,D.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function Wh(e,t){return{text:"\u25CF",style:{fg:e==="working"?id[t%id.length]??id[0]:e==="ready"?D.success.fg:e==="error"?D.error.fg:D.panelMuted.fg}}}function Sv(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?pd(e.value,t,D.panelBg):e.value}`}}function vo(e,t,n,r){let s=Pv(r,e.tone??"default"),i=Iv(e,n,s);if(r==="left"){if(e.fullBleed)return re(kt(i,t),n,s);let a=t-So-Po;if(e.rightAlign){let c=Oe(i),u=Math.max(0,a-c),d=`${" ".repeat(So)}${" ".repeat(u)}${i}${" ".repeat(Po)}`;return re(d,n,s)}let l=`${" ".repeat(So)}${kt(i,a)}${" ".repeat(Po)}`;return re(l,n,s)}return r==="center"&&e.fullBleed?vv(e,t,n,s):re(kt(` ${i}`,t),n,s)}function Pv(e,t){return t==="selected"||t==="focused"?D.panelSelected:t==="muted"?D.panelMuted:D.panelBg}function Cs(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(lt());return n}function lt(){return{text:""}}function Iv(e,t,n){return e.segments?e.segments.map(r=>dd(r,t,n)).join(""):e.text}function vv(e,t,n,r){let s=" ".repeat(Io),i=Math.max(0,t-Io*2);if(!e.segments)return re(`${s}${kt(e.text,i)}${s}`,n,r);let o=Ev(e.segments,i),a=`${s}${o.map(l=>dd(l,n,r)).join("")}${s}${n?ad:""}`;return re(a,n,r)}function dd(e,t,n){let r=e.href?`${Bh(e.href)}${e.text}${ad}`:Cv(e.text);return!t||!e.style?r:`${As(Nv(e.style,n))}${Dv(e.style)}${r}${od}${As(n)}`}function Cv(e){return e.replace(dv,t=>{let[n,r]=Av(t);return`${Bh(n)}${n}${ad}${r}`})}function Av(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function Bh(e){return`\x1B]8;;${e}\x1B\\`}function Ev(e,t){let n=Ov(e,t);return $v(n,t)}function Ov(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=Oe(s.text);if(i<=r){n.push(s),r-=i;continue}let o=Eo(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function $v(e,t){let n=Oe(ud(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 Nv(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 Dv(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 xv(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 Vh(e,t){let n=Math.max(0,t-Oe(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function kt(e,t){let n=Oe(e);return n>=t?_v(e,t):e+" ".repeat(t-n)}function _v(e,t){if(t<=0)return"";if(Oe(e)<=t)return e;let n=Gh(e);return Eo(n,Math.max(0,t-1))+"\u2026"}function Oe(e){let t=0;for(let n of Array.from(Gh(e)))t+=Kh(n);return t}function Eo(e,t){let n="",r=0;for(let s of Array.from(e)){let i=Kh(s);if(r+i>t)break;n+=s,r+=i}return n}function Kh(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 Fv(e,t,n){return Math.min(Math.max(e,t),n)}function Gh(e){return e.replace(cv,"").replace(av,"")}function ud(e){return e.map(t=>t.text).join("")}function re(e,t,n){if(!t)return e;let r=As(n),s=e.replace(lv,`${od}${r}`);return`${r}${s}${od}`}function As(e){let t=[];return e.fg&&t.push(`38;2;${Nh(e.fg).join(";")}`),e.bg&&t.push(`48;2;${Nh(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function Nh(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function Pr(e,t,n){return Oo(e,t,D.success.fg,n)}function Lv(e,t,n){return Oo(e,t,D.error.fg,n)}function Co(e,t,n){return Oo(e,t,D.accent.fg,n)}function pd(e,t,n){return Oo(e,t,D.mutedfg.fg,n)}function Oo(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${As(s)}${e}${As(r)}`}function Hh(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"?jv(s):[],a=r?{CRAIG_WORKSPACE_ROOT:n,CRAIG_TASK_ID:r.id,...s?.kind==="agent"?{CRAIG_AGENT_TAB_ID:s.id,...e.agentCapabilityTokens?.[s.id]?{CRAIG_AGENT_CAPABILITY:e.agentCapabilityTokens[s.id]}:{}}:{}}:{};return r?.type==="project"?{cwd:i,command:o,env:{...a,GIT_CEILING_DIRECTORIES:Mv(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function Mv(e,t){let n=(e??"").split(fd.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(fd.delimiter):[...n,t].join(fd.delimiter)}function jv(e){return e.command.length>0?e.command:["codex"]}function Yh(e,t){let n=e.ptyTabs.find(r=>r.kind===t);if(!n)throw new Error(`Task ${e.id} is missing its ${t} PTY tab.`);return n.id}function cn(e){return{columns:Math.max(20,e.width-Z.leftWidth-Z.rightWidth-Z.dividerWidth-Io*2),rows:Math.max(5,e.height-Z.topRailHeight-5)}}function zh(e){return e.length===1||at(e)||e==="BACKSPACE"||e==="TAB"}function dn(e){return typeof e=="string"&&new RegExp(`:(?:agent|${J.join("|")})(?:-\\d+)?$`).test(e)}function Jh(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 md(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function Xh(e){let t=new RegExp("\x1B\\[<(\\d+);\\d+;\\d+[mM]").exec(e);if(!t?.[1])return 0;let n=Number.parseInt(t[1],10);return n===64?-3:n===65?3:0}function Es(e){return Zh.includes(e)?"SHIFT_ENTER":null}function hd(e){return Zh.some(t=>t.startsWith(e))}function Qh(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var Zh=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function eg(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
255
+ `);return o.length>jI?Pe(t,"Diff is above the 500 KB inline preview limit.","too_large",t,o.length):o.includes("\0")?Pe(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(`
256
+ `):["No diff for this file."],byteLength:o.length}}function wg(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 cn(e,t){return e&&t.includes(e)?e:t[0]??null}function VI(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function kg(e){return[...new Set(e.split(`
257
+ `).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function KI(e,t){let n=Xc.resolve(e,t),r=Xc.resolve(e);if(n!==r&&!n.startsWith(`${r}${Xc.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function GI(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function Pe(e,t,n,r=null,s=null){return{path:r,status:n,title:e,lines:[t],byteLength:s}}var HI=["tasks","center","inspector","actions"],Tg=["agent","terminal"],bg=[],K="inspection",BB=[...Tg,...bg],Zc=["commit","push","refresh-checks","close-task"],Rg=["refresh-checks","close-task"],Sg=["task","checks","pr","setup-run","actions","next-action"],ed=["files","review"];function Pg(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=ZI(e?.openInspectionKind)??n,s=k.runners.getEnabled(t);return{inputMode:tv(e?.inputMode),focusedRegion:XI(e?.focusedRegion),selectedRepoId:xt(e?.selectedRepoId),selectedWorkspaceId:xt(e?.selectedWorkspaceId),selectedTaskId:xt(e?.selectedTaskId),selectedPtyTabId:xt(e?.selectedPtyTabId),selectedLeftItemId:av(xt(e?.selectedTaskId)),activeTab:n?K:xt(e?.activeTab)??"agent",preferredPtyTabKind:ev(e?.preferredPtyTabKind),inspectorSection:Ss(e?.inspectorSection,Sg,"task"),inspectionMode:QI(e?.inspectionMode,n==="diff"?"review":"files"),openInspectionKind:r,selectedFileTreePath:xt(e?.selectedFileTreePath),selectedFilePath:xt(e?.selectedFilePath),selectedDiffPath:xt(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:Ss(e?.selectedActionId,Zc,"commit"),selectedProjectTargetId:null,selectedRunner:nv(e?.selectedRunner,s,k.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:YI(),centerZoomed:!1}}function YI(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function Ig(e,t){return{...e??qs(),selectedRepoId:t.selectedRepoId,selectedWorkspaceId:t.selectedWorkspaceId,selectedTaskId:t.selectedTaskId,selectedPtyTabId:t.selectedPtyTabId,inputMode:t.inputMode,focusedRegion:t.focusedRegion,activeTab:t.activeTab,preferredPtyTabKind:t.preferredPtyTabKind,inspectorSection:t.inspectorSection,inspectionMode:t.inspectionMode,openInspectionKind:t.openInspectionKind,selectedFileTreePath:t.selectedFileTreePath,selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath,collapsedFileTreePaths:t.collapsedFileTreePaths,selectedActionId:t.selectedActionId,selectedRunner:t.selectedRunner}}function Is(e,t,n={}){let r=ov(e,t),s=nd(r),i=(s?.kind==="workspace"?t.workspaces?.find(u=>u.id===s.id)??null:null)??(s?.kind==="task"?t.workspaces?.find(u=>u.id===t.tasks.find(d=>d.id===s.id)?.workspaceId)??null:null)??t.workspaces?.find(u=>u.id===e.selectedWorkspaceId)??t.workspaces?.[0]??null,a=((s?.kind==="repo"?t.repos.find(u=>u.id===s.id)??null:s?.kind==="task"?t.repos.find(u=>u.id===t.tasks.find(d=>d.id===s.id)?.repoId)??null:null)??(i?.kind==="project"?t.repos.find(u=>u.id===e.selectedRepoId&&i.discoveredRepoIds?.includes(u.id))??null:null)??(i?.kind!=="project"?t.repos.find(u=>u.id===i?.primaryRepoId)??null:null)??t.repos.find(u=>u.id===e.selectedRepoId)??t.repos[0]??null)?.id??null,l=i?t.tasks.filter(u=>u.workspaceId===i.id):a?t.tasks.filter(u=>u.repoId===a):[],c=(s?.kind==="task"?l.find(u=>u.id===s.id)??null:null)??l.find(u=>u.id===e.selectedTaskId)??l[0]??null;return{...e,inputMode:n.resetInputMode?"control":e.inputMode,selectedLeftItemId:r,selectedWorkspaceId:i?.id??null,selectedRepoId:a,selectedTaskId:c?.id??null,...rv(c,e.activeTab,e.selectedPtyTabId),selectedFilePath:JI(e,t,c?.id??null),...sv(e,t,c?.id??null),selectedDiffPath:zI(e,t,c?.id??null),inspectorSection:Ss(e.inspectorSection,Sg,"task")}}function _t(e,t){return{...e,terminal:t}}function vg(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function Cg(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function at(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
258
+ `}function Ag(e){return e.length===1&&e>=" "&&e!=="\x7F"}function td(e){return Og(e)||Sr(e)!==null}function Eg(e){return bg.includes(e)}function Og(e){return Tg.includes(e)}function $g(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[K]:[]]}function zI(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function JI(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function Ss(e,t,n){return t.includes(e??"")?e:n}function XI(e){return e==="tabs"?"center":Ss(e,HI,"tasks")}function QI(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":Ss(e,ed,t)}function ZI(e){return e==="file"||e==="diff"?e:null}function ev(e){return e==="terminal"?"terminal":"agent"}function tv(e){return e==="terminal"?"terminal":"control"}function nv(e,t=[...J],n="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:n}function wo(e,t=J){let n=t.length>0?t:J,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function Sr(e){let t=J.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function rv(e,t,n){if(!e)return{activeTab:t===K?t:"agent",selectedPtyTabId:null};let r=e.ptyTabs.find(a=>a.id===n)??null,s=e.selectedPtyTabId?e.ptyTabs.find(a=>a.id===e.selectedPtyTabId)??null:null,i=e.ptyTabs.find(a=>a.id===t)??null;if(i)return{activeTab:i.id,selectedPtyTabId:i.id};if(Og(t)){let l=e.ptyTabs.find(c=>c.kind===t)??null??s??r??e.ptyTabs[0]??null;return{activeTab:l?.id??K,selectedPtyTabId:l?.id??null}}if(t===K)return{activeTab:K,selectedPtyTabId:r?.id??s?.id??e.ptyTabs[0]?.id??null};let o=s??r??e.ptyTabs[0]??null;return{activeTab:o?.id??K,selectedPtyTabId:o?.id??null}}function sv(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?iv(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function iv(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 ov(e,t){let n=Ln(t);return e.selectedLeftItemId&&n.includes(e.selectedLeftItemId)?e.selectedLeftItemId:e.selectedWorkspaceId&&n.includes(`workspace:${e.selectedWorkspaceId}`)?`workspace:${e.selectedWorkspaceId}`:e.selectedTaskId&&n.includes(`task:${e.selectedTaskId}`)?`task:${e.selectedTaskId}`:e.selectedRepoId&&n.includes(`repo:${e.selectedRepoId}`)?`repo:${e.selectedRepoId}`:n[0]??null}function Ln(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of Ps(e.tasks.filter(s=>s.workspaceId===n.id)))t.push(`task:${r.id}`);n.kind==="project"&&t.push(`new-task-workspace:${n.id}`),n.kind==="repo"&&t.push(`new-task:${n.primaryRepoId}`)}else for(let n of e.repos){t.push(`repo:${n.id}`);for(let{task:r}of Ps(e.tasks.filter(s=>s.repoId===n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function Ps(e){let t=new Set(e.map(i=>i.id)),n=new Set,r=[],s=new Map;for(let i of e){if(i.rootTaskId===i.id||!t.has(i.rootTaskId))continue;let o=s.get(i.rootTaskId)??[];o.push(i),s.set(i.rootTaskId,o)}for(let i of e)if(!(i.rootTaskId!==i.id&&t.has(i.rootTaskId))){r.push({task:i,visualDepth:0}),n.add(i.id);for(let a of s.get(i.id)??[])n.has(a.id)||(r.push({task:a,visualDepth:1}),n.add(a.id))}for(let i of e)n.has(i.id)||r.push({task:i,visualDepth:0});return r}function nd(e){return e?e.startsWith("workspace:")?{kind:"workspace",id:e.slice(10)}:e.startsWith("repo:")?{kind:"repo",id:e.slice(5)}:e.startsWith("task:")?{kind:"task",id:e.slice(5)}:null:null}function xt(e){return typeof e=="string"?e:null}function av(e){return e?`task:${e}`:null}function vs(e){return typeof e=="string"&&e.startsWith("task:")}function ko(e){return typeof e=="string"&&e.startsWith("new-task:")}function To(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function Dg(e){return typeof e=="string"&&e.startsWith("workspace:")}function rd(e){return ko(e)?e.slice(9):null}function sd(e){return To(e)?e.slice(19):null}async function Pr(e,t,n){let r=ve(e),[s,i]=await Promise.all([ke.repos.listRegisteredRepos(r),ke.listWorkspaces(r,{archived:!1})]),o=await R.listTasks(r),a={},l=await k.load(r),c=0;if(k.previews.isEnabled(l,"agentOrchestration")){let m=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(T=>T.kind==="agent").map(async T=>({agentTab:T,environment:await Xe(r,y,void 0,T.id)}))));for(let{agentTab:y,environment:T}of m)T.CRAIG_AGENT_CAPABILITY&&(a[y.id]=T.CRAIG_AGENT_CAPABILITY);o=await R.listTasks(r);let[g,f]=await Promise.all([cf(r),fi(r)]);c=g.length+f.filter(y=>y.state==="waiting_for_review").length}let u=id(o.tasks,t),d=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},p=u?await ug(u,d):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 id(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function Ng(e,t){return Is(e,t)}import gd from"node:path";import eV from"picocolors";var lv=[" \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 od(){return[...lv]}var bo={width:120,height:36},Z={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function Me(e,t){return{width:Math.max(e??bo.width,bo.width),height:Math.max(t??bo.height,bo.height)}}var cv=["Start","Options","Exit"],dv=["Resume","Options","Exit"],So=2,Po=2,Io=2,uv=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),pv=new RegExp("\x1B\\[(?:0)?m","g"),fv=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),mv=/https?:\/\/[^\s<>"']+/g,ld="\x1B[0m",cd="\x1B]8;;\x1B\\",N={panelBg:{bg:"0a0a0a",fg:"c0caf5"},panelMuted:{bg:"0a0a0a",fg:"565f89"},panelSelected:{bg:"1a1b26",fg:"c0caf5"},panelFocused:{bg:"1a1b26",fg:"7aa2f7"},divider:{bg:"0a0a0a",fg:"292e42"},rail:{bg:"0a0a0a",fg:"c0caf5"},overlay:{bg:"06060f",fg:"565f89"},overlayTitle:{bg:"06060f",fg:"565f89"},overlayLogo:{bg:"06060f",fg:"9ece6a"},overlaySubtitle:{bg:"06060f",fg:"41a6b5"},overlayMenuSelected:{bg:"06060f",fg:"7aa2f7"},accent:{fg:"7aa2f7"},success:{fg:"9ece6a"},pending:{fg:"e0af68"},error:{fg:"f7768e"},mutedfg:{fg:"565f89"},disabled:{fg:"3b4261"}},ad=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function Fg(e,t={}){return ud(e,{subtitle:"crAIg is that you?",menuItems:cv,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function Lg(e,t={}){return ud(e,{subtitle:"Control mode is paused.",menuItems:dv,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}var Ro=[" GLOBAL CENTER PANEL INSPECTOR"," ? help \u2190\u2192 / hl switch tab \u2191\u2193 / jk navigate"," Esc pause / back + new tab \u2190\u2192 / hl switch mode"," Tab cycle panels a codex tab R sync PR"," q quit t terminal tab R sync PR"," x close tab X close task"," TASKS Enter attach PTY X close task"," \u2191\u2193 / jk navigate"," n new task TERMINAL MODE"," Enter attach Ctrl+] return to control mode"," Wheel / PgUp / PgDn scroll",""," Press Esc to return."],gv=["Help"],hv=5;function Ao(e,t={}){return ud(e,{subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??gv,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function Mg(e,t={}){let n=t.color??!0,r=N.overlay,s=new Array(e.height).fill(re(" ".repeat(e.width),n,r)),i=od(),o=Math.max(1,Math.floor((e.height-i.length-2-Ro.length)/2));for(let u=0;u<i.length&&!(o+u>=e.height);u+=1)s[o+u]=re(Hg(i[u]??"",e.width),n,N.overlayLogo);let a=Math.max(...Ro.map(u=>u.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let u=0;u<Ro.length;u+=1){let d=c+u;if(d>=e.height)break;let p=Ro[u]??"";s[d]=re(Tt(" ".repeat(l)+p,e.width),n,r)}return s.join(`
259
+ `)}function jg(e,t={}){let n=t.color??!0,r=N.overlay,s=new Array(e.height).fill(re(" ".repeat(e.width),n,r)),i="Logs",o=t.logPath??"",a=t.logLines??[],l=Math.max(20,e.width-8),c=Math.max(0,Math.floor((e.width-l)/2)),u=[{text:i,tone:"selected"},{text:o,tone:"muted"},lt(),...a.length>0?a.map(m=>({text:m,tone:yv(m)})):[{text:"No Craig activity has been logged.",tone:"muted"}],lt(),{text:"Esc returns to Options.",tone:"muted"}],d=Cs(u,e.height-2),p=Math.max(1,Math.floor((e.height-d.length)/2));for(let m=0;m<d.length;m+=1){let g=p+m;if(g>=e.height)break;let f=d[m]??lt(),y=`${" ".repeat(c)}${Eo(f.text,l)}`,T=f.tone==="selected"?N.overlayMenuSelected:f.tone==="info"?{...N.overlay,fg:N.accent.fg}:f.tone==="warning"?{...N.overlay,fg:N.pending.fg}:f.tone==="error"?{...N.overlay,fg:N.error.fg}:f.tone==="muted"?N.overlay:N.panelBg;s[g]=re(Tt(y,e.width),n,T)}return s.join(`
260
+ `)}function yv(e){return e.includes(" ERROR ")?"error":e.includes(" WARN ")?"warning":e.includes(" INFO ")?"info":"muted"}function qg(e,t,n={}){let r=n.color??!0,s=Z.leftWidth,i=Z.rightWidth,o=n.centerOnly??!1,a=e.height-Z.topRailHeight-1,l=n.focusFlashActive??!1,c={bg:N.divider.bg,fg:"9ece6a"},u=l&&(t.focusedRegion==="tasks"||t.focusedRegion==="center")?c:N.divider,d=l&&(t.focusedRegion==="center"||t.focusedRegion==="inspector")?c:N.divider,p=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,m=re(Tt(p,e.width),r,N.rail),g=kv(t,s-So-Po,a,r),f=dd(e,t,{color:r,centerOnly:o}),y=Rv(t,i,a,r),T=t.inputMode==="terminal",S=[],v=[];for(let ye=0;ye<a;ye+=1)if(!o){let Y=vo(g[ye]??lt(),s,r,"left"),mn=re("\u2502",r,u),_s=re("\u2502",r,d),Fs=vo(y[ye]??lt(),i,r,"right");S.push(`${Y}${mn}`),v.push(`${_s}${Fs}`)}let b=T||t.modalInput?N.panelBg:N.panelMuted,$=wv(t.footerText,t.footerToast,e.width,r,b),D={row:1,column:1,width:e.width,rows:[m]},_=o?null:{row:Z.topRailHeight+1,column:1,width:s+Z.dividerWidth,rows:S},C=o?null:{row:Z.topRailHeight+1,column:f.column+f.width,width:Z.dividerWidth+i,rows:v},w={row:e.height,column:1,width:e.width,rows:[$]},he=o?f.rows:f.rows.map((ye,Y)=>`${S[Y]??""}${ye}${v[Y]??""}`);return{frame:[m,...he,$].join(`
261
+ `),center:f,regions:{rail:D,left:_,center:f,right:C,footer:w}}}function dd(e,t,n={}){let r=n.color??!0,s=Wg(e,n.centerOnly??!1),i=Tv(t,s.width,s.rowCount,r);return{row:s.row,column:s.column,width:s.width,rows:i.map(o=>vo(o,s.width,r,"center"))}}function Ug(e,t,n,r={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!td(s)||t.centerHeader.tabLabel==="BROWSER"||t.terminal.error||t.terminal.rows.length===0||n.some(c=>c<0||c>=t.terminal.rows.length))return null;let i=r.color??!0,o=Wg(e,r.centerOnly??!1),a=Bg(t,o.width,i).length,l=[...new Set(n)].map(c=>({terminalIndex:c,index:a+c})).filter(({index:c})=>c<o.rowCount).map(({terminalIndex:c,index:u})=>({index:u,row:vo(Vg(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function Wg(e,t){return{row:Z.topRailHeight+1,column:t?1:Z.leftWidth+Z.dividerWidth+1,width:t?e.width:e.width-Z.leftWidth-Z.rightWidth-Z.dividerWidth*2,rowCount:e.height-Z.topRailHeight-1}}function wv(e,t,n,r,s){let i=` ${e}`;if(!t)return re(Tt(i,n),r,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=Oe(o),l=Oe(i),c=Math.max(1,n-l-a-2),u=l+c+a+2>n?Eo(i,Math.max(0,n-a-3)):i,d=Math.max(1,n-Oe(u)-a-2),p=t.tone==="error"?Uv(o,r,s):Ir(o,r,s),m=`${u}${" ".repeat(d)}${p} `;return re(Tt(m,n),r,s)}function ud(e,t){let n=new Array(e.height).fill(re(" ".repeat(e.width),t.color,N.overlay)),r=od(),s=t.menuItems.map((c,u)=>`${u===t.menuIndex?">":" "} ${c}`),i=t.optionsMessage?["",t.optionsMessage]:[],o=[...s,...i];for(;o.length<hv;)o.push("");let a=[...r,"",t.subtitle,"",...o],l=Math.max(1,Math.floor((e.height-a.length)/2));for(let c=0;c<a.length;c+=1){let u=Hg(a[c]??"",e.width);if(c<r.length){n[l+c]=re(u,t.color,N.overlayLogo);continue}if(c===r.length+1){n[l+c]=re(u,t.color,N.overlaySubtitle);continue}let d=c-(r.length+3),m=d>=0&&d<t.menuItems.length&&d===t.menuIndex?N.overlayMenuSelected:N.overlay;n[l+c]=re(u,t.color,m)}if(t.versionText){let c=t.updateText?" (update available)":"",u=`${t.versionText}${c} `,d=" ".repeat(Math.max(0,e.width-Oe(u)));n[e.height-1]=re(`${d}${md(u,t.color,N.overlay)}`,t.color,N.overlay)}return n.join(`
262
+ `)}function kv(e,t,n,r){let s=Iv(e.runners),i=1,o=e.leftTree.map(l=>Pv(l,t,r));return[...Cs(o,n-i),s]}function Tv(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!td(s)?e.centerTranscript.map(o=>({...o})):bv(e);return Cs([...Bg(e,t,r),...i],n)}function Bg(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:Mv(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?Ir(a,n,N.panelBg):Co(a,n,N.panelMuted)}`,c=[`${Co(e.centerHeader.tabLabel,n,N.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),u=vv(e.tabs,n,e.focusedRegion==="center"),d=" engaged ",p=d.length+2,m=e.inputMode==="terminal"?Ir(`${d}\u25CF `,n,N.panelBg):"",g=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Oe(u)-p)):"";return[{text:e.inputMode==="terminal"?`${u}${g}${m}`:u},{text:l,tone:"muted"},{text:c},lt()]}function bv(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},lt(),{text:e.terminal.error},lt(),{text:"Fix the native dependency setup, then re-enter terminal mode."}];let t=e.tabs.find(r=>r.active)?.id??"",n=t==="agent"||/:agent(?:-\d+)?$/.test(t)?"agent":"terminal";return e.terminal.rows.length===0?[{text:`Press Enter on the ${n.toUpperCase()} tab to attach a PTY.`}]:e.terminal.rows.map(Vg)}function Vg(e){return{text:fd(e.segments),segments:e.segments,fullBleed:!0}}function Rv(e,t,n,r){let s=e.rightInspection?Sv(e.actionMessage?[...e.rightInspection.rows.slice(0,2),{id:"action-message",text:e.actionMessage},{id:"action-message-spacer",text:""},...e.rightInspection.rows.slice(2)]:e.rightInspection.rows,n):Cs([{text:"CONTEXT"},lt(),...e.rightContext.map(i=>Cv(i,r)),...e.actionMessage?[lt(),{text:e.actionMessage}]:[]],n);return Cs(s,n)}function Sv(e,t){let n=e.slice(0,2),r=e.slice(2),s=Math.max(0,t-n.length),i=r.findIndex(a=>a.focused||a.selected),o=i===-1?0:qv(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>xg(a)),...r.slice(o,o+s).map(a=>xg(a))]}function xg(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 Pv(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${Ir("\u25CF",n,e.selected?N.panelSelected:N.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((g,f)=>g+Oe(f.text),0):0,l=t-Oe(i)-Oe(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",u=e.selected?e.text:e.focused?Ir(e.text,n,N.panelBg):e.panelHeader?Co(e.text,n,N.panelMuted):e.text,d=Tt(`${r}${c}${u}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let g=`${r}${e.selected?"\u25B8":" "} `,f=d.slice(g.length+2),y=[{text:g},Kg(e.activity,e.activityAnimationFrame??0),{text:` ${f}${i}${o}`},...e.prBadge??[]];return{text:fd(y),segments:y,tone:p}}if(e.prBadge){let g=[{text:`${d}${i}${o}`},...e.prBadge];return{text:`${d}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:g,tone:p}}return{text:`${d}${i}${o}`,tone:p}}function Iv(e){let t=e.map(r=>{let s=r.health>=1,i=parseInt(r.count,10),o=i>1?` (${i})`:"";return{text:`${s?"\u25CF":"\u25CB"} ${r.name}${o}`,active:s}}),n=[];for(let r=0;r<t.length;r++){let s=t[r];r>0&&n.push({text:" "}),s.active?n.push({text:s.text,style:{fg:N.success.fg}}):n.push({text:s.text,style:{fg:N.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function vv(e,t,n){return e.map(r=>{let s=r.active?n?Ir(r.label,t,N.panelBg):Co(r.label,t,N.panelBg):md(r.label,t,N.panelBg),i=r.activity?pd(Kg(r.activity,r.activityAnimationFrame??0),t,N.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function Kg(e,t){return{text:"\u25CF",style:{fg:e==="working"?ad[t%ad.length]??ad[0]:e==="ready"?N.success.fg:e==="error"?N.error.fg:N.panelMuted.fg}}}function Cv(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?md(e.value,t,N.panelBg):e.value}`}}function vo(e,t,n,r){let s=Av(r,e.tone??"default"),i=Ev(e,n,s);if(r==="left"){if(e.fullBleed)return re(Tt(i,t),n,s);let a=t-So-Po;if(e.rightAlign){let c=Oe(i),u=Math.max(0,a-c),d=`${" ".repeat(So)}${" ".repeat(u)}${i}${" ".repeat(Po)}`;return re(d,n,s)}let l=`${" ".repeat(So)}${Tt(i,a)}${" ".repeat(Po)}`;return re(l,n,s)}return r==="center"&&e.fullBleed?Ov(e,t,n,s):re(Tt(` ${i}`,t),n,s)}function Av(e,t){return t==="selected"||t==="focused"?N.panelSelected:t==="muted"?N.panelMuted:N.panelBg}function Cs(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(lt());return n}function lt(){return{text:""}}function Ev(e,t,n){return e.segments?e.segments.map(r=>pd(r,t,n)).join(""):e.text}function Ov(e,t,n,r){let s=" ".repeat(Io),i=Math.max(0,t-Io*2);if(!e.segments)return re(`${s}${Tt(e.text,i)}${s}`,n,r);let o=Nv(e.segments,i),a=`${s}${o.map(l=>pd(l,n,r)).join("")}${s}${n?cd:""}`;return re(a,n,r)}function pd(e,t,n){let r=e.href?`${Gg(e.href)}${e.text}${cd}`:$v(e.text);return!t||!e.style?r:`${As(Fv(e.style,n))}${Lv(e.style)}${r}${ld}${As(n)}`}function $v(e){return e.replace(mv,t=>{let[n,r]=Dv(t);return`${Gg(n)}${n}${cd}${r}`})}function Dv(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function Gg(e){return`\x1B]8;;${e}\x1B\\`}function Nv(e,t){let n=xv(e,t);return _v(n,t)}function xv(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=Oe(s.text);if(i<=r){n.push(s),r-=i;continue}let o=Eo(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function _v(e,t){let n=Oe(fd(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 Fv(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 Lv(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 Mv(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 Hg(e,t){let n=Math.max(0,t-Oe(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function Tt(e,t){let n=Oe(e);return n>=t?jv(e,t):e+" ".repeat(t-n)}function jv(e,t){if(t<=0)return"";if(Oe(e)<=t)return e;let n=zg(e);return Eo(n,Math.max(0,t-1))+"\u2026"}function Oe(e){let t=0;for(let n of Array.from(zg(e)))t+=Yg(n);return t}function Eo(e,t){let n="",r=0;for(let s of Array.from(e)){let i=Yg(s);if(r+i>t)break;n+=s,r+=i}return n}function Yg(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 qv(e,t,n){return Math.min(Math.max(e,t),n)}function zg(e){return e.replace(fv,"").replace(uv,"")}function fd(e){return e.map(t=>t.text).join("")}function re(e,t,n){if(!t)return e;let r=As(n),s=e.replace(pv,`${ld}${r}`);return`${r}${s}${ld}`}function As(e){let t=[];return e.fg&&t.push(`38;2;${_g(e.fg).join(";")}`),e.bg&&t.push(`48;2;${_g(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function _g(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function Ir(e,t,n){return Oo(e,t,N.success.fg,n)}function Uv(e,t,n){return Oo(e,t,N.error.fg,n)}function Co(e,t,n){return Oo(e,t,N.accent.fg,n)}function md(e,t,n){return Oo(e,t,N.mutedfg.fg,n)}function Oo(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${As(s)}${e}${As(r)}`}function Jg(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"?Bv(s):[],a=r?{CRAIG_WORKSPACE_ROOT:n,CRAIG_TASK_ID:r.id,...s?.kind==="agent"?{CRAIG_AGENT_TAB_ID:s.id,...e.agentCapabilityTokens?.[s.id]?{CRAIG_AGENT_CAPABILITY:e.agentCapabilityTokens[s.id]}:{}}:{}}:{};return r?.type==="project"?{cwd:i,command:o,env:{...a,GIT_CEILING_DIRECTORIES:Wv(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function Wv(e,t){let n=(e??"").split(gd.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(gd.delimiter):[...n,t].join(gd.delimiter)}function Bv(e){return e.command.length>0?e.command:["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 dn(e){return{columns:Math.max(20,e.width-Z.leftWidth-Z.rightWidth-Z.dividerWidth-Io*2),rows:Math.max(5,e.height-Z.topRailHeight-5)}}function Qg(e){return e.length===1||at(e)||e==="BACKSPACE"||e==="TAB"}function un(e){return typeof e=="string"&&new RegExp(`:(?:agent|${J.join("|")})(?:-\\d+)?$`).test(e)}function Zg(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 hd(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function eh(e){let t=new RegExp("\x1B\\[<(\\d+);\\d+;\\d+[mM]").exec(e);if(!t?.[1])return 0;let n=Number.parseInt(t[1],10);return n===64?-3:n===65?3:0}function Es(e){return nh.includes(e)?"SHIFT_ENTER":null}function yd(e){return nh.some(t=>t.startsWith(e))}function th(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var nh=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function rh(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
263
263
  `||n===`\r
264
- `)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function tg(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function ng(e,t=null){let n=t?.split(`
264
+ `)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function sh(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function ih(e,t=null){let n=t?.split(`
265
265
  `)??[];return e.split(`
266
- `).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function $o(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{spawn as CC}from"node:child_process";import{createServer as AC,createConnection as mg}from"node:net";import{openSync as EC}from"node:fs";import{mkdir as OC,readFile as hg,rm as $s,writeFile as $C}from"node:fs/promises";import Fo from"node:path";var un=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=gd(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:gd(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=gd(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 gd(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as rg,readFile as qv,rm as yd,stat as Uv,writeFile as Wv}from"node:fs/promises";import wd from"node:path";async function kd(e){let t=wd.join(e.runtimeDir,"orchestration-supervisor.lock");await rg(e.runtimeDir,{recursive:!0});try{await rg(t)}catch(r){if(!Vv(r))throw r;let s=await qv(wd.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await Uv(t).catch(()=>null);if(typeof s?.pid=="number"&&!Bv(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await yd(t,{recursive:!0,force:!0}),kd(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await Wv(wd.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await yd(t,{recursive:!0,force:!0}),r}let n=!1;return{async release(){n||(n=!0,await yd(t,{recursive:!0,force:!0}))}}}function Bv(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 Vv=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";function sg(e,t){switch(e){case"codex":case"cursor":case"claude":return`\x1B[200~${t}\x1B[201~\r`;default:return Kv(e)}}function Kv(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import Gv from"node:path";var Hv={type:"system",component:"orchestration-supervisor"};async function ig(e){let t=Gv.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Ms(t)??{version:1,commands:{}},r=await Ge(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of Yv(i))o.has(a)||(await vn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:Hv),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await M(t,n)}function Yv(e){let t=["command.queued"];return e.attempts>0&&t.push("command.delivering"),e.state==="delivered"?t.push("command.delivered"):e.state==="failed"?t.push("command.failed"):e.state==="cancelled"&&t.push("command.cancelled"),t}var No=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new un({resolutionMs:s,onError:(i,o)=>r.onError?.(o)}),this.heartbeat.register({id:"orchestration.commands",intervalMs:s,run:()=>this.reconcile()})}paths;runtime;heartbeat;lease=null;reconciliation=null;async start(){if(!this.lease){this.lease=await kd(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 fo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await ig(this.paths);let t=await Ge(this.paths);for(let n of t){if(n.state==="delivering"){await ue.fail(this.paths,n.id,Os("PROMPT_DELIVERY_UNCERTAIN","Craig resumed after prompt delivery began; the prompt was not replayed.",!1,!0));continue}n.state==="queued"&&await this.reconcileCommand(n)}await fo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await ue.fail(this.paths,t.id,Os("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let n=await S.getTask(this.paths,t.taskId).catch(i=>{if(i instanceof g&&i.code==="TASK_NOT_FOUND")return null;throw i}),r=n?.ptyTabs.find(i=>i.id===t.agentTabId);if(!n||!r||r.kind!=="agent"||n.status==="closed"){await ue.fail(this.paths,t.id,Os("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer available in task ${t.taskId}.`,!1,!1));return}let s=this.runtime.getActivitySnapshots().find(i=>i.tabId===t.agentTabId);if(s&&s.sessionState!=="running"){await ue.fail(this.paths,t.id,Os("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(this.runtime.hasRunningSession(t.agentTabId)&&!(t.delivery==="when-ready"&&Gt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")){await ue.beginDelivery(this.paths,t.id);try{this.runtime.writeToSession(t.agentTabId,sg(r.runner??n.runner,t.prompt.text))}catch(i){await ue.fail(this.paths,t.id,Os("PROMPT_DELIVERY_UNCERTAIN",i instanceof Error?i.message:"Prompt delivery failed after it began.",!1,!0));return}await ue.completeDelivery(this.paths,t.id)}}},Os=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var zv={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},Ir=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...zv,...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=Jv(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(Xv);return this.withMinimum(i?s?this.intervals.pendingForegroundMs:this.intervals.pendingBackgroundMs:s?this.intervals.stableForegroundMs:this.intervals.stableBackgroundMs)}return t.status!=="closed"?this.withMinimum(s?this.intervals.discoveryForegroundMs:this.intervals.discoveryBackgroundMs):null}withMinimum(t){return Math.max(t,this.minimumIntervalMs)}};function Jv(e){return e.type==="project"&&e.repoTargets?.length?e.repoTargets.map(t=>t.pullRequest).filter(t=>t.status==="open"):e.prs.filter(t=>t.status==="open")}function Xv(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as Qv}from"node:fs";var Do=class{constructor(t,n){this.paths=t;this.options=n;this.now=n.now??Date.now,this.taskDebounceMs=n.taskDebounceMs??50,this.readyAfterMs=n.readyAfterMs??5e3}paths;options;now;taskDebounceMs;readyAfterMs;agentStates=new Map;readinessTimers=new Map;watcher=null;debounceTimer=null;reconciliation=null;dirty=!1;running=!1;baselineComplete=!1;start(){if(!this.running){this.running=!0,this.baselineComplete=!1;try{this.watcher=Qv(this.paths.tasksDir,{persistent:!1},()=>{this.schedule(this.taskDebounceMs)}),this.watcher.on("error",t=>{this.reportError(t)})}catch(t){this.reportError(t)}this.schedule(0)}}notifyActivity(t){if(!this.running)return;let n=vt(t.tabId,[t],this.now());this.agentStates.get(t.tabId)!==n&&(this.agentStates.set(t.tabId,n),this.schedule(0)),this.scheduleReadiness(t)}notifyActivityRemoved(t){this.running&&(this.clearReadinessTimer(t),this.agentStates.delete(t)&&this.schedule(0))}async stop(){if(this.running){this.running=!1,this.watcher?.close(),this.watcher=null,this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=null;for(let t of this.readinessTimers.values())clearTimeout(t);this.readinessTimers.clear(),await this.reconciliation?.catch(()=>{})}}scheduleReadiness(t){if(this.clearReadinessTimer(t.tabId),t.sessionState!=="running")return;let n=Math.max(0,t.lastActivityAt+this.readyAfterMs-this.now());this.readinessTimers.set(t.tabId,setTimeout(()=>{this.readinessTimers.delete(t.tabId),!(!this.running||this.agentStates.get(t.tabId)!=="working")&&(this.agentStates.set(t.tabId,"ready"),this.schedule(0))},n+1))}clearReadinessTimer(t){let n=this.readinessTimers.get(t);n&&clearTimeout(n),this.readinessTimers.delete(t)}schedule(t){if(this.running){if(this.reconciliation){this.dirty=!0;return}this.debounceTimer||(this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.requestReconciliation()},t))}}requestReconciliation(){if(!this.running||this.reconciliation){this.dirty=!0;return}this.reconciliation=this.drainReconciliations().catch(t=>this.reportError(t)).finally(()=>{this.reconciliation=null,this.running&&this.dirty&&this.requestReconciliation()})}async drainReconciliations(){do{this.dirty=!1;let t=await this.options.reconcileEvents();this.baselineComplete&&t.length>0&&await this.options.onEvents(t),this.baselineComplete=!0}while(this.running&&this.dirty)}async reportError(t){await this.options.onError(t)}};var Zv={selectedTaskId:null,reviewVisible:!1},eC={listTasks:async e=>(await S.listTasks(e)).tasks,syncTasks:async(e,t)=>(await S.prs.discoverOrRefreshMany(e,t),Promise.all(t.map(n=>S.getTask(e,n.id))))},xo=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??eC,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new Ir({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new Do(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=tC(s);i.length>0&&await this.wake(i)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new un({resolutionMs:r,...n.now?{now:n.now}:{},onError:(s,i)=>this.reportError(i)}),this.heartbeat.register({id:"github.pull-requests",intervalMs:r,run:()=>this.reconcile()})}paths;heartbeat;coordinator;dependencies;onTasksChanged;onError;eventMonitor;pendingWakeTaskIds=new Set;reconciliation=null;reconciliationVersion=0;view=Zv;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,og(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)!==og(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 tC(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=rC(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&nC.has(i))&&t.add(n.taskId);continue}n.type==="agent.state.changed"&&r?.previousState==="working"&&(r.state==="ready"||r.state==="idle"||r.state==="error")&&t.add(n.taskId)}return[...t]}var nC=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),rC=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function og(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as fC}from"node:module";import sC from"@xterm/headless";var iC=1e3,oC=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function lg(e){return new sC.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:iC,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}})}function cg(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function bd(e,t){return new Promise(n=>{e.write(t,n)})}function dg(e,t=0){let n=e.buffer.active,r=[],s=n.getNullCell(),i=n.baseY+n.cursorY,o=Math.max(0,n.baseY-t);for(let a=0;a<e.rows;a+=1){let l=n.getLine(o+a);if(!l){r.push({segments:[]});continue}let c=[];for(let u=0;u<e.cols;u+=1){let d=l.getCell(u,s);!d||d.getWidth()===0||c.push({text:d.getChars()||" ",style:cC(d,o+a===i&&u===n.cursorX)})}r.push({segments:aC(lC(c))})}return r}function aC(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&pC(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};ug(n.style)||(s.style=n.style),t.push(s)}return t}function lC(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||!ug(n.style))break;t-=1}return e.slice(0,t)}function cC(e,t){let n={},r=ag(e,"fg"),s=ag(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 ag(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"):oC[s]??dC(s)}function dC(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(uC).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 uC(e){return e===0?0:55+e*40}function pC(e,t){return Td(e)===Td(t)}function Td(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function ug(e){return Td(e)===""}var mC=fC(import.meta.url),hC=/^CTRL_([A-Z])$/,gC="\x1B[6n",yC="\x1B[c",wC="\x1B[?u",kC={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
267
- `,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:""},_o=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")Rd(i),this.sessions.delete(n);else return this.attachedTabId=n,i.scrollbackLines=0,pg(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(`
268
- `))&&this.touchActivity(n))}writeKey(t){let n=TC(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&&pg(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&&(Rd(n),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())Rd(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:bC(n),error:n.error,scrolledBack:n.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}createSession(t,n,r,s){let i=this.spawn??SC().spawn,o=lg(r),a=s??this.resolveSessionSpec(t,n),l=bn({...this.env,...a.env??{}}),{executable:c,args:u}=PC(this.shell,a.command,{cwd:a.cwd,env:l}),d=i(c,u,{name:"xterm-256color",cols:r.columns,rows:r.rows,cwd:a.cwd,env:IC(l)}),p={taskId:t,tabId:n,pty:d,terminal:o,status:"running",error:null,disposables:[],scrollbackLines:0,rows:[],renderedScrollbackLines:null,screenDirty:!0,lastActivityAt:Date.now(),exitCode:null};return p.disposables.push(d.onData(h=>{this.touchActivity(p),vC(d,h),bd(p.terminal,h).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p.disposables.push(d.onExit(h=>{p.status="exited",p.exitCode=h.exitCode,p.lastActivityAt=Date.now(),this.notifyActivity(p),bd(p.terminal,`\r
269
- [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 TC(e){if(e.length===1)return e;let t=kC[e];if(t!==void 0)return t;let n=hC.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function pg(e,t){RC(e.pty,t),cg(e.terminal,t),e.screenDirty=!0}function bC(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=dg(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function Rd(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function RC(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function SC(){return mC("node-pty")}function PC(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[Rn(t[0],n),...t.slice(1)].map(fg).join(" ")}; exec ${fg(e)} -l`;return{executable:e,args:["-lc",s]}}function fg(e){return`'${e.replaceAll("'","'\\''")}'`}function IC(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 vC(e,t){for(let n=0;n<Sd(t,gC);n+=1)e.write("\x1B[1;1R");for(let n=0;n<Sd(t,yC);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<Sd(t,wC);n+=1)e.write("\x1B[?0u")}function Sd(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 Ns=Pn,NC=new Set([6,7,8,Ns]),DC=16,xC=250;async function gg(e){let t=Ct(e.paths);await MC(t,e.paths,e.spawnDaemon);let n=await Pg(t.socketPath),r=new Pd(n,e);return await r.ready(),r}async function yg(e,t={}){let n=Ct(e);await OC(e.runtimeDir,{recursive:!0}),await $s(n.socketPath,{force:!0});let r=new Id(e,t),s=AC(i=>r.handleConnection(i));try{await r.start(),await BC(s,n.socketPath),await $C(n.pidPath,String(process.pid),"utf8"),await we.appendLogBestEffort(e,{level:"info",component:"daemon",event:"started",message:`PTY daemon started with protocol ${Ns}.`,details:{pid:process.pid,protocolVersion:Ns}}),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 we.appendLogBestEffort(e,{level:"error",component:"daemon",event:"failed",message:i instanceof Error?i.message:String(i),details:{pid:process.pid}}),i}finally{await we.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 $s(n.socketPath,{force:!0}),await $s(n.pidPath,{force:!0}),await r.stop(),r.disposeAll()}}async function wg(e){let t=Ct(e);return await bg(t.socketPath)?(await WC(t.socketPath),!0):!1}var Pd=class{constructor(t,n){this.socket=t;this.options=n,this.activityEnabled=n.activityEnabled??!1,this.tasksChangedHandler=n.onTasksChanged,t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>{this.closed||(this.closed=!0,this.rejectAll(new Error("Craig PTY daemon connection closed.")),this.failRunningActivities("Craig PTY daemon connection closed."))})}socket;managesPullRequestSync=!0;nextRequestId=1;pending=new Map;viewCache=new Map;activityCache=new Map;activityRevisionByTabId=new Map;activityRevision=0;attachedTabId=null;viewedTabId=null;subscribedTabId=null;activityEnabled;pullRequestPollView={selectedTaskId:null,reviewVisible:!1};tasksChangedHandler;buffer="";closed=!1;protocolVersion=Ns;options;async ready(){let t=await this.send({type:"ping"});if(!Tg(t.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch.");this.protocolVersion=t.protocolVersion,this.protocolVersion<=8&&await this.send({type:"setViewUpdateMode",mode:"incremental"}),await this.send({type:"setActivityEnabled",enabled:this.activityEnabled}),this.activityEnabled&&await this.refreshActivitySnapshots()}async ensureSession(t,n,r){let s=await this.send({type:"ensureSession",taskId:t,tabId:n,size:r,spec:this.options.resolveSessionSpec?.(t,n)??{cwd:this.options.workspaceRoot,command:[]}});this.attachedTabId=n,this.viewedTabId=n,this.subscribedTabId=n;let i=s.view??{status:"idle",rows:[],error:null};return this.viewCache.set(n,i),i}async hydrateSessions(t){for(let n of t)try{let r=await this.send({type:"hydrateSession",tabId:n});r.view&&(this.viewCache.set(n,r.view),r.view.status==="idle"&&we.appendLogBestEffort(this.options.paths,{level:"debug",component:"pty",event:"hydration.missing",message:"No live PTY session was found for the persisted tab.",tabId:n}))}catch(r){let s=r instanceof Error?r.message:String(r);this.viewCache.set(n,{status:"failed",rows:[],error:s})}this.activityEnabled&&await this.refreshActivitySnapshots()}async pruneStale(t){await this.send({type:"pruneStale",keepTabIds:t})}write(t){this.send({type:"write",input:t}).catch(()=>{})}writeKey(t){this.send({type:"writeKey",key:t}).catch(()=>{})}scrollViewport(t){let n=this.attachedTabId;this.send({type:"scrollViewport",lines:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}resize(t){let n=this.attachedTabId;this.send({type:"resize",size:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}detach(){this.attachedTabId=null,this.send({type:"detach"}).catch(()=>{})}setViewedTab(t){this.closed||(this.viewedTabId=t,this.subscribeToView(t))}setActivityEnabled(t){if(!(this.closed||this.activityEnabled===t)){if(this.activityEnabled=t,!t){for(let n of[...this.activityCache.keys()])this.removeCachedActivity(n);this.send({type:"setActivityEnabled",enabled:t}).catch(()=>{});return}this.send({type:"setActivityEnabled",enabled:t}).then(()=>this.refreshActivitySnapshots(!0)).catch(()=>{})}}setPullRequestPollView(t){this.closed||this.pullRequestPollView.selectedTaskId===t.selectedTaskId&&this.pullRequestPollView.reviewVisible===t.reviewVisible||(this.pullRequestPollView=t,this.send({type:"setPullRequestPollView",view:t}).catch(()=>{}))}setTasksChangedHandler(t){this.tasksChangedHandler=t}disposeSession(t){this.viewCache.delete(t),this.removeCachedActivity(t),this.attachedTabId===t&&(this.attachedTabId=null),this.send({type:"disposeSession",tabId:t}).catch(()=>{})}disposeAll(){this.attachedTabId=null,!this.closed&&(this.socket.end(),this.closed=!0)}getViewState(t){return t?this.viewCache.get(t)??{status:"idle",rows:[],error:null,scrolledBack:!1}:{status:"idle",rows:[],error:null,scrolledBack:!1}}getActivitySnapshots(){return[...this.activityCache.values()]}async requestShutdown(){await this.send({type:"shutdown"})}async send(t){if(this.closed)throw new Error("Craig PTY daemon connection is closed.");let n=this.nextRequestId;this.nextRequestId+=1;let r={...t,id:n},s=new Promise((o,a)=>{this.pending.set(n,{resolve:o,reject:a})});if(this.socket.destroyed)throw this.pending.delete(n),new Error("Craig PTY daemon connection is closed.");this.socket.write(`${JSON.stringify(r)}
266
+ `).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function $o(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{spawn as xC}from"node:child_process";import{createServer as _C,createConnection as yh}from"node:net";import{openSync as FC}from"node:fs";import{mkdir as LC,readFile as wh,rm as $s,writeFile as MC}from"node:fs/promises";import Fo from"node:path";import{setTimeout as tC}from"node:timers/promises";var pn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=wd(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:wd(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=wd(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 wd(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as oh,readFile as Vv,rm as kd,stat as Kv,writeFile as Gv}from"node:fs/promises";import Td from"node:path";async function bd(e){let t=Td.join(e.runtimeDir,"orchestration-supervisor.lock");await oh(e.runtimeDir,{recursive:!0});try{await oh(t)}catch(r){if(!Yv(r))throw r;let s=await Vv(Td.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await Kv(t).catch(()=>null);if(typeof s?.pid=="number"&&!Hv(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await kd(t,{recursive:!0,force:!0}),bd(e);throw new h("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await Gv(Td.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await kd(t,{recursive:!0,force:!0}),r}let n=!1;return{async release(){n||(n=!0,await kd(t,{recursive:!0,force:!0}))}}}function Hv(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 Yv=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var zv="\x1B[200~",Jv="\x1B[201~";function ah(e,t){switch(e){case"codex":return Rd(t,50);case"cursor":return Rd(t,50);case"claude":return Rd(t,50);default:return Xv(e)}}function Rd(e,t){return{paste:`${zv}${e}${Jv}`,submit:"\r",submitDelayMs:t}}function Xv(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import Qv from"node:path";var Zv={type:"system",component:"orchestration-supervisor"};async function lh(e){let t=Qv.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Ms(t)??{version:1,commands:{}},r=await Ge(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of eC(i))o.has(a)||(await vn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:Zv),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await M(t,n)}function eC(e){let t=["command.queued"];return e.attempts>0&&t.push("command.delivering"),e.state==="delivered"?t.push("command.delivered"):e.state==="failed"?t.push("command.failed"):e.state==="cancelled"&&t.push("command.cancelled"),t}var Do=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new pn({resolutionMs:s,onError:(i,o)=>r.onError?.(o)}),this.heartbeat.register({id:"orchestration.commands",intervalMs:s,run:()=>this.reconcile()})}paths;runtime;heartbeat;lease=null;reconciliation=null;async start(){if(!this.lease){this.lease=await bd(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 fo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await lh(this.paths);let t=await Ge(this.paths);for(let n of t){if(n.state==="delivering"){await ue.fail(this.paths,n.id,Os("PROMPT_DELIVERY_UNCERTAIN","Craig resumed after prompt delivery began; the prompt was not replayed.",!1,!0));continue}n.state==="queued"&&await this.reconcileCommand(n)}await fo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await ue.fail(this.paths,t.id,Os("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let n=await R.getTask(this.paths,t.taskId).catch(i=>{if(i instanceof h&&i.code==="TASK_NOT_FOUND")return null;throw i}),r=n?.ptyTabs.find(i=>i.id===t.agentTabId);if(!n||!r||r.kind!=="agent"||n.status==="closed"){await ue.fail(this.paths,t.id,Os("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer available in task ${t.taskId}.`,!1,!1));return}let s=this.runtime.getActivitySnapshots().find(i=>i.tabId===t.agentTabId);if(s&&s.sessionState!=="running"){await ue.fail(this.paths,t.id,Os("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(this.runtime.hasRunningSession(t.agentTabId)&&!(t.delivery==="when-ready"&&Gt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")){await ue.beginDelivery(this.paths,t.id);try{let i=ah(r.runner??n.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,i.paste),await tC(i.submitDelayMs),this.runtime.writeToSession(t.agentTabId,i.submit)}catch(i){await ue.fail(this.paths,t.id,Os("PROMPT_DELIVERY_UNCERTAIN",i instanceof Error?i.message:"Prompt delivery failed after it began.",!1,!0));return}await ue.completeDelivery(this.paths,t.id)}}},Os=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var nC={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},vr=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...nC,...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=rC(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(sC);return this.withMinimum(i?s?this.intervals.pendingForegroundMs:this.intervals.pendingBackgroundMs:s?this.intervals.stableForegroundMs:this.intervals.stableBackgroundMs)}return t.status!=="closed"?this.withMinimum(s?this.intervals.discoveryForegroundMs:this.intervals.discoveryBackgroundMs):null}withMinimum(t){return Math.max(t,this.minimumIntervalMs)}};function rC(e){return e.type==="project"&&e.repoTargets?.length?e.repoTargets.map(t=>t.pullRequest).filter(t=>t.status==="open"):e.prs.filter(t=>t.status==="open")}function sC(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as iC}from"node:fs";var No=class{constructor(t,n){this.paths=t;this.options=n;this.now=n.now??Date.now,this.taskDebounceMs=n.taskDebounceMs??50,this.readyAfterMs=n.readyAfterMs??5e3}paths;options;now;taskDebounceMs;readyAfterMs;agentStates=new Map;readinessTimers=new Map;watcher=null;debounceTimer=null;reconciliation=null;dirty=!1;running=!1;baselineComplete=!1;start(){if(!this.running){this.running=!0,this.baselineComplete=!1;try{this.watcher=iC(this.paths.tasksDir,{persistent:!1},()=>{this.schedule(this.taskDebounceMs)}),this.watcher.on("error",t=>{this.reportError(t)})}catch(t){this.reportError(t)}this.schedule(0)}}notifyActivity(t){if(!this.running)return;let n=Ct(t.tabId,[t],this.now());this.agentStates.get(t.tabId)!==n&&(this.agentStates.set(t.tabId,n),this.schedule(0)),this.scheduleReadiness(t)}notifyActivityRemoved(t){this.running&&(this.clearReadinessTimer(t),this.agentStates.delete(t)&&this.schedule(0))}async stop(){if(this.running){this.running=!1,this.watcher?.close(),this.watcher=null,this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=null;for(let t of this.readinessTimers.values())clearTimeout(t);this.readinessTimers.clear(),await this.reconciliation?.catch(()=>{})}}scheduleReadiness(t){if(this.clearReadinessTimer(t.tabId),t.sessionState!=="running")return;let n=Math.max(0,t.lastActivityAt+this.readyAfterMs-this.now());this.readinessTimers.set(t.tabId,setTimeout(()=>{this.readinessTimers.delete(t.tabId),!(!this.running||this.agentStates.get(t.tabId)!=="working")&&(this.agentStates.set(t.tabId,"ready"),this.schedule(0))},n+1))}clearReadinessTimer(t){let n=this.readinessTimers.get(t);n&&clearTimeout(n),this.readinessTimers.delete(t)}schedule(t){if(this.running){if(this.reconciliation){this.dirty=!0;return}this.debounceTimer||(this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.requestReconciliation()},t))}}requestReconciliation(){if(!this.running||this.reconciliation){this.dirty=!0;return}this.reconciliation=this.drainReconciliations().catch(t=>this.reportError(t)).finally(()=>{this.reconciliation=null,this.running&&this.dirty&&this.requestReconciliation()})}async drainReconciliations(){do{this.dirty=!1;let t=await this.options.reconcileEvents();this.baselineComplete&&t.length>0&&await this.options.onEvents(t),this.baselineComplete=!0}while(this.running&&this.dirty)}async reportError(t){await this.options.onError(t)}};var oC={selectedTaskId:null,reviewVisible:!1},aC={listTasks:async e=>(await R.listTasks(e)).tasks,syncTasks:async(e,t)=>(await R.prs.discoverOrRefreshMany(e,t),Promise.all(t.map(n=>R.getTask(e,n.id))))},xo=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??aC,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new vr({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new No(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=lC(s);i.length>0&&await this.wake(i)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new pn({resolutionMs:r,...n.now?{now:n.now}:{},onError:(s,i)=>this.reportError(i)}),this.heartbeat.register({id:"github.pull-requests",intervalMs:r,run:()=>this.reconcile()})}paths;heartbeat;coordinator;dependencies;onTasksChanged;onError;eventMonitor;pendingWakeTaskIds=new Set;reconciliation=null;reconciliationVersion=0;view=oC;running=!1;lastErrorMessage=null;start(){this.running||(this.running=!0,this.eventMonitor?.start(),this.heartbeat.start())}async stop(){this.running&&(this.running=!1,this.heartbeat.stop(),await this.eventMonitor?.stop(),await this.reconciliation?.catch(()=>{}))}setView(t){this.view=t}notifyActivity(t){this.eventMonitor?.notifyActivity(t)}notifyActivityRemoved(t){this.eventMonitor?.notifyActivityRemoved(t)}async wake(t){if(t?.length){for(let n of t)this.pendingWakeTaskIds.add(n);this.reconciliationVersion+=1}await this.reconcile()}reconcile(){return this.reconciliation?this.reconciliation:(this.reconciliation=this.drainReconciliations(),this.reconciliation)}async drainReconciliations(){try{for(;;){let t=this.reconciliationVersion,n=[...this.pendingWakeTaskIds];if(this.pendingWakeTaskIds.clear(),this.coordinator.requestImmediate(n),await this.reconcilePullRequests(),t===this.reconciliationVersion)return}}finally{this.reconciliation=null}}async reconcilePullRequests(){let t=await this.dependencies.listTasks(this.paths),n=this.view,r=this.coordinator.takeDueTasks(t,n);if(r.length===0)return;let s=new Map(r.map(o=>[o.id,ch(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)!==ch(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 lC(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=dC(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&cC.has(i))&&t.add(n.taskId);continue}n.type==="agent.state.changed"&&r?.previousState==="working"&&(r.state==="ready"||r.state==="idle"||r.state==="error")&&t.add(n.taskId)}return[...t]}var cC=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),dC=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function ch(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as TC}from"node:module";import uC from"@xterm/headless";var pC=1e3,fC=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function uh(e){return new uC.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:pC,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}})}function ph(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function Pd(e,t){return new Promise(n=>{e.write(t,n)})}function fh(e,t=0){let n=e.buffer.active,r=[],s=n.getNullCell(),i=n.baseY+n.cursorY,o=Math.max(0,n.baseY-t);for(let a=0;a<e.rows;a+=1){let l=n.getLine(o+a);if(!l){r.push({segments:[]});continue}let c=[];for(let u=0;u<e.cols;u+=1){let d=l.getCell(u,s);!d||d.getWidth()===0||c.push({text:d.getChars()||" ",style:hC(d,o+a===i&&u===n.cursorX)})}r.push({segments:mC(gC(c))})}return r}function mC(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&kC(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};mh(n.style)||(s.style=n.style),t.push(s)}return t}function gC(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||!mh(n.style))break;t-=1}return e.slice(0,t)}function hC(e,t){let n={},r=dh(e,"fg"),s=dh(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 dh(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"):fC[s]??yC(s)}function yC(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(wC).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 wC(e){return e===0?0:55+e*40}function kC(e,t){return Sd(e)===Sd(t)}function Sd(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function mh(e){return Sd(e)===""}var bC=TC(import.meta.url),RC=/^CTRL_([A-Z])$/,SC="\x1B[6n",PC="\x1B[c",IC="\x1B[?u",vC={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
267
+ `,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:""},_o=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")Id(i),this.sessions.delete(n);else return this.attachedTabId=n,i.scrollbackLines=0,gh(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(`
268
+ `))&&this.touchActivity(n))}writeKey(t){let n=CC(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&&gh(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&&(Id(n),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())Id(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:AC(n),error:n.error,scrolledBack:n.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}createSession(t,n,r,s){let i=this.spawn??OC().spawn,o=uh(r),a=s??this.resolveSessionSpec(t,n),l=Rn({...this.env,...a.env??{}}),{executable:c,args:u}=$C(this.shell,a.command,{cwd:a.cwd,env:l}),d=i(c,u,{name:"xterm-256color",cols:r.columns,rows:r.rows,cwd:a.cwd,env:DC(l)}),p={taskId:t,tabId:n,pty:d,terminal:o,status:"running",error:null,disposables:[],scrollbackLines:0,rows:[],renderedScrollbackLines:null,screenDirty:!0,lastActivityAt:Date.now(),exitCode:null};return p.disposables.push(d.onData(m=>{this.touchActivity(p),NC(d,m),Pd(p.terminal,m).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p.disposables.push(d.onExit(m=>{p.status="exited",p.exitCode=m.exitCode,p.lastActivityAt=Date.now(),this.notifyActivity(p),Pd(p.terminal,`\r
269
+ [process exited ${m.exitCode}]`).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p}getAttachedSession(){return this.attachedTabId?this.sessions.get(this.attachedTabId)??null:null}touchActivity(t){t.lastActivityAt=Date.now(),this.activityEnabled&&this.notifyActivity(t)}notifyActivity(t){this.activityEnabled&&this.recordActivity(this.buildActivitySnapshot(t))}recordActivity(t){this.activityEnabled&&(this.activitySnapshots.set(t.tabId,t),this.onActivity?.(t))}removeActivity(t){this.activitySnapshots.delete(t)&&this.onActivityRemoved?.(t)}buildActivitySnapshot(t){return{taskId:t.taskId,tabId:t.tabId,sessionState:t.status==="failed"?"failed":t.status==="exited"?"exited":"running",lastActivityAt:t.lastActivityAt,exitCode:t.exitCode,error:t.error}}};function CC(e){if(e.length===1)return e;let t=vC[e];if(t!==void 0)return t;let n=RC.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function gh(e,t){EC(e.pty,t),ph(e.terminal,t),e.screenDirty=!0}function AC(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=fh(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function Id(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function EC(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function OC(){return bC("node-pty")}function $C(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[Sn(t[0],n),...t.slice(1)].map(hh).join(" ")}; exec ${hh(e)} -l`;return{executable:e,args:["-lc",s]}}function hh(e){return`'${e.replaceAll("'","'\\''")}'`}function DC(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 NC(e,t){for(let n=0;n<vd(t,SC);n+=1)e.write("\x1B[1;1R");for(let n=0;n<vd(t,PC);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<vd(t,IC);n+=1)e.write("\x1B[?0u")}function vd(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 Ds=Ht,jC=new Set([6,7,8,Ds]),qC=16,UC=250;async function kh(e){let t=pt(e.paths);await KC(t,e.paths,e.spawnDaemon);let n=await Ch(t.socketPath),r=new Cd(n,e);return await r.ready(),r}async function Th(e,t={}){let n=pt(e);await LC(e.runtimeDir,{recursive:!0}),await $s(n.socketPath,{force:!0});let r=new Ad(e,t),s=_C(i=>r.handleConnection(i));try{await r.start(),await JC(s,n.socketPath),await MC(n.pidPath,String(process.pid),"utf8"),await we.appendLogBestEffort(e,{level:"info",component:"daemon",event:"started",message:`PTY daemon started with protocol ${Ds}.`,details:{pid:process.pid,protocolVersion:Ds}}),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 we.appendLogBestEffort(e,{level:"error",component:"daemon",event:"failed",message:i instanceof Error?i.message:String(i),details:{pid:process.pid}}),i}finally{await we.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 $s(n.socketPath,{force:!0}),await $s(n.pidPath,{force:!0}),await r.stop(),r.disposeAll()}}async function bh(e){let t=pt(e);return await Ph(t.socketPath)?(await zC(t.socketPath),!0):!1}var Cd=class{constructor(t,n){this.socket=t;this.options=n,this.activityEnabled=n.activityEnabled??!1,this.tasksChangedHandler=n.onTasksChanged,t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>{this.closed||(this.closed=!0,this.rejectAll(new Error("Craig PTY daemon connection closed.")),this.failRunningActivities("Craig PTY daemon connection closed."))})}socket;managesPullRequestSync=!0;nextRequestId=1;pending=new Map;viewCache=new Map;activityCache=new Map;activityRevisionByTabId=new Map;activityRevision=0;attachedTabId=null;viewedTabId=null;subscribedTabId=null;activityEnabled;pullRequestPollView={selectedTaskId:null,reviewVisible:!1};tasksChangedHandler;buffer="";closed=!1;protocolVersion=Ds;options;async ready(){let t=await this.send({type:"ping"});if(!Sh(t.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch.");this.protocolVersion=t.protocolVersion,this.protocolVersion<=8&&await this.send({type:"setViewUpdateMode",mode:"incremental"}),await this.send({type:"setActivityEnabled",enabled:this.activityEnabled}),this.activityEnabled&&await this.refreshActivitySnapshots()}async ensureSession(t,n,r){let s=await this.send({type:"ensureSession",taskId:t,tabId:n,size:r,spec:this.options.resolveSessionSpec?.(t,n)??{cwd:this.options.workspaceRoot,command:[]}});this.attachedTabId=n,this.viewedTabId=n,this.subscribedTabId=n;let i=s.view??{status:"idle",rows:[],error:null};return this.viewCache.set(n,i),i}async hydrateSessions(t){for(let n of t)try{let r=await this.send({type:"hydrateSession",tabId:n});r.view&&(this.viewCache.set(n,r.view),r.view.status==="idle"&&we.appendLogBestEffort(this.options.paths,{level:"debug",component:"pty",event:"hydration.missing",message:"No live PTY session was found for the persisted tab.",tabId:n}))}catch(r){let s=r instanceof Error?r.message:String(r);this.viewCache.set(n,{status:"failed",rows:[],error:s})}this.activityEnabled&&await this.refreshActivitySnapshots()}async pruneStale(t){await this.send({type:"pruneStale",keepTabIds:t})}write(t){this.send({type:"write",input:t}).catch(()=>{})}writeKey(t){this.send({type:"writeKey",key:t}).catch(()=>{})}scrollViewport(t){let n=this.attachedTabId;this.send({type:"scrollViewport",lines:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}resize(t){let n=this.attachedTabId;this.send({type:"resize",size:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}detach(){this.attachedTabId=null,this.send({type:"detach"}).catch(()=>{})}setViewedTab(t){this.closed||(this.viewedTabId=t,this.subscribeToView(t))}setActivityEnabled(t){if(!(this.closed||this.activityEnabled===t)){if(this.activityEnabled=t,!t){for(let n of[...this.activityCache.keys()])this.removeCachedActivity(n);this.send({type:"setActivityEnabled",enabled:t}).catch(()=>{});return}this.send({type:"setActivityEnabled",enabled:t}).then(()=>this.refreshActivitySnapshots(!0)).catch(()=>{})}}setPullRequestPollView(t){this.closed||this.pullRequestPollView.selectedTaskId===t.selectedTaskId&&this.pullRequestPollView.reviewVisible===t.reviewVisible||(this.pullRequestPollView=t,this.send({type:"setPullRequestPollView",view:t}).catch(()=>{}))}setTasksChangedHandler(t){this.tasksChangedHandler=t}disposeSession(t){this.viewCache.delete(t),this.removeCachedActivity(t),this.attachedTabId===t&&(this.attachedTabId=null),this.send({type:"disposeSession",tabId:t}).catch(()=>{})}disposeAll(){this.attachedTabId=null,!this.closed&&(this.socket.end(),this.closed=!0)}getViewState(t){return t?this.viewCache.get(t)??{status:"idle",rows:[],error:null,scrolledBack:!1}:{status:"idle",rows:[],error:null,scrolledBack:!1}}getActivitySnapshots(){return[...this.activityCache.values()]}async requestShutdown(){await this.send({type:"shutdown"})}async send(t){if(this.closed)throw new Error("Craig PTY daemon connection is closed.");let n=this.nextRequestId;this.nextRequestId+=1;let r={...t,id:n},s=new Promise((o,a)=>{this.pending.set(n,{resolve:o,reject:a})});if(this.socket.destroyed)throw this.pending.delete(n),new Error("Craig PTY daemon connection is closed.");this.socket.write(`${JSON.stringify(r)}
270
270
  `);let i=await s;if(!i.ok)throw new Error(i.error);return i}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
271
271
  `);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
272
- `)}}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=LC(r,n.patch),i=r.rows.slice(0,n.patch.rowCount);for(let o of n.patch.rows)i[o.index]=o.row;this.viewCache.set(n.tabId,{status:n.patch.status,rows:i,error:n.patch.error,scrolledBack:n.patch.scrolledBack}),this.viewedTabId===n.tabId&&this.options.onUpdate?.(s?{tabId:n.tabId,kind:"full"}:{tabId:n.tabId,kind:"rows",rowIndices:n.patch.rows.map(o=>o.index)})}n.type==="activity"&&(this.recordCachedActivity(n.snapshot),this.options.onActivity?.(n.snapshot)),n.type==="activityRemoved"&&this.removeCachedActivity(n.tabId),n.type==="tasksChanged"&&this.tasksChangedHandler?.(n.taskIds)}subscribeToView(t){this.closed||this.subscribedTabId===t||(this.subscribedTabId=t,this.send({type:"subscribeView",tabId:t}).then(n=>{t&&n.view&&this.viewCache.set(t,n.view),this.viewedTabId===t&&this.subscribedTabId===t&&this.notifyFullUpdate(t)}).catch(()=>{this.subscribedTabId===t&&(this.subscribedTabId=null)}))}rejectAll(t){for(let n of this.pending.values())n.reject(t);this.pending.clear()}notifyFullUpdate(t){t&&this.options.onUpdate?.({tabId:t,kind:"full"})}replaceActivityCache(t,n){let r=new Map;for(let[s,i]of this.activityRevisionByTabId)i>n&&r.set(s,this.activityCache.get(s)??null);this.activityCache.clear();for(let s of t)this.activityCache.set(s.tabId,s);for(let[s,i]of r)i?this.activityCache.set(s,i):this.activityCache.delete(s)}async refreshActivitySnapshots(t=!1){let n=this.activityRevision,r=await this.send({type:"getActivitySnapshots"});if(this.replaceActivityCache(r.activities??[],n),t)for(let s of this.activityCache.values())this.options.onActivity?.(s)}recordCachedActivity(t){this.activityRevision+=1,this.activityRevisionByTabId.set(t.tabId,this.activityRevision),this.activityCache.set(t.tabId,t)}removeCachedActivity(t){this.activityRevision+=1,this.activityRevisionByTabId.set(t,this.activityRevision),this.activityCache.delete(t),this.options.onActivityRemoved?.(t)}failRunningActivities(t){for(let n of this.activityCache.values()){if(n.sessionState!=="running")continue;let r={...n,sessionState:"failed",lastActivityAt:Date.now(),error:t};this.recordCachedActivity(r),this.options.onActivity?.(r)}}},Id=class{onShutdown=null;clients=new Set;subscriptions=new Map;updateTimers=new Map;activityTimers=new Map;pendingActivities=new Map;runtime;paths;orchestrationSupervisor=null;pullRequestSyncSupervisor=null;pullRequestEventReconciliationEnabled=!1;pullRequestSyncOptions;attachedTabId=null;constructor(t,n){this.paths=t,this.pullRequestSyncOptions=n.pullRequestSync;let r={...n};delete r.pullRequestSync,this.runtime=new _o({...r,workspaceRoot:t.workspaceRoot,activityEnabled:!1,onUpdate:s=>this.handleRuntimeUpdate(s.tabId),onActivity:s=>this.handleActivityUpdate(s),onActivityRemoved:s=>this.handleActivityRemoved(s)})}async start(){let t=await k.load(this.paths);if(this.pullRequestSyncOptions!==!1){let r=this.pullRequestSyncOptions??{},s=r.reconcileEvents===!1?!1:r.reconcileEvents??(()=>rn(this.paths,{agentObserver:{daemonAvailable:!0,getSnapshots:()=>this.runtime.getActivitySnapshots(),subscribe:()=>()=>{},close:()=>{}}}));this.pullRequestEventReconciliationEnabled=!!s,this.pullRequestSyncSupervisor=new xo(this.paths,{...r,reconcileEvents:s,minimumIntervalMs:r.minimumIntervalMs??(t.github?.watchIntervalSeconds??5)*1e3,onTasksChanged:async i=>{this.broadcastTasksChanged(i),await r.onTasksChanged?.(i)},onError:async i=>{await we.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 Ge(this.paths)).some(r=>r.state==="queued"||r.state==="delivering");(k.previews.isEnabled(t,"agentOrchestration")||n)&&await this.ensureOrchestrationSupervisor()}async stop(){await this.pullRequestSyncSupervisor?.stop(),this.pullRequestSyncSupervisor=null,this.pullRequestEventReconciliationEnabled=!1,this.updateRuntimeActivityEnabled(),await this.orchestrationSupervisor?.stop(),this.orchestrationSupervisor=null}handleConnection(t){let n="";this.clients.add(t),this.subscriptions.set(t,{activityEnabled:!1,tabId:null,view:null,rowKeys:[],pullRequestPollView:{selectedTaskId:null,reviewVisible:!1}}),t.setEncoding("utf8"),t.on("data",s=>{n+=String(s);let i=n.indexOf(`
272
+ `)}}handleMessage(t){if(t.trim().length===0)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n){let r=this.pending.get(n.id);if(!r)return;this.pending.delete(n.id),r.resolve(n);return}if(n.type==="update"){if("view"in n){this.viewCache.set(n.tabId,n.view),this.viewedTabId===n.tabId&&this.notifyFullUpdate(n.tabId);return}let r=this.viewCache.get(n.tabId)??{status:"idle",rows:[],error:null,scrolledBack:!1},s=VC(r,n.patch),i=r.rows.slice(0,n.patch.rowCount);for(let o of n.patch.rows)i[o.index]=o.row;this.viewCache.set(n.tabId,{status:n.patch.status,rows:i,error:n.patch.error,scrolledBack:n.patch.scrolledBack}),this.viewedTabId===n.tabId&&this.options.onUpdate?.(s?{tabId:n.tabId,kind:"full"}:{tabId:n.tabId,kind:"rows",rowIndices:n.patch.rows.map(o=>o.index)})}n.type==="activity"&&(this.recordCachedActivity(n.snapshot),this.options.onActivity?.(n.snapshot)),n.type==="activityRemoved"&&this.removeCachedActivity(n.tabId),n.type==="tasksChanged"&&this.tasksChangedHandler?.(n.taskIds)}subscribeToView(t){this.closed||this.subscribedTabId===t||(this.subscribedTabId=t,this.send({type:"subscribeView",tabId:t}).then(n=>{t&&n.view&&this.viewCache.set(t,n.view),this.viewedTabId===t&&this.subscribedTabId===t&&this.notifyFullUpdate(t)}).catch(()=>{this.subscribedTabId===t&&(this.subscribedTabId=null)}))}rejectAll(t){for(let n of this.pending.values())n.reject(t);this.pending.clear()}notifyFullUpdate(t){t&&this.options.onUpdate?.({tabId:t,kind:"full"})}replaceActivityCache(t,n){let r=new Map;for(let[s,i]of this.activityRevisionByTabId)i>n&&r.set(s,this.activityCache.get(s)??null);this.activityCache.clear();for(let s of t)this.activityCache.set(s.tabId,s);for(let[s,i]of r)i?this.activityCache.set(s,i):this.activityCache.delete(s)}async refreshActivitySnapshots(t=!1){let n=this.activityRevision,r=await this.send({type:"getActivitySnapshots"});if(this.replaceActivityCache(r.activities??[],n),t)for(let s of this.activityCache.values())this.options.onActivity?.(s)}recordCachedActivity(t){this.activityRevision+=1,this.activityRevisionByTabId.set(t.tabId,this.activityRevision),this.activityCache.set(t.tabId,t)}removeCachedActivity(t){this.activityRevision+=1,this.activityRevisionByTabId.set(t,this.activityRevision),this.activityCache.delete(t),this.options.onActivityRemoved?.(t)}failRunningActivities(t){for(let n of this.activityCache.values()){if(n.sessionState!=="running")continue;let r={...n,sessionState:"failed",lastActivityAt:Date.now(),error:t};this.recordCachedActivity(r),this.options.onActivity?.(r)}}},Ad=class{onShutdown=null;clients=new Set;subscriptions=new Map;updateTimers=new Map;activityTimers=new Map;pendingActivities=new Map;runtime;paths;orchestrationSupervisor=null;pullRequestSyncSupervisor=null;pullRequestEventReconciliationEnabled=!1;pullRequestSyncOptions;attachedTabId=null;constructor(t,n){this.paths=t,this.pullRequestSyncOptions=n.pullRequestSync;let r={...n};delete r.pullRequestSync,this.runtime=new _o({...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??(()=>sn(this.paths,{agentObserver:{daemonAvailable:!0,getSnapshots:()=>this.runtime.getActivitySnapshots(),subscribe:()=>()=>{},close:()=>{}}}));this.pullRequestEventReconciliationEnabled=!!s,this.pullRequestSyncSupervisor=new xo(this.paths,{...r,reconcileEvents:s,minimumIntervalMs:r.minimumIntervalMs??(t.github?.watchIntervalSeconds??5)*1e3,onTasksChanged:async i=>{this.broadcastTasksChanged(i),await r.onTasksChanged?.(i)},onError:async i=>{await we.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 Ge(this.paths)).some(r=>r.state==="queued"||r.state==="delivering");(k.previews.isEnabled(t,"agentOrchestration")||n)&&await this.ensureOrchestrationSupervisor()}async stop(){await this.pullRequestSyncSupervisor?.stop(),this.pullRequestSyncSupervisor=null,this.pullRequestEventReconciliationEnabled=!1,this.updateRuntimeActivityEnabled(),await this.orchestrationSupervisor?.stop(),this.orchestrationSupervisor=null}handleConnection(t){let n="";this.clients.add(t),this.subscriptions.set(t,{activityEnabled:!1,tabId:null,view:null,rowKeys:[],pullRequestPollView:{selectedTaskId:null,reviewVisible:!1}}),t.setEncoding("utf8"),t.on("data",s=>{n+=String(s);let i=n.indexOf(`
273
273
  `);for(;i!==-1;){let o=n.slice(0,i);n=n.slice(i+1),this.handleLine(t,o),i=n.indexOf(`
274
- `)}});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:Ns,sessionCount:this.runtime.sessionTabIds().length}:{},...r.type==="getActivitySnapshots"?{activities:this.runtime.getActivitySnapshots()}:{},...s?{view:s}:{}})}catch(s){let i=s instanceof Error?s.message:String(s);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"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 KC(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(vd),pullRequestPollView:s?.pullRequestPollView??{selectedTaskId:null,reviewVisible:!1}}),r}setActivityEnabled(t,n){let r=this.subscriptions.get(t);if(!r)return;this.subscriptions.set(t,{...r,activityEnabled:n});let s=this.hasActivitySubscribers();this.updateRuntimeActivityEnabled(),s||this.clearPendingActivityBroadcasts()}setPullRequestPollView(t,n){let r=this.subscriptions.get(t);r&&(this.subscriptions.set(t,{...r,pullRequestPollView:n}),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()))}getPullRequestPollView(){let t=[...this.subscriptions.values()].map(n=>n.pullRequestPollView);return t.find(n=>n.selectedTaskId&&n.reviewVisible)??t.find(n=>n.selectedTaskId)??{selectedTaskId:null,reviewVisible:!1}}broadcastTasksChanged(t){for(let n of this.clients)Mn(n,{type:"tasksChanged",taskIds:t})}handleRuntimeUpdate(t){this.scheduleBroadcastUpdate(t)}handleActivityUpdate(t){if(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)},xC))}}handleActivityRemoved(t){this.pullRequestSyncSupervisor?.notifyActivityRemoved(t);let n=this.activityTimers.get(t);n&&(clearTimeout(n),this.activityTimers.delete(t)),this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&Mn(r,{type:"activityRemoved",tabId:t})}broadcastActivity(t){let n=this.pendingActivities.get(t);if(n){this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&Mn(r,{type:"activity",snapshot:n})}}hasActivitySubscribers(){return[...this.subscriptions.values()].some(t=>t.activityEnabled)}clearPendingActivityBroadcasts(){for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear()}async ensureOrchestrationSupervisor(){if(this.orchestrationSupervisor)return;let t=new No(this.paths,this.runtime,{onError:n=>we.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor",message:n instanceof Error?n.message:String(n)})});await t.start(),this.orchestrationSupervisor=t,this.updateRuntimeActivityEnabled()}updateRuntimeActivityEnabled(){this.runtime.setActivityEnabled(this.orchestrationSupervisor!==null||this.pullRequestEventReconciliationEnabled||this.hasActivitySubscribers())}log(t){we.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)},DC))}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=_C(s,n),o=FC(s.view,n);s.view=n,s.rowKeys=n.rows.map(vd),(i.rows.length>0||o)&&Mn(r,{type:"update",tabId:t,patch:i})}}};function _C(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==vd(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 FC(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 LC(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function vd(e){return JSON.stringify(e)}async function MC(e,t,n){if(await jC(e.socketPath,1e3))return;if(await bg(e.socketPath)){let o=await Rg(e.socketPath).catch(()=>null),a=o?.ok?o.protocolVersion??"unknown":"unknown",l=o?.ok?o.sessionCount??"unknown":"unknown";throw await we.appendLogBestEffort(t,{level:"warn",component:"daemon",event:"upgrade.blocked",message:`Left incompatible protocol ${a} daemon running to preserve possible live PTYs.`,details:{protocolVersion:a,sessionCount:l}}),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 UC(e,t);let r=t.workspaceRoot;if(n)n(r);else{let{command:o,args:a}=qC(r),l=EC(Fo.join(t.runtimeDir,"pty-daemon.log"),"a");CC(o,a,{cwd:r,detached:!0,stdio:["ignore",l,l],env:process.env}).unref()}let s=Date.now();for(;Date.now()-s<5e3;){if(await kg(e.socketPath))return;await Ig(50)}let i=await hg(Fo.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${i?`
275
- ${i.slice(-2e3)}`:""}`)}async function kg(e){let t=await Rg(e).catch(()=>null);return t?.ok===!0&&Tg(t.protocolVersion)}function Tg(e){return e!==void 0&&NC.has(e)}async function jC(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await kg(e))return!0;await Ig(50)}return!1}function qC(e){let t=process.argv[1];if(t?.endsWith(".ts")){let r=Fo.resolve(Fo.dirname(t),"..","node_modules",".bin","tsx");return{command:Oa("tsx")??r,args:[t,"__craig-daemon",e]}}let n=process.argv.slice(1);return{command:process.execPath,args:[...process.execArgv,...n,"__craig-daemon",e]}}async function UC(e,t){let n=await hg(e.pidPath,"utf8").catch(()=>null);if(n){let r=Number(n.trim());if(Number.isInteger(r)&&r>0&&VC(r))return;await we.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 $s(e.socketPath,{force:!0}),await $s(e.pidPath,{force:!0})}async function bg(e){let t=await Pg(e).catch(()=>null);return t?(t.end(),!0):!1}async function WC(e){await Sg(e,{id:1,type:"shutdown"}).catch(()=>null)}async function Rg(e){return Sg(e,{id:1,type:"ping"})}function Sg(e,t){return new Promise((n,r)=>{let s=mg(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)}
274
+ `)}});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:Ds,sessionCount:this.runtime.sessionTabIds().length}:{},...r.type==="getActivitySnapshots"?{activities:this.runtime.getActivitySnapshots()}:{},...s?{view:s}:{}})}catch(s){let i=s instanceof Error?s.message:String(s);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"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 QC(n)}}subscribe(t,n,r){let s=this.subscriptions.get(t);return this.subscriptions.set(t,{activityEnabled:s?.activityEnabled??!1,tabId:n,view:r,rowKeys:r.rows.map(Ed),pullRequestPollView:s?.pullRequestPollView??{selectedTaskId:null,reviewVisible:!1}}),r}setActivityEnabled(t,n){let r=this.subscriptions.get(t);if(!r)return;this.subscriptions.set(t,{...r,activityEnabled:n});let s=this.hasActivitySubscribers();this.updateRuntimeActivityEnabled(),s||this.clearPendingActivityBroadcasts()}setPullRequestPollView(t,n){let r=this.subscriptions.get(t);r&&(this.subscriptions.set(t,{...r,pullRequestPollView:n}),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()))}getPullRequestPollView(){let t=[...this.subscriptions.values()].map(n=>n.pullRequestPollView);return t.find(n=>n.selectedTaskId&&n.reviewVisible)??t.find(n=>n.selectedTaskId)??{selectedTaskId:null,reviewVisible:!1}}broadcastTasksChanged(t){for(let n of this.clients)Mn(n,{type:"tasksChanged",taskIds:t})}handleRuntimeUpdate(t){this.scheduleBroadcastUpdate(t)}handleActivityUpdate(t){if(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)},UC))}}handleActivityRemoved(t){this.pullRequestSyncSupervisor?.notifyActivityRemoved(t);let n=this.activityTimers.get(t);n&&(clearTimeout(n),this.activityTimers.delete(t)),this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&Mn(r,{type:"activityRemoved",tabId:t})}broadcastActivity(t){let n=this.pendingActivities.get(t);if(n){this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&Mn(r,{type:"activity",snapshot:n})}}hasActivitySubscribers(){return[...this.subscriptions.values()].some(t=>t.activityEnabled)}clearPendingActivityBroadcasts(){for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear()}async ensureOrchestrationSupervisor(){if(this.orchestrationSupervisor)return;let t=new Do(this.paths,this.runtime,{onError:n=>we.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor",message:n instanceof Error?n.message:String(n)})});await t.start(),this.orchestrationSupervisor=t,this.updateRuntimeActivityEnabled()}updateRuntimeActivityEnabled(){this.runtime.setActivityEnabled(this.orchestrationSupervisor!==null||this.pullRequestEventReconciliationEnabled||this.hasActivitySubscribers())}log(t){we.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)},qC))}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=WC(s,n),o=BC(s.view,n);s.view=n,s.rowKeys=n.rows.map(Ed),(i.rows.length>0||o)&&Mn(r,{type:"update",tabId:t,patch:i})}}};function WC(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==Ed(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 BC(e,t){return!e||e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==(t.scrolledBack??!1)||e.rows.length!==t.rows.length}function VC(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function Ed(e){return JSON.stringify(e)}async function KC(e,t,n){if(await GC(e.socketPath,1e3))return;if(await Ph(e.socketPath)){let o=await Ih(e.socketPath).catch(()=>null),a=o?.ok?o.protocolVersion??"unknown":"unknown",l=o?.ok?o.sessionCount??"unknown":"unknown";throw await we.appendLogBestEffort(t,{level:"warn",component:"daemon",event:"upgrade.blocked",message:`Left incompatible protocol ${a} daemon running to preserve possible live PTYs.`,details:{protocolVersion:a,sessionCount:l}}),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 YC(e,t);let r=t.workspaceRoot;if(n)n(r);else{let{command:o,args:a}=HC(r),l=FC(Fo.join(t.runtimeDir,"pty-daemon.log"),"a");xC(o,a,{cwd:r,detached:!0,stdio:["ignore",l,l],env:process.env}).unref()}let s=Date.now();for(;Date.now()-s<5e3;){if(await Rh(e.socketPath))return;await Ah(50)}let i=await wh(Fo.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${i?`
275
+ ${i.slice(-2e3)}`:""}`)}async function Rh(e){let t=await Ih(e).catch(()=>null);return t?.ok===!0&&Sh(t.protocolVersion)}function Sh(e){return e!==void 0&&jC.has(e)}async function GC(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await Rh(e))return!0;await Ah(50)}return!1}function HC(e){let t=process.argv[1];if(t?.endsWith(".ts")){let r=Fo.resolve(Fo.dirname(t),"..","node_modules",".bin","tsx");return{command:Oa("tsx")??r,args:[t,"__craig-daemon",e]}}let n=process.argv.slice(1);return{command:process.execPath,args:[...process.execArgv,...n,"__craig-daemon",e]}}async function YC(e,t){let n=await wh(e.pidPath,"utf8").catch(()=>null);if(n){let r=Number(n.trim());if(Number.isInteger(r)&&r>0&&XC(r))return;await we.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 $s(e.socketPath,{force:!0}),await $s(e.pidPath,{force:!0})}async function Ph(e){let t=await Ch(e).catch(()=>null);return t?(t.end(),!0):!1}async function zC(e){await vh(e,{id:1,type:"shutdown"}).catch(()=>null)}async function Ih(e){return vh(e,{id:1,type:"ping"})}function vh(e,t){return new Promise((n,r)=>{let s=yh(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)}
276
276
  `)),s.once("error",l=>{a(),r(l)}),s.on("data",l=>{i+=String(l);let c=i.indexOf(`
277
- `);if(c===-1)return;let u=i.slice(0,c);a(),s.end();try{n(JSON.parse(u))}catch(d){r(d instanceof Error?d:new Error(String(d)))}}),s.once("close",()=>a())})}function Pg(e){return new Promise((t,n)=>{let r=mg(e);r.once("connect",()=>t(r)),r.once("error",n)})}function BC(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)}
278
- `)}catch{}}function VC(e){try{return process.kill(e,0),!0}catch{return!1}}function Ig(e){return new Promise(t=>setTimeout(t,e))}function KC(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var Cd=["Runners","Feature Previews","Logs","Help"],Cg={agentActivityIndicators:"Agent activity indicators",agentOrchestration:"Agent orchestration"};function Ad(e,t){return J.map(n=>{let r=k.runners.getProfile(n),s=e.runners?.[n]?.enabled!==!1,i=e.runners?.[n]?.path?.trim(),o=t.pathEdit?.runner===n?`${t.pathEdit.value}_`:i&&i.length>0?i:`default (${r.executable})`;return`${r.displayName} ${s?"enabled":"disabled"} ${o}`})}function Ag(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 Eg(e){return Je.map(t=>`${k.previews.isEnabled(e,t)?"[x]":"[ ]"} ${Cg[t]}`)}function Og(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function $g(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(Cd.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:Lo(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"logs"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function Ng(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(Je.length-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(!Lo(n))return{kind:"noop",state:e};let r=Je[e.menuIndex]??Je[0],s=!k.previews.isEnabled(t,r);return{kind:"save-enabled",feature:r,enabled:s,state:{...e,message:`${Cg[r]} ${s?"enabled":"disabled"}.`}}}function Dg(e,t,n,r){if(e.pathEdit)return GC({...e,pathEdit:e.pathEdit},t,n);let s=Ad(t,e).length;if(n==="UP"||n==="k")return{kind:"render",state:{...e,menuIndex:Math.max(0,e.menuIndex-1),message:null}};if(n==="DOWN"||n==="j")return{kind:"render",state:{...e,menuIndex:Math.min(s-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(n==="e"){let a=J[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:a,value:t.runners?.[a]?.path??""}}}}if(!Lo(n))return{kind:"noop",state:e};let i=J[e.menuIndex]??"codex",o=t.runners?.[i]?.enabled!==!1;return o&&r.length<=1?{kind:"render",state:{...e,message:"At least one runner must stay enabled."}}:{kind:"save-enabled",runner:i,enabled:!o,state:{...e,message:`${k.runners.getProfile(i).displayName} ${o?"disabled":"enabled"}.`}}}function GC(e,t,n){if(n==="ESCAPE")return{kind:"render",state:vg({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(Lo(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:r,path:s.length>0?s:null,state:vg({...e,message:s.length>0?`${k.runners.getProfile(r).displayName} executable saved.`:`${k.runners.getProfile(r).displayName} executable reset to default.`})}}return HC(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function vg(e){let t={...e};return delete t.pathEdit,t}function Lo(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
279
- `}function HC(e){return e.length===1&&e>=" "&&e!==""}import Ds from"node:path";function xg(e){switch(e.toLowerCase().split(".").pop()??""){case"ts":case"tsx":return"\u{F06E6} ";case"js":case"jsx":case"mjs":case"cjs":return"\u{F031E} ";case"json":case"jsonc":return"\u{F0871} ";case"md":case"mdx":return"\u{F0354} ";case"yaml":case"yml":return"\u{F0B10} ";case"sh":case"bash":case"zsh":return"\u{F018D} ";case"css":case"scss":case"sass":return"\u{F031C} ";case"html":case"htm":return"\u{F031D} ";case"py":return"\u{F0320} ";case"go":return"\u{F07D3} ";case"rs":return"\u{F1617} ";case"lock":return"\u{F033E} ";case"png":case"jpg":case"jpeg":case"gif":case"svg":case"webp":return"\u{F02E9} ";default:return"\u{F0214} "}}var _g="\u{F024B} ",Fg="\u{F0DCF} ",Lg="\u25CB",Ed="\uEA64",Mg="\uEAFE",jg="\uEBDA",Od="\u25CB",$d="\u25CF",Nd="\u2713",Dd="\u2715";function qg(e){switch(e.toLowerCase().split(".").pop()??""){case"ts":case"tsx":return"4fc1ff";case"js":case"jsx":case"mjs":case"cjs":return"f7df1e";case"json":case"jsonc":return"fbc02d";case"md":case"mdx":return"519aba";case"yaml":case"yml":return"e06c75";case"sh":case"bash":case"zsh":return"89e051";case"css":case"scss":case"sass":return"c792ea";case"html":case"htm":return"e06c75";case"py":return"3572a5";case"go":return"00add8";case"rs":return"dea584";case"lock":return"565f89";default:return}}var Mo=150,Ug=6;var qo="empty",pe={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function Kg(e,t,n){let r=JC(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=OA(t.tasks),u=ZC(e,a),d=QC(e,a,u,n),p=d.find(y=>y.id===u)??d[0]??{id:"agent",label:"CODEX"},h=t.inspection?.taskId===a?.id?t.inspection:null,f=s?.name??"no repo",m=a?k.runners.getDisplayName(a.runner):k.runners.getDisplayName(e.selectedRunner);return{inputMode:e.inputMode,modalInput:e.taskPromptInput!==null||e.workspaceBrowser!==null,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,footerToast:e.footerToast,terminal:e.terminal,footerText:e.workspaceBrowser!==null?e.workspaceBrowser.query!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} Search: ${e.workspaceBrowser.query} \u2191\u2193 move Enter select Esc clear search`:`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up / search Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK ${s?`[${s.name}]`:"[no repo]"} \xB7 ${k.runners.getDisplayName(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${k.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:vs(e.selectedLeftItemId)?"n new task Enter attach X close task Esc pause ? help":e.selectedLeftItemId?.startsWith("workspace:")?"n new task Enter select X remove workspace Esc pause ? help":"n new task Enter select Esc pause ? help":e.focusedRegion==="center"?a===null?"n new task Tab tasks Esc pause ? help":u===K?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${k.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:Ds.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${Ds.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:m},leftTree:YC(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>$A(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:f,agent:m},centerTranscript:XC(u,e,s,a,e.workspaceBrowser,h,r),tabs:d,rightContext:EA(s,a),rightInspection:pA(e,a,h)}}function YC(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 zC(r,e,t.repos,t.tasks,n);let s=t.workspaces;if(s.length===0)r.push({text:"No workspaces registered.",indent:2,muted:!0});else for(let o of s){let a=e.selectedLeftItemId===`workspace:${o.id}`;r.push({id:`workspace:${o.id}`,text:`${o.kind==="project"?"\u2261":"\u2013"} ${o.name??o.id}`,selected:a,focused:a&&e.focusedRegion==="tasks"});let l=o.kind==="project"?o.discoveredRepoIds??[]:[o.primaryRepoId],c=t.tasks.filter(u=>u.workspaceId===o.id);if(c.length===0)r.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:u,visualDepth:d}of Ps(c)){let p=e.selectedLeftItemId===`task:${u.id}`,h=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,f={id:`task:${u.id}`,taskId:u.id,text:n?h:`${p?"\u25B8":"\u2022"} ${h}`,indent:d===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:tr(u,n.snapshots,n.now),activityAnimationFrame:n.animationFrame}:{}},m=Hg(u);m&&(f.prBadge=m),r.push(f)}if(o.kind==="project"){let u=`new-task-workspace:${o.id}`,d=e.selectedLeftItemId===u;r.push({id:u,text:`+ New Project Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:d,focused:d&&e.focusedRegion==="tasks",muted:!d})}if(o.kind==="repo"){let u=`new-task:${o.primaryRepoId}`,d=e.selectedLeftItemId===u;r.push({id:u,text:`+ New Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:d,focused:d&&e.focusedRegion==="tasks",muted:!d})}else{r.push({text:` Repos (${l.length})`,indent:0,muted:!0});for(let u of l.slice(0,6)){let d=t.repos.find(p=>p.id===u);r.push({text:` \xB7 ${d?.name??u}`,indent:0,muted:!0})}l.length>6&&r.push({text:` \xB7 ${l.length-6} more`,indent:0,muted:!0})}}let i=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&e.focusedRegion==="tasks"}),r}function zC(e,t,n,r,s){if(n.length===0)e.push({text:"No repos registered.",indent:2,muted:!0});else for(let o of n){let a=t.selectedLeftItemId===`repo:${o.id}`;e.push({id:`repo:${o.id}`,text:`\u2013 ${o.name}`,selected:a,focused:a&&t.focusedRegion==="tasks"});let l=r.filter(d=>d.repoId===o.id);if(l.length===0)e.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:d,visualDepth:p}of Ps(l)){let h=t.selectedLeftItemId===`task:${d.id}`,f=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,m={id:`task:${d.id}`,taskId:d.id,text:s?f:`${h?"\u25B8":"\u2022"} ${f}`,indent:p===0?2:4,selected:h,focused:h&&t.focusedRegion==="tasks",...s?{activity:tr(d,s.snapshots,s.now),activityAnimationFrame:s.animationFrame}:{}},y=Hg(d);y&&(m.prBadge=y),e.push(m)}let c=`new-task:${o.id}`,u=t.selectedLeftItemId===c;e.push({id:c,text:`+ New Task [${k.runners.getDisplayName(t.selectedRunner)}]`,indent:2,selected:u,focused:u&&t.focusedRegion==="tasks",muted:!u})}let i=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&t.focusedRegion==="tasks"}),e}function JC(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 XC(e,t,n,r,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(d=>d.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((d,p)=>{let h=p===s.selectedIndex?"\u25B8":" ",f=d.kind==="repo"?" [git repo]":"/";return`${h} ${d.name}${f}`}),u=s.query!==null?`Search: ${s.query}\u2588`:"";return ct(["Browse for a workspace to register.",s.cwd,...u?[u]:[],"",...c,"",s.error??"Use \u2191\u2193 to move, \u2192 or Enter to open, \u2190 to go up, Enter on a git repo to add it."])}if(!n)return ct(["No repos registered yet.","","Run `craig repo add <path>` in command mode, then reopen the shell."]);if(!r){let l=o?.kind==="project",c=l?o.name??"this workspace":n.name,u=l?"Project Task":"Task";return ct([`No tasks in ${c}.`,"",`Press n or choose + New ${u} to create one with ${k.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?ct([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this PTY-backed agent session.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):ct([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this plain task shell.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):e===K&&t.openInspectionKind==="file"?nA(r,i,t.fileScrollOffset):e===K&&t.openInspectionKind==="diff"?rA(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?ct(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):ct(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function QC(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:eA(o),...o.kind==="agent"&&r&&t?{activity:Gt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame}:{}}))??[];if(!t)return[{id:qo,label:"EMPTY",active:n===qo,focused:e.focusedRegion==="center"&&n===qo}];let i=e.openInspectionKind||n===K?[{id:K,label:tA(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function ZC(e,t){return t?t.ptyTabs.some(n=>n.id===e.activeTab)||e.activeTab===K&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??K:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??K:qo}function eA(e){return e.title.toUpperCase()}function tA(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?Ds.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function nA(e,t,n){if(!e)return ct(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return ct(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=Gg(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:""},...sA(r.lines,n,s)]}function rA(e,t,n){if(!e)return ct(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return ct(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=Gg(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:""},...iA(r.lines,n,s)]}function ct(e){return e.map(t=>({text:t}))}function sA(e,t,n){let r=Math.max(3,String(e.length).length),s=Math.max(0,Math.min(t,Math.max(0,e.length-1)));return e.slice(s).map((i,o)=>{let a=s+o+1;return{text:`${`${String(a).padStart(r," ")} \u2502 `}${i}`,segments:[{text:String(a).padStart(r," "),style:{fg:pe.lineNumber}},{text:" \u2502 ",style:{fg:pe.gutter}},...xd(i,n)],tone:"default"}})}function iA(e,t,n){let r=oA(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>aA(i,n))}function oA(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 aA(e,t){let n=Wg(e.oldNumber),r=Wg(e.newNumber),s=e.kind==="delete"?n:r,i=e.kind==="delete"?{bg:"2a1111",fallbackFg:pe.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:pe.diffAdd}:null,o=`${s} \u2502 ${e.text}`,a=i?cA(xd(e.text,t),i.bg,i.fallbackFg):xd(e.text,t),l=i?{fg:pe.lineNumber,bg:i.bg}:{fg:pe.lineNumber},c=i?{fg:pe.gutter,bg:i.bg}:{fg:pe.gutter};return{text:o,segments:[{text:s,style:l},{text:" \u2502 ",style:c},...a],fullBleed:i!==null}}function Wg(e){return e===null?" ":String(e).padStart(4," ")}function Gg(e){let t=Ds.extname(e).toLowerCase();return[".ts",".tsx",".js",".jsx",".mjs",".cjs"].includes(t)?"javascript":[".json",".jsonc"].includes(t)?"json":[".md",".mdx"].includes(t)?"markdown":[".css",".scss"].includes(t)?"css":"plain"}function xd(e,t){return t==="diff"?lA(e):t==="markdown"?dA(e):t==="json"?_d(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?_d(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 lA(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:pe.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:pe.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:pe.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:pe.diffMeta}}]:[{text:e}]}function cA(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function dA(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:pe.markup,bold:!0}}]:_d(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function _d(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:uA(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function uA(e){return e.startsWith("//")||e.startsWith("/*")?{fg:pe.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:pe.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:pe.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:pe.markup}:{fg:pe.keyword}}function pA(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"?Yg(t.repoTargets??[]):s?.pullRequest??(t?V(t):null),o=[fA(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=Xg(e,t),l=Fd(e,n),c=wA([{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,...vA(e,n)]}:{title:"",rows:[...o,...Fd(e,n)]}}function fA(e,t){let n=e.inspectionMode,r=[{label:"FILES",active:n==="files"},{label:"REVIEW",active:n==="review"}],s=[];for(let l=0;l<r.length;l++){let c=r[l];l>0&&s.push({text:" "});let u=c.active?e.focusedRegion==="inspector"||e.focusedRegion==="actions"?"9ece6a":"7aa2f7":"565f89";s.push({text:c.label,style:{fg:u}})}let i=Ld(t),o=Md(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function Bg(e){return[{text:" "},Ld(e),{text:" "},Md(e)]}function Hg(e){if(e.type==="project"&&e.repoTargets?.length){let n=Yg(e.repoTargets);return n?Bg(n):null}let t=V(e);return t?.number?Bg(t):null}function Yg(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=hA(n);return{number:-1,status:mA(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 mA(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 hA(e){let t=e.map(n=>zg(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 Ld(e){return!e||!e.number?{text:Lg,style:{fg:"565f89"}}:e.status==="merged"?{text:Mg,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:jg,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:Ed,style:{fg:"565f89"}}:{text:Ed,style:{fg:"9ece6a"}}}function Md(e){return e?.aggregateReadiness?Vg(e.aggregateReadiness):Vg(zg(e))}function Vg(e){return e==="failed"?{text:Dd,style:{fg:"f7768e"}}:e==="pending"?{text:$d,style:{fg:"e0af68"}}:e==="success"?{text:Nd,style:{fg:"9ece6a"}}:{text:Od,style:{fg:"565f89"}}}function zg(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")?Jg(e)?"failed":gA(e)?"success":"pending":"pending"}function gA(e){return!!(e.mergeable&&!e.draft&&!Jg(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function Jg(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function Xg(e,t){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return yA(e,t);let n=V(t),r=Zg("pr",t.branch,n??{number:null,url:null,baseBranch:null,headBranch:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,lastSyncedAt:null,requiredChecks:[],comments:[]}),s=t.prs.filter(i=>i!==n&&(i.status==="merged"||i.status==="closed")).length;return s>0&&r.push({id:"pr-history",text:`+ ${s} previous PR${s!==1?"s":""}`,muted:!0}),r}var jo=32;function yA(e,t){let n=[],r=t.repoTargets??[],s=e.selectedProjectTargetId??r[0]?.repoId??null;for(let o of r){let a=s===o.repoId,l=e.focusedRegion==="inspector"&&a,c=o.repoId.startsWith("repo_")?o.repoId.slice(5):o.repoId;if(o.status!=="ready"){let d=o.failureReason?o.failureReason.slice(0,14):o.status,p=jo-d.length-1,h=c.length>p?c.slice(0,p-1)+"\u2026":c,f=jo-h.length-d.length;n.push({id:`project-review:${o.repoId}`,text:h+" ".repeat(Math.max(1,f))+d,selected:a,focused:l,muted:!0})}else{let u=Ld(o.pullRequest),d=Md(o.pullRequest),p=`${u.text} ${d.text}`,h=jo-p.length-1,f=c.length>h?c.slice(0,h-1)+"\u2026":c,m=jo-f.length-p.length,y=f+" ".repeat(Math.max(1,m));n.push({id:`project-review:${o.repoId}`,text:y+p,selected:a,focused:l,segments:[{text:y},{...u,text:u.text},{text:" "},{...d,text:d.text}]})}}let i=r.find(o=>o.repoId===s)??null;return i?.status==="ready"&&i.pullRequest.number&&(n.push({id:"target-detail-spacer",text:""}),n.push(...Zg("target",i.branch,i.pullRequest))),n}function Qg(e,t,n=null){return 3+Xg(e,t).length+Fd(e,n).length}function Zg(e,t,n){let r=d=>`${e}-${d}`;if(!n.number)return[{id:r("no-pr"),text:t,muted:!0}];let s=[],i=`#${n.number}`;s.push(n.url?{id:r("pr-number"),text:`${i} Open in GitHub \u2197`,segments:[{text:i},{text:" Open in GitHub \u2197",style:{fg:"7aa2f7",underline:!0},href:n.url}]}:{id:r("pr-number"),text:i});let o=n.baseBranch??"?",a=n.headBranch??t;s.push({id:r("pr-branches"),text:`${o} \u2192 ${a}`,muted:!0});let l=kA(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:TA(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${ey(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(bA)):s.push({id:r("checks-none"),text:n.number?"No GitHub checks reported.":"No checks \u2014 sync after creating a PR.",muted:!0});let u=n.comments??[];return u.length>0&&(s.push({id:r("comments-spacer"),text:""}),s.push({id:r("comments-header"),text:`Review comments (${u.length})`}),s.push(...u.slice(-4).flatMap((d,p)=>RA(d,r(`comment:${p}`))))),s}function wA(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 kA(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function TA(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function ey(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 bA(e){let{icon:t,color:n}=PA(e.status),r=e.name.length>16?`${e.name.slice(0,15)}\u2026`:e.name;return{id:`pr-check:${e.name}`,text:`${t} ${r.padEnd(16," ")} ${IA(e.status)}`,color:n,muted:!1}}function RA(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${ey(e.createdAt)}`:"",s=SA(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 SA(e,t){let n=e.split(/\s+/).filter(Boolean);if(n.length===0)return[];let r=[],s="";for(let i of n){if(!s){s=i;continue}`${s} ${i}`.length<=t?s=`${s} ${i}`:(r.push(s),s=i)}return s&&r.push(s),r}function PA(e){switch(e){case"success":return{icon:Nd,color:"9ece6a"};case"pending":return{icon:$d,color:"e0af68"};case"failed":return{icon:Dd,color:"f7768e"};case"skipped":return{icon:Od,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function IA(e){return e==="success"?"passing":e==="failed"?"failing":e}function vA(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=jd(t.fileRows,e.collapsedFileTreePaths),s=e.fileSearchQuery,i=s?r.filter(l=>l.path.toLowerCase().includes(s.toLowerCase())):r,o=s!==null?[{id:"file-search",text:`Search: ${s}\u2588`,muted:!1}]:[],a=e.selectedFileTreePath??t.selectedFilePath;return[...o,...i.map(l=>{let c=l.kind==="file"?n.get(l.path):void 0,u=c==="A"?"9ece6a":c==="M"?"e0af68":c==="D"?"f7768e":c==="??"?"565f89":void 0,d=l.kind==="directory"?e.collapsedFileTreePaths.includes(l.path)?_g:Fg:xg(l.label),p=l.kind==="directory"?"7aa2f7":qg(l.label),h=" ".repeat(l.depth),f=p?{text:d,style:{fg:p}}:{text:d},m=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:u?{text:l.label,style:{fg:u}}:{text:l.label},y=[{text:h},f,m];return{id:l.path,text:`${h}${d}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:y}})]}function jd(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 Fd(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(CA(t))return AA(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=>ty(i,e,t))))}return n}function CA(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function AA(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=>ty(c,e,t,s.length+1))))}}return n}function ty(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 EA(e,t){return e?t?[{label:"Task",value:t.id},{label:"Repo",value:e.name},{label:"Agent",value:k.runners.getDisplayName(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:Ds.basename(t.worktreePath)}]:[{label:"Repo",value:e.name},{label:"Branch",value:e.defaultBranch},{label:"Task",value:"none",mutedValue:!0}]:[{label:"Repo",value:"none",mutedValue:!0}]}function OA(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0})}function $A(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function ny(e,t,n,r,s=null){if(s)return NA(e,t,n,r,s);let i=ld(e,t,{centerOnly:r});return DA(n,i)?{output:$o(i.rows,n.rows,i.row,i.column),region:i}:null}function NA(e,t,n,r,s){let i=Mh(e,t,s,{centerOnly:r});if(!i||!xA(n,i))return null;let o=n.rows.slice();return{output:i.rows.map(({index:l,row:c})=>o[l]===c?"":(o[l]=c,`\x1B[${i.row+l};${i.column}H${c}`)).join(""),region:{row:i.row,column:i.column,width:i.width,rows:o}}}function DA(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function xA(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function ry(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!_A(o,a))return null;!o||!a||(s+=$o(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function _A(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 FA=["tasks","center","inspector"];function LA(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 Ud(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return Bd({...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 Bd(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return Ph(t)?E({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):E({state:e});if(e.fileSearchQuery!==null)return LA(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"&&(ko(e.selectedLeftItemId)||To(e.selectedLeftItemId)))return E({state:{...e,selectedRunner:wo(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return sy(e,1);if(t==="SHIFT_TAB"||t==="[")return sy(e,-1);if(t==="z"||t==="Z")return E({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===K?pn(e,-1,n):Ud(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===K?pn(e,1,n):Ud(e,1,n);if(t==="PAGE_UP")return pn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return pn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return pn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return pn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??J,s=e.centerTabRunner?r.indexOf(e.centerTabRunner):-1,i=s===r.length-1?null:r[s+1];return E({state:{...e,centerTabRunner:i,actionMessage:null},changed:!0})}if((t==="+"||t==="a"||t==="A"||t==="t"||t==="T")&&e.focusedRegion==="center"&&e.selectedTaskId){let r=KA(e,t);return E({state:{...e,preferredPtyTabKind:r,actionMessage:null},changed:!0,createPtyTab:!0,createPtyTabKind:r,createPtyTabRunner:r==="agent"?e.centerTabRunner:null})}if(t==="R"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0});if(t==="o"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review"&&e.selectedTaskId)return E({state:e,openPrUrl:!0});if(t==="X"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&vs(e.selectedLeftItemId)&&e.selectedTaskId)return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Eh(e.selectedLeftItemId)&&e.selectedWorkspaceId)return E({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&ay(e.activeTab,n.ptyTabIds??[]))return E({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return qd(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return iy(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return qd(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return iy(e,1)}if(at(t)){if(e.focusedRegion==="tasks"&&(ko(e.selectedLeftItemId)||To(e.selectedLeftItemId))){let r=td(e.selectedLeftItemId),s=nd(e.selectedLeftItemId);return E({state:{...e,selectedRepoId:r??e.selectedRepoId,selectedWorkspaceId:s??e.selectedWorkspaceId,actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0})}if(e.focusedRegion==="tasks"&&e.selectedLeftItemId==="new-workspace")return E({state:{...e,actionMessage:null},changed:!0,openWorkspaceBrowser:!0});if(e.focusedRegion==="tasks"&&vs(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return E({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:Rr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&ay(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return E({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:Rr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===K)return E({state:{...e,actionMessage:null},changed:!0,refreshInspection:!0});if(e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="files"){let r=e.selectedFileTreePath??e.selectedFilePath;if(r&&(n.fileTreeDirectoryIds??[]).includes(r))return E({state:qA({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return E({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:K,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}if(e.focusedRegion==="inspector"&&e.inspectionMode==="review"){let r=e.selectedDiffPath??n.diffPathIds?.[0]??null;return r?E({state:{...e,selectedDiffPath:r,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!n.projectTargetIds?.length?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?E({state:e}):e.selectedActionId==="refresh-checks"?E({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return E({state:e})}function pn(e,t,n){if(t===0)return E({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?ly(e,t,n):e.inspectionMode==="review"?oy(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):E({state:e});if(e.focusedRegion==="center"&&e.activeTab===K){if(e.openInspectionKind==="file")return oy(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return UA(e,t,n)}return E({state:e})}function sy(e,t){return Uo(e,"focusedRegion",FA,t)}function qd(e,t,n){let r=Uo(e,"activeTab",n&&n.length>0?n:GA(e),t);return!r.changed||vh(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:Rr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function Ud(e,t,n){if(e.focusedRegion==="tasks")return MA(e,t,n.leftItemIds);if(e.focusedRegion==="center")return qd(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return ly(e,t,n);if(n.projectTargetIds?.length){let s=Wd(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=Wd(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:Uo(e,"selectedActionId",kh,t)}return Uo(e,"selectedActionId",Xc,t)}function MA(e,t,n){let r=Wd(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=ed(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=td(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=nd(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function jA(e,t){if(e.inspectionMode===t)return E({state:e});let n=t==="files"?"file":e.openInspectionKind,r=t==="files"?K:e.activeTab;return E({state:{...e,inspectionMode:t,activeTab:r,openInspectionKind:n,fileScrollOffset:t==="files"?0:e.fileScrollOffset,reviewScrollOffset:t==="review"?0:e.reviewScrollOffset,actionMessage:null},changed:!0,refreshInspection:!0})}function iy(e,t){return jA(e,VA(e.inspectionMode,Qc,t))}function ly(e,t,n){let r=n.fileTreeRowIds&&n.fileTreeRowIds.length>0?n.fileTreeRowIds:n.filePathIds??[];if(r.length===0)return E({state:e});let s=e.selectedFileTreePath??e.selectedFilePath??r[0]??null,i=r.indexOf(s??""),o=Ft(i===-1?0:i+t,0,r.length-1),a=r[o]??null;if(a===e.selectedFileTreePath)return E({state:e});let l=a!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(a);return E({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?K:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function qA(e){if(!e.selectedFileTreePath)return e;let t=new Set(e.collapsedFileTreePaths);return t.has(e.selectedFileTreePath)?t.delete(e.selectedFileTreePath):t.add(e.selectedFileTreePath),{...e,collapsedFileTreePaths:[...t].sort((n,r)=>n.localeCompare(r)),actionMessage:null}}function oy(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=Ft(e[t]+n,0,i);return o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function UA(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return WA(e,t,n);let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=e.diffScrollOffset+t,a=n.diffPathIds??[];if(a.length===0||!e.selectedDiffPath){let u=Ft(o,0,i);return u===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:u,actionMessage:null},changed:!0})}let l=a.indexOf(e.selectedDiffPath);if(l===-1){let u=Ft(o,0,i);return u===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:u,actionMessage:null},changed:!0})}if(t>0&&o>i){let u=a[l+1]??null;return u?E({state:{...e,selectedDiffPath:u,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===i?E({state:e}):E({state:{...e,diffScrollOffset:i,actionMessage:null},changed:!0})}if(t<0&&o<0){let u=a[l-1]??null;return u?E({state:{...e,selectedDiffPath:u,activeTab:K,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?E({state:e}):E({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let c=Ft(o,0,i);return c===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function WA(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=Ft(e.diffScrollOffset+t,0,i),a=BA(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 BA(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function Uo(e,t,n,r){let s=n.indexOf(e[t]),i=Ft(s+r,0,n.length-1),o=n[i];return!o||o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function Wd(e,t,n,r,s=!1){if(n.length===0)return E({state:e});let i=n.indexOf(e[t]??n[0]??""),o=Ft(i===-1?0:i+r,0,n.length-1),a=n[o]??null;return a===e[t]?E({state:e}):E({state:{...e,[t]:a,actionMessage:null},changed:!0,refreshInspection:s})}function VA(e,t,n){let r=t.indexOf(e);return t[Ft(r+n,0,t.length-1)]??e}function E(e){return{state:e.state,changed:e.changed??!1,exit:e.exit??!1,pause:e.pause??!1,attachTerminal:e.attachTerminal??!1,detachTerminal:e.detachTerminal??!1,beginTaskPrompt:e.beginTaskPrompt??!1,openWorkspaceBrowser:e.openWorkspaceBrowser??!1,createWorkspaceTask:e.createWorkspaceTask??!1,createPtyTab:e.createPtyTab??!1,createPtyTabKind:e.createPtyTabKind??null,createPtyTabRunner:e.createPtyTabRunner??null,closePtyTab:e.closePtyTab??!1,refreshPullRequestChecks:e.refreshPullRequestChecks??!1,closeTask:e.closeTask??!1,removeWorkspace:e.removeWorkspace??!1,refreshInspection:e.refreshInspection??!1,openPrUrl:e.openPrUrl??!1}}function ay(e,t){return t.includes(e)}function KA(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Rr(e.activeTab)??e.preferredPtyTabKind}function GA(e){return[e.selectedPtyTabId,e.openInspectionKind?K:null].filter(t=>typeof t=="string")}function Ft(e,t,n){return Math.min(n,Math.max(t,e))}var cy=async(e,t,n,r)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await r.queueTaskMutation(async()=>W(r.paths,e.selectedTaskId,i=>{let o=t??HA(i,e.activeTab,e.preferredPtyTabKind),a=fy(i,o,n??void 0,r.config);return{...i,ptyTabs:[...i.ptyTabs,a],selectedPtyTabId:a.id}}));return{updatedTask:s,nextShell:{activeTab:s.selectedPtyTabId??e.activeTab,selectedPtyTabId:s.selectedPtyTabId,preferredPtyTabKind:s.ptyTabs.at(-1)?.kind??e.preferredPtyTabKind,focusedRegion:"center",actionMessage:`Created tab: ${s.ptyTabs.at(-1)?.title??"tab"}`}}},dy=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing a tab.");let{closedTab:n,nextSelectedTab:r}=await t.queueTaskMutation(async()=>{let s={closedTab:null,nextSelectedTab:null};if(await W(t.paths,e.selectedTaskId,i=>{let o=i.ptyTabs.findIndex(l=>l.id===e.activeTab);if(o===-1)throw new Error("Only PTY tabs can be closed.");s.closedTab=i.ptyTabs[o];let a=i.ptyTabs.filter(l=>l.id!==s.closedTab.id);return s.nextSelectedTab=a[Math.min(o,a.length-1)]??null,{...i,ptyTabs:a,selectedPtyTabId:s.nextSelectedTab?.id??null}}),!s.closedTab)throw new Error("Only PTY tabs can be closed.");return{closedTab:s.closedTab,nextSelectedTab:s.nextSelectedTab}});return{closedTab:n,nextSelectedTab:r,nextShell:{activeTab:r?.id??(e.openInspectionKind?"inspection":e.activeTab),selectedPtyTabId:r?.id??null,focusedRegion:"center",actionMessage:`Closed tab: ${n.title}`}}},uy=async(e,t)=>{let n=e.selectedTaskId;n&&await t.queueTaskMutation(async()=>{await W(t.paths,n,r=>!r.ptyTabs.some(s=>s.id===e.activeTab)||r.selectedPtyTabId===e.activeTab?r:{...r,selectedPtyTabId:e.activeTab})})},py=async(e,t)=>{let n=e.ptyTabs.find(s=>s.kind==="agent")??null;if(n)return await t.queueTaskMutation(async()=>{await W(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:s})}),{...e,selectedPtyTabId:n.id};let r=fy(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await W(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:{...s,ptyTabs:[...s.ptyTabs,r],selectedPtyTabId:r.id}})}),{...e,ptyTabs:[...e.ptyTabs,r],selectedPtyTabId:r.id}};function HA(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function fy(e,t,n,r={}){let s=n??e.runner,i=k.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(h=>h.id)),c=1,u=a;for(;l.has(u);)c+=1,u=`${a}-${c}`;let d=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:u,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,r):[],createdAt:d,updatedAt:d}}var vr=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},my=async(e,t,n,r,s)=>{k.runners.assertEnabled(r,s.config);let i=t?await s.taskService.provisionProjectTask(s.paths,t,n,{runner:r,config:s.config}):await s.taskService.provisionTask(s.paths,e??"",n,{runner:r,config:s.config});k.previews.isEnabled(s.config,"agentOrchestration")&&await Xe(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=bn();Rn(k.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",u=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new vr(c,u)}let o=await s.taskService.markTaskStarted(s.paths,i.task.id),a={selectedRepoId:o.repoId,selectedWorkspaceId:o.workspaceId,selectedTaskId:o.id,selectedPtyTabId:o.selectedPtyTabId,inputMode:"control",focusedRegion:"center",activeTab:o.selectedPtyTabId??"agent",selectedActionId:"commit"};return{task:o,nextShell:a}},hy=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},gy=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing it.");let{taskBeforeClose:n,task:r}=await t.queueTaskMutation(async()=>{let s=await Nr(t.paths,e.selectedTaskId),i=await t.taskService.closeTask(t.paths,e.selectedTaskId);return{taskBeforeClose:s,task:i}});return{closedTabIds:n.ptyTabs.map(s=>s.id),nextShell:{selectedActionId:"close-task",actionMessage:r.cleanup.preservedWorktree?`Archived task ${r.id}; worktree preserved`:`Archived task ${r.id}`}}},yy=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Nr(t.paths,n.id)))),xs=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await we.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var wy=async(e,t)=>{if(!e.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");if((await t.taskService.listTasks(t.paths,{workspaceId:e.selectedWorkspaceId,includeClosed:!0})).tasks.length>0)throw new Error(`Cannot remove workspace ${e.selectedWorkspaceId} while task records still reference it.`);return await t.workspaceService.archiveWorkspace(t.paths,e.selectedWorkspaceId),{nextShell:{selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:`Removed workspace ${(await t.workspaceService.removeWorkspace(t.paths,e.selectedWorkspaceId,{listTasks:t.taskService.listTasks})).workspaceId}`}}};var ky=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},Ty=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},by=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var YA=250;function Lt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function jn(e,t){return _t(t,e.ptyRuntime.getViewState(Cr(e,t)))}function Cr(e,t){let n=Lt(e.model.tasks,t);return n?n.ptyTabs.some(r=>r.id===t.activeTab)?t.activeTab:t.activeTab==="agent"||t.activeTab==="terminal"?n.ptyTabs.find(r=>r.kind===t.activeTab)?.id??t.selectedPtyTabId:t.selectedPtyTabId:t.selectedPtyTabId}function I(e,t){return jn(e,Oh(t,e.model))}function Ry(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 Sy(e,t,n){return Ry(e,t,n?{tone:"success",message:n}:null)}function se(e,t,n){return Ry(e,t,{tone:"error",message:n})}function ie(e,t,n,r){let s=n instanceof Error?n.message:r,i=n instanceof Error?n.stack??n.message:String(n);return we.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function ee(e,t){if(!e.uiStateFile)return;e.runtimeState=Rh(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>jt({uiStateFile:e.uiStateFile},n),()=>jt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function zA(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:ke,queueTaskMutation:t=>zA(e,t)}}function Vd(e,t){let n=Lt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?jd(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:Ln(e.model),centerTabIds:Ah(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:Qg(t,n,s),pageRows:Math.max(5,Me(e.activeTerminal.width,e.activeTerminal.height).height-Z.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:n?.repoTargets?.map(a=>a.repoId)??[]}}async function Py(e,t){await uy(t,oe(e))}async function Ie(e){e.model=await Sr(e.workspaceRoot,e.state.shell,e.enabledRunnerIds),e.state.mode==="main"?e.state={mode:"main",shell:I(e,e.state.shell)}:e.state={...e.state,shell:I(e,e.state.shell)}}function Ar(e,t){e.model={...e.model,tasks:[...e.model.tasks.filter(n=>n.id!==t.id),t].sort((n,r)=>n.id.localeCompare(r.id))}}async function Wo(e,t){let n=++e.inspectionRefreshSequence,r=rd(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 Sr(e.workspaceRoot,t,e.enabledRunnerIds),n!==e.inspectionRefreshSequence)return;e.model=o,e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,e.state.shell)},ee(e,e.state.shell),e.render())}function Iy(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)&&Wo(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()})},YA))}function vy(e,t){t!==0&&(e.pendingInspectionScrollLines+=t,!e.inspectionScrollRenderTimer&&(e.inspectionScrollRenderTimer=setTimeout(()=>{e.inspectionScrollRenderTimer=null;let n=e.pendingInspectionScrollLines;if(e.pendingInspectionScrollLines=0,n===0||e.state.mode!=="main"||e.state.shell.inputMode!=="control")return;let r=pn(e.state.shell,n,Vd(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render(),Wo(e,e.state.shell).catch(s=>{let i=ie(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render()}},16)))}function Kd(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function Gd(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 Ay(e){Gd(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.render())})}async function Ey(e,t){let n=I(e,t),r=Lt(e.model.tasks,n),s=Cr(e,n);if(!r||!s||!r.ptyTabs.some(a=>a.id===s))return n;let i=e.ptyRuntime.getViewState(s);if(i.status!=="idle"||i.rows.length>0||i.error)return _t(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,cn(Me(e.activeTerminal.width,e.activeTerminal.height)));return _t({...n,inputMode:"control"},o)}function Hd(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 Yd(e,t){try{let n=I(e,t),r=Lt(e.model.tasks,n),s=n.selectedPtyTabId;if(r&&n.focusedRegion==="tasks"){let a=r.ptyTabs.find(l=>l.kind==="agent")??null;a?s=a.id:(r=await Cy(e,r),await Ie(e),s=r.selectedPtyTabId)}r&&!s&&(r=await Cy(e,r),await Ie(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:_t({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},ee(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,cn(Me(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=dn(s),e.lastTerminalKey=null,e.state={mode:"main",shell:_t({...i,inputMode:"terminal"},o)},ee(e,e.state.shell)}catch(n){let r=ie(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&dn(t.selectedPtyTabId)&&(await JA(e,t.selectedTaskId,r).catch(()=>{}),await Ie(e).catch(()=>{})),e.state={mode:"main",shell:se(e,Sh(I(e,t),r),r)},ee(e,e.state.shell)}e.render()}async function JA(e,t,n){await hy(t,n,oe(e))}async function Oy(e,t,n,r){let s=I(e,t),{nextShell:i}=await cy(s,n,r,oe(e));return await Ie(e),I(e,{...s,...i})}async function $y(e,t){let n=I(e,t),{closedTab:r,nextShell:s}=await dy(n,oe(e));return e.ptyRuntime.disposeSession(r.id),await Ie(e),I(e,{...n,...s})}async function Ny(e,t){let n=I(e,t),r=Ln(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await gy(n,oe(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Ie(e),I(e,{...n,...o,selectedLeftItemId:XA(r,Ln(e.model),s)})}async function Dy(e,t){let n=I(e,t),{nextShell:r}=await wy(n,oe(e));return await Ie(e),I(e,{...n,...r})}async function Cy(e,t){return py(t,oe(e))}function Bo(e,t){e.pendingScrollLines+=t,!e.scrollRenderTimer&&(e.scrollRenderTimer=setTimeout(()=>{e.scrollRenderTimer=null;let n=e.pendingScrollLines;e.pendingScrollLines=0,n!==0&&(e.ptyRuntime.scrollViewport(n),e.state={mode:"main",shell:jn(e,e.state.shell)},e.render())},16))}function XA(e,t,n){if(t.length===0)return null;for(let r=n-1;r>=0;r-=1){let s=e[r];if(s&&t.includes(s))return s}return t[Math.min(Math.max(0,n),t.length-1)]??null}async function _y(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=xy(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await yy(s,oe(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)Ar(e,o);t.recordSuccess(i,xy(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,xs("background PR polling",i,oe(e)))}}function xy(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function Fy(e,t){let n=I(e,t),r=Lt(e.model.tasks,n),s=null,i=null;if(r?.type==="project"&&r.repoTargets?.length){let o=await S.prs.discoverOrRefreshAll(e.paths,n.selectedTaskId);await Ie(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 Ie(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${V(a)?.requiredChecks.length??0} reported`)}return I(e,{...Sy(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import nE from"node:path";import{readdir as QA,stat as ZA}from"node:fs/promises";import Ly from"node:path";async function eE(e){let t=await QA(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=Ly.join(e,r.name);n.push({name:r.name,path:s,kind:await tE(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 My(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function jy(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 Vo(e,t){let n=await eE(t);e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,{...e.state.shell,workspaceBrowser:n,activeTab:e.state.shell.selectedPtyTabId??e.state.shell.activeTab,actionMessage:null})},e.render())}async function tE(e){let t=Ly.join(e,".git");return await ZA(t).catch(()=>null)!==null}function qy(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function Uy(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function rE(e){if(e.state.mode!=="main"||e.creatingTask)return;let t=e.state.shell,n=t.taskPromptInput?.trim()??"";if(!t.selectedRepoId&&!t.selectedWorkspaceId){e.state={mode:"main",shell:I(e,{...t,taskPromptError:"Select a workspace first."})},e.render();return}if(n.length===0){e.state={mode:"main",shell:I(e,{...t,taskPromptError:"Task prompt cannot be empty."})},e.render();return}e.creatingTask=!0,e.state={mode:"main",shell:I(e,{...t,actionMessage:`Creating ${t.selectedRunner} task in ${t.selectedWorkspaceId??t.selectedRepoId}...`})},e.render();let r=null;try{let s=await my(t.selectedRepoId,t.selectedWorkspaceId,n,t.selectedRunner,oe(e));r=s.task,Ar(e,r);let i=I(e,{...e.state.shell,...s.nextShell,selectedLeftItemId:`task:${r.id}`,inputMode:"terminal",taskPromptInput:null,taskPromptError:null,actionMessage:null}),o=await e.ptyRuntime.ensureSession(r.id,i.selectedPtyTabId??Yh(r,"agent"),cn(Me(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=dn(i.selectedPtyTabId),e.state={mode:"main",shell:_t(i,o)},ee(e,e.state.shell)}catch(s){s instanceof vr&&(r=s.task);let i=ie(e,"create task",s,"Failed to create task.");r&&!(s instanceof vr)?(await W(e.paths,r.id,o=>({...o,status:"draft",runnerSession:{...o.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:i})).catch(()=>{}),await Ie(e).catch(()=>{})):r&&(await W(e.paths,r.id,o=>({...o,lastFailureReason:i})).catch(()=>{}),await Ie(e).catch(()=>{})),e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,inputMode:"control",selectedTaskId:r?.id??e.state.shell.selectedTaskId,selectedPtyTabId:r?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:r?`task:${r.id}`:e.state.shell.selectedLeftItemId,activeTab:r?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:r?null:"",taskPromptError:i,actionMessage:null}),i)}}finally{e.creatingTask=!1,e.render()}}function sE(e,t){if(e.state.mode!=="main")return;let n=e.state.shell;if(n.taskPromptInput!==null){if(t==="ESCAPE"){e.state={mode:"main",shell:I(e,{...n,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(at(t)){rE(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:wo(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}Ih(t)&&(e.state={mode:"main",shell:I(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function iE(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=My(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"){Vo(e,nE.dirname(n.cwd)).catch(s=>{let i=ie(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:i}}),i)},e.render()});return}if(t==="RIGHT"||t==="l"||at(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){Vo(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 Ie(e);let a=o.repos[0]??null,l=I(e,{...e.state.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${o.workspace.id}`,selectedWorkspaceId:o.workspace.id,selectedRepoId:a?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${o.workspace.name??o.workspace.id}`});e.state={mode:"main",shell:l},ee(e,e.state.shell),e.render()}).catch(o=>{let a=ie(e,"add workspace",o,"Failed to add workspace.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()})}}function oE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=$g(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;aE(e,r)}}}async function aE(e,t){let n;try{n=await we.readLog(e.paths)}catch(r){let s=ie(e,"open logs",r,"Failed to read Craig logs.");n={path:e.paths.logFile,lines:[`Unable to read logs: ${s}`],empty:!1}}e.state.mode==="overlay"&&(e.state={mode:"overlay",variant:"logs",menuIndex:0,optionsMessage:null,shell:e.state.shell,log:n,...t!==void 0?{parentVariant:t}:{}},e.pendingClear=!0,e.render())}function lE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=Dg(qy(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"?ky(n.runner,n.enabled,oe(e)):Ty(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:{...qy(e),message:i}},e.render()})}function cE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=Ng(Uy(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}by(n.feature,n.enabled,oe(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,n.feature==="agentActivityIndicators"&&e.setAgentActivityEnabled(n.enabled),e.state={...e.state,previewOptions:n.state},e.render())}).catch(r=>{if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let s=ie(e,"save feature preview",r,"Failed to save feature preview.");e.state={...e.state,shell:se(e,I(e,e.state.shell),s),previewOptions:{...Uy(e),message:s}},e.render()})}}function Wy(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){sE(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){iE(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){uE(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=Bd(e.state.shell,n,Vd(e,e.state.shell));if(r.exit){e.exit(0);return}if(r.detachTerminal){e.ptyRuntime.detach(),e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render();return}if(e.state.shell.inputMode==="terminal"){if(r.changed){e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&at(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Es(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(dE(e,n))return;e.lastTerminalKey=zh(n)?{key:n,at:Date.now()}:null;let i=Jh(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){Bo(e,i);return}e.ptyRuntime.writeKey(n);return}if(n==="CTRL_C"){e.exit(0);return}if(n==="?"&&e.state.shell.inputMode==="control"){e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render();return}if(r.pause){e.state={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:I(e,r.state)},e.pendingClear=!0,e.render();return}if(r.beginTaskPrompt){e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){Vo(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){Oy(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{Yd(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){$y(e,r.state).then(s=>{e.state={mode:"main",shell:s},ee(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"close PTY tab",s,"Failed to close tab.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.refreshPullRequestChecks){Fy(e,r.state).then(s=>{e.state={mode:"main",shell:s},ee(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"refresh PR checks",s,"Failed to refresh PR checks.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.openPrUrl){let s=Lt(e.model.tasks,r.state),i=s?V(s)?.url??null:null;i?jy(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){Ny(e,r.state).then(s=>{e.state={mode:"main",shell:s},ee(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"close task",s,"Failed to close task.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.removeWorkspace){Dy(e,r.state).then(s=>{e.state={mode:"main",shell:s},ee(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"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){Yd(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){Iy(e,e.state.shell);return}Wo(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)},Py(e,e.state.shell).catch(()=>{}),ee(e,e.state.shell),e.render());return}if(e.state.variant==="help"){e.state.viaOptions&&e.state.parentVariant?e.state={mode:"overlay",variant:"options",menuIndex:3,optionsMessage:null,shell:e.state.shell,parentVariant:e.state.parentVariant}:e.state.parentVariant?e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell}:e.state={mode:"main",shell:I(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){oE(e,n);return}if(e.state.variant==="runners"){lE(e,n);return}if(e.state.variant==="previews"){cE(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||at(n)){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:2,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render()}return}if(e.state.optionsMessage){(n==="ESCAPE"||at(n))&&(e.state={...e.state,optionsMessage:null},e.render());return}if(n==="UP"||n==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(n==="DOWN"||n==="j"){e.state={...e.state,menuIndex:Math.min(2,e.state.menuIndex+1)},e.render();return}if(n==="ESCAPE"){e.state.variant==="pause"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.pendingClear=!0,e.render());return}if(at(n)){if(e.state.menuIndex===0){let r=e.state.variant==="boot";e.state={mode:"main",shell:I(e,{...e.state.shell,inputMode:"control"})},e.pendingClear=!0,e.render(),r?e.bootHydrationReady.then(()=>{if(e.state.mode!=="main")return;let s=e.state.shell;Ey(e,s).then(i=>{e.state.mode!=="main"||e.state.shell!==s||(e.state={mode:"main",shell:i},ee(e,e.state.shell),e.render())}).catch(i=>{if(e.state.mode!=="main"||e.state.shell!==s)return;let o=ie(e,"warm selected PTY",i,"Failed to start selected PTY.");e.state={mode:"main",shell:se(e,I(e,e.state.shell),o)},ee(e,e.state.shell),e.render()})}):Ay(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 By(e,t){let n=tg(t);if(e.state.mode!=="main"||e.state.shell.inputMode!=="terminal"||n.length===0)return;if(e.pendingTerminalKeySequence){let i=`${e.pendingTerminalKeySequence.raw}${n}`,o=Es(i);if(o){Ky(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(hd(i)){e.pendingTerminalKeySequence.raw=i,Vy(e);return}Ko(e)}if(n.includes("")){e.ptyRuntime.detach(),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey=null,e.state={mode:"main",shell:I(e,{...e.state.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},ee(e,e.state.shell),e.render();return}let r=Xh(n);if(r!==0){Bo(e,r);return}let s=Es(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
277
+ `);if(c===-1)return;let u=i.slice(0,c);a(),s.end();try{n(JSON.parse(u))}catch(d){r(d instanceof Error?d:new Error(String(d)))}}),s.once("close",()=>a())})}function Ch(e){return new Promise((t,n)=>{let r=yh(e);r.once("connect",()=>t(r)),r.once("error",n)})}function JC(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)}
278
+ `)}catch{}}function XC(e){try{return process.kill(e,0),!0}catch{return!1}}function Ah(e){return new Promise(t=>setTimeout(t,e))}function QC(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var Od=["Runners","Feature Previews","Logs","Help"],Oh={agentActivityIndicators:"Agent activity indicators",agentOrchestration:"Agent orchestration"};function $d(e,t){return J.map(n=>{let r=k.runners.getProfile(n),s=e.runners?.[n]?.enabled!==!1,i=e.runners?.[n]?.path?.trim(),o=t.pathEdit?.runner===n?`${t.pathEdit.value}_`:i&&i.length>0?i:`default (${r.executable})`;return`${r.displayName} ${s?"enabled":"disabled"} ${o}`})}function $h(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 Dh(e){return Je.map(t=>`${k.previews.isEnabled(e,t)?"[x]":"[ ]"} ${Oh[t]}`)}function Nh(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function xh(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(Od.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:Lo(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"logs"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function _h(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(Je.length-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(!Lo(n))return{kind:"noop",state:e};let r=Je[e.menuIndex]??Je[0],s=!k.previews.isEnabled(t,r);return{kind:"save-enabled",feature:r,enabled:s,state:{...e,message:`${Oh[r]} ${s?"enabled":"disabled"}.`}}}function Fh(e,t,n,r){if(e.pathEdit)return ZC({...e,pathEdit:e.pathEdit},t,n);let s=$d(t,e).length;if(n==="UP"||n==="k")return{kind:"render",state:{...e,menuIndex:Math.max(0,e.menuIndex-1),message:null}};if(n==="DOWN"||n==="j")return{kind:"render",state:{...e,menuIndex:Math.min(s-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(n==="e"){let a=J[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:a,value:t.runners?.[a]?.path??""}}}}if(!Lo(n))return{kind:"noop",state:e};let i=J[e.menuIndex]??"codex",o=t.runners?.[i]?.enabled!==!1;return o&&r.length<=1?{kind:"render",state:{...e,message:"At least one runner must stay enabled."}}:{kind:"save-enabled",runner:i,enabled:!o,state:{...e,message:`${k.runners.getProfile(i).displayName} ${o?"disabled":"enabled"}.`}}}function ZC(e,t,n){if(n==="ESCAPE")return{kind:"render",state:Eh({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(Lo(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:r,path:s.length>0?s:null,state:Eh({...e,message:s.length>0?`${k.runners.getProfile(r).displayName} executable saved.`:`${k.runners.getProfile(r).displayName} executable reset to default.`})}}return eA(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function Eh(e){let t={...e};return delete t.pathEdit,t}function Lo(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
279
+ `}function eA(e){return e.length===1&&e>=" "&&e!==""}import Ns from"node:path";function Lh(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 Mh="\u{F024B} ",jh="\u{F0DCF} ",qh="\u25CB",Dd="\uEA64",Uh="\uEAFE",Wh="\uEBDA",Nd="\u25CB",xd="\u25CF",_d="\u2713",Fd="\u2715";function Bh(e){switch(e.toLowerCase().split(".").pop()??""){case"ts":case"tsx":return"4fc1ff";case"js":case"jsx":case"mjs":case"cjs":return"f7df1e";case"json":case"jsonc":return"fbc02d";case"md":case"mdx":return"519aba";case"yaml":case"yml":return"e06c75";case"sh":case"bash":case"zsh":return"89e051";case"css":case"scss":case"sass":return"c792ea";case"html":case"htm":return"e06c75";case"py":return"3572a5";case"go":return"00add8";case"rs":return"dea584";case"lock":return"565f89";default:return}}var Mo=150,Vh=6;var qo="empty",pe={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function Yh(e,t,n){let r=rA(t,e),s=t.repos.find(y=>y.id===e.selectedRepoId)??t.repos[0]??null,i=r?t.tasks.filter(y=>y.workspaceId===r.id):t.tasks,o=r?.kind==="project"?i:s?i.filter(y=>y.repoId===s.id):[],a=o.find(y=>y.id===e.selectedTaskId)??o[0]??null,l=a?.type==="project",c=LA(t.tasks),u=oA(e,a),d=iA(e,a,u,n),p=d.find(y=>y.id===u)??d[0]??{id:"agent",label:"CODEX"},m=t.inspection?.taskId===a?.id?t.inspection:null,g=s?.name??"no repo",f=a?k.runners.getDisplayName(a.runner):k.runners.getDisplayName(e.selectedRunner);return{inputMode:e.inputMode,modalInput:e.taskPromptInput!==null||e.workspaceBrowser!==null,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,footerToast:e.footerToast,terminal:e.terminal,footerText:e.workspaceBrowser!==null?e.workspaceBrowser.query!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} Search: ${e.workspaceBrowser.query} \u2191\u2193 move Enter select Esc clear search`:`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up / search Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK ${s?`[${s.name}]`:"[no repo]"} \xB7 ${k.runners.getDisplayName(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${k.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:vs(e.selectedLeftItemId)?"n new task Enter attach X close task Esc pause ? help":e.selectedLeftItemId?.startsWith("workspace:")?"n new task Enter select X remove workspace Esc pause ? help":"n new task Enter select Esc pause ? help":e.focusedRegion==="center"?a===null?"n new task Tab tasks Esc pause ? help":u===K?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${k.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:Ns.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${Ns.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:f},leftTree:tA(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>MA(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:g,agent:f},centerTranscript:sA(u,e,s,a,e.workspaceBrowser,m,r),tabs:d,rightContext:FA(s,a),rightInspection:kA(e,a,m)}}function tA(e,t,n){let r=[{text:"WORKSPACES",muted:!0,panelHeader:!0,focused:e.focusedRegion==="tasks"}];if((t.furyApprovalCount??0)>0&&r.push({text:`\u25CF ${t.furyApprovalCount} Fury approval${t.furyApprovalCount===1?"":"s"} waiting`,indent:1,status:"pending"}),!t.workspaces)return nA(r,e,t.repos,t.tasks,n);let s=t.workspaces;if(s.length===0)r.push({text:"No workspaces registered.",indent:2,muted:!0});else for(let o of s){let a=e.selectedLeftItemId===`workspace:${o.id}`;r.push({id:`workspace:${o.id}`,text:`${o.kind==="project"?"\u2261":"\u2013"} ${o.name??o.id}`,selected:a,focused:a&&e.focusedRegion==="tasks"});let l=o.kind==="project"?o.discoveredRepoIds??[]:[o.primaryRepoId],c=t.tasks.filter(u=>u.workspaceId===o.id);if(c.length===0)r.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:u,visualDepth:d}of Ps(c)){let p=e.selectedLeftItemId===`task:${u.id}`,m=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,g={id:`task:${u.id}`,taskId:u.id,text:n?m:`${p?"\u25B8":"\u2022"} ${m}`,indent:d===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:tr(u,n.snapshots,n.now),activityAnimationFrame:n.animationFrame}:{}},f=Jh(u);f&&(g.prBadge=f),r.push(g)}if(o.kind==="project"){let u=`new-task-workspace:${o.id}`,d=e.selectedLeftItemId===u;r.push({id:u,text:`+ New Project Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:d,focused:d&&e.focusedRegion==="tasks",muted:!d})}if(o.kind==="repo"){let u=`new-task:${o.primaryRepoId}`,d=e.selectedLeftItemId===u;r.push({id:u,text:`+ New Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:d,focused:d&&e.focusedRegion==="tasks",muted:!d})}else{r.push({text:` Repos (${l.length})`,indent:0,muted:!0});for(let u of l.slice(0,6)){let d=t.repos.find(p=>p.id===u);r.push({text:` \xB7 ${d?.name??u}`,indent:0,muted:!0})}l.length>6&&r.push({text:` \xB7 ${l.length-6} more`,indent:0,muted:!0})}}let i=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&e.focusedRegion==="tasks"}),r}function nA(e,t,n,r,s){if(n.length===0)e.push({text:"No repos registered.",indent:2,muted:!0});else for(let o of n){let a=t.selectedLeftItemId===`repo:${o.id}`;e.push({id:`repo:${o.id}`,text:`\u2013 ${o.name}`,selected:a,focused:a&&t.focusedRegion==="tasks"});let l=r.filter(d=>d.repoId===o.id);if(l.length===0)e.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:d,visualDepth:p}of Ps(l)){let m=t.selectedLeftItemId===`task:${d.id}`,g=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,f={id:`task:${d.id}`,taskId:d.id,text:s?g:`${m?"\u25B8":"\u2022"} ${g}`,indent:p===0?2:4,selected:m,focused:m&&t.focusedRegion==="tasks",...s?{activity:tr(d,s.snapshots,s.now),activityAnimationFrame:s.animationFrame}:{}},y=Jh(d);y&&(f.prBadge=y),e.push(f)}let c=`new-task:${o.id}`,u=t.selectedLeftItemId===c;e.push({id:c,text:`+ New Task [${k.runners.getDisplayName(t.selectedRunner)}]`,indent:2,selected:u,focused:u&&t.focusedRegion==="tasks",muted:!u})}let i=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&t.focusedRegion==="tasks"}),e}function rA(e,t){let n=e.workspaces??[];if(!e.workspaces)return null;let r=e.tasks.find(s=>s.id===t.selectedTaskId)??null;return r?n.find(s=>s.id===r.workspaceId)??null:t.selectedWorkspaceId?n.find(s=>s.id===t.selectedWorkspaceId)??null:n[0]??null}function sA(e,t,n,r,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(d=>d.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((d,p)=>{let m=p===s.selectedIndex?"\u25B8":" ",g=d.kind==="repo"?" [git repo]":"/";return`${m} ${d.name}${g}`}),u=s.query!==null?`Search: ${s.query}\u2588`:"";return ct(["Browse for a workspace to register.",s.cwd,...u?[u]:[],"",...c,"",s.error??"Use \u2191\u2193 to move, \u2192 or Enter to open, \u2190 to go up, Enter on a git repo to add it."])}if(!n)return ct(["No repos registered yet.","","Run `craig repo add <path>` in command mode, then reopen the shell."]);if(!r){let l=o?.kind==="project",c=l?o.name??"this workspace":n.name,u=l?"Project Task":"Task";return ct([`No tasks in ${c}.`,"",`Press n or choose + New ${u} to create one with ${k.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?ct([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this PTY-backed agent session.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):ct([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this plain task shell.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):e===K&&t.openInspectionKind==="file"?cA(r,i,t.fileScrollOffset):e===K&&t.openInspectionKind==="diff"?dA(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?ct(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):ct(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function iA(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:aA(o),...o.kind==="agent"&&r&&t?{activity:Gt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame}:{}}))??[];if(!t)return[{id:qo,label:"EMPTY",active:n===qo,focused:e.focusedRegion==="center"&&n===qo}];let i=e.openInspectionKind||n===K?[{id:K,label:lA(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function oA(e,t){return t?t.ptyTabs.some(n=>n.id===e.activeTab)||e.activeTab===K&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??K:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??K:qo}function aA(e){return e.title.toUpperCase()}function lA(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?Ns.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function cA(e,t,n){if(!e)return ct(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return ct(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=zh(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:""},...uA(r.lines,n,s)]}function dA(e,t,n){if(!e)return ct(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return ct(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=zh(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:""},...pA(r.lines,n,s)]}function ct(e){return e.map(t=>({text:t}))}function uA(e,t,n){let r=Math.max(3,String(e.length).length),s=Math.max(0,Math.min(t,Math.max(0,e.length-1)));return e.slice(s).map((i,o)=>{let a=s+o+1;return{text:`${`${String(a).padStart(r," ")} \u2502 `}${i}`,segments:[{text:String(a).padStart(r," "),style:{fg:pe.lineNumber}},{text:" \u2502 ",style:{fg:pe.gutter}},...Ld(i,n)],tone:"default"}})}function pA(e,t,n){let r=fA(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>mA(i,n))}function fA(e){let t=[],n=0,r=0;for(let s of e){let i=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/.exec(s);if(i){n=Number.parseInt(i[1]??"0",10),r=Number.parseInt(i[2]??"0",10);continue}if(!(s.startsWith("diff --git")||s.startsWith("index ")||s.startsWith("+++ ")||s.startsWith("--- "))&&!(s==="staged"||s==="unstaged"||s==="untracked")){if(s.startsWith("-")&&!s.startsWith("---")){t.push({oldNumber:n,newNumber:null,marker:"-",text:s.slice(1),kind:"delete"}),n+=1;continue}if(s.startsWith("+")&&!s.startsWith("+++")){t.push({oldNumber:null,newNumber:r,marker:"+",text:s.slice(1),kind:"add"}),r+=1;continue}if(s.startsWith(" ")){if(n===0&&r===0)continue;t.push({oldNumber:n,newNumber:r,marker:" ",text:s.slice(1),kind:"context"}),n+=1,r+=1;continue}}}return t}function mA(e,t){let n=Kh(e.oldNumber),r=Kh(e.newNumber),s=e.kind==="delete"?n:r,i=e.kind==="delete"?{bg:"2a1111",fallbackFg:pe.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:pe.diffAdd}:null,o=`${s} \u2502 ${e.text}`,a=i?hA(Ld(e.text,t),i.bg,i.fallbackFg):Ld(e.text,t),l=i?{fg:pe.lineNumber,bg:i.bg}:{fg:pe.lineNumber},c=i?{fg:pe.gutter,bg:i.bg}:{fg:pe.gutter};return{text:o,segments:[{text:s,style:l},{text:" \u2502 ",style:c},...a],fullBleed:i!==null}}function Kh(e){return e===null?" ":String(e).padStart(4," ")}function zh(e){let t=Ns.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 Ld(e,t){return t==="diff"?gA(e):t==="markdown"?yA(e):t==="json"?Md(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?Md(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 gA(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:pe.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:pe.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:pe.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:pe.diffMeta}}]:[{text:e}]}function hA(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function yA(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:pe.markup,bold:!0}}]:Md(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function Md(e,t){let n=[],r=0;for(let s of e.matchAll(t)){let i=s[0],o=s.index??0;o>r&&n.push({text:e.slice(r,o)}),n.push({text:i,style:wA(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function wA(e){return e.startsWith("//")||e.startsWith("/*")?{fg:pe.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:pe.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:pe.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:pe.markup}:{fg:pe.keyword}}function kA(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"?Xh(t.repoTargets??[]):s?.pullRequest??(t?V(t):null),o=[TA(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=ey(e,t),l=jd(e,n),c=IA([{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,...NA(e,n)]}:{title:"",rows:[...o,...jd(e,n)]}}function TA(e,t){let n=e.inspectionMode,r=[{label:"FILES",active:n==="files"},{label:"REVIEW",active:n==="review"}],s=[];for(let l=0;l<r.length;l++){let c=r[l];l>0&&s.push({text:" "});let u=c.active?e.focusedRegion==="inspector"||e.focusedRegion==="actions"?"9ece6a":"7aa2f7":"565f89";s.push({text:c.label,style:{fg:u}})}let i=qd(t),o=Ud(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function Gh(e){return[{text:" "},qd(e),{text:" "},Ud(e)]}function Jh(e){if(e.type==="project"&&e.repoTargets?.length){let n=Xh(e.repoTargets);return n?Gh(n):null}let t=V(e);return t?.number?Gh(t):null}function Xh(e){let t=e.filter(s=>s.status==="ready"),n=t.map(s=>s.pullRequest).filter(s=>!!s.number);if(n.length===0)return null;let r=RA(n);return{number:-1,status:bA(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 bA(e){return e.some(t=>t.status==="open")?"open":e.every(t=>t.status==="merged")?"merged":e.some(t=>t.status==="closed")?"closed":e[0]?.status??null}function RA(e){let t=e.map(n=>Qh(n));return t.some(n=>n==="failed")?"failed":t.some(n=>n==="pending")?"pending":t.length>0&&t.every(n=>n==="success")?"success":"none"}function qd(e){return!e||!e.number?{text:qh,style:{fg:"565f89"}}:e.status==="merged"?{text:Uh,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:Wh,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:Dd,style:{fg:"565f89"}}:{text:Dd,style:{fg:"9ece6a"}}}function Ud(e){return e?.aggregateReadiness?Hh(e.aggregateReadiness):Hh(Qh(e))}function Hh(e){return e==="failed"?{text:Fd,style:{fg:"f7768e"}}:e==="pending"?{text:xd,style:{fg:"e0af68"}}:e==="success"?{text:_d,style:{fg:"9ece6a"}}:{text:Nd,style:{fg:"565f89"}}}function Qh(e){let t=e?.requiredChecks??null;return e?.status==="merged"?"success":e?.status==="closed"||!e?.number||!t||t.length===0?"none":t.some(n=>n.status==="failed")||e.reviewDecision==="CHANGES_REQUESTED"?"failed":t.every(n=>n.status==="success"||n.status==="skipped")?Zh(e)?"failed":SA(e)?"success":"pending":"pending"}function SA(e){return!!(e.mergeable&&!e.draft&&!Zh(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function Zh(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function ey(e,t){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return PA(e,t);let n=V(t),r=ny("pr",t.branch,n??{number:null,url:null,baseBranch:null,headBranch:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,lastSyncedAt:null,requiredChecks:[],comments:[]}),s=t.prs.filter(i=>i!==n&&(i.status==="merged"||i.status==="closed")).length;return s>0&&r.push({id:"pr-history",text:`+ ${s} previous PR${s!==1?"s":""}`,muted:!0}),r}var jo=32;function PA(e,t){let n=[],r=t.repoTargets??[],s=e.selectedProjectTargetId??r[0]?.repoId??null;for(let o of r){let a=s===o.repoId,l=e.focusedRegion==="inspector"&&a,c=o.repoId.startsWith("repo_")?o.repoId.slice(5):o.repoId;if(o.status!=="ready"){let d=o.failureReason?o.failureReason.slice(0,14):o.status,p=jo-d.length-1,m=c.length>p?c.slice(0,p-1)+"\u2026":c,g=jo-m.length-d.length;n.push({id:`project-review:${o.repoId}`,text:m+" ".repeat(Math.max(1,g))+d,selected:a,focused:l,muted:!0})}else{let u=qd(o.pullRequest),d=Ud(o.pullRequest),p=`${u.text} ${d.text}`,m=jo-p.length-1,g=c.length>m?c.slice(0,m-1)+"\u2026":c,f=jo-g.length-p.length,y=g+" ".repeat(Math.max(1,f));n.push({id:`project-review:${o.repoId}`,text:y+p,selected:a,focused:l,segments:[{text:y},{...u,text:u.text},{text:" "},{...d,text:d.text}]})}}let i=r.find(o=>o.repoId===s)??null;return i?.status==="ready"&&i.pullRequest.number&&(n.push({id:"target-detail-spacer",text:""}),n.push(...ny("target",i.branch,i.pullRequest))),n}function ty(e,t,n=null){return 3+ey(e,t).length+jd(e,n).length}function ny(e,t,n){let r=d=>`${e}-${d}`;if(!n.number)return[{id:r("no-pr"),text:t,muted:!0}];let s=[],i=`#${n.number}`;s.push(n.url?{id:r("pr-number"),text:`${i} Open in GitHub \u2197`,segments:[{text:i},{text:" Open in GitHub \u2197",style:{fg:"7aa2f7",underline:!0},href:n.url}]}:{id:r("pr-number"),text:i});let o=n.baseBranch??"?",a=n.headBranch??t;s.push({id:r("pr-branches"),text:`${o} \u2192 ${a}`,muted:!0});let l=vA(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:CA(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${ry(n.lastSyncedAt)}`,muted:!0}),s.push({id:r("checks-spacer"),text:""}),s.push({id:r("checks-header"),text:"Checks"}),n.requiredChecks.length?s.push(...n.requiredChecks.map(AA)):s.push({id:r("checks-none"),text:n.number?"No GitHub checks reported.":"No checks \u2014 sync after creating a PR.",muted:!0});let u=n.comments??[];return u.length>0&&(s.push({id:r("comments-spacer"),text:""}),s.push({id:r("comments-header"),text:`Review comments (${u.length})`}),s.push(...u.slice(-4).flatMap((d,p)=>EA(d,r(`comment:${p}`))))),s}function IA(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 vA(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function CA(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function ry(e){if(!e)return"--";let t=Date.now()-new Date(e).getTime(),n=Math.floor(t/1e3);if(n<60)return`${n}s ago`;let r=Math.floor(n/60);if(r<60)return`${r}m ago`;let s=Math.floor(r/60);return s<24?`${s}h ago`:`${Math.floor(s/24)}d ago`}function AA(e){let{icon:t,color:n}=$A(e.status),r=e.name.length>16?`${e.name.slice(0,15)}\u2026`:e.name;return{id:`pr-check:${e.name}`,text:`${t} ${r.padEnd(16," ")} ${DA(e.status)}`,color:n,muted:!1}}function EA(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${ry(e.createdAt)}`:"",s=OA(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 OA(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 $A(e){switch(e){case"success":return{icon:_d,color:"9ece6a"};case"pending":return{icon:xd,color:"e0af68"};case"failed":return{icon:Fd,color:"f7768e"};case"skipped":return{icon:Nd,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function DA(e){return e==="success"?"passing":e==="failed"?"failing":e}function NA(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=Wd(t.fileRows,e.collapsedFileTreePaths),s=e.fileSearchQuery,i=s?r.filter(l=>l.path.toLowerCase().includes(s.toLowerCase())):r,o=s!==null?[{id:"file-search",text:`Search: ${s}\u2588`,muted:!1}]:[],a=e.selectedFileTreePath??t.selectedFilePath;return[...o,...i.map(l=>{let c=l.kind==="file"?n.get(l.path):void 0,u=c==="A"?"9ece6a":c==="M"?"e0af68":c==="D"?"f7768e":c==="??"?"565f89":void 0,d=l.kind==="directory"?e.collapsedFileTreePaths.includes(l.path)?Mh:jh:Lh(l.label),p=l.kind==="directory"?"7aa2f7":Bh(l.label),m=" ".repeat(l.depth),g=p?{text:d,style:{fg:p}}:{text:d},f=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:u?{text:l.label,style:{fg:u}}:{text:l.label},y=[{text:m},g,f];return{id:l.path,text:`${m}${d}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:y}})]}function Wd(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 jd(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(xA(t))return _A(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=>sy(i,e,t))))}return n}function xA(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function _A(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=>sy(c,e,t,s.length+1))))}}return n}function sy(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 FA(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:Ns.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 LA(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0})}function MA(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function iy(e,t,n,r,s=null){if(s)return jA(e,t,n,r,s);let i=dd(e,t,{centerOnly:r});return qA(n,i)?{output:$o(i.rows,n.rows,i.row,i.column),region:i}:null}function jA(e,t,n,r,s){let i=Ug(e,t,s,{centerOnly:r});if(!i||!UA(n,i))return null;let o=n.rows.slice();return{output:i.rows.map(({index:l,row:c})=>o[l]===c?"":(o[l]=c,`\x1B[${i.row+l};${i.column}H${c}`)).join(""),region:{row:i.row,column:i.column,width:i.width,rows:o}}}function qA(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function UA(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function oy(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!WA(o,a))return null;!o||!a||(s+=$o(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function WA(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 BA=["tasks","center","inspector"];function VA(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 Vd(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return Gd({...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 Gd(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return Cg(t)?E({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):E({state:e});if(e.fileSearchQuery!==null)return VA(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"&&(ko(e.selectedLeftItemId)||To(e.selectedLeftItemId)))return E({state:{...e,selectedRunner:wo(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return ay(e,1);if(t==="SHIFT_TAB"||t==="[")return ay(e,-1);if(t==="z"||t==="Z")return E({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===K?fn(e,-1,n):Vd(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===K?fn(e,1,n):Vd(e,1,n);if(t==="PAGE_UP")return fn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return fn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return fn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return fn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??J,s=e.centerTabRunner?r.indexOf(e.centerTabRunner):-1,i=s===r.length-1?null:r[s+1];return E({state:{...e,centerTabRunner:i,actionMessage:null},changed:!0})}if((t==="+"||t==="a"||t==="A"||t==="t"||t==="T")&&e.focusedRegion==="center"&&e.selectedTaskId){let r=QA(e,t);return E({state:{...e,preferredPtyTabKind:r,actionMessage:null},changed:!0,createPtyTab:!0,createPtyTabKind:r,createPtyTabRunner:r==="agent"?e.centerTabRunner:null})}if(t==="R"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0});if(t==="o"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review"&&e.selectedTaskId)return E({state:e,openPrUrl:!0});if(t==="X"&&e.focusedRegion==="inspector"&&e.inspectionMode==="review")return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&vs(e.selectedLeftItemId)&&e.selectedTaskId)return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&Dg(e.selectedLeftItemId)&&e.selectedWorkspaceId)return E({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&dy(e.activeTab,n.ptyTabIds??[]))return E({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return Bd(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return ly(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return Bd(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return ly(e,1)}if(at(t)){if(e.focusedRegion==="tasks"&&(ko(e.selectedLeftItemId)||To(e.selectedLeftItemId))){let r=rd(e.selectedLeftItemId),s=sd(e.selectedLeftItemId);return E({state:{...e,selectedRepoId:r??e.selectedRepoId,selectedWorkspaceId:s??e.selectedWorkspaceId,actionMessage:null,taskPromptInput:"",taskPromptError:null},changed:!0,beginTaskPrompt:!0})}if(e.focusedRegion==="tasks"&&e.selectedLeftItemId==="new-workspace")return E({state:{...e,actionMessage:null},changed:!0,openWorkspaceBrowser:!0});if(e.focusedRegion==="tasks"&&vs(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return E({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:Sr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&dy(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===K)return E({state:{...e,actionMessage:null},changed:!0,refreshInspection:!0});if(e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="files"){let r=e.selectedFileTreePath??e.selectedFilePath;if(r&&(n.fileTreeDirectoryIds??[]).includes(r))return E({state:HA({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return E({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:K,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}if(e.focusedRegion==="inspector"&&e.inspectionMode==="review"){let r=e.selectedDiffPath??n.diffPathIds?.[0]??null;return r?E({state:{...e,selectedDiffPath:r,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!n.projectTargetIds?.length?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?E({state:e}):e.selectedActionId==="refresh-checks"?E({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return E({state:e})}function fn(e,t,n){if(t===0)return E({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?uy(e,t,n):e.inspectionMode==="review"?cy(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):E({state:e});if(e.focusedRegion==="center"&&e.activeTab===K){if(e.openInspectionKind==="file")return cy(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return YA(e,t,n)}return E({state:e})}function ay(e,t){return Uo(e,"focusedRegion",BA,t)}function Bd(e,t,n){let r=Uo(e,"activeTab",n&&n.length>0?n:ZA(e),t);return!r.changed||Eg(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:Sr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function Vd(e,t,n){if(e.focusedRegion==="tasks")return KA(e,t,n.leftItemIds);if(e.focusedRegion==="center")return Bd(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return uy(e,t,n);if(n.projectTargetIds?.length){let s=Kd(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=Kd(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:Uo(e,"selectedActionId",Rg,t)}return Uo(e,"selectedActionId",Zc,t)}function KA(e,t,n){let r=Kd(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=nd(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=rd(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=sd(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function GA(e,t){if(e.inspectionMode===t)return E({state:e});let n=t==="files"?"file":e.openInspectionKind,r=t==="files"?K:e.activeTab;return E({state:{...e,inspectionMode:t,activeTab:r,openInspectionKind:n,fileScrollOffset:t==="files"?0:e.fileScrollOffset,reviewScrollOffset:t==="review"?0:e.reviewScrollOffset,actionMessage:null},changed:!0,refreshInspection:!0})}function ly(e,t){return GA(e,XA(e.inspectionMode,ed,t))}function uy(e,t,n){let r=n.fileTreeRowIds&&n.fileTreeRowIds.length>0?n.fileTreeRowIds:n.filePathIds??[];if(r.length===0)return E({state:e});let s=e.selectedFileTreePath??e.selectedFilePath??r[0]??null,i=r.indexOf(s??""),o=Ft(i===-1?0:i+t,0,r.length-1),a=r[o]??null;if(a===e.selectedFileTreePath)return E({state:e});let l=a!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(a);return E({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?K:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function HA(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 cy(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=Ft(e[t]+n,0,i);return o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function YA(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return zA(e,t,n);let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=e.diffScrollOffset+t,a=n.diffPathIds??[];if(a.length===0||!e.selectedDiffPath){let u=Ft(o,0,i);return u===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:u,actionMessage:null},changed:!0})}let l=a.indexOf(e.selectedDiffPath);if(l===-1){let u=Ft(o,0,i);return u===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:u,actionMessage:null},changed:!0})}if(t>0&&o>i){let u=a[l+1]??null;return u?E({state:{...e,selectedDiffPath:u,activeTab:K,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===i?E({state:e}):E({state:{...e,diffScrollOffset:i,actionMessage:null},changed:!0})}if(t<0&&o<0){let u=a[l-1]??null;return u?E({state:{...e,selectedDiffPath:u,activeTab:K,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?E({state:e}):E({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let c=Ft(o,0,i);return c===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function zA(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=Ft(e.diffScrollOffset+t,0,i),a=JA(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 JA(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function Uo(e,t,n,r){let s=n.indexOf(e[t]),i=Ft(s+r,0,n.length-1),o=n[i];return!o||o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function Kd(e,t,n,r,s=!1){if(n.length===0)return E({state:e});let i=n.indexOf(e[t]??n[0]??""),o=Ft(i===-1?0:i+r,0,n.length-1),a=n[o]??null;return a===e[t]?E({state:e}):E({state:{...e,[t]:a,actionMessage:null},changed:!0,refreshInspection:s})}function XA(e,t,n){let r=t.indexOf(e);return t[Ft(r+n,0,t.length-1)]??e}function E(e){return{state:e.state,changed:e.changed??!1,exit:e.exit??!1,pause:e.pause??!1,attachTerminal:e.attachTerminal??!1,detachTerminal:e.detachTerminal??!1,beginTaskPrompt:e.beginTaskPrompt??!1,openWorkspaceBrowser:e.openWorkspaceBrowser??!1,createWorkspaceTask:e.createWorkspaceTask??!1,createPtyTab:e.createPtyTab??!1,createPtyTabKind:e.createPtyTabKind??null,createPtyTabRunner:e.createPtyTabRunner??null,closePtyTab:e.closePtyTab??!1,refreshPullRequestChecks:e.refreshPullRequestChecks??!1,closeTask:e.closeTask??!1,removeWorkspace:e.removeWorkspace??!1,refreshInspection:e.refreshInspection??!1,openPrUrl:e.openPrUrl??!1}}function dy(e,t){return t.includes(e)}function QA(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Sr(e.activeTab)??e.preferredPtyTabKind}function ZA(e){return[e.selectedPtyTabId,e.openInspectionKind?K:null].filter(t=>typeof t=="string")}function Ft(e,t,n){return Math.min(n,Math.max(t,e))}var py=async(e,t,n,r)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await r.queueTaskMutation(async()=>W(r.paths,e.selectedTaskId,i=>{let o=t??eE(i,e.activeTab,e.preferredPtyTabKind),a=hy(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"}`}}},fy=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing a tab.");let{closedTab:n,nextSelectedTab:r}=await t.queueTaskMutation(async()=>{let s={closedTab:null,nextSelectedTab:null};if(await W(t.paths,e.selectedTaskId,i=>{let o=i.ptyTabs.findIndex(l=>l.id===e.activeTab);if(o===-1)throw new Error("Only PTY tabs can be closed.");s.closedTab=i.ptyTabs[o];let a=i.ptyTabs.filter(l=>l.id!==s.closedTab.id);return s.nextSelectedTab=a[Math.min(o,a.length-1)]??null,{...i,ptyTabs:a,selectedPtyTabId:s.nextSelectedTab?.id??null}}),!s.closedTab)throw new Error("Only PTY tabs can be closed.");return{closedTab:s.closedTab,nextSelectedTab:s.nextSelectedTab}});return{closedTab:n,nextSelectedTab:r,nextShell:{activeTab:r?.id??(e.openInspectionKind?"inspection":e.activeTab),selectedPtyTabId:r?.id??null,focusedRegion:"center",actionMessage:`Closed tab: ${n.title}`}}},my=async(e,t)=>{let n=e.selectedTaskId;n&&await t.queueTaskMutation(async()=>{await W(t.paths,n,r=>!r.ptyTabs.some(s=>s.id===e.activeTab)||r.selectedPtyTabId===e.activeTab?r:{...r,selectedPtyTabId:e.activeTab})})},gy=async(e,t)=>{let n=e.ptyTabs.find(s=>s.kind==="agent")??null;if(n)return await t.queueTaskMutation(async()=>{await W(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:s})}),{...e,selectedPtyTabId:n.id};let r=hy(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await W(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:{...s,ptyTabs:[...s.ptyTabs,r],selectedPtyTabId:r.id}})}),{...e,ptyTabs:[...e.ptyTabs,r],selectedPtyTabId:r.id}};function eE(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function hy(e,t,n,r={}){let s=n??e.runner,i=k.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(m=>m.id)),c=1,u=a;for(;l.has(u);)c+=1,u=`${a}-${c}`;let d=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:u,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,r):[],createdAt:d,updatedAt:d}}var Cr=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},yy=async(e,t,n,r,s)=>{k.runners.assertEnabled(r,s.config);let i=t?await s.taskService.provisionProjectTask(s.paths,t,n,{runner:r,config:s.config}):await s.taskService.provisionTask(s.paths,e??"",n,{runner:r,config:s.config});k.previews.isEnabled(s.config,"agentOrchestration")&&await Xe(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=Rn();Sn(k.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",u=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new Cr(c,u)}let o=await s.taskService.markTaskStarted(s.paths,i.task.id),a={selectedRepoId:o.repoId,selectedWorkspaceId:o.workspaceId,selectedTaskId:o.id,selectedPtyTabId:o.selectedPtyTabId,inputMode:"control",focusedRegion:"center",activeTab:o.selectedPtyTabId??"agent",selectedActionId:"commit"};return{task:o,nextShell:a}},wy=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},ky=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing it.");let{taskBeforeClose:n,task:r}=await t.queueTaskMutation(async()=>{let s=await Nr(t.paths,e.selectedTaskId),i=await t.taskService.closeTask(t.paths,e.selectedTaskId);return{taskBeforeClose:s,task:i}});return{closedTabIds:n.ptyTabs.map(s=>s.id),nextShell:{selectedActionId:"close-task",actionMessage:r.cleanup.preservedWorktree?`Archived task ${r.id}; worktree preserved`:`Archived task ${r.id}`}}},Ty=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Nr(t.paths,n.id)))),xs=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await we.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var by=async(e,t)=>{if(!e.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");if((await t.taskService.listTasks(t.paths,{workspaceId:e.selectedWorkspaceId,includeClosed:!0})).tasks.length>0)throw new Error(`Cannot remove workspace ${e.selectedWorkspaceId} while task records still reference it.`);return await t.workspaceService.archiveWorkspace(t.paths,e.selectedWorkspaceId),{nextShell:{selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:`Removed workspace ${(await t.workspaceService.removeWorkspace(t.paths,e.selectedWorkspaceId,{listTasks:t.taskService.listTasks})).workspaceId}`}}};var Ry=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},Sy=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},Py=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var tE=250;function Lt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function jn(e,t){return _t(t,e.ptyRuntime.getViewState(Ar(e,t)))}function Ar(e,t){let n=Lt(e.model.tasks,t);return n?n.ptyTabs.some(r=>r.id===t.activeTab)?t.activeTab:t.activeTab==="agent"||t.activeTab==="terminal"?n.ptyTabs.find(r=>r.kind===t.activeTab)?.id??t.selectedPtyTabId:t.selectedPtyTabId:t.selectedPtyTabId}function I(e,t){return jn(e,Ng(t,e.model))}function Iy(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 vy(e,t,n){return Iy(e,t,n?{tone:"success",message:n}:null)}function se(e,t,n){return Iy(e,t,{tone:"error",message:n})}function ie(e,t,n,r){let s=n instanceof Error?n.message:r,i=n instanceof Error?n.stack??n.message:String(n);return we.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function ee(e,t){if(!e.uiStateFile)return;e.runtimeState=Ig(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>jt({uiStateFile:e.uiStateFile},n),()=>jt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function nE(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:R,workspaceService:ke,queueTaskMutation:t=>nE(e,t)}}function Hd(e,t){let n=Lt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?Wd(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:Ln(e.model),centerTabIds:$g(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:ty(t,n,s),pageRows:Math.max(5,Me(e.activeTerminal.width,e.activeTerminal.height).height-Z.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:n?.repoTargets?.map(a=>a.repoId)??[]}}async function Cy(e,t){await my(t,oe(e))}async function Ie(e){e.model=await Pr(e.workspaceRoot,e.state.shell,e.enabledRunnerIds),e.state.mode==="main"?e.state={mode:"main",shell:I(e,e.state.shell)}:e.state={...e.state,shell:I(e,e.state.shell)}}function Er(e,t){e.model={...e.model,tasks:[...e.model.tasks.filter(n=>n.id!==t.id),t].sort((n,r)=>n.id.localeCompare(r.id))}}async function Wo(e,t){let n=++e.inspectionRefreshSequence,r=id(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 dg(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await Pr(e.workspaceRoot,t,e.enabledRunnerIds),n!==e.inspectionRefreshSequence)return;e.model=o,e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,e.state.shell)},ee(e,e.state.shell),e.render())}function Ay(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)&&Wo(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()})},tE))}function Ey(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=fn(e.state.shell,n,Hd(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render(),Wo(e,e.state.shell).catch(s=>{let i=ie(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render()}},16)))}function Yd(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function zd(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 $y(e){zd(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.render())})}async function Dy(e,t){let n=I(e,t),r=Lt(e.model.tasks,n),s=Ar(e,n);if(!r||!s||!r.ptyTabs.some(a=>a.id===s))return n;let i=e.ptyRuntime.getViewState(s);if(i.status!=="idle"||i.rows.length>0||i.error)return _t(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,dn(Me(e.activeTerminal.width,e.activeTerminal.height)));return _t({...n,inputMode:"control"},o)}function Jd(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 Xd(e,t){try{let n=I(e,t),r=Lt(e.model.tasks,n),s=n.selectedPtyTabId;if(r&&n.focusedRegion==="tasks"){let a=r.ptyTabs.find(l=>l.kind==="agent")??null;a?s=a.id:(r=await Oy(e,r),await Ie(e),s=r.selectedPtyTabId)}r&&!s&&(r=await Oy(e,r),await Ie(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:_t({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},ee(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,dn(Me(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=un(s),e.lastTerminalKey=null,e.state={mode:"main",shell:_t({...i,inputMode:"terminal"},o)},ee(e,e.state.shell)}catch(n){let r=ie(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&un(t.selectedPtyTabId)&&(await rE(e,t.selectedTaskId,r).catch(()=>{}),await Ie(e).catch(()=>{})),e.state={mode:"main",shell:se(e,vg(I(e,t),r),r)},ee(e,e.state.shell)}e.render()}async function rE(e,t,n){await wy(t,n,oe(e))}async function Ny(e,t,n,r){let s=I(e,t),{nextShell:i}=await py(s,n,r,oe(e));return await Ie(e),I(e,{...s,...i})}async function xy(e,t){let n=I(e,t),{closedTab:r,nextShell:s}=await fy(n,oe(e));return e.ptyRuntime.disposeSession(r.id),await Ie(e),I(e,{...n,...s})}async function _y(e,t){let n=I(e,t),r=Ln(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await ky(n,oe(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Ie(e),I(e,{...n,...o,selectedLeftItemId:sE(r,Ln(e.model),s)})}async function Fy(e,t){let n=I(e,t),{nextShell:r}=await by(n,oe(e));return await Ie(e),I(e,{...n,...r})}async function Oy(e,t){return gy(t,oe(e))}function Bo(e,t){e.pendingScrollLines+=t,!e.scrollRenderTimer&&(e.scrollRenderTimer=setTimeout(()=>{e.scrollRenderTimer=null;let n=e.pendingScrollLines;e.pendingScrollLines=0,n!==0&&(e.ptyRuntime.scrollViewport(n),e.state={mode:"main",shell:jn(e,e.state.shell)},e.render())},16))}function sE(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 My(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=Ly(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await Ty(s,oe(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)Er(e,o);t.recordSuccess(i,Ly(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,xs("background PR polling",i,oe(e)))}}function Ly(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function jy(e,t){let n=I(e,t),r=Lt(e.model.tasks,n),s=null,i=null;if(r?.type==="project"&&r.repoTargets?.length){let o=await R.prs.discoverOrRefreshAll(e.paths,n.selectedTaskId);await Ie(e);let a=o.synced+o.discovered+o.notFound;i=`Refreshed ${o.synced}/${a} targets`}else{let{disposition:o,task:a}=await R.prs.discoverOrRefresh(e.paths,n.selectedTaskId);await Ie(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${V(a)?.requiredChecks.length??0} reported`)}return I(e,{...vy(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import cE from"node:path";import{readdir as iE,stat as oE}from"node:fs/promises";import qy from"node:path";async function aE(e){let t=await iE(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=qy.join(e,r.name);n.push({name:r.name,path:s,kind:await lE(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 Uy(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function Wy(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 Vo(e,t){let n=await aE(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 lE(e){let t=qy.join(e,".git");return await oE(t).catch(()=>null)!==null}function By(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function Vy(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function dE(e){if(e.state.mode!=="main"||e.creatingTask)return;let t=e.state.shell,n=t.taskPromptInput?.trim()??"";if(!t.selectedRepoId&&!t.selectedWorkspaceId){e.state={mode:"main",shell:I(e,{...t,taskPromptError:"Select a workspace first."})},e.render();return}if(n.length===0){e.state={mode:"main",shell:I(e,{...t,taskPromptError:"Task prompt cannot be empty."})},e.render();return}e.creatingTask=!0,e.state={mode:"main",shell:I(e,{...t,actionMessage:`Creating ${t.selectedRunner} task in ${t.selectedWorkspaceId??t.selectedRepoId}...`})},e.render();let r=null;try{let s=await yy(t.selectedRepoId,t.selectedWorkspaceId,n,t.selectedRunner,oe(e));r=s.task,Er(e,r);let i=I(e,{...e.state.shell,...s.nextShell,selectedLeftItemId:`task:${r.id}`,inputMode:"terminal",taskPromptInput:null,taskPromptError:null,actionMessage:null}),o=await e.ptyRuntime.ensureSession(r.id,i.selectedPtyTabId??Xg(r,"agent"),dn(Me(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=un(i.selectedPtyTabId),e.state={mode:"main",shell:_t(i,o)},ee(e,e.state.shell)}catch(s){s instanceof Cr&&(r=s.task);let i=ie(e,"create task",s,"Failed to create task.");r&&!(s instanceof Cr)?(await W(e.paths,r.id,o=>({...o,status:"draft",runnerSession:{...o.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:i})).catch(()=>{}),await Ie(e).catch(()=>{})):r&&(await W(e.paths,r.id,o=>({...o,lastFailureReason:i})).catch(()=>{}),await Ie(e).catch(()=>{})),e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,inputMode:"control",selectedTaskId:r?.id??e.state.shell.selectedTaskId,selectedPtyTabId:r?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:r?`task:${r.id}`:e.state.shell.selectedLeftItemId,activeTab:r?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:r?null:"",taskPromptError:i,actionMessage:null}),i)}}finally{e.creatingTask=!1,e.render()}}function uE(e,t){if(e.state.mode!=="main")return;let n=e.state.shell;if(n.taskPromptInput!==null){if(t==="ESCAPE"){e.state={mode:"main",shell:I(e,{...n,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(at(t)){dE(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:wo(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}Ag(t)&&(e.state={mode:"main",shell:I(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function pE(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=Uy(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"){Vo(e,cE.dirname(n.cwd)).catch(s=>{let i=ie(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:i}}),i)},e.render()});return}if(t==="RIGHT"||t==="l"||at(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){Vo(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 Ie(e);let a=o.repos[0]??null,l=I(e,{...e.state.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${o.workspace.id}`,selectedWorkspaceId:o.workspace.id,selectedRepoId:a?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${o.workspace.name??o.workspace.id}`});e.state={mode:"main",shell:l},ee(e,e.state.shell),e.render()}).catch(o=>{let a=ie(e,"add workspace",o,"Failed to add workspace.");e.state={mode:"main",shell:se(e,I(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()})}}function fE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=xh(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;mE(e,r)}}}async function mE(e,t){let n;try{n=await we.readLog(e.paths)}catch(r){let s=ie(e,"open logs",r,"Failed to read Craig logs.");n={path:e.paths.logFile,lines:[`Unable to read logs: ${s}`],empty:!1}}e.state.mode==="overlay"&&(e.state={mode:"overlay",variant:"logs",menuIndex:0,optionsMessage:null,shell:e.state.shell,log:n,...t!==void 0?{parentVariant:t}:{}},e.pendingClear=!0,e.render())}function gE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=Fh(By(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"?Ry(n.runner,n.enabled,oe(e)):Sy(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:{...By(e),message:i}},e.render()})}function hE(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=_h(Vy(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}Py(n.feature,n.enabled,oe(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,n.feature==="agentActivityIndicators"&&e.setAgentActivityEnabled(n.enabled),e.state={...e.state,previewOptions:n.state},e.render())}).catch(r=>{if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let s=ie(e,"save feature preview",r,"Failed to save feature preview.");e.state={...e.state,shell:se(e,I(e,e.state.shell),s),previewOptions:{...Vy(e),message:s}},e.render()})}}function Ky(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){uE(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){pE(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){wE(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=Gd(e.state.shell,n,Hd(e,e.state.shell));if(r.exit){e.exit(0);return}if(r.detachTerminal){e.ptyRuntime.detach(),e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render();return}if(e.state.shell.inputMode==="terminal"){if(r.changed){e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&at(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Es(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(yE(e,n))return;e.lastTerminalKey=Qg(n)?{key:n,at:Date.now()}:null;let i=Zg(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){Bo(e,i);return}e.ptyRuntime.writeKey(n);return}if(n==="CTRL_C"){e.exit(0);return}if(n==="?"&&e.state.shell.inputMode==="control"){e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render();return}if(r.pause){e.state={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:I(e,r.state)},e.pendingClear=!0,e.render();return}if(r.beginTaskPrompt){e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){Vo(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){Ny(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{Xd(e,s)}).catch(s=>{let i=ie(e,"create PTY tab",s,"Failed to create tab.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.closePtyTab){xy(e,r.state).then(s=>{e.state={mode:"main",shell:s},ee(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"close PTY tab",s,"Failed to close tab.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.refreshPullRequestChecks){jy(e,r.state).then(s=>{e.state={mode:"main",shell:s},ee(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"refresh PR checks",s,"Failed to refresh PR checks.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.openPrUrl){let s=Lt(e.model.tasks,r.state),i=s?V(s)?.url??null:null;i?Wy(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){_y(e,r.state).then(s=>{e.state={mode:"main",shell:s},ee(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"close task",s,"Failed to close task.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.removeWorkspace){Fy(e,r.state).then(s=>{e.state={mode:"main",shell:s},ee(e,e.state.shell),e.render()}).catch(s=>{let i=ie(e,"remove workspace",s,"Failed to remove workspace.");e.state={mode:"main",shell:se(e,I(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.attachTerminal){Xd(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:I(e,r.state)},ee(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){Ay(e,e.state.shell);return}Wo(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)},Cy(e,e.state.shell).catch(()=>{}),ee(e,e.state.shell),e.render());return}if(e.state.variant==="help"){e.state.viaOptions&&e.state.parentVariant?e.state={mode:"overlay",variant:"options",menuIndex:3,optionsMessage:null,shell:e.state.shell,parentVariant:e.state.parentVariant}:e.state.parentVariant?e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell}:e.state={mode:"main",shell:I(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){fE(e,n);return}if(e.state.variant==="runners"){gE(e,n);return}if(e.state.variant==="previews"){hE(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||at(n)){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:2,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render()}return}if(e.state.optionsMessage){(n==="ESCAPE"||at(n))&&(e.state={...e.state,optionsMessage:null},e.render());return}if(n==="UP"||n==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(n==="DOWN"||n==="j"){e.state={...e.state,menuIndex:Math.min(2,e.state.menuIndex+1)},e.render();return}if(n==="ESCAPE"){e.state.variant==="pause"&&(e.state={mode:"main",shell:I(e,e.state.shell)},e.pendingClear=!0,e.render());return}if(at(n)){if(e.state.menuIndex===0){let r=e.state.variant==="boot";e.state={mode:"main",shell:I(e,{...e.state.shell,inputMode:"control"})},e.pendingClear=!0,e.render(),r?e.bootHydrationReady.then(()=>{if(e.state.mode!=="main")return;let s=e.state.shell;Dy(e,s).then(i=>{e.state.mode!=="main"||e.state.shell!==s||(e.state={mode:"main",shell:i},ee(e,e.state.shell),e.render())}).catch(i=>{if(e.state.mode!=="main"||e.state.shell!==s)return;let o=ie(e,"warm selected PTY",i,"Failed to start selected PTY.");e.state={mode:"main",shell:se(e,I(e,e.state.shell),o)},ee(e,e.state.shell),e.render()})}):$y(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 Gy(e,t){let n=sh(t);if(e.state.mode!=="main"||e.state.shell.inputMode!=="terminal"||n.length===0)return;if(e.pendingTerminalKeySequence){let i=`${e.pendingTerminalKeySequence.raw}${n}`,o=Es(i);if(o){Yy(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(yd(i)){e.pendingTerminalKeySequence.raw=i,Hy(e);return}Ko(e)}if(n.includes("")){e.ptyRuntime.detach(),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey=null,e.state={mode:"main",shell:I(e,{...e.state.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},ee(e,e.state.shell),e.render();return}let r=eh(n);if(r!==0){Bo(e,r);return}let s=Es(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
280
280
  `&&n!==`\r
281
- `&&(e.suppressTerminalEnterOnAttach=!1),eg(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function dE(e,t){if(e.pendingTerminalKeySequence){let n=Qh(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Es(r);if(s)return Ky(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(hd(r))return e.pendingTerminalKeySequence.raw=r,Vy(e),!0}return Ko(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>Ko(e),30)},!0)}function Vy(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>Ko(e),30))}function Ko(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function Ky(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function Gy(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){vy(e,md(t));return}let n=md(t);n!==0&&Bo(e,n)}function uE(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var Hy=1e3,fE=pE(import.meta.url),mE=fE("terminal-kit"),hE=mE.terminal;function zd(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Yy(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function zy(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function gE(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 Jy(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=ve(t),r=await k.load(n),s=k.runners.getEnabled(r),i=e.uiStateFile?await Un({uiStateFile:e.uiStateFile}):null,o=await Sr(t,void 0,s),a=Is(bh(i,r),o);o=await Sr(t,a,s);let l={current:o},c=()=>{},u=()=>{},d=()=>{},p={workspaceRoot:t,onUpdate:f=>c(f),onActivity:f=>u(f),onActivityRemoved:f=>d(f),resolveSessionSpec:(f,m)=>Hh(l.current,m,t)},h=e.ptyRuntime??await gg({...p,paths:n,activityEnabled:k.previews.isEnabled(r,"agentActivityIndicators")});return new Promise(f=>{let m=e.terminal??hE,y=null,T=null,R=null,v=null,b=null,$=0,N=!1,_=new Map,C=h.managesPullRequestSync?null:new Ir({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,ge=new un({resolutionMs:k.previews.isEnabled(r,"agentActivityIndicators")?Mo:Hy,onError:(A,z)=>xs(`heartbeat job "${A}"`,z,oe(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:Is(a,o)},get model(){return l.current},set model(A){l.current=A},config:r,enabledRunnerIds:s,creatingTask:!1,suppressTerminalEnterOnAttach:!1,lastTerminalKey:null,pendingScrollLines:0,pendingInspectionScrollLines:0,leftNavInspectionTimer:null,pendingLeftNavInspectionShell:null,pendingTerminalKeySequence:null,scrollRenderTimer:null,inspectionScrollRenderTimer:null,ptyRenderTimer:null,footerToastTimer:null,focusFlashUntil:null,focusFlashTimer:null,lastBackgroundPrPollError:null,versionText:`Craig v${k.version.getCurrent()}`,updateText:null,inspectionRefreshSequence:0,pendingClear:!0,inputCaptureMode:null,runtimeState:i,persistQueue:Promise.resolve(),taskMutationQueue:Promise.resolve(),bootHydrationReady:Promise.resolve(),paths:n,workspaceRoot:t,uiStateFile:e.uiStateFile,activeTerminal:m,ptyRuntime:h,resolve:f,render:()=>{},renderTaskNavigation:()=>!1,exit:A=>f(A),setAgentActivityEnabled:A=>{ge.setResolutionMs(A?Mo:Hy),w.ptyRuntime.setActivityEnabled?.(A)}},w.setAgentActivityEnabled(k.previews.isEnabled(r,"agentActivityIndicators")),c=A=>{w.state.mode==="main"&&(b=gE(b,A),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let z=b;if(b=null,w.state.mode==="main"){let ce=jn(w,w.state.shell);if(w.state={mode:"main",shell:ce},!v||!T){w.render();return}let je=Me(m.width,m.height),Re={...v,terminal:ce.terminal},Mt=ny(je,Re,T,ce.centerZoomed,z?.kind==="rows"?z.rowIndices:null);if(!Mt){w.render();return}Mt.output.length>0&&m.noFormat(Mt.output),v=Re,T=Mt.region,R&&(R={...R,center:Mt.region}),y=null,m.hideCursor(!0)}},0)))},u=A=>{w.state.mode==="main"&&k.previews.isEnabled(w.config,"agentActivityIndicators")&&dn(A.tabId)&&_.get(A.tabId)!==vt(A.tabId,[A],Date.now())&&w.render()},d=A=>{w.state.mode==="main"&&k.previews.isEnabled(w.config,"agentActivityIndicators")&&dn(A)&&_.get(A)!=="idle"&&w.render()};let ye=Promise.resolve(),Y=A=>{ye=ye.then(async()=>{let z=await Promise.all([...new Set(A)].map(ce=>S.getTask(w.paths,ce)));for(let ce of z)Ar(w,ce);w.state.mode==="main"?w.state={mode:"main",shell:I(w,w.state.shell)}:w.state={...w.state,shell:I(w,w.state.shell)},w.render()}).catch(z=>xs("daemon task-state refresh",z,oe(w)))};w.ptyRuntime.setTasksChangedHandler?.(Y);let fn=A=>{let z=Me(m.width,m.height),ce=k.previews.isEnabled(w.config,"agentActivityIndicators"),je=ce?w.ptyRuntime.getActivitySnapshots?.()??[]:[],Re=Date.now(),Mt=Kg(I(w,A.shell),w.model,ce?{snapshots:je,now:Re,animationFrame:$}:void 0);if(_.clear(),ce)for(let ew of w.model.tasks)for(let Go of ew.ptyTabs)Go.kind==="agent"&&_.set(Go.id,vt(Go.id,je,Re));let Zy=Lh(z,Mt,{centerOnly:A.shell.centerZoomed,focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:Mt,presentation:Zy}},_s=(A,z,ce,je)=>{if(!R)return!1;let Re=ry(R,z.regions,ce);return Re?(Re.output.length>0&&m.noFormat(Re.output),v=A,R=Re.regions,T=Re.regions.center,y=je?z.frame:null,m.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;Hd(w),w.ptyRuntime.setPullRequestPollView?.(zy(w.state)),w.ptyRuntime.setViewedTab?.(Cr(w,w.state.shell));let{data:A,presentation:z}=fn(w.state);return _s(A,z,["rail","left","center","footer"],!1)},w.render=()=>{Hd(w);let A=w.state;w.ptyRuntime.setPullRequestPollView?.(zy(A)),w.ptyRuntime.setViewedTab?.(A.mode==="main"?Cr(w,A.shell):null);let z=Me(m.width,m.height),ce,je=null;if(A.mode==="main"){let Re=fn(A);if(je=Re.presentation,ce=je.frame,!w.pendingClear&&_s(Re.data,je,["rail","left","center","right","footer"],!0))return;v=Re.data,T=je.center}else ce=A.variant==="boot"?Dh(z,{menuIndex:A.menuIndex,optionsMessage:A.optionsMessage,versionText:w.versionText,updateText:w.updateText}):A.variant==="pause"?xh(z,{menuIndex:A.menuIndex,optionsMessage:A.optionsMessage,versionText:w.versionText,updateText:w.updateText}):A.variant==="options"?Ao(z,{menuIndex:A.menuIndex,optionsMenuItems:Cd}):A.variant==="runners"?Ao(z,{menuIndex:zd(A).menuIndex,optionsMenuItems:Ad(w.config,zd(A)),optionsMessage:Ag(zd(A)),optionsSubtitle:"Runners"}):A.variant==="previews"?Ao(z,{menuIndex:Yy(A).menuIndex,optionsMenuItems:Eg(w.config),optionsMessage:Og(Yy(A)),optionsSubtitle:"Feature Previews - Experimental"}):A.variant==="logs"?Fh(z,{logPath:A.log?.path??n.logFile,logLines:A.log?.lines??[]}):_h(z),v=null,T=null,R=null;w.pendingClear&&(m.moveTo(1,1),m.eraseDisplayBelow(),w.pendingClear=!1,y=null),m.noFormat(ng(ce,y)),y=ce,R=je?.regions??null,m.hideCursor(!0)};let Fs=A=>Wy(w,A),Jd=A=>By(w,A),Xd=A=>Gy(w,A),Qy=()=>{process.stdout.off("resize",Qd),process.off("SIGCONT",Zd),m.removeListener("key",Fs),m.removeListener("unknown",Jd),m.removeListener("mouse",Xd),w.scrollRenderTimer&&(clearTimeout(w.scrollRenderTimer),w.scrollRenderTimer=null),w.inspectionScrollRenderTimer&&(clearTimeout(w.inspectionScrollRenderTimer),w.inspectionScrollRenderTimer=null),w.leftNavInspectionTimer&&(clearTimeout(w.leftNavInspectionTimer),w.leftNavInspectionTimer=null),w.pendingTerminalKeySequence&&(clearTimeout(w.pendingTerminalKeySequence.timer),w.pendingTerminalKeySequence=null),w.ptyRenderTimer&&(clearTimeout(w.ptyRenderTimer),w.ptyRenderTimer=null),w.footerToastTimer&&(clearTimeout(w.footerToastTimer),w.footerToastTimer=null),w.focusFlashTimer&&(clearTimeout(w.focusFlashTimer),w.focusFlashTimer=null),ge.stop(),w.ptyRuntime.disposeAll(),m.grabInput(!1),m.hideCursor(!1),m.fullscreen(!1)};w.exit=A=>{Qy(),f(A)};let Qd=()=>{Kd(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(cn(Me(m.width,m.height))),w.state={mode:"main",shell:jn(w,w.state.shell)}),w.render()},Zd=()=>{Kd(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(cn(Me(m.width,m.height))),w.state={mode:"main",shell:jn(w,w.state.shell)}),w.render()};process.stdout.on("resize",Qd),process.on("SIGCONT",Zd),m.grabInput(!0),w.inputCaptureMode="control",m.hideCursor(!0),m.fullscreen(!0),m.on("key",Fs),m.on("unknown",Jd),m.on("mouse",Xd),C&&ge.register({id:"github.pull-requests",intervalMs:1e3,run:A=>_y(w,C,A)}),ge.register({id:"agent.activity-indicators",intervalMs:Mo,run:()=>{if(!k.previews.isEnabled(w.config,"agentActivityIndicators")){$=0,N=!1;return}let A=Date.now(),z=ui(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],A);(z||N)&&($=($+1)%Ug,w.state.mode==="main"&&w.render()),N=z}}),ge.start(),k.version.checkForUpdate().then(A=>{A.updateAvailable&&A.latest&&(w.updateText=`Update available: v${A.latest}`,w.render())}),w.bootHydrationReady=Gd(w).catch(()=>{}),w.render()})}async function wE(){try{if(process.argv[2]==="__craig-daemon"){let e=await Xy(process.argv[3]??process.cwd()),t=ve(e);return await yg(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await Xy(process.argv[3]??process.cwd()),t=ve(e);return await wg(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
282
- `),1}return sh({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=>Jy({uiStateFile:ve(e).uiStateFile,workspaceRoot:e})})}async function Xy(e){return yE(e)}var kE=await wE();process.exit(kE);
281
+ `&&(e.suppressTerminalEnterOnAttach=!1),rh(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function yE(e,t){if(e.pendingTerminalKeySequence){let n=th(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Es(r);if(s)return Yy(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(yd(r))return e.pendingTerminalKeySequence.raw=r,Hy(e),!0}return Ko(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>Ko(e),30)},!0)}function Hy(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>Ko(e),30))}function Ko(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function Yy(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function zy(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){Ey(e,hd(t));return}let n=hd(t);n!==0&&Bo(e,n)}function wE(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var Jy=1e3,TE=kE(import.meta.url),bE=TE("terminal-kit"),RE=bE.terminal;function Qd(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Xy(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Qy(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function SE(e,t){return e?e.tabId!==t.tabId?{tabId:t.tabId,kind:"full"}:e.kind==="full"||t.kind==="full"?{tabId:t.tabId,kind:"full"}:{tabId:t.tabId,kind:"rows",rowIndices:[...new Set([...e.rowIndices,...t.rowIndices])]}:t}async function Zy(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=ve(t),r=await k.load(n),s=k.runners.getEnabled(r),i=e.uiStateFile?await Un({uiStateFile:e.uiStateFile}):null,o=await Pr(t,void 0,s),a=Is(Pg(i,r),o);o=await Pr(t,a,s);let l={current:o},c=()=>{},u=()=>{},d=()=>{},p={workspaceRoot:t,onUpdate:g=>c(g),onActivity:g=>u(g),onActivityRemoved:g=>d(g),resolveSessionSpec:(g,f)=>Jg(l.current,f,t)},m=e.ptyRuntime??await kh({...p,paths:n,activityEnabled:k.previews.isEnabled(r,"agentActivityIndicators")});return new Promise(g=>{let f=e.terminal??RE,y=null,T=null,S=null,v=null,b=null,$=0,D=!1,_=new Map,C=m.managesPullRequestSync?null:new vr({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,he=new pn({resolutionMs:k.previews.isEnabled(r,"agentActivityIndicators")?Mo:Jy,onError:(A,z)=>xs(`heartbeat job "${A}"`,z,oe(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:Is(a,o)},get model(){return l.current},set model(A){l.current=A},config:r,enabledRunnerIds:s,creatingTask:!1,suppressTerminalEnterOnAttach:!1,lastTerminalKey:null,pendingScrollLines:0,pendingInspectionScrollLines:0,leftNavInspectionTimer:null,pendingLeftNavInspectionShell:null,pendingTerminalKeySequence:null,scrollRenderTimer:null,inspectionScrollRenderTimer:null,ptyRenderTimer:null,footerToastTimer:null,focusFlashUntil:null,focusFlashTimer:null,lastBackgroundPrPollError:null,versionText:`Craig v${k.version.getCurrent()}`,updateText:null,inspectionRefreshSequence:0,pendingClear:!0,inputCaptureMode:null,runtimeState:i,persistQueue:Promise.resolve(),taskMutationQueue:Promise.resolve(),bootHydrationReady:Promise.resolve(),paths:n,workspaceRoot:t,uiStateFile:e.uiStateFile,activeTerminal:f,ptyRuntime:m,resolve:g,render:()=>{},renderTaskNavigation:()=>!1,exit:A=>g(A),setAgentActivityEnabled:A=>{he.setResolutionMs(A?Mo:Jy),w.ptyRuntime.setActivityEnabled?.(A)}},w.setAgentActivityEnabled(k.previews.isEnabled(r,"agentActivityIndicators")),c=A=>{w.state.mode==="main"&&(b=SE(b,A),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let z=b;if(b=null,w.state.mode==="main"){let ce=jn(w,w.state.shell);if(w.state={mode:"main",shell:ce},!v||!T){w.render();return}let je=Me(f.width,f.height),Re={...v,terminal:ce.terminal},Mt=iy(je,Re,T,ce.centerZoomed,z?.kind==="rows"?z.rowIndices:null);if(!Mt){w.render();return}Mt.output.length>0&&f.noFormat(Mt.output),v=Re,T=Mt.region,S&&(S={...S,center:Mt.region}),y=null,f.hideCursor(!0)}},0)))},u=A=>{w.state.mode==="main"&&k.previews.isEnabled(w.config,"agentActivityIndicators")&&un(A.tabId)&&_.get(A.tabId)!==Ct(A.tabId,[A],Date.now())&&w.render()},d=A=>{w.state.mode==="main"&&k.previews.isEnabled(w.config,"agentActivityIndicators")&&un(A)&&_.get(A)!=="idle"&&w.render()};let ye=Promise.resolve(),Y=A=>{ye=ye.then(async()=>{let z=await Promise.all([...new Set(A)].map(ce=>R.getTask(w.paths,ce)));for(let ce of z)Er(w,ce);w.state.mode==="main"?w.state={mode:"main",shell:I(w,w.state.shell)}:w.state={...w.state,shell:I(w,w.state.shell)},w.render()}).catch(z=>xs("daemon task-state refresh",z,oe(w)))};w.ptyRuntime.setTasksChangedHandler?.(Y);let mn=A=>{let z=Me(f.width,f.height),ce=k.previews.isEnabled(w.config,"agentActivityIndicators"),je=ce?w.ptyRuntime.getActivitySnapshots?.()??[]:[],Re=Date.now(),Mt=Yh(I(w,A.shell),w.model,ce?{snapshots:je,now:Re,animationFrame:$}:void 0);if(_.clear(),ce)for(let rw of w.model.tasks)for(let Go of rw.ptyTabs)Go.kind==="agent"&&_.set(Go.id,Ct(Go.id,je,Re));let nw=qg(z,Mt,{centerOnly:A.shell.centerZoomed,focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:Mt,presentation:nw}},_s=(A,z,ce,je)=>{if(!S)return!1;let Re=oy(S,z.regions,ce);return Re?(Re.output.length>0&&f.noFormat(Re.output),v=A,S=Re.regions,T=Re.regions.center,y=je?z.frame:null,f.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;Jd(w),w.ptyRuntime.setPullRequestPollView?.(Qy(w.state)),w.ptyRuntime.setViewedTab?.(Ar(w,w.state.shell));let{data:A,presentation:z}=mn(w.state);return _s(A,z,["rail","left","center","footer"],!1)},w.render=()=>{Jd(w);let A=w.state;w.ptyRuntime.setPullRequestPollView?.(Qy(A)),w.ptyRuntime.setViewedTab?.(A.mode==="main"?Ar(w,A.shell):null);let z=Me(f.width,f.height),ce,je=null;if(A.mode==="main"){let Re=mn(A);if(je=Re.presentation,ce=je.frame,!w.pendingClear&&_s(Re.data,je,["rail","left","center","right","footer"],!0))return;v=Re.data,T=je.center}else ce=A.variant==="boot"?Fg(z,{menuIndex:A.menuIndex,optionsMessage:A.optionsMessage,versionText:w.versionText,updateText:w.updateText}):A.variant==="pause"?Lg(z,{menuIndex:A.menuIndex,optionsMessage:A.optionsMessage,versionText:w.versionText,updateText:w.updateText}):A.variant==="options"?Ao(z,{menuIndex:A.menuIndex,optionsMenuItems:Od}):A.variant==="runners"?Ao(z,{menuIndex:Qd(A).menuIndex,optionsMenuItems:$d(w.config,Qd(A)),optionsMessage:$h(Qd(A)),optionsSubtitle:"Runners"}):A.variant==="previews"?Ao(z,{menuIndex:Xy(A).menuIndex,optionsMenuItems:Dh(w.config),optionsMessage:Nh(Xy(A)),optionsSubtitle:"Feature Previews - Experimental"}):A.variant==="logs"?jg(z,{logPath:A.log?.path??n.logFile,logLines:A.log?.lines??[]}):Mg(z),v=null,T=null,S=null;w.pendingClear&&(f.moveTo(1,1),f.eraseDisplayBelow(),w.pendingClear=!1,y=null),f.noFormat(ih(ce,y)),y=ce,S=je?.regions??null,f.hideCursor(!0)};let Fs=A=>Ky(w,A),Zd=A=>Gy(w,A),eu=A=>zy(w,A),tw=()=>{process.stdout.off("resize",tu),process.off("SIGCONT",nu),f.removeListener("key",Fs),f.removeListener("unknown",Zd),f.removeListener("mouse",eu),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),he.stop(),w.ptyRuntime.disposeAll(),f.grabInput(!1),f.hideCursor(!1),f.fullscreen(!1)};w.exit=A=>{tw(),g(A)};let tu=()=>{Yd(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(dn(Me(f.width,f.height))),w.state={mode:"main",shell:jn(w,w.state.shell)}),w.render()},nu=()=>{Yd(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(dn(Me(f.width,f.height))),w.state={mode:"main",shell:jn(w,w.state.shell)}),w.render()};process.stdout.on("resize",tu),process.on("SIGCONT",nu),f.grabInput(!0),w.inputCaptureMode="control",f.hideCursor(!0),f.fullscreen(!0),f.on("key",Fs),f.on("unknown",Zd),f.on("mouse",eu),C&&he.register({id:"github.pull-requests",intervalMs:1e3,run:A=>My(w,C,A)}),he.register({id:"agent.activity-indicators",intervalMs:Mo,run:()=>{if(!k.previews.isEnabled(w.config,"agentActivityIndicators")){$=0,D=!1;return}let A=Date.now(),z=ui(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],A);(z||D)&&($=($+1)%Vh,w.state.mode==="main"&&w.render()),D=z}}),he.start(),k.version.checkForUpdate().then(A=>{A.updateAvailable&&A.latest&&(w.updateText=`Update available: v${A.latest}`,w.render())}),w.bootHydrationReady=zd(w).catch(()=>{}),w.render()})}async function IE(){try{if(process.argv[2]==="__craig-daemon"){let e=await ew(process.argv[3]??process.cwd()),t=ve(e);return await Th(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await ew(process.argv[3]??process.cwd()),t=ve(e);return await bh(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
282
+ `),1}return ag({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=>Zy({uiStateFile:ve(e).uiStateFile,workspaceRoot:e})})}async function ew(e){return PE(e)}var vE=await IE();process.exit(vE);