craig-cli 0.19.7 → 0.19.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.js +146 -144
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
- var ck=Object.defineProperty;var Ws=(e,t)=>{for(var n in t)ck(e,n,{get:t[n],enumerable:!0})};import{realpath as x0}from"node:fs/promises";import Te from"node:path";function Oe(e){let t=Te.join(e,".craig");return{workspaceRoot:e,repoRoot:e,craigDir:t,indexFile:Te.join(t,"index.json"),reposDir:Te.join(t,"repos"),workspacesDir:Te.join(t,"workspaces"),runtimeDir:Te.join(t,"runtime"),uiStateFile:Te.join(t,"runtime","ui-state.json"),tasksDir:Te.join(t,"tasks"),jobsDir:Te.join(t,"jobs"),commandsDir:Te.join(t,"commands"),eventsDir:Te.join(t,"events"),orchestrationDir:Te.join(t,"orchestration"),logsDir:Te.join(t,"logs"),logFile:Te.join(t,"logs","craig.jsonl"),artifactsDir:Te.join(t,"artifacts"),worktreesDir:Te.join(t,"worktrees"),configFile:Te.join(t,"config.json")}}import bd from"node:path";import{readFile as Cv}from"node:fs/promises";import{readFile as yk}from"node:fs/promises";import{randomUUID as dk}from"node:crypto";import{chmod as uk,open as pk,readFile as fk,rename as mk,rm as hk}from"node:fs/promises";import ka from"node:path";async function U(e,t,n={}){let r=ka.dirname(e),s=ka.join(r,`.${ka.basename(e)}.${process.pid}.${Date.now()}.${dk()}.tmp`),i=await pk(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 mk(s,e),n.mode!==void 0&&await uk(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await hk(s,{force:!0}).catch(()=>{}),o}}async function Vs(e){try{let t=await fk(e,"utf8");return JSON.parse(t)}catch(t){if(gk(t))return null;throw t}}function gk(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 yk(e.uiStateFile,"utf8"),n=JSON.parse(t);return wk(n,e.uiStateFile)}catch(t){if(kk(t))return null;throw t}}async function yt(e,t){await U(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function Gs(){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 wk(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")||!wn(e,"inputMode")||!wn(e,"focusedRegion")||!wn(e,"activeTab")||!wn(e,"inspectorSection")||!wn(e,"inspectionMode")||!Ks(e,"openInspectionKind")||!Ks(e,"selectedFileTreePath")||!Ks(e,"selectedFilePath")||!Ks(e,"selectedDiffPath")||!Nu(e,"collapsedFileTreePaths")||!wn(e,"ignoredUpdateVersion")||!Nu(e,"seenPreviewIds")||!wn(e,"selectedActionId")||!Tk(e,"readAgentActivityAt")||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 wn(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function Ks(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function Nu(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function kk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}function Tk(e,t){if(!(t in e))return!0;let n=e[t];return typeof n=="object"&&n!==null&&!Array.isArray(n)&&Object.values(n).every(r=>typeof r=="number"&&Number.isFinite(r)&&r>=0)}var Ta={};Ws(Ta,{RUNNER_IDS:()=>me,STABLE_RUNNER_IDS:()=>wt,assertEnabled:()=>xu,buildCommand:()=>Mu,getConfiguredProfile:()=>Hs,getDefault:()=>_u,getDisplayName:()=>Lu,getEnabled:()=>Ys,getProfile:()=>Bn,isRunnerType:()=>zs,parse:()=>Fu,setRunnerEnabled:()=>ju,setRunnerPath:()=>qu});var wt=["codex","cursor","claude"],me=[...wt,"pi"];var Du={codex:{id:"codex",displayName:"Codex",executable:"codex",defaultAgentTitle:"Codex"},cursor:{id:"cursor",displayName:"Cursor",executable:"cursor-agent",defaultAgentTitle:"Cursor"},claude:{id:"claude",displayName:"Claude",executable:"claude",defaultAgentTitle:"Claude"},pi:{id:"pi",displayName:"Pi",executable:"pi",defaultAgentTitle:"Pi"}};var Bn=e=>Du[e];var Hs=(e,t={})=>{let n=Bn(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}};var Ys=(e={})=>me.filter(t=>t!=="pi"||e.previews?.piRunner===!0).filter(t=>e.runners?.[t]?.enabled!==!1);var _u=(e={})=>{let t=Ys(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 xu=(e,t={})=>{if(e==="pi"&&t.previews?.piRunner!==!0)throw new Error('Runner "pi" is experimental. Enable the piRunner feature preview in .craig/config.json.');if(t.runners?.[e]?.enabled===!1)throw new Error(`Runner "${e}" is disabled in .craig/config.json.`)};var zs=e=>me.includes(e);var Fu=e=>{if(!e||e.length===0)return"codex";if(!zs(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${me.join(", ")}.`);return e};var Lu=e=>Bn(e).displayName;var Mu=(e,t,n={})=>{let r=[Hs(e,n).executable];return t&&t.length>0&&r.push(t),r};var ju=(e,t,n)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}});var qu=(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 ba={};Ws(ba,{PREVIEW_FEATURE_IDS:()=>kt,isEnabled:()=>Uu,setEnabled:()=>Bu});var kt=["agentOrchestration","piRunner","fileOpen","panelPolish"];function Uu(e,t){return e.previews?.[t]===!0}function Bu(e,t,n){return{...e,previews:{...e.previews,[t]:n}}}import{mkdir as bk,readFile as Rk,writeFile as Pk}from"node:fs/promises";import Sk from"node:path";var Ik=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Wu=async e=>{try{return await Rk(e,"utf8")}catch(t){if(Ik(t))return null;throw t}},Vu=async(e,t)=>{await bk(Sk.dirname(e),{recursive:!0}),await Pk(e,t,"utf8")};var Js=(e,t)=>{if(typeof e!="object"||e===null)throw new Error(`Craig config at ${t} is invalid. Expected a JSON object.`);let n=e;if(n.runners!==void 0){if(typeof n.runners!="object"||n.runners===null||Array.isArray(n.runners))throw new Error(`Craig config at ${t} is invalid. "runners" must be an object.`);for(let[r,s]of Object.entries(n.runners)){if(!me.includes(r))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" is not supported. Expected one of: ${me.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(typeof s!="boolean")throw new Error(`Craig config at ${t} is invalid. "previews.${r}" must be a boolean.`)}return n};var Ra=async(e,t={readConfigFile:Wu})=>{let n=await t.readConfigFile(e.configFile);if(!n)return{};if(n.trimStart()[0]!=="{")throw new Error(`Craig config at ${e.configFile} is malformed. Remove or repair the file before rerunning Craig.`);let r;try{r=JSON.parse(n)}catch{throw new Error(`Craig config at ${e.configFile} is malformed. Remove or repair the file before rerunning Craig.`)}return Js(r,e.configFile)};var Pa=async(e,t,n={writeConfigFile:Vu})=>{Js(t,e.configFile),await n.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
4
- `)};var Ia={};Ws(Ia,{checkForUpdate:()=>Gu,getCurrent:()=>Xs,isNewer:()=>Sa});var Xs=()=>{try{return"0.19.7"}catch{return"unknown"}};var vk="https://registry.npmjs.org/craig-cli/latest",Ck=3600*1e3,Ak={value:null},Ku=/^\d+\.\d+\.\d+$/,Sa=(e,t)=>{if(!Ku.test(e)||!Ku.test(t))return!1;let n=c=>c.split(".").map(Number),[r=0,s=0,i=0]=n(e),[o=0,a=0,l=0]=n(t);return r!==o?r>o:s!==a?s>a:i>l},Gu=async(e={fetch:globalThis.fetch,getCurrent:Xs,cache:Ak})=>{let t=e.getCurrent(),n=Date.now();if(e.cache.value&&n-e.cache.value.cachedAt<Ck)return e.cache.value.result;let r=null;try{let i=await e.fetch(vk,{signal:AbortSignal.timeout(5e3)});i.ok&&(r=(await i.json()).version??null)}catch{}let s={current:t,latest:r,updateAvailable:r!==null&&r!==t&&Sa(r,t)};return e.cache.value={result:s,cachedAt:n},s};var k={load:Ra,save:Pa,previews:ba,runners:Ta,version:Ia};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},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=Hu[t],this.retryable=r.retryable??!1,this.details=r.details??{}}};function va(e){return e instanceof g?e:new g("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as Ek,mkdir as Ok,readFile as $k}from"node:fs/promises";import Nk from"node:path";var Yu=80,Qs=async(e,t)=>{await Ok(Nk.dirname(e.logFile),{recursive:!0});let n={timestamp:new Date().toISOString(),...t};await Ek(e.logFile,`${JSON.stringify(n)}
5
- `,"utf8")},zu=async(e,t)=>{try{await Qs(e,t)}catch{}},Zs=async(e,t=Yu)=>{try{let s=(await $k(e.logFile,"utf8")).trimEnd().split(`
6
- `).filter(i=>i.length>0).map(Dk);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(xk(n))return{path:e.logFile,lines:[],empty:!0};throw n}},Ca=async(e,t)=>Qs(e,{level:"error",component:"application",event:_k(t.context),message:t.message,...t.details?{details:t.details}:{}}),Ju=async(e,t)=>{try{await Ca(e,t)}catch{}},Xu=Zs,Qu=async(e,t=Yu)=>Zs(e,t);function Dk(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 _k(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function xk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var pe={appendErrorLog:Ca,appendErrorLogBestEffort:Ju,appendLog:Qs,appendLogBestEffort:zu,readLog:Zs,readErrorLog:Xu,readRecentErrorLines:Qu};function np(e){let{commandTokens:t,options:n,help:r}=Lk(e);if(r)return ep({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":_r(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:Aa(o,"Repo path")};break;case"repo:list":_r(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:se(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:Aa(o,"Workspace path")};break;case"workspace:list":a=Mk(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:se(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:se(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:se(o,"Workspace id")};break;case"file:open":a={kind:"openFile",path:se(o,"File path")};break;case"task:new":a=qk(o);break;case"task:create-child":a=Uk(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:se(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:se(o,"Task id")}};break;case"task:list":a=jk(o);break;case"task:current":_r(o,"task current"),a={kind:"currentTask"};break;case"task:rename":a={kind:"renameTask",title:Aa(o,"Task title")};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:se(o,"Task id")};break;case"task:pr":a=Bk(o);break;case"task:repo":if(o[0]!=="add")throw I(`Unsupported task repo command: ${o.join(" ")}`);ti(o,3,"task repo add"),a={kind:"addTaskRepoTarget",taskId:ei(o,1,"Task id"),repoId:ei(o,2,"Repo id")};break;case"task:wait":a=zk(o);break;case"agent:list":_r(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=Kk(o);break;case"agent:send":a=Gk(o);break;case"command:show":a={kind:"showPromptCommand",commandId:se(o,"Command id")};break;case"command:list":_r(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:se(o,"Command id")};break;case"command:wait":a=Hk(o);break;case"events:list":a=Zu(o,!1);break;case"events:watch":a=Zu(o,!0);break;case"fury:validate":a={kind:"validateFury",file:se(o,"Fury file")};break;case"fury:plan":a=Jk(o);break;case"fury:approve":a={kind:"approveFury",planId:se(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:se(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:se(o,"Fury run id")};break;case"fury:watch":a=Xk(o);break;case"fury:cancel":a={kind:"cancelFury",runId:se(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:se(o,"Fury run id")};break;case"fury:step":a=Qk(o);break;case"fury:reviews":a=Zk(o);break;case"fury:review":a=eT(o);break;case"task:logs":a={kind:"streamTaskLogs",taskId:se(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:se(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:se(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:se(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:se(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:ei(o,0,"Task id"),repoId:ei(o,1,"Repo id")},ti(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:se(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw I(`Unsupported command: ${t.join(" ")}`)}return ep(a,n)}function rp(e){let t=e[0]==="--"?e.slice(1):e,n=!0;for(let r of t){if(r==="--"){n=!1;continue}if(n&&r==="--json")return!0}return!1}function Fk(e){return e.kind==="actFuryReview"?`fury.review.${e.action==="request_changes"?"request-changes":e.action}`:{addWorkspace:"workspace.add",addRepo:"repo.add",listRepos:"repo.list",removeRepo:"repo.remove",listWorkspaces:"workspace.list",archiveWorkspace:"workspace.archive",restoreWorkspace:"workspace.restore",removeWorkspace:"workspace.remove",createTask:"task.new",createChildTask:"task.create-child",listTaskChildren:"task.children",cancelTaskTree:"task.cancel-tree",validateFury:"fury.validate",planFury:"fury.plan",approveFury:"fury.approve",runFury:"fury.run",showFury:"fury.status",watchFury:"fury.watch",cancelFury:"fury.cancel",resumeFury:"fury.resume",completeFuryStep:"fury.step.complete",failFuryStep:"fury.step.fail",listFuryReviews:"fury.reviews.list",showFuryReview:"fury.review.show",actFuryReview:"fury.review.action",listTasks:"task.list",currentTask:"task.current",renameTask:"task.rename",showTask:"task.show",showCurrentTask:"task.show",showTaskPr:"task.pr.show",discoverTaskPr:"task.pr.discover",linkTaskPr:"task.pr.link",refreshTaskPr:"task.pr.refresh",unlinkTaskPr:"task.pr.unlink",listAgents:"agent.list",showAgentStatus:"agent.status",sendAgentPrompt:"agent.send",showPromptCommand:"command.show",listPromptCommands:"command.list",cancelPromptCommand:"command.cancel",waitPromptCommand:"command.wait",waitTask:"task.wait",listEvents:"events.list",watchEvents:"events.watch",addTaskLink:"link.add",addTaskRepoTarget:"task.repo.add",listTaskLinks:"link.list",openFile:"file.open",refreshInteractiveState:"interactive.refresh",showSelectedTask:"task.show",streamTaskLogs:"task.logs",streamSelectedTaskLogs:"task.logs",showTaskDiff:"task.diff",showSelectedTaskDiff:"task.diff",openTask:"task.open",openSelectedTask:"task.open",runChecks:"task.check",runSelectedTaskChecks:"task.check",commitTask:"task.commit",commitSelectedTask:"task.commit",showContext:"context.show",help:"help",exit:"exit"}[e.kind]}function Ea(){return["Craig commands:"," craig [--workspace-root <path>] [--task <id>] [--json] [--no-input] <command>"," craig context show Show resolved workspace, task, and agent-tab context"," craig repo add <path> Register a repo in the current Craig workspace"," craig workspace add <path> Register a repo or parent-directory workspace"," craig repo list List registered repos"," craig repo remove <id> Remove a registered repo"," craig workspace list [--archived] List workspaces"," craig workspace archive <id> Archive a workspace"," craig workspace restore <id> Restore an archived workspace"," craig workspace remove <id> Remove an archived workspace"," craig file open <path> Open a readable file in the active Craig TUI (preview)"," craig task new --repo <repo-id> [--runner codex|cursor|claude|pi] <prompt>"," craig task new --workspace <workspace-id> [--runner codex|cursor|claude|pi] <prompt>"," craig task create-child [--parent <task-id>] [--repo <repo-id> | --workspace <workspace-id>] [--runner codex|cursor|claude|pi] [--idempotency-key <key>] <prompt>"," craig task children [<task-id>] List direct child tasks"," craig task cancel-tree [<task-id>] Cancel a task and all descendants"," craig task list [--repo <repo-id>] List known Craig tasks"," craig task current Show the task resolved from flags, environment, or cwd"," craig task rename <name> Rename the resolved task without changing its ID or worktree"," craig task show [<id>] Show task details; omit id to use resolved context"," craig task repo add <task-id> <repo-id> Provision a repo target in an existing project task"," craig task pr show [<id>] [--repo <repo-id>]"," craig task pr discover [<id>] [--repo <repo-id>]"," craig task pr link [<id>] --pr <url|number> [--repo <repo-id>]"," craig task pr refresh [<id>] [--repo <repo-id>]"," craig task pr unlink [<id>] --pr <url|number> [--repo <repo-id>]"," craig agent list [--task <task-id>] List agent-tab and task roll-up states"," craig agent status [--task <task-id>] [--tab <tab-id>] Show agent state details"," craig agent send --task <task-id> [--tab <tab-id>] (--prompt <text> | --prompt-file <path> | --stdin)"," [--delivery when-ready|immediate] [--timeout <duration>] [--idempotency-key <key>]"," craig command show <command-id> Show a durable prompt command"," craig command list [--task <task-id>] List durable prompt commands"," craig command cancel <command-id> Cancel a queued prompt command"," craig command wait <command-id> [--state <states>] [--timeout <duration>]"," craig task wait [<id>] --state <states> [--tab <tab-id>] [--timeout <duration>]"," craig events list [--task <task-id>] [--type <glob>] [--after <cursor>] --json"," craig events watch [--task <task-id>] [--type <glob>] [--after <cursor>] [--format jsonl]"," craig fury validate <file> Validate a versioned fury YAML definition"," craig fury plan <file> [--root-task <id>] [--input key=value] Create an immutable approval plan"," craig fury approve <plan-id> Approve an exact validated plan (human only)"," craig fury run <plan-id> Start the single run authorized by an approved plan"," craig fury status|watch|cancel|resume <run-id> Inspect or control a durable run"," craig fury step complete|fail --run <run-id> --step <step-id> Explicitly finish agent work"," craig fury reviews list [--run <run-id>] [--state <state>] List human checkpoints"," craig fury review show|approve|reject|request-changes|resubmit <review-id>"," craig task logs <id> Stream Craig-managed logs for a task"," craig task diff <id> Show the current worktree diff for a task"," craig task open <id> Open the task worktree or print its path"," craig task check <id> Run configured checks for a task"," craig task commit <id> Commit all task worktree changes"," craig link add <task-id> <repo-id> Add contextual repo linkage only (does not provision a target)"," craig link list <task-id> List linked repos for a task"].join(`
7
- `)}function Lk(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||!tp(l)){n.push(l);continue}if(s.has(l))throw I(`Global option ${l} may only be provided once.`);if(s.add(l),l==="--json"){r.json=!0;continue}if(l==="--no-input"){r.noInput=!0;continue}if(l==="--help"||l==="-h"){i=!0;continue}let c=t[a+1];if(c===void 0||c==="--"||tp(c))throw I(`Global option ${l} requires a value.`);a+=1,l==="--workspace-root"?r.workspaceRoot=M(c,"Workspace root"):r.taskId=M(c,"Task id")}return{commandTokens:n,options:r,help:i}}function Mk(e){if(e.length===0)return{kind:"listWorkspaces",archived:!1};if(e.length===1&&e[0]==="--archived")return{kind:"listWorkspaces",archived:!0};throw I(`Unsupported command: workspace list ${e.join(" ")}`)}function jk(e){if(e.length===0)return{kind:"listTasks"};if(e.length===2&&e[0]==="--repo")return{kind:"listTasks",repoId:M(e[1],"Repo id")};throw I(`Unsupported command: task list ${e.join(" ")}`)}function qk(e){let t,n,r,s=[],i=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){i=!1;continue}if(!i||!["--repo","--workspace","--runner"].includes(l)){if(i&&l.startsWith("--"))throw I(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw I(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw I("Task option --repo may only be provided once.");t=M(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw I("Task option --workspace may only be provided once.");n=M(c,"Workspace id")}else{if(r!==void 0)throw I("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(d){throw I(d instanceof Error?d.message:"Unsupported runner.")}}}if(!t&&!n)throw I("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw I("Task creation accepts either '--repo' or '--workspace', not both.");let o=M(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function Uk(e){let t,n,r,s,i,o=[],a=!0;for(let l=0;l<e.length;l+=1){let c=e[l];if(c==="--"){a=!1;continue}if(!a||!["--parent","--repo","--workspace","--runner","--idempotency-key"].includes(c)){if(a&&c.startsWith("--"))throw I(`Unsupported task create-child option: ${c}`);o.push(c);continue}let d=e[l+1];if(d===void 0||d==="--")throw I(`Task option ${c} requires a value.`);if(l+=1,c==="--parent"){if(t)throw I("Task option --parent may only be provided once.");t=M(d,"Parent task id")}else if(c==="--repo"){if(n)throw I("Task option --repo may only be provided once.");n=M(d,"Repo id")}else if(c==="--workspace"){if(r)throw I("Task option --workspace may only be provided once.");r=M(d,"Workspace id")}else if(c==="--runner"){if(s)throw I("Task option --runner may only be provided once.");try{s=k.runners.parse(d)}catch(u){throw I(u instanceof Error?u.message:"Unsupported runner.")}}else{if(i)throw I("Task option --idempotency-key may only be provided once.");i=M(d,"Idempotency key")}}if(n&&r)throw I("Child task creation accepts only one of --repo or --workspace.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},...n?{repoId:n}:{},...r?{workspaceId:r}:{},prompt:M(o.join(" "),"Child task prompt"),...s?{runner:s}:{},...i?{idempotencyKey:i}:{}}}function Bk(e){let[t,...n]=e;if(!["show","discover","link","refresh","unlink"].includes(t??""))throw I(`Unsupported command: task pr ${e.join(" ")}`);let r,s,i;for(let a=0;a<n.length;a+=1){let l=n[a];if(l!=="--repo"&&l!=="--pr"){if(l.startsWith("--"))throw I(`Unsupported task pr ${t} option: ${l}`);if(r!==void 0)throw I(`task pr ${t} accepts at most one task id.`);r=M(l,"Task id");continue}let c=n[a+1];if(c===void 0||c==="--")throw I(`Task PR option ${l} requires a value.`);if(a+=1,l==="--repo"){if(s!==void 0)throw I("Task PR option --repo may only be provided once.");s=M(c,"Repo id")}else{if(i!==void 0)throw I("Task PR option --pr may only be provided once.");i=M(c,"Pull request selector")}}if((t==="link"||t==="unlink")&&i===void 0)throw I(`task pr ${t} requires --pr <url|number>.`);if(t!=="link"&&t!=="unlink"&&i!==void 0)throw I(`task pr ${t} does not accept --pr.`);let o={...r?{taskId:r}:{},...s?{repoId:s}:{}};switch(t){case"show":return{kind:"showTaskPr",...o};case"discover":return{kind:"discoverTaskPr",...o};case"link":return{kind:"linkTaskPr",...o,pullRequest:i};case"refresh":return{kind:"refreshTaskPr",...o};case"unlink":return{kind:"unlinkTaskPr",...o,pullRequest:i};default:throw I(`Unsupported command: task pr ${e.join(" ")}`)}}var Oa=300*1e3,Wk=new Set(["idle","working","ready","error"]),Vk=new Set(["queued","delivering","delivered","failed","cancelled"]);function Kk(e){if(e.length===0)return{kind:"showAgentStatus"};if(e.length===2&&e[0]==="--tab")return{kind:"showAgentStatus",tabId:M(e[1],"Agent tab id")};throw I(`Unsupported command: agent status ${e.join(" ")}`)}function Gk(e){let t,n,r="when-ready",s=Oa,i,o=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--prompt","--prompt-file","--stdin","--tab","--delivery","--timeout","--idempotency-key"].includes(l))throw I(`Unsupported agent send option: ${l}`);if(o.has(l))throw I(`Agent send option ${l} may only be provided once.`);if(o.add(l),l==="--stdin"){if(t)throw I("Agent send accepts exactly one prompt source.");t={source:"stdin"};continue}let c=e[a+1];if(c===void 0||c.startsWith("--"))throw I(`Agent send option ${l} requires a value.`);if(a+=1,l==="--prompt"||l==="--prompt-file"){if(t)throw I("Agent send accepts exactly one prompt source.");t=l==="--prompt"?{source:"inline",text:M(c,"Prompt")}:{source:"file",path:M(c,"Prompt file")}}else if(l==="--tab")n=M(c,"Agent tab id");else if(l==="--delivery"){if(c!=="when-ready"&&c!=="immediate")throw I('Agent send delivery must be "when-ready" or "immediate".');r=c}else l==="--timeout"?s=Na(c):i=M(c,"Idempotency key")}if(!t)throw I("Agent send requires --prompt, --prompt-file, or --stdin.");return{kind:"sendAgentPrompt",prompt:t,delivery:r,timeoutMs:s,...n?{tabId:n}:{},...i?{idempotencyKey:i}:{}}}function Hk(e){let t=M(e[0]??"","Command id"),n,r=Oa,s=new Set;for(let i=1;i<e.length;i+=1){let o=e[i];if(o!=="--state"&&o!=="--timeout")throw I(`Unsupported command wait option: ${o}`);if(s.has(o))throw I(`Command wait option ${o} may only be provided once.`);s.add(o);let a=e[i+1];if(a===void 0||a.startsWith("--"))throw I(`Command wait option ${o} requires a value.`);i+=1,o==="--state"?n=Yk(a):r=Na(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function Yk(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Vk.has(n)))throw I(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function Zu(e,t){let n,r,s="human",i=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--type","--after","--format"].includes(l))throw I(`Unsupported events ${t?"watch":"list"} option: ${l}`);if(!t&&l==="--format")throw I("--format is supported only by events watch.");if(i.has(l))throw I(`Events option ${l} may only be provided once.`);i.add(l);let c=e[a+1];if(c===void 0||c.startsWith("--"))throw I(`Events option ${l} requires a value.`);if(a+=1,l==="--type")n=M(c,"Event type glob");else if(l==="--after")r=M(c,"Event cursor");else if(c==="jsonl")s="jsonl";else throw I('Events watch format must be "jsonl".')}let o={...n?{typeGlob:n}:{},...r?{after:r}:{}};return t?{kind:"watchEvents",...o,format:s}:{kind:"listEvents",...o}}function zk(e){let t,n,r,s=Oa,i=new Set;for(let o=0;o<e.length;o+=1){let a=e[o];if(!["--state","--tab","--timeout"].includes(a)){if(a.startsWith("--"))throw I(`Unsupported task wait option: ${a}`);if(t!==void 0)throw I("task wait accepts at most one task id.");t=M(a,"Task id");continue}if(i.has(a))throw I(`Task wait option ${a} may only be provided once.`);i.add(a);let l=e[o+1];if(l===void 0||l.startsWith("--"))throw I(`Task wait option ${a} requires a value.`);o+=1,a==="--state"?n=tT(l):a==="--tab"?r=M(l,"Agent tab id"):s=Na(l)}if(!n)throw I("task wait requires --state <idle|working|ready|error>[,...].");return{kind:"waitTask",...t?{taskId:t}:{},states:n,...r?{tabId:r}:{},timeoutMs:s}}function Jk(e){let t,n,r={};for(let s=0;s<e.length;s+=1){let i=e[s];if(i!=="--input"&&i!=="--root-task"){if(i.startsWith("--"))throw I(`Unsupported fury plan option: ${i}`);if(t!==void 0)throw I("fury plan accepts exactly one definition file.");t=M(i,"Fury file");continue}let o=e[s+1];if(o===void 0||o.startsWith("--"))throw I(`Fury plan option ${i} requires a value.`);if(s+=1,i==="--root-task"){if(n)throw I("Fury plan option --root-task may only be provided once.");n=M(o,"Root task id");continue}let a=o.indexOf("=");if(a<1)throw I(`Invalid fury input "${o}". Use key=value.`);let l=M(o.slice(0,a),"Fury input name");if(Object.hasOwn(r,l))throw I(`Fury input "${l}" may only be provided once.`);r[l]=o.slice(a+1)}if(!t)throw I("fury plan requires a definition file.");return{kind:"planFury",file:t,inputs:r,...n?{rootTaskId:n}:{}}}function Xk(e){let t=M(e[0]??"","Fury run id"),n,r="human";for(let s=1;s<e.length;s+=2){let i=e[s],o=e[s+1];if(!o||!["--after","--format"].includes(i??""))throw I("fury watch supports --after and --format jsonl.");if(i==="--after")n=M(o,"Event cursor");else if(o==="jsonl")r=o;else throw I("fury watch format must be jsonl.")}return{kind:"watchFury",runId:t,...n?{after:n}:{},format:r}}function Qk(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw I("fury step requires complete or fail.");let n=$a(e.slice(1),["--run","--step","--output","--output-file","--stdin","--reason"]),r=M(n.get("--run")??"","Fury run id"),s=M(n.get("--step")??"","Fury step id");if(t==="fail"){if(["--output","--output-file","--stdin"].some(a=>n.has(a)))throw I("fury step fail accepts only --reason.");return{kind:"failFuryStep",runId:r,stepId:s,reason:M(n.get("--reason")??"","Failure reason")}}if(n.has("--reason"))throw I("fury step complete does not accept --reason.");let i=["--output","--output-file","--stdin"].filter(a=>n.has(a));if(i.length>1)throw I("fury step complete accepts only one output source.");let o=i[0];return{kind:"completeFuryStep",runId:r,stepId:s,...o==="--output"?{output:{source:"inline",text:n.get(o)}}:o==="--output-file"?{output:{source:"file",path:n.get(o)}}:o==="--stdin"?{output:{source:"stdin"}}:{}}}function Zk(e){if(e[0]!=="list")throw I("fury reviews requires list.");let t=$a(e.slice(1),["--run","--state"]),n=t.get("--run"),r=t.get("--state");if(r&&!["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"].includes(r))throw I(`Unsupported fury review state: ${r}`);return{kind:"listFuryReviews",...n?{runId:n}:{},...r?{state:r}:{}}}function eT(e){let t=e[0],n=M(e[1]??"","Fury review id");if(t==="show")return ti(e,2,"fury review show"),{kind:"showFuryReview",reviewId:n};if(!t||!["approve","reject","request-changes","resubmit"].includes(t))throw I("Unsupported fury review action.");let r=$a(e.slice(2),["--note","--reason","--summary"]),s=t==="request-changes"?"request_changes":t,i=r.get("--note")??r.get("--reason")??r.get("--summary"),o=t==="approve"?"--note":t==="resubmit"?"--summary":"--reason";if([...r.keys()].some(a=>a!==o))throw I(`fury review ${t} accepts only ${o}.`);return{kind:"actFuryReview",reviewId:n,action:s,...i?{message:i}:{}}}function $a(e,t){let n=new Map;for(let r=0;r<e.length;r+=1){let s=e[r];if(!t.includes(s)||n.has(s))throw I(`Unsupported or duplicate option: ${s}`);if(s==="--stdin"){n.set(s,"true");continue}let i=e[++r];if(i===void 0||i.startsWith("--"))throw I(`Option ${s} requires a value.`);n.set(s,M(i,s))}return n}function tT(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Wk.has(n)))throw I(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function Na(e){let t=/^(\d+)(ms|s|m|h)$/.exec(e.trim());if(!t)throw I(`Invalid duration "${e}". Use values such as 500ms, 30s, 5m, or 1h.`);let n=Number(t[1]),r={ms:1,s:1e3,m:6e4,h:36e5}[t[2]],s=n*r;if(!Number.isSafeInteger(s))throw I(`Duration "${e}" is too large.`);return s}function ep(e,t){return{mode:"command",command:e,commandName:Fk(e),options:t}}function tp(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function _r(e,t){ti(e,0,t)}function ti(e,t,n){if(e.length!==t)throw I(`Command ${n} received an unexpected number of arguments.`)}function se(e,t){if(e.length!==1)throw I(`${t} is required and must be provided once.`);return M(e[0],t)}function Aa(e,t){return M(e.join(" "),t)}function ei(e,t,n){return M(e[t]??"",n)}function M(e,t){let n=e.trim();if(n.length===0)throw I(`${t} cannot be empty.`);return n}function I(e){return new g("CLI_USAGE",`${e}
2
+ var yk=Object.defineProperty;var Hs=(e,t)=>{for(var n in t)yk(e,n,{get:t[n],enumerable:!0})};import{realpath as W0}from"node:fs/promises";import Te from"node:path";function $e(e){let t=Te.join(e,".craig");return{workspaceRoot:e,repoRoot:e,craigDir:t,indexFile:Te.join(t,"index.json"),reposDir:Te.join(t,"repos"),workspacesDir:Te.join(t,"workspaces"),runtimeDir:Te.join(t,"runtime"),uiStateFile:Te.join(t,"runtime","ui-state.json"),tasksDir:Te.join(t,"tasks"),jobsDir:Te.join(t,"jobs"),commandsDir:Te.join(t,"commands"),eventsDir:Te.join(t,"events"),orchestrationDir:Te.join(t,"orchestration"),logsDir:Te.join(t,"logs"),logFile:Te.join(t,"logs","craig.jsonl"),artifactsDir:Te.join(t,"artifacts"),worktreesDir:Te.join(t,"worktrees"),configFile:Te.join(t,"config.json")}}import Id from"node:path";import{readFile as _v}from"node:fs/promises";import{readFile as Ik}from"node:fs/promises";import{randomUUID as wk}from"node:crypto";import{chmod as kk,open as Tk,readFile as bk,rename as Rk,rm as Pk}from"node:fs/promises";import Ra from"node:path";async function U(e,t,n={}){let r=Ra.dirname(e),s=Ra.join(r,`.${Ra.basename(e)}.${process.pid}.${Date.now()}.${wk()}.tmp`),i=await Tk(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 Rk(s,e),n.mode!==void 0&&await kk(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await Pk(s,{force:!0}).catch(()=>{}),o}}async function Ys(e){try{let t=await bk(e,"utf8");return JSON.parse(t)}catch(t){if(Sk(t))return null;throw t}}function Sk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}async function Bn(e){try{let t=await Ik(e.uiStateFile,"utf8"),n=JSON.parse(t);return vk(n,e.uiStateFile)}catch(t){if(Ck(t))return null;throw t}}async function yt(e,t){await U(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function Js(){return{version:1,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null,selectedPtyTabId:null,inputMode:"control",focusedRegion:"tasks",activeTab:"agent",inspectorSection:"task",inspectionMode:"files",openInspectionKind:null,selectedFileTreePath:null,selectedFilePath:null,selectedDiffPath:null,collapsedFileTreePaths:[],selectedActionId:"commit",updatedAt:new Date().toISOString()}}function vk(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")||!wn(e,"inputMode")||!wn(e,"focusedRegion")||!wn(e,"activeTab")||!wn(e,"inspectorSection")||!wn(e,"inspectionMode")||!zs(e,"openInspectionKind")||!zs(e,"selectedFileTreePath")||!zs(e,"selectedFilePath")||!zs(e,"selectedDiffPath")||!xu(e,"collapsedFileTreePaths")||!wn(e,"ignoredUpdateVersion")||!xu(e,"seenPreviewIds")||!wn(e,"selectedActionId")||!Ak(e,"readAgentActivityAt")||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 wn(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function zs(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function xu(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function Ck(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}function Ak(e,t){if(!(t in e))return!0;let n=e[t];return typeof n=="object"&&n!==null&&!Array.isArray(n)&&Object.values(n).every(r=>typeof r=="number"&&Number.isFinite(r)&&r>=0)}var Pa={};Hs(Pa,{RUNNER_IDS:()=>me,STABLE_RUNNER_IDS:()=>wt,assertEnabled:()=>ju,buildCommand:()=>Bu,getConfiguredProfile:()=>Xs,getDefault:()=>Mu,getDisplayName:()=>Uu,getEnabled:()=>Qs,getProfile:()=>Wn,isRunnerType:()=>Zs,parse:()=>qu,setRunnerEnabled:()=>Wu,setRunnerPath:()=>Vu});var wt=["codex","cursor","claude"],me=[...wt,"pi"];var Lu={codex:{id:"codex",displayName:"Codex",executable:"codex",defaultAgentTitle:"Codex"},cursor:{id:"cursor",displayName:"Cursor",executable:"cursor-agent",defaultAgentTitle:"Cursor"},claude:{id:"claude",displayName:"Claude",executable:"claude",defaultAgentTitle:"Claude"},pi:{id:"pi",displayName:"Pi",executable:"pi",defaultAgentTitle:"Pi"}};var Wn=e=>Lu[e];var Xs=(e,t={})=>{let n=Wn(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}};var Qs=(e={})=>me.filter(t=>t!=="pi"||e.previews?.piRunner===!0).filter(t=>e.runners?.[t]?.enabled!==!1);var Mu=(e={})=>{let t=Qs(e);if(t.length===0)throw new Error("No runners are enabled. Enable at least one runner in .craig/config.json.");return t.includes("codex")?"codex":t[0]};var ju=(e,t={})=>{if(e==="pi"&&t.previews?.piRunner!==!0)throw new Error('Runner "pi" is experimental. Enable the piRunner feature preview in .craig/config.json.');if(t.runners?.[e]?.enabled===!1)throw new Error(`Runner "${e}" is disabled in .craig/config.json.`)};var Zs=e=>me.includes(e);var qu=e=>{if(!e||e.length===0)return"codex";if(!Zs(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${me.join(", ")}.`);return e};var Uu=e=>Wn(e).displayName;var Bu=(e,t,n={})=>{let r=[Xs(e,n).executable];return t&&t.length>0&&r.push(t),r};var Wu=(e,t,n)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}});var Vu=(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 Sa={};Hs(Sa,{PREVIEW_FEATURE_IDS:()=>kt,isEnabled:()=>Ku,setEnabled:()=>Gu});var kt=["agentOrchestration","piRunner","fileOpen","panelPolish"];function Ku(e,t){return e.previews?.[t]===!0}function Gu(e,t,n){return{...e,previews:{...e.previews,[t]:n}}}import{mkdir as Ek,readFile as Ok,writeFile as $k}from"node:fs/promises";import Nk from"node:path";var Dk=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Hu=async e=>{try{return await Ok(e,"utf8")}catch(t){if(Dk(t))return null;throw t}},Yu=async(e,t)=>{await Ek(Nk.dirname(e),{recursive:!0}),await $k(e,t,"utf8")};var ei=(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(!me.includes(r))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" is not supported. Expected one of: ${me.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(typeof s!="boolean")throw new Error(`Craig config at ${t} is invalid. "previews.${r}" must be a boolean.`)}return n};var Ia=async(e,t={readConfigFile:Hu})=>{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 ei(r,e.configFile)};var va=async(e,t,n={writeConfigFile:Yu})=>{ei(t,e.configFile),await n.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
4
+ `)};var Aa={};Hs(Aa,{checkForUpdate:()=>Ju,getCurrent:()=>ti,isNewer:()=>Ca});var ti=()=>{try{return"0.19.8"}catch{return"unknown"}};var _k="https://registry.npmjs.org/craig-cli/latest",Fk=3600*1e3,xk={value:null},zu=/^\d+\.\d+\.\d+$/,Ca=(e,t)=>{if(!zu.test(e)||!zu.test(t))return!1;let n=c=>c.split(".").map(Number),[r=0,s=0,i=0]=n(e),[o=0,a=0,l=0]=n(t);return r!==o?r>o:s!==a?s>a:i>l},Ju=async(e={fetch:globalThis.fetch,getCurrent:ti,cache:xk})=>{let t=e.getCurrent(),n=Date.now();if(e.cache.value&&n-e.cache.value.cachedAt<Fk)return e.cache.value.result;let r=null;try{let i=await e.fetch(_k,{signal:AbortSignal.timeout(5e3)});i.ok&&(r=(await i.json()).version??null)}catch{}let s={current:t,latest:r,updateAvailable:r!==null&&r!==t&&Ca(r,t)};return e.cache.value={result:s,cachedAt:n},s};var k={load:Ia,save:va,previews:Sa,runners:Pa,version:Aa};var Xu={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=Xu[t],this.retryable=r.retryable??!1,this.details=r.details??{}}};function Ea(e){return e instanceof g?e:new g("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as Lk,mkdir as Mk,readFile as jk}from"node:fs/promises";import qk from"node:path";var Qu=80,ni=async(e,t)=>{await Mk(qk.dirname(e.logFile),{recursive:!0});let n={timestamp:new Date().toISOString(),...t};await Lk(e.logFile,`${JSON.stringify(n)}
5
+ `,"utf8")},Zu=async(e,t)=>{try{await ni(e,t)}catch{}},ri=async(e,t=Qu)=>{try{let s=(await jk(e.logFile,"utf8")).trimEnd().split(`
6
+ `).filter(i=>i.length>0).map(Uk);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(Wk(n))return{path:e.logFile,lines:[],empty:!0};throw n}},Oa=async(e,t)=>ni(e,{level:"error",component:"application",event:Bk(t.context),message:t.message,...t.details?{details:t.details}:{}}),ep=async(e,t)=>{try{await Oa(e,t)}catch{}},tp=ri,np=async(e,t=Qu)=>ri(e,t);function Uk(e){try{let t=JSON.parse(e);if(!t.timestamp||!t.level||!t.component||!t.event||!t.message)return e;let n=[t.taskId,t.tabId].filter(Boolean).join("/");return`[${t.timestamp}] ${t.level.toUpperCase().padEnd(5)} ${t.component}.${t.event}${n?` ${n}`:""} \u2014 ${t.message}`}catch{return e}}function Bk(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function Wk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var pe={appendErrorLog:Oa,appendErrorLogBestEffort:ep,appendLog:ni,appendLogBestEffort:Zu,readLog:ri,readErrorLog:tp,readRecentErrorLines:np};function op(e){let{commandTokens:t,options:n,help:r}=Kk(e);if(r)return sp({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":Fr(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:$a(o,"Repo path")};break;case"repo:list":Fr(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:se(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:$a(o,"Workspace path")};break;case"workspace:list":a=Gk(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:se(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:se(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:se(o,"Workspace id")};break;case"file:open":a={kind:"openFile",path:se(o,"File path")};break;case"task:new":a=Yk(o);break;case"task:create-child":a=zk(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:se(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:se(o,"Task id")}};break;case"task:list":a=Hk(o);break;case"task:current":Fr(o,"task current"),a={kind:"currentTask"};break;case"task:rename":a={kind:"renameTask",title:$a(o,"Task title")};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:se(o,"Task id")};break;case"task:pr":a=Jk(o);break;case"task:repo":if(o[0]!=="add")throw I(`Unsupported task repo command: ${o.join(" ")}`);ii(o,3,"task repo add"),a={kind:"addTaskRepoTarget",taskId:si(o,1,"Task id"),repoId:si(o,2,"Repo id")};break;case"task:wait":a=rT(o);break;case"agent:list":Fr(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=Zk(o);break;case"agent:send":a=eT(o);break;case"command:show":a={kind:"showPromptCommand",commandId:se(o,"Command id")};break;case"command:list":Fr(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:se(o,"Command id")};break;case"command:wait":a=tT(o);break;case"events:list":a=rp(o,!1);break;case"events:watch":a=rp(o,!0);break;case"fury:validate":a={kind:"validateFury",file:se(o,"Fury file")};break;case"fury:plan":a=sT(o);break;case"fury:approve":a={kind:"approveFury",planId:se(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:se(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:se(o,"Fury run id")};break;case"fury:watch":a=iT(o);break;case"fury:cancel":a={kind:"cancelFury",runId:se(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:se(o,"Fury run id")};break;case"fury:step":a=oT(o);break;case"fury:reviews":a=aT(o);break;case"fury:review":a=lT(o);break;case"task:logs":a={kind:"streamTaskLogs",taskId:se(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:se(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:se(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:se(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:se(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:si(o,0,"Task id"),repoId:si(o,1,"Repo id")},ii(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:se(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw I(`Unsupported command: ${t.join(" ")}`)}return sp(a,n)}function ap(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 Vk(e){return e.kind==="actFuryReview"?`fury.review.${e.action==="request_changes"?"request-changes":e.action}`:{addWorkspace:"workspace.add",addRepo:"repo.add",listRepos:"repo.list",removeRepo:"repo.remove",listWorkspaces:"workspace.list",archiveWorkspace:"workspace.archive",restoreWorkspace:"workspace.restore",removeWorkspace:"workspace.remove",createTask:"task.new",createChildTask:"task.create-child",listTaskChildren:"task.children",cancelTaskTree:"task.cancel-tree",validateFury:"fury.validate",planFury:"fury.plan",approveFury:"fury.approve",runFury:"fury.run",showFury:"fury.status",watchFury:"fury.watch",cancelFury:"fury.cancel",resumeFury:"fury.resume",completeFuryStep:"fury.step.complete",failFuryStep:"fury.step.fail",listFuryReviews:"fury.reviews.list",showFuryReview:"fury.review.show",actFuryReview:"fury.review.action",listTasks:"task.list",currentTask:"task.current",renameTask:"task.rename",showTask:"task.show",showCurrentTask:"task.show",showTaskPr:"task.pr.show",discoverTaskPr:"task.pr.discover",linkTaskPr:"task.pr.link",refreshTaskPr:"task.pr.refresh",unlinkTaskPr:"task.pr.unlink",listAgents:"agent.list",showAgentStatus:"agent.status",sendAgentPrompt:"agent.send",showPromptCommand:"command.show",listPromptCommands:"command.list",cancelPromptCommand:"command.cancel",waitPromptCommand:"command.wait",waitTask:"task.wait",listEvents:"events.list",watchEvents:"events.watch",addTaskLink:"link.add",addTaskRepoTarget:"task.repo.add",listTaskLinks:"link.list",openFile:"file.open",refreshInteractiveState:"interactive.refresh",showSelectedTask:"task.show",streamTaskLogs:"task.logs",streamSelectedTaskLogs:"task.logs",showTaskDiff:"task.diff",showSelectedTaskDiff:"task.diff",openTask:"task.open",openSelectedTask:"task.open",runChecks:"task.check",runSelectedTaskChecks:"task.check",commitTask:"task.commit",commitSelectedTask:"task.commit",showContext:"context.show",help:"help",exit:"exit"}[e.kind]}function Na(){return["Craig commands:"," craig [--workspace-root <path>] [--task <id>] [--json] [--no-input] <command>"," craig context show Show resolved workspace, task, and agent-tab context"," craig repo add <path> Register a repo in the current Craig workspace"," craig workspace add <path> Register a repo or parent-directory workspace"," craig repo list List registered repos"," craig repo remove <id> Remove a registered repo"," craig workspace list [--archived] List workspaces"," craig workspace archive <id> Archive a workspace"," craig workspace restore <id> Restore an archived workspace"," craig workspace remove <id> Remove an archived workspace"," craig file open <path> Open a readable file in the active Craig TUI (preview)"," craig task new --repo <repo-id> [--runner codex|cursor|claude|pi] <prompt>"," craig task new --workspace <workspace-id> [--runner codex|cursor|claude|pi] <prompt>"," craig task create-child [--parent <task-id>] [--repo <repo-id> | --workspace <workspace-id>] [--runner codex|cursor|claude|pi] [--idempotency-key <key>] <prompt>"," craig task children [<task-id>] List direct child tasks"," craig task cancel-tree [<task-id>] Cancel a task and all descendants"," craig task list [--repo <repo-id>] List known Craig tasks"," craig task current Show the task resolved from flags, environment, or cwd"," craig task rename <name> Rename the resolved task without changing its ID or worktree"," craig task show [<id>] Show task details; omit id to use resolved context"," craig task repo add <task-id> <repo-id> Provision a repo target in an existing project task"," craig task pr show [<id>] [--repo <repo-id>]"," craig task pr discover [<id>] [--repo <repo-id>]"," craig task pr link [<id>] --pr <url|number> [--repo <repo-id>]"," craig task pr refresh [<id>] [--repo <repo-id>]"," craig task pr unlink [<id>] --pr <url|number> [--repo <repo-id>]"," craig agent list [--task <task-id>] List agent-tab and task roll-up states"," craig agent status [--task <task-id>] [--tab <tab-id>] Show agent state details"," craig agent send --task <task-id> [--tab <tab-id>] (--prompt <text> | --prompt-file <path> | --stdin)"," [--delivery when-ready|immediate] [--timeout <duration>] [--idempotency-key <key>]"," craig command show <command-id> Show a durable prompt command"," craig command list [--task <task-id>] List durable prompt commands"," craig command cancel <command-id> Cancel a queued prompt command"," craig command wait <command-id> [--state <states>] [--timeout <duration>]"," craig task wait [<id>] --state <states> [--tab <tab-id>] [--timeout <duration>]"," craig events list [--task <task-id>] [--type <glob>] [--after <cursor>] --json"," craig events watch [--task <task-id>] [--type <glob>] [--after <cursor>] [--format jsonl]"," craig fury validate <file> Validate a versioned fury YAML definition"," craig fury plan <file> [--root-task <id>] [--input key=value] Create an immutable approval plan"," craig fury approve <plan-id> Approve an exact validated plan (human only)"," craig fury run <plan-id> Start the single run authorized by an approved plan"," craig fury status|watch|cancel|resume <run-id> Inspect or control a durable run"," craig fury step complete|fail --run <run-id> --step <step-id> Explicitly finish agent work"," craig fury reviews list [--run <run-id>] [--state <state>] List human checkpoints"," craig fury review show|approve|reject|request-changes|resubmit <review-id>"," craig task logs <id> Stream Craig-managed logs for a task"," craig task diff <id> Show the current worktree diff for a task"," craig task open <id> Open the task worktree or print its path"," craig task check <id> Run configured checks for a task"," craig task commit <id> Commit all task worktree changes"," craig link add <task-id> <repo-id> Add contextual repo linkage only (does not provision a target)"," craig link list <task-id> List linked repos for a task"].join(`
7
+ `)}function Kk(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||!ip(l)){n.push(l);continue}if(s.has(l))throw I(`Global option ${l} may only be provided once.`);if(s.add(l),l==="--json"){r.json=!0;continue}if(l==="--no-input"){r.noInput=!0;continue}if(l==="--help"||l==="-h"){i=!0;continue}let c=t[a+1];if(c===void 0||c==="--"||ip(c))throw I(`Global option ${l} requires a value.`);a+=1,l==="--workspace-root"?r.workspaceRoot=M(c,"Workspace root"):r.taskId=M(c,"Task id")}return{commandTokens:n,options:r,help:i}}function Gk(e){if(e.length===0)return{kind:"listWorkspaces",archived:!1};if(e.length===1&&e[0]==="--archived")return{kind:"listWorkspaces",archived:!0};throw I(`Unsupported command: workspace list ${e.join(" ")}`)}function Hk(e){if(e.length===0)return{kind:"listTasks"};if(e.length===2&&e[0]==="--repo")return{kind:"listTasks",repoId:M(e[1],"Repo id")};throw I(`Unsupported command: task list ${e.join(" ")}`)}function Yk(e){let t,n,r,s=[],i=!0;for(let a=0;a<e.length;a+=1){let l=e[a];if(l==="--"){i=!1;continue}if(!i||!["--repo","--workspace","--runner"].includes(l)){if(i&&l.startsWith("--"))throw I(`Unsupported task new option: ${l}`);s.push(l);continue}let c=e[a+1];if(c===void 0||c==="--")throw I(`Task option ${l} requires a value.`);if(a+=1,l==="--repo"){if(t!==void 0)throw I("Task option --repo may only be provided once.");t=M(c,"Repo id")}else if(l==="--workspace"){if(n!==void 0)throw I("Task option --workspace may only be provided once.");n=M(c,"Workspace id")}else{if(r!==void 0)throw I("Task option --runner may only be provided once.");try{r=k.runners.parse(c)}catch(u){throw I(u instanceof Error?u.message:"Unsupported runner.")}}}if(!t&&!n)throw I("Task creation requires '--repo <repo-id>' or '--workspace <workspace-id>'.");if(t&&n)throw I("Task creation accepts either '--repo' or '--workspace', not both.");let o=M(s.join(" "),"Task prompt");return{kind:"createTask",...t?{repoId:t}:{},...n?{workspaceId:n}:{},...r?{runner:r}:{},prompt:o}}function zk(e){let t,n,r,s,i,o=[],a=!0;for(let l=0;l<e.length;l+=1){let c=e[l];if(c==="--"){a=!1;continue}if(!a||!["--parent","--repo","--workspace","--runner","--idempotency-key"].includes(c)){if(a&&c.startsWith("--"))throw I(`Unsupported task create-child option: ${c}`);o.push(c);continue}let u=e[l+1];if(u===void 0||u==="--")throw I(`Task option ${c} requires a value.`);if(l+=1,c==="--parent"){if(t)throw I("Task option --parent may only be provided once.");t=M(u,"Parent task id")}else if(c==="--repo"){if(n)throw I("Task option --repo may only be provided once.");n=M(u,"Repo id")}else if(c==="--workspace"){if(r)throw I("Task option --workspace may only be provided once.");r=M(u,"Workspace id")}else if(c==="--runner"){if(s)throw I("Task option --runner may only be provided once.");try{s=k.runners.parse(u)}catch(d){throw I(d instanceof Error?d.message:"Unsupported runner.")}}else{if(i)throw I("Task option --idempotency-key may only be provided once.");i=M(u,"Idempotency key")}}if(n&&r)throw I("Child task creation accepts only one of --repo or --workspace.");return{kind:"createChildTask",...t?{parentTaskId:t}:{},...n?{repoId:n}:{},...r?{workspaceId:r}:{},prompt:M(o.join(" "),"Child task prompt"),...s?{runner:s}:{},...i?{idempotencyKey:i}:{}}}function Jk(e){let[t,...n]=e;if(!["show","discover","link","refresh","unlink"].includes(t??""))throw I(`Unsupported command: task pr ${e.join(" ")}`);let r,s,i;for(let a=0;a<n.length;a+=1){let l=n[a];if(l!=="--repo"&&l!=="--pr"){if(l.startsWith("--"))throw I(`Unsupported task pr ${t} option: ${l}`);if(r!==void 0)throw I(`task pr ${t} accepts at most one task id.`);r=M(l,"Task id");continue}let c=n[a+1];if(c===void 0||c==="--")throw I(`Task PR option ${l} requires a value.`);if(a+=1,l==="--repo"){if(s!==void 0)throw I("Task PR option --repo may only be provided once.");s=M(c,"Repo id")}else{if(i!==void 0)throw I("Task PR option --pr may only be provided once.");i=M(c,"Pull request selector")}}if((t==="link"||t==="unlink")&&i===void 0)throw I(`task pr ${t} requires --pr <url|number>.`);if(t!=="link"&&t!=="unlink"&&i!==void 0)throw I(`task pr ${t} does not accept --pr.`);let o={...r?{taskId:r}:{},...s?{repoId:s}:{}};switch(t){case"show":return{kind:"showTaskPr",...o};case"discover":return{kind:"discoverTaskPr",...o};case"link":return{kind:"linkTaskPr",...o,pullRequest:i};case"refresh":return{kind:"refreshTaskPr",...o};case"unlink":return{kind:"unlinkTaskPr",...o,pullRequest:i};default:throw I(`Unsupported command: task pr ${e.join(" ")}`)}}var Da=300*1e3,Xk=new Set(["idle","working","ready","error"]),Qk=new Set(["queued","delivering","delivered","failed","cancelled"]);function Zk(e){if(e.length===0)return{kind:"showAgentStatus"};if(e.length===2&&e[0]==="--tab")return{kind:"showAgentStatus",tabId:M(e[1],"Agent tab id")};throw I(`Unsupported command: agent status ${e.join(" ")}`)}function eT(e){let t,n,r="when-ready",s=Da,i,o=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--prompt","--prompt-file","--stdin","--tab","--delivery","--timeout","--idempotency-key"].includes(l))throw I(`Unsupported agent send option: ${l}`);if(o.has(l))throw I(`Agent send option ${l} may only be provided once.`);if(o.add(l),l==="--stdin"){if(t)throw I("Agent send accepts exactly one prompt source.");t={source:"stdin"};continue}let c=e[a+1];if(c===void 0||c.startsWith("--"))throw I(`Agent send option ${l} requires a value.`);if(a+=1,l==="--prompt"||l==="--prompt-file"){if(t)throw I("Agent send accepts exactly one prompt source.");t=l==="--prompt"?{source:"inline",text:M(c,"Prompt")}:{source:"file",path:M(c,"Prompt file")}}else if(l==="--tab")n=M(c,"Agent tab id");else if(l==="--delivery"){if(c!=="when-ready"&&c!=="immediate")throw I('Agent send delivery must be "when-ready" or "immediate".');r=c}else l==="--timeout"?s=Fa(c):i=M(c,"Idempotency key")}if(!t)throw I("Agent send requires --prompt, --prompt-file, or --stdin.");return{kind:"sendAgentPrompt",prompt:t,delivery:r,timeoutMs:s,...n?{tabId:n}:{},...i?{idempotencyKey:i}:{}}}function tT(e){let t=M(e[0]??"","Command id"),n,r=Da,s=new Set;for(let i=1;i<e.length;i+=1){let o=e[i];if(o!=="--state"&&o!=="--timeout")throw I(`Unsupported command wait option: ${o}`);if(s.has(o))throw I(`Command wait option ${o} may only be provided once.`);s.add(o);let a=e[i+1];if(a===void 0||a.startsWith("--"))throw I(`Command wait option ${o} requires a value.`);i+=1,o==="--state"?n=nT(a):r=Fa(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function nT(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Qk.has(n)))throw I(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function rp(e,t){let n,r,s="human",i=new Set;for(let a=0;a<e.length;a+=1){let l=e[a];if(!["--type","--after","--format"].includes(l))throw I(`Unsupported events ${t?"watch":"list"} option: ${l}`);if(!t&&l==="--format")throw I("--format is supported only by events watch.");if(i.has(l))throw I(`Events option ${l} may only be provided once.`);i.add(l);let c=e[a+1];if(c===void 0||c.startsWith("--"))throw I(`Events option ${l} requires a value.`);if(a+=1,l==="--type")n=M(c,"Event type glob");else if(l==="--after")r=M(c,"Event cursor");else if(c==="jsonl")s="jsonl";else throw I('Events watch format must be "jsonl".')}let o={...n?{typeGlob:n}:{},...r?{after:r}:{}};return t?{kind:"watchEvents",...o,format:s}:{kind:"listEvents",...o}}function rT(e){let t,n,r,s=Da,i=new Set;for(let o=0;o<e.length;o+=1){let a=e[o];if(!["--state","--tab","--timeout"].includes(a)){if(a.startsWith("--"))throw I(`Unsupported task wait option: ${a}`);if(t!==void 0)throw I("task wait accepts at most one task id.");t=M(a,"Task id");continue}if(i.has(a))throw I(`Task wait option ${a} may only be provided once.`);i.add(a);let l=e[o+1];if(l===void 0||l.startsWith("--"))throw I(`Task wait option ${a} requires a value.`);o+=1,a==="--state"?n=cT(l):a==="--tab"?r=M(l,"Agent tab id"):s=Fa(l)}if(!n)throw I("task wait requires --state <idle|working|ready|error>[,...].");return{kind:"waitTask",...t?{taskId:t}:{},states:n,...r?{tabId:r}:{},timeoutMs:s}}function sT(e){let t,n,r={};for(let s=0;s<e.length;s+=1){let i=e[s];if(i!=="--input"&&i!=="--root-task"){if(i.startsWith("--"))throw I(`Unsupported fury plan option: ${i}`);if(t!==void 0)throw I("fury plan accepts exactly one definition file.");t=M(i,"Fury file");continue}let o=e[s+1];if(o===void 0||o.startsWith("--"))throw I(`Fury plan option ${i} requires a value.`);if(s+=1,i==="--root-task"){if(n)throw I("Fury plan option --root-task may only be provided once.");n=M(o,"Root task id");continue}let a=o.indexOf("=");if(a<1)throw I(`Invalid fury input "${o}". Use key=value.`);let l=M(o.slice(0,a),"Fury input name");if(Object.hasOwn(r,l))throw I(`Fury input "${l}" may only be provided once.`);r[l]=o.slice(a+1)}if(!t)throw I("fury plan requires a definition file.");return{kind:"planFury",file:t,inputs:r,...n?{rootTaskId:n}:{}}}function iT(e){let t=M(e[0]??"","Fury run id"),n,r="human";for(let s=1;s<e.length;s+=2){let i=e[s],o=e[s+1];if(!o||!["--after","--format"].includes(i??""))throw I("fury watch supports --after and --format jsonl.");if(i==="--after")n=M(o,"Event cursor");else if(o==="jsonl")r=o;else throw I("fury watch format must be jsonl.")}return{kind:"watchFury",runId:t,...n?{after:n}:{},format:r}}function oT(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw I("fury step requires complete or fail.");let n=_a(e.slice(1),["--run","--step","--output","--output-file","--stdin","--reason"]),r=M(n.get("--run")??"","Fury run id"),s=M(n.get("--step")??"","Fury step id");if(t==="fail"){if(["--output","--output-file","--stdin"].some(a=>n.has(a)))throw I("fury step fail accepts only --reason.");return{kind:"failFuryStep",runId:r,stepId:s,reason:M(n.get("--reason")??"","Failure reason")}}if(n.has("--reason"))throw I("fury step complete does not accept --reason.");let i=["--output","--output-file","--stdin"].filter(a=>n.has(a));if(i.length>1)throw I("fury step complete accepts only one output source.");let o=i[0];return{kind:"completeFuryStep",runId:r,stepId:s,...o==="--output"?{output:{source:"inline",text:n.get(o)}}:o==="--output-file"?{output:{source:"file",path:n.get(o)}}:o==="--stdin"?{output:{source:"stdin"}}:{}}}function aT(e){if(e[0]!=="list")throw I("fury reviews requires list.");let t=_a(e.slice(1),["--run","--state"]),n=t.get("--run"),r=t.get("--state");if(r&&!["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"].includes(r))throw I(`Unsupported fury review state: ${r}`);return{kind:"listFuryReviews",...n?{runId:n}:{},...r?{state:r}:{}}}function lT(e){let t=e[0],n=M(e[1]??"","Fury review id");if(t==="show")return ii(e,2,"fury review show"),{kind:"showFuryReview",reviewId:n};if(!t||!["approve","reject","request-changes","resubmit"].includes(t))throw I("Unsupported fury review action.");let r=_a(e.slice(2),["--note","--reason","--summary"]),s=t==="request-changes"?"request_changes":t,i=r.get("--note")??r.get("--reason")??r.get("--summary"),o=t==="approve"?"--note":t==="resubmit"?"--summary":"--reason";if([...r.keys()].some(a=>a!==o))throw I(`fury review ${t} accepts only ${o}.`);return{kind:"actFuryReview",reviewId:n,action:s,...i?{message:i}:{}}}function _a(e,t){let n=new Map;for(let r=0;r<e.length;r+=1){let s=e[r];if(!t.includes(s)||n.has(s))throw I(`Unsupported or duplicate option: ${s}`);if(s==="--stdin"){n.set(s,"true");continue}let i=e[++r];if(i===void 0||i.startsWith("--"))throw I(`Option ${s} requires a value.`);n.set(s,M(i,s))}return n}function cT(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Xk.has(n)))throw I(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function Fa(e){let t=/^(\d+)(ms|s|m|h)$/.exec(e.trim());if(!t)throw I(`Invalid duration "${e}". Use values such as 500ms, 30s, 5m, or 1h.`);let n=Number(t[1]),r={ms:1,s:1e3,m:6e4,h:36e5}[t[2]],s=n*r;if(!Number.isSafeInteger(s))throw I(`Duration "${e}" is too large.`);return s}function sp(e,t){return{mode:"command",command:e,commandName:Vk(e),options:t}}function ip(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function Fr(e,t){ii(e,0,t)}function ii(e,t,n){if(e.length!==t)throw I(`Command ${n} received an unexpected number of arguments.`)}function se(e,t){if(e.length!==1)throw I(`${t} is required and must be provided once.`);return M(e[0],t)}function $a(e,t){return M(e.join(" "),t)}function si(e,t,n){return M(e[t]??"",n)}function M(e,t){let n=e.trim();if(n.length===0)throw I(`${t} cannot be empty.`);return n}function I(e){return new g("CLI_USAGE",`${e}
8
8
 
9
- ${Ea()}`,{})}var Ke=(e,t)=>{let n=Da(e);if(!rT(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},Da=e=>{if(typeof e!="object"||e===null)return e;let t=e,n=e,r={...n};return delete r.swarmRunId,delete r.swarmStepId,delete r.tmuxWindowTarget,delete r.tmuxPage,delete r.tmuxTarget,delete r.layoutSlot,delete r.sessionId,{...r,runner:_a(t.runner),repoId:typeof t.repoId=="string"?t.repoId:"legacy_repo",workspaceId:typeof t.workspaceId=="string"?t.workspaceId:"legacy_workspace",selectedPtyTabId:typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null?t.selectedPtyTabId:null,linkedRepoIds:Array.isArray(t.linkedRepoIds)?t.linkedRepoIds.filter(s=>typeof s=="string"):[],parentTaskId:typeof t.parentTaskId=="string"||t.parentTaskId===null?t.parentTaskId:null,rootTaskId:typeof t.rootTaskId=="string"?t.rootTaskId:t.id,delegationDepth:Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0?t.delegationDepth:0,delegationIdempotencyKey:typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null?t.delegationIdempotencyKey:null,furyRunId:typeof t.furyRunId=="string"||t.furyRunId===null?t.furyRunId:typeof n.swarmRunId=="string"?n.swarmRunId:null,furyStepId:typeof t.furyStepId=="string"||t.furyStepId===null?t.furyStepId:typeof n.swarmStepId=="string"?n.swarmStepId:null,ptyTabs:oT(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:sT(t.repoTargets),runnerSession:t.runnerSession??nT(t),checks:fT(t),lastCommit:t.lastCommit??null,prs:mT(t),artifacts:wT(t),cleanup:kT(t)}},nT=e=>{if(typeof e.title!="string")return null;let t=_a(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},rT=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.id=="string"&&typeof t.title=="string"&&typeof t.slug=="string"&&(t.type==="repo"||t.type==="project")&&typeof t.status=="string"&&k.runners.isRunnerType(t.runner??"")&&typeof t.repoId=="string"&&typeof t.workspaceId=="string"&&(typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null)&&Array.isArray(t.linkedRepoIds)&&t.linkedRepoIds.every(n=>typeof n=="string")&&(typeof t.parentTaskId=="string"||t.parentTaskId===null)&&typeof t.rootTaskId=="string"&&Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0&&(typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null)&&(typeof t.furyRunId=="string"||t.furyRunId===null)&&(typeof t.furyStepId=="string"||t.furyStepId===null)&&typeof t.repoRoot=="string"&&typeof t.worktreePath=="string"&&typeof t.branch=="string"&&ip(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||iT(t.repoTargets))&&lT(t.runnerSession)&&cT(t.prompt)&&op(t.checks)&&ap(t.lastCommit)&&uT(t.prs)&&pT(t.artifacts)&&cp(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},sT=e=>{if(Array.isArray(e))return e.filter(sp)},iT=e=>Array.isArray(e)&&e.every(sp),sp=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)&&op(t.checks)&&ap(t.lastCommit)&&lp(t.pullRequest)&&cp(t.cleanup)},oT=e=>{if(ip(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 aT(e.id,e.title,t,_a(e.runner))},aT=(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}]},_a=e=>e&&k.runners.isRunnerType(e)?e:"codex",ip=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"),lT=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),cT=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",op=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"),ap=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",lp=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&dT(e.requiredChecks),dT=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)),uT=e=>Array.isArray(e)&&e.every(lp),pT=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),cp=e=>typeof e=="object"&&e!==null&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),fT=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},mT=e=>{if(Array.isArray(e.prs))return e.prs.map(hT);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:dp(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:up(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},hT=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:dp(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:gT(t.reviewDecision),requiredChecks:up(t.requiredChecks),comments:yT(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},dp=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,gT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,yT=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}]}):[],up=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})):[],wT=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},kT=e=>{let t=e.cleanup;return{worktreeRemovedAt:t?.worktreeRemovedAt??null,preservedWorktree:t?.preservedWorktree??!1,warning:t?.warning??null}};import{readFile as rb}from"node:fs/promises";import{readFile as TT,readdir as bT,rm as RT}from"node:fs/promises";import pp from"node:path";var xa=(e,t)=>pp.join(e.workspacesDir,`${t}.json`),PT=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"):[]}},fp=(e,t)=>{let n=PT(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},kn=async(e,t)=>{let n=xa(e,t);try{let r=await TT(n,"utf8");return fp(JSON.parse(r),n)}catch(r){throw ST(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}},Tn=async(e,t)=>{await U(xa(e,t.id),{...t,updatedAt:new Date().toISOString()})},Ie=async e=>{let t=await bT(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>kn(e,pp.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},mp=async(e,t)=>{await RT(xa(e,t),{force:!0})},ST=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as IT,readdir as vT,rm as CT}from"node:fs/promises";import hp from"node:path";var Fa=(e,t)=>hp.join(e.reposDir,`${t}.json`),gp=(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},xe=async(e,t)=>{let n=Fa(e,t);try{let r=await IT(n,"utf8");return gp(JSON.parse(r),n)}catch(r){throw AT(r)?new g("REPO_NOT_FOUND",`Craig repo "${t}" was not found.`,{details:{repoId:t}}):r instanceof SyntaxError||r instanceof Error&&r.message.startsWith("Craig repo record at ")?new g("REPO_RECORD_INVALID",r instanceof Error?r.message:`Craig repo "${t}" is invalid.`,{details:{repoId:t},cause:r}):r}},La=async(e,t)=>{await U(Fa(e,t.id),{...t,updatedAt:new Date().toISOString()})},xr=async e=>{let t=await vT(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>xe(e,hp.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},yp=async(e,t)=>{await CT(Fa(e,t),{force:!0})},AT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as ET}from"node:fs/promises";var OT=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return t.version===2&&typeof t.workspaceRoot=="string"&&Array.isArray(t.repoIds)&&t.repoIds.every(n=>typeof n=="string")&&Array.isArray(t.workspaceIds)&&t.workspaceIds.every(n=>typeof n=="string")&&Array.isArray(t.taskIds)&&t.taskIds.every(n=>typeof n=="string")&&Array.isArray(t.jobIds)&&t.jobIds.every(n=>typeof n=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Wn=(e,t,n)=>{if(!OT(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},$e=async e=>{let t=await ET(e.indexFile,"utf8");return Wn(JSON.parse(t),e.workspaceRoot,e.indexFile)},$t=async(e,t)=>{await U(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as xT,stat as FT}from"node:fs/promises";import Kn from"node:path";import{realpath as Tp}from"node:fs/promises";import ni from"node:path";import{execFile as $T}from"node:child_process";import{promisify as NT}from"node:util";var wp=NT($T);async function K(e,t,n={}){try{let r=await wp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(kp(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function Q(e,t,n={}){try{let r=await wp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(kp(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function kp(e){return e instanceof Error}var Ma=async e=>{try{let n=(await K("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([Tp(n).catch(()=>ni.resolve(n)),Tp(e).catch(()=>ni.resolve(e))]);return r===s}catch{return!1}},ja=async e=>{let t=await Q("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 Q("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await K("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},bp=async e=>{let t=await Q("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=ni.resolve(e,n);return ni.dirname(r)};import{mkdir as Ge,readFile as DT}from"node:fs/promises";var _T=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Vn=async e=>{let t=Oe(e);await Ge(t.craigDir,{recursive:!0}),await Promise.all([Ge(t.reposDir,{recursive:!0}),Ge(t.workspacesDir,{recursive:!0}),Ge(t.runtimeDir,{recursive:!0}),Ge(t.tasksDir,{recursive:!0}),Ge(t.jobsDir,{recursive:!0}),Ge(t.commandsDir,{recursive:!0}),Ge(t.eventsDir,{recursive:!0}),Ge(t.orchestrationDir,{recursive:!0}),Ge(t.logsDir,{recursive:!0}),Ge(t.artifactsDir,{recursive:!0}),Ge(t.worktreesDir,{recursive:!0})]);try{let s=await DT(t.indexFile,"utf8"),i=JSON.parse(s);return Wn(i,e,t.indexFile)}catch(s){if(!_T(s))throw s instanceof SyntaxError?new Error(`Craig index at ${t.indexFile} is malformed. Remove or repair the file before rerunning Craig.`):s}let n=new Date().toISOString(),r={version:2,workspaceRoot:e,repoIds:[],workspaceIds:[],taskIds:[],jobIds:[],createdAt:n,updatedAt:n};return await U(t.indexFile,r),r};var Rp=(e,t,n)=>{let r=new Date().toISOString();return{id:LT(e,Kn.basename(t)),name:Kn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},Pp=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},LT=(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},MT=(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},Sp=async(e,t)=>{let n=await $e(e);await $t(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},jT=async(e,t)=>{let n=await xT(t,{withFileTypes:!0}),r=await xr(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Kn.join(t,i.name);if(!await Ma(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await ja(o);s.push(a?Pp(a,l):Rp([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},qT=async(e,t)=>{let n=await ja(t),r=await xr(e),s=r.find(u=>u.rootPath===t)??null,i=s?Pp(s,n):Rp(r,t,n),o=`workspace_${i.id}`,l=(await Ie(e)).find(u=>u.id===o)??null,c=new Date().toISOString(),d=l??{id:o,kind:"repo",name:i.name,rootPath:t,primaryRepoId:i.id,repoId:i.id,discoveredRepoIds:[i.id],branch:n,status:"active",linkedRepoIds:[],archivedAt:null,createdAt:c,updatedAt:c};return await La(e,i),l||await Tn(e,d),await Sp(e,{repoIds:[i.id],workspaceIds:[d.id]}),{kind:"createWorkspace",workspace:d,repos:[i],created:!l}},UT=async(e,t)=>{let n=await jT(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await Ie(e),s=MT(r,Kn.basename(t)),i=r.find(c=>c.kind==="project"&&c.rootPath===t)??null,o=new Date().toISOString(),a=n.map(c=>c.id),l=i?{...i,discoveredRepoIds:a,primaryRepoId:a[0]??i.primaryRepoId,status:"active",archivedAt:null}:{id:s,kind:"project",name:Kn.basename(t),rootPath:t,primaryRepoId:a[0]??"",discoveredRepoIds:a,branch:"project",status:"active",linkedRepoIds:a,archivedAt:null,createdAt:o,updatedAt:o};return await Promise.all(n.map(c=>La(e,c))),await Tn(e,l),await Sp(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},Fr=async(e,t)=>{await Vn(e.workspaceRoot);let n=Kn.resolve(e.workspaceRoot,t);if(!(await FT(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await Ma(n)?qT(e,n):UT(e,n)};var qa=async(e,t,n={listWorkspaceRecords:Ie,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 Ua=async(e,t,n={readWorkspace:kn,writeWorkspace:Tn})=>{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 Ba=async(e,t)=>{let r={...await kn(e,t),status:"active",archivedAt:null};await Tn(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 bn=async(e,t,n={deleteWorkspace:mp,readCraigIndex:$e,writeCraigIndex:$t})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var Wa=async(e,t,n)=>{let r=await kn(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 bn(e,t),{kind:"removeWorkspace",workspaceId:r.id,rootPath:r.rootPath??""}};import{readFile as BT,realpath as Cp,stat as WT}from"node:fs/promises";import ri from"node:path";async function Va(e){let t=await Ep(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return Ip(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return Ip(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await vp(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await bp(t);if(r){let s=await vp(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 Ip(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await Ep(ri.resolve(n,e),s),o=await Ap(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 vp(e){let t=e;for(;;){let n=await Ap(t);if(n)return n;let r=ri.dirname(t);if(r===t)return null;t=r}}async function Ap(e){let t=Oe(e);try{let n=await BT(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Wn(r,s,t.indexFile);if(await Cp(i.workspaceRoot).catch(()=>ri.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(VT(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 Ep(e,t){let n=ri.resolve(e);try{if(!(await WT(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await Cp(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 VT(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var Ka={};Ws(Ka,{addRepo:()=>Op,listRegisteredRepos:()=>$p,removeRepo:()=>Np});import KT from"node:path";import{stat as GT}from"node:fs/promises";var Op=async(e,t)=>{let n=KT.resolve(e.workspaceRoot,t);if(!(await GT(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await Fr(e,t),i=s.repos[0];if(!i||s.workspace.kind==="project")throw new Error(`Repo path is not a git repository: ${n}`);return{kind:"createRepo",repo:i,workspaceId:s.workspace.id,created:s.created}};var $p=async(e,t={listRepos:xr,ensureCraigState:Vn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var Np=async(e,t,n)=>{let r=await xe(e,t),i=(await Ie(e)).filter(c=>c.primaryRepoId===t),o=i.filter(c=>c.status==="active"),a=await n.listTasks(e,{repoId:t});if(o.length>0)throw new Error(`Cannot remove repo ${t} while active workspace records still reference it.`);if(a.tasks.length>0)throw new Error(`Cannot remove repo ${t} while task records still reference it.`);await Promise.all(i.map(c=>bn(e,c.id))),await yp(e,t);let l=await $e(e);return await $t(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var be={addWorkspace:Fr,listWorkspaces:qa,archiveWorkspace:Ua,restoreWorkspace:Ba,removeWorkspace:Wa,removeWorkspaceRecord:bn,resolveContext:Va,repos:Ka};import{mkdir as Dp,readFile as HT,rm as ii,stat as YT,writeFile as zT}from"node:fs/promises";import si from"node:path";var JT=25,XT=3e4,QT=5e3;async function tt(e,t,n){let r=si.join(e.runtimeDir,"task-locks"),s=si.join(r,`${t}.lock`);await Dp(r,{recursive:!0});let i=Date.now();for(;;)try{await Dp(s);try{await zT(si.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await ii(s,{recursive:!0,force:!0}),o}break}catch(o){if(!tb(o))throw o;if(await ZT(s))continue;if(Date.now()-i>=XT)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await nb(JT)}try{return await n()}finally{await ii(s,{recursive:!0,force:!0})}}async function ZT(e){let t=await HT(si.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return eb(t.pid)?!1:(await ii(e,{recursive:!0,force:!0}),!0);let n=await YT(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<QT?!1:(await ii(e,{recursive:!0,force:!0}),!0)}function eb(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 tb=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",nb=e=>new Promise(t=>setTimeout(t,e));var Nt=async(e,t)=>{let n=await rb(oi(e,t),"utf8");return JSON.parse(n)},Lr=async(e,t)=>{let n=await Nt(e,t);return Ke(n,oi(e,t))},nt=async(e,t)=>{let n=_p(t);await U(oi(e,t.id),n)},G=async(e,t,n)=>tt(e,t,async()=>{let r=await Lr(e,t),s=await n(r);if(s.id!==t)throw new Error(`Task mutation cannot change task id ${t} to ${s.id}.`);let i=_p(s);return await U(oi(e,t),i),i}),Ga=async(e,t)=>{let n=await $e(e);n.taskIds.includes(t)||await $t(e,{...n,taskIds:[...n.taskIds,t]})},oi=(e,t)=>`${e.tasksDir}/${t}.json`,_p=e=>({...e,updatedAt:new Date().toISOString()});var H=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Xt=e=>e.status==="merged"||e.status==="closed",Dt=(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(),Rn=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return li(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},li=e=>e.mergeable&&!sb(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),sb=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Ha=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),_t=(e,t,n)=>{let r=e.isDraft??!1,s=ib(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:ob(e.reviewDecision??null),requiredChecks:Ya(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:db(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}},ib=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,ob=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Ya=e=>{let t=e.map(r=>ab(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||lb(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},ab=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:Fp(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:cb(t)}:null},lb=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):ai(e)&&!ai(t)?!0:!ai(e)&&ai(t)?!1:xp(t.status)>=xp(e.status),ai=e=>e.conclusion?.toUpperCase()==="CANCELLED",xp=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},cb=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},db=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(ub).filter(n=>n!==null).slice(-4):[]},ub=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=pb(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},pb=e=>e.replace(/\s+/g," ").trim(),Fp=(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?Fp(r,r):"unknown"};var He=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as fb}from"node:fs/promises";import Lp from"node:path";var F=async(e,t,n={readRawTask:Nt,validateTaskRecord:Ke})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw wb(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):kb(r)?new g("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},we=async e=>{if(!await za(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,Mr=async(e,t)=>{let n=await za(t.worktreePath),r=Hn(e,t),s=r?await za(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:mb(t),lastCommitSummary:hb(t),prSummary:gb(t),cleanupSummary:yb(t)}},za=async e=>{try{return await fb(e),!0}catch{return!1}},mb=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}`},hb=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",gb=e=>{if(e.type==="project"&&e.repoTargets?.length){let s=e.repoTargets.filter(l=>l.pullRequest.number);if(s.length===0)return"not linked";let i=s.map(l=>` ${l.repoId} #${l.pullRequest.number} ${l.pullRequest.status??"unknown"}`),o=s.reduce((l,c)=>{let d=c.pullRequest.status??"unknown";return l[d]=(l[d]??0)+1,l},{}),a=Object.entries(o).map(([l,c])=>`${c} ${l}`).join(", ");return`${s.length} PR${s.length!==1?"s":""} (${a})
9
+ ${Na()}`,{})}var Ge=(e,t)=>{let n=xa(e);if(!uT(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},xa=e=>{if(typeof e!="object"||e===null)return e;let t=e,n=e,r={...n};return delete r.swarmRunId,delete r.swarmStepId,delete r.tmuxWindowTarget,delete r.tmuxPage,delete r.tmuxTarget,delete r.layoutSlot,delete r.sessionId,{...r,runner:La(t.runner),repoId:typeof t.repoId=="string"?t.repoId:"legacy_repo",workspaceId:typeof t.workspaceId=="string"?t.workspaceId:"legacy_workspace",selectedPtyTabId:typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null?t.selectedPtyTabId:null,linkedRepoIds:Array.isArray(t.linkedRepoIds)?t.linkedRepoIds.filter(s=>typeof s=="string"):[],parentTaskId:typeof t.parentTaskId=="string"||t.parentTaskId===null?t.parentTaskId:null,rootTaskId:typeof t.rootTaskId=="string"?t.rootTaskId:t.id,delegationDepth:Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0?t.delegationDepth:0,delegationIdempotencyKey:typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null?t.delegationIdempotencyKey:null,furyRunId:typeof t.furyRunId=="string"||t.furyRunId===null?t.furyRunId:typeof n.swarmRunId=="string"?n.swarmRunId:null,furyStepId:typeof t.furyStepId=="string"||t.furyStepId===null?t.furyStepId:typeof n.swarmStepId=="string"?n.swarmStepId:null,ptyTabs:mT(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:pT(t.repoTargets),runnerSession:t.runnerSession??dT(t),checks:bT(t),lastCommit:t.lastCommit??null,prs:RT(t),artifacts:vT(t),cleanup:CT(t)}},dT=e=>{if(typeof e.title!="string")return null;let t=La(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},uT=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.id=="string"&&typeof t.title=="string"&&typeof t.slug=="string"&&(t.type==="repo"||t.type==="project")&&typeof t.status=="string"&&k.runners.isRunnerType(t.runner??"")&&typeof t.repoId=="string"&&typeof t.workspaceId=="string"&&(typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null)&&Array.isArray(t.linkedRepoIds)&&t.linkedRepoIds.every(n=>typeof n=="string")&&(typeof t.parentTaskId=="string"||t.parentTaskId===null)&&typeof t.rootTaskId=="string"&&Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0&&(typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null)&&(typeof t.furyRunId=="string"||t.furyRunId===null)&&(typeof t.furyStepId=="string"||t.furyStepId===null)&&typeof t.repoRoot=="string"&&typeof t.worktreePath=="string"&&typeof t.branch=="string"&&cp(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||fT(t.repoTargets))&&gT(t.runnerSession)&&yT(t.prompt)&&dp(t.checks)&&up(t.lastCommit)&&kT(t.prs)&&TT(t.artifacts)&&fp(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},pT=e=>{if(Array.isArray(e))return e.filter(lp)},fT=e=>Array.isArray(e)&&e.every(lp),lp=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)&&dp(t.checks)&&up(t.lastCommit)&&pp(t.pullRequest)&&fp(t.cleanup)},mT=e=>{if(cp(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 hT(e.id,e.title,t,La(e.runner))},hT=(e,t,n,r)=>{let s=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",title:s.defaultAgentTitle,command:k.runners.buildCommand(r),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},La=e=>e&&k.runners.isRunnerType(e)?e:"codex",cp=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"),gT=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),yT=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",dp=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"),up=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",pp=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&wT(e.requiredChecks),wT=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)),kT=e=>Array.isArray(e)&&e.every(pp),TT=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),fp=e=>typeof e=="object"&&e!==null&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),bT=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},RT=e=>{if(Array.isArray(e.prs))return e.prs.map(PT);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:mp(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:hp(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},PT=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:mp(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:ST(t.reviewDecision),requiredChecks:hp(t.requiredChecks),comments:IT(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},mp=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,ST=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,IT=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}]}):[],hp=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})):[],vT=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},CT=e=>{let t=e.cleanup;return{worktreeRemovedAt:t?.worktreeRemovedAt??null,preservedWorktree:t?.preservedWorktree??!1,warning:t?.warning??null}};import{readFile as ub}from"node:fs/promises";import{readFile as AT,readdir as ET,rm as OT}from"node:fs/promises";import gp from"node:path";var Ma=(e,t)=>gp.join(e.workspacesDir,`${t}.json`),$T=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"):[]}},yp=(e,t)=>{let n=$T(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},kn=async(e,t)=>{let n=Ma(e,t);try{let r=await AT(n,"utf8");return yp(JSON.parse(r),n)}catch(r){throw NT(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}},Tn=async(e,t)=>{await U(Ma(e,t.id),{...t,updatedAt:new Date().toISOString()})},ve=async e=>{let t=await ET(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>kn(e,gp.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},wp=async(e,t)=>{await OT(Ma(e,t),{force:!0})},NT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as DT,readdir as _T,rm as FT}from"node:fs/promises";import kp from"node:path";var ja=(e,t)=>kp.join(e.reposDir,`${t}.json`),Tp=(e,t)=>{if(typeof e!="object"||e===null||typeof e.id!="string"||typeof e.name!="string"||typeof e.rootPath!="string"||typeof e.defaultBranch!="string"||typeof e.createdAt!="string"||typeof e.updatedAt!="string")throw new Error(`Craig repo record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return e},xe=async(e,t)=>{let n=ja(e,t);try{let r=await DT(n,"utf8");return Tp(JSON.parse(r),n)}catch(r){throw xT(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}},qa=async(e,t)=>{await U(ja(e,t.id),{...t,updatedAt:new Date().toISOString()})},xr=async e=>{let t=await _T(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>xe(e,kp.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},bp=async(e,t)=>{await FT(ja(e,t),{force:!0})},xT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as LT}from"node:fs/promises";var MT=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return t.version===2&&typeof t.workspaceRoot=="string"&&Array.isArray(t.repoIds)&&t.repoIds.every(n=>typeof n=="string")&&Array.isArray(t.workspaceIds)&&t.workspaceIds.every(n=>typeof n=="string")&&Array.isArray(t.taskIds)&&t.taskIds.every(n=>typeof n=="string")&&Array.isArray(t.jobIds)&&t.jobIds.every(n=>typeof n=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Vn=(e,t,n)=>{if(!MT(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},Ne=async e=>{let t=await LT(e.indexFile,"utf8");return Vn(JSON.parse(t),e.workspaceRoot,e.indexFile)},$t=async(e,t)=>{await U(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as WT,stat as VT}from"node:fs/promises";import Gn from"node:path";import{realpath as Sp}from"node:fs/promises";import oi from"node:path";import{execFile as jT}from"node:child_process";import{promisify as qT}from"node:util";var Rp=qT(jT);async function G(e,t,n={}){try{let r=await Rp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(Pp(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function Q(e,t,n={}){try{let r=await Rp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(Pp(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function Pp(e){return e instanceof Error}var Ua=async e=>{try{let n=(await G("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([Sp(n).catch(()=>oi.resolve(n)),Sp(e).catch(()=>oi.resolve(e))]);return r===s}catch{return!1}},Ba=async e=>{let t=await Q("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 Q("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await G("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},Ip=async e=>{let t=await Q("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=oi.resolve(e,n);return oi.dirname(r)};import{mkdir as He,readFile as UT}from"node:fs/promises";var BT=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Kn=async e=>{let t=$e(e);await He(t.craigDir,{recursive:!0}),await Promise.all([He(t.reposDir,{recursive:!0}),He(t.workspacesDir,{recursive:!0}),He(t.runtimeDir,{recursive:!0}),He(t.tasksDir,{recursive:!0}),He(t.jobsDir,{recursive:!0}),He(t.commandsDir,{recursive:!0}),He(t.eventsDir,{recursive:!0}),He(t.orchestrationDir,{recursive:!0}),He(t.logsDir,{recursive:!0}),He(t.artifactsDir,{recursive:!0}),He(t.worktreesDir,{recursive:!0})]);try{let s=await UT(t.indexFile,"utf8"),i=JSON.parse(s);return Vn(i,e,t.indexFile)}catch(s){if(!BT(s))throw s instanceof SyntaxError?new Error(`Craig index at ${t.indexFile} is malformed. Remove or repair the file before rerunning Craig.`):s}let n=new Date().toISOString(),r={version:2,workspaceRoot:e,repoIds:[],workspaceIds:[],taskIds:[],jobIds:[],createdAt:n,updatedAt:n};return await U(t.indexFile,r),r};var vp=(e,t,n)=>{let r=new Date().toISOString();return{id:KT(e,Gn.basename(t)),name:Gn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},Cp=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},KT=(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},GT=(e,t)=>{let n=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"workspace",r=`workspace_${n}`,s=2;for(;e.some(i=>i.id===r);)r=`workspace_${n}_${s}`,s+=1;return r},Ap=async(e,t)=>{let n=await Ne(e);await $t(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},HT=async(e,t)=>{let n=await WT(t,{withFileTypes:!0}),r=await xr(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Gn.join(t,i.name);if(!await Ua(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await Ba(o);s.push(a?Cp(a,l):vp([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},YT=async(e,t)=>{let n=await Ba(t),r=await xr(e),s=r.find(d=>d.rootPath===t)??null,i=s?Cp(s,n):vp(r,t,n),o=`workspace_${i.id}`,l=(await ve(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 qa(e,i),l||await Tn(e,u),await Ap(e,{repoIds:[i.id],workspaceIds:[u.id]}),{kind:"createWorkspace",workspace:u,repos:[i],created:!l}},zT=async(e,t)=>{let n=await HT(e,t);if(n.length===0)throw new Error(`Workspace path does not contain direct child Git repos: ${t}`);let r=await ve(e),s=GT(r,Gn.basename(t)),i=r.find(c=>c.kind==="project"&&c.rootPath===t)??null,o=new Date().toISOString(),a=n.map(c=>c.id),l=i?{...i,discoveredRepoIds:a,primaryRepoId:a[0]??i.primaryRepoId,status:"active",archivedAt:null}:{id:s,kind:"project",name:Gn.basename(t),rootPath:t,primaryRepoId:a[0]??"",discoveredRepoIds:a,branch:"project",status:"active",linkedRepoIds:a,archivedAt:null,createdAt:o,updatedAt:o};return await Promise.all(n.map(c=>qa(e,c))),await Tn(e,l),await Ap(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},Lr=async(e,t)=>{await Kn(e.workspaceRoot);let n=Gn.resolve(e.workspaceRoot,t);if(!(await VT(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await Ua(n)?YT(e,n):zT(e,n)};var Wa=async(e,t,n={listWorkspaceRecords:ve,ensureCraigState:Kn})=>(await n.ensureCraigState(e.workspaceRoot),{kind:"listWorkspaces",workspaces:(await n.listWorkspaceRecords(e)).filter(s=>s.status===(t.archived?"archived":"active")),archivedOnly:t.archived});var Va=async(e,t,n={readWorkspace:kn,writeWorkspace:Tn})=>{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 Ka=async(e,t)=>{let r={...await kn(e,t),status:"active",archivedAt:null};await Tn(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 bn=async(e,t,n={deleteWorkspace:wp,readCraigIndex:Ne,writeCraigIndex:$t})=>{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 kn(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 bn(e,t),{kind:"removeWorkspace",workspaceId:r.id,rootPath:r.rootPath??""}};import{readFile as JT,realpath as $p,stat as XT}from"node:fs/promises";import ai from"node:path";async function Ha(e){let t=await Dp(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return Ep(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return Ep(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await Op(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await Ip(t);if(r){let s=await Op(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 Ep(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await Dp(ai.resolve(n,e),s),o=await Np(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 Op(e){let t=e;for(;;){let n=await Np(t);if(n)return n;let r=ai.dirname(t);if(r===t)return null;t=r}}async function Np(e){let t=$e(e);try{let n=await JT(t.indexFile,"utf8"),r=JSON.parse(n),s=typeof r=="object"&&r!==null&&"workspaceRoot"in r&&typeof r.workspaceRoot=="string"?r.workspaceRoot:e,i=Vn(r,s,t.indexFile);if(await $p(i.workspaceRoot).catch(()=>ai.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(QT(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 Dp(e,t){let n=ai.resolve(e);try{if(!(await XT(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await $p(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 QT(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var Ya={};Hs(Ya,{addRepo:()=>_p,listRegisteredRepos:()=>Fp,removeRepo:()=>xp});import ZT from"node:path";import{stat as eb}from"node:fs/promises";var _p=async(e,t)=>{let n=ZT.resolve(e.workspaceRoot,t);if(!(await eb(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await Lr(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 Fp=async(e,t={listRepos:xr,ensureCraigState:Kn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var xp=async(e,t,n)=>{let r=await xe(e,t),i=(await ve(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=>bn(e,c.id))),await bp(e,t);let l=await Ne(e);return await $t(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var be={addWorkspace:Lr,listWorkspaces:Wa,archiveWorkspace:Va,restoreWorkspace:Ka,removeWorkspace:Ga,removeWorkspaceRecord:bn,resolveContext:Ha,repos:Ya};import{mkdir as Lp,readFile as tb,rm as ci,stat as nb,writeFile as rb}from"node:fs/promises";import li from"node:path";var sb=25,ib=3e4,ob=5e3;async function tt(e,t,n){let r=li.join(e.runtimeDir,"task-locks"),s=li.join(r,`${t}.lock`);await Lp(r,{recursive:!0});let i=Date.now();for(;;)try{await Lp(s);try{await rb(li.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await ci(s,{recursive:!0,force:!0}),o}break}catch(o){if(!cb(o))throw o;if(await ab(s))continue;if(Date.now()-i>=ib)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await db(sb)}try{return await n()}finally{await ci(s,{recursive:!0,force:!0})}}async function ab(e){let t=await tb(li.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return lb(t.pid)?!1:(await ci(e,{recursive:!0,force:!0}),!0);let n=await nb(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<ob?!1:(await ci(e,{recursive:!0,force:!0}),!0)}function lb(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 cb=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",db=e=>new Promise(t=>setTimeout(t,e));var Nt=async(e,t)=>{let n=await ub(di(e,t),"utf8");return JSON.parse(n)},Mr=async(e,t)=>{let n=await Nt(e,t);return Ge(n,di(e,t))},nt=async(e,t)=>{let n=Mp(t);await U(di(e,t.id),n)},H=async(e,t,n)=>tt(e,t,async()=>{let r=await Mr(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=Mp(s);return await U(di(e,t),i),i}),za=async(e,t)=>{let n=await Ne(e);n.taskIds.includes(t)||await $t(e,{...n,taskIds:[...n.taskIds,t]})},di=(e,t)=>`${e.tasksDir}/${t}.json`,Mp=e=>({...e,updatedAt:new Date().toISOString()});var Y=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Xt=e=>e.status==="merged"||e.status==="closed",Dt=(e,t)=>{let n=e.prs.findIndex(s=>Hn(s,t)),r=n>=0?e.prs.map((s,i)=>i===n?t:s):[...e.prs,t];return{...e,prs:r}},Hn=(e,t)=>e.number===null||t.number===null||e.number!==t.number?!1:!e.owner||!e.repo||!t.owner||!t.repo?!0:e.owner.toLowerCase()===t.owner.toLowerCase()&&e.repo.toLowerCase()===t.repo.toLowerCase(),Rn=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return pi(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},pi=e=>e.mergeable&&!pb(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),pb=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Ja=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),_t=(e,t,n)=>{let r=e.isDraft??!1,s=fb(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:mb(e.reviewDecision??null),requiredChecks:Xa(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:wb(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}},fb=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,mb=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Xa=e=>{let t=e.map(r=>hb(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||gb(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},hb=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:qp(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:yb(t)}:null},gb=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):ui(e)&&!ui(t)?!0:!ui(e)&&ui(t)?!1:jp(t.status)>=jp(e.status),ui=e=>e.conclusion?.toUpperCase()==="CANCELLED",jp=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},yb=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},wb=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(kb).filter(n=>n!==null).slice(-4):[]},kb=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=Tb(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},Tb=e=>e.replace(/\s+/g," ").trim(),qp=(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?qp(r,r):"unknown"};var Ye=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as bb}from"node:fs/promises";import Up from"node:path";var x=async(e,t,n={readRawTask:Nt,validateTaskRecord:Ge})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw vb(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):Cb(r)?new g("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},we=async e=>{if(!await Qa(e.worktreePath))throw new Error(`Task ${e.id} worktree does not exist at ${e.worktreePath}. Repair or recreate the task before retrying.`)},Yn=(e,t)=>t.artifacts.logPath?Up.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:Up.join(e.workspaceRoot,t.artifacts.logPath):null,jr=async(e,t)=>{let n=await Qa(t.worktreePath),r=Yn(e,t),s=r?await Qa(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:Rb(t),lastCommitSummary:Pb(t),prSummary:Sb(t),cleanupSummary:Ib(t)}},Qa=async e=>{try{return await bb(e),!0}catch{return!1}},Rb=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}`},Pb=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",Sb=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=H(e);if(!t?.number||!t.url)return"not linked";let n=t.requiredChecks.length,r=n===1?"check":"checks";return`#${t.number} ${t.status??"unknown"} mergeable=${t.mergeable} mergeState=${t.mergeStateStatus??"unknown"} (${n} ${r})`},yb=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",wb=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",kb=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var jr=async(e,t)=>{let n=await Q("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.")},Ja=async(e,t,n,r="main")=>{let s=r.trim()||"main";if((await Q("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 Tb(e,s);await K("git",["worktree","add","-b",t,n,o],{cwd:e})},Tb=async(e,t)=>(await Q("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await Q("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await Q("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t,ci=async e=>{let t=await Q("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},Mp=async e=>{await K("git",["add","-A"],{cwd:e})},jp=async(e,t)=>{await K("git",["commit","-m",t],{cwd:e})},qp=async e=>{let t=await K("git",["show","-s","--format=%H%n%s","HEAD"],{cwd:e}),[n="",r=""]=t.stdout.trim().split(`
12
- `);if(!n||!r)throw new Error("Unable to read git HEAD commit metadata.");return{sha:n,message:r}},Up=async e=>{let t=await Q("git",["branch","--show-current"],{cwd:e});if(t.exitCode!==0)return null;let n=t.stdout.trim();return n.length>0?n:null};var di=async(e,t)=>{await K("git",["worktree","remove","--force",t],{cwd:e})},Bp=async(e,t)=>{await K("git",["branch","-D",t],{cwd:e})};var Xa=async e=>Yn(e,e.repoRoot),Yn=async(e,t)=>{let n=await $e(e),r=Wp(new Date),s=Vp(n.taskIds,r);for(;;){let i=`task_${r}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await jr(t,o))return i;s+=1}},qr=async e=>{let t=await $e(e),n=Wp(new Date),r=Vp(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`},Wp=e=>{let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}${n}${r}`},Vp=(e,t)=>{let n=e.filter(r=>r.startsWith(`task_${t}_`)).map(r=>Number.parseInt(r.slice(-2),10)).filter(r=>Number.isInteger(r));return n.length===0?1:Math.max(...n)+1};var Ur=async(e,t,n={readRawTask:Nt,validateTaskRecord:Ke})=>{let r=await $e(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(bb(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}},bb=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var Kp=["merge_ready","pr_open","checked","review","running","draft"],Qa=e=>[...e].sort((t,n)=>t.id.localeCompare(n.id)),Za=(e,t)=>t&&e.some(r=>r.id===t)?t:e.length===0?null:[...e].sort(Rb)[0]?.id??null,Rb=(e,t)=>{let n=Gp(e.status),r=Gp(t.status);return n!==r?n-r:t.updatedAt.localeCompare(e.updatedAt)},Gp=e=>{let t=Kp.indexOf(e);return t>=0?t:Kp.length};import Hp from"node:path";var Pn=(e,t)=>t?Hp.isAbsolute(t)?t:Hp.join(e.repoRoot,t):null;import{randomUUID as Pb}from"node:crypto";import{mkdir as Wr,rm as Sb,writeFile as ui}from"node:fs/promises";import J from"node:path";var Br=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");var Yp=["AGENTS","md"].join("."),zn=async(e,t,n,r={})=>{let s=await xe(e,t),[i,o]=await Promise.all([Eb(e,s.id,r.workspaceId,r.allowLinkedProjectRepo??!1),Yn(e,s.rootPath)]),a=`craig/${o}`,l=J.join(e.worktreesDir,s.id,o),c=J.join(e.logsDir,`${o}.log`),d=J.join(e.artifactsDir,o);await Promise.all([Wr(J.dirname(l),{recursive:!0}),Wr(d,{recursive:!0}),ui(c,"","utf8")]);let u=Ib(e,{taskId:o,repoId:s.id,workspaceId:i.id,repoRoot:s.rootPath,prompt:n,runner:r.runner??"codex",config:r.config??{},branch:a,worktreePath:l,...r.lineage?{lineage:r.lineage}:{}});return await nt(e,u),await Ga(e,o),await Ja(s.rootPath,a,l,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,workspaceId:i.id,task:u}},Vr=async(e,t,n,r={})=>{let s=(await Ie(e)).find(b=>b.id===t&&b.status==="active");if(!s)throw new Error(`Workspace ${t} does not exist or is archived.`);if(s.kind!=="project"){if(!s.primaryRepoId)throw new Error(`Workspace ${t} is not task-capable.`);let b=await 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 qr(e),a=new Date().toISOString(),l=r.runner??"codex",c=`craig/${o}`,d=J.join(e.craigDir,"task-bundles",o),u=J.join(e.logsDir,`${o}.log`),p=J.join(e.artifactsDir,o);await Wr(d,{recursive:!0}),await Wr(p,{recursive:!0}),await ui(u,"","utf8");let h=await Promise.all(i.map(b=>xe(e,b))),f=Cb(h),m=await Promise.all(h.map(b=>vb(e,b,o,c,J.join(d,f.get(b.id))))),y=m.find(b=>b.status==="ready")??m[0];if(!m.some(b=>b.status==="ready"))throw await Sb(d,{recursive:!0,force:!0}),new Error(`No project repo targets could be provisioned for ${t}: ${m.map(b=>`${b.repoId}: ${b.failureReason??"unknown error"}`).join("; ")}`);await tl({taskId:o,workspaceId:t,prompt:n,repos:h,repoTargets:m,bundlePath:d});let T=Kr(o,n,a,l,r.config??{}),R={id:o,title:n,slug:Br(n),type:"project",status:"draft",runner:l,repoId:y.repoId,workspaceId:s.id,selectedPtyTabId:T[0]?.id??null,linkedRepoIds:i.filter(b=>b!==y.repoId),...Jp(o,r.lineage),repoRoot:d,worktreePath:d,branch:c,bundlePath:d,selectedRepoTargetId:y.repoId,repoTargets:m,ptyTabs:T,runnerSession:{command:k.runners.buildCommand(l,n,r.config??{}),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:n},checks:y.checks,lastCommit:null,prs:[],artifacts:{logPath:J.relative(e.workspaceRoot,u),checkSummaryPath:J.relative(e.workspaceRoot,J.join(p,"check-summary.json")),prDraftPath:null,prStatusPath:J.relative(e.workspaceRoot,J.join(p,"pr-status.json"))},cleanup:pi(),lastFailureReason:m.every(b=>b.status==="unavailable")?"No project repo targets could be provisioned.":null,createdAt:a,updatedAt:a};return await nt(e,R),await Ga(e,o),{repoId:y.repoId,repoRoot:d,workspaceId:s.id,task:R,bundlePath:d,repoTargets:m}},Kr=(e,t,n,r="codex",s={})=>{let i=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",...s.previews?.agentOrchestration?{capabilityId:`capability_${Pb()}`}:{},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}]},Ib=(e,t)=>{let n=new Date().toISOString(),r=Kr(t.taskId,t.prompt,n,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:Br(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,selectedPtyTabId:r[0]?.id??null,linkedRepoIds:[],...Jp(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:{...nl(J.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:J.relative(e.workspaceRoot,J.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:J.relative(e.workspaceRoot,J.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:J.relative(e.workspaceRoot,J.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:pi(),lastFailureReason:null,createdAt:n,updatedAt:n}},vb=async(e,t,n,r,s)=>{try{return await el(e,t,r,s)}catch(i){return{repoId:t.id,branch:r,repoRoot:t.rootPath,worktreePath:s,status:"unavailable",failureReason:i instanceof Error?i.message:"Failed to create worktree.",checks:nl(J.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:zp(),cleanup:pi()}}},el=async(e,t,n,r)=>(await Wr(J.dirname(r),{recursive:!0}),await Ja(t.rootPath,n,r,t.defaultBranch),{repoId:t.id,branch:n,repoRoot:t.rootPath,worktreePath:r,status:"ready",failureReason:null,checks:nl(J.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:zp(),cleanup:pi()}),Cb=e=>{let t=new Set(["manifest.json",Yp]),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},Ab=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=J.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=Y(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})`},Ib=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",vb=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Cb=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var qr=async(e,t)=>{let n=await Q("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.")},Za=async(e,t,n,r="main")=>{let s=r.trim()||"main";if((await Q("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 Ab(e,s);await G("git",["worktree","add","-b",t,n,o],{cwd:e})},Ab=async(e,t)=>(await Q("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await Q("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await Q("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t,fi=async e=>{let t=await Q("git",["status","--short"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"Unable to inspect git status.");return t.stdout.trim().length>0},Bp=async e=>{await G("git",["add","-A"],{cwd:e})},Wp=async(e,t)=>{await G("git",["commit","-m",t],{cwd:e})},Vp=async e=>{let t=await G("git",["show","-s","--format=%H%n%s","HEAD"],{cwd:e}),[n="",r=""]=t.stdout.trim().split(`
12
+ `);if(!n||!r)throw new Error("Unable to read git HEAD commit metadata.");return{sha:n,message:r}},Kp=async e=>{let t=await Q("git",["branch","--show-current"],{cwd:e});if(t.exitCode!==0)return null;let n=t.stdout.trim();return n.length>0?n:null};var mi=async(e,t)=>{await G("git",["worktree","remove","--force",t],{cwd:e})},Gp=async(e,t)=>{await G("git",["branch","-D",t],{cwd:e})};var el=async e=>zn(e,e.repoRoot),zn=async(e,t)=>{let n=await Ne(e),r=Hp(new Date),s=Yp(n.taskIds,r);for(;;){let i=`task_${r}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await qr(t,o))return i;s+=1}},Ur=async e=>{let t=await Ne(e),n=Hp(new Date),r=Yp(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`},Hp=e=>{let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}${n}${r}`},Yp=(e,t)=>{let n=e.filter(r=>r.startsWith(`task_${t}_`)).map(r=>Number.parseInt(r.slice(-2),10)).filter(r=>Number.isInteger(r));return n.length===0?1:Math.max(...n)+1};var Br=async(e,t,n={readRawTask:Nt,validateTaskRecord:Ge})=>{let r=await Ne(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(Eb(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}},Eb=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var zp=["merge_ready","pr_open","checked","review","running","draft"],tl=e=>[...e].sort((t,n)=>t.id.localeCompare(n.id)),nl=(e,t)=>t&&e.some(r=>r.id===t)?t:e.length===0?null:[...e].sort(Ob)[0]?.id??null,Ob=(e,t)=>{let n=Jp(e.status),r=Jp(t.status);return n!==r?n-r:t.updatedAt.localeCompare(e.updatedAt)},Jp=e=>{let t=zp.indexOf(e);return t>=0?t:zp.length};import Xp from"node:path";var Pn=(e,t)=>t?Xp.isAbsolute(t)?t:Xp.join(e.repoRoot,t):null;import{randomUUID as $b}from"node:crypto";import{mkdir as Vr,rm as Nb,writeFile as hi}from"node:fs/promises";import J from"node:path";var Wr=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");var Qp=["AGENTS","md"].join("."),Jn=async(e,t,n,r={})=>{let s=await xe(e,t),[i,o]=await Promise.all([Lb(e,s.id,r.workspaceId,r.allowLinkedProjectRepo??!1),zn(e,s.rootPath)]),a=`craig/${o}`,l=J.join(e.worktreesDir,s.id,o),c=J.join(e.logsDir,`${o}.log`),u=J.join(e.artifactsDir,o);await Promise.all([Vr(J.dirname(l),{recursive:!0}),Vr(u,{recursive:!0}),hi(c,"","utf8")]);let d=Db(e,{taskId:o,repoId:s.id,workspaceId:i.id,repoRoot:s.rootPath,prompt:n,runner:r.runner??"codex",config:r.config??{},branch:a,worktreePath:l,...r.lineage?{lineage:r.lineage}:{}});return await nt(e,d),await za(e,o),await Za(s.rootPath,a,l,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,workspaceId:i.id,task:d}},Kr=async(e,t,n,r={})=>{let s=(await ve(e)).find(b=>b.id===t&&b.status==="active");if(!s)throw new Error(`Workspace ${t} does not exist or is archived.`);if(s.kind!=="project"){if(!s.primaryRepoId)throw new Error(`Workspace ${t} is not task-capable.`);let b=await Jn(e,s.primaryRepoId,n,r);return{...b,bundlePath:b.task.worktreePath,repoTargets:[]}}let i=s.discoveredRepoIds??[];if(i.length===0)throw new Error(`Project workspace ${t} has no discovered repos.`);let o=await Ur(e),a=new Date().toISOString(),l=r.runner??"codex",c=`craig/${o}`,u=J.join(e.craigDir,"task-bundles",o),d=J.join(e.logsDir,`${o}.log`),p=J.join(e.artifactsDir,o);await Vr(u,{recursive:!0}),await Vr(p,{recursive:!0}),await hi(d,"","utf8");let h=await Promise.all(i.map(b=>xe(e,b))),f=Fb(h),m=await Promise.all(h.map(b=>_b(e,b,o,c,J.join(u,f.get(b.id))))),y=m.find(b=>b.status==="ready")??m[0];if(!m.some(b=>b.status==="ready"))throw await Nb(u,{recursive:!0,force:!0}),new Error(`No project repo targets could be provisioned for ${t}: ${m.map(b=>`${b.repoId}: ${b.failureReason??"unknown error"}`).join("; ")}`);await sl({taskId:o,workspaceId:t,prompt:n,repos:h,repoTargets:m,bundlePath:u});let T=Gr(o,n,a,l,r.config??{}),R={id:o,title:n,slug:Wr(n),type:"project",status:"draft",runner:l,repoId:y.repoId,workspaceId:s.id,selectedPtyTabId:T[0]?.id??null,linkedRepoIds:i.filter(b=>b!==y.repoId),...ef(o,r.lineage),repoRoot:u,worktreePath:u,branch:c,bundlePath:u,selectedRepoTargetId:y.repoId,repoTargets:m,ptyTabs:T,runnerSession:{command:k.runners.buildCommand(l,n,r.config??{}),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:n},checks:y.checks,lastCommit:null,prs:[],artifacts:{logPath:J.relative(e.workspaceRoot,d),checkSummaryPath:J.relative(e.workspaceRoot,J.join(p,"check-summary.json")),prDraftPath:null,prStatusPath:J.relative(e.workspaceRoot,J.join(p,"pr-status.json"))},cleanup:gi(),lastFailureReason:m.every(b=>b.status==="unavailable")?"No project repo targets could be provisioned.":null,createdAt:a,updatedAt:a};return await nt(e,R),await za(e,o),{repoId:y.repoId,repoRoot:u,workspaceId:s.id,task:R,bundlePath:u,repoTargets:m}},Gr=(e,t,n,r="codex",s={})=>{let i=k.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",...s.previews?.agentOrchestration?{capabilityId:`capability_${$b()}`}:{},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}]},Db=(e,t)=>{let n=new Date().toISOString(),r=Gr(t.taskId,t.prompt,n,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:Wr(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,selectedPtyTabId:r[0]?.id??null,linkedRepoIds:[],...ef(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:{...il(J.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:J.relative(e.workspaceRoot,J.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:J.relative(e.workspaceRoot,J.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:J.relative(e.workspaceRoot,J.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:gi(),lastFailureReason:null,createdAt:n,updatedAt:n}},_b=async(e,t,n,r,s)=>{try{return await rl(e,t,r,s)}catch(i){return{repoId:t.id,branch:r,repoRoot:t.rootPath,worktreePath:s,status:"unavailable",failureReason:i instanceof Error?i.message:"Failed to create worktree.",checks:il(J.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Zp(),cleanup:gi()}}},rl=async(e,t,n,r)=>(await Vr(J.dirname(r),{recursive:!0}),await Za(t.rootPath,n,r,t.defaultBranch),{repoId:t.id,branch:n,repoRoot:t.rootPath,worktreePath:r,status:"ready",failureReason:null,checks:il(J.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Zp(),cleanup:gi()}),Fb=e=>{let t=new Set(["manifest.json",Qp]),n=new Map;for(let r of e){let s=t.has(r.name)?`${r.name}-repo`:r.name,i=s,o=2;for(;t.has(i);)i=`${s}-${o}`,o+=1;t.add(i),n.set(r.id,i)}return n},xb=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=J.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
- `)},tl=async e=>{await ui(J.join(e.bundlePath,"manifest.json"),JSON.stringify({taskId:e.taskId,workspaceId:e.workspaceId,prompt:e.prompt,repos:e.repoTargets.map(t=>({repoId:t.repoId,repoName:e.repos.find(n=>n.id===t.repoId)?.name??t.repoId,path:J.relative(e.bundlePath,t.worktreePath),status:t.status,worktreePath:t.worktreePath,failureReason:t.failureReason}))},null,2),"utf8"),await ui(J.join(e.bundlePath,Yp),Ab(e),"utf8")},nl=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),zp=()=>({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}),pi=()=>({worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),Jp=(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}),Eb=async(e,t,n,r=!1)=>{let s=await Ie(e),i=n?s.find(o=>o.id===n&&o.status==="active"&&(o.kind==="project"?r||o.discoveredRepoIds?.includes(t):o.primaryRepoId===t)):s.find(o=>o.kind!=="project"&&o.primaryRepoId===t&&o.status==="active");if(!i)throw new Error(n?`Repo ${t} is not available in active workspace ${n}.`:`Repo ${t} does not have an active workspace.`);return i};var rl=async(e,t,n)=>{await G(e,t,r=>({...r,status:r.status==="running"?"draft":r.status,runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n}))},Gr=async(e,t,n)=>G(e,t,r=>({...r,status:"draft",runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n})),Hr=async(e,t)=>G(e,t,n=>{let r=n.ptyTabs.find(s=>s.kind==="agent");if(!r)throw new Error(`Task ${t} is missing its agent PTY tab.`);return{...n,status:"running",selectedPtyTabId:r.id,runnerSession:{...n.runnerSession,startedAt:new Date().toISOString(),lastKnownState:"running"}}});var sl=async(e,t,n,r={})=>{let s=n.trim(),i=await k.load(e),o=r.runner??k.runners.getDefault(i);if(k.runners.assertEnabled(o,i),t.trim().length===0)throw new Error(r.workspaceId?"Workspace id cannot be empty.":"Repo id cannot be empty.");if(s.length===0)throw new Error("Task prompt cannot be empty.");let l=(r.workspaceId?await Vr(e,r.workspaceId,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}):await zn(e,t,s,{runner:o,config:i,...r.owningWorkspaceId?{workspaceId:r.owningWorkspaceId,allowLinkedProjectRepo:r.allowLinkedProjectRepo??!1}:{},...r.lineage?{lineage:r.lineage}:{}})).task;try{let c=await r.onProvisioned?.(l);if(!r.launchProvisioned)throw new Error("Craig task creation requires the PTY daemon launcher.");await r.launchProvisioned(l,c||void 0);let d=r.markStartedAfterLaunch===!1?await F(e,l.id):await Hr(e,l.id),u=d.ptyTabs.find(p=>p.kind==="agent");return{kind:"createTask",taskId:d.id,repoId:d.repoId,workspaceId:d.workspaceId,agentTabId:u.id,status:d.status,branch:d.branch,worktreePath:d.worktreePath,runner:d.runner}}catch(c){throw await Gr(e,l.id,c instanceof Error?c.message:"Unknown Craig error"),c}};import{mkdir as _b}from"node:fs/promises";import xb from"node:path";var xt=async e=>{let t=await Q("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var Xp=async(e,t,n)=>{let r=n==="merge"?"--merge":n==="rebase"?"--rebase":"--squash";await K("gh",["pr","merge",String(t),r,"--delete-branch=false"],{cwd:e})},Jn=async(e,t)=>{let n=await K("gh",il(e),{cwd:t});return JSON.parse(n.stdout)},Xn=async(e,t)=>{let n=await Q("gh",il(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(ef(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Qp=async(e,t)=>{let n=await Q("gh",il(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(ef(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Zp=async(e,t,n)=>{if(n.length===0)return[];let r=Nb(n),s;try{s=await K("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw Ob(a)?new He(a instanceof Error?a.message:String(a)):a}let o=JSON.parse(s.stdout).data?.repository??{};return n.map((a,l)=>{let c=o[`item${l}`],d=Db(c);return{id:a.id,found:d!==null,view:d}})},fi=async e=>{let t=await Q("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:$b(t.stdout.trim())},Qt=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])}},Ob=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")},ef=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},il=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],$b=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},Nb=e=>`
14
+ `)},sl=async e=>{await hi(J.join(e.bundlePath,"manifest.json"),JSON.stringify({taskId:e.taskId,workspaceId:e.workspaceId,prompt:e.prompt,repos:e.repoTargets.map(t=>({repoId:t.repoId,repoName:e.repos.find(n=>n.id===t.repoId)?.name??t.repoId,path:J.relative(e.bundlePath,t.worktreePath),status:t.status,worktreePath:t.worktreePath,failureReason:t.failureReason}))},null,2),"utf8"),await hi(J.join(e.bundlePath,Qp),xb(e),"utf8")},il=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),Zp=()=>({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}),gi=()=>({worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),ef=(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}),Lb=async(e,t,n,r=!1)=>{let s=await ve(e),i=n?s.find(o=>o.id===n&&o.status==="active"&&(o.kind==="project"?r||o.discoveredRepoIds?.includes(t):o.primaryRepoId===t)):s.find(o=>o.kind!=="project"&&o.primaryRepoId===t&&o.status==="active");if(!i)throw new Error(n?`Repo ${t} is not available in active workspace ${n}.`:`Repo ${t} does not have an active workspace.`);return i};var ol=async(e,t,n)=>{await H(e,t,r=>({...r,status:r.status==="running"?"draft":r.status,runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n}))},Hr=async(e,t,n)=>H(e,t,r=>({...r,status:"draft",runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n})),Yr=async(e,t)=>H(e,t,n=>{let r=n.ptyTabs.find(s=>s.kind==="agent");if(!r)throw new Error(`Task ${t} is missing its agent PTY tab.`);return{...n,status:"running",selectedPtyTabId:r.id,runnerSession:{...n.runnerSession,startedAt:new Date().toISOString(),lastKnownState:"running"}}});var al=async(e,t,n,r={})=>{let s=n.trim(),i=await k.load(e),o=r.runner??k.runners.getDefault(i);if(k.runners.assertEnabled(o,i),t.trim().length===0)throw new Error(r.workspaceId?"Workspace id cannot be empty.":"Repo id cannot be empty.");if(s.length===0)throw new Error("Task prompt cannot be empty.");let l=(r.workspaceId?await Kr(e,r.workspaceId,s,{runner:o,config:i,...r.lineage?{lineage:r.lineage}:{}}):await Jn(e,t,s,{runner:o,config:i,...r.owningWorkspaceId?{workspaceId:r.owningWorkspaceId,allowLinkedProjectRepo:r.allowLinkedProjectRepo??!1}:{},...r.lineage?{lineage:r.lineage}:{}})).task;try{let c=await r.onProvisioned?.(l);if(!r.launchProvisioned)throw new Error("Craig task creation requires the PTY daemon launcher.");await r.launchProvisioned(l,c||void 0);let u=r.markStartedAfterLaunch===!1?await x(e,l.id):await Yr(e,l.id),d=u.ptyTabs.find(p=>p.kind==="agent");return{kind:"createTask",taskId:u.id,repoId:u.repoId,workspaceId:u.workspaceId,agentTabId:d.id,status:u.status,branch:u.branch,worktreePath:u.worktreePath,runner:u.runner}}catch(c){throw await Hr(e,l.id,c instanceof Error?c.message:"Unknown Craig error"),c}};import{mkdir as Bb}from"node:fs/promises";import Wb from"node:path";var Ft=async e=>{let t=await Q("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var tf=async(e,t,n)=>{let r=n==="merge"?"--merge":n==="rebase"?"--rebase":"--squash";await G("gh",["pr","merge",String(t),r,"--delete-branch=false"],{cwd:e})},Xn=async(e,t)=>{let n=await G("gh",ll(e),{cwd:t});return JSON.parse(n.stdout)},Qn=async(e,t)=>{let n=await Q("gh",ll(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(sf(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},nf=async(e,t)=>{let n=await Q("gh",ll(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(sf(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},rf=async(e,t,n)=>{if(n.length===0)return[];let r=qb(n),s;try{s=await G("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw Mb(a)?new Ye(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=Ub(c);return{id:a.id,found:u!==null,view:u}})},yi=async e=>{let t=await Q("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:jb(t.stdout.trim())},Qt=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])}},Mb=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")},sf=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},ll=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],jb=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},qb=e=>`
15
15
  query CraigPullRequestBatch($owner: String!, $name: String!) {
16
16
  repository(owner: $owner, name: $name) {
17
17
  ${e.map((n,r)=>{let s=`item${r}`;return n.mode==="number"?`${s}: pullRequest(number: ${Number(n.selector)}) { ...PrFields }`:`${s}: pullRequests(headRefName: ${JSON.stringify(n.selector)}, states: OPEN, first: 1, orderBy: { field: UPDATED_AT, direction: DESC }) { nodes { ...PrFields } }`}).join(`
@@ -65,161 +65,161 @@ fragment PrFields on PullRequest {
65
65
  }
66
66
  }
67
67
  }
68
- `,Db=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=Pn(e,t.artifacts.prStatusPath);n&&(await _b(xb.dirname(n),{recursive:!0}),await U(n,{taskId:t.id,prs:t.prs}))},Qn=async(e,t,n={writeTask:nt,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},Yr=async(e,t,n,r,s={readRawTask:Nt,validateTaskRecord:Ke,writeTask:nt,writePrStatusArtifact:Sn,withTaskLock:tt})=>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=_t(n,a),c=Dt(o,l),d=o.status==="closed"?o.status:Rn(c.prs),u={...c,status:d};return Qn(e,u,s)}),zr=async(e,t)=>{let n=H(t),r=n?.number?String(n.number):t.branch,s=await Jn(r,t.worktreePath);return Yr(e,t,s,n)},Jr=async(e,t)=>{for(let n of await ol(t)){let r=await Xn(n,t.worktreePath);if(!r)continue;return{discovered:!0,task:await Yr(e,t,r,null)}}return{discovered:!1,task:t}},ol=async e=>{let t=await Up(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(n=>!!n))]};async function Xr(e,t,n,r){return tt(e,t,async()=>{let s=await F(e,t);if(!s.repoTargets?.find(h=>h.repoId===n))throw new Error(`Project task ${t} has no repo target ${n}.`);let o=Qt(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=_t(r,a,o??void 0),c=Fb(r),d=Dt(s,l),u={...d,repoTargets:(d.repoTargets??[]).map(h=>h.repoId===n?{...h,pullRequest:r.headRefName===h.branch?c:Zn(h)?h.pullRequest:tf(h.pullRequest)}:h)},p={...u,status:u.status==="closed"?u.status:hi(u)};return Qn(e,p)})}async function mi(e,t,n){return tt(e,t,async()=>{let r=await F(e,t),s=r.repoTargets?.find(a=>a.repoId===n);if(!s)throw new Error(`Project task ${t} has no repo target ${n}.`);if(s.pullRequest.number===null||Zn(s))return r;let i={...r,repoTargets:(r.repoTargets??[]).map(a=>a.repoId===n?{...a,pullRequest:tf(a.pullRequest)}:a)},o={...i,status:i.status==="closed"?i.status:hi(i)};return Qn(e,o)})}function Zn(e){return e.pullRequest.number!==null&&e.pullRequest.headBranch===e.branch}function Fb(e){let t=Qt(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:Lb(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:Mb(e.reviewDecision??null),requiredChecks:Ya(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function hi(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 Lb=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,Mb=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,tf=e=>({provider:"github",owner:e.owner??null,repo:e.repo??null,number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null});var er=async(e,t,n)=>{if(Zn(n)){let s=String(n.pullRequest.number),i=await Jn(s,n.worktreePath);return await Xr(e,t.id,n.repoId,i),"synced"}let r=await Xn(n.branch,n.worktreePath);return r?(await Xr(e,t.id,n.repoId,r),"discovered"):(await mi(e,t.id,n.repoId),"not_found")};var Qr=async(e,t)=>{let n=await F(e,t),r=H(n);return r?.number?(await xt(n.worktreePath),Xt(r)?(await Jr(e,n)).task:zr(e,n)):n},ll=async(e,t)=>{let n=await F(e,t);if(n.type==="project"&&n.repoTargets?.length)return await tr(e,t),F(e,t);let r=H(n);if(await we(n),await xt(n.worktreePath),!r?.number||Xt(r)){let i=await Jr(e,n);if(!i.discovered&&!r?.number)throw new Error(`No PR found for ${n.branch}.`);return i.task}return await zr(e,n)},tr=async(e,t)=>{let n=await F(e,t),r=(n.repoTargets??[]).filter(i=>i.status==="ready"),s={synced:0,discovered:0,notFound:0};for(let i of r){await xt(i.worktreePath);let o=i.pullRequest.number?await er(e,n,i):await er(e,n,i).catch(()=>"not_found");s[o==="not_found"?"notFound":o]++}return s},cl=async(e,t)=>{let n=new Map,r=new Map,s=[];for(let i of t){let o=al(n,i);if(i.type==="project"&&i.repoTargets?.length){for(let u of i.repoTargets.filter(p=>p.status==="ready")){let p=Zn(u),h={id:`${i.id}:${u.repoId}`,task:i,targetRepoId:u.repoId,worktreePath:u.worktreePath,selector:p?String(u.pullRequest.number):u.branch,mode:p?"number":"head",fallbackSelectors:[]};await nf(r,h).catch(async()=>{try{await xt(u.worktreePath);let f=u.pullRequest.number?await er(e,i,u):await er(e,i,u);gi(o,f,u.pullRequest.number??null,u.pullRequest.url??null)}catch(f){if(f instanceof He)throw f;s.push(f)}})}continue}let a=H(i),l=a?.number&&!Xt(a),c=l?[]:await ol(i),d={id:i.id,task:i,worktreePath:i.worktreePath,selector:l?String(a.number):c[0]??i.branch,mode:l?"number":"head",fallbackSelectors:l?[]:c.slice(1)};await nf(r,d).catch(async()=>{try{let{disposition:u,task:p}=await yi(e,i.id),h=H(p);gi(o,u,h?.number??null,h?.url??null)}catch(u){if(u instanceof He)throw u;s.push(u)}})}for(let i of r.values())try{await xt(i.worktreePath);let o=await Zp(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=al(n,l.task),u=a.get(l.id)?.view??await jb(i.worktreePath,l);if(!u){l.targetRepoId&&l.mode==="head"&&await mi(e,l.task.id,l.targetRepoId),gi(c,"not_found",null,null);continue}if(l.targetRepoId)await Xr(e,l.task.id,l.targetRepoId,u);else{let p=await Nt(e,l.task.id),h=Ke(p,`${e.tasksDir}/${l.task.id}.json`);await Yr(e,h,u,l.mode==="number"?H(h):null)}gi(c,l.mode==="number"?"synced":"discovered",u.number,u.url)}}catch(o){if(o instanceof He)throw o;s.push(o)}return qb(s),t.map(i=>al(n,i))},yi=async(e,t)=>{let n=await F(e,t);await we(n),await xt(n.worktreePath);let r=H(n);if(r?.number&&!Xt(r))return{disposition:"synced",task:await zr(e,n)};let s=await Jr(e,n);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},jb=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},nf=async(e,t)=>{let n=await fi(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]})},al=(e,t)=>{let n=e.get(t.id);if(n)return n;let r={taskId:t.id,synced:0,discovered:0,notFound:0,hadPr:t.type==="project"?!!t.repoTargets?.some(s=>s.pullRequest.number):!!H(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,r),r},gi=(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},qb=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var dl=async(e,t)=>{let n=await F(e,t);try{n.type==="project"&&n.repoTargets?.length?(await tr(e,t),n=await F(e,t)):n.prs.some(s=>s.number)&&(n=await Qr(e,t))}catch{}let r=await Mr(e,n);return{kind:"showTask",task:n,inspection:r}};var ul=async(e,t)=>{let n=await F(e,t);if(await we(n),(await K("git",["status","--short"],{cwd:n.worktreePath})).stdout.trim().length===0)return{kind:"showTaskDiff",taskId:n.id,diffText:"",isEmpty:!0};let s=await Ub(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}},Ub=async e=>{let t=[],n=await K("git",["diff","--stat","--patch","HEAD"],{cwd:e});n.stdout.trim().length>0&&t.push(n.stdout.trimEnd());let r=await Bb(e);for(let s of r){let i=await Q("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(i.stdout.trimEnd())}return t.join(`
68
+ `,Ub=e=>{if(!e||typeof e!="object")return null;let t="nodes"in e?e.nodes?.[0]??null:e;if(!t||typeof t!="object")return null;let n=t,r=n.statusCheckRollup?.contexts?.nodes??[];return{number:n.number,url:n.url,baseRefName:n.baseRefName,headRefName:n.headRefName,headRefOid:n.headRefOid??null,state:n.state,isDraft:n.isDraft??!1,title:n.title??null,createdAt:n.createdAt??null,updatedAt:n.updatedAt??null,mergedAt:n.mergedAt??null,mergeable:n.mergeable,mergeStateStatus:n.mergeStateStatus,reviewDecision:n.reviewDecision??null,statusCheckRollup:r,comments:n.comments?.nodes??[]}};var Sn=async(e,t)=>{let n=Pn(e,t.artifacts.prStatusPath);n&&(await Bb(Wb.dirname(n),{recursive:!0}),await U(n,{taskId:t.id,prs:t.prs}))},Zn=async(e,t,n={writeTask:nt,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},zr=async(e,t,n,r,s={readRawTask:Nt,validateTaskRecord:Ge,writeTask:nt,writePrStatusArtifact:Sn,withTaskLock:tt})=>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=_t(n,a),c=Dt(o,l),u=o.status==="closed"?o.status:Rn(c.prs),d={...c,status:u};return Zn(e,d,s)}),Jr=async(e,t)=>{let n=Y(t),r=n?.number?String(n.number):t.branch,s=await Xn(r,t.worktreePath);return zr(e,t,s,n)},Xr=async(e,t)=>{for(let n of await cl(t)){let r=await Qn(n,t.worktreePath);if(!r)continue;return{discovered:!0,task:await zr(e,t,r,null)}}return{discovered:!1,task:t}},cl=async e=>{let t=await Kp(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(n=>!!n))]};async function Qr(e,t,n,r){return tt(e,t,async()=>{let s=await x(e,t);if(!s.repoTargets?.find(h=>h.repoId===n))throw new Error(`Project task ${t} has no repo target ${n}.`);let o=Qt(r.url),a=s.prs.find(h=>o?Hn(h,{owner:o.owner,repo:o.name,number:r.number}):h.number===r.number)??null,l=_t(r,a,o??void 0),c=Vb(r),u=Dt(s,l),d={...u,repoTargets:(u.repoTargets??[]).map(h=>h.repoId===n?{...h,pullRequest:r.headRefName===h.branch?c:er(h)?h.pullRequest:of(h.pullRequest)}:h)},p={...d,status:d.status==="closed"?d.status:ki(d)};return Zn(e,p)})}async function wi(e,t,n){return tt(e,t,async()=>{let r=await x(e,t),s=r.repoTargets?.find(a=>a.repoId===n);if(!s)throw new Error(`Project task ${t} has no repo target ${n}.`);if(s.pullRequest.number===null||er(s))return r;let i={...r,repoTargets:(r.repoTargets??[]).map(a=>a.repoId===n?{...a,pullRequest:of(a.pullRequest)}:a)},o={...i,status:i.status==="closed"?i.status:ki(i)};return Zn(e,o)})}function er(e){return e.pullRequest.number!==null&&e.pullRequest.headBranch===e.branch}function Vb(e){let t=Qt(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:Kb(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:Gb(e.reviewDecision??null),requiredChecks:Xa(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function ki(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 Kb=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,Gb=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,of=e=>({provider:"github",owner:e.owner??null,repo:e.repo??null,number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null});var tr=async(e,t,n)=>{if(er(n)){let s=String(n.pullRequest.number),i=await Xn(s,n.worktreePath);return await Qr(e,t.id,n.repoId,i),"synced"}let r=await Qn(n.branch,n.worktreePath);return r?(await Qr(e,t.id,n.repoId,r),"discovered"):(await wi(e,t.id,n.repoId),"not_found")};var Zr=async(e,t)=>{let n=await x(e,t),r=Y(n);return r?.number?(await Ft(n.worktreePath),Xt(r)?(await Xr(e,n)).task:Jr(e,n)):n},ul=async(e,t)=>{let n=await x(e,t);if(n.type==="project"&&n.repoTargets?.length)return await nr(e,t),x(e,t);let r=Y(n);if(await we(n),await Ft(n.worktreePath),!r?.number||Xt(r)){let i=await Xr(e,n);if(!i.discovered&&!r?.number)throw new Error(`No PR found for ${n.branch}.`);return i.task}return await Jr(e,n)},nr=async(e,t)=>{let n=await x(e,t),r=(n.repoTargets??[]).filter(i=>i.status==="ready"),s={synced:0,discovered:0,notFound:0};for(let i of r){await Ft(i.worktreePath);let o=i.pullRequest.number?await tr(e,n,i):await tr(e,n,i).catch(()=>"not_found");s[o==="not_found"?"notFound":o]++}return s},pl=async(e,t)=>{let n=new Map,r=new Map,s=[];for(let i of t){let o=dl(n,i);if(i.type==="project"&&i.repoTargets?.length){for(let d of i.repoTargets.filter(p=>p.status==="ready")){let p=er(d),h={id:`${i.id}:${d.repoId}`,task:i,targetRepoId:d.repoId,worktreePath:d.worktreePath,selector:p?String(d.pullRequest.number):d.branch,mode:p?"number":"head",fallbackSelectors:[]};await af(r,h).catch(async()=>{try{await Ft(d.worktreePath);let f=d.pullRequest.number?await tr(e,i,d):await tr(e,i,d);Ti(o,f,d.pullRequest.number??null,d.pullRequest.url??null)}catch(f){if(f instanceof Ye)throw f;s.push(f)}})}continue}let a=Y(i),l=a?.number&&!Xt(a),c=l?[]:await cl(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 af(r,u).catch(async()=>{try{let{disposition:d,task:p}=await bi(e,i.id),h=Y(p);Ti(o,d,h?.number??null,h?.url??null)}catch(d){if(d instanceof Ye)throw d;s.push(d)}})}for(let i of r.values())try{await Ft(i.worktreePath);let o=await rf(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=dl(n,l.task),d=a.get(l.id)?.view??await Hb(i.worktreePath,l);if(!d){l.targetRepoId&&l.mode==="head"&&await wi(e,l.task.id,l.targetRepoId),Ti(c,"not_found",null,null);continue}if(l.targetRepoId)await Qr(e,l.task.id,l.targetRepoId,d);else{let p=await Nt(e,l.task.id),h=Ge(p,`${e.tasksDir}/${l.task.id}.json`);await zr(e,h,d,l.mode==="number"?Y(h):null)}Ti(c,l.mode==="number"?"synced":"discovered",d.number,d.url)}}catch(o){if(o instanceof Ye)throw o;s.push(o)}return Yb(s),t.map(i=>dl(n,i))},bi=async(e,t)=>{let n=await x(e,t);await we(n),await Ft(n.worktreePath);let r=Y(n);if(r?.number&&!Xt(r))return{disposition:"synced",task:await Jr(e,n)};let s=await Xr(e,n);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},Hb=async(e,t)=>{if(t.mode!=="head")return null;for(let n of t.fallbackSelectors){let r=await Qn(n,e);if(r)return r}return null},af=async(e,t)=>{let n=await yi(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]})},dl=(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):!!Y(t)?.number,firstDiscoveredPrNumber:null,firstDiscoveredPrUrl:null};return e.set(t.id,r),r},Ti=(e,t,n,r)=>{if(t==="synced"){e.synced+=1;return}if(t==="discovered"){e.discovered+=1,e.firstDiscoveredPrNumber??=n,e.firstDiscoveredPrUrl??=r;return}e.notFound+=1},Yb=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var fl=async(e,t)=>{let n=await x(e,t);try{n.type==="project"&&n.repoTargets?.length?(await nr(e,t),n=await x(e,t)):n.prs.some(s=>s.number)&&(n=await Zr(e,t))}catch{}let r=await jr(e,n);return{kind:"showTask",task:n,inspection:r}};var ml=async(e,t)=>{let n=await x(e,t);if(await we(n),(await G("git",["status","--short"],{cwd:n.worktreePath})).stdout.trim().length===0)return{kind:"showTaskDiff",taskId:n.id,diffText:"",isEmpty:!0};let s=await zb(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}},zb=async e=>{let t=[],n=await G("git",["diff","--stat","--patch","HEAD"],{cwd:e});n.stdout.trim().length>0&&t.push(n.stdout.trimEnd());let r=await Jb(e);for(let s of r){let i=await Q("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(i.stdout.trimEnd())}return t.join(`
69
69
 
70
- `)},Bb=async e=>(await K("git",["ls-files","--others","--exclude-standard"],{cwd:e})).stdout.split(`
71
- `).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as Wb}from"node:child_process";import{access as Vb}from"node:fs/promises";var pl=async(e,t)=>{let n=await F(e,t),r=Hn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await Vb(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},fl=async e=>{await new Promise((t,n)=>{let r=!1,s=Wb("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 Kb}from"node:fs/promises";import Gb from"node:path";var ml=async(e,t)=>{let n=await F(e,t);if(await we(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 ci(n.worktreePath)&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);let s=(await k.load(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);await G(e,n.id,a=>({...a,status:a.status==="running"?n.status:a.status,checks:{...a.checks,status:"running",commands:[...s],results:[]}}));let i=[];for(let a of s){let l=new Date().toISOString(),c=await Q("sh",["-lc",a],{cwd:n.worktreePath}),d=new Date().toISOString(),u=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:d,exitCode:u}),u!==0){let p=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,h=await G(e,n.id,f=>({...f,status:"review",checks:{...f.checks,results:i,status:"failed",lastRunAt:d},lastFailureReason:p}));return await rf(e,h),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await G(e,n.id,a=>({...a,status:a.status==="review"||a.status==="checked"?"checked":a.status,checks:{...a.checks,results:i,status:"passed",lastRunAt:new Date().toISOString()},lastFailureReason:null}));return await rf(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},rf=async(e,t)=>{let n=Pn(e,t.artifacts.checkSummaryPath);n&&(await Kb(Gb.dirname(n),{recursive:!0}),await U(n,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))};var hl=async(e,t)=>{let n=await F(e,t);await we(n);let r=await ci(n.worktreePath);if(n.status==="running"&&r&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot commit from status "${n.status}".`);if(!r)throw new Error(`Task ${n.id} has no uncommitted diff to commit.`);let s=n.title.trim();await Mp(n.worktreePath),await jp(n.worktreePath,s);let i=await qp(n.worktreePath),o=new Date().toISOString(),a=await G(e,n.id,l=>({...l,status:l.status==="running"?n.status:l.status,lastCommit:{sha:i.sha,message:i.message,committedAt:o},lastFailureReason:null}));return{kind:"commitTask",taskId:n.id,status:a.status,commitSha:i.sha,message:i.message}};import{access as Hb}from"node:fs/promises";var gl=async(e,t)=>{let n=await F(e,t),r=await Yb(n.worktreePath);return G(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},Yb=async e=>{try{return await Hb(e),!0}catch{return!1}};var yl=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await di(e.repoRoot,t.worktreePath),s=new Date().toISOString()}catch(i){r.push(i instanceof Error?i.message:"Failed to remove worktree.")}await G(e,t.id,i=>({...i,cleanup:{...i.cleanup,worktreeRemovedAt:s??i.cleanup.worktreeRemovedAt,preservedWorktree:n.preserveWorktree,warning:r.length>0?r.join(" "):null}}))};var wl=async(e,t,n)=>{let r=await xe(e,n),s=await G(e,t,i=>{if(i.repoId===r.id)throw new Error(`Repo ${r.id} is already the primary repo for task ${i.id}.`);return{...i,linkedRepoIds:i.linkedRepoIds.includes(r.id)?i.linkedRepoIds:[...i.linkedRepoIds,r.id]}});return{kind:"addTaskLink",taskId:s.id,repoId:r.id,linkedRepoIds:s.linkedRepoIds}},kl=async(e,t)=>{let n=await F(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>xe(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};import{access as zb,readFile as sf,rm as Jb,writeFile as of}from"node:fs/promises";import wi from"node:path";var lf=["AGENTS","md"].join("."),Tl=async(e,t,n)=>tt(e,t,async()=>{let r=await F(e,t);Xb(r);let s=r.repoTargets?.find(f=>f.repoId===n);if(s)return af(r.id,s.repoId,s.branch,s.worktreePath,"unchanged");let[i,o]=await Promise.all([xe(e,n),Ie(e).then(f=>f.find(m=>m.id===r.workspaceId)??null)]);if(!o||o.kind!=="project"||o.status!=="active"||!o.discoveredRepoIds?.includes(i.id))throw new g("TASK_CONTEXT_CONFLICT",`Repo ${i.id} is not a discovered repository in project workspace ${r.workspaceId}.`,{details:{taskId:r.id,repoId:i.id,workspaceId:r.workspaceId}});let a=r.bundlePath??r.worktreePath,l=wi.join(a,Qb(i.name,r)),c=wi.join(a,"manifest.json"),d=wi.join(a,lf),[u,p,h]=await Promise.all([sf(c,"utf8"),sf(d,"utf8"),jr(i.rootPath,r.branch)]);try{let f=await el(e,i,r.branch,l),m={...r,linkedRepoIds:i.id===r.repoId||r.linkedRepoIds.includes(i.id)?r.linkedRepoIds:[...r.linkedRepoIds,i.id],repoTargets:[...r.repoTargets??[],f]},y=await Promise.all((m.repoTargets??[]).map(T=>xe(e,T.repoId)));return await tl({taskId:r.id,workspaceId:r.workspaceId,prompt:Zb(u)??r.title,repos:y,repoTargets:m.repoTargets??[],bundlePath:a}),await nt(e,m),af(r.id,i.id,f.branch,f.worktreePath,"added")}catch(f){let m=await eR({repoRoot:i.rootPath,branch:r.branch,worktreePath:l,branchAlreadyExisted:h,manifestPath:c,manifestBackup:u,guidePath:d,guideBackup:p});throw m.length>0?new g("PARTIAL_RESULT",`Failed to attach repo ${i.id} to task ${r.id}, and rollback was incomplete.`,{retryable:!0,details:{taskId:r.id,repoId:i.id,rollbackFailures:m.map(y=>y instanceof Error?y.message:String(y))},cause:f}):f}}),Xb=e=>{if(e.type!=="project"||!e.bundlePath)throw new g("TASK_CONTEXT_CONFLICT",`Task ${e.id} is not a project task and cannot accept repository targets.`,{details:{taskId:e.id,taskType:e.type}})},Qb=(e,t)=>{let n=new Set(["manifest.json",lf,...(t.repoTargets??[]).map(o=>wi.basename(o.worktreePath))]),r=n.has(e)?`${e}-repo`:e,s=r,i=2;for(;n.has(s);)s=`${r}-${i}`,i+=1;return s},Zb=e=>{try{let t=JSON.parse(e);return typeof t.prompt=="string"?t.prompt:null}catch{return null}},eR=async e=>{let t=[];return await of(e.manifestPath,e.manifestBackup,"utf8").catch(r=>t.push(r)),await of(e.guidePath,e.guideBackup,"utf8").catch(r=>t.push(r)),await zb(e.worktreePath).then(()=>!0).catch(()=>!1)&&await di(e.repoRoot,e.worktreePath).catch(async r=>{t.push(r),await Jb(e.worktreePath,{recursive:!0,force:!0}).catch(s=>t.push(s))}),e.branchAlreadyExisted||await jr(e.repoRoot,e.branch).catch(s=>(t.push(s),!1))&&await Bp(e.repoRoot,e.branch).catch(s=>t.push(s)),t},af=(e,t,n,r,s)=>({kind:"addTaskRepoTarget",disposition:s,taskId:e,repoId:t,branch:n,worktreePath:r});import{spawn as tR}from"node:child_process";var bl=async(e,t)=>{let n=await F(e,t);await we(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 nR(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},nR=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=tR(s,i,{cwd:t,stdio:"inherit"});o.on("error",r),o.on("exit",a=>{if(a===0){n();return}r(new Error(`${e.join(" ")} failed with exit code ${a??"unknown"}.`))})})};import{realpath as df}from"node:fs/promises";import Zr from"node:path";async function Pl(e,t){if(t.explicitTaskId!==void 0){let l=await cf(e,t.explicitTaskId,"explicit");return Rl(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await cf(e,t.environmentTaskId,"environment");return Rl(l,"environment",t.environmentAgentTabId)}let n=await df(t.cwd).catch(()=>Zr.resolve(t.cwd)),r=await Ur(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await sR(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 Rl(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 cf(e,t,n){try{return await F(e,t)}catch(r){throw!(r instanceof g)||r.code!=="TASK_NOT_FOUND"?r:new g("TASK_CONTEXT_NOT_FOUND",`Craig task "${t}" from ${n==="explicit"?"--task":"CRAIG_TASK_ID"} was not found.`,{details:{taskId:t,source:n},cause:r})}}function Rl(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 rR(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function sR(e,t){return(await Promise.all(rR(e).map(r=>df(r).catch(()=>Zr.resolve(r))))).some(r=>iR(r,t))}function iR(e,t){let n=Zr.relative(Zr.resolve(e),t);return n===""||!n.startsWith("..")&&!Zr.isAbsolute(n)}var Sl=async(e,t,n)=>{let r=n.trim();if(r.length===0)throw new Error("Task title cannot be empty.");let s="",i=await G(e,t,o=>(s=o.title,{...o,title:r,slug:Br(r)}));return{kind:"renameTask",taskId:i.id,previousTitle:s,title:i.title,slug:i.slug}};var Il=async(e,t,n="merge",r)=>{let s=await F(e,t),i=r??H(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await Xp(s.worktreePath,i,n)};var es={readTask:F,writeTask:nt,withTaskLock:tt,ensureGhAuthenticated:xt,fetchPrView:Jn,discoverPrView:Qp,getGitHubRepositoryLocator:fi,writePrStatusArtifact:Sn};async function Cl(e,t,n,r=es){let s=await r.readTask(e,t),i=await aR(s,n,r);return Zt(s,i,"showTaskPr","shown",[])}async function Al(e,t,n,r=es){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Dl(s,n,null,r);await _l(i,r);let o=await Ti(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return Zt(s,i,"discoverTaskPr","not_found",[]);xl(o,i);let a=bi(s,i,o.number),l=await Fl(e,s,i,o,r);return Zt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function El(e,t,n,r,s=es){let i=Nl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Dl(o,r,i.repository,s);pf(i.repository,a),await _l(a,s);let l=await Ti(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));lR(l,i),xl(l,a);let c=bi(o,a,l.number),d=Ll(o,a),u=d&&!Gn(d,{owner:a.repository.owner,repo:a.repository.name,number:l.number})&&d.status!=="closed"&&d.status!=="merged"?[`Pull request #${l.number} becomes active; #${d.number} remains in task history.`]:[],p=await Fl(e,o,a,l,s);return Zt(p,a,"linkTaskPr",c?"unchanged":"linked",u)})}async function oR(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw nr(e,t);let o=e.prs.find(a=>a.number===n.number)??H(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await ki(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw nr(e,t);let a=uf(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&Tt({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await ki(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&&Tt({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&Tt({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 Ol(e,t,n,r=es){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Dl(s,n,null,r),o=Ll(s,i);if(!o?.number)return Zt(s,i,"refreshTaskPr","not_found",[]);await _l(i,r);let a=await Ti(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));xl(a,i);let l=await Fl(e,s,i,a,r);return Zt(l,i,"refreshTaskPr","synced",[])})}async function $l(e,t,n,r,s=es){let i=Nl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await oR(o,r,i,s);if(pf(i.repository,a),!bi(o,a,i.number))return Zt(o,a,"unlinkTaskPr","unchanged",[]);let c=cR(o,a,i.number),d=await mf(e,c,s);return Zt(d,a,"unlinkTaskPr","unlinked",[])})}function Nl(e){let t=e.trim(),n=Qt(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 Dl(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw nr(e,t);return vl(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 nr(e,t);return vl(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 vl(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&&Tt(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 aR(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw nr(e,t);let s=H(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await ki(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 nr(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await ki(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function ki(e,t,n,r){let s=uf(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function uf(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Qt(e.url):null}async function vl(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 _l(e,t){await Ti("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function Ti(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 pf(e,t){if(e&&!Tt(e,t.repository))throw ff(e,t)}function lR(e,t){let n=Qt(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&&!Tt(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 xl(e,t){let n=Qt(e.url);if(!n||!Tt(n,t.repository))throw ff(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 ff(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 nr(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 Tt(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function Fl(e,t,n,r,s){let i=bi(t,n,r.number),o=_t(r,i,n.repository),a=Dt(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:yf(o)}:l)}),mf(e,a,s)}function cR(e,t,n){let r=e.prs.filter(i=>!gf(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=hf(r.filter(o=>o.owner&&o.repo&&Tt({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?yf(i):uR(t.repository)}:o)}}return s}async function mf(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?hi(t):Rn(t.prs),s={...t,status:r};return Qn(e,s,n)}function bi(e,t,n){return Ml(e,t).find(r=>gf(r,t,n))??null}function Ll(e,t){if(!t.projectTarget)return H(e);let n=Ml(e,t);return hf(n)}function hf(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function Ml(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&Tt({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?dR(r.pullRequest,t.repository):null;return s&&!n.some(i=>Gn(i,s))?[...n,s]:n}function gf(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||Tt({owner:e.owner,name:e.repo},t.repository)}function Zt(e,t,n,r,s){let i=Ml(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:Ll(e,t),warnings:s}}function yf(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 dR(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 uR(e){return{provider:"github",owner:e.owner,repo:e.name,number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null}}var P={listTasks:Ur,getTask:F,provisionTask:zn,provisionProjectTask:Vr,createTask:sl,showTask:dl,showTaskDiff:ul,prepareTaskLogs:pl,streamTaskLogs:fl,runChecks:ml,commitTask:hl,closeTask:gl,cleanupTask:yl,addTaskLink:wl,addTaskRepoTarget:Tl,listTaskLinks:kl,sortTasksForDisplay:Qa,resolveSelectedTaskId:Za,allocateTaskId:Xa,allocateTaskIdForRepo:Yn,allocateProjectTaskId:qr,createDefaultTaskPtyTabs:Kr,assertTaskWorktreeExists:we,resolveTaskLogPath:Hn,buildTaskInspection:Mr,resolveArtifactPath:Pn,openTask:bl,markRunnerFailed:rl,recordStartupFailure:Gr,markTaskStarted:Hr,renameTask:Sl,resolveContext:Pl,prs:{refresh:Qr,refreshChecks:ll,discoverOrRefresh:yi,discoverOrRefreshAll:tr,discoverOrRefreshMany:cl,show:Cl,discover:Al,link:El,refreshAssociation:Ol,unlink:$l,merge:Il,getPrimaryPr:H,isPrTerminal:Xt,isMergeReady:li,deriveTaskStatus:Rn,upsertPr:Dt,normalizePr:_t,summarizeRequiredChecks:Ha,writePrStatusArtifact:Sn}};var wf={idle:0,ready:1,working:2,error:3};function Ye(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 bt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return Ye(t,n,r,i)}function rr(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=bt(e,s.id,t,n);wf[i]>wf[r]&&(r=i)}return r}function Ri(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&Ye(s.id,t,n)==="working"))}function Rt(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=bt(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:rr(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function jl(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=Rt([e],t.getSnapshots(),l),d=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:e.id,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw kf(e.id);let u=a-r();if(u<=0)throw pR(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(kf(e.id))},T=setTimeout(m,u);i=m,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var pR=(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}}),kf=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as gR}from"node:net";import{createHash as fR}from"node:crypto";import{tmpdir as mR}from"node:os";import Tf from"node:path";var Pt=10,hR=new Set([6,7,8,9,Pt]);function en(e){return e!==void 0&&hR.has(e)}function Fe(e){let t=fR("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:Tf.join(mR(),`craig-${t}.sock`),pidPath:Tf.join(e.runtimeDir,"pty-daemon.pid")}}async function bf(e){let t=null;try{let n=await yR(Fe(e.paths).socketPath);return t=new Ul(n,e),await t.ready(),t}catch{return t?.close(),null}}var Ul=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!==Pt)throw new Error("Craig PTY daemon protocol mismatch.");await this.send({type:"setActivityEnabled",enabled:!0});let n=this.revision,r=await this.send({type:"getActivitySnapshots"});this.replaceSnapshots(r.activities??[],n)}getSnapshots(){return[...this.snapshots.values()]}close(){this.closed||(this.closed=!0,this.socket.end(),this.rejectAll(new Error("Craig PTY daemon activity connection closed.")))}async send(t){if(this.closed||this.socket.destroyed)throw new Error("Craig PTY daemon activity connection is closed.");let n=this.nextRequestId++,r=new Promise((i,o)=>{this.pending.set(n,{resolve:i,reject:o})});this.socket.write(`${JSON.stringify({...t,id:n})}
70
+ `)},Jb=async e=>(await G("git",["ls-files","--others","--exclude-standard"],{cwd:e})).stdout.split(`
71
+ `).map(n=>n.trim()).filter(n=>n.length>0);import{spawn as Xb}from"node:child_process";import{access as Qb}from"node:fs/promises";var hl=async(e,t)=>{let n=await x(e,t),r=Yn(e,n);if(!r)throw new Error(`Task ${n.id} does not have a Craig-managed log path.`);try{await Qb(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},gl=async e=>{await new Promise((t,n)=>{let r=!1,s=Xb("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 Zb}from"node:fs/promises";import eR from"node:path";var yl=async(e,t)=>{let n=await x(e,t);if(await we(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 fi(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 H(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 Q("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 H(e,n.id,f=>({...f,status:"review",checks:{...f.checks,results:i,status:"failed",lastRunAt:u},lastFailureReason:p}));return await lf(e,h),{kind:"runChecks",taskId:n.id,status:"failed",commands:s}}}let o=await H(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 lf(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},lf=async(e,t)=>{let n=Pn(e,t.artifacts.checkSummaryPath);n&&(await Zb(eR.dirname(n),{recursive:!0}),await U(n,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))};var wl=async(e,t)=>{let n=await x(e,t);await we(n);let r=await fi(n.worktreePath);if(n.status==="running"&&r&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot commit from status "${n.status}".`);if(!r)throw new Error(`Task ${n.id} has no uncommitted diff to commit.`);let s=n.title.trim();await Bp(n.worktreePath),await Wp(n.worktreePath,s);let i=await Vp(n.worktreePath),o=new Date().toISOString(),a=await H(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 tR}from"node:fs/promises";var kl=async(e,t)=>{let n=await x(e,t),r=await nR(n.worktreePath);return H(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},nR=async e=>{try{return await tR(e),!0}catch{return!1}};var Tl=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await mi(e.repoRoot,t.worktreePath),s=new Date().toISOString()}catch(i){r.push(i instanceof Error?i.message:"Failed to remove worktree.")}await H(e,t.id,i=>({...i,cleanup:{...i.cleanup,worktreeRemovedAt:s??i.cleanup.worktreeRemovedAt,preservedWorktree:n.preserveWorktree,warning:r.length>0?r.join(" "):null}}))};var bl=async(e,t,n)=>{let r=await xe(e,n),s=await H(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}},Rl=async(e,t)=>{let n=await x(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>xe(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};import{access as rR,readFile as cf,rm as sR,writeFile as df}from"node:fs/promises";import Ri from"node:path";var pf=["AGENTS","md"].join("."),Pl=async(e,t,n)=>tt(e,t,async()=>{let r=await x(e,t);iR(r);let s=r.repoTargets?.find(f=>f.repoId===n);if(s)return uf(r.id,s.repoId,s.branch,s.worktreePath,"unchanged");let[i,o]=await Promise.all([xe(e,n),ve(e).then(f=>f.find(m=>m.id===r.workspaceId)??null)]);if(!o||o.kind!=="project"||o.status!=="active"||!o.discoveredRepoIds?.includes(i.id))throw new g("TASK_CONTEXT_CONFLICT",`Repo ${i.id} is not a discovered repository in project workspace ${r.workspaceId}.`,{details:{taskId:r.id,repoId:i.id,workspaceId:r.workspaceId}});let a=r.bundlePath??r.worktreePath,l=Ri.join(a,oR(i.name,r)),c=Ri.join(a,"manifest.json"),u=Ri.join(a,pf),[d,p,h]=await Promise.all([cf(c,"utf8"),cf(u,"utf8"),qr(i.rootPath,r.branch)]);try{let f=await rl(e,i,r.branch,l),m={...r,linkedRepoIds:i.id===r.repoId||r.linkedRepoIds.includes(i.id)?r.linkedRepoIds:[...r.linkedRepoIds,i.id],repoTargets:[...r.repoTargets??[],f]},y=await Promise.all((m.repoTargets??[]).map(T=>xe(e,T.repoId)));return await sl({taskId:r.id,workspaceId:r.workspaceId,prompt:aR(d)??r.title,repos:y,repoTargets:m.repoTargets??[],bundlePath:a}),await nt(e,m),uf(r.id,i.id,f.branch,f.worktreePath,"added")}catch(f){let m=await lR({repoRoot:i.rootPath,branch:r.branch,worktreePath:l,branchAlreadyExisted:h,manifestPath:c,manifestBackup:d,guidePath:u,guideBackup:p});throw m.length>0?new g("PARTIAL_RESULT",`Failed to attach repo ${i.id} to task ${r.id}, and rollback was incomplete.`,{retryable:!0,details:{taskId:r.id,repoId:i.id,rollbackFailures:m.map(y=>y instanceof Error?y.message:String(y))},cause:f}):f}}),iR=e=>{if(e.type!=="project"||!e.bundlePath)throw new g("TASK_CONTEXT_CONFLICT",`Task ${e.id} is not a project task and cannot accept repository targets.`,{details:{taskId:e.id,taskType:e.type}})},oR=(e,t)=>{let n=new Set(["manifest.json",pf,...(t.repoTargets??[]).map(o=>Ri.basename(o.worktreePath))]),r=n.has(e)?`${e}-repo`:e,s=r,i=2;for(;n.has(s);)s=`${r}-${i}`,i+=1;return s},aR=e=>{try{let t=JSON.parse(e);return typeof t.prompt=="string"?t.prompt:null}catch{return null}},lR=async e=>{let t=[];return await df(e.manifestPath,e.manifestBackup,"utf8").catch(r=>t.push(r)),await df(e.guidePath,e.guideBackup,"utf8").catch(r=>t.push(r)),await rR(e.worktreePath).then(()=>!0).catch(()=>!1)&&await mi(e.repoRoot,e.worktreePath).catch(async r=>{t.push(r),await sR(e.worktreePath,{recursive:!0,force:!0}).catch(s=>t.push(s))}),e.branchAlreadyExisted||await qr(e.repoRoot,e.branch).catch(s=>(t.push(s),!1))&&await Gp(e.repoRoot,e.branch).catch(s=>t.push(s)),t},uf=(e,t,n,r,s)=>({kind:"addTaskRepoTarget",disposition:s,taskId:e,repoId:t,branch:n,worktreePath:r});import{spawn as cR}from"node:child_process";var Sl=async(e,t)=>{let n=await x(e,t);await we(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 dR(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},dR=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=cR(s,i,{cwd:t,stdio:"inherit"});o.on("error",r),o.on("exit",a=>{if(a===0){n();return}r(new Error(`${e.join(" ")} failed with exit code ${a??"unknown"}.`))})})};import{realpath as mf}from"node:fs/promises";import es from"node:path";async function vl(e,t){if(t.explicitTaskId!==void 0){let l=await ff(e,t.explicitTaskId,"explicit");return Il(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await ff(e,t.environmentTaskId,"environment");return Il(l,"environment",t.environmentAgentTabId)}let n=await mf(t.cwd).catch(()=>es.resolve(t.cwd)),r=await Br(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await pR(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 Il(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 ff(e,t,n){try{return await x(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 Il(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 uR(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function pR(e,t){return(await Promise.all(uR(e).map(r=>mf(r).catch(()=>es.resolve(r))))).some(r=>fR(r,t))}function fR(e,t){let n=es.relative(es.resolve(e),t);return n===""||!n.startsWith("..")&&!es.isAbsolute(n)}var Cl=async(e,t,n)=>{let r=n.trim();if(r.length===0)throw new Error("Task title cannot be empty.");let s="",i=await H(e,t,o=>(s=o.title,{...o,title:r,slug:Wr(r)}));return{kind:"renameTask",taskId:i.id,previousTitle:s,title:i.title,slug:i.slug}};var Al=async(e,t,n="merge",r)=>{let s=await x(e,t),i=r??Y(s)?.number;if(!i)throw new Error(`Task ${s.id} has no pull request to merge.`);await tf(s.worktreePath,i,n)};var ts={readTask:x,writeTask:nt,withTaskLock:tt,ensureGhAuthenticated:Ft,fetchPrView:Xn,discoverPrView:nf,getGitHubRepositoryLocator:yi,writePrStatusArtifact:Sn};async function Ol(e,t,n,r=ts){let s=await r.readTask(e,t),i=await hR(s,n,r);return Zt(s,i,"showTaskPr","shown",[])}async function $l(e,t,n,r=ts){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await xl(s,n,null,r);await Ll(i,r);let o=await Si(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return Zt(s,i,"discoverTaskPr","not_found",[]);Ml(o,i);let a=Ii(s,i,o.number),l=await jl(e,s,i,o,r);return Zt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function Nl(e,t,n,r,s=ts){let i=Fl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await xl(o,r,i.repository,s);gf(i.repository,a),await Ll(a,s);let l=await Si(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));gR(l,i),Ml(l,a);let c=Ii(o,a,l.number),u=ql(o,a),d=u&&!Hn(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 jl(e,o,a,l,s);return Zt(p,a,"linkTaskPr",c?"unchanged":"linked",d)})}async function mR(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw rr(e,t);let o=e.prs.find(a=>a.number===n.number)??Y(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await Pi(o,e.worktreePath,e.repoId,r),projectTarget:null}}if(t){let o=e.repoTargets?.find(c=>c.repoId===t);if(!o)throw rr(e,t);let a=hf(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&Tt({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await Pi(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&&Tt({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&Tt({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 Dl(e,t,n,r=ts){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await xl(s,n,null,r),o=ql(s,i);if(!o?.number)return Zt(s,i,"refreshTaskPr","not_found",[]);await Ll(i,r);let a=await Si(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));Ml(a,i);let l=await jl(e,s,i,a,r);return Zt(l,i,"refreshTaskPr","synced",[])})}async function _l(e,t,n,r,s=ts){let i=Fl(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await mR(o,r,i,s);if(gf(i.repository,a),!Ii(o,a,i.number))return Zt(o,a,"unlinkTaskPr","unchanged",[]);let c=yR(o,a,i.number),u=await wf(e,c,s);return Zt(u,a,"unlinkTaskPr","unlinked",[])})}function Fl(e){let t=e.trim(),n=Qt(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 xl(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw rr(e,t);return El(e.repoId,e.branch,e.worktreePath,null,r)}let s=e.repoTargets??[];if(t){let o=s.find(a=>a.repoId===t);if(!o)throw rr(e,t);return El(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 El(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&&Tt(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 hR(e,t,n){if(e.type==="repo"){if(t&&t!==e.repoId)throw rr(e,t);let s=Y(e);return{repoId:e.repoId,branch:e.branch,worktreePath:e.worktreePath,repository:await Pi(s,e.worktreePath,e.repoId,n),projectTarget:null}}if(!t)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for pull request commands.`,{details:{taskId:e.id,repoIds:(e.repoTargets??[]).map(s=>s.repoId)}});let r=e.repoTargets?.find(s=>s.repoId===t);if(!r)throw rr(e,t);return{repoId:t,branch:r.branch,worktreePath:r.worktreePath,repository:await Pi(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function Pi(e,t,n,r){let s=hf(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function hf(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Qt(e.url):null}async function El(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 Ll(e,t){await Si("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function Si(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 gf(e,t){if(e&&!Tt(e,t.repository))throw yf(e,t)}function gR(e,t){let n=Qt(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&&!Tt(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=Qt(e.url);if(!n||!Tt(n,t.repository))throw yf(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 yf(e,t){return new g("PR_REPOSITORY_MISMATCH",`Pull request repository ${e?`${e.owner}/${e.name}`:"is invalid"} does not match task repo ${t.repository.owner}/${t.repository.name}.`,{details:{repoId:t.repoId,expectedOwner:t.repository.owner,expectedRepo:t.repository.name,actualOwner:e?.owner??null,actualRepo:e?.name??null}})}function rr(e,t){return new g("TASK_CONTEXT_CONFLICT",`Repo ${t} is not a target of task ${e.id}.`,{details:{taskId:e.id,repoId:t}})}function Tt(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function jl(e,t,n,r,s){let i=Ii(t,n,r.number),o=_t(r,i,n.repository),a=Dt(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:bf(o)}:l)}),wf(e,a,s)}function yR(e,t,n){let r=e.prs.filter(i=>!Tf(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=kf(r.filter(o=>o.owner&&o.repo&&Tt({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?bf(i):kR(t.repository)}:o)}}return s}async function wf(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?ki(t):Rn(t.prs),s={...t,status:r};return Zn(e,s,n)}function Ii(e,t,n){return Ul(e,t).find(r=>Tf(r,t,n))??null}function ql(e,t){if(!t.projectTarget)return Y(e);let n=Ul(e,t);return kf(n)}function kf(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function Ul(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&Tt({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?wR(r.pullRequest,t.repository):null;return s&&!n.some(i=>Hn(i,s))?[...n,s]:n}function Tf(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||Tt({owner:e.owner,name:e.repo},t.repository)}function Zt(e,t,n,r,s){let i=Ul(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:ql(e,t),warnings:s}}function bf(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 wR(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 kR(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:Br,getTask:x,provisionTask:Jn,provisionProjectTask:Kr,createTask:al,showTask:fl,showTaskDiff:ml,prepareTaskLogs:hl,streamTaskLogs:gl,runChecks:yl,commitTask:wl,closeTask:kl,cleanupTask:Tl,addTaskLink:bl,addTaskRepoTarget:Pl,listTaskLinks:Rl,sortTasksForDisplay:tl,resolveSelectedTaskId:nl,allocateTaskId:el,allocateTaskIdForRepo:zn,allocateProjectTaskId:Ur,createDefaultTaskPtyTabs:Gr,assertTaskWorktreeExists:we,resolveTaskLogPath:Yn,buildTaskInspection:jr,resolveArtifactPath:Pn,openTask:Sl,markRunnerFailed:ol,recordStartupFailure:Hr,markTaskStarted:Yr,renameTask:Cl,resolveContext:vl,prs:{refresh:Zr,refreshChecks:ul,discoverOrRefresh:bi,discoverOrRefreshAll:nr,discoverOrRefreshMany:pl,show:Ol,discover:$l,link:Nl,refreshAssociation:Dl,unlink:_l,merge:Al,getPrimaryPr:Y,isPrTerminal:Xt,isMergeReady:pi,deriveTaskStatus:Rn,upsertPr:Dt,normalizePr:_t,summarizeRequiredChecks:Ja,writePrStatusArtifact:Sn}};var Rf={idle:0,ready:1,working:2,error:3};function ze(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 bt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return ze(t,n,r,i)}function sr(e,t,n){let r="idle";for(let s of e.ptyTabs){if(s.kind!=="agent")continue;let i=bt(e,s.id,t,n);Rf[i]>Rf[r]&&(r=i)}return r}function vi(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&ze(s.id,t,n)==="working"))}function Rt(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=bt(i,o.id,t,n);return{taskId:i.id,tabId:o.id,title:o.title,runner:o.runner??i.runner,state:l,sessionState:a?.sessionState??null,lastActivityAt:a?.lastActivityAt??null,exitCode:a?.exitCode??null,error:a?.error??(l==="error"?i.lastFailureReason??null:null)}})),s=e.map(i=>({taskId:i.id,state:sr(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function Bl(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=Rt([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 Pf(e.id);let d=a-r();if(d<=0)throw TR(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(Pf(e.id))},T=setTimeout(m,d);i=m,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var TR=(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}}),Pf=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as SR}from"node:net";import{createHash as bR}from"node:crypto";import{tmpdir as RR}from"node:os";import Sf from"node:path";var Pt=10,PR=new Set([6,7,8,9,Pt]);function en(e){return e!==void 0&&PR.has(e)}function Le(e){let t=bR("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:Sf.join(RR(),`craig-${t}.sock`),pidPath:Sf.join(e.runtimeDir,"pty-daemon.pid")}}async function If(e){let t=null;try{let n=await IR(Le(e.paths).socketPath);return t=new Vl(n,e),await t.ready(),t}catch{return t?.close(),null}}var Vl=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!==Pt)throw new Error("Craig PTY daemon protocol mismatch.");await this.send({type:"setActivityEnabled",enabled:!0});let n=this.revision,r=await this.send({type:"getActivitySnapshots"});this.replaceSnapshots(r.activities??[],n)}getSnapshots(){return[...this.snapshots.values()]}close(){this.closed||(this.closed=!0,this.socket.end(),this.rejectAll(new Error("Craig PTY daemon activity connection closed.")))}async send(t){if(this.closed||this.socket.destroyed)throw new Error("Craig PTY daemon activity connection is closed.");let n=this.nextRequestId++,r=new Promise((i,o)=>{this.pending.set(n,{resolve:i,reject:o})});this.socket.write(`${JSON.stringify({...t,id:n})}
72
72
  `);let s=await r;if(!s.ok)throw new Error(s.error);return s}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
73
73
  `);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
74
- `)}}handleMessage(t){if(t.trim().length===0)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n){let r=this.pending.get(n.id);if(!r)return;this.pending.delete(n.id),r.resolve(n);return}n.type==="activity"?(this.recordSnapshot(n.snapshot),this.options.onActivity?.(n.snapshot)):n.type==="activityRemoved"&&(this.removeSnapshot(n.tabId),this.options.onActivityRemoved?.(n.tabId))}replaceSnapshots(t,n){let r=new Map;for(let[s,i]of this.revisionByTabId)i>n&&r.set(s,this.snapshots.get(s)??null);this.snapshots.clear();for(let s of t)this.snapshots.set(s.tabId,s);for(let[s,i]of r)i?this.snapshots.set(s,i):this.snapshots.delete(s)}recordSnapshot(t){this.revision+=1,this.revisionByTabId.set(t.tabId,this.revision),this.snapshots.set(t.tabId,t)}removeSnapshot(t){this.revision+=1,this.revisionByTabId.set(t,this.revision),this.snapshots.delete(t)}handleClose(){if(this.closed)return;this.closed=!0;let t=new Error("Craig PTY daemon connection closed.");this.rejectAll(t);for(let n of this.snapshots.values()){if(n.sessionState!=="running")continue;let r={...n,sessionState:"failed",lastActivityAt:Date.now(),error:t.message};this.recordSnapshot(r),this.options.onActivity?.(r)}this.options.onDaemonClose?.()}rejectAll(t){for(let n of this.pending.values())n.reject(t);this.pending.clear()}};function yR(e){return new Promise((t,n)=>{let r=gR(e);r.once("connect",()=>t(r)),r.once("error",n)})}var Wl={openObserver:Pf,listTasks:e=>P.listTasks(e),getTask:(e,t)=>P.getTask(e,t),now:Date.now};async function wR(e,t,n=Wl){let r=await Rf(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...Rt(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function kR(e,t,n=Wl){let r=await Rf(e,t.taskId,n),s=await n.openObserver(e);try{let i=Rt(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 TR(e,t,n,r=Wl){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await jl(s,i,{...n,now:r.now})}finally{i.close()}}async function Rf(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function Pf(e){return Bl.open(e)}async function bR(e){return Pf(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 bf({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()}},Ft={listAgents:wR,showAgentStatus:kR,waitForTask:TR,openObserver:bR};import{randomUUID as BR}from"node:crypto";import{mkdir as Vf,open as ec,readdir as tc,readFile as is,rm as WR,stat as VR}from"node:fs/promises";import Ci from"node:path";import{createHash as vR}from"node:crypto";import{mkdir as ts,readdir as Gl,readFile as ns,writeFile as CR}from"node:fs/promises";import ze from"node:path";import{mkdir as Sf,readFile as RR,rm as Vl,stat as PR,writeFile as SR}from"node:fs/promises";import Kl from"node:path";async function sr(e,t){let n=Kl.join(e.runtimeDir,"fury-store.lock");await Sf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Sf(n);try{await SR(Kl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await Vl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!If(s,"EEXIST"))throw s;let i=await RR(Kl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await PR(n).catch(()=>null);if(typeof i?.pid=="number"&&!IR(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await Vl(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 Vl(n,{recursive:!0,force:!0})}}function IR(e){try{return process.kill(e,0),!0}catch(t){return If(t,"EPERM")}}var If=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var ke=e=>({root:ze.join(e.craigDir,"fury"),definitions:ze.join(e.craigDir,"fury","definitions"),plans:ze.join(e.craigDir,"fury","plans"),approvals:ze.join(e.craigDir,"fury","approvals"),runs:ze.join(e.craigDir,"fury","runs"),reviews:ze.join(e.craigDir,"fury","reviews")});function Hl(e){return vR("sha256").update(JSON.stringify(e)).digest("hex")}async function Cf(e,t,n){let r=ke(e);await ts(r.definitions,{recursive:!0});let s=ze.join(r.definitions,`${t}.yaml`);await CR(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!tn(i,"EEXIST"))throw i})}async function Af(e,t){return sr(e,async()=>{let n=await Ef(e),r=n.find(o=>o.planHash===t.planHash);if(r)return r;let s=n.filter(o=>o.rootTaskId===t.rootTaskId&&o.sourceFile===t.sourceFile).at(-1),i=s&&Date.parse(t.createdAt)<=Date.parse(s.createdAt)?{...t,createdAt:new Date(Date.parse(s.createdAt)+1).toISOString()}:t;return await ts(ke(e).plans,{recursive:!0}),await U(Mf(e,i.id),i),i})}async function Pi(e,t){Ii(t,"plan");try{return AR(JSON.parse(await ns(Mf(e,t),"utf8")),t)}catch(n){throw tn(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function Ef(e){let t=ke(e).plans,n=await Gl(t).catch(s=>tn(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 Ef(e),n=await Promise.all(t.map(s=>Jl(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 $f(e,t){return sr(e,async()=>{let n=await Jl(e,t.planId);if(n){if(n.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after approval.`,{});return{approval:n,created:!1}}return await ts(ke(e).approvals,{recursive:!0}),await U(jf(e,t.planId),t),{approval:t,created:!0}})}async function Nf(e,t){Ii(t,"plan");let n=await Jl(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function Df(e,t){return sr(e,async()=>{let r=(await _f(e)).find(s=>s.planId===t.planId);if(r){if(r.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after its run was created.`,{});return{run:r,created:!1}}return await ts(ke(e).runs,{recursive:!0}),await U(Yl(e,t.id),t),{run:t,created:!0}})}async function te(e,t){Ii(t,"run");try{return Ff(JSON.parse(await ns(Yl(e,t),"utf8")),t)}catch(n){throw tn(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function Si(e){return _f(e)}async function _f(e){let t=ke(e).runs,n=await Gl(t).catch(s=>tn(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 ns(ze.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function ve(e,t,n){return sr(e,async()=>{let r=await te(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury mutation cannot change its id.",{});return await U(Yl(e,t),s),s})}async function xf(e,t){await ts(ke(e).reviews,{recursive:!0}),await U(zl(e,t.id),t)}async function ir(e,t,n){return sr(e,async()=>{let r=await rt(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await U(zl(e,t),s),s})}async function rt(e,t){Ii(t,"review");try{return ER(JSON.parse(await ns(zl(e,t),"utf8")),t)}catch(n){throw tn(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function rs(e){let t=ke(e).reviews,n=await Gl(t).catch(r=>tn(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>rt(e,r.slice(0,-5))))}function Ff(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!Ne(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))||!Ne(e.inputs)||!Lf(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!OR(e.stepRuns,e.order)||!ss(e.actor)||e.cleanupPending!==void 0&&typeof e.cleanupPending!="boolean"||e.cleanupError!==void 0&&e.cleanupError!==null&&typeof e.cleanupError!="string"||!Je(e.createdAt)||!Je(e.updatedAt)||!Je(e.stateChangedAt)||!Je(e.deadlineAt)||e.completedAt!==null&&!Je(e.completedAt))throw new g("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function AR(e,t){if(!Ne(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||!Ne(e.inputs)||!Lf(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||!Array.isArray(e.waves)||e.waves.some(r=>!Array.isArray(r)||r.some(s=>typeof s!="string"))||!Array.isArray(e.steps)||e.steps.length!==e.order.length||!ss(e.createdBy)||!Je(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,Hl(n)!==e.planHash)throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function ER(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!Ne(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&&(!Ne(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||!Je(e.requestedAt)||!Je(e.deadlineAt)||!Je(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!vf(r))||e.lastDecision!==null&&!vf(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function OR(e,t){return Ne(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&$R(e[n],n))}function $R(e,t){return!Ne(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")||!Ne(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||Je(n))&&(e.completedBy===null||ss(e.completedBy))}function vf(e){return Ne(e)&&Number.isInteger(e.sequence)&&Number.isInteger(e.round)&&["approve","reject","request_changes","resubmit"].includes(String(e.action))&&(e.message===null||typeof e.message=="string")&&ss(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Je(e.occurredAt)}function Lf(e){return Ne(e)&&Number.isInteger(e.maxConcurrency)&&Number(e.maxConcurrency)>0&&Number.isInteger(e.maxTasks)&&Number(e.maxTasks)>0&&Number.isInteger(e.timeoutMs)&&Number(e.timeoutMs)>0}function ss(e){return Ne(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 Yl=(e,t)=>ze.join(ke(e).runs,`${t}.json`),Mf=(e,t)=>ze.join(ke(e).plans,`${t}.json`),jf=(e,t)=>ze.join(ke(e).approvals,`${t}.json`),zl=(e,t)=>ze.join(ke(e).reviews,`${t}.json`),Ii=(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 Jl(e,t){try{let n=JSON.parse(await ns(jf(e,t),"utf8"));if(!Ne(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!ss(n.approvedBy)||!Ne(n.approvedBy)||n.approvedBy.type!=="human"||!Je(n.approvedAt))throw new g("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(tn(n,"ENOENT"))return null;throw n}}var Ne=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Je=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),tn=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as qf,readFile as NR,rm as vi,stat as DR,writeFile as _R}from"node:fs/promises";import Xl from"node:path";var xR=20,FR=3e4,LR=5e3;async function Uf(e,t){let n=Xl.join(e.runtimeDir,"event-journal.lock");await qf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await qf(n);try{await _R(Xl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await vi(n,{recursive:!0,force:!0}),s}break}catch(s){if(!qR(s))throw s;if(await MR(n))continue;if(Date.now()-r>=FR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await UR(xR)}try{return await t()}finally{await vi(n,{recursive:!0,force:!0})}}async function MR(e){let t=await NR(Xl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return jR(t.pid)?!1:(await vi(e,{recursive:!0,force:!0}),!0);let n=await DR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<LR?!1:(await vi(e,{recursive:!0,force:!0}),!0)}function jR(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var qR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",UR=e=>new Promise(t=>setTimeout(t,e));var KR=256*1024,GR=16,HR=64*1024;async function Le(e,t,n={}){let r=Zl(n.maxSegmentBytes??KR,"Event journal segment size"),s=Zl(n.maxSegments??GR,"Event journal retention"),i=Zl(n.maxRecordBytes??HR,"Event record size");return Uf(e,async()=>{await Vf(e.eventsDir,{recursive:!0}),await ZR(e);let o=await nc(e),a=t.id??BR(),l=o.events.find(y=>y.id===a);if(l)return l;let c=(o.events.at(-1)?.sequence??0)+1,d={schemaVersion:1,id:a,sequence:c,workspaceId:t.workspaceId??null,taskId:t.taskId??null,agentTabId:t.agentTabId??null,commandId:t.commandId??null,furyRunId:t.furyRunId??null,furyStepId:t.furyStepId??null,type:t.type,occurredAt:t.occurredAt??new Date().toISOString(),actor:t.actor,data:nP(t.data)},u=`${JSON.stringify(d)}
75
- `;if(Buffer.byteLength(u)>i)throw new g("CLI_USAGE",`Event record exceeds the ${i}-byte limit.`,{details:{eventType:t.type,maxRecordBytes:i}});let h=(await Ai(e)).at(-1),f=!h||await YR(h.path,u,r);if(f&&(h={name:Wf(c),path:Ci.join(e.eventsDir,Wf(c)),startSequence:c}),!h)throw new g("INTERNAL_ERROR","Failed to select an event journal segment.",{});let m=await ec(h.path,"a");try{await m.writeFile(u,"utf8"),await m.sync()}finally{await m.close()}return f&&await Gf(e.eventsDir),await zR(e,s),d})}async function In(e,t={}){let n=await nc(e),r=eP(n.events,t.after,n.earliestSequence,n.events.at(-1)?.sequence??null),s=t.typeGlob?tP(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 Kf(e){return(await nc(e)).events}async function nc(e){await Vf(e.eventsDir,{recursive:!0});let t=await Ai(e),n=[],r=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await is(i.path,"utf8"),a=s===t.length-1,l=o.split(`
74
+ `)}}handleMessage(t){if(t.trim().length===0)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n){let r=this.pending.get(n.id);if(!r)return;this.pending.delete(n.id),r.resolve(n);return}n.type==="activity"?(this.recordSnapshot(n.snapshot),this.options.onActivity?.(n.snapshot)):n.type==="activityRemoved"&&(this.removeSnapshot(n.tabId),this.options.onActivityRemoved?.(n.tabId))}replaceSnapshots(t,n){let r=new Map;for(let[s,i]of this.revisionByTabId)i>n&&r.set(s,this.snapshots.get(s)??null);this.snapshots.clear();for(let s of t)this.snapshots.set(s.tabId,s);for(let[s,i]of r)i?this.snapshots.set(s,i):this.snapshots.delete(s)}recordSnapshot(t){this.revision+=1,this.revisionByTabId.set(t.tabId,this.revision),this.snapshots.set(t.tabId,t)}removeSnapshot(t){this.revision+=1,this.revisionByTabId.set(t,this.revision),this.snapshots.delete(t)}handleClose(){if(this.closed)return;this.closed=!0;let t=new Error("Craig PTY daemon connection closed.");this.rejectAll(t);for(let n of this.snapshots.values()){if(n.sessionState!=="running")continue;let r={...n,sessionState:"failed",lastActivityAt:Date.now(),error:t.message};this.recordSnapshot(r),this.options.onActivity?.(r)}this.options.onDaemonClose?.()}rejectAll(t){for(let n of this.pending.values())n.reject(t);this.pending.clear()}};function IR(e){return new Promise((t,n)=>{let r=SR(e);r.once("connect",()=>t(r)),r.once("error",n)})}var Gl={openObserver:Cf,listTasks:e=>S.listTasks(e),getTask:(e,t)=>S.getTask(e,t),now:Date.now};async function vR(e,t,n=Gl){let r=await vf(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...Rt(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function CR(e,t,n=Gl){let r=await vf(e,t.taskId,n),s=await n.openObserver(e);try{let i=Rt(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 AR(e,t,n,r=Gl){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await Bl(s,i,{...n,now:r.now})}finally{i.close()}}async function vf(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function Cf(e){return Kl.open(e)}async function ER(e){return Cf(e)}var Kl=class e{listeners=new Set;snapshots=new Map;client=null;reconnectTimer=null;reconnectDelayMs=250;closed=!1;paths;constructor(t){this.paths=t}static async open(t){let n=new e(t);return await n.connect(),n}get daemonAvailable(){return this.client!==null}getSnapshots(){return[...this.snapshots.values()]}subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}close(){this.closed=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.client?.close(),this.client=null}async connect(){if(this.closed)return;let t=await If({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()}},xt={listAgents:vR,showAgentStatus:CR,waitForTask:AR,openObserver:ER};import{randomUUID as JR}from"node:crypto";import{mkdir as Hf,open as rc,readdir as sc,readFile as ls,rm as XR,stat as QR}from"node:fs/promises";import Oi from"node:path";import{createHash as _R}from"node:crypto";import{mkdir as ns,readdir as zl,readFile as rs,writeFile as FR}from"node:fs/promises";import Je from"node:path";import{mkdir as Af,readFile as OR,rm as Hl,stat as $R,writeFile as NR}from"node:fs/promises";import Yl from"node:path";async function ir(e,t){let n=Yl.join(e.runtimeDir,"fury-store.lock");await Af(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Af(n);try{await NR(Yl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await Hl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!Ef(s,"EEXIST"))throw s;let i=await OR(Yl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await $R(n).catch(()=>null);if(typeof i?.pid=="number"&&!DR(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await Hl(n,{recursive:!0,force:!0});continue}if(Date.now()-r>3e4)throw new g("OPERATION_TIMEOUT","Timed out waiting for the fury store lock.",{retryable:!0});await new Promise(a=>setTimeout(a,20))}try{return await t()}finally{await Hl(n,{recursive:!0,force:!0})}}function DR(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 ke=e=>({root:Je.join(e.craigDir,"fury"),definitions:Je.join(e.craigDir,"fury","definitions"),plans:Je.join(e.craigDir,"fury","plans"),approvals:Je.join(e.craigDir,"fury","approvals"),runs:Je.join(e.craigDir,"fury","runs"),reviews:Je.join(e.craigDir,"fury","reviews")});function Jl(e){return _R("sha256").update(JSON.stringify(e)).digest("hex")}async function $f(e,t,n){let r=ke(e);await ns(r.definitions,{recursive:!0});let s=Je.join(r.definitions,`${t}.yaml`);await FR(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!tn(i,"EEXIST"))throw i})}async function Nf(e,t){return ir(e,async()=>{let n=await Df(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 ns(ke(e).plans,{recursive:!0}),await U(Uf(e,i.id),i),i})}async function ss(e,t){Ai(t,"plan");try{return xR(JSON.parse(await rs(Uf(e,t),"utf8")),t)}catch(n){throw tn(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function Df(e){let t=ke(e).plans,n=await zl(t).catch(s=>tn(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>ss(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function is(e){let t=await Df(e),n=await Promise.all(t.map(s=>Zl(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 _f(e,t){return ir(e,async()=>{if((await ss(e,t.planId)).planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed before approval.`,{});let r=await Zl(e,t.planId);if(r){if(r.planHash!==t.planHash)throw new g("FURY_STATE_CONFLICT",`Fury plan ${t.planId} changed after approval.`,{});return{approval:r,created:!1}}return await ns(ke(e).approvals,{recursive:!0}),await U(Bf(e,t.planId),t),{approval:t,created:!0}})}async function Ff(e,t){Ai(t,"plan");let n=await Zl(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function xf(e,t){return ir(e,async()=>{let r=(await Lf(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 ns(ke(e).runs,{recursive:!0}),await U(Xl(e,t.id),t),{run:t,created:!0}})}async function te(e,t){Ai(t,"run");try{return jf(JSON.parse(await rs(Xl(e,t),"utf8")),t)}catch(n){throw tn(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function Ci(e){return Lf(e)}async function Lf(e){let t=ke(e).runs,n=await zl(t).catch(s=>tn(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 jf(JSON.parse(await rs(Je.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ce(e,t,n){return ir(e,async()=>{let r=await te(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury mutation cannot change its id.",{});return await U(Xl(e,t),s),s})}async function Mf(e,t){await ns(ke(e).reviews,{recursive:!0}),await U(Ql(e,t.id),t)}async function or(e,t,n){return ir(e,async()=>{let r=await rt(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await U(Ql(e,t),s),s})}async function rt(e,t){Ai(t,"review");try{return LR(JSON.parse(await rs(Ql(e,t),"utf8")),t)}catch(n){throw tn(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function os(e){let t=ke(e).reviews,n=await zl(t).catch(r=>tn(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>rt(e,r.slice(0,-5))))}function jf(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!De(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))||!De(e.inputs)||!qf(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!MR(e.stepRuns,e.order)||!as(e.actor)||e.cleanupPending!==void 0&&typeof e.cleanupPending!="boolean"||e.cleanupError!==void 0&&e.cleanupError!==null&&typeof e.cleanupError!="string"||!Xe(e.createdAt)||!Xe(e.updatedAt)||!Xe(e.stateChangedAt)||!Xe(e.deadlineAt)||e.completedAt!==null&&!Xe(e.completedAt))throw new g("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function xR(e,t){if(!De(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||!De(e.inputs)||!qf(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||!as(e.createdBy)||!Xe(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,Jl(n)!==e.planHash)throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function LR(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!De(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&&(!De(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||!Xe(e.requestedAt)||!Xe(e.deadlineAt)||!Xe(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!Of(r))||e.lastDecision!==null&&!Of(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function MR(e,t){return De(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&jR(e[n],n))}function jR(e,t){return!De(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")||!De(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||Xe(n))&&(e.completedBy===null||as(e.completedBy))}function Of(e){return De(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")&&as(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Xe(e.occurredAt)}function qf(e){return De(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 as(e){return De(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 Xl=(e,t)=>Je.join(ke(e).runs,`${t}.json`),Uf=(e,t)=>Je.join(ke(e).plans,`${t}.json`),Bf=(e,t)=>Je.join(ke(e).approvals,`${t}.json`),Ql=(e,t)=>Je.join(ke(e).reviews,`${t}.json`),Ai=(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 Zl(e,t){try{let n=JSON.parse(await rs(Bf(e,t),"utf8"));if(!De(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!as(n.approvedBy)||!De(n.approvedBy)||n.approvedBy.type!=="human"||!Xe(n.approvedAt))throw new g("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(tn(n,"ENOENT"))return null;throw n}}var De=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Xe=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),tn=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as Wf,readFile as qR,rm as Ei,stat as UR,writeFile as BR}from"node:fs/promises";import ec from"node:path";var WR=20,VR=3e4,KR=5e3;async function Vf(e,t){let n=ec.join(e.runtimeDir,"event-journal.lock");await Wf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Wf(n);try{await BR(ec.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Ei(n,{recursive:!0,force:!0}),s}break}catch(s){if(!YR(s))throw s;if(await GR(n))continue;if(Date.now()-r>=VR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await zR(WR)}try{return await t()}finally{await Ei(n,{recursive:!0,force:!0})}}async function GR(e){let t=await qR(ec.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return HR(t.pid)?!1:(await Ei(e,{recursive:!0,force:!0}),!0);let n=await UR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<KR?!1:(await Ei(e,{recursive:!0,force:!0}),!0)}function HR(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var YR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",zR=e=>new Promise(t=>setTimeout(t,e));var ZR=256*1024,eP=16,tP=64*1024;async function Me(e,t,n={}){let r=nc(n.maxSegmentBytes??ZR,"Event journal segment size"),s=nc(n.maxSegments??eP,"Event journal retention"),i=nc(n.maxRecordBytes??tP,"Event record size");return Vf(e,async()=>{await Hf(e.eventsDir,{recursive:!0}),await aP(e);let o=await ic(e),a=t.id??JR(),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:dP(t.data)},d=`${JSON.stringify(u)}
75
+ `;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 $i(e)).at(-1),f=!h||await nP(h.path,d,r);if(f&&(h={name:Gf(c),path:Oi.join(e.eventsDir,Gf(c)),startSequence:c}),!h)throw new g("INTERNAL_ERROR","Failed to select an event journal segment.",{});let m=await rc(h.path,"a");try{await m.writeFile(d,"utf8"),await m.sync()}finally{await m.close()}return f&&await zf(e.eventsDir),await rP(e,s),u})}async function In(e,t={}){let n=await ic(e),r=lP(n.events,t.after,n.earliestSequence,n.events.at(-1)?.sequence??null),s=t.typeGlob?cP(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 Yf(e){return(await ic(e)).events}async function ic(e){await Hf(e.eventsDir,{recursive:!0});let t=await $i(e),n=[],r=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await ls(i.path,"utf8"),a=s===t.length-1,l=o.split(`
76
76
  `);if(o.endsWith(`
77
- `))l.pop();else{if(!a)throw nn(i.name,"segment has a truncated tail");l.pop()}for(let c=0;c<l.length;c+=1){let d=l[c];if(d.length===0)throw nn(i.name,`empty record at line ${c+1}`);let u;try{u=JSON.parse(d)}catch{throw nn(i.name,`invalid JSON at line ${c+1}`)}let p=rP(u,i.name,c+1);if(c===0&&p.sequence!==i.startSequence)throw nn(i.name,`first record sequence ${p.sequence} does not match segment name`);if(r.has(p.id))throw nn(i.name,`duplicate event id ${p.id}`);r.add(p.id);let h=n.at(-1);if(h&&p.sequence!==h.sequence+1)throw nn(i.name,`non-monotonic sequence ${p.sequence} after ${h.sequence}`);n.push(p)}}return{events:n,earliestSequence:n[0]?.sequence??null}}async function Ai(e){return(await tc(e.eventsDir).catch(n=>{if(rc(n))return[];throw n})).flatMap(n=>{let r=/^segment-(\d{16})\.jsonl$/.exec(n);return r?[{name:n,path:Ci.join(e.eventsDir,n),startSequence:Number(r[1])}]:[]}).sort((n,r)=>n.startSequence-r.startSequence)}async function YR(e,t,n){let r=await VR(e).catch(()=>null);return r!==null&&r.size>0&&r.size+Buffer.byteLength(t)>n}async function zR(e,t){let n=await Ai(e),r=Math.max(0,n.length-t),s=await XR(e),i=await JR(e);if(s===null||i===null)return;for(let a=0;a<r;a+=1)if(await QR(n[a].path,s,i)){r=a;break}let o=n.slice(0,r);for(let a of o)await WR(a.path,{force:!0});o.length>0&&await Gf(e.eventsDir)}async function JR(e){let t=ke(e).runs,n=await tc(t).catch(s=>{if(rc(s))return[];throw s}),r=new Set;for(let s of n.filter(i=>i.endsWith(".json")))try{let i=JSON.parse(await is(Ci.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 XR(e){let t=await tc(e.commandsDir).catch(r=>{if(rc(r))return[];throw r}),n=new Set;for(let r of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await is(Ci.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 QR(e,t,n){if(t.size===0&&n.size===0)return!1;let r=await is(e,"utf8");for(let s of r.split(`
78
- `))if(s)try{let i=JSON.parse(s);if(typeof i.commandId=="string"&&t.has(i.commandId)||typeof i.furyRunId=="string"&&n.has(i.furyRunId))return!0}catch{return!0}return!1}async function ZR(e){let t=(await Ai(e)).at(-1);if(!t)return;let n=await is(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await ec(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function eP(e,t,n,r){if(t===void 0)return 0;if(/^\d+$/.test(t)){let i=Number(t);if(!Number.isSafeInteger(i)||r===null&&i!==0||r!==null&&i>r)throw Ql(t);return Bf(t,i,n),i}let s=e.find(i=>i.id===t);if(!s)throw n!==null&&n>1?new g("EVENT_CURSOR_EXPIRED",`Event cursor ${t} has expired.`,{details:{cursor:t,earliestAvailableSequence:n,resumeAfter:n-1}}):Ql(t);return Bf(t,s.sequence,n),s.sequence}function Bf(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 tP(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 nP(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 rP(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw nn(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))||!or(i.workspaceId)||!or(i.taskId)||!or(i.agentTabId)||!or(i.commandId)||!or(i.furyRunId)||!or(i.furyStepId)||!sP(i.actor)||!("data"in i))throw nn(t,`record at line ${n} has an invalid schema`);return i}function sP(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 or=e=>e===null||typeof e=="string",Wf=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,nn=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),Ql=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),rc=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Zl(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 Gf(e){let t=await ec(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as zf,readdir as hP,readFile as Jf}from"node:fs/promises";import Xf from"node:path";import{mkdir as Hf,readFile as iP,rm as Ei,stat as oP,writeFile as aP}from"node:fs/promises";import sc from"node:path";var lP=20,cP=3e4,dP=5e3;async function ic(e,t){let n=sc.join(e.runtimeDir,"command-store.lock");await Hf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Hf(n);try{await aP(sc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Ei(n,{recursive:!0,force:!0}),s}break}catch(s){if(!fP(s))throw s;if(await uP(n))continue;if(Date.now()-r>=cP)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await mP(lP)}try{return await t()}finally{await Ei(n,{recursive:!0,force:!0})}}async function uP(e){let t=await iP(sc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return pP(t.pid)?!1:(await Ei(e,{recursive:!0,force:!0}),!0);let n=await oP(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<dP?!1:(await Ei(e,{recursive:!0,force:!0}),!0)}function pP(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 fP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",mP=e=>new Promise(t=>setTimeout(t,e));async function Ni(e,t){oc(t);try{let n=JSON.parse(await Jf(os(e,t),"utf8"));return Zf(n,os(e,t),t)}catch(n){throw kP(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?$i(t,os(e,t),n):n}}async function Me(e){await zf(e.commandsDir,{recursive:!0});let t=await hP(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=Xf.join(e.commandsDir,r);try{n.push(Zf(JSON.parse(await Jf(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:$i(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function Qf(e,t){return oc(t.id),ic(e,async()=>{await zf(e.commandsDir,{recursive:!0});let n=await Me(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!gP(r,t))throw new g("COMMAND_STATE_CONFLICT",`Idempotency key "${t.idempotencyKey}" is already used by command ${r.id}.`,{details:{commandId:r.id,idempotencyKey:t.idempotencyKey}});return{command:r,created:!1}}}return await U(os(e,t.id),t),{command:t,created:!0}})}async function as(e,t,n){return oc(t),ic(e,async()=>{let r=await Ni(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await U(os(e,t),s),s})}function gP(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 Zf(e,t,n){if(!Oi(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw $i("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||!Oi(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!wP(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||!ar(e.expiresAt)||!ar(e.createdAt)||!ar(e.updatedAt)||e.deliveryStartedAt!==null&&!ar(e.deliveryStartedAt)||e.deliveredAt!==null&&!ar(e.deliveredAt)||e.cancelledAt!==null&&!ar(e.cancelledAt)||e.cancelledBy!==null&&!Yf(e.cancelledBy)||!Yf(e.actor)||!yP(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 $i(r,t);return e}function Yf(e){return!Oi(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 yP(e){return e===null||Oi(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var os=(e,t)=>Xf.join(e.commandsDir,`${t}.json`),oc=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},ar=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),wP=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}),Oi=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),kP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",$i=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function em(e,t=new Date){return Di(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function tm(e,t=new Date){return e.state==="delivered"?e:(Di(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function nm(e,t,n=new Date){return e.state==="failed"?e:(Di(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function rm(e,t,n=new Date){return e.state==="cancelled"?e:(Di(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function Di(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 TP}from"node:crypto";var ac=32*1024,sm=1440*60*1e3,lc=256,bP=["delivered","failed","cancelled"],cc={type:"system",component:"orchestration-supervisor"};async function RP(e,t){if(OP(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>sm)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:sm}});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)>lc)throw new g("CLI_USAGE",`Idempotency key exceeds ${lc} characters.`,{details:{maxIdempotencyKeyLength:lc}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${TP()}`,idempotencyKey:t.idempotencyKey?.trim()||null,taskId:t.taskId,agentTabId:t.agentTabId,prompt:t.prompt,delivery:t.delivery,state:"queued",attempts:0,timeoutMs:t.timeoutMs,expiresAt:new Date(n.getTime()+t.timeoutMs).toISOString(),lastError:null,actor:t.actor,createdAt:n.toISOString(),updatedAt:n.toISOString(),deliveryStartedAt:null,deliveredAt:null,cancelledAt:null,cancelledBy:null},s=await Qf(e,r);if(s.created)try{await vn(e,s.command,"command.queued")}catch(i){throw im(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function PP(e,t){return{kind:"showPromptCommand",command:await Ni(e,t)}}async function SP(e,t){let n=await Me(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function IP(e,t,n){let r=!1,s=await as(e,t,i=>{if(i.state==="cancelled")return i;let o=rm(i,n??i.actor);return r=!0,o});if(r)try{await vn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw im(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function vP(e,t){let n=await as(e,t,r=>em(r));return await vn(e,n,"command.delivering",cc),n}async function CP(e,t){let n=await as(e,t,r=>tm(r));return await vn(e,n,"command.delivered",cc),n}async function AP(e,t,n){let r=await as(e,t,s=>nm(s,n));return await vn(e,r,"command.failed",cc),r}async function EP(e,t,n){let r=[...n.states??bP],s=Date.now()+n.timeoutMs;for(;;){let i=await Ni(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 $P(Math.min(n.pollIntervalMs??100,o),n.signal)}}function OP(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>ac)throw new g("CLI_USAGE",`Prompt exceeds the ${ac}-byte limit.`,{details:{maxPromptBytes:ac,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 Le(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 $P(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 im=(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:RP,show:PP,list:SP,cancel:IP,wait:EP,beginDelivery:vP,completeDelivery:CP,fail:AP};import{randomUUID as am,timingSafeEqual as NP}from"node:crypto";import{mkdir as DP,readFile as _P,readdir as xP}from"node:fs/promises";import lm from"node:path";var FP=10080*60*1e3,LP={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},MP=["task.create-child","task.children","task.cancel-tree"],jP=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function st(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 DP(fc(e),{recursive:!0,mode:448}),await G(e,t.id,async o=>{let a=o.ptyTabs.find(u=>u.id===s.id&&u.kind==="agent");if(!a)throw new g("CAPABILITY_DENIED",`Agent tab ${s.id} no longer exists.`,{});let l=a.capabilityId??`capability_${am()}`,c=await _i(e,l);if(c&&(c.taskId!==o.id||c.agentTabId!==a.id))throw new g("CAPABILITY_DENIED",`Capability ${l} is bound to another agent.`,{details:{capabilityId:l,taskId:o.id,agentTabId:a.id}});return i=(c??await qP(e,l,o.id,a.id,n)).token,a.capabilityId?o:{...o,ptyTabs:o.ptyTabs.map(u=>u.id===a.id?{...u,capabilityId:l}:u)}}),!i)throw new g("INTERNAL_ERROR",`Failed to issue a capability for ${s.id}.`,{});return{CRAIG_AGENT_CAPABILITY:i}}async function qP(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${am()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...MP],targetPolicy:"children-only",limits:{...LP},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+FP).toISOString(),revokedAt:null,revokedBy:null};return await U(mc(e,o.id),o,{mode:384}),o}async function Xe(e,t,n,r){let s=await BP(e,t);return s.revokedAt&&Cn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&Cn(s.id,"expired"),!jP.has(n)&&!s.allowedCommandFamilies.includes(n)&&Cn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await UP(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 UP(e,t,n){if(t===n)return!0;let r=(await P.listTasks(e,{includeClosed:!0})).tasks,s=new Map(r.map(a=>[a.id,a])),i=s.get(n),o=new Set;for(;i?.parentTaskId&&!o.has(i.id);){if(i.parentTaskId===t)return!0;o.add(i.id),i=s.get(i.parentTaskId)}return!1}async function cm(e,t,n){let r=await _i(e,t);r&&(r.revokedAt||await U(mc(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function pc(e,t,n){let r=await xP(fc(e)).catch(i=>dm(i)?[]:Promise.reject(i)),s=[];for(let i of r){let o=/^(capability_[A-Za-z0-9-]+)\.json$/.exec(i);if(!o)continue;let a=await _i(e,o[1]);!a||!t.has(a.taskId)||(await cm(e,a.id,n),s.push(a.id))}return s}async function BP(e,t){let n=t.indexOf("."),r=n>0?t.slice(0,n):"";/^capability_[A-Za-z0-9-]+$/.test(r)||Cn("<redacted>","token is invalid");let s=await _i(e,r);if(!s)throw new g("CAPABILITY_NOT_FOUND",`Craig capability "${r}" was not found.`,{details:{capabilityId:r}});let i=Buffer.from(s.token),o=Buffer.from(t);return(i.length!==o.length||!NP(i,o))&&Cn(r,"token is invalid"),s}async function _i(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||Cn(t,"identifier is invalid");try{let n=JSON.parse(await _P(mc(e,t),"utf8"));if(!WP(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(dm(n))return null;throw n}}function WP(e,t){if(!uc(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"&&VP(r))&&e.targetPolicy==="children-only"&&uc(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&dc(e.createdAt)&&dc(e.expiresAt)&&om(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||dc(e.revokedAt)&&om(e.revokedBy))}function om(e){return uc(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 fc=e=>lm.join(e.orchestrationDir,"capabilities"),mc=(e,t)=>lm.join(fc(e),`${t}.json`),VP=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),uc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),dc=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),dm=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as um,readFile as KP,rm as hc,stat as GP,writeFile as HP}from"node:fs/promises";import gc from"node:path";var YP=20,zP=3e4,JP=5e3;async function yc(e,t){let n=gc.join(e.runtimeDir,"delegation.lock");await um(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await um(n);try{await HP(gc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await hc(n,{recursive:!0,force:!0}),s}break}catch(s){if(!ZP(s))throw s;if(await XP(n))continue;if(Date.now()-r>=zP)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,YP))}try{return await t()}finally{await hc(n,{recursive:!0,force:!0})}}async function XP(e){let t=await KP(gc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&QP(t.pid))return!1;let n=await GP(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<JP?!1:(await hc(e,{recursive:!0,force:!0}),!0)}function QP(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 ZP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var eS={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function wc(e,t,n,r={}){let s=await k.load(e);return k.previews.isEnabled(s,"agentOrchestration")?P.createTask(e,t,n,{...r,onProvisioned:async i=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:i.id,CRAIG_AGENT_TAB_ID:i.ptyTabs.find(o=>o.kind==="agent")?.id??"",...await st(e,i,{type:"human",source:"cli",processId:process.pid})})}):P.createTask(e,t,n,r)}async function kc(e,t,n={}){return yc(e,async()=>{let r=await P.getTask(e,t.parentTaskId),s=t.capabilityId?await Xe(e,t.capabilityId,"task.create-child",r.id):null,i=s?.actor??{type:"human",source:"cli",processId:process.pid},o=s?.capability.limits??eS,a=tS(r,t),l=t.prompt.trim();if(l.length===0)throw new g("CLI_USAGE","Child task prompt cannot be empty.",{});Buffer.byteLength(l)>o.maxPromptBytes&&xi("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&xi("delegation depth",o.maxDepth);let c=new Set([r.repoId,...r.linkedRepoIds,...(r.repoTargets??[]).map(y=>y.repoId)]);if(a.type==="repo"&&!c.has(a.id))throw new g("CAPABILITY_DENIED",`Repo ${a.id} is outside parent task ${r.id}.`,{details:{parentTaskId:r.id,repoId:a.id}});let u=(await P.listTasks(e,{includeClosed:!0})).tasks.filter(y=>y.parentTaskId===r.id),p=t.idempotencyKey?.trim()||null;if(p){if(p.length>256)throw new g("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let y=u.find(T=>T.delegationIdempotencyKey===p);if(y){if(!nS(y,a)||y.prompt.value!==l||t.runner&&y.runner!==t.runner)throw new g("COMMAND_STATE_CONFLICT",`Idempotency key "${p}" is already used by child ${y.id}.`,{details:{idempotencyKey:p,taskId:y.id}});return pm(y,!0)}}u.length>=o.maxChildren&&xi("children",o.maxChildren),u.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&xi("concurrent children",o.maxConcurrentChildren);let f=await(n.createTask??P.createTask)(e,a.id,l,{...t.runner?{runner:t.runner}:{},...a.type==="workspace"?{workspaceId:a.id}:{owningWorkspaceId:r.workspaceId,...r.type==="project"&&r.linkedRepoIds.includes(a.id)?{allowLinkedProjectRepo:!0}:{}},lineage:{parentTaskId:r.id,rootTaskId:r.rootTaskId,delegationDepth:r.delegationDepth+1,delegationIdempotencyKey:p,furyRunId:t.fury?.runId??r.furyRunId,furyStepId:t.fury?.stepId??null},onProvisioned:async y=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:y.id,CRAIG_AGENT_TAB_ID:y.ptyTabs.find(T=>T.kind==="agent")?.id??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await st(e,y,i)})}),m=await P.getTask(e,f.taskId);try{await Le(e,{workspaceId:m.workspaceId,taskId:m.id,agentTabId:i.type==="agent"?i.agentTabId:null,type:"task.child.created",actor:i,data:{parentTaskId:r.id,rootTaskId:m.rootTaskId,delegationDepth:m.delegationDepth,targetType:a.type,targetId:a.id}})}catch(y){throw new g("PARTIAL_RESULT",`Child ${m.id} was created, but its audit event could not be recorded.`,{details:{taskId:m.id,parentTaskId:r.id,persisted:!0},cause:y})}return pm(m,!1)})}async function Tc(e,t,n){n&&await Xe(e,n,"task.children",t),await P.getTask(e,t);let r=(await P.listTasks(e,{includeClosed:!0})).tasks.filter(s=>s.parentTaskId===t).sort((s,i)=>s.id.localeCompare(i.id));return{kind:"listTaskChildren",taskId:t,children:r}}async function bc(e,t,n){return yc(e,async()=>{let s=(n?await Xe(e,n,"task.cancel-tree",t):null)?.actor??{type:"human",source:"cli",processId:process.pid};await P.getTask(e,t);let i=(await P.listTasks(e,{includeClosed:!0})).tasks,o=new Map(i.map(f=>[f.id,f])),a=new Map;for(let f of i)f.parentTaskId&&a.set(f.parentTaskId,[...a.get(f.parentTaskId)??[],f]);let l=[],c=new Set,d=f=>{if(c.has(f))throw new g("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${f}.`,{details:{taskId:f,rootTaskId:t}});let m=o.get(f);if(m){c.add(f),l.push(m);for(let y of(a.get(f)??[]).sort((T,R)=>T.id.localeCompare(R.id)))d(y.id)}};d(t);let u=[],p=[],h=[];try{await pc(e,new Set(l.map(f=>f.id)),s)}catch{h.push(...l.map(f=>f.id))}for(let f of l){let m=f.status;if(m==="closed"){u.push({taskId:f.id,previousStatus:m,status:"closed",disposition:"already-closed"});continue}await P.cleanupTask(e,f,{preserveWorktree:!0});let y=await P.closeTask(e,f.id);u.push({taskId:f.id,previousStatus:m,status:y.status,disposition:"cancelled"});try{await Le(e,{workspaceId:f.workspaceId,taskId:f.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:m}})}catch{p.push(f.id)}}if(p.length>0||h.length>0)throw new g("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:u,auditFailures:p,revocationFailures:h,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:u}})}function pm(e,t){let n=e.type==="project"?"workspace":"repo",r=e.ptyTabs.find(s=>s.kind==="agent");if(!r)throw new g("TASK_RECORD_INVALID",`Child task ${e.id} has no agent tab.`,{});return{kind:"createChildTask",taskId:e.id,parentTaskId:e.parentTaskId,rootTaskId:e.rootTaskId,delegationDepth:e.delegationDepth,targetType:n,targetId:n==="workspace"?e.workspaceId:e.repoId,repoId:e.repoId,workspaceId:e.workspaceId,agentTabId:r.id,status:e.status,branch:e.branch,worktreePath:e.worktreePath,runner:e.runner,idempotentReplay:t}}function tS(e,t){if(t.repoId&&t.workspaceId)throw new g("CLI_USAGE","Child task creation accepts only one of repoId or workspaceId.",{});if(t.workspaceId){if(e.type!=="project"||t.workspaceId!==e.workspaceId)throw new g("CAPABILITY_DENIED",`Workspace ${t.workspaceId} is outside parent task ${e.id}.`,{details:{parentTaskId:e.id,workspaceId:t.workspaceId}});return{type:"workspace",id:t.workspaceId}}return t.repoId?{type:"repo",id:t.repoId}:e.type==="project"?{type:"workspace",id:e.workspaceId}:{type:"repo",id:e.repoId}}function nS(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function xi(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var Fi=Symbol.for("yaml.alias"),Li=Symbol.for("yaml.document"),it=Symbol.for("yaml.map"),Rc=Symbol.for("yaml.pair"),je=Symbol.for("yaml.scalar"),Lt=Symbol.for("yaml.seq"),Ce=Symbol.for("yaml.node.type"),qe=e=>!!e&&typeof e=="object"&&e[Ce]===Fi,St=e=>!!e&&typeof e=="object"&&e[Ce]===Li,ot=e=>!!e&&typeof e=="object"&&e[Ce]===it,j=e=>!!e&&typeof e=="object"&&e[Ce]===Rc,x=e=>!!e&&typeof e=="object"&&e[Ce]===je,at=e=>!!e&&typeof e=="object"&&e[Ce]===Lt;function W(e){if(e&&typeof e=="object")switch(e[Ce]){case it:case Lt:return!0}return!1}function q(e){if(e&&typeof e=="object")switch(e[Ce]){case Fi:case it:case je:case Lt:return!0}return!1}var Mi=e=>(x(e)||W(e))&&!!e.anchor;var De=Symbol("break visit"),fm=Symbol("skip children"),It=Symbol("remove node");function Qe(e,t){let n=mm(t);St(e)?lr(null,e.contents,n,Object.freeze([e]))===It&&(e.contents=null):lr(null,e,n,Object.freeze([]))}Qe.BREAK=De;Qe.SKIP=fm;Qe.REMOVE=It;function lr(e,t,n,r){let s=hm(e,t,n,r);if(q(s)||j(s))return gm(e,r,s),lr(e,s,n,r);if(typeof s!="symbol"){if(W(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=lr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===De)return De;o===It&&(t.items.splice(i,1),i-=1)}}}else if(j(t)){r=Object.freeze(r.concat(t));let i=lr("key",t.key,n,r);if(i===De)return De;i===It&&(t.key=null);let o=lr("value",t.value,n,r);if(o===De)return De;o===It&&(t.value=null)}}return s}async function ji(e,t){let n=mm(t);St(e)?await cr(null,e.contents,n,Object.freeze([e]))===It&&(e.contents=null):await cr(null,e,n,Object.freeze([]))}ji.BREAK=De;ji.SKIP=fm;ji.REMOVE=It;async function cr(e,t,n,r){let s=await hm(e,t,n,r);if(q(s)||j(s))return gm(e,r,s),cr(e,s,n,r);if(typeof s!="symbol"){if(W(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=await cr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===De)return De;o===It&&(t.items.splice(i,1),i-=1)}}}else if(j(t)){r=Object.freeze(r.concat(t));let i=await cr("key",t.key,n,r);if(i===De)return De;i===It&&(t.key=null);let o=await cr("value",t.value,n,r);if(o===De)return De;o===It&&(t.value=null)}}return s}function mm(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 hm(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(ot(t))return n.Map?.(e,t,r);if(at(t))return n.Seq?.(e,t,r);if(j(t))return n.Pair?.(e,t,r);if(x(t))return n.Scalar?.(e,t,r);if(qe(t))return n.Alias?.(e,t,r)}function gm(e,t,n){let r=t[t.length-1];if(W(r))r.items[e]=n;else if(j(r))e==="key"?r.key=n:r.value=n;else if(St(r))r.contents=n;else{let s=qe(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var rS={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},sS=e=>e.replace(/[!,[\]{}]/g,t=>rS[t]),vt=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+sS(t.substring(r.length));return t[0]==="!"?t:`!<${t}>`}toString(t){let n=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],r=Object.entries(this.tags),s;if(t&&r.length>0&&q(t.contents)){let i={};Qe(t.contents,(o,a)=>{q(a)&&a.tag&&(i[a.tag]=!0)}),s=Object.keys(i)}else s=[];for(let[i,o]of r)i==="!!"&&o==="tag:yaml.org,2002:"||(!t||s.some(a=>a.startsWith(o)))&&n.push(`%TAG ${i} ${o}`);return n.join(`
79
- `)}};vt.defaultYaml={explicit:!1,version:"1.2"};vt.defaultTags={"!!":"tag:yaml.org,2002:"};function qi(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 Pc(e){let t=new Set;return Qe(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function Sc(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function ym(e,t){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=Pc(e));let o=Sc(t,s);return s.add(o),o},setAnchors:()=>{for(let i of n){let o=r.get(i);if(typeof o=="object"&&o.anchor&&(x(o.node)||W(o.node)))o.node.anchor=o.anchor;else{let a=new Error("Failed to resolve repeated object (this should not happen)");throw a.source=i,a}}},sourceObjects:r}}function rn(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=rn(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=rn(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=rn(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=rn(e,r,s,i);o===void 0?delete r[s]:o!==i&&(r[s]=o)}return e.call(t,n,r)}function fe(e,t,n){if(Array.isArray(e))return e.map((r,s)=>fe(r,String(s),n));if(e&&typeof e.toJSON=="function"){if(!n||!Mi(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 sn=class{constructor(t){Object.defineProperty(this,Ce,{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(!St(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=fe(this,"",o);if(typeof s=="function")for(let{count:l,res:c}of o.anchors.values())s(c,l);return typeof i=="function"?rn(i,{"":a},"",a):a}};var Mt=class extends sn{constructor(t){super(Fi),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=[],Qe(t,{Node:(i,o)=>{(qe(o)||Mi(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||(fe(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=Ui(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(qi(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 Ui(e,t,n){if(qe(t)){let r=t.resolve(e),s=n&&r&&n.get(r);return s?s.count*s.aliasCount:0}else if(W(t)){let r=0;for(let s of t.items){let i=Ui(e,s,n);i>r&&(r=i)}return r}else if(j(t)){let r=Ui(e,t.key,n),s=Ui(e,t.value,n);return Math.max(r,s)}return 1}var Bi=e=>!e||typeof e!="function"&&typeof e!="object",O=class extends sn{constructor(t){super(je),this.value=t}toJSON(t,n){return n?.keep?this.value:fe(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 iS="tag:yaml.org,2002:";function oS(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 jt(e,t,n){if(St(e)&&(e=e.contents),q(e))return e;if(j(e)){let u=n.schema[it].createNode?.(n.schema,null,n);return u.items.push(e),u}(e instanceof String||e instanceof Number||e instanceof Boolean||typeof BigInt<"u"&&e instanceof BigInt)&&(e=e.valueOf());let{aliasDuplicateObjects:r,onAnchor:s,onTagObj:i,schema:o,sourceObjects:a}=n,l;if(r&&e&&typeof e=="object"){if(l=a.get(e),l)return l.anchor??(l.anchor=s(e)),new Mt(l.anchor);l={anchor:null,node:null},a.set(e,l)}t?.startsWith("!!")&&(t=iS+t.slice(2));let c=oS(e,t,o.tags);if(!c){if(e&&typeof e.toJSON=="function"&&(e=e.toJSON()),!e||typeof e!="object"){let u=new O(e);return l&&(l.node=u),u}c=e instanceof Map?o[it]:Symbol.iterator in Object(e)?o[Lt]:o[it]}i&&(i(c),delete n.onTagObj);let d=c?.createNode?c.createNode(n.schema,e,n):typeof c?.nodeClass?.from=="function"?c.nodeClass.from(n.schema,e,n):new O(e);return t?d.tag=t:c.default||(d.tag=c.tag),l&&(l.node=d),d}function ls(e,t,n){let r=n;for(let s=t.length-1;s>=0;--s){let i=t[s];if(typeof i=="number"&&Number.isInteger(i)&&i>=0){let o=[];o[i]=r,r=o}else r=new Map([[i,r]])}return jt(r,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:e,sourceObjects:new Map})}var ur=e=>e==null||typeof e=="object"&&!!e[Symbol.iterator]().next().done,dr=class extends sn{constructor(t,n){super(t),Object.defineProperty(this,"schema",{value:n,configurable:!0,enumerable:!1,writable:!0})}clone(t){let n=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return t&&(n.schema=t),n.items=n.items.map(r=>q(r)||j(r)?r.clone(t):r),this.range&&(n.range=this.range.slice()),n}addIn(t,n){if(ur(t))this.add(n);else{let[r,...s]=t,i=this.get(r,!0);if(W(i))i.addIn(s,n);else if(i===void 0&&this.schema)this.set(r,ls(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}deleteIn(t){let[n,...r]=t;if(r.length===0)return this.delete(n);let s=this.get(n,!0);if(W(s))return s.deleteIn(r);throw new Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}getIn(t,n){let[r,...s]=t,i=this.get(r,!0);return s.length===0?!n&&x(i)?i.value:i:W(i)?i.getIn(s,n):void 0}hasAllNullValues(t){return this.items.every(n=>{if(!j(n))return!1;let r=n.value;return r==null||t&&x(r)&&r.value==null&&!r.commentBefore&&!r.comment&&!r.tag})}hasIn(t){let[n,...r]=t;if(r.length===0)return this.has(n);let s=this.get(n,!0);return W(s)?s.hasIn(r):!1}setIn(t,n){let[r,...s]=t;if(s.length===0)this.set(r,n);else{let i=this.get(r,!0);if(W(i))i.setIn(s,n);else if(i===void 0&&this.schema)this.set(r,ls(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};var wm=e=>e.replace(/^(?!$)(?: $)?/gm,"#");function Ze(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var Ct=(e,t,n)=>e.endsWith(`
80
- `)?Ze(n,t):n.includes(`
77
+ `))l.pop();else{if(!a)throw nn(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 nn(i.name,`empty record at line ${c+1}`);let d;try{d=JSON.parse(u)}catch{throw nn(i.name,`invalid JSON at line ${c+1}`)}let p=uP(d,i.name,c+1);if(c===0&&p.sequence!==i.startSequence)throw nn(i.name,`first record sequence ${p.sequence} does not match segment name`);if(r.has(p.id))throw nn(i.name,`duplicate event id ${p.id}`);r.add(p.id);let h=n.at(-1);if(h&&p.sequence!==h.sequence+1)throw nn(i.name,`non-monotonic sequence ${p.sequence} after ${h.sequence}`);n.push(p)}}return{events:n,earliestSequence:n[0]?.sequence??null}}async function $i(e){return(await sc(e.eventsDir).catch(n=>{if(oc(n))return[];throw n})).flatMap(n=>{let r=/^segment-(\d{16})\.jsonl$/.exec(n);return r?[{name:n,path:Oi.join(e.eventsDir,n),startSequence:Number(r[1])}]:[]}).sort((n,r)=>n.startSequence-r.startSequence)}async function nP(e,t,n){let r=await QR(e).catch(()=>null);return r!==null&&r.size>0&&r.size+Buffer.byteLength(t)>n}async function rP(e,t){let n=await $i(e),r=Math.max(0,n.length-t),s=await iP(e),i=await sP(e);if(s===null||i===null)return;for(let a=0;a<r;a+=1)if(await oP(n[a].path,s,i)){r=a;break}let o=n.slice(0,r);for(let a of o)await XR(a.path,{force:!0});o.length>0&&await zf(e.eventsDir)}async function sP(e){let t=ke(e).runs,n=await sc(t).catch(s=>{if(oc(s))return[];throw s}),r=new Set;for(let s of n.filter(i=>i.endsWith(".json")))try{let i=JSON.parse(await ls(Oi.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 iP(e){let t=await sc(e.commandsDir).catch(r=>{if(oc(r))return[];throw r}),n=new Set;for(let r of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await ls(Oi.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 oP(e,t,n){if(t.size===0&&n.size===0)return!1;let r=await ls(e,"utf8");for(let s of r.split(`
78
+ `))if(s)try{let i=JSON.parse(s);if(typeof i.commandId=="string"&&t.has(i.commandId)||typeof i.furyRunId=="string"&&n.has(i.furyRunId))return!0}catch{return!0}return!1}async function aP(e){let t=(await $i(e)).at(-1);if(!t)return;let n=await ls(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await rc(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function lP(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 tc(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}}):tc(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 cP(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 dP(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 uP(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw nn(t,`record at line ${n} is not an object`);let r=e,s={...r,furyRunId:r.furyRunId??r.swarmRunId??null,furyStepId:r.furyStepId??r.swarmStepId??null,type:typeof r.type=="string"&&r.type.startsWith("swarm.")?`fury.${r.type.slice(6)}`:r.type};delete s.swarmRunId,delete s.swarmStepId;let i=s;if(i.schemaVersion!==1||typeof i.id!="string"||i.id.length===0||i.id.length>256||!Number.isSafeInteger(i.sequence)||(i.sequence??0)<1||typeof i.type!="string"||i.type.length===0||i.type.length>256||typeof i.occurredAt!="string"||!Number.isFinite(Date.parse(i.occurredAt))||!ar(i.workspaceId)||!ar(i.taskId)||!ar(i.agentTabId)||!ar(i.commandId)||!ar(i.furyRunId)||!ar(i.furyStepId)||!pP(i.actor)||!("data"in i))throw nn(t,`record at line ${n} has an invalid schema`);return i}function pP(e){if(typeof e!="object"||e===null||Array.isArray(e)||!("type"in e))return!1;let t=e;return t.type==="human"?(t.source==="cli"||t.source==="tui")&&Number.isInteger(t.processId):t.type==="agent"?typeof t.taskId=="string"&&typeof t.agentTabId=="string"&&typeof t.capabilityId=="string":t.type==="system"&&(t.component==="orchestration-supervisor"||t.component==="heartbeat")}var ar=e=>e===null||typeof e=="string",Gf=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,nn=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),tc=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),oc=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function nc(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 zf(e){let t=await rc(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as Qf,readdir as PP,readFile as Zf}from"node:fs/promises";import em from"node:path";import{mkdir as Jf,readFile as fP,rm as Ni,stat as mP,writeFile as hP}from"node:fs/promises";import ac from"node:path";var gP=20,yP=3e4,wP=5e3;async function lc(e,t){let n=ac.join(e.runtimeDir,"command-store.lock");await Jf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Jf(n);try{await hP(ac.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Ni(n,{recursive:!0,force:!0}),s}break}catch(s){if(!bP(s))throw s;if(await kP(n))continue;if(Date.now()-r>=yP)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await RP(gP)}try{return await t()}finally{await Ni(n,{recursive:!0,force:!0})}}async function kP(e){let t=await fP(ac.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return TP(t.pid)?!1:(await Ni(e,{recursive:!0,force:!0}),!0);let n=await mP(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<wP?!1:(await Ni(e,{recursive:!0,force:!0}),!0)}function TP(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 bP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",RP=e=>new Promise(t=>setTimeout(t,e));async function Fi(e,t){cc(t);try{let n=JSON.parse(await Zf(cs(e,t),"utf8"));return nm(n,cs(e,t),t)}catch(n){throw CP(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?_i(t,cs(e,t),n):n}}async function je(e){await Qf(e.commandsDir,{recursive:!0});let t=await PP(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=em.join(e.commandsDir,r);try{n.push(nm(JSON.parse(await Zf(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:_i(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function tm(e,t){return cc(t.id),lc(e,async()=>{await Qf(e.commandsDir,{recursive:!0});let n=await je(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!SP(r,t))throw new g("COMMAND_STATE_CONFLICT",`Idempotency key "${t.idempotencyKey}" is already used by command ${r.id}.`,{details:{commandId:r.id,idempotencyKey:t.idempotencyKey}});return{command:r,created:!1}}}return await U(cs(e,t.id),t),{command:t,created:!0}})}async function ds(e,t,n){return cc(t),lc(e,async()=>{let r=await Fi(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await U(cs(e,t),s),s})}function SP(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 nm(e,t,n){if(!Di(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw _i("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||!Di(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!vP(e.prompt.text)||!["when-ready","immediate"].includes(String(e.delivery))||!s.includes(e.state)||!Number.isInteger(e.attempts)||Number(e.attempts)<0||!Number.isInteger(e.timeoutMs)||Number(e.timeoutMs)<=0||Number(e.timeoutMs)>864e5||!lr(e.expiresAt)||!lr(e.createdAt)||!lr(e.updatedAt)||e.deliveryStartedAt!==null&&!lr(e.deliveryStartedAt)||e.deliveredAt!==null&&!lr(e.deliveredAt)||e.cancelledAt!==null&&!lr(e.cancelledAt)||e.cancelledBy!==null&&!Xf(e.cancelledBy)||!Xf(e.actor)||!IP(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 _i(r,t);return e}function Xf(e){return!Di(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 IP(e){return e===null||Di(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var cs=(e,t)=>em.join(e.commandsDir,`${t}.json`),cc=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},lr=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),vP=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}),Di=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),CP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",_i=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function rm(e,t=new Date){return xi(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function sm(e,t=new Date){return e.state==="delivered"?e:(xi(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function im(e,t,n=new Date){return e.state==="failed"?e:(xi(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function om(e,t,n=new Date){return e.state==="cancelled"?e:(xi(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function xi(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 AP}from"node:crypto";var dc=32*1024,am=1440*60*1e3,uc=256,EP=["delivered","failed","cancelled"],pc={type:"system",component:"orchestration-supervisor"};async function OP(e,t){if(MP(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>am)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:am}});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)>uc)throw new g("CLI_USAGE",`Idempotency key exceeds ${uc} characters.`,{details:{maxIdempotencyKeyLength:uc}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${AP()}`,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 tm(e,r);if(s.created)try{await vn(e,s.command,"command.queued")}catch(i){throw lm(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function $P(e,t){return{kind:"showPromptCommand",command:await Fi(e,t)}}async function NP(e,t){let n=await je(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function DP(e,t,n){let r=!1,s=await ds(e,t,i=>{if(i.state==="cancelled")return i;let o=om(i,n??i.actor);return r=!0,o});if(r)try{await vn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw lm(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function _P(e,t){let n=await ds(e,t,r=>rm(r));return await vn(e,n,"command.delivering",pc),n}async function FP(e,t){let n=await ds(e,t,r=>sm(r));return await vn(e,n,"command.delivered",pc),n}async function xP(e,t,n){let r=await ds(e,t,s=>im(s,n));return await vn(e,r,"command.failed",pc),r}async function LP(e,t,n){let r=[...n.states??EP],s=Date.now()+n.timeoutMs;for(;;){let i=await Fi(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 jP(Math.min(n.pollIntervalMs??100,o),n.signal)}}function MP(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>dc)throw new g("CLI_USAGE",`Prompt exceeds the ${dc}-byte limit.`,{details:{maxPromptBytes:dc,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 Me(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 jP(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 lm=(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:OP,show:$P,list:NP,cancel:DP,wait:LP,beginDelivery:_P,completeDelivery:FP,fail:xP};import{randomUUID as dm,timingSafeEqual as qP}from"node:crypto";import{mkdir as UP,readFile as BP,readdir as WP}from"node:fs/promises";import um from"node:path";var VP=10080*60*1e3,KP={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},GP=["task.create-child","task.children","task.cancel-tree"],HP=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function st(e,t,n={type:"system",component:"orchestration-supervisor"},r){let s=t.ptyTabs.find(o=>o.kind==="agent"&&(!r||o.id===r));if(!s)return{};let i=null;if(await UP(gc(e),{recursive:!0,mode:448}),await H(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_${dm()}`,c=await Li(e,l);if(c&&(c.taskId!==o.id||c.agentTabId!==a.id))throw new g("CAPABILITY_DENIED",`Capability ${l} is bound to another agent.`,{details:{capabilityId:l,taskId:o.id,agentTabId:a.id}});return i=(c??await YP(e,l,o.id,a.id,n)).token,a.capabilityId?o:{...o,ptyTabs:o.ptyTabs.map(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 YP(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${dm()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...GP],targetPolicy:"children-only",limits:{...KP},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+VP).toISOString(),revokedAt:null,revokedBy:null};return await U(yc(e,o.id),o,{mode:384}),o}async function Qe(e,t,n,r){let s=await JP(e,t);return s.revokedAt&&Cn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&Cn(s.id,"expired"),!HP.has(n)&&!s.allowedCommandFamilies.includes(n)&&Cn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await zP(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 zP(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 pm(e,t,n){let r=await Li(e,t);r&&(r.revokedAt||await U(yc(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function hc(e,t,n){let r=await WP(gc(e)).catch(i=>fm(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 Li(e,o[1]);!a||!t.has(a.taskId)||(await pm(e,a.id,n),s.push(a.id))}return s}async function JP(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 Li(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||!qP(i,o))&&Cn(r,"token is invalid"),s}async function Li(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||Cn(t,"identifier is invalid");try{let n=JSON.parse(await BP(yc(e,t),"utf8"));if(!XP(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(fm(n))return null;throw n}}function XP(e,t){if(!mc(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"&&QP(r))&&e.targetPolicy==="children-only"&&mc(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&fc(e.createdAt)&&fc(e.expiresAt)&&cm(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||fc(e.revokedAt)&&cm(e.revokedBy))}function cm(e){return mc(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 gc=e=>um.join(e.orchestrationDir,"capabilities"),yc=(e,t)=>um.join(gc(e),`${t}.json`),QP=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),mc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),fc=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),fm=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as mm,readFile as ZP,rm as wc,stat as eS,writeFile as tS}from"node:fs/promises";import kc from"node:path";var nS=20,rS=3e4,sS=5e3;async function Tc(e,t){let n=kc.join(e.runtimeDir,"delegation.lock");await mm(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await mm(n);try{await tS(kc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await wc(n,{recursive:!0,force:!0}),s}break}catch(s){if(!aS(s))throw s;if(await iS(n))continue;if(Date.now()-r>=rS)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,nS))}try{return await t()}finally{await wc(n,{recursive:!0,force:!0})}}async function iS(e){let t=await ZP(kc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&oS(t.pid))return!1;let n=await eS(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<sS?!1:(await wc(e,{recursive:!0,force:!0}),!0)}function oS(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EPERM"}}var aS=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var lS={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function bc(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 st(e,i,{type:"human",source:"cli",processId:process.pid})})}):S.createTask(e,t,n,r)}async function Rc(e,t,n={}){return Tc(e,async()=>{let r=await S.getTask(e,t.parentTaskId),s=t.capabilityId?await Qe(e,t.capabilityId,"task.create-child",r.id):null,i=s?.actor??{type:"human",source:"cli",processId:process.pid},o=s?.capability.limits??lS,a=cS(r,t),l=t.prompt.trim();if(l.length===0)throw new g("CLI_USAGE","Child task prompt cannot be empty.",{});Buffer.byteLength(l)>o.maxPromptBytes&&Mi("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&Mi("delegation depth",o.maxDepth);let c=new Set([r.repoId,...r.linkedRepoIds,...(r.repoTargets??[]).map(y=>y.repoId)]);if(a.type==="repo"&&!c.has(a.id))throw new g("CAPABILITY_DENIED",`Repo ${a.id} is outside parent task ${r.id}.`,{details:{parentTaskId:r.id,repoId:a.id}});let d=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(y=>y.parentTaskId===r.id),p=t.idempotencyKey?.trim()||null;if(p){if(p.length>256)throw new g("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let y=d.find(T=>T.delegationIdempotencyKey===p);if(y){if(!dS(y,a)||y.prompt.value!==l||t.runner&&y.runner!==t.runner)throw new g("COMMAND_STATE_CONFLICT",`Idempotency key "${p}" is already used by child ${y.id}.`,{details:{idempotencyKey:p,taskId:y.id}});return hm(y,!0)}}d.length>=o.maxChildren&&Mi("children",o.maxChildren),d.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&Mi("concurrent children",o.maxConcurrentChildren);let f=await(n.createTask??S.createTask)(e,a.id,l,{...t.runner?{runner:t.runner}:{},...a.type==="workspace"?{workspaceId:a.id}:{owningWorkspaceId:r.workspaceId,...r.type==="project"&&r.linkedRepoIds.includes(a.id)?{allowLinkedProjectRepo:!0}:{}},lineage:{parentTaskId:r.id,rootTaskId:r.rootTaskId,delegationDepth:r.delegationDepth+1,delegationIdempotencyKey:p,furyRunId:t.fury?.runId??r.furyRunId,furyStepId:t.fury?.stepId??null},onProvisioned:async y=>({CRAIG_WORKSPACE_ROOT:e.workspaceRoot,CRAIG_TASK_ID:y.id,CRAIG_AGENT_TAB_ID:y.ptyTabs.find(T=>T.kind==="agent")?.id??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await st(e,y,i)})}),m=await S.getTask(e,f.taskId);try{await Me(e,{workspaceId:m.workspaceId,taskId:m.id,agentTabId:i.type==="agent"?i.agentTabId:null,type:"task.child.created",actor:i,data:{parentTaskId:r.id,rootTaskId:m.rootTaskId,delegationDepth:m.delegationDepth,targetType:a.type,targetId:a.id}})}catch(y){throw new g("PARTIAL_RESULT",`Child ${m.id} was created, but its audit event could not be recorded.`,{details:{taskId:m.id,parentTaskId:r.id,persisted:!0},cause:y})}return hm(m,!1)})}async function Pc(e,t,n){n&&await Qe(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 Sc(e,t,n){return Tc(e,async()=>{let s=(n?await Qe(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 hc(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 Me(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 hm(e,t){let n=e.type==="project"?"workspace":"repo",r=e.ptyTabs.find(s=>s.kind==="agent");if(!r)throw new g("TASK_RECORD_INVALID",`Child task ${e.id} has no agent tab.`,{});return{kind:"createChildTask",taskId:e.id,parentTaskId:e.parentTaskId,rootTaskId:e.rootTaskId,delegationDepth:e.delegationDepth,targetType:n,targetId:n==="workspace"?e.workspaceId:e.repoId,repoId:e.repoId,workspaceId:e.workspaceId,agentTabId:r.id,status:e.status,branch:e.branch,worktreePath:e.worktreePath,runner:e.runner,idempotentReplay:t}}function cS(e,t){if(t.repoId&&t.workspaceId)throw new g("CLI_USAGE","Child task creation accepts only one of repoId or workspaceId.",{});if(t.workspaceId){if(e.type!=="project"||t.workspaceId!==e.workspaceId)throw new g("CAPABILITY_DENIED",`Workspace ${t.workspaceId} is outside parent task ${e.id}.`,{details:{parentTaskId:e.id,workspaceId:t.workspaceId}});return{type:"workspace",id:t.workspaceId}}return t.repoId?{type:"repo",id:t.repoId}:e.type==="project"?{type:"workspace",id:e.workspaceId}:{type:"repo",id:e.repoId}}function dS(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function Mi(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var ji=Symbol.for("yaml.alias"),qi=Symbol.for("yaml.document"),it=Symbol.for("yaml.map"),Ic=Symbol.for("yaml.pair"),qe=Symbol.for("yaml.scalar"),Lt=Symbol.for("yaml.seq"),Ae=Symbol.for("yaml.node.type"),Ue=e=>!!e&&typeof e=="object"&&e[Ae]===ji,St=e=>!!e&&typeof e=="object"&&e[Ae]===qi,ot=e=>!!e&&typeof e=="object"&&e[Ae]===it,j=e=>!!e&&typeof e=="object"&&e[Ae]===Ic,F=e=>!!e&&typeof e=="object"&&e[Ae]===qe,at=e=>!!e&&typeof e=="object"&&e[Ae]===Lt;function W(e){if(e&&typeof e=="object")switch(e[Ae]){case it:case Lt:return!0}return!1}function q(e){if(e&&typeof e=="object")switch(e[Ae]){case ji:case it:case qe:case Lt:return!0}return!1}var Ui=e=>(F(e)||W(e))&&!!e.anchor;var _e=Symbol("break visit"),gm=Symbol("skip children"),It=Symbol("remove node");function Ze(e,t){let n=ym(t);St(e)?cr(null,e.contents,n,Object.freeze([e]))===It&&(e.contents=null):cr(null,e,n,Object.freeze([]))}Ze.BREAK=_e;Ze.SKIP=gm;Ze.REMOVE=It;function cr(e,t,n,r){let s=wm(e,t,n,r);if(q(s)||j(s))return km(e,r,s),cr(e,s,n,r);if(typeof s!="symbol"){if(W(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=cr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===_e)return _e;o===It&&(t.items.splice(i,1),i-=1)}}}else if(j(t)){r=Object.freeze(r.concat(t));let i=cr("key",t.key,n,r);if(i===_e)return _e;i===It&&(t.key=null);let o=cr("value",t.value,n,r);if(o===_e)return _e;o===It&&(t.value=null)}}return s}async function Bi(e,t){let n=ym(t);St(e)?await dr(null,e.contents,n,Object.freeze([e]))===It&&(e.contents=null):await dr(null,e,n,Object.freeze([]))}Bi.BREAK=_e;Bi.SKIP=gm;Bi.REMOVE=It;async function dr(e,t,n,r){let s=await wm(e,t,n,r);if(q(s)||j(s))return km(e,r,s),dr(e,s,n,r);if(typeof s!="symbol"){if(W(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=await dr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===_e)return _e;o===It&&(t.items.splice(i,1),i-=1)}}}else if(j(t)){r=Object.freeze(r.concat(t));let i=await dr("key",t.key,n,r);if(i===_e)return _e;i===It&&(t.key=null);let o=await dr("value",t.value,n,r);if(o===_e)return _e;o===It&&(t.value=null)}}return s}function ym(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 wm(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(ot(t))return n.Map?.(e,t,r);if(at(t))return n.Seq?.(e,t,r);if(j(t))return n.Pair?.(e,t,r);if(F(t))return n.Scalar?.(e,t,r);if(Ue(t))return n.Alias?.(e,t,r)}function km(e,t,n){let r=t[t.length-1];if(W(r))r.items[e]=n;else if(j(r))e==="key"?r.key=n:r.value=n;else if(St(r))r.contents=n;else{let s=Ue(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var uS={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},pS=e=>e.replace(/[!,[\]{}]/g,t=>uS[t]),vt=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+pS(t.substring(r.length));return t[0]==="!"?t:`!<${t}>`}toString(t){let n=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],r=Object.entries(this.tags),s;if(t&&r.length>0&&q(t.contents)){let i={};Ze(t.contents,(o,a)=>{q(a)&&a.tag&&(i[a.tag]=!0)}),s=Object.keys(i)}else s=[];for(let[i,o]of r)i==="!!"&&o==="tag:yaml.org,2002:"||(!t||s.some(a=>a.startsWith(o)))&&n.push(`%TAG ${i} ${o}`);return n.join(`
79
+ `)}};vt.defaultYaml={explicit:!1,version:"1.2"};vt.defaultTags={"!!":"tag:yaml.org,2002:"};function Wi(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 vc(e){let t=new Set;return Ze(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function Cc(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function Tm(e,t){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=vc(e));let o=Cc(t,s);return s.add(o),o},setAnchors:()=>{for(let i of n){let o=r.get(i);if(typeof o=="object"&&o.anchor&&(F(o.node)||W(o.node)))o.node.anchor=o.anchor;else{let a=new Error("Failed to resolve repeated object (this should not happen)");throw a.source=i,a}}},sourceObjects:r}}function rn(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=rn(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=rn(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=rn(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=rn(e,r,s,i);o===void 0?delete r[s]:o!==i&&(r[s]=o)}return e.call(t,n,r)}function fe(e,t,n){if(Array.isArray(e))return e.map((r,s)=>fe(r,String(s),n));if(e&&typeof e.toJSON=="function"){if(!n||!Ui(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 sn=class{constructor(t){Object.defineProperty(this,Ae,{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(!St(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=fe(this,"",o);if(typeof s=="function")for(let{count:l,res:c}of o.anchors.values())s(c,l);return typeof i=="function"?rn(i,{"":a},"",a):a}};var Mt=class extends sn{constructor(t){super(ji),this.source=t,Object.defineProperty(this,"tag",{set(){throw new Error("Alias nodes cannot have tags")}})}resolve(t,n){if(n?.maxAliasCount===0)throw new ReferenceError("Alias resolution is disabled");let r;n?.aliasResolveCache?r=n.aliasResolveCache:(r=[],Ze(t,{Node:(i,o)=>{(Ue(o)||Ui(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||(fe(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=Vi(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(Wi(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 Vi(e,t,n){if(Ue(t)){let r=t.resolve(e),s=n&&r&&n.get(r);return s?s.count*s.aliasCount:0}else if(W(t)){let r=0;for(let s of t.items){let i=Vi(e,s,n);i>r&&(r=i)}return r}else if(j(t)){let r=Vi(e,t.key,n),s=Vi(e,t.value,n);return Math.max(r,s)}return 1}var Ki=e=>!e||typeof e!="function"&&typeof e!="object",O=class extends sn{constructor(t){super(qe),this.value=t}toJSON(t,n){return n?.keep?this.value:fe(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 fS="tag:yaml.org,2002:";function mS(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 jt(e,t,n){if(St(e)&&(e=e.contents),q(e))return e;if(j(e)){let d=n.schema[it].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 Mt(l.anchor);l={anchor:null,node:null},a.set(e,l)}t?.startsWith("!!")&&(t=fS+t.slice(2));let c=mS(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[it]:Symbol.iterator in Object(e)?o[Lt]:o[it]}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 us(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 jt(r,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:e,sourceObjects:new Map})}var pr=e=>e==null||typeof e=="object"&&!!e[Symbol.iterator]().next().done,ur=class extends sn{constructor(t,n){super(t),Object.defineProperty(this,"schema",{value:n,configurable:!0,enumerable:!1,writable:!0})}clone(t){let n=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return t&&(n.schema=t),n.items=n.items.map(r=>q(r)||j(r)?r.clone(t):r),this.range&&(n.range=this.range.slice()),n}addIn(t,n){if(pr(t))this.add(n);else{let[r,...s]=t,i=this.get(r,!0);if(W(i))i.addIn(s,n);else if(i===void 0&&this.schema)this.set(r,us(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}deleteIn(t){let[n,...r]=t;if(r.length===0)return this.delete(n);let s=this.get(n,!0);if(W(s))return s.deleteIn(r);throw new Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}getIn(t,n){let[r,...s]=t,i=this.get(r,!0);return s.length===0?!n&&F(i)?i.value:i:W(i)?i.getIn(s,n):void 0}hasAllNullValues(t){return this.items.every(n=>{if(!j(n))return!1;let r=n.value;return r==null||t&&F(r)&&r.value==null&&!r.commentBefore&&!r.comment&&!r.tag})}hasIn(t){let[n,...r]=t;if(r.length===0)return this.has(n);let s=this.get(n,!0);return W(s)?s.hasIn(r):!1}setIn(t,n){let[r,...s]=t;if(s.length===0)this.set(r,n);else{let i=this.get(r,!0);if(W(i))i.setIn(s,n);else if(i===void 0&&this.schema)this.set(r,us(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};var bm=e=>e.replace(/^(?!$)(?: $)?/gm,"#");function et(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var Ct=(e,t,n)=>e.endsWith(`
80
+ `)?et(n,t):n.includes(`
81
81
  `)?`
82
- `+Ze(n,t):(e.endsWith(" ")?"":" ")+n;var Ic="flow",Wi="block",cs="quoted";function ds(e,t,n="flow",{indentAtStart:r,lineWidth:s=80,minContentWidth:i=20,onFold:o,onOverflow:a}={}){if(!s||s<0)return e;s<i&&(i=0);let l=Math.max(1+i,1+s-t.length);if(e.length<=l)return e;let c=[],d={},u=s-t.length;typeof r=="number"&&(r>s-Math.max(2,i)?c.push(0):u=s-r);let p,h,f=!1,m=-1,y=-1,T=-1;n===Wi&&(m=km(e,m,t.length),m!==-1&&(u=m+l));for(let b;b=e[m+=1];){if(n===cs&&b==="\\"){switch(y=m,e[m+1]){case"x":m+=3;break;case"u":m+=5;break;case"U":m+=9;break;default:m+=1}T=m}if(b===`
83
- `)n===Wi&&(m=km(e,m,t.length)),u=m+t.length+l,p=void 0;else{if(b===" "&&h&&h!==" "&&h!==`
82
+ `+et(n,t):(e.endsWith(" ")?"":" ")+n;var Ac="flow",Gi="block",ps="quoted";function fs(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===Gi&&(m=Rm(e,m,t.length),m!==-1&&(d=m+l));for(let b;b=e[m+=1];){if(n===ps&&b==="\\"){switch(y=m,e[m+1]){case"x":m+=3;break;case"u":m+=5;break;case"U":m+=9;break;default:m+=1}T=m}if(b===`
83
+ `)n===Gi&&(m=Rm(e,m,t.length)),d=m+t.length+l,p=void 0;else{if(b===" "&&h&&h!==" "&&h!==`
84
84
  `&&h!==" "){let $=e[m+1];$&&$!==" "&&$!==`
85
- `&&$!==" "&&(p=m)}if(m>=u)if(p)c.push(p),u=p+l,p=void 0;else if(n===cs){for(;h===" "||h===" ";)h=b,b=e[m+=1],f=!0;let $=m>T+1?m-2:y-1;if(d[$])return e;c.push($),d[$]=!0,u=$+l,p=void 0}else f=!0}h=b}if(f&&a&&a(),c.length===0)return e;o&&o();let R=e.slice(0,c[0]);for(let b=0;b<c.length;++b){let $=c[b],N=c[b+1]||e.length;$===0?R=`
86
- ${t}${e.slice(0,N)}`:(n===cs&&d[$]&&(R+=`${e[$]}\\`),R+=`
87
- ${t}${e.slice($+1,N)}`)}return R}function km(e,t,n){let r=t,s=t+1,i=e[s];for(;i===" "||i===" ";)if(t<s+n)i=e[++t];else{do i=e[++t];while(i&&i!==`
88
- `);r=t,s=t+1,i=e[s]}return r}var Ki=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),Gi=e=>/^(%|---|\.\.\.)/m.test(e);function aS(e,t,n){if(!t||t<0)return!1;let r=t-n,s=e.length;if(s<=r)return!1;for(let i=0,o=0;i<s;++i)if(e[i]===`
89
- `){if(i-o>r)return!0;if(o=i+1,s-o<=r)return!1}return!0}function us(e,t){let n=JSON.stringify(e);if(t.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=t,s=t.options.doubleQuotedMinMultiLineLength,i=t.indent||(Gi(e)?" ":""),o="",a=0;for(let l=0,c=n[l];c;c=n[++l])if(c===" "&&n[l+1]==="\\"&&n[l+2]==="n"&&(o+=n.slice(a,l)+"\\ ",l+=1,a=l,c="\\"),c==="\\")switch(n[l+1]){case"u":{o+=n.slice(a,l);let d=n.substr(l+2,4);switch(d){case"0000":o+="\\0";break;case"0007":o+="\\a";break;case"000b":o+="\\v";break;case"001b":o+="\\e";break;case"0085":o+="\\N";break;case"00a0":o+="\\_";break;case"2028":o+="\\L";break;case"2029":o+="\\P";break;default:d.substr(0,2)==="00"?o+="\\x"+d.substr(2):o+=n.substr(l,6)}l+=5,a=l+1}break;case"n":if(r||n[l+2]==='"'||n.length<s)l+=1;else{for(o+=n.slice(a,l)+`
85
+ `&&$!==" "&&(p=m)}if(m>=d)if(p)c.push(p),d=p+l,p=void 0;else if(n===ps){for(;h===" "||h===" ";)h=b,b=e[m+=1],f=!0;let $=m>T+1?m-2:y-1;if(u[$])return e;c.push($),u[$]=!0,d=$+l,p=void 0}else f=!0}h=b}if(f&&a&&a(),c.length===0)return e;o&&o();let R=e.slice(0,c[0]);for(let b=0;b<c.length;++b){let $=c[b],N=c[b+1]||e.length;$===0?R=`
86
+ ${t}${e.slice(0,N)}`:(n===ps&&u[$]&&(R+=`${e[$]}\\`),R+=`
87
+ ${t}${e.slice($+1,N)}`)}return R}function Rm(e,t,n){let r=t,s=t+1,i=e[s];for(;i===" "||i===" ";)if(t<s+n)i=e[++t];else{do i=e[++t];while(i&&i!==`
88
+ `);r=t,s=t+1,i=e[s]}return r}var Yi=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),zi=e=>/^(%|---|\.\.\.)/m.test(e);function hS(e,t,n){if(!t||t<0)return!1;let r=t-n,s=e.length;if(s<=r)return!1;for(let i=0,o=0;i<s;++i)if(e[i]===`
89
+ `){if(i-o>r)return!0;if(o=i+1,s-o<=r)return!1}return!0}function ms(e,t){let n=JSON.stringify(e);if(t.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=t,s=t.options.doubleQuotedMinMultiLineLength,i=t.indent||(zi(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)+`
90
90
 
91
91
  `;n[l+2]==="\\"&&n[l+3]==="n"&&n[l+4]!=='"';)o+=`
92
- `,l+=2;o+=i,n[l+2]===" "&&(o+="\\"),l+=1,a=l+1}break;default:l+=1}return o=a?o+n.slice(a):n,r?o:ds(o,i,cs,Ki(t,!1))}function vc(e,t){if(t.options.singleQuote===!1||t.implicitKey&&e.includes(`
93
- `)||/[ \t]\n|\n[ \t]/.test(e))return us(e,t);let n=t.indent||(Gi(e)?" ":""),r="'"+e.replace(/'/g,"''").replace(/\n+/g,`$&
94
- ${n}`)+"'";return t.implicitKey?r:ds(r,n,Ic,Ki(t,!1))}function pr(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=us;else{let s=e.includes('"'),i=e.includes("'");s&&!i?r=vc:i&&!s?r=us:r=n?vc:us}return r(e,t)}var Cc;try{Cc=new RegExp(`(^|(?<!
92
+ `,l+=2;o+=i,n[l+2]===" "&&(o+="\\"),l+=1,a=l+1}break;default:l+=1}return o=a?o+n.slice(a):n,r?o:fs(o,i,ps,Yi(t,!1))}function Ec(e,t){if(t.options.singleQuote===!1||t.implicitKey&&e.includes(`
93
+ `)||/[ \t]\n|\n[ \t]/.test(e))return ms(e,t);let n=t.indent||(zi(e)?" ":""),r="'"+e.replace(/'/g,"''").replace(/\n+/g,`$&
94
+ ${n}`)+"'";return t.implicitKey?r:fs(r,n,Ac,Yi(t,!1))}function fr(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=ms;else{let s=e.includes('"'),i=e.includes("'");s&&!i?r=Ec:i&&!s?r=ms:r=n?Ec:ms}return r(e,t)}var Oc;try{Oc=new RegExp(`(^|(?<!
95
95
  ))
96
96
  +(?!
97
- |$)`,"g")}catch{Cc=/\n+(?!\n|$)/g}function Vi({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 pr(n,r);let c=r.indent||(r.forceBlockIndent||Gi(n)?" ":""),d=o==="literal"?!0:o==="folded"||t===O.BLOCK_FOLDED?!1:t===O.BLOCK_LITERAL?!0:!aS(n,l,c.length);if(!n)return d?`|
97
+ |$)`,"g")}catch{Oc=/\n+(?!\n|$)/g}function Hi({comment:e,type:t,value:n},r,s,i){let{blockQuote:o,commentString:a,lineWidth:l}=r.options;if(!o||/\n[\t ]+$/.test(n))return fr(n,r);let c=r.indent||(r.forceBlockIndent||zi(n)?" ":""),u=o==="literal"?!0:o==="folded"||t===O.BLOCK_FOLDED?!1:t===O.BLOCK_LITERAL?!0:!hS(n,l,c.length);if(!n)return u?`|
98
98
  `:`>
99
- `;let u,p;for(p=n.length;p>0;--p){let N=n[p-1];if(N!==`
99
+ `;let d,p;for(p=n.length;p>0;--p){let N=n[p-1];if(N!==`
100
100
  `&&N!==" "&&N!==" ")break}let h=n.substring(p),f=h.indexOf(`
101
- `);f===-1?u="-":n===h||f!==h.length-1?(u="+",i&&i()):u="",h&&(n=n.slice(0,-h.length),h[h.length-1]===`
102
- `&&(h=h.slice(0,-1)),h=h.replace(Cc,`$&${c}`));let m=!1,y,T=-1;for(y=0;y<n.length;++y){let N=n[y];if(N===" ")m=!0;else if(N===`
103
- `)T=y;else break}let R=n.substring(0,T<y?T+1:y);R&&(n=n.substring(R.length),R=R.replace(/\n+/g,`$&${c}`));let $=(m?c?"2":"1":"")+u;if(e&&($+=" "+a(e.replace(/ ?[\r\n]+/g," ")),s&&s()),!d){let N=n.replace(/\n+/g,`
104
- $&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),D=!1,_=Ki(r,!0);o!=="folded"&&t!==O.BLOCK_FOLDED&&(_.onOverflow=()=>{D=!0});let A=ds(`${R}${N}${h}`,c,Wi,_);if(!D)return`>${$}
101
+ `);f===-1?d="-":n===h||f!==h.length-1?(d="+",i&&i()):d="",h&&(n=n.slice(0,-h.length),h[h.length-1]===`
102
+ `&&(h=h.slice(0,-1)),h=h.replace(Oc,`$&${c}`));let m=!1,y,T=-1;for(y=0;y<n.length;++y){let N=n[y];if(N===" ")m=!0;else if(N===`
103
+ `)T=y;else break}let R=n.substring(0,T<y?T+1:y);R&&(n=n.substring(R.length),R=R.replace(/\n+/g,`$&${c}`));let $=(m?c?"2":"1":"")+d;if(e&&($+=" "+a(e.replace(/ ?[\r\n]+/g," ")),s&&s()),!u){let N=n.replace(/\n+/g,`
104
+ $&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,"$1$2").replace(/\n+/g,`$&${c}`),D=!1,_=Yi(r,!0);o!=="folded"&&t!==O.BLOCK_FOLDED&&(_.onOverflow=()=>{D=!0});let A=fs(`${R}${N}${h}`,c,Gi,_);if(!D)return`>${$}
105
105
  ${c}${A}`}return n=n.replace(/\n+/g,`$&${c}`),`|${$}
106
- ${c}${R}${n}${h}`}function lS(e,t,n,r){let{type:s,value:i}=e,{actualString:o,implicitKey:a,indent:l,indentStep:c,inFlow:d}=t;if(a&&i.includes(`
107
- `)||d&&/[[\]{},]/.test(i))return pr(i,t);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(i))return a||d||!i.includes(`
108
- `)?pr(i,t):Vi(e,t,n,r);if(!a&&!d&&s!==O.PLAIN&&i.includes(`
109
- `))return Vi(e,t,n,r);if(Gi(i)){if(l==="")return t.forceBlockIndent=!0,Vi(e,t,n,r);if(a&&l===c)return pr(i,t)}let u=i.replace(/\n+/g,`$&
110
- ${l}`);if(o){let p=m=>m.default&&m.tag!=="tag:yaml.org,2002:str"&&m.test?.test(u),{compat:h,tags:f}=t.doc.schema;if(f.some(p)||h?.some(p))return pr(i,t)}return a?u:ds(u,l,Ic,Ki(t,!1))}function An(e,t,n,r){let{implicitKey:s,inFlow:i}=t,o=typeof e.value=="string"?e:Object.assign({},e,{value:String(e.value)}),{type:a}=e;a!==O.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(o.value)&&(a=O.QUOTE_DOUBLE);let l=d=>{switch(d){case O.BLOCK_FOLDED:case O.BLOCK_LITERAL:return s||i?pr(o.value,t):Vi(o,t,n,r);case O.QUOTE_DOUBLE:return us(o.value,t);case O.QUOTE_SINGLE:return vc(o.value,t);case O.PLAIN:return lS(o,t,n,r);default:return null}},c=l(a);if(c===null){let{defaultKeyType:d,defaultStringType:u}=t.options,p=s&&d||u;if(c=l(p),c===null)throw new Error(`Unsupported default string type ${p}`)}return c}function Hi(e,t){let n=Object.assign({blockQuote:!0,commentString:wm,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 cS(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 dS(e,t,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(x(e)||W(e))&&e.anchor;i&&qi(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 qt(e,t,n,r){if(j(e))return e.toString(t,n,r);if(qe(e)){if(t.doc.directives)return e.toString(t);if(t.resolvedAliases?.has(e))throw new TypeError("Cannot stringify circular structure without alias nodes");t.resolvedAliases?t.resolvedAliases.add(e):t.resolvedAliases=new Set([e]),e=e.resolve(t.doc)}let s,i=q(e)?e:t.doc.createNode(e,{onTagObj:l=>s=l});s??(s=cS(t.doc.schema.tags,i));let o=dS(i,s,t);o.length>0&&(t.indentAtStart=(t.indentAtStart??0)+o.length+1);let a=typeof s.stringify=="function"?s.stringify(i,t,n,r):x(i)?An(i,t,n,r):i.toString(t,n,r);return o?x(i)||a[0]==="{"||a[0]==="["?`${o} ${a}`:`${o}
111
- ${t.indent}${a}`:a}function Tm({key:e,value:t},n,r,s){let{allNullValues:i,doc:o,indent:a,indentStep:l,options:{commentString:c,indentSeq:d,simpleKeys:u}}=n,p=q(e)&&e.comment||null;if(u){if(p)throw new Error("With simple keys, key nodes cannot have comments");if(W(e)||!q(e)&&typeof e=="object"){let _="With simple keys, collection cannot be used as a key value";throw new Error(_)}}let h=!u&&(!e||p&&t==null&&!n.inFlow||W(e)||(x(e)?e.type===O.BLOCK_FOLDED||e.type===O.BLOCK_LITERAL:typeof e=="object"));n=Object.assign({},n,{allNullValues:!1,implicitKey:!h&&(u||!i),indent:a+l});let f=!1,m=!1,y=qt(e,n,()=>f=!0,()=>m=!0);if(!h&&!n.inFlow&&y.length>1024){if(u)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");h=!0}if(n.inFlow){if(i||t==null)return f&&r&&r(),y===""?"?":h?`? ${y}`:y}else if(i&&!u||t==null&&h)return y=`? ${y}`,p&&!f?y+=Ct(y,n.indent,c(p)):m&&s&&s(),y;f&&(p=null),h?(p&&(y+=Ct(y,n.indent,c(p))),y=`? ${y}
112
- ${a}:`):(y=`${y}:`,p&&(y+=Ct(y,n.indent,c(p))));let T,R,b;q(t)?(T=!!t.spaceBefore,R=t.commentBefore,b=t.comment):(T=!1,R=null,b=null,t&&typeof t=="object"&&(t=o.createNode(t))),n.implicitKey=!1,!h&&!p&&x(t)&&(n.indentAtStart=y.length+1),m=!1,!d&&l.length>=2&&!n.inFlow&&!h&&at(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let $=!1,N=qt(t,n,()=>$=!0,()=>m=!0),D=" ";if(p||T||R){if(D=T?`
106
+ ${c}${R}${n}${h}`}function gS(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(`
107
+ `)||u&&/[[\]{},]/.test(i))return fr(i,t);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(i))return a||u||!i.includes(`
108
+ `)?fr(i,t):Hi(e,t,n,r);if(!a&&!u&&s!==O.PLAIN&&i.includes(`
109
+ `))return Hi(e,t,n,r);if(zi(i)){if(l==="")return t.forceBlockIndent=!0,Hi(e,t,n,r);if(a&&l===c)return fr(i,t)}let d=i.replace(/\n+/g,`$&
110
+ ${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 fr(i,t)}return a?d:fs(d,l,Ac,Yi(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?fr(o.value,t):Hi(o,t,n,r);case O.QUOTE_DOUBLE:return ms(o.value,t);case O.QUOTE_SINGLE:return Ec(o.value,t);case O.PLAIN:return gS(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 Ji(e,t){let n=Object.assign({blockQuote:!0,commentString:bm,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 yS(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(F(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 wS(e,t,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(F(e)||W(e))&&e.anchor;i&&Wi(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 qt(e,t,n,r){if(j(e))return e.toString(t,n,r);if(Ue(e)){if(t.doc.directives)return e.toString(t);if(t.resolvedAliases?.has(e))throw new TypeError("Cannot stringify circular structure without alias nodes");t.resolvedAliases?t.resolvedAliases.add(e):t.resolvedAliases=new Set([e]),e=e.resolve(t.doc)}let s,i=q(e)?e:t.doc.createNode(e,{onTagObj:l=>s=l});s??(s=yS(t.doc.schema.tags,i));let o=wS(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):F(i)?An(i,t,n,r):i.toString(t,n,r);return o?F(i)||a[0]==="{"||a[0]==="["?`${o} ${a}`:`${o}
111
+ ${t.indent}${a}`:a}function Pm({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=q(e)&&e.comment||null;if(d){if(p)throw new Error("With simple keys, key nodes cannot have comments");if(W(e)||!q(e)&&typeof e=="object"){let _="With simple keys, collection cannot be used as a key value";throw new Error(_)}}let h=!d&&(!e||p&&t==null&&!n.inFlow||W(e)||(F(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=qt(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+=Ct(y,n.indent,c(p)):m&&s&&s(),y;f&&(p=null),h?(p&&(y+=Ct(y,n.indent,c(p))),y=`? ${y}
112
+ ${a}:`):(y=`${y}:`,p&&(y+=Ct(y,n.indent,c(p))));let T,R,b;q(t)?(T=!!t.spaceBefore,R=t.commentBefore,b=t.comment):(T=!1,R=null,b=null,t&&typeof t=="object"&&(t=o.createNode(t))),n.implicitKey=!1,!h&&!p&&F(t)&&(n.indentAtStart=y.length+1),m=!1,!u&&l.length>=2&&!n.inFlow&&!h&&at(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let $=!1,N=qt(t,n,()=>$=!0,()=>m=!0),D=" ";if(p||T||R){if(D=T?`
113
113
  `:"",R){let _=c(R);D+=`
114
- ${Ze(_,n.indent)}`}N===""&&!n.inFlow?D===`
114
+ ${et(_,n.indent)}`}N===""&&!n.inFlow?D===`
115
115
  `&&b&&(D=`
116
116
 
117
117
  `):D+=`
118
118
  ${n.indent}`}else if(!h&&W(t)){let _=N[0],A=N.indexOf(`
119
- `),Y=A!==-1,_e=n.inFlow??t.flow??t.items.length===0;if(Y||!_e){let w=!1;if(Y&&(_==="&"||_==="!")){let z=N.indexOf(" ");_==="&"&&z!==-1&&z<A&&N[z+1]==="!"&&(z=N.indexOf(" ",z+1)),(z===-1||A<z)&&(w=!0)}w||(D=`
119
+ `),z=A!==-1,Fe=n.inFlow??t.flow??t.items.length===0;if(z||!Fe){let w=!1;if(z&&(_==="&"||_==="!")){let K=N.indexOf(" ");_==="&"&&K!==-1&&K<A&&N[K+1]==="!"&&(K=N.indexOf(" ",K+1)),(K===-1||A<K)&&(w=!0)}w||(D=`
120
120
  ${n.indent}`)}}else(N===""||N[0]===`
121
- `)&&(D="");return y+=D+N,n.inFlow?$&&r&&r():b&&!$?y+=Ct(y,n.indent,c(b)):m&&s&&s(),y}function Ac(e,t){(e==="debug"||e==="warn")&&console.warn(t)}var Yi="<<",lt={identify:e=>e===Yi||typeof e=="symbol"&&e.description===Yi,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new O(Symbol(Yi)),{addToJSMap:Oc}),stringify:()=>Yi},bm=(e,t)=>(lt.identify(t)||x(t)&&(!t.type||t.type===O.PLAIN)&&lt.identify(t.value))&&e?.doc.schema.tags.some(n=>n.tag===lt.tag&&n.default);function Oc(e,t,n){let r=Rm(e,n);if(at(r))for(let s of r.items)Ec(e,t,s);else if(Array.isArray(r))for(let s of r)Ec(e,t,s);else Ec(e,t,r)}function Ec(e,t,n){let r=Rm(e,n);if(!ot(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 Rm(e,t){return e&&qe(t)?t.resolve(e.doc,e):t}function zi(e,t,{key:n,value:r}){if(q(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(bm(e,n))Oc(e,t,r);else{let s=fe(n,"",e);if(t instanceof Map)t.set(s,fe(r,s,e));else if(t instanceof Set)t.add(s);else{let i=uS(n,s,e),o=fe(r,i,e);i in t?Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0}):t[i]=o}}return t}function uS(e,t,n){if(t===null)return"";if(typeof t!="object")return String(t);if(q(e)&&n?.doc){let r=Hi(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 fr(e,t,n){let r=jt(e,void 0,n),s=jt(t,void 0,n);return new ie(r,s)}var ie=class e{constructor(t,n=null){Object.defineProperty(this,Ce,{value:Rc}),this.key=t,this.value=n}clone(t){let{key:n,value:r}=this;return q(n)&&(n=n.clone(t)),q(r)&&(r=r.clone(t)),new e(n,r)}toJSON(t,n){let r=n?.mapAsMap?new Map:{};return zi(n,r,this)}toString(t,n,r){return t?.doc?Tm(this,t,n,r):JSON.stringify(this)}};function Xi(e,t,n){return(t.inFlow??e.flow?fS:pS)(e,t,n)}function pS({comment:e,items:t},n,{blockItemPrefix:r,flowChars:s,itemIndent:i,onChompKeep:o,onComment:a}){let{indent:l,options:{commentString:c}}=n,d=Object.assign({},n,{indent:i,type:null}),u=!1,p=[];for(let f=0;f<t.length;++f){let m=t[f],y=null;if(q(m))!u&&m.spaceBefore&&p.push(""),Ji(n,p,m.commentBefore,u),m.comment&&(y=m.comment);else if(j(m)){let R=q(m.key)?m.key:null;R&&(!u&&R.spaceBefore&&p.push(""),Ji(n,p,R.commentBefore,u))}u=!1;let T=qt(m,d,()=>y=null,()=>u=!0);y&&(T+=Ct(T,i,c(y))),u&&y&&(u=!1),p.push(r+T)}let h;if(p.length===0)h=s.start+s.end;else{h=p[0];for(let f=1;f<p.length;++f){let m=p[f];h+=m?`
121
+ `)&&(D="");return y+=D+N,n.inFlow?$&&r&&r():b&&!$?y+=Ct(y,n.indent,c(b)):m&&s&&s(),y}function $c(e,t){(e==="debug"||e==="warn")&&console.warn(t)}var Xi="<<",lt={identify:e=>e===Xi||typeof e=="symbol"&&e.description===Xi,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new O(Symbol(Xi)),{addToJSMap:Dc}),stringify:()=>Xi},Sm=(e,t)=>(lt.identify(t)||F(t)&&(!t.type||t.type===O.PLAIN)&&lt.identify(t.value))&&e?.doc.schema.tags.some(n=>n.tag===lt.tag&&n.default);function Dc(e,t,n){let r=Im(e,n);if(at(r))for(let s of r.items)Nc(e,t,s);else if(Array.isArray(r))for(let s of r)Nc(e,t,s);else Nc(e,t,r)}function Nc(e,t,n){let r=Im(e,n);if(!ot(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 Im(e,t){return e&&Ue(t)?t.resolve(e.doc,e):t}function Qi(e,t,{key:n,value:r}){if(q(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(Sm(e,n))Dc(e,t,r);else{let s=fe(n,"",e);if(t instanceof Map)t.set(s,fe(r,s,e));else if(t instanceof Set)t.add(s);else{let i=kS(n,s,e),o=fe(r,i,e);i in t?Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0}):t[i]=o}}return t}function kS(e,t,n){if(t===null)return"";if(typeof t!="object")return String(t);if(q(e)&&n?.doc){let r=Ji(n.doc,{});r.anchors=new Set;for(let i of n.anchors.keys())r.anchors.add(i.anchor);r.inFlow=!0,r.inStringifyKey=!0;let s=e.toString(r);if(!n.mapKeyWarned){let i=JSON.stringify(s);i.length>40&&(i=i.substring(0,36)+'..."'),$c(n.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${i}. Set mapAsMap: true to use object keys.`),n.mapKeyWarned=!0}return s}return JSON.stringify(t)}function mr(e,t,n){let r=jt(e,void 0,n),s=jt(t,void 0,n);return new ie(r,s)}var ie=class e{constructor(t,n=null){Object.defineProperty(this,Ae,{value:Ic}),this.key=t,this.value=n}clone(t){let{key:n,value:r}=this;return q(n)&&(n=n.clone(t)),q(r)&&(r=r.clone(t)),new e(n,r)}toJSON(t,n){let r=n?.mapAsMap?new Map:{};return Qi(n,r,this)}toString(t,n,r){return t?.doc?Pm(this,t,n,r):JSON.stringify(this)}};function eo(e,t,n){return(t.inFlow??e.flow?bS:TS)(e,t,n)}function TS({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(q(m))!d&&m.spaceBefore&&p.push(""),Zi(n,p,m.commentBefore,d),m.comment&&(y=m.comment);else if(j(m)){let R=q(m.key)?m.key:null;R&&(!d&&R.spaceBefore&&p.push(""),Zi(n,p,R.commentBefore,d))}d=!1;let T=qt(m,u,()=>y=null,()=>d=!0);y&&(T+=Ct(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?`
122
122
  ${l}${m}`:`
123
123
  `}}return e?(h+=`
124
- `+Ze(c(e),l),a&&a()):u&&o&&o(),h}function fS({items:e},t,{flowChars:n,itemIndent:r}){let{indent:s,indentStep:i,flowCollectionPadding:o,options:{commentString:a}}=t;r+=i;let l=Object.assign({},t,{indent:r,inFlow:!0,type:null}),c=!1,d=0,u=[];for(let f=0;f<e.length;++f){let m=e[f],y=null;if(q(m))m.spaceBefore&&u.push(""),Ji(t,u,m.commentBefore,!1),m.comment&&(y=m.comment);else if(j(m)){let R=q(m.key)?m.key:null;R&&(R.spaceBefore&&u.push(""),Ji(t,u,R.commentBefore,!1),R.comment&&(c=!0));let b=q(m.value)?m.value:null;b?(b.comment&&(y=b.comment),b.commentBefore&&(c=!0)):m.value==null&&R?.comment&&(y=R.comment)}y&&(c=!0);let T=qt(m,l,()=>y=null);c||(c=u.length>d||T.includes(`
125
- `)),f<e.length-1?T+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=u.reduce((R,b)=>R+b.length+2,2)+(T.length+2)>t.options.lineWidth)),c&&(T+=",")),y&&(T+=Ct(T,r,a(y))),u.push(T),d=u.length}let{start:p,end:h}=n;if(u.length===0)return p+h;if(!c){let f=u.reduce((m,y)=>m+y.length+2,2);c=t.options.lineWidth>0&&f>t.options.lineWidth}if(c){let f=p;for(let m of u)f+=m?`
124
+ `+et(c(e),l),a&&a()):d&&o&&o(),h}function bS({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(q(m))m.spaceBefore&&d.push(""),Zi(t,d,m.commentBefore,!1),m.comment&&(y=m.comment);else if(j(m)){let R=q(m.key)?m.key:null;R&&(R.spaceBefore&&d.push(""),Zi(t,d,R.commentBefore,!1),R.comment&&(c=!0));let b=q(m.value)?m.value:null;b?(b.comment&&(y=b.comment),b.commentBefore&&(c=!0)):m.value==null&&R?.comment&&(y=R.comment)}y&&(c=!0);let T=qt(m,l,()=>y=null);c||(c=d.length>u||T.includes(`
125
+ `)),f<e.length-1?T+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=d.reduce((R,b)=>R+b.length+2,2)+(T.length+2)>t.options.lineWidth)),c&&(T+=",")),y&&(T+=Ct(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?`
126
126
  ${i}${s}${m}`:`
127
127
  `;return`${f}
128
- ${s}${h}`}else return`${p}${o}${u.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 on(e,t){let n=x(t)?t.value:t;for(let r of e)if(j(r)&&(r.key===t||r.key===n||x(r.key)&&r.key.value===n))return r}var ae=class extends dr{static get tagName(){return"tag:yaml.org,2002:map"}constructor(t){super(it,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(fr(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;j(t)?r=t:!t||typeof t!="object"||!("key"in t)?r=new ie(t,t?.value):r=new ie(t.key,t.value);let s=on(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);x(s.value)&&Bi(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=on(this.items,t);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(t,n){let s=on(this.items,t)?.value;return(!n&&x(s)?s.value:s)??void 0}has(t){return!!on(this.items,t)}set(t,n){this.add(new ie(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)zi(n,s,i);return s}toString(t,n,r){if(!t)return JSON.stringify(this);for(let s of this.items)if(!j(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})),Xi(this,t,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:t.indent||"",onChompKeep:r,onComment:n})}};var ct={collection:"map",default:!0,nodeClass:ae,tag:"tag:yaml.org,2002:map",resolve(e,t){return ot(e)||t("Expected a mapping for this tag"),e},createNode:(e,t,n)=>ae.from(e,t,n)};var Re=class extends dr{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(t){super(Lt,t),this.items=[]}add(t){this.items.push(t)}delete(t){let n=Qi(t);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(t,n){let r=Qi(t);if(typeof r!="number")return;let s=this.items[r];return!n&&x(s)?s.value:s}has(t){let n=Qi(t);return typeof n=="number"&&n<this.items.length}set(t,n){let r=Qi(t);if(typeof r!="number")throw new Error(`Expected a valid index, not ${t}.`);let s=this.items[r];x(s)&&Bi(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(fe(i,String(s++),n));return r}toString(t,n,r){return t?Xi(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(jt(a,void 0,r))}}return i}};function Qi(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 dt={collection:"seq",default:!0,nodeClass:Re,tag:"tag:yaml.org,2002:seq",resolve(e,t){return at(e)||t("Expected a sequence for this tag"),e},createNode:(e,t,n)=>Re.from(e,t,n)};var an={identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify(e,t,n,r){return t=Object.assign({actualString:!0},t),An(e,t,n,r)}};var En={identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new O(null),stringify:({source:e},t)=>typeof e=="string"&&En.test.test(e)?e:t.options.nullStr};var ps={identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:e=>new O(e[0]==="t"||e[0]==="T"),stringify({source:e,value:t},n){if(e&&ps.test.test(e)){let r=e[0]==="t"||e[0]==="T";if(t===r)return e}return t?n.options.trueStr:n.options.falseStr}};function Pe({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 Zi={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:Pe},eo={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():Pe(e)}},to={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:Pe};var no=e=>typeof e=="bigint"||Number.isInteger(e),$c=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function Pm(e,t,n){let{value:r}=e;return no(r)&&r>=0?n+r.toString(t):Pe(e)}var ro={identify:e=>no(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(e,t,n)=>$c(e,2,8,n),stringify:e=>Pm(e,8,"0o")},so={identify:no,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>$c(e,0,10,n),stringify:Pe},io={identify:e=>no(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>$c(e,2,16,n),stringify:e=>Pm(e,16,"0x")};var Sm=[ct,dt,an,En,ps,ro,so,io,Zi,eo,to];function Im(e){return typeof e=="bigint"||Number.isInteger(e)}var oo=({value:e})=>JSON.stringify(e),mS=[{identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify:oo},{identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:oo},{identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:e=>e==="true",stringify:oo},{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:oo}],hS={default:!0,tag:"",test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}},vm=[ct,dt].concat(mS,hS);var fs={identify:e=>e instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(e,t){if(typeof atob=="function"){let n=atob(e.replace(/[\n\r]/g,"")),r=new Uint8Array(n.length);for(let s=0;s<n.length;++s)r[s]=n.charCodeAt(s);return r}else return t("This environment does not support reading binary tags; either Buffer or atob is required"),e},stringify({comment:e,type:t,value:n},r,s,i){if(!n)return"";let o=n,a;if(typeof btoa=="function"){let l="";for(let c=0;c<o.length;++c)l+=String.fromCharCode(o[c]);a=btoa(l)}else throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required");if(t??(t=O.BLOCK_LITERAL),t!==O.QUOTE_DOUBLE){let l=Math.max(r.options.lineWidth-r.indent.length,r.options.minContentWidth),c=Math.ceil(a.length/l),d=new Array(c);for(let u=0,p=0;u<c;++u,p+=l)d[u]=a.substr(p,l);a=d.join(t===O.BLOCK_LITERAL?`
129
- `:" ")}return An({comment:e,type:t,value:a},r,s,i)}};function Nc(e,t){if(at(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!j(r)){if(ot(r)){r.items.length>1&&t("Each pair must have its own sequence indicator");let s=r.items[0]||new ie(new O(null));if(r.commentBefore&&(s.key.commentBefore=s.key.commentBefore?`${r.commentBefore}
128
+ ${s}${h}`}else return`${p}${o}${d.join(" ")}${o}${h}`}function Zi({indent:e,options:{commentString:t}},n,r,s){if(r&&s&&(r=r.replace(/^\n+/,"")),r){let i=et(t(r),e);n.push(i.trimStart())}}function on(e,t){let n=F(t)?t.value:t;for(let r of e)if(j(r)&&(r.key===t||r.key===n||F(r.key)&&r.key.value===n))return r}var ae=class extends ur{static get tagName(){return"tag:yaml.org,2002:map"}constructor(t){super(it,t),this.items=[]}static from(t,n,r){let{keepUndefined:s,replacer:i}=r,o=new this(t),a=(l,c)=>{if(typeof i=="function")c=i.call(n,l,c);else if(Array.isArray(i)&&!i.includes(l))return;(c!==void 0||s)&&o.items.push(mr(l,c,r))};if(n instanceof Map)for(let[l,c]of n)a(l,c);else if(n&&typeof n=="object")for(let l of Object.keys(n))a(l,n[l]);return typeof t.sortMapEntries=="function"&&o.items.sort(t.sortMapEntries),o}add(t,n){let r;j(t)?r=t:!t||typeof t!="object"||!("key"in t)?r=new ie(t,t?.value):r=new ie(t.key,t.value);let s=on(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);F(s.value)&&Ki(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=on(this.items,t);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(t,n){let s=on(this.items,t)?.value;return(!n&&F(s)?s.value:s)??void 0}has(t){return!!on(this.items,t)}set(t,n){this.add(new ie(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)Qi(n,s,i);return s}toString(t,n,r){if(!t)return JSON.stringify(this);for(let s of this.items)if(!j(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})),eo(this,t,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:t.indent||"",onChompKeep:r,onComment:n})}};var ct={collection:"map",default:!0,nodeClass:ae,tag:"tag:yaml.org,2002:map",resolve(e,t){return ot(e)||t("Expected a mapping for this tag"),e},createNode:(e,t,n)=>ae.from(e,t,n)};var Re=class extends ur{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(t){super(Lt,t),this.items=[]}add(t){this.items.push(t)}delete(t){let n=to(t);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(t,n){let r=to(t);if(typeof r!="number")return;let s=this.items[r];return!n&&F(s)?s.value:s}has(t){let n=to(t);return typeof n=="number"&&n<this.items.length}set(t,n){let r=to(t);if(typeof r!="number")throw new Error(`Expected a valid index, not ${t}.`);let s=this.items[r];F(s)&&Ki(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(fe(i,String(s++),n));return r}toString(t,n,r){return t?eo(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(jt(a,void 0,r))}}return i}};function to(e){let t=F(e)?e.value:e;return t&&typeof t=="string"&&(t=Number(t)),typeof t=="number"&&Number.isInteger(t)&&t>=0?t:null}var dt={collection:"seq",default:!0,nodeClass:Re,tag:"tag:yaml.org,2002:seq",resolve(e,t){return at(e)||t("Expected a sequence for this tag"),e},createNode:(e,t,n)=>Re.from(e,t,n)};var an={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 hs={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&&hs.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 Pe({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 no={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:Pe},ro={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():Pe(e)}},so={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:Pe};var io=e=>typeof e=="bigint"||Number.isInteger(e),_c=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function vm(e,t,n){let{value:r}=e;return io(r)&&r>=0?n+r.toString(t):Pe(e)}var oo={identify:e=>io(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(e,t,n)=>_c(e,2,8,n),stringify:e=>vm(e,8,"0o")},ao={identify:io,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>_c(e,0,10,n),stringify:Pe},lo={identify:e=>io(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>_c(e,2,16,n),stringify:e=>vm(e,16,"0x")};var Cm=[ct,dt,an,En,hs,oo,ao,lo,no,ro,so];function Am(e){return typeof e=="bigint"||Number.isInteger(e)}var co=({value:e})=>JSON.stringify(e),RS=[{identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify:co},{identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:co},{identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:e=>e==="true",stringify:co},{identify:Am,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})=>Am(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:co}],PS={default:!0,tag:"",test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}},Em=[ct,dt].concat(RS,PS);var gs={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?`
129
+ `:" ")}return An({comment:e,type:t,value:a},r,s,i)}};function Fc(e,t){if(at(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!j(r)){if(ot(r)){r.items.length>1&&t("Each pair must have its own sequence indicator");let s=r.items[0]||new ie(new O(null));if(r.commentBefore&&(s.key.commentBefore=s.key.commentBefore?`${r.commentBefore}
130
130
  ${s.key.commentBefore}`:r.commentBefore),r.comment){let i=s.value??s.key;i.comment=i.comment?`${r.comment}
131
- ${i.comment}`:r.comment}r=s}e.items[n]=j(r)?r:new ie(r)}}else t("Expected a sequence for this tag");return e}function Dc(e,t,n){let{replacer:r}=n,s=new Re(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(fr(a,l,n))}return s}var ms={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:Nc,createNode:Dc};var mr=class e extends Re{constructor(){super(),this.add=ae.prototype.add.bind(this),this.delete=ae.prototype.delete.bind(this),this.get=ae.prototype.get.bind(this),this.has=ae.prototype.has.bind(this),this.set=ae.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(j(s)?(i=fe(s.key,"",n),o=fe(s.value,i,n)):i=fe(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=Dc(t,n,r),i=new this;return i.items=s.items,i}};mr.tag="tag:yaml.org,2002:omap";var hs={collection:"seq",identify:e=>e instanceof Map,nodeClass:mr,default:!1,tag:"tag:yaml.org,2002:omap",resolve(e,t){let n=Nc(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 mr,n)},createNode:(e,t,n)=>mr.from(e,t,n)};function Cm({value:e,source:t},n){return t&&(e?_c:xc).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}var _c={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:Cm},xc={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:Cm};var Am={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:Pe},Em={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():Pe(e)}},Om={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:Pe};var gs=e=>typeof e=="bigint"||Number.isInteger(e);function ao(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 Fc(e,t,n){let{value:r}=e;if(gs(r)){let s=r.toString(t);return r<0?"-"+n+s.substr(1):n+s}return Pe(e)}var $m={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>ao(e,2,2,n),stringify:e=>Fc(e,2,"0b")},Nm={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>ao(e,1,8,n),stringify:e=>Fc(e,8,"0")},Dm={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>ao(e,0,10,n),stringify:Pe},_m={identify:gs,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>ao(e,2,16,n),stringify:e=>Fc(e,16,"0x")};var hr=class e extends ae{constructor(t){super(t),this.tag=e.tag}add(t){let n;j(t)?n=t:t&&typeof t=="object"&&"key"in t&&"value"in t&&t.value===null?n=new ie(t.key,null):n=new ie(t,null),on(this.items,n.key)||this.items.push(n)}get(t,n){let r=on(this.items,t);return!n&&j(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=on(this.items,t);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new ie(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(fr(o,null,r));return i}};hr.tag="tag:yaml.org,2002:set";var ys={collection:"map",identify:e=>e instanceof Set,nodeClass:hr,default:!1,tag:"tag:yaml.org,2002:set",createNode:(e,t,n)=>hr.from(e,t,n),resolve(e,t){if(ot(e)){if(e.hasAllNullValues(!0))return Object.assign(new hr,e);t("Set items must all have null values")}else t("Expected a mapping for this tag");return e}};function Lc(e,t){let n=e[0],r=n==="-"||n==="+"?e.substring(1):e,s=o=>t?BigInt(o):Number(o),i=r.replace(/_/g,"").split(":").reduce((o,a)=>o*s(60)+s(a),s(0));return n==="-"?s(-1)*i:i}function xm(e){let{value:t}=e,n=o=>o;if(typeof t=="bigint")n=o=>BigInt(o);else if(isNaN(t)||!isFinite(t))return Pe(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 lo={identify:e=>typeof e=="bigint"||Number.isInteger(e),default:!0,tag:"tag:yaml.org,2002:int",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:(e,t,{intAsBigInt:n})=>Lc(e,n),stringify:xm},co={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,resolve:e=>Lc(e,!1),stringify:xm},gr={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(gr.test);if(!t)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,n,r,s,i,o,a]=t.map(Number),l=t[7]?Number((t[7]+"00").substr(1,3)):0,c=Date.UTC(n,r-1,s,i||0,o||0,a||0,l),d=t[8];if(d&&d!=="Z"){let u=Lc(d,!1);Math.abs(u)<30&&(u*=60),c-=6e4*u}return new Date(c)},stringify:({value:e})=>e?.toISOString().replace(/(T00:00:00)?\.000Z$/,"")??""};var Mc=[ct,dt,an,En,_c,xc,$m,Nm,Dm,_m,Am,Em,Om,fs,lt,hs,ms,ys,lo,co,gr];var Fm=new Map([["core",Sm],["failsafe",[ct,dt,an]],["json",vm],["yaml11",Mc],["yaml-1.1",Mc]]),Lm={binary:fs,bool:ps,float:to,floatExp:eo,floatNaN:Zi,floatTime:co,int:so,intHex:io,intOct:ro,intTime:lo,map:ct,merge:lt,null:En,omap:hs,pairs:ms,seq:dt,set:ys,timestamp:gr},Mm={"tag:yaml.org,2002:binary":fs,"tag:yaml.org,2002:merge":lt,"tag:yaml.org,2002:omap":hs,"tag:yaml.org,2002:pairs":ms,"tag:yaml.org,2002:set":ys,"tag:yaml.org,2002:timestamp":gr};function uo(e,t,n){let r=Fm.get(t);if(r&&!e)return n&&!r.includes(lt)?r.concat(lt):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(lt)),s.reduce((i,o)=>{let a=typeof o=="string"?Lm[o]:o;if(!a){let l=JSON.stringify(o),c=Object.keys(Lm).map(d=>JSON.stringify(d)).join(", ");throw new Error(`Unknown custom tag ${l}; use one of ${c}`)}return i.includes(a)||i.push(a),i},[])}var gS=(e,t)=>e.key<t.key?-1:e.key>t.key?1:0,ws=class e{constructor({compat:t,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(t)?uo(t,"compat"):t?uo(null,t):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?Mm:{},this.tags=uo(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,it,{value:ct}),Object.defineProperty(this,je,{value:an}),Object.defineProperty(this,Lt,{value:dt}),this.sortMapEntries=typeof o=="function"?o:o===!0?gS:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function jm(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=Hi(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(q(e.contents)){if(e.contents.spaceBefore&&r&&n.push(""),e.contents.commentBefore){let d=i(e.contents.commentBefore);n.push(Ze(d,""))}s.forceBlockIndent=!!e.comment,a=e.contents.comment}let l=a?void 0:()=>o=!0,c=qt(e.contents,s,()=>a=null,l);a&&(c+=Ct(c,"",i(a))),(c[0]==="|"||c[0]===">")&&n[n.length-1]==="---"?n[n.length-1]=`--- ${c}`:n.push(c)}else n.push(qt(e.contents,s));if(e.directives?.docEnd)if(e.comment){let l=i(e.comment);l.includes(`
132
- `)?(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(`
131
+ ${i.comment}`:r.comment}r=s}e.items[n]=j(r)?r:new ie(r)}}else t("Expected a sequence for this tag");return e}function xc(e,t,n){let{replacer:r}=n,s=new Re(e);s.tag="tag:yaml.org,2002:pairs";let i=0;if(t&&Symbol.iterator in Object(t))for(let o of t){typeof r=="function"&&(o=r.call(t,String(i++),o));let a,l;if(Array.isArray(o))if(o.length===2)a=o[0],l=o[1];else throw new TypeError(`Expected [key, value] tuple: ${o}`);else if(o&&o instanceof Object){let c=Object.keys(o);if(c.length===1)a=c[0],l=o[a];else throw new TypeError(`Expected tuple with one key, not ${c.length} keys`)}else a=o;s.items.push(mr(a,l,n))}return s}var ys={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:Fc,createNode:xc};var hr=class e extends Re{constructor(){super(),this.add=ae.prototype.add.bind(this),this.delete=ae.prototype.delete.bind(this),this.get=ae.prototype.get.bind(this),this.has=ae.prototype.has.bind(this),this.set=ae.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(j(s)?(i=fe(s.key,"",n),o=fe(s.value,i,n)):i=fe(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=xc(t,n,r),i=new this;return i.items=s.items,i}};hr.tag="tag:yaml.org,2002:omap";var ws={collection:"seq",identify:e=>e instanceof Map,nodeClass:hr,default:!1,tag:"tag:yaml.org,2002:omap",resolve(e,t){let n=Fc(e,t),r=[];for(let{key:s}of n.items)F(s)&&(r.includes(s.value)?t(`Ordered maps must not include duplicate keys: ${s.value}`):r.push(s.value));return Object.assign(new hr,n)},createNode:(e,t,n)=>hr.from(e,t,n)};function Om({value:e,source:t},n){return t&&(e?Lc:Mc).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}var Lc={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:Om},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:Om};var $m={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:Pe},Nm={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:e=>parseFloat(e.replace(/_/g,"")),stringify(e){let t=Number(e.value);return isFinite(t)?t.toExponential():Pe(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:Pe};var ks=e=>typeof e=="bigint"||Number.isInteger(e);function uo(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 jc(e,t,n){let{value:r}=e;if(ks(r)){let s=r.toString(t);return r<0?"-"+n+s.substr(1):n+s}return Pe(e)}var _m={identify:ks,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>uo(e,2,2,n),stringify:e=>jc(e,2,"0b")},Fm={identify:ks,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>uo(e,1,8,n),stringify:e=>jc(e,8,"0")},xm={identify:ks,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>uo(e,0,10,n),stringify:Pe},Lm={identify:ks,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>uo(e,2,16,n),stringify:e=>jc(e,16,"0x")};var gr=class e extends ae{constructor(t){super(t),this.tag=e.tag}add(t){let n;j(t)?n=t:t&&typeof t=="object"&&"key"in t&&"value"in t&&t.value===null?n=new ie(t.key,null):n=new ie(t,null),on(this.items,n.key)||this.items.push(n)}get(t,n){let r=on(this.items,t);return!n&&j(r)?F(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=on(this.items,t);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new ie(t))}toJSON(t,n){return super.toJSON(t,n,Set)}toString(t,n,r){if(!t)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},t,{allNullValues:!0}),n,r);throw new Error("Set items must all have null values")}static from(t,n,r){let{replacer:s}=r,i=new this(t);if(n&&Symbol.iterator in Object(n))for(let o of n)typeof s=="function"&&(o=s.call(n,o,o)),i.items.push(mr(o,null,r));return i}};gr.tag="tag:yaml.org,2002:set";var Ts={collection:"map",identify:e=>e instanceof Set,nodeClass:gr,default:!1,tag:"tag:yaml.org,2002:set",createNode:(e,t,n)=>gr.from(e,t,n),resolve(e,t){if(ot(e)){if(e.hasAllNullValues(!0))return Object.assign(new gr,e);t("Set items must all have null values")}else t("Expected a mapping for this tag");return e}};function qc(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 Mm(e){let{value:t}=e,n=o=>o;if(typeof t=="bigint")n=o=>BigInt(o);else if(isNaN(t)||!isFinite(t))return Pe(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 po={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})=>qc(e,n),stringify:Mm},fo={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=>qc(e,!1),stringify:Mm},yr={identify:e=>e instanceof Date,default:!0,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(e){let t=e.match(yr.test);if(!t)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,n,r,s,i,o,a]=t.map(Number),l=t[7]?Number((t[7]+"00").substr(1,3)):0,c=Date.UTC(n,r-1,s,i||0,o||0,a||0,l),u=t[8];if(u&&u!=="Z"){let d=qc(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 Uc=[ct,dt,an,En,Lc,Mc,_m,Fm,xm,Lm,$m,Nm,Dm,gs,lt,ws,ys,Ts,po,fo,yr];var jm=new Map([["core",Cm],["failsafe",[ct,dt,an]],["json",Em],["yaml11",Uc],["yaml-1.1",Uc]]),qm={binary:gs,bool:hs,float:so,floatExp:ro,floatNaN:no,floatTime:fo,int:ao,intHex:lo,intOct:oo,intTime:po,map:ct,merge:lt,null:En,omap:ws,pairs:ys,seq:dt,set:Ts,timestamp:yr},Um={"tag:yaml.org,2002:binary":gs,"tag:yaml.org,2002:merge":lt,"tag:yaml.org,2002:omap":ws,"tag:yaml.org,2002:pairs":ys,"tag:yaml.org,2002:set":Ts,"tag:yaml.org,2002:timestamp":yr};function mo(e,t,n){let r=jm.get(t);if(r&&!e)return n&&!r.includes(lt)?r.concat(lt):r.slice();let s=r;if(!s)if(Array.isArray(e))s=[];else{let i=Array.from(jm.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(lt)),s.reduce((i,o)=>{let a=typeof o=="string"?qm[o]:o;if(!a){let l=JSON.stringify(o),c=Object.keys(qm).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 SS=(e,t)=>e.key<t.key?-1:e.key>t.key?1:0,bs=class e{constructor({compat:t,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(t)?mo(t,"compat"):t?mo(null,t):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?Um:{},this.tags=mo(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,it,{value:ct}),Object.defineProperty(this,qe,{value:an}),Object.defineProperty(this,Lt,{value:dt}),this.sortMapEntries=typeof o=="function"?o:o===!0?SS:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function Bm(e,t){let n=[],r=t.directives===!0;if(t.directives!==!1&&e.directives){let l=e.directives.toString(e);l?(n.push(l),r=!0):e.directives.docStart&&(r=!0)}r&&n.push("---");let s=Ji(e,t),{commentString:i}=s.options;if(e.commentBefore){n.length!==1&&n.unshift("");let l=i(e.commentBefore);n.unshift(et(l,""))}let o=!1,a=null;if(e.contents){if(q(e.contents)){if(e.contents.spaceBefore&&r&&n.push(""),e.contents.commentBefore){let u=i(e.contents.commentBefore);n.push(et(u,""))}s.forceBlockIndent=!!e.comment,a=e.contents.comment}let l=a?void 0:()=>o=!0,c=qt(e.contents,s,()=>a=null,l);a&&(c+=Ct(c,"",i(a))),(c[0]==="|"||c[0]===">")&&n[n.length-1]==="---"?n[n.length-1]=`--- ${c}`:n.push(c)}else n.push(qt(e.contents,s));if(e.directives?.docEnd)if(e.comment){let l=i(e.comment);l.includes(`
132
+ `)?(n.push("..."),n.push(et(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(et(i(l),"")))}return n.join(`
133
133
  `)+`
134
- `}var ln=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,Ce,{value:Li});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 vt({version:o}),this.setSchema(o,r),this.contents=t===void 0?null:this.createNode(t,s,r)}clone(){let t=Object.create(e.prototype,{[Ce]:{value:Li}});return t.commentBefore=this.commentBefore,t.comment=this.comment,t.errors=this.errors.slice(),t.warnings=this.warnings.slice(),t.options=Object.assign({},this.options),this.directives&&(t.directives=this.directives.clone()),t.schema=this.schema.clone(),t.contents=q(this.contents)?this.contents.clone(t.schema):this.contents,this.range&&(t.range=this.range.slice()),t}add(t){yr(this.contents)&&this.contents.add(t)}addIn(t,n){yr(this.contents)&&this.contents.addIn(t,n)}createAlias(t,n){if(!t.anchor){let r=Pc(this);t.anchor=!n||r.has(n)?Sc(n||"a",r):n}return new Mt(t.anchor)}createNode(t,n,r){let s;if(typeof n=="function")t=n.call({"":t},"",t),s=n;else if(Array.isArray(n)){let y=R=>typeof R=="number"||R instanceof String||R instanceof Number,T=n.filter(y).map(String);T.length>0&&(n=n.concat(T)),s=n}else r===void 0&&n&&(r=n,n=void 0);let{aliasDuplicateObjects:i,anchorPrefix:o,flow:a,keepUndefined:l,onTagObj:c,tag:d}=r??{},{onAnchor:u,setAnchors:p,sourceObjects:h}=ym(this,o||"a"),f={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:u,onTagObj:c,replacer:s,schema:this.schema,sourceObjects:h},m=jt(t,d,f);return a&&W(m)&&(m.flow=!0),p(),m}createPair(t,n,r={}){let s=this.createNode(t,null,r),i=this.createNode(n,null,r);return new ie(s,i)}delete(t){return yr(this.contents)?this.contents.delete(t):!1}deleteIn(t){return ur(t)?this.contents==null?!1:(this.contents=null,!0):yr(this.contents)?this.contents.deleteIn(t):!1}get(t,n){return W(this.contents)?this.contents.get(t,n):void 0}getIn(t,n){return ur(t)?!n&&x(this.contents)?this.contents.value:this.contents:W(this.contents)?this.contents.getIn(t,n):void 0}has(t){return W(this.contents)?this.contents.has(t):!1}hasIn(t){return ur(t)?this.contents!==void 0:W(this.contents)?this.contents.hasIn(t):!1}set(t,n){this.contents==null?this.contents=ls(this.schema,[t],n):yr(this.contents)&&this.contents.set(t,n)}setIn(t,n){ur(t)?this.contents=n:this.contents==null?this.contents=ls(this.schema,Array.from(t),n):yr(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 vt({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 vt({version:t}),r={resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,r=null;break;default:{let s=JSON.stringify(t);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${s}`)}}if(n.schema instanceof Object)this.schema=n.schema;else if(r)this.schema=new ws(Object.assign(r,n));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:t,jsonArg:n,mapAsMap:r,maxAliasCount:s,onAnchor:i,reviver:o}={}){let a={anchors:new Map,doc:this,keep:!t,mapAsMap:r===!0,mapKeyWarned:!1,maxAliasCount:typeof s=="number"?s:100},l=fe(this.contents,n??"",a);if(typeof i=="function")for(let{count:c,res:d}of a.anchors.values())i(d,c);return typeof o=="function"?rn(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 jm(this,t)}};function yr(e){if(W(e))return!0;throw new Error("Expected a YAML collection as document contents")}var ks=class extends Error{constructor(t,n,r,s){super(),this.name=t,this.code=r,this.message=s,this.pos=n}},ut=class extends ks{constructor(t,n,r){super("YAMLParseError",t,n,r)}},Ts=class extends ks{constructor(t,n,r){super("YAMLWarning",t,n,r)}},jc=(e,t)=>n=>{if(n.pos[0]===-1)return;n.linePos=n.pos.map(a=>t.linePos(a));let{line:r,col:s}=n.linePos[0];n.message+=` at line ${r}, column ${s}`;let i=s-1,o=e.substring(t.lineStarts[r-1],t.lineStarts[r]).replace(/[\n\r]+$/,"");if(i>=60&&o.length>80){let a=Math.min(i-39,o.length-79);o="\u2026"+o.substring(a),i-=a-1}if(o.length>80&&(o=o.substring(0,79)+"\u2026"),r>1&&/^ *$/.test(o.substring(0,i))){let a=e.substring(t.lineStarts[r-2],t.lineStarts[r-1]);a.length>80&&(a=a.substring(0,79)+`\u2026
134
+ `}var ln=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,Ae,{value:qi});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 vt({version:o}),this.setSchema(o,r),this.contents=t===void 0?null:this.createNode(t,s,r)}clone(){let t=Object.create(e.prototype,{[Ae]:{value:qi}});return t.commentBefore=this.commentBefore,t.comment=this.comment,t.errors=this.errors.slice(),t.warnings=this.warnings.slice(),t.options=Object.assign({},this.options),this.directives&&(t.directives=this.directives.clone()),t.schema=this.schema.clone(),t.contents=q(this.contents)?this.contents.clone(t.schema):this.contents,this.range&&(t.range=this.range.slice()),t}add(t){wr(this.contents)&&this.contents.add(t)}addIn(t,n){wr(this.contents)&&this.contents.addIn(t,n)}createAlias(t,n){if(!t.anchor){let r=vc(this);t.anchor=!n||r.has(n)?Cc(n||"a",r):n}return new Mt(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}=Tm(this,o||"a"),f={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:d,onTagObj:c,replacer:s,schema:this.schema,sourceObjects:h},m=jt(t,u,f);return a&&W(m)&&(m.flow=!0),p(),m}createPair(t,n,r={}){let s=this.createNode(t,null,r),i=this.createNode(n,null,r);return new ie(s,i)}delete(t){return wr(this.contents)?this.contents.delete(t):!1}deleteIn(t){return pr(t)?this.contents==null?!1:(this.contents=null,!0):wr(this.contents)?this.contents.deleteIn(t):!1}get(t,n){return W(this.contents)?this.contents.get(t,n):void 0}getIn(t,n){return pr(t)?!n&&F(this.contents)?this.contents.value:this.contents:W(this.contents)?this.contents.getIn(t,n):void 0}has(t){return W(this.contents)?this.contents.has(t):!1}hasIn(t){return pr(t)?this.contents!==void 0:W(this.contents)?this.contents.hasIn(t):!1}set(t,n){this.contents==null?this.contents=us(this.schema,[t],n):wr(this.contents)&&this.contents.set(t,n)}setIn(t,n){pr(t)?this.contents=n:this.contents==null?this.contents=us(this.schema,Array.from(t),n):wr(this.contents)&&this.contents.setIn(t,n)}setSchema(t,n={}){typeof t=="number"&&(t=String(t));let r;switch(t){case"1.1":this.directives?this.directives.yaml.version="1.1":this.directives=new vt({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 vt({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 bs(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=fe(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"?rn(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 Bm(this,t)}};function wr(e){if(W(e))return!0;throw new Error("Expected a YAML collection as document contents")}var Rs=class extends Error{constructor(t,n,r,s){super(),this.name=t,this.code=r,this.message=s,this.pos=n}},ut=class extends Rs{constructor(t,n,r){super("YAMLParseError",t,n,r)}},Ps=class extends Rs{constructor(t,n,r){super("YAMLWarning",t,n,r)}},Bc=(e,t)=>n=>{if(n.pos[0]===-1)return;n.linePos=n.pos.map(a=>t.linePos(a));let{line:r,col:s}=n.linePos[0];n.message+=` at line ${r}, column ${s}`;let i=s-1,o=e.substring(t.lineStarts[r-1],t.lineStarts[r]).replace(/[\n\r]+$/,"");if(i>=60&&o.length>80){let a=Math.min(i-39,o.length-79);o="\u2026"+o.substring(a),i-=a-1}if(o.length>80&&(o=o.substring(0,79)+"\u2026"),r>1&&/^ *$/.test(o.substring(0,i))){let a=e.substring(t.lineStarts[r-2],t.lineStarts[r-1]);a.length>80&&(a=a.substring(0,79)+`\u2026
135
135
  `),o=a+o}if(/[^ ]/.test(o)){let a=1,l=n.linePos[1];l?.line===r&&l.col>s&&(a=Math.max(1,Math.min(l.col-s,80-i)));let c=" ".repeat(i)+"^".repeat(a);n.message+=`:
136
136
 
137
137
  ${o}
138
138
  ${c}
139
- `}};function At(e,{flow:t,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let l=!1,c=a,d=a,u="",p="",h=!1,f=!1,m=null,y=null,T=null,R=null,b=null,$=null,N=null;for(let A of e)switch(f&&(A.type!=="space"&&A.type!=="newline"&&A.type!=="comma"&&i(A.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),f=!1),m&&(c&&A.type!=="comment"&&A.type!=="newline"&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),m=null),A.type){case"space":!t&&(n!=="doc-start"||r?.type!=="flow-collection")&&A.source.includes(" ")&&(m=A),d=!0;break;case"comment":{d||i(A,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let Y=A.source.substring(1)||" ";u?u+=p+Y:u=Y,p="",c=!1;break}case"newline":c?u?u+=A.source:(!$||n!=="seq-item-ind")&&(l=!0):p+=A.source,c=!0,h=!0,(y||T)&&(R=A),d=!0;break;case"anchor":y&&i(A,"MULTIPLE_ANCHORS","A node can have at most one anchor"),A.source.endsWith(":")&&i(A.offset+A.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),y=A,N??(N=A.offset),c=!1,d=!1,f=!0;break;case"tag":{T&&i(A,"MULTIPLE_TAGS","A node can have at most one tag"),T=A,N??(N=A.offset),c=!1,d=!1,f=!0;break}case n:(y||T)&&i(A,"BAD_PROP_ORDER",`Anchors and tags must be after the ${A.source} indicator`),$&&i(A,"UNEXPECTED_TOKEN",`Unexpected ${A.source} in ${t??"collection"}`),$=A,c=n==="seq-item-ind"||n==="explicit-key-ind",d=!1;break;case"comma":if(t){b&&i(A,"UNEXPECTED_TOKEN",`Unexpected , in ${t}`),b=A,c=!1,d=!1;break}default:i(A,"UNEXPECTED_TOKEN",`Unexpected ${A.type} token`),c=!1,d=!1}let D=e[e.length-1],_=D?D.offset+D.source.length:s;return f&&r&&r.type!=="space"&&r.type!=="newline"&&r.type!=="comma"&&(r.type!=="scalar"||r.source!=="")&&i(r.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),m&&(c&&m.indent<=o||r?.type==="block-map"||r?.type==="block-seq")&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:b,found:$,spaceBefore:l,comment:u,hasNewline:h,anchor:y,tag:T,newlineAfterProp:R,end:_,start:N??_}}function cn(e){if(!e)return null;switch(e.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(e.source.includes(`
140
- `))return!0;if(e.end){for(let t of e.end)if(t.type==="newline")return!0}return!1;case"flow-collection":for(let t of e.items){for(let n of t.start)if(n.type==="newline")return!0;if(t.sep){for(let n of t.sep)if(n.type==="newline")return!0}if(cn(t.key)||cn(t.value))return!0}return!1;default:return!0}}function bs(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&cn(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function po(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 qm="All mapping items must start at the same column";function Um({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??ae,a=new o(n.schema);n.atRoot&&(n.atRoot=!1);let l=r.offset,c=null;for(let d of r.items){let{start:u,key:p,sep:h,value:f}=d,m=At(u,{indicator:"explicit-key-ind",next:p??h?.[0],offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0}),y=!m.found;if(y){if(p&&(p.type==="block-seq"?s(l,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in p&&p.indent!==r.indent&&s(l,"BAD_INDENT",qm)),!m.anchor&&!m.tag&&!h){c=m.end,m.comment&&(a.comment?a.comment+=`
141
- `+m.comment:a.comment=m.comment);continue}(m.newlineAfterProp||cn(p))&&s(p??u[u.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else m.found?.indent!==r.indent&&s(l,"BAD_INDENT",qm);n.atKey=!0;let T=m.end,R=p?e(n,p,m,s):t(n,T,u,null,m,s);n.schema.compat&&bs(r.indent,p,s),n.atKey=!1,po(n,a.items,R)&&s(T,"DUPLICATE_KEY","Map keys must be unique");let b=At(h??[],{indicator:"map-value-ind",next:f,offset:R.range[2],onError:s,parentIndent:r.indent,startOnNewline:!p||p.type==="block-scalar"});if(l=b.end,b.found){y&&(f?.type==="block-map"&&!b.hasNewline&&s(l,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),n.options.strict&&m.start<b.found.offset-1024&&s(R.range,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit block mapping key"));let $=f?e(n,f,b,s):t(n,l,h,null,b,s);n.schema.compat&&bs(r.indent,f,s),l=$.range[2];let N=new ie(R,$);n.options.keepSourceTokens&&(N.srcToken=d),a.items.push(N)}else{y&&s(R.range,"MISSING_CHAR","Implicit map keys need to be followed by map values"),b.comment&&(R.comment?R.comment+=`
142
- `+b.comment:R.comment=b.comment);let $=new ie(R);n.options.keepSourceTokens&&($.srcToken=d),a.items.push($)}}return c&&c<l&&s(c,"IMPOSSIBLE","Map comment with trailing content"),a.range=[r.offset,l,c??l],a}function Bm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??Re,a=new o(n.schema);n.atRoot&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let l=r.offset,c=null;for(let{start:d,value:u}of r.items){let p=At(d,{indicator:"seq-item-ind",next:u,offset:l,onError:s,parentIndent:r.indent,startOnNewline:!0});if(!p.found)if(p.anchor||p.tag||u)u?.type==="block-seq"?s(p.end,"BAD_INDENT","All sequence items must start at the same column"):s(l,"MISSING_CHAR","Sequence item without - indicator");else{c=p.end,p.comment&&(a.comment=p.comment);continue}let h=u?e(n,u,p,s):t(n,p.end,d,null,p,s);n.schema.compat&&bs(r.indent,u,s),l=h.range[2],a.items.push(h)}return a.range=[r.offset,l,c??l],a}function Et(e,t,n,r){let s="";if(e){let i=!1,o="";for(let a of e){let{source:l,type:c}=a;switch(c){case"space":i=!0;break;case"comment":{n&&!i&&r(a,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let d=l.substring(1)||" ";s?s+=o+d:s=d,o="";break}case"newline":s&&(o+=l),i=!0;break;default:r(a,"UNEXPECTED_TOKEN",`Unexpected ${c} at node end`)}t+=l.length}}return{comment:s,offset:t}}var qc="Block collections are not allowed within flow collections",Uc=e=>e&&(e.type==="block-map"||e.type==="block-seq");function Wm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",l=i?.nodeClass??(o?ae:Re),c=new l(n.schema);c.flow=!0;let d=n.atRoot;d&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let u=r.offset+r.start.source.length;for(let y=0;y<r.items.length;++y){let T=r.items[y],{start:R,key:b,sep:$,value:N}=T,D=At(R,{flow:a,indicator:"explicit-key-ind",next:b??$?.[0],offset:u,onError:s,parentIndent:r.indent,startOnNewline:!1});if(!D.found){if(!D.anchor&&!D.tag&&!$&&!N){y===0&&D.comma?s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`):y<r.items.length-1&&s(D.start,"UNEXPECTED_TOKEN",`Unexpected empty item in ${a}`),D.comment&&(c.comment?c.comment+=`
143
- `+D.comment:c.comment=D.comment),u=D.end;continue}!o&&n.options.strict&&cn(b)&&s(b,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line")}if(y===0)D.comma&&s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`);else if(D.comma||s(D.start,"MISSING_CHAR",`Missing , between ${a} items`),D.comment){let _="";e:for(let A of R)switch(A.type){case"comma":case"space":break;case"comment":_=A.source.substring(1);break e;default:break e}if(_){let A=c.items[c.items.length-1];j(A)&&(A=A.value??A.key),A.comment?A.comment+=`
144
- `+_:A.comment=_,D.comment=D.comment.substring(_.length+1)}}if(!o&&!$&&!D.found){let _=N?e(n,N,D,s):t(n,D.end,$,null,D,s);c.items.push(_),u=_.range[2],Uc(N)&&s(_.range,"BLOCK_IN_FLOW",qc)}else{n.atKey=!0;let _=D.end,A=b?e(n,b,D,s):t(n,_,R,null,D,s);Uc(b)&&s(A.range,"BLOCK_IN_FLOW",qc),n.atKey=!1;let Y=At($??[],{flow:a,indicator:"map-value-ind",next:N,offset:A.range[2],onError:s,parentIndent:r.indent,startOnNewline:!1});if(Y.found){if(!o&&!D.found&&n.options.strict){if($)for(let z of $){if(z===Y.found)break;if(z.type==="newline"){s(z,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}D.start<Y.found.offset-1024&&s(Y.found,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit flow sequence key")}}else N&&("source"in N&&N.source?.[0]===":"?s(N,"MISSING_CHAR",`Missing space after : in ${a}`):s(Y.start,"MISSING_CHAR",`Missing , or : between ${a} items`));let _e=N?e(n,N,Y,s):Y.found?t(n,Y.end,$,null,Y,s):null;_e?Uc(N)&&s(_e.range,"BLOCK_IN_FLOW",qc):Y.comment&&(A.comment?A.comment+=`
145
- `+Y.comment:A.comment=Y.comment);let w=new ie(A,_e);if(n.options.keepSourceTokens&&(w.srcToken=T),o){let z=c;po(n,z.items,A)&&s(_,"DUPLICATE_KEY","Map keys must be unique"),z.items.push(w)}else{let z=new ae(n.schema);z.flow=!0,z.items.push(w);let Ot=(_e??A).range;z.range=[A.range[0],Ot[1],Ot[2]],c.items.push(z)}u=_e?_e.range[2]:Y.end}}let p=o?"}":"]",[h,...f]=r.end,m=u;if(h?.source===p)m=h.offset+h.source.length;else{let y=a[0].toUpperCase()+a.substring(1),T=d?`${y} must end with a ${p}`:`${y} in block collection must be sufficiently indented and end with a ${p}`;s(u,d?"MISSING_CHAR":"BAD_INDENT",T),h&&h.source.length!==1&&f.unshift(h)}if(f.length>0){let y=Et(f,m,n.options.strict,s);y.comment&&(c.comment?c.comment+=`
146
- `+y.comment:c.comment=y.comment),c.range=[r.offset,m,y.offset]}else c.range=[r.offset,m,m];return c}function Bc(e,t,n,r,s,i){let o=n.type==="block-map"?Um(e,t,n,r,i):n.type==="block-seq"?Bm(e,t,n,r,i):Wm(e,t,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function Vm(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===ae.tagName&&a==="map"||o===Re.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),d=l.resolve?.(c,p=>s(i,"TAG_RESOLVE_FAILED",p),t.options)??c,u=q(d)?d:new O(d);return u.range=c.range,u.tag=o,l?.format&&(u.format=l.format),u}function Wc(e,t,n){let r=t.offset,s=yS(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?wS(t.source):[],a=o.length;for(let m=o.length-1;m>=0;--m){let y=o[m][1];if(y===""||y==="\r")a=m;else break}if(a===0){let m=s.chomp==="+"&&o.length>0?`
147
- `.repeat(Math.max(1,o.length-1)):"",y=r+s.length;return t.source&&(y+=t.source.length),{value:m,type:i,comment:s.comment,range:[r,y,y]}}let l=t.indent+s.indent,c=t.offset+s.length,d=0;for(let m=0;m<a;++m){let[y,T]=o[m];if(T===""||T==="\r")s.indent===0&&y.length>l&&(l=y.length);else{y.length<l&&n(c+y.length,"MISSING_CHAR","Block scalars with more-indented leading empty lines must use an explicit indentation indicator"),s.indent===0&&(l=y.length),d=m,l===0&&!e.atRoot&&n(c,"BAD_INDENT","Block scalar values in collections must be indented");break}c+=y.length+T.length+1}for(let m=o.length-1;m>=a;--m)o[m][0].length>l&&(a=m+1);let u="",p="",h=!1;for(let m=0;m<d;++m)u+=o[m][0].slice(l)+`
148
- `;for(let m=d;m<a;++m){let[y,T]=o[m];c+=y.length+T.length+1;let R=T[T.length-1]==="\r";if(R&&(T=T.slice(0,-1)),T&&y.length<l){let $=`Block scalar lines must not be less indented than their ${s.indent?"explicit indentation indicator":"first line"}`;n(c-T.length-(R?2:1),"BAD_INDENT",$),y=""}i===O.BLOCK_LITERAL?(u+=p+y.slice(l)+T,p=`
139
+ `}};function At(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,b=null,$=null,N=null;for(let A of e)switch(f&&(A.type!=="space"&&A.type!=="newline"&&A.type!=="comma"&&i(A.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),f=!1),m&&(c&&A.type!=="comment"&&A.type!=="newline"&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),m=null),A.type){case"space":!t&&(n!=="doc-start"||r?.type!=="flow-collection")&&A.source.includes(" ")&&(m=A),u=!0;break;case"comment":{u||i(A,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let z=A.source.substring(1)||" ";d?d+=p+z:d=z,p="",c=!1;break}case"newline":c?d?d+=A.source:(!$||n!=="seq-item-ind")&&(l=!0):p+=A.source,c=!0,h=!0,(y||T)&&(R=A),u=!0;break;case"anchor":y&&i(A,"MULTIPLE_ANCHORS","A node can have at most one anchor"),A.source.endsWith(":")&&i(A.offset+A.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),y=A,N??(N=A.offset),c=!1,u=!1,f=!0;break;case"tag":{T&&i(A,"MULTIPLE_TAGS","A node can have at most one tag"),T=A,N??(N=A.offset),c=!1,u=!1,f=!0;break}case n:(y||T)&&i(A,"BAD_PROP_ORDER",`Anchors and tags must be after the ${A.source} indicator`),$&&i(A,"UNEXPECTED_TOKEN",`Unexpected ${A.source} in ${t??"collection"}`),$=A,c=n==="seq-item-ind"||n==="explicit-key-ind",u=!1;break;case"comma":if(t){b&&i(A,"UNEXPECTED_TOKEN",`Unexpected , in ${t}`),b=A,c=!1,u=!1;break}default:i(A,"UNEXPECTED_TOKEN",`Unexpected ${A.type} token`),c=!1,u=!1}let D=e[e.length-1],_=D?D.offset+D.source.length:s;return f&&r&&r.type!=="space"&&r.type!=="newline"&&r.type!=="comma"&&(r.type!=="scalar"||r.source!=="")&&i(r.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),m&&(c&&m.indent<=o||r?.type==="block-map"||r?.type==="block-seq")&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:b,found:$,spaceBefore:l,comment:d,hasNewline:h,anchor:y,tag:T,newlineAfterProp:R,end:_,start:N??_}}function cn(e){if(!e)return null;switch(e.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(e.source.includes(`
140
+ `))return!0;if(e.end){for(let t of e.end)if(t.type==="newline")return!0}return!1;case"flow-collection":for(let t of e.items){for(let n of t.start)if(n.type==="newline")return!0;if(t.sep){for(let n of t.sep)if(n.type==="newline")return!0}if(cn(t.key)||cn(t.value))return!0}return!1;default:return!0}}function Ss(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&cn(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function ho(e,t,n){let{uniqueKeys:r}=e.options;if(r===!1)return!1;let s=typeof r=="function"?r:(i,o)=>i===o||F(i)&&F(o)&&i.value===o.value;return t.some(i=>s(i.key,n))}var Wm="All mapping items must start at the same column";function Vm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??ae,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=At(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",Wm)),!m.anchor&&!m.tag&&!h){c=m.end,m.comment&&(a.comment?a.comment+=`
141
+ `+m.comment:a.comment=m.comment);continue}(m.newlineAfterProp||cn(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",Wm);n.atKey=!0;let T=m.end,R=p?e(n,p,m,s):t(n,T,d,null,m,s);n.schema.compat&&Ss(r.indent,p,s),n.atKey=!1,ho(n,a.items,R)&&s(T,"DUPLICATE_KEY","Map keys must be unique");let b=At(h??[],{indicator:"map-value-ind",next:f,offset:R.range[2],onError:s,parentIndent:r.indent,startOnNewline:!p||p.type==="block-scalar"});if(l=b.end,b.found){y&&(f?.type==="block-map"&&!b.hasNewline&&s(l,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),n.options.strict&&m.start<b.found.offset-1024&&s(R.range,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit block mapping key"));let $=f?e(n,f,b,s):t(n,l,h,null,b,s);n.schema.compat&&Ss(r.indent,f,s),l=$.range[2];let N=new ie(R,$);n.options.keepSourceTokens&&(N.srcToken=u),a.items.push(N)}else{y&&s(R.range,"MISSING_CHAR","Implicit map keys need to be followed by map values"),b.comment&&(R.comment?R.comment+=`
142
+ `+b.comment:R.comment=b.comment);let $=new ie(R);n.options.keepSourceTokens&&($.srcToken=u),a.items.push($)}}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??Re,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=At(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&&Ss(r.indent,d,s),l=h.range[2],a.items.push(h)}return a.range=[r.offset,l,c??l],a}function Et(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",Vc=e=>e&&(e.type==="block-map"||e.type==="block-seq");function Gm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",l=i?.nodeClass??(o?ae:Re),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:b,sep:$,value:N}=T,D=At(R,{flow:a,indicator:"explicit-key-ind",next:b??$?.[0],offset:d,onError:s,parentIndent:r.indent,startOnNewline:!1});if(!D.found){if(!D.anchor&&!D.tag&&!$&&!N){y===0&&D.comma?s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`):y<r.items.length-1&&s(D.start,"UNEXPECTED_TOKEN",`Unexpected empty item in ${a}`),D.comment&&(c.comment?c.comment+=`
143
+ `+D.comment:c.comment=D.comment),d=D.end;continue}!o&&n.options.strict&&cn(b)&&s(b,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line")}if(y===0)D.comma&&s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`);else if(D.comma||s(D.start,"MISSING_CHAR",`Missing , between ${a} items`),D.comment){let _="";e:for(let A of R)switch(A.type){case"comma":case"space":break;case"comment":_=A.source.substring(1);break e;default:break e}if(_){let A=c.items[c.items.length-1];j(A)&&(A=A.value??A.key),A.comment?A.comment+=`
144
+ `+_:A.comment=_,D.comment=D.comment.substring(_.length+1)}}if(!o&&!$&&!D.found){let _=N?e(n,N,D,s):t(n,D.end,$,null,D,s);c.items.push(_),d=_.range[2],Vc(N)&&s(_.range,"BLOCK_IN_FLOW",Wc)}else{n.atKey=!0;let _=D.end,A=b?e(n,b,D,s):t(n,_,R,null,D,s);Vc(b)&&s(A.range,"BLOCK_IN_FLOW",Wc),n.atKey=!1;let z=At($??[],{flow:a,indicator:"map-value-ind",next:N,offset:A.range[2],onError:s,parentIndent:r.indent,startOnNewline:!1});if(z.found){if(!o&&!D.found&&n.options.strict){if($)for(let K of $){if(K===z.found)break;if(K.type==="newline"){s(K,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}D.start<z.found.offset-1024&&s(z.found,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit flow sequence key")}}else N&&("source"in N&&N.source?.[0]===":"?s(N,"MISSING_CHAR",`Missing space after : in ${a}`):s(z.start,"MISSING_CHAR",`Missing , or : between ${a} items`));let Fe=N?e(n,N,z,s):z.found?t(n,z.end,$,null,z,s):null;Fe?Vc(N)&&s(Fe.range,"BLOCK_IN_FLOW",Wc):z.comment&&(A.comment?A.comment+=`
145
+ `+z.comment:A.comment=z.comment);let w=new ie(A,Fe);if(n.options.keepSourceTokens&&(w.srcToken=T),o){let K=c;ho(n,K.items,A)&&s(_,"DUPLICATE_KEY","Map keys must be unique"),K.items.push(w)}else{let K=new ae(n.schema);K.flow=!0,K.items.push(w);let Ot=(Fe??A).range;K.range=[A.range[0],Ot[1],Ot[2]],c.items.push(K)}d=Fe?Fe.range[2]:z.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=Et(f,m,n.options.strict,s);y.comment&&(c.comment?c.comment+=`
146
+ `+y.comment:c.comment=y.comment),c.range=[r.offset,m,y.offset]}else c.range=[r.offset,m,m];return c}function Kc(e,t,n,r,s,i){let o=n.type==="block-map"?Vm(e,t,n,r,i):n.type==="block-seq"?Km(e,t,n,r,i):Gm(e,t,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function Hm(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===ae.tagName&&a==="map"||o===Re.tagName&&a==="seq")return Kc(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),Kc(e,t,n,s,o)}let c=Kc(e,t,n,s,o,l),u=l.resolve?.(c,p=>s(i,"TAG_RESOLVE_FAILED",p),t.options)??c,d=q(u)?u:new O(u);return d.range=c.range,d.tag=o,l?.format&&(d.format=l.format),d}function Gc(e,t,n){let r=t.offset,s=IS(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?vS(t.source):[],a=o.length;for(let m=o.length-1;m>=0;--m){let y=o[m][1];if(y===""||y==="\r")a=m;else break}if(a===0){let m=s.chomp==="+"&&o.length>0?`
147
+ `.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)+`
148
+ `;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 $=`Block scalar lines must not be less indented than their ${s.indent?"explicit indentation indicator":"first line"}`;n(c-T.length-(R?2:1),"BAD_INDENT",$),y=""}i===O.BLOCK_LITERAL?(d+=p+y.slice(l)+T,p=`
149
149
  `):y.length>l||T[0]===" "?(p===" "?p=`
150
150
  `:!h&&p===`
151
151
  `&&(p=`
152
152
 
153
- `),u+=p+y.slice(l)+T,p=`
153
+ `),d+=p+y.slice(l)+T,p=`
154
154
  `,h=!0):T===""?p===`
155
- `?u+=`
155
+ `?d+=`
156
156
  `:p=`
157
- `:(u+=p+T,p=" ",h=!1)}switch(s.chomp){case"-":break;case"+":for(let m=a;m<o.length;++m)u+=`
158
- `+o[m][0].slice(l);u[u.length-1]!==`
159
- `&&(u+=`
160
- `);break;default:u+=`
161
- `}let f=r+s.length+t.source.length;return{value:u,type:i,comment:s.comment,range:[r,f,f]}}function yS({offset:e,props:t},n,r){if(t[0].type!=="block-scalar-header")return r(t[0],"IMPOSSIBLE","Block scalar header not found"),null;let{source:s}=t[0],i=s[0],o=0,a="",l=-1;for(let p=1;p<s.length;++p){let h=s[p];if(!a&&(h==="-"||h==="+"))a=h;else{let f=Number(h);!o&&f?o=f:l===-1&&(l=e+p)}}l!==-1&&r(l,"UNEXPECTED_TOKEN",`Block scalar header includes extra characters: ${s}`);let c=!1,d="",u=s.length;for(let p=1;p<t.length;++p){let h=t[p];switch(h.type){case"space":c=!0;case"newline":u+=h.source.length;break;case"comment":n&&!c&&r(h,"MISSING_CHAR","Comments must be separated from other tokens by white space characters"),u+=h.source.length,d=h.source.substring(1);break;case"error":r(h,"UNEXPECTED_TOKEN",h.message),u+=h.source.length;break;default:{let f=`Unexpected token in block scalar header: ${h.type}`;r(h,"UNEXPECTED_TOKEN",f);let m=h.source;m&&typeof m=="string"&&(u+=m.length)}}}return{mode:i,indent:o,chomp:a,comment:d,length:u}}function wS(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 Vc(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=kS(i,c);break;case"single-quoted-scalar":a=O.QUOTE_SINGLE,l=TS(i,c);break;case"double-quoted-scalar":a=O.QUOTE_DOUBLE,l=bS(i,c);break;default:return n(e,"UNEXPECTED_TOKEN",`Expected a flow scalar value, but found: ${s}`),{value:"",type:null,comment:"",range:[r,r+i.length,r+i.length]}}let d=r+i.length,u=Et(o,d,t,n);return{value:l,type:a,comment:u.comment,range:[r,d,u.offset]}}function kS(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}`),Km(e)}function TS(e,t){return(e[e.length-1]!=="'"||e.length===1)&&t(e.length,"MISSING_CHAR","Missing closing 'quote"),Km(e.slice(1,-1)).replace(/''/g,"'")}function Km(e){let t,n;try{t=new RegExp(`(.*?)(?<![ ])[ ]*\r?
157
+ `:(d+=p+T,p=" ",h=!1)}switch(s.chomp){case"-":break;case"+":for(let m=a;m<o.length;++m)d+=`
158
+ `+o[m][0].slice(l);d[d.length-1]!==`
159
+ `&&(d+=`
160
+ `);break;default:d+=`
161
+ `}let f=r+s.length+t.source.length;return{value:d,type:i,comment:s.comment,range:[r,f,f]}}function IS({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 vS(e){let t=e.split(/\n( *)/),n=t[0],r=n.match(/^( *)/),i=[r?.[1]?[r[1],n.slice(r[1].length)]:["",n]];for(let o=1;o<t.length;o+=2)i.push([t[o],t[o+1]]);return i}function Hc(e,t,n){let{offset:r,type:s,source:i,end:o}=e,a,l,c=(p,h,f)=>n(r+p,h,f);switch(s){case"scalar":a=O.PLAIN,l=CS(i,c);break;case"single-quoted-scalar":a=O.QUOTE_SINGLE,l=AS(i,c);break;case"double-quoted-scalar":a=O.QUOTE_DOUBLE,l=ES(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=Et(o,u,t,n);return{value:l,type:a,comment:d.comment,range:[r,u,d.offset]}}function CS(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}`),Ym(e)}function AS(e,t){return(e[e.length-1]!=="'"||e.length===1)&&t(e.length,"MISSING_CHAR","Missing closing 'quote"),Ym(e.slice(1,-1)).replace(/''/g,"'")}function Ym(e){let t,n;try{t=new RegExp(`(.*?)(?<![ ])[ ]*\r?
162
162
  `,"sy"),n=new RegExp(`[ ]*(.*?)(?:(?<![ ])[ ]*)?\r?
163
163
  `,"sy")}catch{t=/(.*?)[ \t]*\r?\n/sy,n=/[ \t]*(.*?)[ \t]*\r?\n/sy}let r=t.exec(e);if(!r)return e;let s=r[1],i=" ",o=t.lastIndex;for(n.lastIndex=o;r=n.exec(e);)r[1]===""?i===`
164
164
  `?s+=i:i=`
165
- `:(s+=i+r[1],i=" "),o=n.lastIndex;let a=/[ \t]*(.*)/sy;return a.lastIndex=o,r=a.exec(e),s+i+(r?.[1]??"")}function bS(e,t){let n="";for(let r=1;r<e.length-1;++r){let s=e[r];if(!(s==="\r"&&e[r+1]===`
165
+ `:(s+=i+r[1],i=" "),o=n.lastIndex;let a=/[ \t]*(.*)/sy;return a.lastIndex=o,r=a.exec(e),s+i+(r?.[1]??"")}function ES(e,t){let n="";for(let r=1;r<e.length-1;++r){let s=e[r];if(!(s==="\r"&&e[r+1]===`
166
166
  `))if(s===`
167
- `){let{fold:i,offset:o}=RS(e,r);n+=i,r=o}else if(s==="\\"){let i=e[++r],o=PS[i];if(o)n+=o;else if(i===`
167
+ `){let{fold:i,offset:o}=OS(e,r);n+=i,r=o}else if(s==="\\"){let i=e[++r],o=$S[i];if(o)n+=o;else if(i===`
168
168
  `)for(i=e[r+1];i===" "||i===" ";)i=e[++r+1];else if(i==="\r"&&e[r+1]===`
169
- `)for(i=e[++r+1];i===" "||i===" ";)i=e[++r+1];else if(i==="x"||i==="u"||i==="U"){let a=i==="x"?2:i==="u"?4:8;n+=SS(e,r+1,a,t),r+=a}else{let a=e.substr(r-1,2);t(r-1,"BAD_DQ_ESCAPE",`Invalid escape sequence ${a}`),n+=a}}else if(s===" "||s===" "){let i=r,o=e[r+1];for(;o===" "||o===" ";)o=e[++r+1];o!==`
169
+ `)for(i=e[++r+1];i===" "||i===" ";)i=e[++r+1];else if(i==="x"||i==="u"||i==="U"){let a=i==="x"?2:i==="u"?4:8;n+=NS(e,r+1,a,t),r+=a}else{let a=e.substr(r-1,2);t(r-1,"BAD_DQ_ESCAPE",`Invalid escape sequence ${a}`),n+=a}}else if(s===" "||s===" "){let i=r,o=e[r+1];for(;o===" "||o===" ";)o=e[++r+1];o!==`
170
170
  `&&!(o==="\r"&&e[r+2]===`
171
- `)&&(n+=r>i?e.slice(i,r+1):s)}else n+=s}return(e[e.length-1]!=='"'||e.length===1)&&t(e.length,"MISSING_CHAR",'Missing closing "quote'),n}function RS(e,t){let n="",r=e[t+1];for(;(r===" "||r===" "||r===`
171
+ `)&&(n+=r>i?e.slice(i,r+1):s)}else n+=s}return(e[e.length-1]!=='"'||e.length===1)&&t(e.length,"MISSING_CHAR",'Missing closing "quote'),n}function OS(e,t){let n="",r=e[t+1];for(;(r===" "||r===" "||r===`
172
172
  `||r==="\r")&&!(r==="\r"&&e[t+2]!==`
173
173
  `);)r===`
174
174
  `&&(n+=`
175
- `),t+=1,r=e[t+1];return n||(n=" "),{fold:n,offset:t}}var PS={0:"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:`
176
- `,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function SS(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 Kc(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?Wc(e,t,r):Vc(t,e.options.strict,r),l=n?e.directives.tagName(n.source,u=>r(n,"TAG_RESOLVE_FAILED",u)):null,c;e.options.stringKeys&&e.atKey?c=e.schema[je]:l?c=IS(e.schema,s,l,n,r):t.type==="scalar"?c=vS(e,s,t,r):c=e.schema[je];let d;try{let u=c.resolve(s,p=>r(n??t,"TAG_RESOLVE_FAILED",p),e.options);d=x(u)?u:new O(u)}catch(u){let p=u instanceof Error?u.message:String(u);r(n??t,"TAG_RESOLVE_FAILED",p),d=new O(s)}return d.range=a,d.source=s,i&&(d.type=i),l&&(d.tag=l),c.format&&(d.format=c.format),o&&(d.comment=o),d}function IS(e,t,n,r,s){if(n==="!")return e[je];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[je])}function vS({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[je];if(n.compat){let a=n.compat.find(l=>l.default&&l.test?.test(r))??n[je];if(o.tag!==a.tag){let l=t.tagString(o.tag),c=t.tagString(a.tag),d=`Value may be parsed as either ${l} or ${c}`;i(s,"TAG_RESOLVE_FAILED",d,!0)}}return o}function Gm(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 CS={composeNode:Gc,composeEmptyNode:fo};function Gc(e,t,n,r){let s=e.atKey,{spaceBefore:i,comment:o,anchor:a,tag:l}=n,c,d=!0;switch(t.type){case"alias":c=AS(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=Kc(e,t,l,r),a&&(c.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{c=Vm(CS,e,t,n,r),a&&(c.anchor=a.source.substring(1))}catch(u){let p=u instanceof Error?u.message:String(u);r(t,"RESOURCE_EXHAUSTION",p)}break;default:{let u=t.type==="error"?t.message:`Unsupported token (type: ${t.type})`;r(t,"UNEXPECTED_TOKEN",u),d=!1}}return c??(c=fo(e,t.offset,void 0,null,n,r)),a&&c.anchor===""&&r(a,"BAD_ALIAS","Anchor cannot be an empty string"),s&&e.options.stringKeys&&(!x(c)||typeof c.value!="string"||c.tag&&c.tag!=="tag:yaml.org,2002:str")&&r(l??t,"NON_STRING_KEY","With stringKeys, all keys must be strings"),i&&(c.spaceBefore=!0),o&&(t.type==="scalar"&&t.source===""?c.comment=o:c.commentBefore=o),e.options.keepSourceTokens&&d&&(c.srcToken=t),c}function fo(e,t,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:l},c){let d={type:"scalar",offset:Gm(t,n,r),indent:-1,source:""},u=Kc(e,d,a,c);return o&&(u.anchor=o.source.substring(1),u.anchor===""&&c(o,"BAD_ALIAS","Anchor cannot be an empty string")),s&&(u.spaceBefore=!0),i&&(u.comment=i,u.range[2]=l),u}function AS({options:e},{offset:t,source:n,end:r},s){let i=new Mt(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=Et(r,o,e.strict,s);return i.range=[t,o,a.offset],a.comment&&(i.comment=a.comment),i}function Hm(e,t,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:t},e),l=new ln(void 0,a),c={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},d=At(r,{indicator:"doc-start",next:s??i?.[0],offset:n,onError:o,parentIndent:0,startOnNewline:!0});d.found&&(l.directives.docStart=!0,s&&(s.type==="block-map"||s.type==="block-seq")&&!d.hasNewline&&o(d.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),l.contents=s?Gc(c,s,d,o):fo(c,d.end,r,null,d,o);let u=l.contents.range[2],p=Et(i,u,!1,o);return p.comment&&(l.comment=p.comment),l.range=[n,u,p.offset],l}function Rs(e){if(typeof e=="number")return[e,e+1];if(Array.isArray(e))return e.length===2?e:[e[0],e[1]];let{offset:t,source:n}=e;return[t,t+(typeof n=="string"?n.length:1)]}function Ym(e){let t="",n=!1,r=!1;for(let s=0;s<e.length;++s){let i=e[s];switch(i[0]){case"#":t+=(t===""?"":r?`
175
+ `),t+=1,r=e[t+1];return n||(n=" "),{fold:n,offset:t}}var $S={0:"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:`
176
+ `,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function NS(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 Yc(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?Gc(e,t,r):Hc(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[qe]:l?c=DS(e.schema,s,l,n,r):t.type==="scalar"?c=_S(e,s,t,r):c=e.schema[qe];let u;try{let d=c.resolve(s,p=>r(n??t,"TAG_RESOLVE_FAILED",p),e.options);u=F(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 DS(e,t,n,r,s){if(n==="!")return e[qe];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[qe])}function _S({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[qe];if(n.compat){let a=n.compat.find(l=>l.default&&l.test?.test(r))??n[qe];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 zm(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 FS={composeNode:zc,composeEmptyNode:go};function zc(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=xS(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=Yc(e,t,l,r),a&&(c.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{c=Hm(FS,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=go(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&&(!F(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 go(e,t,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:l},c){let u={type:"scalar",offset:zm(t,n,r),indent:-1,source:""},d=Yc(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 xS({options:e},{offset:t,source:n,end:r},s){let i=new Mt(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=Et(r,o,e.strict,s);return i.range=[t,o,a.offset],a.comment&&(i.comment=a.comment),i}function Jm(e,t,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:t},e),l=new ln(void 0,a),c={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},u=At(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?zc(c,s,u,o):go(c,u.end,r,null,u,o);let d=l.contents.range[2],p=Et(i,d,!1,o);return p.comment&&(l.comment=p.comment),l.range=[n,d,p.offset],l}function Is(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 Xm(e){let t="",n=!1,r=!1;for(let s=0;s<e.length;++s){let i=e[s];switch(i[0]){case"#":t+=(t===""?"":r?`
177
177
 
178
178
  `:`
179
- `)+(i.substring(1)||" "),n=!0,r=!1;break;case"%":e[s+1]?.[0]!=="#"&&(s+=1),n=!1;break;default:n||(r=!0),n=!1}}return{comment:t,afterEmptyLine:r}}var Ps=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=Rs(n);i?this.warnings.push(new Ts(o,r,s)):this.errors.push(new ut(o,r,s))},this.directives=new vt({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=Ym(this.prelude);if(r){let i=t.contents;if(n)t.comment=t.comment?`${t.comment}
179
+ `)+(i.substring(1)||" "),n=!0,r=!1;break;case"%":e[s+1]?.[0]!=="#"&&(s+=1),n=!1;break;default:n||(r=!0),n=!1}}return{comment:t,afterEmptyLine:r}}var vs=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=Is(n);i?this.warnings.push(new Ps(o,r,s)):this.errors.push(new ut(o,r,s))},this.directives=new vt({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=Xm(this.prelude);if(r){let i=t.contents;if(n)t.comment=t.comment?`${t.comment}
180
180
  ${r}`:r;else if(s||t.directives.docStart||!i)t.commentBefore=r;else if(W(i)&&!i.flow&&i.items.length>0){let o=i.items[0];j(o)&&(o=o.key);let a=o.commentBefore;o.commentBefore=a?`${r}
181
181
  ${a}`:r}else{let o=i.commentBefore;i.commentBefore=o?`${r}
182
- ${o}`:r}}if(n){for(let i=0;i<this.errors.length;++i)t.errors.push(this.errors[i]);for(let i=0;i<this.warnings.length;++i)t.warnings.push(this.warnings[i])}else t.errors=this.errors,t.warnings=this.warnings;this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:Ym(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(t,n=!1,r=-1){for(let s of t)yield*this.next(s);yield*this.end(n,r)}*next(t){switch(t.type){case"directive":this.directives.add(t.source,(n,r,s)=>{let i=Rs(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=Hm(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 ut(Rs(t),"UNEXPECTED_TOKEN",n);this.atDirectives||!this.doc?this.errors.push(r):this.doc.errors.push(r);break}case"doc-end":{if(!this.doc){let r="Unexpected doc-end without preceding document";this.errors.push(new ut(Rs(t),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=Et(t.end,t.offset+t.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),n.comment){let r=this.doc.comment;this.doc.comment=r?`${r}
183
- ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.push(new ut(Rs(t),"UNEXPECTED_TOKEN",`Unsupported token ${t.type}`))}}*end(t=!1,n=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(t){let r=Object.assign({_directives:this.directives},this.options),s=new ln(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 Hc=Symbol("break visit"),ES=Symbol("skip children"),zm=Symbol("remove item");function On(e,t){"type"in e&&e.type==="document"&&(e={start:e.start,value:e.value}),Jm(Object.freeze([]),e,t)}On.BREAK=Hc;On.SKIP=ES;On.REMOVE=zm;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 Jm(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=Jm(Object.freeze(e.concat([[s,o]])),i.items[o],n);if(typeof a=="number")o=a-1;else{if(a===Hc)return Hc;a===zm&&(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 Yc="\uFEFF",zc="",Jc="",mo="";function Xm(e){switch(e){case Yc:return"byte-order-mark";case zc:return"doc-mode";case Jc:return"flow-error-end";case mo:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case`
182
+ ${o}`:r}}if(n){for(let i=0;i<this.errors.length;++i)t.errors.push(this.errors[i]);for(let i=0;i<this.warnings.length;++i)t.warnings.push(this.warnings[i])}else t.errors=this.errors,t.warnings=this.warnings;this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:Xm(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=Is(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=Jm(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 ut(Is(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 ut(Is(t),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=Et(t.end,t.offset+t.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),n.comment){let r=this.doc.comment;this.doc.comment=r?`${r}
183
+ ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.push(new ut(Is(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 ln(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 Jc=Symbol("break visit"),LS=Symbol("skip children"),Qm=Symbol("remove item");function On(e,t){"type"in e&&e.type==="document"&&(e={start:e.start,value:e.value}),Zm(Object.freeze([]),e,t)}On.BREAK=Jc;On.SKIP=LS;On.REMOVE=Qm;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 Zm(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=Zm(Object.freeze(e.concat([[s,o]])),i.items[o],n);if(typeof a=="number")o=a-1;else{if(a===Jc)return Jc;a===Qm&&(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 Xc="\uFEFF",Qc="",Zc="",yo="";function eh(e){switch(e){case Xc:return"byte-order-mark";case Qc:return"doc-mode";case Zc:return"flow-error-end";case yo:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case`
184
184
  `:case`\r
185
185
  `:return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(e[0]){case" ":case" ":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}function pt(e){switch(e){case void 0:case" ":case`
186
- `:case"\r":case" ":return!0;default:return!1}}var Qm=new Set("0123456789ABCDEFabcdef"),$S=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),ho=new Set(",[]{}"),NS=new Set(` ,[]{}
187
- \r `),Xc=e=>!e||NS.has(e),Ss=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(t,n=!1){if(t){if(typeof t!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+t:t,this.lineEndPos=null}this.atEnd=!n;let r=this.next??"stream";for(;r&&(n||this.hasChars(1));)r=yield*this.parseNext(r)}atLineEnd(){let t=this.pos,n=this.buffer[t];for(;n===" "||n===" ";)n=this.buffer[++t];return!n||n==="#"||n===`
186
+ `:case"\r":case" ":return!0;default:return!1}}var th=new Set("0123456789ABCDEFabcdef"),jS=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),wo=new Set(",[]{}"),qS=new Set(` ,[]{}
187
+ \r `),ed=e=>!e||qS.has(e),Cs=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(t,n=!1){if(t){if(typeof t!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+t:t,this.lineEndPos=null}this.atEnd=!n;let r=this.next??"stream";for(;r&&(n||this.hasChars(1));)r=yield*this.parseNext(r)}atLineEnd(){let t=this.pos,n=this.buffer[t];for(;n===" "||n===" ";)n=this.buffer[++t];return!n||n==="#"||n===`
188
188
  `?!0:n==="\r"?this.buffer[t+1]===`
189
189
  `:!1}charAt(t){return this.buffer[this.pos+t]}continueScalar(t){let n=this.buffer[t];if(this.indentNext>0){let r=0;for(;n===" ";)n=this.buffer[++r+t];if(n==="\r"){let s=this.buffer[r+t+1];if(s===`
190
190
  `||!s&&!this.atEnd)return t+r+1}return n===`
191
191
  `||r>=this.indentNext||!n&&!this.atEnd?t+r:-1}if(n==="-"||n==="."){let r=this.buffer.substr(t,3);if((r==="---"||r==="...")&&pt(this.buffer[t+3]))return-1}return t}getLine(){let t=this.lineEndPos;return(typeof t!="number"||t!==-1&&t<this.pos)&&(t=this.buffer.indexOf(`
192
- `,this.pos),this.lineEndPos=t),t===-1?this.atEnd?this.buffer.substring(this.pos):null:(this.buffer[t-1]==="\r"&&(t-=1),this.buffer.substring(this.pos,t))}hasChars(t){return this.pos+t<=this.buffer.length}setNext(t){return this.buffer=this.buffer.substring(this.pos),this.pos=0,this.lineEndPos=null,this.next=t,null}peek(t){return this.buffer.substr(this.pos,t)}*parseNext(t){switch(t){case"stream":return yield*this.parseStream();case"line-start":return yield*this.parseLineStart();case"block-start":return yield*this.parseBlockStart();case"doc":return yield*this.parseDocument();case"flow":return yield*this.parseFlowCollection();case"quoted-scalar":return yield*this.parseQuotedScalar();case"block-scalar":return yield*this.parseBlockScalar();case"plain-scalar":return yield*this.parsePlainScalar()}}*parseStream(){let t=this.getLine();if(t===null)return this.setNext("stream");if(t[0]===Yc&&(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 zc,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==="...")&&pt(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&&!pt(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===":")&&pt(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(Xc),"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("..."))&&pt(s[3]))&&!(r===this.indentNext-1&&this.flowLevel===1&&(s[0]==="]"||s[0]==="}")))return this.flowLevel=0,yield Jc,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(Xc),"flow";case'"':case"'":return this.flowKey=!0,yield*this.parseQuotedScalar();case":":{let o=this.charAt(1);if(this.flowKey||pt(o)||o===",")return this.flowKey=!1,yield*this.pushCount(1),yield*this.pushSpaces(!0),"flow"}default:return this.flowKey=!1,yield*this.parsePlainScalar()}}*parseQuotedScalar(){let t=this.charAt(0),n=this.buffer.indexOf(t,this.pos+1);if(t==="'")for(;n!==-1&&this.buffer[n+1]==="'";)n=this.buffer.indexOf("'",n+2);else for(;n!==-1;){let i=0;for(;this.buffer[n-1-i]==="\\";)i+=1;if(i%2===0)break;n=this.buffer.indexOf('"',n+1)}let r=this.buffer.substring(0,n),s=r.indexOf(`
192
+ `,this.pos),this.lineEndPos=t),t===-1?this.atEnd?this.buffer.substring(this.pos):null:(this.buffer[t-1]==="\r"&&(t-=1),this.buffer.substring(this.pos,t))}hasChars(t){return this.pos+t<=this.buffer.length}setNext(t){return this.buffer=this.buffer.substring(this.pos),this.pos=0,this.lineEndPos=null,this.next=t,null}peek(t){return this.buffer.substr(this.pos,t)}*parseNext(t){switch(t){case"stream":return yield*this.parseStream();case"line-start":return yield*this.parseLineStart();case"block-start":return yield*this.parseBlockStart();case"doc":return yield*this.parseDocument();case"flow":return yield*this.parseFlowCollection();case"quoted-scalar":return yield*this.parseQuotedScalar();case"block-scalar":return yield*this.parseBlockScalar();case"plain-scalar":return yield*this.parsePlainScalar()}}*parseStream(){let t=this.getLine();if(t===null)return this.setNext("stream");if(t[0]===Xc&&(yield*this.pushCount(1),t=t.substring(1)),t[0]==="%"){let n=t.length,r=t.indexOf("#");for(;r!==-1;){let i=t[r-1];if(i===" "||i===" "){n=r-1;break}else r=t.indexOf("#",r+1)}for(;;){let i=t[n-1];if(i===" "||i===" ")n-=1;else break}let s=(yield*this.pushCount(n))+(yield*this.pushSpaces(!0));return yield*this.pushCount(t.length-s),this.pushNewline(),"stream"}if(this.atLineEnd()){let n=yield*this.pushSpaces(!0);return yield*this.pushCount(t.length-n),yield*this.pushNewline(),"stream"}return yield Qc,yield*this.parseLineStart()}*parseLineStart(){let t=this.charAt(0);if(!t&&!this.atEnd)return this.setNext("line-start");if(t==="-"||t==="."){if(!this.atEnd&&!this.hasChars(4))return this.setNext("line-start");let n=this.peek(3);if((n==="---"||n==="...")&&pt(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&&!pt(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===":")&&pt(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(ed),"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("..."))&&pt(s[3]))&&!(r===this.indentNext-1&&this.flowLevel===1&&(s[0]==="]"||s[0]==="}")))return this.flowLevel=0,yield Zc,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(ed),"flow";case'"':case"'":return this.flowKey=!0,yield*this.parseQuotedScalar();case":":{let o=this.charAt(1);if(this.flowKey||pt(o)||o===",")return this.flowKey=!1,yield*this.pushCount(1),yield*this.pushSpaces(!0),"flow"}default:return this.flowKey=!1,yield*this.parsePlainScalar()}}*parseQuotedScalar(){let t=this.charAt(0),n=this.buffer.indexOf(t,this.pos+1);if(t==="'")for(;n!==-1&&this.buffer[n+1]==="'";)n=this.buffer.indexOf("'",n+2);else for(;n!==-1;){let i=0;for(;this.buffer[n-1-i]==="\\";)i+=1;if(i%2===0)break;n=this.buffer.indexOf('"',n+1)}let r=this.buffer.substring(0,n),s=r.indexOf(`
193
193
  `,this.pos);if(s!==-1){for(;s!==-1;){let i=this.continueScalar(s+1);if(i===-1)break;s=r.indexOf(`
194
194
  `,i)}s!==-1&&(n=s-(r[s-1]==="\r"?2:1))}if(n===-1){if(!this.atEnd)return this.setNext("quoted-scalar");n=this.buffer.length}return yield*this.pushToIndex(n+1,!1),this.flowLevel?"flow":"doc"}*parseBlockScalarHeader(){this.blockScalarIndent=-1,this.blockScalarKeep=!1;let t=this.pos;for(;;){let n=this.buffer[++t];if(n==="+")this.blockScalarKeep=!0;else if(n>"0"&&n<="9")this.blockScalarIndent=Number(n)-1;else if(n!=="-")break}return yield*this.pushUntil(n=>pt(n)||n==="#")}*parseBlockScalar(){let t=this.pos-1,n=0,r;e:for(let i=this.pos;r=this.buffer[i];++i)switch(r){case" ":n+=1;break;case`
195
195
  `:t=i,n=0;break;case"\r":{let o=this.buffer[i+1];if(!o&&!this.atEnd)return this.setNext("block-scalar");if(o===`
196
196
  `)break}default:break e}if(!r&&!this.atEnd)return this.setNext("block-scalar");if(n>=this.indentNext){this.blockScalarIndent===-1?this.indentNext=n:this.indentNext=this.blockScalarIndent+(this.indentNext===0?1:this.indentNext);do{let i=this.continueScalar(t+1);if(i===-1)break;t=this.buffer.indexOf(`
197
197
  `,i)}while(t!==-1);if(t===-1){if(!this.atEnd)return this.setNext("block-scalar");t=this.buffer.length}}let s=t+1;for(r=this.buffer[s];r===" ";)r=this.buffer[++s];if(r===" "){for(;r===" "||r===" "||r==="\r"||r===`
198
198
  `;)r=this.buffer[++s];t=s-1}else if(!this.blockScalarKeep)do{let i=t-1,o=this.buffer[i];o==="\r"&&(o=this.buffer[--i]);let a=i;for(;o===" ";)o=this.buffer[--i];if(o===`
199
- `&&i>=this.pos&&i+1+n>a)t=i;else break}while(!0);return yield mo,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(pt(i)||t&&ho.has(i))break;n=r}else if(pt(s)){let i=this.buffer[r+1];if(s==="\r"&&(i===`
199
+ `&&i>=this.pos&&i+1+n>a)t=i;else break}while(!0);return yield yo,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(pt(i)||t&&wo.has(i))break;n=r}else if(pt(s)){let i=this.buffer[r+1];if(s==="\r"&&(i===`
200
200
  `?(r+=1,s=`
201
- `,i=this.buffer[r+1]):n=r),i==="#"||t&&ho.has(i))break;if(s===`
202
- `){let o=this.continueScalar(r+1);if(o===-1)break;r=Math.max(r,o-2)}}else{if(t&&ho.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield mo,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(Xc),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(pt(r)||n&&ho.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(;!pt(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($S.has(n))n=this.buffer[++t];else if(n==="%"&&Qm.has(this.buffer[t+1])&&Qm.has(this.buffer[t+2]))n=this.buffer[t+=3];else break;return yield*this.pushToIndex(t,!1)}}*pushNewline(){let t=this.buffer[this.pos];return t===`
201
+ `,i=this.buffer[r+1]):n=r),i==="#"||t&&wo.has(i))break;if(s===`
202
+ `){let o=this.continueScalar(r+1);if(o===-1)break;r=Math.max(r,o-2)}}else{if(t&&wo.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield yo,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(ed),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(pt(r)||n&&wo.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(;!pt(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(jS.has(n))n=this.buffer[++t];else if(n==="%"&&th.has(this.buffer[t+1])&&th.has(this.buffer[t+2]))n=this.buffer[t+=3];else break;return yield*this.pushToIndex(t,!1)}}*pushNewline(){let t=this.buffer[this.pos];return t===`
203
203
  `?yield*this.pushCount(1):t==="\r"&&this.charAt(1)===`
204
- `?yield*this.pushCount(2):0}*pushSpaces(t){let n=this.pos-1,r;do r=this.buffer[++n];while(r===" "||t&&r===" ");let s=n-this.pos;return s>0&&(yield this.buffer.substr(this.pos,s),this.pos=n),s}*pushUntil(t){let n=this.pos,r=this.buffer[n];for(;!t(r);)r=this.buffer[++n];return yield*this.pushToIndex(n,!1)}};var Is=class{constructor(){this.lineStarts=[],this.addNewLine=t=>this.lineStarts.push(t),this.linePos=t=>{let n=0,r=this.lineStarts.length;for(;n<r;){let i=n+r>>1;this.lineStarts[i]<t?n=i+1:r=i}if(this.lineStarts[n]===t)return{line:n+1,col:1};if(n===0)return{line:0,col:t};let s=this.lineStarts[n-1];return{line:n,col:t-s+1}}}};function dn(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function Zm(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 th(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 go(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 wr(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 yo(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 eh(e){if(e.start.type==="flow-seq-start")for(let t of e.items)t.sep&&!t.value&&!dn(t.start,"explicit-key-ind")&&!dn(t.sep,"map-value-ind")&&(t.key&&(t.value=t.key),delete t.key,th(t.value)?t.value.end?yo(t.value.end,t.sep):t.value.end=t.sep:yo(t.start,t.sep),delete t.sep)}var vs=class{constructor(t){this.atNewLine=!0,this.atScalar=!1,this.indent=0,this.offset=0,this.onKeyLine=!1,this.stack=[],this.source="",this.type="",this.lexer=new Ss,this.onNewLine=t}*parse(t,n=!1){this.onNewLine&&this.offset===0&&this.onNewLine(0);for(let r of this.lexer.lex(t,n))yield*this.next(r);n||(yield*this.end())}*next(t){if(this.source=t,this.atScalar){this.atScalar=!1,yield*this.step(),this.offset+=t.length;return}let n=Xm(t);if(n)if(n==="scalar")this.atNewLine=!1,this.atScalar=!0,this.type="scalar";else{switch(this.type=n,yield*this.step(),n){case"newline":this.atNewLine=!0,this.indent=0,this.onNewLine&&this.onNewLine(this.offset+t.length);break;case"space":this.atNewLine&&t[0]===" "&&(this.indent+=t.length);break;case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":this.atNewLine&&(this.indent+=t.length);break;case"doc-mode":case"flow-error-end":return;default:this.atNewLine=!1}this.offset+=t.length}else{let r=`Not a YAML token: ${t}`;yield*this.pop({type:"error",offset:this.offset,message:r,source:t}),this.offset+=t.length}}*end(){for(;this.stack.length>0;)yield*this.pop()}get sourceToken(){return{type:this.type,offset:this.offset,indent:this.indent,source:this.source}}*step(){let t=this.peek(1);if(this.type==="doc-end"&&t?.type!=="doc-end"){for(;this.stack.length>0;)yield*this.pop();this.stack.push({type:"doc-end",offset:this.offset,source:this.source});return}if(!t)return yield*this.stream();switch(t.type){case"document":return yield*this.document(t);case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yield*this.scalar(t);case"block-scalar":return yield*this.blockScalar(t);case"block-map":return yield*this.blockMap(t);case"block-seq":return yield*this.blockSequence(t);case"flow-collection":return yield*this.flowCollection(t);case"doc-end":return yield*this.documentEnd(t)}yield*this.pop()}peek(t){return this.stack[this.stack.length-t]}*pop(t){let n=t??this.stack.pop();if(!n)yield{type:"error",offset:this.offset,source:"",message:"Tried to pop an empty stack"};else if(this.stack.length===0)yield n;else{let r=this.peek(1);switch(n.type==="block-scalar"?n.indent="indent"in r?r.indent:0:n.type==="flow-collection"&&r.type==="document"&&(n.indent=0),n.type==="flow-collection"&&eh(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&&Zm(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":{Zm(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=go(this.peek(2)),r=wr(n),s;t.end?(s=t.end,s.push(this.sourceToken),delete t.end):s=[this.sourceToken];let i={type:"block-map",offset:t.offset,indent:t.indent,items:[{start:r,key:t,sep:s}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=i}else yield*this.lineEnd(t)}*blockScalar(t){switch(this.type){case"space":case"comment":case"newline":t.props.push(this.sourceToken);return;case"scalar":if(t.source=this.source,this.atNewLine=!0,this.indent=0,this.onNewLine){let n=this.source.indexOf(`
204
+ `?yield*this.pushCount(2):0}*pushSpaces(t){let n=this.pos-1,r;do r=this.buffer[++n];while(r===" "||t&&r===" ");let s=n-this.pos;return s>0&&(yield this.buffer.substr(this.pos,s),this.pos=n),s}*pushUntil(t){let n=this.pos,r=this.buffer[n];for(;!t(r);)r=this.buffer[++n];return yield*this.pushToIndex(n,!1)}};var As=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 dn(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function nh(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 sh(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 ko(e){switch(e.type){case"document":return e.start;case"block-map":{let t=e.items[e.items.length-1];return t.sep??t.start}case"block-seq":return e.items[e.items.length-1].start;default:return[]}}function kr(e){if(e.length===0)return[];let t=e.length;e:for(;--t>=0;)switch(e[t].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break e}for(;e[++t]?.type==="space";);return e.splice(t,e.length)}function To(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 rh(e){if(e.start.type==="flow-seq-start")for(let t of e.items)t.sep&&!t.value&&!dn(t.start,"explicit-key-ind")&&!dn(t.sep,"map-value-ind")&&(t.key&&(t.value=t.key),delete t.key,sh(t.value)?t.value.end?To(t.value.end,t.sep):t.value.end=t.sep:To(t.start,t.sep),delete t.sep)}var Es=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 Cs,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=eh(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"&&rh(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&&nh(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":{nh(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=ko(this.peek(2)),r=kr(n),s;t.end?(s=t.end,s.push(this.sourceToken),delete t.end):s=[this.sourceToken];let i={type:"block-map",offset:t.offset,indent:t.indent,items:[{start:r,key:t,sep:s}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=i}else yield*this.lineEnd(t)}*blockScalar(t){switch(this.type){case"space":case"comment":case"newline":t.props.push(this.sourceToken);return;case"scalar":if(t.source=this.source,this.atNewLine=!0,this.indent=0,this.onNewLine){let n=this.source.indexOf(`
205
205
  `)+1;for(;n!==0;)this.onNewLine(this.offset+n),n=this.source.indexOf(`
206
- `,n)+1}yield*this.pop();break;default:yield*this.pop(),yield*this.step()}}*blockMap(t){let n=t.items[t.items.length-1];switch(this.type){case"newline":if(this.onKeyLine=!1,n.value){let r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):t.items.push({start:[this.sourceToken]})}else n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)t.items.push({start:[this.sourceToken]});else if(n.sep)n.sep.push(this.sourceToken);else{if(this.atIndentedComment(n.start,t.indent)){let s=t.items[t.items.length-2]?.value?.end;if(Array.isArray(s)){yo(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(dn(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(th(n.key)&&!dn(n.sep,"newline")){let o=wr(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(dn(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=wr(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]}):dn(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&&!dn(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)){yo(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||dn(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=go(r),i=wr(s);eh(t);let o=t.end.splice(1,t.end.length);o.push(this.sourceToken);let a={type:"block-map",offset:t.offset,indent:t.indent,items:[{start:i,key:t,sep:o}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=a}else yield*this.lineEnd(t)}}flowScalar(t){if(this.onNewLine){let n=this.source.indexOf(`
206
+ `,n)+1}yield*this.pop();break;default:yield*this.pop(),yield*this.step()}}*blockMap(t){let n=t.items[t.items.length-1];switch(this.type){case"newline":if(this.onKeyLine=!1,n.value){let r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):t.items.push({start:[this.sourceToken]})}else n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)t.items.push({start:[this.sourceToken]});else if(n.sep)n.sep.push(this.sourceToken);else{if(this.atIndentedComment(n.start,t.indent)){let s=t.items[t.items.length-2]?.value?.end;if(Array.isArray(s)){To(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(dn(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(sh(n.key)&&!dn(n.sep,"newline")){let o=kr(n.start),a=n.key,l=n.sep;l.push(this.sourceToken),delete n.key,delete n.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:a,sep:l}]})}else i.length>0?n.sep=n.sep.concat(i,this.sourceToken):n.sep.push(this.sourceToken);else if(dn(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=kr(n.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]})}else n.sep?n.value||s?t.items.push({start:i,key:null,sep:[this.sourceToken]}):dn(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&&!dn(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)){To(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||dn(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=ko(r),i=kr(s);rh(t);let o=t.end.splice(1,t.end.length);o.push(this.sourceToken);let a={type:"block-map",offset:t.offset,indent:t.indent,items:[{start:i,key:t,sep:o}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=a}else yield*this.lineEnd(t)}}flowScalar(t){if(this.onNewLine){let n=this.source.indexOf(`
207
207
  `)+1;for(;n!==0;)this.onNewLine(this.offset+n),n=this.source.indexOf(`
208
- `,n)+1}return{type:t,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(t){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let n=go(t),r=wr(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=go(t),r=wr(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 DS(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new Is||null,prettyErrors:t}}function Qc(e,t={}){let{lineCounter:n,prettyErrors:r}=DS(t),s=new vs(n?.addNewLine),i=new Ps(t),o=null;for(let a of i.compose(s.parse(e),!0,e.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new ut(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(jc(e,n)),o.warnings.forEach(jc(e,n))),o}var Cs=1024*1024;function Zc(e,t){Buffer.byteLength(e)>Cs&&wo(t,[`Definition exceeds ${Cs} bytes.`]);let n=Qc(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];Qe(n,(i,o)=>{qe(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&&wo(t,s),n.contents===null&&wo(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){wo(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function wo(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 xS}from"node:crypto";var kr=/^[a-z][a-z0-9_-]{0,63}$/,nh=/\$\{\{\s*([^{}]+?)\s*\}\}/g,rh=32,sh=128,FS=16,LS=32,MS=10080*60*1e3,Tr=32*1024,ih=16;function nd(e,t){let n=[],r=Ue(e,"$",n);ft(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=zS(r.name,"$.name",n),i=qS(r.limits,n),o=US(r.inputs,n),a=BS(r.steps,n);a.length>sh&&n.push(`$.steps may contain at most ${sh} steps.`),a.filter(u=>u.kind==="agent"&&u.createChild).length>i.maxTasks&&n.push("$.steps creates more child tasks than limits.max_tasks allows.");let l=new Set(a.map(u=>u.id));for(let u of a)for(let p of u.needs)l.has(p)||n.push(`$.steps.${u.id}.needs references missing step "${p}".`),p===u.id&&n.push(`$.steps.${u.id}.needs cannot reference itself.`);let c=KS(a,n);c&&GS(a,o,c.ancestors,n),n.length>0&&QS(t,n);let d={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:d,hash:xS("sha256").update(td(d)).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 qS(e,t){let n=Ue(e,"$.limits",t);ft(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=oh(n.max_concurrency,"$.limits.max_concurrency",1,FS,t),s=oh(n.max_tasks,"$.limits.max_tasks",1,LS,t),i=ch(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function US(e,t){if(e===void 0)return{};let n=Ue(e,"$.inputs",t),r=Object.entries(n);r.length>rh&&t.push(`$.inputs may contain at most ${rh} inputs.`);let s={};for(let[i,o]of r){kr.test(i)||t.push(`$.inputs key "${i}" must match ${kr}.`);let a=Ue(o,`$.inputs.${i}`,t);ft(a,["type","required","default"],`$.inputs.${i}`,t);let l=XS(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:JS(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&&!ah(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&ah(a.default,l)?{defaultValue:a.default}:{}}}return s}function BS(e,t){let n=Ue(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{kr.test(s)||t.push(`$.steps key "${s}" must match ${kr}.`);let o=Ue(i,`$.steps.${s}`,t),a=lh(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?VS(s,o,a,t):WS(s,o,a,t)})}function WS(e,t,n,r){ft(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?Ut(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let u=Ue(t.create_child,`$.steps.${e}.create_child`,r);ft(u,["repo","workspace"],`$.steps.${e}.create_child`,r),u.repo!==void 0&&u.workspace!==void 0&&r.push(`$.steps.${e}.create_child accepts only one of repo or workspace.`),a={...u.repo!==void 0?{repo:Ut(u.repo,`$.steps.${e}.create_child.repo`,r)}:{},...u.workspace!==void 0?{workspace:Ut(u.workspace,`$.steps.${e}.create_child.workspace`,r)}:{}}}let l;if(t.agent!==void 0){let u=Ue(t.agent,`$.steps.${e}.agent`,r);if(ft(u,["runner"],`$.steps.${e}.agent`,r),u.runner!==void 0)try{l=k.runners.parse(Ut(u.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=Ut(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>Tr&&r.push(`$.steps.${e}.prompt exceeds ${Tr} bytes.`);let d;if(t.output!==void 0){let u=Ue(t.output,`$.steps.${e}.output`,r);ft(u,["schema"],`$.steps.${e}.output`,r),d=ed(u.schema,`$.steps.${e}.output.schema`,r,0)}return{kind:"agent",id:e,needs:n,prompt:c,...o!==void 0?{task:o}:{},...a?{createChild:a}:{},...l?{runner:l}:{},...d?{outputSchema:d}:{}}}function VS(e,t,n,r){ft(t,["needs","human_review"],`$.steps.${e}`,r);let s=Ue(t.human_review,`$.steps.${e}.human_review`,r);ft(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=Ue(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);ft(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=Ut(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:Ut(s.title,`$.steps.${e}.human_review.title`,r),summary:Ut(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:ch(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function ed(e,t,n,r){if(r>ih)return n.push(`${t} exceeds the maximum schema depth of ${ih}.`),{};let s=Ue(e,t,n);ft(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&&lh(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=Ue(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))ed(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&ed(s.items,`${t}.items`,n,r+1),s}function KS(e,t){let n=new Set(e.map(u=>u.id));if(e.some(u=>u.needs.some(p=>!n.has(p))))return null;let r=new Map(e.map((u,p)=>[u.id,p])),s=new Map(e.map(u=>[u.id,u.needs.length])),i=new Map;for(let u of e)for(let p of u.needs)i.set(p,[...i.get(p)??[],u.id]);let o=e.filter(u=>u.needs.length===0).map(u=>u.id),a=[],l=[];for(;o.length>0;){o.sort((h,f)=>r.get(h)-r.get(f));let u=o;l.push(u),a.push(...u);let p=[];for(let h of u)for(let f of i.get(h)??[]){let m=s.get(f)-1;s.set(f,m),m===0&&p.push(f)}o=p}if(a.length!==e.length)return t.push("$.steps must form an acyclic graph."),null;let c=new Map(e.map(u=>[u.id,u])),d=new Map;for(let u of a){let p=new Set;for(let h of c.get(u).needs){p.add(h);for(let f of d.get(h)??[])p.add(f)}d.set(u,p)}return{order:a,waves:l,ancestors:d}}function GS(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(nh)],c=a.replace(nh,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let d of l)HS(d[1].trim(),i,t,n,s,r)}}}function HS(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&&YS(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function YS(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(!ko(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(!ko(a))return;i=a}}function td(e){return Array.isArray(e)?`[${e.map(td).join(",")}]`:ko(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${td(e[t])}`).join(",")}}`:JSON.stringify(e)}function Ue(e,t,n){return ko(e)?e:(n.push(`${t} must be an object.`),{})}function ft(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 zS(e,t,n){let r=Ut(e,t,n);return kr.test(r)||n.push(`${t} must match ${kr}.`),r}function Ut(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function lh(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 oh(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 JS(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function XS(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function ah(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function ch(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>MS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function QS(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var ko=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as ZS,stat as eI}from"node:fs/promises";var tI=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function rd(e){let t=await dh(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 sd(e,t){let n=await dh(e),r=nI(n.definition.inputs,t),s=new Map(n.waves.flatMap((a,l)=>a.map(c=>[c,l]))),i=new Map(n.definition.steps.map(a=>[a.id,a])),o=n.order.map(a=>{let l=i.get(a);return l.kind==="human_review"?{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:null,runner:null,prompt:null,outputSchema:null,review:{title:$n(l.title,r,`$.steps.${a}.human_review.title`),summary:$n(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?$n(l.feedbackTask,r,`$.steps.${a}.human_review.feedback_target.task`):null,timeoutMs:l.timeoutMs??n.definition.limits.timeoutMs}}:{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:l.task?{type:"task",task:$n(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",...l.createChild?.repo?{repo:$n(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)}:{},...l.createChild?.workspace?{workspace:$n(l.createChild.workspace,r,`$.steps.${a}.create_child.workspace`)}:{}},runner:l.runner??null,prompt:iI(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 dh(e){let t;try{let n=await eI(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>Cs)throw new Error(`Definition exceeds ${Cs} bytes.`);t=await ZS(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return nd(Zc(t,e),e)}function nI(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]=rI(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 rI(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 sI(e,t){return e.replace(tI,(n,r)=>{if(!Object.hasOwn(t,r))throw new g("FURY_INPUT_INVALID",`Input "${r}" is required by a template but has no value.`,{details:{input:r}});return String(t[r])})}function $n(e,t,n){let r=sI(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 iI(e,t,n){let r=`$.steps.${n}.prompt`,s=$n(e,t,r);if(Buffer.byteLength(s)>Tr)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${Tr} bytes.`,{details:{location:r,maxBytes:Tr}});return s}import{createHash as uh}from"node:crypto";import oI from"node:path";import{mkdir as aI}from"node:fs/promises";var id={type:"system",component:"heartbeat"};async function un(e,t={}){await aI(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([P.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):Ft.listAgents(e),Kf(e),mI(e)]),o=r??Rt(n.tasks.filter(f=>f.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=fI(i),l=a!==i,c=[],d=od(s.filter(pI),f=>f.taskId),u=od(s.filter(f=>f.type.startsWith("task.pr.")),f=>f.taskId),p=od(s.filter(f=>f.type==="agent.state.changed"),f=>f.agentTabId);for(let f of n.tasks){let m=lI(f),y=d.get(f.id),T=ld(y?.data)??a.tasks[f.id]??null,R=y?.id??a.tasks[f.id]?.eventId??null;if(T?.signature!==m.signature){let _=T?f.status==="closed"&&T?.status!=="closed"?"task.closed":"task.updated":"task.created",A=await Le(e,{id:ad(_,f.id,m.signature),type:_,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:id,data:{...m,changedFields:T?dI(T,m):[]}});c.push(A),R=A.id}a.tasks[f.id]={...m,eventId:R};let b=uI(f.prs),$=u.get(f.id),N=ld($?.data)??a.pullRequests[f.id]??null,D=$?.id??a.pullRequests[f.id]?.eventId??null;if((N||b.associations.length>0)&&N?.signature!==b.signature){let _=Array.isArray(N?.associations)?N.associations.length:0,A=b.associations.length>_?"task.pr.linked":b.associations.length<_?"task.pr.unlinked":"task.pr.refreshed",Y=await Le(e,{id:ad(A,f.id,b.signature),type:A,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:id,data:b});c.push(Y),D=Y.id}a.pullRequests[f.id]={...b,eventId:D}}let h=new Map(o.tasks.map(f=>[f.taskId,f.state]));for(let f of o.agents){let m=p.get(f.tabId),y=ld(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 Le(e,{id:ad("agent.state.changed",f.tabId,T),type:"agent.state.changed",taskId:f.taskId,agentTabId:f.tabId,actor:id,data:{previousState:typeof y?.state=="string"?y.state:null,state:f.state,taskState:h.get(f.taskId)??"idle",sessionState:f.sessionState,lastActivityAt:f.lastActivityAt,exitCode:f.exitCode,error:f.error}});c.push(R),a.agents[f.tabId]={state:f.state,eventId:R.id}}return(c.length>0||l)&&await U(fh(e),a),c}function lI(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:ph(t)}}var cI=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function dI(e,t){return cI.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function uI(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:ph(t)}}function od(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var pI=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",ph=e=>uh("sha256").update(JSON.stringify(e)).digest("hex"),ad=(...e)=>uh("sha256").update(e.join("\0")).digest("hex"),ld=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,fh=e=>oI.join(e.orchestrationDir,"event-reconciliation.json");function fI(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 mI(e){try{return await Vs(fh(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function hI(e,t){return await cd(e),await un(e),In(e,t)}async function gI(e,t,n){await cd(e);let r=await Ft.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await un(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 mh(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function yI(e,t,n){await cd(e);let r=await P.getTask(e,t);if(n.tabId&&!r.ptyTabs.some(i=>i.kind==="agent"&&i.id===n.tabId))throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${t}.`,{details:{taskId:t,tabId:n.tabId}});let s=await Ft.openObserver(e);try{await un(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=Rt([r],s.getSnapshots(),l),d=n.tabId?c.agents.find(h=>h.tabId===n.tabId)?.state??"idle":c.tasks[0]?.state??"idle";if(n.states.includes(d))return{kind:"waitTask",taskId:t,tabId:n.tabId??null,state:d,matchedStates:[...n.states],observedAt:new Date(l).toISOString()};if(n.signal?.aborted)throw kI(t);let u=a-Date.now();if(u<=0)throw wI(t,n.states,n.timeoutMs);await un(e,{agentObserver:s}),o=(await In(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await mh(Math.min(250,u),n.signal)}}finally{s.close()}}async function cd(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 mh(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 wI=(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}}),kI=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),To={list:hI,watch:gI,waitForTaskState:yI,reconcile:un};import{readFile as LI}from"node:fs/promises";import{mkdir as $I,readFile as Rh,rm as Ph}from"node:fs/promises";import{createConnection as NI}from"node:net";import DI from"node:path";import{spawn as SI}from"node:child_process";import{closeSync as II,openSync as vI}from"node:fs";import ud from"node:path";import{accessSync as TI,constants as bI}from"node:fs";import{homedir as hh}from"node:os";import pn from"node:path";var RI=[pn.join(hh(),".local","bin"),pn.join(hh(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function yh(e=process.env){return PI([...(e.PATH??"").split(pn.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:RI])}function bo(e=process.env){return{...e,PATH:yh(e).join(pn.delimiter)}}function dd(e,t={}){if(e.includes(pn.sep)){let n=pn.isAbsolute(e)?e:pn.resolve(t.cwd??process.cwd(),e);return gh(n)?n:null}for(let n of yh(t.env)){let r=pn.join(n,e);if(gh(r))return r}return null}function Ro(e,t={}){let n=dd(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 gh(e){try{return TI(e,bI.X_OK),!0}catch{return!1}}function PI(e){return[...new Set(e)]}function Po(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=CI(e.workspaceRoot),s=vI(ud.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return SI(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{II(s)}})().unref()}function CI(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=ud.resolve(ud.dirname(t),"..","node_modules",".bin","tsx");return{command:dd("tsx")??n,args:[t,"__craig-daemon",e]}}if(!t)throw new Error("Craig cannot resolve its daemon entrypoint.");return{command:process.execPath,args:[...process.execArgv,t,"__craig-daemon",e]}}import{mkdir as wh,readFile as kh,rm as pd,stat as Th,utimes as AI,writeFile as EI}from"node:fs/promises";import As from"node:path";async function fd(e){let t=As.join(e.runtimeDir,"orchestration-supervisor.lock","owner.json");try{let[n,r]=await Promise.all([kh(t,"utf8").then(i=>JSON.parse(i)),Th(t)]),s=Date.now()-r.mtimeMs;return n.protocolVersion===Pt&&s>=-1e3&&s<5e3&&typeof n.pid=="number"&&bh(n.pid)}catch{return!1}}async function md(e){let t=As.join(e.runtimeDir,"orchestration-supervisor.lock");await wh(e.runtimeDir,{recursive:!0});try{await wh(t)}catch(r){if(!OI(r))throw r;let s=await kh(As.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await Th(t).catch(()=>null);if(typeof s?.pid=="number"&&!bh(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await pd(t,{recursive:!0,force:!0}),md(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await EI(As.join(t,"owner.json"),JSON.stringify({pid:process.pid,protocolVersion:Pt,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await pd(t,{recursive:!0,force:!0}),r}let n=!1;return{async heartbeat(){if(n)return;let r=new Date;await AI(As.join(t,"owner.json"),r,r)},async release(){n||(n=!0,await pd(t,{recursive:!0,force:!0}))}}}function bh(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 OI=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";async function Dn(e){let t=await Io(Fe(e).socketPath).catch(()=>null);if(!t)return fd(e);try{let n=await Nn(t,{type:"ping"});return en(n.protocolVersion)?(await Nn(t,{type:"wakeOrchestration"}),!0):!1}catch{return fd(e)}finally{t.end()}}async function So(e,t){if(t.length===0)return!0;let n=await Io(Fe(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await Nn(n,{type:"ping"});if(!en(r.protocolVersion))return!1;for(let s of t)await Nn(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function Ih(e,t){await _I(e);let n=await Io(Fe(e).socketPath);try{let r=await Nn(n,{type:"ping"});if(!en(r.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await Nn(n,{type:"ensureSession",taskId:t.taskId,tabId:t.tabId,size:{columns:120,rows:36},spec:{cwd:t.cwd,command:t.command,...t.env?{env:t.env}:{}}})}finally{n.end()}}async function _I(e){let t=Fe(e),n=await Sh(t.socketPath).catch(()=>null);if(en(n?.protocolVersion))return;if(n)throw new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly.");await $I(e.runtimeDir,{recursive:!0});let r=await Rh(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&xI(s))throw new Error("A Craig PTY daemon process is still running but is not accepting connections. Stop it explicitly before starting another daemon.");await Promise.all([Ph(t.socketPath,{force:!0}),Ph(t.pidPath,{force:!0})]),Po(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await Sh(t.socketPath).catch(()=>null);if(en(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await Rh(DI.join(e.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
209
- ${o.slice(-2e3)}`:""}`)}async function Sh(e){let t=await Io(e);try{return await Nn(t,{type:"ping"})}finally{t.end()}}function xI(e){try{return process.kill(e,0),!0}catch{return!1}}var FI=1;function Nn(e,t){let n=FI++;return new Promise((r,s)=>{let i="",o=setTimeout(()=>{l(),e.destroy(),s(new Error("Craig PTY daemon request timed out."))},1e3),a=c=>{i+=String(c);let d=i.indexOf(`
210
- `);if(d===-1)return;l();let u=JSON.parse(i.slice(0,d));u.ok?r(u):s(new Error(u.error??"Craig PTY daemon request failed."))},l=()=>{clearTimeout(o),e.off("data",a)};e.on("data",a),e.write(`${JSON.stringify({...t,id:n})}
211
- `)})}function Io(e){return new Promise((t,n)=>{let r=NI(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function MI(e,t){await VI(e);let n=await P.getTask(e,t.taskId);if(n.status==="closed")throw new g("COMMAND_STATE_CONFLICT",`Task ${n.id} is ${n.status} and cannot receive prompts.`,{details:{taskId:n.id,taskStatus:n.status}});let r=n.ptyTabs.filter(a=>a.kind==="agent"),s=t.tabId?r.find(a=>a.id===t.tabId):r[0];if(!s)throw new g("TASK_CONTEXT_CONFLICT",t.tabId?`Agent tab ${t.tabId} does not belong to task ${n.id}.`:`Task ${n.id} has no agent tab.`,{details:{taskId:n.id,tabId:t.tabId??null}});let i=await WI(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 Dn(e),a}return await hd(e,o.command.id),o}async function hd(e,t){if((await ue.show(e,t)).command.state==="delivered"||await Dn(e))return;let r=(await ue.show(e,t)).command;if(r.state==="delivered")return;let s=r.state==="queued"?await ue.fail(e,r.id,{code:"ORCHESTRATION_UNAVAILABLE",message:"Craig could not wake the workspace orchestration supervisor.",retryable:!0,deliveryUncertain:!1}):r;throw new g("PARTIAL_RESULT",`Command ${r.id} was persisted as ${s.state}, but Craig could not start prompt delivery.`,{retryable:!0,details:{commandId:r.id,durableState:s.state}})}async function jI(e,t){return ue.show(e,t)}async function qI(e,t){return ue.list(e,t)}async function UI(e,t){let n;try{n=await ue.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await Dn(e),r}return await Dn(e),n}async function BI(e,t,n){return ue.wait(e,t,n)}async function WI(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await LI(e.path,"utf8")}}catch(n){throw new g("CLI_USAGE",`Unable to read prompt file ${e.path}.`,{details:{promptFile:e.path},cause:n})}if(!t)throw new g("INPUT_REQUIRED","Prompt input from stdin is unavailable.",{});return{source:"stdin",text:await t()}}async function VI(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Prompt dispatch is a feature preview. Enable agentOrchestration before sending prompts.",{details:{preview:"agentOrchestration"}})}var br={send:MI,show:jI,list:qI,cancel:UI,wait:BI};function vo(e,t){if(t!=="codex")return e;let[n="codex",...r]=e,s=["--no-alt-screen","--no-daemon"].filter(a=>!r.includes(a)),i="check_for_update_on_startup=false",o=r.includes(i)?[]:["-c",i];return[n,...s,...r,...o]}var KI=6e4;async function Co(e,t){return kc(e,t,{createTask:GI})}async function vh(e,t,n,r={}){return wc(e,t,n,{...r,launchProvisioned:(s,i)=>Ch(e,s,i,!1)})}async function GI(e,t,n,r={}){return P.createTask(e,t,n,{...r,markStartedAfterLaunch:!1,launchProvisioned:(s,i)=>Ch(e,s,i,!0)})}async function Ch(e,t,n,r=!1){let s=t.ptyTabs.find(i=>i.kind==="agent");if(!s)throw new Error(`Task ${t.id} is missing its agent PTY tab.`);try{if(await Ih(e,{taskId:t.id,tabId:s.id,cwd:t.worktreePath,command:vo(r?s.command:t.runnerSession.command,s.runner??t.runner),...n?{env:n}:{}}),!r)return;let i=await ue.create(e,{taskId:t.id,agentTabId:s.id,prompt:{source:"inline",text:t.prompt.value},delivery:"when-ready",timeoutMs:KI,idempotencyKey:`task-start:${t.id}`,actor:{type:"system",component:"orchestration-supervisor"}});await hd(e,i.command.id)}catch(i){throw await So(e,[s.id]),i}}async function Ao(e,t,n){let r=(await P.listTasks(e,{includeClosed:!0})).tasks,s=new Set([t]),i=!0;for(;i;){i=!1;for(let a of r)a.parentTaskId&&s.has(a.parentTaskId)&&!s.has(a.id)&&(s.add(a.id),i=!0)}let o=r.filter(a=>s.has(a.id)).flatMap(a=>a.ptyTabs.map(l=>l.id));try{let a=await bc(e,t,n);if(!await So(e,o))throw new g("PARTIAL_RESULT","The task tree was closed, but Craig could not stop its agent sessions. Retry cancellation after the daemon is available.",{retryable:!0,details:{taskId:t,persisted:!0,sessionsStopped:!1}});return a}catch(a){throw a instanceof g&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await So(e,o),a}}import{randomUUID as Oh}from"node:crypto";import{readFile as HI,realpath as Ah}from"node:fs/promises";import gd from"node:path";var X={type:"system",component:"orchestration-supervisor"},YI=/\$\{\{\s*steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)\s*\}\}/g;async function zI(e,t,n,r,s,i){await wd(e);let o=await dv(e,t);if(await P.getTask(e,r),s.type==="agent"){if(!i||s.taskId!==r)throw new g("CAPABILITY_DENIED","An agent may only plan Fury work rooted at its own task.",{});await Xe(e,i,"fury.plan",r)}let a=await sd(t,n);uv(a.steps,r);let l=new Date().toISOString(),c={schemaVersion:1,definitionHash:a.definitionHash,name:a.name,sourceFile:o,rootTaskId:r,inputs:a.inputs,limits:a.limits,order:a.order,waves:a.waves,steps:a.steps},d={...c,id:`fury_plan_${Oh()}`,planHash:Hl(c),createdBy:s,createdAt:l};await Cf(e,a.definitionHash,await HI(t,"utf8"));let u=await Af(e,d);try{await Le(e,{id:`${u.id}:fury.plan.created`,taskId:r,type:"fury.plan.created",occurredAt:u.createdAt,actor:u.createdBy,data:{planId:u.id,planHash:u.planHash,name:u.name}})}catch(p){throw new g("PARTIAL_RESULT",`Fury plan ${u.id} was persisted, but its audit event could not be recorded.`,{details:{planId:u.id,planHash:u.planHash,persisted:!0},cause:p})}return{kind:"planFury",plan:u}}async function JI(e,t,n){if(await wd(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 $f(e,s);try{await Le(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 XI(e,t,n,r){await wd(e);let s=await Pi(e,t);if((await Nf(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 Xe(e,r,"fury.run",s.rootTaskId)}await st(e,await P.getTask(e,s.rootTaskId));let o=new Date,l={schemaVersion:1,id:`fury_${Oh()}`,planId:s.id,planHash:s.planHash,definitionHash:s.definitionHash,name:s.name,sourceFile:s.sourceFile,rootTaskId:s.rootTaskId,state:"pending",inputs:s.inputs,limits:s.limits,order:s.order,stepRuns:Object.fromEntries(s.steps.map(d=>[d.id,{id:d.id,kind:d.kind,needs:d.needs,state:"pending",plan:d,taskId:null,agentTabId:null,commandId:null,reviewId:null,output:null,error:null,startedAt:null,completedAt:null,deadlineAt:null,completedBy:null}])),actor:n,createdAt:o.toISOString(),updatedAt:o.toISOString(),stateChangedAt:o.toISOString(),deadlineAt:new Date(o.getTime()+s.limits.timeoutMs).toISOString(),completedAt:null},c=await Df(e,l);try{await le(e,c.run,null,"fury.run.created",c.run.actor,{state:"pending"})}catch(d){throw new g("PARTIAL_RESULT",`Fury run ${c.run.id} was persisted, but its audit event could not be recorded.`,{details:{runId:c.run.id,planId:c.run.planId,persisted:!0},cause:d})}return ne(c.run)||await Fn(e,c.run.id),{kind:"runFury",run:await te(e,c.run.id),created:c.created}}async function QI(e,t){return{kind:"showFury",run:await te(e,t)}}async function Oo(e,t={}){let n=await k.load(e),r=k.previews.isEnabled(n,"agentOrchestration");for(let s of await Si(e))await ZI(e,s.id,{...t,allowScheduling:r})}async function ZI(e,t,n={}){let r=n.allowScheduling??k.previews.isEnabled(await k.load(e),"agentOrchestration"),s=await te(e,t);if(await hv(e,s),ne(s)){s.cleanupPending&&await gv(e,s);return}if(s=await wv(e,s),await yv(e,s),Date.now()>=Date.parse(s.deadlineAt)){if(s=await ve(e,t,a=>ne(a)?a:mv(a)),s.state!=="timed_out")return;for(let a of Object.values(s.stepRuns))a.reviewId&&await ir(e,a.reviewId,l=>["waiting_for_review","changes_requested"].includes(l.state)?{...l,state:"timed_out",version:l.version+1,updatedAt:new Date().toISOString()}:l);await le(e,s,null,"fury.run.timed_out",X,{state:s.state});return}let i=new Map((await Me(e)).map(a=>[a.id,a]));for(let a of s.order){let l=s.stepRuns[a];if(r&&l.state==="running"&&!l.taskId){s=await Eh(e,s,l);continue}l.state==="running"&&l.commandId&&i.get(l.commandId)?.state==="failed"&&(s=await Eo(e,s.id,l.id,i.get(l.commandId)?.lastError?.message??"Prompt delivery failed.",X));let c=!l.commandId||i.get(l.commandId)?.state==="delivered";l.state==="running"&&l.agentTabId&&c&&n.isAgentAvailable&&l.startedAt&&Date.now()-Date.parse(l.startedAt)>2e3&&!n.isAgentAvailable(l.agentTabId)&&(s=await Eo(e,s.id,l.id,`Agent session ${l.agentTabId} disappeared.`,X)),l.state==="running"&&l.deadlineAt&&Date.now()>=Date.parse(l.deadlineAt)&&(s=await ve(e,s.id,d=>ne(d)?d:Bt(d,l.id,{state:"timed_out",error:"Step timed out.",completedAt:new Date().toISOString(),completedBy:X})),s.stepRuns[l.id]?.state==="timed_out"&&await le(e,s,l.id,"fury.step.timed_out",X,{})),(l.state==="waiting_for_review"||l.state==="changes_requested")&&l.deadlineAt&&Date.now()>=Date.parse(l.deadlineAt)&&(l.reviewId&&await ir(e,l.reviewId,d=>({...d,state:"timed_out",version:d.version+1,updatedAt:new Date().toISOString()})),s=await ve(e,s.id,d=>ne(d)?d:Bt(d,l.id,{state:"timed_out",error:"Review timed out.",completedAt:new Date().toISOString(),completedBy:X})),s.stepRuns[l.id]?.state==="timed_out"&&await le(e,s,l.id,"fury.review.timed_out",X,{reviewId:l.reviewId}))}if(Object.values(s.stepRuns).some(a=>a.state==="failed"||a.state==="timed_out")){await $o(e,s.id,"failed",X);return}let o=Object.values(s.stepRuns).filter(a=>a.state==="running").length;for(let a of s.order){if(o>=s.limits.maxConcurrency)break;let l=s.stepRuns[a];l.state!=="pending"||!l.needs.every(c=>s.stepRuns[c]?.state==="succeeded")||(l.kind==="human_review"?s=await ev(e,s,l):r&&(s=await Eh(e,s,l),o+=1))}await fv(e,s.id)}async function Eh(e,t,n){let r=new Date;if(t=await ve(e,t.id,i=>ne(i)?i:Bt(i,n.id,{state:"running",startedAt:i.stepRuns[n.id]?.startedAt??r.toISOString(),deadlineAt:i.deadlineAt})),ne(t))return t;await le(e,t,n.id,"fury.step.started",X,{});let s=t.stepRuns[n.id];if(s.taskId)return t;try{let i=`${xn(s.plan.prompt,t)}
208
+ `,n)+1}return{type:t,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(t){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let n=ko(t),r=kr(n);return r.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let n=ko(t),r=kr(n);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(t,n){return this.type!=="comment"||this.indent<=n?!1:t.every(r=>r.type==="newline"||r.type==="space")}*documentEnd(t){this.type!=="doc-mode"&&(t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(t){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;default:t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};function US(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new As||null,prettyErrors:t}}function td(e,t={}){let{lineCounter:n,prettyErrors:r}=US(t),s=new Es(n?.addNewLine),i=new vs(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 ut(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(Bc(e,n)),o.warnings.forEach(Bc(e,n))),o}var Os=1024*1024;function nd(e,t){Buffer.byteLength(e)>Os&&bo(t,[`Definition exceeds ${Os} bytes.`]);let n=td(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];Ze(n,(i,o)=>{Ue(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&&bo(t,s),n.contents===null&&bo(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){bo(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function bo(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 WS}from"node:crypto";var Tr=/^[a-z][a-z0-9_-]{0,63}$/,ih=/\$\{\{\s*([^{}]+?)\s*\}\}/g,oh=32,ah=128,VS=16,KS=32,GS=10080*60*1e3,br=32*1024,lh=16;function id(e,t){let n=[],r=Be(e,"$",n);ft(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=rI(r.name,"$.name",n),i=YS(r.limits,n),o=zS(r.inputs,n),a=JS(r.steps,n);a.length>ah&&n.push(`$.steps may contain at most ${ah} 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=ZS(a,n);c&&eI(a,o,c.ancestors,n),n.length>0&&oI(t,n);let u={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:u,hash:WS("sha256").update(sd(u)).digest("hex"),order:c.order,waves:HS(c.waves,i.maxConcurrency)}}function HS(e,t){return e.flatMap(n=>{let r=[];for(let s=0;s<n.length;s+=t)r.push(n.slice(s,s+t));return r})}function YS(e,t){let n=Be(e,"$.limits",t);ft(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=ch(n.max_concurrency,"$.limits.max_concurrency",1,VS,t),s=ch(n.max_tasks,"$.limits.max_tasks",1,KS,t),i=ph(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function zS(e,t){if(e===void 0)return{};let n=Be(e,"$.inputs",t),r=Object.entries(n);r.length>oh&&t.push(`$.inputs may contain at most ${oh} inputs.`);let s={};for(let[i,o]of r){Tr.test(i)||t.push(`$.inputs key "${i}" must match ${Tr}.`);let a=Be(o,`$.inputs.${i}`,t);ft(a,["type","required","default"],`$.inputs.${i}`,t);let l=iI(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:sI(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&&!dh(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&dh(a.default,l)?{defaultValue:a.default}:{}}}return s}function JS(e,t){let n=Be(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{Tr.test(s)||t.push(`$.steps key "${s}" must match ${Tr}.`);let o=Be(i,`$.steps.${s}`,t),a=uh(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?QS(s,o,a,t):XS(s,o,a,t)})}function XS(e,t,n,r){ft(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?Ut(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let d=Be(t.create_child,`$.steps.${e}.create_child`,r);ft(d,["repo","workspace"],`$.steps.${e}.create_child`,r),d.repo!==void 0&&d.workspace!==void 0&&r.push(`$.steps.${e}.create_child accepts only one of repo or workspace.`),a={...d.repo!==void 0?{repo:Ut(d.repo,`$.steps.${e}.create_child.repo`,r)}:{},...d.workspace!==void 0?{workspace:Ut(d.workspace,`$.steps.${e}.create_child.workspace`,r)}:{}}}let l;if(t.agent!==void 0){let d=Be(t.agent,`$.steps.${e}.agent`,r);if(ft(d,["runner"],`$.steps.${e}.agent`,r),d.runner!==void 0)try{l=k.runners.parse(Ut(d.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=Ut(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>br&&r.push(`$.steps.${e}.prompt exceeds ${br} bytes.`);let u;if(t.output!==void 0){let d=Be(t.output,`$.steps.${e}.output`,r);ft(d,["schema"],`$.steps.${e}.output`,r),u=rd(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 QS(e,t,n,r){ft(t,["needs","human_review"],`$.steps.${e}`,r);let s=Be(t.human_review,`$.steps.${e}.human_review`,r);ft(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=Be(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);ft(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=Ut(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:Ut(s.title,`$.steps.${e}.human_review.title`,r),summary:Ut(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:ph(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function rd(e,t,n,r){if(r>lh)return n.push(`${t} exceeds the maximum schema depth of ${lh}.`),{};let s=Be(e,t,n);ft(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&&uh(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=Be(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))rd(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&rd(s.items,`${t}.items`,n,r+1),s}function ZS(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 eI(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(ih)],c=a.replace(ih,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let u of l)tI(u[1].trim(),i,t,n,s,r)}}}function tI(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&&nI(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function nI(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(!Ro(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(!Ro(a))return;i=a}}function sd(e){return Array.isArray(e)?`[${e.map(sd).join(",")}]`:Ro(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${sd(e[t])}`).join(",")}}`:JSON.stringify(e)}function Be(e,t,n){return Ro(e)?e:(n.push(`${t} must be an object.`),{})}function ft(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 rI(e,t,n){let r=Ut(e,t,n);return Tr.test(r)||n.push(`${t} must match ${Tr}.`),r}function Ut(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function uh(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 ch(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 sI(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function iI(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function dh(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function ph(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>GS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function oI(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var Ro=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as aI,stat as lI}from"node:fs/promises";var cI=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function od(e){let t=await fh(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 ad(e,t){let n=await fh(e),r=dI(n.definition.inputs,t),s=new Map(n.waves.flatMap((a,l)=>a.map(c=>[c,l]))),i=new Map(n.definition.steps.map(a=>[a.id,a])),o=n.order.map(a=>{let l=i.get(a);return l.kind==="human_review"?{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:null,runner:null,prompt:null,outputSchema:null,review:{title:$n(l.title,r,`$.steps.${a}.human_review.title`),summary:$n(l.summary,r,`$.steps.${a}.human_review.summary`),feedbackTask:l.feedbackTask?$n(l.feedbackTask,r,`$.steps.${a}.human_review.feedback_target.task`):null,timeoutMs:l.timeoutMs??n.definition.limits.timeoutMs}}:{id:a,kind:l.kind,needs:l.needs,wave:s.get(a),target:l.task?{type:"task",task:$n(l.task,r,`$.steps.${a}.task`)}:{type:"create_child",...l.createChild?.repo?{repo:$n(l.createChild.repo,r,`$.steps.${a}.create_child.repo`)}:{},...l.createChild?.workspace?{workspace:$n(l.createChild.workspace,r,`$.steps.${a}.create_child.workspace`)}:{}},runner:l.runner??null,prompt:fI(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 fh(e){let t;try{let n=await lI(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>Os)throw new Error(`Definition exceeds ${Os} bytes.`);t=await aI(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return id(nd(t,e),e)}function dI(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]=uI(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 uI(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 pI(e,t){return e.replace(cI,(n,r)=>{if(!Object.hasOwn(t,r))throw new g("FURY_INPUT_INVALID",`Input "${r}" is required by a template but has no value.`,{details:{input:r}});return String(t[r])})}function $n(e,t,n){let r=pI(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 fI(e,t,n){let r=`$.steps.${n}.prompt`,s=$n(e,t,r);if(Buffer.byteLength(s)>br)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${br} bytes.`,{details:{location:r,maxBytes:br}});return s}import{createHash as mh}from"node:crypto";import mI from"node:path";import{mkdir as hI}from"node:fs/promises";var ld={type:"system",component:"heartbeat"};async function un(e,t={}){await hI(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([S.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):xt.listAgents(e),Yf(e),RI(e)]),o=r??Rt(n.tasks.filter(f=>f.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=bI(i),l=a!==i,c=[],u=cd(s.filter(TI),f=>f.taskId),d=cd(s.filter(f=>f.type.startsWith("task.pr.")),f=>f.taskId),p=cd(s.filter(f=>f.type==="agent.state.changed"),f=>f.agentTabId);for(let f of n.tasks){let m=gI(f),y=u.get(f.id),T=ud(y?.data)??a.tasks[f.id]??null,R=y?.id??a.tasks[f.id]?.eventId??null;if(T?.signature!==m.signature){let _=T?f.status==="closed"&&T?.status!=="closed"?"task.closed":"task.updated":"task.created",A=await Me(e,{id:dd(_,f.id,m.signature),type:_,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:ld,data:{...m,changedFields:T?wI(T,m):[]}});c.push(A),R=A.id}a.tasks[f.id]={...m,eventId:R};let b=kI(f.prs),$=d.get(f.id),N=ud($?.data)??a.pullRequests[f.id]??null,D=$?.id??a.pullRequests[f.id]?.eventId??null;if((N||b.associations.length>0)&&N?.signature!==b.signature){let _=Array.isArray(N?.associations)?N.associations.length:0,A=b.associations.length>_?"task.pr.linked":b.associations.length<_?"task.pr.unlinked":"task.pr.refreshed",z=await Me(e,{id:dd(A,f.id,b.signature),type:A,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:ld,data:b});c.push(z),D=z.id}a.pullRequests[f.id]={...b,eventId:D}}let h=new Map(o.tasks.map(f=>[f.taskId,f.state]));for(let f of o.agents){let m=p.get(f.tabId),y=ud(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 Me(e,{id:dd("agent.state.changed",f.tabId,T),type:"agent.state.changed",taskId:f.taskId,agentTabId:f.tabId,actor:ld,data:{previousState:typeof y?.state=="string"?y.state:null,state:f.state,taskState:h.get(f.taskId)??"idle",sessionState:f.sessionState,lastActivityAt:f.lastActivityAt,exitCode:f.exitCode,error:f.error}});c.push(R),a.agents[f.tabId]={state:f.state,eventId:R.id}}return(c.length>0||l)&&await U(gh(e),a),c}function gI(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:hh(t)}}var yI=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function wI(e,t){return yI.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function kI(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:hh(t)}}function cd(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var TI=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",hh=e=>mh("sha256").update(JSON.stringify(e)).digest("hex"),dd=(...e)=>mh("sha256").update(e.join("\0")).digest("hex"),ud=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,gh=e=>mI.join(e.orchestrationDir,"event-reconciliation.json");function bI(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 RI(e){try{return await Ys(gh(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function PI(e,t){return await pd(e),await un(e),In(e,t)}async function SI(e,t,n){await pd(e);let r=await xt.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await un(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 yh(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function II(e,t,n){await pd(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 xt.openObserver(e);try{await un(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=Rt([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 CI(t);let d=a-Date.now();if(d<=0)throw vI(t,n.states,n.timeoutMs);await un(e,{agentObserver:s}),o=(await In(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await yh(Math.min(250,d),n.signal)}}finally{s.close()}}async function pd(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 yh(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 vI=(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}}),CI=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),Po={list:PI,watch:SI,waitForTaskState:II,reconcile:un};import{readFile as KI}from"node:fs/promises";import{mkdir as jI,readFile as Ih,rm as vh}from"node:fs/promises";import{createConnection as qI}from"node:net";import UI from"node:path";import{spawn as NI}from"node:child_process";import{closeSync as DI,openSync as _I}from"node:fs";import md from"node:path";import{accessSync as AI,constants as EI}from"node:fs";import{homedir as wh}from"node:os";import pn from"node:path";var OI=[pn.join(wh(),".local","bin"),pn.join(wh(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function Th(e=process.env){return $I([...(e.PATH??"").split(pn.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:OI])}function So(e=process.env){return{...e,PATH:Th(e).join(pn.delimiter)}}function fd(e,t={}){if(e.includes(pn.sep)){let n=pn.isAbsolute(e)?e:pn.resolve(t.cwd??process.cwd(),e);return kh(n)?n:null}for(let n of Th(t.env)){let r=pn.join(n,e);if(kh(r))return r}return null}function Io(e,t={}){let n=fd(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 kh(e){try{return AI(e,EI.X_OK),!0}catch{return!1}}function $I(e){return[...new Set(e)]}function vo(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=FI(e.workspaceRoot),s=_I(md.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return NI(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{DI(s)}})().unref()}function FI(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=md.resolve(md.dirname(t),"..","node_modules",".bin","tsx");return{command:fd("tsx")??n,args:[t,"__craig-daemon",e]}}if(!t)throw new Error("Craig cannot resolve its daemon entrypoint.");return{command:process.execPath,args:[...process.execArgv,t,"__craig-daemon",e]}}import{mkdir as bh,readFile as Rh,rm as hd,stat as Ph,utimes as xI,writeFile as LI}from"node:fs/promises";import $s from"node:path";async function gd(e){let t=$s.join(e.runtimeDir,"orchestration-supervisor.lock","owner.json");try{let[n,r]=await Promise.all([Rh(t,"utf8").then(i=>JSON.parse(i)),Ph(t)]),s=Date.now()-r.mtimeMs;return n.protocolVersion===Pt&&s>=-1e3&&s<5e3&&typeof n.pid=="number"&&Sh(n.pid)}catch{return!1}}async function yd(e){let t=$s.join(e.runtimeDir,"orchestration-supervisor.lock");await bh(e.runtimeDir,{recursive:!0});try{await bh(t)}catch(r){if(!MI(r))throw r;let s=await Rh($s.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await Ph(t).catch(()=>null);if(typeof s?.pid=="number"&&!Sh(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await hd(t,{recursive:!0,force:!0}),yd(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await LI($s.join(t,"owner.json"),JSON.stringify({pid:process.pid,protocolVersion:Pt,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await hd(t,{recursive:!0,force:!0}),r}let n=!1;return{async heartbeat(){if(n)return;let r=new Date;await xI($s.join(t,"owner.json"),r,r)},async release(){n||(n=!0,await hd(t,{recursive:!0,force:!0}))}}}function Sh(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 MI=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";async function Dn(e){let t=await Ao(Le(e).socketPath).catch(()=>null);if(!t)return gd(e);try{let n=await Nn(t,{type:"ping"});return en(n.protocolVersion)?(await Nn(t,{type:"wakeOrchestration"}),!0):!1}catch{return gd(e)}finally{t.end()}}async function Co(e,t){if(t.length===0)return!0;let n=await Ao(Le(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await Nn(n,{type:"ping"});if(!en(r.protocolVersion))return!1;for(let s of t)await Nn(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function Ah(e,t){await BI(e);let n=await Ao(Le(e).socketPath);try{let r=await Nn(n,{type:"ping"});if(!en(r.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await Nn(n,{type:"ensureSession",taskId:t.taskId,tabId:t.tabId,size:{columns:120,rows:36},spec:{cwd:t.cwd,command:t.command,...t.env?{env:t.env}:{}}})}finally{n.end()}}async function BI(e){let t=Le(e),n=await Ch(t.socketPath).catch(()=>null);if(en(n?.protocolVersion))return;if(n)throw new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly.");await jI(e.runtimeDir,{recursive:!0});let r=await Ih(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&WI(s))throw new Error("A Craig PTY daemon process is still running but is not accepting connections. Stop it explicitly before starting another daemon.");await Promise.all([vh(t.socketPath,{force:!0}),vh(t.pidPath,{force:!0})]),vo(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await Ch(t.socketPath).catch(()=>null);if(en(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await Ih(UI.join(e.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
209
+ ${o.slice(-2e3)}`:""}`)}async function Ch(e){let t=await Ao(e);try{return await Nn(t,{type:"ping"})}finally{t.end()}}function WI(e){try{return process.kill(e,0),!0}catch{return!1}}var VI=1;function Nn(e,t){let n=VI++;return new Promise((r,s)=>{let i="",o=setTimeout(()=>{l(),e.destroy(),s(new Error("Craig PTY daemon request timed out."))},1e3),a=c=>{i+=String(c);let u=i.indexOf(`
210
+ `);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})}
211
+ `)})}function Ao(e){return new Promise((t,n)=>{let r=qI(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function GI(e,t){await QI(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 XI(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 Dn(e),a}return await wd(e,o.command.id),o}async function wd(e,t){if((await ue.show(e,t)).command.state==="delivered"||await Dn(e))return;let r=(await ue.show(e,t)).command;if(r.state==="delivered")return;let s=r.state==="queued"?await ue.fail(e,r.id,{code:"ORCHESTRATION_UNAVAILABLE",message:"Craig could not wake the workspace orchestration supervisor.",retryable:!0,deliveryUncertain:!1}):r;throw new g("PARTIAL_RESULT",`Command ${r.id} was persisted as ${s.state}, but Craig could not start prompt delivery.`,{retryable:!0,details:{commandId:r.id,durableState:s.state}})}async function HI(e,t){return ue.show(e,t)}async function YI(e,t){return ue.list(e,t)}async function zI(e,t){let n;try{n=await ue.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await Dn(e),r}return await Dn(e),n}async function JI(e,t,n){return ue.wait(e,t,n)}async function XI(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await KI(e.path,"utf8")}}catch(n){throw new g("CLI_USAGE",`Unable to read prompt file ${e.path}.`,{details:{promptFile:e.path},cause:n})}if(!t)throw new g("INPUT_REQUIRED","Prompt input from stdin is unavailable.",{});return{source:"stdin",text:await t()}}async function QI(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Prompt dispatch is a feature preview. Enable agentOrchestration before sending prompts.",{details:{preview:"agentOrchestration"}})}var Rr={send:GI,show:HI,list:YI,cancel:zI,wait:JI};function Eo(e,t){if(t!=="codex")return e;let[n="codex",...r]=e,s=["--no-alt-screen","--no-daemon"].filter(a=>!r.includes(a)),i="check_for_update_on_startup=false",o=r.includes(i)?[]:["-c",i];return[n,...s,...r,...o]}var ZI=6e4;async function Oo(e,t){return Rc(e,t,{createTask:ev})}async function Eh(e,t,n,r={}){return bc(e,t,n,{...r,launchProvisioned:(s,i)=>Oh(e,s,i,!1)})}async function ev(e,t,n,r={}){return S.createTask(e,t,n,{...r,markStartedAfterLaunch:!1,launchProvisioned:(s,i)=>Oh(e,s,i,!0)})}async function Oh(e,t,n,r=!1){let s=t.ptyTabs.find(i=>i.kind==="agent");if(!s)throw new Error(`Task ${t.id} is missing its agent PTY tab.`);try{if(await Ah(e,{taskId:t.id,tabId:s.id,cwd:t.worktreePath,command:Eo(r?s.command:t.runnerSession.command,s.runner??t.runner),...n?{env:n}:{}}),!r)return;let i=await ue.create(e,{taskId:t.id,agentTabId:s.id,prompt:{source:"inline",text:t.prompt.value},delivery:"when-ready",timeoutMs:ZI,idempotencyKey:`task-start:${t.id}`,actor:{type:"system",component:"orchestration-supervisor"}});await wd(e,i.command.id)}catch(i){throw await Co(e,[s.id]),i}}async function $o(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 Sc(e,t,n);if(!await Co(e,o))throw new g("PARTIAL_RESULT","The task tree was closed, but Craig could not stop its agent sessions. Retry cancellation after the daemon is available.",{retryable:!0,details:{taskId:t,persisted:!0,sessionsStopped:!1}});return a}catch(a){throw a instanceof g&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await Co(e,o),a}}import{randomUUID as Dh}from"node:crypto";import{readFile as tv,realpath as $h}from"node:fs/promises";import kd from"node:path";var X={type:"system",component:"orchestration-supervisor"},nv=/\$\{\{\s*steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)\s*\}\}/g;async function rv(e,t,n,r,s,i){await Rd(e);let o=await yv(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 Qe(e,i,"fury.plan",r)}let a=await ad(t,n);wv(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_${Dh()}`,planHash:Jl(c),createdBy:s,createdAt:l};await $f(e,a.definitionHash,await tv(t,"utf8"));let d=await Nf(e,u);try{await Me(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 bd(e,t,n,r){if(await Rd(e),n.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can approve a Fury plan.",{});let s=await ss(e,t);if(r!==void 0&&s.planHash!==r)throw new g("FURY_STATE_CONFLICT","The Fury plan changed after you reviewed it. Review the current plan before approving.",{});let i={schemaVersion:1,planId:s.id,planHash:s.planHash,approvedBy:n,approvedAt:new Date().toISOString()},o=await _f(e,i);try{await Me(e,{id:`${s.id}:fury.plan.approved`,taskId:s.rootTaskId,type:"fury.plan.approved",occurredAt:o.approval.approvedAt,actor:o.approval.approvedBy,data:{planId:s.id,planHash:s.planHash}})}catch(a){throw new g("PARTIAL_RESULT",`Fury plan ${s.id} was approved, but its audit event could not be recorded.`,{details:{planId:s.id,planHash:s.planHash,persisted:!0,approved:!0},cause:a})}return{kind:"approveFury",plan:s,approval:o.approval,created:o.created}}async function sv(e,t,n,r){await Rd(e);let s=await ss(e,t);if((await Ff(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 Qe(e,r,"fury.run",s.rootTaskId)}await st(e,await S.getTask(e,s.rootTaskId));let o=new Date,l={schemaVersion:1,id:`fury_${Dh()}`,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 xf(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 ne(c.run)||await xn(e,c.run.id),{kind:"runFury",run:await te(e,c.run.id),created:c.created}}async function iv(e,t){return{kind:"showFury",run:await te(e,t)}}async function Do(e,t={}){let n=await k.load(e),r=k.previews.isEnabled(n,"agentOrchestration");for(let s of await Ci(e))await ov(e,s.id,{...t,allowScheduling:r})}async function ov(e,t,n={}){let r=n.allowScheduling??k.previews.isEnabled(await k.load(e),"agentOrchestration"),s=await te(e,t);if(await Rv(e,s),ne(s)){s.cleanupPending&&await Pv(e,s);return}if(s=await Iv(e,s),await Sv(e,s),Date.now()>=Date.parse(s.deadlineAt)){if(s=await Ce(e,t,a=>ne(a)?a:bv(a)),s.state!=="timed_out")return;for(let a of Object.values(s.stepRuns))a.reviewId&&await or(e,a.reviewId,l=>["waiting_for_review","changes_requested"].includes(l.state)?{...l,state:"timed_out",version:l.version+1,updatedAt:new Date().toISOString()}:l);await le(e,s,null,"fury.run.timed_out",X,{state:s.state});return}let i=new Map((await je(e)).map(a=>[a.id,a]));for(let a of s.order){let l=s.stepRuns[a];if(r&&l.state==="running"&&!l.taskId){s=await Nh(e,s,l);continue}l.state==="running"&&l.commandId&&i.get(l.commandId)?.state==="failed"&&(s=await No(e,s.id,l.id,i.get(l.commandId)?.lastError?.message??"Prompt delivery failed.",X));let c=!l.commandId||i.get(l.commandId)?.state==="delivered";l.state==="running"&&l.agentTabId&&c&&n.isAgentAvailable&&l.startedAt&&Date.now()-Date.parse(l.startedAt)>2e3&&!n.isAgentAvailable(l.agentTabId)&&(s=await No(e,s.id,l.id,`Agent session ${l.agentTabId} disappeared.`,X)),l.state==="running"&&l.deadlineAt&&Date.now()>=Date.parse(l.deadlineAt)&&(s=await Ce(e,s.id,u=>ne(u)?u:Bt(u,l.id,{state:"timed_out",error:"Step timed out.",completedAt:new Date().toISOString(),completedBy:X})),s.stepRuns[l.id]?.state==="timed_out"&&await le(e,s,l.id,"fury.step.timed_out",X,{})),(l.state==="waiting_for_review"||l.state==="changes_requested")&&l.deadlineAt&&Date.now()>=Date.parse(l.deadlineAt)&&(l.reviewId&&await or(e,l.reviewId,u=>({...u,state:"timed_out",version:u.version+1,updatedAt:new Date().toISOString()})),s=await Ce(e,s.id,u=>ne(u)?u:Bt(u,l.id,{state:"timed_out",error:"Review timed out.",completedAt:new Date().toISOString(),completedBy:X})),s.stepRuns[l.id]?.state==="timed_out"&&await le(e,s,l.id,"fury.review.timed_out",X,{reviewId:l.reviewId}))}if(Object.values(s.stepRuns).some(a=>a.state==="failed"||a.state==="timed_out")){await _o(e,s.id,"failed",X);return}let o=Object.values(s.stepRuns).filter(a=>a.state==="running").length;for(let a of s.order){if(o>=s.limits.maxConcurrency)break;let l=s.stepRuns[a];l.state!=="pending"||!l.needs.every(c=>s.stepRuns[c]?.state==="succeeded")||(l.kind==="human_review"?s=await av(e,s,l):r&&(s=await Nh(e,s,l),o+=1))}await Tv(e,s.id)}async function Nh(e,t,n){let r=new Date;if(t=await Ce(e,t.id,i=>ne(i)?i:Bt(i,n.id,{state:"running",startedAt:i.stepRuns[n.id]?.startedAt??r.toISOString(),deadlineAt:i.deadlineAt})),ne(t))return t;await le(e,t,n.id,"fury.step.started",X,{});let s=t.stepRuns[n.id];if(s.taskId)return t;try{let i=`${Fn(s.plan.prompt,t)}
212
212
 
213
- ${pv(t.id,n.id,s.plan.outputSchema)}`,o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await Co(e,{parentTaskId:t.rootTaskId,...s.plan.target.repo?{repoId:xn(s.plan.target.repo,t)}:{},...s.plan.target.workspace?{workspaceId:xn(s.plan.target.workspace,t)}:{},prompt:i,...s.plan.runner?{runner:s.plan.runner}:{},idempotencyKey:`fury:${t.id}:${n.id}`,fury:{runId:t.id,stepId:n.id}}),d=await P.getTask(e,c.taskId),u=d.ptyTabs.find(p=>p.kind==="agent");if(!u)throw new g("TASK_CONTEXT_CONFLICT",`Created task ${d.id} has no agent tab.`,{});o=d.id,a=u.id,l=(await Me(e)).find(p=>p.idempotencyKey===`task-start:${d.id}`)?.id??null}else{o=xn(s.plan.target.task,t);let c=await P.getTask(e,o),d=c.ptyTabs.find(p=>p.kind==="agent"&&(!s.plan.runner||(p.runner??c.runner)===s.plan.runner));if(!d)throw new g("TASK_CONTEXT_CONFLICT",s.plan.runner?`Task ${c.id} has no ${s.plan.runner} agent tab for fury step ${n.id}.`:`Task ${c.id} has no agent tab.`,{});await st(e,c,X,d.id),a=d.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:X})).command.id}return t=await ve(e,t.id,c=>ne(c)?{...c,cleanupPending:!0}:Bt(c,n.id,{taskId:o,agentTabId:a,commandId:l})),ne(t)||await le(e,t,n.id,"fury.step.dispatched",X,{taskId:o,agentTabId:a,commandId:l}),t}catch(i){let o=await te(e,t.id);return ne(o)?o:Eo(e,t.id,n.id,i instanceof Error?i.message:"Step dispatch failed.",X)}}async function ev(e,t,n){let r=n.plan.review,s=new Date,i=`review_${t.id.slice(5)}_${n.id}`,o=r.feedbackTask?xn(r.feedbackTask,t):null,a=o?Object.values(t.stepRuns).find(d=>d.taskId===o&&d.agentTabId):null,l=await rt(e,i).catch(d=>{if(d instanceof g&&d.code==="FURY_REVIEW_NOT_FOUND")return null;throw d}),c=l??{schemaVersion:1,id:i,runId:t.id,stepId:n.id,state:"waiting_for_review",title:xn(r.title,t),summary:xn(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 l||await xf(e,c),t=await ve(e,t.id,d=>ne(d)?{...d,cleanupPending:!0}:Bt(d,n.id,{state:"waiting_for_review",reviewId:i,startedAt:c.requestedAt,deadlineAt:c.deadlineAt})),ne(t)||await le(e,t,n.id,"fury.review.requested",X,{reviewId:i,title:c.title}),t}async function tv(e,t,n,r,s,i){let o=await te(e,t),a=Nh(o,n);await $h(e,a,s,i,"fury.step.complete"),cv(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await ve(e,t,c=>{if(ne(c)||c.stepRuns[n]?.state!=="running"||Date.now()>=Date.parse(c.deadlineAt))throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running or its deadline has elapsed.`,{});return Bt(c,n,{state:"succeeded",output:r,completedAt:l,completedBy:s})}),await le(e,o,n,"fury.step.succeeded",s,{taskId:a.taskId}),await Fn(e,t),o=await te(e,t),{kind:"completeFuryStep",run:o,step:o.stepRuns[n]}}async function nv(e,t,n,r,s,i){let o=await te(e,t),a=Nh(o,n);await $h(e,a,s,i,"fury.step.fail");let l=await Eo(e,t,n,r,s);return await $o(e,t,"failed",s),await Fn(e,t),{kind:"failFuryStep",run:await te(e,t),step:l.stepRuns[n]}}async function rv(e,t,n,r){let s=await te(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury cancellation requires an agent capability.",{});await Xe(e,r,"fury.cancel",s.rootTaskId)}if(ne(s))return s.cleanupPending&&await Fn(e,t),{kind:"cancelFury",run:await te(e,t),changed:!1};let i=new Date().toISOString(),o=!1,a=await ve(e,t,l=>ne(l)?l:(o=!0,{...l,state:"cancelled",cleanupPending:!0,cleanupError:null,completedAt:i,updatedAt:i,stateChangedAt:i,stepRuns:Object.fromEntries(Object.entries(l.stepRuns).map(([c,d])=>[c,d.state==="succeeded"?d:{...d,state:"cancelled",completedAt:i,completedBy:n}]))}));return o?(await le(e,a,null,"fury.run.cancelled",n,{}),await Fn(e,t),{kind:"cancelFury",run:await te(e,t),changed:o}):{kind:"cancelFury",run:a,changed:!1}}async function sv(e,t,n,r){let s=await te(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury resume requires an agent capability.",{});await Xe(e,r,"fury.resume",s.rootTaskId)}if(ne(s))throw new g("FURY_STATE_CONFLICT",`Cannot resume ${s.id} while it is ${s.state}.`,{});return await Fn(e,t),{kind:"resumeFury",run:await te(e,t)}}async function iv(e,t,n){return{kind:"listFuryReviews",reviews:(await rs(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function ov(e,t){return{kind:"showFuryReview",review:await rt(e,t)}}async function av(e,t,n,r,s,i){let o=await rt(e,t),a=await te(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!=="human"&&s.type!=="agent")throw new g("CAPABILITY_DENIED","Only a human or the feedback-target agent can resubmit a 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 Xe(e,i,"fury.review.resubmit",s.taskId)}if(ne(a)||Date.now()>=Math.min(Date.parse(a.deadlineAt),Date.parse(o.deadlineAt)))throw new g("FURY_STATE_CONFLICT",`Review ${t} belongs to a terminal or expired run.`,{});if(!(n==="resubmit"?o.state==="changes_requested":o.state==="waiting_for_review"))throw new g("FURY_STATE_CONFLICT",`Review ${t} cannot ${n} while ${o.state}.`,{});if((n==="reject"||n==="request_changes")&&!r?.trim())throw new g("CLI_USAGE",`${n} requires a reason.`,{});if(n==="request_changes"&&!o.feedbackTarget)throw new g("FURY_STATE_CONFLICT",`Review ${t} has no feedback target.`,{});let c=null;if(n==="request_changes"){let h=await P.getTask(e,o.feedbackTarget.taskId);if(!(o.feedbackTarget.agentTabId?h.ptyTabs.find(m=>m.kind==="agent"&&m.id===o.feedbackTarget.agentTabId):h.ptyTabs.find(m=>m.kind==="agent")))throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${h.id} has no agent tab.`,{})}let d=new Date().toISOString(),u={sequence:o.history.length+1,round:o.round,action:n,message:r,actor:s,feedbackCommandId:c,occurredAt:d},p=n==="approve"?"approved":n==="reject"?"rejected":n==="request_changes"?"changes_requested":"waiting_for_review";return o=await ir(e,t,h=>{if(!(n==="resubmit"?h.state==="changes_requested":h.state==="waiting_for_review")||h.version!==o.version||Date.now()>=Math.min(Date.parse(a.deadlineAt),Date.parse(h.deadlineAt)))throw new g("FURY_STATE_CONFLICT",`Review ${t} changed concurrently.`,{});return{...h,state:p,round:n==="resubmit"?h.round+1:h.round,version:h.version+1,lastDecision:u,history:[...h.history,u],updatedAt:d}}),a=await ve(e,a.id,h=>{if(ne(h))throw new g("FURY_STATE_CONFLICT",`Run ${h.id} is ${h.state}.`,{});return Bt(h,o.stepId,n==="approve"?{state:"succeeded",completedAt:d,completedBy:s}:n==="reject"?{state:"failed",error:r,completedAt:d,completedBy:s}:n==="request_changes"?{state:"changes_requested"}:{state:"waiting_for_review"})}),await le(e,a,o.stepId,`fury.review.${n}`,s,{reviewId:t,round:o.round,feedbackCommandId:c}),n==="reject"&&await $o(e,a.id,"failed",s),await Fn(e,a.id),{kind:"actFuryReview",review:o,run:await te(e,a.id)}}async function lv(e,t,n,r){await te(e,t);let s=n,i=0,o=0;for(;!r.signal?.aborted;){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,ne(await te(e,t)))return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!1};await kv(250,r.signal)}return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!0}}function xn(e,t){return e.replace(YI,(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 cv(e,t){if(!t){if(e!=null)throw new g("FURY_OUTPUT_INVALID","This step does not declare output.",{});return}let n=[];if(yd(e,t,"$",n),n.length)throw new g("FURY_OUTPUT_INVALID","Fury step output does not match its schema.",{details:{issues:n}})}function yd(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])?yd(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)=>yd(o,t.items,`${n}[${a}]`,r))}async function $h(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 Xe(e,r,s,n.taskId)}}function Nh(e,t){if(ne(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 dv(e,t){let[n,r]=await Promise.all([Ah(ke(e).root),Ah(t)]),s=gd.relative(n,r);if(!s||s.startsWith("..")||gd.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:ke(e).root}});return gd.join(".craig","fury",s)}function uv(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 pv(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
213
+ ${kv(t.id,n.id,s.plan.outputSchema)}`,o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await Oo(e,{parentTaskId:t.rootTaskId,...s.plan.target.repo?{repoId:Fn(s.plan.target.repo,t)}:{},...s.plan.target.workspace?{workspaceId:Fn(s.plan.target.workspace,t)}:{},prompt:i,...s.plan.runner?{runner:s.plan.runner}:{},idempotencyKey:`fury:${t.id}:${n.id}`,fury:{runId:t.id,stepId:n.id}}),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,l=(await je(e)).find(p=>p.idempotencyKey===`task-start:${u.id}`)?.id??null}else{o=Fn(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 st(e,c,X,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:X})).command.id}return t=await Ce(e,t.id,c=>ne(c)?{...c,cleanupPending:!0}:Bt(c,n.id,{taskId:o,agentTabId:a,commandId:l})),ne(t)||await le(e,t,n.id,"fury.step.dispatched",X,{taskId:o,agentTabId:a,commandId:l}),t}catch(i){let o=await te(e,t.id);return ne(o)?o:No(e,t.id,n.id,i instanceof Error?i.message:"Step dispatch failed.",X)}}async function av(e,t,n){let r=n.plan.review,s=new Date,i=`review_${t.id.slice(5)}_${n.id}`,o=r.feedbackTask?Fn(r.feedbackTask,t):null,a=o?Object.values(t.stepRuns).find(u=>u.taskId===o&&u.agentTabId):null,l=await rt(e,i).catch(u=>{if(u instanceof g&&u.code==="FURY_REVIEW_NOT_FOUND")return null;throw u}),c=l??{schemaVersion:1,id:i,runId:t.id,stepId:n.id,state:"waiting_for_review",title:Fn(r.title,t),summary:Fn(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 l||await Mf(e,c),t=await Ce(e,t.id,u=>ne(u)?{...u,cleanupPending:!0}:Bt(u,n.id,{state:"waiting_for_review",reviewId:i,startedAt:c.requestedAt,deadlineAt:c.deadlineAt})),ne(t)||await le(e,t,n.id,"fury.review.requested",X,{reviewId:i,title:c.title}),t}async function lv(e,t,n,r,s,i){let o=await te(e,t),a=Fh(o,n);await _h(e,a,s,i,"fury.step.complete"),gv(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await Ce(e,t,c=>{if(ne(c)||c.stepRuns[n]?.state!=="running"||Date.now()>=Date.parse(c.deadlineAt))throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running or its deadline has elapsed.`,{});return Bt(c,n,{state:"succeeded",output:r,completedAt:l,completedBy:s})}),await le(e,o,n,"fury.step.succeeded",s,{taskId:a.taskId}),await xn(e,t),o=await te(e,t),{kind:"completeFuryStep",run:o,step:o.stepRuns[n]}}async function cv(e,t,n,r,s,i){let o=await te(e,t),a=Fh(o,n);await _h(e,a,s,i,"fury.step.fail");let l=await No(e,t,n,r,s);return await _o(e,t,"failed",s),await xn(e,t),{kind:"failFuryStep",run:await te(e,t),step:l.stepRuns[n]}}async function dv(e,t,n,r){let s=await te(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury cancellation requires an agent capability.",{});await Qe(e,r,"fury.cancel",s.rootTaskId)}if(ne(s))return s.cleanupPending&&await xn(e,t),{kind:"cancelFury",run:await te(e,t),changed:!1};let i=new Date().toISOString(),o=!1,a=await Ce(e,t,l=>ne(l)?l:(o=!0,{...l,state:"cancelled",cleanupPending:!0,cleanupError:null,completedAt:i,updatedAt:i,stateChangedAt:i,stepRuns:Object.fromEntries(Object.entries(l.stepRuns).map(([c,u])=>[c,u.state==="succeeded"?u:{...u,state:"cancelled",completedAt:i,completedBy:n}]))}));return o?(await le(e,a,null,"fury.run.cancelled",n,{}),await xn(e,t),{kind:"cancelFury",run:await te(e,t),changed:o}):{kind:"cancelFury",run:a,changed:!1}}async function uv(e,t,n,r){let s=await te(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury resume requires an agent capability.",{});await Qe(e,r,"fury.resume",s.rootTaskId)}if(ne(s))throw new g("FURY_STATE_CONFLICT",`Cannot resume ${s.id} while it is ${s.state}.`,{});return await xn(e,t),{kind:"resumeFury",run:await te(e,t)}}async function pv(e,t,n){return{kind:"listFuryReviews",reviews:(await os(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function fv(e,t){return{kind:"showFuryReview",review:await rt(e,t)}}async function mv(e,t,n,r,s,i){let o=await rt(e,t),a=await te(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!=="human"&&s.type!=="agent")throw new g("CAPABILITY_DENIED","Only a human or the feedback-target agent can resubmit a 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 Qe(e,i,"fury.review.resubmit",s.taskId)}if(ne(a)||Date.now()>=Math.min(Date.parse(a.deadlineAt),Date.parse(o.deadlineAt)))throw new g("FURY_STATE_CONFLICT",`Review ${t} belongs to a terminal or expired run.`,{});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);if(!(o.feedbackTarget.agentTabId?h.ptyTabs.find(m=>m.kind==="agent"&&m.id===o.feedbackTarget.agentTabId):h.ptyTabs.find(m=>m.kind==="agent")))throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${h.id} has no agent tab.`,{})}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 or(e,t,h=>{if(!(n==="resubmit"?h.state==="changes_requested":h.state==="waiting_for_review")||h.version!==o.version||Date.now()>=Math.min(Date.parse(a.deadlineAt),Date.parse(h.deadlineAt)))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 Ce(e,a.id,h=>{if(ne(h))throw new g("FURY_STATE_CONFLICT",`Run ${h.id} is ${h.state}.`,{});return Bt(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 _o(e,a.id,"failed",s),await xn(e,a.id),{kind:"actFuryReview",review:o,run:await te(e,a.id)}}async function hv(e,t,n,r){await te(e,t);let s=n,i=0,o=0;for(;!r.signal?.aborted;){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,ne(await te(e,t)))return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!1};await vv(250,r.signal)}return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!0}}function Fn(e,t){return e.replace(nv,(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 gv(e,t){if(!t){if(e!=null)throw new g("FURY_OUTPUT_INVALID","This step does not declare output.",{});return}let n=[];if(Td(e,t,"$",n),n.length)throw new g("FURY_OUTPUT_INVALID","Fury step output does not match its schema.",{details:{issues:n}})}function Td(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])?Td(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)=>Td(o,t.items,`${n}[${a}]`,r))}async function _h(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 Qe(e,r,s,n.taskId)}}function Fh(e,t){if(ne(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 yv(e,t){let[n,r]=await Promise.all([$h(ke(e).root),$h(t)]),s=kd.relative(n,r);if(!s||s.startsWith("..")||kd.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:ke(e).root}});return kd.join(".craig","fury",s)}function wv(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 kv(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
214
214
  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
215
- If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function Eo(e,t,n,r,s){let i=new Date().toISOString(),o=!1,a=await ve(e,t,l=>{if(l.stepRuns[n]?.state==="failed")return l;if(ne(l)||l.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,Bt(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 Bt(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function fv(e,t){let n=await te(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 $o(e,t,s,X)}async function $o(e,t,n,r){let s=await te(e,t);if(s.state===n)return s;let i=["succeeded","failed","cancelled","timed_out"].includes(n),o=new Date().toISOString(),a=await ve(e,t,l=>ne(l)?l:{...l,state:n,updatedAt:o,stateChangedAt:o,completedAt:i?o:null,...["failed","cancelled","timed_out"].includes(n)?{cleanupPending:!0,cleanupError:null,stepRuns:Object.fromEntries(Object.entries(l.stepRuns).map(([c,d])=>[c,["pending","running","waiting_for_review","changes_requested"].includes(d.state)?{...d,state:"cancelled",completedAt:o,completedBy:X}:d]))}:{}});return a.state!==n||await le(e,a,null,`fury.run.${n}`,r,{state:n}),a}function mv(e){let t=new Date().toISOString();return{...e,state:"timed_out",cleanupPending:!0,cleanupError:null,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:X}]))}}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 Le(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 hv(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}`,X,{state:t.state});for(let n of Object.values(t.stepRuns)){if(n.startedAt&&await le(e,t,n.id,"fury.step.started",X,{}),n.taskId&&await le(e,t,n.id,"fury.step.dispatched",X,{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??X,{reason:n.error}),!n.reviewId)continue;let r=await rt(e,n.reviewId);await le(e,t,n.id,"fury.review.requested",X,{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 gv(e,t){try{let r=(await P.listTasks(e,{includeClosed:!0})).tasks.filter(c=>c.furyRunId===t.id&&(t.state==="cancelled"||t.stepRuns[c.furyStepId??""]?.state!=="succeeded")),s=new Set(r.map(c=>c.id)),i=new Set(Object.values(t.stepRuns).map(c=>c.commandId).filter(Boolean)),o=(await rs(e)).filter(c=>c.runId===t.id),a=new Set(o.map(c=>c.id));for(let c of await Me(e)){let d=c.idempotencyKey?.match(/^fury-review:([^:]+):[0-9]+$/)?.[1];c.state==="queued"&&(i.has(c.id)||s.has(c.taskId)||d&&a.has(d))&&await ue.cancel(e,c.id,X)}for(let c of r)await Ao(e,c.id);for(let c of o)await ir(e,c.id,d=>["waiting_for_review","changes_requested"].includes(d.state)?{...d,state:t.state==="timed_out"?"timed_out":"cancelled",version:d.version+1,updatedAt:new Date().toISOString()}:d);let l=await ve(e,t.id,c=>({...c,cleanupPending:!1,cleanupError:null}));await le(e,l,null,"fury.run.cleanup_completed",X,{})}catch(n){let r=n instanceof Error?n.message:"Fury cleanup failed.";await ve(e,t.id,s=>({...s,cleanupPending:!0,cleanupError:r})),t.cleanupError!==r&&await le(e,t,null,"fury.run.cleanup_failed",X,{reason:r})}}async function Fn(e,t){if(!await Dn(e))throw new g("PARTIAL_RESULT",`Fury run ${t} was saved, but its supervisor is unavailable. Start Craig for this workspace and resume the run.`,{retryable:!0,details:{runId:t,persisted:!0,reason:"ORCHESTRATION_UNAVAILABLE"}})}async function yv(e,t){for(let n of Object.values(t.stepRuns)){if(!n.reviewId)continue;let r=await rt(e,n.reviewId),s=r.lastDecision;if(r.state!=="changes_requested"||!r.feedbackTarget||s?.action!=="request_changes"||s.feedbackCommandId||Date.now()>=Math.min(Date.parse(t.deadlineAt),Date.parse(r.deadlineAt)))continue;let i=await P.getTask(e,r.feedbackTarget.taskId),o=r.feedbackTarget.agentTabId?i.ptyTabs.find(l=>l.kind==="agent"&&l.id===r.feedbackTarget.agentTabId):i.ptyTabs.find(l=>l.kind==="agent");if(!o)throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${i.id} has no agent tab.`,{});let{command:a}=await ue.create(e,{taskId:i.id,agentTabId:o.id,prompt:{source:"inline",text:`Fury review ${r.id} changes requested:
215
+ If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function No(e,t,n,r,s){let i=new Date().toISOString(),o=!1,a=await Ce(e,t,l=>{if(l.stepRuns[n]?.state==="failed")return l;if(ne(l)||l.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,Bt(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 Bt(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function Tv(e,t){let n=await te(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 _o(e,t,s,X)}async function _o(e,t,n,r){let s=await te(e,t);if(s.state===n)return s;let i=["succeeded","failed","cancelled","timed_out"].includes(n),o=new Date().toISOString(),a=await Ce(e,t,l=>ne(l)?l:{...l,state:n,updatedAt:o,stateChangedAt:o,completedAt:i?o:null,...["failed","cancelled","timed_out"].includes(n)?{cleanupPending:!0,cleanupError:null,stepRuns:Object.fromEntries(Object.entries(l.stepRuns).map(([c,u])=>[c,["pending","running","waiting_for_review","changes_requested"].includes(u.state)?{...u,state:"cancelled",completedAt:o,completedBy:X}:u]))}:{}});return a.state!==n||await le(e,a,null,`fury.run.${n}`,r,{state:n}),a}function bv(e){let t=new Date().toISOString();return{...e,state:"timed_out",cleanupPending:!0,cleanupError:null,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:X}]))}}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 Me(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 Rv(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}`,X,{state:t.state});for(let n of Object.values(t.stepRuns)){if(n.startedAt&&await le(e,t,n.id,"fury.step.started",X,{}),n.taskId&&await le(e,t,n.id,"fury.step.dispatched",X,{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??X,{reason:n.error}),!n.reviewId)continue;let r=await rt(e,n.reviewId);await le(e,t,n.id,"fury.review.requested",X,{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 Pv(e,t){try{let r=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(c=>c.furyRunId===t.id&&(t.state==="cancelled"||t.stepRuns[c.furyStepId??""]?.state!=="succeeded")),s=new Set(r.map(c=>c.id)),i=new Set(Object.values(t.stepRuns).map(c=>c.commandId).filter(Boolean)),o=(await os(e)).filter(c=>c.runId===t.id),a=new Set(o.map(c=>c.id));for(let c of await je(e)){let u=c.idempotencyKey?.match(/^fury-review:([^:]+):[0-9]+$/)?.[1];c.state==="queued"&&(i.has(c.id)||s.has(c.taskId)||u&&a.has(u))&&await ue.cancel(e,c.id,X)}for(let c of r)await $o(e,c.id);for(let c of o)await or(e,c.id,u=>["waiting_for_review","changes_requested"].includes(u.state)?{...u,state:t.state==="timed_out"?"timed_out":"cancelled",version:u.version+1,updatedAt:new Date().toISOString()}:u);let l=await Ce(e,t.id,c=>({...c,cleanupPending:!1,cleanupError:null}));await le(e,l,null,"fury.run.cleanup_completed",X,{})}catch(n){let r=n instanceof Error?n.message:"Fury cleanup failed.";await Ce(e,t.id,s=>({...s,cleanupPending:!0,cleanupError:r})),t.cleanupError!==r&&await le(e,t,null,"fury.run.cleanup_failed",X,{reason:r})}}async function xn(e,t){if(!await Dn(e))throw new g("PARTIAL_RESULT",`Fury run ${t} was saved, but its supervisor is unavailable. Start Craig for this workspace and resume the run.`,{retryable:!0,details:{runId:t,persisted:!0,reason:"ORCHESTRATION_UNAVAILABLE"}})}async function Sv(e,t){for(let n of Object.values(t.stepRuns)){if(!n.reviewId)continue;let r=await rt(e,n.reviewId),s=r.lastDecision;if(r.state!=="changes_requested"||!r.feedbackTarget||s?.action!=="request_changes"||s.feedbackCommandId||Date.now()>=Math.min(Date.parse(t.deadlineAt),Date.parse(r.deadlineAt)))continue;let i=await S.getTask(e,r.feedbackTarget.taskId),o=r.feedbackTarget.agentTabId?i.ptyTabs.find(l=>l.kind==="agent"&&l.id===r.feedbackTarget.agentTabId):i.ptyTabs.find(l=>l.kind==="agent");if(!o)throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${i.id} has no agent tab.`,{});let{command:a}=await ue.create(e,{taskId:i.id,agentTabId:o.id,prompt:{source:"inline",text:`Fury review ${r.id} changes requested:
216
216
 
217
217
  ${s.message}
218
218
 
219
219
  After revisions, resubmit with: craig fury review resubmit ${r.id} --summary '<revised summary>' --json
220
- Only a human can approve this review.`},delivery:"when-ready",timeoutMs:Math.min(t.limits.timeoutMs,864e5),idempotencyKey:`fury-review:${r.id}:${s.round}`,actor:s.actor});await ir(e,r.id,l=>{if(l.state!=="changes_requested"||l.version!==r.version)return l;let c={...s,feedbackCommandId:a.id};return{...l,lastDecision:c,history:l.history.map(d=>d.sequence===s.sequence?c:d)}})}}async function wv(e,t){for(let n of Object.values(t.stepRuns)){if(!n.reviewId||n.kind!=="human_review")continue;let r=await rt(e,n.reviewId),s=r.state==="approved"?"succeeded":r.state==="rejected"?"failed":r.state;n.state!==s&&(t=await ve(e,t.id,i=>ne(i)?i:Bt(i,n.id,{state:s,completedBy:r.lastDecision?.actor??X,...["succeeded","failed","timed_out","cancelled"].includes(s)?{completedAt:r.updatedAt}:{}})))}return t}async function wd(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 ne(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function _n(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function kv(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 Be={plan:zI,approve:JI,run:XI,show:QI,watch:lv,cancel:rv,resume:sv,completeStep:tv,failStep:nv,listReviews:iv,showReview:ov,actOnReview:av,reconcile:Oo};import{access as Tv,stat as bv}from"node:fs/promises";import Rv from"node:path";import{constants as Pv}from"node:fs";async function kd(e,t){let n=Rv.resolve(e,t),r;try{r=await bv(n),await Tv(n,Pv.R_OK)}catch(s){throw new g("CLI_USAGE",`File is not readable: ${n}`,{cause:s,details:{path:n}})}if(!r.isFile())throw new g("CLI_USAGE",`Path is not a regular file: ${n}`,{details:{path:n}});return n}import{createConnection as Sv}from"node:net";async function _h(e,t){let n=await vv(Fe(e).socketPath).catch(()=>null);if(!n)return!1;try{return(await Dh(n,{type:"ping"})).protocolVersion!==Pt?!1:((await Dh(n,{type:"openFile",path:t})).deliveredCount??0)>0}catch{return!1}finally{n.end()}}var Iv=1;function Dh(e,t){let n=Iv++;return new Promise((r,s)=>{let i="",o=setTimeout(()=>{l(),e.destroy(),s(new Error("Craig UI navigation request timed out."))},1e3),a=c=>{i+=String(c);let d=i.indexOf(`
221
- `);if(d===-1)return;l();let u=JSON.parse(i.slice(0,d));u.ok?r(u):s(new Error(u.error??"Craig UI navigation request failed."))},l=()=>{clearTimeout(o),e.off("data",a)};e.on("data",a),e.write(`${JSON.stringify({...t,id:n})}
222
- `)})}function vv(e){return new Promise((t,n)=>{let r=Sv(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function Fh(e,t){switch(e.kind){case"addWorkspace":{let n=await be.addWorkspace(t.paths,e.path),r=n.workspace.kind==="project"?n.workspace.discoveredRepoIds?.[0]??null:n.repos[0]?.id??null;return await Td(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await be.repos.addRepo(t.paths,e.path);return await Td(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return be.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await Un({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await Ie(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await be.repos.removeRepo(t.paths,e.repoId,{listTasks:P.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await yt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await yt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return be.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await be.archiveWorkspace(t.paths,e.workspaceId);return await Ev(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await be.restoreWorkspace(t.paths,e.workspaceId);return await Td(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return be.removeWorkspace(t.paths,e.workspaceId,{listTasks:P.listTasks});case"createTask":return vh(t.paths,e.repoId??e.workspaceId??"",e.prompt,{...e.runner?{runner:e.runner}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}});case"createChildTask":{let n=await k.load(t.paths);if(!k.previews.isEnabled(n,"agentOrchestration"))throw new g("CLI_USAGE","Child delegation is a feature preview. Enable agentOrchestration before creating child tasks.",{details:{preview:"agentOrchestration"}});return Ln(t),Co(t.paths,{parentTaskId:e.parentTaskId??Wt(t).task.id,...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{},prompt:e.prompt,...e.runner?{runner:e.runner}:{},...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.agentCapabilityId?{capabilityId:t.agentCapabilityId}:{}})}case"listTaskChildren":return Ln(t),Tc(t.paths,e.taskId??Wt(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return Ln(t),Ao(t.paths,e.taskId??Wt(t).task.id,t.agentCapabilityId);case"validateFury":return await xh(t),rd(bd.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await xh(t),Be.plan(t.paths,bd.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??Wt(t).task.id,fn(t),t.agentCapabilityId);case"approveFury":return Be.approve(t.paths,e.planId,fn(t));case"runFury":return Ln(t),Be.run(t.paths,e.planId,fn(t),t.agentCapabilityId);case"showFury":return Be.show(t.paths,e.runId);case"watchFury":return Be.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return Be.cancel(t.paths,e.runId,fn(t),t.agentCapabilityId);case"resumeFury":return Be.resume(t.paths,e.runId,fn(t),t.agentCapabilityId);case"completeFuryStep":return Ln(t),Be.completeStep(t.paths,e.runId,e.stepId,await Av(e.output,t),fn(t),t.agentCapabilityId);case"failFuryStep":return Ln(t),Be.failStep(t.paths,e.runId,e.stepId,e.reason,fn(t),t.agentCapabilityId);case"listFuryReviews":return Be.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return Be.showReview(t.paths,e.reviewId);case"actFuryReview":return Ln(t),Be.actOnReview(t.paths,e.reviewId,e.action,e.message??null,fn(t),t.agentCapabilityId);case"listTasks":return e.repoId||e.workspaceId?P.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):P.listTasks(t.paths);case"currentTask":{let n=Wt(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"renameTask":return P.renameTask(t.paths,e.taskId??Wt(t).task.id,e.title);case"addTaskLink":return P.addTaskLink(t.paths,e.taskId,e.repoId);case"addTaskRepoTarget":return P.addTaskRepoTarget(t.paths,e.taskId,e.repoId);case"listTaskLinks":return P.listTaskLinks(t.paths,e.taskId);case"openFile":{let n=await k.load(t.paths);if(!k.previews.isEnabled(n,"fileOpen"))throw new g("CLI_USAGE","Opening files in the Craig TUI is a feature preview. Enable fileOpen before using this command.",{details:{preview:"fileOpen"}});let r=await kd(t.cwd??process.cwd(),e.path),s=await _h(t.paths,r);if(!s)throw new g("EXTERNAL_DEPENDENCY_FAILED","No compatible Craig TUI is connected to this workspace. Restart Craig and try again.",{retryable:!0,details:{path:r}});return{kind:"openFile",path:r,delivered:s}}case"refreshInteractiveState":throw new Error("Interactive refresh should be handled by the interactive app.");case"showTask":return P.showTask(t.paths,e.taskId);case"showCurrentTask":return P.showTask(t.paths,Wt(t).task.id);case"showTaskPr":return P.prs.show(t.paths,Mn(e.taskId,t),e.repoId);case"discoverTaskPr":return P.prs.discover(t.paths,Mn(e.taskId,t),e.repoId);case"linkTaskPr":return P.prs.link(t.paths,Mn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return P.prs.refreshAssociation(t.paths,Mn(e.taskId,t),e.repoId);case"unlinkTaskPr":return P.prs.unlink(t.paths,Mn(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return Ft.listAgents(t.paths,e.taskId);case"showAgentStatus":return Ft.showAgentStatus(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.tabId?{tabId:e.tabId}:{}});case"waitTask":{let n={states:e.states,timeoutMs:e.timeoutMs,...e.tabId?{tabId:e.tabId}:{},...t.signal?{signal:t.signal}:{}},r=Mn(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?To.waitForTaskState(t.paths,r,n):Ft.waitForTask(t.paths,r,n)}case"listEvents":return To.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return To.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:Mn(e.taskId,t),...e.tabId?{tabId:e.tabId}:t.taskContext?.agentTabId?{tabId:t.taskContext.agentTabId}:{},prompt:e.prompt,delivery:e.delivery,timeoutMs:e.timeoutMs,...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.readStdin?{readStdin:t.readStdin}:{}});case"showPromptCommand":return 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 P.showTask(t.paths,Rr(t,"show"));case"streamTaskLogs":return P.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return P.prepareTaskLogs(t.paths,Rr(t,"logs"));case"showTaskDiff":return P.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return P.showTaskDiff(t.paths,Rr(t,"diff"));case"openTask":return P.openTask(t.paths,e.taskId);case"openSelectedTask":return P.openTask(t.paths,Rr(t,"open"));case"runChecks":return P.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return P.runChecks(t.paths,Rr(t,"check"));case"commitTask":return P.commitTask(t.paths,e.taskId);case"commitSelectedTask":return P.commitTask(t.paths,Rr(t,"commit"));case"showContext":{let n=$v(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:Ea()};case"exit":return{kind:"exit"};default:return Ov(e)}}function Ln(e){if(!(!e.agentContext||e.agentCapabilityId))throw new g("CAPABILITY_DENIED","This agent session has no delegation capability. Restart the agent session to receive one.",{details:{reason:"agent capability is missing"}})}async function xh(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 fn(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=Wt(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 Av(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await Cv(bd.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 Td(e,t,n){let r=await Un({uiStateFile:e.uiStateFile})??Gs();await yt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function Ev(e,t){let n=await Un({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await yt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function Ov(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function Rr(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 Wt(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Mn(e,t){return e??Wt(t).task.id}function $v(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Mh(e){switch(e.kind){case"createWorkspace":return[`${e.created?"Registered":"Updated"} ${e.workspace.kind??"repo"} workspace ${e.workspace.id}`,`Path: ${e.workspace.rootPath??""}`,`Repos: ${e.repos.map(t=>t.id).join(", ")}`].join(`
220
+ Only a human can approve this review.`},delivery:"when-ready",timeoutMs:Math.min(t.limits.timeoutMs,864e5),idempotencyKey:`fury-review:${r.id}:${s.round}`,actor:s.actor});await or(e,r.id,l=>{if(l.state!=="changes_requested"||l.version!==r.version)return l;let c={...s,feedbackCommandId:a.id};return{...l,lastDecision:c,history:l.history.map(u=>u.sequence===s.sequence?c:u)}})}}async function Iv(e,t){for(let n of Object.values(t.stepRuns)){if(!n.reviewId||n.kind!=="human_review")continue;let r=await rt(e,n.reviewId),s=r.state==="approved"?"succeeded":r.state==="rejected"?"failed":r.state;n.state!==s&&(t=await Ce(e,t.id,i=>ne(i)?i:Bt(i,n.id,{state:s,completedBy:r.lastDecision?.actor??X,...["succeeded","failed","timed_out","cancelled"].includes(s)?{completedAt:r.updatedAt}:{}})))}return t}async function Rd(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 ne(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function _n(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function vv(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 We={plan:rv,approve:bd,run:sv,show:iv,watch:hv,cancel:dv,resume:uv,completeStep:lv,failStep:cv,listReviews:pv,showReview:fv,actOnReview:mv,reconcile:Do};import{access as Cv,stat as Av}from"node:fs/promises";import Ev from"node:path";import{constants as Ov}from"node:fs";async function Pd(e,t){let n=Ev.resolve(e,t),r;try{r=await Av(n),await Cv(n,Ov.R_OK)}catch(s){throw new g("CLI_USAGE",`File is not readable: ${n}`,{cause:s,details:{path:n}})}if(!r.isFile())throw new g("CLI_USAGE",`Path is not a regular file: ${n}`,{details:{path:n}});return n}import{createConnection as $v}from"node:net";async function Lh(e,t){let n=await Dv(Le(e).socketPath).catch(()=>null);if(!n)return!1;try{return(await xh(n,{type:"ping"})).protocolVersion!==Pt?!1:((await xh(n,{type:"openFile",path:t})).deliveredCount??0)>0}catch{return!1}finally{n.end()}}var Nv=1;function xh(e,t){let n=Nv++;return new Promise((r,s)=>{let i="",o=setTimeout(()=>{l(),e.destroy(),s(new Error("Craig UI navigation request timed out."))},1e3),a=c=>{i+=String(c);let u=i.indexOf(`
221
+ `);if(u===-1)return;l();let d=JSON.parse(i.slice(0,u));d.ok?r(d):s(new Error(d.error??"Craig UI navigation request failed."))},l=()=>{clearTimeout(o),e.off("data",a)};e.on("data",a),e.write(`${JSON.stringify({...t,id:n})}
222
+ `)})}function Dv(e){return new Promise((t,n)=>{let r=$v(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function jh(e,t){switch(e.kind){case"addWorkspace":{let n=await be.addWorkspace(t.paths,e.path),r=n.workspace.kind==="project"?n.workspace.discoveredRepoIds?.[0]??null:n.repos[0]?.id??null;return await Sd(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await be.repos.addRepo(t.paths,e.path);return await Sd(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return be.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await Bn({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await ve(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await be.repos.removeRepo(t.paths,e.repoId,{listTasks:S.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await yt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await yt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return be.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await be.archiveWorkspace(t.paths,e.workspaceId);return await xv(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await be.restoreWorkspace(t.paths,e.workspaceId);return await Sd(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return be.removeWorkspace(t.paths,e.workspaceId,{listTasks:S.listTasks});case"createTask":return Eh(t.paths,e.repoId??e.workspaceId??"",e.prompt,{...e.runner?{runner:e.runner}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}});case"createChildTask":{let n=await k.load(t.paths);if(!k.previews.isEnabled(n,"agentOrchestration"))throw new g("CLI_USAGE","Child delegation is a feature preview. Enable agentOrchestration before creating child tasks.",{details:{preview:"agentOrchestration"}});return Ln(t),Oo(t.paths,{parentTaskId:e.parentTaskId??Wt(t).task.id,...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{},prompt:e.prompt,...e.runner?{runner:e.runner}:{},...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.agentCapabilityId?{capabilityId:t.agentCapabilityId}:{}})}case"listTaskChildren":return Ln(t),Pc(t.paths,e.taskId??Wt(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return Ln(t),$o(t.paths,e.taskId??Wt(t).task.id,t.agentCapabilityId);case"validateFury":return await Mh(t),od(Id.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await Mh(t),We.plan(t.paths,Id.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??Wt(t).task.id,fn(t),t.agentCapabilityId);case"approveFury":return We.approve(t.paths,e.planId,fn(t));case"runFury":return Ln(t),We.run(t.paths,e.planId,fn(t),t.agentCapabilityId);case"showFury":return We.show(t.paths,e.runId);case"watchFury":return We.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return We.cancel(t.paths,e.runId,fn(t),t.agentCapabilityId);case"resumeFury":return We.resume(t.paths,e.runId,fn(t),t.agentCapabilityId);case"completeFuryStep":return Ln(t),We.completeStep(t.paths,e.runId,e.stepId,await Fv(e.output,t),fn(t),t.agentCapabilityId);case"failFuryStep":return Ln(t),We.failStep(t.paths,e.runId,e.stepId,e.reason,fn(t),t.agentCapabilityId);case"listFuryReviews":return We.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return We.showReview(t.paths,e.reviewId);case"actFuryReview":return Ln(t),We.actOnReview(t.paths,e.reviewId,e.action,e.message??null,fn(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=Wt(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"renameTask":return S.renameTask(t.paths,e.taskId??Wt(t).task.id,e.title);case"addTaskLink":return S.addTaskLink(t.paths,e.taskId,e.repoId);case"addTaskRepoTarget":return S.addTaskRepoTarget(t.paths,e.taskId,e.repoId);case"listTaskLinks":return S.listTaskLinks(t.paths,e.taskId);case"openFile":{let n=await k.load(t.paths);if(!k.previews.isEnabled(n,"fileOpen"))throw new g("CLI_USAGE","Opening files in the Craig TUI is a feature preview. Enable fileOpen before using this command.",{details:{preview:"fileOpen"}});let r=await Pd(t.cwd??process.cwd(),e.path),s=await Lh(t.paths,r);if(!s)throw new g("EXTERNAL_DEPENDENCY_FAILED","No compatible Craig TUI is connected to this workspace. Restart Craig and try again.",{retryable:!0,details:{path:r}});return{kind:"openFile",path:r,delivered:s}}case"refreshInteractiveState":throw new Error("Interactive refresh should be handled by the interactive app.");case"showTask":return S.showTask(t.paths,e.taskId);case"showCurrentTask":return S.showTask(t.paths,Wt(t).task.id);case"showTaskPr":return S.prs.show(t.paths,Mn(e.taskId,t),e.repoId);case"discoverTaskPr":return S.prs.discover(t.paths,Mn(e.taskId,t),e.repoId);case"linkTaskPr":return S.prs.link(t.paths,Mn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return S.prs.refreshAssociation(t.paths,Mn(e.taskId,t),e.repoId);case"unlinkTaskPr":return S.prs.unlink(t.paths,Mn(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return xt.listAgents(t.paths,e.taskId);case"showAgentStatus":return xt.showAgentStatus(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.tabId?{tabId:e.tabId}:{}});case"waitTask":{let n={states:e.states,timeoutMs:e.timeoutMs,...e.tabId?{tabId:e.tabId}:{},...t.signal?{signal:t.signal}:{}},r=Mn(e.taskId,t),s=await k.load(t.paths);return k.previews.isEnabled(s,"agentOrchestration")?Po.waitForTaskState(t.paths,r,n):xt.waitForTask(t.paths,r,n)}case"listEvents":return Po.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return Po.watch(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}},{onEvent:t.emitEvent??(()=>{}),...t.signal?{signal:t.signal}:{}});case"sendAgentPrompt":return Rr.send(t.paths,{taskId:Mn(e.taskId,t),...e.tabId?{tabId:e.tabId}:t.taskContext?.agentTabId?{tabId:t.taskContext.agentTabId}:{},prompt:e.prompt,delivery:e.delivery,timeoutMs:e.timeoutMs,...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.readStdin?{readStdin:t.readStdin}:{}});case"showPromptCommand":return Rr.show(t.paths,e.commandId);case"listPromptCommands":return Rr.list(t.paths,e.taskId);case"cancelPromptCommand":return Rr.cancel(t.paths,e.commandId);case"waitPromptCommand":return Rr.wait(t.paths,e.commandId,{...e.states?{states:e.states}:{},timeoutMs:e.timeoutMs,...t.signal?{signal:t.signal}:{}});case"showSelectedTask":return S.showTask(t.paths,Pr(t,"show"));case"streamTaskLogs":return S.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return S.prepareTaskLogs(t.paths,Pr(t,"logs"));case"showTaskDiff":return S.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return S.showTaskDiff(t.paths,Pr(t,"diff"));case"openTask":return S.openTask(t.paths,e.taskId);case"openSelectedTask":return S.openTask(t.paths,Pr(t,"open"));case"runChecks":return S.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return S.runChecks(t.paths,Pr(t,"check"));case"commitTask":return S.commitTask(t.paths,e.taskId);case"commitSelectedTask":return S.commitTask(t.paths,Pr(t,"commit"));case"showContext":{let n=Mv(t);return{kind:"showContext",workspace:{root:n.workspaceRoot,source:n.source,initialized:n.initialized},task:t.taskContext?{id:t.taskContext.task.id,source:t.taskContext.source,agentTabId:t.taskContext.agentTabId}:null}}case"help":return{kind:"help",text:Na()};case"exit":return{kind:"exit"};default:return Lv(e)}}function Ln(e){if(!(!e.agentContext||e.agentCapabilityId))throw new g("CAPABILITY_DENIED","This agent session has no delegation capability. Restart the agent session to receive one.",{details:{reason:"agent capability is missing"}})}async function Mh(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 fn(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=Wt(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 Fv(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await _v(Id.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 Sd(e,t,n){let r=await Bn({uiStateFile:e.uiStateFile})??Js();await yt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function xv(e,t){let n=await Bn({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await yt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function Lv(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function Pr(e,t){if(e.selectedTaskId)return e.selectedTaskId;throw new Error(`No task selected. Create a task with 'task new --repo <repo-id> <prompt>' or use '${t} <id>'.`)}function Wt(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Mn(e,t){return e??Wt(t).task.id}function Mv(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Uh(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(`
223
223
  `);case"createRepo":return[`${e.created?"Registered":"Already registered"} repo ${e.repo.id}`,`Path: ${e.repo.rootPath}`,`Branch: ${e.repo.defaultBranch}`,`Workspace: ${e.workspaceId}`].join(`
224
224
  `);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(`
225
225
  `);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(`
@@ -229,67 +229,69 @@ Only a human can approve this review.`},delivery:"when-ready",timeoutMs:Math.min
229
229
  `);case"cancelTaskTree":return[`Cancelled task tree ${e.taskId}`,...e.cancelled.map(t=>`${t.taskId}: ${t.disposition}`)].join(`
230
230
  `);case"validateFury":return[`Valid fury ${e.name}`,`Definition: ${e.definitionHash}`,`Steps: ${e.stepCount}`,`Order: ${e.order.join(" -> ")}`].join(`
231
231
  `);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(`
232
- `);case"approveFury":return`${e.created?"Approved":"Already approved"} fury plan ${e.plan.id}: ${e.plan.planHash}`;case"runFury":return`${e.created?"Started":"Found"} fury ${e.run.id}: ${e.run.state}`;case"showFury":case"cancelFury":case"resumeFury":return Nv(e.run);case"completeFuryStep":case"failFuryStep":return`${e.run.id} step ${e.step.id}: ${e.step.state}`;case"listFuryReviews":return e.reviews.length===0?"No fury reviews found.":["ID RUN STEP STATE ROUND TITLE",...e.reviews.map(t=>`${t.id} ${t.runId} ${t.stepId} ${t.state} ${t.round} ${t.title}`)].join(`
233
- `);case"showFuryReview":return Lh(e.review);case"actFuryReview":return`${Lh(e.review)}
232
+ `);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 jv(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(`
233
+ `);case"showFuryReview":return qh(e.review);case"actFuryReview":return`${qh(e.review)}
234
234
  Run: ${e.run.state}`;case"watchFury":return"";case"addTaskLink":return[`Added contextual repo link ${e.repoId} to task ${e.taskId}: ${e.linkedRepoIds.join(", ")}`,`This does not provision a project task target. Use 'craig task repo add ${e.taskId} ${e.repoId}' for that.`].join(`
235
235
  `);case"addTaskRepoTarget":return[`${e.disposition==="added"?"Added":"Found"} repo target ${e.repoId} for task ${e.taskId}`,`Branch: ${e.branch}`,`Worktree: ${e.worktreePath}`].join(`
236
236
  `);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(`
237
- `);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} ${Mv(t)} ${jv(t)} ${t.title}`)].join(`
238
- `);case"showTask":return[`${e.task.id}: ${e.task.title}`,`Status: ${e.task.status}`,`Runner: ${e.task.runner}`,`Repo: ${e.task.repoId}`,`Workspace: ${e.task.workspaceId}`,`Branch: ${e.task.branch}`,`Worktree: ${e.task.worktreePath}`,`Agent tab: ${e.task.ptyTabs.find(t=>t.kind==="agent")?.id??"<missing>"}`,`Linked repos: ${e.task.linkedRepoIds.length>0?e.task.linkedRepoIds.join(", "):"none"}`,`Prompt: ${e.task.prompt.source} ${JSON.stringify(e.task.prompt.value)}`,`Runner command: ${e.inspection.runnerCommandText||"<none>"}`,`Runner state: ${e.task.runnerSession.lastKnownState}`,`Started: ${e.task.runnerSession.startedAt??"not started"}`,`Exited: ${e.task.runnerSession.exitedAt??"still running"}`,`Checks: ${e.inspection.checksSummary}`,`Last commit: ${e.inspection.lastCommitSummary}`,`PR: ${e.inspection.prSummary}`,`Cleanup: ${e.inspection.cleanupSummary}`,...Fv(e)].join(`
237
+ `);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} ${Kv(t)} ${Gv(t)} ${t.title}`)].join(`
238
+ `);case"showTask":return[`${e.task.id}: ${e.task.title}`,`Status: ${e.task.status}`,`Runner: ${e.task.runner}`,`Repo: ${e.task.repoId}`,`Workspace: ${e.task.workspaceId}`,`Branch: ${e.task.branch}`,`Worktree: ${e.task.worktreePath}`,`Agent tab: ${e.task.ptyTabs.find(t=>t.kind==="agent")?.id??"<missing>"}`,`Linked repos: ${e.task.linkedRepoIds.length>0?e.task.linkedRepoIds.join(", "):"none"}`,`Prompt: ${e.task.prompt.source} ${JSON.stringify(e.task.prompt.value)}`,`Runner command: ${e.inspection.runnerCommandText||"<none>"}`,`Runner state: ${e.task.runnerSession.lastKnownState}`,`Started: ${e.task.runnerSession.startedAt??"not started"}`,`Exited: ${e.task.runnerSession.exitedAt??"still running"}`,`Checks: ${e.inspection.checksSummary}`,`Last commit: ${e.inspection.lastCommitSummary}`,`PR: ${e.inspection.prSummary}`,`Cleanup: ${e.inspection.cleanupSummary}`,...Wv(e)].join(`
239
239
  `);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(`
240
- `);case"renameTask":return`Renamed task ${e.taskId} from ${JSON.stringify(e.previousTitle)} to ${JSON.stringify(e.title)}.`;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return xv(e);case"listAgents":case"showAgentStatus":return _v(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(Rd).join(`
241
- `);case"watchEvents":return"";case"sendAgentPrompt":return`${e.created?"Queued":"Found"} command ${e.command.id} for task ${e.command.taskId} tab ${e.command.agentTabId}.`;case"showPromptCommand":return Dv(e.command);case"listPromptCommands":return e.commands.length===0?"No prompt commands found.":["ID TASK TAB STATE DELIVERY ATTEMPTS",...e.commands.map(t=>`${t.id} ${t.taskId} ${t.agentTabId} ${t.state} ${t.delivery} ${t.attempts}`)].join(`
240
+ `);case"renameTask":return`Renamed task ${e.taskId} from ${JSON.stringify(e.previousTitle)} to ${JSON.stringify(e.title)}.`;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return Bv(e);case"listAgents":case"showAgentStatus":return Uv(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(vd).join(`
241
+ `);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 qv(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(`
242
242
  `);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(`
243
243
  `);case"streamTaskLogs":return`Streaming logs for ${e.taskId} from ${e.logPath}`;case"showTaskDiff":return e.isEmpty?`Task ${e.taskId} has no uncommitted diff.`:e.diffText;case"openTask":return e.launched?`Opened task ${e.taskId} at ${e.worktreePath}`:e.worktreePath;case"openFile":return`Opened ${e.path} in Craig.`;case"runChecks":return`Checks ${e.status} for ${e.taskId}: ${e.commands.join(", ")}`;case"commitTask":return[`Committed task ${e.taskId}`,`Status: ${e.status}`,`Commit: ${e.commitSha}`,`Message: ${e.message}`].join(`
244
- `);default:return Lv(e)}}function Nv(e){return[`${e.id}: ${e.state}`,`Definition: ${e.name} (${e.definitionHash})`,`Root task: ${e.rootTaskId}`,...e.order.map(t=>{let n=e.stepRuns[t];return`${t}: ${n.state}${n.taskId?` (${n.taskId})`:""}${n.error?` - ${n.error}`:""}`})].join(`
245
- `)}function Lh(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(`
246
- `)}function Dv(e){return[`${e.id}: ${e.state}`,`Task: ${e.taskId}`,`Agent tab: ${e.agentTabId}`,`Delivery: ${e.delivery}`,`Attempts: ${e.attempts}`,`Prompt source: ${e.prompt.source}`,`Prompt bytes: ${Buffer.byteLength(e.prompt.text)}`,`Created: ${e.createdAt}`,`Updated: ${e.updatedAt}`,`Error: ${e.lastError?.message??"none"}`].join(`
247
- `)}function Rd(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function _v(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(`
248
- `)}function xv(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(`
249
- `)}function Fv(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 Lv(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function Mv(e){return e.checks.status}function jv(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 jh(e,t){let{data:n,warnings:r}=qv(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:n,warnings:r})}function qv(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...n}=e;return{data:n,warnings:t}}return{data:e,warnings:[]}}function qh(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 Pd(e){let t=await be.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=Oe(t.workspaceRoot),r=e.resolveTask===!0||e.requireTask===!0||e.explicitTaskId!==void 0||e.environmentTaskId!==void 0||e.environmentAgentTabId!==void 0;if(r&&!t.initialized)throw new g("TASK_CONTEXT_NOT_FOUND",`Task context cannot be resolved because ${t.workspaceRoot} is not an initialized Craig workspace.`,{details:{workspaceRoot:t.workspaceRoot}});let s=r&&t.initialized?await P.resolveContext(n,{cwd:e.cwd,...e.explicitTaskId!==void 0?{explicitTaskId:e.explicitTaskId}:{},...e.environmentTaskId!==void 0?{environmentTaskId:e.environmentTaskId}:{},...e.environmentAgentTabId!==void 0?{environmentAgentTabId:e.environmentAgentTabId}:{},...e.requireTask!==void 0?{required:e.requireTask}:{}}):null;return{paths:n,workspace:t,task:s}}async function Uh(e){let t="cli",n=rp(e.argv);try{let r=np(e.argv);if(n=r.options.json,r.mode==="interactive"){if(r.options.noInput||r.options.json||Yv(e.env)||!e.isInputTty||!e.isOutputTty)throw new g("INPUT_REQUIRED","Interactive Craig requires a TTY. Provide a command instead of starting the terminal application.",{});if(r.options.workspaceRoot===void 0&&(e.env.CRAIG_TASK_ID!==void 0||e.env.CRAIG_AGENT_TAB_ID!==void 0))throw new g("TASK_CONTEXT_CONFLICT","Interactive Craig will not implicitly attach to a live workspace from an agent session. Pass --workspace-root <path> to confirm the live workspace, or pass a different directory for an isolated workspace.",{details:{workspaceRoot:e.env.CRAIG_WORKSPACE_ROOT??null,taskId:e.env.CRAIG_TASK_ID??null,agentTabId:e.env.CRAIG_AGENT_TAB_ID??null}});let u=await Pd({cwd:e.cwd,...r.options.workspaceRoot!==void 0?{explicitWorkspaceRoot:r.options.workspaceRoot}:{},...e.env.CRAIG_WORKSPACE_ROOT!==void 0?{environmentWorkspaceRoot:e.env.CRAIG_WORKSPACE_ROOT}:{},allowUninitializedWorkspace:!0});return e.runInteractive(u.workspace.workspaceRoot)}if(!r.command||!r.commandName)throw new g("CLI_USAGE","Command mode requires a command.",{});if(t=r.commandName,(r.command.kind==="watchEvents"||r.command.kind==="watchFury")&&r.options.json)throw new g("CLI_USAGE","watch commands stream output; use --format jsonl instead of --json.",{});Wv(r.command,r.options.taskId);let s=Kv(r.command,r.options.taskId),i=Bv(s);Vv(s,r.options.taskId,i);let o=i!=="none",a=await Pd({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:Uv(s),resolveTask:i!=="none",requireTask:i==="required"}),l=Gv(s,e.signal),c;try{c=await Fh(s,{paths:a.paths,cwd:e.cwd,workspaceContext:a.workspace,taskContext:a.task,...l.signal?{signal:l.signal}:{},...s.kind==="watchEvents"||s.kind==="watchFury"?{emitEvent:u=>e.writeStdout(`${s.format==="jsonl"?JSON.stringify(u):Rd(u)}
250
- `)}:{},...e.readStdin?{readStdin:e.readStdin}:{},...e.env.CRAIG_AGENT_TAB_ID?{agentContext:!0}:{},...e.env.CRAIG_AGENT_CAPABILITY?{agentCapabilityId:e.env.CRAIG_AGENT_CAPABILITY}:{}})}finally{l.dispose()}let d=n?jh(t,c):Mh(c);return d.length>0&&e.writeStdout(`${d}
251
- `),0}catch(r){let s=va(r),i=n?qh(t,s):s.message;return e.writeStderr(`${i}
252
- `),s.exitCode}}function Uv(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function Bv(e){return e.kind==="showContext"?"optional":e.kind==="currentTask"||e.kind==="showCurrentTask"?"required":e.kind==="renameTask"?e.taskId?"none":"required":e.kind==="createChildTask"?e.parentTaskId?"none":"required":e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||Hv(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 Wv(e,t){let n=Bh(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 Vv(e,t,n){if(!(t===void 0||n!=="none"||Bh(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 Bh(e){switch(e.kind){case"showTask":case"renameTask":case"listTaskLinks":case"listTaskChildren":case"cancelTaskTree":case"streamTaskLogs":case"showTaskDiff":case"openTask":case"runChecks":case"commitTask":case"waitTask":case"listAgents":case"showAgentStatus":case"listEvents":case"watchEvents":case"sendAgentPrompt":case"listPromptCommands":return e.taskId;case"createChildTask":return e.parentTaskId;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return e.taskId;case"addTaskLink":case"addTaskRepoTarget":return e.taskId;default:return}}function Kv(e,t){return t&&(e.kind==="listAgents"||e.kind==="showAgentStatus"||e.kind==="waitTask"||e.kind==="listEvents"||e.kind==="watchEvents"||e.kind==="sendAgentPrompt"||e.kind==="listPromptCommands"||e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||e.kind==="createChildTask"||e.kind==="renameTask")?e.kind==="createChildTask"?{...e,parentTaskId:e.parentTaskId??t}:{...e,taskId:e.taskId??t}:e}function Gv(e,t){if(e.kind!=="waitTask"&&e.kind!=="watchEvents"&&e.kind!=="watchFury"&&e.kind!=="waitPromptCommand")return{dispose:()=>{}};if(t)return{signal:t,dispose:()=>{}};let n=new AbortController,r=()=>n.abort();return process.once("SIGINT",r),{signal:n.signal,dispose:()=>process.removeListener("SIGINT",r)}}function Hv(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function Yv(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as O0}from"node:module";import{readFile as zv,stat as Jv}from"node:fs/promises";import Sd from"node:path";var Xv=200*1024,Qv=500*1024,No="100000";async function Vh(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return Zv(e,t,n);try{let r=mn(n.selectedFilePath??null,t.filePaths),s=mn(n.selectedDiffPath??null,t.diffPaths),i=s?await Es(e.worktreePath):null,[o,a]=await Promise.all([_o(e.worktreePath,r),s?Id(e.worktreePath,s,t.diffRows,i):Promise.resolve(Ae("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 Zv(e,t,n){let r=mn(n.selectedFilePath??null,t.filePaths),s=mn(n.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([Gh(e,r),(async()=>{if(!s)return Ae("No diff selected","No local changes found.","empty");let l=Do(e,s),c=l?await Es(l.target.worktreePath).catch(()=>null):null;return Hh(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function Kh(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return eC(e,t);try{await we(e);let n=await Es(e.worktreePath),[r,s]=await Promise.all([Yh(e.worktreePath),zh(e.worktreePath,n)]),i=[...new Set(s.map(u=>u.path))],o=mn(t.selectedFilePath??null,r),a=mn(t.selectedDiffPath??null,i),[l,c]=await Promise.all([_o(e.worktreePath,o),a?Id(e.worktreePath,a,s,n):Promise.resolve(Ae("No diff selected","No local changes found.","empty"))]),d=a?{[a]:c}:{};return{taskId:e.id,fileRows:eg(r),filePaths:r,diffRows:s,diffPaths:i,diffContents:d,selectedFilePath:o,selectedDiffPath:a,selectedFile:l,selectedDiff:c,error:null}}catch(n){let r=n instanceof Error?n.message:"Unable to inspect task worktree.";return{taskId:e.id,fileRows:[],filePaths:[],diffRows:[],diffPaths:[],diffContents:{},selectedFilePath:null,selectedDiffPath:null,selectedFile:Ae("Files unavailable",r,"error"),selectedDiff:Ae("Diff unavailable",r,"error"),error:r}}}async function eC(e,t){let n=(e.repoTargets??[]).filter(p=>p.status==="ready"),r=await Promise.all(n.map(async p=>{let h=await Es(p.worktreePath).catch(()=>null),[f,m]=await Promise.all([Yh(p.worktreePath).catch(()=>[]),zh(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=mn(t.selectedFilePath??null,s),l=mn(t.selectedDiffPath??null,o),[c,d]=await Promise.all([Gh(e,a),(async()=>{if(!l)return Ae("No diff selected","No local changes found.","empty");let p=Do(e,l),h=p?r.find(f=>f.target.repoId===p.target.repoId):null;return Hh(e,l,i,h?.baseRef??null)})()]),u=l?{[l]:d}:{};return{taskId:e.id,fileRows:eg(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:u,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:d,error:null}}async function Gh(e,t){let n=Do(e,t);if(!n)return Ae("No file selected","No Git-visible files found.","empty");let r=await _o(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function Hh(e,t,n,r=null){let s=Do(e,t);return s?{...await Id(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}:Ae(t,"Repo target is unavailable.","error",t)}function Do(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 Yh(e){let t=await K("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return tg(t.stdout)}async function zh(e,t){let[n,r,s,i]=await Promise.all([tC(e,t),Wh(e,"staged"),Wh(e,"unstaged"),nC(e)]);return[...n,...r,...s,...i]}async function tC(e,t){if(!t)return[];let[n,r]=await Promise.all([K("git",["diff","--name-status",`${t}...HEAD`],{cwd:e}),K("git",["diff","--numstat",`${t}...HEAD`],{cwd:e})]),s=Jh(n.stdout),i=Xh(r.stdout);return s.map(o=>{let a=i.get(o.path)??{additions:null,deletions:null};return{group:"branch",path:o.path,status:o.status,additions:a.additions,deletions:a.deletions}}).sort((o,a)=>o.path.localeCompare(a.path))}async function Wh(e,t){let n=t==="staged"?["diff","--cached"]:["diff"],[r,s]=await Promise.all([K("git",[...n,"--name-status"],{cwd:e}),K("git",[...n,"--numstat"],{cwd:e})]),i=Jh(r.stdout),o=Xh(s.stdout);return i.map(a=>{let l=o.get(a.path)??{additions:null,deletions:null};return{group:t,path:a.path,status:a.status,additions:l.additions,deletions:l.deletions}}).sort((a,l)=>a.path.localeCompare(l.path))}async function nC(e){let t=await K("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=tg(t.stdout);return await Promise.all(n.map(async s=>{let i=await _o(e,s),o=i.status==="ready"?rC(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function Jh(e){return e.split(`
253
- `).map(t=>t.trim()).filter(t=>t.length>0).map(t=>{let[n="M",...r]=t.split(" ");return{status:n,path:r.at(-1)??""}}).filter(t=>t.path.length>0)}function Xh(e){let t=new Map;for(let n of e.split(`
254
- `)){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 Es(e){return(await Q("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await Q("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function _o(e,t){if(!t)return Ae("No file selected","No Git-visible files found.","empty");let n=sC(e,t);return Zh(n,t)}async function Qh(e){return Zh(e,e)}async function Zh(e,t){try{let n=await Jv(e);if(n.size>Xv)return Ae(t,`File is ${n.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,n.size);let r=await zv(e);return iC(r)?Ae(t,"Binary file preview is not available in Craig.","binary",t,r.byteLength):{path:t,status:"ready",title:t,lines:r.toString("utf8").split(`
255
- `),byteLength:r.byteLength}}catch(n){let r=n instanceof Error?n.message:"Unable to read file.";return Ae(t,r,"missing",t,null)}}async function Id(e,t,n,r=null){if(!t)return Ae("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 Es(e);if(a){let l=await K("git",["diff","--stat","--patch",`--unified=${No}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
256
- ${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await K("git",["diff","--cached","--stat","--patch",`--unified=${No}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
257
- ${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await K("git",["diff","--stat","--patch",`--unified=${No}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
258
- ${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await Q("git",["diff","--no-index","--stat","--patch",`--unified=${No}`,"--","/dev/null",t],{cwd:e});a.stdout.trim().length>0&&s.push(`untracked
244
+ `);default:return Vv(e)}}function jv(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(`
245
+ `)}function qh(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(`
246
+ `)}function qv(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(`
247
+ `)}function vd(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function Uv(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(`
248
+ `)}function Bv(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(`
249
+ `)}function Wv(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 Vv(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function Kv(e){return e.checks.status}function Gv(e){if(e.type==="project"&&e.repoTargets?.length){let n=e.repoTargets.filter(s=>s.pullRequest.number);if(n.length===0)return"-";let r=n.reduce((s,i)=>{let o=i.pullRequest.status??"unknown";return s[o]=(s[o]??0)+1,s},{});return Object.entries(r).map(([s,i])=>`${i} ${s}`).join(", ")}let t=e.prs[0];return t?.number?`#${t.number}:${t.status??"unknown"}`:"-"}function Bh(e,t){let{data:n,warnings:r}=Hv(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:n,warnings:r})}function Hv(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...n}=e;return{data:n,warnings:t}}return{data:e,warnings:[]}}function Wh(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 Cd(e){let t=await be.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=$e(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 Vh(e){let t="cli",n=ap(e.argv);try{let r=op(e.argv);if(n=r.options.json,r.mode==="interactive"){if(r.options.noInput||r.options.json||tC(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 Cd({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.",{});Jv(r.command,r.options.taskId);let s=Qv(r.command,r.options.taskId),i=zv(s);Xv(s,r.options.taskId,i);let o=i!=="none",a=await Cd({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:Yv(s),resolveTask:i!=="none",requireTask:i==="required"}),l=Zv(s,e.signal),c;try{c=await jh(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):vd(d)}
250
+ `)}:{},...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?Bh(t,c):Uh(c);return u.length>0&&e.writeStdout(`${u}
251
+ `),0}catch(r){let s=Ea(r),i=n?Wh(t,s):s.message;return e.writeStderr(`${i}
252
+ `),s.exitCode}}function Yv(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function zv(e){return e.kind==="showContext"?"optional":e.kind==="currentTask"||e.kind==="showCurrentTask"?"required":e.kind==="renameTask"?e.taskId?"none":"required":e.kind==="createChildTask"?e.parentTaskId?"none":"required":e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||eC(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 Jv(e,t){let n=Kh(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 Xv(e,t,n){if(!(t===void 0||n!=="none"||Kh(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 Kh(e){switch(e.kind){case"showTask":case"renameTask":case"listTaskLinks":case"listTaskChildren":case"cancelTaskTree":case"streamTaskLogs":case"showTaskDiff":case"openTask":case"runChecks":case"commitTask":case"waitTask":case"listAgents":case"showAgentStatus":case"listEvents":case"watchEvents":case"sendAgentPrompt":case"listPromptCommands":return e.taskId;case"createChildTask":return e.parentTaskId;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return e.taskId;case"addTaskLink":case"addTaskRepoTarget":return e.taskId;default:return}}function Qv(e,t){return t&&(e.kind==="listAgents"||e.kind==="showAgentStatus"||e.kind==="waitTask"||e.kind==="listEvents"||e.kind==="watchEvents"||e.kind==="sendAgentPrompt"||e.kind==="listPromptCommands"||e.kind==="listTaskChildren"||e.kind==="cancelTaskTree"||e.kind==="createChildTask"||e.kind==="renameTask")?e.kind==="createChildTask"?{...e,parentTaskId:e.parentTaskId??t}:{...e,taskId:e.taskId??t}:e}function Zv(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 eC(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function tC(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as M0}from"node:module";import{stripVTControlCharacters as HC}from"node:util";import lK from"picocolors";var nC=[" \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 Ad(){return[...nC]}var Fo={width:120,height:36},ee={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function Ve(e,t){return{width:Math.max(e??Fo.width,Fo.width),height:Math.max(t??Fo.height,Fo.height)}}function Ns(e,t=!1){let s=ee.topRailHeight+1,i=e.height-ee.topRailHeight-1,o={row:s,height:i,column:t?2:35,width:t?e.width-2:e.width-32-34-4};return{left:t?null:{row:s,height:i,column:2,width:32},center:o,right:t?null:{row:s,height:i,column:e.width-34,width:34}}}function Gh(e,t=!1){let n=Ns(e,t).center;return{row:n.row+2,column:n.column+3,width:n.width-6,height:n.height-3}}var rC=["tasks","center","inspector","actions"],Hh=["agent","terminal"],Yh=[],V="inspection",fK=[...Hh,...Yh],Ed=["commit","push","refresh-checks","close-task"],zh=["refresh-checks","close-task"],Jh=["task","checks","pr","setup-run","actions","next-action"],Od=["files","review"];function Xh(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=cC(e?.openInspectionKind)??n,s=k.runners.getEnabled(t);return{inputMode:uC(e?.inputMode),focusedRegion:aC(e?.focusedRegion),selectedRepoId:Vt(e?.selectedRepoId),selectedWorkspaceId:Vt(e?.selectedWorkspaceId),selectedTaskId:Vt(e?.selectedTaskId),selectedPtyTabId:Vt(e?.selectedPtyTabId),selectedLeftItemId:wC(Vt(e?.selectedTaskId)),activeTab:n?V:Vt(e?.activeTab)??"agent",preferredPtyTabKind:dC(e?.preferredPtyTabKind),inspectorSection:Ds(e?.inspectorSection,Jh,"task"),inspectionMode:lC(e?.inspectionMode,n==="diff"?"review":"files"),openInspectionKind:r,selectedFileTreePath:Vt(e?.selectedFileTreePath),selectedFilePath:Vt(e?.selectedFilePath),selectedDiffPath:Vt(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:Ds(e?.selectedActionId,Ed,"commit"),selectedProjectTargetId:null,selectedRunner:pC(e?.selectedRunner,s,k.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:sC(),centerZoomed:!1,readAgentActivityAt:e?.readAgentActivityAt??{}}}function sC(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function xo(e,t){return{...e??Js(),selectedRepoId:t.selectedRepoId,selectedWorkspaceId:t.selectedWorkspaceId,selectedTaskId:t.selectedTaskId,selectedPtyTabId:t.selectedPtyTabId,inputMode:t.inputMode,focusedRegion:t.focusedRegion,activeTab:t.activeTab,preferredPtyTabKind:t.preferredPtyTabKind,inspectorSection:t.inspectorSection,inspectionMode:t.inspectionMode,openInspectionKind:t.openInspectionKind,selectedFileTreePath:t.selectedFileTreePath,selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath,collapsedFileTreePaths:t.collapsedFileTreePaths,selectedActionId:t.selectedActionId,selectedRunner:t.selectedRunner,readAgentActivityAt:t.readAgentActivityAt}}function jn(e,t,n={}){let r=gC(e,t),s=Nd(r),i=s?.kind==="task"?t.tasks.find(f=>f.id===s.id)??null:null,o=i?yC(t.tasks,i):null,a=Vo(r),l=Wo(r),c=t.workspaces?.find(f=>f.id===a)??(l?t.workspaces?.find(f=>f.kind==="repo"&&f.primaryRepoId===l):null)??(s?.kind==="workspace"?t.workspaces?.find(f=>f.id===s.id)??null:null)??(o?t.workspaces?.find(f=>f.id===o.workspaceId)??null:null)??t.workspaces?.find(f=>f.id===e.selectedWorkspaceId)??t.workspaces?.[0]??null,d=(t.repos.find(f=>f.id===l)??(s?.kind==="repo"?t.repos.find(f=>f.id===s.id)??null:o?t.repos.find(f=>f.id===o.repoId)??null:null)??(c?.kind==="project"?t.repos.find(f=>f.id===e.selectedRepoId&&c.discoveredRepoIds?.includes(f.id))??null:null)??(c?.kind!=="project"?t.repos.find(f=>f.id===c?.primaryRepoId)??null:null)??t.repos.find(f=>f.id===e.selectedRepoId)??t.repos[0]??null)?.id??null,p=c?jo(t.tasks,c.id):d?qo(t.tasks,d):[],h=(s?.kind==="task"?p.find(f=>f.id===s.id)??null:null)??p.find(f=>f.id===e.selectedTaskId)??p[0]??null;return{...e,inputMode:n.resetInputMode?"control":e.inputMode,selectedLeftItemId:r,selectedWorkspaceId:c?.id??null,selectedRepoId:d,selectedTaskId:h?.id??null,...fC(h,e.activeTab,e.selectedPtyTabId),selectedFilePath:oC(e,t,h?.id??null),...mC(e,t,h?.id??null),selectedDiffPath:iC(e,t,h?.id??null),inspectorSection:Ds(e.inspectorSection,Jh,"task")}}function Kt(e,t){return{...e,terminal:t}}function Qh(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function Zh(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function Se(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
253
+ `}function $d(e){return e.length===1&&e>=" "&&e!=="\x7F"}function Lo(e){return tg(e)||Sr(e)!==null}function eg(e){return Yh.includes(e)}function tg(e){return Hh.includes(e)}function ng(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[V]:[]]}function iC(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function oC(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function Ds(e,t,n){return t.includes(e??"")?e:n}function aC(e){return e==="tabs"?"center":Ds(e,rC,"tasks")}function lC(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":Ds(e,Od,t)}function cC(e){return e==="file"||e==="diff"?e:null}function dC(e){return e==="terminal"?"terminal":"agent"}function uC(e){return e==="terminal"?"terminal":"control"}function pC(e,t=[...wt],n="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:n}function Mo(e,t=wt){let n=t.length>0?t:wt,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function Sr(e){let t=me.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function fC(e,t,n){if(!e)return{activeTab:t===V?t:"agent",selectedPtyTabId:null};let r=e.ptyTabs.find(a=>a.id===n)??null,s=e.selectedPtyTabId?e.ptyTabs.find(a=>a.id===e.selectedPtyTabId)??null:null,i=e.ptyTabs.find(a=>a.id===t)??null;if(i)return{activeTab:i.id,selectedPtyTabId:i.id};if(tg(t)){let l=e.ptyTabs.find(c=>c.kind===t)??null??s??r??e.ptyTabs[0]??null;return{activeTab:l?.id??V,selectedPtyTabId:l?.id??null}}if(t===V)return{activeTab:V,selectedPtyTabId:r?.id??s?.id??e.ptyTabs[0]?.id??null};let o=s??r??e.ptyTabs[0]??null;return{activeTab:o?.id??V,selectedPtyTabId:o?.id??null}}function mC(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?hC(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function hC(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 gC(e,t){let n=qn(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 qn(e){let t=e.furyPendingPlans?.length?["fury-plans"]:[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of _s(jo(e.tasks,n.id)))t.push(`task:${r.id}`);n.kind==="project"&&t.push(`new-task-workspace:${n.id}`),n.kind==="repo"&&t.push(`new-task:${n.primaryRepoId}`)}else for(let n of e.repos){t.push(`repo:${n.id}`);for(let{task:r}of _s(qo(e.tasks,n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function jo(e,t){return rg(e,n=>n.workspaceId===t)}function qo(e,t){return rg(e,n=>n.repoId===t)}function yC(e,t){return t.rootTaskId===t.id?t:e.find(n=>n.id===t.rootTaskId)??t}function rg(e,t){let n=new Map(e.map(r=>[r.id,r]));return e.filter(r=>t(n.get(r.rootTaskId)??r))}function _s(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 Vt(e){return typeof e=="string"?e:null}function wC(e){return e?`task:${e}`:null}function Fs(e){return typeof e=="string"&&e.startsWith("task:")}function Uo(e){return typeof e=="string"&&e.startsWith("new-task:")}function Bo(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function sg(e){return typeof e=="string"&&e.startsWith("workspace:")}function Wo(e){return Uo(e)?e.slice(9):null}function Vo(e){return Bo(e)?e.slice(19):null}var kC=["Start","Options","Exit"],TC=["Resume","Options","Exit"],lg=2,cg=2,Go=2,bC=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),RC=new RegExp("\x1B\\[(?:0)?m","g"),PC=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),SC=/https?:\/\/[^\s<>"']+/g,_d="\x1B[0m",Ld="\x1B]8;;\x1B\\",C={panelBg:{bg:"0a0a0a",fg:"c0caf5"},panelMuted:{bg:"0a0a0a",fg:"565f89"},panelSelected:{bg:"1a1b26",fg:"c0caf5"},panelFocused:{bg:"1a1b26",fg:"7aa2f7"},divider:{bg:"0a0a0a",fg:"292e42"},rail:{bg:"0a0a0a",fg:"c0caf5"},overlay:{bg:"06060f",fg:"565f89"},overlayTitle:{bg:"06060f",fg:"565f89"},overlayLogo:{bg:"06060f",fg:"9ece6a"},overlaySubtitle:{bg:"06060f",fg:"41a6b5"},overlayMenuSelected:{bg:"06060f",fg:"7aa2f7"},accent:{fg:"7aa2f7"},success:{fg:"9ece6a"},pending:{fg:"e0af68"},error:{fg:"f7768e"},mutedfg:{fg:"565f89"},disabled:{fg:"3b4261"}},Dd=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function dg(e,t={}){return ug(e,"boot",t)}function ug(e,t,n){let r=n.panelPolish?n.splashSummary:void 0,s=r&&(r.workspaceCount>0||r.taskCount>0);return jd(e,{panelPolish:n.panelPolish??!1,subtitle:n.panelPolish?"A workspace for your coding agents.":t==="boot"?"crAIg is that you?":"Control mode is paused.",details:r?IC(r,n.color??!0):[],menuItems:n.panelPolish&&(s||t==="pause")?["Resume workspace","Options","Exit"]:t==="boot"?kC:TC,menuIndex:n.menuIndex??0,optionsMessage:n.optionsMessage??null,color:n.color??!0,versionText:n.versionText??null,updateText:n.updateText??null})}function IC(e,t){let n=(i,o,a=`${o}s`)=>`${i} ${i===1?o:a}`;if(e.workspaceCount===0&&e.taskCount===0)return["Your workspace starts here.","Add a repo, then start your first task."];let r=`${n(e.workspaceCount,"workspace")} \xB7 ${n(e.taskCount,"open task")}`;if(!e.activityKnown)return[`${r} \xB7 Checking agent activity\u2026`];let s=[...e.workingAgents?[`${n(e.workingAgents,"agent")} working`]:[],...e.readyAgents?[`${e.readyAgents} ready`]:[],...e.attentionAgents?[Ms(`${e.attentionAgents} ${e.attentionAgents===1?"needs":"need"} attention`,t,C.pending.fg,C.overlay)]:[]];return[`${r} \xB7 ${s.join(" \xB7 ")||"No agents running"}`]}function pg(e,t={}){return ug(e,"pause",t)}function fg(e,t,n={}){let r=`npm install -g craig-cli@${t.latest}`,i=t.phase==="installing"?{subtitle:`Updating Craig \xB7 ${t.current} \u2192 ${t.latest}`,menuItems:["Updating\u2026"],message:r}:t.phase==="success"?{subtitle:`Craig ${t.latest} installed \xB7 restart to use it`,menuItems:["Continue","Exit Craig"],message:"The current Craig session is still running the previous version."}:t.phase==="error"?{subtitle:"Craig update failed",menuItems:["Retry","Continue"],message:t.error??"npm could not install the update."}:{subtitle:`Update available \xB7 ${t.current} \u2192 ${t.latest}`,menuItems:["Update now","Continue","Ignore this version"],message:`Release notes: https://github.com/hallsamuel90/craig/releases/latest
254
+ Runs: ${r}`};return jd(e,{subtitle:i.subtitle,menuItems:i.menuItems,menuIndex:n.menuIndex??0,optionsMessage:i.message,color:n.color??!0})}var Ko=[" GLOBAL CENTER PANEL INSPECTOR"," ? help \u2190\u2192 / hl switch tab \u2191\u2193 / jk navigate"," Esc pause / back + new tab \u2190\u2192 / hl switch mode"," Tab cycle panels a codex tab R sync PR"," q quit t terminal tab R sync PR"," x close tab X close task"," TASKS Enter attach PTY X close task"," \u2191\u2193 / jk navigate"," n new task TERMINAL MODE"," Enter attach Ctrl+] return to control mode"," Wheel / PgUp / PgDn scroll",""," Press Esc to return."],vC=["Help"],CC=5;function Yo(e,t={}){return jd(e,{panelPolish:t.panelPolish??!1,subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??vC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function mg(e,t={}){let n=t.color??!0,r=C.overlay,s=new Array(e.height).fill(B(" ".repeat(e.width),n,r)),i=Ad(),o=Math.max(1,Math.floor((e.height-i.length-2-Ko.length)/2));for(let u=0;u<i.length&&!(o+u>=e.height);u+=1)s[o+u]=B($g(i[u]??"",e.width),n,C.overlayLogo);let a=Math.max(...Ko.map(u=>u.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let u=0;u<Ko.length;u+=1){let d=c+u;if(d>=e.height)break;let p=Ko[u]??"";s[d]=B(ht(" ".repeat(l)+p,e.width),n,r)}return s.join(`
255
+ `)}function hg(e,t={}){let n=t.color??!0,r=C.overlay,s=new Array(e.height).fill(B(" ".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"},mt(),...a.length>0?a.map(h=>({text:h,tone:AC(h)})):[{text:"No Craig activity has been logged.",tone:"muted"}],mt(),{text:"Esc returns to Options.",tone:"muted"}],d=vr(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]??mt(),y=`${" ".repeat(c)}${Jo(m.text,l)}`,T=m.tone==="selected"?C.overlayMenuSelected:m.tone==="info"?{...C.overlay,fg:C.accent.fg}:m.tone==="warning"?{...C.overlay,fg:C.pending.fg}:m.tone==="error"?{...C.overlay,fg:C.error.fg}:m.tone==="muted"?C.overlay:C.panelBg;s[f]=B(ht(y,e.width),n,T)}return s.join(`
256
+ `)}function AC(e){return e.includes(" ERROR ")?"error":e.includes(" WARN ")?"warning":e.includes(" INFO ")?"info":"muted"}function gg(e,t,n={}){if(n.panelPolish)return EC(e,t,n);let r=n.color??!0,s=ee.leftWidth,i=ee.rightWidth,o=n.centerOnly??!1,a=e.height-ee.topRailHeight-1,l=n.focusFlashActive??!1,c={bg:C.divider.bg,fg:"9ece6a"},u=l&&(t.focusedRegion==="tasks"||t.focusedRegion==="center")?c:C.divider,d=l&&(t.focusedRegion==="center"||t.focusedRegion==="inspector")?c:C.divider,p=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,h=zo(p,e.width,n,r,C.rail),f=Pg(t,s-lg-cg,a,r),m=Md(e,t,{color:r,centerOnly:o}),y=vg(t,i,a,r),T=t.inputMode==="terminal",R=[],b=[];for(let w=0;w<a;w+=1)if(!o){let K=Ir(f[w]??mt(),s,r,"left"),Ot=B("\u2502",r,u),Vs=B("\u2502",r,d),ka=Ir(y[w]??mt(),i,r,"right");R.push(`${K}${Ot}`),b.push(`${Vs}${ka}`)}let $=T||t.modalInput?C.panelBg:C.panelMuted,N=Rg(t.footerText,t.footerToast,e.width,r,$),D={row:1,column:1,width:e.width,rows:[h]},_=o?null:{row:ee.topRailHeight+1,column:1,width:s+ee.dividerWidth,rows:R},A=o?null:{row:ee.topRailHeight+1,column:m.column+m.width,width:ee.dividerWidth+i,rows:b},z={row:e.height,column:1,width:e.width,rows:[N]},Fe=o?m.rows:m.rows.map((w,K)=>`${R[K]??""}${w}${b[K]??""}`);return{frame:[h,...Fe,N].join(`
257
+ `),center:m,regions:{rail:D,left:_,center:m,right:A,footer:z}}}function Md(e,t,n={}){if(n.panelPolish)return wg(e,t,n);let r=n.color??!0,s=bg(e,n.centerOnly??!1),i=OC(t,s.width,s.rowCount,r);return{row:s.row,column:s.column,width:s.width,rows:i.map(o=>Ir(o,s.width,r,"center"))}}function yg(e,t,n,r={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!Lo(s)||t.centerHeader.tabLabel==="BROWSER"||t.terminal.error||t.terminal.rows.length===0||n.some(c=>c<0||c>=t.terminal.rows.length))return null;if(r.panelPolish){let c=Ns(e,r.centerOnly).center;return{row:c.row,column:c.column,width:c.width,rowCount:c.height,rows:[...new Set(n)].filter(u=>u+2<c.height-1).map(u=>({index:u+2,row:Tg(xd(t.terminal.rows[u]),c.width,t.focusedRegion==="center",r.color??!0,"center",t.inputMode==="terminal")}))}}let i=r.color??!0,o=bg(e,r.centerOnly??!1),a=Sg(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:Ir(xd(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function EC(e,t,n){let r=n.color??!0,s=Ns(e,n.centerOnly),i=wg(e,t,n),o=B(" ",r,C.panelBg),a=` CRAIG ${xs("/",r,C.panelBg)} ${xs(t.topRail.workspacePath,r,C.panelBg)}`,l={row:1,column:1,width:e.width,rows:[zo(a,e.width,n,r,C.rail)]},c=null,u=null;if(s.left&&s.right){let y=t.leftTree.filter(_=>!_.panelHeader).map(_=>({..._,indent:Math.floor((_.indent??0)/2)})),T=Pg({...t,leftTree:y},s.left.width-4,s.left.height-2,r),R=t.focusedRegion==="tasks"?Un("WORKSPACES",r,C.panelBg):Ar("WORKSPACES",r,C.panelBg),b=Fd(T,R,s.left,t.focusedRegion==="tasks",r,"left");c={row:s.left.row,column:1,width:s.left.width+2,rows:b.map(_=>`${o}${_}${o}`)};let $=vg(t,s.right.width-2,s.right.height-1,r),N=Eg($[0]??{text:"Inspector"},r,C.panelBg).trim(),D=Fd($.slice(1),N,s.right,t.focusedRegion==="inspector"||t.focusedRegion==="actions",r,"right");u={row:s.right.row,column:i.column+i.width,width:s.right.width+2,rows:D.map(_=>`${o}${_}${o}`)}}let d=t.modalInput?C.panelBg:C.panelMuted,p=Rg(t.footerText,t.footerToast,e.width,r,d),h=t.modalInput?p:p.replace(/( {2,})(Tab|Enter|Esc|Ctrl\+\]|[ntxar?q+z]|↑↓\/PgUp\/PgDn)(?= )/g,(y,T,R)=>`${T}${B(R,r,C.panelSelected)}${r?Cr(d):""}`),f={row:e.height,column:1,width:e.width,rows:[h]},m=i.rows.map((y,T)=>c&&u?`${c.rows[T]}${y}${u.rows[T]}`:`${o}${y}${o}`);return{frame:[l.rows[0],...m,f.rows[0]].join(`
258
+ `),center:i,regions:{rail:l,left:c,center:i,right:u,footer:f}}}function wg(e,t,n){let r=n.color??!0,s=Ns(e,n.centerOnly).center,i=t.tabs.find(u=>u.active)?.id??"agent",o=t.centerHeader.tabLabel==="BROWSER"||!Lo(i)?t.centerTranscript.map(u=>({...u})):Ig(t),a=[t.centerHeader.repo,t.centerHeader.taskId].filter(Boolean).join(" \xB7 "),l=Cg(t.tabs,r,t.focusedRegion==="center"),c=Fd([{text:a,tone:"muted"},...o],l,s,t.focusedRegion==="center",r,"center",t.inputMode==="terminal");return{row:s.row,column:s.column,width:s.width,rows:c}}function kg(e,t){return{bg:C.panelBg.bg,fg:t?C.success.fg:e?C.accent.fg:"3b4261"}}function Fd(e,t,n,r,s,i,o=!1){let a=kg(r,o),l=qd(t,n.width-6),c=`${B("\u256D\u2500 ",s,a)}${B(l,s,r?a:C.panelMuted)}${B(` ${"\u2500".repeat(Math.max(0,n.width-Ee(l)-5))}\u256E`,s,a)}`,u=vr(e,n.height-2).map(d=>Tg(d,n.width,r,s,i,o));return[c,...u,B(`\u2570${"\u2500".repeat(n.width-2)}\u256F`,s,a)]}function Tg(e,t,n,r,s,i=!1){let o=B("\u2502",r,kg(n,i)),a=s==="right"?`${Ir(e,t-3,r,s)}${B(" ",r,C.panelBg)}`:Ir(e,t-2,r,s,s==="left");return`${o}${a}${o}`}function bg(e,t){return{row:ee.topRailHeight+1,column:t?1:ee.leftWidth+ee.dividerWidth+1,width:t?e.width:e.width-ee.leftWidth-ee.rightWidth-ee.dividerWidth*2,rowCount:e.height-ee.topRailHeight-1}}function Rg(e,t,n,r,s){let i=` ${e}`;if(!t)return B(ht(i,n),r,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=Ee(o),l=Ee(i),c=Math.max(1,n-l-a-2),u=l+c+a+2>n?Jo(i,Math.max(0,n-a-3)):i,d=Math.max(1,n-Ee(u)-a-2),p=t.tone==="error"?GC(o,r,s):Un(o,r,s),h=`${u}${" ".repeat(d)}${p} `;return B(ht(h,n),r,s)}function jd(e,t){if(!t.panelPolish)return ig(e,t);let n=e.width-4,r=ig({width:n,height:e.height-4},{...t,versionText:null,updateText:null}).split(`
259
+ `),s={bg:C.overlay.bg,fg:C.accent.fg},i=B(" ",t.color,C.overlay),o=B("\u2502",t.color,s);return[zo("",e.width,t,t.color,C.overlay),`${i}${B(`\u256D${"\u2500".repeat(n)}\u256E`,t.color,s)}${i}`,...r.map(a=>`${i}${o}${a}${o}${i}`),`${i}${B(`\u2570${"\u2500".repeat(n)}\u256F`,t.color,s)}${i}`,B(" ".repeat(e.width),t.color,C.overlay)].join(`
260
+ `)}function ig(e,t){let n=new Array(e.height).fill(B(" ".repeat(e.width),t.color,C.overlay)),r=Ad(),s=t.menuItems.map((u,d)=>`${d===t.menuIndex?">":" "} ${u}`),i=t.optionsMessage?["",...t.optionsMessage.split(`
261
+ `)]:[],o=[...s,...i];for(;o.length<CC;)o.push("");let a=t.details?.length?["",...t.details]:[],l=[...r,"",t.subtitle,...a,"",...o],c=Math.max(1,Math.floor((e.height-l.length)/2));for(let u=0;u<l.length;u+=1){let d=$g(l[u]??"",e.width);if(u<r.length){n[c+u]=B(d,t.color,C.overlayLogo);continue}if(u===r.length+1){n[c+u]=B(d,t.color,C.overlaySubtitle);continue}let p=u-(r.length+3+a.length),f=p>=0&&p<t.menuItems.length&&p===t.menuIndex?t.panelPolish?{...C.overlayMenuSelected,fg:C.success.fg}:C.overlayMenuSelected:C.overlay;n[c+u]=B(d,t.color,f)}return n[0]=zo("",e.width,t,t.color,C.overlay),n.join(`
262
+ `)}function zo(e,t,n,r,s){let i=[n.versionText,n.updateText].filter(Boolean).join(" ");if(!i)return B(ht(e,t),r,s);let o=qd(i,Math.max(0,t-2)),a=Math.max(0,t-Ee(o)-2),l=n.updateText?Ar(o,r,s):xs(o,r,s);return B(`${ht(e,a)} ${l} `,r,s)}function Pg(e,t,n,r){let s=DC(e.runners),i=1,o=e.leftTree.map(l=>NC(l,t,r));return[...vr(o,n-i),s]}function OC(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!Lo(s)?e.centerTranscript.map(o=>({...o})):Ig(e);return vr([...Sg(e,t,r),...i],n)}function Sg(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:VC(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?Un(a,n,C.panelBg):Ar(a,n,C.panelMuted)}`,c=[`${Ar(e.centerHeader.tabLabel,n,C.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),u=Cg(e.tabs,n,e.focusedRegion==="center"),d=" engaged ",p=d.length+2,h=e.inputMode==="terminal"?Un(`${d}\u25CF `,n,C.panelBg):"",f=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Ee(u)-p)):"";return[{text:e.inputMode==="terminal"?`${u}${f}${h}`:u},{text:l,tone:"muted"},{text:c},mt()]}function Ig(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},mt(),{text:e.terminal.error},mt(),{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(xd)}function xd(e){return{text:Ud(e.segments),segments:e.segments,fullBleed:!0}}function vg(e,t,n,r){let s=e.rightInspection?$C(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):vr([{text:"CONTEXT"},mt(),...e.rightContext.map(i=>_C(i,r)),...e.actionMessage?[mt(),{text:e.actionMessage}]:[]],n);return vr(s,n)}function $C(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:KC(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>og(a)),...r.slice(o,o+s).map(a=>og(a))]}function og(e){let t=e.focused?"\u25B8 ":e.selected?"\u2022 ":" ",n=e.focused||e.selected?"selected":e.muted?"muted":"default",r=`${t}${e.text}`;if(e.segments)return{text:r,segments:[{text:t},...e.segments],tone:n};if(e.accentPrefix&&!e.muted){let s=e.text.indexOf(" "),i=s===-1?e.text:e.text.slice(0,s),o=s===-1?"":e.text.slice(s);return{text:r,segments:[{text:t},{text:i,style:{fg:"7aa2f7"}},{text:o}],tone:n}}return e.color?{text:r,segments:[{text:t},{text:e.text,style:{fg:e.color}}],tone:n}:{text:r,tone:n}}function NC(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${Un("\u25CF",n,e.selected?C.panelSelected:C.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((f,m)=>f+Ee(m.text),0):0,l=t-Ee(i)-Ee(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",u=e.selected?e.text:e.focused?Un(e.text,n,C.panelBg):e.panelHeader?Ar(e.text,n,C.panelMuted):e.text,d=ht(`${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=m.trimEnd(),T=m.slice(y.length),R=[{text:f},Ag(e.activity,e.activityAnimationFrame??0),{text:" "},{text:y,style:{bold:e.unread===!0}},{text:`${T}${i}${o}`},...e.prBadge??[]];return{text:Ud(R),segments:R,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 DC(e){let t=e.map(r=>{let s=r.health>=1,i=parseInt(r.count,10),o=i>1?` (${i})`:"";return{text:`${s?"\u25CF":"\u25CB"} ${r.name}${o}`,active:s}}),n=[];for(let r=0;r<t.length;r++){let s=t[r];r>0&&n.push({text:" "}),s.active?n.push({text:s.text,style:{fg:C.success.fg}}):n.push({text:s.text,style:{fg:C.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function Cg(e,t,n){return e.map(r=>{let s=r.active?n?Un(r.label,t,C.panelBg):Ar(r.label,t,C.panelBg):xs(r.label,t,C.panelBg);r.unread&&(s=Ho({text:s,style:{bold:!0}},t,C.panelBg));let i=r.activity?Ho(Ag(r.activity,r.activityAnimationFrame??0),t,C.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function Ag(e,t){return{text:"\u25CF",style:{fg:e==="working"?Dd[t%Dd.length]??Dd[0]:e==="ready"?C.success.fg:e==="error"?C.error.fg:C.panelMuted.fg}}}function _C(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?xs(e.value,t,C.panelBg):e.value}`}}function Ir(e,t,n,r,s=!1){let i=FC(r,e.tone??"default"),o=Eg(e,n,i);if(r==="left"){let l=s?1:lg,c=s?1:cg;if(e.fullBleed)return B(ht(o,t),n,i);let u=t-l-c;if(e.rightAlign){let p=Ee(o),h=Math.max(0,u-p),f=`${" ".repeat(l)}${" ".repeat(h)}${o}${" ".repeat(c)}`;return B(f,n,i)}let d=`${" ".repeat(l)}${ht(o,u)}${" ".repeat(c)}`;return B(d,n,i)}return r==="center"&&e.fullBleed?xC(e,t,n,i):B(ht(` ${o}`,t),n,i)}function FC(e,t){return t==="selected"||t==="focused"?C.panelSelected:t==="muted"?C.panelMuted:C.panelBg}function vr(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(mt());return n}function mt(){return{text:""}}function Eg(e,t,n){return e.segments?e.segments.map(r=>Ho(r,t,n)).join(""):e.text}function xC(e,t,n,r){let s=" ".repeat(Go),i=Math.max(0,t-Go*2);if(!e.segments)return B(`${s}${ht(e.text,i)}${s}`,n,r);let o=jC(e.segments,i),a=`${s}${o.map(l=>Ho(l,n,r)).join("")}${s}${n?Ld:""}`;return B(a,n,r)}function Ho(e,t,n){let r=e.href?`${Og(e.href)}${e.text}${Ld}`:LC(e.text);return!t||!e.style?r:`${Cr(BC(e.style,n))}${WC(e.style)}${r}${_d}${Cr(n)}`}function LC(e){return e.replace(SC,t=>{let[n,r]=MC(t);return`${Og(n)}${n}${Ld}${r}`})}function MC(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function Og(e){return`\x1B]8;;${e}\x1B\\`}function jC(e,t){let n=qC(e,t);return UC(n,t)}function qC(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=Ee(s.text);if(i<=r){n.push(s),r-=i;continue}let o=Jo(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function UC(e,t){let n=Ee(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 BC(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 WC(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 VC(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 $g(e,t){let n=Math.max(0,t-Ee(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function ht(e,t){let n=Ee(e);return n>=t?qd(e,t):e+" ".repeat(t-n)}function qd(e,t){if(t<=0)return"";if(Ee(e)<=t)return e;let n=Ng(e);return Jo(n,Math.max(0,t-1))+"\u2026"}function Ee(e){let t=0;for(let n of Array.from(Ng(e)))t+=Ls(n);return t}function Jo(e,t){let n="",r=0;for(let s of Array.from(e)){let i=Ls(s);if(r+i>t)break;n+=s,r+=i}return n}function Ls(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 KC(e,t,n){return Math.min(Math.max(e,t),n)}function Ng(e){return e.replace(PC,"").replace(bC,"")}function Ud(e){return e.map(t=>t.text).join("")}function B(e,t,n){if(!t)return e;let r=Cr(n),s=e.replace(RC,`${_d}${r}`);return`${r}${s}${_d}`}function Cr(e){let t=[];return e.fg&&t.push(`38;2;${ag(e.fg).join(";")}`),e.bg&&t.push(`48;2;${ag(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function ag(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function Un(e,t,n){return Ms(e,t,C.success.fg,n)}function GC(e,t,n){return Ms(e,t,C.error.fg,n)}function Ar(e,t,n){return Ms(e,t,C.accent.fg,n)}function xs(e,t,n){return Ms(e,t,C.mutedfg.fg,n)}function Ms(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${Cr(s)}${e}${Cr(r)}`}async function js(e,t){let n=k.previews.isEnabled(e.config,"agentOrchestration")?await is(e.paths):[];if(t?.aborted)return;let r=!1;if(JSON.stringify(n)!==JSON.stringify(e.model.furyPendingPlans??[])){let s=e.model.furyPendingPlans?.length??0;e.model={...e.model,furyPendingPlans:n,furyApprovalCount:Math.max(0,(e.model.furyApprovalCount??0)-s)+n.length},r=!0}if(e.state.mode==="overlay"&&e.state.variant==="fury-plans"&&e.state.furyPlans){let s=e.state.furyPlans;if(!s.plan&&!s.busy&&JSON.stringify(s.plans)!==JSON.stringify(n)){let i=s.plans[s.selectedIndex]?.id;e.state={...e.state,furyPlans:{...s,plans:n,selectedIndex:Math.max(0,n.findIndex(o=>o.id===i))}},r=!0}}r&&e.render()}function Dg(e){k.previews.isEnabled(e.config,"agentOrchestration")&&(e.state={mode:"overlay",variant:"fury-plans",menuIndex:0,optionsMessage:null,shell:e.state.shell,furyPlans:{plans:e.model.furyPendingPlans??[],selectedIndex:0,plan:null,scrollOffset:0,confirming:!1,busy:!1,message:null}},e.pendingClear=!0,e.render(),js(e).then(()=>{e.state.mode!=="overlay"||e.state.variant!=="fury-plans"||!e.state.furyPlans||e.state.furyPlans.plan||(e.state={...e.state,furyPlans:{...e.state.furyPlans,plans:e.model.furyPendingPlans??[]}},e.render())}).catch(t=>{e.state.mode!=="overlay"||e.state.variant!=="fury-plans"||!e.state.furyPlans||(e.state={...e.state,furyPlans:{...e.state.furyPlans,message:Fg(t)}},e.render())}))}function _g(e,t){if(e.state.mode!=="overlay"||!e.state.furyPlans)return;let n=e.state.furyPlans;if(n.busy)return;let r=s=>{e.state.mode==="overlay"&&(e.state={...e.state,furyPlans:s},e.render())};if(t==="ESCAPE"){n.confirming?r({...n,confirming:!1}):n.plan?r({...n,plan:null,scrollOffset:0,message:null,plans:e.model.furyPendingPlans??[],selectedIndex:0}):(e.state={mode:"main",shell:jn(e.state.shell,e.model)},e.pendingClear=!0,e.render());return}if(!n.plan){t==="UP"||t==="k"?r({...n,selectedIndex:Math.max(0,n.selectedIndex-1)}):t==="DOWN"||t==="j"?r({...n,selectedIndex:Math.min(Math.max(0,n.plans.length-1),n.selectedIndex+1)}):Se(t)&&n.plans[n.selectedIndex]&&r({...n,plan:n.plans[n.selectedIndex],scrollOffset:0,message:null});return}if(n.confirming){if(!Se(t))return;let s=n.plan;r({...n,busy:!0,message:"Approving plan..."}),(async()=>{if(!(await is(e.paths)).some(o=>o.id===s.id&&o.planHash===s.planHash))throw await js(e),new g("FURY_STATE_CONFLICT","This plan was replaced or already approved. Return to the list and review the current plan.",{});await bd(e.paths,s.id,{type:"human",source:"tui",processId:process.pid},s.planHash),await js(e),r({...n,plans:e.model.furyPendingPlans??[],selectedIndex:0,plan:null,confirming:!1,busy:!1,scrollOffset:0,message:"Plan approved. No workers started; the planning agent can now start it."})})().catch(i=>r({...n,confirming:!1,busy:!1,message:Fg(i)}));return}if(t==="a"||t==="A")r({...n,confirming:!0,message:null});else if(["UP","k","DOWN","j","PAGE_UP","PAGE_DOWN","HOME","END"].includes(t)){let s=Math.max(1,(e.activeTerminal.height??36)-7),i=Math.max(0,Lg(n.plan,(e.activeTerminal.width??120)-4).length-s),o=t==="PAGE_UP"?-s:t==="PAGE_DOWN"?s:t==="UP"||t==="k"?-1:1;r({...n,scrollOffset:t==="HOME"?0:t==="END"?i:Math.max(0,Math.min(i,n.scrollOffset+o))})}}function Fg(e){return e instanceof Error?e.message:"Could not approve the Fury plan. Try again."}function xg(e,t){return Array.from(HC(e)).map(r=>{let s=r.codePointAt(0);return s<32&&s!==10||s>=127&&s<=159?" ":r}).join("").split(`
263
+ `).flatMap(r=>{let s=Array.from(r);if(!s.length)return[""];let i=[],o="",a=0;for(let l of s){let c=Ls(l);a+c>t&&o&&(i.push(o),o="",a=0),o+=l,a+=c}return o&&i.push(o),i})}function Lg(e,t){return[e.name,`Root task: ${e.rootTaskId}`,`Definition: ${e.sourceFile}`,`Limits: ${e.limits.maxTasks} tasks | ${e.limits.maxConcurrency} concurrent | ${e.limits.timeoutMs/1e3}s timeout`,`Inputs: ${JSON.stringify(e.inputs)}`,`Plan: ${e.id}`,`Hash: ${e.planHash}`,"",...e.steps.flatMap(n=>[`${n.id} | ${n.kind==="human_review"?"HUMAN REVIEW":n.runner} | needs: ${n.needs.join(", ")||"none"}`,`Target: ${JSON.stringify(n.target)}`,...n.prompt?[`Prompt: ${n.prompt}`]:[],...n.outputSchema?[`Output: ${JSON.stringify(n.outputSchema)}`]:[],...n.review?[`Review: ${n.review.title}`,n.review.summary,`Feedback target: ${n.review.feedbackTask??"none"} | timeout: ${n.review.timeoutMs/1e3}s`]:[],""])].flatMap(n=>xg(n,Math.max(1,t)))}function Mg(e,t){let n=Math.max(1,e.width-4),r=Math.max(1,e.height-7),s;if(t.confirming&&t.plan)s=[`Approve ${t.plan.name}?`,"",`Plan: ${t.plan.id}`,`Hash: ${t.plan.planHash}`,"","This approves the exact plan you reviewed. It does not start workers."];else if(t.plan)s=Lg(t.plan,n).slice(t.scrollOffset,t.scrollOffset+r);else{let o=Math.max(0,t.selectedIndex-r+1);s=t.plans.length?t.plans.slice(o,o+r).map((a,l)=>`${t.selectedIndex===o+l?">":" "} ${a.name} | ${a.rootTaskId} | ${a.steps.length} steps`):["No Fury plans waiting for approval."]}let i=new Array(e.height).fill("");return i[0]="FURY PLANS \u2014 human approval",i[1]=t.plan&&!t.confirming?`Plan details | line ${t.scrollOffset+1} | a approve | Esc back`:"",s.slice(0,r).forEach((o,a)=>{i[a+3]=o}),i[e.height-3]=t.message??"",i[e.height-1]=t.busy?"Saving approval...":t.confirming?"Enter approve this plan Esc back":t.plan?"\u2191\u2193 / PgUp / PgDn scroll Home / End a approve plan Esc back":"\u2191\u2193 select Enter review plan Esc return",i.map(o=>{let a=` ${xg(o,n)[0]??""}`,l=Array.from(a).reduce((c,u)=>c+Ls(u),0);return a+" ".repeat(Math.max(0,e.width-l))}).join(`
264
+ `)}import{readFile as YC,stat as zC}from"node:fs/promises";import Bd from"node:path";var JC=200*1024,XC=500*1024,Xo="100000";async function qg(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return QC(e,t,n);try{let r=mn(n.selectedFilePath??null,t.filePaths),s=mn(n.selectedDiffPath??null,t.diffPaths),i=s?await qs(e.worktreePath):null,[o,a]=await Promise.all([Zo(e.worktreePath,r),s?Wd(e.worktreePath,s,t.diffRows,i):Promise.resolve(Oe("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 QC(e,t,n){let r=mn(n.selectedFilePath??null,t.filePaths),s=mn(n.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([Bg(e,r),(async()=>{if(!s)return Oe("No diff selected","No local changes found.","empty");let l=Qo(e,s),c=l?await qs(l.target.worktreePath).catch(()=>null):null;return Wg(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 ZC(e,t);try{await we(e);let n=await qs(e.worktreePath),[r,s]=await Promise.all([Vg(e.worktreePath),Kg(e.worktreePath,n)]),i=[...new Set(s.map(d=>d.path))],o=mn(t.selectedFilePath??null,r),a=mn(t.selectedDiffPath??null,i),[l,c]=await Promise.all([Zo(e.worktreePath,o),a?Wd(e.worktreePath,a,s,n):Promise.resolve(Oe("No diff selected","No local changes found.","empty"))]),u=a?{[a]:c}:{};return{taskId:e.id,fileRows:Jg(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:Oe("Files unavailable",r,"error"),selectedDiff:Oe("Diff unavailable",r,"error"),error:r}}}async function ZC(e,t){let n=(e.repoTargets??[]).filter(p=>p.status==="ready"),r=await Promise.all(n.map(async p=>{let h=await qs(p.worktreePath).catch(()=>null),[f,m]=await Promise.all([Vg(p.worktreePath).catch(()=>[]),Kg(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=mn(t.selectedFilePath??null,s),l=mn(t.selectedDiffPath??null,o),[c,u]=await Promise.all([Bg(e,a),(async()=>{if(!l)return Oe("No diff selected","No local changes found.","empty");let p=Qo(e,l),h=p?r.find(f=>f.target.repoId===p.target.repoId):null;return Wg(e,l,i,h?.baseRef??null)})()]),d=l?{[l]:u}:{};return{taskId:e.id,fileRows:Jg(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:d,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:u,error:null}}async function Bg(e,t){let n=Qo(e,t);if(!n)return Oe("No file selected","No Git-visible files found.","empty");let r=await Zo(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function Wg(e,t,n,r=null){let s=Qo(e,t);return s?{...await Wd(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}:Oe(t,"Repo target is unavailable.","error",t)}function Qo(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 Vg(e){let t=await G("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return Xg(t.stdout)}async function Kg(e,t){let[n,r,s,i]=await Promise.all([eA(e,t),jg(e,"staged"),jg(e,"unstaged"),tA(e)]);return[...n,...r,...s,...i]}async function eA(e,t){if(!t)return[];let[n,r]=await Promise.all([G("git",["diff","--name-status",`${t}...HEAD`],{cwd:e}),G("git",["diff","--numstat",`${t}...HEAD`],{cwd:e})]),s=Gg(n.stdout),i=Hg(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 jg(e,t){let n=t==="staged"?["diff","--cached"]:["diff"],[r,s]=await Promise.all([G("git",[...n,"--name-status"],{cwd:e}),G("git",[...n,"--numstat"],{cwd:e})]),i=Gg(r.stdout),o=Hg(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 tA(e){let t=await G("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=Xg(t.stdout);return await Promise.all(n.map(async s=>{let i=await Zo(e,s),o=i.status==="ready"?nA(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function Gg(e){return e.split(`
265
+ `).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 Hg(e){let t=new Map;for(let n of e.split(`
266
+ `)){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 qs(e){return(await Q("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await Q("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function Zo(e,t){if(!t)return Oe("No file selected","No Git-visible files found.","empty");let n=rA(e,t);return zg(n,t)}async function Yg(e){return zg(e,e)}async function zg(e,t){try{let n=await zC(e);if(n.size>JC)return Oe(t,`File is ${n.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,n.size);let r=await YC(e);return sA(r)?Oe(t,"Binary file preview is not available in Craig.","binary",t,r.byteLength):{path:t,status:"ready",title:t,lines:r.toString("utf8").split(`
267
+ `),byteLength:r.byteLength}}catch(n){let r=n instanceof Error?n.message:"Unable to read file.";return Oe(t,r,"missing",t,null)}}async function Wd(e,t,n,r=null){if(!t)return Oe("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 qs(e);if(a){let l=await G("git",["diff","--stat","--patch",`--unified=${Xo}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
268
+ ${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await G("git",["diff","--cached","--stat","--patch",`--unified=${Xo}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
269
+ ${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await G("git",["diff","--stat","--patch",`--unified=${Xo}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
270
+ ${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await Q("git",["diff","--no-index","--stat","--patch",`--unified=${Xo}`,"--","/dev/null",t],{cwd:e});a.stdout.trim().length>0&&s.push(`untracked
259
271
  ${a.stdout.trimEnd()}`)}let o=s.join(`
260
272
 
261
- `);return o.length>Qv?Ae(t,"Diff is above the 500 KB inline preview limit.","too_large",t,o.length):o.includes("\0")?Ae(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(`
262
- `):["No diff for this file."],byteLength:o.length}}function eg(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 mn(e,t){return e&&t.includes(e)?e:t[0]??null}function rC(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function tg(e){return[...new Set(e.split(`
263
- `).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function sC(e,t){let n=Sd.resolve(e,t),r=Sd.resolve(e);if(n!==r&&!n.startsWith(`${r}${Sd.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function iC(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function Ae(e,t,n,r=null,s=null){return{path:r,status:n,title:e,lines:[t],byteLength:s}}var oC=["tasks","center","inspector","actions"],ng=["agent","terminal"],rg=[],V="inspection",oK=[...ng,...rg],vd=["commit","push","refresh-checks","close-task"],sg=["refresh-checks","close-task"],ig=["task","checks","pr","setup-run","actions","next-action"],Cd=["files","review"];function og(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=pC(e?.openInspectionKind)??n,s=k.runners.getEnabled(t);return{inputMode:mC(e?.inputMode),focusedRegion:dC(e?.focusedRegion),selectedRepoId:Vt(e?.selectedRepoId),selectedWorkspaceId:Vt(e?.selectedWorkspaceId),selectedTaskId:Vt(e?.selectedTaskId),selectedPtyTabId:Vt(e?.selectedPtyTabId),selectedLeftItemId:bC(Vt(e?.selectedTaskId)),activeTab:n?V:Vt(e?.activeTab)??"agent",preferredPtyTabKind:fC(e?.preferredPtyTabKind),inspectorSection:Os(e?.inspectorSection,ig,"task"),inspectionMode:uC(e?.inspectionMode,n==="diff"?"review":"files"),openInspectionKind:r,selectedFileTreePath:Vt(e?.selectedFileTreePath),selectedFilePath:Vt(e?.selectedFilePath),selectedDiffPath:Vt(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:Os(e?.selectedActionId,vd,"commit"),selectedProjectTargetId:null,selectedRunner:hC(e?.selectedRunner,s,k.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:aC(),centerZoomed:!1,readAgentActivityAt:e?.readAgentActivityAt??{}}}function aC(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function xo(e,t){return{...e??Gs(),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,readAgentActivityAt:t.readAgentActivityAt}}function Ns(e,t,n={}){let r=kC(e,t),s=Ed(r),i=s?.kind==="task"?t.tasks.find(f=>f.id===s.id)??null:null,o=i?TC(t.tasks,i):null,a=Wo(r),l=Bo(r),c=t.workspaces?.find(f=>f.id===a)??(l?t.workspaces?.find(f=>f.kind==="repo"&&f.primaryRepoId===l):null)??(s?.kind==="workspace"?t.workspaces?.find(f=>f.id===s.id)??null:null)??(o?t.workspaces?.find(f=>f.id===o.workspaceId)??null:null)??t.workspaces?.find(f=>f.id===e.selectedWorkspaceId)??t.workspaces?.[0]??null,u=(t.repos.find(f=>f.id===l)??(s?.kind==="repo"?t.repos.find(f=>f.id===s.id)??null:o?t.repos.find(f=>f.id===o.repoId)??null:null)??(c?.kind==="project"?t.repos.find(f=>f.id===e.selectedRepoId&&c.discoveredRepoIds?.includes(f.id))??null:null)??(c?.kind!=="project"?t.repos.find(f=>f.id===c?.primaryRepoId)??null:null)??t.repos.find(f=>f.id===e.selectedRepoId)??t.repos[0]??null)?.id??null,p=c?Mo(t.tasks,c.id):u?jo(t.tasks,u):[],h=(s?.kind==="task"?p.find(f=>f.id===s.id)??null:null)??p.find(f=>f.id===e.selectedTaskId)??p[0]??null;return{...e,inputMode:n.resetInputMode?"control":e.inputMode,selectedLeftItemId:r,selectedWorkspaceId:c?.id??null,selectedRepoId:u,selectedTaskId:h?.id??null,...gC(h,e.activeTab,e.selectedPtyTabId),selectedFilePath:cC(e,t,h?.id??null),...yC(e,t,h?.id??null),selectedDiffPath:lC(e,t,h?.id??null),inspectorSection:Os(e.inspectorSection,ig,"task")}}function Kt(e,t){return{...e,terminal:t}}function ag(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function lg(e){return e===""||e==="CTRL_]"||e==="CTRL_RIGHT_BRACKET"}function et(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
264
- `}function Ad(e){return e.length===1&&e>=" "&&e!=="\x7F"}function Fo(e){return dg(e)||Pr(e)!==null}function cg(e){return rg.includes(e)}function dg(e){return ng.includes(e)}function ug(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[V]:[]]}function lC(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function cC(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function Os(e,t,n){return t.includes(e??"")?e:n}function dC(e){return e==="tabs"?"center":Os(e,oC,"tasks")}function uC(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":Os(e,Cd,t)}function pC(e){return e==="file"||e==="diff"?e:null}function fC(e){return e==="terminal"?"terminal":"agent"}function mC(e){return e==="terminal"?"terminal":"control"}function hC(e,t=[...wt],n="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:n}function Lo(e,t=wt){let n=t.length>0?t:wt,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function Pr(e){let t=me.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function gC(e,t,n){if(!e)return{activeTab:t===V?t:"agent",selectedPtyTabId:null};let r=e.ptyTabs.find(a=>a.id===n)??null,s=e.selectedPtyTabId?e.ptyTabs.find(a=>a.id===e.selectedPtyTabId)??null:null,i=e.ptyTabs.find(a=>a.id===t)??null;if(i)return{activeTab:i.id,selectedPtyTabId:i.id};if(dg(t)){let l=e.ptyTabs.find(c=>c.kind===t)??null??s??r??e.ptyTabs[0]??null;return{activeTab:l?.id??V,selectedPtyTabId:l?.id??null}}if(t===V)return{activeTab:V,selectedPtyTabId:r?.id??s?.id??e.ptyTabs[0]?.id??null};let o=s??r??e.ptyTabs[0]??null;return{activeTab:o?.id??V,selectedPtyTabId:o?.id??null}}function yC(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?wC(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function wC(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 kC(e,t){let n=jn(t);return e.selectedLeftItemId&&n.includes(e.selectedLeftItemId)?e.selectedLeftItemId:e.selectedWorkspaceId&&n.includes(`workspace:${e.selectedWorkspaceId}`)?`workspace:${e.selectedWorkspaceId}`:e.selectedTaskId&&n.includes(`task:${e.selectedTaskId}`)?`task:${e.selectedTaskId}`:e.selectedRepoId&&n.includes(`repo:${e.selectedRepoId}`)?`repo:${e.selectedRepoId}`:n[0]??null}function jn(e){let t=[];if(e.workspaces?.length)for(let n of e.workspaces){t.push(`workspace:${n.id}`);for(let{task:r}of $s(Mo(e.tasks,n.id)))t.push(`task:${r.id}`);n.kind==="project"&&t.push(`new-task-workspace:${n.id}`),n.kind==="repo"&&t.push(`new-task:${n.primaryRepoId}`)}else for(let n of e.repos){t.push(`repo:${n.id}`);for(let{task:r}of $s(jo(e.tasks,n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function Mo(e,t){return pg(e,n=>n.workspaceId===t)}function jo(e,t){return pg(e,n=>n.repoId===t)}function TC(e,t){return t.rootTaskId===t.id?t:e.find(n=>n.id===t.rootTaskId)??t}function pg(e,t){let n=new Map(e.map(r=>[r.id,r]));return e.filter(r=>t(n.get(r.rootTaskId)??r))}function $s(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 Vt(e){return typeof e=="string"?e:null}function bC(e){return e?`task:${e}`:null}function Ds(e){return typeof e=="string"&&e.startsWith("task:")}function qo(e){return typeof e=="string"&&e.startsWith("new-task:")}function Uo(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function fg(e){return typeof e=="string"&&e.startsWith("workspace:")}function Bo(e){return qo(e)?e.slice(9):null}function Wo(e){return Uo(e)?e.slice(19):null}async function Sr(e,t,n){let r=Oe(e),[s,i]=await Promise.all([be.repos.listRegisteredRepos(r),be.listWorkspaces(r,{archived:!1})]),o=await P.listTasks(r),a={},l=await k.load(r),c=0;if(k.previews.isEnabled(l,"agentOrchestration")){let m=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(T=>T.kind==="agent").map(async T=>({agentTab:T,environment:await st(r,y,void 0,T.id)}))));for(let{agentTab:y,environment:T}of m)T.CRAIG_AGENT_CAPABILITY&&(a[y.id]=T.CRAIG_AGENT_CAPABILITY);o=await P.listTasks(r)}let[d,u]=await Promise.all([k.previews.isEnabled(l,"agentOrchestration")?Of(r):[],rs(r)]);c=(k.previews.isEnabled(l,"agentOrchestration")?d.length:0)+u.filter(m=>m.state==="waiting_for_review"||m.state==="changes_requested").length;let p=Od(o.tasks,t),h=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},f=p?await Kh(p,h):null;return{workspaceRoot:e,workspaces:i.workspaces,repos:s.repos,tasks:o.tasks,inspection:f,furyApprovalCount:c,...Object.keys(a).length>0?{agentCapabilityTokens:a}:{},...n?{enabledRunnerIds:n}:{}}}function Od(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function mg(e,t){return Ns(e,t)}import Ud from"node:path";import yK from"picocolors";var RC=[" \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 $d(){return[...RC]}var Vo={width:120,height:36},ee={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function We(e,t){return{width:Math.max(e??Vo.width,Vo.width),height:Math.max(t??Vo.height,Vo.height)}}function _s(e,t=!1){let s=ee.topRailHeight+1,i=e.height-ee.topRailHeight-1,o={row:s,height:i,column:t?2:35,width:t?e.width-2:e.width-32-34-4};return{left:t?null:{row:s,height:i,column:2,width:32},center:o,right:t?null:{row:s,height:i,column:e.width-34,width:34}}}function hg(e,t=!1){let n=_s(e,t).center;return{row:n.row+2,column:n.column+3,width:n.width-6,height:n.height-3}}var PC=["Start","Options","Exit"],SC=["Resume","Options","Exit"],kg=2,Tg=2,Go=2,IC=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),vC=new RegExp("\x1B\\[(?:0)?m","g"),CC=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),AC=/https?:\/\/[^\s<>"']+/g,Dd="\x1B[0m",Fd="\x1B]8;;\x1B\\",C={panelBg:{bg:"0a0a0a",fg:"c0caf5"},panelMuted:{bg:"0a0a0a",fg:"565f89"},panelSelected:{bg:"1a1b26",fg:"c0caf5"},panelFocused:{bg:"1a1b26",fg:"7aa2f7"},divider:{bg:"0a0a0a",fg:"292e42"},rail:{bg:"0a0a0a",fg:"c0caf5"},overlay:{bg:"06060f",fg:"565f89"},overlayTitle:{bg:"06060f",fg:"565f89"},overlayLogo:{bg:"06060f",fg:"9ece6a"},overlaySubtitle:{bg:"06060f",fg:"41a6b5"},overlayMenuSelected:{bg:"06060f",fg:"7aa2f7"},accent:{fg:"7aa2f7"},success:{fg:"9ece6a"},pending:{fg:"e0af68"},error:{fg:"f7768e"},mutedfg:{fg:"565f89"},disabled:{fg:"3b4261"}},Nd=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function bg(e,t={}){return Rg(e,"boot",t)}function Rg(e,t,n){let r=n.panelPolish?n.splashSummary:void 0,s=r&&(r.workspaceCount>0||r.taskCount>0);return Md(e,{panelPolish:n.panelPolish??!1,subtitle:n.panelPolish?"A workspace for your coding agents.":t==="boot"?"crAIg is that you?":"Control mode is paused.",details:r?EC(r,n.color??!0):[],menuItems:n.panelPolish&&(s||t==="pause")?["Resume workspace","Options","Exit"]:t==="boot"?PC:SC,menuIndex:n.menuIndex??0,optionsMessage:n.optionsMessage??null,color:n.color??!0,versionText:n.versionText??null,updateText:n.updateText??null})}function EC(e,t){let n=(i,o,a=`${o}s`)=>`${i} ${i===1?o:a}`;if(e.workspaceCount===0&&e.taskCount===0)return["Your workspace starts here.","Add a repo, then start your first task."];let r=`${n(e.workspaceCount,"workspace")} \xB7 ${n(e.taskCount,"open task")}`;if(!e.activityKnown)return[`${r} \xB7 Checking agent activity\u2026`];let s=[...e.workingAgents?[`${n(e.workingAgents,"agent")} working`]:[],...e.readyAgents?[`${e.readyAgents} ready`]:[],...e.attentionAgents?[Fs(`${e.attentionAgents} ${e.attentionAgents===1?"needs":"need"} attention`,t,C.pending.fg,C.overlay)]:[]];return[`${r} \xB7 ${s.join(" \xB7 ")||"No agents running"}`]}function Pg(e,t={}){return Rg(e,"pause",t)}function Sg(e,t,n={}){let r=`npm install -g craig-cli@${t.latest}`,i=t.phase==="installing"?{subtitle:`Updating Craig \xB7 ${t.current} \u2192 ${t.latest}`,menuItems:["Updating\u2026"],message:r}:t.phase==="success"?{subtitle:`Craig ${t.latest} installed \xB7 restart to use it`,menuItems:["Continue","Exit Craig"],message:"The current Craig session is still running the previous version."}:t.phase==="error"?{subtitle:"Craig update failed",menuItems:["Retry","Continue"],message:t.error??"npm could not install the update."}:{subtitle:`Update available \xB7 ${t.current} \u2192 ${t.latest}`,menuItems:["Update now","Continue","Ignore this version"],message:`Release notes: https://github.com/hallsamuel90/craig/releases/latest
265
- Runs: ${r}`};return Md(e,{subtitle:i.subtitle,menuItems:i.menuItems,menuIndex:n.menuIndex??0,optionsMessage:i.message,color:n.color??!0})}var Ko=[" GLOBAL CENTER PANEL INSPECTOR"," ? help \u2190\u2192 / hl switch tab \u2191\u2193 / jk navigate"," Esc pause / back + new tab \u2190\u2192 / hl switch mode"," Tab cycle panels a codex tab R sync PR"," q quit t terminal tab R sync PR"," x close tab X close task"," TASKS Enter attach PTY X close task"," \u2191\u2193 / jk navigate"," n new task TERMINAL MODE"," Enter attach Ctrl+] return to control mode"," Wheel / PgUp / PgDn scroll",""," Press Esc to return."],OC=["Help"],$C=5;function Yo(e,t={}){return Md(e,{panelPolish:t.panelPolish??!1,subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??OC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function Ig(e,t={}){let n=t.color??!0,r=C.overlay,s=new Array(e.height).fill(B(" ".repeat(e.width),n,r)),i=$d(),o=Math.max(1,Math.floor((e.height-i.length-2-Ko.length)/2));for(let d=0;d<i.length&&!(o+d>=e.height);d+=1)s[o+d]=B(Bg(i[d]??"",e.width),n,C.overlayLogo);let a=Math.max(...Ko.map(d=>d.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let d=0;d<Ko.length;d+=1){let u=c+d;if(u>=e.height)break;let p=Ko[d]??"";s[u]=B(ht(" ".repeat(l)+p,e.width),n,r)}return s.join(`
266
- `)}function vg(e,t={}){let n=t.color??!0,r=C.overlay,s=new Array(e.height).fill(B(" ".repeat(e.width),n,r)),i="Logs",o=t.logPath??"",a=t.logLines??[],l=Math.max(20,e.width-8),c=Math.max(0,Math.floor((e.width-l)/2)),d=[{text:i,tone:"selected"},{text:o,tone:"muted"},mt(),...a.length>0?a.map(h=>({text:h,tone:NC(h)})):[{text:"No Craig activity has been logged.",tone:"muted"}],mt(),{text:"Esc returns to Options.",tone:"muted"}],u=vr(d,e.height-2),p=Math.max(1,Math.floor((e.height-u.length)/2));for(let h=0;h<u.length;h+=1){let f=p+h;if(f>=e.height)break;let m=u[h]??mt(),y=`${" ".repeat(c)}${Jo(m.text,l)}`,T=m.tone==="selected"?C.overlayMenuSelected:m.tone==="info"?{...C.overlay,fg:C.accent.fg}:m.tone==="warning"?{...C.overlay,fg:C.pending.fg}:m.tone==="error"?{...C.overlay,fg:C.error.fg}:m.tone==="muted"?C.overlay:C.panelBg;s[f]=B(ht(y,e.width),n,T)}return s.join(`
267
- `)}function NC(e){return e.includes(" ERROR ")?"error":e.includes(" WARN ")?"warning":e.includes(" INFO ")?"info":"muted"}function Cg(e,t,n={}){if(n.panelPolish)return DC(e,t,n);let r=n.color??!0,s=ee.leftWidth,i=ee.rightWidth,o=n.centerOnly??!1,a=e.height-ee.topRailHeight-1,l=n.focusFlashActive??!1,c={bg:C.divider.bg,fg:"9ece6a"},d=l&&(t.focusedRegion==="tasks"||t.focusedRegion==="center")?c:C.divider,u=l&&(t.focusedRegion==="center"||t.focusedRegion==="inspector")?c:C.divider,p=`CRAIG | ${t.topRail.workspacePath} | ${t.topRail.agent}`,h=zo(p,e.width,n,r,C.rail),f=_g(t,s-kg-Tg,a,r),m=Ld(e,t,{color:r,centerOnly:o}),y=Lg(t,i,a,r),T=t.inputMode==="terminal",R=[],b=[];for(let w=0;w<a;w+=1)if(!o){let z=Ir(f[w]??mt(),s,r,"left"),Ot=B("\u2502",r,d),qs=B("\u2502",r,u),ga=Ir(y[w]??mt(),i,r,"right");R.push(`${z}${Ot}`),b.push(`${qs}${ga}`)}let $=T||t.modalInput?C.panelBg:C.panelMuted,N=Dg(t.footerText,t.footerToast,e.width,r,$),D={row:1,column:1,width:e.width,rows:[h]},_=o?null:{row:ee.topRailHeight+1,column:1,width:s+ee.dividerWidth,rows:R},A=o?null:{row:ee.topRailHeight+1,column:m.column+m.width,width:ee.dividerWidth+i,rows:b},Y={row:e.height,column:1,width:e.width,rows:[N]},_e=o?m.rows:m.rows.map((w,z)=>`${R[z]??""}${w}${b[z]??""}`);return{frame:[h,..._e,N].join(`
268
- `),center:m,regions:{rail:D,left:_,center:m,right:A,footer:Y}}}function Ld(e,t,n={}){if(n.panelPolish)return Eg(e,t,n);let r=n.color??!0,s=Ng(e,n.centerOnly??!1),i=_C(t,s.width,s.rowCount,r);return{row:s.row,column:s.column,width:s.width,rows:i.map(o=>Ir(o,s.width,r,"center"))}}function Ag(e,t,n,r={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!Fo(s)||t.centerHeader.tabLabel==="BROWSER"||t.terminal.error||t.terminal.rows.length===0||n.some(c=>c<0||c>=t.terminal.rows.length))return null;if(r.panelPolish){let c=_s(e,r.centerOnly).center;return{row:c.row,column:c.column,width:c.width,rowCount:c.height,rows:[...new Set(n)].filter(d=>d+2<c.height-1).map(d=>({index:d+2,row:$g(xd(t.terminal.rows[d]),c.width,t.focusedRegion==="center",r.color??!0,"center",t.inputMode==="terminal")}))}}let i=r.color??!0,o=Ng(e,r.centerOnly??!1),a=xg(t,o.width,i).length,l=[...new Set(n)].map(c=>({terminalIndex:c,index:a+c})).filter(({index:c})=>c<o.rowCount).map(({terminalIndex:c,index:d})=>({index:d,row:Ir(xd(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function DC(e,t,n){let r=n.color??!0,s=_s(e,n.centerOnly),i=Eg(e,t,n),o=B(" ",r,C.panelBg),a=` CRAIG ${xs("/",r,C.panelBg)} ${xs(t.topRail.workspacePath,r,C.panelBg)}`,l={row:1,column:1,width:e.width,rows:[zo(a,e.width,n,r,C.rail)]},c=null,d=null;if(s.left&&s.right){let y=t.leftTree.filter(_=>!_.panelHeader).map(_=>({..._,indent:Math.floor((_.indent??0)/2)})),T=_g({...t,leftTree:y},s.left.width-4,s.left.height-2,r),R=t.focusedRegion==="tasks"?qn("WORKSPACES",r,C.panelBg):Ar("WORKSPACES",r,C.panelBg),b=_d(T,R,s.left,t.focusedRegion==="tasks",r,"left");c={row:s.left.row,column:1,width:s.left.width+2,rows:b.map(_=>`${o}${_}${o}`)};let $=Lg(t,s.right.width-2,s.right.height-1,r),N=qg($[0]??{text:"Inspector"},r,C.panelBg).trim(),D=_d($.slice(1),N,s.right,t.focusedRegion==="inspector"||t.focusedRegion==="actions",r,"right");d={row:s.right.row,column:i.column+i.width,width:s.right.width+2,rows:D.map(_=>`${o}${_}${o}`)}}let u=t.modalInput?C.panelBg:C.panelMuted,p=Dg(t.footerText,t.footerToast,e.width,r,u),h=t.modalInput?p:p.replace(/( {2,})(Tab|Enter|Esc|Ctrl\+\]|[ntxar?q+z]|↑↓\/PgUp\/PgDn)(?= )/g,(y,T,R)=>`${T}${B(R,r,C.panelSelected)}${r?Cr(u):""}`),f={row:e.height,column:1,width:e.width,rows:[h]},m=i.rows.map((y,T)=>c&&d?`${c.rows[T]}${y}${d.rows[T]}`:`${o}${y}${o}`);return{frame:[l.rows[0],...m,f.rows[0]].join(`
269
- `),center:i,regions:{rail:l,left:c,center:i,right:d,footer:f}}}function Eg(e,t,n){let r=n.color??!0,s=_s(e,n.centerOnly).center,i=t.tabs.find(d=>d.active)?.id??"agent",o=t.centerHeader.tabLabel==="BROWSER"||!Fo(i)?t.centerTranscript.map(d=>({...d})):Fg(t),a=[t.centerHeader.repo,t.centerHeader.taskId].filter(Boolean).join(" \xB7 "),l=Mg(t.tabs,r,t.focusedRegion==="center"),c=_d([{text:a,tone:"muted"},...o],l,s,t.focusedRegion==="center",r,"center",t.inputMode==="terminal");return{row:s.row,column:s.column,width:s.width,rows:c}}function Og(e,t){return{bg:C.panelBg.bg,fg:t?C.success.fg:e?C.accent.fg:"3b4261"}}function _d(e,t,n,r,s,i,o=!1){let a=Og(r,o),l=jd(t,n.width-6),c=`${B("\u256D\u2500 ",s,a)}${B(l,s,r?a:C.panelMuted)}${B(` ${"\u2500".repeat(Math.max(0,n.width-Ee(l)-5))}\u256E`,s,a)}`,d=vr(e,n.height-2).map(u=>$g(u,n.width,r,s,i,o));return[c,...d,B(`\u2570${"\u2500".repeat(n.width-2)}\u256F`,s,a)]}function $g(e,t,n,r,s,i=!1){let o=B("\u2502",r,Og(n,i)),a=s==="right"?`${Ir(e,t-3,r,s)}${B(" ",r,C.panelBg)}`:Ir(e,t-2,r,s,s==="left");return`${o}${a}${o}`}function Ng(e,t){return{row:ee.topRailHeight+1,column:t?1:ee.leftWidth+ee.dividerWidth+1,width:t?e.width:e.width-ee.leftWidth-ee.rightWidth-ee.dividerWidth*2,rowCount:e.height-ee.topRailHeight-1}}function Dg(e,t,n,r,s){let i=` ${e}`;if(!t)return B(ht(i,n),r,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=Ee(o),l=Ee(i),c=Math.max(1,n-l-a-2),d=l+c+a+2>n?Jo(i,Math.max(0,n-a-3)):i,u=Math.max(1,n-Ee(d)-a-2),p=t.tone==="error"?JC(o,r,s):qn(o,r,s),h=`${d}${" ".repeat(u)}${p} `;return B(ht(h,n),r,s)}function Md(e,t){if(!t.panelPolish)return gg(e,t);let n=e.width-4,r=gg({width:n,height:e.height-4},{...t,versionText:null,updateText:null}).split(`
270
- `),s={bg:C.overlay.bg,fg:C.accent.fg},i=B(" ",t.color,C.overlay),o=B("\u2502",t.color,s);return[zo("",e.width,t,t.color,C.overlay),`${i}${B(`\u256D${"\u2500".repeat(n)}\u256E`,t.color,s)}${i}`,...r.map(a=>`${i}${o}${a}${o}${i}`),`${i}${B(`\u2570${"\u2500".repeat(n)}\u256F`,t.color,s)}${i}`,B(" ".repeat(e.width),t.color,C.overlay)].join(`
271
- `)}function gg(e,t){let n=new Array(e.height).fill(B(" ".repeat(e.width),t.color,C.overlay)),r=$d(),s=t.menuItems.map((d,u)=>`${u===t.menuIndex?">":" "} ${d}`),i=t.optionsMessage?["",...t.optionsMessage.split(`
272
- `)]:[],o=[...s,...i];for(;o.length<$C;)o.push("");let a=t.details?.length?["",...t.details]:[],l=[...r,"",t.subtitle,...a,"",...o],c=Math.max(1,Math.floor((e.height-l.length)/2));for(let d=0;d<l.length;d+=1){let u=Bg(l[d]??"",e.width);if(d<r.length){n[c+d]=B(u,t.color,C.overlayLogo);continue}if(d===r.length+1){n[c+d]=B(u,t.color,C.overlaySubtitle);continue}let p=d-(r.length+3+a.length),f=p>=0&&p<t.menuItems.length&&p===t.menuIndex?t.panelPolish?{...C.overlayMenuSelected,fg:C.success.fg}:C.overlayMenuSelected:C.overlay;n[c+d]=B(u,t.color,f)}return n[0]=zo("",e.width,t,t.color,C.overlay),n.join(`
273
- `)}function zo(e,t,n,r,s){let i=[n.versionText,n.updateText].filter(Boolean).join(" ");if(!i)return B(ht(e,t),r,s);let o=jd(i,Math.max(0,t-2)),a=Math.max(0,t-Ee(o)-2),l=n.updateText?Ar(o,r,s):xs(o,r,s);return B(`${ht(e,a)} ${l} `,r,s)}function _g(e,t,n,r){let s=LC(e.runners),i=1,o=e.leftTree.map(l=>FC(l,t,r));return[...vr(o,n-i),s]}function _C(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!Fo(s)?e.centerTranscript.map(o=>({...o})):Fg(e);return vr([...xg(e,t,r),...i],n)}function xg(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:YC(e.tabs),o=e.inputMode==="terminal"?r:s.length+1,a="\u2500".repeat(Math.max(0,o)),l=`${" ".repeat(i)}${e.inputMode==="terminal"?qn(a,n,C.panelBg):Ar(a,n,C.panelMuted)}`,c=[`${Ar(e.centerHeader.tabLabel,n,C.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),d=Mg(e.tabs,n,e.focusedRegion==="center"),u=" engaged ",p=u.length+2,h=e.inputMode==="terminal"?qn(`${u}\u25CF `,n,C.panelBg):"",f=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Ee(d)-p)):"";return[{text:e.inputMode==="terminal"?`${d}${f}${h}`:d},{text:l,tone:"muted"},{text:c},mt()]}function Fg(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},mt(),{text:e.terminal.error},mt(),{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(xd)}function xd(e){return{text:qd(e.segments),segments:e.segments,fullBleed:!0}}function Lg(e,t,n,r){let s=e.rightInspection?xC(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):vr([{text:"CONTEXT"},mt(),...e.rightContext.map(i=>MC(i,r)),...e.actionMessage?[mt(),{text:e.actionMessage}]:[]],n);return vr(s,n)}function xC(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:zC(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>yg(a)),...r.slice(o,o+s).map(a=>yg(a))]}function yg(e){let t=e.focused?"\u25B8 ":e.selected?"\u2022 ":" ",n=e.focused||e.selected?"selected":e.muted?"muted":"default",r=`${t}${e.text}`;if(e.segments)return{text:r,segments:[{text:t},...e.segments],tone:n};if(e.accentPrefix&&!e.muted){let s=e.text.indexOf(" "),i=s===-1?e.text:e.text.slice(0,s),o=s===-1?"":e.text.slice(s);return{text:r,segments:[{text:t},{text:i,style:{fg:"7aa2f7"}},{text:o}],tone:n}}return e.color?{text:r,segments:[{text:t},{text:e.text,style:{fg:e.color}}],tone:n}:{text:r,tone:n}}function FC(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${qn("\u25CF",n,e.selected?C.panelSelected:C.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((f,m)=>f+Ee(m.text),0):0,l=t-Ee(i)-Ee(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",d=e.selected?e.text:e.focused?qn(e.text,n,C.panelBg):e.panelHeader?Ar(e.text,n,C.panelMuted):e.text,u=ht(`${r}${c}${d}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let f=`${r}${e.selected?"\u25B8":" "} `,m=u.slice(f.length+2),y=m.trimEnd(),T=m.slice(y.length),R=[{text:f},jg(e.activity,e.activityAnimationFrame??0),{text:" "},{text:y,style:{bold:e.unread===!0}},{text:`${T}${i}${o}`},...e.prBadge??[]];return{text:qd(R),segments:R,tone:p}}if(e.prBadge){let f=[{text:`${u}${i}${o}`},...e.prBadge];return{text:`${u}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:f,tone:p}}return{text:`${u}${i}${o}`,tone:p}}function LC(e){let t=e.map(r=>{let s=r.health>=1,i=parseInt(r.count,10),o=i>1?` (${i})`:"";return{text:`${s?"\u25CF":"\u25CB"} ${r.name}${o}`,active:s}}),n=[];for(let r=0;r<t.length;r++){let s=t[r];r>0&&n.push({text:" "}),s.active?n.push({text:s.text,style:{fg:C.success.fg}}):n.push({text:s.text,style:{fg:C.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function Mg(e,t,n){return e.map(r=>{let s=r.active?n?qn(r.label,t,C.panelBg):Ar(r.label,t,C.panelBg):xs(r.label,t,C.panelBg);r.unread&&(s=Ho({text:s,style:{bold:!0}},t,C.panelBg));let i=r.activity?Ho(jg(r.activity,r.activityAnimationFrame??0),t,C.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function jg(e,t){return{text:"\u25CF",style:{fg:e==="working"?Nd[t%Nd.length]??Nd[0]:e==="ready"?C.success.fg:e==="error"?C.error.fg:C.panelMuted.fg}}}function MC(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?xs(e.value,t,C.panelBg):e.value}`}}function Ir(e,t,n,r,s=!1){let i=jC(r,e.tone??"default"),o=qg(e,n,i);if(r==="left"){let l=s?1:kg,c=s?1:Tg;if(e.fullBleed)return B(ht(o,t),n,i);let d=t-l-c;if(e.rightAlign){let p=Ee(o),h=Math.max(0,d-p),f=`${" ".repeat(l)}${" ".repeat(h)}${o}${" ".repeat(c)}`;return B(f,n,i)}let u=`${" ".repeat(l)}${ht(o,d)}${" ".repeat(c)}`;return B(u,n,i)}return r==="center"&&e.fullBleed?qC(e,t,n,i):B(ht(` ${o}`,t),n,i)}function jC(e,t){return t==="selected"||t==="focused"?C.panelSelected:t==="muted"?C.panelMuted:C.panelBg}function vr(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(mt());return n}function mt(){return{text:""}}function qg(e,t,n){return e.segments?e.segments.map(r=>Ho(r,t,n)).join(""):e.text}function qC(e,t,n,r){let s=" ".repeat(Go),i=Math.max(0,t-Go*2);if(!e.segments)return B(`${s}${ht(e.text,i)}${s}`,n,r);let o=WC(e.segments,i),a=`${s}${o.map(l=>Ho(l,n,r)).join("")}${s}${n?Fd:""}`;return B(a,n,r)}function Ho(e,t,n){let r=e.href?`${Ug(e.href)}${e.text}${Fd}`:UC(e.text);return!t||!e.style?r:`${Cr(GC(e.style,n))}${HC(e.style)}${r}${Dd}${Cr(n)}`}function UC(e){return e.replace(AC,t=>{let[n,r]=BC(t);return`${Ug(n)}${n}${Fd}${r}`})}function BC(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function Ug(e){return`\x1B]8;;${e}\x1B\\`}function WC(e,t){let n=VC(e,t);return KC(n,t)}function VC(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=Ee(s.text);if(i<=r){n.push(s),r-=i;continue}let o=Jo(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function KC(e,t){let n=Ee(qd(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 GC(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 HC(e){let t=[];return e.bold&&t.push("1"),e.dim&&t.push("2"),e.italic&&t.push("3"),e.underline&&t.push("4"),t.length>0?`\x1B[${t.join(";")}m`:""}function YC(e){let t=0;for(let n of e){if(n.active)return t;t+=n.label.length+(n.activity?2:0)+3}return 0}function Bg(e,t){let n=Math.max(0,t-Ee(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function ht(e,t){let n=Ee(e);return n>=t?jd(e,t):e+" ".repeat(t-n)}function jd(e,t){if(t<=0)return"";if(Ee(e)<=t)return e;let n=Vg(e);return Jo(n,Math.max(0,t-1))+"\u2026"}function Ee(e){let t=0;for(let n of Array.from(Vg(e)))t+=Wg(n);return t}function Jo(e,t){let n="",r=0;for(let s of Array.from(e)){let i=Wg(s);if(r+i>t)break;n+=s,r+=i}return n}function Wg(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 zC(e,t,n){return Math.min(Math.max(e,t),n)}function Vg(e){return e.replace(CC,"").replace(IC,"")}function qd(e){return e.map(t=>t.text).join("")}function B(e,t,n){if(!t)return e;let r=Cr(n),s=e.replace(vC,`${Dd}${r}`);return`${r}${s}${Dd}`}function Cr(e){let t=[];return e.fg&&t.push(`38;2;${wg(e.fg).join(";")}`),e.bg&&t.push(`48;2;${wg(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function wg(e){return[Number.parseInt(e.slice(0,2),16),Number.parseInt(e.slice(2,4),16),Number.parseInt(e.slice(4,6),16)]}function qn(e,t,n){return Fs(e,t,C.success.fg,n)}function JC(e,t,n){return Fs(e,t,C.error.fg,n)}function Ar(e,t,n){return Fs(e,t,C.accent.fg,n)}function xs(e,t,n){return Fs(e,t,C.mutedfg.fg,n)}function Fs(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${Cr(s)}${e}${Cr(r)}`}function Kg(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"?QC(s,r?.runner):[],a=r?{CRAIG_WORKSPACE_ROOT:n,CRAIG_TASK_ID:r.id,...s?.kind==="agent"?{CRAIG_AGENT_TAB_ID:s.id,...e.agentCapabilityTokens?.[s.id]?{CRAIG_AGENT_CAPABILITY:e.agentCapabilityTokens[s.id]}:{}}:{}}:{};return r?.type==="project"?{cwd:i,command:o,env:{...a,GIT_CEILING_DIRECTORIES:XC(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function XC(e,t){let n=(e??"").split(Ud.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(Ud.delimiter):[...n,t].join(Ud.delimiter)}function QC(e,t){let n=e.command.length>0?e.command:["codex"];return vo(n,e.runner??t??"codex")}function Gg(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 Gt(e,t=!1,n=!1){if(t){let r=hg(e,n);return{columns:r.width,rows:r.height}}return{columns:Math.max(20,e.width-ee.leftWidth-ee.rightWidth-ee.dividerWidth-Go*2),rows:Math.max(5,e.height-ee.topRailHeight-5)}}function Hg(e){return e.length===1||et(e)||e==="BACKSPACE"||e==="TAB"}function Ht(e){return typeof e=="string"&&new RegExp(`:(?:agent|${me.join("|")})(?:-\\d+)?$`).test(e)}function Yg(e,t){return e==="UP"&&t?-3:e==="DOWN"&&t?3:e==="PAGE_UP"?-5:e==="PAGE_DOWN"?5:e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function Bd(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function zg(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 Ls(e){return Xg.includes(e)?"SHIFT_ENTER":null}function Wd(e){return Xg.some(t=>t.startsWith(e))}function Jg(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var Xg=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function Qg(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
273
+ `);return o.length>XC?Oe(t,"Diff is above the 500 KB inline preview limit.","too_large",t,o.length):o.includes("\0")?Oe(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(`
274
+ `):["No diff for this file."],byteLength:o.length}}function Jg(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 mn(e,t){return e&&t.includes(e)?e:t[0]??null}function nA(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function Xg(e){return[...new Set(e.split(`
275
+ `).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function rA(e,t){let n=Bd.resolve(e,t),r=Bd.resolve(e);if(n!==r&&!n.startsWith(`${r}${Bd.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function sA(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function Oe(e,t,n,r=null,s=null){return{path:r,status:n,title:e,lines:[t],byteLength:s}}async function Er(e,t,n){let r=$e(e),[s,i]=await Promise.all([be.repos.listRegisteredRepos(r),be.listWorkspaces(r,{archived:!1})]),o=await S.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 st(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 S.listTasks(r)}let[u,d]=await Promise.all([k.previews.isEnabled(l,"agentOrchestration")?is(r):[],os(r)]);c=(k.previews.isEnabled(l,"agentOrchestration")?u.length:0)+d.filter(m=>m.state==="waiting_for_review"||m.state==="changes_requested").length;let p=Vd(o.tasks,t),h=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},f=p?await Ug(p,h):null;return{workspaceRoot:e,workspaces:i.workspaces,repos:s.repos,tasks:o.tasks,inspection:f,furyApprovalCount:c,furyPendingPlans:u,furyPlansEnabled:k.previews.isEnabled(l,"agentOrchestration"),...Object.keys(a).length>0?{agentCapabilityTokens:a}:{},...n?{enabledRunnerIds:n}:{}}}function Vd(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function Qg(e,t){return jn(e,t)}import Kd from"node:path";function Zg(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"?oA(s,r?.runner):[],a=r?{CRAIG_WORKSPACE_ROOT:n,CRAIG_TASK_ID:r.id,...s?.kind==="agent"?{CRAIG_AGENT_TAB_ID:s.id,...e.agentCapabilityTokens?.[s.id]?{CRAIG_AGENT_CAPABILITY:e.agentCapabilityTokens[s.id]}:{}}:{}}:{};return r?.type==="project"?{cwd:i,command:o,env:{...a,GIT_CEILING_DIRECTORIES:iA(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function iA(e,t){let n=(e??"").split(Kd.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(Kd.delimiter):[...n,t].join(Kd.delimiter)}function oA(e,t){let n=e.command.length>0?e.command:["codex"];return Eo(n,e.runner??t??"codex")}function ey(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 Gt(e,t=!1,n=!1){if(t){let r=Gh(e,n);return{columns:r.width,rows:r.height}}return{columns:Math.max(20,e.width-ee.leftWidth-ee.rightWidth-ee.dividerWidth-Go*2),rows:Math.max(5,e.height-ee.topRailHeight-5)}}function ty(e){return e.length===1||Se(e)||e==="BACKSPACE"||e==="TAB"}function Ht(e){return typeof e=="string"&&new RegExp(`:(?:agent|${me.join("|")})(?:-\\d+)?$`).test(e)}function ny(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 Gd(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function ry(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 Us(e){return iy.includes(e)?"SHIFT_ENTER":null}function Hd(e){return iy.some(t=>t.startsWith(e))}function sy(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var iy=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function oy(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
274
276
  `||n===`\r
275
- `)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function Zg(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function ey(e,t=null){let n=t?.split(`
277
+ `)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function ay(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function ly(e,t=null){let n=t?.split(`
276
278
  `)??[];return e.split(`
277
- `).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function Xo(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{createServer as BA,createConnection as my}from"node:net";import{mkdir as WA,readFile as hy,rm as Ms,writeFile as VA}from"node:fs/promises";import KA from"node:path";import{setTimeout as iA}from"node:timers/promises";var hn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=Vd(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:Vd(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=Vd(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 Vd(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}var ZC="\x1B[200~",eA="\x1B[201~";function ty(e,t){return e==="codex"&&/Trust this folder\?/i.test(t)&&/Trust and continue/i.test(t)?"Codex requires folder trust before it can receive work.":e==="codex"&&/Update available/i.test(t)&&/Update now|Install update/i.test(t)?"Codex is displaying an update dialog instead of the agent input.":e==="cursor"&&/Press any key to log in/i.test(t)?"Cursor requires authentication before it can receive work.":null}function ny(e,t){switch(e){case"codex":return Qo(t,50);case"cursor":return Qo(t,50);case"claude":return Qo(t,50);case"pi":return Qo(t,50);default:return tA(e)}}function Qo(e,t){return{paste:`${ZC}${e}${eA}`,submit:"\r",submitDelayMs:t}}function tA(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import nA from"node:path";var rA={type:"system",component:"orchestration-supervisor"};async function ry(e){let t=nA.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Vs(t)??{version:1,commands:{}},r=await Me(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of sA(i))o.has(a)||(await vn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:rA),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await U(t,n)}function sA(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 Zo=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new hn({resolutionMs:s,onError:(i,o)=>r.onError?.(o)}),this.heartbeat.register({id:"orchestration.commands",intervalMs:s,run:()=>this.reconcile()}),this.heartbeat.register({id:"orchestration.liveness",intervalMs:1e3,run:async()=>{await this.lease?.heartbeat()}})}paths;runtime;heartbeat;lease=null;reconciliation=null;async start(t={}){if(!this.lease){this.lease=await md(this.paths);try{t.deferReconciliation||await this.reconcile(),this.heartbeat.start()}catch(n){throw await this.lease.release(),this.lease=null,n}}}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 Oo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await ry(this.paths);let t=await Me(this.paths);for(let n of t){if(await this.reconcileInitialPromptTask(n),n.state==="delivering"){await this.failCommand(n,Er("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 Oo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){let n=t.idempotencyKey?.match(/^fury-review:([^:]+):([0-9]+)$/);if(n){let l=await rt(this.paths,n[1]),c=await te(this.paths,l.runId);if(l.state!=="changes_requested"||l.round!==Number(n[2])||["succeeded","failed","cancelled","timed_out"].includes(c.state)||Date.now()>=Math.min(Date.parse(c.deadlineAt),Date.parse(l.deadlineAt))){await ue.cancel(this.paths,t.id,{type:"system",component:"orchestration-supervisor"});return}}if(Date.now()>=Date.parse(t.expiresAt)){await this.failCommand(t,Er("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let r=await P.getTask(this.paths,t.taskId).catch(l=>{if(l instanceof g&&l.code==="TASK_NOT_FOUND")return null;throw l}),s=r?.ptyTabs.find(l=>l.id===t.agentTabId);if(!r||!s||s.kind!=="agent"||r.status==="closed"){await this.failCommand(t,Er("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer available in task ${t.taskId}.`,!1,!1));return}let i=this.runtime.getActivitySnapshots().find(l=>l.tabId===t.agentTabId);if(i&&i.sessionState!=="running"){await this.failCommand(t,Er("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(!this.runtime.hasRunningSession(t.agentTabId)||t.delivery==="when-ready"&&bt(r,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")return;let o=this.runtime.getStartupBlocker?.(t.agentTabId,s.runner??r.runner);if(o){await this.failCommand(t,Er("PROMPT_STARTUP_BLOCKED",o,!0,!1));return}await ue.beginDelivery(this.paths,t.id);try{let l=ny(s.runner??r.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,l.paste),await iA(l.submitDelayMs),this.runtime.writeToSession(t.agentTabId,l.submit)}catch(l){await this.failCommand(t,Er("PROMPT_DELIVERY_UNCERTAIN",l instanceof Error?l.message:"Prompt delivery failed after it began.",!1,!0));return}let a=await ue.completeDelivery(this.paths,t.id);await this.reconcileInitialPromptTask(a)}async failCommand(t,n){let r=await ue.fail(this.paths,t.id,n);await this.reconcileInitialPromptTask(r)}async reconcileInitialPromptTask(t){if(!oA(t)||t.state==="queued"||t.state==="delivering")return;let n=await P.getTask(this.paths,t.taskId).catch(r=>{if(r instanceof g&&r.code==="TASK_NOT_FOUND")return null;throw r});if(!(!n||n.status==="closed")){if(t.state==="delivered"){(n.status==="draft"||n.runnerSession.lastKnownState==="starting")&&await P.markTaskStarted(this.paths,n.id);return}n.runnerSession.lastKnownState!=="failed"&&await P.recordStartupFailure(this.paths,n.id,t.lastError?.message??`Initial prompt ${t.state}.`)}}},oA=e=>e.idempotencyKey===`task-start:${e.taskId}`,Er=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var aA={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},Or=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...aA,...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 He,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=lA(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(cA);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 lA(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 cA(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as dA}from"node:fs";var ea=class{constructor(t,n){this.paths=t;this.options=n;this.now=n.now??Date.now,this.taskDebounceMs=n.taskDebounceMs??50,this.readyAfterMs=n.readyAfterMs??5e3}paths;options;now;taskDebounceMs;readyAfterMs;agentStates=new Map;readinessTimers=new Map;watchers=[];debounceTimer=null;reconciliation=null;dirty=!1;running=!1;baselineComplete=!1;start(){this.running||(this.running=!0,this.baselineComplete=!1,this.watchPath(this.paths.tasksDir,()=>this.schedule(this.taskDebounceMs)),this.watchPath(this.paths.craigDir,(t,n)=>{let r=n===null?"":String(n);(r==="index.json"||r.startsWith(".index.json."))&&this.schedule(this.taskDebounceMs)}),this.schedule(0))}notifyActivity(t){if(!this.running)return;let n=Ye(t.tabId,[t],this.now());this.agentStates.get(t.tabId)!==n&&(this.agentStates.set(t.tabId,n),this.schedule(0)),this.scheduleReadiness(t)}notifyActivityRemoved(t){this.running&&(this.clearReadinessTimer(t),this.agentStates.delete(t)&&this.schedule(0))}async stop(){if(this.running){this.running=!1;for(let t of this.watchers.splice(0))t.close();this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=null;for(let t of this.readinessTimers.values())clearTimeout(t);this.readinessTimers.clear(),await this.reconciliation?.catch(()=>{})}}scheduleReadiness(t){if(this.clearReadinessTimer(t.tabId),t.sessionState!=="running")return;let n=Math.max(0,t.lastActivityAt+this.readyAfterMs-this.now());this.readinessTimers.set(t.tabId,setTimeout(()=>{this.readinessTimers.delete(t.tabId),!(!this.running||this.agentStates.get(t.tabId)!=="working")&&(this.agentStates.set(t.tabId,"ready"),this.schedule(0))},n+1))}watchPath(t,n){try{let r=dA(t,{persistent:!1},n);r.on("error",s=>{this.reportError(s)}),this.watchers.push(r)}catch(r){this.reportError(r)}}clearReadinessTimer(t){let n=this.readinessTimers.get(t);n&&clearTimeout(n),this.readinessTimers.delete(t)}schedule(t){if(this.running){if(this.reconciliation){this.dirty=!0;return}this.debounceTimer||(this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.requestReconciliation()},t))}}requestReconciliation(){if(!this.running||this.reconciliation){this.dirty=!0;return}this.reconciliation=this.drainReconciliations().catch(t=>this.reportError(t)).finally(()=>{this.reconciliation=null,this.running&&this.dirty&&this.requestReconciliation()})}async drainReconciliations(){do{this.dirty=!1;let t=await this.options.reconcileEvents();this.baselineComplete&&t.length>0&&await this.options.onEvents(t),this.baselineComplete=!0}while(this.running&&this.dirty)}async reportError(t){await this.options.onError(t)}};var uA={selectedTaskId:null,reviewVisible:!1},pA={listTasks:async e=>(await P.listTasks(e)).tasks,syncTasks:async(e,t)=>(await P.prs.discoverOrRefreshMany(e,t),Promise.all(t.map(n=>P.getTask(e,n.id))))},ta=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??pA,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new Or({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new ea(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=mA(s);i.length>0&&await this.onTasksChanged(i);let o=fA(s);o.length>0&&await this.wake(o)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new hn({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=uA;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,sy(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)!==sy(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 fA(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=yA(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&gA.has(i))&&t.add(n.taskId);continue}n.type==="agent.state.changed"&&r?.previousState==="working"&&(r.state==="ready"||r.state==="idle"||r.state==="error")&&t.add(n.taskId)}return[...t]}function mA(e){let t=new Set;for(let n of e)n.taskId&&hA(n)&&t.add(n.taskId);return[...t]}function hA(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var gA=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),yA=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function sy(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as AA}from"node:module";import kA from"@xterm/headless";var wA=new RegExp("^\x1B\\[(\\d*)S$"),na=class{constructor(t){this.terminal=t;t.onResize(()=>{this.top=0,this.bottom=null}),t.parser.registerCsiHandler({final:"r"},n=>{if(t.buffer.active.type!=="normal")return!1;let r=Number(n[0]||1)-1,s=Math.min(Number(n[1]||t.rows),t.rows)-1;return r>=0&&r<s&&s<t.rows&&(this.top=r,this.bottom=s),!1});for(let n of["h","l"])t.parser.registerCsiHandler({prefix:"?",final:n},r=>(t.buffer.active.type==="normal"&&r.includes(6)&&(this.originMode=n==="h"),!1));t.parser.registerEscHandler({final:"c"},()=>(this.top=0,this.bottom=null,this.originMode=!1,!1)),t.parser.registerCsiHandler({intermediates:"!",final:"p"},()=>(t.buffer.active.type==="normal"&&(this.top=0,this.bottom=null,this.originMode=!1),!1))}terminal;top=0;bottom=null;originMode=!1;state="text";pending="";queue=Promise.resolve();write(t){return this.queue=this.queue.then(()=>this.writeChunk(t)),this.queue}async writeChunk(t){let n="";for(let r of t){if(this.state==="string"||this.state==="stringEscape"){n+=r,r==="\x07"||this.state==="stringEscape"&&r==="\\"?this.state="text":this.state=r==="\x1B"?"stringEscape":"string";continue}if(this.state==="text"){r==="\x1B"?(this.pending=r,this.state="escape"):n+=r;continue}if(this.pending+=r,this.state==="escape"){r==="["?this.state="csi":("]PX^_".includes(r)?this.state="string":this.state="text",n+=this.pending,this.pending="");continue}if(r<"@"||r>"~")continue;let s=this.pending;this.pending="",this.state="text";let i=wA.exec(s);if(!i){n+=s;continue}await this.writeRaw(n),n="",await this.scrollUp(s,Number(i[1])||1)}await this.writeRaw(n)}async scrollUp(t,n){let r=this.terminal;if(r.buffer.active.type!=="normal"||this.top!==0){await this.writeRaw(t);return}let s=Math.min(this.bottom??r.rows-1,r.rows-1),{cursorX:i,cursorY:o}=r.buffer.active,a=Math.min(n,s+1),l=this.originMode?"\x1B[?6l":"",c=this.originMode?"\x1B[?6h":"";await this.writeRaw(`${l}\x1B[${s+1};1H${`
278
- `.repeat(a)}${c}\x1B[${o+1};${i+1}H`)}writeRaw(t){return t?new Promise(n=>this.terminal.write(t,n)):Promise.resolve()}};function iy(e,t){let n=t;if(!n.hasExtendedAttrs?.())return;let r=n.extended?.urlId;if(!r)return;let s=e._core?._oscLinkService?.getLinkData(r)?.uri;if(!(!s||!/^(https?:|file:|mailto:)/i.test(s))&&![...s].some(i=>i.charCodeAt(0)<32||i.charCodeAt(0)>=127&&i.charCodeAt(0)<=159))return s}var TA=1e3,ay=new WeakMap,bA=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function ly(e){let t=new kA.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:TA,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}});return ay.set(t,new na(t)),t}function cy(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function Gd(e,t){let n=ay.get(e);return n?n.write(t):new Promise(r=>{e.write(t,r)})}function dy(e,t=0){let n=e.buffer.active,r=[],s=n.getNullCell(),i=n.baseY+n.cursorY,o=Math.max(0,n.baseY-t);for(let a=0;a<e.rows;a+=1){let l=n.getLine(o+a);if(!l){r.push({segments:[]});continue}let c=[];for(let d=0;d<e.cols;d+=1){let u=l.getCell(d,s);if(!u||u.getWidth()===0)continue;let p=iy(e,u);c.push({text:u.getChars()||" ",style:SA(u,o+a===i&&d===n.cursorX),...p?{href:p}:{}})}r.push({segments:RA(PA(c))})}return r}function RA(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&r.href===n.href&&CA(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};n.href&&(s.href=n.href),uy(n.style)||(s.style=n.style),t.push(s)}return t}function PA(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||n.href||!uy(n.style))break;t-=1}return e.slice(0,t)}function SA(e,t){let n={},r=oy(e,"fg"),s=oy(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 oy(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"):bA[s]??IA(s)}function IA(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(vA).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 vA(e){return e===0?0:55+e*40}function CA(e,t){return Kd(e)===Kd(t)}function Kd(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function uy(e){return Kd(e)===""}var EA=AA(import.meta.url),OA=/^CTRL_([A-Z])$/,$A="\x1B[6n",NA="\x1B[c",DA="\x1B[?u",_A={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
279
- `,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:""},ra=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")Hd(i),this.sessions.delete(n);else return this.attachedTabId=n,i.scrollbackLines=0,py(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(`
280
- `))&&this.touchActivity(n))}writeKey(t){let n=xA(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&&py(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&&(Hd(n),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())Hd(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:FA(n),error:n.error,scrolledBack:n.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}getStartupBlocker(t,n){let r=this.sessions.get(t);if(!r)return null;let s=r.terminal.buffer.active,i=Array.from({length:r.terminal.rows},(o,a)=>s.getLine(s.baseY+a)?.translateToString(!0)??"").join(`
281
- `);return ty(n,i)}createSession(t,n,r,s){let i=this.spawn??MA().spawn,o=ly(r),a=s??this.resolveSessionSpec(t,n),l=bo({...this.env,...a.env??{}}),{executable:c,args:d}=jA(this.shell,a.command,{cwd:a.cwd,env:l}),u=i(c,d,{name:"xterm-256color",cols:r.columns,rows:r.rows,cwd:a.cwd,env:qA(l)}),p={taskId:t,tabId:n,pty:u,terminal:o,status:"running",error:null,disposables:[],scrollbackLines:0,rows:[],renderedScrollbackLines:null,screenDirty:!0,lastActivityAt:Date.now(),exitCode:null};return p.disposables.push(u.onData(h=>{this.touchActivity(p),UA(u,h),Gd(p.terminal,h).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p.disposables.push(u.onExit(h=>{p.status="exited",p.exitCode=h.exitCode,p.lastActivityAt=Date.now(),this.notifyActivity(p),Gd(p.terminal,`\r
282
- [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 xA(e){if(e.length===1)return e;let t=_A[e];if(t!==void 0)return t;let n=OA.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function py(e,t){LA(e.pty,t),cy(e.terminal,t),e.screenDirty=!0}function FA(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=dy(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function Hd(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function LA(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function MA(){return EA("node-pty")}function jA(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[Ro(t[0],n),...t.slice(1)].map(fy).join(" ")}; exec ${fy(e)} -l`;return{executable:e,args:["-lc",s]}}function fy(e){return`'${e.replaceAll("'","'\\''")}'`}function qA(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 UA(e,t){for(let n=0;n<Yd(t,$A);n+=1)e.write("\x1B[1;1R");for(let n=0;n<Yd(t,NA);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<Yd(t,DA);n+=1)e.write("\x1B[?0u")}function Yd(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 sa=Pt,GA=16,HA=250;async function gy(e){let t=Fe(e.paths);await XA(t,e.paths,e.spawnDaemon);let n=await Sy(t.socketPath),r=new zd(n,e);return await r.ready(),r}async function yy(e,t={}){let n=Fe(e);await WA(e.runtimeDir,{recursive:!0}),await Ms(n.socketPath,{force:!0});let r=new Jd(e,t),s=BA(i=>r.handleConnection(i));try{await tE(s,n.socketPath),await r.start(),await VA(n.pidPath,String(process.pid),"utf8"),await pe.appendLogBestEffort(e,{level:"info",component:"daemon",event:"started",message:`PTY daemon started with protocol ${sa}.`,details:{pid:process.pid,protocolVersion:sa}}),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 pe.appendLogBestEffort(e,{level:"error",component:"daemon",event:"failed",message:i instanceof Error?i.message:String(i),details:{pid:process.pid}}),i}finally{r.closeClients(),s.listening&&await new Promise(i=>s.close(()=>i())),await pe.appendLogBestEffort(e,{level:"info",component:"daemon",event:"stopped",message:"PTY daemon stopped and disposed its remaining sessions.",details:{pid:process.pid,remainingSessionCount:r.sessionCount()}}),r.onShutdown=null,await Ms(n.socketPath,{force:!0}),await Ms(n.pidPath,{force:!0}),await r.stop(),r.disposeAll()}}async function wy(e){let t=Fe(e);return await by(t.socketPath)?(await eE(t.socketPath),!0):!1}var zd=class{constructor(t,n){this.socket=t;this.options=n,this.activityEnabled=n.activityEnabled??!1,this.tasksChangedHandler=n.onTasksChanged,this.openFileHandler=n.onOpenFile,t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>{this.closed||(this.closed=!0,this.rejectAll(new Error("Craig PTY daemon connection closed.")),this.failRunningActivities("Craig PTY daemon connection closed."))})}socket;managesPullRequestSync=!0;nextRequestId=1;pending=new Map;viewCache=new Map;activityCache=new Map;activityRevisionByTabId=new Map;activityRevision=0;attachedTabId=null;viewedTabId=null;subscribedTabId=null;activityEnabled;pullRequestPollView={selectedTaskId:null,reviewVisible:!1};tasksChangedHandler;openFileHandler;buffer="";closed=!1;protocolVersion=sa;options;async ready(){let t=await this.send({type:"ping"});if(!Ty(t.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch.");this.protocolVersion=t.protocolVersion,this.protocolVersion<=8&&await this.send({type:"setViewUpdateMode",mode:"incremental"}),await this.send({type:"setActivityEnabled",enabled:this.activityEnabled}),this.protocolVersion>=10&&await this.send({type:"subscribeNavigation"}),this.activityEnabled&&await this.refreshActivitySnapshots()}async ensureSession(t,n,r){let s=await this.send({type:"ensureSession",taskId:t,tabId:n,size:r,spec:this.options.resolveSessionSpec?.(t,n)??{cwd:this.options.workspaceRoot,command:[]}});this.attachedTabId=n,this.viewedTabId=n,this.subscribedTabId=n;let i=s.view??{status:"idle",rows:[],error:null};return this.viewCache.set(n,i),i}async hydrateSessions(t){for(let n of t)try{let r=await this.send({type:"hydrateSession",tabId:n});r.view&&(this.viewCache.set(n,r.view),r.view.status==="idle"&&pe.appendLogBestEffort(this.options.paths,{level:"debug",component:"pty",event:"hydration.missing",message:"No live PTY session was found for the persisted tab.",tabId:n}))}catch(r){let s=r instanceof Error?r.message:String(r);this.viewCache.set(n,{status:"failed",rows:[],error:s})}this.activityEnabled&&await this.refreshActivitySnapshots()}async pruneStale(t){await this.send({type:"pruneStale",keepTabIds:t})}write(t){this.send({type:"write",input:t}).catch(()=>{})}writeKey(t){this.send({type:"writeKey",key:t}).catch(()=>{})}scrollViewport(t){let n=this.attachedTabId;this.send({type:"scrollViewport",lines:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}resize(t){let n=this.attachedTabId;this.send({type:"resize",size:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}detach(){this.attachedTabId=null,this.send({type:"detach"}).catch(()=>{})}setViewedTab(t){this.closed||(this.viewedTabId=t,this.subscribeToView(t))}setActivityEnabled(t){if(!(this.closed||this.activityEnabled===t)){if(this.activityEnabled=t,!t){for(let n of[...this.activityCache.keys()])this.removeCachedActivity(n);this.send({type:"setActivityEnabled",enabled:t}).catch(()=>{});return}this.send({type:"setActivityEnabled",enabled:t}).then(()=>this.refreshActivitySnapshots(!0)).catch(()=>{})}}setPullRequestPollView(t){this.closed||this.pullRequestPollView.selectedTaskId===t.selectedTaskId&&this.pullRequestPollView.reviewVisible===t.reviewVisible||(this.pullRequestPollView=t,this.send({type:"setPullRequestPollView",view:t}).catch(()=>{}))}setTasksChangedHandler(t){this.tasksChangedHandler=t}setOpenFileHandler(t){this.openFileHandler=t}disposeSession(t){this.viewCache.delete(t),this.removeCachedActivity(t),this.attachedTabId===t&&(this.attachedTabId=null),this.send({type:"disposeSession",tabId:t}).catch(()=>{})}disposeAll(){this.attachedTabId=null,!this.closed&&(this.socket.end(),this.closed=!0)}getViewState(t){return t?this.viewCache.get(t)??{status:"idle",rows:[],error:null,scrolledBack:!1}:{status:"idle",rows:[],error:null,scrolledBack:!1}}getActivitySnapshots(){return[...this.activityCache.values()]}async requestShutdown(){await this.send({type:"shutdown"})}async send(t){if(this.closed)throw new Error("Craig PTY daemon connection is closed.");let n=this.nextRequestId;this.nextRequestId+=1;let r={...t,id:n},s=new Promise((o,a)=>{this.pending.set(n,{resolve:o,reject:a})});if(this.socket.destroyed)throw this.pending.delete(n),new Error("Craig PTY daemon connection is closed.");this.socket.write(`${JSON.stringify(r)}
279
+ `).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function ea(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{createServer as JA,createConnection as Ry}from"node:net";import{mkdir as XA,readFile as Py,rm as Bs,writeFile as QA}from"node:fs/promises";import ZA from"node:path";import{setTimeout as fA}from"node:timers/promises";var hn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=Yd(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:Yd(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=Yd(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 Yd(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}var aA="\x1B[200~",lA="\x1B[201~";function cy(e,t){return e==="codex"&&/Trust this folder\?/i.test(t)&&/Trust and continue/i.test(t)?"Codex requires folder trust before it can receive work.":e==="codex"&&/Update available/i.test(t)&&/Update now|Install update/i.test(t)?"Codex is displaying an update dialog instead of the agent input.":e==="cursor"&&/Press any key to log in/i.test(t)?"Cursor requires authentication before it can receive work.":null}function dy(e,t){switch(e){case"codex":return ta(t,50);case"cursor":return ta(t,50);case"claude":return ta(t,50);case"pi":return ta(t,50);default:return cA(e)}}function ta(e,t){return{paste:`${aA}${e}${lA}`,submit:"\r",submitDelayMs:t}}function cA(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import dA from"node:path";var uA={type:"system",component:"orchestration-supervisor"};async function uy(e){let t=dA.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Ys(t)??{version:1,commands:{}},r=await je(e),s=!1;for(let i of r){let o=new Set(n.commands[i.id]??[]);for(let a of pA(i))o.has(a)||(await vn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:uA),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await U(t,n)}function pA(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 na=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new hn({resolutionMs:s,onError:(i,o)=>r.onError?.(o)}),this.heartbeat.register({id:"orchestration.commands",intervalMs:s,run:()=>this.reconcile()}),this.heartbeat.register({id:"orchestration.liveness",intervalMs:1e3,run:async()=>{await this.lease?.heartbeat()}})}paths;runtime;heartbeat;lease=null;reconciliation=null;async start(t={}){if(!this.lease){this.lease=await yd(this.paths);try{t.deferReconciliation||await this.reconcile(),this.heartbeat.start()}catch(n){throw await this.lease.release(),this.lease=null,n}}}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 Do(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await uy(this.paths);let t=await je(this.paths);for(let n of t){if(await this.reconcileInitialPromptTask(n),n.state==="delivering"){await this.failCommand(n,Or("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 Do(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){let n=t.idempotencyKey?.match(/^fury-review:([^:]+):([0-9]+)$/);if(n){let l=await rt(this.paths,n[1]),c=await te(this.paths,l.runId);if(l.state!=="changes_requested"||l.round!==Number(n[2])||["succeeded","failed","cancelled","timed_out"].includes(c.state)||Date.now()>=Math.min(Date.parse(c.deadlineAt),Date.parse(l.deadlineAt))){await ue.cancel(this.paths,t.id,{type:"system",component:"orchestration-supervisor"});return}}if(Date.now()>=Date.parse(t.expiresAt)){await this.failCommand(t,Or("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let r=await S.getTask(this.paths,t.taskId).catch(l=>{if(l instanceof g&&l.code==="TASK_NOT_FOUND")return null;throw l}),s=r?.ptyTabs.find(l=>l.id===t.agentTabId);if(!r||!s||s.kind!=="agent"||r.status==="closed"){await this.failCommand(t,Or("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer available in task ${t.taskId}.`,!1,!1));return}let i=this.runtime.getActivitySnapshots().find(l=>l.tabId===t.agentTabId);if(i&&i.sessionState!=="running"){await this.failCommand(t,Or("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(!this.runtime.hasRunningSession(t.agentTabId)||t.delivery==="when-ready"&&bt(r,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")return;let o=this.runtime.getStartupBlocker?.(t.agentTabId,s.runner??r.runner);if(o){await this.failCommand(t,Or("PROMPT_STARTUP_BLOCKED",o,!0,!1));return}await ue.beginDelivery(this.paths,t.id);try{let l=dy(s.runner??r.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,l.paste),await fA(l.submitDelayMs),this.runtime.writeToSession(t.agentTabId,l.submit)}catch(l){await this.failCommand(t,Or("PROMPT_DELIVERY_UNCERTAIN",l instanceof Error?l.message:"Prompt delivery failed after it began.",!1,!0));return}let a=await ue.completeDelivery(this.paths,t.id);await this.reconcileInitialPromptTask(a)}async failCommand(t,n){let r=await ue.fail(this.paths,t.id,n);await this.reconcileInitialPromptTask(r)}async reconcileInitialPromptTask(t){if(!mA(t)||t.state==="queued"||t.state==="delivering")return;let n=await S.getTask(this.paths,t.taskId).catch(r=>{if(r instanceof g&&r.code==="TASK_NOT_FOUND")return null;throw r});if(!(!n||n.status==="closed")){if(t.state==="delivered"){(n.status==="draft"||n.runnerSession.lastKnownState==="starting")&&await S.markTaskStarted(this.paths,n.id);return}n.runnerSession.lastKnownState!=="failed"&&await S.recordStartupFailure(this.paths,n.id,t.lastError?.message??`Initial prompt ${t.state}.`)}}},mA=e=>e.idempotencyKey===`task-start:${e.taskId}`,Or=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var hA={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},$r=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...hA,...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 Ye,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=gA(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(yA);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 gA(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 yA(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as wA}from"node:fs";var ra=class{constructor(t,n){this.paths=t;this.options=n;this.now=n.now??Date.now,this.taskDebounceMs=n.taskDebounceMs??50,this.readyAfterMs=n.readyAfterMs??5e3}paths;options;now;taskDebounceMs;readyAfterMs;agentStates=new Map;readinessTimers=new Map;watchers=[];debounceTimer=null;reconciliation=null;dirty=!1;running=!1;baselineComplete=!1;start(){this.running||(this.running=!0,this.baselineComplete=!1,this.watchPath(this.paths.tasksDir,()=>this.schedule(this.taskDebounceMs)),this.watchPath(this.paths.craigDir,(t,n)=>{let r=n===null?"":String(n);(r==="index.json"||r.startsWith(".index.json."))&&this.schedule(this.taskDebounceMs)}),this.schedule(0))}notifyActivity(t){if(!this.running)return;let n=ze(t.tabId,[t],this.now());this.agentStates.get(t.tabId)!==n&&(this.agentStates.set(t.tabId,n),this.schedule(0)),this.scheduleReadiness(t)}notifyActivityRemoved(t){this.running&&(this.clearReadinessTimer(t),this.agentStates.delete(t)&&this.schedule(0))}async stop(){if(this.running){this.running=!1;for(let t of this.watchers.splice(0))t.close();this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=null;for(let t of this.readinessTimers.values())clearTimeout(t);this.readinessTimers.clear(),await this.reconciliation?.catch(()=>{})}}scheduleReadiness(t){if(this.clearReadinessTimer(t.tabId),t.sessionState!=="running")return;let n=Math.max(0,t.lastActivityAt+this.readyAfterMs-this.now());this.readinessTimers.set(t.tabId,setTimeout(()=>{this.readinessTimers.delete(t.tabId),!(!this.running||this.agentStates.get(t.tabId)!=="working")&&(this.agentStates.set(t.tabId,"ready"),this.schedule(0))},n+1))}watchPath(t,n){try{let r=wA(t,{persistent:!1},n);r.on("error",s=>{this.reportError(s)}),this.watchers.push(r)}catch(r){this.reportError(r)}}clearReadinessTimer(t){let n=this.readinessTimers.get(t);n&&clearTimeout(n),this.readinessTimers.delete(t)}schedule(t){if(this.running){if(this.reconciliation){this.dirty=!0;return}this.debounceTimer||(this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.requestReconciliation()},t))}}requestReconciliation(){if(!this.running||this.reconciliation){this.dirty=!0;return}this.reconciliation=this.drainReconciliations().catch(t=>this.reportError(t)).finally(()=>{this.reconciliation=null,this.running&&this.dirty&&this.requestReconciliation()})}async drainReconciliations(){do{this.dirty=!1;let t=await this.options.reconcileEvents();this.baselineComplete&&t.length>0&&await this.options.onEvents(t),this.baselineComplete=!0}while(this.running&&this.dirty)}async reportError(t){await this.options.onError(t)}};var kA={selectedTaskId:null,reviewVisible:!1},TA={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))))},sa=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??TA,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new $r({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new ra(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=RA(s);i.length>0&&await this.onTasksChanged(i);let o=bA(s);o.length>0&&await this.wake(o)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new hn({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=kA;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,py(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)!==py(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 bA(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=IA(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&SA.has(i))&&t.add(n.taskId);continue}n.type==="agent.state.changed"&&r?.previousState==="working"&&(r.state==="ready"||r.state==="idle"||r.state==="error")&&t.add(n.taskId)}return[...t]}function RA(e){let t=new Set;for(let n of e)n.taskId&&PA(n)&&t.add(n.taskId);return[...t]}function PA(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var SA=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),IA=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function py(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as xA}from"node:module";import CA from"@xterm/headless";var vA=new RegExp("^\x1B\\[(\\d*)S$"),ia=class{constructor(t){this.terminal=t;t.onResize(()=>{this.top=0,this.bottom=null}),t.parser.registerCsiHandler({final:"r"},n=>{if(t.buffer.active.type!=="normal")return!1;let r=Number(n[0]||1)-1,s=Math.min(Number(n[1]||t.rows),t.rows)-1;return r>=0&&r<s&&s<t.rows&&(this.top=r,this.bottom=s),!1});for(let n of["h","l"])t.parser.registerCsiHandler({prefix:"?",final:n},r=>(t.buffer.active.type==="normal"&&r.includes(6)&&(this.originMode=n==="h"),!1));t.parser.registerEscHandler({final:"c"},()=>(this.top=0,this.bottom=null,this.originMode=!1,!1)),t.parser.registerCsiHandler({intermediates:"!",final:"p"},()=>(t.buffer.active.type==="normal"&&(this.top=0,this.bottom=null,this.originMode=!1),!1))}terminal;top=0;bottom=null;originMode=!1;state="text";pending="";queue=Promise.resolve();write(t){return this.queue=this.queue.then(()=>this.writeChunk(t)),this.queue}async writeChunk(t){let n="";for(let r of t){if(this.state==="string"||this.state==="stringEscape"){n+=r,r==="\x07"||this.state==="stringEscape"&&r==="\\"?this.state="text":this.state=r==="\x1B"?"stringEscape":"string";continue}if(this.state==="text"){r==="\x1B"?(this.pending=r,this.state="escape"):n+=r;continue}if(this.pending+=r,this.state==="escape"){r==="["?this.state="csi":("]PX^_".includes(r)?this.state="string":this.state="text",n+=this.pending,this.pending="");continue}if(r<"@"||r>"~")continue;let s=this.pending;this.pending="",this.state="text";let i=vA.exec(s);if(!i){n+=s;continue}await this.writeRaw(n),n="",await this.scrollUp(s,Number(i[1])||1)}await this.writeRaw(n)}async scrollUp(t,n){let r=this.terminal;if(r.buffer.active.type!=="normal"||this.top!==0){await this.writeRaw(t);return}let s=Math.min(this.bottom??r.rows-1,r.rows-1),{cursorX:i,cursorY:o}=r.buffer.active,a=Math.min(n,s+1),l=this.originMode?"\x1B[?6l":"",c=this.originMode?"\x1B[?6h":"";await this.writeRaw(`${l}\x1B[${s+1};1H${`
280
+ `.repeat(a)}${c}\x1B[${o+1};${i+1}H`)}writeRaw(t){return t?new Promise(n=>this.terminal.write(t,n)):Promise.resolve()}};function fy(e,t){let n=t;if(!n.hasExtendedAttrs?.())return;let r=n.extended?.urlId;if(!r)return;let s=e._core?._oscLinkService?.getLinkData(r)?.uri;if(!(!s||!/^(https?:|file:|mailto:)/i.test(s))&&![...s].some(i=>i.charCodeAt(0)<32||i.charCodeAt(0)>=127&&i.charCodeAt(0)<=159))return s}var AA=1e3,hy=new WeakMap,EA=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function gy(e){let t=new CA.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:AA,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}});return hy.set(t,new ia(t)),t}function yy(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function Jd(e,t){let n=hy.get(e);return n?n.write(t):new Promise(r=>{e.write(t,r)})}function wy(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);if(!d||d.getWidth()===0)continue;let p=fy(e,d);c.push({text:d.getChars()||" ",style:NA(d,o+a===i&&u===n.cursorX),...p?{href:p}:{}})}r.push({segments:OA($A(c))})}return r}function OA(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&r.href===n.href&&FA(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};n.href&&(s.href=n.href),ky(n.style)||(s.style=n.style),t.push(s)}return t}function $A(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||n.href||!ky(n.style))break;t-=1}return e.slice(0,t)}function NA(e,t){let n={},r=my(e,"fg"),s=my(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 my(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"):EA[s]??DA(s)}function DA(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(_A).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 _A(e){return e===0?0:55+e*40}function FA(e,t){return zd(e)===zd(t)}function zd(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function ky(e){return zd(e)===""}var LA=xA(import.meta.url),MA=/^CTRL_([A-Z])$/,jA="\x1B[6n",qA="\x1B[c",UA="\x1B[?u",BA={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
281
+ `,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:""},oa=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")Xd(i),this.sessions.delete(n);else return this.attachedTabId=n,i.scrollbackLines=0,Ty(i,r),this.getViewState(n);let o;try{o=this.createSession(t,n,r,s)}catch(a){throw this.recordActivity({taskId:t,tabId:n,sessionState:"failed",lastActivityAt:Date.now(),exitCode:null,error:a instanceof Error?a.message:String(a)}),a}return this.sessions.set(n,o),this.notifyActivity(o),this.attachedTabId=n,this.getViewState(n)}write(t){let n=this.getAttachedSession();!n||n.status!=="running"||(n.pty.write(t),(t.includes("\r")||t.includes(`
282
+ `))&&this.touchActivity(n))}writeKey(t){let n=WA(t);n!==null&&this.write(n)}hasRunningSession(t){return this.sessions.get(t)?.status==="running"}writeToSession(t,n){let r=this.sessions.get(t);if(!r||r.status!=="running")throw new Error(`Agent tab ${t} is not running.`);r.pty.write(n),this.touchActivity(r)}scrollViewport(t){let n=this.getAttachedSession();if(!n||t===0)return;let r=n.terminal.buffer.active.baseY;n.scrollbackLines=Math.max(0,Math.min(r,n.scrollbackLines-t))}resize(t){let n=this.getAttachedSession();n&&Ty(n,t)}detach(){this.attachedTabId=null}sessionTabIds(){return[...this.sessions.keys()]}getActivitySnapshots(){return[...this.activitySnapshots.values()]}setActivityEnabled(t){if(this.activityEnabled!==t&&(this.activityEnabled=t,!!t))for(let n of this.sessions.values())this.notifyActivity(n)}disposeSession(t){let n=this.sessions.get(t);n&&(Xd(n),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())Xd(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:VA(n),error:n.error,scrolledBack:n.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}getStartupBlocker(t,n){let r=this.sessions.get(t);if(!r)return null;let s=r.terminal.buffer.active,i=Array.from({length:r.terminal.rows},(o,a)=>s.getLine(s.baseY+a)?.translateToString(!0)??"").join(`
283
+ `);return cy(n,i)}createSession(t,n,r,s){let i=this.spawn??GA().spawn,o=gy(r),a=s??this.resolveSessionSpec(t,n),l=So({...this.env,...a.env??{}}),{executable:c,args:u}=HA(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:YA(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),zA(d,h),Jd(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),Jd(p.terminal,`\r
284
+ [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 WA(e){if(e.length===1)return e;let t=BA[e];if(t!==void 0)return t;let n=MA.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function Ty(e,t){KA(e.pty,t),yy(e.terminal,t),e.screenDirty=!0}function VA(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=wy(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function Xd(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function KA(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function GA(){return LA("node-pty")}function HA(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[Io(t[0],n),...t.slice(1)].map(by).join(" ")}; exec ${by(e)} -l`;return{executable:e,args:["-lc",s]}}function by(e){return`'${e.replaceAll("'","'\\''")}'`}function YA(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 zA(e,t){for(let n=0;n<Qd(t,jA);n+=1)e.write("\x1B[1;1R");for(let n=0;n<Qd(t,qA);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<Qd(t,UA);n+=1)e.write("\x1B[?0u")}function Qd(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 aa=Pt,eE=16,tE=250;async function Sy(e){let t=Le(e.paths);await iE(t,e.paths,e.spawnDaemon);let n=await Ny(t.socketPath),r=new Zd(n,e);return await r.ready(),r}async function Iy(e,t={}){let n=Le(e);await XA(e.runtimeDir,{recursive:!0}),await Bs(n.socketPath,{force:!0});let r=new eu(e,t),s=JA(i=>r.handleConnection(i));try{await cE(s,n.socketPath),await r.start(),await QA(n.pidPath,String(process.pid),"utf8"),await pe.appendLogBestEffort(e,{level:"info",component:"daemon",event:"started",message:`PTY daemon started with protocol ${aa}.`,details:{pid:process.pid,protocolVersion:aa}}),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 pe.appendLogBestEffort(e,{level:"error",component:"daemon",event:"failed",message:i instanceof Error?i.message:String(i),details:{pid:process.pid}}),i}finally{r.closeClients(),s.listening&&await new Promise(i=>s.close(()=>i())),await pe.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 Bs(n.socketPath,{force:!0}),await Bs(n.pidPath,{force:!0}),await r.stop(),r.disposeAll()}}async function vy(e){let t=Le(e);return await Ey(t.socketPath)?(await lE(t.socketPath),!0):!1}var Zd=class{constructor(t,n){this.socket=t;this.options=n,this.activityEnabled=n.activityEnabled??!1,this.tasksChangedHandler=n.onTasksChanged,this.openFileHandler=n.onOpenFile,t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>{this.closed||(this.closed=!0,this.rejectAll(new Error("Craig PTY daemon connection closed.")),this.failRunningActivities("Craig PTY daemon connection closed."))})}socket;managesPullRequestSync=!0;nextRequestId=1;pending=new Map;viewCache=new Map;activityCache=new Map;activityRevisionByTabId=new Map;activityRevision=0;attachedTabId=null;viewedTabId=null;subscribedTabId=null;activityEnabled;pullRequestPollView={selectedTaskId:null,reviewVisible:!1};tasksChangedHandler;openFileHandler;buffer="";closed=!1;protocolVersion=aa;options;async ready(){let t=await this.send({type:"ping"});if(!Ay(t.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch.");this.protocolVersion=t.protocolVersion,this.protocolVersion<=8&&await this.send({type:"setViewUpdateMode",mode:"incremental"}),await this.send({type:"setActivityEnabled",enabled:this.activityEnabled}),this.protocolVersion>=10&&await this.send({type:"subscribeNavigation"}),this.activityEnabled&&await this.refreshActivitySnapshots()}async ensureSession(t,n,r){let s=await this.send({type:"ensureSession",taskId:t,tabId:n,size:r,spec:this.options.resolveSessionSpec?.(t,n)??{cwd:this.options.workspaceRoot,command:[]}});this.attachedTabId=n,this.viewedTabId=n,this.subscribedTabId=n;let i=s.view??{status:"idle",rows:[],error:null};return this.viewCache.set(n,i),i}async hydrateSessions(t){for(let n of t)try{let r=await this.send({type:"hydrateSession",tabId:n});r.view&&(this.viewCache.set(n,r.view),r.view.status==="idle"&&pe.appendLogBestEffort(this.options.paths,{level:"debug",component:"pty",event:"hydration.missing",message:"No live PTY session was found for the persisted tab.",tabId:n}))}catch(r){let s=r instanceof Error?r.message:String(r);this.viewCache.set(n,{status:"failed",rows:[],error:s})}this.activityEnabled&&await this.refreshActivitySnapshots()}async pruneStale(t){await this.send({type:"pruneStale",keepTabIds:t})}write(t){this.send({type:"write",input:t}).catch(()=>{})}writeKey(t){this.send({type:"writeKey",key:t}).catch(()=>{})}scrollViewport(t){let n=this.attachedTabId;this.send({type:"scrollViewport",lines:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}resize(t){let n=this.attachedTabId;this.send({type:"resize",size:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}detach(){this.attachedTabId=null,this.send({type:"detach"}).catch(()=>{})}setViewedTab(t){this.closed||(this.viewedTabId=t,this.subscribeToView(t))}setActivityEnabled(t){if(!(this.closed||this.activityEnabled===t)){if(this.activityEnabled=t,!t){for(let n of[...this.activityCache.keys()])this.removeCachedActivity(n);this.send({type:"setActivityEnabled",enabled:t}).catch(()=>{});return}this.send({type:"setActivityEnabled",enabled:t}).then(()=>this.refreshActivitySnapshots(!0)).catch(()=>{})}}setPullRequestPollView(t){this.closed||this.pullRequestPollView.selectedTaskId===t.selectedTaskId&&this.pullRequestPollView.reviewVisible===t.reviewVisible||(this.pullRequestPollView=t,this.send({type:"setPullRequestPollView",view:t}).catch(()=>{}))}setTasksChangedHandler(t){this.tasksChangedHandler=t}setOpenFileHandler(t){this.openFileHandler=t}disposeSession(t){this.viewCache.delete(t),this.removeCachedActivity(t),this.attachedTabId===t&&(this.attachedTabId=null),this.send({type:"disposeSession",tabId:t}).catch(()=>{})}disposeAll(){this.attachedTabId=null,!this.closed&&(this.socket.end(),this.closed=!0)}getViewState(t){return t?this.viewCache.get(t)??{status:"idle",rows:[],error:null,scrolledBack:!1}:{status:"idle",rows:[],error:null,scrolledBack:!1}}getActivitySnapshots(){return[...this.activityCache.values()]}async requestShutdown(){await this.send({type:"shutdown"})}async send(t){if(this.closed)throw new Error("Craig PTY daemon connection is closed.");let n=this.nextRequestId;this.nextRequestId+=1;let r={...t,id:n},s=new Promise((o,a)=>{this.pending.set(n,{resolve:o,reject:a})});if(this.socket.destroyed)throw this.pending.delete(n),new Error("Craig PTY daemon connection is closed.");this.socket.write(`${JSON.stringify(r)}
283
285
  `);let i=await s;if(!i.ok)throw new Error(i.error);return i}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
284
286
  `);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
285
- `)}}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=JA(r,n.patch),i=r.rows.slice(0,n.patch.rowCount);for(let o of n.patch.rows)i[o.index]=o.row;this.viewCache.set(n.tabId,{status:n.patch.status,rows:i,error:n.patch.error,scrolledBack:n.patch.scrolledBack}),this.viewedTabId===n.tabId&&this.options.onUpdate?.(s?{tabId:n.tabId,kind:"full"}:{tabId:n.tabId,kind:"rows",rowIndices:n.patch.rows.map(o=>o.index)})}n.type==="activity"&&(this.recordCachedActivity(n.snapshot),this.options.onActivity?.(n.snapshot)),n.type==="activityRemoved"&&this.removeCachedActivity(n.tabId),n.type==="tasksChanged"&&this.tasksChangedHandler?.(n.taskIds),n.type==="openFile"&&this.openFileHandler?.(n.path)}subscribeToView(t){this.closed||this.subscribedTabId===t||(this.subscribedTabId=t,this.send({type:"subscribeView",tabId:t}).then(n=>{t&&n.view&&this.viewCache.set(t,n.view),this.viewedTabId===t&&this.subscribedTabId===t&&this.notifyFullUpdate(t)}).catch(()=>{this.subscribedTabId===t&&(this.subscribedTabId=null)}))}rejectAll(t){for(let n of this.pending.values())n.reject(t);this.pending.clear()}notifyFullUpdate(t){t&&this.options.onUpdate?.({tabId:t,kind:"full"})}replaceActivityCache(t,n){let r=new Map;for(let[s,i]of this.activityRevisionByTabId)i>n&&r.set(s,this.activityCache.get(s)??null);this.activityCache.clear();for(let s of t)this.activityCache.set(s.tabId,s);for(let[s,i]of r)i?this.activityCache.set(s,i):this.activityCache.delete(s)}async refreshActivitySnapshots(t=!1){let n=this.activityRevision,r=await this.send({type:"getActivitySnapshots"});if(this.replaceActivityCache(r.activities??[],n),t)for(let s of this.activityCache.values())this.options.onActivity?.(s)}recordCachedActivity(t){this.activityRevision+=1,this.activityRevisionByTabId.set(t.tabId,this.activityRevision),this.activityCache.set(t.tabId,t)}removeCachedActivity(t){this.activityRevision+=1,this.activityRevisionByTabId.set(t,this.activityRevision),this.activityCache.delete(t),this.options.onActivityRemoved?.(t)}failRunningActivities(t){for(let n of this.activityCache.values()){if(n.sessionState!=="running")continue;let r={...n,sessionState:"failed",lastActivityAt:Date.now(),error:t};this.recordCachedActivity(r),this.options.onActivity?.(r)}}},Jd=class{onShutdown=null;clients=new Set;subscriptions=new Map;updateTimers=new Map;activityTimers=new Map;pendingActivities=new Map;runtime;paths;orchestrationSupervisor=null;orchestrationSupervisorStartup=null;pullRequestSyncSupervisor=null;pullRequestEventReconciliationEnabled=!1;pullRequestSyncOptions;attachedTabId=null;constructor(t,n){this.paths=t,this.pullRequestSyncOptions=n.pullRequestSync;let r={...n};delete r.pullRequestSync,this.runtime=new ra({...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??(()=>un(this.paths,{agentObserver:{daemonAvailable:!0,getSnapshots:()=>this.runtime.getActivitySnapshots(),subscribe:()=>()=>{},close:()=>{}}}));this.pullRequestEventReconciliationEnabled=!!s,this.pullRequestSyncSupervisor=new ta(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 pe.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 Me(this.paths)).some(r=>r.state==="queued"||r.state==="delivering")||(await Si(this.paths)).some(r=>r.cleanupPending||!["succeeded","failed","cancelled","timed_out"].includes(r.state));(k.previews.isEnabled(t,"agentOrchestration")||n)&&await this.ensureOrchestrationSupervisor()}async stop(){await this.pullRequestSyncSupervisor?.stop(),this.pullRequestSyncSupervisor=null,this.pullRequestEventReconciliationEnabled=!1,this.updateRuntimeActivityEnabled(),await this.orchestrationSupervisor?.stop(),this.orchestrationSupervisor=null}handleConnection(t){let n="";this.clients.add(t),this.subscriptions.set(t,{activityEnabled:!1,tabId:null,view:null,rowKeys:[],pullRequestPollView:{selectedTaskId:null,reviewVisible:!1},navigationEnabled:!1}),t.setEncoding("utf8"),t.on("data",s=>{n+=String(s);let i=n.indexOf(`
287
+ `)}}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=sE(r,n.patch),i=r.rows.slice(0,n.patch.rowCount);for(let o of n.patch.rows)i[o.index]=o.row;this.viewCache.set(n.tabId,{status:n.patch.status,rows:i,error:n.patch.error,scrolledBack:n.patch.scrolledBack}),this.viewedTabId===n.tabId&&this.options.onUpdate?.(s?{tabId:n.tabId,kind:"full"}:{tabId:n.tabId,kind:"rows",rowIndices:n.patch.rows.map(o=>o.index)})}n.type==="activity"&&(this.recordCachedActivity(n.snapshot),this.options.onActivity?.(n.snapshot)),n.type==="activityRemoved"&&this.removeCachedActivity(n.tabId),n.type==="tasksChanged"&&this.tasksChangedHandler?.(n.taskIds),n.type==="openFile"&&this.openFileHandler?.(n.path)}subscribeToView(t){this.closed||this.subscribedTabId===t||(this.subscribedTabId=t,this.send({type:"subscribeView",tabId:t}).then(n=>{t&&n.view&&this.viewCache.set(t,n.view),this.viewedTabId===t&&this.subscribedTabId===t&&this.notifyFullUpdate(t)}).catch(()=>{this.subscribedTabId===t&&(this.subscribedTabId=null)}))}rejectAll(t){for(let n of this.pending.values())n.reject(t);this.pending.clear()}notifyFullUpdate(t){t&&this.options.onUpdate?.({tabId:t,kind:"full"})}replaceActivityCache(t,n){let r=new Map;for(let[s,i]of this.activityRevisionByTabId)i>n&&r.set(s,this.activityCache.get(s)??null);this.activityCache.clear();for(let s of t)this.activityCache.set(s.tabId,s);for(let[s,i]of r)i?this.activityCache.set(s,i):this.activityCache.delete(s)}async refreshActivitySnapshots(t=!1){let n=this.activityRevision,r=await this.send({type:"getActivitySnapshots"});if(this.replaceActivityCache(r.activities??[],n),t)for(let s of this.activityCache.values())this.options.onActivity?.(s)}recordCachedActivity(t){this.activityRevision+=1,this.activityRevisionByTabId.set(t.tabId,this.activityRevision),this.activityCache.set(t.tabId,t)}removeCachedActivity(t){this.activityRevision+=1,this.activityRevisionByTabId.set(t,this.activityRevision),this.activityCache.delete(t),this.options.onActivityRemoved?.(t)}failRunningActivities(t){for(let n of this.activityCache.values()){if(n.sessionState!=="running")continue;let r={...n,sessionState:"failed",lastActivityAt:Date.now(),error:t};this.recordCachedActivity(r),this.options.onActivity?.(r)}}},eu=class{onShutdown=null;clients=new Set;subscriptions=new Map;updateTimers=new Map;activityTimers=new Map;pendingActivities=new Map;runtime;paths;orchestrationSupervisor=null;orchestrationSupervisorStartup=null;pullRequestSyncSupervisor=null;pullRequestEventReconciliationEnabled=!1;pullRequestSyncOptions;attachedTabId=null;constructor(t,n){this.paths=t,this.pullRequestSyncOptions=n.pullRequestSync;let r={...n};delete r.pullRequestSync,this.runtime=new oa({...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??(()=>un(this.paths,{agentObserver:{daemonAvailable:!0,getSnapshots:()=>this.runtime.getActivitySnapshots(),subscribe:()=>()=>{},close:()=>{}}}));this.pullRequestEventReconciliationEnabled=!!s,this.pullRequestSyncSupervisor=new sa(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 pe.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 je(this.paths)).some(r=>r.state==="queued"||r.state==="delivering")||(await Ci(this.paths)).some(r=>r.cleanupPending||!["succeeded","failed","cancelled","timed_out"].includes(r.state));(k.previews.isEnabled(t,"agentOrchestration")||n)&&await this.ensureOrchestrationSupervisor()}async stop(){await this.pullRequestSyncSupervisor?.stop(),this.pullRequestSyncSupervisor=null,this.pullRequestEventReconciliationEnabled=!1,this.updateRuntimeActivityEnabled(),await this.orchestrationSupervisor?.stop(),this.orchestrationSupervisor=null}handleConnection(t){let n="";this.clients.add(t),this.subscriptions.set(t,{activityEnabled:!1,tabId:null,view:null,rowKeys:[],pullRequestPollView:{selectedTaskId:null,reviewVisible:!1},navigationEnabled:!1}),t.setEncoding("utf8"),t.on("data",s=>{n+=String(s);let i=n.indexOf(`
286
288
  `);for(;i!==-1;){let o=n.slice(0,i);n=n.slice(i+1),this.handleLine(t,o),i=n.indexOf(`
287
- `)}});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{gn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);gn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion:sa,sessionCount:this.runtime.sessionTabIds().length}:{},...r.type==="getActivitySnapshots"?{activities:this.runtime.getActivitySnapshots()}:{},...typeof s=="number"?{deliveredCount:s}:s?{view:s}:{}})}catch(s){let i=s instanceof Error?s.message:String(s);gn(t,{id:r.id,ok:!1,error:i})}}async handleRequest(t,n){switch(n.type){case"ping":return null;case"ensureSession":{let r=this.runtime.hasRunningSession(n.tabId),s=this.runtime.ensureSession(n.taskId,n.tabId,n.size,n.spec);return r||this.log({level:"info",component:"pty",event:"spawned",message:"PTY session spawned.",taskId:n.taskId,tabId:n.tabId}),this.attachedTabId=n.tabId,this.subscribe(t,n.tabId,s)}case"hydrateSession":return this.runtime.getViewState(n.tabId);case"write":return this.runtime.write(n.input),null;case"writeKey":return this.runtime.writeKey(n.key),null;case"scrollViewport":return this.runtime.scrollViewport(n.lines),this.runtime.getViewState(this.attachedTabId);case"resize":return this.runtime.resize(n.size),this.runtime.getViewState(this.attachedTabId);case"detach":return this.attachedTabId&&this.log({level:"debug",component:"pty",event:"detached",message:"Client detached from PTY session.",tabId:this.attachedTabId}),this.runtime.detach(),this.attachedTabId=null,null;case"disposeSession":return this.log({level:"info",component:"pty",event:"disposed",message:"PTY session disposed because its tab was closed.",tabId:n.tabId,details:{reason:"tab_closed"}}),this.runtime.disposeSession(n.tabId),this.attachedTabId===n.tabId&&(this.attachedTabId=null),null;case"setViewUpdateMode":return this.runtime.getViewState(this.attachedTabId);case"setActivityEnabled":return this.setActivityEnabled(t,n.enabled),null;case"subscribeView":return this.subscribe(t,n.tabId,this.runtime.getViewState(n.tabId));case"pruneStale":{let r=new Set(n.keepTabIds),s=new Set([...this.runtime.sessionTabIds(),...this.runtime.getActivitySnapshots().map(i=>i.tabId)]);for(let i of s)r.has(i)||(this.log({level:"info",component:"pty",event:"disposed",message:"PTY session disposed because its tab is no longer active.",tabId:i,details:{reason:"stale_tab"}}),this.runtime.disposeSession(i),this.attachedTabId===i&&(this.attachedTabId=null));return null}case"getViewState":return this.runtime.getViewState(n.tabId);case"getActivitySnapshots":return null;case"setPullRequestPollView":return this.setPullRequestPollView(t,n.view),null;case"subscribeNavigation":{let r=this.subscriptions.get(t);return r&&this.subscriptions.set(t,{...r,navigationEnabled:!0}),null}case"openFile":return this.broadcastOpenFile(t,n.path);case"wakeOrchestration":return await this.ensureOrchestrationSupervisor(),this.orchestrationSupervisor.wake().catch(r=>pe.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor wake",message:r instanceof Error?r.message:String(r)})),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 rE(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(Xd),pullRequestPollView:s?.pullRequestPollView??{selectedTaskId:null,reviewVisible:!1},navigationEnabled:s?.navigationEnabled??!1}),r}setActivityEnabled(t,n){let r=this.subscriptions.get(t);if(!r)return;this.subscriptions.set(t,{...r,activityEnabled:n});let s=this.hasActivitySubscribers();this.updateRuntimeActivityEnabled(),s||this.clearPendingActivityBroadcasts()}setPullRequestPollView(t,n){let r=this.subscriptions.get(t);r&&(this.subscriptions.set(t,{...r,pullRequestPollView:n}),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()))}getPullRequestPollView(){let t=[...this.subscriptions.values()].map(n=>n.pullRequestPollView);return t.find(n=>n.selectedTaskId&&n.reviewVisible)??t.find(n=>n.selectedTaskId)??{selectedTaskId:null,reviewVisible:!1}}broadcastTasksChanged(t){for(let n of this.clients)gn(n,{type:"tasksChanged",taskIds:t})}broadcastOpenFile(t,n){let r=0;for(let[s,i]of this.subscriptions)s===t||!i.navigationEnabled||(gn(s,{type:"openFile",path:n}),r+=1);return r}handleRuntimeUpdate(t){this.scheduleBroadcastUpdate(t)}handleActivityUpdate(t){if(t.sessionState!=="running"&&this.log({level:t.sessionState==="failed"||t.exitCode!==0?"error":"info",component:"pty",event:"exited",message:t.sessionState==="failed"?"PTY session failed.":"PTY process exited.",taskId:t.taskId,tabId:t.tabId,details:{sessionState:t.sessionState,exitCode:t.exitCode,error:t.error}}),this.pullRequestSyncSupervisor?.notifyActivity(t),!!this.hasActivitySubscribers()){if(this.pendingActivities.set(t.tabId,t),t.sessionState!=="running"){let n=this.activityTimers.get(t.tabId);n&&(clearTimeout(n),this.activityTimers.delete(t.tabId)),this.broadcastActivity(t.tabId);return}this.activityTimers.has(t.tabId)||this.activityTimers.set(t.tabId,setTimeout(()=>{this.activityTimers.delete(t.tabId),this.broadcastActivity(t.tabId)},HA))}}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&&gn(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&&gn(r,{type:"activity",snapshot:n})}}hasActivitySubscribers(){return[...this.subscriptions.values()].some(t=>t.activityEnabled)}clearPendingActivityBroadcasts(){for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear()}async ensureOrchestrationSupervisor(){this.orchestrationSupervisor||(this.orchestrationSupervisorStartup||(this.orchestrationSupervisorStartup=this.startOrchestrationSupervisor().finally(()=>{this.orchestrationSupervisorStartup=null})),this.orchestrationSupervisor=await this.orchestrationSupervisorStartup,this.updateRuntimeActivityEnabled())}async startOrchestrationSupervisor(){let t=new Zo(this.paths,this.runtime,{onError:n=>pe.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor",message:n instanceof Error?n.message:String(n)})});try{return await t.start({deferReconciliation:!0}),await pe.appendLogBestEffort(this.paths,{level:"info",component:"orchestration",event:"supervisor.started",message:"Orchestration supervisor is ready."}),t}catch(n){throw await pe.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor startup",message:n instanceof Error?n.message:String(n)}),n}}updateRuntimeActivityEnabled(){this.runtime.setActivityEnabled(this.orchestrationSupervisor!==null||this.pullRequestEventReconciliationEnabled||this.hasActivitySubscribers())}log(t){pe.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)},GA))}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=YA(s,n),o=zA(s.view,n);s.view=n,s.rowKeys=n.rows.map(Xd),(i.rows.length>0||o)&&gn(r,{type:"update",tabId:t,patch:i})}}};function YA(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==Xd(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 zA(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 JA(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function Xd(e){return JSON.stringify(e)}async function XA(e,t,n){if(await QA(e.socketPath,1e3))return;if(await by(e.socketPath)){let i=await Ry(e.socketPath).catch(()=>null),o=i?.ok?i.protocolVersion??"unknown":"unknown",a=i?.ok?i.sessionCount??"unknown":"unknown";throw await pe.appendLogBestEffort(t,{level:"warn",component:"daemon",event:"upgrade.blocked",message:`Left incompatible protocol ${o} daemon running to preserve possible live PTYs.`,details:{protocolVersion:o,sessionCount:a}}),new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly; this client will not replace a live workspace daemon.")}await ZA(e,t),Po(t,n);let r=Date.now();for(;Date.now()-r<5e3;){if(await ky(e.socketPath))return;await Iy(50)}let s=await hy(KA.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${s?`
288
- ${s.slice(-2e3)}`:""}`)}async function ky(e){let t=await Ry(e).catch(()=>null);return t?.ok===!0&&Ty(t.protocolVersion)}function Ty(e){return en(e)}async function QA(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await ky(e))return!0;await Iy(50)}return!1}async function ZA(e,t){let n=await hy(e.pidPath,"utf8").catch(()=>null);if(n){let r=Number(n.trim());if(Number.isInteger(r)&&r>0&&nE(r))return;await pe.appendLogBestEffort(t,{level:"warn",component:"daemon",event:"previous_exit.unclean",message:"Found stale daemon state from a process that is no longer running.",details:{previousPid:Number.isInteger(r)?r:null}})}await Ms(e.socketPath,{force:!0}),await Ms(e.pidPath,{force:!0})}async function by(e){let t=await Sy(e).catch(()=>null);return t?(t.end(),!0):!1}async function eE(e){await Py(e,{id:1,type:"shutdown"}).catch(()=>null)}async function Ry(e){return Py(e,{id:1,type:"ping"})}function Py(e,t){return new Promise((n,r)=>{let s=my(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)}
289
+ `)}});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{gn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);gn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion:aa,sessionCount:this.runtime.sessionTabIds().length}:{},...r.type==="getActivitySnapshots"?{activities:this.runtime.getActivitySnapshots()}:{},...typeof s=="number"?{deliveredCount:s}:s?{view:s}:{}})}catch(s){let i=s instanceof Error?s.message:String(s);gn(t,{id:r.id,ok:!1,error:i})}}async handleRequest(t,n){switch(n.type){case"ping":return null;case"ensureSession":{let r=this.runtime.hasRunningSession(n.tabId),s=this.runtime.ensureSession(n.taskId,n.tabId,n.size,n.spec);return r||this.log({level:"info",component:"pty",event:"spawned",message:"PTY session spawned.",taskId:n.taskId,tabId:n.tabId}),this.attachedTabId=n.tabId,this.subscribe(t,n.tabId,s)}case"hydrateSession":return this.runtime.getViewState(n.tabId);case"write":return this.runtime.write(n.input),null;case"writeKey":return this.runtime.writeKey(n.key),null;case"scrollViewport":return this.runtime.scrollViewport(n.lines),this.runtime.getViewState(this.attachedTabId);case"resize":return this.runtime.resize(n.size),this.runtime.getViewState(this.attachedTabId);case"detach":return this.attachedTabId&&this.log({level:"debug",component:"pty",event:"detached",message:"Client detached from PTY session.",tabId:this.attachedTabId}),this.runtime.detach(),this.attachedTabId=null,null;case"disposeSession":return this.log({level:"info",component:"pty",event:"disposed",message:"PTY session disposed because its tab was closed.",tabId:n.tabId,details:{reason:"tab_closed"}}),this.runtime.disposeSession(n.tabId),this.attachedTabId===n.tabId&&(this.attachedTabId=null),null;case"setViewUpdateMode":return this.runtime.getViewState(this.attachedTabId);case"setActivityEnabled":return this.setActivityEnabled(t,n.enabled),null;case"subscribeView":return this.subscribe(t,n.tabId,this.runtime.getViewState(n.tabId));case"pruneStale":{let r=new Set(n.keepTabIds),s=new Set([...this.runtime.sessionTabIds(),...this.runtime.getActivitySnapshots().map(i=>i.tabId)]);for(let i of s)r.has(i)||(this.log({level:"info",component:"pty",event:"disposed",message:"PTY session disposed because its tab is no longer active.",tabId:i,details:{reason:"stale_tab"}}),this.runtime.disposeSession(i),this.attachedTabId===i&&(this.attachedTabId=null));return null}case"getViewState":return this.runtime.getViewState(n.tabId);case"getActivitySnapshots":return null;case"setPullRequestPollView":return this.setPullRequestPollView(t,n.view),null;case"subscribeNavigation":{let r=this.subscriptions.get(t);return r&&this.subscriptions.set(t,{...r,navigationEnabled:!0}),null}case"openFile":return this.broadcastOpenFile(t,n.path);case"wakeOrchestration":return await this.ensureOrchestrationSupervisor(),this.orchestrationSupervisor.wake().catch(r=>pe.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor wake",message:r instanceof Error?r.message:String(r)})),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 uE(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(tu),pullRequestPollView:s?.pullRequestPollView??{selectedTaskId:null,reviewVisible:!1},navigationEnabled:s?.navigationEnabled??!1}),r}setActivityEnabled(t,n){let r=this.subscriptions.get(t);if(!r)return;this.subscriptions.set(t,{...r,activityEnabled:n});let s=this.hasActivitySubscribers();this.updateRuntimeActivityEnabled(),s||this.clearPendingActivityBroadcasts()}setPullRequestPollView(t,n){let r=this.subscriptions.get(t);r&&(this.subscriptions.set(t,{...r,pullRequestPollView:n}),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()))}getPullRequestPollView(){let t=[...this.subscriptions.values()].map(n=>n.pullRequestPollView);return t.find(n=>n.selectedTaskId&&n.reviewVisible)??t.find(n=>n.selectedTaskId)??{selectedTaskId:null,reviewVisible:!1}}broadcastTasksChanged(t){for(let n of this.clients)gn(n,{type:"tasksChanged",taskIds:t})}broadcastOpenFile(t,n){let r=0;for(let[s,i]of this.subscriptions)s===t||!i.navigationEnabled||(gn(s,{type:"openFile",path:n}),r+=1);return r}handleRuntimeUpdate(t){this.scheduleBroadcastUpdate(t)}handleActivityUpdate(t){if(t.sessionState!=="running"&&this.log({level:t.sessionState==="failed"||t.exitCode!==0?"error":"info",component:"pty",event:"exited",message:t.sessionState==="failed"?"PTY session failed.":"PTY process exited.",taskId:t.taskId,tabId:t.tabId,details:{sessionState:t.sessionState,exitCode:t.exitCode,error:t.error}}),this.pullRequestSyncSupervisor?.notifyActivity(t),!!this.hasActivitySubscribers()){if(this.pendingActivities.set(t.tabId,t),t.sessionState!=="running"){let n=this.activityTimers.get(t.tabId);n&&(clearTimeout(n),this.activityTimers.delete(t.tabId)),this.broadcastActivity(t.tabId);return}this.activityTimers.has(t.tabId)||this.activityTimers.set(t.tabId,setTimeout(()=>{this.activityTimers.delete(t.tabId),this.broadcastActivity(t.tabId)},tE))}}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&&gn(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&&gn(r,{type:"activity",snapshot:n})}}hasActivitySubscribers(){return[...this.subscriptions.values()].some(t=>t.activityEnabled)}clearPendingActivityBroadcasts(){for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear()}async ensureOrchestrationSupervisor(){this.orchestrationSupervisor||(this.orchestrationSupervisorStartup||(this.orchestrationSupervisorStartup=this.startOrchestrationSupervisor().finally(()=>{this.orchestrationSupervisorStartup=null})),this.orchestrationSupervisor=await this.orchestrationSupervisorStartup,this.updateRuntimeActivityEnabled())}async startOrchestrationSupervisor(){let t=new na(this.paths,this.runtime,{onError:n=>pe.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor",message:n instanceof Error?n.message:String(n)})});try{return await t.start({deferReconciliation:!0}),await pe.appendLogBestEffort(this.paths,{level:"info",component:"orchestration",event:"supervisor.started",message:"Orchestration supervisor is ready."}),t}catch(n){throw await pe.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor startup",message:n instanceof Error?n.message:String(n)}),n}}updateRuntimeActivityEnabled(){this.runtime.setActivityEnabled(this.orchestrationSupervisor!==null||this.pullRequestEventReconciliationEnabled||this.hasActivitySubscribers())}log(t){pe.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)},eE))}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=nE(s,n),o=rE(s.view,n);s.view=n,s.rowKeys=n.rows.map(tu),(i.rows.length>0||o)&&gn(r,{type:"update",tabId:t,patch:i})}}};function nE(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==tu(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 rE(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 sE(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function tu(e){return JSON.stringify(e)}async function iE(e,t,n){if(await oE(e.socketPath,1e3))return;if(await Ey(e.socketPath)){let i=await Oy(e.socketPath).catch(()=>null),o=i?.ok?i.protocolVersion??"unknown":"unknown",a=i?.ok?i.sessionCount??"unknown":"unknown";throw await pe.appendLogBestEffort(t,{level:"warn",component:"daemon",event:"upgrade.blocked",message:`Left incompatible protocol ${o} daemon running to preserve possible live PTYs.`,details:{protocolVersion:o,sessionCount:a}}),new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly; this client will not replace a live workspace daemon.")}await aE(e,t),vo(t,n);let r=Date.now();for(;Date.now()-r<5e3;){if(await Cy(e.socketPath))return;await Dy(50)}let s=await Py(ZA.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${s?`
290
+ ${s.slice(-2e3)}`:""}`)}async function Cy(e){let t=await Oy(e).catch(()=>null);return t?.ok===!0&&Ay(t.protocolVersion)}function Ay(e){return en(e)}async function oE(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await Cy(e))return!0;await Dy(50)}return!1}async function aE(e,t){let n=await Py(e.pidPath,"utf8").catch(()=>null);if(n){let r=Number(n.trim());if(Number.isInteger(r)&&r>0&&dE(r))return;await pe.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 Bs(e.socketPath,{force:!0}),await Bs(e.pidPath,{force:!0})}async function Ey(e){let t=await Ny(e).catch(()=>null);return t?(t.end(),!0):!1}async function lE(e){await $y(e,{id:1,type:"shutdown"}).catch(()=>null)}async function Oy(e){return $y(e,{id:1,type:"ping"})}function $y(e,t){return new Promise((n,r)=>{let s=Ry(e),i="",o=setTimeout(()=>{s.destroy(),r(new Error("Craig PTY daemon request timed out."))},500),a=()=>clearTimeout(o);s.setEncoding("utf8"),s.once("connect",()=>s.write(`${JSON.stringify(t)}
289
291
  `)),s.once("error",l=>{a(),r(l)}),s.on("data",l=>{i+=String(l);let c=i.indexOf(`
290
- `);if(c===-1)return;let d=i.slice(0,c);a(),s.end();try{n(JSON.parse(d))}catch(u){r(u instanceof Error?u:new Error(String(u)))}}),s.once("close",()=>a())})}function Sy(e){return new Promise((t,n)=>{let r=my(e);r.once("connect",()=>t(r)),r.once("error",n)})}function tE(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,n)})}function gn(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
291
- `)}catch{}}function nE(e){try{return process.kill(e,0),!0}catch{return!1}}function Iy(e){return new Promise(t=>setTimeout(t,e))}function rE(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var Cy=["Runners","Feature Previews","Logs","Help"],Ay=["piRunner","fileOpen","panelPolish"],Ey={agentOrchestration:"Agent orchestration",fileOpen:"Agent file opening",piRunner:"Pi coding agent runner",panelPolish:"Panel polish"};function Zd(e,t){return Qd(e).map(n=>{let r=k.runners.getProfile(n),s=e.runners?.[n]?.enabled!==!1,i=e.runners?.[n]?.path?.trim(),o=t.pathEdit?.runner===n?`${t.pathEdit.value}_`:i&&i.length>0?i:`default (${r.executable})`;return`${r.displayName} ${s?"enabled":"disabled"} ${o}`})}function Oy(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 $y(e=[]){let t=Ay.some(n=>!e.includes(n));return Cy.map((n,r)=>r===1&&t?`${n} \xB7 NEW`:n)}function Ny(e,t=[]){return kt.map(n=>{let r=k.previews.isEnabled(e,n),s=Ay.includes(n)&&!t.includes(n);return`${r?"[x]":"[ ]"} ${Ey[n]}${s?" \xB7 NEW":""}`})}function Dy(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function _y(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(Cy.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:ia(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"logs"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function xy(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(kt.length-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(!ia(n))return{kind:"noop",state:e};let r=kt[e.menuIndex]??kt[0],s=!k.previews.isEnabled(t,r);return{kind:"save-enabled",feature:r,enabled:s,state:{...e,message:`${Ey[r]} ${s?"enabled":"disabled"}.`}}}function Fy(e,t,n,r){if(e.pathEdit)return sE({...e,pathEdit:e.pathEdit},t,n);let s=Zd(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=Qd(t)[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:a,value:t.runners?.[a]?.path??""}}}}if(!ia(n))return{kind:"noop",state:e};let i=Qd(t)[e.menuIndex]??"codex",o=t.runners?.[i]?.enabled!==!1;return o&&r.length<=1?{kind:"render",state:{...e,message:"At least one runner must stay enabled."}}:{kind:"save-enabled",runner:i,enabled:!o,state:{...e,message:`${k.runners.getProfile(i).displayName} ${o?"disabled":"enabled"}.`}}}function Qd(e){return me.filter(t=>t!=="pi"||k.previews.isEnabled(e,"piRunner"))}function sE(e,t,n){if(n==="ESCAPE")return{kind:"render",state:vy({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(ia(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:r,path:s.length>0?s:null,state:vy({...e,message:s.length>0?`${k.runners.getProfile(r).displayName} executable saved.`:`${k.runners.getProfile(r).displayName} executable reset to default.`})}}return iE(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function vy(e){let t={...e};return delete t.pathEdit,t}function ia(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
292
- `}function iE(e){return e.length===1&&e>=" "&&e!==""}var oE=/^\d+\.\d+\.\d+$/;async function Ly(e,t={runCommand:K}){if(!oE.test(e))throw new Error(`Cannot install invalid Craig version: ${e}`);await t.runCommand("npm",["install","--global",`craig-cli@${e}`])}var eu=150,My=6;function jy(e,t,n,r){if(e.inputMode!=="terminal"&&e.focusedRegion!=="center"||e.terminal.scrolledBack||e.terminal.rows.length===0)return e;let i=t.find(a=>a.id===e.selectedTaskId)?.ptyTabs.find(a=>a.id===e.activeTab||e.activeTab==="agent"&&a.kind==="agent");if(i?.kind!=="agent")return e;let o=n.find(a=>a.tabId===i.id);return!o||Ye(i.id,n,r)!=="ready"||e.readAgentActivityAt[i.id]===o.lastActivityAt?e:{...e,readAgentActivityAt:{...e.readAgentActivityAt,[i.id]:o.lastActivityAt}}}function oa(e,t,n,r){return t.some(s=>e.includes(s.tabId)&&Ye(s.tabId,t,n)==="ready"&&s.lastActivityAt>(r[s.tabId]??-1))}function qy(e,t,n,r){let s=e.tasks.filter(o=>o.status!=="closed"&&o.status!=="merged"),i={workspaceCount:e.workspaces?.filter(o=>o.status==="active").length??e.repos.length,taskCount:s.length,workingAgents:0,readyAgents:0,attentionAgents:0,activityKnown:r};if(!r)return i;for(let o of s)for(let a of o.ptyTabs){if(a.kind!=="agent")continue;let l=bt(o,a.id,t,n);l==="working"&&i.workingAgents++,l==="ready"&&i.readyAgents++,l==="error"&&i.attentionAgents++}return i}import js from"node:path";function Uy(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 By="\u{F024B} ",Wy="\u{F0DCF} ",Vy="\u25CB",tu="\uEA64",Ky="\uEAFE",Gy="\uEBDA",nu="\u25CB",ru="\u25CF",su="\u2713",iu="\u2715";function Hy(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 la="empty",he={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function Xy(e,t,n){let r=cE(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=GE(t.tasks),d=pE(e,a),u=uE(e,a,d,n),p=u.find(y=>y.id===d)??u[0]??{id:"agent",label:"CODEX"},h=t.inspection?.taskId===a?.id?t.inspection:null,f=s?.name??"no repo",m=a?k.runners.getDisplayName(a.runner):k.runners.getDisplayName(e.selectedRunner);return{inputMode:e.inputMode,modalInput:e.taskPromptInput!==null||e.workspaceBrowser!==null,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,footerToast:e.footerToast,terminal:e.terminal,footerText:e.workspaceBrowser!==null?e.workspaceBrowser.query!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} Search: ${e.workspaceBrowser.query} \u2191\u2193 move Enter select Esc clear search`:`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up / search Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK [${e.taskPromptTarget?.name??s?.name??"no workspace"}] \xB7 ${k.runners.getDisplayName(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${k.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:Ds(e.selectedLeftItemId)?"n new task Enter attach X close task Esc pause ? help":e.selectedLeftItemId?.startsWith("workspace:")?"n new task Enter select X remove workspace Esc pause ? help":"n new task Enter select Esc pause ? help":e.focusedRegion==="center"?a===null?"n new task Tab tasks Esc pause ? help":d===V?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${k.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:js.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${js.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:m},leftTree:aE(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>HE(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:f,agent:m},centerTranscript:dE(d,e,s,a,e.workspaceBrowser,h,r),tabs:u,rightContext:KE(s,a),rightInspection:IE(e,a,h)}}function aE(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 lE(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=Mo(t.tasks,o.id);if(c.length===0)r.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:d,visualDepth:u}of $s(c)){let p=e.selectedLeftItemId===`task:${d.id}`,h=d.title.length>28?`${d.title.slice(0,25)}\u2026`:d.title,f={id:`task:${d.id}`,taskId:d.id,text:n?h:`${p?"\u25B8":"\u2022"} ${h}`,indent:u===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:rr(d,n.snapshots,n.now),activityAnimationFrame:n.animationFrame,unread:oa(d.ptyTabs.filter(y=>y.kind==="agent").map(y=>y.id),n.snapshots,n.now,e.readAgentActivityAt)}:{}},m=Zy(d);m&&(f.prBadge=m),r.push(f)}if(o.kind==="project"){let d=`new-task-workspace:${o.id}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Project Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}if(o.kind==="repo"){let d=`new-task:${o.primaryRepoId}`,u=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:u,focused:u&&e.focusedRegion==="tasks",muted:!u})}else{r.push({text:` Repos (${l.length})`,indent:0,muted:!0});for(let d of l.slice(0,6)){let u=t.repos.find(p=>p.id===d);r.push({text:` \xB7 ${u?.name??d}`,indent:0,muted:!0})}l.length>6&&r.push({text:` \xB7 ${l.length-6} more`,indent:0,muted:!0})}}let i=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&e.focusedRegion==="tasks"}),r}function lE(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=jo(r,o.id);if(l.length===0)e.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:u,visualDepth:p}of $s(l)){let h=t.selectedLeftItemId===`task:${u.id}`,f=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,m={id:`task:${u.id}`,taskId:u.id,text:s?f:`${h?"\u25B8":"\u2022"} ${f}`,indent:p===0?2:4,selected:h,focused:h&&t.focusedRegion==="tasks",...s?{activity:rr(u,s.snapshots,s.now),activityAnimationFrame:s.animationFrame,unread:oa(u.ptyTabs.filter(T=>T.kind==="agent").map(T=>T.id),s.snapshots,s.now,t.readAgentActivityAt)}:{}},y=Zy(u);y&&(m.prBadge=y),e.push(m)}let c=`new-task:${o.id}`,d=t.selectedLeftItemId===c;e.push({id:c,text:`+ New Task [${k.runners.getDisplayName(t.selectedRunner)}]`,indent:2,selected:d,focused:d&&t.focusedRegion==="tasks",muted:!d})}let i=t.selectedLeftItemId==="new-workspace";return e.push({text:"",muted:!0}),e.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&t.focusedRegion==="tasks"}),e}function cE(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 dE(e,t,n,r,s,i=null,o=null){if(s){let l=s.query?s.entries.filter(u=>u.name.toLowerCase().includes(s.query.toLowerCase())):s.entries,c=l.length===0?["No matching directories or git repos."]:l.map((u,p)=>{let h=p===s.selectedIndex?"\u25B8":" ",f=u.kind==="repo"?" [git repo]":"/";return`${h} ${u.name}${f}`}),d=s.query!==null?`Search: ${s.query}\u2588`:"";return gt(["Browse for a workspace to register.",s.cwd,...d?[d]:[],"",...c,"",s.error??"Use \u2191\u2193 to move, \u2192 or Enter to open, \u2190 to go up, Enter on a git repo to add it."])}if(!n)return gt(["No repos registered yet.","","Run `craig repo add <path>` in command mode, then reopen the shell."]);if(!r){let l=o?.kind==="project",c=l?o.name??"this workspace":n.name,d=l?"Project Task":"Task";return gt([`No tasks in ${c}.`,"",`Press n or choose + New ${d} to create one with ${k.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?gt([`${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."]):gt([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this plain task shell.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):e===V&&t.openInspectionKind==="file"?hE(r,i,t.fileScrollOffset):e===V&&t.openInspectionKind==="diff"?gE(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?gt(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):gt(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function uE(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:fE(o),...o.kind==="agent"&&r&&t?{activity:bt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame,unread:oa([o.id],r.snapshots,r.now,e.readAgentActivityAt)}:{}}))??[];if(!t)return[{id:la,label:"EMPTY",active:n===la,focused:e.focusedRegion==="center"&&n===la}];let i=e.openInspectionKind||n===V?[{id:V,label:mE(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function pE(e,t){return t?t.ptyTabs.some(n=>n.id===e.activeTab)||e.activeTab===V&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??V:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??V:la}function fE(e){return e.title.toUpperCase()}function mE(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?js.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function hE(e,t,n){if(!e)return gt(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return gt(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=Qy(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:""},...yE(r.lines,n,s)]}function gE(e,t,n){if(!e)return gt(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return gt(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=Qy(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:""},...wE(r.lines,n,s)]}function gt(e){return e.map(t=>({text:t}))}function yE(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:he.lineNumber}},{text:" \u2502 ",style:{fg:he.gutter}},...ou(i,n)],tone:"default"}})}function wE(e,t,n){let r=kE(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>TE(i,n))}function kE(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 TE(e,t){let n=Yy(e.oldNumber),r=Yy(e.newNumber),s=e.kind==="delete"?n:r,i=e.kind==="delete"?{bg:"2a1111",fallbackFg:he.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:he.diffAdd}:null,o=`${s} \u2502 ${e.text}`,a=i?RE(ou(e.text,t),i.bg,i.fallbackFg):ou(e.text,t),l=i?{fg:he.lineNumber,bg:i.bg}:{fg:he.lineNumber},c=i?{fg:he.gutter,bg:i.bg}:{fg:he.gutter};return{text:o,segments:[{text:s,style:l},{text:" \u2502 ",style:c},...a],fullBleed:i!==null}}function Yy(e){return e===null?" ":String(e).padStart(4," ")}function Qy(e){let t=js.extname(e).toLowerCase();return[".ts",".tsx",".js",".jsx",".mjs",".cjs"].includes(t)?"javascript":[".json",".jsonc"].includes(t)?"json":[".md",".mdx"].includes(t)?"markdown":[".css",".scss"].includes(t)?"css":"plain"}function ou(e,t){return t==="diff"?bE(e):t==="markdown"?PE(e):t==="json"?au(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?au(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 bE(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:he.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:he.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:he.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:he.diffMeta}}]:[{text:e}]}function RE(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function PE(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:he.markup,bold:!0}}]:au(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function au(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:SE(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function SE(e){return e.startsWith("//")||e.startsWith("/*")?{fg:he.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:he.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:he.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:he.markup}:{fg:he.keyword}}function IE(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"?ew(t.repoTargets??[]):s?.pullRequest??(t?H(t):null),o=[vE(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=rw(e,t,n),l=lu(e,n),c=_E([{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,...BE(e,n)]}:{title:"",rows:[...o,...lu(e,n)]}}function vE(e,t){let n=e.inspectionMode,r=[{label:"FILES",active:n==="files"},{label:"REVIEW",active:n==="review"}],s=[];for(let l=0;l<r.length;l++){let c=r[l];l>0&&s.push({text:" "});let d=c.active?e.focusedRegion==="inspector"||e.focusedRegion==="actions"?"9ece6a":"7aa2f7":"565f89";s.push({text:c.label,style:{fg:d}})}let i=cu(t),o=du(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function zy(e){return[{text:" "},cu(e),{text:" "},du(e)]}function Zy(e){if(e.type==="project"&&e.repoTargets?.length){let n=ew(e.repoTargets);return n?zy(n):null}let t=H(e);return t?.number?zy(t):null}function ew(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=AE(n);return{number:-1,status:CE(n),draft:n.some(s=>s.draft),mergeable:n.length===t.length&&n.every(s=>s.mergeable),mergeStateStatus:null,reviewDecision:n.some(s=>s.reviewDecision==="CHANGES_REQUESTED")?"CHANGES_REQUESTED":n.some(s=>s.reviewDecision==="REVIEW_REQUIRED")?"REVIEW_REQUIRED":n.every(s=>s.reviewDecision==="APPROVED")?"APPROVED":null,requiredChecks:n.flatMap(s=>s.requiredChecks),aggregateReadiness:r}}function CE(e){return e.some(t=>t.status==="open")?"open":e.every(t=>t.status==="merged")?"merged":e.some(t=>t.status==="closed")?"closed":e[0]?.status??null}function AE(e){let t=e.map(n=>tw(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 cu(e){return!e||!e.number?{text:Vy,style:{fg:"565f89"}}:e.status==="merged"?{text:Ky,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:Gy,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:tu,style:{fg:"565f89"}}:{text:tu,style:{fg:"9ece6a"}}}function du(e){return e?.aggregateReadiness?Jy(e.aggregateReadiness):Jy(tw(e))}function Jy(e){return e==="failed"?{text:iu,style:{fg:"f7768e"}}:e==="pending"?{text:ru,style:{fg:"e0af68"}}:e==="success"?{text:su,style:{fg:"9ece6a"}}:{text:nu,style:{fg:"565f89"}}}function tw(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")?nw(e)?"failed":EE(e)?"success":"pending":"pending"}function EE(e){return!!(e.mergeable&&!e.draft&&!nw(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function nw(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function rw(e,t,n){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return OE(e,t,n);let r=H(t),s=ow("pr",t.branch,r??{number:null,url:null,baseBranch:null,headBranch:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,lastSyncedAt:null,requiredChecks:[],comments:[]}),i=t.prs.filter(o=>o!==r&&(o.status==="merged"||o.status==="closed")).length;return i>0&&s.push({id:"pr-history",text:`+ ${i} previous PR${i!==1?"s":""}`,muted:!0}),s}var aa=32;function OE(e,t,n){let r=[],s=uu(t,n),i=e.selectedProjectTargetId??s[0]?.repoId??null,o=s.some(c=>c.repoId===i)?i:s[0]?.repoId??null;if(s.length===0)return[{id:"project-review-empty",text:"No repos with changes or pull requests.",muted:!0}];for(let c of s){let d=o===c.repoId,u=e.focusedRegion==="inspector"&&d,p=c.repoId.startsWith("repo_")?c.repoId.slice(5):c.repoId;if(c.status!=="ready"){let f=c.failureReason?c.failureReason.slice(0,14):c.status,m=aa-f.length-1,y=p.length>m?p.slice(0,m-1)+"\u2026":p,T=aa-y.length-f.length;r.push({id:`project-review:${c.repoId}`,text:y+" ".repeat(Math.max(1,T))+f,selected:d,focused:u,muted:!0})}else{let h=cu(c.pullRequest),f=du(c.pullRequest),m=`${h.text} ${f.text}`,y=aa-m.length-1,T=p.length>y?p.slice(0,y-1)+"\u2026":p,R=aa-T.length-m.length,b=T+" ".repeat(Math.max(1,R));r.push({id:`project-review:${c.repoId}`,text:b+m,selected:d,focused:u,segments:[{text:b},{...h,text:h.text},{text:" "},{...f,text:f.text}]})}}let a=s.find(c=>c.repoId===o)??null,l=a?$E(t,a):[];return a?.status==="ready"&&(a.pullRequest.number||l.length>0)&&(r.push({id:"target-detail-spacer",text:""}),r.push(...ow("target",a.branch,a.pullRequest)),l.length>0&&r.push({id:"target-pr-history",text:`+ ${l.length} previous PR${l.length!==1?"s":""}`,muted:!0})),r}function uu(e,t){if(e?.type!=="project")return[];let n=new Set(t?.taskId===e.id?t.diffRows.map(r=>r.path.split("/")[0]).filter(r=>!!r):[]);return(e.repoTargets??[]).filter(r=>!!r.pullRequest.number||n.has(r.repoId)||sw(e,r).length>0)}function $E(e,t){return sw(e,t).filter(n=>n.number!==t.pullRequest.number&&(n.status==="merged"||n.status==="closed"))}function sw(e,t){let n=NE(t,e.prs);return n?e.prs.filter(r=>r.owner?.toLowerCase()===n.owner&&r.repo?.toLowerCase()===n.repo):[]}function NE(e,t){if(e.pullRequest.owner&&e.pullRequest.repo)return{owner:e.pullRequest.owner.toLowerCase(),repo:e.pullRequest.repo.toLowerCase()};let n=DE(e.pullRequest.url);if(n)return n;let r=t.filter(i=>e.pullRequest.number!==null&&i.number===e.pullRequest.number),s=r.length===1?r[0]:null;return s?.owner&&s.repo?{owner:s.owner.toLowerCase(),repo:s.repo.toLowerCase()}:null}function DE(e){let t=e?.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/\d+(?:[/?#].*)?$/i);return t?.[1]&&t[2]?{owner:t[1].toLowerCase(),repo:t[2].toLowerCase()}:null}function iw(e,t,n=null){return 3+rw(e,t,n).length+lu(e,n).length}function ow(e,t,n){let r=u=>`${e}-${u}`;if(!n.number)return[{id:r("no-pr"),text:t,muted:!0}];let s=[],i=`#${n.number}`;s.push(n.url?{id:r("pr-number"),text:`${i} Open in GitHub \u2197`,segments:[{text:i},{text:" Open in GitHub \u2197",style:{fg:"7aa2f7",underline:!0},href:n.url}]}:{id:r("pr-number"),text:i});let o=n.baseBranch??"?",a=n.headBranch??t;s.push({id:r("pr-branches"),text:`${o} \u2192 ${a}`,muted:!0});let l=xE(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:FE(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${aw(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(LE)):s.push({id:r("checks-none"),text:n.number?"No GitHub checks reported.":"No checks \u2014 sync after creating a PR.",muted:!0});let d=n.comments??[];return d.length>0&&(s.push({id:r("comments-spacer"),text:""}),s.push({id:r("comments-header"),text:`Review comments (${d.length})`}),s.push(...d.slice(-4).flatMap((u,p)=>ME(u,r(`comment:${p}`))))),s}function _E(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 xE(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function FE(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function aw(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 LE(e){let{icon:t,color:n}=qE(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," ")} ${UE(e.status)}`,color:n,muted:!1}}function ME(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${aw(e.createdAt)}`:"",s=jE(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 jE(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 qE(e){switch(e){case"success":return{icon:su,color:"9ece6a"};case"pending":return{icon:ru,color:"e0af68"};case"failed":return{icon:iu,color:"f7768e"};case"skipped":return{icon:nu,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function UE(e){return e==="success"?"passing":e==="failed"?"failing":e}function BE(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=pu(t.fileRows,e.collapsedFileTreePaths),s=e.fileSearchQuery,i=s?r.filter(l=>l.path.toLowerCase().includes(s.toLowerCase())):r,o=s!==null?[{id:"file-search",text:`Search: ${s}\u2588`,muted:!1}]:[],a=e.selectedFileTreePath??t.selectedFilePath;return[...o,...i.map(l=>{let c=l.kind==="file"?n.get(l.path):void 0,d=c==="A"?"9ece6a":c==="M"?"e0af68":c==="D"?"f7768e":c==="??"?"565f89":void 0,u=l.kind==="directory"?e.collapsedFileTreePaths.includes(l.path)?By:Wy:Uy(l.label),p=l.kind==="directory"?"7aa2f7":Hy(l.label),h=" ".repeat(l.depth),f=p?{text:u,style:{fg:p}}:{text:u},m=l.kind==="directory"?{text:l.label,style:{fg:"7aa2f7"}}:d?{text:l.label,style:{fg:d}}:{text:l.label},y=[{text:h},f,m];return{id:l.path,text:`${h}${u}${l.label}`,selected:l.path===a,focused:l.path===a&&e.focusedRegion==="inspector",segments:y}})]}function pu(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 lu(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(WE(t))return VE(e,t);let n=[];for(let r of["branch","staged","unstaged","untracked"]){let s=t.diffRows.filter(i=>i.group===r);s.length!==0&&(n.push({id:r,text:r.toUpperCase(),muted:!0}),n.push(...s.map(i=>lw(i,e,t))))}return n}function WE(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function VE(e,t){let n=[],r=[...new Set(t.diffRows.map(s=>s.path.split("/")[0]).filter(s=>typeof s=="string"&&s.length>0))].sort();for(let s of r){let i=t.diffRows.filter(a=>a.path.startsWith(`${s}/`)),o=s.startsWith("repo_")?s.slice(5):s;n.push({id:`repo-diff:${s}`,text:o,muted:!0});for(let a of["branch","staged","unstaged","untracked"]){let l=i.filter(c=>c.group===a);l.length!==0&&(n.push({id:`repo-diff:${s}:${a}`,text:` ${a}`,muted:!0}),n.push(...l.map(c=>lw(c,e,t,s.length+1))))}}return n}function lw(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 KE(e,t){return e?t?[{label:"Task",value:t.id},{label:"Repo",value:e.name},{label:"Agent",value:k.runners.getDisplayName(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:js.basename(t.worktreePath)}]:[{label:"Repo",value:e.name},{label:"Branch",value:e.defaultBranch},{label:"Task",value:"none",mutedValue:!0}]:[{label:"Repo",value:"none",mutedValue:!0}]}function GE(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0,pi:0})}function HE(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function cw(e,t,n,r,s=null,i=!1){if(s)return YE(e,t,n,r,s,i);let o=Ld(e,t,{centerOnly:r,panelPolish:i});return zE(n,o)?{output:Xo(o.rows,n.rows,o.row,o.column),region:o}:null}function YE(e,t,n,r,s,i){let o=Ag(e,t,s,{centerOnly:r,panelPolish:i});if(!o||!JE(n,o))return null;let a=n.rows.slice();return{output:o.rows.map(({index:c,row:d})=>a[c]===d?"":(a[c]=d,`\x1B[${o.row+c};${o.column}H${d}`)).join(""),region:{row:o.row,column:o.column,width:o.width,rows:a}}}function zE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function JE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function dw(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!XE(o,a))return null;!o||!a||(s+=Xo(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function XE(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 QE=["tasks","center","inspector"];function ZE(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 mu(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return gu({...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 gu(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return lg(t)?E({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):E({state:e});if(e.fileSearchQuery!==null)return ZE(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"&&(qo(e.selectedLeftItemId)||Uo(e.selectedLeftItemId)))return E({state:{...e,selectedRunner:Lo(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return uw(e,1);if(t==="SHIFT_TAB"||t==="[")return uw(e,-1);if(t==="z"||t==="Z")return E({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===V?yn(e,-1,n):mu(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===V?yn(e,1,n):mu(e,1,n);if(t==="PAGE_UP")return yn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return yn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return yn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return yn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??wt,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=a0(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"&&Ds(e.selectedLeftItemId)&&e.selectedTaskId)return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&fg(e.selectedLeftItemId)&&e.selectedWorkspaceId)return E({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&mw(e.activeTab,n.ptyTabIds??[]))return E({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return fu(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return pw(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return fu(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return pw(e,1)}if(et(t)){if(e.focusedRegion==="tasks"&&(qo(e.selectedLeftItemId)||Uo(e.selectedLeftItemId))){let r=Bo(e.selectedLeftItemId),s=Wo(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"&&Ds(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return E({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:Pr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&mw(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return E({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:Pr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===V)return E({state:{...e,actionMessage:null},changed:!0,refreshInspection:!0});if(e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="files"){let r=e.selectedFileTreePath??e.selectedFilePath;if(r&&(n.fileTreeDirectoryIds??[]).includes(r))return E({state:n0({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return E({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:V,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}if(e.focusedRegion==="inspector"&&e.inspectionMode==="review"){let r=e.selectedDiffPath??n.diffPathIds?.[0]??null;return r?E({state:{...e,selectedDiffPath:r,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!n.projectTargetIds?.length?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?E({state:e}):e.selectedActionId==="refresh-checks"?E({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return E({state:e})}function yn(e,t,n){if(t===0)return E({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?hw(e,t,n):e.inspectionMode==="review"?fw(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):E({state:e});if(e.focusedRegion==="center"&&e.activeTab===V){if(e.openInspectionKind==="file")return fw(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return r0(e,t,n)}return E({state:e})}function uw(e,t){return ca(e,"focusedRegion",QE,t)}function fu(e,t,n){let r=ca(e,"activeTab",n&&n.length>0?n:l0(e),t);return!r.changed||cg(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:Pr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function mu(e,t,n){if(e.focusedRegion==="tasks")return e0(e,t,n.leftItemIds);if(e.focusedRegion==="center")return fu(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return hw(e,t,n);if(n.projectTargetIds?.length){let s=hu(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=hu(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:ca(e,"selectedActionId",sg,t)}return ca(e,"selectedActionId",vd,t)}function e0(e,t,n){let r=hu(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=Bo(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=Wo(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function t0(e,t){if(e.inspectionMode===t)return E({state:e});let n=t==="files"?"file":e.openInspectionKind,r=t==="files"?V:e.activeTab;return E({state:{...e,inspectionMode:t,activeTab:r,openInspectionKind:n,fileScrollOffset:t==="files"?0:e.fileScrollOffset,reviewScrollOffset:t==="review"?0:e.reviewScrollOffset,actionMessage:null},changed:!0,refreshInspection:!0})}function pw(e,t){return t0(e,o0(e.inspectionMode,Cd,t))}function hw(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=Yt(i===-1?0:i+t,0,r.length-1),a=r[o]??null;if(a===e.selectedFileTreePath)return E({state:e});let l=a!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(a);return E({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?V:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function n0(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 fw(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=Yt(e[t]+n,0,i);return o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function r0(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return s0(e,t,n);let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=e.diffScrollOffset+t,a=n.diffPathIds??[];if(a.length===0||!e.selectedDiffPath){let d=Yt(o,0,i);return d===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}let l=a.indexOf(e.selectedDiffPath);if(l===-1){let d=Yt(o,0,i);return d===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:d,actionMessage:null},changed:!0})}if(t>0&&o>i){let d=a[l+1]??null;return d?E({state:{...e,selectedDiffPath:d,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===i?E({state:e}):E({state:{...e,diffScrollOffset:i,actionMessage:null},changed:!0})}if(t<0&&o<0){let d=a[l-1]??null;return d?E({state:{...e,selectedDiffPath:d,activeTab:V,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?E({state:e}):E({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let c=Yt(o,0,i);return c===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function s0(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=Yt(e.diffScrollOffset+t,0,i),a=i0(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 i0(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function ca(e,t,n,r){let s=n.indexOf(e[t]),i=Yt(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 hu(e,t,n,r,s=!1){if(n.length===0)return E({state:e});let i=n.indexOf(e[t]??n[0]??""),o=Yt(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 o0(e,t,n){let r=t.indexOf(e);return t[Yt(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 mw(e,t){return t.includes(e)}function a0(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Pr(e.activeTab)??e.preferredPtyTabKind}function l0(e){return[e.selectedPtyTabId,e.openInspectionKind?V:null].filter(t=>typeof t=="string")}function Yt(e,t,n){return Math.min(n,Math.max(t,e))}var gw=async(e,t,n,r)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await r.queueTaskMutation(async()=>G(r.paths,e.selectedTaskId,i=>{let o=t??c0(i,e.activeTab,e.preferredPtyTabKind),a=Tw(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"}`}}},yw=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing a tab.");let{closedTab:n,nextSelectedTab:r}=await t.queueTaskMutation(async()=>{let s={closedTab:null,nextSelectedTab:null};if(await G(t.paths,e.selectedTaskId,i=>{let o=i.ptyTabs.findIndex(l=>l.id===e.activeTab);if(o===-1)throw new Error("Only PTY tabs can be closed.");s.closedTab=i.ptyTabs[o];let a=i.ptyTabs.filter(l=>l.id!==s.closedTab.id);return s.nextSelectedTab=a[Math.min(o,a.length-1)]??null,{...i,ptyTabs:a,selectedPtyTabId:s.nextSelectedTab?.id??null}}),!s.closedTab)throw new Error("Only PTY tabs can be closed.");return{closedTab:s.closedTab,nextSelectedTab:s.nextSelectedTab}});return{closedTab:n,nextSelectedTab:r,nextShell:{activeTab:r?.id??(e.openInspectionKind?"inspection":e.activeTab),selectedPtyTabId:r?.id??null,focusedRegion:"center",actionMessage:`Closed tab: ${n.title}`}}},ww=async(e,t)=>{let n=e.selectedTaskId;n&&await t.queueTaskMutation(async()=>{await G(t.paths,n,r=>!r.ptyTabs.some(s=>s.id===e.activeTab)||r.selectedPtyTabId===e.activeTab?r:{...r,selectedPtyTabId:e.activeTab})})},kw=async(e,t)=>{let n=e.ptyTabs.find(s=>s.kind==="agent")??null;if(n)return await t.queueTaskMutation(async()=>{await G(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:s})}),{...e,selectedPtyTabId:n.id};let r=Tw(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await G(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:{...s,ptyTabs:[...s.ptyTabs,r],selectedPtyTabId:r.id}})}),{...e,ptyTabs:[...e.ptyTabs,r],selectedPtyTabId:r.id}};function c0(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function Tw(e,t,n,r={}){let s=n??e.runner,i=k.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(h=>h.id)),c=1,d=a;for(;l.has(d);)c+=1,d=`${a}-${c}`;let u=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:d,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,r):[],createdAt:u,updatedAt:u}}var $r=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},bw=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 st(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=bo();Ro(k.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",d=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new $r(c,d)}let o=await s.taskService.markTaskStarted(s.paths,i.task.id),a={selectedRepoId:o.repoId,selectedWorkspaceId:o.workspaceId,selectedTaskId:o.id,selectedPtyTabId:o.selectedPtyTabId,inputMode:"control",focusedRegion:"center",activeTab:o.selectedPtyTabId??"agent",selectedActionId:"commit"};return{task:o,nextShell:a}},Rw=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},Pw=async(e,t)=>{if(!e.selectedTaskId)throw new Error("Select a task before closing it.");let{taskBeforeClose:n,task:r}=await t.queueTaskMutation(async()=>{let s=await Lr(t.paths,e.selectedTaskId),i=await t.taskService.closeTask(t.paths,e.selectedTaskId);return{taskBeforeClose:s,task:i}});return{closedTabIds:n.ptyTabs.map(s=>s.id),nextShell:{selectedActionId:"close-task",actionMessage:r.cleanup.preservedWorktree?`Archived task ${r.id}; worktree preserved`:`Archived task ${r.id}`}}},Sw=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Lr(t.paths,n.id)))),Nr=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await pe.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var Iw=async(e,t)=>{if(!e.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");let n=await t.taskService.listTasks(t.paths,{workspaceId:e.selectedWorkspaceId,includeClosed:!0}),r=n.tasks.filter(i=>i.status!=="closed");if(r.length>0)throw new Error(`Close tasks before removing workspace: ${r.map(i=>`${i.id} (${i.status})`).join(", ")}.`);await t.workspaceService.archiveWorkspace(t.paths,e.selectedWorkspaceId);let s=n.tasks.length>0;return s||await t.workspaceService.removeWorkspace(t.paths,e.selectedWorkspaceId,{listTasks:t.taskService.listTasks}),{nextShell:{selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:s?`Archived workspace ${e.selectedWorkspaceId}; closed task history preserved.`:`Removed workspace ${e.selectedWorkspaceId}`}}};var vw=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},Cw=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},Aw=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var d0=250;function zt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function Jt(e,t){return Kt(t,e.ptyRuntime.getViewState(Dr(e,t)))}function Dr(e,t){let n=zt(e.model.tasks,t);return n?n.ptyTabs.some(r=>r.id===t.activeTab)?t.activeTab:t.activeTab==="agent"||t.activeTab==="terminal"?n.ptyTabs.find(r=>r.kind===t.activeTab)?.id??t.selectedPtyTabId:t.selectedPtyTabId:t.selectedPtyTabId}function v(e,t){return Jt(e,mg(t,e.model))}function Ew(e,t,n){return e.footerToastTimer&&(clearTimeout(e.footerToastTimer),e.footerToastTimer=null),n?(e.footerToastTimer=setTimeout(()=>{e.footerToastTimer=null,!(e.state.mode!=="main"||e.state.shell.footerToast!==n)&&(e.state={mode:"main",shell:v(e,{...e.state.shell,footerToast:null})},e.render())},600),{...t,footerToast:n}):{...t,footerToast:null}}function Ow(e,t,n){return Ew(e,t,n?{tone:"success",message:n}:null)}function ce(e,t,n){return Ew(e,t,{tone:"error",message:n})}function oe(e,t,n,r){let s=n instanceof Error?n.message:r,i=n instanceof Error?n.stack??n.message:String(n);return pe.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function Z(e,t){if(!e.uiStateFile)return;e.runtimeState=xo(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>yt({uiStateFile:e.uiStateFile},n),()=>yt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function yu(e,t){if(!e.uiStateFile){e.runtimeState={...xo(e.runtimeState,e.state.shell),...t};return}e.runtimeState={...xo(e.runtimeState,e.state.shell),...t};let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>yt({uiStateFile:e.uiStateFile},n),()=>yt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function u0(e,t){let n=e.taskMutationQueue.then(t,t);return e.taskMutationQueue=n.then(()=>{},()=>{}),n}function de(e){return{paths:e.paths,config:e.config,taskService:P,workspaceService:be,queueTaskMutation:t=>u0(e,t)}}function wu(e,t){let n=zt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?pu(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:jn(e.model),centerTabIds:ug(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:iw(t,n,s),pageRows:Math.max(5,We(e.activeTerminal.width,e.activeTerminal.height).height-ee.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:uu(n,s).map(a=>a.repoId)}}async function $w(e,t){await ww(t,de(e))}async function Se(e){e.model=await Sr(e.workspaceRoot,e.state.shell,e.enabledRunnerIds),e.state.mode==="main"?e.state={mode:"main",shell:v(e,e.state.shell)}:e.state={...e.state,shell:v(e,e.state.shell)}}function da(e,t){e.model={...e.model,tasks:[...e.model.tasks.filter(n=>n.id!==t.id),...t.status==="closed"?[]:[t]].sort((n,r)=>n.id.localeCompare(r.id))}}async function ua(e,t){let n=++e.inspectionRefreshSequence,r=Od(e.model.tasks,t),s=e.model.inspection,i=t.focusedRegion==="inspector"&&t.inspectionMode==="review"&&t.openInspectionKind!=="diff",o;if(r&&s?.taskId===r.id&&!i){let a={selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath},l=await Vh(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await Sr(e.workspaceRoot,t,e.enabledRunnerIds),n!==e.inspectionRefreshSequence)return;e.model=o,e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,e.state.shell)},Z(e,e.state.shell),e.render())}function Nw(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)&&ua(e,n).catch(r=>{let s=oe(e,"refresh inspection",r,"Failed to refresh inspection.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,actionMessage:s}),s)},e.render()})},d0))}function Dw(e,t){t!==0&&(e.pendingInspectionScrollLines+=t,!e.inspectionScrollRenderTimer&&(e.inspectionScrollRenderTimer=setTimeout(()=>{e.inspectionScrollRenderTimer=null;let n=e.pendingInspectionScrollLines;if(e.pendingInspectionScrollLines=0,n===0||e.state.mode!=="main"||e.state.shell.inputMode!=="control")return;let r=yn(e.state.shell,n,wu(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render(),ua(e,e.state.shell).catch(s=>{let i=oe(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render()}},16)))}function ku(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function Tu(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 xw(e){Tu(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,e.state.shell)},e.render())})}async function Fw(e,t){let n=v(e,t),r=zt(e.model.tasks,n),s=Dr(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 Kt(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,Gt(We(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),n.centerZoomed));return Kt({...n,inputMode:"control"},o)}function bu(e){let t=e.state.mode==="main"&&e.state.shell.inputMode==="terminal"?"terminal":"control";t!==e.inputCaptureMode&&(e.inputCaptureMode=t,e.activeTerminal.grabInput(t==="terminal"?{mouse:"button"}:!0))}async function Ru(e,t){try{let n=v(e,t),r=zt(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 _w(e,r),await Se(e),s=r.selectedPtyTabId)}r&&!s&&(r=await _w(e,r),await Se(e),s=r.selectedPtyTabId);let i=v(e,{...n,activeTab:s??n.activeTab,selectedPtyTabId:s,focusedRegion:s?"center":n.focusedRegion});if(!i.selectedTaskId||!s){e.state={mode:"main",shell:i},e.render();return}e.state={mode:"main",shell:Kt({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},Z(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,Gt(We(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),i.centerZoomed));e.suppressTerminalEnterOnAttach=Ht(s),e.lastTerminalKey=null,e.state={mode:"main",shell:Kt({...i,inputMode:"terminal"},o)},Z(e,e.state.shell)}catch(n){let r=oe(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&Ht(t.selectedPtyTabId)&&(await p0(e,t.selectedTaskId,r).catch(()=>{}),await Se(e).catch(()=>{})),e.state={mode:"main",shell:ce(e,ag(v(e,t),r),r)},Z(e,e.state.shell)}e.render()}async function p0(e,t,n){await Rw(t,n,de(e))}async function Lw(e,t,n,r){let s=v(e,t),{nextShell:i}=await gw(s,n,r,de(e));return await Se(e),v(e,{...s,...i})}async function Mw(e,t){let n=v(e,t),{closedTab:r,nextShell:s}=await yw(n,de(e));return e.ptyRuntime.disposeSession(r.id),await Se(e),v(e,{...n,...s})}async function jw(e,t){let n=v(e,t),r=jn(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await Pw(n,de(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Se(e),v(e,{...n,...o,selectedLeftItemId:f0(r,jn(e.model),s)})}async function qw(e,t){let n=v(e,t),r=e.model.workspaces?.findIndex(a=>a.id===n.selectedWorkspaceId)??-1,{nextShell:s}=await Iw(n,de(e));await Se(e);let i=e.model.workspaces??[],o=i[Math.min(Math.max(0,r),i.length-1)];return v(e,{...n,...s,selectedLeftItemId:o?`workspace:${o.id}`:null})}async function _w(e,t){return kw(t,de(e))}function pa(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:Jt(e,e.state.shell)},e.render())},16))}function Uw(e){e.scrollRenderTimer&&(clearTimeout(e.scrollRenderTimer),e.scrollRenderTimer=null),e.pendingScrollLines=0,e.ptyRuntime.scrollViewport(Number.MAX_SAFE_INTEGER),e.state.mode==="main"&&(e.state={mode:"main",shell:Jt(e,e.state.shell)},e.render())}function f0(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 Ww(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=Bw(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await Sw(s,de(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)da(e,o);t.recordSuccess(i,Bw(e)),e.state={mode:"main",shell:v(e,e.state.shell)},e.render()}catch(i){if(n?.aborted)return;t.recordFailure(s,i);let o=i instanceof Error?i.message:"Background PR discovery failed.";o!==e.lastBackgroundPrPollError&&(e.lastBackgroundPrPollError=o,Nr("background PR polling",i,de(e)))}}function Bw(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function Vw(e,t){let n=v(e,t),r=zt(e.model.tasks,n),s=null,i=null;if(r?.type==="project"&&r.repoTargets?.length){let o=await P.prs.discoverOrRefreshAll(e.paths,n.selectedTaskId);await Se(e);let a=o.synced+o.discovered+o.notFound;i=`Refreshed ${o.synced}/${a} targets`}else{let{disposition:o,task:a}=await P.prs.discoverOrRefresh(e.paths,n.selectedTaskId);await Se(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${H(a)?.requiredChecks.length??0} reported`)}return v(e,{...Ow(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import w0 from"node:path";import{readdir as m0,stat as h0}from"node:fs/promises";import Kw from"node:path";async function g0(e){let t=await m0(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=Kw.join(e,r.name);n.push({name:r.name,path:s,kind:await y0(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 Gw(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function Hw(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 fa(e,t){let n=await g0(t);e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:n,activeTab:e.state.shell.selectedPtyTabId??e.state.shell.activeTab,actionMessage:null})},e.render())}async function y0(e){let t=Kw.join(e,".git");return await h0(t).catch(()=>null)!==null}function Yw(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function zw(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function k0(e){if(e.state.mode!=="main"||e.creatingTask)return;let t=e.state.shell,n=t.taskPromptInput?.trim()??"",r=t.taskPromptTarget;if(!r||!r.repoId&&!r.workspaceId){e.state={mode:"main",shell:v(e,{...t,taskPromptError:"Select a workspace first."})},e.render();return}if(n.length===0){e.state={mode:"main",shell:v(e,{...t,taskPromptError:"Task prompt cannot be empty."})},e.render();return}e.creatingTask=!0,e.state={mode:"main",shell:v(e,{...t,actionMessage:`Creating ${t.selectedRunner} task in ${r.name}...`})},e.render();let s=null;try{let i=await bw(r.repoId,r.workspaceId,n,t.selectedRunner,de(e));s=i.task,await Se(e);let o=v(e,{...e.state.shell,...i.nextShell,selectedLeftItemId:`task:${s.id}`,inputMode:"terminal",taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null}),a=await e.ptyRuntime.ensureSession(s.id,o.selectedPtyTabId??Gg(s,"agent"),Gt(We(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Ht(o.selectedPtyTabId),e.state={mode:"main",shell:Kt(o,a)},Z(e,e.state.shell)}catch(i){i instanceof $r&&(s=i.task);let o=oe(e,"create task",i,"Failed to create task.");s&&!(i instanceof $r)?(await G(e.paths,s.id,a=>({...a,status:"draft",runnerSession:{...a.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:o})).catch(()=>{}),await Se(e).catch(()=>{})):s&&(await G(e.paths,s.id,a=>({...a,lastFailureReason:o})).catch(()=>{}),await Se(e).catch(()=>{})),e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,inputMode:"control",selectedTaskId:s?.id??e.state.shell.selectedTaskId,selectedPtyTabId:s?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:s?`task:${s.id}`:e.state.shell.selectedLeftItemId,activeTab:s?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:s?null:"",taskPromptError:o,actionMessage:null}),o)}}finally{e.creatingTask=!1,e.render()}}function T0(e,t){if(e.state.mode!=="main")return;let n=e.state.shell;if(n.taskPromptInput!==null){if(t==="ESCAPE"){e.state={mode:"main",shell:v(e,{...n,taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(et(t)){k0(e);return}if(t==="BACKSPACE"){e.state={mode:"main",shell:v(e,{...n,taskPromptInput:n.taskPromptInput.slice(0,-1),taskPromptError:null})},e.render();return}if(t==="CTRL_R"){e.state={mode:"main",shell:v(e,{...n,selectedRunner:Lo(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}Ad(t)&&(e.state={mode:"main",shell:v(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function b0(e,t){if(e.state.mode!=="main")return;let n=e.state.shell.workspaceBrowser;if(!n)return;if(t==="ESCAPE"){if(n.query!==null){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:null,selectedIndex:0}})},e.render();return}e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:null,actionMessage:null})},e.render();return}if(t==="/"){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:"",selectedIndex:0}})},e.render();return}if(n.query!==null&&(t==="BACKSPACE"||t==="DELETE")){let s=n.query.slice(0,-1);e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:s,selectedIndex:0}})},e.render();return}if(n.query!==null&&t.length===1&&t>=" "){let s=n.query+t;e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:s,selectedIndex:0}})},e.render();return}let r=Gw(n);if(t==="UP"||t==="k"){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,selectedIndex:Math.max(0,n.selectedIndex-1),error:null}})},e.render();return}if(t==="DOWN"||t==="j"){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,selectedIndex:Math.min(Math.max(0,r.length-1),n.selectedIndex+1),error:null}})},e.render();return}if(t==="LEFT"||t==="h"){fa(e,w0.dirname(n.cwd)).catch(s=>{let i=oe(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:i}}),i)},e.render()});return}if(t==="RIGHT"||t==="l"||et(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){fa(e,s.path).catch(o=>{let a=oe(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()});return}let{workspaceService:i}=de(e);i.addWorkspace(e.paths,s.path).then(async o=>{await Se(e);let a=o.repos[0]??null,l=v(e,{...e.state.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${o.workspace.id}`,selectedWorkspaceId:o.workspace.id,selectedRepoId:a?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${o.workspace.name??o.workspace.id}`});e.state={mode:"main",shell:l},Z(e,e.state.shell),e.render()}).catch(o=>{let a=oe(e,"add workspace",o,"Failed to add workspace.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()})}}function R0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=_y(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;P0(e,r)}}}async function P0(e,t){let n;try{n=await pe.readLog(e.paths)}catch(r){let s=oe(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 S0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=Fy(Yw(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"?vw(n.runner,n.enabled,de(e)):Cw(n.runner,n.path,de(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:v(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),runnerOptions:n.state},e.render())}).catch(s=>{if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let i=oe(e,"save runner option",s,"Failed to save runner option.");e.state={...e.state,shell:ce(e,v(e,e.state.shell),i),runnerOptions:{...Yw(e),message:i}},e.render()})}function I0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=xy(zw(e),e.config,t);if(n.kind!=="noop"){if(n.kind==="back"){yu(e,{seenPreviewIds:[...kt]});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}Aw(n.feature,n.enabled,de(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:v(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),previewOptions:n.state},e.render())}).catch(r=>{if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let s=oe(e,"save feature preview",r,"Failed to save feature preview.");e.state={...e.state,shell:ce(e,v(e,e.state.shell),s),previewOptions:{...zw(e),message:s}},e.render()})}}function ma(e){let t=v(e,{...e.state.shell,inputMode:"control"});e.state={mode:"main",shell:t},e.pendingClear=!0,e.render(),e.bootHydrationReady.then(()=>{e.state.mode!=="main"||e.state.shell!==t||Fw(e,t).then(n=>{e.state.mode!=="main"||e.state.shell!==t||(e.state={mode:"main",shell:n},Z(e,e.state.shell),e.render())}).catch(n=>{if(e.state.mode!=="main"||e.state.shell!==t)return;let r=oe(e,"warm selected PTY",n,"Failed to start selected PTY.");e.state={mode:"main",shell:ce(e,v(e,e.state.shell),r)},Z(e,e.state.shell),e.render()})})}function v0(e){return[...e instanceof Error?e.message:"npm could not install the update."].map(r=>{let s=r.charCodeAt(0);return s<=31||s>=127&&s<=159?" ":r}).join("").replace(/\s+/g," ").trim().slice(0,160)}function Jw(e){if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let t=e.state.update.latest;e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"installing"}},e.render(),e.installUpdate(t).then(()=>{e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update||(e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"success"}},e.pendingClear=!0,e.render())}).catch(n=>{if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let r=v0(n);oe(e,"update Craig",n,r),e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"error",error:r}},e.pendingClear=!0,e.render()})}function C0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let n=e.state.update.phase;if(n==="installing")return;if(t==="ESCAPE"){ma(e);return}let r=n==="ready"?2:1;if(t==="UP"||t==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(t==="DOWN"||t==="j"){e.state={...e.state,menuIndex:Math.min(r,e.state.menuIndex+1)},e.render();return}if(et(t)){if(n==="ready"&&e.state.menuIndex===0){Jw(e);return}if(n==="ready"&&e.state.menuIndex===2){yu(e,{ignoredUpdateVersion:e.state.update.latest}),e.updateText=null,ma(e);return}if(n==="error"&&e.state.menuIndex===0){Jw(e);return}if(n==="success"&&e.state.menuIndex===1){e.exit(0);return}ma(e)}}function Xw(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){T0(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){b0(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){E0(e),e.render();return}e.focusFlashUntil!==null&&(e.focusFlashUntil=null,e.focusFlashTimer&&(clearTimeout(e.focusFlashTimer),e.focusFlashTimer=null))}if(e.state.mode==="main"){let r=gu(e.state.shell,n,wu(e,e.state.shell));if(r.exit){e.exit(0);return}if(r.detachTerminal){e.ptyRuntime.detach(),e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render();return}if(e.state.shell.inputMode==="terminal"){if(r.changed){e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&et(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Ls(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(A0(e,n))return;e.lastTerminalKey=Hg(n)?{key:n,at:Date.now()}:null;let i=Yg(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){pa(e,i);return}Ad(n)&&(e.state.shell.terminal.scrolledBack||e.pendingScrollLines<0)&&Ht(e.state.shell.selectedPtyTabId)&&Uw(e),e.ptyRuntime.writeKey(n);return}if(n==="CTRL_C"){e.exit(0);return}if(n==="?"&&e.state.shell.inputMode==="control"){e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render();return}if(r.pause){e.state={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:v(e,r.state)},e.pendingClear=!0,e.render();return}if(r.beginTaskPrompt){let s=v(e,r.state),i=e.model.workspaces?.find(a=>a.id===s.selectedWorkspaceId),o=e.model.repos.find(a=>a.id===s.selectedRepoId);e.state={mode:"main",shell:{...s,taskPromptTarget:{workspaceId:i?.id??null,repoId:o?.id??null,name:i?.name??o?.name??"no workspace"}}},Z(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){fa(e,e.workspaceRoot).catch(s=>{let i=oe(e,"browse workspaces",s,"Failed to browse workspaces.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,workspaceBrowser:{cwd:e.workspaceRoot,entries:[],selectedIndex:0,query:null,error:i}}),i)},e.render()});return}if(r.createPtyTab){Lw(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{Ru(e,s)}).catch(s=>{let i=oe(e,"create PTY tab",s,"Failed to create tab.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.closePtyTab){Mw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"close PTY tab",s,"Failed to close tab.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.refreshPullRequestChecks){Vw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"refresh PR checks",s,"Failed to refresh PR checks.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.openPrUrl){let s=zt(e.model.tasks,r.state),i=s?H(s)?.url??null:null;i?Hw(i).catch(o=>{let a=oe(e,"open PR URL",o,"Failed to open PR in browser.");e.state={mode:"main",shell:ce(e,v(e,r.state),a)},e.render()}):(e.state={mode:"main",shell:ce(e,v(e,r.state),"No PR URL available.")},e.render());return}if(r.closeTask){jw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"close task",s,"Failed to close task.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.removeWorkspace){qw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"remove workspace",s,"Failed to remove workspace.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.attachTerminal){Ru(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){Nw(e,e.state.shell);return}ua(e,e.state.shell).catch(s=>{let i=oe(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}r.changed&&(e.state={mode:"main",shell:v(e,r.state)},$w(e,e.state.shell).catch(()=>{}),Z(e,e.state.shell),e.render());return}if(e.state.variant==="help"){e.state.viaOptions&&e.state.parentVariant?e.state={mode:"overlay",variant:"options",menuIndex:3,optionsMessage:null,shell:e.state.shell,parentVariant:e.state.parentVariant}:e.state.parentVariant?e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell}:e.state={mode:"main",shell:v(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){R0(e,n);return}if(e.state.variant==="runners"){S0(e,n);return}if(e.state.variant==="previews"){I0(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||et(n)){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:2,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render()}return}if(e.state.variant==="update"){C0(e,n);return}if(e.state.optionsMessage){(n==="ESCAPE"||et(n))&&(e.state={...e.state,optionsMessage:null},e.render());return}if(n==="UP"||n==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(n==="DOWN"||n==="j"){e.state={...e.state,menuIndex:Math.min(2,e.state.menuIndex+1)},e.render();return}if(n==="ESCAPE"){e.state.variant==="pause"&&(e.state={mode:"main",shell:v(e,e.state.shell)},e.pendingClear=!0,e.render());return}if(et(n)){if(e.state.menuIndex===0){e.state.variant==="boot"?ma(e):(e.state={mode:"main",shell:v(e,{...e.state.shell,inputMode:"control"})},e.pendingClear=!0,e.render(),xw(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 Qw(e,t){let n=Zg(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=Ls(i);if(o){ek(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(Wd(i)){e.pendingTerminalKeySequence.raw=i,Zw(e);return}ha(e)}if(n.includes("")){e.ptyRuntime.detach(),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey=null,e.state={mode:"main",shell:v(e,{...e.state.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},Z(e,e.state.shell),e.render();return}let r=zg(n);if(r!==0){pa(e,r);return}let s=Ls(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
292
+ `);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 Ny(e){return new Promise((t,n)=>{let r=Ry(e);r.once("connect",()=>t(r)),r.once("error",n)})}function cE(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,n)})}function gn(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
293
+ `)}catch{}}function dE(e){try{return process.kill(e,0),!0}catch{return!1}}function Dy(e){return new Promise(t=>setTimeout(t,e))}function uE(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var Fy=["Runners","Feature Previews","Logs","Help"],xy=["piRunner","fileOpen","panelPolish"],Ly={agentOrchestration:"Agent orchestration",fileOpen:"Agent file opening",piRunner:"Pi coding agent runner",panelPolish:"Panel polish"};function ru(e,t){return nu(e).map(n=>{let r=k.runners.getProfile(n),s=e.runners?.[n]?.enabled!==!1,i=e.runners?.[n]?.path?.trim(),o=t.pathEdit?.runner===n?`${t.pathEdit.value}_`:i&&i.length>0?i:`default (${r.executable})`;return`${r.displayName} ${s?"enabled":"disabled"} ${o}`})}function My(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 jy(e=[]){let t=xy.some(n=>!e.includes(n));return Fy.map((n,r)=>r===1&&t?`${n} \xB7 NEW`:n)}function qy(e,t=[]){return kt.map(n=>{let r=k.previews.isEnabled(e,n),s=xy.includes(n)&&!t.includes(n);return`${r?"[x]":"[ ]"} ${Ly[n]}${s?" \xB7 NEW":""}`})}function Uy(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function By(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(Fy.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:la(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"logs"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function Wy(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(kt.length-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(!la(n))return{kind:"noop",state:e};let r=kt[e.menuIndex]??kt[0],s=!k.previews.isEnabled(t,r);return{kind:"save-enabled",feature:r,enabled:s,state:{...e,message:`${Ly[r]} ${s?"enabled":"disabled"}.`}}}function Vy(e,t,n,r){if(e.pathEdit)return pE({...e,pathEdit:e.pathEdit},t,n);let s=ru(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=nu(t)[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:a,value:t.runners?.[a]?.path??""}}}}if(!la(n))return{kind:"noop",state:e};let i=nu(t)[e.menuIndex]??"codex",o=t.runners?.[i]?.enabled!==!1;return o&&r.length<=1?{kind:"render",state:{...e,message:"At least one runner must stay enabled."}}:{kind:"save-enabled",runner:i,enabled:!o,state:{...e,message:`${k.runners.getProfile(i).displayName} ${o?"disabled":"enabled"}.`}}}function nu(e){return me.filter(t=>t!=="pi"||k.previews.isEnabled(e,"piRunner"))}function pE(e,t,n){if(n==="ESCAPE")return{kind:"render",state:_y({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(la(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:r,path:s.length>0?s:null,state:_y({...e,message:s.length>0?`${k.runners.getProfile(r).displayName} executable saved.`:`${k.runners.getProfile(r).displayName} executable reset to default.`})}}return fE(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function _y(e){let t={...e};return delete t.pathEdit,t}function la(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
294
+ `}function fE(e){return e.length===1&&e>=" "&&e!==""}var mE=/^\d+\.\d+\.\d+$/;async function Ky(e,t={runCommand:G}){if(!mE.test(e))throw new Error(`Cannot install invalid Craig version: ${e}`);await t.runCommand("npm",["install","--global",`craig-cli@${e}`])}var su=150,Gy=6;function Hy(e,t,n,r){if(e.inputMode!=="terminal"&&e.focusedRegion!=="center"||e.terminal.scrolledBack||e.terminal.rows.length===0)return e;let i=t.find(a=>a.id===e.selectedTaskId)?.ptyTabs.find(a=>a.id===e.activeTab||e.activeTab==="agent"&&a.kind==="agent");if(i?.kind!=="agent")return e;let o=n.find(a=>a.tabId===i.id);return!o||ze(i.id,n,r)!=="ready"||e.readAgentActivityAt[i.id]===o.lastActivityAt?e:{...e,readAgentActivityAt:{...e.readAgentActivityAt,[i.id]:o.lastActivityAt}}}function ca(e,t,n,r){return t.some(s=>e.includes(s.tabId)&&ze(s.tabId,t,n)==="ready"&&s.lastActivityAt>(r[s.tabId]??-1))}function Yy(e,t,n,r){let s=e.tasks.filter(o=>o.status!=="closed"&&o.status!=="merged"),i={workspaceCount:e.workspaces?.filter(o=>o.status==="active").length??e.repos.length,taskCount:s.length,workingAgents:0,readyAgents:0,attentionAgents:0,activityKnown:r};if(!r)return i;for(let o of s)for(let a of o.ptyTabs){if(a.kind!=="agent")continue;let l=bt(o,a.id,t,n);l==="working"&&i.workingAgents++,l==="ready"&&i.readyAgents++,l==="error"&&i.attentionAgents++}return i}import Ws from"node:path";function zy(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 Jy="\u{F024B} ",Xy="\u{F0DCF} ",Qy="\u25CB",iu="\uEA64",Zy="\uEAFE",ew="\uEBDA",ou="\u25CB",au="\u25CF",lu="\u2713",cu="\u2715";function tw(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 ua="empty",he={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function iw(e,t,n){let r=yE(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=e0(t.tasks),u=TE(e,a),d=kE(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 [${e.taskPromptTarget?.name??s?.name??"no workspace"}] \xB7 ${k.runners.getDisplayName(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${k.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:Fs(e.selectedLeftItemId)?`n new task ${t.furyPlansEnabled?"f Fury plans ":""}Enter attach X close task Esc pause ? help`:e.selectedLeftItemId?.startsWith("workspace:")?"n new task Enter select X remove workspace Esc pause ? help":e.selectedLeftItemId==="fury-plans"?"Enter review Fury plans f Fury plans Esc pause ? help":`n new task ${t.furyPlansEnabled?"f Fury plans ":""}Enter select Esc pause ? help`:e.focusedRegion==="center"?a===null?"n new task Tab tasks Esc pause ? help":u===V?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${k.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:Ws.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${Ws.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:m},leftTree:hE(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>t0(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:f,agent:m},centerTranscript:wE(u,e,s,a,e.workspaceBrowser,h,r),tabs:d,rightContext:ZE(s,a),rightInspection:DE(e,a,h)}}function hE(e,t,n){let r=[{text:"WORKSPACES",muted:!0,panelHeader:!0,focused:e.focusedRegion==="tasks"}];t.furyPendingPlans?.length&&r.push({text:`\u25CF ${t.furyPendingPlans.length} Fury plan${t.furyPendingPlans.length===1?"":"s"} to approve`,indent:1,status:"pending",selected:e.selectedLeftItemId==="fury-plans",focused:e.focusedRegion==="tasks"&&e.selectedLeftItemId==="fury-plans"});let s=(t.furyApprovalCount??0)-(t.furyPendingPlans?.length??0);if(s>0&&r.push({text:`\u25CF ${s} Fury approval${s===1?"":"s"} waiting`,indent:1,status:"pending"}),!t.workspaces)return gE(r,e,t.repos,t.tasks,n);let i=t.workspaces;if(i.length===0)r.push({text:"No workspaces registered.",indent:2,muted:!0});else for(let a of i){let l=e.selectedLeftItemId===`workspace:${a.id}`;r.push({id:`workspace:${a.id}`,text:`${a.kind==="project"?"\u2261":"\u2013"} ${a.name??a.id}`,selected:l,focused:l&&e.focusedRegion==="tasks"});let c=a.kind==="project"?a.discoveredRepoIds??[]:[a.primaryRepoId],u=jo(t.tasks,a.id);if(u.length===0)r.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:d,visualDepth:p}of _s(u)){let h=e.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:n?f:`${h?"\u25B8":"\u2022"} ${f}`,indent:p===0?2:4,selected:h,focused:h&&e.focusedRegion==="tasks",...n?{activity:sr(d,n.snapshots,n.now),activityAnimationFrame:n.animationFrame,unread:ca(d.ptyTabs.filter(T=>T.kind==="agent").map(T=>T.id),n.snapshots,n.now,e.readAgentActivityAt)}:{}},y=aw(d);y&&(m.prBadge=y),r.push(m)}if(a.kind==="project"){let d=`new-task-workspace:${a.id}`,p=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Project Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:p,focused:p&&e.focusedRegion==="tasks",muted:!p})}if(a.kind==="repo"){let d=`new-task:${a.primaryRepoId}`,p=e.selectedLeftItemId===d;r.push({id:d,text:`+ New Task [${k.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:p,focused:p&&e.focusedRegion==="tasks",muted:!p})}else{r.push({text:` Repos (${c.length})`,indent:0,muted:!0});for(let d of c.slice(0,6)){let p=t.repos.find(h=>h.id===d);r.push({text:` \xB7 ${p?.name??d}`,indent:0,muted:!0})}c.length>6&&r.push({text:` \xB7 ${c.length-6} more`,indent:0,muted:!0})}}let o=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:o,focused:o&&e.focusedRegion==="tasks"}),r}function gE(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=qo(r,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 _s(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:sr(d,s.snapshots,s.now),activityAnimationFrame:s.animationFrame,unread:ca(d.ptyTabs.filter(T=>T.kind==="agent").map(T=>T.id),s.snapshots,s.now,t.readAgentActivityAt)}:{}},y=aw(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 yE(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 wE(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 gt(["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 gt(["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 gt([`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"?gt([`${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."]):gt([`${a.title} tab ready for ${r.id}.`,"","Press Enter to attach this plain task shell.","Use + to create another task tab, a/t for a specific kind, or x to close this tab."]):e===V&&t.openInspectionKind==="file"?PE(r,i,t.fileScrollOffset):e===V&&t.openInspectionKind==="diff"?SE(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?gt(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):gt(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function kE(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:bE(o),...o.kind==="agent"&&r&&t?{activity:bt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame,unread:ca([o.id],r.snapshots,r.now,e.readAgentActivityAt)}:{}}))??[];if(!t)return[{id:ua,label:"EMPTY",active:n===ua,focused:e.focusedRegion==="center"&&n===ua}];let i=e.openInspectionKind||n===V?[{id:V,label:RE(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function TE(e,t){return t?t.ptyTabs.some(n=>n.id===e.activeTab)||e.activeTab===V&&e.openInspectionKind?e.activeTab:e.activeTab==="agent"||e.activeTab==="terminal"?t.ptyTabs.find(n=>n.kind===e.activeTab)?.id??t.ptyTabs[0]?.id??V:e.selectedPtyTabId&&t.ptyTabs.some(n=>n.id===e.selectedPtyTabId)?e.selectedPtyTabId:t.ptyTabs[0]?.id??V:ua}function bE(e){return e.title.toUpperCase()}function RE(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?Ws.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function PE(e,t,n){if(!e)return gt(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return gt(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=ow(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:""},...IE(r.lines,n,s)]}function SE(e,t,n){if(!e)return gt(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return gt(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=ow(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:""},...vE(r.lines,n,s)]}function gt(e){return e.map(t=>({text:t}))}function IE(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:he.lineNumber}},{text:" \u2502 ",style:{fg:he.gutter}},...du(i,n)],tone:"default"}})}function vE(e,t,n){let r=CE(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>AE(i,n))}function CE(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 AE(e,t){let n=nw(e.oldNumber),r=nw(e.newNumber),s=e.kind==="delete"?n:r,i=e.kind==="delete"?{bg:"2a1111",fallbackFg:he.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:he.diffAdd}:null,o=`${s} \u2502 ${e.text}`,a=i?OE(du(e.text,t),i.bg,i.fallbackFg):du(e.text,t),l=i?{fg:he.lineNumber,bg:i.bg}:{fg:he.lineNumber},c=i?{fg:he.gutter,bg:i.bg}:{fg:he.gutter};return{text:o,segments:[{text:s,style:l},{text:" \u2502 ",style:c},...a],fullBleed:i!==null}}function nw(e){return e===null?" ":String(e).padStart(4," ")}function ow(e){let t=Ws.extname(e).toLowerCase();return[".ts",".tsx",".js",".jsx",".mjs",".cjs"].includes(t)?"javascript":[".json",".jsonc"].includes(t)?"json":[".md",".mdx"].includes(t)?"markdown":[".css",".scss"].includes(t)?"css":"plain"}function du(e,t){return t==="diff"?EE(e):t==="markdown"?$E(e):t==="json"?uu(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?uu(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 EE(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:he.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:he.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:he.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:he.diffMeta}}]:[{text:e}]}function OE(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function $E(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:he.markup,bold:!0}}]:uu(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function uu(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:NE(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function NE(e){return e.startsWith("//")||e.startsWith("/*")?{fg:he.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:he.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:he.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:he.markup}:{fg:he.keyword}}function DE(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"?lw(t.repoTargets??[]):s?.pullRequest??(t?Y(t):null),o=[_E(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=uw(e,t,n),l=pu(e,n),c=BE([{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,...JE(e,n)]}:{title:"",rows:[...o,...pu(e,n)]}}function _E(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=fu(t),o=mu(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function rw(e){return[{text:" "},fu(e),{text:" "},mu(e)]}function aw(e){if(e.type==="project"&&e.repoTargets?.length){let n=lw(e.repoTargets);return n?rw(n):null}let t=Y(e);return t?.number?rw(t):null}function lw(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=xE(n);return{number:-1,status:FE(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 FE(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 xE(e){let t=e.map(n=>cw(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 fu(e){return!e||!e.number?{text:Qy,style:{fg:"565f89"}}:e.status==="merged"?{text:Zy,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:ew,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:iu,style:{fg:"565f89"}}:{text:iu,style:{fg:"9ece6a"}}}function mu(e){return e?.aggregateReadiness?sw(e.aggregateReadiness):sw(cw(e))}function sw(e){return e==="failed"?{text:cu,style:{fg:"f7768e"}}:e==="pending"?{text:au,style:{fg:"e0af68"}}:e==="success"?{text:lu,style:{fg:"9ece6a"}}:{text:ou,style:{fg:"565f89"}}}function cw(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")?dw(e)?"failed":LE(e)?"success":"pending":"pending"}function LE(e){return!!(e.mergeable&&!e.draft&&!dw(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function dw(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function uw(e,t,n){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return ME(e,t,n);let r=Y(t),s=mw("pr",t.branch,r??{number:null,url:null,baseBranch:null,headBranch:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,lastSyncedAt:null,requiredChecks:[],comments:[]}),i=t.prs.filter(o=>o!==r&&(o.status==="merged"||o.status==="closed")).length;return i>0&&s.push({id:"pr-history",text:`+ ${i} previous PR${i!==1?"s":""}`,muted:!0}),s}var da=32;function ME(e,t,n){let r=[],s=hu(t,n),i=e.selectedProjectTargetId??s[0]?.repoId??null,o=s.some(c=>c.repoId===i)?i:s[0]?.repoId??null;if(s.length===0)return[{id:"project-review-empty",text:"No repos with changes or pull requests.",muted:!0}];for(let c of s){let u=o===c.repoId,d=e.focusedRegion==="inspector"&&u,p=c.repoId.startsWith("repo_")?c.repoId.slice(5):c.repoId;if(c.status!=="ready"){let f=c.failureReason?c.failureReason.slice(0,14):c.status,m=da-f.length-1,y=p.length>m?p.slice(0,m-1)+"\u2026":p,T=da-y.length-f.length;r.push({id:`project-review:${c.repoId}`,text:y+" ".repeat(Math.max(1,T))+f,selected:u,focused:d,muted:!0})}else{let h=fu(c.pullRequest),f=mu(c.pullRequest),m=`${h.text} ${f.text}`,y=da-m.length-1,T=p.length>y?p.slice(0,y-1)+"\u2026":p,R=da-T.length-m.length,b=T+" ".repeat(Math.max(1,R));r.push({id:`project-review:${c.repoId}`,text:b+m,selected:u,focused:d,segments:[{text:b},{...h,text:h.text},{text:" "},{...f,text:f.text}]})}}let a=s.find(c=>c.repoId===o)??null,l=a?jE(t,a):[];return a?.status==="ready"&&(a.pullRequest.number||l.length>0)&&(r.push({id:"target-detail-spacer",text:""}),r.push(...mw("target",a.branch,a.pullRequest)),l.length>0&&r.push({id:"target-pr-history",text:`+ ${l.length} previous PR${l.length!==1?"s":""}`,muted:!0})),r}function hu(e,t){if(e?.type!=="project")return[];let n=new Set(t?.taskId===e.id?t.diffRows.map(r=>r.path.split("/")[0]).filter(r=>!!r):[]);return(e.repoTargets??[]).filter(r=>!!r.pullRequest.number||n.has(r.repoId)||pw(e,r).length>0)}function jE(e,t){return pw(e,t).filter(n=>n.number!==t.pullRequest.number&&(n.status==="merged"||n.status==="closed"))}function pw(e,t){let n=qE(t,e.prs);return n?e.prs.filter(r=>r.owner?.toLowerCase()===n.owner&&r.repo?.toLowerCase()===n.repo):[]}function qE(e,t){if(e.pullRequest.owner&&e.pullRequest.repo)return{owner:e.pullRequest.owner.toLowerCase(),repo:e.pullRequest.repo.toLowerCase()};let n=UE(e.pullRequest.url);if(n)return n;let r=t.filter(i=>e.pullRequest.number!==null&&i.number===e.pullRequest.number),s=r.length===1?r[0]:null;return s?.owner&&s.repo?{owner:s.owner.toLowerCase(),repo:s.repo.toLowerCase()}:null}function UE(e){let t=e?.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/\d+(?:[/?#].*)?$/i);return t?.[1]&&t[2]?{owner:t[1].toLowerCase(),repo:t[2].toLowerCase()}:null}function fw(e,t,n=null){return 3+uw(e,t,n).length+pu(e,n).length}function mw(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=WE(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:VE(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${hw(n.lastSyncedAt)}`,muted:!0}),s.push({id:r("checks-spacer"),text:""}),s.push({id:r("checks-header"),text:"Checks"}),n.requiredChecks.length?s.push(...n.requiredChecks.map(KE)):s.push({id:r("checks-none"),text:n.number?"No GitHub checks reported.":"No checks \u2014 sync after creating a PR.",muted:!0});let 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)=>GE(d,r(`comment:${p}`))))),s}function BE(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 WE(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function VE(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function hw(e){if(!e)return"--";let t=Date.now()-new Date(e).getTime(),n=Math.floor(t/1e3);if(n<60)return`${n}s ago`;let r=Math.floor(n/60);if(r<60)return`${r}m ago`;let s=Math.floor(r/60);return s<24?`${s}h ago`:`${Math.floor(s/24)}d ago`}function KE(e){let{icon:t,color:n}=YE(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," ")} ${zE(e.status)}`,color:n,muted:!1}}function GE(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${hw(e.createdAt)}`:"",s=HE(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 HE(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 YE(e){switch(e){case"success":return{icon:lu,color:"9ece6a"};case"pending":return{icon:au,color:"e0af68"};case"failed":return{icon:cu,color:"f7768e"};case"skipped":return{icon:ou,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function zE(e){return e==="success"?"passing":e==="failed"?"failing":e}function JE(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=gu(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)?Jy:Xy:zy(l.label),p=l.kind==="directory"?"7aa2f7":tw(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 gu(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 pu(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(XE(t))return QE(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=>gw(i,e,t))))}return n}function XE(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function QE(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=>gw(c,e,t,s.length+1))))}}return n}function gw(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 ZE(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:Ws.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 e0(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0,pi:0})}function t0(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function yw(e,t,n,r,s=null,i=!1){if(s)return n0(e,t,n,r,s,i);let o=Md(e,t,{centerOnly:r,panelPolish:i});return r0(n,o)?{output:ea(o.rows,n.rows,o.row,o.column),region:o}:null}function n0(e,t,n,r,s,i){let o=yg(e,t,s,{centerOnly:r,panelPolish:i});if(!o||!s0(n,o))return null;let a=n.rows.slice();return{output:o.rows.map(({index:c,row:u})=>a[c]===u?"":(a[c]=u,`\x1B[${o.row+c};${o.column}H${u}`)).join(""),region:{row:o.row,column:o.column,width:o.width,rows:a}}}function r0(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function s0(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function ww(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!i0(o,a))return null;!o||!a||(s+=ea(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function i0(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 o0=["tasks","center","inspector"];function a0(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 wu(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return Tu({...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 Tu(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return Zh(t)?E({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):E({state:e});if(e.fileSearchQuery!==null)return a0(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"&&(Uo(e.selectedLeftItemId)||Bo(e.selectedLeftItemId)))return E({state:{...e,selectedRunner:Mo(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return kw(e,1);if(t==="SHIFT_TAB"||t==="[")return kw(e,-1);if(t==="z"||t==="Z")return E({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===V?yn(e,-1,n):wu(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===V?yn(e,1,n):wu(e,1,n);if(t==="PAGE_UP")return yn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return yn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return yn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return yn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??wt,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=h0(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"&&Fs(e.selectedLeftItemId)&&e.selectedTaskId)return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&sg(e.selectedLeftItemId)&&e.selectedWorkspaceId)return E({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&Rw(e.activeTab,n.ptyTabIds??[]))return E({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return yu(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return Tw(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return yu(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return Tw(e,1)}if(Se(t)){if(e.focusedRegion==="tasks"&&(Uo(e.selectedLeftItemId)||Bo(e.selectedLeftItemId))){let r=Wo(e.selectedLeftItemId),s=Vo(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"&&Fs(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"&&Rw(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return E({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:Sr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===V)return E({state:{...e,actionMessage:null},changed:!0,refreshInspection:!0});if(e.focusedRegion==="inspector"&&e.selectedTaskId&&e.inspectionMode==="files"){let r=e.selectedFileTreePath??e.selectedFilePath;if(r&&(n.fileTreeDirectoryIds??[]).includes(r))return E({state:d0({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return E({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:V,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}if(e.focusedRegion==="inspector"&&e.inspectionMode==="review"){let r=e.selectedDiffPath??n.diffPathIds?.[0]??null;return r?E({state:{...e,selectedDiffPath:r,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!n.projectTargetIds?.length?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?E({state:e}):e.selectedActionId==="refresh-checks"?E({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return E({state:e})}function yn(e,t,n){if(t===0)return E({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?Pw(e,t,n):e.inspectionMode==="review"?bw(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):E({state:e});if(e.focusedRegion==="center"&&e.activeTab===V){if(e.openInspectionKind==="file")return bw(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return u0(e,t,n)}return E({state:e})}function kw(e,t){return pa(e,"focusedRegion",o0,t)}function yu(e,t,n){let r=pa(e,"activeTab",n&&n.length>0?n:g0(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 wu(e,t,n){if(e.focusedRegion==="tasks")return l0(e,t,n.leftItemIds);if(e.focusedRegion==="center")return yu(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return Pw(e,t,n);if(n.projectTargetIds?.length){let s=ku(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=ku(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:pa(e,"selectedActionId",zh,t)}return pa(e,"selectedActionId",Ed,t)}function l0(e,t,n){let r=ku(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=Wo(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=Vo(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function c0(e,t){if(e.inspectionMode===t)return E({state:e});let n=t==="files"?"file":e.openInspectionKind,r=t==="files"?V:e.activeTab;return E({state:{...e,inspectionMode:t,activeTab:r,openInspectionKind:n,fileScrollOffset:t==="files"?0:e.fileScrollOffset,reviewScrollOffset:t==="review"?0:e.reviewScrollOffset,actionMessage:null},changed:!0,refreshInspection:!0})}function Tw(e,t){return c0(e,m0(e.inspectionMode,Od,t))}function Pw(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=Yt(i===-1?0:i+t,0,r.length-1),a=r[o]??null;if(a===e.selectedFileTreePath)return E({state:e});let l=a!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(a);return E({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?V:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function d0(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 bw(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=Yt(e[t]+n,0,i);return o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function u0(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return p0(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=Yt(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=Yt(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:V,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===i?E({state:e}):E({state:{...e,diffScrollOffset:i,actionMessage:null},changed:!0})}if(t<0&&o<0){let u=a[l-1]??null;return u?E({state:{...e,selectedDiffPath:u,activeTab:V,openInspectionKind:"diff",diffScrollOffset:Number.MAX_SAFE_INTEGER,actionMessage:null},changed:!0,refreshInspection:!0}):e.diffScrollOffset===0?E({state:e}):E({state:{...e,diffScrollOffset:0,actionMessage:null},changed:!0})}let c=Yt(o,0,i);return c===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function p0(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=Yt(e.diffScrollOffset+t,0,i),a=f0(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 f0(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function pa(e,t,n,r){let s=n.indexOf(e[t]),i=Yt(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 ku(e,t,n,r,s=!1){if(n.length===0)return E({state:e});let i=n.indexOf(e[t]??n[0]??""),o=Yt(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 m0(e,t,n){let r=t.indexOf(e);return t[Yt(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 Rw(e,t){return t.includes(e)}function h0(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Sr(e.activeTab)??e.preferredPtyTabKind}function g0(e){return[e.selectedPtyTabId,e.openInspectionKind?V:null].filter(t=>typeof t=="string")}function Yt(e,t,n){return Math.min(n,Math.max(t,e))}var Sw=async(e,t,n,r)=>{if(!e.selectedTaskId)throw new Error("Select a task before creating a tab.");let s=await r.queueTaskMutation(async()=>H(r.paths,e.selectedTaskId,i=>{let o=t??y0(i,e.activeTab,e.preferredPtyTabKind),a=Aw(i,o,n??void 0,r.config);return{...i,ptyTabs:[...i.ptyTabs,a],selectedPtyTabId:a.id}}));return{updatedTask:s,nextShell:{activeTab:s.selectedPtyTabId??e.activeTab,selectedPtyTabId:s.selectedPtyTabId,preferredPtyTabKind:s.ptyTabs.at(-1)?.kind??e.preferredPtyTabKind,focusedRegion:"center",actionMessage:`Created tab: ${s.ptyTabs.at(-1)?.title??"tab"}`}}},Iw=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 H(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}`}}},vw=async(e,t)=>{let n=e.selectedTaskId;n&&await t.queueTaskMutation(async()=>{await H(t.paths,n,r=>!r.ptyTabs.some(s=>s.id===e.activeTab)||r.selectedPtyTabId===e.activeTab?r:{...r,selectedPtyTabId:e.activeTab})})},Cw=async(e,t)=>{let n=e.ptyTabs.find(s=>s.kind==="agent")??null;if(n)return await t.queueTaskMutation(async()=>{await H(t.paths,e.id,s=>{let i=s.ptyTabs.find(o=>o.kind==="agent")??null;return i?{...s,selectedPtyTabId:i.id}:s})}),{...e,selectedPtyTabId:n.id};let r=Aw(e,"agent",void 0,t.config);return await t.queueTaskMutation(async()=>{await H(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 y0(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function Aw(e,t,n,r={}){let s=n??e.runner,i=k.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(h=>h.id)),c=1,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 Nr=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},Ew=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 st(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=So();Io(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 Nr(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}},Ow=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},$w=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 Mr(t.paths,e.selectedTaskId),i=await t.taskService.closeTask(t.paths,e.selectedTaskId);return{taskBeforeClose:s,task:i}});return{closedTabIds:n.ptyTabs.map(s=>s.id),nextShell:{selectedActionId:"close-task",actionMessage:r.cleanup.preservedWorktree?`Archived task ${r.id}; worktree preserved`:`Archived task ${r.id}`}}},Nw=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Mr(t.paths,n.id)))),Dr=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await pe.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var Dw=async(e,t)=>{if(!e.selectedWorkspaceId)throw new Error("Select a workspace before removing it.");let n=await t.taskService.listTasks(t.paths,{workspaceId:e.selectedWorkspaceId,includeClosed:!0}),r=n.tasks.filter(i=>i.status!=="closed");if(r.length>0)throw new Error(`Close tasks before removing workspace: ${r.map(i=>`${i.id} (${i.status})`).join(", ")}.`);await t.workspaceService.archiveWorkspace(t.paths,e.selectedWorkspaceId);let s=n.tasks.length>0;return s||await t.workspaceService.removeWorkspace(t.paths,e.selectedWorkspaceId,{listTasks:t.taskService.listTasks}),{nextShell:{selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null,selectedPtyTabId:null,selectedLeftItemId:null,actionMessage:s?`Archived workspace ${e.selectedWorkspaceId}; closed task history preserved.`:`Removed workspace ${e.selectedWorkspaceId}`}}};var _w=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},Fw=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},xw=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var w0=250;function zt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function Jt(e,t){return Kt(t,e.ptyRuntime.getViewState(_r(e,t)))}function _r(e,t){let n=zt(e.model.tasks,t);return n?n.ptyTabs.some(r=>r.id===t.activeTab)?t.activeTab:t.activeTab==="agent"||t.activeTab==="terminal"?n.ptyTabs.find(r=>r.kind===t.activeTab)?.id??t.selectedPtyTabId:t.selectedPtyTabId:t.selectedPtyTabId}function v(e,t){return Jt(e,Qg(t,e.model))}function Lw(e,t,n){return e.footerToastTimer&&(clearTimeout(e.footerToastTimer),e.footerToastTimer=null),n?(e.footerToastTimer=setTimeout(()=>{e.footerToastTimer=null,!(e.state.mode!=="main"||e.state.shell.footerToast!==n)&&(e.state={mode:"main",shell:v(e,{...e.state.shell,footerToast:null})},e.render())},600),{...t,footerToast:n}):{...t,footerToast:null}}function Mw(e,t,n){return Lw(e,t,n?{tone:"success",message:n}:null)}function ce(e,t,n){return Lw(e,t,{tone:"error",message:n})}function oe(e,t,n,r){let s=n instanceof Error?n.message:r,i=n instanceof Error?n.stack??n.message:String(n);return pe.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function Z(e,t){if(!e.uiStateFile)return;e.runtimeState=xo(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>yt({uiStateFile:e.uiStateFile},n),()=>yt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function bu(e,t){if(!e.uiStateFile){e.runtimeState={...xo(e.runtimeState,e.state.shell),...t};return}e.runtimeState={...xo(e.runtimeState,e.state.shell),...t};let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>yt({uiStateFile:e.uiStateFile},n),()=>yt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function k0(e,t){let n=e.taskMutationQueue.then(t,t);return e.taskMutationQueue=n.then(()=>{},()=>{}),n}function de(e){return{paths:e.paths,config:e.config,taskService:S,workspaceService:be,queueTaskMutation:t=>k0(e,t)}}function Ru(e,t){let n=zt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?gu(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:qn(e.model),centerTabIds:ng(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:fw(t,n,s),pageRows:Math.max(5,Ve(e.activeTerminal.width,e.activeTerminal.height).height-ee.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:hu(n,s).map(a=>a.repoId)}}async function jw(e,t){await vw(t,de(e))}async function Ie(e){e.model=await Er(e.workspaceRoot,e.state.shell,e.enabledRunnerIds),e.state.mode==="main"?e.state={mode:"main",shell:v(e,e.state.shell)}:e.state={...e.state,shell:v(e,e.state.shell)}}function fa(e,t){e.model={...e.model,tasks:[...e.model.tasks.filter(n=>n.id!==t.id),...t.status==="closed"?[]:[t]].sort((n,r)=>n.id.localeCompare(r.id))}}async function ma(e,t){let n=++e.inspectionRefreshSequence,r=Vd(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 qg(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await Er(e.workspaceRoot,t,e.enabledRunnerIds),n!==e.inspectionRefreshSequence)return;e.model=o,e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,e.state.shell)},Z(e,e.state.shell),e.render())}function qw(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)&&ma(e,n).catch(r=>{let s=oe(e,"refresh inspection",r,"Failed to refresh inspection.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,actionMessage:s}),s)},e.render()})},w0))}function Uw(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=yn(e.state.shell,n,Ru(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render(),ma(e,e.state.shell).catch(s=>{let i=oe(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render()}},16)))}function Pu(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function Su(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 Ww(e){Su(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,e.state.shell)},e.render())})}async function Vw(e,t){let n=v(e,t),r=zt(e.model.tasks,n),s=_r(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 Kt(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,Gt(Ve(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),n.centerZoomed));return Kt({...n,inputMode:"control"},o)}function Iu(e){let t=e.state.mode==="main"&&e.state.shell.inputMode==="terminal"?"terminal":"control";t!==e.inputCaptureMode&&(e.inputCaptureMode=t,e.activeTerminal.grabInput(t==="terminal"?{mouse:"button"}:!0))}async function vu(e,t){try{let n=v(e,t),r=zt(e.model.tasks,n),s=n.selectedPtyTabId;if(r&&n.focusedRegion==="tasks"){let a=r.ptyTabs.find(l=>l.kind==="agent")??null;a?s=a.id:(r=await Bw(e,r),await Ie(e),s=r.selectedPtyTabId)}r&&!s&&(r=await Bw(e,r),await Ie(e),s=r.selectedPtyTabId);let i=v(e,{...n,activeTab:s??n.activeTab,selectedPtyTabId:s,focusedRegion:s?"center":n.focusedRegion});if(!i.selectedTaskId||!s){e.state={mode:"main",shell:i},e.render();return}e.state={mode:"main",shell:Kt({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},Z(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,Gt(Ve(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),i.centerZoomed));e.suppressTerminalEnterOnAttach=Ht(s),e.lastTerminalKey=null,e.state={mode:"main",shell:Kt({...i,inputMode:"terminal"},o)},Z(e,e.state.shell)}catch(n){let r=oe(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&Ht(t.selectedPtyTabId)&&(await T0(e,t.selectedTaskId,r).catch(()=>{}),await Ie(e).catch(()=>{})),e.state={mode:"main",shell:ce(e,Qh(v(e,t),r),r)},Z(e,e.state.shell)}e.render()}async function T0(e,t,n){await Ow(t,n,de(e))}async function Kw(e,t,n,r){let s=v(e,t),{nextShell:i}=await Sw(s,n,r,de(e));return await Ie(e),v(e,{...s,...i})}async function Gw(e,t){let n=v(e,t),{closedTab:r,nextShell:s}=await Iw(n,de(e));return e.ptyRuntime.disposeSession(r.id),await Ie(e),v(e,{...n,...s})}async function Hw(e,t){let n=v(e,t),r=qn(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await $w(n,de(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Ie(e),v(e,{...n,...o,selectedLeftItemId:b0(r,qn(e.model),s)})}async function Yw(e,t){let n=v(e,t),r=e.model.workspaces?.findIndex(a=>a.id===n.selectedWorkspaceId)??-1,{nextShell:s}=await Dw(n,de(e));await Ie(e);let i=e.model.workspaces??[],o=i[Math.min(Math.max(0,r),i.length-1)];return v(e,{...n,...s,selectedLeftItemId:o?`workspace:${o.id}`:null})}async function Bw(e,t){return Cw(t,de(e))}function ha(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:Jt(e,e.state.shell)},e.render())},16))}function zw(e){e.scrollRenderTimer&&(clearTimeout(e.scrollRenderTimer),e.scrollRenderTimer=null),e.pendingScrollLines=0,e.ptyRuntime.scrollViewport(Number.MAX_SAFE_INTEGER),e.state.mode==="main"&&(e.state={mode:"main",shell:Jt(e,e.state.shell)},e.render())}function b0(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 Xw(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=Jw(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await Nw(s,de(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)fa(e,o);t.recordSuccess(i,Jw(e)),e.state={mode:"main",shell:v(e,e.state.shell)},e.render()}catch(i){if(n?.aborted)return;t.recordFailure(s,i);let o=i instanceof Error?i.message:"Background PR discovery failed.";o!==e.lastBackgroundPrPollError&&(e.lastBackgroundPrPollError=o,Dr("background PR polling",i,de(e)))}}function Jw(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function Qw(e,t){let n=v(e,t),r=zt(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: ${Y(a)?.requiredChecks.length??0} reported`)}return v(e,{...Mw(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import v0 from"node:path";import{readdir as R0,stat as P0}from"node:fs/promises";import Zw from"node:path";async function S0(e){let t=await R0(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=Zw.join(e,r.name);n.push({name:r.name,path:s,kind:await I0(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 ek(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function tk(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 ga(e,t){let n=await S0(t);e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:n,activeTab:e.state.shell.selectedPtyTabId??e.state.shell.activeTab,actionMessage:null})},e.render())}async function I0(e){let t=Zw.join(e,".git");return await P0(t).catch(()=>null)!==null}function nk(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function rk(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function C0(e){if(e.state.mode!=="main"||e.creatingTask)return;let t=e.state.shell,n=t.taskPromptInput?.trim()??"",r=t.taskPromptTarget;if(!r||!r.repoId&&!r.workspaceId){e.state={mode:"main",shell:v(e,{...t,taskPromptError:"Select a workspace first."})},e.render();return}if(n.length===0){e.state={mode:"main",shell:v(e,{...t,taskPromptError:"Task prompt cannot be empty."})},e.render();return}e.creatingTask=!0,e.state={mode:"main",shell:v(e,{...t,actionMessage:`Creating ${t.selectedRunner} task in ${r.name}...`})},e.render();let s=null;try{let i=await Ew(r.repoId,r.workspaceId,n,t.selectedRunner,de(e));s=i.task,await Ie(e);let o=v(e,{...e.state.shell,...i.nextShell,selectedLeftItemId:`task:${s.id}`,inputMode:"terminal",taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null}),a=await e.ptyRuntime.ensureSession(s.id,o.selectedPtyTabId??ey(s,"agent"),Gt(Ve(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Ht(o.selectedPtyTabId),e.state={mode:"main",shell:Kt(o,a)},Z(e,e.state.shell)}catch(i){i instanceof Nr&&(s=i.task);let o=oe(e,"create task",i,"Failed to create task.");s&&!(i instanceof Nr)?(await H(e.paths,s.id,a=>({...a,status:"draft",runnerSession:{...a.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:o})).catch(()=>{}),await Ie(e).catch(()=>{})):s&&(await H(e.paths,s.id,a=>({...a,lastFailureReason:o})).catch(()=>{}),await Ie(e).catch(()=>{})),e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,inputMode:"control",selectedTaskId:s?.id??e.state.shell.selectedTaskId,selectedPtyTabId:s?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:s?`task:${s.id}`:e.state.shell.selectedLeftItemId,activeTab:s?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:s?null:"",taskPromptError:o,actionMessage:null}),o)}}finally{e.creatingTask=!1,e.render()}}function A0(e,t){if(e.state.mode!=="main")return;let n=e.state.shell;if(n.taskPromptInput!==null){if(t==="ESCAPE"){e.state={mode:"main",shell:v(e,{...n,taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null})},e.render();return}if(Se(t)){C0(e);return}if(t==="BACKSPACE"){e.state={mode:"main",shell:v(e,{...n,taskPromptInput:n.taskPromptInput.slice(0,-1),taskPromptError:null})},e.render();return}if(t==="CTRL_R"){e.state={mode:"main",shell:v(e,{...n,selectedRunner:Mo(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}$d(t)&&(e.state={mode:"main",shell:v(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function E0(e,t){if(e.state.mode!=="main")return;let n=e.state.shell.workspaceBrowser;if(!n)return;if(t==="ESCAPE"){if(n.query!==null){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:null,selectedIndex:0}})},e.render();return}e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:null,actionMessage:null})},e.render();return}if(t==="/"){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:"",selectedIndex:0}})},e.render();return}if(n.query!==null&&(t==="BACKSPACE"||t==="DELETE")){let s=n.query.slice(0,-1);e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:s,selectedIndex:0}})},e.render();return}if(n.query!==null&&t.length===1&&t>=" "){let s=n.query+t;e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,query:s,selectedIndex:0}})},e.render();return}let r=ek(n);if(t==="UP"||t==="k"){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,selectedIndex:Math.max(0,n.selectedIndex-1),error:null}})},e.render();return}if(t==="DOWN"||t==="j"){e.state={mode:"main",shell:v(e,{...e.state.shell,workspaceBrowser:{...n,selectedIndex:Math.min(Math.max(0,r.length-1),n.selectedIndex+1),error:null}})},e.render();return}if(t==="LEFT"||t==="h"){ga(e,v0.dirname(n.cwd)).catch(s=>{let i=oe(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:i}}),i)},e.render()});return}if(t==="RIGHT"||t==="l"||Se(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){ga(e,s.path).catch(o=>{let a=oe(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()});return}let{workspaceService:i}=de(e);i.addWorkspace(e.paths,s.path).then(async o=>{await Ie(e);let a=o.repos[0]??null,l=v(e,{...e.state.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${o.workspace.id}`,selectedWorkspaceId:o.workspace.id,selectedRepoId:a?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${o.workspace.name??o.workspace.id}`});e.state={mode:"main",shell:l},Z(e,e.state.shell),e.render()}).catch(o=>{let a=oe(e,"add workspace",o,"Failed to add workspace.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()})}}function O0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=By(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;$0(e,r)}}}async function $0(e,t){let n;try{n=await pe.readLog(e.paths)}catch(r){let s=oe(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 N0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=Vy(nk(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"?_w(n.runner,n.enabled,de(e)):Fw(n.runner,n.path,de(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:v(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),runnerOptions:n.state},e.render())}).catch(s=>{if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let i=oe(e,"save runner option",s,"Failed to save runner option.");e.state={...e.state,shell:ce(e,v(e,e.state.shell),i),runnerOptions:{...nk(e),message:i}},e.render()})}function D0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=Wy(rk(e),e.config,t);if(n.kind!=="noop"){if(n.kind==="back"){bu(e,{seenPreviewIds:[...kt]});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}xw(n.feature,n.enabled,de(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,e.enabledRunnerIds=k.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:v(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:k.runners.getDefault(e.config)}),previewOptions:n.state},e.render())}).catch(r=>{if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let s=oe(e,"save feature preview",r,"Failed to save feature preview.");e.state={...e.state,shell:ce(e,v(e,e.state.shell),s),previewOptions:{...rk(e),message:s}},e.render()})}}function ya(e){let t=v(e,{...e.state.shell,inputMode:"control"});e.state={mode:"main",shell:t},e.pendingClear=!0,e.render(),e.bootHydrationReady.then(()=>{e.state.mode!=="main"||e.state.shell!==t||Vw(e,t).then(n=>{e.state.mode!=="main"||e.state.shell!==t||(e.state={mode:"main",shell:n},Z(e,e.state.shell),e.render())}).catch(n=>{if(e.state.mode!=="main"||e.state.shell!==t)return;let r=oe(e,"warm selected PTY",n,"Failed to start selected PTY.");e.state={mode:"main",shell:ce(e,v(e,e.state.shell),r)},Z(e,e.state.shell),e.render()})})}function _0(e){return[...e instanceof Error?e.message:"npm could not install the update."].map(r=>{let s=r.charCodeAt(0);return s<=31||s>=127&&s<=159?" ":r}).join("").replace(/\s+/g," ").trim().slice(0,160)}function sk(e){if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let t=e.state.update.latest;e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"installing"}},e.render(),e.installUpdate(t).then(()=>{e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update||(e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"success"}},e.pendingClear=!0,e.render())}).catch(n=>{if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let r=_0(n);oe(e,"update Craig",n,r),e.state={...e.state,menuIndex:0,update:{...e.state.update,phase:"error",error:r}},e.pendingClear=!0,e.render()})}function F0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="update"||!e.state.update)return;let n=e.state.update.phase;if(n==="installing")return;if(t==="ESCAPE"){ya(e);return}let r=n==="ready"?2:1;if(t==="UP"||t==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(t==="DOWN"||t==="j"){e.state={...e.state,menuIndex:Math.min(r,e.state.menuIndex+1)},e.render();return}if(Se(t)){if(n==="ready"&&e.state.menuIndex===0){sk(e);return}if(n==="ready"&&e.state.menuIndex===2){bu(e,{ignoredUpdateVersion:e.state.update.latest}),e.updateText=null,ya(e);return}if(n==="error"&&e.state.menuIndex===0){sk(e);return}if(n==="success"&&e.state.menuIndex===1){e.exit(0);return}ya(e)}}function ik(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){A0(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){E0(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(k.previews.isEnabled(e.config,"agentOrchestration")&&e.state.shell.fileSearchQuery===null&&(n==="f"||Se(n)&&e.state.shell.focusedRegion==="tasks"&&e.state.shell.selectedLeftItemId==="fury-plans")){Dg(e);return}if(n==="F"){L0(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=Tu(e.state.shell,n,Ru(e,e.state.shell));if(r.exit){e.exit(0);return}if(r.detachTerminal){e.ptyRuntime.detach(),e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render();return}if(e.state.shell.inputMode==="terminal"){if(r.changed){e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&Se(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=Us(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(x0(e,n))return;e.lastTerminalKey=ty(n)?{key:n,at:Date.now()}:null;let i=ny(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){ha(e,i);return}$d(n)&&(e.state.shell.terminal.scrolledBack||e.pendingScrollLines<0)&&Ht(e.state.shell.selectedPtyTabId)&&zw(e),e.ptyRuntime.writeKey(n);return}if(n==="CTRL_C"){e.exit(0);return}if(n==="?"&&e.state.shell.inputMode==="control"){e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render();return}if(r.pause){e.state={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:v(e,r.state)},e.pendingClear=!0,e.render();return}if(r.beginTaskPrompt){let s=v(e,r.state),i=e.model.workspaces?.find(a=>a.id===s.selectedWorkspaceId),o=e.model.repos.find(a=>a.id===s.selectedRepoId);e.state={mode:"main",shell:{...s,taskPromptTarget:{workspaceId:i?.id??null,repoId:o?.id??null,name:i?.name??o?.name??"no workspace"}}},Z(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){ga(e,e.workspaceRoot).catch(s=>{let i=oe(e,"browse workspaces",s,"Failed to browse workspaces.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,workspaceBrowser:{cwd:e.workspaceRoot,entries:[],selectedIndex:0,query:null,error:i}}),i)},e.render()});return}if(r.createPtyTab){Kw(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{vu(e,s)}).catch(s=>{let i=oe(e,"create PTY tab",s,"Failed to create tab.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.closePtyTab){Gw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"close PTY tab",s,"Failed to close tab.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.refreshPullRequestChecks){Qw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"refresh PR checks",s,"Failed to refresh PR checks.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.openPrUrl){let s=zt(e.model.tasks,r.state),i=s?Y(s)?.url??null:null;i?tk(i).catch(o=>{let a=oe(e,"open PR URL",o,"Failed to open PR in browser.");e.state={mode:"main",shell:ce(e,v(e,r.state),a)},e.render()}):(e.state={mode:"main",shell:ce(e,v(e,r.state),"No PR URL available.")},e.render());return}if(r.closeTask){Hw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"close task",s,"Failed to close task.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.removeWorkspace){Yw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Z(e,e.state.shell),e.render()}).catch(s=>{let i=oe(e,"remove workspace",s,"Failed to remove workspace.");e.state={mode:"main",shell:ce(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.attachTerminal){vu(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:v(e,r.state)},Z(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){qw(e,e.state.shell);return}ma(e,e.state.shell).catch(s=>{let i=oe(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ce(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}r.changed&&(e.state={mode:"main",shell:v(e,r.state)},jw(e,e.state.shell).catch(()=>{}),Z(e,e.state.shell),e.render());return}if(e.state.variant==="fury-plans"){_g(e,n);return}if(e.state.variant==="help"){e.state.viaOptions&&e.state.parentVariant?e.state={mode:"overlay",variant:"options",menuIndex:3,optionsMessage:null,shell:e.state.shell,parentVariant:e.state.parentVariant}:e.state.parentVariant?e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell}:e.state={mode:"main",shell:v(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){O0(e,n);return}if(e.state.variant==="runners"){N0(e,n);return}if(e.state.variant==="previews"){D0(e,n);return}if(e.state.variant==="logs"){if(n==="ESCAPE"||Se(n)){let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:2,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render()}return}if(e.state.variant==="update"){F0(e,n);return}if(e.state.optionsMessage){(n==="ESCAPE"||Se(n))&&(e.state={...e.state,optionsMessage:null},e.render());return}if(n==="UP"||n==="k"){e.state={...e.state,menuIndex:Math.max(0,e.state.menuIndex-1)},e.render();return}if(n==="DOWN"||n==="j"){e.state={...e.state,menuIndex:Math.min(2,e.state.menuIndex+1)},e.render();return}if(n==="ESCAPE"){e.state.variant==="pause"&&(e.state={mode:"main",shell:v(e,e.state.shell)},e.pendingClear=!0,e.render());return}if(Se(n)){if(e.state.menuIndex===0){e.state.variant==="boot"?ya(e):(e.state={mode:"main",shell:v(e,{...e.state.shell,inputMode:"control"})},e.pendingClear=!0,e.render(),Ww(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 ok(e,t){let n=ay(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=Us(i);if(o){lk(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(Hd(i)){e.pendingTerminalKeySequence.raw=i,ak(e);return}wa(e)}if(n.includes("")){e.ptyRuntime.detach(),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey=null,e.state={mode:"main",shell:v(e,{...e.state.shell,inputMode:"control",actionMessage:null,focusedRegion:"center"})},Z(e,e.state.shell),e.render();return}let r=ry(n);if(r!==0){ha(e,r);return}let s=Us(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
293
295
  `&&n!==`\r
294
- `&&(e.suppressTerminalEnterOnAttach=!1),Qg(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function A0(e,t){if(e.pendingTerminalKeySequence){let n=Jg(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Ls(r);if(s)return ek(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(Wd(r))return e.pendingTerminalKeySequence.raw=r,Zw(e),!0}return ha(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>ha(e),30)},!0)}function Zw(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>ha(e),30))}function ha(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function ek(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function tk(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){Dw(e,Bd(t));return}let n=Bd(t);n!==0&&pa(e,n)}function E0(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var $0=O0(import.meta.url),N0=$0("terminal-kit"),D0=N0.terminal;function Pu(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function nk(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function rk(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function _0(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 sk(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=Oe(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=Ns(og(i,r),o);o=await Sr(t,a,s);let l={current:o},c=()=>{},d=()=>{},u=()=>{},p={workspaceRoot:t,onUpdate:f=>c(f),onActivity:f=>d(f),onActivityRemoved:f=>u(f),resolveSessionSpec:(f,m)=>Kg(l.current,m,t)},h=e.ptyRuntime??await gy({...p,paths:n,activityEnabled:!0});return new Promise(f=>{let m=e.terminal??D0,y=null,T=null,R=null,b=null,$=null,N=0,D=!1,_=!1,A=!1,Y=new Map,_e=h.managesPullRequestSync?null:new Or({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,z=new hn({resolutionMs:eu,onError:(S,L)=>Nr(`heartbeat job "${S}"`,L,de(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:Ns(a,o)},get model(){return l.current},set model(S){l.current=S},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:`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:S=>f(S),installUpdate:e.installUpdate??Ly},w.ptyRuntime.setActivityEnabled?.(!0);let Ot=()=>w.state.mode==="overlay"&&(w.state.variant==="boot"||w.state.variant==="pause")&&k.previews.isEnabled(w.config,"panelPolish");c=S=>{w.state.mode==="main"&&($=_0($,S),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let L=$;if($=null,w.state.mode==="main"){let re=Jt(w,w.state.shell);if(w.state={mode:"main",shell:re},!b||!T){w.render();return}let ge=We(m.width,m.height),ye={...b,terminal:re.terminal},Ve=cw(ge,ye,T,re.centerZoomed,L?.kind==="rows"?L.rowIndices:null,k.previews.isEnabled(w.config,"panelPolish"));if(!Ve){w.render();return}Ve.output.length>0&&m.noFormat(Ve.output),b=ye,T=Ve.region,R&&(R={...R,center:Ve.region}),y=null,m.hideCursor(!0)}},0)))},d=S=>{if(Ot()){w.render();return}let L=Ye(S.tabId,[S],Date.now());w.state.mode==="main"&&Ht(S.tabId)&&(Y.get(S.tabId)!==L||L==="ready")&&w.render()},u=S=>{if(Ot()){w.render();return}w.state.mode==="main"&&Ht(S)&&Y.get(S)!=="idle"&&w.render()};let qs=Promise.resolve(),ga=S=>{qs=qs.then(async()=>{let L=await Promise.all([...new Set(S)].map(re=>P.getTask(w.paths,re)));for(let re of L)da(w,re);w.state.mode==="main"?w.state={mode:"main",shell:v(w,w.state.shell)}:w.state={...w.state,shell:v(w,w.state.shell)},w.render()}).catch(L=>Nr("daemon task-state refresh",L,de(w)))};w.ptyRuntime.setTasksChangedHandler?.(ga);let Su=Promise.resolve(),ok=S=>{Su=Su.then(async()=>{let L=w.state.shell,re=w.model.tasks.find(Us=>Us.id===L.selectedTaskId)??null,ge=re&&w.model.inspection?.taskId===re.id?w.model.inspection:null;if(!re||!ge)throw new Error("Craig needs an active task before it can open a file from an agent session.");let ye=await Qh(S);w.model={...w.model,inspection:{...ge,filePaths:[...new Set([...ge.filePaths,S])],selectedFilePath:S,selectedFile:ye,error:null}},w.ptyRuntime.detach();let Ve=v(w,{...L,inputMode:"control",focusedRegion:"center",activeTab:V,inspectionMode:"files",openInspectionKind:"file",selectedFileTreePath:S,selectedFilePath:S,fileScrollOffset:0,actionMessage:null});w.state={mode:"main",shell:Ve},Z(w,Ve),w.render()}).catch(L=>Nr("open file from agent",L,de(w)))};w.ptyRuntime.setOpenFileHandler?.(ok);let ya=null,Iu=S=>{let L=We(m.width,m.height);if(k.previews.isEnabled(w.config,"panelPolish")){let Bs=`${L.width}:${L.height}:${S.shell.centerZoomed}`;ya!==Bs&&(ya=Bs,w.ptyRuntime.resize(Gt(L,!0,S.shell.centerZoomed)),S.shell=Jt(w,S.shell))}else ya=null;let re=w.ptyRuntime.getActivitySnapshots?.()??[],ge=Date.now(),ye=v(w,S.shell),Ve=jy(ye,w.model.tasks,re,ge);Ve!==ye&&(S.shell.readAgentActivityAt=Ve.readAgentActivityAt,Z(w,S.shell));let Us=Xy(Ve,w.model,{snapshots:re,now:ge,animationFrame:N});Y.clear();for(let Bs of w.model.tasks)for(let wa of Bs.ptyTabs)wa.kind==="agent"&&Y.set(wa.id,Ye(wa.id,re,ge));let lk=Cg(L,Us,{versionText:w.versionText,updateText:w.updateText,centerOnly:S.shell.centerZoomed,panelPolish:k.previews.isEnabled(w.config,"panelPolish"),focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:Us,presentation:lk}},vu=(S,L,re,ge)=>{if(!R)return!1;let ye=dw(R,L.regions,re);return ye?(ye.output.length>0&&m.noFormat(ye.output),b=S,R=ye.regions,T=ye.regions.center,y=ge?L.frame:null,m.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;bu(w),w.ptyRuntime.setPullRequestPollView?.(rk(w.state)),w.ptyRuntime.setViewedTab?.(Dr(w,w.state.shell));let{data:S,presentation:L}=Iu(w.state);return vu(S,L,["rail","left","center","footer"],!1)},w.render=()=>{bu(w);let S=w.state;w.ptyRuntime.setPullRequestPollView?.(rk(S)),w.ptyRuntime.setViewedTab?.(S.mode==="main"?Dr(w,S.shell):null);let L=We(m.width,m.height),re,ge=null;if(S.mode==="main"){let ye=Iu(S);if(ge=ye.presentation,re=ge.frame,!w.pendingClear&&vu(ye.data,ge,["rail","left","center","right","footer"],!0))return;b=ye.data,T=ge.center}else re=S.variant==="boot"||S.variant==="pause"?(S.variant==="boot"?bg:Pg)(L,{...k.previews.isEnabled(w.config,"panelPolish")?{splashSummary:qy(w.model,w.ptyRuntime.getActivitySnapshots?.()??[],Date.now(),_&&w.ptyRuntime.getActivitySnapshots!==void 0)}:{},panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:S.menuIndex,optionsMessage:S.optionsMessage,versionText:w.versionText,updateText:w.updateText}):S.variant==="options"?Yo(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:S.menuIndex,optionsMenuItems:$y(w.runtimeState?.seenPreviewIds)}):S.variant==="runners"?Yo(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:Pu(S).menuIndex,optionsMenuItems:Zd(w.config,Pu(S)),optionsMessage:Oy(Pu(S)),optionsSubtitle:"Runners"}):S.variant==="previews"?Yo(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:nk(S).menuIndex,optionsMenuItems:Ny(w.config,w.runtimeState?.seenPreviewIds),optionsMessage:Dy(nk(S)),optionsSubtitle:"Feature Previews - Experimental"}):S.variant==="update"&&S.update?Sg(L,S.update,{menuIndex:S.menuIndex}):S.variant==="logs"?vg(L,{logPath:S.log?.path??n.logFile,logLines:S.log?.lines??[]}):Ig(L),b=null,T=null,R=null;w.pendingClear&&(m.moveTo(1,1),m.eraseDisplayBelow(),w.pendingClear=!1,y=null),m.noFormat(ey(re,y)),y=re,R=ge?.regions??null,m.hideCursor(!0)};let Cu=S=>Xw(w,S),Au=S=>Qw(w,S),Eu=S=>tk(w,S),ak=()=>{A=!0,process.stdout.off("resize",Ou),process.off("SIGCONT",$u),m.removeListener("key",Cu),m.removeListener("unknown",Au),m.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),z.stop(),w.ptyRuntime.disposeAll(),m.grabInput(!1),m.hideCursor(!1),m.fullscreen(!1)};w.exit=S=>{ak(),f(S)};let Ou=()=>{ku(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Gt(We(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Jt(w,w.state.shell)}),w.render()},$u=()=>{ku(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Gt(We(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Jt(w,w.state.shell)}),w.render()};process.stdout.on("resize",Ou),process.on("SIGCONT",$u),m.grabInput(!0),w.inputCaptureMode="control",m.hideCursor(!0),m.fullscreen(!0),m.on("key",Cu),m.on("unknown",Au),m.on("mouse",Eu),_e&&z.register({id:"github.pull-requests",intervalMs:1e3,run:S=>Ww(w,_e,S)}),z.register({id:"agent.activity-indicators",intervalMs:eu,run:()=>{let S=Date.now(),L=Ri(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],S);(L||D)&&(N=(N+1)%My,(w.state.mode==="main"||Ot())&&w.render()),D=L}}),z.start(),(e.checkForUpdate??k.version.checkForUpdate)().then(S=>{if(S.updateAvailable&&S.latest){if(w.runtimeState?.ignoredUpdateVersion===S.latest)return;w.updateText=`\u2192 v${S.latest} available`,w.state.mode==="overlay"&&w.state.variant==="boot"&&(w.state={mode:"overlay",variant:"update",menuIndex:0,optionsMessage:null,shell:w.state.shell,update:{current:S.current,latest:S.latest,phase:"ready"}},w.pendingClear=!0),w.render()}}),w.bootHydrationReady=Tu(w).then(()=>{_=!0}).catch(()=>{}).finally(()=>{!A&&Ot()&&w.render()}),w.render()})}async function F0(){try{if(process.argv[2]==="__craig-daemon"){let e=await ik(process.argv[3]??process.cwd()),t=Oe(e);return await yy(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await ik(process.argv[3]??process.cwd()),t=Oe(e);return await wy(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
295
- `),1}return Uh({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=>sk({uiStateFile:Oe(e).uiStateFile,workspaceRoot:e})})}async function ik(e){return x0(e)}var L0=await F0();await Promise.all([process.stdout,process.stderr].filter(e=>e.writableLength>0).map(e=>new Promise(t=>e.write("",()=>t()))));process.exit(L0);
296
+ `&&(e.suppressTerminalEnterOnAttach=!1),oy(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function x0(e,t){if(e.pendingTerminalKeySequence){let n=sy(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Us(r);if(s)return lk(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(Hd(r))return e.pendingTerminalKeySequence.raw=r,ak(e),!0}return wa(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>wa(e),30)},!0)}function ak(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>wa(e),30))}function wa(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function lk(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function ck(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){Uw(e,Gd(t));return}let n=Gd(t);n!==0&&ha(e,n)}function L0(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var j0=M0(import.meta.url),q0=j0("terminal-kit"),U0=q0.terminal;function Cu(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function dk(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function uk(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function B0(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 pk(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=$e(t),r=await k.load(n),s=k.runners.getEnabled(r),i=e.uiStateFile?await Bn({uiStateFile:e.uiStateFile}):null,o=await Er(t,void 0,s),a=jn(Xh(i,r),o);o=await Er(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)=>Zg(l.current,m,t)},h=e.ptyRuntime??await Sy({...p,paths:n,activityEnabled:!0});return new Promise(f=>{let m=e.terminal??U0,y=null,T=null,R=null,b=null,$=null,N=0,D=!1,_=!1,A=!1,z=new Map,Fe=h.managesPullRequestSync?null:new $r({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,K=new hn({resolutionMs:su,onError:(P,L)=>Dr(`heartbeat job "${P}"`,L,de(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:jn(a,o)},get model(){return l.current},set model(P){l.current=P},config:r,enabledRunnerIds:s,creatingTask:!1,suppressTerminalEnterOnAttach:!1,lastTerminalKey:null,pendingScrollLines:0,pendingInspectionScrollLines:0,leftNavInspectionTimer:null,pendingLeftNavInspectionShell:null,pendingTerminalKeySequence:null,scrollRenderTimer:null,inspectionScrollRenderTimer:null,ptyRenderTimer:null,footerToastTimer:null,focusFlashUntil:null,focusFlashTimer:null,lastBackgroundPrPollError:null,versionText:`v${k.version.getCurrent()}`,updateText:null,inspectionRefreshSequence:0,pendingClear:!0,inputCaptureMode:null,runtimeState:i,persistQueue:Promise.resolve(),taskMutationQueue:Promise.resolve(),bootHydrationReady:Promise.resolve(),paths:n,workspaceRoot:t,uiStateFile:e.uiStateFile,activeTerminal:m,ptyRuntime:h,resolve:f,render:()=>{},renderTaskNavigation:()=>!1,exit:P=>f(P),installUpdate:e.installUpdate??Ky},w.ptyRuntime.setActivityEnabled?.(!0);let Ot=()=>w.state.mode==="overlay"&&(w.state.variant==="boot"||w.state.variant==="pause")&&k.previews.isEnabled(w.config,"panelPolish");c=P=>{w.state.mode==="main"&&($=B0($,P),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let L=$;if($=null,w.state.mode==="main"){let re=Jt(w,w.state.shell);if(w.state={mode:"main",shell:re},!b||!T){w.render();return}let ge=Ve(m.width,m.height),ye={...b,terminal:re.terminal},Ke=yw(ge,ye,T,re.centerZoomed,L?.kind==="rows"?L.rowIndices:null,k.previews.isEnabled(w.config,"panelPolish"));if(!Ke){w.render();return}Ke.output.length>0&&m.noFormat(Ke.output),b=ye,T=Ke.region,R&&(R={...R,center:Ke.region}),y=null,m.hideCursor(!0)}},0)))},u=P=>{if(Ot()){w.render();return}let L=ze(P.tabId,[P],Date.now());w.state.mode==="main"&&Ht(P.tabId)&&(z.get(P.tabId)!==L||L==="ready")&&w.render()},d=P=>{if(Ot()){w.render();return}w.state.mode==="main"&&Ht(P)&&z.get(P)!=="idle"&&w.render()};let Vs=Promise.resolve(),ka=P=>{Vs=Vs.then(async()=>{let L=await Promise.all([...new Set(P)].map(re=>S.getTask(w.paths,re)));for(let re of L)fa(w,re);w.state.mode==="main"?w.state={mode:"main",shell:v(w,w.state.shell)}:w.state={...w.state,shell:v(w,w.state.shell)},w.render()}).catch(L=>Dr("daemon task-state refresh",L,de(w)))};w.ptyRuntime.setTasksChangedHandler?.(ka);let Au=Promise.resolve(),mk=P=>{Au=Au.then(async()=>{let L=w.state.shell,re=w.model.tasks.find(Ks=>Ks.id===L.selectedTaskId)??null,ge=re&&w.model.inspection?.taskId===re.id?w.model.inspection:null;if(!re||!ge)throw new Error("Craig needs an active task before it can open a file from an agent session.");let ye=await Yg(P);w.model={...w.model,inspection:{...ge,filePaths:[...new Set([...ge.filePaths,P])],selectedFilePath:P,selectedFile:ye,error:null}},w.ptyRuntime.detach();let Ke=v(w,{...L,inputMode:"control",focusedRegion:"center",activeTab:V,inspectionMode:"files",openInspectionKind:"file",selectedFileTreePath:P,selectedFilePath:P,fileScrollOffset:0,actionMessage:null});w.state={mode:"main",shell:Ke},Z(w,Ke),w.render()}).catch(L=>Dr("open file from agent",L,de(w)))};w.ptyRuntime.setOpenFileHandler?.(mk);let Ta=null,Eu=P=>{let L=Ve(m.width,m.height);if(k.previews.isEnabled(w.config,"panelPolish")){let Gs=`${L.width}:${L.height}:${P.shell.centerZoomed}`;Ta!==Gs&&(Ta=Gs,w.ptyRuntime.resize(Gt(L,!0,P.shell.centerZoomed)),P.shell=Jt(w,P.shell))}else Ta=null;let re=w.ptyRuntime.getActivitySnapshots?.()??[],ge=Date.now(),ye=v(w,P.shell),Ke=Hy(ye,w.model.tasks,re,ge);Ke!==ye&&(P.shell.readAgentActivityAt=Ke.readAgentActivityAt,Z(w,P.shell));let Ks=iw(Ke,w.model,{snapshots:re,now:ge,animationFrame:N});z.clear();for(let Gs of w.model.tasks)for(let ba of Gs.ptyTabs)ba.kind==="agent"&&z.set(ba.id,ze(ba.id,re,ge));let gk=gg(L,Ks,{versionText:w.versionText,updateText:w.updateText,centerOnly:P.shell.centerZoomed,panelPolish:k.previews.isEnabled(w.config,"panelPolish"),focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:Ks,presentation:gk}},Ou=(P,L,re,ge)=>{if(!R)return!1;let ye=ww(R,L.regions,re);return ye?(ye.output.length>0&&m.noFormat(ye.output),b=P,R=ye.regions,T=ye.regions.center,y=ge?L.frame:null,m.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;Iu(w),w.ptyRuntime.setPullRequestPollView?.(uk(w.state)),w.ptyRuntime.setViewedTab?.(_r(w,w.state.shell));let{data:P,presentation:L}=Eu(w.state);return Ou(P,L,["rail","left","center","footer"],!1)},w.render=()=>{Iu(w);let P=w.state;w.ptyRuntime.setPullRequestPollView?.(uk(P)),w.ptyRuntime.setViewedTab?.(P.mode==="main"?_r(w,P.shell):null);let L=Ve(m.width,m.height),re,ge=null;if(P.mode==="main"){let ye=Eu(P);if(ge=ye.presentation,re=ge.frame,!w.pendingClear&&Ou(ye.data,ge,["rail","left","center","right","footer"],!0))return;b=ye.data,T=ge.center}else re=P.variant==="boot"||P.variant==="pause"?(P.variant==="boot"?dg:pg)(L,{...k.previews.isEnabled(w.config,"panelPolish")?{splashSummary:Yy(w.model,w.ptyRuntime.getActivitySnapshots?.()??[],Date.now(),_&&w.ptyRuntime.getActivitySnapshots!==void 0)}:{},panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMessage:P.optionsMessage,versionText:w.versionText,updateText:w.updateText}):P.variant==="options"?Yo(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMenuItems:jy(w.runtimeState?.seenPreviewIds)}):P.variant==="runners"?Yo(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:Cu(P).menuIndex,optionsMenuItems:ru(w.config,Cu(P)),optionsMessage:My(Cu(P)),optionsSubtitle:"Runners"}):P.variant==="previews"?Yo(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:dk(P).menuIndex,optionsMenuItems:qy(w.config,w.runtimeState?.seenPreviewIds),optionsMessage:Uy(dk(P)),optionsSubtitle:"Feature Previews - Experimental"}):P.variant==="update"&&P.update?fg(L,P.update,{menuIndex:P.menuIndex}):P.variant==="logs"?hg(L,{logPath:P.log?.path??n.logFile,logLines:P.log?.lines??[]}):P.variant==="fury-plans"&&P.furyPlans?Mg(L,P.furyPlans):mg(L),b=null,T=null,R=null;w.pendingClear&&(m.moveTo(1,1),m.eraseDisplayBelow(),w.pendingClear=!1,y=null),m.noFormat(ly(re,y)),y=re,R=ge?.regions??null,m.hideCursor(!0)};let $u=P=>ik(w,P),Nu=P=>ok(w,P),Du=P=>ck(w,P),hk=()=>{A=!0,process.stdout.off("resize",_u),process.off("SIGCONT",Fu),m.removeListener("key",$u),m.removeListener("unknown",Nu),m.removeListener("mouse",Du),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),K.stop(),w.ptyRuntime.disposeAll(),m.grabInput(!1),m.hideCursor(!1),m.fullscreen(!1)};w.exit=P=>{hk(),f(P)};let _u=()=>{Pu(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Gt(Ve(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Jt(w,w.state.shell)}),w.render()},Fu=()=>{Pu(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Gt(Ve(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Jt(w,w.state.shell)}),w.render()};process.stdout.on("resize",_u),process.on("SIGCONT",Fu),m.grabInput(!0),w.inputCaptureMode="control",m.hideCursor(!0),m.fullscreen(!0),m.on("key",$u),m.on("unknown",Nu),m.on("mouse",Du),Fe&&K.register({id:"github.pull-requests",intervalMs:1e3,run:P=>Xw(w,Fe,P)}),K.register({id:"agent.activity-indicators",intervalMs:su,run:()=>{let P=Date.now(),L=vi(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],P);(L||D)&&(N=(N+1)%Gy,(w.state.mode==="main"||Ot())&&w.render()),D=L}}),K.register({id:"fury.pending-plans",intervalMs:1e3,run:P=>js(w,P)}),K.start(),(e.checkForUpdate??k.version.checkForUpdate)().then(P=>{if(P.updateAvailable&&P.latest){if(w.runtimeState?.ignoredUpdateVersion===P.latest)return;w.updateText=`\u2192 v${P.latest} available`,w.state.mode==="overlay"&&w.state.variant==="boot"&&(w.state={mode:"overlay",variant:"update",menuIndex:0,optionsMessage:null,shell:w.state.shell,update:{current:P.current,latest:P.latest,phase:"ready"}},w.pendingClear=!0),w.render()}}),w.bootHydrationReady=Su(w).then(()=>{_=!0}).catch(()=>{}).finally(()=>{!A&&Ot()&&w.render()}),w.render()})}async function V0(){try{if(process.argv[2]==="__craig-daemon"){let e=await fk(process.argv[3]??process.cwd()),t=$e(e);return await Iy(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await fk(process.argv[3]??process.cwd()),t=$e(e);return await vy(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
297
+ `),1}return Vh({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=>pk({uiStateFile:$e(e).uiStateFile,workspaceRoot:e})})}async function fk(e){return W0(e)}var K0=await V0();await Promise.all([process.stdout,process.stderr].filter(e=>e.writableLength>0).map(e=>new Promise(t=>e.write("",()=>t()))));process.exit(K0);