craig-cli 0.19.0 → 0.19.2

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 +149 -145
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
- var Qw=Object.defineProperty;var Us=(e,t)=>{for(var n in t)Qw(e,n,{get:t[n],enumerable:!0})};import{realpath as R0}from"node:fs/promises";import ke from"node:path";function Ee(e){let t=ke.join(e,".craig");return{workspaceRoot:e,repoRoot:e,craigDir:t,indexFile:ke.join(t,"index.json"),reposDir:ke.join(t,"repos"),workspacesDir:ke.join(t,"workspaces"),runtimeDir:ke.join(t,"runtime"),uiStateFile:ke.join(t,"runtime","ui-state.json"),tasksDir:ke.join(t,"tasks"),jobsDir:ke.join(t,"jobs"),commandsDir:ke.join(t,"commands"),eventsDir:ke.join(t,"events"),orchestrationDir:ke.join(t,"orchestration"),logsDir:ke.join(t,"logs"),logFile:ke.join(t,"logs","craig.jsonl"),artifactsDir:ke.join(t,"artifacts"),worktreesDir:ke.join(t,"worktrees"),configFile:ke.join(t,"config.json")}}import md from"node:path";import{readFile as dv}from"node:fs/promises";import{readFile as ok}from"node:fs/promises";import{randomUUID as Zw}from"node:crypto";import{chmod as ek,open as tk,readFile as nk,rename as rk,rm as sk}from"node:fs/promises";import ga from"node:path";async function B(e,t,n={}){let r=ga.dirname(e),s=ga.join(r,`.${ga.basename(e)}.${process.pid}.${Date.now()}.${Zw()}.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 ek(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await sk(s,{force:!0}).catch(()=>{}),o}}async function Bs(e){try{let t=await nk(e,"utf8");return JSON.parse(t)}catch(t){if(ik(t))return null;throw t}}function ik(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 ok(e.uiStateFile,"utf8"),n=JSON.parse(t);return ak(n,e.uiStateFile)}catch(t){if(lk(t))return null;throw t}}async function gt(e,t){await B(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function Vs(){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 ak(e,t){if(typeof e!="object"||e===null||e.version!==1||!(e.selectedRepoId===null||typeof e.selectedRepoId=="string")||!(e.selectedWorkspaceId===null||typeof e.selectedWorkspaceId=="string")||!(e.selectedTaskId===null||typeof e.selectedTaskId=="string")||!(e.selectedPtyTabId===void 0||e.selectedPtyTabId===null||typeof e.selectedPtyTabId=="string")||!yn(e,"inputMode")||!yn(e,"focusedRegion")||!yn(e,"activeTab")||!yn(e,"inspectorSection")||!yn(e,"inspectionMode")||!Ws(e,"openInspectionKind")||!Ws(e,"selectedFileTreePath")||!Ws(e,"selectedFilePath")||!Ws(e,"selectedDiffPath")||!vu(e,"collapsedFileTreePaths")||!yn(e,"ignoredUpdateVersion")||!vu(e,"seenPreviewIds")||!yn(e,"selectedActionId")||!ck(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 yn(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||typeof e[t]=="string")}function Ws(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function vu(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function lk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}function ck(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 ya={};Us(ya,{RUNNER_IDS:()=>de,STABLE_RUNNER_IDS:()=>yt,assertEnabled:()=>Eu,buildCommand:()=>Nu,getConfiguredProfile:()=>Ks,getDefault:()=>Au,getDisplayName:()=>$u,getEnabled:()=>Gs,getProfile:()=>Bn,isRunnerType:()=>Hs,parse:()=>Ou,setRunnerEnabled:()=>Du,setRunnerPath:()=>_u});var yt=["codex","cursor","claude"],de=[...yt,"pi"];var Cu={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=>Cu[e];var Ks=(e,t={})=>{let n=Bn(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}};var Gs=(e={})=>de.filter(t=>t!=="pi"||e.previews?.piRunner===!0).filter(t=>e.runners?.[t]?.enabled!==!1);var Au=(e={})=>{let t=Gs(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 Eu=(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 Hs=e=>de.includes(e);var Ou=e=>{if(!e||e.length===0)return"codex";if(!Hs(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${de.join(", ")}.`);return e};var $u=e=>Bn(e).displayName;var Nu=(e,t,n={})=>{let r=[Ks(e,n).executable];return t&&t.length>0&&r.push(t),r};var Du=(e,t,n)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}});var _u=(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 wa={};Us(wa,{PREVIEW_FEATURE_IDS:()=>De,isEnabled:()=>xu,setEnabled:()=>Fu});var De=["agentOrchestration","piRunner","fileOpen","panelPolish"];function xu(e,t){return e.previews?.[t]===!0}function Fu(e,t,n){return{...e,previews:{...e.previews,[t]:n}}}import{mkdir as dk,readFile as uk,writeFile as pk}from"node:fs/promises";import fk from"node:path";var mk=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Lu=async e=>{try{return await uk(e,"utf8")}catch(t){if(mk(t))return null;throw t}},Mu=async(e,t)=>{await dk(fk.dirname(e),{recursive:!0}),await pk(e,t,"utf8")};var hk=["incrementalCenterPane","agentActivityIndicators"],Ys=(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(!de.includes(r))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" is not supported. Expected one of: ${de.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(!hk.includes(r)&&!De.includes(r))throw new Error(`Craig config at ${t} is invalid. "previews.${r}" is not supported. Expected one of: ${De.join(", ")}.`);if(typeof s!="boolean")throw new Error(`Craig config at ${t} is invalid. "previews.${r}" must be a boolean.`)}}return n};var ka=async(e,t={readConfigFile:Lu})=>{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 Ys(r,e.configFile)};var Ta=async(e,t,n={writeConfigFile:Mu})=>{Ys(t,e.configFile),await n.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
4
- `)};var Ra={};Us(Ra,{checkForUpdate:()=>qu,getCurrent:()=>zs,isNewer:()=>ba});var zs=()=>{try{return"0.19.0"}catch{return"unknown"}};var gk="https://registry.npmjs.org/craig-cli/latest",yk=3600*1e3,wk={value:null},ju=/^\d+\.\d+\.\d+$/,ba=(e,t)=>{if(!ju.test(e)||!ju.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},qu=async(e={fetch:globalThis.fetch,getCurrent:zs,cache:wk})=>{let t=e.getCurrent(),n=Date.now();if(e.cache.value&&n-e.cache.value.cachedAt<yk)return e.cache.value.result;let r=null;try{let i=await e.fetch(gk,{signal:AbortSignal.timeout(5e3)});i.ok&&(r=(await i.json()).version??null)}catch{}let s={current:t,latest:r,updateAvailable:r!==null&&r!==t&&ba(r,t)};return e.cache.value={result:s,cachedAt:n},s};var T={load:ka,save:Ta,previews:wa,runners:ya,version:Ra};var Uu={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=Uu[t],this.retryable=r.retryable??!1,this.details=r.details??{}}};function Pa(e){return e instanceof g?e:new g("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as kk,mkdir as Tk,readFile as bk}from"node:fs/promises";import Rk from"node:path";var Bu=80,Js=async(e,t)=>{await Tk(Rk.dirname(e.logFile),{recursive:!0});let n={timestamp:new Date().toISOString(),...t};await kk(e.logFile,`${JSON.stringify(n)}
5
- `,"utf8")},Wu=async(e,t)=>{try{await Js(e,t)}catch{}},Xs=async(e,t=Bu)=>{try{let s=(await bk(e.logFile,"utf8")).trimEnd().split(`
6
- `).filter(i=>i.length>0).map(Pk);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(Ik(n))return{path:e.logFile,lines:[],empty:!0};throw n}},Sa=async(e,t)=>Js(e,{level:"error",component:"application",event:Sk(t.context),message:t.message,...t.details?{details:t.details}:{}}),Vu=async(e,t)=>{try{await Sa(e,t)}catch{}},Ku=Xs,Gu=async(e,t=Bu)=>Xs(e,t);function Pk(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 Sk(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function Ik(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var ue={appendErrorLog:Sa,appendErrorLogBestEffort:Vu,appendLog:Js,appendLogBestEffort:Wu,readLog:Xs,readErrorLog:Ku,readRecentErrorLines:Gu};function Ju(e){let{commandTokens:t,options:n,help:r}=Ck(e);if(r)return Yu({kind:"help"},n);if(t.length===0)return{mode:"interactive",options:n};let[s,i,...o]=t,a;switch(`${s??""}:${i??""}`){case"context:show":Dr(o,"context show"),a={kind:"showContext"};break;case"repo:add":a={kind:"addRepo",path:Ia(o,"Repo path")};break;case"repo:list":Dr(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:ee(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:Ia(o,"Workspace path")};break;case"workspace:list":a=Ak(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:ee(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:ee(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:ee(o,"Workspace id")};break;case"file:open":a={kind:"openFile",path:ee(o,"File path")};break;case"task:new":a=Ok(o);break;case"task:create-child":a=$k(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:ee(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:ee(o,"Task id")}};break;case"task:list":a=Ek(o);break;case"task:current":Dr(o,"task current"),a={kind:"currentTask"};break;case"task:rename":a={kind:"renameTask",title:Ia(o,"Task title")};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:ee(o,"Task id")};break;case"task:pr":a=Nk(o);break;case"task:repo":if(o[0]!=="add")throw I(`Unsupported task repo command: ${o.join(" ")}`);Zs(o,3,"task repo add"),a={kind:"addTaskRepoTarget",taskId:Qs(o,1,"Task id"),repoId:Qs(o,2,"Repo id")};break;case"task:wait":a=jk(o);break;case"agent:list":Dr(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=xk(o);break;case"agent:send":a=Fk(o);break;case"command:show":a={kind:"showPromptCommand",commandId:ee(o,"Command id")};break;case"command:list":Dr(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:ee(o,"Command id")};break;case"command:wait":a=Lk(o);break;case"events:list":a=Hu(o,!1);break;case"events:watch":a=Hu(o,!0);break;case"fury:validate":a={kind:"validateFury",file:ee(o,"Fury file")};break;case"fury:plan":a=qk(o);break;case"fury:approve":a={kind:"approveFury",planId:ee(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:ee(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:ee(o,"Fury run id")};break;case"fury:watch":a=Uk(o);break;case"fury:cancel":a={kind:"cancelFury",runId:ee(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:ee(o,"Fury run id")};break;case"fury:step":a=Bk(o);break;case"fury:reviews":a=Wk(o);break;case"fury:review":a=Vk(o);break;case"task:logs":a={kind:"streamTaskLogs",taskId:ee(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:ee(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:ee(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:ee(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:ee(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:Qs(o,0,"Task id"),repoId:Qs(o,1,"Repo id")},Zs(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:ee(o,"Task id")};break;default:if(t.length===1&&(s==="help"||s==="--help"||s==="-h")){a={kind:"help"};break}throw I(`Unsupported command: ${t.join(" ")}`)}return Yu(a,n)}function Xu(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 va(){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 Ck(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||!zu(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==="--"||zu(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 Ak(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 Ek(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 Ok(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=T.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 $k(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=T.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 Nk(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 Ca=300*1e3,Dk=new Set(["idle","working","ready","error"]),_k=new Set(["queued","delivering","delivered","failed","cancelled"]);function xk(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 Fk(e){let t,n,r="when-ready",s=Ca,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=Ea(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 Lk(e){let t=M(e[0]??"","Command id"),n,r=Ca,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=Mk(a):r=Ea(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function Mk(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!_k.has(n)))throw I(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function Hu(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 jk(e){let t,n,r,s=Ca,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=Kk(l):a==="--tab"?r=M(l,"Agent tab id"):s=Ea(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 qk(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 Uk(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 Bk(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw I("fury step requires complete or fail.");let n=Aa(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 Wk(e){if(e[0]!=="list")throw I("fury reviews requires list.");let t=Aa(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 Vk(e){let t=e[0],n=M(e[1]??"","Fury review id");if(t==="show")return Zs(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=Aa(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 Aa(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 Kk(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Dk.has(n)))throw I(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function Ea(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 Yu(e,t){return{mode:"command",command:e,commandName:vk(e),options:t}}function zu(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function Dr(e,t){Zs(e,0,t)}function Zs(e,t,n){if(e.length!==t)throw I(`Command ${n} received an unexpected number of arguments.`)}function ee(e,t){if(e.length!==1)throw I(`${t} is required and must be provided once.`);return M(e[0],t)}function Ia(e,t){return M(e.join(" "),t)}function Qs(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 sk=Object.defineProperty;var Bs=(e,t)=>{for(var n in t)sk(e,n,{get:t[n],enumerable:!0})};import{realpath as A0}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 Tu from"node:path";import{readFile as bv}from"node:fs/promises";import{readFile as pk}from"node:fs/promises";import{randomUUID as ik}from"node:crypto";import{chmod as ok,open as ak,readFile as lk,rename as ck,rm as uk}from"node:fs/promises";import wa from"node:path";async function U(e,t,n={}){let r=wa.dirname(e),s=wa.join(r,`.${wa.basename(e)}.${process.pid}.${Date.now()}.${ik()}.tmp`),i=await ak(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 ck(s,e),n.mode!==void 0&&await ok(e,n.mode)}catch(o){throw await i.close().catch(()=>{}),await uk(s,{force:!0}).catch(()=>{}),o}}async function Ws(e){try{let t=await lk(e,"utf8");return JSON.parse(t)}catch(t){if(dk(t))return null;throw t}}function dk(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 pk(e.uiStateFile,"utf8"),n=JSON.parse(t);return fk(n,e.uiStateFile)}catch(t){if(mk(t))return null;throw t}}async function gt(e,t){await U(e.uiStateFile,{...t,updatedAt:new Date().toISOString()})}function Ks(){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 fk(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")||!Vs(e,"openInspectionKind")||!Vs(e,"selectedFileTreePath")||!Vs(e,"selectedFilePath")||!Vs(e,"selectedDiffPath")||!Od(e,"collapsedFileTreePaths")||!wn(e,"ignoredUpdateVersion")||!Od(e,"seenPreviewIds")||!wn(e,"selectedActionId")||!hk(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 Vs(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||e[t]===null||typeof e[t]=="string")}function Od(e,t){return typeof e=="object"&&e!==null&&(!(t in e)||Array.isArray(e[t])&&e[t].every(n=>typeof n=="string"))}function mk(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}function hk(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 ka={};Bs(ka,{RUNNER_IDS:()=>fe,STABLE_RUNNER_IDS:()=>yt,assertEnabled:()=>Dd,buildCommand:()=>Fd,getConfiguredProfile:()=>Gs,getDefault:()=>Nd,getDisplayName:()=>xd,getEnabled:()=>Hs,getProfile:()=>Bn,isRunnerType:()=>Ys,parse:()=>_d,setRunnerEnabled:()=>Ld,setRunnerPath:()=>Md});var yt=["codex","cursor","claude"],fe=[...yt,"pi"];var $d={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=>$d[e];var Gs=(e,t={})=>{let n=Bn(e),r=t.runners?.[e]?.path?.trim();return{...n,executable:r&&r.length>0?r:n.executable}};var Hs=(e={})=>fe.filter(t=>t!=="pi"||e.previews?.piRunner===!0).filter(t=>e.runners?.[t]?.enabled!==!1);var Nd=(e={})=>{let t=Hs(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 Dd=(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 Ys=e=>fe.includes(e);var _d=e=>{if(!e||e.length===0)return"codex";if(!Ys(e))throw new Error(`Unsupported runner "${e}". Expected one of: ${fe.join(", ")}.`);return e};var xd=e=>Bn(e).displayName;var Fd=(e,t,n={})=>{let r=[Gs(e,n).executable];return t&&t.length>0&&r.push(t),r};var Ld=(e,t,n)=>({...e,runners:{...e.runners??{},[t]:{...e.runners?.[t]??{},enabled:n}}});var Md=(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 Ta={};Bs(Ta,{PREVIEW_FEATURE_IDS:()=>wt,isEnabled:()=>jd,setEnabled:()=>qd});var wt=["agentOrchestration","piRunner","fileOpen","panelPolish"];function jd(e,t){return e.previews?.[t]===!0}function qd(e,t,n){return{...e,previews:{...e.previews,[t]:n}}}import{mkdir as gk,readFile as yk,writeFile as wk}from"node:fs/promises";import kk from"node:path";var Tk=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Ud=async e=>{try{return await yk(e,"utf8")}catch(t){if(Tk(t))return null;throw t}},Bd=async(e,t)=>{await gk(kk.dirname(e),{recursive:!0}),await wk(e,t,"utf8")};var zs=(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(!fe.includes(r))throw new Error(`Craig config at ${t} is invalid. "runners.${r}" is not supported. Expected one of: ${fe.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 ba=async(e,t={readConfigFile:Ud})=>{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 zs(r,e.configFile)};var Ra=async(e,t,n={writeConfigFile:Bd})=>{zs(t,e.configFile),await n.writeConfigFile(e.configFile,`${JSON.stringify(t,null,2)}
4
+ `)};var Sa={};Bs(Sa,{checkForUpdate:()=>Vd,getCurrent:()=>Js,isNewer:()=>Pa});var Js=()=>{try{return"0.19.2"}catch{return"unknown"}};var bk="https://registry.npmjs.org/craig-cli/latest",Rk=3600*1e3,Pk={value:null},Wd=/^\d+\.\d+\.\d+$/,Pa=(e,t)=>{if(!Wd.test(e)||!Wd.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},Vd=async(e={fetch:globalThis.fetch,getCurrent:Js,cache:Pk})=>{let t=e.getCurrent(),n=Date.now();if(e.cache.value&&n-e.cache.value.cachedAt<Rk)return e.cache.value.result;let r=null;try{let i=await e.fetch(bk,{signal:AbortSignal.timeout(5e3)});i.ok&&(r=(await i.json()).version??null)}catch{}let s={current:t,latest:r,updateAvailable:r!==null&&r!==t&&Pa(r,t)};return e.cache.value={result:s,cachedAt:n},s};var k={load:ba,save:Ra,previews:Ta,runners:ka,version:Sa};var Kd={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=Kd[t],this.retryable=r.retryable??!1,this.details=r.details??{}}};function Ia(e){return e instanceof g?e:new g("INTERNAL_ERROR",e instanceof Error?e.message:"Unknown Craig error",{cause:e})}import{appendFile as Sk,mkdir as Ik,readFile as vk}from"node:fs/promises";import Ck from"node:path";var Gd=80,Xs=async(e,t)=>{await Ik(Ck.dirname(e.logFile),{recursive:!0});let n={timestamp:new Date().toISOString(),...t};await Sk(e.logFile,`${JSON.stringify(n)}
5
+ `,"utf8")},Hd=async(e,t)=>{try{await Xs(e,t)}catch{}},Qs=async(e,t=Gd)=>{try{let s=(await vk(e.logFile,"utf8")).trimEnd().split(`
6
+ `).filter(i=>i.length>0).map(Ak);return{path:e.logFile,lines:s.slice(Math.max(0,s.length-t)),empty:s.length===0}}catch(n){if(Ok(n))return{path:e.logFile,lines:[],empty:!0};throw n}},va=async(e,t)=>Xs(e,{level:"error",component:"application",event:Ek(t.context),message:t.message,...t.details?{details:t.details}:{}}),Yd=async(e,t)=>{try{await va(e,t)}catch{}},zd=Qs,Jd=async(e,t=Gd)=>Qs(e,t);function Ak(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 Ek(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,".").replace(/^\.+|\.+$/g,"")||"error"}function Ok(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT"}var ue={appendErrorLog:va,appendErrorLogBestEffort:Yd,appendLog:Xs,appendLogBestEffort:Hd,readLog:Qs,readErrorLog:zd,readRecentErrorLines:Jd};function ep(e){let{commandTokens:t,options:n,help:r}=Nk(e);if(r)return Qd({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:Ca(o,"Repo path")};break;case"repo:list":_r(o,"repo list"),a={kind:"listRepos"};break;case"repo:remove":a={kind:"removeRepo",repoId:ne(o,"Repo id")};break;case"workspace:add":a={kind:"addWorkspace",path:Ca(o,"Workspace path")};break;case"workspace:list":a=Dk(o);break;case"workspace:archive":a={kind:"archiveWorkspace",workspaceId:ne(o,"Workspace id")};break;case"workspace:restore":a={kind:"restoreWorkspace",workspaceId:ne(o,"Workspace id")};break;case"workspace:remove":a={kind:"removeWorkspace",workspaceId:ne(o,"Workspace id")};break;case"file:open":a={kind:"openFile",path:ne(o,"File path")};break;case"task:new":a=xk(o);break;case"task:create-child":a=Fk(o);break;case"task:children":a={kind:"listTaskChildren",...o.length===0?{}:{taskId:ne(o,"Task id")}};break;case"task:cancel-tree":a={kind:"cancelTaskTree",...o.length===0?{}:{taskId:ne(o,"Task id")}};break;case"task:list":a=_k(o);break;case"task:current":_r(o,"task current"),a={kind:"currentTask"};break;case"task:rename":a={kind:"renameTask",title:Ca(o,"Task title")};break;case"task:show":a=o.length===0?{kind:"showCurrentTask"}:{kind:"showTask",taskId:ne(o,"Task id")};break;case"task:pr":a=Lk(o);break;case"task:repo":if(o[0]!=="add")throw I(`Unsupported task repo command: ${o.join(" ")}`);ei(o,3,"task repo add"),a={kind:"addTaskRepoTarget",taskId:Zs(o,1,"Task id"),repoId:Zs(o,2,"Repo id")};break;case"task:wait":a=Vk(o);break;case"agent:list":_r(o,"agent list"),a={kind:"listAgents"};break;case"agent:status":a=qk(o);break;case"agent:send":a=Uk(o);break;case"command:show":a={kind:"showPromptCommand",commandId:ne(o,"Command id")};break;case"command:list":_r(o,"command list"),a={kind:"listPromptCommands"};break;case"command:cancel":a={kind:"cancelPromptCommand",commandId:ne(o,"Command id")};break;case"command:wait":a=Bk(o);break;case"events:list":a=Xd(o,!1);break;case"events:watch":a=Xd(o,!0);break;case"fury:validate":a={kind:"validateFury",file:ne(o,"Fury file")};break;case"fury:plan":a=Kk(o);break;case"fury:approve":a={kind:"approveFury",planId:ne(o,"Fury plan id")};break;case"fury:run":a={kind:"runFury",planId:ne(o,"Fury plan id")};break;case"fury:status":a={kind:"showFury",runId:ne(o,"Fury run id")};break;case"fury:watch":a=Gk(o);break;case"fury:cancel":a={kind:"cancelFury",runId:ne(o,"Fury run id")};break;case"fury:resume":a={kind:"resumeFury",runId:ne(o,"Fury run id")};break;case"fury:step":a=Hk(o);break;case"fury:reviews":a=Yk(o);break;case"fury:review":a=zk(o);break;case"task:logs":a={kind:"streamTaskLogs",taskId:ne(o,"Task id")};break;case"task:diff":a={kind:"showTaskDiff",taskId:ne(o,"Task id")};break;case"task:open":a={kind:"openTask",taskId:ne(o,"Task id")};break;case"task:check":a={kind:"runChecks",taskId:ne(o,"Task id")};break;case"task:commit":a={kind:"commitTask",taskId:ne(o,"Task id")};break;case"link:add":a={kind:"addTaskLink",taskId:Zs(o,0,"Task id"),repoId:Zs(o,1,"Repo id")},ei(o,2,"link add");break;case"link:list":a={kind:"listTaskLinks",taskId:ne(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 Qd(a,n)}function tp(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 $k(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 Aa(){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 Nk(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||!Zd(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==="--"||Zd(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 Dk(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 _k(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 xk(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 Fk(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 Lk(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 Ea=300*1e3,Mk=new Set(["idle","working","ready","error"]),jk=new Set(["queued","delivering","delivered","failed","cancelled"]);function qk(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 Uk(e){let t,n,r="when-ready",s=Ea,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=$a(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 Bk(e){let t=M(e[0]??"","Command id"),n,r=Ea,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=Wk(a):r=$a(a)}return{kind:"waitPromptCommand",commandId:t,...n?{states:n}:{},timeoutMs:r}}function Wk(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!jk.has(n)))throw I(`Invalid command state list "${e}". Use queued, delivering, delivered, failed, or cancelled.`);return[...new Set(t)]}function Xd(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 Vk(e){let t,n,r,s=Ea,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=Jk(l):a==="--tab"?r=M(l,"Agent tab id"):s=$a(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 Kk(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 Gk(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 Hk(e){let t=e[0];if(t!=="complete"&&t!=="fail")throw I("fury step requires complete or fail.");let n=Oa(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 Yk(e){if(e[0]!=="list")throw I("fury reviews requires list.");let t=Oa(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 zk(e){let t=e[0],n=M(e[1]??"","Fury review id");if(t==="show")return ei(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=Oa(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 Oa(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 Jk(e){let t=e.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0||t.some(n=>!Mk.has(n)))throw I(`Invalid agent state list "${e}". Use idle, working, ready, or error.`);return[...new Set(t)]}function $a(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 Qd(e,t){return{mode:"command",command:e,commandName:$k(e),options:t}}function Zd(e){return["--json","--no-input","--workspace-root","--task","--help","-h"].includes(e)}function _r(e,t){ei(e,0,t)}function ei(e,t,n){if(e.length!==t)throw I(`Command ${n} received an unexpected number of arguments.`)}function ne(e,t){if(e.length!==1)throw I(`${t} is required and must be provided once.`);return M(e[0],t)}function Ca(e,t){return M(e.join(" "),t)}function Zs(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
- ${va()}`,{})}var We=(e,t)=>{let n=Oa(e);if(!Hk(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},Oa=e=>{if(typeof e!="object"||e===null)return e;let t=e,n=e,r={...n};return delete r.swarmRunId,delete r.swarmStepId,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:Jk(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:Yk(t.repoTargets),runnerSession:t.runnerSession??Gk(t),checks:rT(t),lastCommit:t.lastCommit??null,prs:sT(t),artifacts:lT(t),cleanup:cT(t)}},Gk=e=>{if(typeof e.title!="string")return null;let t=$a(e.runner);return{command:T.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},Hk=e=>{if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.id=="string"&&typeof t.title=="string"&&typeof t.slug=="string"&&(t.type==="repo"||t.type==="project")&&typeof t.status=="string"&&T.runners.isRunnerType(t.runner??"")&&typeof t.repoId=="string"&&typeof t.workspaceId=="string"&&(typeof t.selectedPtyTabId=="string"||t.selectedPtyTabId===null)&&Array.isArray(t.linkedRepoIds)&&t.linkedRepoIds.every(n=>typeof n=="string")&&(typeof t.parentTaskId=="string"||t.parentTaskId===null)&&typeof t.rootTaskId=="string"&&Number.isInteger(t.delegationDepth)&&Number(t.delegationDepth)>=0&&(typeof t.delegationIdempotencyKey=="string"||t.delegationIdempotencyKey===null)&&(typeof t.furyRunId=="string"||t.furyRunId===null)&&(typeof t.furyStepId=="string"||t.furyStepId===null)&&typeof t.repoRoot=="string"&&typeof t.worktreePath=="string"&&typeof t.branch=="string"&&Zu(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||zk(t.repoTargets))&&Qk(t.runnerSession)&&Zk(t.prompt)&&ep(t.checks)&&tp(t.lastCommit)&&tT(t.prs)&&nT(t.artifacts)&&rp(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Yk=e=>{if(Array.isArray(e))return e.filter(Qu)},zk=e=>Array.isArray(e)&&e.every(Qu),Qu=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)&&ep(t.checks)&&tp(t.lastCommit)&&np(t.pullRequest)&&rp(t.cleanup)},Jk=e=>{if(Zu(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 Xk(e.id,e.title,t,$a(e.runner))},Xk=(e,t,n,r)=>{let s=T.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",title:s.defaultAgentTitle,command:T.runners.buildCommand(r),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},$a=e=>e&&T.runners.isRunnerType(e)?e:"codex",Zu=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"),Qk=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),Zk=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",ep=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"),tp=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",np=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&eT(e.requiredChecks),eT=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)),tT=e=>Array.isArray(e)&&e.every(np),nT=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),rp=e=>typeof e=="object"&&e!==null&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),rT=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},sT=e=>{if(Array.isArray(e.prs))return e.prs.map(iT);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:sp(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:ip(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},iT=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:sp(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:oT(t.reviewDecision),requiredChecks:ip(t.requiredChecks),comments:aT(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},sp=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,oT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,aT=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}]}):[],ip=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})):[],lT=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 HT}from"node:fs/promises";import{readFile as dT,readdir as uT,rm as pT}from"node:fs/promises";import op from"node:path";var Na=(e,t)=>op.join(e.workspacesDir,`${t}.json`),fT=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"):[]}},ap=(e,t)=>{let n=fT(e);if(typeof n!="object"||n===null||typeof n.id!="string"||n.kind!=="repo"&&n.kind!=="project"||typeof n.name!="string"||typeof n.rootPath!="string"||typeof n.primaryRepoId!="string"||typeof n.branch!="string"||n.status!=="active"&&n.status!=="archived"||!Array.isArray(n.linkedRepoIds)||!(n.linkedRepoIds??[]).every(r=>typeof r=="string")||!(n.repoId===void 0||typeof n.repoId=="string")||!Array.isArray(n.discoveredRepoIds)||!(n.discoveredRepoIds??[]).every(r=>typeof r=="string")||!(n.archivedAt===null||typeof n.archivedAt=="string")||typeof n.createdAt!="string"||typeof n.updatedAt!="string")throw new Error(`Craig workspace record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},wn=async(e,t)=>{let n=Na(e,t);try{let r=await dT(n,"utf8");return ap(JSON.parse(r),n)}catch(r){throw mT(r)?new g("WORKSPACE_NOT_FOUND",`Craig workspace "${t}" was not found.`,{details:{workspaceId:t}}):r instanceof SyntaxError||r instanceof Error&&r.message.startsWith("Craig workspace record at ")?new g("WORKSPACE_RECORD_INVALID",r instanceof Error?r.message:`Craig workspace "${t}" is invalid.`,{details:{workspaceId:t},cause:r}):r}},kn=async(e,t)=>{await B(Na(e,t.id),{...t,updatedAt:new Date().toISOString()})},Ie=async e=>{let t=await uT(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>wn(e,op.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},lp=async(e,t)=>{await pT(Na(e,t),{force:!0})},mT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as hT,readdir as gT,rm as yT}from"node:fs/promises";import cp from"node:path";var Da=(e,t)=>cp.join(e.reposDir,`${t}.json`),dp=(e,t)=>{if(typeof e!="object"||e===null||typeof e.id!="string"||typeof e.name!="string"||typeof e.rootPath!="string"||typeof e.defaultBranch!="string"||typeof e.createdAt!="string"||typeof e.updatedAt!="string")throw new Error(`Craig repo record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return e},_e=async(e,t)=>{let n=Da(e,t);try{let r=await hT(n,"utf8");return dp(JSON.parse(r),n)}catch(r){throw wT(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}},_a=async(e,t)=>{await B(Da(e,t.id),{...t,updatedAt:new Date().toISOString()})},_r=async e=>{let t=await gT(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>_e(e,cp.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},up=async(e,t)=>{await yT(Da(e,t),{force:!0})},wT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as kT}from"node:fs/promises";var TT=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(!TT(e))throw new Error(`Craig index at ${n} is invalid. Remove or repair the file before rerunning Craig.`);if(e.workspaceRoot!==t)throw new Error(`Craig index at ${n} belongs to ${e.workspaceRoot}, not ${t}. Remove or repair the file before rerunning Craig.`);return e},Oe=async e=>{let t=await kT(e.indexFile,"utf8");return Wn(JSON.parse(t),e.workspaceRoot,e.indexFile)},Ct=async(e,t)=>{await B(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as IT,stat as vT}from"node:fs/promises";import Kn from"node:path";import{realpath as mp}from"node:fs/promises";import ei from"node:path";import{execFile as bT}from"node:child_process";import{promisify as RT}from"node:util";var pp=RT(bT);async function K(e,t,n={}){try{let r=await pp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(fp(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function J(e,t,n={}){try{let r=await pp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(fp(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function fp(e){return e instanceof Error}var xa=async e=>{try{let n=(await K("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([mp(n).catch(()=>ei.resolve(n)),mp(e).catch(()=>ei.resolve(e))]);return r===s}catch{return!1}},Fa=async e=>{let t=await J("git",["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"],{cwd:e}),n=t.stdout.trim().replace(/^origin\//,"");if(t.exitCode===0&&n.length>0)return n;for(let i of["main","master","trunk"])if((await J("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await K("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},hp=async e=>{let t=await J("git",["rev-parse","--path-format=absolute","--git-common-dir"],{cwd:e}),n=t.stdout.trim();if(t.exitCode!==0||n.length===0)return null;let r=ei.resolve(e,n);return ei.dirname(r)};import{mkdir as Ve,readFile as PT}from"node:fs/promises";var ST=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Vn=async e=>{let t=Ee(e);await Ve(t.craigDir,{recursive:!0}),await Promise.all([Ve(t.reposDir,{recursive:!0}),Ve(t.workspacesDir,{recursive:!0}),Ve(t.runtimeDir,{recursive:!0}),Ve(t.tasksDir,{recursive:!0}),Ve(t.jobsDir,{recursive:!0}),Ve(t.commandsDir,{recursive:!0}),Ve(t.eventsDir,{recursive:!0}),Ve(t.orchestrationDir,{recursive:!0}),Ve(t.logsDir,{recursive:!0}),Ve(t.artifactsDir,{recursive:!0}),Ve(t.worktreesDir,{recursive:!0})]);try{let s=await PT(t.indexFile,"utf8"),i=JSON.parse(s);return Wn(i,e,t.indexFile)}catch(s){if(!ST(s))throw s instanceof SyntaxError?new Error(`Craig index at ${t.indexFile} is malformed. Remove or repair the file before rerunning Craig.`):s}let n=new Date().toISOString(),r={version:2,workspaceRoot:e,repoIds:[],workspaceIds:[],taskIds:[],jobIds:[],createdAt:n,updatedAt:n};return await B(t.indexFile,r),r};var gp=(e,t,n)=>{let r=new Date().toISOString();return{id:CT(e,Kn.basename(t)),name:Kn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},yp=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},CT=(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},AT=(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},wp=async(e,t)=>{let n=await Oe(e);await Ct(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},ET=async(e,t)=>{let n=await IT(t,{withFileTypes:!0}),r=await _r(e),s=[];for(let i of n){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=Kn.join(t,i.name);if(!await xa(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await Fa(o);s.push(a?yp(a,l):gp([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},OT=async(e,t)=>{let n=await Fa(t),r=await _r(e),s=r.find(d=>d.rootPath===t)??null,i=s?yp(s,n):gp(r,t,n),o=`workspace_${i.id}`,l=(await Ie(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 _a(e,i),l||await kn(e,u),await wp(e,{repoIds:[i.id],workspaceIds:[u.id]}),{kind:"createWorkspace",workspace:u,repos:[i],created:!l}},$T=async(e,t)=>{let n=await ET(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=AT(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=>_a(e,c))),await kn(e,l),await wp(e,{repoIds:a,workspaceIds:[l.id]}),{kind:"createWorkspace",workspace:l,repos:n,created:!i}},xr=async(e,t)=>{await Vn(e.workspaceRoot);let n=Kn.resolve(e.workspaceRoot,t);if(!(await vT(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await xa(n)?OT(e,n):$T(e,n)};var La=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 Ma=async(e,t,n={readWorkspace:wn,writeWorkspace:kn})=>{let s={...await n.readWorkspace(e,t),status:"archived",archivedAt:new Date().toISOString()};return await n.writeWorkspace(e,s),{kind:"archiveWorkspace",workspaceId:s.id,status:s.status,branch:s.branch}};var ja=async(e,t)=>{let r={...await wn(e,t),status:"active",archivedAt:null};await kn(e,r);let s=r.kind==="project"?r.discoveredRepoIds?.[0]??null:r.primaryRepoId;return{kind:"restoreWorkspace",workspaceId:r.id,status:r.status,branch:r.branch,primaryRepoId:s}};var Tn=async(e,t,n={deleteWorkspace:lp,readCraigIndex:Oe,writeCraigIndex:Ct})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var qa=async(e,t,n)=>{let r=await wn(e,t),s=await n.listTasks(e,{workspaceId:t,includeClosed:!0});if(r.status==="active")throw new Error(`Cannot remove workspace ${t} while it is active. Archive it first.`);if(s.tasks.length>0)throw new Error(`Cannot remove workspace ${t} while task records still reference it.`);return await Tn(e,t),{kind:"removeWorkspace",workspaceId:r.id,rootPath:r.rootPath??""}};import{readFile as NT,realpath as bp,stat as DT}from"node:fs/promises";import ti from"node:path";async function Ua(e){let t=await Pp(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return kp(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return kp(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await Tp(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await hp(t);if(r){let s=await Tp(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 kp(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await Pp(ti.resolve(n,e),s),o=await Rp(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 Tp(e){let t=e;for(;;){let n=await Rp(t);if(n)return n;let r=ti.dirname(t);if(r===t)return null;t=r}}async function Rp(e){let t=Ee(e);try{let n=await NT(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 bp(i.workspaceRoot).catch(()=>ti.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(_T(n))return null;throw n instanceof g?n:new g("WORKSPACE_CONTEXT_INVALID",n instanceof Error?n.message:`Craig workspace at ${e} is invalid.`,{details:{workspaceRoot:e},cause:n})}}async function Pp(e,t){let n=ti.resolve(e);try{if(!(await DT(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await bp(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 _T(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var Ba={};Us(Ba,{addRepo:()=>Sp,listRegisteredRepos:()=>Ip,removeRepo:()=>vp});import xT from"node:path";import{stat as FT}from"node:fs/promises";var Sp=async(e,t)=>{let n=xT.resolve(e.workspaceRoot,t);if(!(await FT(n).catch(()=>null))?.isDirectory())throw new Error(`Repo path does not exist: ${n}`);let s=await xr(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 Ip=async(e,t={listRepos:_r,ensureCraigState:Vn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var vp=async(e,t,n)=>{let r=await _e(e,t),i=(await Ie(e)).filter(c=>c.primaryRepoId===t),o=i.filter(c=>c.status==="active"),a=await n.listTasks(e,{repoId:t});if(o.length>0)throw new Error(`Cannot remove repo ${t} while active workspace records still reference it.`);if(a.tasks.length>0)throw new Error(`Cannot remove repo ${t} while task records still reference it.`);await Promise.all(i.map(c=>Tn(e,c.id))),await up(e,t);let l=await Oe(e);return await Ct(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var Te={addWorkspace:xr,listWorkspaces:La,archiveWorkspace:Ma,restoreWorkspace:ja,removeWorkspace:qa,removeWorkspaceRecord:Tn,resolveContext:Ua,repos:Ba};import{mkdir as Cp,readFile as LT,rm as ri,stat as MT,writeFile as jT}from"node:fs/promises";import ni from"node:path";var qT=25,UT=3e4,BT=5e3;async function tt(e,t,n){let r=ni.join(e.runtimeDir,"task-locks"),s=ni.join(r,`${t}.lock`);await Cp(r,{recursive:!0});let i=Date.now();for(;;)try{await Cp(s);try{await jT(ni.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await ri(s,{recursive:!0,force:!0}),o}break}catch(o){if(!KT(o))throw o;if(await WT(s))continue;if(Date.now()-i>=UT)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await GT(qT)}try{return await n()}finally{await ri(s,{recursive:!0,force:!0})}}async function WT(e){let t=await LT(ni.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return VT(t.pid)?!1:(await ri(e,{recursive:!0,force:!0}),!0);let n=await MT(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<BT?!1:(await ri(e,{recursive:!0,force:!0}),!0)}function VT(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 KT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",GT=e=>new Promise(t=>setTimeout(t,e));var At=async(e,t)=>{let n=await HT(si(e,t),"utf8");return JSON.parse(n)},Fr=async(e,t)=>{let n=await At(e,t);return We(n,si(e,t))},nt=async(e,t)=>{let n=Ap(t);await B(si(e,t.id),n)},G=async(e,t,n)=>tt(e,t,async()=>{let r=await Fr(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=Ap(s);return await B(si(e,t),i),i}),Wa=async(e,t)=>{let n=await Oe(e);n.taskIds.includes(t)||await Ct(e,{...n,taskIds:[...n.taskIds,t]})},si=(e,t)=>`${e.tasksDir}/${t}.json`,Ap=e=>({...e,updatedAt:new Date().toISOString()});var H=e=>e.prs.length===0?null:[...e.prs].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e.prs[e.prs.length-1]??null,Ht=e=>e.status==="merged"||e.status==="closed",Et=(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(),bn=e=>{if(e.length===0)return"checked";let t=[...e].reverse().find(n=>n.status!=="merged"&&n.status!=="closed")??e[e.length-1];return oi(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},oi=e=>e.mergeable&&!YT(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),YT=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Va=e=>e.requiredChecks.length===0?"no required checks":e.requiredChecks.map(t=>`${t.name}:${t.status}`).join(", "),Ot=(e,t,n)=>{let r=e.isDraft??!1,s=zT(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:JT(e.reviewDecision??null),requiredChecks:Ka(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:eb(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}},zT=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,JT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Ka=e=>{let t=e.map(r=>XT(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||QT(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},XT=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:Op(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:ZT(t)}:null},QT=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):ii(e)&&!ii(t)?!0:!ii(e)&&ii(t)?!1:Ep(t.status)>=Ep(e.status),ii=e=>e.conclusion?.toUpperCase()==="CANCELLED",Ep=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},ZT=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},eb=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(tb).filter(n=>n!==null).slice(-4):[]},tb=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=nb(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},nb=e=>e.replace(/\s+/g," ").trim(),Op=(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?Op(r,r):"unknown"};var Ke=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as rb}from"node:fs/promises";import $p from"node:path";var F=async(e,t,n={readRawTask:At,validateTaskRecord:We})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw lb(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}},ge=async e=>{if(!await Ga(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?$p.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:$p.join(e.workspaceRoot,t.artifacts.logPath):null,Lr=async(e,t)=>{let n=await Ga(t.worktreePath),r=Hn(e,t),s=r?await Ga(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:sb(t),lastCommitSummary:ib(t),prSummary:ob(t),cleanupSummary:ab(t)}},Ga=async e=>{try{return await rb(e),!0}catch{return!1}},sb=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}`},ib=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",ob=e=>{if(e.type==="project"&&e.repoTargets?.length){let s=e.repoTargets.filter(l=>l.pullRequest.number);if(s.length===0)return"not linked";let i=s.map(l=>` ${l.repoId} #${l.pullRequest.number} ${l.pullRequest.status??"unknown"}`),o=s.reduce((l,c)=>{let u=c.pullRequest.status??"unknown";return l[u]=(l[u]??0)+1,l},{}),a=Object.entries(o).map(([l,c])=>`${c} ${l}`).join(", ");return`${s.length} PR${s.length!==1?"s":""} (${a})
9
+ ${Aa()}`,{})}var Ke=(e,t)=>{let n=Na(e);if(!Qk(n))throw new Error(`Craig task record at ${t} is invalid. Remove or repair the file before rerunning Craig.`);return n},Na=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:Da(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:tT(t),bundlePath:typeof t.bundlePath=="string"||t.bundlePath===null?t.bundlePath:null,selectedRepoTargetId:typeof t.selectedRepoTargetId=="string"||t.selectedRepoTargetId===null?t.selectedRepoTargetId:null,repoTargets:Zk(t.repoTargets),runnerSession:t.runnerSession??Xk(t),checks:lT(t),lastCommit:t.lastCommit??null,prs:cT(t),artifacts:fT(t),cleanup:mT(t)}},Xk=e=>{if(typeof e.title!="string")return null;let t=Da(e.runner);return{command:k.runners.buildCommand(t,e.title),pid:null,startedAt:null,lastKnownState:e.status==="running"?"running":"starting",exitCode:null,exitedAt:null}},Qk=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"&&rp(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||eT(t.repoTargets))&&rT(t.runnerSession)&&sT(t.prompt)&&sp(t.checks)&&ip(t.lastCommit)&&oT(t.prs)&&aT(t.artifacts)&&ap(t.cleanup)&&(t.lastFailureReason===void 0||t.lastFailureReason===null||typeof t.lastFailureReason=="string")&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"},Zk=e=>{if(Array.isArray(e))return e.filter(np)},eT=e=>Array.isArray(e)&&e.every(np),np=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)&&sp(t.checks)&&ip(t.lastCommit)&&op(t.pullRequest)&&ap(t.cleanup)},tT=e=>{if(rp(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 nT(e.id,e.title,t,Da(e.runner))},nT=(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}]},Da=e=>e&&k.runners.isRunnerType(e)?e:"codex",rp=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"),rT=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),sT=e=>typeof e=="object"&&e!==null&&(e.source==="inline"||e.source==="file")&&typeof e.value=="string",sp=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"),ip=e=>e===null||typeof e=="object"&&e!==null&&typeof e.sha=="string"&&typeof e.message=="string"&&typeof e.committedAt=="string",op=e=>typeof e=="object"&&e!==null&&e.provider==="github"&&iT(e.requiredChecks),iT=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)),oT=e=>Array.isArray(e)&&e.every(op),aT=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),ap=e=>typeof e=="object"&&e!==null&&(typeof e.worktreeRemovedAt=="string"||e.worktreeRemovedAt===null)&&typeof e.preservedWorktree=="boolean"&&(typeof e.warning=="string"||e.warning===null),lT=e=>e.checks?{...e.checks,results:e.checks.results??[]}:{source:{type:"repo_config",path:".craig/config.json"},lastRunAt:null,status:"not_run",commands:[],results:[]},cT=e=>{if(Array.isArray(e.prs))return e.prs.map(uT);let t=e.pullRequest;return!t||!t.number?[]:[{provider:"github",owner:null,repo:null,number:t.number,url:t.url??null,title:null,status:lp(t.status),draft:!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:null,requiredChecks:cp(t.requiredChecks),comments:[],createdAt:null,updatedAt:null,mergedAt:null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}]},uT=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:lp(t.status),draft:t.draft??!1,baseBranch:t.baseBranch??null,headBranch:t.headBranch??null,mergeable:t.mergeable??!1,mergeStateStatus:t.mergeStateStatus??null,reviewDecision:dT(t.reviewDecision),requiredChecks:cp(t.requiredChecks),comments:pT(t.comments),createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,mergedAt:t.mergedAt??null,lastSyncedAt:t.lastSyncedAt??null,lastSyncedHeadSha:t.lastSyncedHeadSha??null}},lp=e=>e==="open"||e==="closed"||e==="merged"||e==="draft"?e:null,dT=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,pT=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}]}):[],cp=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})):[],fT=e=>{let t=e.artifacts;return t?{...t,checkSummaryPath:t.checkSummaryPath??null}:{logPath:null,checkSummaryPath:null,prDraftPath:null,prStatusPath:null}},mT=e=>{let t=e.cleanup;return{worktreeRemovedAt:t?.worktreeRemovedAt??null,preservedWorktree:t?.preservedWorktree??!1,warning:t?.warning??null}};import{readFile as QT}from"node:fs/promises";import{readFile as hT,readdir as gT,rm as yT}from"node:fs/promises";import up from"node:path";var _a=(e,t)=>up.join(e.workspacesDir,`${t}.json`),wT=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"):[]}},dp=(e,t)=>{let n=wT(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=_a(e,t);try{let r=await hT(n,"utf8");return dp(JSON.parse(r),n)}catch(r){throw kT(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(_a(e,t.id),{...t,updatedAt:new Date().toISOString()})},ve=async e=>{let t=await gT(e.workspacesDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>kn(e,up.basename(r.name,".json"))))).sort((r,s)=>r.id.localeCompare(s.id))},pp=async(e,t)=>{await yT(_a(e,t),{force:!0})},kT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as TT,readdir as bT,rm as RT}from"node:fs/promises";import fp from"node:path";var xa=(e,t)=>fp.join(e.reposDir,`${t}.json`),mp=(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=xa(e,t);try{let r=await TT(n,"utf8");return mp(JSON.parse(r),n)}catch(r){throw PT(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}},Fa=async(e,t)=>{await U(xa(e,t.id),{...t,updatedAt:new Date().toISOString()})},xr=async e=>{let t=await bT(e.reposDir,{withFileTypes:!0});return(await Promise.all(t.filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>xe(e,fp.basename(r.name,".json"))))).sort((r,s)=>r.name.localeCompare(s.name)||r.id.localeCompare(s.id))},hp=async(e,t)=>{await RT(xa(e,t),{force:!0})},PT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{readFile as ST}from"node:fs/promises";var IT=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(!IT(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 ST(e.indexFile,"utf8");return Wn(JSON.parse(t),e.workspaceRoot,e.indexFile)},At=async(e,t)=>{await U(e.indexFile,{...t,workspaceRoot:e.workspaceRoot,updatedAt:new Date().toISOString()})};import{readdir as OT,stat as $T}from"node:fs/promises";import Kn from"node:path";import{realpath as wp}from"node:fs/promises";import ti from"node:path";import{execFile as vT}from"node:child_process";import{promisify as CT}from"node:util";var gp=CT(vT);async function K(e,t,n={}){try{let r=await gp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr}}catch(r){if(yp(r)){let s=r.stderr?.trim()||r.stdout?.trim()||r.message;throw new Error(`${e} ${t.join(" ")} failed: ${s}`)}throw r}}async function J(e,t,n={}){try{let r=await gp(e,t,{cwd:n.cwd,env:n.env});return{stdout:r.stdout,stderr:r.stderr,exitCode:0}}catch(r){if(yp(r))return{stdout:r.stdout??"",stderr:r.stderr??"",exitCode:typeof r.code=="number"?r.code:null};throw r}}function yp(e){return e instanceof Error}var La=async e=>{try{let n=(await K("git",["rev-parse","--show-toplevel"],{cwd:e})).stdout.trim(),[r,s]=await Promise.all([wp(n).catch(()=>ti.resolve(n)),wp(e).catch(()=>ti.resolve(e))]);return r===s}catch{return!1}},Ma=async e=>{let t=await J("git",["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"],{cwd:e}),n=t.stdout.trim().replace(/^origin\//,"");if(t.exitCode===0&&n.length>0)return n;for(let i of["main","master","trunk"])if((await J("git",["show-ref","--verify","--quiet",`refs/heads/${i}`],{cwd:e})).exitCode===0)return i;let s=(await K("git",["branch","--show-current"],{cwd:e})).stdout.trim();return s.length>0?s:"HEAD"},kp=async e=>{let t=await J("git",["rev-parse","--path-format=absolute","--git-common-dir"],{cwd:e}),n=t.stdout.trim();if(t.exitCode!==0||n.length===0)return null;let r=ti.resolve(e,n);return ti.dirname(r)};import{mkdir as Ge,readFile as AT}from"node:fs/promises";var ET=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",Vn=async e=>{let t=$e(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 AT(t.indexFile,"utf8"),i=JSON.parse(s);return Wn(i,e,t.indexFile)}catch(s){if(!ET(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 Tp=(e,t,n)=>{let r=new Date().toISOString();return{id:NT(e,Kn.basename(t)),name:Kn.basename(t),rootPath:t,defaultBranch:n,createdAt:r,updatedAt:r}},bp=(e,t)=>e.defaultBranch===t?e:{...e,defaultBranch:t,updatedAt:new Date().toISOString()},NT=(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},DT=(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},Rp=async(e,t)=>{let n=await Ne(e);await At(e,{...n,repoIds:[...new Set([...n.repoIds,...t.repoIds])],workspaceIds:[...new Set([...n.workspaceIds,...t.workspaceIds])]})},_T=async(e,t)=>{let n=await OT(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 La(o))continue;let a=r.find(c=>c.rootPath===o)??s.find(c=>c.rootPath===o),l=await Ma(o);s.push(a?bp(a,l):Tp([...r,...s],o,l))}return s.sort((i,o)=>i.name.localeCompare(o.name)||i.id.localeCompare(o.id))},xT=async(e,t)=>{let n=await Ma(t),r=await xr(e),s=r.find(u=>u.rootPath===t)??null,i=s?bp(s,n):Tp(r,t,n),o=`workspace_${i.id}`,l=(await ve(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 Fa(e,i),l||await Tn(e,d),await Rp(e,{repoIds:[i.id],workspaceIds:[d.id]}),{kind:"createWorkspace",workspace:d,repos:[i],created:!l}},FT=async(e,t)=>{let n=await _T(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=DT(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=>Fa(e,c))),await Tn(e,l),await Rp(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 $T(n).catch(()=>null))?.isDirectory())throw new Error(`Workspace path does not exist: ${n}`);return await La(n)?xT(e,n):FT(e,n)};var ja=async(e,t,n={listWorkspaceRecords:ve,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 qa=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 Ua=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:pp,readCraigIndex:Ne,writeCraigIndex:At})=>{await n.deleteWorkspace(e,t);let r=await n.readCraigIndex(e);await n.writeCraigIndex(e,{...r,workspaceIds:r.workspaceIds.filter(s=>s!==t)})};var Ba=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 LT,realpath as Ip,stat as MT}from"node:fs/promises";import ni from"node:path";async function Wa(e){let t=await Cp(e.cwd,"Current working directory");if(e.explicitWorkspaceRoot!==void 0)return Pp(e.explicitWorkspaceRoot,"explicit",t,e.allowUninitializedCwd??!1);if(e.environmentWorkspaceRoot!==void 0)return Pp(e.environmentWorkspaceRoot,"environment",t,e.allowUninitializedCwd??!1);let n=await Sp(t);if(n)return{workspaceRoot:n,source:"ancestor",initialized:!0};let r=await kp(t);if(r){let s=await Sp(r);if(s)return{workspaceRoot:s,source:"git_common_dir",initialized:!0}}if(e.allowUninitializedCwd)return{workspaceRoot:t,source:"cwd",initialized:!1};throw new g("WORKSPACE_CONTEXT_NOT_FOUND",`No Craig workspace was found from ${t}. Use --workspace-root <path> or run Craig inside an initialized workspace.`,{details:{cwd:t}})}async function Pp(e,t,n,r){let s=t==="explicit"?"Workspace root":"CRAIG_WORKSPACE_ROOT",i=await Cp(ni.resolve(n,e),s),o=await vp(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 Sp(e){let t=e;for(;;){let n=await vp(t);if(n)return n;let r=ni.dirname(t);if(r===t)return null;t=r}}async function vp(e){let t=$e(e);try{let n=await LT(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 Ip(i.workspaceRoot).catch(()=>ni.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(jT(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 Cp(e,t){let n=ni.resolve(e);try{if(!(await MT(n)).isDirectory())throw new g("WORKSPACE_CONTEXT_INVALID",`${t} ${n} is not a directory.`,{details:{path:n}});return await Ip(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 jT(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}var Va={};Bs(Va,{addRepo:()=>Ap,listRegisteredRepos:()=>Ep,removeRepo:()=>Op});import qT from"node:path";import{stat as UT}from"node:fs/promises";var Ap=async(e,t)=>{let n=qT.resolve(e.workspaceRoot,t);if(!(await UT(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 Ep=async(e,t={listRepos:xr,ensureCraigState:Vn})=>(await t.ensureCraigState(e.workspaceRoot),{kind:"listRepos",repos:await t.listRepos(e)});var Op=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 hp(e,t);let l=await Ne(e);return await At(e,{...l,repoIds:l.repoIds.filter(c=>c!==t)}),{kind:"removeRepo",repoId:r.id,rootPath:r.rootPath}};var be={addWorkspace:Fr,listWorkspaces:ja,archiveWorkspace:qa,restoreWorkspace:Ua,removeWorkspace:Ba,removeWorkspaceRecord:bn,resolveContext:Wa,repos:Va};import{mkdir as $p,readFile as BT,rm as si,stat as WT,writeFile as VT}from"node:fs/promises";import ri from"node:path";var KT=25,GT=3e4,HT=5e3;async function tt(e,t,n){let r=ri.join(e.runtimeDir,"task-locks"),s=ri.join(r,`${t}.lock`);await $p(r,{recursive:!0});let i=Date.now();for(;;)try{await $p(s);try{await VT(ri.join(s,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(o){throw await si(s,{recursive:!0,force:!0}),o}break}catch(o){if(!JT(o))throw o;if(await YT(s))continue;if(Date.now()-i>=GT)throw new g("OPERATION_TIMEOUT",`Timed out waiting to update task ${t}.`,{retryable:!0,details:{taskId:t}});await XT(KT)}try{return await n()}finally{await si(s,{recursive:!0,force:!0})}}async function YT(e){let t=await BT(ri.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return zT(t.pid)?!1:(await si(e,{recursive:!0,force:!0}),!0);let n=await WT(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<HT?!1:(await si(e,{recursive:!0,force:!0}),!0)}function zT(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 JT=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",XT=e=>new Promise(t=>setTimeout(t,e));var Et=async(e,t)=>{let n=await QT(ii(e,t),"utf8");return JSON.parse(n)},Lr=async(e,t)=>{let n=await Et(e,t);return Ke(n,ii(e,t))},nt=async(e,t)=>{let n=Np(t);await U(ii(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=Np(s);return await U(ii(e,t),i),i}),Ka=async(e,t)=>{let n=await Ne(e);n.taskIds.includes(t)||await At(e,{...n,taskIds:[...n.taskIds,t]})},ii=(e,t)=>`${e.tasksDir}/${t}.json`,Np=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,Yt=e=>e.status==="merged"||e.status==="closed",Ot=(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 ai(t)?"merge_ready":t.status==="merged"?"merged":t.status==="open"?"pr_open":"checked"},ai=e=>e.mergeable&&!ZT(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"),ZT=e=>e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED",Ga=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=eb(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:tb(e.reviewDecision??null),requiredChecks:Ha(e.statusCheckRollup),comments:e.comments===void 0?t?.comments??[]:ib(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}},eb=(e,t)=>t?"draft":e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,tb=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Ha=e=>{let t=e.map(r=>nb(r)).filter(r=>r!==null),n=new Map;for(let r of t){let s=n.get(r.name);(!s||rb(s,r))&&n.set(r.name,r)}return[...n.values()].map(r=>({name:r.name,status:r.status,conclusion:r.conclusion}))},nb=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:_p(r??null,t.conclusion??null),conclusion:t.conclusion??null,sortTime:sb(t)}:null},rb=(e,t)=>e.sortTime!==null||t.sortTime!==null?(t.sortTime??0)>=(e.sortTime??0):oi(e)&&!oi(t)?!0:!oi(e)&&oi(t)?!1:Dp(t.status)>=Dp(e.status),oi=e=>e.conclusion?.toUpperCase()==="CANCELLED",Dp=e=>{switch(e){case"pending":return 5;case"failed":return 4;case"success":return 3;case"skipped":return 2;default:return 1}},sb=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},ib=e=>{let t=Array.isArray(e)?e:e?.nodes;return Array.isArray(t)?t.map(ob).filter(n=>n!==null).slice(-4):[]},ob=e=>{if(typeof e!="object"||e===null)return null;let t=e,n=ab(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},ab=e=>e.replace(/\s+/g," ").trim(),_p=(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?_p(r,r):"unknown"};var He=class extends Error{constructor(t){super(t),this.name="GitHubRateLimitError"}};import{access as lb}from"node:fs/promises";import xp from"node:path";var F=async(e,t,n={readRawTask:Et,validateTaskRecord:Ke})=>{try{let r=await n.readRawTask(e,t);return n.validateTaskRecord(r,`${e.tasksDir}/${t}.json`)}catch(r){throw fb(r)?new g("TASK_NOT_FOUND",`Craig task "${t}" was not found.`,{details:{taskId:t}}):mb(r)?new g("TASK_RECORD_INVALID",r instanceof Error?r.message:`Craig task "${t}" is invalid.`,{details:{taskId:t},cause:r}):r}},ye=async e=>{if(!await Ya(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?xp.isAbsolute(t.artifacts.logPath)?t.artifacts.logPath:xp.join(e.workspaceRoot,t.artifacts.logPath):null,Mr=async(e,t)=>{let n=await Ya(t.worktreePath),r=Hn(e,t),s=r?await Ya(r):!1;return{worktreeExists:n,logExists:s,recentFailureReason:t.lastFailureReason??null,runnerCommandText:t.runnerSession.command.join(" "),checksSummary:cb(t),lastCommitSummary:ub(t),prSummary:db(t),cleanupSummary:pb(t)}},Ya=async e=>{try{return await lb(e),!0}catch{return!1}},cb=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}`},ub=e=>e.lastCommit?`${e.lastCommit.sha.slice(0,7)} ${e.lastCommit.message}`:"not committed",db=e=>{if(e.type==="project"&&e.repoTargets?.length){let s=e.repoTargets.filter(l=>l.pullRequest.number);if(s.length===0)return"not linked";let i=s.map(l=>` ${l.repoId} #${l.pullRequest.number} ${l.pullRequest.status??"unknown"}`),o=s.reduce((l,c)=>{let d=c.pullRequest.status??"unknown";return l[d]=(l[d]??0)+1,l},{}),a=Object.entries(o).map(([l,c])=>`${c} ${l}`).join(", ");return`${s.length} PR${s.length!==1?"s":""} (${a})
10
10
  ${i.join(`
11
- `)}`}let t=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})`},ab=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",lb=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 Mr=async(e,t)=>{let n=await J("git",["show-ref","--verify","--quiet",`refs/heads/${t}`],{cwd:e});if(n.exitCode===0)return!0;if(n.exitCode===1)return!1;throw new Error(n.stderr.trim()||n.stdout.trim()||"Unable to check git branch state.")},Ha=async(e,t,n,r="main")=>{let s=r.trim()||"main";if((await J("git",["show-ref","--verify","--quiet",`refs/heads/${s}`],{cwd:e})).exitCode!==0)throw new Error(`Base branch '${s}' does not exist locally.`);let o=await db(e,s);await K("git",["worktree","add","-b",t,n,o],{cwd:e})},db=async(e,t)=>(await J("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await J("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await J("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t,ai=async e=>{let t=await J("git",["status","--short"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"Unable to inspect git status.");return t.stdout.trim().length>0},Np=async e=>{await K("git",["add","-A"],{cwd:e})},Dp=async(e,t)=>{await K("git",["commit","-m",t],{cwd:e})},_p=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}},xp=async e=>{let t=await J("git",["branch","--show-current"],{cwd:e});if(t.exitCode!==0)return null;let n=t.stdout.trim();return n.length>0?n:null};var li=async(e,t)=>{await K("git",["worktree","remove","--force",t],{cwd:e})},Fp=async(e,t)=>{await K("git",["branch","-D",t],{cwd:e})};var Ya=async e=>Yn(e,e.repoRoot),Yn=async(e,t)=>{let n=await Oe(e),r=Lp(new Date),s=Mp(n.taskIds,r);for(;;){let i=`task_${r}_${String(s).padStart(2,"0")}`,o=`craig/${i}`;if(!await Mr(t,o))return i;s+=1}},jr=async e=>{let t=await Oe(e),n=Lp(new Date),r=Mp(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`},Lp=e=>{let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}${n}${r}`},Mp=(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 qr=async(e,t,n={readRawTask:At,validateTaskRecord:We})=>{let r=await Oe(e),s=[],i=[];await Promise.all(r.taskIds.map(async l=>{try{let c=await n.readRawTask(e,l);s.push(n.validateTaskRecord(c,`${e.tasksDir}/${l}.json`))}catch(c){if(ub(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}},ub=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var jp=["merge_ready","pr_open","checked","review","running","draft"],za=e=>[...e].sort((t,n)=>t.id.localeCompare(n.id)),Ja=(e,t)=>t&&e.some(r=>r.id===t)?t:e.length===0?null:[...e].sort(pb)[0]?.id??null,pb=(e,t)=>{let n=qp(e.status),r=qp(t.status);return n!==r?n-r:t.updatedAt.localeCompare(e.updatedAt)},qp=e=>{let t=jp.indexOf(e);return t>=0?t:jp.length};import Up from"node:path";var Rn=(e,t)=>t?Up.isAbsolute(t)?t:Up.join(e.repoRoot,t):null;import{randomUUID as fb}from"node:crypto";import{mkdir as Br,rm as mb,writeFile as ci}from"node:fs/promises";import Y from"node:path";var Ur=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");var Bp=["AGENTS","md"].join("."),zn=async(e,t,n,r={})=>{let s=await _e(e,t),[i,o]=await Promise.all([kb(e,s.id,r.workspaceId,r.allowLinkedProjectRepo??!1),Yn(e,s.rootPath)]),a=`craig/${o}`,l=Y.join(e.worktreesDir,s.id,o),c=Y.join(e.logsDir,`${o}.log`),u=Y.join(e.artifactsDir,o);await Promise.all([Br(Y.dirname(l),{recursive:!0}),Br(u,{recursive:!0}),ci(c,"","utf8")]);let d=hb(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 Wa(e,o),await Ha(s.rootPath,a,l,s.defaultBranch),{repoId:s.id,repoRoot:s.rootPath,workspaceId:i.id,task:d}},Wr=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 jr(e),a=new Date().toISOString(),l=r.runner??"codex",c=`craig/${o}`,u=Y.join(e.craigDir,"task-bundles",o),d=Y.join(e.logsDir,`${o}.log`),p=Y.join(e.artifactsDir,o);await Br(u,{recursive:!0}),await Br(p,{recursive:!0}),await ci(d,"","utf8");let h=await Promise.all(i.map(b=>_e(e,b))),f=yb(h),m=await Promise.all(h.map(b=>gb(e,b,o,c,Y.join(u,f.get(b.id))))),y=m.find(b=>b.status==="ready")??m[0];if(!m.some(b=>b.status==="ready"))throw await mb(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 Qa({taskId:o,workspaceId:t,prompt:n,repos:h,repoTargets:m,bundlePath:u});let k=Vr(o,n,a,l,r.config??{}),R={id:o,title:n,slug:Ur(n),type:"project",status:"draft",runner:l,repoId:y.repoId,workspaceId:s.id,selectedPtyTabId:k[0]?.id??null,linkedRepoIds:i.filter(b=>b!==y.repoId),...Vp(o,r.lineage),repoRoot:u,worktreePath:u,branch:c,bundlePath:u,selectedRepoTargetId:y.repoId,repoTargets:m,ptyTabs:k,runnerSession:{command:T.runners.buildCommand(l,n,r.config??{}),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:n},checks:y.checks,lastCommit:null,prs:[],artifacts:{logPath:Y.relative(e.workspaceRoot,d),checkSummaryPath:Y.relative(e.workspaceRoot,Y.join(p,"check-summary.json")),prDraftPath:null,prStatusPath:Y.relative(e.workspaceRoot,Y.join(p,"pr-status.json"))},cleanup:di(),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 Wa(e,o),{repoId:y.repoId,repoRoot:u,workspaceId:s.id,task:R,bundlePath:u,repoTargets:m}},Vr=(e,t,n,r="codex",s={})=>{let i=T.runners.getProfile(r);return[{id:`${e}:agent`,kind:"agent",...s.previews?.agentOrchestration?{capabilityId:`capability_${fb()}`}:{},title:i.defaultAgentTitle,command:T.runners.buildCommand(r,void 0,s),createdAt:n,updatedAt:n},{id:`${e}:terminal`,kind:"terminal",title:"Terminal",command:[],createdAt:n,updatedAt:n}]},hb=(e,t)=>{let n=new Date().toISOString(),r=Vr(t.taskId,t.prompt,n,t.runner,t.config);return{id:t.taskId,title:t.prompt,slug:Ur(t.prompt),type:"repo",status:"draft",runner:t.runner,repoId:t.repoId,workspaceId:t.workspaceId,selectedPtyTabId:r[0]?.id??null,linkedRepoIds:[],...Vp(t.taskId,t.lineage),repoRoot:t.repoRoot,worktreePath:t.worktreePath,branch:t.branch,ptyTabs:r,runnerSession:{command:T.runners.buildCommand(t.runner,t.prompt,t.config),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:t.prompt},checks:{...Za(Y.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:Y.relative(e.workspaceRoot,Y.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:Y.relative(e.workspaceRoot,Y.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:Y.relative(e.workspaceRoot,Y.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:di(),lastFailureReason:null,createdAt:n,updatedAt:n}},gb=async(e,t,n,r,s)=>{try{return await Xa(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:Za(Y.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Wp(),cleanup:di()}}},Xa=async(e,t,n,r)=>(await Br(Y.dirname(r),{recursive:!0}),await Ha(t.rootPath,n,r,t.defaultBranch),{repoId:t.id,branch:n,repoRoot:t.rootPath,worktreePath:r,status:"ready",failureReason:null,checks:Za(Y.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Wp(),cleanup:di()}),yb=e=>{let t=new Set(["manifest.json",Bp]),n=new Map;for(let r of e){let s=t.has(r.name)?`${r.name}-repo`:r.name,i=s,o=2;for(;t.has(i);)i=`${s}-${o}`,o+=1;t.add(i),n.set(r.id,i)}return n},wb=e=>{let t=new Map(e.repos.map(r=>[r.id,r.name])),n=e.repoTargets.map(r=>{let s=t.get(r.repoId)??r.repoId,i=Y.relative(e.bundlePath,r.worktreePath),o=r.status==="ready"?"ready":`unavailable: ${r.failureReason??"unknown error"}`;return`- \`${i}/\` - ${s} (${r.repoId}, ${o})`}).join(`
11
+ `)}`}let t=H(e);if(!t?.number||!t.url)return"not linked";let n=t.requiredChecks.length,r=n===1?"check":"checks";return`#${t.number} ${t.status??"unknown"} mergeable=${t.mergeable} mergeState=${t.mergeStateStatus??"unknown"} (${n} ${r})`},pb=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",fb=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT",mb=e=>e instanceof SyntaxError||e instanceof Error&&e.message.startsWith("Craig task record at ");var jr=async(e,t)=>{let n=await J("git",["show-ref","--verify","--quiet",`refs/heads/${t}`],{cwd:e});if(n.exitCode===0)return!0;if(n.exitCode===1)return!1;throw new Error(n.stderr.trim()||n.stdout.trim()||"Unable to check git branch state.")},za=async(e,t,n,r="main")=>{let s=r.trim()||"main";if((await J("git",["show-ref","--verify","--quiet",`refs/heads/${s}`],{cwd:e})).exitCode!==0)throw new Error(`Base branch '${s}' does not exist locally.`);let o=await hb(e,s);await K("git",["worktree","add","-b",t,n,o],{cwd:e})},hb=async(e,t)=>(await J("git",["remote","get-url","origin"],{cwd:e})).exitCode!==0||(await J("git",["fetch","origin",t],{cwd:e})).exitCode!==0?t:(await J("git",["show-ref","--verify","--quiet",`refs/remotes/origin/${t}`],{cwd:e})).exitCode===0?`refs/remotes/origin/${t}`:t,li=async e=>{let t=await J("git",["status","--short"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"Unable to inspect git status.");return t.stdout.trim().length>0},Fp=async e=>{await K("git",["add","-A"],{cwd:e})},Lp=async(e,t)=>{await K("git",["commit","-m",t],{cwd:e})},Mp=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}},jp=async e=>{let t=await J("git",["branch","--show-current"],{cwd:e});if(t.exitCode!==0)return null;let n=t.stdout.trim();return n.length>0?n:null};var ci=async(e,t)=>{await K("git",["worktree","remove","--force",t],{cwd:e})},qp=async(e,t)=>{await K("git",["branch","-D",t],{cwd:e})};var Ja=async e=>Yn(e,e.repoRoot),Yn=async(e,t)=>{let n=await Ne(e),r=Up(new Date),s=Bp(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 Ne(e),n=Up(new Date),r=Bp(t.taskIds,n);return`task_${n}_${String(r).padStart(2,"0")}`},Up=e=>{let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}${n}${r}`},Bp=(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:Et,validateTaskRecord:Ke})=>{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(gb(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}},gb=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"&&e.code==="ENOENT";var Wp=["merge_ready","pr_open","checked","review","running","draft"],Xa=e=>[...e].sort((t,n)=>t.id.localeCompare(n.id)),Qa=(e,t)=>t&&e.some(r=>r.id===t)?t:e.length===0?null:[...e].sort(yb)[0]?.id??null,yb=(e,t)=>{let n=Vp(e.status),r=Vp(t.status);return n!==r?n-r:t.updatedAt.localeCompare(e.updatedAt)},Vp=e=>{let t=Wp.indexOf(e);return t>=0?t:Wp.length};import Kp from"node:path";var Pn=(e,t)=>t?Kp.isAbsolute(t)?t:Kp.join(e.repoRoot,t):null;import{randomUUID as wb}from"node:crypto";import{mkdir as Wr,rm as kb,writeFile as ui}from"node:fs/promises";import Y from"node:path";var Br=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-");var Gp=["AGENTS","md"].join("."),zn=async(e,t,n,r={})=>{let s=await xe(e,t),[i,o]=await Promise.all([Sb(e,s.id,r.workspaceId,r.allowLinkedProjectRepo??!1),Yn(e,s.rootPath)]),a=`craig/${o}`,l=Y.join(e.worktreesDir,s.id,o),c=Y.join(e.logsDir,`${o}.log`),d=Y.join(e.artifactsDir,o);await Promise.all([Wr(Y.dirname(l),{recursive:!0}),Wr(d,{recursive:!0}),ui(c,"","utf8")]);let u=Tb(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 Ka(e,o),await za(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 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 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=Y.join(e.craigDir,"task-bundles",o),u=Y.join(e.logsDir,`${o}.log`),p=Y.join(e.artifactsDir,o);await Wr(d,{recursive:!0}),await Wr(p,{recursive:!0}),await ui(u,"","utf8");let h=await Promise.all(i.map(b=>xe(e,b))),f=Rb(h),m=await Promise.all(h.map(b=>bb(e,b,o,c,Y.join(d,f.get(b.id))))),y=m.find(b=>b.status==="ready")??m[0];if(!m.some(b=>b.status==="ready"))throw await kb(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 el({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),...Yp(o,r.lineage),repoRoot:d,worktreePath:d,branch:c,bundlePath:d,selectedRepoTargetId:y.repoId,repoTargets:m,ptyTabs:T,runnerSession:{command:k.runners.buildCommand(l,n,r.config??{}),pid:null,startedAt:null,lastKnownState:"starting",exitCode:null,exitedAt:null},prompt:{source:"inline",value:n},checks:y.checks,lastCommit:null,prs:[],artifacts:{logPath:Y.relative(e.workspaceRoot,u),checkSummaryPath:Y.relative(e.workspaceRoot,Y.join(p,"check-summary.json")),prDraftPath:null,prStatusPath:Y.relative(e.workspaceRoot,Y.join(p,"pr-status.json"))},cleanup:di(),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 Ka(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_${wb()}`}:{},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}]},Tb=(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:[],...Yp(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:{...tl(Y.relative(e.workspaceRoot,e.configFile))},lastCommit:null,prs:[],artifacts:{logPath:Y.relative(e.workspaceRoot,Y.join(e.logsDir,`${t.taskId}.log`)),checkSummaryPath:Y.relative(e.workspaceRoot,Y.join(e.artifactsDir,t.taskId,"check-summary.json")),prDraftPath:null,prStatusPath:Y.relative(e.workspaceRoot,Y.join(e.artifactsDir,t.taskId,"pr-status.json"))},cleanup:di(),lastFailureReason:null,createdAt:n,updatedAt:n}},bb=async(e,t,n,r,s)=>{try{return await Za(e,t,r,s)}catch(i){return{repoId:t.id,branch:r,repoRoot:t.rootPath,worktreePath:s,status:"unavailable",failureReason:i instanceof Error?i.message:"Failed to create worktree.",checks:tl(Y.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Hp(),cleanup:di()}}},Za=async(e,t,n,r)=>(await Wr(Y.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:tl(Y.relative(e.workspaceRoot,e.configFile)),lastCommit:null,pullRequest:Hp(),cleanup:di()}),Rb=e=>{let t=new Set(["manifest.json",Gp]),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},Pb=e=>{let t=new Map(e.repos.map(r=>[r.id,r.name])),n=e.repoTargets.map(r=>{let s=t.get(r.repoId)??r.repoId,i=Y.relative(e.bundlePath,r.worktreePath),o=r.status==="ready"?"ready":`unavailable: ${r.failureReason??"unknown error"}`;return`- \`${i}/\` - ${s} (${r.repoId}, ${o})`}).join(`
13
13
  `);return["# Craig Project Task Bundle","","This directory is a Craig project task bundle. Repo work must happen inside the child repo worktrees listed below.","","Run repo Git commands from a repo worktree directory, not from the bundle root. Use `manifest.json` as the machine-readable source of truth for this bundle.","",`Task: \`${e.taskId}\``,`Workspace: \`${e.workspaceId}\``,`Prompt: ${e.prompt}`,"","## Repo Worktrees","",n,""].join(`
14
- `)},Qa=async e=>{await ci(Y.join(e.bundlePath,"manifest.json"),JSON.stringify({taskId:e.taskId,workspaceId:e.workspaceId,prompt:e.prompt,repos:e.repoTargets.map(t=>({repoId:t.repoId,repoName:e.repos.find(n=>n.id===t.repoId)?.name??t.repoId,path:Y.relative(e.bundlePath,t.worktreePath),status:t.status,worktreePath:t.worktreePath,failureReason:t.failureReason}))},null,2),"utf8"),await ci(Y.join(e.bundlePath,Bp),wb(e),"utf8")},Za=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),Wp=()=>({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}),di=()=>({worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),Vp=(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}),kb=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 el=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}))},Kr=async(e,t,n)=>G(e,t,r=>({...r,status:"draft",runnerSession:{...r.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:n})),Gr=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 tl=async(e,t,n,r={})=>{let s=n.trim(),i=await T.load(e),o=r.runner??T.runners.getDefault(i);if(T.runners.assertEnabled(o,i),t.trim().length===0)throw new Error(r.workspaceId?"Workspace id cannot be empty.":"Repo id cannot be empty.");if(s.length===0)throw new Error("Task prompt cannot be empty.");let l=(r.workspaceId?await Wr(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 u=r.markStartedAfterLaunch===!1?await F(e,l.id):await Gr(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 Kr(e,l.id,c instanceof Error?c.message:"Unknown Craig error"),c}};import{mkdir as Sb}from"node:fs/promises";import Ib from"node:path";var $t=async e=>{let t=await J("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var Kp=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",nl(e),{cwd:t});return JSON.parse(n.stdout)},Xn=async(e,t)=>{let n=await J("gh",nl(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Yp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Gp=async(e,t)=>{let n=await J("gh",nl(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Yp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Hp=async(e,t,n)=>{if(n.length===0)return[];let r=Rb(n),s;try{s=await K("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw Tb(a)?new Ke(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=Pb(c);return{id:a.id,found:u!==null,view:u}})},ui=async e=>{let t=await J("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:bb(t.stdout.trim())},Yt=e=>{let t=e.trim().match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/([1-9]\d*)(?:[/?#].*)?$/);return!t?.[1]||!t[2]||!t[3]?null:{owner:t[1],name:t[2],number:Number(t[3])}},Tb=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")},Yp=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},nl=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],bb=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},Rb=e=>`
14
+ `)},el=async e=>{await ui(Y.join(e.bundlePath,"manifest.json"),JSON.stringify({taskId:e.taskId,workspaceId:e.workspaceId,prompt:e.prompt,repos:e.repoTargets.map(t=>({repoId:t.repoId,repoName:e.repos.find(n=>n.id===t.repoId)?.name??t.repoId,path:Y.relative(e.bundlePath,t.worktreePath),status:t.status,worktreePath:t.worktreePath,failureReason:t.failureReason}))},null,2),"utf8"),await ui(Y.join(e.bundlePath,Gp),Pb(e),"utf8")},tl=e=>({source:{type:"repo_config",path:e},lastRunAt:null,status:"not_run",commands:[],results:[]}),Hp=()=>({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}),di=()=>({worktreeRemovedAt:null,preservedWorktree:!1,warning:null}),Yp=(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}),Sb=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 nl=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 rl=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 Eb}from"node:fs/promises";import Ob from"node:path";var Nt=async e=>{let t=await J("gh",["auth","status"],{cwd:e});if(t.exitCode!==0)throw new Error(t.stderr.trim()||t.stdout.trim()||"GitHub CLI auth is required.")};var zp=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",sl(e),{cwd:t});return JSON.parse(n.stdout)},Xn=async(e,t)=>{let n=await J("gh",sl(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Qp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Jp=async(e,t)=>{let n=await J("gh",sl(e),{cwd:t});if(n.exitCode===0)return JSON.parse(n.stdout);let r=n.stderr.trim()||n.stdout.trim();if(Qp(r))return null;throw new Error(r||`GitHub CLI failed while discovering a pull request for ${e}.`)},Xp=async(e,t,n)=>{if(n.length===0)return[];let r=Cb(n),s;try{s=await K("gh",["api","graphql","-f",`query=${r}`,"-F",`owner=${t.owner}`,"-F",`name=${t.name}`])}catch(a){throw Ib(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=Ab(c);return{id:a.id,found:d!==null,view:d}})},pi=async e=>{let t=await J("git",["remote","get-url","origin"],{cwd:e});return t.exitCode!==0?null:vb(t.stdout.trim())},zt=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])}},Ib=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")},Qp=e=>{let t=e.toLowerCase();return t.includes("no pull requests found")||t.includes("could not resolve to a pullrequest")},sl=e=>["pr","view",e,"--json","number,url,baseRefName,headRefName,headRefOid,state,isDraft,title,createdAt,updatedAt,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments"],vb=e=>{let t=e.replace(/\.git$/,""),n=t.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)$/);if(n?.[1]&&n[2])return{owner:n[1],name:n[2]};let r=t.match(/^git@github\.com:([^/]+)\/([^/]+)$/);if(r?.[1]&&r[2])return{owner:r[1],name:r[2]};let s=t.match(/^ssh:\/\/git@github\.com\/([^/]+)\/([^/]+)$/);return s?.[1]&&s[2]?{owner:s[1],name:s[2]}:null},Cb=e=>`
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,158 +65,161 @@ fragment PrFields on PullRequest {
65
65
  }
66
66
  }
67
67
  }
68
- `,Pb=e=>{if(!e||typeof e!="object")return null;let t="nodes"in e?e.nodes?.[0]??null:e;if(!t||typeof t!="object")return null;let n=t,r=n.statusCheckRollup?.contexts?.nodes??[];return{number:n.number,url:n.url,baseRefName:n.baseRefName,headRefName:n.headRefName,headRefOid:n.headRefOid??null,state:n.state,isDraft:n.isDraft??!1,title:n.title??null,createdAt:n.createdAt??null,updatedAt:n.updatedAt??null,mergedAt:n.mergedAt??null,mergeable:n.mergeable,mergeStateStatus:n.mergeStateStatus,reviewDecision:n.reviewDecision??null,statusCheckRollup:r,comments:n.comments?.nodes??[]}};var Pn=async(e,t)=>{let n=Rn(e,t.artifacts.prStatusPath);n&&(await Sb(Ib.dirname(n),{recursive:!0}),await B(n,{taskId:t.id,prs:t.prs}))},Qn=async(e,t,n={writeTask:nt,writePrStatusArtifact:Pn})=>{await n.writeTask(e,t);try{await n.writePrStatusArtifact(e,t)}catch(r){throw new g("PARTIAL_RESULT",`Task ${t.id} was updated, but its PR status artifact could not be written.`,{retryable:!0,details:{taskId:t.id},cause:r})}return t},Hr=async(e,t,n,r,s={readRawTask:At,validateTaskRecord:We,writeTask:nt,writePrStatusArtifact:Pn,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=Ot(n,a),c=Et(o,l),u=o.status==="closed"?o.status:bn(c.prs),d={...c,status:u};return Qn(e,d,s)}),Yr=async(e,t)=>{let n=H(t),r=n?.number?String(n.number):t.branch,s=await Jn(r,t.worktreePath);return Hr(e,t,s,n)},zr=async(e,t)=>{for(let n of await rl(t)){let r=await Xn(n,t.worktreePath);if(!r)continue;return{discovered:!0,task:await Hr(e,t,r,null)}}return{discovered:!1,task:t}},rl=async e=>{let t=await xp(e.worktreePath).catch(()=>null);return[...new Set([t,e.branch].filter(n=>!!n))]};async function Jr(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=Yt(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=Ot(r,a,o??void 0),c=vb(r),u=Et(s,l),d={...u,repoTargets:(u.repoTargets??[]).map(h=>h.repoId===n?{...h,pullRequest:r.headRefName===h.branch?c:Zn(h)?h.pullRequest:zp(h.pullRequest)}:h)},p={...d,status:d.status==="closed"?d.status:fi(d)};return Qn(e,p)})}async function pi(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:zp(a.pullRequest)}:a)},o={...i,status:i.status==="closed"?i.status:fi(i)};return Qn(e,o)})}function Zn(e){return e.pullRequest.number!==null&&e.pullRequest.headBranch===e.branch}function vb(e){let t=Yt(e.url);return{provider:"github",owner:t?.owner??null,repo:t?.name??null,number:e.number,url:e.url,baseBranch:e.baseRefName,headBranch:e.headRefName,status:Cb(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:Ab(e.reviewDecision??null),requiredChecks:Ka(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function fi(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 Cb=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,Ab=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,zp=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 Jr(e,t.id,n.repoId,i),"synced"}let r=await Xn(n.branch,n.worktreePath);return r?(await Jr(e,t.id,n.repoId,r),"discovered"):(await pi(e,t.id,n.repoId),"not_found")};var Xr=async(e,t)=>{let n=await F(e,t),r=H(n);return r?.number?(await $t(n.worktreePath),Ht(r)?(await zr(e,n)).task:Yr(e,n)):n},il=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 ge(n),await $t(n.worktreePath),!r?.number||Ht(r)){let i=await zr(e,n);if(!i.discovered&&!r?.number)throw new Error(`No PR found for ${n.branch}.`);return i.task}return await Yr(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 $t(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},ol=async(e,t)=>{let n=new Map,r=new Map,s=[];for(let i of t){let o=sl(n,i);if(i.type==="project"&&i.repoTargets?.length){for(let d of i.repoTargets.filter(p=>p.status==="ready")){let p=Zn(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 Jp(r,h).catch(async()=>{try{await $t(d.worktreePath);let f=d.pullRequest.number?await er(e,i,d):await er(e,i,d);mi(o,f,d.pullRequest.number??null,d.pullRequest.url??null)}catch(f){if(f instanceof Ke)throw f;s.push(f)}})}continue}let a=H(i),l=a?.number&&!Ht(a),c=l?[]:await rl(i),u={id:i.id,task:i,worktreePath:i.worktreePath,selector:l?String(a.number):c[0]??i.branch,mode:l?"number":"head",fallbackSelectors:l?[]:c.slice(1)};await Jp(r,u).catch(async()=>{try{let{disposition:d,task:p}=await hi(e,i.id),h=H(p);mi(o,d,h?.number??null,h?.url??null)}catch(d){if(d instanceof Ke)throw d;s.push(d)}})}for(let i of r.values())try{await $t(i.worktreePath);let o=await Hp(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=sl(n,l.task),d=a.get(l.id)?.view??await Eb(i.worktreePath,l);if(!d){l.targetRepoId&&l.mode==="head"&&await pi(e,l.task.id,l.targetRepoId),mi(c,"not_found",null,null);continue}if(l.targetRepoId)await Jr(e,l.task.id,l.targetRepoId,d);else{let p=await At(e,l.task.id),h=We(p,`${e.tasksDir}/${l.task.id}.json`);await Hr(e,h,d,l.mode==="number"?H(h):null)}mi(c,l.mode==="number"?"synced":"discovered",d.number,d.url)}}catch(o){if(o instanceof Ke)throw o;s.push(o)}return Ob(s),t.map(i=>sl(n,i))},hi=async(e,t)=>{let n=await F(e,t);await ge(n),await $t(n.worktreePath);let r=H(n);if(r?.number&&!Ht(r))return{disposition:"synced",task:await Yr(e,n)};let s=await zr(e,n);return{disposition:s.discovered?"discovered":"not_found",task:s.task}},Eb=async(e,t)=>{if(t.mode!=="head")return null;for(let n of t.fallbackSelectors){let r=await Xn(n,e);if(r)return r}return null},Jp=async(e,t)=>{let n=await ui(t.worktreePath);if(!n)throw new Error("GitHub repository remote could not be parsed.");let r=`${n.owner}/${n.name}`,s=e.get(r);if(s){s.items.push(t);return}e.set(r,{worktreePath:t.worktreePath,repository:n,items:[t]})},sl=(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},mi=(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},Ob=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var al=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 Xr(e,t))}catch{}let r=await Lr(e,n);return{kind:"showTask",task:n,inspection:r}};var ll=async(e,t)=>{let n=await F(e,t);if(await ge(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 $b(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}},$b=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 Nb(e);for(let s of r){let i=await J("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(i.stdout.trimEnd())}return t.join(`
68
+ `,Ab=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 Eb(Ob.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:Et,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=Ot(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 il(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}},il=async e=>{let t=await jp(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=zt(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=$b(r),d=Ot(s,l),u={...d,repoTargets:(d.repoTargets??[]).map(h=>h.repoId===n?{...h,pullRequest:r.headRefName===h.branch?c:Zn(h)?h.pullRequest:Zp(h.pullRequest)}:h)},p={...u,status:u.status==="closed"?u.status:mi(u)};return Qn(e,p)})}async function fi(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:Zp(a.pullRequest)}:a)},o={...i,status:i.status==="closed"?i.status:mi(i)};return Qn(e,o)})}function Zn(e){return e.pullRequest.number!==null&&e.pullRequest.headBranch===e.branch}function $b(e){let t=zt(e.url);return{provider:"github",owner:t?.owner??null,repo:t?.name??null,number:e.number,url:e.url,baseBranch:e.baseRefName,headBranch:e.headRefName,status:Nb(e.state),draft:e.isDraft??!1,mergeable:e.mergeable==="MERGEABLE",mergeStateStatus:e.mergeStateStatus,reviewDecision:Db(e.reviewDecision??null),requiredChecks:Ha(e.statusCheckRollup),comments:[],lastSyncedAt:new Date().toISOString(),lastSyncedHeadSha:e.headRefOid??null}}function mi(e){let t=(e.repoTargets??[]).filter(r=>r.status==="ready"),n=t.map(r=>r.pullRequest).filter(r=>r.number!==null);return n.length===0?"checked":n.every(r=>r.status==="merged")?"merged":n.length===t.length&&n.every(r=>r.mergeable&&r.reviewDecision!=="REVIEW_REQUIRED"&&r.reviewDecision!=="CHANGES_REQUESTED"&&r.mergeStateStatus!=="REVIEW_REQUIRED"&&r.requiredChecks.length>0&&r.requiredChecks.every(s=>s.status==="success"||s.status==="skipped"))?"merge_ready":n.some(r=>r.status==="open")?"pr_open":"checked"}var Nb=e=>e==="OPEN"?"open":e==="MERGED"?"merged":e==="CLOSED"?"closed":null,Db=e=>e==="APPROVED"||e==="CHANGES_REQUESTED"||e==="REVIEW_REQUIRED"?e:null,Zp=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 fi(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 Nt(n.worktreePath),Yt(r)?(await Jr(e,n)).task:zr(e,n)):n},al=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 ye(n),await Nt(n.worktreePath),!r?.number||Yt(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 Nt(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},ll=async(e,t)=>{let n=new Map,r=new Map,s=[];for(let i of t){let o=ol(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 ef(r,h).catch(async()=>{try{await Nt(u.worktreePath);let f=u.pullRequest.number?await er(e,i,u):await er(e,i,u);hi(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&&!Yt(a),c=l?[]:await il(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 ef(r,d).catch(async()=>{try{let{disposition:u,task:p}=await gi(e,i.id),h=H(p);hi(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 Nt(i.worktreePath);let o=await Xp(i.worktreePath,i.repository,i.items),a=new Map(o.map(l=>[l.id,l]));for(let l of i.items){let c=ol(n,l.task),u=a.get(l.id)?.view??await _b(i.worktreePath,l);if(!u){l.targetRepoId&&l.mode==="head"&&await fi(e,l.task.id,l.targetRepoId),hi(c,"not_found",null,null);continue}if(l.targetRepoId)await Xr(e,l.task.id,l.targetRepoId,u);else{let p=await Et(e,l.task.id),h=Ke(p,`${e.tasksDir}/${l.task.id}.json`);await Yr(e,h,u,l.mode==="number"?H(h):null)}hi(c,l.mode==="number"?"synced":"discovered",u.number,u.url)}}catch(o){if(o instanceof He)throw o;s.push(o)}return xb(s),t.map(i=>ol(n,i))},gi=async(e,t)=>{let n=await F(e,t);await ye(n),await Nt(n.worktreePath);let r=H(n);if(r?.number&&!Yt(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}},_b=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},ef=async(e,t)=>{let n=await pi(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]})},ol=(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},hi=(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},xb=e=>{if(e.length!==0)throw e.length===1?e[0]:new AggregateError(e,`${e.length} pull request polling operations failed.`)};var cl=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 ye(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 Fb(n.worktreePath);return{kind:"showTaskDiff",taskId:n.id,diffText:s,isEmpty:!1}},Fb=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 Lb(e);for(let s of r){let i=await J("git",["diff","--no-index","--stat","--patch","--","/dev/null",s],{cwd:e});t.push(i.stdout.trimEnd())}return t.join(`
69
69
 
70
- `)},Nb=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 Db}from"node:child_process";import{access as _b}from"node:fs/promises";var cl=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 _b(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},dl=async e=>{await new Promise((t,n)=>{let r=!1,s=Db("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 xb}from"node:fs/promises";import Fb from"node:path";var ul=async(e,t)=>{let n=await F(e,t);if(await ge(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 ai(n.worktreePath)&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);let s=(await T.load(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);await G(e,n.id,a=>({...a,status:a.status==="running"?n.status:a.status,checks:{...a.checks,status:"running",commands:[...s],results:[]}}));let i=[];for(let a of s){let l=new Date().toISOString(),c=await J("sh",["-lc",a],{cwd:n.worktreePath}),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 G(e,n.id,f=>({...f,status:"review",checks:{...f.checks,results:i,status:"failed",lastRunAt:u},lastFailureReason:p}));return await Xp(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 Xp(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},Xp=async(e,t)=>{let n=Rn(e,t.artifacts.checkSummaryPath);n&&(await xb(Fb.dirname(n),{recursive:!0}),await B(n,{taskId:t.id,status:t.checks.status,lastRunAt:t.checks.lastRunAt,commands:t.checks.commands,results:t.checks.results}))};var pl=async(e,t)=>{let n=await F(e,t);await ge(n);let r=await ai(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 Np(n.worktreePath),await Dp(n.worktreePath,s);let i=await _p(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 Lb}from"node:fs/promises";var fl=async(e,t)=>{let n=await F(e,t),r=await Mb(n.worktreePath);return G(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},Mb=async e=>{try{return await Lb(e),!0}catch{return!1}};var ml=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await li(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 hl=async(e,t,n)=>{let r=await _e(e,n),s=await G(e,t,i=>{if(i.repoId===r.id)throw new Error(`Repo ${r.id} is already the primary repo for task ${i.id}.`);return{...i,linkedRepoIds:i.linkedRepoIds.includes(r.id)?i.linkedRepoIds:[...i.linkedRepoIds,r.id]}});return{kind:"addTaskLink",taskId:s.id,repoId:r.id,linkedRepoIds:s.linkedRepoIds}},gl=async(e,t)=>{let n=await F(e,t),r=await Promise.all(n.linkedRepoIds.map(s=>_e(e,s)));return{kind:"listTaskLinks",taskId:n.id,repos:r}};import{access as jb,readFile as Qp,rm as qb,writeFile as Zp}from"node:fs/promises";import gi from"node:path";var tf=["AGENTS","md"].join("."),yl=async(e,t,n)=>tt(e,t,async()=>{let r=await F(e,t);Ub(r);let s=r.repoTargets?.find(f=>f.repoId===n);if(s)return ef(r.id,s.repoId,s.branch,s.worktreePath,"unchanged");let[i,o]=await Promise.all([_e(e,n),Ie(e).then(f=>f.find(m=>m.id===r.workspaceId)??null)]);if(!o||o.kind!=="project"||o.status!=="active"||!o.discoveredRepoIds?.includes(i.id))throw new g("TASK_CONTEXT_CONFLICT",`Repo ${i.id} is not a discovered repository in project workspace ${r.workspaceId}.`,{details:{taskId:r.id,repoId:i.id,workspaceId:r.workspaceId}});let a=r.bundlePath??r.worktreePath,l=gi.join(a,Bb(i.name,r)),c=gi.join(a,"manifest.json"),u=gi.join(a,tf),[d,p,h]=await Promise.all([Qp(c,"utf8"),Qp(u,"utf8"),Mr(i.rootPath,r.branch)]);try{let f=await Xa(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(k=>_e(e,k.repoId)));return await Qa({taskId:r.id,workspaceId:r.workspaceId,prompt:Wb(d)??r.title,repos:y,repoTargets:m.repoTargets??[],bundlePath:a}),await nt(e,m),ef(r.id,i.id,f.branch,f.worktreePath,"added")}catch(f){let m=await Vb({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}}),Ub=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}})},Bb=(e,t)=>{let n=new Set(["manifest.json",tf,...(t.repoTargets??[]).map(o=>gi.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},Wb=e=>{try{let t=JSON.parse(e);return typeof t.prompt=="string"?t.prompt:null}catch{return null}},Vb=async e=>{let t=[];return await Zp(e.manifestPath,e.manifestBackup,"utf8").catch(r=>t.push(r)),await Zp(e.guidePath,e.guideBackup,"utf8").catch(r=>t.push(r)),await jb(e.worktreePath).then(()=>!0).catch(()=>!1)&&await li(e.repoRoot,e.worktreePath).catch(async r=>{t.push(r),await qb(e.worktreePath,{recursive:!0,force:!0}).catch(s=>t.push(s))}),e.branchAlreadyExisted||await Mr(e.repoRoot,e.branch).catch(s=>(t.push(s),!1))&&await Fp(e.repoRoot,e.branch).catch(s=>t.push(s)),t},ef=(e,t,n,r,s)=>({kind:"addTaskRepoTarget",disposition:s,taskId:e,repoId:t,branch:n,worktreePath:r});import{spawn as Kb}from"node:child_process";var wl=async(e,t)=>{let n=await F(e,t);await ge(n);let s=(await T.load(e)).open?.command??[];if(s.length===0)return{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!1,command:null};let i=[...s,n.worktreePath];return await Gb(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},Gb=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=Kb(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 rf}from"node:fs/promises";import Qr from"node:path";async function Tl(e,t){if(t.explicitTaskId!==void 0){let l=await nf(e,t.explicitTaskId,"explicit");return kl(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await nf(e,t.environmentTaskId,"environment");return kl(l,"environment",t.environmentAgentTabId)}let n=await rf(t.cwd).catch(()=>Qr.resolve(t.cwd)),r=await qr(e,{includeClosed:!0}),i=(await Promise.all(r.tasks.map(async l=>({task:l,matches:await Yb(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 kl(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 nf(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 kl(e,t,n){let r=n??null;if(r!==null){let s=e.ptyTabs.find(i=>i.id===r);if(!s||s.kind!=="agent")throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${r} does not belong to Craig task ${e.id}.`,{details:{taskId:e.id,agentTabId:r}})}return{task:e,source:t,agentTabId:r}}function Hb(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function Yb(e,t){return(await Promise.all(Hb(e).map(r=>rf(r).catch(()=>Qr.resolve(r))))).some(r=>zb(r,t))}function zb(e,t){let n=Qr.relative(Qr.resolve(e),t);return n===""||!n.startsWith("..")&&!Qr.isAbsolute(n)}var bl=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:Ur(r)}));return{kind:"renameTask",taskId:i.id,previousTitle:s,title:i.title,slug:i.slug}};var Rl=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 Kp(s.worktreePath,i,n)};var Zr={readTask:F,writeTask:nt,withTaskLock:tt,ensureGhAuthenticated:$t,fetchPrView:Jn,discoverPrView:Gp,getGitHubRepositoryLocator:ui,writePrStatusArtifact:Pn};async function Sl(e,t,n,r=Zr){let s=await r.readTask(e,t),i=await Xb(s,n,r);return zt(s,i,"showTaskPr","shown",[])}async function Il(e,t,n,r=Zr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Ol(s,n,null,r);await $l(i,r);let o=await wi(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return zt(s,i,"discoverTaskPr","not_found",[]);Nl(o,i);let a=ki(s,i,o.number),l=await Dl(e,s,i,o,r);return zt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function vl(e,t,n,r,s=Zr){let i=El(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Ol(o,r,i.repository,s);of(i.repository,a),await $l(a,s);let l=await wi(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));Qb(l,i),Nl(l,a);let c=ki(o,a,l.number),u=_l(o,a),d=u&&!Gn(u,{owner:a.repository.owner,repo:a.repository.name,number:l.number})&&u.status!=="closed"&&u.status!=="merged"?[`Pull request #${l.number} becomes active; #${u.number} remains in task history.`]:[],p=await Dl(e,o,a,l,s);return zt(p,a,"linkTaskPr",c?"unchanged":"linked",d)})}async function Jb(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 yi(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=sf(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&wt({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await yi(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&&wt({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&wt({owner:c.owner,name:c.repo},s)&&(!c.headBranch||c.headBranch===o.branch));(a||l)&&i.push({repoId:o.repoId,branch:o.branch,worktreePath:o.worktreePath,repository:s,projectTarget:o})}if(i.length!==1)throw new g("TASK_CONTEXT_AMBIGUOUS",`Pull request repository ${n.repository.owner}/${n.repository.name} does not map to exactly one target in project task ${e.id}.`,{details:{taskId:e.id,owner:n.repository.owner,repo:n.repository.name,matchingRepoIds:i.map(o=>o.repoId)}});return i[0]}async function Cl(e,t,n,r=Zr){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Ol(s,n,null,r),o=_l(s,i);if(!o?.number)return zt(s,i,"refreshTaskPr","not_found",[]);await $l(i,r);let a=await wi(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));Nl(a,i);let l=await Dl(e,s,i,a,r);return zt(l,i,"refreshTaskPr","synced",[])})}async function Al(e,t,n,r,s=Zr){let i=El(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Jb(o,r,i,s);if(of(i.repository,a),!ki(o,a,i.number))return zt(o,a,"unlinkTaskPr","unchanged",[]);let c=Zb(o,a,i.number),u=await lf(e,c,s);return zt(u,a,"unlinkTaskPr","unlinked",[])})}function El(e){let t=e.trim(),n=Yt(t);if(n)return{number:n.number,repository:n};if(/^[1-9]\d*$/.test(t))return{number:Number(t),repository:null};throw new g("CLI_USAGE",`Invalid pull request selector "${e}". Use a GitHub pull request URL or positive number.`,{details:{selector:e}})}async function Ol(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw nr(e,t);return Pl(e.repoId,e.branch,e.worktreePath,null,r)}let s=e.repoTargets??[];if(t){let o=s.find(a=>a.repoId===t);if(!o)throw nr(e,t);return Pl(o.repoId,o.branch,o.worktreePath,o,r)}if(!n)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for pull request commands.`,{details:{taskId:e.id,repoIds:s.map(o=>o.repoId)}});let i=[];for(let o of s){let a=await Pl(o.repoId,o.branch,o.worktreePath,o,r).catch(l=>{if(l instanceof g&&l.code==="EXTERNAL_DEPENDENCY_FAILED"&&l.message.includes("does not have a supported GitHub origin remote"))return null;throw l});a&&wt(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 Xb(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 yi(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 yi(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function yi(e,t,n,r){let s=sf(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function sf(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?Yt(e.url):null}async function Pl(e,t,n,r,s){let i=await s.getGitHubRepositoryLocator(n);if(!i)throw new g("EXTERNAL_DEPENDENCY_FAILED",`Repo ${e} does not have a supported GitHub origin remote.`,{details:{repoId:e,worktreePath:n}});return{repoId:e,branch:t,worktreePath:n,repository:i,projectTarget:r}}async function $l(e,t){await wi("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function wi(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 of(e,t){if(e&&!wt(e,t.repository))throw af(e,t)}function Qb(e,t){let n=Yt(e.url);if(!n||n.number!==t.number)throw new g("TASK_CONTEXT_CONFLICT",`GitHub returned ${e.url} for pull request selector #${t.number}.`,{details:{selectorNumber:t.number,returnedUrl:e.url}});if(t.repository&&!wt(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 Nl(e,t){let n=Yt(e.url);if(!n||!wt(n,t.repository))throw af(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 af(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 wt(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function Dl(e,t,n,r,s){let i=ki(t,n,r.number),o=Ot(r,i,n.repository),a=Et(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:uf(o)}:l)}),lf(e,a,s)}function Zb(e,t,n){let r=e.prs.filter(i=>!df(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=cf(r.filter(o=>o.owner&&o.repo&&wt({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?uf(i):tR(t.repository)}:o)}}return s}async function lf(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?fi(t):bn(t.prs),s={...t,status:r};return Qn(e,s,n)}function ki(e,t,n){return xl(e,t).find(r=>df(r,t,n))??null}function _l(e,t){if(!t.projectTarget)return H(e);let n=xl(e,t);return cf(n)}function cf(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function xl(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&wt({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?eR(r.pullRequest,t.repository):null;return s&&!n.some(i=>Gn(i,s))?[...n,s]:n}function df(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||wt({owner:e.owner,name:e.repo},t.repository)}function zt(e,t,n,r,s){let i=xl(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:_l(e,t),warnings:s}}function uf(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 eR(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 tR(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:qr,getTask:F,provisionTask:zn,provisionProjectTask:Wr,createTask:tl,showTask:al,showTaskDiff:ll,prepareTaskLogs:cl,streamTaskLogs:dl,runChecks:ul,commitTask:pl,closeTask:fl,cleanupTask:ml,addTaskLink:hl,addTaskRepoTarget:yl,listTaskLinks:gl,sortTasksForDisplay:za,resolveSelectedTaskId:Ja,allocateTaskId:Ya,allocateTaskIdForRepo:Yn,allocateProjectTaskId:jr,createDefaultTaskPtyTabs:Vr,assertTaskWorktreeExists:ge,resolveTaskLogPath:Hn,buildTaskInspection:Lr,resolveArtifactPath:Rn,openTask:wl,markRunnerFailed:el,recordStartupFailure:Kr,markTaskStarted:Gr,renameTask:bl,resolveContext:Tl,prs:{refresh:Xr,refreshChecks:il,discoverOrRefresh:hi,discoverOrRefreshAll:tr,discoverOrRefreshMany:ol,show:Sl,discover:Il,link:vl,refreshAssociation:Cl,unlink:Al,merge:Rl,getPrimaryPr:H,isPrTerminal:Ht,isMergeReady:oi,deriveTaskStatus:bn,upsertPr:Et,normalizePr:Ot,summarizeRequiredChecks:Va,writePrStatusArtifact:Pn}};var pf={idle:0,ready:1,working:2,error:3};function Ge(e,t,n,r="idle"){let s=t.find(i=>i.tabId===e);return s?s.sessionState==="failed"||s.sessionState==="exited"&&s.exitCode!==0?"error":s.sessionState==="exited"?"ready":n-s.lastActivityAt<5e3?"working":"ready":r}function Jt(e,t,n,r){let s=e.ptyTabs.find(o=>o.kind==="agent")?.id,i=t===s&&e.runnerSession?.lastKnownState==="failed"?"error":"idle";return Ge(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=Jt(e,s.id,t,n);pf[i]>pf[r]&&(r=i)}return r}function Ti(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&Ge(s.id,t,n)==="working"))}function kt(e,t,n){let r=e.flatMap(i=>i.ptyTabs.filter(o=>o.kind==="agent").map(o=>{let a=t.find(c=>c.tabId===o.id),l=Jt(i,o.id,t,n);return{taskId:i.id,tabId:o.id,title:o.title,runner:o.runner??i.runner,state:l,sessionState:a?.sessionState??null,lastActivityAt:a?.lastActivityAt??null,exitCode:a?.exitCode??null,error:a?.error??(l==="error"?i.lastFailureReason??null:null)}})),s=e.map(i=>({taskId:i.id,state:rr(i,t,n),agentTabIds:r.filter(o=>o.taskId===i.id).map(o=>o.tabId)}));return{agents:r,tasks:s}}async function Fl(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=kt([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 ff(e.id);let d=a-r();if(d<=0)throw nR(e.id,n.states,n.timeoutMs);let p=s;await new Promise((h,f)=>{let m=()=>{clearTimeout(k),n.signal?.removeEventListener("abort",y),h()},y=()=>{clearTimeout(k),f(ff(e.id))},k=setTimeout(m,d);i=m,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var nR=(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}}),ff=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as oR}from"node:net";import{createHash as rR}from"node:crypto";import{tmpdir as sR}from"node:os";import mf from"node:path";var Sn=10,iR=new Set([6,7,8,9,Sn]);function Xt(e){return e!==void 0&&iR.has(e)}function xe(e){let t=rR("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:mf.join(sR(),`craig-${t}.sock`),pidPath:mf.join(e.runtimeDir,"pty-daemon.pid")}}async function hf(e){let t=null;try{let n=await aR(xe(e.paths).socketPath);return t=new Ml(n,e),await t.ready(),t}catch{return t?.close(),null}}var Ml=class{constructor(t,n){this.socket=t;this.options=n;t.setEncoding("utf8"),t.on("data",r=>this.handleData(String(r))),t.on("error",r=>this.rejectAll(r instanceof Error?r:new Error(String(r)))),t.on("close",()=>this.handleClose())}socket;options;pending=new Map;snapshots=new Map;revisionByTabId=new Map;nextRequestId=1;revision=0;buffer="";closed=!1;async ready(){if((await this.send({type:"ping"})).protocolVersion!==Sn)throw new Error("Craig PTY daemon protocol mismatch.");await this.send({type:"setActivityEnabled",enabled:!0});let n=this.revision,r=await this.send({type:"getActivitySnapshots"});this.replaceSnapshots(r.activities??[],n)}getSnapshots(){return[...this.snapshots.values()]}close(){this.closed||(this.closed=!0,this.socket.end(),this.rejectAll(new Error("Craig PTY daemon activity connection closed.")))}async send(t){if(this.closed||this.socket.destroyed)throw new Error("Craig PTY daemon activity connection is closed.");let n=this.nextRequestId++,r=new Promise((i,o)=>{this.pending.set(n,{resolve:i,reject:o})});this.socket.write(`${JSON.stringify({...t,id:n})}
70
+ `)},Lb=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 Mb}from"node:child_process";import{access as jb}from"node:fs/promises";var dl=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 jb(r)}catch{throw new Error(`Task ${n.id} log file does not exist yet at ${r}.`)}return{kind:"streamTaskLogs",taskId:n.id,logPath:r}},pl=async e=>{await new Promise((t,n)=>{let r=!1,s=Mb("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 qb}from"node:fs/promises";import Ub from"node:path";var fl=async(e,t)=>{let n=await F(e,t);if(await ye(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 li(n.worktreePath)&&(n.status="review"),n.status!=="review"&&n.status!=="checked")throw new Error(`Task ${n.id} cannot run checks from status "${n.status}".`);let s=(await k.load(e)).checks?.commands??[];if(s.length===0)throw new Error(`Craig config at ${e.configFile} does not define any "checks.commands".`);await G(e,n.id,a=>({...a,status:a.status==="running"?n.status:a.status,checks:{...a.checks,status:"running",commands:[...s],results:[]}}));let i=[];for(let a of s){let l=new Date().toISOString(),c=await J("sh",["-lc",a],{cwd:n.worktreePath}),d=new Date().toISOString(),u=c.exitCode??1;if(i.push({command:a,startedAt:l,finishedAt:d,exitCode:u}),u!==0){let p=c.stderr.trim()||c.stdout.trim()||`Check command failed: ${a}`,h=await G(e,n.id,f=>({...f,status:"review",checks:{...f.checks,results:i,status:"failed",lastRunAt:d},lastFailureReason:p}));return await tf(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 tf(e,o),{kind:"runChecks",taskId:n.id,status:"passed",commands:s}},tf=async(e,t)=>{let n=Pn(e,t.artifacts.checkSummaryPath);n&&(await qb(Ub.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 ml=async(e,t)=>{let n=await F(e,t);await ye(n);let r=await li(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 Fp(n.worktreePath),await Lp(n.worktreePath,s);let i=await Mp(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 Bb}from"node:fs/promises";var hl=async(e,t)=>{let n=await F(e,t),r=await Wb(n.worktreePath);return G(e,t,s=>({...s,status:"closed",cleanup:{...s.cleanup,preservedWorktree:r&&s.cleanup.worktreeRemovedAt===null,warning:null},lastFailureReason:null}))},Wb=async e=>{try{return await Bb(e),!0}catch{return!1}};var gl=async(e,t,n)=>{let r=[],s=null;if(!n.preserveWorktree)try{await ci(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 yl=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}},wl=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 Vb,readFile as nf,rm as Kb,writeFile as rf}from"node:fs/promises";import yi from"node:path";var of=["AGENTS","md"].join("."),kl=async(e,t,n)=>tt(e,t,async()=>{let r=await F(e,t);Gb(r);let s=r.repoTargets?.find(f=>f.repoId===n);if(s)return sf(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=yi.join(a,Hb(i.name,r)),c=yi.join(a,"manifest.json"),d=yi.join(a,of),[u,p,h]=await Promise.all([nf(c,"utf8"),nf(d,"utf8"),jr(i.rootPath,r.branch)]);try{let f=await Za(e,i,r.branch,l),m={...r,linkedRepoIds:i.id===r.repoId||r.linkedRepoIds.includes(i.id)?r.linkedRepoIds:[...r.linkedRepoIds,i.id],repoTargets:[...r.repoTargets??[],f]},y=await Promise.all((m.repoTargets??[]).map(T=>xe(e,T.repoId)));return await el({taskId:r.id,workspaceId:r.workspaceId,prompt:Yb(u)??r.title,repos:y,repoTargets:m.repoTargets??[],bundlePath:a}),await nt(e,m),sf(r.id,i.id,f.branch,f.worktreePath,"added")}catch(f){let m=await zb({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}}),Gb=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}})},Hb=(e,t)=>{let n=new Set(["manifest.json",of,...(t.repoTargets??[]).map(o=>yi.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},Yb=e=>{try{let t=JSON.parse(e);return typeof t.prompt=="string"?t.prompt:null}catch{return null}},zb=async e=>{let t=[];return await rf(e.manifestPath,e.manifestBackup,"utf8").catch(r=>t.push(r)),await rf(e.guidePath,e.guideBackup,"utf8").catch(r=>t.push(r)),await Vb(e.worktreePath).then(()=>!0).catch(()=>!1)&&await ci(e.repoRoot,e.worktreePath).catch(async r=>{t.push(r),await Kb(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 qp(e.repoRoot,e.branch).catch(s=>t.push(s)),t},sf=(e,t,n,r,s)=>({kind:"addTaskRepoTarget",disposition:s,taskId:e,repoId:t,branch:n,worktreePath:r});import{spawn as Jb}from"node:child_process";var Tl=async(e,t)=>{let n=await F(e,t);await ye(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 Xb(i,e.repoRoot),{kind:"openTask",taskId:n.id,worktreePath:n.worktreePath,launched:!0,command:i}},Xb=async(e,t)=>{await new Promise((n,r)=>{let[s,...i]=e,o=Jb(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 lf}from"node:fs/promises";import Zr from"node:path";async function Rl(e,t){if(t.explicitTaskId!==void 0){let l=await af(e,t.explicitTaskId,"explicit");return bl(l,"explicit",t.environmentAgentTabId)}if(t.environmentTaskId!==void 0){let l=await af(e,t.environmentTaskId,"environment");return bl(l,"environment",t.environmentAgentTabId)}let n=await lf(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 Zb(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 bl(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 af(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 bl(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 Qb(e){return[e.worktreePath,...e.bundlePath?[e.bundlePath]:[],...(e.repoTargets??[]).map(t=>t.worktreePath)]}async function Zb(e,t){return(await Promise.all(Qb(e).map(r=>lf(r).catch(()=>Zr.resolve(r))))).some(r=>eR(r,t))}function eR(e,t){let n=Zr.relative(Zr.resolve(e),t);return n===""||!n.startsWith("..")&&!Zr.isAbsolute(n)}var Pl=async(e,t,n)=>{let r=n.trim();if(r.length===0)throw new Error("Task title cannot be empty.");let s="",i=await 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 Sl=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 zp(s.worktreePath,i,n)};var es={readTask:F,writeTask:nt,withTaskLock:tt,ensureGhAuthenticated:Nt,fetchPrView:Jn,discoverPrView:Jp,getGitHubRepositoryLocator:pi,writePrStatusArtifact:Sn};async function vl(e,t,n,r=es){let s=await r.readTask(e,t),i=await nR(s,n,r);return Jt(s,i,"showTaskPr","shown",[])}async function Cl(e,t,n,r=es){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Nl(s,n,null,r);await Dl(i,r);let o=await ki(`discover a pull request for ${i.branch}`,()=>r.discoverPrView(i.branch,i.worktreePath));if(!o)return Jt(s,i,"discoverTaskPr","not_found",[]);_l(o,i);let a=Ti(s,i,o.number),l=await xl(e,s,i,o,r);return Jt(l,i,"discoverTaskPr",a?"synced":"discovered",[])})}async function Al(e,t,n,r,s=es){let i=$l(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await Nl(o,r,i.repository,s);uf(i.repository,a),await Dl(a,s);let l=await ki(`fetch pull request ${n}`,()=>s.fetchPrView(n,a.worktreePath));rR(l,i),_l(l,a);let c=Ti(o,a,l.number),d=Fl(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 xl(e,o,a,l,s);return Jt(p,a,"linkTaskPr",c?"unchanged":"linked",u)})}async function tR(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 wi(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=cf(o.pullRequest),l=e.prs.find(c=>c.number===n.number&&(!c.headBranch||c.headBranch===o.branch)&&(!a||!!(c.owner&&c.repo&&kt({owner:c.owner,name:c.repo},a))))??o.pullRequest;return{repoId:t,branch:o.branch,worktreePath:o.worktreePath,repository:await wi(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&&kt({owner:o.pullRequest.owner,name:o.pullRequest.repo},s),l=e.prs.some(c=>c.number===n.number&&c.owner&&c.repo&&kt({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 El(e,t,n,r=es){return r.withTaskLock(e,t,async()=>{let s=await r.readTask(e,t),i=await Nl(s,n,null,r),o=Fl(s,i);if(!o?.number)return Jt(s,i,"refreshTaskPr","not_found",[]);await Dl(i,r);let a=await ki(`refresh pull request #${o.number}`,()=>r.fetchPrView(String(o.number),i.worktreePath));_l(a,i);let l=await xl(e,s,i,a,r);return Jt(l,i,"refreshTaskPr","synced",[])})}async function Ol(e,t,n,r,s=es){let i=$l(n);return s.withTaskLock(e,t,async()=>{let o=await s.readTask(e,t),a=await tR(o,r,i,s);if(uf(i.repository,a),!Ti(o,a,i.number))return Jt(o,a,"unlinkTaskPr","unchanged",[]);let c=sR(o,a,i.number),d=await pf(e,c,s);return Jt(d,a,"unlinkTaskPr","unlinked",[])})}function $l(e){let t=e.trim(),n=zt(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 Nl(e,t,n,r){if(e.type==="repo"){if(t&&t!==e.repoId)throw nr(e,t);return Il(e.repoId,e.branch,e.worktreePath,null,r)}let s=e.repoTargets??[];if(t){let o=s.find(a=>a.repoId===t);if(!o)throw nr(e,t);return Il(o.repoId,o.branch,o.worktreePath,o,r)}if(!n)throw new g("CLI_USAGE",`Project task ${e.id} requires --repo <repo-id> for pull request commands.`,{details:{taskId:e.id,repoIds:s.map(o=>o.repoId)}});let i=[];for(let o of s){let a=await Il(o.repoId,o.branch,o.worktreePath,o,r).catch(l=>{if(l instanceof g&&l.code==="EXTERNAL_DEPENDENCY_FAILED"&&l.message.includes("does not have a supported GitHub origin remote"))return null;throw l});a&&kt(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 nR(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 wi(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 wi(r.pullRequest,r.worktreePath,t,n),projectTarget:r}}async function wi(e,t,n,r){let s=cf(e);return s||(await r.getGitHubRepositoryLocator(t).catch(()=>null)??{owner:"",name:n})}function cf(e){return e?.owner&&e.repo?{owner:e.owner,name:e.repo}:e?.url?zt(e.url):null}async function Il(e,t,n,r,s){let i=await s.getGitHubRepositoryLocator(n);if(!i)throw new g("EXTERNAL_DEPENDENCY_FAILED",`Repo ${e} does not have a supported GitHub origin remote.`,{details:{repoId:e,worktreePath:n}});return{repoId:e,branch:t,worktreePath:n,repository:i,projectTarget:r}}async function Dl(e,t){await ki("verify GitHub CLI authentication",()=>t.ensureGhAuthenticated(e.worktreePath))}async function ki(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 uf(e,t){if(e&&!kt(e,t.repository))throw df(e,t)}function rR(e,t){let n=zt(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&&!kt(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 _l(e,t){let n=zt(e.url);if(!n||!kt(n,t.repository))throw df(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 df(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 kt(e,t){return e.owner.toLowerCase()===t.owner.toLowerCase()&&e.name.toLowerCase()===t.name.toLowerCase()}async function xl(e,t,n,r,s){let i=Ti(t,n,r.number),o=$t(r,i,n.repository),a=Ot(t,o);return n.projectTarget&&(a={...a,repoTargets:(a.repoTargets??[]).map(l=>l.repoId===n.repoId?{...l,pullRequest:hf(o)}:l)}),pf(e,a,s)}function sR(e,t,n){let r=e.prs.filter(i=>!mf(i,t,n)),s={...e,prs:r};if(t.projectTarget?.pullRequest.number===n){let i=ff(r.filter(o=>o.owner&&o.repo&&kt({owner:o.owner,name:o.repo},t.repository)));s={...s,repoTargets:(s.repoTargets??[]).map(o=>o.repoId===t.repoId?{...o,pullRequest:i?hf(i):oR(t.repository)}:o)}}return s}async function pf(e,t,n){let r=t.status==="closed"?t.status:t.type==="project"?mi(t):Rn(t.prs),s={...t,status:r};return Qn(e,s,n)}function Ti(e,t,n){return Ll(e,t).find(r=>mf(r,t,n))??null}function Fl(e,t){if(!t.projectTarget)return H(e);let n=Ll(e,t);return ff(n)}function ff(e){return[...e].reverse().find(t=>t.status!=="merged"&&t.status!=="closed")??e[e.length-1]??null}function Ll(e,t){if(!t.projectTarget)return e.prs;let n=e.prs.filter(i=>i.owner&&i.repo&&kt({owner:i.owner,name:i.repo},t.repository)),r=e.repoTargets?.find(i=>i.repoId===t.repoId),s=r?.pullRequest.number?iR(r.pullRequest,t.repository):null;return s&&!n.some(i=>Gn(i,s))?[...n,s]:n}function mf(e,t,n){return e.number!==n?!1:!e.owner||!e.repo||kt({owner:e.owner,name:e.repo},t.repository)}function Jt(e,t,n,r,s){let i=Ll(e,t);return{kind:n,taskId:e.id,repoId:t.repoId,disposition:r,pullRequests:i,primaryPullRequest:Fl(e,t),warnings:s}}function hf(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 iR(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 oR(e){return{provider:"github",owner:e.owner,repo:e.name,number:null,url:null,baseBranch:null,headBranch:null,status:null,draft:!1,mergeable:!1,mergeStateStatus:null,reviewDecision:null,requiredChecks:[],comments:[],lastSyncedAt:null,lastSyncedHeadSha:null}}var S={listTasks:Ur,getTask:F,provisionTask:zn,provisionProjectTask:Vr,createTask:rl,showTask:cl,showTaskDiff:ul,prepareTaskLogs:dl,streamTaskLogs:pl,runChecks:fl,commitTask:ml,closeTask:hl,cleanupTask:gl,addTaskLink:yl,addTaskRepoTarget:kl,listTaskLinks:wl,sortTasksForDisplay:Xa,resolveSelectedTaskId:Qa,allocateTaskId:Ja,allocateTaskIdForRepo:Yn,allocateProjectTaskId:qr,createDefaultTaskPtyTabs:Kr,assertTaskWorktreeExists:ye,resolveTaskLogPath:Hn,buildTaskInspection:Mr,resolveArtifactPath:Pn,openTask:Tl,markRunnerFailed:nl,recordStartupFailure:Gr,markTaskStarted:Hr,renameTask:Pl,resolveContext:Rl,prs:{refresh:Qr,refreshChecks:al,discoverOrRefresh:gi,discoverOrRefreshAll:tr,discoverOrRefreshMany:ll,show:vl,discover:Cl,link:Al,refreshAssociation:El,unlink:Ol,merge:Sl,getPrimaryPr:H,isPrTerminal:Yt,isMergeReady:ai,deriveTaskStatus:Rn,upsertPr:Ot,normalizePr:$t,summarizeRequiredChecks:Ga,writePrStatusArtifact:Sn}};var gf={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 Xt(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=Xt(e,s.id,t,n);gf[i]>gf[r]&&(r=i)}return r}function bi(e,t,n){return e.some(r=>r.ptyTabs.some(s=>s.kind==="agent"&&Ye(s.id,t,n)==="working"))}function Tt(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=Xt(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 Ml(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=Tt([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 yf(e.id);let u=a-r();if(u<=0)throw aR(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(yf(e.id))},T=setTimeout(m,u);i=m,n.signal?.addEventListener("abort",y,{once:!0}),s!==p&&i()}),i=null}}finally{o()}}var aR=(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}}),yf=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}});import{createConnection as dR}from"node:net";import{createHash as lR}from"node:crypto";import{tmpdir as cR}from"node:os";import wf from"node:path";var bt=10,uR=new Set([6,7,8,9,bt]);function Qt(e){return e!==void 0&&uR.has(e)}function Fe(e){let t=lR("sha256").update(e.workspaceRoot).digest("hex").slice(0,16);return{socketPath:wf.join(cR(),`craig-${t}.sock`),pidPath:wf.join(e.runtimeDir,"pty-daemon.pid")}}async function kf(e){let t=null;try{let n=await pR(Fe(e.paths).socketPath);return t=new ql(n,e),await t.ready(),t}catch{return t?.close(),null}}var ql=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!==bt)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 aR(e){return new Promise((t,n)=>{let r=oR(e);r.once("connect",()=>t(r)),r.once("error",n)})}var ql={openObserver:yf,listTasks:e=>S.listTasks(e),getTask:(e,t)=>S.getTask(e,t),now:Date.now};async function lR(e,t,n=ql){let r=await gf(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...kt(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function cR(e,t,n=ql){let r=await gf(e,t.taskId,n),s=await n.openObserver(e);try{let i=kt(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 dR(e,t,n,r=ql){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await Fl(s,i,{...n,now:r.now})}finally{i.close()}}async function gf(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function yf(e){return jl.open(e)}async function uR(e){return yf(e)}var jl=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 hf({paths:this.paths,onActivity:n=>{this.snapshots.set(n.tabId,n),this.notify()},onActivityRemoved:n=>{this.snapshots.delete(n),this.notify()},onDaemonClose:()=>{this.client=null,this.notify(),this.scheduleReconnect()}});if(this.closed){t?.close();return}if(this.client=t,t){this.reconnectDelayMs=250,this.snapshots.clear();for(let n of t.getSnapshots())this.snapshots.set(n.tabId,n);this.notify()}else this.scheduleReconnect()}scheduleReconnect(){if(this.closed||this.reconnectTimer)return;let t=this.reconnectDelayMs;this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,1e3),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},t)}notify(){for(let t of this.listeners)t()}},Nt={listAgents:lR,showAgentStatus:cR,waitForTask:dR,openObserver:uR};import{randomUUID as NR}from"node:crypto";import{mkdir as jf,open as Xl,readdir as Ql,readFile as ss,rm as DR,stat as _R}from"node:fs/promises";import Ii from"node:path";import{createHash as gR}from"node:crypto";import{mkdir as es,readdir as Wl,readFile as ts,writeFile as yR}from"node:fs/promises";import He from"node:path";import{mkdir as wf,readFile as pR,rm as Ul,stat as fR,writeFile as mR}from"node:fs/promises";import Bl from"node:path";async function sr(e,t){let n=Bl.join(e.runtimeDir,"fury-store.lock");await wf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await wf(n);try{await mR(Bl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await Ul(n,{recursive:!0,force:!0}),s}break}catch(s){if(!kf(s,"EEXIST"))throw s;let i=await pR(Bl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await fR(n).catch(()=>null);if(typeof i?.pid=="number"&&!hR(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await Ul(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 Ul(n,{recursive:!0,force:!0})}}function hR(e){try{return process.kill(e,0),!0}catch(t){return kf(t,"EPERM")}}var kf=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var ye=e=>({root:He.join(e.craigDir,"fury"),definitions:He.join(e.craigDir,"fury","definitions"),plans:He.join(e.craigDir,"fury","plans"),approvals:He.join(e.craigDir,"fury","approvals"),runs:He.join(e.craigDir,"fury","runs"),reviews:He.join(e.craigDir,"fury","reviews")});function Vl(e){return gR("sha256").update(JSON.stringify(e)).digest("hex")}async function bf(e,t,n){let r=ye(e);await es(r.definitions,{recursive:!0});let s=He.join(r.definitions,`${t}.yaml`);await yR(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!Qt(i,"EEXIST"))throw i})}async function Rf(e,t){return sr(e,async()=>{let n=await Pf(e),r=n.find(o=>o.planHash===t.planHash);if(r)return r;let s=n.filter(o=>o.rootTaskId===t.rootTaskId&&o.sourceFile===t.sourceFile).at(-1),i=s&&Date.parse(t.createdAt)<=Date.parse(s.createdAt)?{...t,createdAt:new Date(Date.parse(s.createdAt)+1).toISOString()}:t;return await es(ye(e).plans,{recursive:!0}),await B(Df(e,i.id),i),i})}async function bi(e,t){Pi(t,"plan");try{return wR(JSON.parse(await ts(Df(e,t),"utf8")),t)}catch(n){throw Qt(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function Pf(e){let t=ye(e).plans,n=await Wl(t).catch(s=>Qt(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>bi(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Sf(e){let t=await Pf(e),n=await Promise.all(t.map(s=>Hl(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 If(e,t){return sr(e,async()=>{let n=await Hl(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 es(ye(e).approvals,{recursive:!0}),await B(_f(e,t.planId),t),{approval:t,created:!0}})}async function vf(e,t){Pi(t,"plan");let n=await Hl(e,t);if(!n)throw new g("FURY_APPROVAL_REQUIRED",`Fury plan ${t} requires human approval.`,{});return n}async function Cf(e,t){return sr(e,async()=>{let r=(await Ef(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 es(ye(e).runs,{recursive:!0}),await B(Kl(e,t.id),t),{run:t,created:!0}})}async function pe(e,t){Pi(t,"run");try{return $f(JSON.parse(await ts(Kl(e,t),"utf8")),t)}catch(n){throw Qt(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function Af(e){return Ef(e)}async function Ef(e){let t=ye(e).runs,n=await Wl(t).catch(s=>Qt(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(async s=>{let i=s.slice(0,-5);return $f(JSON.parse(await ts(He.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function ze(e,t,n){return sr(e,async()=>{let r=await pe(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury mutation cannot change its id.",{});return await B(Kl(e,t),s),s})}async function Of(e,t){await es(ye(e).reviews,{recursive:!0}),await B(Gl(e,t.id),t)}async function ns(e,t,n){return sr(e,async()=>{let r=await ir(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await B(Gl(e,t),s),s})}async function ir(e,t){Pi(t,"review");try{return kR(JSON.parse(await ts(Gl(e,t),"utf8")),t)}catch(n){throw Qt(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function Ri(e){let t=ye(e).reviews,n=await Wl(t).catch(r=>Qt(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>ir(e,r.slice(0,-5))))}function $f(e,t){let n=["pending","running","waiting_for_review","succeeded","failed","cancelled","timed_out"];if(!$e(e)||e.schemaVersion!==1||e.id!==t||typeof e.planId!="string"||!/^fury_plan_[A-Za-z0-9_-]+$/.test(e.planId)||typeof e.planHash!="string"||!/^[a-f0-9]{64}$/.test(e.planHash)||typeof e.definitionHash!="string"||!/^[a-f0-9]{64}$/.test(e.definitionHash)||typeof e.name!="string"||!e.name||typeof e.sourceFile!="string"||!e.sourceFile||typeof e.rootTaskId!="string"||!e.rootTaskId||!n.includes(String(e.state))||!$e(e.inputs)||!Nf(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!TR(e.stepRuns,e.order)||!rs(e.actor)||!Ye(e.createdAt)||!Ye(e.updatedAt)||!Ye(e.stateChangedAt)||!Ye(e.deadlineAt)||e.completedAt!==null&&!Ye(e.completedAt))throw new g("FURY_RECORD_INVALID",`Fury run record ${t} is invalid.`,{});return e}function wR(e,t){if(!$e(e)||e.schemaVersion!==1||e.id!==t||typeof e.planHash!="string"||!/^[a-f0-9]{64}$/.test(e.planHash)||typeof e.definitionHash!="string"||!/^[a-f0-9]{64}$/.test(e.definitionHash)||typeof e.name!="string"||!e.name||typeof e.sourceFile!="string"||!e.sourceFile||typeof e.rootTaskId!="string"||!e.rootTaskId||!$e(e.inputs)||!Nf(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||!rs(e.createdBy)||!Ye(e.createdAt))throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} is invalid.`,{});let n={...e};if(delete n.id,delete n.planHash,delete n.createdBy,delete n.createdAt,Vl(n)!==e.planHash)throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function kR(e,t){let n=["waiting_for_review","changes_requested","approved","rejected","timed_out","cancelled"];if(!$e(e)||e.schemaVersion!==1||e.id!==t||typeof e.runId!="string"||typeof e.stepId!="string"||!n.includes(String(e.state))||typeof e.title!="string"||typeof e.summary!="string"||e.feedbackTarget!==null&&(!$e(e.feedbackTarget)||typeof e.feedbackTarget.taskId!="string"||e.feedbackTarget.agentTabId!==null&&typeof e.feedbackTarget.agentTabId!="string")||!Number.isInteger(e.round)||Number(e.round)<1||!Number.isInteger(e.version)||Number(e.version)<1||!Ye(e.requestedAt)||!Ye(e.deadlineAt)||!Ye(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!Tf(r))||e.lastDecision!==null&&!Tf(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function TR(e,t){return $e(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&bR(e[n],n))}function bR(e,t){return!$e(e)||e.id!==t||!["agent","human_review"].includes(String(e.kind))||!["pending","running","waiting_for_review","changes_requested","succeeded","failed","cancelled","timed_out"].includes(String(e.state))||!Array.isArray(e.needs)||e.needs.some(n=>typeof n!="string")||!$e(e.plan)?!1:[e.taskId,e.agentTabId,e.commandId,e.reviewId,e.error].every(n=>n===null||typeof n=="string")&&[e.startedAt,e.completedAt,e.deadlineAt].every(n=>n===null||Ye(n))&&(e.completedBy===null||rs(e.completedBy))}function Tf(e){return $e(e)&&Number.isInteger(e.sequence)&&Number.isInteger(e.round)&&["approve","reject","request_changes","resubmit"].includes(String(e.action))&&(e.message===null||typeof e.message=="string")&&rs(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Ye(e.occurredAt)}function Nf(e){return $e(e)&&Number.isInteger(e.maxConcurrency)&&Number(e.maxConcurrency)>0&&Number.isInteger(e.maxTasks)&&Number(e.maxTasks)>0&&Number.isInteger(e.timeoutMs)&&Number(e.timeoutMs)>0}function rs(e){return $e(e)?e.type==="human"?["cli","tui"].includes(String(e.source))&&Number.isInteger(e.processId):e.type==="agent"?typeof e.taskId=="string"&&typeof e.agentTabId=="string"&&typeof e.capabilityId=="string":e.type==="system"&&["orchestration-supervisor","heartbeat"].includes(String(e.component)):!1}var Kl=(e,t)=>He.join(ye(e).runs,`${t}.json`),Df=(e,t)=>He.join(ye(e).plans,`${t}.json`),_f=(e,t)=>He.join(ye(e).approvals,`${t}.json`),Gl=(e,t)=>He.join(ye(e).reviews,`${t}.json`),Pi=(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 Hl(e,t){try{let n=JSON.parse(await ts(_f(e,t),"utf8"));if(!$e(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!rs(n.approvedBy)||!$e(n.approvedBy)||n.approvedBy.type!=="human"||!Ye(n.approvedAt))throw new g("FURY_RECORD_INVALID",`Fury approval record ${t} is invalid.`,{});return n}catch(n){if(Qt(n,"ENOENT"))return null;throw n}}var $e=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ye=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),Qt=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as xf,readFile as RR,rm as Si,stat as PR,writeFile as SR}from"node:fs/promises";import Yl from"node:path";var IR=20,vR=3e4,CR=5e3;async function Ff(e,t){let n=Yl.join(e.runtimeDir,"event-journal.lock");await xf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await xf(n);try{await SR(Yl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Si(n,{recursive:!0,force:!0}),s}break}catch(s){if(!OR(s))throw s;if(await AR(n))continue;if(Date.now()-r>=vR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await $R(IR)}try{return await t()}finally{await Si(n,{recursive:!0,force:!0})}}async function AR(e){let t=await RR(Yl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return ER(t.pid)?!1:(await Si(e,{recursive:!0,force:!0}),!0);let n=await PR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<CR?!1:(await Si(e,{recursive:!0,force:!0}),!0)}function ER(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 OR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",$R=e=>new Promise(t=>setTimeout(t,e));var xR=256*1024,FR=16,LR=64*1024;async function Fe(e,t,n={}){let r=Jl(n.maxSegmentBytes??xR,"Event journal segment size"),s=Jl(n.maxSegments??FR,"Event journal retention"),i=Jl(n.maxRecordBytes??LR,"Event record size");return Ff(e,async()=>{await jf(e.eventsDir,{recursive:!0}),await WR(e);let o=await Zl(e),a=t.id??NR(),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:GR(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 vi(e)).at(-1),f=!h||await MR(h.path,d,r);if(f&&(h={name:Mf(c),path:Ii.join(e.eventsDir,Mf(c)),startSequence:c}),!h)throw new g("INTERNAL_ERROR","Failed to select an event journal segment.",{});let m=await Xl(h.path,"a");try{await m.writeFile(d,"utf8"),await m.sync()}finally{await m.close()}return f&&await Uf(e.eventsDir),await jR(e,s),u})}async function In(e,t={}){let n=await Zl(e),r=VR(n.events,t.after,n.earliestSequence,n.events.at(-1)?.sequence??null),s=t.typeGlob?KR(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 qf(e){return(await Zl(e)).events}async function Zl(e){await jf(e.eventsDir,{recursive:!0});let t=await vi(e),n=[],r=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await ss(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 pR(e){return new Promise((t,n)=>{let r=dR(e);r.once("connect",()=>t(r)),r.once("error",n)})}var Bl={openObserver:bf,listTasks:e=>S.listTasks(e),getTask:(e,t)=>S.getTask(e,t),now:Date.now};async function fR(e,t,n=Bl){let r=await Tf(e,t,n),s=await n.openObserver(e);try{return{kind:"listAgents",...Tt(r,s.getSnapshots(),n.now()),daemonAvailable:s.daemonAvailable}}finally{s.close()}}async function mR(e,t,n=Bl){let r=await Tf(e,t.taskId,n),s=await n.openObserver(e);try{let i=Tt(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 hR(e,t,n,r=Bl){let s=await r.getTask(e,t),i=await r.openObserver(e);try{return await Ml(s,i,{...n,now:r.now})}finally{i.close()}}async function Tf(e,t,n){return t?[await n.getTask(e,t)]:(await n.listTasks(e)).tasks}async function bf(e){return Ul.open(e)}async function gR(e){return bf(e)}var Ul=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 kf({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()}},Dt={listAgents:fR,showAgentStatus:mR,waitForTask:hR,openObserver:gR};import{randomUUID as LR}from"node:crypto";import{mkdir as Bf,open as Zl,readdir as ec,readFile as os,rm as MR,stat as jR}from"node:fs/promises";import vi from"node:path";import{createHash as bR}from"node:crypto";import{mkdir as ts,readdir as Kl,readFile as ns,writeFile as RR}from"node:fs/promises";import ze from"node:path";import{mkdir as Rf,readFile as yR,rm as Wl,stat as wR,writeFile as kR}from"node:fs/promises";import Vl from"node:path";async function sr(e,t){let n=Vl.join(e.runtimeDir,"fury-store.lock");await Rf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Rf(n);try{await kR(Vl.join(n,"owner.json"),JSON.stringify({pid:process.pid}),"utf8")}catch(s){throw await Wl(n,{recursive:!0,force:!0}),s}break}catch(s){if(!Pf(s,"EEXIST"))throw s;let i=await yR(Vl.join(n,"owner.json"),"utf8").then(a=>JSON.parse(a)).catch(()=>null),o=await wR(n).catch(()=>null);if(typeof i?.pid=="number"&&!TR(i.pid)||!i&&o&&Date.now()-o.mtimeMs>5e3){await Wl(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 Wl(n,{recursive:!0,force:!0})}}function TR(e){try{return process.kill(e,0),!0}catch(t){return Pf(t,"EPERM")}}var Pf=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;var we=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 Gl(e){return bR("sha256").update(JSON.stringify(e)).digest("hex")}async function If(e,t,n){let r=we(e);await ts(r.definitions,{recursive:!0});let s=ze.join(r.definitions,`${t}.yaml`);await RR(s,n,{encoding:"utf8",flag:"wx"}).catch(i=>{if(!en(i,"EEXIST"))throw i})}async function vf(e,t){return sr(e,async()=>{let n=await Cf(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(we(e).plans,{recursive:!0}),await U(Ff(e,i.id),i),i})}async function Ri(e,t){Si(t,"plan");try{return PR(JSON.parse(await ns(Ff(e,t),"utf8")),t)}catch(n){throw en(n,"ENOENT")?new g("FURY_PLAN_NOT_FOUND",`Fury plan "${t}" was not found.`,{}):n}}async function Cf(e){let t=we(e).plans,n=await Kl(t).catch(s=>en(s,"ENOENT")?[]:Promise.reject(s));return(await Promise.all(n.filter(s=>s.endsWith(".json")).sort().map(s=>Ri(e,s.slice(0,-5))))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Af(e){let t=await Cf(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 Ef(e,t){return sr(e,async()=>{let n=await zl(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(we(e).approvals,{recursive:!0}),await U(Lf(e,t.planId),t),{approval:t,created:!0}})}async function Of(e,t){Si(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 $f(e,t){return sr(e,async()=>{let r=(await Nf(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(we(e).runs,{recursive:!0}),await U(Hl(e,t.id),t),{run:t,created:!0}})}async function ie(e,t){Si(t,"run");try{return _f(JSON.parse(await ns(Hl(e,t),"utf8")),t)}catch(n){throw en(n,"ENOENT")?new g("FURY_RUN_NOT_FOUND",`Fury run "${t}" was not found.`,{}):n}}async function Pi(e){return Nf(e)}async function Nf(e){let t=we(e).runs,n=await Kl(t).catch(s=>en(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 _f(JSON.parse(await ns(ze.join(t,s),"utf8")),i)}))).sort((s,i)=>s.createdAt.localeCompare(i.createdAt))}async function Ce(e,t,n){return sr(e,async()=>{let r=await ie(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury mutation cannot change its id.",{});return await U(Hl(e,t),s),s})}async function Df(e,t){await ts(we(e).reviews,{recursive:!0}),await U(Yl(e,t.id),t)}async function rs(e,t,n){return sr(e,async()=>{let r=await Zt(e,t),s=n(r);if(s.id!==t)throw new g("INTERNAL_ERROR","Fury review mutation cannot change its id.",{});return await U(Yl(e,t),s),s})}async function Zt(e,t){Si(t,"review");try{return SR(JSON.parse(await ns(Yl(e,t),"utf8")),t)}catch(n){throw en(n,"ENOENT")?new g("FURY_REVIEW_NOT_FOUND",`Fury review "${t}" was not found.`,{}):n}}async function ss(e){let t=we(e).reviews,n=await Kl(t).catch(r=>en(r,"ENOENT")?[]:Promise.reject(r));return Promise.all(n.filter(r=>r.endsWith(".json")).sort().map(r=>Zt(e,r.slice(0,-5))))}function _f(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)||!xf(e.limits)||!Array.isArray(e.order)||e.order.some(r=>typeof r!="string")||new Set(e.order).size!==e.order.length||!IR(e.stepRuns,e.order)||!is(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 PR(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)||!xf(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||!is(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,Gl(n)!==e.planHash)throw new g("FURY_RECORD_INVALID",`Fury plan record ${t} no longer matches its approved content hash.`,{});return e}function SR(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||!Je(e.requestedAt)||!Je(e.deadlineAt)||!Je(e.updatedAt)||!Array.isArray(e.history)||e.history.some(r=>!Sf(r))||e.lastDecision!==null&&!Sf(e.lastDecision))throw new g("FURY_RECORD_INVALID",`Fury review record ${t} is invalid.`,{});return e}function IR(e,t){return De(e)&&Object.keys(e).length===t.length&&t.every(n=>typeof n=="string"&&vR(e[n],n))}function vR(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||Je(n))&&(e.completedBy===null||is(e.completedBy))}function Sf(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")&&is(e.actor)&&(e.feedbackCommandId===null||typeof e.feedbackCommandId=="string")&&Je(e.occurredAt)}function xf(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 is(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 Hl=(e,t)=>ze.join(we(e).runs,`${t}.json`),Ff=(e,t)=>ze.join(we(e).plans,`${t}.json`),Lf=(e,t)=>ze.join(we(e).approvals,`${t}.json`),Yl=(e,t)=>ze.join(we(e).reviews,`${t}.json`),Si=(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 ns(Lf(e,t),"utf8"));if(!De(n)||n.schemaVersion!==1||n.planId!==t||typeof n.planHash!="string"||!/^[a-f0-9]{64}$/.test(n.planHash)||!is(n.approvedBy)||!De(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(en(n,"ENOENT"))return null;throw n}}var De=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Je=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),en=(e,t)=>typeof e=="object"&&e!==null&&"code"in e&&e.code===t;import{mkdir as Mf,readFile as CR,rm as Ii,stat as AR,writeFile as ER}from"node:fs/promises";import Jl from"node:path";var OR=20,$R=3e4,NR=5e3;async function jf(e,t){let n=Jl.join(e.runtimeDir,"event-journal.lock");await Mf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Mf(n);try{await ER(Jl.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Ii(n,{recursive:!0,force:!0}),s}break}catch(s){if(!xR(s))throw s;if(await DR(n))continue;if(Date.now()-r>=$R)throw new g("OPERATION_TIMEOUT","Timed out waiting for the event journal lock.",{retryable:!0});await FR(OR)}try{return await t()}finally{await Ii(n,{recursive:!0,force:!0})}}async function DR(e){let t=await CR(Jl.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return _R(t.pid)?!1:(await Ii(e,{recursive:!0,force:!0}),!0);let n=await AR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<NR?!1:(await Ii(e,{recursive:!0,force:!0}),!0)}function _R(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 xR=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",FR=e=>new Promise(t=>setTimeout(t,e));var qR=256*1024,UR=16,BR=64*1024;async function Le(e,t,n={}){let r=Ql(n.maxSegmentBytes??qR,"Event journal segment size"),s=Ql(n.maxSegments??UR,"Event journal retention"),i=Ql(n.maxRecordBytes??BR,"Event record size");return jf(e,async()=>{await Bf(e.eventsDir,{recursive:!0}),await YR(e);let o=await tc(e),a=t.id??LR(),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:XR(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 Ci(e)).at(-1),f=!h||await WR(h.path,u,r);if(f&&(h={name:Uf(c),path:vi.join(e.eventsDir,Uf(c)),startSequence:c}),!h)throw new g("INTERNAL_ERROR","Failed to select an event journal segment.",{});let m=await Zl(h.path,"a");try{await m.writeFile(u,"utf8"),await m.sync()}finally{await m.close()}return f&&await Vf(e.eventsDir),await VR(e,s),d})}async function In(e,t={}){let n=await tc(e),r=zR(n.events,t.after,n.earliestSequence,n.events.at(-1)?.sequence??null),s=t.typeGlob?JR(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 Wf(e){return(await tc(e)).events}async function tc(e){await Bf(e.eventsDir,{recursive:!0});let t=await Ci(e),n=[],r=new Set;for(let s=0;s<t.length;s+=1){let i=t[s],o=await os(i.path,"utf8"),a=s===t.length-1,l=o.split(`
76
76
  `);if(o.endsWith(`
77
- `))l.pop();else{if(!a)throw Zt(i.name,"segment has a truncated tail");l.pop()}for(let c=0;c<l.length;c+=1){let u=l[c];if(u.length===0)throw Zt(i.name,`empty record at line ${c+1}`);let d;try{d=JSON.parse(u)}catch{throw Zt(i.name,`invalid JSON at line ${c+1}`)}let p=HR(d,i.name,c+1);if(c===0&&p.sequence!==i.startSequence)throw Zt(i.name,`first record sequence ${p.sequence} does not match segment name`);if(r.has(p.id))throw Zt(i.name,`duplicate event id ${p.id}`);r.add(p.id);let h=n.at(-1);if(h&&p.sequence!==h.sequence+1)throw Zt(i.name,`non-monotonic sequence ${p.sequence} after ${h.sequence}`);n.push(p)}}return{events:n,earliestSequence:n[0]?.sequence??null}}async function vi(e){return(await Ql(e.eventsDir).catch(n=>{if(ec(n))return[];throw n})).flatMap(n=>{let r=/^segment-(\d{16})\.jsonl$/.exec(n);return r?[{name:n,path:Ii.join(e.eventsDir,n),startSequence:Number(r[1])}]:[]}).sort((n,r)=>n.startSequence-r.startSequence)}async function MR(e,t,n){let r=await _R(e).catch(()=>null);return r!==null&&r.size>0&&r.size+Buffer.byteLength(t)>n}async function jR(e,t){let n=await vi(e),r=Math.max(0,n.length-t),s=await UR(e),i=await qR(e);if(s===null||i===null)return;for(let a=0;a<r;a+=1)if(await BR(n[a].path,s,i)){r=a;break}let o=n.slice(0,r);for(let a of o)await DR(a.path,{force:!0});o.length>0&&await Uf(e.eventsDir)}async function qR(e){let t=ye(e).runs,n=await Ql(t).catch(s=>{if(ec(s))return[];throw s}),r=new Set;for(let s of n.filter(i=>i.endsWith(".json")))try{let i=JSON.parse(await ss(Ii.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 UR(e){let t=await Ql(e.commandsDir).catch(r=>{if(ec(r))return[];throw r}),n=new Set;for(let r of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await ss(Ii.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 BR(e,t,n){if(t.size===0&&n.size===0)return!1;let r=await ss(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 WR(e){let t=(await vi(e)).at(-1);if(!t)return;let n=await ss(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await Xl(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function VR(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 zl(t);return Lf(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}}):zl(t);return Lf(t,s.sequence,n),s.sequence}function Lf(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 KR(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 GR(e){let t=JSON.stringify(e,(n,r)=>/prompt|token|secret|password|authorization|capability/i.test(n)?"[REDACTED]":r);return t===void 0?null:JSON.parse(t)}function HR(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw Zt(t,`record at line ${n} is not an object`);let r=e,s={...r,furyRunId:r.furyRunId??r.swarmRunId??null,furyStepId:r.furyStepId??r.swarmStepId??null,type:typeof r.type=="string"&&r.type.startsWith("swarm.")?`fury.${r.type.slice(6)}`:r.type};delete s.swarmRunId,delete s.swarmStepId;let i=s;if(i.schemaVersion!==1||typeof i.id!="string"||i.id.length===0||i.id.length>256||!Number.isSafeInteger(i.sequence)||(i.sequence??0)<1||typeof i.type!="string"||i.type.length===0||i.type.length>256||typeof i.occurredAt!="string"||!Number.isFinite(Date.parse(i.occurredAt))||!or(i.workspaceId)||!or(i.taskId)||!or(i.agentTabId)||!or(i.commandId)||!or(i.furyRunId)||!or(i.furyStepId)||!YR(i.actor)||!("data"in i))throw Zt(t,`record at line ${n} has an invalid schema`);return i}function YR(e){if(typeof e!="object"||e===null||Array.isArray(e)||!("type"in e))return!1;let t=e;return t.type==="human"?(t.source==="cli"||t.source==="tui")&&Number.isInteger(t.processId):t.type==="agent"?typeof t.taskId=="string"&&typeof t.agentTabId=="string"&&typeof t.capabilityId=="string":t.type==="system"&&(t.component==="orchestration-supervisor"||t.component==="heartbeat")}var or=e=>e===null||typeof e=="string",Mf=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,Zt=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),zl=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),ec=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Jl(e,t){if(!Number.isSafeInteger(e)||e<1)throw new g("CLI_USAGE",`${t} must be a positive integer.`,{details:{value:e}});return e}async function Uf(e){let t=await Xl(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as Vf,readdir as iP,readFile as Kf}from"node:fs/promises";import Gf from"node:path";import{mkdir as Bf,readFile as zR,rm as Ci,stat as JR,writeFile as XR}from"node:fs/promises";import tc from"node:path";var QR=20,ZR=3e4,eP=5e3;async function nc(e,t){let n=tc.join(e.runtimeDir,"command-store.lock");await Bf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Bf(n);try{await XR(tc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Ci(n,{recursive:!0,force:!0}),s}break}catch(s){if(!rP(s))throw s;if(await tP(n))continue;if(Date.now()-r>=ZR)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await sP(QR)}try{return await t()}finally{await Ci(n,{recursive:!0,force:!0})}}async function tP(e){let t=await zR(tc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return nP(t.pid)?!1:(await Ci(e,{recursive:!0,force:!0}),!0);let n=await JR(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<eP?!1:(await Ci(e,{recursive:!0,force:!0}),!0)}function nP(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 rP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",sP=e=>new Promise(t=>setTimeout(t,e));async function Oi(e,t){rc(t);try{let n=JSON.parse(await Kf(is(e,t),"utf8"));return Yf(n,is(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?Ei(t,is(e,t),n):n}}async function Je(e){await Vf(e.commandsDir,{recursive:!0});let t=await iP(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=Gf.join(e.commandsDir,r);try{n.push(Yf(JSON.parse(await Kf(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:Ei(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function Hf(e,t){return rc(t.id),nc(e,async()=>{await Vf(e.commandsDir,{recursive:!0});let n=await Je(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!oP(r,t))throw new g("COMMAND_STATE_CONFLICT",`Idempotency key "${t.idempotencyKey}" is already used by command ${r.id}.`,{details:{commandId:r.id,idempotencyKey:t.idempotencyKey}});return{command:r,created:!1}}}return await B(is(e,t.id),t),{command:t,created:!0}})}async function os(e,t,n){return rc(t),nc(e,async()=>{let r=await Oi(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await B(is(e,t),s),s})}function oP(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 Yf(e,t,n){if(!Ai(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw Ei("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||!Ai(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!lP(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&&!Wf(e.cancelledBy)||!Wf(e.actor)||!aP(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 Ei(r,t);return e}function Wf(e){return!Ai(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 aP(e){return e===null||Ai(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var is=(e,t)=>Gf.join(e.commandsDir,`${t}.json`),rc=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)),lP=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}),Ai=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),cP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",Ei=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function zf(e,t=new Date){return $i(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function Jf(e,t=new Date){return e.state==="delivered"?e:($i(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function Xf(e,t,n=new Date){return e.state==="failed"?e:($i(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function Qf(e,t,n=new Date){return e.state==="cancelled"?e:($i(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function $i(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 dP}from"node:crypto";var sc=32*1024,Zf=1440*60*1e3,ic=256,uP=["delivered","failed","cancelled"],oc={type:"system",component:"orchestration-supervisor"};async function pP(e,t){if(TP(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>Zf)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:Zf}});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)>ic)throw new g("CLI_USAGE",`Idempotency key exceeds ${ic} characters.`,{details:{maxIdempotencyKeyLength:ic}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${dP()}`,idempotencyKey:t.idempotencyKey?.trim()||null,taskId:t.taskId,agentTabId:t.agentTabId,prompt:t.prompt,delivery:t.delivery,state:"queued",attempts:0,timeoutMs:t.timeoutMs,expiresAt:new Date(n.getTime()+t.timeoutMs).toISOString(),lastError:null,actor:t.actor,createdAt:n.toISOString(),updatedAt:n.toISOString(),deliveryStartedAt:null,deliveredAt:null,cancelledAt:null,cancelledBy:null},s=await Hf(e,r);if(s.created)try{await vn(e,s.command,"command.queued")}catch(i){throw em(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function fP(e,t){return{kind:"showPromptCommand",command:await Oi(e,t)}}async function mP(e,t){let n=await Je(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function hP(e,t,n){let r=!1,s=await os(e,t,i=>{if(i.state==="cancelled")return i;let o=Qf(i,n??i.actor);return r=!0,o});if(r)try{await vn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw em(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function gP(e,t){let n=await os(e,t,r=>zf(r));return await vn(e,n,"command.delivering",oc),n}async function yP(e,t){let n=await os(e,t,r=>Jf(r));return await vn(e,n,"command.delivered",oc),n}async function wP(e,t,n){let r=await os(e,t,s=>Xf(s,n));return await vn(e,r,"command.failed",oc),r}async function kP(e,t,n){let r=[...n.states??uP],s=Date.now()+n.timeoutMs;for(;;){let i=await Oi(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 bP(Math.min(n.pollIntervalMs??100,o),n.signal)}}function TP(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>sc)throw new g("CLI_USAGE",`Prompt exceeds the ${sc}-byte limit.`,{details:{maxPromptBytes:sc,promptBytes:t}});if([...e].some(n=>{let r=n.charCodeAt(0);return r<=8||r>=11&&r<=31||r>=127&&r<=159}))throw new g("CLI_USAGE","Prompt contains unsupported control characters.",{})}async function vn(e,t,n,r=t.actor){await Fe(e,{id:`${t.id}:${n}`,taskId:t.taskId,agentTabId:t.agentTabId,commandId:t.id,type:n,occurredAt:n==="command.queued"?t.createdAt:n==="command.delivering"?t.deliveryStartedAt??t.updatedAt:n==="command.delivered"?t.deliveredAt??t.updatedAt:n==="command.cancelled"?t.cancelledAt??t.updatedAt:t.updatedAt,actor:r,data:{state:t.state,delivery:t.delivery,attempts:t.attempts,errorCode:t.lastError?.code??null,deliveryUncertain:t.lastError?.deliveryUncertain??!1}})}function bP(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 em=(e,t)=>new g("PARTIAL_RESULT",`Command ${e.id} was persisted as ${e.state}, but its event could not be appended.`,{retryable:!0,details:{commandId:e.id,durableState:e.state},cause:t}),ae={create:pP,show:fP,list:mP,cancel:hP,wait:kP,beginDelivery:gP,completeDelivery:yP,fail:wP};import{randomUUID as nm,timingSafeEqual as RP}from"node:crypto";import{mkdir as PP,readFile as SP,readdir as IP}from"node:fs/promises";import rm from"node:path";var vP=10080*60*1e3,CP={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},AP=["task.create-child","task.children","task.cancel-tree"],EP=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function rt(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 PP(dc(e),{recursive:!0,mode:448}),await G(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_${nm()}`,c=await Ni(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 OP(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 OP(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${nm()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...AP],targetPolicy:"children-only",limits:{...CP},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+vP).toISOString(),revokedAt:null,revokedBy:null};return await B(uc(e,o.id),o,{mode:384}),o}async function Xe(e,t,n,r){let s=await NP(e,t);return s.revokedAt&&Cn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&Cn(s.id,"expired"),!EP.has(n)&&!s.allowedCommandFamilies.includes(n)&&Cn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await $P(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 $P(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 sm(e,t,n){let r=await Ni(e,t);r&&(r.revokedAt||await B(uc(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function cc(e,t,n){let r=await IP(dc(e)).catch(i=>im(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 Ni(e,o[1]);!a||!t.has(a.taskId)||(await sm(e,a.id,n),s.push(a.id))}return s}async function NP(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 Ni(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||!RP(i,o))&&Cn(r,"token is invalid"),s}async function Ni(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||Cn(t,"identifier is invalid");try{let n=JSON.parse(await SP(uc(e,t),"utf8"));if(!DP(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(im(n))return null;throw n}}function DP(e,t){if(!lc(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"&&_P(r))&&e.targetPolicy==="children-only"&&lc(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&ac(e.createdAt)&&ac(e.expiresAt)&&tm(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||ac(e.revokedAt)&&tm(e.revokedBy))}function tm(e){return lc(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 dc=e=>rm.join(e.orchestrationDir,"capabilities"),uc=(e,t)=>rm.join(dc(e),`${t}.json`),_P=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),lc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),ac=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),im=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as om,readFile as xP,rm as pc,stat as FP,writeFile as LP}from"node:fs/promises";import fc from"node:path";var MP=20,jP=3e4,qP=5e3;async function mc(e,t){let n=fc.join(e.runtimeDir,"delegation.lock");await om(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await om(n);try{await LP(fc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await pc(n,{recursive:!0,force:!0}),s}break}catch(s){if(!WP(s))throw s;if(await UP(n))continue;if(Date.now()-r>=jP)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,MP))}try{return await t()}finally{await pc(n,{recursive:!0,force:!0})}}async function UP(e){let t=await xP(fc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&BP(t.pid))return!1;let n=await FP(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<qP?!1:(await pc(e,{recursive:!0,force:!0}),!0)}function BP(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 WP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var VP={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function hc(e,t,n,r={}){let s=await T.load(e);return T.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 rt(e,i,{type:"human",source:"cli",processId:process.pid})})}):S.createTask(e,t,n,r)}async function gc(e,t,n={}){return mc(e,async()=>{let r=await S.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??VP,a=KP(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&&Di("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&Di("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(k=>k.delegationIdempotencyKey===p);if(y){if(!GP(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 am(y,!0)}}d.length>=o.maxChildren&&Di("children",o.maxChildren),d.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&Di("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(k=>k.kind==="agent")?.id??"",...t.fury?{CRAIG_FURY_RUN_ID:t.fury.runId,CRAIG_FURY_STEP_ID:t.fury.stepId}:{},...await rt(e,y,i)})}),m=await S.getTask(e,f.taskId);try{await Fe(e,{workspaceId:m.workspaceId,taskId:m.id,agentTabId:i.type==="agent"?i.agentTabId:null,type:"task.child.created",actor:i,data:{parentTaskId:r.id,rootTaskId:m.rootTaskId,delegationDepth:m.delegationDepth,targetType:a.type,targetId:a.id}})}catch(y){throw new g("PARTIAL_RESULT",`Child ${m.id} was created, but its audit event could not be recorded.`,{details:{taskId:m.id,parentTaskId:r.id,persisted:!0},cause:y})}return am(m,!1)})}async function yc(e,t,n){n&&await Xe(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 wc(e,t,n){return mc(e,async()=>{let s=(n?await Xe(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((k,R)=>k.id.localeCompare(R.id)))u(y.id)}};u(t);let d=[],p=[],h=[];try{await cc(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 Fe(e,{workspaceId:f.workspaceId,taskId:f.id,type:"task.tree.cancelled",actor:s,data:{rootTaskId:t,previousStatus:m}})}catch{p.push(f.id)}}if(p.length>0||h.length>0)throw new g("PARTIAL_RESULT","The task tree was cancelled, but some audit or capability updates failed.",{details:{taskId:t,cancelled:d,auditFailures:p,revocationFailures:h,persisted:!0}});return{kind:"cancelTaskTree",taskId:t,cancelled:d}})}function am(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 KP(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 GP(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function Di(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var _i=Symbol.for("yaml.alias"),xi=Symbol.for("yaml.document"),st=Symbol.for("yaml.map"),kc=Symbol.for("yaml.pair"),Le=Symbol.for("yaml.scalar"),Dt=Symbol.for("yaml.seq"),ve=Symbol.for("yaml.node.type"),Me=e=>!!e&&typeof e=="object"&&e[ve]===_i,Tt=e=>!!e&&typeof e=="object"&&e[ve]===xi,it=e=>!!e&&typeof e=="object"&&e[ve]===st,j=e=>!!e&&typeof e=="object"&&e[ve]===kc,x=e=>!!e&&typeof e=="object"&&e[ve]===Le,ot=e=>!!e&&typeof e=="object"&&e[ve]===Dt;function W(e){if(e&&typeof e=="object")switch(e[ve]){case st:case Dt:return!0}return!1}function U(e){if(e&&typeof e=="object")switch(e[ve]){case _i:case st:case Le:case Dt:return!0}return!1}var Fi=e=>(x(e)||W(e))&&!!e.anchor;var Ne=Symbol("break visit"),lm=Symbol("skip children"),bt=Symbol("remove node");function Qe(e,t){let n=cm(t);Tt(e)?lr(null,e.contents,n,Object.freeze([e]))===bt&&(e.contents=null):lr(null,e,n,Object.freeze([]))}Qe.BREAK=Ne;Qe.SKIP=lm;Qe.REMOVE=bt;function lr(e,t,n,r){let s=dm(e,t,n,r);if(U(s)||j(s))return um(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===Ne)return Ne;o===bt&&(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===Ne)return Ne;i===bt&&(t.key=null);let o=lr("value",t.value,n,r);if(o===Ne)return Ne;o===bt&&(t.value=null)}}return s}async function Li(e,t){let n=cm(t);Tt(e)?await cr(null,e.contents,n,Object.freeze([e]))===bt&&(e.contents=null):await cr(null,e,n,Object.freeze([]))}Li.BREAK=Ne;Li.SKIP=lm;Li.REMOVE=bt;async function cr(e,t,n,r){let s=await dm(e,t,n,r);if(U(s)||j(s))return um(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===Ne)return Ne;o===bt&&(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===Ne)return Ne;i===bt&&(t.key=null);let o=await cr("value",t.value,n,r);if(o===Ne)return Ne;o===bt&&(t.value=null)}}return s}function cm(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 dm(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(it(t))return n.Map?.(e,t,r);if(ot(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(Me(t))return n.Alias?.(e,t,r)}function um(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(Tt(r))r.contents=n;else{let s=Me(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var HP={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},YP=e=>e.replace(/[!,[\]{}]/g,t=>HP[t]),Rt=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+YP(t.substring(r.length));return t[0]==="!"?t:`!<${t}>`}toString(t){let n=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],r=Object.entries(this.tags),s;if(t&&r.length>0&&U(t.contents)){let i={};Qe(t.contents,(o,a)=>{U(a)&&a.tag&&(i[a.tag]=!0)}),s=Object.keys(i)}else s=[];for(let[i,o]of r)i==="!!"&&o==="tag:yaml.org,2002:"||(!t||s.some(a=>a.startsWith(o)))&&n.push(`%TAG ${i} ${o}`);return n.join(`
79
- `)}};Rt.defaultYaml={explicit:!1,version:"1.2"};Rt.defaultTags={"!!":"tag:yaml.org,2002:"};function Mi(e){if(/[\x00-\x19\s,[\]{}]/.test(e)){let n=`Anchor must not contain whitespace or control characters: ${JSON.stringify(e)}`;throw new Error(n)}return!0}function Tc(e){let t=new Set;return Qe(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function bc(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function pm(e,t){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=Tc(e));let o=bc(t,s);return s.add(o),o},setAnchors:()=>{for(let i of n){let o=r.get(i);if(typeof o=="object"&&o.anchor&&(x(o.node)||W(o.node)))o.node.anchor=o.anchor;else{let a=new Error("Failed to resolve repeated object (this should not happen)");throw a.source=i,a}}},sourceObjects:r}}function en(e,t,n,r){if(r&&typeof r=="object")if(Array.isArray(r))for(let s=0,i=r.length;s<i;++s){let o=r[s],a=en(e,r,String(s),o);a===void 0?delete r[s]:a!==o&&(r[s]=a)}else if(r instanceof Map)for(let s of Array.from(r.keys())){let i=r.get(s),o=en(e,r,s,i);o===void 0?r.delete(s):o!==i&&r.set(s,o)}else if(r instanceof Set)for(let s of Array.from(r)){let i=en(e,r,s,s);i===void 0?r.delete(s):i!==s&&(r.delete(s),r.add(i))}else for(let[s,i]of Object.entries(r)){let o=en(e,r,s,i);o===void 0?delete r[s]:o!==i&&(r[s]=o)}return e.call(t,n,r)}function le(e,t,n){if(Array.isArray(e))return e.map((r,s)=>le(r,String(s),n));if(e&&typeof e.toJSON=="function"){if(!n||!Fi(e))return e.toJSON(t,n);let r={aliasCount:0,count:1,res:void 0};n.anchors.set(e,r),n.onCreate=i=>{r.res=i,delete n.onCreate};let s=e.toJSON(t,n);return n.onCreate&&n.onCreate(s),s}return typeof e=="bigint"&&!n?.keep?Number(e):e}var tn=class{constructor(t){Object.defineProperty(this,ve,{value:t})}clone(){let t=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(t.range=this.range.slice()),t}toJS(t,{mapAsMap:n,maxAliasCount:r,onAnchor:s,reviver:i}={}){if(!Tt(t))throw new TypeError("A document argument is required");let o={anchors:new Map,doc:t,keep:!0,mapAsMap:n===!0,mapKeyWarned:!1,maxAliasCount:typeof r=="number"?r:100},a=le(this,"",o);if(typeof s=="function")for(let{count:l,res:c}of o.anchors.values())s(c,l);return typeof i=="function"?en(i,{"":a},"",a):a}};var _t=class extends tn{constructor(t){super(_i),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)=>{(Me(o)||Fi(o))&&r.push(o)}}),n&&(n.aliasResolveCache=r));let s;for(let i of r){if(i===this)break;i.anchor===this.source&&(s=i)}return s}toJSON(t,n){if(!n)return{source:this.source};let{anchors:r,doc:s,maxAliasCount:i}=n,o=this.resolve(s,n);if(!o){let l=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(l)}let a=r.get(o);if(a||(le(o,null,n),a=r.get(o)),a?.res===void 0){let l="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(l)}if(i>=0&&(a.count+=1,a.aliasCount===0&&(a.aliasCount=ji(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(Mi(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 ji(e,t,n){if(Me(t)){let r=t.resolve(e),s=n&&r&&n.get(r);return s?s.count*s.aliasCount:0}else if(W(t)){let r=0;for(let s of t.items){let i=ji(e,s,n);i>r&&(r=i)}return r}else if(j(t)){let r=ji(e,t.key,n),s=ji(e,t.value,n);return Math.max(r,s)}return 1}var qi=e=>!e||typeof e!="function"&&typeof e!="object",O=class extends tn{constructor(t){super(Le),this.value=t}toJSON(t,n){return n?.keep?this.value:le(this.value,t,n)}toString(){return String(this.value)}};O.BLOCK_FOLDED="BLOCK_FOLDED";O.BLOCK_LITERAL="BLOCK_LITERAL";O.PLAIN="PLAIN";O.QUOTE_DOUBLE="QUOTE_DOUBLE";O.QUOTE_SINGLE="QUOTE_SINGLE";var zP="tag:yaml.org,2002:";function JP(e,t,n){if(t){let r=n.filter(i=>i.tag===t),s=r.find(i=>!i.format)??r[0];if(!s)throw new Error(`Tag ${t} not found`);return s}return n.find(r=>r.identify?.(e)&&!r.format)}function xt(e,t,n){if(Tt(e)&&(e=e.contents),U(e))return e;if(j(e)){let d=n.schema[st].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 _t(l.anchor);l={anchor:null,node:null},a.set(e,l)}t?.startsWith("!!")&&(t=zP+t.slice(2));let c=JP(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[st]:Symbol.iterator in Object(e)?o[Dt]:o[st]}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 as(e,t,n){let r=n;for(let s=t.length-1;s>=0;--s){let i=t[s];if(typeof i=="number"&&Number.isInteger(i)&&i>=0){let o=[];o[i]=r,r=o}else r=new Map([[i,r]])}return xt(r,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:e,sourceObjects:new Map})}var ur=e=>e==null||typeof e=="object"&&!!e[Symbol.iterator]().next().done,dr=class extends tn{constructor(t,n){super(t),Object.defineProperty(this,"schema",{value:n,configurable:!0,enumerable:!1,writable:!0})}clone(t){let n=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return t&&(n.schema=t),n.items=n.items.map(r=>U(r)||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,as(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,as(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};var fm=e=>e.replace(/^(?!$)(?: $)?/gm,"#");function Ze(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var Pt=(e,t,n)=>e.endsWith(`
77
+ `))l.pop();else{if(!a)throw tn(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 tn(i.name,`empty record at line ${c+1}`);let u;try{u=JSON.parse(d)}catch{throw tn(i.name,`invalid JSON at line ${c+1}`)}let p=QR(u,i.name,c+1);if(c===0&&p.sequence!==i.startSequence)throw tn(i.name,`first record sequence ${p.sequence} does not match segment name`);if(r.has(p.id))throw tn(i.name,`duplicate event id ${p.id}`);r.add(p.id);let h=n.at(-1);if(h&&p.sequence!==h.sequence+1)throw tn(i.name,`non-monotonic sequence ${p.sequence} after ${h.sequence}`);n.push(p)}}return{events:n,earliestSequence:n[0]?.sequence??null}}async function Ci(e){return(await ec(e.eventsDir).catch(n=>{if(nc(n))return[];throw n})).flatMap(n=>{let r=/^segment-(\d{16})\.jsonl$/.exec(n);return r?[{name:n,path:vi.join(e.eventsDir,n),startSequence:Number(r[1])}]:[]}).sort((n,r)=>n.startSequence-r.startSequence)}async function WR(e,t,n){let r=await jR(e).catch(()=>null);return r!==null&&r.size>0&&r.size+Buffer.byteLength(t)>n}async function VR(e,t){let n=await Ci(e),r=Math.max(0,n.length-t),s=await GR(e),i=await KR(e);if(s===null||i===null)return;for(let a=0;a<r;a+=1)if(await HR(n[a].path,s,i)){r=a;break}let o=n.slice(0,r);for(let a of o)await MR(a.path,{force:!0});o.length>0&&await Vf(e.eventsDir)}async function KR(e){let t=we(e).runs,n=await ec(t).catch(s=>{if(nc(s))return[];throw s}),r=new Set;for(let s of n.filter(i=>i.endsWith(".json")))try{let i=JSON.parse(await os(vi.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 GR(e){let t=await ec(e.commandsDir).catch(r=>{if(nc(r))return[];throw r}),n=new Set;for(let r of t.filter(s=>s.endsWith(".json")))try{let s=JSON.parse(await os(vi.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 HR(e,t,n){if(t.size===0&&n.size===0)return!1;let r=await os(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 YR(e){let t=(await Ci(e)).at(-1);if(!t)return;let n=await os(t.path);if(n.length===0||n[n.length-1]===10)return;let r=n.lastIndexOf(10),s=await Zl(t.path,"r+");try{await s.truncate(r+1),await s.sync()}finally{await s.close()}}function zR(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 Xl(t);return qf(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}}):Xl(t);return qf(t,s.sequence,n),s.sequence}function qf(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 JR(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 XR(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 QR(e,t,n){if(typeof e!="object"||e===null||Array.isArray(e))throw tn(t,`record at line ${n} is not an object`);let r=e,s={...r,furyRunId:r.furyRunId??r.swarmRunId??null,furyStepId:r.furyStepId??r.swarmStepId??null,type:typeof r.type=="string"&&r.type.startsWith("swarm.")?`fury.${r.type.slice(6)}`:r.type};delete s.swarmRunId,delete s.swarmStepId;let i=s;if(i.schemaVersion!==1||typeof i.id!="string"||i.id.length===0||i.id.length>256||!Number.isSafeInteger(i.sequence)||(i.sequence??0)<1||typeof i.type!="string"||i.type.length===0||i.type.length>256||typeof i.occurredAt!="string"||!Number.isFinite(Date.parse(i.occurredAt))||!ir(i.workspaceId)||!ir(i.taskId)||!ir(i.agentTabId)||!ir(i.commandId)||!ir(i.furyRunId)||!ir(i.furyStepId)||!ZR(i.actor)||!("data"in i))throw tn(t,`record at line ${n} has an invalid schema`);return i}function ZR(e){if(typeof e!="object"||e===null||Array.isArray(e)||!("type"in e))return!1;let t=e;return t.type==="human"?(t.source==="cli"||t.source==="tui")&&Number.isInteger(t.processId):t.type==="agent"?typeof t.taskId=="string"&&typeof t.agentTabId=="string"&&typeof t.capabilityId=="string":t.type==="system"&&(t.component==="orchestration-supervisor"||t.component==="heartbeat")}var ir=e=>e===null||typeof e=="string",Uf=e=>`segment-${String(e).padStart(16,"0")}.jsonl`,tn=(e,t)=>new g("EVENT_JOURNAL_CORRUPT",`Event journal segment ${e} is corrupt: ${t}.`,{details:{segment:e,reason:t}}),Xl=e=>new g("EVENT_CURSOR_INVALID",`Event cursor ${e} was not found.`,{details:{cursor:e}}),nc=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";function Ql(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 Vf(e){let t=await Zl(e,"r");try{await t.sync()}finally{await t.close()}}import{mkdir as Hf,readdir as uP,readFile as Yf}from"node:fs/promises";import zf from"node:path";import{mkdir as Kf,readFile as eP,rm as Ai,stat as tP,writeFile as nP}from"node:fs/promises";import rc from"node:path";var rP=20,sP=3e4,iP=5e3;async function sc(e,t){let n=rc.join(e.runtimeDir,"command-store.lock");await Kf(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await Kf(n);try{await nP(rc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await Ai(n,{recursive:!0,force:!0}),s}break}catch(s){if(!lP(s))throw s;if(await oP(n))continue;if(Date.now()-r>=sP)throw new g("OPERATION_TIMEOUT","Timed out waiting for the command store lock.",{retryable:!0});await cP(rP)}try{return await t()}finally{await Ai(n,{recursive:!0,force:!0})}}async function oP(e){let t=await eP(rc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number")return aP(t.pid)?!1:(await Ai(e,{recursive:!0,force:!0}),!0);let n=await tP(e).catch(()=>null);return!n||Date.now()-n.mtimeMs<iP?!1:(await Ai(e,{recursive:!0,force:!0}),!0)}function aP(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 lP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST",cP=e=>new Promise(t=>setTimeout(t,e));async function $i(e,t){ic(t);try{let n=JSON.parse(await Yf(as(e,t),"utf8"));return Xf(n,as(e,t),t)}catch(n){throw mP(n)?new g("COMMAND_NOT_FOUND",`Craig command "${t}" was not found.`,{details:{commandId:t}}):n instanceof SyntaxError?Oi(t,as(e,t),n):n}}async function Me(e){await Hf(e.commandsDir,{recursive:!0});let t=await uP(e.commandsDir),n=[];for(let r of t.filter(s=>s.endsWith(".json")).sort()){let s=zf.join(e.commandsDir,r);try{n.push(Xf(JSON.parse(await Yf(s,"utf8")),s,r.slice(0,-5)))}catch(i){throw i instanceof g?i:Oi(r.slice(0,-5),s,i)}}return n.sort((r,s)=>r.createdAt.localeCompare(s.createdAt)||r.id.localeCompare(s.id))}async function Jf(e,t){return ic(t.id),sc(e,async()=>{await Hf(e.commandsDir,{recursive:!0});let n=await Me(e);if(t.idempotencyKey){let r=n.find(s=>s.idempotencyKey===t.idempotencyKey);if(r){if(!dP(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(as(e,t.id),t),{command:t,created:!0}})}async function ls(e,t,n){return ic(t),sc(e,async()=>{let r=await $i(e,t),s=n(r);if(s.id!==r.id)throw new g("INTERNAL_ERROR","Command mutation cannot change its id.",{});return await U(as(e,t),s),s})}function dP(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 Xf(e,t,n){if(!Ei(e)||e.schemaVersion!==1||typeof e.id!="string"||e.id.length===0)throw Oi("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||!Ei(e.prompt)||!["inline","file","stdin"].includes(String(e.prompt.source))||typeof e.prompt.text!="string"||!fP(e.prompt.text)||!["when-ready","immediate"].includes(String(e.delivery))||!s.includes(e.state)||!Number.isInteger(e.attempts)||Number(e.attempts)<0||!Number.isInteger(e.timeoutMs)||Number(e.timeoutMs)<=0||Number(e.timeoutMs)>864e5||!or(e.expiresAt)||!or(e.createdAt)||!or(e.updatedAt)||e.deliveryStartedAt!==null&&!or(e.deliveryStartedAt)||e.deliveredAt!==null&&!or(e.deliveredAt)||e.cancelledAt!==null&&!or(e.cancelledAt)||e.cancelledBy!==null&&!Gf(e.cancelledBy)||!Gf(e.actor)||!pP(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 Oi(r,t);return e}function Gf(e){return!Ei(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 pP(e){return e===null||Ei(e)&&typeof e.code=="string"&&typeof e.message=="string"&&typeof e.retryable=="boolean"&&typeof e.deliveryUncertain=="boolean"}var as=(e,t)=>zf.join(e.commandsDir,`${t}.json`),ic=e=>{if(!/^command_[A-Za-z0-9_-]+$/.test(e))throw new g("CLI_USAGE",`Invalid command id "${e}".`,{details:{commandId:e}})},or=e=>typeof e=="string"&&e.length>0&&Number.isFinite(Date.parse(e)),fP=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}),Ei=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),mP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT",Oi=(e,t,n)=>new g("COMMAND_RECORD_INVALID",`Craig command record at ${t} is invalid.`,{details:{commandId:e,filePath:t},...n?{cause:n}:{}});function Qf(e,t=new Date){return Ni(e,["queued"],"begin delivery"),{...e,state:"delivering",attempts:e.attempts+1,lastError:null,deliveryStartedAt:t.toISOString(),updatedAt:t.toISOString()}}function Zf(e,t=new Date){return e.state==="delivered"?e:(Ni(e,["delivering"],"complete delivery"),{...e,state:"delivered",deliveredAt:t.toISOString(),lastError:null,updatedAt:t.toISOString()})}function em(e,t,n=new Date){return e.state==="failed"?e:(Ni(e,["queued","delivering"],"fail"),{...e,state:"failed",lastError:t,updatedAt:n.toISOString()})}function tm(e,t,n=new Date){return e.state==="cancelled"?e:(Ni(e,["queued"],"cancel"),{...e,state:"cancelled",cancelledAt:n.toISOString(),cancelledBy:t,updatedAt:n.toISOString()})}function Ni(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 hP}from"node:crypto";var oc=32*1024,nm=1440*60*1e3,ac=256,gP=["delivered","failed","cancelled"],lc={type:"system",component:"orchestration-supervisor"};async function yP(e,t){if(IP(t.prompt.text),!Number.isSafeInteger(t.timeoutMs)||t.timeoutMs<=0||t.timeoutMs>nm)throw new g("CLI_USAGE","Prompt command timeout must be between 1ms and 24h.",{details:{maxTimeoutMs:nm}});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)>ac)throw new g("CLI_USAGE",`Idempotency key exceeds ${ac} characters.`,{details:{maxIdempotencyKeyLength:ac}});let n=t.now??new Date,r={schemaVersion:1,id:t.id??`command_${hP()}`,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 Jf(e,r);if(s.created)try{await vn(e,s.command,"command.queued")}catch(i){throw rm(s.command,i)}return{kind:"sendAgentPrompt",...s}}async function wP(e,t){return{kind:"showPromptCommand",command:await $i(e,t)}}async function kP(e,t){let n=await Me(e);return{kind:"listPromptCommands",commands:t?n.filter(r=>r.taskId===t):n}}async function TP(e,t,n){let r=!1,s=await ls(e,t,i=>{if(i.state==="cancelled")return i;let o=tm(i,n??i.actor);return r=!0,o});if(r)try{await vn(e,s,"command.cancelled",s.cancelledBy??s.actor)}catch(i){throw rm(s,i)}return{kind:"cancelPromptCommand",command:s,changed:r}}async function bP(e,t){let n=await ls(e,t,r=>Qf(r));return await vn(e,n,"command.delivering",lc),n}async function RP(e,t){let n=await ls(e,t,r=>Zf(r));return await vn(e,n,"command.delivered",lc),n}async function PP(e,t,n){let r=await ls(e,t,s=>em(s,n));return await vn(e,r,"command.failed",lc),r}async function SP(e,t,n){let r=[...n.states??gP],s=Date.now()+n.timeoutMs;for(;;){let i=await $i(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 vP(Math.min(n.pollIntervalMs??100,o),n.signal)}}function IP(e){if(e.trim().length===0)throw new g("CLI_USAGE","Prompt cannot be empty.",{});let t=Buffer.byteLength(e);if(t>oc)throw new g("CLI_USAGE",`Prompt exceeds the ${oc}-byte limit.`,{details:{maxPromptBytes:oc,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 vP(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 rm=(e,t)=>new g("PARTIAL_RESULT",`Command ${e.id} was persisted as ${e.state}, but its event could not be appended.`,{retryable:!0,details:{commandId:e.id,durableState:e.state},cause:t}),de={create:yP,show:wP,list:kP,cancel:TP,wait:SP,beginDelivery:bP,completeDelivery:RP,fail:PP};import{randomUUID as im,timingSafeEqual as CP}from"node:crypto";import{mkdir as AP,readFile as EP,readdir as OP}from"node:fs/promises";import om from"node:path";var $P=10080*60*1e3,NP={maxChildren:8,maxDepth:4,maxConcurrentChildren:4,maxPromptBytes:32*1024},DP=["task.create-child","task.children","task.cancel-tree"],_P=new Set(["fury.plan","fury.run","fury.cancel","fury.resume","fury.step.complete","fury.step.fail","fury.review.resubmit"]);async function rt(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 AP(pc(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_${im()}`,c=await Di(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 xP(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 xP(e,t,n,r,s){let i=new Date,o={schemaVersion:1,id:t,token:`${t}.${im()}`,taskId:n,agentTabId:r,allowedCommandFamilies:[...DP],targetPolicy:"children-only",limits:{...NP},issuedBy:s,createdAt:i.toISOString(),expiresAt:new Date(i.getTime()+$P).toISOString(),revokedAt:null,revokedBy:null};return await U(fc(e,o.id),o,{mode:384}),o}async function Xe(e,t,n,r){let s=await LP(e,t);return s.revokedAt&&Cn(s.id,"revoked"),Date.parse(s.expiresAt)<=Date.now()&&Cn(s.id,"expired"),!_P.has(n)&&!s.allowedCommandFamilies.includes(n)&&Cn(s.id,"command family is not allowed"),s.targetPolicy==="children-only"&&!await FP(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 FP(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 am(e,t,n){let r=await Di(e,t);r&&(r.revokedAt||await U(fc(e,t),{...r,revokedAt:new Date().toISOString(),revokedBy:n},{mode:384}))}async function dc(e,t,n){let r=await OP(pc(e)).catch(i=>lm(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 Di(e,o[1]);!a||!t.has(a.taskId)||(await am(e,a.id,n),s.push(a.id))}return s}async function LP(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 Di(e,r);if(!s)throw new g("CAPABILITY_NOT_FOUND",`Craig capability "${r}" was not found.`,{details:{capabilityId:r}});let i=Buffer.from(s.token),o=Buffer.from(t);return(i.length!==o.length||!CP(i,o))&&Cn(r,"token is invalid"),s}async function Di(e,t){/^capability_[A-Za-z0-9-]+$/.test(t)||Cn(t,"identifier is invalid");try{let n=JSON.parse(await EP(fc(e,t),"utf8"));if(!MP(n,t))throw new g("CAPABILITY_RECORD_INVALID",`Craig capability record for ${t} is invalid.`,{details:{capabilityId:t}});return n}catch(n){if(lm(n))return null;throw n}}function MP(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"&&jP(r))&&e.targetPolicy==="children-only"&&uc(n)&&[n.maxChildren,n.maxDepth,n.maxConcurrentChildren,n.maxPromptBytes].every(r=>Number.isInteger(r)&&Number(r)>0)&&cc(e.createdAt)&&cc(e.expiresAt)&&sm(e.issuedBy)&&(e.revokedAt===null&&e.revokedBy===null||cc(e.revokedAt)&&sm(e.revokedBy))}function sm(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 pc=e=>om.join(e.orchestrationDir,"capabilities"),fc=(e,t)=>om.join(pc(e),`${t}.json`),jP=e=>/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/.test(e),uc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),cc=e=>typeof e=="string"&&Number.isFinite(Date.parse(e)),lm=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT";import{mkdir as cm,readFile as qP,rm as mc,stat as UP,writeFile as BP}from"node:fs/promises";import hc from"node:path";var WP=20,VP=3e4,KP=5e3;async function gc(e,t){let n=hc.join(e.runtimeDir,"delegation.lock");await cm(e.runtimeDir,{recursive:!0});let r=Date.now();for(;;)try{await cm(n);try{await BP(hc.join(n,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(s){throw await mc(n,{recursive:!0,force:!0}),s}break}catch(s){if(!YP(s))throw s;if(await GP(n))continue;if(Date.now()-r>=VP)throw new g("OPERATION_TIMEOUT","Timed out waiting for the delegation lock.",{retryable:!0});await new Promise(i=>setTimeout(i,WP))}try{return await t()}finally{await mc(n,{recursive:!0,force:!0})}}async function GP(e){let t=await qP(hc.join(e,"owner.json"),"utf8").then(r=>JSON.parse(r)).catch(()=>null);if(t&&typeof t.pid=="number"&&HP(t.pid))return!1;let n=await UP(e).catch(()=>null);return!t&&n&&Date.now()-n.mtimeMs<KP?!1:(await mc(e,{recursive:!0,force:!0}),!0)}function HP(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 YP=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var zP={maxChildren:32,maxDepth:8,maxConcurrentChildren:16,maxPromptBytes:32*1024};async function yc(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 rt(e,i,{type:"human",source:"cli",processId:process.pid})})}):S.createTask(e,t,n,r)}async function wc(e,t,n={}){return gc(e,async()=>{let r=await S.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??zP,a=JP(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&&_i("prompt bytes",o.maxPromptBytes),r.delegationDepth+1>o.maxDepth&&_i("delegation depth",o.maxDepth);let c=new Set([r.repoId,...r.linkedRepoIds,...(r.repoTargets??[]).map(y=>y.repoId)]);if(a.type==="repo"&&!c.has(a.id))throw new g("CAPABILITY_DENIED",`Repo ${a.id} is outside parent task ${r.id}.`,{details:{parentTaskId:r.id,repoId:a.id}});let u=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(y=>y.parentTaskId===r.id),p=t.idempotencyKey?.trim()||null;if(p){if(p.length>256)throw new g("CLI_USAGE","Idempotency key exceeds 256 characters.",{});let y=u.find(T=>T.delegationIdempotencyKey===p);if(y){if(!XP(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 um(y,!0)}}u.length>=o.maxChildren&&_i("children",o.maxChildren),u.filter(y=>y.status!=="closed"&&y.status!=="merged").length>=o.maxConcurrentChildren&&_i("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 rt(e,y,i)})}),m=await S.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 um(m,!1)})}async function kc(e,t,n){n&&await Xe(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 Tc(e,t,n){return gc(e,async()=>{let s=(n?await Xe(e,n,"task.cancel-tree",t):null)?.actor??{type:"human",source:"cli",processId:process.pid};await S.getTask(e,t);let i=(await S.listTasks(e,{includeClosed:!0})).tasks,o=new Map(i.map(f=>[f.id,f])),a=new Map;for(let f of i)f.parentTaskId&&a.set(f.parentTaskId,[...a.get(f.parentTaskId)??[],f]);let l=[],c=new Set,d=f=>{if(c.has(f))throw new g("TASK_RECORD_INVALID",`Task lineage contains a cycle at ${f}.`,{details:{taskId:f,rootTaskId:t}});let m=o.get(f);if(m){c.add(f),l.push(m);for(let y of(a.get(f)??[]).sort((T,R)=>T.id.localeCompare(R.id)))d(y.id)}};d(t);let u=[],p=[],h=[];try{await dc(e,new Set(l.map(f=>f.id)),s)}catch{h.push(...l.map(f=>f.id))}for(let f of l){let m=f.status;if(m==="closed"){u.push({taskId:f.id,previousStatus:m,status:"closed",disposition:"already-closed"});continue}await S.cleanupTask(e,f,{preserveWorktree:!0});let y=await S.closeTask(e,f.id);u.push({taskId:f.id,previousStatus:m,status:y.status,disposition:"cancelled"});try{await 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 um(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 JP(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 XP(e,t){return t.type==="workspace"?e.type==="project"&&e.workspaceId===t.id:e.type==="repo"&&e.repoId===t.id}function _i(e,t){throw new g("DELEGATION_LIMIT_EXCEEDED",`Delegation ${e} limit of ${t} was exceeded.`,{details:{limit:e,maximum:t}})}var xi=Symbol.for("yaml.alias"),Fi=Symbol.for("yaml.document"),st=Symbol.for("yaml.map"),bc=Symbol.for("yaml.pair"),je=Symbol.for("yaml.scalar"),_t=Symbol.for("yaml.seq"),Ae=Symbol.for("yaml.node.type"),qe=e=>!!e&&typeof e=="object"&&e[Ae]===xi,Rt=e=>!!e&&typeof e=="object"&&e[Ae]===Fi,it=e=>!!e&&typeof e=="object"&&e[Ae]===st,j=e=>!!e&&typeof e=="object"&&e[Ae]===bc,x=e=>!!e&&typeof e=="object"&&e[Ae]===je,ot=e=>!!e&&typeof e=="object"&&e[Ae]===_t;function W(e){if(e&&typeof e=="object")switch(e[Ae]){case st:case _t:return!0}return!1}function q(e){if(e&&typeof e=="object")switch(e[Ae]){case xi:case st:case je:case _t:return!0}return!1}var Li=e=>(x(e)||W(e))&&!!e.anchor;var _e=Symbol("break visit"),dm=Symbol("skip children"),Pt=Symbol("remove node");function Qe(e,t){let n=pm(t);Rt(e)?ar(null,e.contents,n,Object.freeze([e]))===Pt&&(e.contents=null):ar(null,e,n,Object.freeze([]))}Qe.BREAK=_e;Qe.SKIP=dm;Qe.REMOVE=Pt;function ar(e,t,n,r){let s=fm(e,t,n,r);if(q(s)||j(s))return mm(e,r,s),ar(e,s,n,r);if(typeof s!="symbol"){if(W(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=ar(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===_e)return _e;o===Pt&&(t.items.splice(i,1),i-=1)}}}else if(j(t)){r=Object.freeze(r.concat(t));let i=ar("key",t.key,n,r);if(i===_e)return _e;i===Pt&&(t.key=null);let o=ar("value",t.value,n,r);if(o===_e)return _e;o===Pt&&(t.value=null)}}return s}async function Mi(e,t){let n=pm(t);Rt(e)?await lr(null,e.contents,n,Object.freeze([e]))===Pt&&(e.contents=null):await lr(null,e,n,Object.freeze([]))}Mi.BREAK=_e;Mi.SKIP=dm;Mi.REMOVE=Pt;async function lr(e,t,n,r){let s=await fm(e,t,n,r);if(q(s)||j(s))return mm(e,r,s),lr(e,s,n,r);if(typeof s!="symbol"){if(W(t)){r=Object.freeze(r.concat(t));for(let i=0;i<t.items.length;++i){let o=await lr(i,t.items[i],n,r);if(typeof o=="number")i=o-1;else{if(o===_e)return _e;o===Pt&&(t.items.splice(i,1),i-=1)}}}else if(j(t)){r=Object.freeze(r.concat(t));let i=await lr("key",t.key,n,r);if(i===_e)return _e;i===Pt&&(t.key=null);let o=await lr("value",t.value,n,r);if(o===_e)return _e;o===Pt&&(t.value=null)}}return s}function pm(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 fm(e,t,n,r){if(typeof n=="function")return n(e,t,r);if(it(t))return n.Map?.(e,t,r);if(ot(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 mm(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(Rt(r))r.contents=n;else{let s=qe(r)?"alias":"scalar";throw new Error(`Cannot replace node with ${s} parent`)}}var QP={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},ZP=e=>e.replace(/[!,[\]{}]/g,t=>QP[t]),St=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+ZP(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
+ `)}};St.defaultYaml={explicit:!1,version:"1.2"};St.defaultTags={"!!":"tag:yaml.org,2002:"};function ji(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 Rc(e){let t=new Set;return Qe(e,{Value(n,r){r.anchor&&t.add(r.anchor)}}),t}function Pc(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function hm(e,t){let n=[],r=new Map,s=null;return{onAnchor:i=>{n.push(i),s??(s=Rc(e));let o=Pc(t,s);return s.add(o),o},setAnchors:()=>{for(let i of n){let o=r.get(i);if(typeof o=="object"&&o.anchor&&(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 nn(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=nn(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=nn(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=nn(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=nn(e,r,s,i);o===void 0?delete r[s]:o!==i&&(r[s]=o)}return e.call(t,n,r)}function pe(e,t,n){if(Array.isArray(e))return e.map((r,s)=>pe(r,String(s),n));if(e&&typeof e.toJSON=="function"){if(!n||!Li(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 rn=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(!Rt(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=pe(this,"",o);if(typeof s=="function")for(let{count:l,res:c}of o.anchors.values())s(c,l);return typeof i=="function"?nn(i,{"":a},"",a):a}};var xt=class extends rn{constructor(t){super(xi),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)||Li(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||(pe(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=qi(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(ji(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 qi(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=qi(e,s,n);i>r&&(r=i)}return r}else if(j(t)){let r=qi(e,t.key,n),s=qi(e,t.value,n);return Math.max(r,s)}return 1}var Ui=e=>!e||typeof e!="function"&&typeof e!="object",O=class extends rn{constructor(t){super(je),this.value=t}toJSON(t,n){return n?.keep?this.value:pe(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 eS="tag:yaml.org,2002:";function tS(e,t,n){if(t){let r=n.filter(i=>i.tag===t),s=r.find(i=>!i.format)??r[0];if(!s)throw new Error(`Tag ${t} not found`);return s}return n.find(r=>r.identify?.(e)&&!r.format)}function Ft(e,t,n){if(Rt(e)&&(e=e.contents),q(e))return e;if(j(e)){let u=n.schema[st].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 xt(l.anchor);l={anchor:null,node:null},a.set(e,l)}t?.startsWith("!!")&&(t=eS+t.slice(2));let c=tS(e,t,o.tags);if(!c){if(e&&typeof e.toJSON=="function"&&(e=e.toJSON()),!e||typeof e!="object"){let u=new O(e);return l&&(l.node=u),u}c=e instanceof Map?o[st]:Symbol.iterator in Object(e)?o[_t]:o[st]}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 cs(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 Ft(r,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:e,sourceObjects:new Map})}var ur=e=>e==null||typeof e=="object"&&!!e[Symbol.iterator]().next().done,cr=class extends rn{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,cs(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,cs(this.schema,s,n));else throw new Error(`Expected YAML collection at ${r}. Remaining path: ${s}`)}}};var gm=e=>e.replace(/^(?!$)(?: $)?/gm,"#");function Ze(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var It=(e,t,n)=>e.endsWith(`
80
80
  `)?Ze(n,t):n.includes(`
81
81
  `)?`
82
- `+Ze(n,t):(e.endsWith(" ")?"":" ")+n;var Rc="flow",Ui="block",ls="quoted";function cs(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,k=-1;n===Ui&&(m=mm(e,m,t.length),m!==-1&&(d=m+l));for(let b;b=e[m+=1];){if(n===ls&&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}k=m}if(b===`
83
- `)n===Ui&&(m=mm(e,m,t.length)),d=m+t.length+l,p=void 0;else{if(b===" "&&h&&h!==" "&&h!==`
82
+ `+Ze(n,t):(e.endsWith(" ")?"":" ")+n;var Sc="flow",Bi="block",us="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===Bi&&(m=ym(e,m,t.length),m!==-1&&(u=m+l));for(let b;b=e[m+=1];){if(n===us&&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===Bi&&(m=ym(e,m,t.length)),u=m+t.length+l,p=void 0;else{if(b===" "&&h&&h!==" "&&h!==`
84
84
  `&&h!==" "){let $=e[m+1];$&&$!==" "&&$!==`
85
- `&&$!==" "&&(p=m)}if(m>=d)if(p)c.push(p),d=p+l,p=void 0;else if(n===ls){for(;h===" "||h===" ";)h=b,b=e[m+=1],f=!0;let $=m>k+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===ls&&u[$]&&(R+=`${e[$]}\\`),R+=`
87
- ${t}${e.slice($+1,N)}`)}return R}function mm(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 Wi=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),Vi=e=>/^(%|---|\.\.\.)/m.test(e);function XP(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 ds(e,t){let n=JSON.stringify(e);if(t.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=t,s=t.options.doubleQuotedMinMultiLineLength,i=t.indent||(Vi(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)+`
85
+ `&&$!==" "&&(p=m)}if(m>=u)if(p)c.push(p),u=p+l,p=void 0;else if(n===us){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===us&&d[$]&&(R+=`${e[$]}\\`),R+=`
87
+ ${t}${e.slice($+1,N)}`)}return R}function ym(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 Vi=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),Ki=e=>/^(%|---|\.\.\.)/m.test(e);function nS(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 ps(e,t){let n=JSON.stringify(e);if(t.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=t,s=t.options.doubleQuotedMinMultiLineLength,i=t.indent||(Ki(e)?" ":""),o="",a=0;for(let l=0,c=n[l];c;c=n[++l])if(c===" "&&n[l+1]==="\\"&&n[l+2]==="n"&&(o+=n.slice(a,l)+"\\ ",l+=1,a=l,c="\\"),c==="\\")switch(n[l+1]){case"u":{o+=n.slice(a,l);let d=n.substr(l+2,4);switch(d){case"0000":o+="\\0";break;case"0007":o+="\\a";break;case"000b":o+="\\v";break;case"001b":o+="\\e";break;case"0085":o+="\\N";break;case"00a0":o+="\\_";break;case"2028":o+="\\L";break;case"2029":o+="\\P";break;default:d.substr(0,2)==="00"?o+="\\x"+d.substr(2):o+=n.substr(l,6)}l+=5,a=l+1}break;case"n":if(r||n[l+2]==='"'||n.length<s)l+=1;else{for(o+=n.slice(a,l)+`
90
90
 
91
91
  `;n[l+2]==="\\"&&n[l+3]==="n"&&n[l+4]!=='"';)o+=`
92
- `,l+=2;o+=i,n[l+2]===" "&&(o+="\\"),l+=1,a=l+1}break;default:l+=1}return o=a?o+n.slice(a):n,r?o:cs(o,i,ls,Wi(t,!1))}function Pc(e,t){if(t.options.singleQuote===!1||t.implicitKey&&e.includes(`
93
- `)||/[ \t]\n|\n[ \t]/.test(e))return ds(e,t);let n=t.indent||(Vi(e)?" ":""),r="'"+e.replace(/'/g,"''").replace(/\n+/g,`$&
94
- ${n}`)+"'";return t.implicitKey?r:cs(r,n,Rc,Wi(t,!1))}function pr(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=ds;else{let s=e.includes('"'),i=e.includes("'");s&&!i?r=Pc:i&&!s?r=ds:r=n?Pc:ds}return r(e,t)}var Sc;try{Sc=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:ds(o,i,us,Vi(t,!1))}function Ic(e,t){if(t.options.singleQuote===!1||t.implicitKey&&e.includes(`
93
+ `)||/[ \t]\n|\n[ \t]/.test(e))return ps(e,t);let n=t.indent||(Ki(e)?" ":""),r="'"+e.replace(/'/g,"''").replace(/\n+/g,`$&
94
+ ${n}`)+"'";return t.implicitKey?r:ds(r,n,Sc,Vi(t,!1))}function dr(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=ps;else{let s=e.includes('"'),i=e.includes("'");s&&!i?r=Ic:i&&!s?r=ps:r=n?Ic:ps}return r(e,t)}var vc;try{vc=new RegExp(`(^|(?<!
95
95
  ))
96
96
  +(?!
97
- |$)`,"g")}catch{Sc=/\n+(?!\n|$)/g}function Bi({comment:e,type:t,value:n},r,s,i){let{blockQuote:o,commentString:a,lineWidth:l}=r.options;if(!o||/\n[\t ]+$/.test(n))return pr(n,r);let c=r.indent||(r.forceBlockIndent||Vi(n)?" ":""),u=o==="literal"?!0:o==="folded"||t===O.BLOCK_FOLDED?!1:t===O.BLOCK_LITERAL?!0:!XP(n,l,c.length);if(!n)return u?`|
97
+ |$)`,"g")}catch{vc=/\n+(?!\n|$)/g}function Wi({comment:e,type:t,value:n},r,s,i){let{blockQuote:o,commentString:a,lineWidth:l}=r.options;if(!o||/\n[\t ]+$/.test(n))return dr(n,r);let c=r.indent||(r.forceBlockIndent||Ki(n)?" ":""),d=o==="literal"?!0:o==="folded"||t===O.BLOCK_FOLDED?!1:t===O.BLOCK_LITERAL?!0:!nS(n,l,c.length);if(!n)return d?`|
98
98
  `:`>
99
- `;let d,p;for(p=n.length;p>0;--p){let N=n[p-1];if(N!==`
99
+ `;let u,p;for(p=n.length;p>0;--p){let N=n[p-1];if(N!==`
100
100
  `&&N!==" "&&N!==" ")break}let h=n.substring(p),f=h.indexOf(`
101
- `);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(Sc,`$&${c}`));let m=!1,y,k=-1;for(y=0;y<n.length;++y){let N=n[y];if(N===" ")m=!0;else if(N===`
103
- `)k=y;else break}let R=n.substring(0,k<y?k+1:y);R&&(n=n.substring(R.length),R=R.replace(/\n+/g,`$&${c}`));let $=(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,_=Wi(r,!0);o!=="folded"&&t!==O.BLOCK_FOLDED&&(_.onOverflow=()=>{D=!0});let A=cs(`${R}${N}${h}`,c,Ui,_);if(!D)return`>${$}
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(vc,`$&${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,_=Vi(r,!0);o!=="folded"&&t!==O.BLOCK_FOLDED&&(_.onOverflow=()=>{D=!0});let A=ds(`${R}${N}${h}`,c,Bi,_);if(!D)return`>${$}
105
105
  ${c}${A}`}return n=n.replace(/\n+/g,`$&${c}`),`|${$}
106
- ${c}${R}${n}${h}`}function QP(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 pr(i,t);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(i))return a||u||!i.includes(`
108
- `)?pr(i,t):Bi(e,t,n,r);if(!a&&!u&&s!==O.PLAIN&&i.includes(`
109
- `))return Bi(e,t,n,r);if(Vi(i)){if(l==="")return t.forceBlockIndent=!0,Bi(e,t,n,r);if(a&&l===c)return pr(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 pr(i,t)}return a?d:cs(d,l,Rc,Wi(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?pr(o.value,t):Bi(o,t,n,r);case O.QUOTE_DOUBLE:return ds(o.value,t);case O.QUOTE_SINGLE:return Pc(o.value,t);case O.PLAIN:return QP(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 Ki(e,t){let n=Object.assign({blockQuote:!0,commentString:fm,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 ZP(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 eS(e,t,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(x(e)||W(e))&&e.anchor;i&&Mi(i)&&(n.add(i),s.push(`&${i}`));let o=e.tag??(t.default?null:t.tag);return o&&s.push(r.directives.tagString(o)),s.join(" ")}function Ft(e,t,n,r){if(j(e))return e.toString(t,n,r);if(Me(e)){if(t.doc.directives)return e.toString(t);if(t.resolvedAliases?.has(e))throw new TypeError("Cannot stringify circular structure without alias nodes");t.resolvedAliases?t.resolvedAliases.add(e):t.resolvedAliases=new Set([e]),e=e.resolve(t.doc)}let s,i=U(e)?e:t.doc.createNode(e,{onTagObj:l=>s=l});s??(s=ZP(t.doc.schema.tags,i));let o=eS(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 hm({key:e,value:t},n,r,s){let{allNullValues:i,doc:o,indent:a,indentStep:l,options:{commentString:c,indentSeq:u,simpleKeys:d}}=n,p=U(e)&&e.comment||null;if(d){if(p)throw new Error("With simple keys, key nodes cannot have comments");if(W(e)||!U(e)&&typeof e=="object"){let _="With simple keys, collection cannot be used as a key value";throw new Error(_)}}let h=!d&&(!e||p&&t==null&&!n.inFlow||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&&(d||!i),indent:a+l});let f=!1,m=!1,y=Ft(e,n,()=>f=!0,()=>m=!0);if(!h&&!n.inFlow&&y.length>1024){if(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+=Pt(y,n.indent,c(p)):m&&s&&s(),y;f&&(p=null),h?(p&&(y+=Pt(y,n.indent,c(p))),y=`? ${y}
112
- ${a}:`):(y=`${y}:`,p&&(y+=Pt(y,n.indent,c(p))));let k,R,b;U(t)?(k=!!t.spaceBefore,R=t.commentBefore,b=t.comment):(k=!1,R=null,b=null,t&&typeof t=="object"&&(t=o.createNode(t))),n.implicitKey=!1,!h&&!p&&x(t)&&(n.indentAtStart=y.length+1),m=!1,!u&&l.length>=2&&!n.inFlow&&!h&&ot(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let $=!1,N=Ft(t,n,()=>$=!0,()=>m=!0),D=" ";if(p||k||R){if(D=k?`
106
+ ${c}${R}${n}${h}`}function rS(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 dr(i,t);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(i))return a||d||!i.includes(`
108
+ `)?dr(i,t):Wi(e,t,n,r);if(!a&&!d&&s!==O.PLAIN&&i.includes(`
109
+ `))return Wi(e,t,n,r);if(Ki(i)){if(l==="")return t.forceBlockIndent=!0,Wi(e,t,n,r);if(a&&l===c)return dr(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 dr(i,t)}return a?u:ds(u,l,Sc,Vi(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?dr(o.value,t):Wi(o,t,n,r);case O.QUOTE_DOUBLE:return ps(o.value,t);case O.QUOTE_SINGLE:return Ic(o.value,t);case O.PLAIN:return rS(o,t,n,r);default:return null}},c=l(a);if(c===null){let{defaultKeyType: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 Gi(e,t){let n=Object.assign({blockQuote:!0,commentString:gm,defaultKeyType:null,defaultStringType:"PLAIN",directives:null,doubleQuotedAsJSON:!1,doubleQuotedMinMultiLineLength:40,falseStr:"false",flowCollectionPadding:!0,indentSeq:!0,lineWidth:80,minContentWidth:20,nullStr:"null",simpleKeys:!1,singleQuote:null,trailingComma:!1,trueStr:"true",verifyAliasOrder:!0},e.schema.toStringOptions,t),r;switch(n.collectionStyle){case"block":r=!1;break;case"flow":r=!0;break;default:r=null}return{anchors:new Set,doc:e,flowCollectionPadding:n.flowCollectionPadding?" ":"",indent:"",indentStep:typeof n.indent=="number"?" ".repeat(n.indent):" ",inFlow:r,options:n}}function sS(e,t){if(t.tag){let s=e.filter(i=>i.tag===t.tag);if(s.length>0)return s.find(i=>i.format===t.format)??s[0]}let n,r;if(x(t)){r=t.value;let s=e.filter(i=>i.identify?.(r));if(s.length>1){let i=s.filter(o=>o.test);i.length>0&&(s=i)}n=s.find(i=>i.format===t.format)??s.find(i=>!i.format)}else r=t,n=e.find(s=>s.nodeClass&&r instanceof s.nodeClass);if(!n){let s=r?.constructor?.name??(r===null?"null":typeof r);throw new Error(`Tag not resolved for ${s} value`)}return n}function iS(e,t,{anchors:n,doc:r}){if(!r.directives)return"";let s=[],i=(x(e)||W(e))&&e.anchor;i&&ji(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 Lt(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=sS(t.doc.schema.tags,i));let o=iS(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 wm({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=Lt(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+=It(y,n.indent,c(p)):m&&s&&s(),y;f&&(p=null),h?(p&&(y+=It(y,n.indent,c(p))),y=`? ${y}
112
+ ${a}:`):(y=`${y}:`,p&&(y+=It(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&&ot(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let $=!1,N=Lt(t,n,()=>$=!0,()=>m=!0),D=" ";if(p||T||R){if(D=T?`
113
113
  `:"",R){let _=c(R);D+=`
114
114
  ${Ze(_,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
- `),w=A!==-1,Se=n.inFlow??t.flow??t.items.length===0;if(w||!Se){let we=!1;if(w&&(_==="&"||_==="!")){let z=N.indexOf(" ");_==="&"&&z!==-1&&z<A&&N[z+1]==="!"&&(z=N.indexOf(" ",z+1)),(z===-1||A<z)&&(we=!0)}we||(D=`
119
+ `),w=A!==-1,Ie=n.inFlow??t.flow??t.items.length===0;if(w||!Ie){let ke=!1;if(w&&(_==="&"||_==="!")){let z=N.indexOf(" ");_==="&"&&z!==-1&&z<A&&N[z+1]==="!"&&(z=N.indexOf(" ",z+1)),(z===-1||A<z)&&(ke=!0)}ke||(D=`
120
120
  ${n.indent}`)}}else(N===""||N[0]===`
121
- `)&&(D="");return y+=D+N,n.inFlow?$&&r&&r():b&&!$?y+=Pt(y,n.indent,c(b)):m&&s&&s(),y}function Ic(e,t){(e==="debug"||e==="warn")&&console.warn(t)}var Gi="<<",at={identify:e=>e===Gi||typeof e=="symbol"&&e.description===Gi,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new O(Symbol(Gi)),{addToJSMap:Cc}),stringify:()=>Gi},gm=(e,t)=>(at.identify(t)||x(t)&&(!t.type||t.type===O.PLAIN)&&at.identify(t.value))&&e?.doc.schema.tags.some(n=>n.tag===at.tag&&n.default);function Cc(e,t,n){let r=ym(e,n);if(ot(r))for(let s of r.items)vc(e,t,s);else if(Array.isArray(r))for(let s of r)vc(e,t,s);else vc(e,t,r)}function vc(e,t,n){let r=ym(e,n);if(!it(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 ym(e,t){return e&&Me(t)?t.resolve(e.doc,e):t}function Hi(e,t,{key:n,value:r}){if(U(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(gm(e,n))Cc(e,t,r);else{let s=le(n,"",e);if(t instanceof Map)t.set(s,le(r,s,e));else if(t instanceof Set)t.add(s);else{let i=tS(n,s,e),o=le(r,i,e);i in t?Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0}):t[i]=o}}return t}function tS(e,t,n){if(t===null)return"";if(typeof t!="object")return String(t);if(U(e)&&n?.doc){let r=Ki(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)+'..."'),Ic(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=xt(e,void 0,n),s=xt(t,void 0,n);return new te(r,s)}var te=class e{constructor(t,n=null){Object.defineProperty(this,ve,{value:kc}),this.key=t,this.value=n}clone(t){let{key:n,value:r}=this;return U(n)&&(n=n.clone(t)),U(r)&&(r=r.clone(t)),new e(n,r)}toJSON(t,n){let r=n?.mapAsMap?new Map:{};return Hi(n,r,this)}toString(t,n,r){return t?.doc?hm(this,t,n,r):JSON.stringify(this)}};function zi(e,t,n){return(t.inFlow??e.flow?rS:nS)(e,t,n)}function nS({comment:e,items:t},n,{blockItemPrefix:r,flowChars:s,itemIndent:i,onChompKeep:o,onComment:a}){let{indent:l,options:{commentString:c}}=n,u=Object.assign({},n,{indent:i,type:null}),d=!1,p=[];for(let f=0;f<t.length;++f){let m=t[f],y=null;if(U(m))!d&&m.spaceBefore&&p.push(""),Yi(n,p,m.commentBefore,d),m.comment&&(y=m.comment);else if(j(m)){let R=U(m.key)?m.key:null;R&&(!d&&R.spaceBefore&&p.push(""),Yi(n,p,R.commentBefore,d))}d=!1;let k=Ft(m,u,()=>y=null,()=>d=!0);y&&(k+=Pt(k,i,c(y))),d&&y&&(d=!1),p.push(r+k)}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+=It(y,n.indent,c(b)):m&&s&&s(),y}function Cc(e,t){(e==="debug"||e==="warn")&&console.warn(t)}var Hi="<<",at={identify:e=>e===Hi||typeof e=="symbol"&&e.description===Hi,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new O(Symbol(Hi)),{addToJSMap:Ec}),stringify:()=>Hi},km=(e,t)=>(at.identify(t)||x(t)&&(!t.type||t.type===O.PLAIN)&&at.identify(t.value))&&e?.doc.schema.tags.some(n=>n.tag===at.tag&&n.default);function Ec(e,t,n){let r=Tm(e,n);if(ot(r))for(let s of r.items)Ac(e,t,s);else if(Array.isArray(r))for(let s of r)Ac(e,t,s);else Ac(e,t,r)}function Ac(e,t,n){let r=Tm(e,n);if(!it(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 Tm(e,t){return e&&qe(t)?t.resolve(e.doc,e):t}function Yi(e,t,{key:n,value:r}){if(q(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(km(e,n))Ec(e,t,r);else{let s=pe(n,"",e);if(t instanceof Map)t.set(s,pe(r,s,e));else if(t instanceof Set)t.add(s);else{let i=oS(n,s,e),o=pe(r,i,e);i in t?Object.defineProperty(t,i,{value:o,writable:!0,enumerable:!0,configurable:!0}):t[i]=o}}return t}function oS(e,t,n){if(t===null)return"";if(typeof t!="object")return String(t);if(q(e)&&n?.doc){let r=Gi(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)+'..."'),Cc(n.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${i}. Set mapAsMap: true to use object keys.`),n.mapKeyWarned=!0}return s}return JSON.stringify(t)}function pr(e,t,n){let r=Ft(e,void 0,n),s=Ft(t,void 0,n);return new re(r,s)}var re=class e{constructor(t,n=null){Object.defineProperty(this,Ae,{value:bc}),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 Yi(n,r,this)}toString(t,n,r){return t?.doc?wm(this,t,n,r):JSON.stringify(this)}};function Ji(e,t,n){return(t.inFlow??e.flow?lS:aS)(e,t,n)}function aS({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(""),zi(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(""),zi(n,p,R.commentBefore,u))}u=!1;let T=Lt(m,d,()=>y=null,()=>u=!0);y&&(T+=It(T,i,c(y))),u&&y&&(u=!1),p.push(r+T)}let h;if(p.length===0)h=s.start+s.end;else{h=p[0];for(let f=1;f<p.length;++f){let m=p[f];h+=m?`
122
122
  ${l}${m}`:`
123
123
  `}}return e?(h+=`
124
- `+Ze(c(e),l),a&&a()):d&&o&&o(),h}function rS({items:e},t,{flowChars:n,itemIndent:r}){let{indent:s,indentStep:i,flowCollectionPadding:o,options:{commentString:a}}=t;r+=i;let l=Object.assign({},t,{indent:r,inFlow:!0,type:null}),c=!1,u=0,d=[];for(let f=0;f<e.length;++f){let m=e[f],y=null;if(U(m))m.spaceBefore&&d.push(""),Yi(t,d,m.commentBefore,!1),m.comment&&(y=m.comment);else if(j(m)){let R=U(m.key)?m.key:null;R&&(R.spaceBefore&&d.push(""),Yi(t,d,R.commentBefore,!1),R.comment&&(c=!0));let b=U(m.value)?m.value:null;b?(b.comment&&(y=b.comment),b.commentBefore&&(c=!0)):m.value==null&&R?.comment&&(y=R.comment)}y&&(c=!0);let k=Ft(m,l,()=>y=null);c||(c=d.length>u||k.includes(`
125
- `)),f<e.length-1?k+=",":t.options.trailingComma&&(t.options.lineWidth>0&&(c||(c=d.reduce((R,b)=>R+b.length+2,2)+(k.length+2)>t.options.lineWidth)),c&&(k+=",")),y&&(k+=Pt(k,r,a(y))),d.push(k),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?`
124
+ `+Ze(c(e),l),a&&a()):u&&o&&o(),h}function lS({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(""),zi(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(""),zi(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=Lt(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+=It(T,r,a(y))),u.push(T),d=u.length}let{start:p,end:h}=n;if(u.length===0)return p+h;if(!c){let f=u.reduce((m,y)=>m+y.length+2,2);c=t.options.lineWidth>0&&f>t.options.lineWidth}if(c){let f=p;for(let m of u)f+=m?`
126
126
  ${i}${s}${m}`:`
127
127
  `;return`${f}
128
- ${s}${h}`}else return`${p}${o}${d.join(" ")}${o}${h}`}function Yi({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 nn(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 re=class extends dr{static get tagName(){return"tag:yaml.org,2002:map"}constructor(t){super(st,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 te(t,t?.value):r=new te(t.key,t.value);let s=nn(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);x(s.value)&&qi(r.value)?s.value.value=r.value:s.value=r.value}else if(i){let o=this.items.findIndex(a=>i(r,a)<0);o===-1?this.items.push(r):this.items.splice(o,0,r)}else this.items.push(r)}delete(t){let n=nn(this.items,t);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(t,n){let s=nn(this.items,t)?.value;return(!n&&x(s)?s.value:s)??void 0}has(t){return!!nn(this.items,t)}set(t,n){this.add(new te(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)Hi(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})),zi(this,t,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:t.indent||"",onChompKeep:r,onComment:n})}};var lt={collection:"map",default:!0,nodeClass:re,tag:"tag:yaml.org,2002:map",resolve(e,t){return it(e)||t("Expected a mapping for this tag"),e},createNode:(e,t,n)=>re.from(e,t,n)};var be=class extends dr{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(t){super(Dt,t),this.items=[]}add(t){this.items.push(t)}delete(t){let n=Ji(t);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(t,n){let r=Ji(t);if(typeof r!="number")return;let s=this.items[r];return!n&&x(s)?s.value:s}has(t){let n=Ji(t);return typeof n=="number"&&n<this.items.length}set(t,n){let r=Ji(t);if(typeof r!="number")throw new Error(`Expected a valid index, not ${t}.`);let s=this.items[r];x(s)&&qi(n)?s.value=n:this.items[r]=n}toJSON(t,n){let r=[];n?.onCreate&&n.onCreate(r);let s=0;for(let i of this.items)r.push(le(i,String(s++),n));return r}toString(t,n,r){return t?zi(this,t,{blockItemPrefix:"- ",flowChars:{start:"[",end:"]"},itemIndent:(t.indent||"")+" ",onChompKeep:r,onComment:n}):JSON.stringify(this)}static from(t,n,r){let{replacer:s}=r,i=new this(t);if(n&&Symbol.iterator in Object(n)){let o=0;for(let a of n){if(typeof s=="function"){let l=n instanceof Set?a:String(o++);a=s.call(n,l,a)}i.items.push(xt(a,void 0,r))}}return i}};function Ji(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 ct={collection:"seq",default:!0,nodeClass:be,tag:"tag:yaml.org,2002:seq",resolve(e,t){return ot(e)||t("Expected a sequence for this tag"),e},createNode:(e,t,n)=>be.from(e,t,n)};var rn={identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify(e,t,n,r){return t=Object.assign({actualString:!0},t),An(e,t,n,r)}};var En={identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new O(null),stringify:({source:e},t)=>typeof e=="string"&&En.test.test(e)?e:t.options.nullStr};var us={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&&us.test.test(e)){let r=e[0]==="t"||e[0]==="T";if(t===r)return e}return t?n.options.trueStr:n.options.falseStr}};function Re({format:e,minFractionDigits:t,tag:n,value:r}){if(typeof r=="bigint")return String(r);let s=typeof r=="number"?r:Number(r);if(!isFinite(s))return isNaN(s)?".nan":s<0?"-.inf":".inf";let i=Object.is(r,-0)?"-0":JSON.stringify(r);if(!e&&t&&(!n||n==="tag:yaml.org,2002:float")&&/^-?\d/.test(i)&&!i.includes("e")){let o=i.indexOf(".");o<0&&(o=i.length,i+=".");let a=t-(i.length-o-1);for(;a-- >0;)i+="0"}return i}var Xi={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:e=>e.slice(-3).toLowerCase()==="nan"?NaN:e[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:Re},Qi={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:e=>parseFloat(e),stringify(e){let t=Number(e.value);return isFinite(t)?t.toExponential():Re(e)}},Zi={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(e){let t=new O(parseFloat(e)),n=e.indexOf(".");return n!==-1&&e[e.length-1]==="0"&&(t.minFractionDigits=e.length-n-1),t},stringify:Re};var eo=e=>typeof e=="bigint"||Number.isInteger(e),Ac=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function wm(e,t,n){let{value:r}=e;return eo(r)&&r>=0?n+r.toString(t):Re(e)}var to={identify:e=>eo(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(e,t,n)=>Ac(e,2,8,n),stringify:e=>wm(e,8,"0o")},no={identify:eo,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>Ac(e,0,10,n),stringify:Re},ro={identify:e=>eo(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>Ac(e,2,16,n),stringify:e=>wm(e,16,"0x")};var km=[lt,ct,rn,En,us,to,no,ro,Xi,Qi,Zi];function Tm(e){return typeof e=="bigint"||Number.isInteger(e)}var so=({value:e})=>JSON.stringify(e),sS=[{identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify:so},{identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:so},{identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:e=>e==="true",stringify:so},{identify:Tm,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})=>Tm(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:so}],iS={default:!0,tag:"",test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}},bm=[lt,ct].concat(sS,iS);var ps={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 Ec(e,t){if(ot(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!j(r)){if(it(r)){r.items.length>1&&t("Each pair must have its own sequence indicator");let s=r.items[0]||new te(new O(null));if(r.commentBefore&&(s.key.commentBefore=s.key.commentBefore?`${r.commentBefore}
128
+ ${s}${h}`}else return`${p}${o}${u.join(" ")}${o}${h}`}function zi({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 sn(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 oe=class extends cr{static get tagName(){return"tag:yaml.org,2002:map"}constructor(t){super(st,t),this.items=[]}static from(t,n,r){let{keepUndefined:s,replacer:i}=r,o=new this(t),a=(l,c)=>{if(typeof i=="function")c=i.call(n,l,c);else if(Array.isArray(i)&&!i.includes(l))return;(c!==void 0||s)&&o.items.push(pr(l,c,r))};if(n instanceof Map)for(let[l,c]of n)a(l,c);else if(n&&typeof n=="object")for(let l of Object.keys(n))a(l,n[l]);return typeof t.sortMapEntries=="function"&&o.items.sort(t.sortMapEntries),o}add(t,n){let r;j(t)?r=t:!t||typeof t!="object"||!("key"in t)?r=new re(t,t?.value):r=new re(t.key,t.value);let s=sn(this.items,r.key),i=this.schema?.sortMapEntries;if(s){if(!n)throw new Error(`Key ${r.key} already set`);x(s.value)&&Ui(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=sn(this.items,t);return n?this.items.splice(this.items.indexOf(n),1).length>0:!1}get(t,n){let s=sn(this.items,t)?.value;return(!n&&x(s)?s.value:s)??void 0}has(t){return!!sn(this.items,t)}set(t,n){this.add(new re(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)Yi(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})),Ji(this,t,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:t.indent||"",onChompKeep:r,onComment:n})}};var lt={collection:"map",default:!0,nodeClass:oe,tag:"tag:yaml.org,2002:map",resolve(e,t){return it(e)||t("Expected a mapping for this tag"),e},createNode:(e,t,n)=>oe.from(e,t,n)};var Re=class extends cr{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(t){super(_t,t),this.items=[]}add(t){this.items.push(t)}delete(t){let n=Xi(t);return typeof n!="number"?!1:this.items.splice(n,1).length>0}get(t,n){let r=Xi(t);if(typeof r!="number")return;let s=this.items[r];return!n&&x(s)?s.value:s}has(t){let n=Xi(t);return typeof n=="number"&&n<this.items.length}set(t,n){let r=Xi(t);if(typeof r!="number")throw new Error(`Expected a valid index, not ${t}.`);let s=this.items[r];x(s)&&Ui(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(pe(i,String(s++),n));return r}toString(t,n,r){return t?Ji(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(Ft(a,void 0,r))}}return i}};function Xi(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 ct={collection:"seq",default:!0,nodeClass:Re,tag:"tag:yaml.org,2002:seq",resolve(e,t){return ot(e)||t("Expected a sequence for this tag"),e},createNode:(e,t,n)=>Re.from(e,t,n)};var on={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 fs={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&&fs.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 Qi={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},Zi={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)}},eo={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 to=e=>typeof e=="bigint"||Number.isInteger(e),Oc=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function bm(e,t,n){let{value:r}=e;return to(r)&&r>=0?n+r.toString(t):Pe(e)}var no={identify:e=>to(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(e,t,n)=>Oc(e,2,8,n),stringify:e=>bm(e,8,"0o")},ro={identify:to,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>Oc(e,0,10,n),stringify:Pe},so={identify:e=>to(e)&&e>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>Oc(e,2,16,n),stringify:e=>bm(e,16,"0x")};var Rm=[lt,ct,on,En,fs,no,ro,so,Qi,Zi,eo];function Pm(e){return typeof e=="bigint"||Number.isInteger(e)}var io=({value:e})=>JSON.stringify(e),cS=[{identify:e=>typeof e=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:e=>e,stringify:io},{identify:e=>e==null,createNode:()=>new O(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:io},{identify:e=>typeof e=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:e=>e==="true",stringify:io},{identify:Pm,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})=>Pm(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:io}],uS={default:!0,tag:"",test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}},Sm=[lt,ct].concat(cS,uS);var ms={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 $c(e,t){if(ot(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!j(r)){if(it(r)){r.items.length>1&&t("Each pair must have its own sequence indicator");let s=r.items[0]||new re(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 te(r)}}else t("Expected a sequence for this tag");return e}function Oc(e,t,n){let{replacer:r}=n,s=new be(e);s.tag="tag:yaml.org,2002:pairs";let i=0;if(t&&Symbol.iterator in Object(t))for(let o of t){typeof r=="function"&&(o=r.call(t,String(i++),o));let a,l;if(Array.isArray(o))if(o.length===2)a=o[0],l=o[1];else throw new TypeError(`Expected [key, value] tuple: ${o}`);else if(o&&o instanceof Object){let c=Object.keys(o);if(c.length===1)a=c[0],l=o[a];else throw new TypeError(`Expected tuple with one key, not ${c.length} keys`)}else a=o;s.items.push(fr(a,l,n))}return s}var fs={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:Ec,createNode:Oc};var mr=class e extends be{constructor(){super(),this.add=re.prototype.add.bind(this),this.delete=re.prototype.delete.bind(this),this.get=re.prototype.get.bind(this),this.has=re.prototype.has.bind(this),this.set=re.prototype.set.bind(this),this.tag=e.tag}toJSON(t,n){if(!n)return super.toJSON(t);let r=new Map;n?.onCreate&&n.onCreate(r);for(let s of this.items){let i,o;if(j(s)?(i=le(s.key,"",n),o=le(s.value,i,n)):i=le(s,"",n),r.has(i))throw new Error("Ordered maps must not include duplicate keys");r.set(i,o)}return r}static from(t,n,r){let s=Oc(t,n,r),i=new this;return i.items=s.items,i}};mr.tag="tag:yaml.org,2002:omap";var ms={collection:"seq",identify:e=>e instanceof Map,nodeClass:mr,default:!1,tag:"tag:yaml.org,2002:omap",resolve(e,t){let n=Ec(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 Rm({value:e,source:t},n){return t&&(e?$c:Nc).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:Rm},Nc={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:Rm};var Pm={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:e=>e.slice(-3).toLowerCase()==="nan"?NaN:e[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:Re},Sm={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:e=>parseFloat(e.replace(/_/g,"")),stringify(e){let t=Number(e.value);return isFinite(t)?t.toExponential():Re(e)}},Im={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(e){let t=new O(parseFloat(e.replace(/_/g,""))),n=e.indexOf(".");if(n!==-1){let r=e.substring(n+1).replace(/_/g,"");r[r.length-1]==="0"&&(t.minFractionDigits=r.length)}return t},stringify:Re};var hs=e=>typeof e=="bigint"||Number.isInteger(e);function io(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 Dc(e,t,n){let{value:r}=e;if(hs(r)){let s=r.toString(t);return r<0?"-"+n+s.substr(1):n+s}return Re(e)}var vm={identify:hs,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>io(e,2,2,n),stringify:e=>Dc(e,2,"0b")},Cm={identify:hs,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>io(e,1,8,n),stringify:e=>Dc(e,8,"0")},Am={identify:hs,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>io(e,0,10,n),stringify:Re},Em={identify:hs,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>io(e,2,16,n),stringify:e=>Dc(e,16,"0x")};var hr=class e extends re{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 te(t.key,null):n=new te(t,null),nn(this.items,n.key)||this.items.push(n)}get(t,n){let r=nn(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=nn(this.items,t);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new te(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 gs={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(it(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 _c(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 Om(e){let{value:t}=e,n=o=>o;if(typeof t=="bigint")n=o=>BigInt(o);else if(isNaN(t)||!isFinite(t))return Re(e);let r="";t<0&&(r="-",t*=n(-1));let s=n(60),i=[t%s];return t<60?i.unshift(0):(t=(t-i[0])/s,i.unshift(t%s),t>=60&&(t=(t-i[0])/s,i.unshift(t))),r+i.map(o=>String(o).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}var oo={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})=>_c(e,n),stringify:Om},ao={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=>_c(e,!1),stringify:Om},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),u=t[8];if(u&&u!=="Z"){let d=_c(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 xc=[lt,ct,rn,En,$c,Nc,vm,Cm,Am,Em,Pm,Sm,Im,ps,at,ms,fs,gs,oo,ao,gr];var $m=new Map([["core",km],["failsafe",[lt,ct,rn]],["json",bm],["yaml11",xc],["yaml-1.1",xc]]),Nm={binary:ps,bool:us,float:Zi,floatExp:Qi,floatNaN:Xi,floatTime:ao,int:no,intHex:ro,intOct:to,intTime:oo,map:lt,merge:at,null:En,omap:ms,pairs:fs,seq:ct,set:gs,timestamp:gr},Dm={"tag:yaml.org,2002:binary":ps,"tag:yaml.org,2002:merge":at,"tag:yaml.org,2002:omap":ms,"tag:yaml.org,2002:pairs":fs,"tag:yaml.org,2002:set":gs,"tag:yaml.org,2002:timestamp":gr};function lo(e,t,n){let r=$m.get(t);if(r&&!e)return n&&!r.includes(at)?r.concat(at):r.slice();let s=r;if(!s)if(Array.isArray(e))s=[];else{let i=Array.from($m.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(at)),s.reduce((i,o)=>{let a=typeof o=="string"?Nm[o]:o;if(!a){let l=JSON.stringify(o),c=Object.keys(Nm).map(u=>JSON.stringify(u)).join(", ");throw new Error(`Unknown custom tag ${l}; use one of ${c}`)}return i.includes(a)||i.push(a),i},[])}var oS=(e,t)=>e.key<t.key?-1:e.key>t.key?1:0,ys=class e{constructor({compat:t,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(t)?lo(t,"compat"):t?lo(null,t):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?Dm:{},this.tags=lo(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,st,{value:lt}),Object.defineProperty(this,Le,{value:rn}),Object.defineProperty(this,Dt,{value:ct}),this.sortMapEntries=typeof o=="function"?o:o===!0?oS:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function _m(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=Ki(e,t),{commentString:i}=s.options;if(e.commentBefore){n.length!==1&&n.unshift("");let l=i(e.commentBefore);n.unshift(Ze(l,""))}let o=!1,a=null;if(e.contents){if(U(e.contents)){if(e.contents.spaceBefore&&r&&n.push(""),e.contents.commentBefore){let u=i(e.contents.commentBefore);n.push(Ze(u,""))}s.forceBlockIndent=!!e.comment,a=e.contents.comment}let l=a?void 0:()=>o=!0,c=Ft(e.contents,s,()=>a=null,l);a&&(c+=Pt(c,"",i(a))),(c[0]==="|"||c[0]===">")&&n[n.length-1]==="---"?n[n.length-1]=`--- ${c}`:n.push(c)}else n.push(Ft(e.contents,s));if(e.directives?.docEnd)if(e.comment){let l=i(e.comment);l.includes(`
131
+ ${i.comment}`:r.comment}r=s}e.items[n]=j(r)?r:new re(r)}}else t("Expected a sequence for this tag");return e}function Nc(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(pr(a,l,n))}return s}var hs={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:$c,createNode:Nc};var fr=class e extends Re{constructor(){super(),this.add=oe.prototype.add.bind(this),this.delete=oe.prototype.delete.bind(this),this.get=oe.prototype.get.bind(this),this.has=oe.prototype.has.bind(this),this.set=oe.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=pe(s.key,"",n),o=pe(s.value,i,n)):i=pe(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=Nc(t,n,r),i=new this;return i.items=s.items,i}};fr.tag="tag:yaml.org,2002:omap";var gs={collection:"seq",identify:e=>e instanceof Map,nodeClass:fr,default:!1,tag:"tag:yaml.org,2002:omap",resolve(e,t){let n=$c(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 fr,n)},createNode:(e,t,n)=>fr.from(e,t,n)};function Im({value:e,source:t},n){return t&&(e?Dc:_c).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}var Dc={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:Im},_c={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:Im};var vm={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},Cm={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:e=>parseFloat(e.replace(/_/g,"")),stringify(e){let t=Number(e.value);return isFinite(t)?t.toExponential():Pe(e)}},Am={identify:e=>typeof e=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(e){let t=new O(parseFloat(e.replace(/_/g,""))),n=e.indexOf(".");if(n!==-1){let r=e.substring(n+1).replace(/_/g,"");r[r.length-1]==="0"&&(t.minFractionDigits=r.length)}return t},stringify:Pe};var ys=e=>typeof e=="bigint"||Number.isInteger(e);function oo(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 xc(e,t,n){let{value:r}=e;if(ys(r)){let s=r.toString(t);return r<0?"-"+n+s.substr(1):n+s}return Pe(e)}var Em={identify:ys,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>oo(e,2,2,n),stringify:e=>xc(e,2,"0b")},Om={identify:ys,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>oo(e,1,8,n),stringify:e=>xc(e,8,"0")},$m={identify:ys,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>oo(e,0,10,n),stringify:Pe},Nm={identify:ys,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>oo(e,2,16,n),stringify:e=>xc(e,16,"0x")};var mr=class e extends oe{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 re(t.key,null):n=new re(t,null),sn(this.items,n.key)||this.items.push(n)}get(t,n){let r=sn(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=sn(this.items,t);r&&!n?this.items.splice(this.items.indexOf(r),1):!r&&n&&this.items.push(new re(t))}toJSON(t,n){return super.toJSON(t,n,Set)}toString(t,n,r){if(!t)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},t,{allNullValues:!0}),n,r);throw new Error("Set items must all have null values")}static from(t,n,r){let{replacer:s}=r,i=new this(t);if(n&&Symbol.iterator in Object(n))for(let o of n)typeof s=="function"&&(o=s.call(n,o,o)),i.items.push(pr(o,null,r));return i}};mr.tag="tag:yaml.org,2002:set";var ws={collection:"map",identify:e=>e instanceof Set,nodeClass:mr,default:!1,tag:"tag:yaml.org,2002:set",createNode:(e,t,n)=>mr.from(e,t,n),resolve(e,t){if(it(e)){if(e.hasAllNullValues(!0))return Object.assign(new mr,e);t("Set items must all have null values")}else t("Expected a mapping for this tag");return e}};function Fc(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 Dm(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 ao={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})=>Fc(e,n),stringify:Dm},lo={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=>Fc(e,!1),stringify:Dm},hr={identify:e=>e instanceof Date,default:!0,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(e){let t=e.match(hr.test);if(!t)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,n,r,s,i,o,a]=t.map(Number),l=t[7]?Number((t[7]+"00").substr(1,3)):0,c=Date.UTC(n,r-1,s,i||0,o||0,a||0,l),d=t[8];if(d&&d!=="Z"){let u=Fc(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 Lc=[lt,ct,on,En,Dc,_c,Em,Om,$m,Nm,vm,Cm,Am,ms,at,gs,hs,ws,ao,lo,hr];var _m=new Map([["core",Rm],["failsafe",[lt,ct,on]],["json",Sm],["yaml11",Lc],["yaml-1.1",Lc]]),xm={binary:ms,bool:fs,float:eo,floatExp:Zi,floatNaN:Qi,floatTime:lo,int:ro,intHex:so,intOct:no,intTime:ao,map:lt,merge:at,null:En,omap:gs,pairs:hs,seq:ct,set:ws,timestamp:hr},Fm={"tag:yaml.org,2002:binary":ms,"tag:yaml.org,2002:merge":at,"tag:yaml.org,2002:omap":gs,"tag:yaml.org,2002:pairs":hs,"tag:yaml.org,2002:set":ws,"tag:yaml.org,2002:timestamp":hr};function co(e,t,n){let r=_m.get(t);if(r&&!e)return n&&!r.includes(at)?r.concat(at):r.slice();let s=r;if(!s)if(Array.isArray(e))s=[];else{let i=Array.from(_m.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(at)),s.reduce((i,o)=>{let a=typeof o=="string"?xm[o]:o;if(!a){let l=JSON.stringify(o),c=Object.keys(xm).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 dS=(e,t)=>e.key<t.key?-1:e.key>t.key?1:0,ks=class e{constructor({compat:t,customTags:n,merge:r,resolveKnownTags:s,schema:i,sortMapEntries:o,toStringDefaults:a}){this.compat=Array.isArray(t)?co(t,"compat"):t?co(null,t):null,this.name=typeof i=="string"&&i||"core",this.knownTags=s?Fm:{},this.tags=co(n,this.name,r),this.toStringOptions=a??null,Object.defineProperty(this,st,{value:lt}),Object.defineProperty(this,je,{value:on}),Object.defineProperty(this,_t,{value:ct}),this.sortMapEntries=typeof o=="function"?o:o===!0?dS:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function Lm(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=Gi(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=Lt(e.contents,s,()=>a=null,l);a&&(c+=It(c,"",i(a))),(c[0]==="|"||c[0]===">")&&n[n.length-1]==="---"?n[n.length-1]=`--- ${c}`:n.push(c)}else n.push(Lt(e.contents,s));if(e.directives?.docEnd)if(e.comment){let l=i(e.comment);l.includes(`
132
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(`
133
133
  `)+`
134
- `}var sn=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,ve,{value:xi});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 Rt({version:o}),this.setSchema(o,r),this.contents=t===void 0?null:this.createNode(t,s,r)}clone(){let t=Object.create(e.prototype,{[ve]:{value:xi}});return t.commentBefore=this.commentBefore,t.comment=this.comment,t.errors=this.errors.slice(),t.warnings=this.warnings.slice(),t.options=Object.assign({},this.options),this.directives&&(t.directives=this.directives.clone()),t.schema=this.schema.clone(),t.contents=U(this.contents)?this.contents.clone(t.schema):this.contents,this.range&&(t.range=this.range.slice()),t}add(t){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=Tc(this);t.anchor=!n||r.has(n)?bc(n||"a",r):n}return new _t(t.anchor)}createNode(t,n,r){let s;if(typeof n=="function")t=n.call({"":t},"",t),s=n;else if(Array.isArray(n)){let y=R=>typeof R=="number"||R instanceof String||R instanceof Number,k=n.filter(y).map(String);k.length>0&&(n=n.concat(k)),s=n}else r===void 0&&n&&(r=n,n=void 0);let{aliasDuplicateObjects:i,anchorPrefix:o,flow:a,keepUndefined:l,onTagObj:c,tag:u}=r??{},{onAnchor:d,setAnchors:p,sourceObjects:h}=pm(this,o||"a"),f={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:d,onTagObj:c,replacer:s,schema:this.schema,sourceObjects:h},m=xt(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 te(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=as(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=as(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 Rt({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 Rt({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 ys(Object.assign(r,n));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:t,jsonArg:n,mapAsMap:r,maxAliasCount:s,onAnchor:i,reviver:o}={}){let a={anchors:new Map,doc:this,keep:!t,mapAsMap:r===!0,mapKeyWarned:!1,maxAliasCount:typeof s=="number"?s:100},l=le(this.contents,n??"",a);if(typeof i=="function")for(let{count:c,res:u}of a.anchors.values())i(u,c);return typeof o=="function"?en(o,{"":l},"",l):l}toJSON(t,n){return this.toJS({json:!0,jsonArg:t,mapAsMap:!1,onAnchor:n})}toString(t={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in t&&(!Number.isInteger(t.indent)||Number(t.indent)<=0)){let n=JSON.stringify(t.indent);throw new Error(`"indent" option must be a positive integer, not ${n}`)}return _m(this,t)}};function yr(e){if(W(e))return!0;throw new Error("Expected a YAML collection as document contents")}var ws=class extends Error{constructor(t,n,r,s){super(),this.name=t,this.code=r,this.message=s,this.pos=n}},dt=class extends ws{constructor(t,n,r){super("YAMLParseError",t,n,r)}},ks=class extends ws{constructor(t,n,r){super("YAMLWarning",t,n,r)}},Fc=(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 an=class e{constructor(t,n,r){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,Ae,{value:Fi});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 St({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:Fi}});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){gr(this.contents)&&this.contents.add(t)}addIn(t,n){gr(this.contents)&&this.contents.addIn(t,n)}createAlias(t,n){if(!t.anchor){let r=Rc(this);t.anchor=!n||r.has(n)?Pc(n||"a",r):n}return new xt(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}=hm(this,o||"a"),f={aliasDuplicateObjects:i??!0,keepUndefined:l??!1,onAnchor:u,onTagObj:c,replacer:s,schema:this.schema,sourceObjects:h},m=Ft(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 re(s,i)}delete(t){return gr(this.contents)?this.contents.delete(t):!1}deleteIn(t){return ur(t)?this.contents==null?!1:(this.contents=null,!0):gr(this.contents)?this.contents.deleteIn(t):!1}get(t,n){return W(this.contents)?this.contents.get(t,n):void 0}getIn(t,n){return ur(t)?!n&&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=cs(this.schema,[t],n):gr(this.contents)&&this.contents.set(t,n)}setIn(t,n){ur(t)?this.contents=n:this.contents==null?this.contents=cs(this.schema,Array.from(t),n):gr(this.contents)&&this.contents.setIn(t,n)}setSchema(t,n={}){typeof t=="number"&&(t=String(t));let r;switch(t){case"1.1":this.directives?this.directives.yaml.version="1.1":this.directives=new St({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 St({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 ks(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=pe(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"?nn(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 Lm(this,t)}};function gr(e){if(W(e))return!0;throw new Error("Expected a YAML collection as document contents")}var Ts=class extends Error{constructor(t,n,r,s){super(),this.name=t,this.code=r,this.message=s,this.pos=n}},ut=class extends Ts{constructor(t,n,r){super("YAMLParseError",t,n,r)}},bs=class extends Ts{constructor(t,n,r){super("YAMLWarning",t,n,r)}},Mc=(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 St(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,k=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 w=A.source.substring(1)||" ";d?d+=p+w:d=w,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||k)&&(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":{k&&i(A,"MULTIPLE_TAGS","A node can have at most one tag"),k=A,N??(N=A.offset),c=!1,u=!1,f=!0;break}case n:(y||k)&&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:k,newlineAfterProp:R,end:_,start:N??_}}function on(e){if(!e)return null;switch(e.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(e.source.includes(`
140
- `))return!0;if(e.end){for(let t of e.end)if(t.type==="newline")return!0}return!1;case"flow-collection":for(let t of e.items){for(let n of t.start)if(n.type==="newline")return!0;if(t.sep){for(let n of t.sep)if(n.type==="newline")return!0}if(on(t.key)||on(t.value))return!0}return!1;default:return!0}}function Ts(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&on(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function co(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 xm="All mapping items must start at the same column";function Fm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??re,a=new o(n.schema);n.atRoot&&(n.atRoot=!1);let l=r.offset,c=null;for(let u of r.items){let{start:d,key:p,sep:h,value:f}=u,m=St(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",xm)),!m.anchor&&!m.tag&&!h){c=m.end,m.comment&&(a.comment?a.comment+=`
141
- `+m.comment:a.comment=m.comment);continue}(m.newlineAfterProp||on(p))&&s(p??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",xm);n.atKey=!0;let k=m.end,R=p?e(n,p,m,s):t(n,k,d,null,m,s);n.schema.compat&&Ts(r.indent,p,s),n.atKey=!1,co(n,a.items,R)&&s(k,"DUPLICATE_KEY","Map keys must be unique");let b=St(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&&Ts(r.indent,f,s),l=$.range[2];let N=new te(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 te(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 Lm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??be,a=new o(n.schema);n.atRoot&&(n.atRoot=!1),n.atKey&&(n.atKey=!1);let l=r.offset,c=null;for(let{start:u,value:d}of r.items){let p=St(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&&Ts(r.indent,d,s),l=h.range[2],a.items.push(h)}return a.range=[r.offset,l,c??l],a}function It(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 Lc="Block collections are not allowed within flow collections",Mc=e=>e&&(e.type==="block-map"||e.type==="block-seq");function Mm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",l=i?.nodeClass??(o?re:be),c=new l(n.schema);c.flow=!0;let 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 k=r.items[y],{start:R,key:b,sep:$,value:N}=k,D=St(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&&on(b)&&s(b,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line")}if(y===0)D.comma&&s(D.comma,"UNEXPECTED_TOKEN",`Unexpected , in ${a}`);else if(D.comma||s(D.start,"MISSING_CHAR",`Missing , between ${a} items`),D.comment){let _="";e:for(let A of R)switch(A.type){case"comma":case"space":break;case"comment":_=A.source.substring(1);break e;default:break e}if(_){let A=c.items[c.items.length-1];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],Mc(N)&&s(_.range,"BLOCK_IN_FLOW",Lc)}else{n.atKey=!0;let _=D.end,A=b?e(n,b,D,s):t(n,_,R,null,D,s);Mc(b)&&s(A.range,"BLOCK_IN_FLOW",Lc),n.atKey=!1;let w=St($??[],{flow:a,indicator:"map-value-ind",next:N,offset:A.range[2],onError:s,parentIndent:r.indent,startOnNewline:!1});if(w.found){if(!o&&!D.found&&n.options.strict){if($)for(let z of $){if(z===w.found)break;if(z.type==="newline"){s(z,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}D.start<w.found.offset-1024&&s(w.found,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit flow sequence key")}}else N&&("source"in N&&N.source?.[0]===":"?s(N,"MISSING_CHAR",`Missing space after : in ${a}`):s(w.start,"MISSING_CHAR",`Missing , or : between ${a} items`));let Se=N?e(n,N,w,s):w.found?t(n,w.end,$,null,w,s):null;Se?Mc(N)&&s(Se.range,"BLOCK_IN_FLOW",Lc):w.comment&&(A.comment?A.comment+=`
145
- `+w.comment:A.comment=w.comment);let we=new te(A,Se);if(n.options.keepSourceTokens&&(we.srcToken=k),o){let z=c;co(n,z.items,A)&&s(_,"DUPLICATE_KEY","Map keys must be unique"),z.items.push(we)}else{let z=new re(n.schema);z.flow=!0,z.items.push(we);let gn=(Se??A).range;z.range=[A.range[0],gn[1],gn[2]],c.items.push(z)}d=Se?Se.range[2]:w.end}}let p=o?"}":"]",[h,...f]=r.end,m=d;if(h?.source===p)m=h.offset+h.source.length;else{let y=a[0].toUpperCase()+a.substring(1),k=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",k),h&&h.source.length!==1&&f.unshift(h)}if(f.length>0){let y=It(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 jc(e,t,n,r,s,i){let o=n.type==="block-map"?Fm(e,t,n,r,i):n.type==="block-seq"?Lm(e,t,n,r,i):Mm(e,t,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function jm(e,t,n,r,s){let i=r.tag,o=i?t.directives.tagName(i.source,p=>s(i,"TAG_RESOLVE_FAILED",p)):null;if(n.type==="block-seq"){let{anchor:p,newlineAfterProp:h}=r,f=p&&i?p.offset>i.offset?p:i:p??i;f&&(!h||h.offset<f.offset)&&s(f,"MISSING_CHAR","Missing newline after block sequence props")}let a=n.type==="block-map"?"map":n.type==="block-seq"?"seq":n.start.source==="{"?"map":"seq";if(!i||!o||o==="!"||o===re.tagName&&a==="map"||o===be.tagName&&a==="seq")return jc(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),jc(e,t,n,s,o)}let c=jc(e,t,n,s,o,l),u=l.resolve?.(c,p=>s(i,"TAG_RESOLVE_FAILED",p),t.options)??c,d=U(u)?u:new O(u);return d.range=c.range,d.tag=o,l?.format&&(d.format=l.format),d}function qc(e,t,n){let r=t.offset,s=aS(t,e.options.strict,n);if(!s)return{value:"",type:null,comment:"",range:[r,r,r]};let i=s.mode===">"?O.BLOCK_FOLDED:O.BLOCK_LITERAL,o=t.source?lS(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,k]=o[m];if(k===""||k==="\r")s.indent===0&&y.length>l&&(l=y.length);else{y.length<l&&n(c+y.length,"MISSING_CHAR","Block scalars with more-indented leading empty lines must use an explicit indentation indicator"),s.indent===0&&(l=y.length),u=m,l===0&&!e.atRoot&&n(c,"BAD_INDENT","Block scalar values in collections must be indented");break}c+=y.length+k.length+1}for(let 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,k]=o[m];c+=y.length+k.length+1;let R=k[k.length-1]==="\r";if(R&&(k=k.slice(0,-1)),k&&y.length<l){let $=`Block scalar lines must not be less indented than their ${s.indent?"explicit indentation indicator":"first line"}`;n(c-k.length-(R?2:1),"BAD_INDENT",$),y=""}i===O.BLOCK_LITERAL?(d+=p+y.slice(l)+k,p=`
149
- `):y.length>l||k[0]===" "?(p===" "?p=`
139
+ `}};function vt(e,{flow:t,indicator:n,next:r,offset:s,onError:i,parentIndent:o,startOnNewline:a}){let l=!1,c=a,d=a,u="",p="",h=!1,f=!1,m=null,y=null,T=null,R=null,b=null,$=null,N=null;for(let A of e)switch(f&&(A.type!=="space"&&A.type!=="newline"&&A.type!=="comma"&&i(A.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),f=!1),m&&(c&&A.type!=="comment"&&A.type!=="newline"&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),m=null),A.type){case"space":!t&&(n!=="doc-start"||r?.type!=="flow-collection")&&A.source.includes(" ")&&(m=A),d=!0;break;case"comment":{d||i(A,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let w=A.source.substring(1)||" ";u?u+=p+w:u=w,p="",c=!1;break}case"newline":c?u?u+=A.source:(!$||n!=="seq-item-ind")&&(l=!0):p+=A.source,c=!0,h=!0,(y||T)&&(R=A),d=!0;break;case"anchor":y&&i(A,"MULTIPLE_ANCHORS","A node can have at most one anchor"),A.source.endsWith(":")&&i(A.offset+A.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),y=A,N??(N=A.offset),c=!1,d=!1,f=!0;break;case"tag":{T&&i(A,"MULTIPLE_TAGS","A node can have at most one tag"),T=A,N??(N=A.offset),c=!1,d=!1,f=!0;break}case n:(y||T)&&i(A,"BAD_PROP_ORDER",`Anchors and tags must be after the ${A.source} indicator`),$&&i(A,"UNEXPECTED_TOKEN",`Unexpected ${A.source} in ${t??"collection"}`),$=A,c=n==="seq-item-ind"||n==="explicit-key-ind",d=!1;break;case"comma":if(t){b&&i(A,"UNEXPECTED_TOKEN",`Unexpected , in ${t}`),b=A,c=!1,d=!1;break}default:i(A,"UNEXPECTED_TOKEN",`Unexpected ${A.type} token`),c=!1,d=!1}let D=e[e.length-1],_=D?D.offset+D.source.length:s;return f&&r&&r.type!=="space"&&r.type!=="newline"&&r.type!=="comma"&&(r.type!=="scalar"||r.source!=="")&&i(r.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),m&&(c&&m.indent<=o||r?.type==="block-map"||r?.type==="block-seq")&&i(m,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:b,found:$,spaceBefore:l,comment:u,hasNewline:h,anchor:y,tag:T,newlineAfterProp:R,end:_,start:N??_}}function ln(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(ln(t.key)||ln(t.value))return!0}return!1;default:return!0}}function Rs(e,t,n){if(t?.type==="flow-collection"){let r=t.end[0];r.indent===e&&(r.source==="]"||r.source==="}")&&ln(t)&&n(r,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function uo(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 Mm="All mapping items must start at the same column";function jm({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=i?.nodeClass??oe,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=vt(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",Mm)),!m.anchor&&!m.tag&&!h){c=m.end,m.comment&&(a.comment?a.comment+=`
141
+ `+m.comment:a.comment=m.comment);continue}(m.newlineAfterProp||ln(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",Mm);n.atKey=!0;let T=m.end,R=p?e(n,p,m,s):t(n,T,u,null,m,s);n.schema.compat&&Rs(r.indent,p,s),n.atKey=!1,uo(n,a.items,R)&&s(T,"DUPLICATE_KEY","Map keys must be unique");let b=vt(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&&Rs(r.indent,f,s),l=$.range[2];let N=new re(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 re(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 qm({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=vt(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&&Rs(r.indent,u,s),l=h.range[2],a.items.push(h)}return a.range=[r.offset,l,c??l],a}function Ct(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 jc="Block collections are not allowed within flow collections",qc=e=>e&&(e.type==="block-map"||e.type==="block-seq");function Um({composeNode:e,composeEmptyNode:t},n,r,s,i){let o=r.start.source==="{",a=o?"flow map":"flow sequence",l=i?.nodeClass??(o?oe: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=vt(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&&ln(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],qc(N)&&s(_.range,"BLOCK_IN_FLOW",jc)}else{n.atKey=!0;let _=D.end,A=b?e(n,b,D,s):t(n,_,R,null,D,s);qc(b)&&s(A.range,"BLOCK_IN_FLOW",jc),n.atKey=!1;let w=vt($??[],{flow:a,indicator:"map-value-ind",next:N,offset:A.range[2],onError:s,parentIndent:r.indent,startOnNewline:!1});if(w.found){if(!o&&!D.found&&n.options.strict){if($)for(let z of $){if(z===w.found)break;if(z.type==="newline"){s(z,"MULTILINE_IMPLICIT_KEY","Implicit keys of flow sequence pairs need to be on a single line");break}}D.start<w.found.offset-1024&&s(w.found,"KEY_OVER_1024_CHARS","The : indicator must be at most 1024 chars after the start of an implicit flow sequence key")}}else N&&("source"in N&&N.source?.[0]===":"?s(N,"MISSING_CHAR",`Missing space after : in ${a}`):s(w.start,"MISSING_CHAR",`Missing , or : between ${a} items`));let Ie=N?e(n,N,w,s):w.found?t(n,w.end,$,null,w,s):null;Ie?qc(N)&&s(Ie.range,"BLOCK_IN_FLOW",jc):w.comment&&(A.comment?A.comment+=`
145
+ `+w.comment:A.comment=w.comment);let ke=new re(A,Ie);if(n.options.keepSourceTokens&&(ke.srcToken=T),o){let z=c;uo(n,z.items,A)&&s(_,"DUPLICATE_KEY","Map keys must be unique"),z.items.push(ke)}else{let z=new oe(n.schema);z.flow=!0,z.items.push(ke);let yn=(Ie??A).range;z.range=[A.range[0],yn[1],yn[2]],c.items.push(z)}u=Ie?Ie.range[2]:w.end}}let p=o?"}":"]",[h,...f]=r.end,m=u;if(h?.source===p)m=h.offset+h.source.length;else{let y=a[0].toUpperCase()+a.substring(1),T=d?`${y} must end with a ${p}`:`${y} in block collection must be sufficiently indented and end with a ${p}`;s(u,d?"MISSING_CHAR":"BAD_INDENT",T),h&&h.source.length!==1&&f.unshift(h)}if(f.length>0){let y=Ct(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 Uc(e,t,n,r,s,i){let o=n.type==="block-map"?jm(e,t,n,r,i):n.type==="block-seq"?qm(e,t,n,r,i):Um(e,t,n,r,i),a=o.constructor;return s==="!"||s===a.tagName?(o.tag=a.tagName,o):(s&&(o.tag=s),o)}function Bm(e,t,n,r,s){let i=r.tag,o=i?t.directives.tagName(i.source,p=>s(i,"TAG_RESOLVE_FAILED",p)):null;if(n.type==="block-seq"){let{anchor:p,newlineAfterProp:h}=r,f=p&&i?p.offset>i.offset?p:i:p??i;f&&(!h||h.offset<f.offset)&&s(f,"MISSING_CHAR","Missing newline after block sequence props")}let a=n.type==="block-map"?"map":n.type==="block-seq"?"seq":n.start.source==="{"?"map":"seq";if(!i||!o||o==="!"||o===oe.tagName&&a==="map"||o===Re.tagName&&a==="seq")return Uc(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),Uc(e,t,n,s,o)}let c=Uc(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 Bc(e,t,n){let r=t.offset,s=pS(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?fS(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=`
149
+ `):y.length>l||T[0]===" "?(p===" "?p=`
150
150
  `:!h&&p===`
151
151
  `&&(p=`
152
152
 
153
- `),d+=p+y.slice(l)+k,p=`
154
- `,h=!0):k===""?p===`
155
- `?d+=`
153
+ `),u+=p+y.slice(l)+T,p=`
154
+ `,h=!0):T===""?p===`
155
+ `?u+=`
156
156
  `:p=`
157
- `:(d+=p+k,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 aS({offset:e,props:t},n,r){if(t[0].type!=="block-scalar-header")return r(t[0],"IMPOSSIBLE","Block scalar header not found"),null;let{source:s}=t[0],i=s[0],o=0,a="",l=-1;for(let p=1;p<s.length;++p){let h=s[p];if(!a&&(h==="-"||h==="+"))a=h;else{let f=Number(h);!o&&f?o=f:l===-1&&(l=e+p)}}l!==-1&&r(l,"UNEXPECTED_TOKEN",`Block scalar header includes extra characters: ${s}`);let c=!1,u="",d=s.length;for(let p=1;p<t.length;++p){let h=t[p];switch(h.type){case"space":c=!0;case"newline":d+=h.source.length;break;case"comment":n&&!c&&r(h,"MISSING_CHAR","Comments must be separated from other tokens by white space characters"),d+=h.source.length,u=h.source.substring(1);break;case"error":r(h,"UNEXPECTED_TOKEN",h.message),d+=h.source.length;break;default:{let f=`Unexpected token in block scalar header: ${h.type}`;r(h,"UNEXPECTED_TOKEN",f);let m=h.source;m&&typeof m=="string"&&(d+=m.length)}}}return{mode:i,indent:o,chomp:a,comment:u,length:d}}function lS(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 Uc(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=dS(i,c);break;case"double-quoted-scalar":a=O.QUOTE_DOUBLE,l=uS(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=It(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}`),qm(e)}function dS(e,t){return(e[e.length-1]!=="'"||e.length===1)&&t(e.length,"MISSING_CHAR","Missing closing 'quote"),qm(e.slice(1,-1)).replace(/''/g,"'")}function qm(e){let t,n;try{t=new RegExp(`(.*?)(?<![ ])[ ]*\r?
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 pS({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 fS(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 Wc(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=mS(i,c);break;case"single-quoted-scalar":a=O.QUOTE_SINGLE,l=hS(i,c);break;case"double-quoted-scalar":a=O.QUOTE_DOUBLE,l=gS(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=Ct(o,d,t,n);return{value:l,type:a,comment:u.comment,range:[r,d,u.offset]}}function mS(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}`),Wm(e)}function hS(e,t){return(e[e.length-1]!=="'"||e.length===1)&&t(e.length,"MISSING_CHAR","Missing closing 'quote"),Wm(e.slice(1,-1)).replace(/''/g,"'")}function Wm(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 uS(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 gS(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}=pS(e,r);n+=i,r=o}else if(s==="\\"){let i=e[++r],o=fS[i];if(o)n+=o;else if(i===`
167
+ `){let{fold:i,offset:o}=yS(e,r);n+=i,r=o}else if(s==="\\"){let i=e[++r],o=wS[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+=mS(e,r+1,a,t),r+=a}else{let a=e.substr(r-1,2);t(r-1,"BAD_DQ_ESCAPE",`Invalid escape sequence ${a}`),n+=a}}else if(s===" "||s===" "){let i=r,o=e[r+1];for(;o===" "||o===" ";)o=e[++r+1];o!==`
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+=kS(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 pS(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 yS(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 fS={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 mS(e,t,n,r){let s=e.substr(t,n),o=s.length===n&&/^[0-9a-fA-F]+$/.test(s)?parseInt(s,16):NaN;try{return String.fromCodePoint(o)}catch{let a=e.substr(t-2,n+2);return r(t-2,"BAD_DQ_ESCAPE",`Invalid escape sequence ${a}`),a}}function Bc(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?qc(e,t,r):Uc(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[Le]:l?c=hS(e.schema,s,l,n,r):t.type==="scalar"?c=gS(e,s,t,r):c=e.schema[Le];let u;try{let d=c.resolve(s,p=>r(n??t,"TAG_RESOLVE_FAILED",p),e.options);u=x(d)?d:new O(d)}catch(d){let p=d instanceof Error?d.message:String(d);r(n??t,"TAG_RESOLVE_FAILED",p),u=new O(s)}return u.range=a,u.source=s,i&&(u.type=i),l&&(u.tag=l),c.format&&(u.format=c.format),o&&(u.comment=o),u}function hS(e,t,n,r,s){if(n==="!")return e[Le];let i=[];for(let a of e.tags)if(!a.collection&&a.tag===n)if(a.default&&a.test)i.push(a);else return a;for(let a of i)if(a.test?.test(t))return a;let o=e.knownTags[n];return o&&!o.collection?(e.tags.push(Object.assign({},o,{default:!1,test:void 0})),o):(s(r,"TAG_RESOLVE_FAILED",`Unresolved tag: ${n}`,n!=="tag:yaml.org,2002:str"),e[Le])}function gS({atKey:e,directives:t,schema:n},r,s,i){let o=n.tags.find(a=>(a.default===!0||e&&a.default==="key")&&a.test?.test(r))||n[Le];if(n.compat){let a=n.compat.find(l=>l.default&&l.test?.test(r))??n[Le];if(o.tag!==a.tag){let l=t.tagString(o.tag),c=t.tagString(a.tag),u=`Value may be parsed as either ${l} or ${c}`;i(s,"TAG_RESOLVE_FAILED",u,!0)}}return o}function Um(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 yS={composeNode:Wc,composeEmptyNode:uo};function Wc(e,t,n,r){let s=e.atKey,{spaceBefore:i,comment:o,anchor:a,tag:l}=n,c,u=!0;switch(t.type){case"alias":c=wS(e,t,r),(a||l)&&r(t,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":c=Bc(e,t,l,r),a&&(c.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{c=jm(yS,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=uo(e,t.offset,void 0,null,n,r)),a&&c.anchor===""&&r(a,"BAD_ALIAS","Anchor cannot be an empty string"),s&&e.options.stringKeys&&(!x(c)||typeof c.value!="string"||c.tag&&c.tag!=="tag:yaml.org,2002:str")&&r(l??t,"NON_STRING_KEY","With stringKeys, all keys must be strings"),i&&(c.spaceBefore=!0),o&&(t.type==="scalar"&&t.source===""?c.comment=o:c.commentBefore=o),e.options.keepSourceTokens&&u&&(c.srcToken=t),c}function uo(e,t,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:l},c){let u={type:"scalar",offset:Um(t,n,r),indent:-1,source:""},d=Bc(e,u,a,c);return o&&(d.anchor=o.source.substring(1),d.anchor===""&&c(o,"BAD_ALIAS","Anchor cannot be an empty string")),s&&(d.spaceBefore=!0),i&&(d.comment=i,d.range[2]=l),d}function wS({options:e},{offset:t,source:n,end:r},s){let i=new _t(n.substring(1));i.source===""&&s(t,"BAD_ALIAS","Alias cannot be an empty string"),i.source.endsWith(":")&&s(t+n.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let o=t+n.length,a=It(r,o,e.strict,s);return i.range=[t,o,a.offset],a.comment&&(i.comment=a.comment),i}function Bm(e,t,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:t},e),l=new sn(void 0,a),c={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},u=St(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?Wc(c,s,u,o):uo(c,u.end,r,null,u,o);let d=l.contents.range[2],p=It(i,d,!1,o);return p.comment&&(l.comment=p.comment),l.range=[n,d,p.offset],l}function bs(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 Wm(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 wS={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 kS(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 Vc(e,t,n,r){let{value:s,type:i,comment:o,range:a}=t.type==="block-scalar"?Bc(e,t,r):Wc(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=TS(e.schema,s,l,n,r):t.type==="scalar"?c=bS(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 TS(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 bS({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 Vm(e,t,n){if(t){n??(n=t.length);for(let r=n-1;r>=0;--r){let s=t[r];switch(s.type){case"space":case"comment":case"newline":e-=s.source.length;continue}for(s=t[++r];s?.type==="space";)e+=s.source.length,s=t[++r];break}}return e}var RS={composeNode:Kc,composeEmptyNode:po};function Kc(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=PS(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=Vc(e,t,l,r),a&&(c.anchor=a.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":try{c=Bm(RS,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=po(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 po(e,t,n,r,{spaceBefore:s,comment:i,anchor:o,tag:a,end:l},c){let d={type:"scalar",offset:Vm(t,n,r),indent:-1,source:""},u=Vc(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 PS({options:e},{offset:t,source:n,end:r},s){let i=new xt(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=Ct(r,o,e.strict,s);return i.range=[t,o,a.offset],a.comment&&(i.comment=a.comment),i}function Km(e,t,{offset:n,start:r,value:s,end:i},o){let a=Object.assign({_directives:t},e),l=new an(void 0,a),c={atKey:!1,atRoot:!0,directives:l.directives,options:l.options,schema:l.schema},d=vt(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?Kc(c,s,d,o):po(c,d.end,r,null,d,o);let u=l.contents.range[2],p=Ct(i,u,!1,o);return p.comment&&(l.comment=p.comment),l.range=[n,u,p.offset],l}function Ps(e){if(typeof e=="number")return[e,e+1];if(Array.isArray(e))return e.length===2?e:[e[0],e[1]];let{offset:t,source:n}=e;return[t,t+(typeof n=="string"?n.length:1)]}function Gm(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 Rs=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=bs(n);i?this.warnings.push(new ks(o,r,s)):this.errors.push(new dt(o,r,s))},this.directives=new Rt({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=Wm(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 Ss=class{constructor(t={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(n,r,s,i)=>{let o=Ps(n);i?this.warnings.push(new bs(o,r,s)):this.errors.push(new ut(o,r,s))},this.directives=new St({version:t.version||"1.2"}),this.options=t}decorate(t,n){let{comment:r,afterEmptyLine:s}=Gm(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:Wm(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=bs(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=Bm(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 dt(bs(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 dt(bs(t),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=It(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 dt(bs(t),"UNEXPECTED_TOKEN",`Unsupported token ${t.type}`))}}*end(t=!1,n=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(t){let r=Object.assign({_directives:this.directives},this.options),s=new sn(void 0,r);this.atDirectives&&this.onError(n,"MISSING_CHAR","Missing directives-end indicator line"),s.range=[0,n,n],this.decorate(s,!1),yield s}}};var Vc=Symbol("break visit"),kS=Symbol("skip children"),Vm=Symbol("remove item");function On(e,t){"type"in e&&e.type==="document"&&(e={start:e.start,value:e.value}),Km(Object.freeze([]),e,t)}On.BREAK=Vc;On.SKIP=kS;On.REMOVE=Vm;On.itemAtPath=(e,t)=>{let n=e;for(let[r,s]of t){let i=n?.[r];if(i&&"items"in i)n=i.items[s];else return}return n};On.parentCollection=(e,t)=>{let n=On.itemAtPath(e,t.slice(0,-1)),r=t[t.length-1][0],s=n?.[r];if(s&&"items"in s)return s;throw new Error("Parent collection not found")};function Km(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=Km(Object.freeze(e.concat([[s,o]])),i.items[o],n);if(typeof a=="number")o=a-1;else{if(a===Vc)return Vc;a===Vm&&(i.items.splice(o,1),o-=1)}}typeof r=="function"&&s==="key"&&(r=r(t,e))}}return typeof r=="function"?r(t,e):r}var Kc="\uFEFF",Gc="",Hc="",po="";function Gm(e){switch(e){case Kc:return"byte-order-mark";case Gc:return"doc-mode";case Hc:return"flow-error-end";case po: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:Gm(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(t,n=!1,r=-1){for(let s of t)yield*this.next(s);yield*this.end(n,r)}*next(t){switch(t.type){case"directive":this.directives.add(t.source,(n,r,s)=>{let i=Ps(t);i[0]+=n,this.onError(i,"BAD_DIRECTIVE",r,s)}),this.prelude.push(t.source),this.atDirectives=!0;break;case"document":{let n=Km(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(Ps(t),"UNEXPECTED_TOKEN",n);this.atDirectives||!this.doc?this.errors.push(r):this.doc.errors.push(r);break}case"doc-end":{if(!this.doc){let r="Unexpected doc-end without preceding document";this.errors.push(new ut(Ps(t),"UNEXPECTED_TOKEN",r));break}this.doc.directives.docEnd=!0;let n=Ct(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(Ps(t),"UNEXPECTED_TOKEN",`Unsupported token ${t.type}`))}}*end(t=!1,n=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(t){let r=Object.assign({_directives:this.directives},this.options),s=new an(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 Gc=Symbol("break visit"),SS=Symbol("skip children"),Hm=Symbol("remove item");function On(e,t){"type"in e&&e.type==="document"&&(e={start:e.start,value:e.value}),Ym(Object.freeze([]),e,t)}On.BREAK=Gc;On.SKIP=SS;On.REMOVE=Hm;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 Ym(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=Ym(Object.freeze(e.concat([[s,o]])),i.items[o],n);if(typeof a=="number")o=a-1;else{if(a===Gc)return Gc;a===Hm&&(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 Hc="\uFEFF",Yc="",zc="",fo="";function zm(e){switch(e){case Hc:return"byte-order-mark";case Yc:return"doc-mode";case zc:return"flow-error-end";case fo:return"scalar";case"---":return"doc-start";case"...":return"doc-end";case"":case`
184
184
  `:case`\r
185
- `:return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(e[0]){case" ":case" ":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}function ut(e){switch(e){case void 0:case" ":case`
186
- `:case"\r":case" ":return!0;default:return!1}}var Hm=new Set("0123456789ABCDEFabcdef"),bS=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),fo=new Set(",[]{}"),RS=new Set(` ,[]{}
187
- \r `),Yc=e=>!e||RS.has(e),Ps=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(t,n=!1){if(t){if(typeof t!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+t:t,this.lineEndPos=null}this.atEnd=!n;let r=this.next??"stream";for(;r&&(n||this.hasChars(1));)r=yield*this.parseNext(r)}atLineEnd(){let t=this.pos,n=this.buffer[t];for(;n===" "||n===" ";)n=this.buffer[++t];return!n||n==="#"||n===`
185
+ `:return"newline";case"-":return"seq-item-ind";case"?":return"explicit-key-ind";case":":return"map-value-ind";case"{":return"flow-map-start";case"}":return"flow-map-end";case"[":return"flow-seq-start";case"]":return"flow-seq-end";case",":return"comma"}switch(e[0]){case" ":case" ":return"space";case"#":return"comment";case"%":return"directive-line";case"*":return"alias";case"&":return"anchor";case"!":return"tag";case"'":return"single-quoted-scalar";case'"':return"double-quoted-scalar";case"|":case">":return"block-scalar-header"}return null}function dt(e){switch(e){case void 0:case" ":case`
186
+ `:case"\r":case" ":return!0;default:return!1}}var Jm=new Set("0123456789ABCDEFabcdef"),vS=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),mo=new Set(",[]{}"),CS=new Set(` ,[]{}
187
+ \r `),Jc=e=>!e||CS.has(e),Is=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(t,n=!1){if(t){if(typeof t!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+t:t,this.lineEndPos=null}this.atEnd=!n;let r=this.next??"stream";for(;r&&(n||this.hasChars(1));)r=yield*this.parseNext(r)}atLineEnd(){let t=this.pos,n=this.buffer[t];for(;n===" "||n===" ";)n=this.buffer[++t];return!n||n==="#"||n===`
188
188
  `?!0:n==="\r"?this.buffer[t+1]===`
189
189
  `:!1}charAt(t){return this.buffer[this.pos+t]}continueScalar(t){let n=this.buffer[t];if(this.indentNext>0){let r=0;for(;n===" ";)n=this.buffer[++r+t];if(n==="\r"){let s=this.buffer[r+t+1];if(s===`
190
190
  `||!s&&!this.atEnd)return t+r+1}return n===`
191
- `||r>=this.indentNext||!n&&!this.atEnd?t+r:-1}if(n==="-"||n==="."){let r=this.buffer.substr(t,3);if((r==="---"||r==="...")&&ut(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]===Kc&&(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 Gc,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==="...")&&ut(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&&!ut(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===":")&&ut(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(Yc),"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("..."))&&ut(s[3]))&&!(r===this.indentNext-1&&this.flowLevel===1&&(s[0]==="]"||s[0]==="}")))return this.flowLevel=0,yield Hc,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(Yc),"flow";case'"':case"'":return this.flowKey=!0,yield*this.parseQuotedScalar();case":":{let o=this.charAt(1);if(this.flowKey||ut(o)||o===",")return this.flowKey=!1,yield*this.pushCount(1),yield*this.pushSpaces(!0),"flow"}default:return this.flowKey=!1,yield*this.parsePlainScalar()}}*parseQuotedScalar(){let t=this.charAt(0),n=this.buffer.indexOf(t,this.pos+1);if(t==="'")for(;n!==-1&&this.buffer[n+1]==="'";)n=this.buffer.indexOf("'",n+2);else for(;n!==-1;){let i=0;for(;this.buffer[n-1-i]==="\\";)i+=1;if(i%2===0)break;n=this.buffer.indexOf('"',n+1)}let r=this.buffer.substring(0,n),s=r.indexOf(`
191
+ `||r>=this.indentNext||!n&&!this.atEnd?t+r:-1}if(n==="-"||n==="."){let r=this.buffer.substr(t,3);if((r==="---"||r==="...")&&dt(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]===Hc&&(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 Yc,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==="...")&&dt(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&&!dt(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===":")&&dt(n)){let r=(yield*this.pushCount(1))+(yield*this.pushSpaces(!0));return this.indentNext=this.indentValue+1,this.indentValue+=r,"block-start"}return"doc"}*parseDocument(){yield*this.pushSpaces(!0);let t=this.getLine();if(t===null)return this.setNext("doc");let n=yield*this.pushIndicators();switch(t[n]){case"#":yield*this.pushCount(t.length-n);case void 0:return yield*this.pushNewline(),yield*this.parseLineStart();case"{":case"[":return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*this.pushCount(1),"doc";case"*":return yield*this.pushUntil(Jc),"doc";case'"':case"'":return yield*this.parseQuotedScalar();case"|":case">":return n+=yield*this.parseBlockScalarHeader(),n+=yield*this.pushSpaces(!0),yield*this.pushCount(t.length-n),yield*this.pushNewline(),yield*this.parseBlockScalar();default:return yield*this.parsePlainScalar()}}*parseFlowCollection(){let t,n,r=-1;do t=yield*this.pushNewline(),t>0?(n=yield*this.pushSpaces(!1),this.indentValue=r=n):n=0,n+=yield*this.pushSpaces(!0);while(t+n>0);let s=this.getLine();if(s===null)return this.setNext("flow");if((r!==-1&&r<this.indentNext&&s[0]!=="#"||r===0&&(s.startsWith("---")||s.startsWith("..."))&&dt(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(Jc),"flow";case'"':case"'":return this.flowKey=!0,yield*this.parseQuotedScalar();case":":{let o=this.charAt(1);if(this.flowKey||dt(o)||o===",")return this.flowKey=!1,yield*this.pushCount(1),yield*this.pushSpaces(!0),"flow"}default:return this.flowKey=!1,yield*this.parsePlainScalar()}}*parseQuotedScalar(){let t=this.charAt(0),n=this.buffer.indexOf(t,this.pos+1);if(t==="'")for(;n!==-1&&this.buffer[n+1]==="'";)n=this.buffer.indexOf("'",n+2);else for(;n!==-1;){let i=0;for(;this.buffer[n-1-i]==="\\";)i+=1;if(i%2===0)break;n=this.buffer.indexOf('"',n+1)}let r=this.buffer.substring(0,n),s=r.indexOf(`
193
193
  `,this.pos);if(s!==-1){for(;s!==-1;){let i=this.continueScalar(s+1);if(i===-1)break;s=r.indexOf(`
194
- `,i)}s!==-1&&(n=s-(r[s-1]==="\r"?2:1))}if(n===-1){if(!this.atEnd)return this.setNext("quoted-scalar");n=this.buffer.length}return yield*this.pushToIndex(n+1,!1),this.flowLevel?"flow":"doc"}*parseBlockScalarHeader(){this.blockScalarIndent=-1,this.blockScalarKeep=!1;let t=this.pos;for(;;){let n=this.buffer[++t];if(n==="+")this.blockScalarKeep=!0;else if(n>"0"&&n<="9")this.blockScalarIndent=Number(n)-1;else if(n!=="-")break}return yield*this.pushUntil(n=>ut(n)||n==="#")}*parseBlockScalar(){let t=this.pos-1,n=0,r;e:for(let i=this.pos;r=this.buffer[i];++i)switch(r){case" ":n+=1;break;case`
194
+ `,i)}s!==-1&&(n=s-(r[s-1]==="\r"?2:1))}if(n===-1){if(!this.atEnd)return this.setNext("quoted-scalar");n=this.buffer.length}return yield*this.pushToIndex(n+1,!1),this.flowLevel?"flow":"doc"}*parseBlockScalarHeader(){this.blockScalarIndent=-1,this.blockScalarKeep=!1;let t=this.pos;for(;;){let n=this.buffer[++t];if(n==="+")this.blockScalarKeep=!0;else if(n>"0"&&n<="9")this.blockScalarIndent=Number(n)-1;else if(n!=="-")break}return yield*this.pushUntil(n=>dt(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 po,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(ut(i)||t&&fo.has(i))break;n=r}else if(ut(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 fo,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(dt(i)||t&&mo.has(i))break;n=r}else if(dt(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&&fo.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&&fo.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield po,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(Yc),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(ut(r)||n&&fo.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(;!ut(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(bS.has(n))n=this.buffer[++t];else if(n==="%"&&Hm.has(this.buffer[t+1])&&Hm.has(this.buffer[t+2]))n=this.buffer[t+=3];else break;return yield*this.pushToIndex(t,!1)}}*pushNewline(){let t=this.buffer[this.pos];return t===`
201
+ `,i=this.buffer[r+1]):n=r),i==="#"||t&&mo.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&&mo.has(s))break;n=r}return!s&&!this.atEnd?this.setNext("plain-scalar"):(yield fo,yield*this.pushToIndex(n+1,!0),t?"flow":"doc")}*pushCount(t){return t>0?(yield this.buffer.substr(this.pos,t),this.pos+=t,t):0}*pushToIndex(t,n){let r=this.buffer.slice(this.pos,t);return r?(yield r,this.pos+=r.length,r.length):(n&&(yield""),0)}*pushIndicators(){let t=0;e:for(;;){switch(this.charAt(0)){case"!":t+=yield*this.pushTag(),t+=yield*this.pushSpaces(!0);continue e;case"&":t+=yield*this.pushUntil(Jc),t+=yield*this.pushSpaces(!0);continue e;case"-":case"?":case":":{let n=this.flowLevel>0,r=this.charAt(1);if(dt(r)||n&&mo.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(;!dt(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(vS.has(n))n=this.buffer[++t];else if(n==="%"&&Jm.has(this.buffer[t+1])&&Jm.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 Ss=class{constructor(){this.lineStarts=[],this.addNewLine=t=>this.lineStarts.push(t),this.linePos=t=>{let n=0,r=this.lineStarts.length;for(;n<r;){let i=n+r>>1;this.lineStarts[i]<t?n=i+1:r=i}if(this.lineStarts[n]===t)return{line:n+1,col:1};if(n===0)return{line:0,col:t};let s=this.lineStarts[n-1];return{line:n,col:t-s+1}}}};function an(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function Ym(e){for(let t=0;t<e.length;++t)switch(e[t].type){case"space":case"comment":case"newline":break;default:return t}return-1}function Jm(e){switch(e?.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"flow-collection":return!0;default:return!1}}function mo(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 ho(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 zm(e){if(e.start.type==="flow-seq-start")for(let t of e.items)t.sep&&!t.value&&!an(t.start,"explicit-key-ind")&&!an(t.sep,"map-value-ind")&&(t.key&&(t.value=t.key),delete t.key,Jm(t.value)?t.value.end?ho(t.value.end,t.sep):t.value.end=t.sep:ho(t.start,t.sep),delete t.sep)}var Is=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 Ps,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=Gm(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"&&zm(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&&Ym(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":{Ym(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=mo(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 vs=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 cn(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function Xm(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 Zm(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 ho(e){switch(e.type){case"document":return e.start;case"block-map":{let t=e.items[e.items.length-1];return t.sep??t.start}case"block-seq":return e.items[e.items.length-1].start;default:return[]}}function yr(e){if(e.length===0)return[];let t=e.length;e:for(;--t>=0;)switch(e[t].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break e}for(;e[++t]?.type==="space";);return e.splice(t,e.length)}function go(e,t){if(t.length<1e5)Array.prototype.push.apply(e,t);else for(let n=0;n<t.length;++n)e.push(t[n])}function Qm(e){if(e.start.type==="flow-seq-start")for(let t of e.items)t.sep&&!t.value&&!cn(t.start,"explicit-key-ind")&&!cn(t.sep,"map-value-ind")&&(t.key&&(t.value=t.key),delete t.key,Zm(t.value)?t.value.end?go(t.value.end,t.sep):t.value.end=t.sep:go(t.start,t.sep),delete t.sep)}var Cs=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 Is,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=zm(t);if(n)if(n==="scalar")this.atNewLine=!1,this.atScalar=!0,this.type="scalar";else{switch(this.type=n,yield*this.step(),n){case"newline":this.atNewLine=!0,this.indent=0,this.onNewLine&&this.onNewLine(this.offset+t.length);break;case"space":this.atNewLine&&t[0]===" "&&(this.indent+=t.length);break;case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":this.atNewLine&&(this.indent+=t.length);break;case"doc-mode":case"flow-error-end":return;default:this.atNewLine=!1}this.offset+=t.length}else{let r=`Not a YAML token: ${t}`;yield*this.pop({type:"error",offset:this.offset,message:r,source:t}),this.offset+=t.length}}*end(){for(;this.stack.length>0;)yield*this.pop()}get sourceToken(){return{type:this.type,offset:this.offset,indent:this.indent,source:this.source}}*step(){let t=this.peek(1);if(this.type==="doc-end"&&t?.type!=="doc-end"){for(;this.stack.length>0;)yield*this.pop();this.stack.push({type:"doc-end",offset:this.offset,source:this.source});return}if(!t)return yield*this.stream();switch(t.type){case"document":return yield*this.document(t);case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yield*this.scalar(t);case"block-scalar":return yield*this.blockScalar(t);case"block-map":return yield*this.blockMap(t);case"block-seq":return yield*this.blockSequence(t);case"flow-collection":return yield*this.flowCollection(t);case"doc-end":return yield*this.documentEnd(t)}yield*this.pop()}peek(t){return this.stack[this.stack.length-t]}*pop(t){let n=t??this.stack.pop();if(!n)yield{type:"error",offset:this.offset,source:"",message:"Tried to pop an empty stack"};else if(this.stack.length===0)yield n;else{let r=this.peek(1);switch(n.type==="block-scalar"?n.indent="indent"in r?r.indent:0:n.type==="flow-collection"&&r.type==="document"&&(n.indent=0),n.type==="flow-collection"&&Qm(n),r.type){case"document":r.value=n;break;case"block-scalar":r.props.push(n);break;case"block-map":{let s=r.items[r.items.length-1];if(s.value){r.items.push({start:[],key:n,sep:[]}),this.onKeyLine=!0;return}else if(s.sep)s.value=n;else{Object.assign(s,{key:n,sep:[]}),this.onKeyLine=!s.explicitKey;return}break}case"block-seq":{let s=r.items[r.items.length-1];s.value?r.items.push({start:[],value:n}):s.value=n;break}case"flow-collection":{let s=r.items[r.items.length-1];!s||s.value?r.items.push({start:[],key:n,sep:[]}):s.sep?s.value=n:Object.assign(s,{key:n,sep:[]});return}default:yield*this.pop(),yield*this.pop(n)}if((r.type==="document"||r.type==="block-map"||r.type==="block-seq")&&(n.type==="block-map"||n.type==="block-seq")){let s=n.items[n.items.length-1];s&&!s.sep&&!s.value&&s.start.length>0&&Xm(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":{Xm(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=ho(this.peek(2)),r=yr(n),s;t.end?(s=t.end,s.push(this.sourceToken),delete t.end):s=[this.sourceToken];let i={type:"block-map",offset:t.offset,indent:t.indent,items:[{start:r,key:t,sep:s}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=i}else yield*this.lineEnd(t)}*blockScalar(t){switch(this.type){case"space":case"comment":case"newline":t.props.push(this.sourceToken);return;case"scalar":if(t.source=this.source,this.atNewLine=!0,this.indent=0,this.onNewLine){let n=this.source.indexOf(`
205
205
  `)+1;for(;n!==0;)this.onNewLine(this.offset+n),n=this.source.indexOf(`
206
- `,n)+1}yield*this.pop();break;default:yield*this.pop(),yield*this.step()}}*blockMap(t){let n=t.items[t.items.length-1];switch(this.type){case"newline":if(this.onKeyLine=!1,n.value){let r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):t.items.push({start:[this.sourceToken]})}else n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)t.items.push({start:[this.sourceToken]});else if(n.sep)n.sep.push(this.sourceToken);else{if(this.atIndentedComment(n.start,t.indent)){let s=t.items[t.items.length-2]?.value?.end;if(Array.isArray(s)){ho(s,n.start),s.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return}if(this.indent>=t.indent){let r=!this.onKeyLine&&this.indent===t.indent,s=r&&(n.sep||n.explicitKey)&&this.type!=="seq-item-ind",i=[];if(s&&n.sep&&!n.value){let o=[];for(let a=0;a<n.sep.length;++a){let l=n.sep[a];switch(l.type){case"newline":o.push(a);break;case"space":break;case"comment":l.indent>t.indent&&(o.length=0);break;default:o.length=0}}o.length>=2&&(i=n.sep.splice(o[1]))}switch(this.type){case"anchor":case"tag":s||n.value?(i.push(this.sourceToken),t.items.push({start:i}),this.onKeyLine=!0):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"explicit-key-ind":!n.sep&&!n.explicitKey?(n.start.push(this.sourceToken),n.explicitKey=!0):s||n.value?(i.push(this.sourceToken),t.items.push({start:i,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(n.explicitKey)if(n.sep)if(n.value)t.items.push({start:[],key:null,sep:[this.sourceToken]});else if(an(n.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]});else if(Jm(n.key)&&!an(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(an(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]}):an(n.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let o=this.flowScalar(this.type);s||n.value?(t.items.push({start:i,key:o,sep:[]}),this.onKeyLine=!0):n.sep?this.stack.push(o):(Object.assign(n,{key:o,sep:[]}),this.onKeyLine=!0);return}default:{let o=this.startBlockValue(t);if(o){if(o.type==="block-seq"){if(!n.explicitKey&&n.sep&&!an(n.sep,"newline")){yield*this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source});return}}else r&&t.items.push({start:i});this.stack.push(o);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(t){let n=t.items[t.items.length-1];switch(this.type){case"newline":if(n.value){let r="end"in n.value?n.value.end:void 0;(Array.isArray(r)?r[r.length-1]:void 0)?.type==="comment"?r?.push(this.sourceToken):t.items.push({start:[this.sourceToken]})}else n.start.push(this.sourceToken);return;case"space":case"comment":if(n.value)t.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(n.start,t.indent)){let s=t.items[t.items.length-2]?.value?.end;if(Array.isArray(s)){ho(s,n.start),s.push(this.sourceToken),t.items.pop();return}}n.start.push(this.sourceToken)}return;case"anchor":case"tag":if(n.value||this.indent<=t.indent)break;n.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==t.indent)break;n.value||an(n.start,"seq-item-ind")?t.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return}if(this.indent>t.indent){let r=this.startBlockValue(t);if(r){this.stack.push(r);return}}yield*this.pop(),yield*this.step()}*flowCollection(t){let n=t.items[t.items.length-1];if(this.type==="flow-error-end"){let r;do yield*this.pop(),r=this.peek(1);while(r?.type==="flow-collection")}else if(t.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!n||n.sep?t.items.push({start:[this.sourceToken]}):n.start.push(this.sourceToken);return;case"map-value-ind":!n||n.value?t.items.push({start:[],key:null,sep:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):Object.assign(n,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!n||n.value?t.items.push({start:[this.sourceToken]}):n.sep?n.sep.push(this.sourceToken):n.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let s=this.flowScalar(this.type);!n||n.value?t.items.push({start:[],key:s,sep:[]}):n.sep?this.stack.push(s):Object.assign(n,{key:s,sep:[]});return}case"flow-map-end":case"flow-seq-end":t.end.push(this.sourceToken);return}let r=this.startBlockValue(t);r?this.stack.push(r):(yield*this.pop(),yield*this.step())}else{let r=this.peek(2);if(r.type==="block-map"&&(this.type==="map-value-ind"&&r.indent===t.indent||this.type==="newline"&&!r.items[r.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type==="map-value-ind"&&r.type!=="flow-collection"){let s=mo(r),i=wr(s);zm(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)){go(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(cn(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(Zm(n.key)&&!cn(n.sep,"newline")){let o=yr(n.start),a=n.key,l=n.sep;l.push(this.sourceToken),delete n.key,delete n.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:a,sep:l}]})}else i.length>0?n.sep=n.sep.concat(i,this.sourceToken):n.sep.push(this.sourceToken);else if(cn(n.start,"newline"))Object.assign(n,{key:null,sep:[this.sourceToken]});else{let o=yr(n.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]})}else n.sep?n.value||s?t.items.push({start:i,key:null,sep:[this.sourceToken]}):cn(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&&!cn(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)){go(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||cn(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=ho(r),i=yr(s);Qm(t);let o=t.end.splice(1,t.end.length);o.push(this.sourceToken);let a={type:"block-map",offset:t.offset,indent:t.indent,items:[{start:i,key:t,sep:o}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=a}else yield*this.lineEnd(t)}}flowScalar(t){if(this.onNewLine){let n=this.source.indexOf(`
207
207
  `)+1;for(;n!==0;)this.onNewLine(this.offset+n),n=this.source.indexOf(`
208
- `,n)+1}return{type:t,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(t){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let n=mo(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=mo(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 PS(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new Ss||null,prettyErrors:t}}function zc(e,t={}){let{lineCounter:n,prettyErrors:r}=PS(t),s=new Is(n?.addNewLine),i=new Rs(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 dt(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return r&&n&&(o.errors.forEach(Fc(e,n)),o.warnings.forEach(Fc(e,n))),o}var vs=1024*1024;function Jc(e,t){Buffer.byteLength(e)>vs&&go(t,[`Definition exceeds ${vs} bytes.`]);let n=zc(e,{schema:"core",uniqueKeys:!0,prettyErrors:!0}),r=[];Qe(n,(i,o)=>{Me(o)&&r.push("YAML aliases are not supported."),typeof o=="object"&&o!==null&&"anchor"in o&&typeof o.anchor=="string"&&r.push("YAML anchors are not supported.")});let s=[...n.errors.map(i=>i.message),...n.warnings.map(i=>i.message),...r];s.length>0&&go(t,s),n.contents===null&&go(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){go(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function go(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 IS}from"node:crypto";var kr=/^[a-z][a-z0-9_-]{0,63}$/,Xm=/\$\{\{\s*([^{}]+?)\s*\}\}/g,Qm=32,Zm=128,vS=16,CS=32,AS=10080*60*1e3,Tr=32*1024,eh=16;function Zc(e,t){let n=[],r=je(e,"$",n);pt(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=jS(r.name,"$.name",n),i=OS(r.limits,n),o=$S(r.inputs,n),a=NS(r.steps,n);a.length>Zm&&n.push(`$.steps may contain at most ${Zm} 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=xS(a,n);c&&FS(a,o,c.ancestors,n),n.length>0&&BS(t,n);let u={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:u,hash:IS("sha256").update(Qc(u)).digest("hex"),order:c.order,waves:ES(c.waves,i.maxConcurrency)}}function ES(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 OS(e,t){let n=je(e,"$.limits",t);pt(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=th(n.max_concurrency,"$.limits.max_concurrency",1,vS,t),s=th(n.max_tasks,"$.limits.max_tasks",1,CS,t),i=sh(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function $S(e,t){if(e===void 0)return{};let n=je(e,"$.inputs",t),r=Object.entries(n);r.length>Qm&&t.push(`$.inputs may contain at most ${Qm} inputs.`);let s={};for(let[i,o]of r){kr.test(i)||t.push(`$.inputs key "${i}" must match ${kr}.`);let a=je(o,`$.inputs.${i}`,t);pt(a,["type","required","default"],`$.inputs.${i}`,t);let l=US(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:qS(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&&!nh(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&nh(a.default,l)?{defaultValue:a.default}:{}}}return s}function NS(e,t){let n=je(e,"$.steps",t),r=Object.entries(n);return r.length===0&&t.push("$.steps must contain at least one step."),r.map(([s,i])=>{kr.test(s)||t.push(`$.steps key "${s}" must match ${kr}.`);let o=je(i,`$.steps.${s}`,t),a=rh(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?_S(s,o,a,t):DS(s,o,a,t)})}function DS(e,t,n,r){pt(t,["needs","task","create_child","agent","prompt","output"],`$.steps.${e}`,r);let s=t.task!==void 0,i=t.create_child!==void 0;s===i&&r.push(`$.steps.${e} must define exactly one of task or create_child.`);let o=s?Lt(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let d=je(t.create_child,`$.steps.${e}.create_child`,r);pt(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:Lt(d.repo,`$.steps.${e}.create_child.repo`,r)}:{},...d.workspace!==void 0?{workspace:Lt(d.workspace,`$.steps.${e}.create_child.workspace`,r)}:{}}}let l;if(t.agent!==void 0){let d=je(t.agent,`$.steps.${e}.agent`,r);if(pt(d,["runner"],`$.steps.${e}.agent`,r),d.runner!==void 0)try{l=T.runners.parse(Lt(d.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=Lt(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>Tr&&r.push(`$.steps.${e}.prompt exceeds ${Tr} bytes.`);let u;if(t.output!==void 0){let d=je(t.output,`$.steps.${e}.output`,r);pt(d,["schema"],`$.steps.${e}.output`,r),u=Xc(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 _S(e,t,n,r){pt(t,["needs","human_review"],`$.steps.${e}`,r);let s=je(t.human_review,`$.steps.${e}.human_review`,r);pt(s,["title","summary","feedback_target","timeout"],`$.steps.${e}.human_review`,r);let i;if(s.feedback_target!==void 0){let o=je(s.feedback_target,`$.steps.${e}.human_review.feedback_target`,r);pt(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=Lt(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:Lt(s.title,`$.steps.${e}.human_review.title`,r),summary:Lt(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:sh(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function Xc(e,t,n,r){if(r>eh)return n.push(`${t} exceeds the maximum schema depth of ${eh}.`),{};let s=je(e,t,n);pt(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&&rh(s.required,`${t}.required`,n),s.enum!==void 0&&(!Array.isArray(s.enum)||s.enum.length===0)&&n.push(`${t}.enum must be a non-empty array.`),s.additionalProperties!==void 0&&typeof s.additionalProperties!="boolean"&&n.push(`${t}.additionalProperties must be a boolean.`),s.properties!==void 0){let o=je(s.properties,`${t}.properties`,n);for(let[a,l]of Object.entries(o))Xc(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&Xc(s.items,`${t}.items`,n,r+1),s}function xS(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 FS(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(Xm)],c=a.replace(Xm,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let u of l)LS(u[1].trim(),i,t,n,s,r)}}}function LS(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&&MS(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function MS(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(!yo(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(!yo(a))return;i=a}}function Qc(e){return Array.isArray(e)?`[${e.map(Qc).join(",")}]`:yo(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Qc(e[t])}`).join(",")}}`:JSON.stringify(e)}function je(e,t,n){return yo(e)?e:(n.push(`${t} must be an object.`),{})}function pt(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 jS(e,t,n){let r=Lt(e,t,n);return kr.test(r)||n.push(`${t} must match ${kr}.`),r}function Lt(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function rh(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 th(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 qS(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function US(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function nh(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function sh(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>AS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function BS(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var yo=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as WS,stat as VS}from"node:fs/promises";var KS=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function ed(e){let t=await ih(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 td(e,t){let n=await ih(e),r=GS(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:zS(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 ih(e){let t;try{let n=await VS(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>vs)throw new Error(`Definition exceeds ${vs} bytes.`);t=await WS(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return Zc(Jc(t,e),e)}function GS(e,t){let n=[];for(let s of Object.keys(t))e[s]||n.push(`Input "${s}" is not declared.`);let r={};for(let[s,i]of Object.entries(e)){let o=t[s];o!==void 0?r[s]=HS(o,i.type,s,n):i.defaultValue!==void 0?r[s]=i.defaultValue:i.required&&n.push(`Required input "${s}" was not provided.`)}if(n.length>0)throw new g("FURY_INPUT_INVALID","Fury inputs are invalid.",{details:{issues:n}});return r}function HS(e,t,n,r){if(t==="string")return e;if(t==="number"){if(e.trim().length===0)return r.push(`Input "${n}" must be a finite number.`),0;let s=Number(e);return Number.isFinite(s)?s:(r.push(`Input "${n}" must be a finite number.`),0)}return e==="true"?!0:(e==="false"||r.push(`Input "${n}" must be true or false.`),!1)}function YS(e,t){return e.replace(KS,(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=YS(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 zS(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 oh}from"node:crypto";import JS from"node:path";import{mkdir as XS}from"node:fs/promises";var nd={type:"system",component:"heartbeat"};async function ln(e,t={}){await XS(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([S.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):Nt.listAgents(e),qf(e),sI(e)]),o=r??kt(n.tasks.filter(f=>f.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=rI(i),l=a!==i,c=[],u=rd(s.filter(nI),f=>f.taskId),d=rd(s.filter(f=>f.type.startsWith("task.pr.")),f=>f.taskId),p=rd(s.filter(f=>f.type==="agent.state.changed"),f=>f.agentTabId);for(let f of n.tasks){let m=QS(f),y=u.get(f.id),k=id(y?.data)??a.tasks[f.id]??null,R=y?.id??a.tasks[f.id]?.eventId??null;if(k?.signature!==m.signature){let _=k?f.status==="closed"&&k?.status!=="closed"?"task.closed":"task.updated":"task.created",A=await Fe(e,{id:sd(_,f.id,m.signature),type:_,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:nd,data:{...m,changedFields:k?eI(k,m):[]}});c.push(A),R=A.id}a.tasks[f.id]={...m,eventId:R};let b=tI(f.prs),$=d.get(f.id),N=id($?.data)??a.pullRequests[f.id]??null,D=$?.id??a.pullRequests[f.id]?.eventId??null;if((N||b.associations.length>0)&&N?.signature!==b.signature){let _=Array.isArray(N?.associations)?N.associations.length:0,A=b.associations.length>_?"task.pr.linked":b.associations.length<_?"task.pr.unlinked":"task.pr.refreshed",w=await Fe(e,{id:sd(A,f.id,b.signature),type:A,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:nd,data:b});c.push(w),D=w.id}a.pullRequests[f.id]={...b,eventId:D}}let h=new Map(o.tasks.map(f=>[f.taskId,f.state]));for(let f of o.agents){let m=p.get(f.tabId),y=id(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 k=[m?.id??a.agents[f.tabId]?.eventId??"initial",f.state,f.sessionState??"none",f.lastActivityAt??"none",f.exitCode??"none",f.error??"none"].join(":"),R=await Fe(e,{id:sd("agent.state.changed",f.tabId,k),type:"agent.state.changed",taskId:f.taskId,agentTabId:f.tabId,actor:nd,data:{previousState:typeof y?.state=="string"?y.state:null,state:f.state,taskState:h.get(f.taskId)??"idle",sessionState:f.sessionState,lastActivityAt:f.lastActivityAt,exitCode:f.exitCode,error:f.error}});c.push(R),a.agents[f.tabId]={state:f.state,eventId:R.id}}return(c.length>0||l)&&await B(lh(e),a),c}function QS(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:ah(t)}}var ZS=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function eI(e,t){return ZS.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function tI(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:ah(t)}}function rd(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var nI=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",ah=e=>oh("sha256").update(JSON.stringify(e)).digest("hex"),sd=(...e)=>oh("sha256").update(e.join("\0")).digest("hex"),id=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,lh=e=>JS.join(e.orchestrationDir,"event-reconciliation.json");function rI(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 sI(e){try{return await Bs(lh(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function iI(e,t){return await od(e),await ln(e),In(e,t)}async function oI(e,t,n){await od(e);let r=await Nt.openObserver(e);try{let s=t.after,i=0,o=0;for(;!n.signal?.aborted;){await ln(e,{agentObserver:r});let a=await In(e,{...t,...s?{after:s}:{}});for(let l of a.events)n.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,n.signal?.aborted)break;await ch(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function aI(e,t,n){await od(e);let r=await S.getTask(e,t);if(n.tabId&&!r.ptyTabs.some(i=>i.kind==="agent"&&i.id===n.tabId))throw new g("TASK_CONTEXT_CONFLICT",`Agent tab ${n.tabId} does not belong to task ${t}.`,{details:{taskId:t,tabId:n.tabId}});let s=await Nt.openObserver(e);try{await ln(e,{agentObserver:s});let o=(await In(e,{taskId:t,typeGlob:"agent.state.changed"})).cursor.after??void 0,a=Date.now()+n.timeoutMs;for(;;){let l=Date.now(),c=kt([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 lI(t,n.states,n.timeoutMs);await ln(e,{agentObserver:s}),o=(await In(e,{taskId:t,typeGlob:"agent.state.changed",...o?{after:o}:{}})).cursor.after??o,await ch(Math.min(250,d),n.signal)}}finally{s.close()}}async function od(e){let t=await T.load(e);if(!T.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Event orchestration is a feature preview. Enable agentOrchestration before using events commands.",{details:{preview:"agentOrchestration"}})}function ch(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 lI=(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}}),wo={list:iI,watch:oI,waitForTaskState:aI,reconcile:ln};import{readFile as SI}from"node:fs/promises";import{mkdir as wI,readFile as fh,rm as mh}from"node:fs/promises";import{createConnection as kI}from"node:net";import TI from"node:path";import{spawn as mI}from"node:child_process";import{closeSync as hI,openSync as gI}from"node:fs";import ld from"node:path";import{accessSync as dI,constants as uI}from"node:fs";import{homedir as dh}from"node:os";import cn from"node:path";var pI=[cn.join(dh(),".local","bin"),cn.join(dh(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function ph(e=process.env){return fI([...(e.PATH??"").split(cn.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:pI])}function ko(e=process.env){return{...e,PATH:ph(e).join(cn.delimiter)}}function ad(e,t={}){if(e.includes(cn.sep)){let n=cn.isAbsolute(e)?e:cn.resolve(t.cwd??process.cwd(),e);return uh(n)?n:null}for(let n of ph(t.env)){let r=cn.join(n,e);if(uh(r))return r}return null}function To(e,t={}){let n=ad(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 uh(e){try{return dI(e,uI.X_OK),!0}catch{return!1}}function fI(e){return[...new Set(e)]}function bo(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=yI(e.workspaceRoot),s=gI(ld.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return mI(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{hI(s)}})().unref()}function yI(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=ld.resolve(ld.dirname(t),"..","node_modules",".bin","tsx");return{command:ad("tsx")??n,args:[t,"__craig-daemon",e]}}if(!t)throw new Error("Craig cannot resolve its daemon entrypoint.");return{command:process.execPath,args:[...process.execArgv,t,"__craig-daemon",e]}}async function Mt(e){let t=await Po(xe(e).socketPath).catch(()=>null);if(!t)return!1;try{let n=await Nn(t,{type:"ping"});return Xt(n.protocolVersion)?(await Nn(t,{type:"wakeOrchestration"}),!0):!1}catch{return!1}finally{t.end()}}async function Ro(e,t){if(t.length===0)return!0;let n=await Po(xe(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await Nn(n,{type:"ping"});if(!Xt(r.protocolVersion))return!1;for(let s of t)await Nn(n,{type:"disposeSession",tabId:s});return!0}catch{return!1}finally{n.end()}}async function gh(e,t){await bI(e);let n=await Po(xe(e).socketPath);try{let r=await Nn(n,{type:"ping"});if(!Xt(r.protocolVersion))throw new Error("Craig PTY daemon protocol mismatch during delegated agent startup.");await Nn(n,{type:"ensureSession",taskId:t.taskId,tabId:t.tabId,size:{columns:120,rows:36},spec:{cwd:t.cwd,command:t.command,...t.env?{env:t.env}:{}}})}finally{n.end()}}async function bI(e){let t=xe(e),n=await hh(t.socketPath).catch(()=>null);if(Xt(n?.protocolVersion))return;if(n)throw new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly.");await wI(e.runtimeDir,{recursive:!0});let r=await fh(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&RI(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([mh(t.socketPath,{force:!0}),mh(t.pidPath,{force:!0})]),bo(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await hh(t.socketPath).catch(()=>null);if(Xt(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await fh(TI.join(e.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
209
- ${o.slice(-2e3)}`:""}`)}async function hh(e){let t=await Po(e);try{return await Nn(t,{type:"ping"})}finally{t.end()}}function RI(e){try{return process.kill(e,0),!0}catch{return!1}}var PI=1;function Nn(e,t){let n=PI++;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 Po(e){return new Promise((t,n)=>{let r=kI(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function II(e,t){await $I(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 OI(t.prompt,t.readStdin),o;try{o=await ae.create(e,{taskId:n.id,agentTabId:s.id,prompt:i,delivery:t.delivery,timeoutMs:t.timeoutMs,idempotencyKey:t.idempotencyKey??null,actor:{type:"human",source:"cli",processId:process.pid}})}catch(a){throw await Mt(e),a}return await cd(e,o.command.id),o}async function cd(e,t){if((await ae.show(e,t)).command.state==="delivered"||await Mt(e))return;let r=(await ae.show(e,t)).command;if(r.state==="delivered")return;let s=r.state==="queued"?await ae.fail(e,r.id,{code:"ORCHESTRATION_UNAVAILABLE",message:"Craig could not wake the workspace orchestration supervisor.",retryable:!0,deliveryUncertain:!1}):r;throw new g("PARTIAL_RESULT",`Command ${r.id} was persisted as ${s.state}, but Craig could not start prompt delivery.`,{retryable:!0,details:{commandId:r.id,durableState:s.state}})}async function vI(e,t){return ae.show(e,t)}async function CI(e,t){return ae.list(e,t)}async function AI(e,t){let n;try{n=await ae.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await Mt(e),r}return await Mt(e),n}async function EI(e,t,n){return ae.wait(e,t,n)}async function OI(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await SI(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 $I(e){let t=await T.load(e);if(!T.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Prompt dispatch is a feature preview. Enable agentOrchestration before sending prompts.",{details:{preview:"agentOrchestration"}})}var br={send:II,show:vI,list:CI,cancel:AI,wait:EI};function So(e,t){if(t!=="codex")return e;let[n="codex",...r]=e,s=["--no-alt-screen","--no-daemon"].filter(i=>!r.includes(i));return[n,...s,...r]}var NI=6e4;async function Io(e,t){return gc(e,t,{createTask:DI})}async function yh(e,t,n,r={}){return hc(e,t,n,{...r,launchProvisioned:(s,i)=>wh(e,s,i,!1)})}async function DI(e,t,n,r={}){return S.createTask(e,t,n,{...r,markStartedAfterLaunch:!1,launchProvisioned:(s,i)=>wh(e,s,i,!0)})}async function wh(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 gh(e,{taskId:t.id,tabId:s.id,cwd:t.worktreePath,command:So(r?s.command:t.runnerSession.command,s.runner??t.runner),...n?{env:n}:{}}),!r)return;let i=await ae.create(e,{taskId:t.id,agentTabId:s.id,prompt:{source:"inline",text:t.prompt.value},delivery:"when-ready",timeoutMs:NI,idempotencyKey:`task-start:${t.id}`,actor:{type:"system",component:"orchestration-supervisor"}});await cd(e,i.command.id)}catch(i){throw await Ro(e,[s.id]),i}}async function vo(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 wc(e,t,n);return await Ro(e,o),a}catch(a){throw a instanceof g&&a.code==="PARTIAL_RESULT"&&a.details.persisted===!0&&await Ro(e,o),a}}import{randomUUID as bh}from"node:crypto";import{readFile as _I,realpath as kh}from"node:fs/promises";import dd from"node:path";var se={type:"system",component:"orchestration-supervisor"},xI=/\$\{\{\s*steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)\s*\}\}/g;async function FI(e,t,n,r,s,i){await Fn(e);let o=await JI(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 Xe(e,i,"fury.plan",r)}let a=await td(t,n);XI(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_${bh()}`,planHash:Vl(c),createdBy:s,createdAt:l};await bf(e,a.definitionHash,await _I(t,"utf8"));let d=await Rf(e,u);try{await Fe(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 LI(e,t,n){if(await Fn(e),n.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can approve a Fury plan.",{});let r=await bi(e,t),s={schemaVersion:1,planId:r.id,planHash:r.planHash,approvedBy:n,approvedAt:new Date().toISOString()},i=await If(e,s);try{await Fe(e,{id:`${r.id}:fury.plan.approved`,taskId:r.rootTaskId,type:"fury.plan.approved",occurredAt:i.approval.approvedAt,actor:i.approval.approvedBy,data:{planId:r.id,planHash:r.planHash}})}catch(o){throw new g("PARTIAL_RESULT",`Fury plan ${r.id} was approved, but its audit event could not be recorded.`,{details:{planId:r.id,planHash:r.planHash,persisted:!0,approved:!0},cause:o})}return{kind:"approveFury",plan:r,approval:i.approval,created:i.created}}async function MI(e,t,n,r){await Fn(e);let s=await bi(e,t);if((await vf(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 rt(e,await S.getTask(e,s.rootTaskId));let o=new Date,l={schemaVersion:1,id:`fury_${bh()}`,planId:s.id,planHash:s.planHash,definitionHash:s.definitionHash,name:s.name,sourceFile:s.sourceFile,rootTaskId:s.rootTaskId,state:"pending",inputs:s.inputs,limits:s.limits,order:s.order,stepRuns:Object.fromEntries(s.steps.map(u=>[u.id,{id:u.id,kind:u.kind,needs:u.needs,state:"pending",plan:u,taskId:null,agentTabId:null,commandId:null,reviewId:null,output:null,error:null,startedAt:null,completedAt:null,deadlineAt:null,completedBy:null}])),actor:n,createdAt:o.toISOString(),updatedAt:o.toISOString(),stateChangedAt:o.toISOString(),deadlineAt:new Date(o.getTime()+s.limits.timeoutMs).toISOString(),completedAt:null},c=await Cf(e,l);try{await ce(e,c.run,null,"fury.run.created",c.run.actor,{state:"pending"})}catch(u){throw new g("PARTIAL_RESULT",`Fury run ${c.run.id} was persisted, but its audit event could not be recorded.`,{details:{runId:c.run.id,planId:c.run.planId,persisted:!0},cause:u})}return await xn(e,c.run.id),await Mt(e),{kind:"runFury",run:await pe(e,c.run.id),created:c.created}}async function jI(e,t){return await Fn(e),await xn(e,t),{kind:"showFury",run:await pe(e,t)}}async function Ao(e,t={}){let n=await T.load(e);if(T.previews.isEnabled(n,"agentOrchestration"))for(let r of await Af(e))await xn(e,r.id,t)}async function xn(e,t,n={}){let r=await pe(e,t);if(await tv(e,r),vt(r))return;if(Date.now()>=Date.parse(r.deadlineAt)){r=await ze(e,t,o=>ev(o));for(let o of Object.values(r.stepRuns))o.reviewId&&await ns(e,o.reviewId,a=>({...a,state:"timed_out",version:a.version+1,updatedAt:new Date().toISOString()}));await ce(e,r,null,"fury.run.timed_out",se,{state:r.state});return}let s=new Map((await Je(e)).map(o=>[o.id,o]));for(let o of r.order){let a=r.stepRuns[o];if(a.state==="running"&&!a.taskId){r=await Th(e,r,a);continue}a.state==="running"&&a.commandId&&s.get(a.commandId)?.state==="failed"&&(r=await Co(e,r.id,a.id,s.get(a.commandId)?.lastError?.message??"Prompt delivery failed.",se));let l=!a.commandId||s.get(a.commandId)?.state==="delivered";a.state==="running"&&a.agentTabId&&l&&n.isAgentAvailable&&a.startedAt&&Date.now()-Date.parse(a.startedAt)>2e3&&!n.isAgentAvailable(a.agentTabId)&&(r=await Co(e,r.id,a.id,`Agent session ${a.agentTabId} disappeared.`,se)),a.state==="running"&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(r=await ze(e,r.id,c=>dn(c,a.id,{state:"timed_out",error:"Step timed out.",completedAt:new Date().toISOString(),completedBy:se})),await ce(e,r,a.id,"fury.step.timed_out",se,{})),(a.state==="waiting_for_review"||a.state==="changes_requested")&&a.deadlineAt&&Date.now()>=Date.parse(a.deadlineAt)&&(a.reviewId&&await ns(e,a.reviewId,c=>({...c,state:"timed_out",version:c.version+1,updatedAt:new Date().toISOString()})),r=await ze(e,r.id,c=>dn(c,a.id,{state:"timed_out",error:"Review timed out.",completedAt:new Date().toISOString(),completedBy:se})),await ce(e,r,a.id,"fury.review.timed_out",se,{reviewId:a.reviewId}))}if(Object.values(r.stepRuns).some(o=>o.state==="failed"||o.state==="timed_out")){await Eo(e,r.id,"failed",se);return}let i=Object.values(r.stepRuns).filter(o=>o.state==="running").length;for(let o of r.order){if(i>=r.limits.maxConcurrency)break;let a=r.stepRuns[o];a.state!=="pending"||!a.needs.every(l=>r.stepRuns[l]?.state==="succeeded")||(a.kind==="human_review"?r=await qI(e,r,a):(r=await Th(e,r,a),i+=1))}await ZI(e,r.id)}async function Th(e,t,n){let r=new Date;t=await ze(e,t.id,o=>dn(o,n.id,{state:"running",startedAt:r.toISOString(),deadlineAt:o.deadlineAt})),await ce(e,t,n.id,"fury.step.started",se,{});let s=t.stepRuns[n.id];if(s.taskId)return t;let i=`${_n(s.plan.prompt,t)}
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=ho(t),r=yr(n);return r.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let n=ho(t),r=yr(n);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(t,n){return this.type!=="comment"||this.indent<=n?!1:t.every(r=>r.type==="newline"||r.type==="space")}*documentEnd(t){this.type!=="doc-mode"&&(t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(t){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;default:t.end?t.end.push(this.sourceToken):t.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};function AS(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new vs||null,prettyErrors:t}}function Xc(e,t={}){let{lineCounter:n,prettyErrors:r}=AS(t),s=new Cs(n?.addNewLine),i=new Ss(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(Mc(e,n)),o.warnings.forEach(Mc(e,n))),o}var As=1024*1024;function Qc(e,t){Buffer.byteLength(e)>As&&yo(t,[`Definition exceeds ${As} bytes.`]);let n=Xc(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&&yo(t,s),n.contents===null&&yo(t,["Definition is empty."]);try{return n.toJS({maxAliasCount:0,mapAsMap:!1})}catch(i){yo(t,[i instanceof Error?i.message:"YAML could not be decoded."])}}function yo(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 OS}from"node:crypto";var wr=/^[a-z][a-z0-9_-]{0,63}$/,eh=/\$\{\{\s*([^{}]+?)\s*\}\}/g,th=32,nh=128,$S=16,NS=32,DS=10080*60*1e3,kr=32*1024,rh=16;function tu(e,t){let n=[],r=Ue(e,"$",n);pt(r,["version","name","limits","inputs","steps"],"$",n),r.version!==1&&n.push("$.version must be 1.");let s=VS(r.name,"$.name",n),i=xS(r.limits,n),o=FS(r.inputs,n),a=LS(r.steps,n);a.length>nh&&n.push(`$.steps may contain at most ${nh} 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=qS(a,n);c&&US(a,o,c.ancestors,n),n.length>0&&HS(t,n);let d={version:1,name:s,limits:i,inputs:o,steps:a};return{definition:d,hash:OS("sha256").update(eu(d)).digest("hex"),order:c.order,waves:_S(c.waves,i.maxConcurrency)}}function _S(e,t){return e.flatMap(n=>{let r=[];for(let s=0;s<n.length;s+=t)r.push(n.slice(s,s+t));return r})}function xS(e,t){let n=Ue(e,"$.limits",t);pt(n,["max_concurrency","max_tasks","timeout"],"$.limits",t);let r=sh(n.max_concurrency,"$.limits.max_concurrency",1,$S,t),s=sh(n.max_tasks,"$.limits.max_tasks",1,NS,t),i=ah(n.timeout,"$.limits.timeout",t);return r>s&&t.push("$.limits.max_concurrency cannot exceed max_tasks."),{maxConcurrency:r,maxTasks:s,timeoutMs:i}}function FS(e,t){if(e===void 0)return{};let n=Ue(e,"$.inputs",t),r=Object.entries(n);r.length>th&&t.push(`$.inputs may contain at most ${th} inputs.`);let s={};for(let[i,o]of r){wr.test(i)||t.push(`$.inputs key "${i}" must match ${wr}.`);let a=Ue(o,`$.inputs.${i}`,t);pt(a,["type","required","default"],`$.inputs.${i}`,t);let l=GS(a.type,`$.inputs.${i}.type`,t),c=a.required===void 0?!1:KS(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&&!ih(a.default,l)&&t.push(`$.inputs.${i}.default must be a ${l}.`),s[i]={type:l,required:c,...a.default!==void 0&&ih(a.default,l)?{defaultValue:a.default}:{}}}return s}function LS(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])=>{wr.test(s)||t.push(`$.steps key "${s}" must match ${wr}.`);let o=Ue(i,`$.steps.${s}`,t),a=oh(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?jS(s,o,a,t):MS(s,o,a,t)})}function MS(e,t,n,r){pt(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?Mt(t.task,`$.steps.${e}.task`,r):void 0,a;if(i){let u=Ue(t.create_child,`$.steps.${e}.create_child`,r);pt(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:Mt(u.repo,`$.steps.${e}.create_child.repo`,r)}:{},...u.workspace!==void 0?{workspace:Mt(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(pt(u,["runner"],`$.steps.${e}.agent`,r),u.runner!==void 0)try{l=k.runners.parse(Mt(u.runner,`$.steps.${e}.agent.runner`,r))}catch{r.push(`$.steps.${e}.agent.runner is unsupported.`)}}let c=Mt(t.prompt,`$.steps.${e}.prompt`,r);Buffer.byteLength(c)>kr&&r.push(`$.steps.${e}.prompt exceeds ${kr} bytes.`);let d;if(t.output!==void 0){let u=Ue(t.output,`$.steps.${e}.output`,r);pt(u,["schema"],`$.steps.${e}.output`,r),d=Zc(u.schema,`$.steps.${e}.output.schema`,r,0)}return{kind:"agent",id:e,needs:n,prompt:c,...o!==void 0?{task:o}:{},...a?{createChild:a}:{},...l?{runner:l}:{},...d?{outputSchema:d}:{}}}function jS(e,t,n,r){pt(t,["needs","human_review"],`$.steps.${e}`,r);let s=Ue(t.human_review,`$.steps.${e}.human_review`,r);pt(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);pt(o,["task"],`$.steps.${e}.human_review.feedback_target`,r),i=Mt(o.task,`$.steps.${e}.human_review.feedback_target.task`,r)}return{kind:"human_review",id:e,needs:n,title:Mt(s.title,`$.steps.${e}.human_review.title`,r),summary:Mt(s.summary,`$.steps.${e}.human_review.summary`,r),...i?{feedbackTask:i}:{},...s.timeout!==void 0?{timeoutMs:ah(s.timeout,`$.steps.${e}.human_review.timeout`,r)}:{}}}function Zc(e,t,n,r){if(r>rh)return n.push(`${t} exceeds the maximum schema depth of ${rh}.`),{};let s=Ue(e,t,n);pt(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&&oh(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))Zc(l,`${t}.properties.${a}`,n,r+1)}return s.items!==void 0&&Zc(s.items,`${t}.items`,n,r+1),s}function qS(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 US(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(eh)],c=a.replace(eh,"");(c.includes("${{")||c.includes("}}"))&&r.push(`$.steps.${i.id} contains a malformed template expression.`);for(let d of l)BS(d[1].trim(),i,t,n,s,r)}}}function BS(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&&WS(t.id,l,a[2].slice(7).split("."),c.outputSchema,i)}function WS(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(!wo(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(!wo(a))return;i=a}}function eu(e){return Array.isArray(e)?`[${e.map(eu).join(",")}]`:wo(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${eu(e[t])}`).join(",")}}`:JSON.stringify(e)}function Ue(e,t,n){return wo(e)?e:(n.push(`${t} must be an object.`),{})}function pt(e,t,n,r){let s=new Set(t);for(let i of Object.keys(e))s.has(i)||r.push(`${n}.${i} is not supported.`)}function VS(e,t,n){let r=Mt(e,t,n);return wr.test(r)||n.push(`${t} must match ${wr}.`),r}function Mt(e,t,n){return typeof e=="string"&&e.trim().length>0?e:(n.push(`${t} must be a non-empty string.`),"")}function oh(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 sh(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 KS(e,t,n){return typeof e=="boolean"?e:(n.push(`${t} must be a boolean.`),!1)}function GS(e,t,n){return e==="string"||e==="number"||e==="boolean"?e:(n.push(`${t} must be string, number, or boolean.`),"string")}function ih(e,t){return typeof e===t&&(t!=="number"||Number.isFinite(e))}function ah(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>DS?(n.push(`${t} must be between 1ms and 7d.`),1):i}function HS(e,t){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} is invalid: ${t[0]}`,{details:{file:e,issues:[...new Set(t)]}})}var wo=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);import{readFile as YS,stat as zS}from"node:fs/promises";var JS=/\$\{\{\s*inputs\.([a-z][a-z0-9_-]{0,63})\s*\}\}/g;async function nu(e){let t=await lh(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 ru(e,t){let n=await lh(e),r=XS(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:eI(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 lh(e){let t;try{let n=await zS(e);if(!n.isFile())throw new Error("Path is not a regular file.");if(n.size>As)throw new Error(`Definition exceeds ${As} bytes.`);t=await YS(e,"utf8")}catch(n){throw new g("FURY_DEFINITION_INVALID",`Fury definition ${e} could not be read.`,{details:{file:e},cause:n})}return tu(Qc(t,e),e)}function XS(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]=QS(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 QS(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 ZS(e,t){return e.replace(JS,(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=ZS(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 eI(e,t,n){let r=`$.steps.${n}.prompt`,s=$n(e,t,r);if(Buffer.byteLength(s)>kr)throw new g("FURY_INPUT_INVALID",`Resolved ${r} exceeds ${kr} bytes.`,{details:{location:r,maxBytes:kr}});return s}import{createHash as ch}from"node:crypto";import tI from"node:path";import{mkdir as nI}from"node:fs/promises";var su={type:"system",component:"heartbeat"};async function un(e,t={}){await nI(e.orchestrationDir,{recursive:!0});let[n,r,s,i]=await Promise.all([S.listTasks(e,{includeClosed:!0}),t.agentObserver?Promise.resolve(null):Dt.listAgents(e),Wf(e),cI(e)]),o=r??Tt(n.tasks.filter(f=>f.status!=="closed"),t.agentObserver?.getSnapshots()??[],Date.now()),a=lI(i),l=a!==i,c=[],d=iu(s.filter(aI),f=>f.taskId),u=iu(s.filter(f=>f.type.startsWith("task.pr.")),f=>f.taskId),p=iu(s.filter(f=>f.type==="agent.state.changed"),f=>f.agentTabId);for(let f of n.tasks){let m=rI(f),y=d.get(f.id),T=au(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:ou(_,f.id,m.signature),type:_,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:su,data:{...m,changedFields:T?iI(T,m):[]}});c.push(A),R=A.id}a.tasks[f.id]={...m,eventId:R};let b=oI(f.prs),$=u.get(f.id),N=au($?.data)??a.pullRequests[f.id]??null,D=$?.id??a.pullRequests[f.id]?.eventId??null;if((N||b.associations.length>0)&&N?.signature!==b.signature){let _=Array.isArray(N?.associations)?N.associations.length:0,A=b.associations.length>_?"task.pr.linked":b.associations.length<_?"task.pr.unlinked":"task.pr.refreshed",w=await Le(e,{id:ou(A,f.id,b.signature),type:A,taskId:f.id,workspaceId:f.workspaceId||null,occurredAt:f.updatedAt,actor:su,data:b});c.push(w),D=w.id}a.pullRequests[f.id]={...b,eventId:D}}let h=new Map(o.tasks.map(f=>[f.taskId,f.state]));for(let f of o.agents){let m=p.get(f.tabId),y=au(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:ou("agent.state.changed",f.tabId,T),type:"agent.state.changed",taskId:f.taskId,agentTabId:f.tabId,actor:su,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(dh(e),a),c}function rI(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:uh(t)}}var sI=["status","title","runner","branch","lastCommitSha","checksStatus","checksLastRunAt","agentTabIds"];function iI(e,t){return sI.filter(n=>JSON.stringify(e[n])!==JSON.stringify(t[n]))}function oI(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:uh(t)}}function iu(e,t){let n=new Map;for(let r of e){let s=t(r);s&&n.set(s,r)}return n}var aI=e=>e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed",uh=e=>ch("sha256").update(JSON.stringify(e)).digest("hex"),ou=(...e)=>ch("sha256").update(e.join("\0")).digest("hex"),au=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null,dh=e=>tI.join(e.orchestrationDir,"event-reconciliation.json");function lI(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 cI(e){try{return await Ws(dh(e))}catch(t){if(t instanceof SyntaxError)return null;throw t}}async function uI(e,t){return await lu(e),await un(e),In(e,t)}async function dI(e,t,n){await lu(e);let r=await Dt.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 ph(n.pollIntervalMs??250,n.signal)}return{kind:"watchEvents",eventCount:i,lastSequence:o,cancelled:n.signal?.aborted??!1}}finally{r.close()}}async function pI(e,t,n){await lu(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 Dt.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=Tt([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 mI(t);let u=a-Date.now();if(u<=0)throw fI(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 ph(Math.min(250,u),n.signal)}}finally{s.close()}}async function lu(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 ph(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 fI=(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}}),mI=e=>new g("OPERATION_CANCELLED",`Cancelled while waiting for task ${e} agent state.`,{retryable:!0,details:{taskId:e,cancelled:!0}}),ko={list:uI,watch:dI,waitForTaskState:pI,reconcile:un};import{readFile as NI}from"node:fs/promises";import{mkdir as vI,readFile as Th,rm as bh}from"node:fs/promises";import{createConnection as CI}from"node:net";import AI from"node:path";import{spawn as kI}from"node:child_process";import{closeSync as TI,openSync as bI}from"node:fs";import uu from"node:path";import{accessSync as hI,constants as gI}from"node:fs";import{homedir as fh}from"node:os";import dn from"node:path";var yI=[dn.join(fh(),".local","bin"),dn.join(fh(),".cursor","bin"),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"];function hh(e=process.env){return wI([...(e.PATH??"").split(dn.delimiter).filter(t=>t.length>0),...e.CRAIG_DISABLE_COMMAND_PATH_FALLBACKS==="1"?[]:yI])}function To(e=process.env){return{...e,PATH:hh(e).join(dn.delimiter)}}function cu(e,t={}){if(e.includes(dn.sep)){let n=dn.isAbsolute(e)?e:dn.resolve(t.cwd??process.cwd(),e);return mh(n)?n:null}for(let n of hh(t.env)){let r=dn.join(n,e);if(mh(r))return r}return null}function bo(e,t={}){let n=cu(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 mh(e){try{return hI(e,gI.X_OK),!0}catch{return!1}}function wI(e){return[...new Set(e)]}function Ro(e,t){if(t){t(e.workspaceRoot);return}let{command:n,args:r}=RI(e.workspaceRoot),s=bI(uu.join(e.runtimeDir,"pty-daemon.log"),"a");(()=>{try{return kI(n,r,{cwd:e.workspaceRoot,detached:!0,stdio:["ignore",s,s],env:process.env})}finally{TI(s)}})().unref()}function RI(e){let t=process.argv[1];if(t?.endsWith(".ts")){let n=uu.resolve(uu.dirname(t),"..","node_modules",".bin","tsx");return{command:cu("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 gh,readFile as yh,rm as du,stat as wh,utimes as PI,writeFile as SI}from"node:fs/promises";import Es from"node:path";async function pu(e){let t=Es.join(e.runtimeDir,"orchestration-supervisor.lock","owner.json");try{let[n,r]=await Promise.all([yh(t,"utf8").then(i=>JSON.parse(i)),wh(t)]),s=Date.now()-r.mtimeMs;return n.protocolVersion===bt&&s>=-1e3&&s<5e3&&typeof n.pid=="number"&&kh(n.pid)}catch{return!1}}async function fu(e){let t=Es.join(e.runtimeDir,"orchestration-supervisor.lock");await gh(e.runtimeDir,{recursive:!0});try{await gh(t)}catch(r){if(!II(r))throw r;let s=await yh(Es.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await wh(t).catch(()=>null);if(typeof s?.pid=="number"&&!kh(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await du(t,{recursive:!0,force:!0}),fu(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await SI(Es.join(t,"owner.json"),JSON.stringify({pid:process.pid,protocolVersion:bt,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await du(t,{recursive:!0,force:!0}),r}let n=!1;return{async heartbeat(){if(n)return;let r=new Date;await PI(Es.join(t,"owner.json"),r,r)},async release(){n||(n=!0,await du(t,{recursive:!0,force:!0}))}}}function kh(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 II=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";async function Dn(e){let t=await So(Fe(e).socketPath).catch(()=>null);if(!t)return pu(e);try{let n=await Nn(t,{type:"ping"});return Qt(n.protocolVersion)?(await Nn(t,{type:"wakeOrchestration"}),!0):!1}catch{return pu(e)}finally{t.end()}}async function Po(e,t){if(t.length===0)return!0;let n=await So(Fe(e).socketPath).catch(()=>null);if(!n)return!1;try{let r=await Nn(n,{type:"ping"});if(!Qt(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 Ph(e,t){await EI(e);let n=await So(Fe(e).socketPath);try{let r=await Nn(n,{type:"ping"});if(!Qt(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 EI(e){let t=Fe(e),n=await Rh(t.socketPath).catch(()=>null);if(Qt(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 vI(e.runtimeDir,{recursive:!0});let r=await Th(t.pidPath,"utf8").catch(()=>null),s=Number(r?.trim());if(Number.isInteger(s)&&s>0&&OI(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([bh(t.socketPath,{force:!0}),bh(t.pidPath,{force:!0})]),Ro(e);let i=Date.now();for(;Date.now()-i<5e3;){let a=await Rh(t.socketPath).catch(()=>null);if(Qt(a?.protocolVersion))return;await new Promise(l=>setTimeout(l,50))}let o=await Th(AI.join(e.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${o?`
209
+ ${o.slice(-2e3)}`:""}`)}async function Rh(e){let t=await So(e);try{return await Nn(t,{type:"ping"})}finally{t.end()}}function OI(e){try{return process.kill(e,0),!0}catch{return!1}}var $I=1;function Nn(e,t){let n=$I++;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 So(e){return new Promise((t,n)=>{let r=CI(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function DI(e,t){await jI(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 MI(t.prompt,t.readStdin),o;try{o=await de.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 mu(e,o.command.id),o}async function mu(e,t){if((await de.show(e,t)).command.state==="delivered"||await Dn(e))return;let r=(await de.show(e,t)).command;if(r.state==="delivered")return;let s=r.state==="queued"?await de.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 _I(e,t){return de.show(e,t)}async function xI(e,t){return de.list(e,t)}async function FI(e,t){let n;try{n=await de.cancel(e,t,{type:"human",source:"cli",processId:process.pid})}catch(r){throw await Dn(e),r}return await Dn(e),n}async function LI(e,t,n){return de.wait(e,t,n)}async function MI(e,t){if(e.source==="inline")return e;if(e.source==="file")try{return{source:"file",text:await NI(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 jI(e){let t=await k.load(e);if(!k.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Prompt dispatch is a feature preview. Enable agentOrchestration before sending prompts.",{details:{preview:"agentOrchestration"}})}var Tr={send:DI,show:_I,list:xI,cancel:FI,wait:LI};function Io(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 qI=6e4;async function vo(e,t){return wc(e,t,{createTask:UI})}async function Sh(e,t,n,r={}){return yc(e,t,n,{...r,launchProvisioned:(s,i)=>Ih(e,s,i,!1)})}async function UI(e,t,n,r={}){return S.createTask(e,t,n,{...r,markStartedAfterLaunch:!1,launchProvisioned:(s,i)=>Ih(e,s,i,!0)})}async function Ih(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 Ph(e,{taskId:t.id,tabId:s.id,cwd:t.worktreePath,command:Io(r?s.command:t.runnerSession.command,s.runner??t.runner),...n?{env:n}:{}}),!r)return;let i=await de.create(e,{taskId:t.id,agentTabId:s.id,prompt:{source:"inline",text:t.prompt.value},delivery:"when-ready",timeoutMs:qI,idempotencyKey:`task-start:${t.id}`,actor:{type:"system",component:"orchestration-supervisor"}});await mu(e,i.command.id)}catch(i){throw await Po(e,[s.id]),i}}async function Co(e,t,n){let r=(await S.listTasks(e,{includeClosed:!0})).tasks,s=new Set([t]),i=!0;for(;i;){i=!1;for(let a of r)a.parentTaskId&&s.has(a.parentTaskId)&&!s.has(a.id)&&(s.add(a.id),i=!0)}let o=r.filter(a=>s.has(a.id)).flatMap(a=>a.ptyTabs.map(l=>l.id));try{let a=await Tc(e,t,n);if(!await Po(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 Po(e,o),a}}import{randomUUID as Ah}from"node:crypto";import{readFile as BI,realpath as vh}from"node:fs/promises";import hu from"node:path";var X={type:"system",component:"orchestration-supervisor"},WI=/\$\{\{\s*steps\.([a-z][a-z0-9_-]{0,63})\.(task_id|output(?:\.[A-Za-z0-9_-]+)*)\s*\}\}/g;async function VI(e,t,n,r,s,i){await yu(e);let o=await iv(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 Xe(e,i,"fury.plan",r)}let a=await ru(t,n);ov(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_${Ah()}`,planHash:Gl(c),createdBy:s,createdAt:l};await If(e,a.definitionHash,await BI(t,"utf8"));let u=await vf(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 KI(e,t,n){if(await yu(e),n.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can approve a Fury plan.",{});let r=await Ri(e,t),s={schemaVersion:1,planId:r.id,planHash:r.planHash,approvedBy:n,approvedAt:new Date().toISOString()},i=await Ef(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 GI(e,t,n,r){await yu(e);let s=await Ri(e,t);if((await Of(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 rt(e,await S.getTask(e,s.rootTaskId));let o=new Date,l={schemaVersion:1,id:`fury_${Ah()}`,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 $f(e,l);try{await ae(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 ee(c.run)||await Fn(e,c.run.id),{kind:"runFury",run:await ie(e,c.run.id),created:c.created}}async function HI(e,t){return{kind:"showFury",run:await ie(e,t)}}async function Eo(e,t={}){let n=await k.load(e),r=k.previews.isEnabled(n,"agentOrchestration");for(let s of await Pi(e))await YI(e,s.id,{...t,allowScheduling:r})}async function YI(e,t,n={}){let r=n.allowScheduling??k.previews.isEnabled(await k.load(e),"agentOrchestration"),s=await ie(e,t);if(await uv(e,s),ee(s)){s.cleanupPending&&await dv(e,s);return}if(s=await pv(e,s),Date.now()>=Date.parse(s.deadlineAt)){if(s=await Ce(e,t,a=>ee(a)?a:cv(a)),s.state!=="timed_out")return;for(let a of Object.values(s.stepRuns))a.reviewId&&await rs(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 ae(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 Ch(e,s,l);continue}l.state==="running"&&l.commandId&&i.get(l.commandId)?.state==="failed"&&(s=await Ao(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 Ao(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,d=>ee(d)?d:jt(d,l.id,{state:"timed_out",error:"Step timed out.",completedAt:new Date().toISOString(),completedBy:X})),s.stepRuns[l.id]?.state==="timed_out"&&await ae(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 rs(e,l.reviewId,d=>({...d,state:"timed_out",version:d.version+1,updatedAt:new Date().toISOString()})),s=await Ce(e,s.id,d=>ee(d)?d:jt(d,l.id,{state:"timed_out",error:"Review timed out.",completedAt:new Date().toISOString(),completedBy:X})),s.stepRuns[l.id]?.state==="timed_out"&&await ae(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 Oo(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 zI(e,s,l):r&&(s=await Ch(e,s,l),o+=1))}await lv(e,s.id)}async function Ch(e,t,n){let r=new Date;if(t=await Ce(e,t.id,i=>ee(i)?i:jt(i,n.id,{state:"running",startedAt:i.stepRuns[n.id]?.startedAt??r.toISOString(),deadlineAt:i.deadlineAt})),ee(t))return t;await ae(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)}
212
212
 
213
- ${QI(t.id,n.id,s.plan.outputSchema)}`;try{let o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await Io(e,{parentTaskId:t.rootTaskId,...s.plan.target.repo?{repoId:_n(s.plan.target.repo,t)}:{},...s.plan.target.workspace?{workspaceId:_n(s.plan.target.workspace,t)}:{},prompt:i,...s.plan.runner?{runner:s.plan.runner}:{},idempotencyKey:`fury:${t.id}:${n.id}`,fury:{runId:t.id,stepId:n.id}}),u=await S.getTask(e,c.taskId),d=u.ptyTabs.find(p=>p.kind==="agent");if(!d)throw new g("TASK_CONTEXT_CONFLICT",`Created task ${u.id} has no agent tab.`,{});o=u.id,a=d.id}else{o=_n(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 rt(e,c,se,u.id),a=u.id,l=(await ae.create(e,{taskId:o,agentTabId:a,prompt:{source:"inline",text:i},delivery:"when-ready",timeoutMs:Math.min(t.limits.timeoutMs,864e5),idempotencyKey:`fury:${t.id}:${n.id}`,actor:se})).command.id}return t=await ze(e,t.id,c=>dn(c,n.id,{taskId:o,agentTabId:a,commandId:l})),await ce(e,t,n.id,"fury.step.dispatched",se,{taskId:o,agentTabId:a,commandId:l}),t}catch(o){return Co(e,t.id,n.id,o instanceof Error?o.message:"Step dispatch failed.",se)}}async function qI(e,t,n){let r=n.plan.review,s=new Date,i=`review_${t.id.slice(5)}_${n.id}`,o=r.feedbackTask?_n(r.feedbackTask,t):null,a=o?Object.values(t.stepRuns).find(c=>c.taskId===o&&c.agentTabId):null,l={schemaVersion:1,id:i,runId:t.id,stepId:n.id,state:"waiting_for_review",title:_n(r.title,t),summary:_n(r.summary,t),feedbackTarget:o?{taskId:o,agentTabId:a?.agentTabId??null}:null,round:1,requestedAt:s.toISOString(),deadlineAt:new Date(Math.min(Date.parse(t.deadlineAt),s.getTime()+r.timeoutMs)).toISOString(),version:1,lastDecision:null,history:[],updatedAt:s.toISOString()};return await Of(e,l),t=await ze(e,t.id,c=>dn(c,n.id,{state:"waiting_for_review",reviewId:i,startedAt:s.toISOString(),deadlineAt:l.deadlineAt})),await ce(e,t,n.id,"fury.review.requested",se,{reviewId:i,title:l.title}),t}async function UI(e,t,n,r,s,i){let o=await pe(e,t),a=Ph(o,n);await Rh(e,a,s,i,"fury.step.complete"),zI(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await ze(e,t,c=>{if(vt(c)||c.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return dn(c,n,{state:"succeeded",output:r,completedAt:l,completedBy:s})}),await ce(e,o,n,"fury.step.succeeded",s,{taskId:a.taskId}),await xn(e,t),o=await pe(e,t),{kind:"completeFuryStep",run:o,step:o.stepRuns[n]}}async function BI(e,t,n,r,s,i){let o=await pe(e,t),a=Ph(o,n);await Rh(e,a,s,i,"fury.step.fail");let l=await Co(e,t,n,r,s);return await Eo(e,t,"failed",s),{kind:"failFuryStep",run:await pe(e,t),step:l.stepRuns[n]}}async function WI(e,t,n,r){let s=await pe(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury cancellation requires an agent capability.",{});await Xe(e,r,"fury.cancel",s.rootTaskId)}if(vt(s))return{kind:"cancelFury",run:s,changed:!1};let i=new Date().toISOString(),o=!1,a=await ze(e,t,c=>vt(c)?c:(o=!0,{...c,state:"cancelled",completedAt:i,updatedAt:i,stateChangedAt:i,stepRuns:Object.fromEntries(Object.entries(c.stepRuns).map(([u,d])=>[u,d.state==="succeeded"?d:{...d,state:"cancelled",completedAt:i,completedBy:n}]))}));if(!o)return{kind:"cancelFury",run:a,changed:!1};let l=await Je(e);for(let c of Object.values(a.stepRuns)){let u=c.commandId?l.find(d=>d.id===c.commandId):null;u?.state==="queued"&&await ae.cancel(e,u.id,n),c.taskId&&c.plan.target?.type==="create_child"&&await vo(e,c.taskId).catch(()=>{}),c.reviewId&&await ns(e,c.reviewId,d=>({...d,state:"cancelled",version:d.version+1,updatedAt:i}))}return await ce(e,a,null,"fury.run.cancelled",n,{}),{kind:"cancelFury",run:a,changed:o}}async function VI(e,t,n,r){let s=await pe(e,t);if(n.type==="agent"){if(!r)throw new g("CAPABILITY_DENIED","Fury resume requires an agent capability.",{});await Xe(e,r,"fury.resume",s.rootTaskId)}if(vt(s))throw new g("FURY_STATE_CONFLICT",`Cannot resume ${s.id} while it is ${s.state}.`,{});return await xn(e,t),await Mt(e),{kind:"resumeFury",run:await pe(e,t)}}async function KI(e,t,n){return await Fn(e),{kind:"listFuryReviews",reviews:(await Ri(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function GI(e,t){return await Fn(e),{kind:"showFuryReview",review:await ir(e,t)}}async function HI(e,t,n,r,s,i){let o=await ir(e,t),a=await pe(e,o.runId);if(n!=="resubmit"&&s.type!=="human")throw new g("CAPABILITY_DENIED","Only a human can decide a fury review.",{});if(n==="resubmit"&&s.type==="agent"){if(!o.feedbackTarget||s.taskId!==o.feedbackTarget.taskId||!i)throw new g("CAPABILITY_DENIED","Only the feedback-target agent can resubmit this review.",{});await Xe(e,i,"fury.review.resubmit",s.taskId)}if(!(n==="resubmit"?o.state==="changes_requested":o.state==="waiting_for_review"))throw new g("FURY_STATE_CONFLICT",`Review ${t} cannot ${n} while ${o.state}.`,{});if((n==="reject"||n==="request_changes")&&!r?.trim())throw new g("CLI_USAGE",`${n} requires a reason.`,{});if(n==="request_changes"&&!o.feedbackTarget)throw new g("FURY_STATE_CONFLICT",`Review ${t} has no feedback target.`,{});let c=null;if(n==="request_changes"){let h=await S.getTask(e,o.feedbackTarget.taskId),f=o.feedbackTarget.agentTabId?h.ptyTabs.find(y=>y.kind==="agent"&&y.id===o.feedbackTarget.agentTabId):h.ptyTabs.find(y=>y.kind==="agent");if(!f)throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${h.id} has no agent tab.`,{});c=(await ae.create(e,{taskId:h.id,agentTabId:f.id,prompt:{source:"inline",text:`Fury review changes requested:
213
+ ${av(t.id,n.id,s.plan.outputSchema)}`,o,a,l=null;if(s.plan.target?.type==="create_child"){let c=await vo(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 S.getTask(e,c.taskId),u=d.ptyTabs.find(p=>p.kind==="agent");if(!u)throw new g("TASK_CONTEXT_CONFLICT",`Created task ${d.id} has no agent tab.`,{});o=d.id,a=u.id,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 S.getTask(e,o),d=c.ptyTabs.find(p=>p.kind==="agent"&&(!s.plan.runner||(p.runner??c.runner)===s.plan.runner));if(!d)throw new g("TASK_CONTEXT_CONFLICT",s.plan.runner?`Task ${c.id} has no ${s.plan.runner} agent tab for fury step ${n.id}.`:`Task ${c.id} has no agent tab.`,{});await rt(e,c,X,d.id),a=d.id,l=(await de.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=>ee(c)?{...c,cleanupPending:!0}:jt(c,n.id,{taskId:o,agentTabId:a,commandId:l})),ee(t)||await ae(e,t,n.id,"fury.step.dispatched",X,{taskId:o,agentTabId:a,commandId:l}),t}catch(i){let o=await ie(e,t.id);return ee(o)?o:Ao(e,t.id,n.id,i instanceof Error?i.message:"Step dispatch failed.",X)}}async function zI(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 Zt(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 Df(e,c),t=await Ce(e,t.id,d=>ee(d)?{...d,cleanupPending:!0}:jt(d,n.id,{state:"waiting_for_review",reviewId:i,startedAt:c.requestedAt,deadlineAt:c.deadlineAt})),ee(t)||await ae(e,t,n.id,"fury.review.requested",X,{reviewId:i,title:c.title}),t}async function JI(e,t,n,r,s,i){let o=await ie(e,t),a=Oh(o,n);await Eh(e,a,s,i,"fury.step.complete"),sv(r,a.plan.outputSchema);let l=new Date().toISOString();return o=await Ce(e,t,c=>{if(ee(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 jt(c,n,{state:"succeeded",output:r,completedAt:l,completedBy:s})}),await ae(e,o,n,"fury.step.succeeded",s,{taskId:a.taskId}),await Fn(e,t),o=await ie(e,t),{kind:"completeFuryStep",run:o,step:o.stepRuns[n]}}async function XI(e,t,n,r,s,i){let o=await ie(e,t),a=Oh(o,n);await Eh(e,a,s,i,"fury.step.fail");let l=await Ao(e,t,n,r,s);return await Oo(e,t,"failed",s),await Fn(e,t),{kind:"failFuryStep",run:await ie(e,t),step:l.stepRuns[n]}}async function QI(e,t,n,r){let s=await ie(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(ee(s))return s.cleanupPending&&await Fn(e,t),{kind:"cancelFury",run:await ie(e,t),changed:!1};let i=new Date().toISOString(),o=!1,a=await Ce(e,t,l=>ee(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 ae(e,a,null,"fury.run.cancelled",n,{}),await Fn(e,t),{kind:"cancelFury",run:await ie(e,t),changed:o}):{kind:"cancelFury",run:a,changed:!1}}async function ZI(e,t,n,r){let s=await ie(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(ee(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 ie(e,t)}}async function ev(e,t,n){return{kind:"listFuryReviews",reviews:(await ss(e)).filter(s=>(!t||s.runId===t)&&(!n||s.state===n))}}async function tv(e,t){return{kind:"showFuryReview",review:await Zt(e,t)}}async function nv(e,t,n,r,s,i){let o=await Zt(e,t),a=await ie(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(ee(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),f=o.feedbackTarget.agentTabId?h.ptyTabs.find(y=>y.kind==="agent"&&y.id===o.feedbackTarget.agentTabId):h.ptyTabs.find(y=>y.kind==="agent");if(!f)throw new g("TASK_CONTEXT_CONFLICT",`Feedback task ${h.id} has no agent tab.`,{});c=(await de.create(e,{taskId:h.id,agentTabId:f.id,prompt:{source:"inline",text:`Fury review ${t} changes requested:
214
214
 
215
- ${r}`},delivery:"when-ready",timeoutMs:Math.min(a.limits.timeoutMs,864e5),idempotencyKey:`fury-review:${t}:${o.round}`,actor:s})).command.id}let 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 ns(e,t,h=>{if(!(n==="resubmit"?h.state==="changes_requested":h.state==="waiting_for_review")||h.version!==o.version)throw new g("FURY_STATE_CONFLICT",`Review ${t} changed concurrently.`,{});return{...h,state:p,round:n==="resubmit"?h.round+1:h.round,version:h.version+1,lastDecision:d,history:[...h.history,d],updatedAt:u}}),a=await ze(e,a.id,h=>{if(vt(h))throw new g("FURY_STATE_CONFLICT",`Run ${h.id} is ${h.state}.`,{});return dn(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 ce(e,a,o.stepId,`fury.review.${n}`,s,{reviewId:t,round:o.round,feedbackCommandId:c}),n==="reject"?await Eo(e,a.id,"failed",s):await xn(e,a.id),c&&await Mt(e),{kind:"actFuryReview",review:o,run:await pe(e,a.id)}}async function YI(e,t,n,r){await Fn(e),await pe(e,t);let s=n,i=0,o=0;for(;!r.signal?.aborted;){await xn(e,t);let a=await In(e,{typeGlob:"fury.*",...s?{after:s}:{}});for(let l of a.events.filter(c=>c.furyRunId===t))r.onEvent(l),i+=1;if(s=a.cursor.after??s,o=a.cursor.sequence,vt(await pe(e,t)))return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!1};await nv(250,r.signal)}return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!0}}function _n(e,t){return e.replace(xI,(n,r,s)=>{let i=t.stepRuns[r];if(!i||i.state!=="succeeded")throw new g("FURY_STATE_CONFLICT",`Step ${r} is not complete.`,{});if(s==="task_id")return i.taskId??"";let o=i.output;for(let a of s.split(".").slice(1))o=Dn(o)?o[a]:void 0;if(o===void 0)throw new g("FURY_OUTPUT_INVALID",`Step ${r} has no output at ${s}.`,{});return typeof o=="string"?o:JSON.stringify(o)})}function zI(e,t){if(!t){if(e!=null)throw new g("FURY_OUTPUT_INVALID","This step does not declare output.",{});return}let n=[];if(ud(e,t,"$",n),n.length)throw new g("FURY_OUTPUT_INVALID","Fury step output does not match its schema.",{details:{issues:n}})}function ud(e,t,n,r){let s=t.type;if(!(s==="null"?e===null:s==="array"?Array.isArray(e):s==="object"?Dn(e):s==="integer"?Number.isInteger(e):s==="number"?typeof e=="number"&&Number.isFinite(e):typeof e===s)){r.push(`${n} must be ${String(s)}.`);return}if(Array.isArray(t.enum)&&!t.enum.some(o=>JSON.stringify(o)===JSON.stringify(e))&&r.push(`${n} is not in enum.`),s==="object"&&Dn(e)){let o=Dn(t.properties)?t.properties:{};for(let a of Array.isArray(t.required)?t.required:[])typeof a=="string"&&!Object.hasOwn(e,a)&&r.push(`${n}.${a} is required.`);for(let[a,l]of Object.entries(e))Dn(o[a])?ud(l,o[a],`${n}.${a}`,r):t.additionalProperties===!1&&r.push(`${n}.${a} is not allowed.`)}s==="array"&&Array.isArray(e)&&Dn(t.items)&&e.forEach((o,a)=>ud(o,t.items,`${n}[${a}]`,r))}async function Rh(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 Ph(e,t){if(vt(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 JI(e,t){let[n,r]=await Promise.all([kh(ye(e).root),kh(t)]),s=dd.relative(n,r);if(!s||s.startsWith("..")||dd.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:ye(e).root}});return dd.join(".craig","fury",s)}function XI(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 QI(e,t,n){return n?`When the work is complete, report it explicitly with: craig fury step complete --run ${e} --step ${t} --output '<json matching ${JSON.stringify(n)}>' --json
215
+ ${r}
216
+
217
+ After revisions, resubmit with: craig fury review resubmit ${t} --summary '<revised summary>' --json
218
+ Only a human can approve this review.`},delivery:"when-ready",timeoutMs:Math.min(a.limits.timeoutMs,864e5),idempotencyKey:`fury-review:${t}:${o.round}`,actor:s})).command.id}let d=new Date().toISOString(),u={sequence:o.history.length+1,round:o.round,action:n,message:r,actor:s,feedbackCommandId:c,occurredAt:d},p=n==="approve"?"approved":n==="reject"?"rejected":n==="request_changes"?"changes_requested":"waiting_for_review";return o=await rs(e,t,h=>{if(!(n==="resubmit"?h.state==="changes_requested":h.state==="waiting_for_review")||h.version!==o.version||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 Ce(e,a.id,h=>{if(ee(h))throw new g("FURY_STATE_CONFLICT",`Run ${h.id} is ${h.state}.`,{});return jt(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 ae(e,a,o.stepId,`fury.review.${n}`,s,{reviewId:t,round:o.round,feedbackCommandId:c}),n==="reject"&&await Oo(e,a.id,"failed",s),await Fn(e,a.id),{kind:"actFuryReview",review:o,run:await ie(e,a.id)}}async function rv(e,t,n,r){await ie(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,ee(await ie(e,t)))return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!1};await fv(250,r.signal)}return{kind:"watchFury",eventCount:i,lastSequence:o,cancelled:!0}}function xn(e,t){return e.replace(WI,(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 sv(e,t){if(!t){if(e!=null)throw new g("FURY_OUTPUT_INVALID","This step does not declare output.",{});return}let n=[];if(gu(e,t,"$",n),n.length)throw new g("FURY_OUTPUT_INVALID","Fury step output does not match its schema.",{details:{issues:n}})}function gu(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])?gu(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)=>gu(o,t.items,`${n}[${a}]`,r))}async function Eh(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 Oh(e,t){if(ee(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 iv(e,t){let[n,r]=await Promise.all([vh(we(e).root),vh(t)]),s=hu.relative(n,r);if(!s||s.startsWith("..")||hu.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:we(e).root}});return hu.join(".craig","fury",s)}function ov(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 av(e,t,n){return n?`When the work is complete, report it explicitly with: craig fury step complete --run ${e} --step ${t} --output '<json matching ${JSON.stringify(n)}>' --json
216
219
  If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`:`When the work is complete, report it explicitly with: craig fury step complete --run ${e} --step ${t} --json
217
- If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function Co(e,t,n,r,s){let i=new Date().toISOString(),o=!1,a=await ze(e,t,l=>{if(l.stepRuns[n]?.state==="failed")return l;if(vt(l)||l.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,dn(l,n,{state:"failed",error:r,completedAt:i,completedBy:s})});return o&&await ce(e,a,n,"fury.step.failed",s,{reason:r}),a}function dn(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function ZI(e,t){let n=await pe(e,t),r=Object.values(n.stepRuns),s=r.every(i=>i.state==="succeeded")?"succeeded":r.some(i=>i.state==="failed"||i.state==="timed_out")?"failed":r.some(i=>i.state==="running")?"running":r.some(i=>i.state==="waiting_for_review"||i.state==="changes_requested")?"waiting_for_review":r.some(i=>i.state==="pending")?"running":n.state;await Eo(e,t,s,se)}async function Eo(e,t,n,r){let s=await pe(e,t);if(s.state===n)return s;let i=["succeeded","failed","cancelled","timed_out"].includes(n),o=new Date().toISOString(),a=await ze(e,t,l=>vt(l)?l:{...l,state:n,updatedAt:o,stateChangedAt:o,completedAt:i?o:null});return a.state!==n||await ce(e,a,null,`fury.run.${n}`,r,{state:n}),a}function ev(e){let t=new Date().toISOString();return{...e,state:"timed_out",updatedAt:t,stateChangedAt:t,completedAt:t,stepRuns:Object.fromEntries(Object.entries(e.stepRuns).map(([n,r])=>[n,r.state==="succeeded"?r:{...r,state:"timed_out",completedAt:t,completedBy:se}]))}}async function ce(e,t,n,r,s,i){let o=Dn(i)&&Number.isInteger(i.round)?`:round-${String(i.round)}`:"",a=n?t.stepRuns[n]:null,l=r==="fury.run.created"?t.createdAt:r.startsWith("fury.run.")?t.stateChangedAt:r==="fury.step.started"||r==="fury.review.requested"?a?.startedAt:r==="fury.step.dispatched"?`${a?.taskId??"task"}:${a?.commandId??"launch"}`:r.startsWith("fury.step.")?a?.completedAt:o||t.updatedAt;await Fe(e,{id:`${t.id}:${n??"run"}:${r}:${l??"unknown"}${o}`,furyRunId:t.id,furyStepId:n,taskId:n?t.stepRuns[n]?.taskId??t.rootTaskId:t.rootTaskId,type:r,occurredAt:typeof l=="string"&&Number.isFinite(Date.parse(l))?l:t.updatedAt,actor:s,data:i})}async function tv(e,t){await ce(e,t,null,"fury.run.created",t.actor,{state:"pending"}),t.state!=="pending"&&await ce(e,t,null,`fury.run.${t.state}`,se,{state:t.state});for(let n of Object.values(t.stepRuns)){if(n.startedAt&&await ce(e,t,n.id,"fury.step.started",se,{}),n.taskId&&await ce(e,t,n.id,"fury.step.dispatched",se,{taskId:n.taskId,agentTabId:n.agentTabId,commandId:n.commandId}),["succeeded","failed","timed_out","cancelled"].includes(n.state)&&await ce(e,t,n.id,`fury.step.${n.state}`,n.completedBy??se,{reason:n.error}),!n.reviewId)continue;let r=await ir(e,n.reviewId);await ce(e,t,n.id,"fury.review.requested",se,{reviewId:r.id,title:r.title});for(let s of r.history)await ce(e,t,n.id,`fury.review.${s.action}`,s.actor,{reviewId:r.id,round:s.round,feedbackCommandId:s.feedbackCommandId})}}async function Fn(e){if(!T.previews.isEnabled(await T.load(e),"agentOrchestration"))throw new g("CLI_USAGE","Fury execution is a feature preview. Enable agentOrchestration first.",{details:{preview:"agentOrchestration"}})}function vt(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function Dn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function nv(e,t){return new Promise(n=>{let r=()=>{clearTimeout(s),t?.removeEventListener("abort",r),n()},s=setTimeout(r,e);t?.addEventListener("abort",r,{once:!0})})}var qe={plan:FI,approve:LI,run:MI,show:jI,watch:YI,cancel:WI,resume:VI,completeStep:UI,failStep:BI,listReviews:KI,showReview:GI,actOnReview:HI,reconcile:Ao};import{access as rv,stat as sv}from"node:fs/promises";import iv from"node:path";import{constants as ov}from"node:fs";async function pd(e,t){let n=iv.resolve(e,t),r;try{r=await sv(n),await rv(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 av}from"node:net";async function Ih(e,t){let n=await cv(xe(e).socketPath).catch(()=>null);if(!n)return!1;try{return(await Sh(n,{type:"ping"})).protocolVersion!==Sn?!1:((await Sh(n,{type:"openFile",path:t})).deliveredCount??0)>0}catch{return!1}finally{n.end()}}var lv=1;function Sh(e,t){let n=lv++;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(`
218
- `);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})}
219
- `)})}function cv(e){return new Promise((t,n)=>{let r=av(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function Ch(e,t){switch(e.kind){case"addWorkspace":{let n=await Te.addWorkspace(t.paths,e.path),r=n.workspace.kind==="project"?n.workspace.discoveredRepoIds?.[0]??null:n.repos[0]?.id??null;return await fd(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await Te.repos.addRepo(t.paths,e.path);return await fd(t.paths,n.workspaceId,n.repo.id),n}case"listRepos":return Te.repos.listRegisteredRepos(t.paths);case"removeRepo":{let n=await Un({uiStateFile:t.paths.uiStateFile}),r=n?.selectedWorkspaceId?(await Ie(t.paths)).filter(i=>i.primaryRepoId===e.repoId).map(i=>i.id):[],s=await Te.repos.removeRepo(t.paths,e.repoId,{listTasks:S.listTasks});if(n){let i=r.includes(n.selectedWorkspaceId??""),o=n.selectedRepoId===e.repoId;i?await gt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await gt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return Te.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await Te.archiveWorkspace(t.paths,e.workspaceId);return await pv(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await Te.restoreWorkspace(t.paths,e.workspaceId);return await fd(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return Te.removeWorkspace(t.paths,e.workspaceId,{listTasks:S.listTasks});case"createTask":return yh(t.paths,e.repoId??e.workspaceId??"",e.prompt,{...e.runner?{runner:e.runner}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}});case"createChildTask":{let n=await T.load(t.paths);if(!T.previews.isEnabled(n,"agentOrchestration"))throw new g("CLI_USAGE","Child delegation is a feature preview. Enable agentOrchestration before creating child tasks.",{details:{preview:"agentOrchestration"}});return Ln(t),Io(t.paths,{parentTaskId:e.parentTaskId??jt(t).task.id,...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{},prompt:e.prompt,...e.runner?{runner:e.runner}:{},...e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:{},...t.agentCapabilityId?{capabilityId:t.agentCapabilityId}:{}})}case"listTaskChildren":return Ln(t),yc(t.paths,e.taskId??jt(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return Ln(t),vo(t.paths,e.taskId??jt(t).task.id,t.agentCapabilityId);case"validateFury":return await vh(t),ed(md.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await vh(t),qe.plan(t.paths,md.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??jt(t).task.id,un(t),t.agentCapabilityId);case"approveFury":return qe.approve(t.paths,e.planId,un(t));case"runFury":return Ln(t),qe.run(t.paths,e.planId,un(t),t.agentCapabilityId);case"showFury":return qe.show(t.paths,e.runId);case"watchFury":return qe.watch(t.paths,e.runId,e.after,{...t.signal?{signal:t.signal}:{},onEvent:t.emitEvent??(()=>{})});case"cancelFury":return qe.cancel(t.paths,e.runId,un(t),t.agentCapabilityId);case"resumeFury":return qe.resume(t.paths,e.runId,un(t),t.agentCapabilityId);case"completeFuryStep":return Ln(t),qe.completeStep(t.paths,e.runId,e.stepId,await uv(e.output,t),un(t),t.agentCapabilityId);case"failFuryStep":return Ln(t),qe.failStep(t.paths,e.runId,e.stepId,e.reason,un(t),t.agentCapabilityId);case"listFuryReviews":return qe.listReviews(t.paths,e.runId,e.state);case"showFuryReview":return qe.showReview(t.paths,e.reviewId);case"actFuryReview":return Ln(t),qe.actOnReview(t.paths,e.reviewId,e.action,e.message??null,un(t),t.agentCapabilityId);case"listTasks":return e.repoId||e.workspaceId?S.listTasks(t.paths,{...e.repoId?{repoId:e.repoId}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{}}):S.listTasks(t.paths);case"currentTask":{let n=jt(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"renameTask":return S.renameTask(t.paths,e.taskId??jt(t).task.id,e.title);case"addTaskLink":return S.addTaskLink(t.paths,e.taskId,e.repoId);case"addTaskRepoTarget":return S.addTaskRepoTarget(t.paths,e.taskId,e.repoId);case"listTaskLinks":return S.listTaskLinks(t.paths,e.taskId);case"openFile":{let n=await T.load(t.paths);if(!T.previews.isEnabled(n,"fileOpen"))throw new g("CLI_USAGE","Opening files in the Craig TUI is a feature preview. Enable fileOpen before using this command.",{details:{preview:"fileOpen"}});let r=await pd(t.cwd??process.cwd(),e.path),s=await Ih(t.paths,r);if(!s)throw new g("EXTERNAL_DEPENDENCY_FAILED","No compatible Craig TUI is connected to this workspace. Restart Craig and try again.",{retryable:!0,details:{path:r}});return{kind:"openFile",path:r,delivered:s}}case"refreshInteractiveState":throw new Error("Interactive refresh should be handled by the interactive app.");case"showTask":return S.showTask(t.paths,e.taskId);case"showCurrentTask":return S.showTask(t.paths,jt(t).task.id);case"showTaskPr":return S.prs.show(t.paths,Mn(e.taskId,t),e.repoId);case"discoverTaskPr":return S.prs.discover(t.paths,Mn(e.taskId,t),e.repoId);case"linkTaskPr":return S.prs.link(t.paths,Mn(e.taskId,t),e.pullRequest,e.repoId);case"refreshTaskPr":return S.prs.refreshAssociation(t.paths,Mn(e.taskId,t),e.repoId);case"unlinkTaskPr":return S.prs.unlink(t.paths,Mn(e.taskId,t),e.pullRequest,e.repoId);case"listAgents":return Nt.listAgents(t.paths,e.taskId);case"showAgentStatus":return Nt.showAgentStatus(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.tabId?{tabId:e.tabId}:{}});case"waitTask":{let n={states:e.states,timeoutMs:e.timeoutMs,...e.tabId?{tabId:e.tabId}:{},...t.signal?{signal:t.signal}:{}},r=Mn(e.taskId,t),s=await T.load(t.paths);return T.previews.isEnabled(s,"agentOrchestration")?wo.waitForTaskState(t.paths,r,n):Nt.waitForTask(t.paths,r,n)}case"listEvents":return wo.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return wo.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 S.showTask(t.paths,Rr(t,"show"));case"streamTaskLogs":return S.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return S.prepareTaskLogs(t.paths,Rr(t,"logs"));case"showTaskDiff":return S.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return S.showTaskDiff(t.paths,Rr(t,"diff"));case"openTask":return S.openTask(t.paths,e.taskId);case"openSelectedTask":return S.openTask(t.paths,Rr(t,"open"));case"runChecks":return S.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return S.runChecks(t.paths,Rr(t,"check"));case"commitTask":return S.commitTask(t.paths,e.taskId);case"commitSelectedTask":return S.commitTask(t.paths,Rr(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:va()};case"exit":return{kind:"exit"};default:return fv(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 vh(e){let t=await T.load(e.paths);if(!T.previews.isEnabled(t,"agentOrchestration"))throw new g("CLI_USAGE","Fury planning is a feature preview. Enable agentOrchestration before validating or planning a fury.",{details:{preview:"agentOrchestration"}})}function un(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=jt(e);if(!e.agentCapabilityId||!t.agentTabId)throw new g("CAPABILITY_DENIED","This agent session has no scoped capability.",{});return{type:"agent",taskId:t.task.id,agentTabId:t.agentTabId,capabilityId:e.agentCapabilityId.split(".",1)[0]}}async function uv(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await dv(md.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 fd(e,t,n){let r=await Un({uiStateFile:e.uiStateFile})??Vs();await gt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function pv(e,t){let n=await Un({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await gt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function fv(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 jt(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Mn(e,t){return e??jt(t).task.id}function mv(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Eh(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
+ If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>' --json`}async function Ao(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(ee(l)||l.stepRuns[n]?.state!=="running")throw new g("FURY_STATE_CONFLICT",`Step ${n} is no longer running.`,{});return o=!0,jt(l,n,{state:"failed",error:r,completedAt:i,completedBy:s})});return o&&await ae(e,a,n,"fury.step.failed",s,{reason:r}),a}function jt(e,t,n){let r=new Date().toISOString();return{...e,updatedAt:r,stepRuns:{...e.stepRuns,[t]:{...e.stepRuns[t],...n}}}}async function lv(e,t){let n=await ie(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 Oo(e,t,s,X)}async function Oo(e,t,n,r){let s=await ie(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=>ee(l)?l:{...l,state:n,updatedAt:o,stateChangedAt:o,completedAt:i?o:null,...["failed","cancelled","timed_out"].includes(n)?{cleanupPending:!0,cleanupError:null}:{}});return a.state!==n||await ae(e,a,null,`fury.run.${n}`,r,{state:n}),a}function cv(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 ae(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 uv(e,t){await ae(e,t,null,"fury.run.created",t.actor,{state:"pending"}),t.state!=="pending"&&await ae(e,t,null,`fury.run.${t.state}`,X,{state:t.state});for(let n of Object.values(t.stepRuns)){if(n.startedAt&&await ae(e,t,n.id,"fury.step.started",X,{}),n.taskId&&await ae(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 ae(e,t,n.id,`fury.step.${n.state}`,n.completedBy??X,{reason:n.error}),!n.reviewId)continue;let r=await Zt(e,n.reviewId);await ae(e,t,n.id,"fury.review.requested",X,{reviewId:r.id,title:r.title});for(let s of r.history)await ae(e,t,n.id,`fury.review.${s.action}`,s.actor,{reviewId:r.id,round:s.round,feedbackCommandId:s.feedbackCommandId})}}async function dv(e,t){try{let r=(await S.listTasks(e,{includeClosed:!0})).tasks.filter(a=>a.furyRunId===t.id&&(t.state==="cancelled"||t.stepRuns[a.furyStepId??""]?.state!=="succeeded")),s=new Set(r.map(a=>a.id)),i=new Set(Object.values(t.stepRuns).map(a=>a.commandId).filter(Boolean));for(let a of await Me(e))a.state==="queued"&&(i.has(a.id)||s.has(a.taskId))&&await de.cancel(e,a.id,X);for(let a of r)await Co(e,a.id);for(let a of(await ss(e)).filter(l=>l.runId===t.id))await rs(e,a.id,l=>["waiting_for_review","changes_requested"].includes(l.state)?{...l,state:t.state==="timed_out"?"timed_out":"cancelled",version:l.version+1,updatedAt:new Date().toISOString()}:l);let o=await Ce(e,t.id,a=>({...a,cleanupPending:!1,cleanupError:null}));await ae(e,o,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 ae(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 pv(e,t){for(let n of Object.values(t.stepRuns)){if(!n.reviewId||n.kind!=="human_review")continue;let r=await Zt(e,n.reviewId),s=r.state==="approved"?"succeeded":r.state==="rejected"?"failed":r.state;n.state!==s&&(t=await Ce(e,t.id,i=>ee(i)?i:jt(i,n.id,{state:s,completedBy:r.lastDecision?.actor??X,...["succeeded","failed","timed_out","cancelled"].includes(s)?{completedAt:r.updatedAt}:{}})))}return t}async function yu(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 ee(e){return["succeeded","failed","cancelled","timed_out"].includes(e.state)}function _n(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function fv(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:VI,approve:KI,run:GI,show:HI,watch:rv,cancel:QI,resume:ZI,completeStep:JI,failStep:XI,listReviews:ev,showReview:tv,actOnReview:nv,reconcile:Eo};import{access as mv,stat as hv}from"node:fs/promises";import gv from"node:path";import{constants as yv}from"node:fs";async function wu(e,t){let n=gv.resolve(e,t),r;try{r=await hv(n),await mv(n,yv.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 wv}from"node:net";async function Nh(e,t){let n=await Tv(Fe(e).socketPath).catch(()=>null);if(!n)return!1;try{return(await $h(n,{type:"ping"})).protocolVersion!==bt?!1:((await $h(n,{type:"openFile",path:t})).deliveredCount??0)>0}catch{return!1}finally{n.end()}}var kv=1;function $h(e,t){let n=kv++;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 Tv(e){return new Promise((t,n)=>{let r=wv(e);r.once("connect",()=>t(r)),r.once("error",n)})}async function _h(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 ku(t.paths,n.workspace.id,r),n}case"addRepo":{let n=await be.repos.addRepo(t.paths,e.path);return await ku(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 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 gt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null,selectedWorkspaceId:null,selectedTaskId:null}):o&&await gt({uiStateFile:t.paths.uiStateFile},{...n,selectedRepoId:null})}return s}case"listWorkspaces":return be.listWorkspaces(t.paths,{archived:e.archived});case"archiveWorkspace":{let n=await be.archiveWorkspace(t.paths,e.workspaceId);return await Pv(t.paths,e.workspaceId),n}case"restoreWorkspace":{let n=await be.restoreWorkspace(t.paths,e.workspaceId);return await ku(t.paths,e.workspaceId,n.primaryRepoId),n}case"removeWorkspace":return be.removeWorkspace(t.paths,e.workspaceId,{listTasks:S.listTasks});case"createTask":return Sh(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),vo(t.paths,{parentTaskId:e.parentTaskId??qt(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),kc(t.paths,e.taskId??qt(t).task.id,t.agentCapabilityId);case"cancelTaskTree":return Ln(t),Co(t.paths,e.taskId??qt(t).task.id,t.agentCapabilityId);case"validateFury":return await Dh(t),nu(Tu.resolve(t.cwd??process.cwd(),e.file));case"planFury":return await Dh(t),Be.plan(t.paths,Tu.resolve(t.cwd??process.cwd(),e.file),e.inputs,e.rootTaskId??qt(t).task.id,pn(t),t.agentCapabilityId);case"approveFury":return Be.approve(t.paths,e.planId,pn(t));case"runFury":return Ln(t),Be.run(t.paths,e.planId,pn(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,pn(t),t.agentCapabilityId);case"resumeFury":return Be.resume(t.paths,e.runId,pn(t),t.agentCapabilityId);case"completeFuryStep":return Ln(t),Be.completeStep(t.paths,e.runId,e.stepId,await Rv(e.output,t),pn(t),t.agentCapabilityId);case"failFuryStep":return Ln(t),Be.failStep(t.paths,e.runId,e.stepId,e.reason,pn(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,pn(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=qt(t);return{kind:"currentTask",task:n.task,context:{source:n.source,agentTabId:n.agentTabId}}}case"renameTask":return S.renameTask(t.paths,e.taskId??qt(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 wu(t.cwd??process.cwd(),e.path),s=await Nh(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,qt(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 Dt.listAgents(t.paths,e.taskId);case"showAgentStatus":return Dt.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")?ko.waitForTaskState(t.paths,r,n):Dt.waitForTask(t.paths,r,n)}case"listEvents":return ko.list(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}});case"watchEvents":return ko.watch(t.paths,{...e.taskId?{taskId:e.taskId}:{},...e.typeGlob?{typeGlob:e.typeGlob}:{},...e.after?{after:e.after}:{}},{onEvent:t.emitEvent??(()=>{}),...t.signal?{signal:t.signal}:{}});case"sendAgentPrompt":return Tr.send(t.paths,{taskId: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 Tr.show(t.paths,e.commandId);case"listPromptCommands":return Tr.list(t.paths,e.taskId);case"cancelPromptCommand":return Tr.cancel(t.paths,e.commandId);case"waitPromptCommand":return Tr.wait(t.paths,e.commandId,{...e.states?{states:e.states}:{},timeoutMs:e.timeoutMs,...t.signal?{signal:t.signal}:{}});case"showSelectedTask":return S.showTask(t.paths,br(t,"show"));case"streamTaskLogs":return S.prepareTaskLogs(t.paths,e.taskId);case"streamSelectedTaskLogs":return S.prepareTaskLogs(t.paths,br(t,"logs"));case"showTaskDiff":return S.showTaskDiff(t.paths,e.taskId);case"showSelectedTaskDiff":return S.showTaskDiff(t.paths,br(t,"diff"));case"openTask":return S.openTask(t.paths,e.taskId);case"openSelectedTask":return S.openTask(t.paths,br(t,"open"));case"runChecks":return S.runChecks(t.paths,e.taskId);case"runSelectedTaskChecks":return S.runChecks(t.paths,br(t,"check"));case"commitTask":return S.commitTask(t.paths,e.taskId);case"commitSelectedTask":return S.commitTask(t.paths,br(t,"commit"));case"showContext":{let n=Iv(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:Aa()};case"exit":return{kind:"exit"};default:return Sv(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 Dh(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 pn(e){if(!e.agentContext)return{type:"human",source:"cli",processId:process.pid};let t=qt(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 Rv(e,t){if(!e)return null;let n;if(e.source==="inline")n=e.text;else if(e.source==="file")n=await bv(Tu.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 ku(e,t,n){let r=await Un({uiStateFile:e.uiStateFile})??Ks();await gt({uiStateFile:e.uiStateFile},{...r,selectedWorkspaceId:t,selectedRepoId:n,selectedTaskId:null})}async function Pv(e,t){let n=await Un({uiStateFile:e.uiStateFile});n?.selectedWorkspaceId===t&&await gt({uiStateFile:e.uiStateFile},{...n,selectedWorkspaceId:null,selectedRepoId:null,selectedTaskId:null})}function Sv(e){throw new Error(`Unsupported command: ${JSON.stringify(e)}`)}function br(e,t){if(e.selectedTaskId)return e.selectedTaskId;throw new Error(`No task selected. Create a task with 'task new --repo <repo-id> <prompt>' or use '${t} <id>'.`)}function qt(e){if(e.taskContext)return e.taskContext;throw new Error("Command requires resolved task context.")}function Mn(e,t){return e??qt(t).task.id}function Iv(e){if(e.workspaceContext)return e.workspaceContext;throw new Error("Command requires resolved workspace context.")}function Fh(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
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(`
221
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(`
222
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(`
@@ -226,66 +229,67 @@ If it fails, run: craig fury step fail --run ${e} --step ${t} --reason '<reason>
226
229
  `);case"cancelTaskTree":return[`Cancelled task tree ${e.taskId}`,...e.cancelled.map(t=>`${t.taskId}: ${t.disposition}`)].join(`
227
230
  `);case"validateFury":return[`Valid fury ${e.name}`,`Definition: ${e.definitionHash}`,`Steps: ${e.stepCount}`,`Order: ${e.order.join(" -> ")}`].join(`
228
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(`
229
- `);case"approveFury":return`${e.created?"Approved":"Already approved"} fury plan ${e.plan.id}: ${e.plan.planHash}`;case"runFury":return`${e.created?"Started":"Found"} fury ${e.run.id}: ${e.run.state}`;case"showFury":case"cancelFury":case"resumeFury":return hv(e.run);case"completeFuryStep":case"failFuryStep":return`${e.run.id} step ${e.step.id}: ${e.step.state}`;case"listFuryReviews":return e.reviews.length===0?"No fury reviews found.":["ID RUN STEP STATE ROUND TITLE",...e.reviews.map(t=>`${t.id} ${t.runId} ${t.stepId} ${t.state} ${t.round} ${t.title}`)].join(`
230
- `);case"showFuryReview":return Ah(e.review);case"actFuryReview":return`${Ah(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 vv(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 xh(e.review);case"actFuryReview":return`${xh(e.review)}
231
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(`
232
235
  `);case"addTaskRepoTarget":return[`${e.disposition==="added"?"Added":"Found"} repo target ${e.repoId} for task ${e.taskId}`,`Branch: ${e.branch}`,`Worktree: ${e.worktreePath}`].join(`
233
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(`
234
- `);case"help":return e.text;case"exit":return"";case"listTasks":return e.tasks.length===0?`No Craig tasks yet. Use 'task new --repo <repo-id> <prompt>' to create one.${e.missingTaskIds.length>0?` (${e.missingTaskIds.length} referenced task file(s) missing from .craig/tasks)`:""}`:["ID REPO STATUS CHECKS PR TITLE",...e.tasks.map(t=>`${t.id} ${t.repoId} ${t.status} ${bv(t)} ${Rv(t)} ${t.title}`)].join(`
235
- `);case"showTask":return[`${e.task.id}: ${e.task.title}`,`Status: ${e.task.status}`,`Runner: ${e.task.runner}`,`Repo: ${e.task.repoId}`,`Workspace: ${e.task.workspaceId}`,`Branch: ${e.task.branch}`,`Worktree: ${e.task.worktreePath}`,`Agent tab: ${e.task.ptyTabs.find(t=>t.kind==="agent")?.id??"<missing>"}`,`Linked repos: ${e.task.linkedRepoIds.length>0?e.task.linkedRepoIds.join(", "):"none"}`,`Prompt: ${e.task.prompt.source} ${JSON.stringify(e.task.prompt.value)}`,`Runner command: ${e.inspection.runnerCommandText||"<none>"}`,`Runner state: ${e.task.runnerSession.lastKnownState}`,`Started: ${e.task.runnerSession.startedAt??"not started"}`,`Exited: ${e.task.runnerSession.exitedAt??"still running"}`,`Checks: ${e.inspection.checksSummary}`,`Last commit: ${e.inspection.lastCommitSummary}`,`PR: ${e.inspection.prSummary}`,`Cleanup: ${e.inspection.cleanupSummary}`,...kv(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} ${Nv(t)} ${Dv(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}`,...Ov(e)].join(`
236
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(`
237
- `);case"renameTask":return`Renamed task ${e.taskId} from ${JSON.stringify(e.previousTitle)} to ${JSON.stringify(e.title)}.`;case"showTaskPr":case"discoverTaskPr":case"linkTaskPr":case"refreshTaskPr":case"unlinkTaskPr":return wv(e);case"listAgents":case"showAgentStatus":return yv(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(hd).join(`
238
- `);case"watchEvents":return"";case"sendAgentPrompt":return`${e.created?"Queued":"Found"} command ${e.command.id} for task ${e.command.taskId} tab ${e.command.agentTabId}.`;case"showPromptCommand":return gv(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 Ev(e);case"listAgents":case"showAgentStatus":return Av(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(bu).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 Cv(e.command);case"listPromptCommands":return e.commands.length===0?"No prompt commands found.":["ID TASK TAB STATE DELIVERY ATTEMPTS",...e.commands.map(t=>`${t.id} ${t.taskId} ${t.agentTabId} ${t.state} ${t.delivery} ${t.attempts}`)].join(`
239
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(`
240
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(`
241
- `);default:return Tv(e)}}function hv(e){return[`${e.id}: ${e.state}`,`Definition: ${e.name} (${e.definitionHash})`,`Root task: ${e.rootTaskId}`,...e.order.map(t=>{let n=e.stepRuns[t];return`${t}: ${n.state}${n.taskId?` (${n.taskId})`:""}${n.error?` - ${n.error}`:""}`})].join(`
242
- `)}function Ah(e){return[`${e.id}: ${e.state}`,`Run: ${e.runId}`,`Step: ${e.stepId}`,`Round: ${e.round}`,`Title: ${e.title}`,`Summary: ${e.summary}`,`Deadline: ${e.deadlineAt}`].join(`
243
- `)}function gv(e){return[`${e.id}: ${e.state}`,`Task: ${e.taskId}`,`Agent tab: ${e.agentTabId}`,`Delivery: ${e.delivery}`,`Attempts: ${e.attempts}`,`Prompt source: ${e.prompt.source}`,`Prompt bytes: ${Buffer.byteLength(e.prompt.text)}`,`Created: ${e.createdAt}`,`Updated: ${e.updatedAt}`,`Error: ${e.lastError?.message??"none"}`].join(`
244
- `)}function hd(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function yv(e){return e.agents.length===0?"No agent tabs found.":["TASK TAB RUNNER STATE SESSION ERROR",...e.agents.map(t=>`${t.taskId} ${t.tabId} ${t.runner} ${t.state} ${t.sessionState??"none"} ${t.error??""}`),...e.daemonAvailable?[]:["Warning: PTY daemon unavailable; live agent tabs report idle unless a durable startup failure exists."]].join(`
245
- `)}function wv(e){let t=`${e.taskId} (${e.repoId}): ${e.disposition}`,n=e.pullRequests.length===0?["No pull requests associated."]:["PR STATUS HEAD URL",...e.pullRequests.map(r=>`#${r.number??"-"} ${r.status??"unknown"} ${r.headBranch??"-"} ${r.url??"-"}`)];return[t,...n,...e.warnings.map(r=>`Warning: ${r}`)].join(`
246
- `)}function kv(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 Tv(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function bv(e){return e.checks.status}function Rv(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 Oh(e,t){let{data:n,warnings:r}=Pv(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:n,warnings:r})}function Pv(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...n}=e;return{data:n,warnings:t}}return{data:e,warnings:[]}}function $h(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 gd(e){let t=await Te.resolveContext({cwd:e.cwd,...e.explicitWorkspaceRoot!==void 0?{explicitWorkspaceRoot:e.explicitWorkspaceRoot}:{},...e.environmentWorkspaceRoot!==void 0?{environmentWorkspaceRoot:e.environmentWorkspaceRoot}:{},...e.allowUninitializedWorkspace!==void 0?{allowUninitializedCwd:e.allowUninitializedWorkspace}:{}}),n=Ee(t.workspaceRoot),r=e.resolveTask===!0||e.requireTask===!0||e.explicitTaskId!==void 0||e.environmentTaskId!==void 0||e.environmentAgentTabId!==void 0;if(r&&!t.initialized)throw new g("TASK_CONTEXT_NOT_FOUND",`Task context cannot be resolved because ${t.workspaceRoot} is not an initialized Craig workspace.`,{details:{workspaceRoot:t.workspaceRoot}});let s=r&&t.initialized?await S.resolveContext(n,{cwd:e.cwd,...e.explicitTaskId!==void 0?{explicitTaskId:e.explicitTaskId}:{},...e.environmentTaskId!==void 0?{environmentTaskId:e.environmentTaskId}:{},...e.environmentAgentTabId!==void 0?{environmentAgentTabId:e.environmentAgentTabId}:{},...e.requireTask!==void 0?{required:e.requireTask}:{}}):null;return{paths:n,workspace:t,task:s}}async function Nh(e){let t="cli",n=Xu(e.argv);try{let r=Ju(e.argv);if(n=r.options.json,r.mode==="interactive"){if(r.options.noInput||r.options.json||$v(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 gd({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.",{});vv(r.command,r.options.taskId);let s=Av(r.command,r.options.taskId),i=Iv(s);Cv(s,r.options.taskId,i);let o=i!=="none",a=await gd({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:Sv(s),resolveTask:i!=="none",requireTask:i==="required"}),l=Ev(s,e.signal),c;try{c=await Ch(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):hd(d)}
247
- `)}:{},...e.readStdin?{readStdin:e.readStdin}:{},...e.env.CRAIG_AGENT_TAB_ID?{agentContext:!0}:{},...e.env.CRAIG_AGENT_CAPABILITY?{agentCapabilityId:e.env.CRAIG_AGENT_CAPABILITY}:{}})}finally{l.dispose()}let u=n?Oh(t,c):Eh(c);return u.length>0&&e.writeStdout(`${u}
248
- `),0}catch(r){let s=Pa(r),i=n?$h(t,s):s.message;return e.writeStderr(`${i}
249
- `),s.exitCode}}function Sv(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function Iv(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"||Ov(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 vv(e,t){let n=Dh(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 Cv(e,t,n){if(!(t===void 0||n!=="none"||Dh(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 Dh(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 Av(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 Ev(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 Ov(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function $v(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as y0}from"node:module";import{readFile as Nv,stat as Dv}from"node:fs/promises";import yd from"node:path";var _v=200*1024,xv=500*1024,Oo="100000";async function xh(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return Fv(e,t,n);try{let r=pn(n.selectedFilePath??null,t.filePaths),s=pn(n.selectedDiffPath??null,t.diffPaths),i=s?await Cs(e.worktreePath):null,[o,a]=await Promise.all([No(e.worktreePath,r),s?wd(e.worktreePath,s,t.diffRows,i):Promise.resolve(Ce("No diff selected","No local changes found.","empty"))]),l=s?{[s]:a}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:l,selectedFile:o,selectedDiff:a,error:null}}catch(r){let s=r instanceof Error?r.message:"Unable to inspect task worktree.";return{...t,error:s}}}async function Fv(e,t,n){let r=pn(n.selectedFilePath??null,t.filePaths),s=pn(n.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([Lh(e,r),(async()=>{if(!s)return Ce("No diff selected","No local changes found.","empty");let l=$o(e,s),c=l?await Cs(l.target.worktreePath).catch(()=>null):null;return Mh(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function Fh(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return Lv(e,t);try{await ge(e);let n=await Cs(e.worktreePath),[r,s]=await Promise.all([jh(e.worktreePath),qh(e.worktreePath,n)]),i=[...new Set(s.map(d=>d.path))],o=pn(t.selectedFilePath??null,r),a=pn(t.selectedDiffPath??null,i),[l,c]=await Promise.all([No(e.worktreePath,o),a?wd(e.worktreePath,a,s,n):Promise.resolve(Ce("No diff selected","No local changes found.","empty"))]),u=a?{[a]:c}:{};return{taskId:e.id,fileRows:Kh(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:Ce("Files unavailable",r,"error"),selectedDiff:Ce("Diff unavailable",r,"error"),error:r}}}async function Lv(e,t){let n=(e.repoTargets??[]).filter(p=>p.status==="ready"),r=await Promise.all(n.map(async p=>{let h=await Cs(p.worktreePath).catch(()=>null),[f,m]=await Promise.all([jh(p.worktreePath).catch(()=>[]),qh(p.worktreePath,h).catch(()=>[])]);return{target:p,baseRef:h,targetFiles:f,targetDiffRows:m}})),s=[],i=[];for(let{target:p,targetFiles:h,targetDiffRows:f}of r)s.push(...h.map(m=>`${p.repoId}/${m}`)),i.push(...f.map(m=>({...m,path:`${p.repoId}/${m.path}`})));let o=[...new Set(i.map(p=>p.path))].sort(),a=pn(t.selectedFilePath??null,s),l=pn(t.selectedDiffPath??null,o),[c,u]=await Promise.all([Lh(e,a),(async()=>{if(!l)return Ce("No diff selected","No local changes found.","empty");let p=$o(e,l),h=p?r.find(f=>f.target.repoId===p.target.repoId):null;return Mh(e,l,i,h?.baseRef??null)})()]),d=l?{[l]:u}:{};return{taskId:e.id,fileRows:Kh(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:d,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:u,error:null}}async function Lh(e,t){let n=$o(e,t);if(!n)return Ce("No file selected","No Git-visible files found.","empty");let r=await No(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function Mh(e,t,n,r=null){let s=$o(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}:Ce(t,"Repo target is unavailable.","error",t)}function $o(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 jh(e){let t=await K("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return Gh(t.stdout)}async function qh(e,t){let[n,r,s,i]=await Promise.all([Mv(e,t),_h(e,"staged"),_h(e,"unstaged"),jv(e)]);return[...n,...r,...s,...i]}async function Mv(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=Uh(n.stdout),i=Bh(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 _h(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=Uh(r.stdout),o=Bh(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 jv(e){let t=await K("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=Gh(t.stdout);return await Promise.all(n.map(async s=>{let i=await No(e,s),o=i.status==="ready"?qv(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function Uh(e){return e.split(`
250
- `).map(t=>t.trim()).filter(t=>t.length>0).map(t=>{let[n="M",...r]=t.split(" ");return{status:n,path:r.at(-1)??""}}).filter(t=>t.path.length>0)}function Bh(e){let t=new Map;for(let n of e.split(`
251
- `)){let r=n.trim();if(!r)continue;let[s="-",i="-",...o]=r.split(" "),a=o.join(" ");a&&t.set(a,{additions:s==="-"?null:Number(s),deletions:i==="-"?null:Number(i)})}return t}async function Cs(e){return(await J("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await J("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function No(e,t){if(!t)return Ce("No file selected","No Git-visible files found.","empty");let n=Uv(e,t);return Vh(n,t)}async function Wh(e){return Vh(e,e)}async function Vh(e,t){try{let n=await Dv(e);if(n.size>_v)return Ce(t,`File is ${n.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,n.size);let r=await Nv(e);return Bv(r)?Ce(t,"Binary file preview is not available in Craig.","binary",t,r.byteLength):{path:t,status:"ready",title:t,lines:r.toString("utf8").split(`
252
- `),byteLength:r.byteLength}}catch(n){let r=n instanceof Error?n.message:"Unable to read file.";return Ce(t,r,"missing",t,null)}}async function wd(e,t,n,r=null){if(!t)return Ce("No diff selected","No local changes found.","empty");let s=[],i=n.filter(a=>a.path===t).map(a=>a.group);if(i.includes("branch")){let a=r??await Cs(e);if(a){let l=await K("git",["diff","--stat","--patch",`--unified=${Oo}`,`${a}...HEAD`,"--",t],{cwd:e});l.stdout.trim().length>0&&s.push(`branch
253
- ${l.stdout.trimEnd()}`)}}if(i.includes("staged")){let a=await K("git",["diff","--cached","--stat","--patch",`--unified=${Oo}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`staged
254
- ${a.stdout.trimEnd()}`)}if(i.includes("unstaged")){let a=await K("git",["diff","--stat","--patch",`--unified=${Oo}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
255
- ${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await J("git",["diff","--no-index","--stat","--patch",`--unified=${Oo}`,"--","/dev/null",t],{cwd:e});a.stdout.trim().length>0&&s.push(`untracked
244
+ `);default:return $v(e)}}function vv(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 xh(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 Cv(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 bu(e){return`${e.sequence} ${e.occurredAt} ${e.type} ${e.taskId??"-"}`}function Av(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 Ev(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 Ov(e){let t=[];return e.inspection.worktreeExists||e.task.status==="merged"&&!e.task.cleanup.preservedWorktree&&e.task.cleanup.worktreeRemovedAt||t.push(`Warning: worktree is missing at ${e.task.worktreePath}`),e.task.cleanup.warning&&!(e.task.status==="merged"&&!e.task.cleanup.worktreeRemovedAt)&&t.push(`Cleanup warning: ${e.task.cleanup.warning}`),e.task.artifacts.logPath&&!e.inspection.logExists&&t.push(`Warning: log file is missing at ${e.task.artifacts.logPath}`),e.inspection.recentFailureReason&&t.push(`Last failure: ${e.inspection.recentFailureReason}`),t}function $v(e){throw new Error(`Unsupported result: ${JSON.stringify(e)}`)}function Nv(e){return e.checks.status}function Dv(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 Lh(e,t){let{data:n,warnings:r}=_v(t);return JSON.stringify({schemaVersion:1,command:e,ok:!0,data:n,warnings:r})}function _v(e){if("warnings"in e&&Array.isArray(e.warnings)){let{warnings:t,...n}=e;return{data:n,warnings:t}}return{data:e,warnings:[]}}function Mh(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 Ru(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 jh(e){let t="cli",n=tp(e.argv);try{let r=ep(e.argv);if(n=r.options.json,r.mode==="interactive"){if(r.options.noInput||r.options.json||Bv(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 Ru({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.",{});Lv(r.command,r.options.taskId);let s=jv(r.command,r.options.taskId),i=Fv(s);Mv(s,r.options.taskId,i);let o=i!=="none",a=await Ru({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:xv(s),resolveTask:i!=="none",requireTask:i==="required"}),l=qv(s,e.signal),c;try{c=await _h(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):bu(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?Lh(t,c):Fh(c);return d.length>0&&e.writeStdout(`${d}
251
+ `),0}catch(r){let s=Ia(r),i=n?Mh(t,s):s.message;return e.writeStderr(`${i}
252
+ `),s.exitCode}}function xv(e){return["addWorkspace","addRepo","listRepos","listWorkspaces","help"].includes(e.kind)}function Fv(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"||Uv(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 Lv(e,t){let n=qh(e);if(!(n===void 0||t===void 0||t===n))throw new g("CLI_USAGE",`Task ${n} conflicts with --task ${t}. Provide only one task target.`,{details:{positionalTaskId:n,globalTaskId:t}})}function Mv(e,t,n){if(!(t===void 0||n!=="none"||qh(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 qh(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 jv(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 qv(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 Uv(e){return["showTaskPr","discoverTaskPr","linkTaskPr","refreshTaskPr","unlinkTaskPr"].includes(e.kind)}function Bv(e){let t=e.CI?.trim().toLowerCase();return t!==void 0&&t!==""&&t!=="0"&&t!=="false"}import{createRequire as P0}from"node:module";import{readFile as Wv,stat as Vv}from"node:fs/promises";import Pu from"node:path";var Kv=200*1024,Gv=500*1024,$o="100000";async function Bh(e,t,n){if(e.type==="project"&&e.repoTargets?.length)return Hv(e,t,n);try{let r=fn(n.selectedFilePath??null,t.filePaths),s=fn(n.selectedDiffPath??null,t.diffPaths),i=s?await Os(e.worktreePath):null,[o,a]=await Promise.all([Do(e.worktreePath,r),s?Su(e.worktreePath,s,t.diffRows,i):Promise.resolve(Ee("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 Hv(e,t,n){let r=fn(n.selectedFilePath??null,t.filePaths),s=fn(n.selectedDiffPath??null,t.diffPaths),[i,o]=await Promise.all([Vh(e,r),(async()=>{if(!s)return Ee("No diff selected","No local changes found.","empty");let l=No(e,s),c=l?await Os(l.target.worktreePath).catch(()=>null):null;return Kh(e,s,t.diffRows,c)})()]),a=s?{[s]:o}:{};return{...t,selectedFilePath:r,selectedDiffPath:s,diffContents:a,selectedFile:i,selectedDiff:o}}async function Wh(e,t={}){if(e.type==="project"&&e.repoTargets?.length)return Yv(e,t);try{await ye(e);let n=await Os(e.worktreePath),[r,s]=await Promise.all([Gh(e.worktreePath),Hh(e.worktreePath,n)]),i=[...new Set(s.map(u=>u.path))],o=fn(t.selectedFilePath??null,r),a=fn(t.selectedDiffPath??null,i),[l,c]=await Promise.all([Do(e.worktreePath,o),a?Su(e.worktreePath,a,s,n):Promise.resolve(Ee("No diff selected","No local changes found.","empty"))]),d=a?{[a]:c}:{};return{taskId:e.id,fileRows:Qh(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:Ee("Files unavailable",r,"error"),selectedDiff:Ee("Diff unavailable",r,"error"),error:r}}}async function Yv(e,t){let n=(e.repoTargets??[]).filter(p=>p.status==="ready"),r=await Promise.all(n.map(async p=>{let h=await Os(p.worktreePath).catch(()=>null),[f,m]=await Promise.all([Gh(p.worktreePath).catch(()=>[]),Hh(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=fn(t.selectedFilePath??null,s),l=fn(t.selectedDiffPath??null,o),[c,d]=await Promise.all([Vh(e,a),(async()=>{if(!l)return Ee("No diff selected","No local changes found.","empty");let p=No(e,l),h=p?r.find(f=>f.target.repoId===p.target.repoId):null;return Kh(e,l,i,h?.baseRef??null)})()]),u=l?{[l]:d}:{};return{taskId:e.id,fileRows:Qh(s),filePaths:s,diffRows:i,diffPaths:o,diffContents:u,selectedFilePath:a,selectedDiffPath:l,selectedFile:c,selectedDiff:d,error:null}}async function Vh(e,t){let n=No(e,t);if(!n)return Ee("No file selected","No Git-visible files found.","empty");let r=await Do(n.target.worktreePath,n.relativePath);return{...r,path:t,title:t??r.title}}async function Kh(e,t,n,r=null){let s=No(e,t);return s?{...await Su(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}:Ee(t,"Repo target is unavailable.","error",t)}function No(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 Gh(e){let t=await K("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e});return Zh(t.stdout)}async function Hh(e,t){let[n,r,s,i]=await Promise.all([zv(e,t),Uh(e,"staged"),Uh(e,"unstaged"),Jv(e)]);return[...n,...r,...s,...i]}async function zv(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=Yh(n.stdout),i=zh(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 Uh(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=Yh(r.stdout),o=zh(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 Jv(e){let t=await K("git",["ls-files","--others","--exclude-standard"],{cwd:e}),n=Zh(t.stdout);return await Promise.all(n.map(async s=>{let i=await Do(e,s),o=i.status==="ready"?Xv(i.lines):null;return{group:"untracked",path:s,status:"A",additions:o,deletions:0}}))}function Yh(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 zh(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 Os(e){return(await J("git",["show-ref","--verify","--quiet","refs/remotes/origin/main"],{cwd:e})).exitCode===0?"origin/main":(await J("git",["show-ref","--verify","--quiet","refs/heads/main"],{cwd:e})).exitCode===0?"main":null}async function Do(e,t){if(!t)return Ee("No file selected","No Git-visible files found.","empty");let n=Qv(e,t);return Xh(n,t)}async function Jh(e){return Xh(e,e)}async function Xh(e,t){try{let n=await Vv(e);if(n.size>Kv)return Ee(t,`File is ${n.size} bytes, above the 200 KB inline preview limit.`,"too_large",t,n.size);let r=await Wv(e);return Zv(r)?Ee(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 Ee(t,r,"missing",t,null)}}async function Su(e,t,n,r=null){if(!t)return Ee("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 Os(e);if(a){let l=await K("git",["diff","--stat","--patch",`--unified=${$o}`,`${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=${$o}`,"--",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=${$o}`,"--",t],{cwd:e});a.stdout.trim().length>0&&s.push(`unstaged
258
+ ${a.stdout.trimEnd()}`)}if(i.includes("untracked")){let a=await J("git",["diff","--no-index","--stat","--patch",`--unified=${$o}`,"--","/dev/null",t],{cwd:e});a.stdout.trim().length>0&&s.push(`untracked
256
259
  ${a.stdout.trimEnd()}`)}let o=s.join(`
257
260
 
258
- `);return o.length>xv?Ce(t,"Diff is above the 500 KB inline preview limit.","too_large",t,o.length):o.includes("\0")?Ce(t,"Binary diff preview is not available in Craig.","binary",t,o.length):{path:t,status:o.length>0?"ready":"empty",title:t,lines:o.length>0?o.split(`
259
- `):["No diff for this file."],byteLength:o.length}}function Kh(e){let t=[],n=new Set;for(let r of e){let s=r.split("/");for(let i=0;i<s.length-1;i+=1){let o=s.slice(0,i+1).join("/");n.has(o)||(n.add(o),t.push({kind:"directory",path:o,depth:i,label:s[i]??o}))}t.push({kind:"file",path:r,depth:s.length-1,label:s.at(-1)??r})}return t}function pn(e,t){return e&&t.includes(e)?e:t[0]??null}function qv(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function Gh(e){return[...new Set(e.split(`
260
- `).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function Uv(e,t){let n=yd.resolve(e,t),r=yd.resolve(e);if(n!==r&&!n.startsWith(`${r}${yd.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function Bv(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function Ce(e,t,n,r=null,s=null){return{path:r,status:n,title:e,lines:[t],byteLength:s}}var Wv=["tasks","center","inspector","actions"],Hh=["agent","terminal"],Yh=[],V="inspection",BV=[...Hh,...Yh],kd=["commit","push","refresh-checks","close-task"],zh=["refresh-checks","close-task"],Jh=["task","checks","pr","setup-run","actions","next-action"],Td=["files","review"];function Xh(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=zv(e?.openInspectionKind)??n,s=T.runners.getEnabled(t);return{inputMode:Xv(e?.inputMode),focusedRegion:Hv(e?.focusedRegion),selectedRepoId:qt(e?.selectedRepoId),selectedWorkspaceId:qt(e?.selectedWorkspaceId),selectedTaskId:qt(e?.selectedTaskId),selectedPtyTabId:qt(e?.selectedPtyTabId),selectedLeftItemId:sC(qt(e?.selectedTaskId)),activeTab:n?V:qt(e?.activeTab)??"agent",preferredPtyTabKind:Jv(e?.preferredPtyTabKind),inspectorSection:As(e?.inspectorSection,Jh,"task"),inspectionMode:Yv(e?.inspectionMode,n==="diff"?"review":"files"),openInspectionKind:r,selectedFileTreePath:qt(e?.selectedFileTreePath),selectedFilePath:qt(e?.selectedFilePath),selectedDiffPath:qt(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:As(e?.selectedActionId,kd,"commit"),selectedProjectTargetId:null,selectedRunner:Qv(e?.selectedRunner,s,T.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:Vv(),centerZoomed:!1,readAgentActivityAt:e?.readAgentActivityAt??{}}}function Vv(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function Do(e,t){return{...e??Vs(),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 Os(e,t,n={}){let r=nC(e,t),s=Rd(r),i=s?.kind==="task"?t.tasks.find(f=>f.id===s.id)??null:null,o=i?rC(t.tasks,i):null,a=Uo(r),l=qo(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?Fo(t.tasks,c.id):d?Lo(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,...Zv(h,e.activeTab,e.selectedPtyTabId),selectedFilePath:Gv(e,t,h?.id??null),...eC(e,t,h?.id??null),selectedDiffPath:Kv(e,t,h?.id??null),inspectorSection:As(e.inspectorSection,Jh,"task")}}function Ut(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 et(e){return e==="ENTER"||e==="KP_ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
261
- `}function bd(e){return e.length===1&&e>=" "&&e!=="\x7F"}function _o(e){return tg(e)||Pr(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 Kv(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function Gv(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function As(e,t,n){return t.includes(e??"")?e:n}function Hv(e){return e==="tabs"?"center":As(e,Wv,"tasks")}function Yv(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":As(e,Td,t)}function zv(e){return e==="file"||e==="diff"?e:null}function Jv(e){return e==="terminal"?"terminal":"agent"}function Xv(e){return e==="terminal"?"terminal":"control"}function Qv(e,t=[...yt],n="codex"){return e&&T.runners.isRunnerType(e)&&t.includes(e)?e:n}function xo(e,t=yt){let n=t.length>0?t:yt,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function Pr(e){let t=de.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function Zv(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 eC(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?tC(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function tC(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 nC(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 Es(Fo(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 Es(Lo(e.tasks,n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function Fo(e,t){return rg(e,n=>n.workspaceId===t)}function Lo(e,t){return rg(e,n=>n.repoId===t)}function rC(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 Es(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 Rd(e){return e?e.startsWith("workspace:")?{kind:"workspace",id:e.slice(10)}:e.startsWith("repo:")?{kind:"repo",id:e.slice(5)}:e.startsWith("task:")?{kind:"task",id:e.slice(5)}:null:null}function qt(e){return typeof e=="string"?e:null}function sC(e){return e?`task:${e}`:null}function $s(e){return typeof e=="string"&&e.startsWith("task:")}function Mo(e){return typeof e=="string"&&e.startsWith("new-task:")}function jo(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function sg(e){return typeof e=="string"&&e.startsWith("workspace:")}function qo(e){return Mo(e)?e.slice(9):null}function Uo(e){return jo(e)?e.slice(19):null}async function Sr(e,t,n){let r=Ee(e),[s,i]=await Promise.all([Te.repos.listRegisteredRepos(r),Te.listWorkspaces(r,{archived:!1})]),o=await S.listTasks(r),a={},l=await T.load(r),c=0;if(T.previews.isEnabled(l,"agentOrchestration")){let h=await Promise.all(o.tasks.flatMap(y=>y.ptyTabs.filter(k=>k.kind==="agent").map(async k=>({agentTab:k,environment:await rt(r,y,void 0,k.id)}))));for(let{agentTab:y,environment:k}of h)k.CRAIG_AGENT_CAPABILITY&&(a[y.id]=k.CRAIG_AGENT_CAPABILITY);o=await S.listTasks(r);let[f,m]=await Promise.all([Sf(r),Ri(r)]);c=f.length+m.filter(y=>y.state==="waiting_for_review").length}let u=Pd(o.tasks,t),d=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},p=u?await Fh(u,d):null;return{workspaceRoot:e,workspaces:i.workspaces,repos:s.repos,tasks:o.tasks,inspection:p,furyApprovalCount:c,...Object.keys(a).length>0?{agentCapabilityTokens:a}:{},...n?{enabledRunnerIds:n}:{}}}function Pd(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function ig(e,t){return Os(e,t)}import Dd from"node:path";import ZV from"picocolors";var iC=[" \u2584\u2588\u2588\u2588\u2588\u2584 \u2588\u2588\u2580\u2588\u2588\u2588 \u2584\u2584\u2584 \u2588\u2588\u2593 \u2584\u2588\u2588\u2588\u2588"," \u2592\u2588\u2588\u2580 \u2580\u2588 \u2593\u2588\u2588 \u2592 \u2588\u2588\u2592\u2592\u2588\u2588\u2588\u2588\u2584 \u2593\u2588\u2588\u2592 \u2588\u2588\u2592 \u2580\u2588\u2592"," \u2592\u2593\u2588 \u2584 \u2593\u2588\u2588 \u2591\u2584\u2588 \u2592\u2592\u2588\u2588 \u2580\u2588\u2584 \u2592\u2588\u2588\u2592\u2592\u2588\u2588\u2591\u2584\u2584\u2584\u2591"," \u2592\u2593\u2593\u2584 \u2584\u2588\u2588\u2592\u2592\u2588\u2588\u2580\u2580\u2588\u2584 \u2591\u2588\u2588\u2584\u2584\u2584\u2584\u2588\u2588 \u2591\u2588\u2588\u2591\u2591\u2593\u2588 \u2588\u2588\u2593"," \u2592 \u2593\u2588\u2588\u2588\u2580 \u2591\u2591\u2588\u2588\u2593 \u2592\u2588\u2588\u2592 \u2593\u2588 \u2593\u2588\u2588\u2592\u2591\u2588\u2588\u2591\u2591\u2592\u2593\u2588\u2588\u2588\u2580\u2592"," \u2591 \u2591\u2592 \u2592 \u2591\u2591 \u2592\u2593 \u2591\u2592\u2593\u2591 \u2592\u2592 \u2593\u2592\u2588\u2591\u2591\u2593 \u2591\u2592 \u2592"," \u2591 \u2592 \u2591\u2592 \u2591 \u2592\u2591 \u2592 \u2592\u2592 \u2591 \u2592 \u2591 \u2591 \u2591"," \u2591 \u2591\u2591 \u2591 \u2591 \u2592 \u2592 \u2591\u2591 \u2591 \u2591"," \u2591 \u2591 \u2591 \u2591 \u2591 \u2591 \u2591"," \u2591"];function Sd(){return[...iC]}var Bo={width:120,height:36},Q={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function Ue(e,t){return{width:Math.max(e??Bo.width,Bo.width),height:Math.max(t??Bo.height,Bo.height)}}function Ns(e,t=!1){let s=Q.topRailHeight+1,i=e.height-Q.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 og(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 oC=["Start","Options","Exit"],aC=["Resume","Options","Exit"],dg=2,ug=2,Vo=2,lC=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),cC=new RegExp("\x1B\\[(?:0)?m","g"),dC=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),uC=/https?:\/\/[^\s<>"']+/g,vd="\x1B[0m",Ed="\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"}},Id=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function pg(e,t={}){return Go(e,{panelPolish:t.panelPolish??!1,subtitle:"crAIg is that you?",menuItems:oC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function fg(e,t={}){return Go(e,{panelPolish:t.panelPolish??!1,subtitle:"Control mode is paused.",menuItems:aC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function mg(e,t,n={}){let r=`npm install -g craig-cli@${t.latest}`,i=t.phase==="installing"?{subtitle:`Updating Craig \xB7 ${t.current} \u2192 ${t.latest}`,menuItems:["Updating\u2026"],message:r}:t.phase==="success"?{subtitle:`Craig ${t.latest} installed \xB7 restart to use it`,menuItems:["Continue","Exit Craig"],message:"The current Craig session is still running the previous version."}:t.phase==="error"?{subtitle:"Craig update failed",menuItems:["Retry","Continue"],message:t.error??"npm could not install the update."}:{subtitle:`Update available \xB7 ${t.current} \u2192 ${t.latest}`,menuItems:["Update now","Continue","Ignore this version"],message:`Release notes: https://github.com/hallsamuel90/craig/releases/latest
262
- Runs: ${r}`};return Go(e,{subtitle:i.subtitle,menuItems:i.menuItems,menuIndex:n.menuIndex??0,optionsMessage:i.message,color:n.color??!0})}var Wo=[" 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."],pC=["Help"],fC=5;function Ko(e,t={}){return Go(e,{panelPolish:t.panelPolish??!1,subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??pC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function hg(e,t={}){let n=t.color??!0,r=C.overlay,s=new Array(e.height).fill(q(" ".repeat(e.width),n,r)),i=Sd(),o=Math.max(1,Math.floor((e.height-i.length-2-Wo.length)/2));for(let u=0;u<i.length&&!(o+u>=e.height);u+=1)s[o+u]=q(Ng(i[u]??"",e.width),n,C.overlayLogo);let a=Math.max(...Wo.map(u=>u.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let u=0;u<Wo.length;u+=1){let d=c+u;if(d>=e.height)break;let p=Wo[u]??"";s[d]=q(mt(" ".repeat(l)+p,e.width),n,r)}return s.join(`
263
- `)}function gg(e,t={}){let n=t.color??!0,r=C.overlay,s=new Array(e.height).fill(q(" ".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"},ft(),...a.length>0?a.map(h=>({text:h,tone:mC(h)})):[{text:"No Craig activity has been logged.",tone:"muted"}],ft(),{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]??ft(),y=`${" ".repeat(c)}${Ho(m.text,l)}`,k=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]=q(mt(y,e.width),n,k)}return s.join(`
264
- `)}function mC(e){return e.includes(" ERROR ")?"error":e.includes(" WARN ")?"warning":e.includes(" INFO ")?"info":"muted"}function yg(e,t,n={}){if(n.panelPolish)return hC(e,t,n);let r=n.color??!0,s=Q.leftWidth,i=Q.rightWidth,o=n.centerOnly??!1,a=e.height-Q.topRailHeight-1,l=n.focusFlashActive??!1,c={bg: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=q(mt(p,e.width),r,C.rail),f=Sg(t,s-dg-ug,a,r),m=Od(e,t,{color:r,centerOnly:o}),y=Cg(t,i,a,r),k=t.inputMode==="terminal",R=[],b=[];for(let we=0;we<a;we+=1)if(!o){let z=Ir(f[we]??ft(),s,r,"left"),gn=q("\u2502",r,u),ma=q("\u2502",r,d),Nr=Ir(y[we]??ft(),i,r,"right");R.push(`${z}${gn}`),b.push(`${ma}${Nr}`)}let $=k||t.modalInput?C.panelBg:C.panelMuted,N=Pg(t.footerText,t.footerToast,e.width,r,$),D={row:1,column:1,width:e.width,rows:[h]},_=o?null:{row:Q.topRailHeight+1,column:1,width:s+Q.dividerWidth,rows:R},A=o?null:{row:Q.topRailHeight+1,column:m.column+m.width,width:Q.dividerWidth+i,rows:b},w={row:e.height,column:1,width:e.width,rows:[N]},Se=o?m.rows:m.rows.map((we,z)=>`${R[z]??""}${we}${b[z]??""}`);return{frame:[h,...Se,N].join(`
265
- `),center:m,regions:{rail:D,left:_,center:m,right:A,footer:w}}}function Od(e,t,n={}){if(n.panelPolish)return kg(e,t,n);let r=n.color??!0,s=Rg(e,n.centerOnly??!1),i=gC(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 wg(e,t,n,r={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!_o(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:bg(Ad(t.terminal.rows[u]),c.width,t.focusedRegion==="center",r.color??!0,"center",t.inputMode==="terminal")}))}}let i=r.color??!0,o=Rg(e,r.centerOnly??!1),a=Ig(t,o.width,i).length,l=[...new Set(n)].map(c=>({terminalIndex:c,index:a+c})).filter(({index:c})=>c<o.rowCount).map(({terminalIndex:c,index:u})=>({index:u,row:Ir(Ad(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function hC(e,t,n){let r=n.color??!0,s=Ns(e,n.centerOnly),i=kg(e,t,n),o=q(" ",r,C.panelBg),a=` CRAIG ${_s("/",r,C.panelBg)} ${_s(t.topRail.workspacePath,r,C.panelBg)}`,l={row:1,column:1,width:e.width,rows:[q(mt(a,e.width),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)})),k=Sg({...t,leftTree:y},s.left.width-4,s.left.height-2,r),R=t.focusedRegion==="tasks"?qn("WORKSPACES",r,C.panelBg):Ds("WORKSPACES",r,C.panelBg),b=Cd(k,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 $=Cg(t,s.right.width-2,s.right.height-1,r),N=Og($[0]??{text:"Inspector"},r,C.panelBg).trim(),D=Cd($.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=Pg(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,k,R)=>`${k}${q(R,r,C.panelSelected)}${r?Cr(d):""}`),f={row:e.height,column:1,width:e.width,rows:[h]},m=i.rows.map((y,k)=>c&&u?`${c.rows[k]}${y}${u.rows[k]}`:`${o}${y}${o}`);return{frame:[l.rows[0],...m,f.rows[0]].join(`
266
- `),center:i,regions:{rail:l,left:c,center:i,right:u,footer:f}}}function kg(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"||!_o(i)?t.centerTranscript.map(u=>({...u})):vg(t),a=[t.centerHeader.repo,t.centerHeader.taskId].filter(Boolean).join(" \xB7 "),l=Ag(t.tabs,r,t.focusedRegion==="center"),c=Cd([{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 Tg(e,t){return{bg:C.panelBg.bg,fg:t?C.success.fg:e?C.accent.fg:"3b4261"}}function Cd(e,t,n,r,s,i,o=!1){let a=Tg(r,o),l=Dg(t,n.width-6),c=`${q("\u256D\u2500 ",s,a)}${q(l,s,r?a:C.panelMuted)}${q(` ${"\u2500".repeat(Math.max(0,n.width-Ae(l)-5))}\u256E`,s,a)}`,u=vr(e,n.height-2).map(d=>bg(d,n.width,r,s,i,o));return[c,...u,q(`\u2570${"\u2500".repeat(n.width-2)}\u256F`,s,a)]}function bg(e,t,n,r,s,i=!1){let o=q("\u2502",r,Tg(n,i)),a=s==="right"?`${Ir(e,t-3,r,s)}${q(" ",r,C.panelBg)}`:Ir(e,t-2,r,s,s==="left");return`${o}${a}${o}`}function Rg(e,t){return{row:Q.topRailHeight+1,column:t?1:Q.leftWidth+Q.dividerWidth+1,width:t?e.width:e.width-Q.leftWidth-Q.rightWidth-Q.dividerWidth*2,rowCount:e.height-Q.topRailHeight-1}}function Pg(e,t,n,r,s){let i=` ${e}`;if(!t)return q(mt(i,n),r,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=Ae(o),l=Ae(i),c=Math.max(1,n-l-a-2),u=l+c+a+2>n?Ho(i,Math.max(0,n-a-3)):i,d=Math.max(1,n-Ae(u)-a-2),p=t.tone==="error"?NC(o,r,s):qn(o,r,s),h=`${u}${" ".repeat(d)}${p} `;return q(mt(h,n),r,s)}function Go(e,t){if(!t.panelPolish)return ag(e,t);let n=e.width-4,r=ag({width:n,height:e.height-4},t).split(`
267
- `),s={bg:C.overlay.bg,fg:C.accent.fg},i=q(" ",t.color,C.overlay),o=q("\u2502",t.color,s);return[q(" ".repeat(e.width),t.color,C.overlay),`${i}${q(`\u256D${"\u2500".repeat(n)}\u256E`,t.color,s)}${i}`,...r.map(a=>`${i}${o}${a}${o}${i}`),`${i}${q(`\u2570${"\u2500".repeat(n)}\u256F`,t.color,s)}${i}`,q(" ".repeat(e.width),t.color,C.overlay)].join(`
268
- `)}function ag(e,t){let n=new Array(e.height).fill(q(" ".repeat(e.width),t.color,C.overlay)),r=Sd(),s=t.menuItems.map((c,u)=>`${u===t.menuIndex?">":" "} ${c}`),i=t.optionsMessage?["",...t.optionsMessage.split(`
269
- `)]:[],o=[...s,...i];for(;o.length<fC;)o.push("");let a=[...r,"",t.subtitle,"",...o],l=Math.max(1,Math.floor((e.height-a.length)/2));for(let c=0;c<a.length;c+=1){let u=Ng(a[c]??"",e.width);if(c<r.length){n[l+c]=q(u,t.color,C.overlayLogo);continue}if(c===r.length+1){n[l+c]=q(u,t.color,C.overlaySubtitle);continue}let d=c-(r.length+3),h=d>=0&&d<t.menuItems.length&&d===t.menuIndex?t.panelPolish?{...C.overlayMenuSelected,fg:C.success.fg}:C.overlayMenuSelected:C.overlay;n[l+c]=q(u,t.color,h)}if(t.versionText){let c=t.updateText?" (update available)":"",u=`${t.versionText}${c} `,d=" ".repeat(Math.max(0,e.width-Ae(u)));n[e.height-1]=q(`${d}${_s(u,t.color,C.overlay)}`,t.color,C.overlay)}return n.join(`
270
- `)}function Sg(e,t,n,r){let s=kC(e.runners),i=1,o=e.leftTree.map(l=>wC(l,t,r));return[...vr(o,n-i),s]}function gC(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!_o(s)?e.centerTranscript.map(o=>({...o})):vg(e);return vr([...Ig(e,t,r),...i],n)}function Ig(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:OC(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):Ds(a,n,C.panelMuted)}`,c=[`${Ds(e.centerHeader.tabLabel,n,C.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),u=Ag(e.tabs,n,e.focusedRegion==="center"),d=" engaged ",p=d.length+2,h=e.inputMode==="terminal"?qn(`${d}\u25CF `,n,C.panelBg):"",f=e.inputMode==="terminal"?" ".repeat(Math.max(0,r-Ae(u)-p)):"";return[{text:e.inputMode==="terminal"?`${u}${f}${h}`:u},{text:l,tone:"muted"},{text:c},ft()]}function vg(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},ft(),{text:e.terminal.error},ft(),{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(Ad)}function Ad(e){return{text:Nd(e.segments),segments:e.segments,fullBleed:!0}}function Cg(e,t,n,r){let s=e.rightInspection?yC(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"},ft(),...e.rightContext.map(i=>TC(i,r)),...e.actionMessage?[ft(),{text:e.actionMessage}]:[]],n);return vr(s,n)}function yC(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:$C(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>lg(a)),...r.slice(o,o+s).map(a=>lg(a))]}function lg(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 wC(e,t,n){let r=" ".repeat(e.indent??0),s=e.accentDot?" \u25CF":"",i=e.status?` ${e.status}`:"",o=e.accentDot?` ${qn("\u25CF",n,e.selected?C.panelSelected:C.panelBg)}`:"",a=e.prBadge?e.prBadge.reduce((f,m)=>f+Ae(m.text),0):0,l=t-Ae(i)-Ae(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",u=e.selected?e.text:e.focused?qn(e.text,n,C.panelBg):e.panelHeader?Ds(e.text,n,C.panelMuted):e.text,d=mt(`${r}${c}${u}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let f=`${r}${e.selected?"\u25B8":" "} `,m=d.slice(f.length+2),y=[{text:f},Eg(e.activity,e.activityAnimationFrame??0,e.unread),{text:` ${m}${i}${o}`},...e.prBadge??[]];return{text:Nd(y),segments:y,tone:p}}if(e.prBadge){let f=[{text:`${d}${i}${o}`},...e.prBadge];return{text:`${d}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:f,tone:p}}return{text:`${d}${i}${o}`,tone:p}}function kC(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 Ag(e,t,n){return e.map(r=>{let s=r.active?n?qn(r.label,t,C.panelBg):Ds(r.label,t,C.panelBg):_s(r.label,t,C.panelBg),i=r.activity?$d(Eg(r.activity,r.activityAnimationFrame??0,r.unread),t,C.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function Eg(e,t,n=!0){let r=e==="working"?Id[t%Id.length]??Id[0]:e==="ready"?C.success.fg:e==="error"?C.error.fg:C.panelMuted.fg;return{text:e==="ready"&&!n?"\u25CB":"\u25CF",style:{fg:r}}}function TC(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?_s(e.value,t,C.panelBg):e.value}`}}function Ir(e,t,n,r,s=!1){let i=bC(r,e.tone??"default"),o=Og(e,n,i);if(r==="left"){let l=s?1:dg,c=s?1:ug;if(e.fullBleed)return q(mt(o,t),n,i);let u=t-l-c;if(e.rightAlign){let p=Ae(o),h=Math.max(0,u-p),f=`${" ".repeat(l)}${" ".repeat(h)}${o}${" ".repeat(c)}`;return q(f,n,i)}let d=`${" ".repeat(l)}${mt(o,u)}${" ".repeat(c)}`;return q(d,n,i)}return r==="center"&&e.fullBleed?RC(e,t,n,i):q(mt(` ${o}`,t),n,i)}function bC(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(ft());return n}function ft(){return{text:""}}function Og(e,t,n){return e.segments?e.segments.map(r=>$d(r,t,n)).join(""):e.text}function RC(e,t,n,r){let s=" ".repeat(Vo),i=Math.max(0,t-Vo*2);if(!e.segments)return q(`${s}${mt(e.text,i)}${s}`,n,r);let o=IC(e.segments,i),a=`${s}${o.map(l=>$d(l,n,r)).join("")}${s}${n?Ed:""}`;return q(a,n,r)}function $d(e,t,n){let r=e.href?`${$g(e.href)}${e.text}${Ed}`:PC(e.text);return!t||!e.style?r:`${Cr(AC(e.style,n))}${EC(e.style)}${r}${vd}${Cr(n)}`}function PC(e){return e.replace(uC,t=>{let[n,r]=SC(t);return`${$g(n)}${n}${Ed}${r}`})}function SC(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function $g(e){return`\x1B]8;;${e}\x1B\\`}function IC(e,t){let n=vC(e,t);return CC(n,t)}function vC(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=Ae(s.text);if(i<=r){n.push(s),r-=i;continue}let o=Ho(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function CC(e,t){let n=Ae(Nd(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 AC(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 EC(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 OC(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 Ng(e,t){let n=Math.max(0,t-Ae(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function mt(e,t){let n=Ae(e);return n>=t?Dg(e,t):e+" ".repeat(t-n)}function Dg(e,t){if(t<=0)return"";if(Ae(e)<=t)return e;let n=xg(e);return Ho(n,Math.max(0,t-1))+"\u2026"}function Ae(e){let t=0;for(let n of Array.from(xg(e)))t+=_g(n);return t}function Ho(e,t){let n="",r=0;for(let s of Array.from(e)){let i=_g(s);if(r+i>t)break;n+=s,r+=i}return n}function _g(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 $C(e,t,n){return Math.min(Math.max(e,t),n)}function xg(e){return e.replace(dC,"").replace(lC,"")}function Nd(e){return e.map(t=>t.text).join("")}function q(e,t,n){if(!t)return e;let r=Cr(n),s=e.replace(cC,`${vd}${r}`);return`${r}${s}${vd}`}function Cr(e){let t=[];return e.fg&&t.push(`38;2;${cg(e.fg).join(";")}`),e.bg&&t.push(`48;2;${cg(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function cg(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 Yo(e,t,C.success.fg,n)}function NC(e,t,n){return Yo(e,t,C.error.fg,n)}function Ds(e,t,n){return Yo(e,t,C.accent.fg,n)}function _s(e,t,n){return Yo(e,t,C.mutedfg.fg,n)}function Yo(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 Fg(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"?_C(s,r?.runner):[],a=r?{CRAIG_WORKSPACE_ROOT:n,CRAIG_TASK_ID:r.id,...s?.kind==="agent"?{CRAIG_AGENT_TAB_ID:s.id,...e.agentCapabilityTokens?.[s.id]?{CRAIG_AGENT_CAPABILITY:e.agentCapabilityTokens[s.id]}:{}}:{}}:{};return r?.type==="project"?{cwd:i,command:o,env:{...a,GIT_CEILING_DIRECTORIES:DC(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function DC(e,t){let n=(e??"").split(Dd.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(Dd.delimiter):[...n,t].join(Dd.delimiter)}function _C(e,t){let n=e.command.length>0?e.command:["codex"];return So(n,e.runner??t??"codex")}function Lg(e,t){let n=e.ptyTabs.find(r=>r.kind===t);if(!n)throw new Error(`Task ${e.id} is missing its ${t} PTY tab.`);return n.id}function Bt(e,t=!1,n=!1){if(t){let r=og(e,n);return{columns:r.width,rows:r.height}}return{columns:Math.max(20,e.width-Q.leftWidth-Q.rightWidth-Q.dividerWidth-Vo*2),rows:Math.max(5,e.height-Q.topRailHeight-5)}}function Mg(e){return e.length===1||et(e)||e==="BACKSPACE"||e==="TAB"}function Wt(e){return typeof e=="string"&&new RegExp(`:(?:agent|${de.join("|")})(?:-\\d+)?$`).test(e)}function jg(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 _d(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function qg(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 xs(e){return Bg.includes(e)?"SHIFT_ENTER":null}function xd(e){return Bg.some(t=>t.startsWith(e))}function Ug(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var Bg=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function Wg(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
261
+ `);return o.length>Gv?Ee(t,"Diff is above the 500 KB inline preview limit.","too_large",t,o.length):o.includes("\0")?Ee(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 Qh(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 fn(e,t){return e&&t.includes(e)?e:t[0]??null}function Xv(e){return e.length===1&&e[0]===""?0:e.at(-1)===""?e.length-1:e.length}function Zh(e){return[...new Set(e.split(`
263
+ `).map(t=>t.trim()).filter(t=>t.length>0))].sort((t,n)=>t.localeCompare(n))}function Qv(e,t){let n=Pu.resolve(e,t),r=Pu.resolve(e);if(n!==r&&!n.startsWith(`${r}${Pu.sep}`))throw new Error(`File path escapes task worktree: ${t}`);return n}function Zv(e){return e.subarray(0,Math.min(e.byteLength,8e3)).includes(0)}function Ee(e,t,n,r=null,s=null){return{path:r,status:n,title:e,lines:[t],byteLength:s}}var eC=["tasks","center","inspector","actions"],eg=["agent","terminal"],tg=[],V="inspection",ZV=[...eg,...tg],Iu=["commit","push","refresh-checks","close-task"],ng=["refresh-checks","close-task"],rg=["task","checks","pr","setup-run","actions","next-action"],vu=["files","review"];function sg(e,t={}){let n=e?.activeTab==="files"?"file":e?.activeTab==="diff"?"diff":null,r=oC(e?.openInspectionKind)??n,s=k.runners.getEnabled(t);return{inputMode:lC(e?.inputMode),focusedRegion:sC(e?.focusedRegion),selectedRepoId:Ut(e?.selectedRepoId),selectedWorkspaceId:Ut(e?.selectedWorkspaceId),selectedTaskId:Ut(e?.selectedTaskId),selectedPtyTabId:Ut(e?.selectedPtyTabId),selectedLeftItemId:hC(Ut(e?.selectedTaskId)),activeTab:n?V:Ut(e?.activeTab)??"agent",preferredPtyTabKind:aC(e?.preferredPtyTabKind),inspectorSection:$s(e?.inspectorSection,rg,"task"),inspectionMode:iC(e?.inspectionMode,n==="diff"?"review":"files"),openInspectionKind:r,selectedFileTreePath:Ut(e?.selectedFileTreePath),selectedFilePath:Ut(e?.selectedFilePath),selectedDiffPath:Ut(e?.selectedDiffPath),collapsedFileTreePaths:Array.isArray(e?.collapsedFileTreePaths)?e.collapsedFileTreePaths:[],fileScrollOffset:0,diffScrollOffset:0,reviewScrollOffset:0,selectedActionId:$s(e?.selectedActionId,Iu,"commit"),selectedProjectTargetId:null,selectedRunner:cC(e?.selectedRunner,s,k.runners.getDefault(t)),centerTabRunner:null,actionMessage:null,footerToast:null,taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,fileSearchQuery:null,workspaceBrowser:null,terminal:tC(),centerZoomed:!1,readAgentActivityAt:e?.readAgentActivityAt??{}}}function tC(){return{status:"idle",rows:[],error:null,scrolledBack:!1}}function _o(e,t){return{...e??Ks(),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 Ds(e,t,n={}){let r=fC(e,t),s=Au(r),i=s?.kind==="task"?t.tasks.find(f=>f.id===s.id)??null:null,o=i?mC(t.tasks,i):null,a=Bo(r),l=Uo(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?Lo(t.tasks,c.id):u?Mo(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,...uC(h,e.activeTab,e.selectedPtyTabId),selectedFilePath:rC(e,t,h?.id??null),...dC(e,t,h?.id??null),selectedDiffPath:nC(e,t,h?.id??null),inspectorSection:$s(e.inspectorSection,rg,"task")}}function Bt(e,t){return{...e,terminal:t}}function ig(e,t){return{...e,inputMode:"control",terminal:{status:"failed",rows:[],error:t}}}function og(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 Cu(e){return e.length===1&&e>=" "&&e!=="\x7F"}function xo(e){return lg(e)||Rr(e)!==null}function ag(e){return tg.includes(e)}function lg(e){return eg.includes(e)}function cg(e,t){return[...e?.ptyTabs.map(n=>n.id)??[],...t?.openInspectionKind?[V]:[]]}function nC(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedDiffPath&&(t.inspection.diffPaths??[]).includes(e.selectedDiffPath)?e.selectedDiffPath:t.inspection.selectedDiffPath}function rC(e,t,n){return!t.inspection||t.inspection.taskId!==n||e.selectedFilePath&&(t.inspection.filePaths??[]).includes(e.selectedFilePath)?e.selectedFilePath:t.inspection.selectedFilePath}function $s(e,t,n){return t.includes(e??"")?e:n}function sC(e){return e==="tabs"?"center":$s(e,eC,"tasks")}function iC(e,t){return e==="checks"||e==="actions"||e==="diff"||e==="review"?"review":$s(e,vu,t)}function oC(e){return e==="file"||e==="diff"?e:null}function aC(e){return e==="terminal"?"terminal":"agent"}function lC(e){return e==="terminal"?"terminal":"control"}function cC(e,t=[...yt],n="codex"){return e&&k.runners.isRunnerType(e)&&t.includes(e)?e:n}function Fo(e,t=yt){let n=t.length>0?t:yt,r=n.indexOf(e);return n[(r+1)%n.length]??n[0]??"codex"}function Rr(e){let t=fe.join("|");return new RegExp(`:(?:agent|${t})(?:-\\d+)?$`).test(e)?"agent":/:terminal(?:-\d+)?$/.test(e)?"terminal":null}function uC(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(lg(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 dC(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?pC(t.inspection.fileRows??[],t.inspection.selectedFilePath):e.collapsedFileTreePaths;return{selectedFileTreePath:r,collapsedFileTreePaths:s}}function pC(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 fC(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 Ns(Lo(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 Ns(Mo(e.tasks,n.id)))t.push(`task:${r.id}`);t.push(`new-task:${n.id}`)}return t.push("new-workspace"),t}function Lo(e,t){return ug(e,n=>n.workspaceId===t)}function Mo(e,t){return ug(e,n=>n.repoId===t)}function mC(e,t){return t.rootTaskId===t.id?t:e.find(n=>n.id===t.rootTaskId)??t}function ug(e,t){let n=new Map(e.map(r=>[r.id,r]));return e.filter(r=>t(n.get(r.rootTaskId)??r))}function Ns(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 Au(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 Ut(e){return typeof e=="string"?e:null}function hC(e){return e?`task:${e}`:null}function _s(e){return typeof e=="string"&&e.startsWith("task:")}function jo(e){return typeof e=="string"&&e.startsWith("new-task:")}function qo(e){return typeof e=="string"&&e.startsWith("new-task-workspace:")}function dg(e){return typeof e=="string"&&e.startsWith("workspace:")}function Uo(e){return jo(e)?e.slice(9):null}function Bo(e){return qo(e)?e.slice(19):null}async function Pr(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 rt(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[d,u]=await Promise.all([k.previews.isEnabled(l,"agentOrchestration")?Af(r):[],ss(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=Eu(o.tasks,t),h=t?{selectedFilePath:t.selectedFilePath,selectedDiffPath:t.selectedDiffPath}:{},f=p?await Wh(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 Eu(e,t){return t?.selectedTaskId?e.find(n=>n.id===t.selectedTaskId)??null:null}function pg(e,t){return Ds(e,t)}import qu from"node:path";import uK from"picocolors";var gC=[" \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 Ou(){return[...gC]}var Wo={width:120,height:36},Z={leftWidth:42,rightWidth:36,dividerWidth:1,topRailHeight:1};function We(e,t){return{width:Math.max(e??Wo.width,Wo.width),height:Math.max(t??Wo.height,Wo.height)}}function xs(e,t=!1){let s=Z.topRailHeight+1,i=e.height-Z.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 fg(e,t=!1){let n=xs(e,t).center;return{row:n.row+2,column:n.column+3,width:n.width-6,height:n.height-3}}var yC=["Start","Options","Exit"],wC=["Resume","Options","Exit"],yg=2,wg=2,Ko=2,kC=new RegExp("\x1B\\[[0-?]*[ -/]*[@-~]","g"),TC=new RegExp("\x1B\\[(?:0)?m","g"),bC=new RegExp("\x1B\\]8;;[^\x1B]*\x1B\\\\","g"),RC=/https?:\/\/[^\s<>"']+/g,Nu="\x1B[0m",xu="\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"}},$u=["3d59a1","506eb8","6386d0","7aa2f7","6386d0","506eb8"];function kg(e,t={}){return Ho(e,{panelPolish:t.panelPolish??!1,subtitle:"crAIg is that you?",menuItems:yC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function Tg(e,t={}){return Ho(e,{panelPolish:t.panelPolish??!1,subtitle:"Control mode is paused.",menuItems:wC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0,versionText:t.versionText??null,updateText:t.updateText??null})}function bg(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 Ho(e,{subtitle:i.subtitle,menuItems:i.menuItems,menuIndex:n.menuIndex??0,optionsMessage:i.message,color:n.color??!0})}var Vo=[" 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."],PC=["Help"],SC=5;function Go(e,t={}){return Ho(e,{panelPolish:t.panelPolish??!1,subtitle:t.optionsSubtitle??"Configuration",menuItems:t.optionsMenuItems??PC,menuIndex:t.menuIndex??0,optionsMessage:t.optionsMessage??null,color:t.color??!0})}function Rg(e,t={}){let n=t.color??!0,r=C.overlay,s=new Array(e.height).fill(B(" ".repeat(e.width),n,r)),i=Ou(),o=Math.max(1,Math.floor((e.height-i.length-2-Vo.length)/2));for(let d=0;d<i.length&&!(o+d>=e.height);d+=1)s[o+d]=B(jg(i[d]??"",e.width),n,C.overlayLogo);let a=Math.max(...Vo.map(d=>d.length)),l=Math.max(0,Math.floor((e.width-a)/2)),c=o+i.length+2;for(let d=0;d<Vo.length;d+=1){let u=c+d;if(u>=e.height)break;let p=Vo[d]??"";s[u]=B(mt(" ".repeat(l)+p,e.width),n,r)}return s.join(`
266
+ `)}function Pg(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"},ft(),...a.length>0?a.map(h=>({text:h,tone:IC(h)})):[{text:"No Craig activity has been logged.",tone:"muted"}],ft(),{text:"Esc returns to Options.",tone:"muted"}],u=Ir(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]??ft(),y=`${" ".repeat(c)}${zo(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(mt(y,e.width),n,T)}return s.join(`
267
+ `)}function IC(e){return e.includes(" ERROR ")?"error":e.includes(" WARN ")?"warning":e.includes(" INFO ")?"info":"muted"}function Sg(e,t,n={}){if(n.panelPolish)return vC(e,t,n);let r=n.color??!0,s=Z.leftWidth,i=Z.rightWidth,o=n.centerOnly??!1,a=e.height-Z.topRailHeight-1,l=n.focusFlashActive??!1,c={bg: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=Yo(p,e.width,n,r,C.rail),f=$g(t,s-yg-wg,a,r),m=Fu(e,t,{color:r,centerOnly:o}),y=_g(t,i,a,r),T=t.inputMode==="terminal",R=[],b=[];for(let ke=0;ke<a;ke+=1)if(!o){let z=Sr(f[ke]??ft(),s,r,"left"),yn=B("\u2502",r,d),ga=B("\u2502",r,u),Dr=Sr(y[ke]??ft(),i,r,"right");R.push(`${z}${yn}`),b.push(`${ga}${Dr}`)}let $=T||t.modalInput?C.panelBg:C.panelMuted,N=Og(t.footerText,t.footerToast,e.width,r,$),D={row:1,column:1,width:e.width,rows:[h]},_=o?null:{row:Z.topRailHeight+1,column:1,width:s+Z.dividerWidth,rows:R},A=o?null:{row:Z.topRailHeight+1,column:m.column+m.width,width:Z.dividerWidth+i,rows:b},w={row:e.height,column:1,width:e.width,rows:[N]},Ie=o?m.rows:m.rows.map((ke,z)=>`${R[z]??""}${ke}${b[z]??""}`);return{frame:[h,...Ie,N].join(`
268
+ `),center:m,regions:{rail:D,left:_,center:m,right:A,footer:w}}}function Fu(e,t,n={}){if(n.panelPolish)return vg(e,t,n);let r=n.color??!0,s=Eg(e,n.centerOnly??!1),i=CC(t,s.width,s.rowCount,r);return{row:s.row,column:s.column,width:s.width,rows:i.map(o=>Sr(o,s.width,r,"center"))}}function Ig(e,t,n,r={}){let s=t.tabs.find(c=>c.active)?.id??"";if(!xo(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=xs(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:Ag(_u(t.terminal.rows[d]),c.width,t.focusedRegion==="center",r.color??!0,"center",t.inputMode==="terminal")}))}}let i=r.color??!0,o=Eg(e,r.centerOnly??!1),a=Ng(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:Sr(_u(t.terminal.rows[c]),o.width,i,"center")}));return{...o,rows:l}}function vC(e,t,n){let r=n.color??!0,s=xs(e,n.centerOnly),i=vg(e,t,n),o=B(" ",r,C.panelBg),a=` CRAIG ${Fs("/",r,C.panelBg)} ${Fs(t.topRail.workspacePath,r,C.panelBg)}`,l={row:1,column:1,width:e.width,rows:[Yo(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):Cr("WORKSPACES",r,C.panelBg),b=Du(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 $=_g(t,s.right.width-2,s.right.height-1,r),N=Lg($[0]??{text:"Inspector"},r,C.panelBg).trim(),D=Du($.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=Og(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?vr(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 vg(e,t,n){let r=n.color??!0,s=xs(e,n.centerOnly).center,i=t.tabs.find(d=>d.active)?.id??"agent",o=t.centerHeader.tabLabel==="BROWSER"||!xo(i)?t.centerTranscript.map(d=>({...d})):Dg(t),a=[t.centerHeader.repo,t.centerHeader.taskId].filter(Boolean).join(" \xB7 "),l=xg(t.tabs,r,t.focusedRegion==="center"),c=Du([{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 Cg(e,t){return{bg:C.panelBg.bg,fg:t?C.success.fg:e?C.accent.fg:"3b4261"}}function Du(e,t,n,r,s,i,o=!1){let a=Cg(r,o),l=Mu(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-Oe(l)-5))}\u256E`,s,a)}`,d=Ir(e,n.height-2).map(u=>Ag(u,n.width,r,s,i,o));return[c,...d,B(`\u2570${"\u2500".repeat(n.width-2)}\u256F`,s,a)]}function Ag(e,t,n,r,s,i=!1){let o=B("\u2502",r,Cg(n,i)),a=s==="right"?`${Sr(e,t-3,r,s)}${B(" ",r,C.panelBg)}`:Sr(e,t-2,r,s,s==="left");return`${o}${a}${o}`}function Eg(e,t){return{row:Z.topRailHeight+1,column:t?1:Z.leftWidth+Z.dividerWidth+1,width:t?e.width:e.width-Z.leftWidth-Z.rightWidth-Z.dividerWidth*2,rowCount:e.height-Z.topRailHeight-1}}function Og(e,t,n,r,s){let i=` ${e}`;if(!t)return B(mt(i,n),r,s);let o=`${t.tone==="error"?"\u2717":"\u2713"} ${t.message}`,a=Oe(o),l=Oe(i),c=Math.max(1,n-l-a-2),d=l+c+a+2>n?zo(i,Math.max(0,n-a-3)):i,u=Math.max(1,n-Oe(d)-a-2),p=t.tone==="error"?WC(o,r,s):qn(o,r,s),h=`${d}${" ".repeat(u)}${p} `;return B(mt(h,n),r,s)}function Ho(e,t){if(!t.panelPolish)return mg(e,t);let n=e.width-4,r=mg({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[Yo("",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 mg(e,t){let n=new Array(e.height).fill(B(" ".repeat(e.width),t.color,C.overlay)),r=Ou(),s=t.menuItems.map((c,d)=>`${d===t.menuIndex?">":" "} ${c}`),i=t.optionsMessage?["",...t.optionsMessage.split(`
272
+ `)]:[],o=[...s,...i];for(;o.length<SC;)o.push("");let a=[...r,"",t.subtitle,"",...o],l=Math.max(1,Math.floor((e.height-a.length)/2));for(let c=0;c<a.length;c+=1){let d=jg(a[c]??"",e.width);if(c<r.length){n[l+c]=B(d,t.color,C.overlayLogo);continue}if(c===r.length+1){n[l+c]=B(d,t.color,C.overlaySubtitle);continue}let u=c-(r.length+3),h=u>=0&&u<t.menuItems.length&&u===t.menuIndex?t.panelPolish?{...C.overlayMenuSelected,fg:C.success.fg}:C.overlayMenuSelected:C.overlay;n[l+c]=B(d,t.color,h)}return n[0]=Yo("",e.width,t,t.color,C.overlay),n.join(`
273
+ `)}function Yo(e,t,n,r,s){let i=[n.versionText,n.updateText].filter(Boolean).join(" ");if(!i)return B(mt(e,t),r,s);let o=Mu(i,Math.max(0,t-2)),a=Math.max(0,t-Oe(o)-2),l=n.updateText?Cr(o,r,s):Fs(o,r,s);return B(`${mt(e,a)} ${l} `,r,s)}function $g(e,t,n,r){let s=OC(e.runners),i=1,o=e.leftTree.map(l=>EC(l,t,r));return[...Ir(o,n-i),s]}function CC(e,t,n,r){let s=e.tabs.find(o=>o.active)?.id??"agent",i=e.centerHeader.tabLabel==="BROWSER"||!xo(s)?e.centerTranscript.map(o=>({...o})):Dg(e);return Ir([...Ng(e,t,r),...i],n)}function Ng(e,t,n){let r=t-2,s=e.tabs.find(y=>y.active)?.label??"AGENT",i=e.inputMode==="terminal"?0:UC(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):Cr(a,n,C.panelMuted)}`,c=[`${Cr(e.centerHeader.tabLabel,n,C.panelBg)} ${e.centerHeader.taskId}`,e.centerHeader.repo].join(" \xB7 "),d=xg(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-Oe(d)-p)):"";return[{text:e.inputMode==="terminal"?`${d}${f}${h}`:d},{text:l,tone:"muted"},{text:c},ft()]}function Dg(e){if(e.terminal.error)return[{text:"terminal \u25B8 PTY unavailable"},ft(),{text:e.terminal.error},ft(),{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(_u)}function _u(e){return{text:ju(e.segments),segments:e.segments,fullBleed:!0}}function _g(e,t,n,r){let s=e.rightInspection?AC(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):Ir([{text:"CONTEXT"},ft(),...e.rightContext.map(i=>$C(i,r)),...e.actionMessage?[ft(),{text:e.actionMessage}]:[]],n);return Ir(s,n)}function AC(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:BC(i-Math.floor(s/2),0,Math.max(0,r.length-s));return[...n.map(a=>hg(a)),...r.slice(o,o+s).map(a=>hg(a))]}function hg(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 EC(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+Oe(m.text),0):0,l=t-Oe(i)-Oe(s)-a,c=e.activity?`${e.selected?"\u25B8":" "} \u25CF `:"",d=e.selected?e.text:e.focused?qn(e.text,n,C.panelBg):e.panelHeader?Cr(e.text,n,C.panelMuted):e.text,u=mt(`${r}${c}${d}`,Math.max(0,l)),p=e.selected?"selected":e.muted?"muted":"default";if(e.activity){let f=`${r}${e.selected?"\u25B8":" "} `,m=u.slice(f.length+2),y=[{text:f},Fg(e.activity,e.activityAnimationFrame??0,e.unread),{text:` ${m}${i}${o}`},...e.prBadge??[]];return{text:ju(y),segments:y,tone:p}}if(e.prBadge){let f=[{text:`${u}${i}${o}`},...e.prBadge];return{text:`${u}${i}${e.prBadge.map(y=>y.text).join("")}`,segments:f,tone:p}}return{text:`${u}${i}${o}`,tone:p}}function OC(e){let t=e.map(r=>{let s=r.health>=1,i=parseInt(r.count,10),o=i>1?` (${i})`:"";return{text:`${s?"\u25CF":"\u25CB"} ${r.name}${o}`,active:s}}),n=[];for(let r=0;r<t.length;r++){let s=t[r];r>0&&n.push({text:" "}),s.active?n.push({text:s.text,style:{fg:C.success.fg}}):n.push({text:s.text,style:{fg:C.panelMuted.fg}})}return{text:t.map(r=>r.text).join(" "),segments:n,tone:"muted"}}function xg(e,t,n){return e.map(r=>{let s=r.active?n?qn(r.label,t,C.panelBg):Cr(r.label,t,C.panelBg):Fs(r.label,t,C.panelBg),i=r.activity?Lu(Fg(r.activity,r.activityAnimationFrame??0,r.unread),t,C.panelBg):"";return`${s}${i?` ${i}`:""}`}).join(" ")}function Fg(e,t,n=!0){let r=e==="working"?$u[t%$u.length]??$u[0]:e==="ready"?C.success.fg:e==="error"?C.error.fg:C.panelMuted.fg;return{text:e==="ready"&&!n?"\u25CB":"\u25CF",style:{fg:r}}}function $C(e,t){return{text:`${e.label.padEnd(8," ")} ${e.mutedValue?Fs(e.value,t,C.panelBg):e.value}`}}function Sr(e,t,n,r,s=!1){let i=NC(r,e.tone??"default"),o=Lg(e,n,i);if(r==="left"){let l=s?1:yg,c=s?1:wg;if(e.fullBleed)return B(mt(o,t),n,i);let d=t-l-c;if(e.rightAlign){let p=Oe(o),h=Math.max(0,d-p),f=`${" ".repeat(l)}${" ".repeat(h)}${o}${" ".repeat(c)}`;return B(f,n,i)}let u=`${" ".repeat(l)}${mt(o,d)}${" ".repeat(c)}`;return B(u,n,i)}return r==="center"&&e.fullBleed?DC(e,t,n,i):B(mt(` ${o}`,t),n,i)}function NC(e,t){return t==="selected"||t==="focused"?C.panelSelected:t==="muted"?C.panelMuted:C.panelBg}function Ir(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(ft());return n}function ft(){return{text:""}}function Lg(e,t,n){return e.segments?e.segments.map(r=>Lu(r,t,n)).join(""):e.text}function DC(e,t,n,r){let s=" ".repeat(Ko),i=Math.max(0,t-Ko*2);if(!e.segments)return B(`${s}${mt(e.text,i)}${s}`,n,r);let o=FC(e.segments,i),a=`${s}${o.map(l=>Lu(l,n,r)).join("")}${s}${n?xu:""}`;return B(a,n,r)}function Lu(e,t,n){let r=e.href?`${Mg(e.href)}${e.text}${xu}`:_C(e.text);return!t||!e.style?r:`${vr(jC(e.style,n))}${qC(e.style)}${r}${Nu}${vr(n)}`}function _C(e){return e.replace(RC,t=>{let[n,r]=xC(t);return`${Mg(n)}${n}${xu}${r}`})}function xC(e){let t=e.length;for(;t>0&&".,;:!?)]}".includes(e[t-1]??"");)t-=1;return[e.slice(0,t),e.slice(t)]}function Mg(e){return`\x1B]8;;${e}\x1B\\`}function FC(e,t){let n=LC(e,t);return MC(n,t)}function LC(e,t){let n=[],r=t;for(let s of e){if(r<=0)break;let i=Oe(s.text);if(i<=r){n.push(s),r-=i;continue}let o=zo(s.text,r);o.length>0&&n.push({...s,text:o}),r=0}return n}function MC(e,t){let n=Oe(ju(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 jC(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 qC(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 UC(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 jg(e,t){let n=Math.max(0,t-Oe(e)),r=Math.floor(n/2),s=n-r;return`${" ".repeat(r)}${e}${" ".repeat(s)}`}function mt(e,t){let n=Oe(e);return n>=t?Mu(e,t):e+" ".repeat(t-n)}function Mu(e,t){if(t<=0)return"";if(Oe(e)<=t)return e;let n=Ug(e);return zo(n,Math.max(0,t-1))+"\u2026"}function Oe(e){let t=0;for(let n of Array.from(Ug(e)))t+=qg(n);return t}function zo(e,t){let n="",r=0;for(let s of Array.from(e)){let i=qg(s);if(r+i>t)break;n+=s,r+=i}return n}function qg(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 BC(e,t,n){return Math.min(Math.max(e,t),n)}function Ug(e){return e.replace(bC,"").replace(kC,"")}function ju(e){return e.map(t=>t.text).join("")}function B(e,t,n){if(!t)return e;let r=vr(n),s=e.replace(TC,`${Nu}${r}`);return`${r}${s}${Nu}`}function vr(e){let t=[];return e.fg&&t.push(`38;2;${gg(e.fg).join(";")}`),e.bg&&t.push(`48;2;${gg(e.bg).join(";")}`),`\x1B[${t.join(";")}m`}function gg(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 Jo(e,t,C.success.fg,n)}function WC(e,t,n){return Jo(e,t,C.error.fg,n)}function Cr(e,t,n){return Jo(e,t,C.accent.fg,n)}function Fs(e,t,n){return Jo(e,t,C.mutedfg.fg,n)}function Jo(e,t,n,r){if(!t)return e;let s=r.bg?{fg:n,bg:r.bg}:{fg:n};return`${vr(s)}${e}${vr(r)}`}function Bg(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"?KC(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:VC(process.env.GIT_CEILING_DIRECTORIES,i)}}:r?{cwd:i,command:o,env:a}:{cwd:i,command:o}}function VC(e,t){let n=(e??"").split(qu.delimiter).filter(r=>r.length>0);return n.includes(t)?n.join(qu.delimiter):[...n,t].join(qu.delimiter)}function KC(e,t){let n=e.command.length>0?e.command:["codex"];return Io(n,e.runner??t??"codex")}function Wg(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 Wt(e,t=!1,n=!1){if(t){let r=fg(e,n);return{columns:r.width,rows:r.height}}return{columns:Math.max(20,e.width-Z.leftWidth-Z.rightWidth-Z.dividerWidth-Ko*2),rows:Math.max(5,e.height-Z.topRailHeight-5)}}function Vg(e){return e.length===1||et(e)||e==="BACKSPACE"||e==="TAB"}function Vt(e){return typeof e=="string"&&new RegExp(`:(?:agent|${fe.join("|")})(?:-\\d+)?$`).test(e)}function Kg(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 Uu(e){return e==="MOUSE_WHEEL_UP"?-3:e==="MOUSE_WHEEL_DOWN"?3:0}function Gg(e){let t=new RegExp("\x1B\\[<(\\d+);\\d+;\\d+[mM]").exec(e);if(!t?.[1])return 0;let n=Number.parseInt(t[1],10);return n===64?-3:n===65?3:0}function Ls(e){return Yg.includes(e)?"SHIFT_ENTER":null}function Bu(e){return Yg.some(t=>t.startsWith(e))}function Hg(e){return e==="ESCAPE"?"\x1B":e.length===1?e:null}var Yg=["\x1B[13;2u","\x1B[13;2~","\x1B[27;2;13~","\x1B[27;2;10~"];function zg(e,t,n){return n.length===0?!1:e&&(n==="\r"||n===`
271
274
  `||n===`\r
272
- `)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function Vg(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function Kg(e,t=null){let n=t?.split(`
275
+ `)?!0:!t||Date.now()-t.at>=30?!1:n===t.key?!0:n.length<=4&&n.split("").every(r=>r===t.key)}function Jg(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function Xg(e,t=null){let n=t?.split(`
273
276
  `)??[];return e.split(`
274
- `).map((r,s)=>n[s]===r?"":`\x1B[${s+1};1H${r}`).join("")}function zo(e,t,n,r){return e.map((s,i)=>t?.[i]===s?"":`\x1B[${n+i};${r}H${s}`).join("")}import{createServer as EA,createConnection as iy}from"node:net";import{mkdir as OA,readFile as oy,rm as Ls,writeFile as $A}from"node:fs/promises";import NA from"node:path";import{setTimeout as GC}from"node:timers/promises";var fn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=Fd(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:Fd(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=Fd(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 Fd(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}import{mkdir as Gg,readFile as xC,rm as Ld,stat as FC,writeFile as LC}from"node:fs/promises";import Md from"node:path";async function jd(e){let t=Md.join(e.runtimeDir,"orchestration-supervisor.lock");await Gg(e.runtimeDir,{recursive:!0});try{await Gg(t)}catch(r){if(!jC(r))throw r;let s=await xC(Md.join(t,"owner.json"),"utf8").then(o=>JSON.parse(o)).catch(()=>null),i=await FC(t).catch(()=>null);if(typeof s?.pid=="number"&&!MC(s.pid)||!s&&i&&Date.now()-i.mtimeMs>=5e3)return await Ld(t,{recursive:!0,force:!0}),jd(e);throw new g("COMMAND_STATE_CONFLICT","Another orchestration supervisor already leads this workspace.",{details:{ownerPid:s?.pid??null}})}try{await LC(Md.join(t,"owner.json"),JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()}),"utf8")}catch(r){throw await Ld(t,{recursive:!0,force:!0}),r}let n=!1;return{async release(){n||(n=!0,await Ld(t,{recursive:!0,force:!0}))}}}function MC(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 jC=e=>typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST";var qC="\x1B[200~",UC="\x1B[201~";function Hg(e,t){switch(e){case"codex":return Jo(t,50);case"cursor":return Jo(t,50);case"claude":return Jo(t,50);case"pi":return Jo(t,50);default:return BC(e)}}function Jo(e,t){return{paste:`${qC}${e}${UC}`,submit:"\r",submitDelayMs:t}}function BC(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import WC from"node:path";var VC={type:"system",component:"orchestration-supervisor"};async function Yg(e){let t=WC.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Bs(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 KC(i))o.has(a)||(await vn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:VC),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await B(t,n)}function KC(e){let t=["command.queued"];return e.attempts>0&&t.push("command.delivering"),e.state==="delivered"?t.push("command.delivered"):e.state==="failed"?t.push("command.failed"):e.state==="cancelled"&&t.push("command.cancelled"),t}var Xo=class{constructor(t,n,r={}){this.paths=t;this.runtime=n;let s=r.intervalMs??250;this.heartbeat=new fn({resolutionMs:s,onError:(i,o)=>r.onError?.(o)}),this.heartbeat.register({id:"orchestration.commands",intervalMs:s,run:()=>this.reconcile()})}paths;runtime;heartbeat;lease=null;reconciliation=null;async start(){if(!this.lease){this.lease=await jd(this.paths);try{await this.reconcile(),this.heartbeat.start()}catch(t){throw await this.lease.release(),this.lease=null,t}}}async wake(){await this.reconcile()}async stop(){this.heartbeat.stop(),await this.reconciliation?.catch(()=>{}),await this.lease?.release(),this.lease=null}reconcile(){return this.reconciliation?this.reconciliation:(this.reconciliation=this.reconcileCommands().finally(()=>{this.reconciliation=null}),this.reconciliation)}async reconcileCommands(){await Ao(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await Yg(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,Fs("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 Ao(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await this.failCommand(t,Fs("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let n=await S.getTask(this.paths,t.taskId).catch(o=>{if(o instanceof g&&o.code==="TASK_NOT_FOUND")return null;throw o}),r=n?.ptyTabs.find(o=>o.id===t.agentTabId);if(!n||!r||r.kind!=="agent"||n.status==="closed"){await this.failCommand(t,Fs("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer available in task ${t.taskId}.`,!1,!1));return}let s=this.runtime.getActivitySnapshots().find(o=>o.tabId===t.agentTabId);if(s&&s.sessionState!=="running"){await this.failCommand(t,Fs("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(!this.runtime.hasRunningSession(t.agentTabId)||t.delivery==="when-ready"&&Jt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")return;await ae.beginDelivery(this.paths,t.id);try{let o=Hg(r.runner??n.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,o.paste),await GC(o.submitDelayMs),this.runtime.writeToSession(t.agentTabId,o.submit)}catch(o){await this.failCommand(t,Fs("PROMPT_DELIVERY_UNCERTAIN",o instanceof Error?o.message:"Prompt delivery failed after it began.",!1,!0));return}let i=await ae.completeDelivery(this.paths,t.id);await this.reconcileInitialPromptTask(i)}async failCommand(t,n){let r=await ae.fail(this.paths,t.id,n);await this.reconcileInitialPromptTask(r)}async reconcileInitialPromptTask(t){if(!HC(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}.`)}}},HC=e=>e.idempotencyKey===`task-start:${e.taskId}`,Fs=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var YC={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},Ar=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...YC,...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 Ke,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=zC(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(JC);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 zC(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 JC(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as XC}from"node:fs";var Qo=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=Ge(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=XC(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 QC={selectedTaskId:null,reviewVisible:!1},ZC={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))))},Zo=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??ZC,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new Ar({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new Qo(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=tA(s);i.length>0&&await this.onTasksChanged(i);let o=eA(s);o.length>0&&await this.wake(o)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new fn({resolutionMs:r,...n.now?{now:n.now}:{},onError:(s,i)=>this.reportError(i)}),this.heartbeat.register({id:"github.pull-requests",intervalMs:r,run:()=>this.reconcile()})}paths;heartbeat;coordinator;dependencies;onTasksChanged;onError;eventMonitor;pendingWakeTaskIds=new Set;reconciliation=null;reconciliationVersion=0;view=QC;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,zg(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)!==zg(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 eA(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=sA(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&rA.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 tA(e){let t=new Set;for(let n of e)n.taskId&&nA(n)&&t.add(n.taskId);return[...t]}function nA(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var rA=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),sA=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function zg(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as hA}from"node:module";import oA from"@xterm/headless";var iA=new RegExp("^\x1B\\[(\\d*)S$"),ea=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=iA.exec(s);if(!i){n+=s;continue}await this.writeRaw(n),n="",await this.scrollUp(s,Number(i[1])||1)}await this.writeRaw(n)}async scrollUp(t,n){let r=this.terminal;if(r.buffer.active.type!=="normal"||this.top!==0){await this.writeRaw(t);return}let s=Math.min(this.bottom??r.rows-1,r.rows-1),{cursorX:i,cursorY:o}=r.buffer.active,a=Math.min(n,s+1),l=this.originMode?"\x1B[?6l":"",c=this.originMode?"\x1B[?6h":"";await this.writeRaw(`${l}\x1B[${s+1};1H${`
275
- `.repeat(a)}${c}\x1B[${o+1};${i+1}H`)}writeRaw(t){return t?new Promise(n=>this.terminal.write(t,n)):Promise.resolve()}};function Jg(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,Qg=new WeakMap,lA=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function Zg(e){let t=new oA.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:aA,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}});return Qg.set(t,new ea(t)),t}function ey(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function Ud(e,t){let n=Qg.get(e);return n?n.write(t):new Promise(r=>{e.write(t,r)})}function ty(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=Jg(e,d);c.push({text:d.getChars()||" ",style:uA(d,o+a===i&&u===n.cursorX),...p?{href:p}:{}})}r.push({segments:cA(dA(c))})}return r}function cA(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&r.href===n.href&&mA(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};n.href&&(s.href=n.href),ny(n.style)||(s.style=n.style),t.push(s)}return t}function dA(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||n.href||!ny(n.style))break;t-=1}return e.slice(0,t)}function uA(e,t){let n={},r=Xg(e,"fg"),s=Xg(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 Xg(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"):lA[s]??pA(s)}function pA(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(fA).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 fA(e){return e===0?0:55+e*40}function mA(e,t){return qd(e)===qd(t)}function qd(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function ny(e){return qd(e)===""}var gA=hA(import.meta.url),yA=/^CTRL_([A-Z])$/,wA="\x1B[6n",kA="\x1B[c",TA="\x1B[?u",bA={ENTER:"\r",KP_ENTER:"\r",SHIFT_ENTER:`
276
- `,TAB:" ",SHIFT_TAB:"\x1B[Z",BACK_TAB:"\x1B[Z",BACKSPACE:"\x7F",DELETE:"\x1B[3~",ESCAPE:"\x1B",UP:"\x1B[A",DOWN:"\x1B[B",RIGHT:"\x1B[C",LEFT:"\x1B[D",HOME:"\x1B[H",END:"\x1B[F",PAGE_UP:"\x1B[5~",PAGE_DOWN:"\x1B[6~",CTRL_C:"",CTRL_D:""},ta=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")Bd(i),this.sessions.delete(n);else return this.attachedTabId=n,i.scrollbackLines=0,ry(i,r),this.getViewState(n);let o;try{o=this.createSession(t,n,r,s)}catch(a){throw this.recordActivity({taskId:t,tabId:n,sessionState:"failed",lastActivityAt:Date.now(),exitCode:null,error:a instanceof Error?a.message:String(a)}),a}return this.sessions.set(n,o),this.notifyActivity(o),this.attachedTabId=n,this.getViewState(n)}write(t){let n=this.getAttachedSession();!n||n.status!=="running"||(n.pty.write(t),(t.includes("\r")||t.includes(`
277
- `))&&this.touchActivity(n))}writeKey(t){let n=RA(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&&ry(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&&(Bd(n),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())Bd(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:PA(n),error:n.error,scrolledBack:n.scrollbackLines>0}:{status:"idle",rows:[],error:null,scrolledBack:!1}}createSession(t,n,r,s){let i=this.spawn??IA().spawn,o=Zg(r),a=s??this.resolveSessionSpec(t,n),l=ko({...this.env,...a.env??{}}),{executable:c,args:u}=vA(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:CA(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),AA(d,h),Ud(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),Ud(p.terminal,`\r
278
- [process exited ${h.exitCode}]`).then(()=>{p.screenDirty=!0,this.onUpdate?.({tabId:p.tabId,kind:"full"})})})),p}getAttachedSession(){return this.attachedTabId?this.sessions.get(this.attachedTabId)??null:null}touchActivity(t){t.lastActivityAt=Date.now(),this.activityEnabled&&this.notifyActivity(t)}notifyActivity(t){this.activityEnabled&&this.recordActivity(this.buildActivitySnapshot(t))}recordActivity(t){this.activityEnabled&&(this.activitySnapshots.set(t.tabId,t),this.onActivity?.(t))}removeActivity(t){this.activitySnapshots.delete(t)&&this.onActivityRemoved?.(t)}buildActivitySnapshot(t){return{taskId:t.taskId,tabId:t.tabId,sessionState:t.status==="failed"?"failed":t.status==="exited"?"exited":"running",lastActivityAt:t.lastActivityAt,exitCode:t.exitCode,error:t.error}}};function RA(e){if(e.length===1)return e;let t=bA[e];if(t!==void 0)return t;let n=yA.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function ry(e,t){SA(e.pty,t),ey(e.terminal,t),e.screenDirty=!0}function PA(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=ty(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function Bd(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function SA(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function IA(){return gA("node-pty")}function vA(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[To(t[0],n),...t.slice(1)].map(sy).join(" ")}; exec ${sy(e)} -l`;return{executable:e,args:["-lc",s]}}function sy(e){return`'${e.replaceAll("'","'\\''")}'`}function CA(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 AA(e,t){for(let n=0;n<Wd(t,wA);n+=1)e.write("\x1B[1;1R");for(let n=0;n<Wd(t,kA);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<Wd(t,TA);n+=1)e.write("\x1B[?0u")}function Wd(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 na=Sn,DA=16,_A=250;async function ay(e){let t=xe(e.paths);await MA(t,e.paths,e.spawnDaemon);let n=await hy(t.socketPath),r=new Vd(n,e);return await r.ready(),r}async function ly(e,t={}){let n=xe(e);await OA(e.runtimeDir,{recursive:!0}),await Ls(n.socketPath,{force:!0});let r=new Kd(e,t),s=EA(i=>r.handleConnection(i));try{await r.start(),await BA(s,n.socketPath),await $A(n.pidPath,String(process.pid),"utf8"),await ue.appendLogBestEffort(e,{level:"info",component:"daemon",event:"started",message:`PTY daemon started with protocol ${na}.`,details:{pid:process.pid,protocolVersion:na}}),await new Promise(i=>{let o=!1,a=()=>{o||(o=!0,r.closeClients(),s.close(()=>{process.removeListener("SIGTERM",a),process.removeListener("SIGINT",a),i()}))};r.onShutdown=a,process.once("SIGTERM",a),process.once("SIGINT",a)})}catch(i){throw await ue.appendLogBestEffort(e,{level:"error",component:"daemon",event:"failed",message:i instanceof Error?i.message:String(i),details:{pid:process.pid}}),i}finally{await ue.appendLogBestEffort(e,{level:"info",component:"daemon",event:"stopped",message:"PTY daemon stopped and disposed its remaining sessions.",details:{pid:process.pid,remainingSessionCount:r.sessionCount()}}),r.onShutdown=null,await Ls(n.socketPath,{force:!0}),await Ls(n.pidPath,{force:!0}),await r.stop(),r.disposeAll()}}async function cy(e){let t=xe(e);return await py(t.socketPath)?(await UA(t.socketPath),!0):!1}var Vd=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=na;options;async ready(){let t=await this.send({type:"ping"});if(!uy(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"&&ue.appendLogBestEffort(this.options.paths,{level:"debug",component:"pty",event:"hydration.missing",message:"No live PTY session was found for the persisted tab.",tabId:n}))}catch(r){let s=r instanceof Error?r.message:String(r);this.viewCache.set(n,{status:"failed",rows:[],error:s})}this.activityEnabled&&await this.refreshActivitySnapshots()}async pruneStale(t){await this.send({type:"pruneStale",keepTabIds:t})}write(t){this.send({type:"write",input:t}).catch(()=>{})}writeKey(t){this.send({type:"writeKey",key:t}).catch(()=>{})}scrollViewport(t){let n=this.attachedTabId;this.send({type:"scrollViewport",lines:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}resize(t){let n=this.attachedTabId;this.send({type:"resize",size:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}detach(){this.attachedTabId=null,this.send({type:"detach"}).catch(()=>{})}setViewedTab(t){this.closed||(this.viewedTabId=t,this.subscribeToView(t))}setActivityEnabled(t){if(!(this.closed||this.activityEnabled===t)){if(this.activityEnabled=t,!t){for(let n of[...this.activityCache.keys()])this.removeCachedActivity(n);this.send({type:"setActivityEnabled",enabled:t}).catch(()=>{});return}this.send({type:"setActivityEnabled",enabled:t}).then(()=>this.refreshActivitySnapshots(!0)).catch(()=>{})}}setPullRequestPollView(t){this.closed||this.pullRequestPollView.selectedTaskId===t.selectedTaskId&&this.pullRequestPollView.reviewVisible===t.reviewVisible||(this.pullRequestPollView=t,this.send({type:"setPullRequestPollView",view:t}).catch(()=>{}))}setTasksChangedHandler(t){this.tasksChangedHandler=t}setOpenFileHandler(t){this.openFileHandler=t}disposeSession(t){this.viewCache.delete(t),this.removeCachedActivity(t),this.attachedTabId===t&&(this.attachedTabId=null),this.send({type:"disposeSession",tabId:t}).catch(()=>{})}disposeAll(){this.attachedTabId=null,!this.closed&&(this.socket.end(),this.closed=!0)}getViewState(t){return t?this.viewCache.get(t)??{status:"idle",rows:[],error:null,scrolledBack:!1}:{status:"idle",rows:[],error:null,scrolledBack:!1}}getActivitySnapshots(){return[...this.activityCache.values()]}async requestShutdown(){await this.send({type:"shutdown"})}async send(t){if(this.closed)throw new Error("Craig PTY daemon connection is closed.");let n=this.nextRequestId;this.nextRequestId+=1;let r={...t,id:n},s=new Promise((o,a)=>{this.pending.set(n,{resolve:o,reject:a})});if(this.socket.destroyed)throw this.pending.delete(n),new Error("Craig PTY daemon connection is closed.");this.socket.write(`${JSON.stringify(r)}
277
+ `).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 xA,createConnection as dy}from"node:net";import{mkdir as FA,readFile as py,rm as Ms,writeFile as LA}from"node:fs/promises";import MA from"node:path";import{setTimeout as QC}from"node:timers/promises";var mn=class{jobs=new Map;resolutionMs;now;onError;timer=null;abortController=null;constructor(t){this.resolutionMs=Wu(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:Wu(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=Wu(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 Wu(e,t){if(!Number.isFinite(e)||e<=0)throw new Error(`${t} must be a positive number.`);return e}var GC="\x1B[200~",HC="\x1B[201~";function Qg(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 Zg(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 YC(e)}}function Qo(e,t){return{paste:`${GC}${e}${HC}`,submit:"\r",submitDelayMs:t}}function YC(e){throw new Error(`Unsupported prompt-delivery runner: ${String(e)}`)}import zC from"node:path";var JC={type:"system",component:"orchestration-supervisor"};async function ey(e){let t=zC.join(e.orchestrationDir,"command-event-reconciliation.json"),n=await Ws(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 XC(i))o.has(a)||(await vn(e,i,a,a==="command.queued"?i.actor:a==="command.cancelled"?i.cancelledBy??i.actor:JC),o.add(a),s=!0);n.commands[i.id]=[...o]}s&&await U(t,n)}function XC(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 mn({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 fu(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 Eo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)}),await ey(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,Ar("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 Eo(this.paths,{isAgentAvailable:n=>this.runtime.hasRunningSession(n)})}async reconcileCommand(t){if(Date.now()>=Date.parse(t.expiresAt)){await this.failCommand(t,Ar("PROMPT_DELIVERY_TIMEOUT",`Prompt delivery timed out after ${t.timeoutMs}ms.`,!1,!1));return}let n=await S.getTask(this.paths,t.taskId).catch(a=>{if(a instanceof g&&a.code==="TASK_NOT_FOUND")return null;throw a}),r=n?.ptyTabs.find(a=>a.id===t.agentTabId);if(!n||!r||r.kind!=="agent"||n.status==="closed"){await this.failCommand(t,Ar("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer available in task ${t.taskId}.`,!1,!1));return}let s=this.runtime.getActivitySnapshots().find(a=>a.tabId===t.agentTabId);if(s&&s.sessionState!=="running"){await this.failCommand(t,Ar("PROMPT_TARGET_UNAVAILABLE",`Agent tab ${t.agentTabId} is no longer running.`,!1,!1));return}if(!this.runtime.hasRunningSession(t.agentTabId)||t.delivery==="when-ready"&&Xt(n,t.agentTabId,this.runtime.getActivitySnapshots(),Date.now())!=="ready")return;let i=this.runtime.getStartupBlocker?.(t.agentTabId,r.runner??n.runner);if(i){await this.failCommand(t,Ar("PROMPT_STARTUP_BLOCKED",i,!0,!1));return}await de.beginDelivery(this.paths,t.id);try{let a=Zg(r.runner??n.runner,t.prompt.text);this.runtime.writeToSession(t.agentTabId,a.paste),await QC(a.submitDelayMs),this.runtime.writeToSession(t.agentTabId,a.submit)}catch(a){await this.failCommand(t,Ar("PROMPT_DELIVERY_UNCERTAIN",a instanceof Error?a.message:"Prompt delivery failed after it began.",!1,!0));return}let o=await de.completeDelivery(this.paths,t.id);await this.reconcileInitialPromptTask(o)}async failCommand(t,n){let r=await de.fail(this.paths,t.id,n);await this.reconcileInitialPromptTask(r)}async reconcileInitialPromptTask(t){if(!ZC(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}.`)}}},ZC=e=>e.idempotencyKey===`task-start:${e.taskId}`,Ar=(e,t,n,r)=>({code:e,message:t,retryable:n,deliveryUncertain:r});var eA={pendingForegroundMs:5e3,pendingBackgroundMs:15e3,stableForegroundMs:3e4,stableBackgroundMs:6e4,discoveryForegroundMs:6e4,discoveryBackgroundMs:18e4,rateLimitBaseMs:6e4,rateLimitMaxMs:15*6e4},Er=class{scheduledTasks=new Map;now;intervals;minimumIntervalMs;rateLimitFailures=0;notBefore=0;constructor(t={}){this.minimumIntervalMs=Math.max(1e3,t.minimumIntervalMs??5e3),this.intervals={...eA,...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=tA(t),s=t.id===n.selectedTaskId&&n.reviewVisible;if(r.length>0){let i=r.some(nA);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 tA(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 nA(e){return e.requiredChecks.some(t=>t.status==="pending"||t.status==="unknown")}import{watch as rA}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=rA(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 sA={selectedTaskId:null,reviewVisible:!1},iA={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))))},ta=class{constructor(t,n={}){this.paths=t;let r=n.heartbeatIntervalMs??1e3;this.dependencies=n.dependencies??iA,this.onTasksChanged=n.onTasksChanged??(()=>{}),this.onError=n.onError??(()=>{}),this.coordinator=new Er({...n.minimumIntervalMs!==void 0?{minimumIntervalMs:n.minimumIntervalMs}:{},...n.intervals?{intervals:n.intervals}:{},...n.now?{now:n.now}:{}}),this.eventMonitor=n.reconcileEvents?new ea(t,{reconcileEvents:n.reconcileEvents,onEvents:async s=>{let i=aA(s);i.length>0&&await this.onTasksChanged(i);let o=oA(s);o.length>0&&await this.wake(o)},onError:s=>this.reportError(s),...n.now?{now:n.now}:{}}):null,this.heartbeat=new mn({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=sA;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,ty(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)!==ty(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 oA(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=uA(n.data);if(n.type==="task.updated"){(Array.isArray(r?.changedFields)?r.changedFields:[]).some(i=>typeof i=="string"&&cA.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 aA(e){let t=new Set;for(let n of e)n.taskId&&lA(n)&&t.add(n.taskId);return[...t]}function lA(e){return e.type==="task.created"||e.type==="task.updated"||e.type==="task.closed"}var cA=new Set(["branch","lastCommitSha","checksStatus","checksLastRunAt"]),uA=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)?e:null;function ty(e){return JSON.stringify({status:e.status,prs:e.prs,repoTargets:e.repoTargets??null})}import{createRequire as bA}from"node:module";import pA from"@xterm/headless";var dA=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=dA.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 ny(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 fA=1e3,sy=new WeakMap,mA=["000000","cd3131","0dbc79","e5e510","2472c8","bc3fbc","11a8cd","e5e5e5","666666","f14c4c","23d18b","f5f543","3b8eea","d670d6","29b8db","ffffff"];function iy(e){let t=new pA.Terminal({allowProposedApi:!0,cols:e.columns,rows:e.rows,scrollback:fA,theme:{foreground:"#e6e6e6",background:"#0a0a0a"}});return sy.set(t,new na(t)),t}function oy(e,t){(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function Ku(e,t){let n=sy.get(e);return n?n.write(t):new Promise(r=>{e.write(t,r)})}function ay(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=ny(e,u);c.push({text:u.getChars()||" ",style:yA(u,o+a===i&&d===n.cursorX),...p?{href:p}:{}})}r.push({segments:hA(gA(c))})}return r}function hA(e){let t=[];for(let n of e){let r=t.at(-1);if(r&&r.href===n.href&&TA(r.style,n.style)){r.text+=n.text;continue}let s={text:n.text};n.href&&(s.href=n.href),ly(n.style)||(s.style=n.style),t.push(s)}return t}function gA(e){let t=e.length;for(;t>0;){let n=e[t-1];if(!n||n.text!==" "||n.href||!ly(n.style))break;t-=1}return e.slice(0,t)}function yA(e,t){let n={},r=ry(e,"fg"),s=ry(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 ry(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"):mA[s]??wA(s)}function wA(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(kA).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 kA(e){return e===0?0:55+e*40}function TA(e,t){return Vu(e)===Vu(t)}function Vu(e){return e?[e.fg??"",e.bg??"",e.bold?"b":"",e.dim?"d":"",e.italic?"i":"",e.underline?"u":"",e.inverse?"v":""].join("|"):""}function ly(e){return Vu(e)===""}var RA=bA(import.meta.url),PA=/^CTRL_([A-Z])$/,SA="\x1B[6n",IA="\x1B[c",vA="\x1B[?u",CA={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")Gu(i),this.sessions.delete(n);else return this.attachedTabId=n,i.scrollbackLines=0,cy(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=AA(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&&cy(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&&(Gu(n),this.sessions.delete(t)),this.removeActivity(t),this.attachedTabId===t&&(this.attachedTabId=null)}disposeAll(){for(let t of this.sessions.values())Gu(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:EA(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 Qg(n,i)}createSession(t,n,r,s){let i=this.spawn??$A().spawn,o=iy(r),a=s??this.resolveSessionSpec(t,n),l=To({...this.env,...a.env??{}}),{executable:c,args:d}=NA(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:DA(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),_A(u,h),Ku(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),Ku(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 AA(e){if(e.length===1)return e;let t=CA[e];if(t!==void 0)return t;let n=PA.exec(e);return n?.[1]?String.fromCharCode(n[1].charCodeAt(0)-64):null}function cy(e,t){OA(e.pty,t),oy(e.terminal,t),e.screenDirty=!0}function EA(e){return(e.screenDirty||e.renderedScrollbackLines!==e.scrollbackLines)&&(e.rows=ay(e.terminal,e.scrollbackLines),e.renderedScrollbackLines=e.scrollbackLines,e.screenDirty=!1),e.rows}function Gu(e){for(let t of e.disposables)t.dispose();e.terminal.dispose(),e.pty.kill()}function OA(e,t){t.columns>0&&t.rows>0&&(e.cols!==t.columns||e.rows!==t.rows)&&e.resize(t.columns,t.rows)}function $A(){return RA("node-pty")}function NA(e,t,n){if(t.length===0)return{executable:e,args:[]};let s=`${[bo(t[0],n),...t.slice(1)].map(uy).join(" ")}; exec ${uy(e)} -l`;return{executable:e,args:["-lc",s]}}function uy(e){return`'${e.replaceAll("'","'\\''")}'`}function DA(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 _A(e,t){for(let n=0;n<Hu(t,SA);n+=1)e.write("\x1B[1;1R");for(let n=0;n<Hu(t,IA);n+=1)e.write("\x1B[?1;2c");for(let n=0;n<Hu(t,vA);n+=1)e.write("\x1B[?0u")}function Hu(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=bt,jA=16,qA=250;async function fy(e){let t=Fe(e.paths);await VA(t,e.paths,e.spawnDaemon);let n=await by(t.socketPath),r=new Yu(n,e);return await r.ready(),r}async function my(e,t={}){let n=Fe(e);await FA(e.runtimeDir,{recursive:!0}),await Ms(n.socketPath,{force:!0});let r=new zu(e,t),s=xA(i=>r.handleConnection(i));try{await YA(s,n.socketPath),await r.start(),await LA(n.pidPath,String(process.pid),"utf8"),await ue.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 ue.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 ue.appendLogBestEffort(e,{level:"info",component:"daemon",event:"stopped",message:"PTY daemon stopped and disposed its remaining sessions.",details:{pid:process.pid,remainingSessionCount:r.sessionCount()}}),r.onShutdown=null,await Ms(n.socketPath,{force:!0}),await Ms(n.pidPath,{force:!0}),await r.stop(),r.disposeAll()}}async function hy(e){let t=Fe(e);return await wy(t.socketPath)?(await HA(t.socketPath),!0):!1}var Yu=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(!yy(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"&&ue.appendLogBestEffort(this.options.paths,{level:"debug",component:"pty",event:"hydration.missing",message:"No live PTY session was found for the persisted tab.",tabId:n}))}catch(r){let s=r instanceof Error?r.message:String(r);this.viewCache.set(n,{status:"failed",rows:[],error:s})}this.activityEnabled&&await this.refreshActivitySnapshots()}async pruneStale(t){await this.send({type:"pruneStale",keepTabIds:t})}write(t){this.send({type:"write",input:t}).catch(()=>{})}writeKey(t){this.send({type:"writeKey",key:t}).catch(()=>{})}scrollViewport(t){let n=this.attachedTabId;this.send({type:"scrollViewport",lines:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}resize(t){let n=this.attachedTabId;this.send({type:"resize",size:t}).then(r=>{n&&r.view&&(this.viewCache.set(n,r.view),this.notifyFullUpdate(n))}).catch(()=>{})}detach(){this.attachedTabId=null,this.send({type:"detach"}).catch(()=>{})}setViewedTab(t){this.closed||(this.viewedTabId=t,this.subscribeToView(t))}setActivityEnabled(t){if(!(this.closed||this.activityEnabled===t)){if(this.activityEnabled=t,!t){for(let n of[...this.activityCache.keys()])this.removeCachedActivity(n);this.send({type:"setActivityEnabled",enabled:t}).catch(()=>{});return}this.send({type:"setActivityEnabled",enabled:t}).then(()=>this.refreshActivitySnapshots(!0)).catch(()=>{})}}setPullRequestPollView(t){this.closed||this.pullRequestPollView.selectedTaskId===t.selectedTaskId&&this.pullRequestPollView.reviewVisible===t.reviewVisible||(this.pullRequestPollView=t,this.send({type:"setPullRequestPollView",view:t}).catch(()=>{}))}setTasksChangedHandler(t){this.tasksChangedHandler=t}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
283
  `);let i=await s;if(!i.ok)throw new Error(i.error);return i}handleData(t){this.buffer+=t;let n=this.buffer.indexOf(`
280
284
  `);for(;n!==-1;){let r=this.buffer.slice(0,n);this.buffer=this.buffer.slice(n+1),this.handleMessage(r),n=this.buffer.indexOf(`
281
- `)}}handleMessage(t){if(t.trim().length===0)return;let n;try{n=JSON.parse(t)}catch{return}if("id"in n){let r=this.pending.get(n.id);if(!r)return;this.pending.delete(n.id),r.resolve(n);return}if(n.type==="update"){if("view"in n){this.viewCache.set(n.tabId,n.view),this.viewedTabId===n.tabId&&this.notifyFullUpdate(n.tabId);return}let r=this.viewCache.get(n.tabId)??{status:"idle",rows:[],error:null,scrolledBack:!1},s=LA(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)}}},Kd=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 ta({...r,workspaceRoot:t.workspaceRoot,activityEnabled:!1,onUpdate:s=>this.handleRuntimeUpdate(s.tabId),onActivity:s=>this.handleActivityUpdate(s),onActivityRemoved:s=>this.handleActivityRemoved(s)})}async start(){let t=await T.load(this.paths);if(this.pullRequestSyncOptions!==!1){let r=this.pullRequestSyncOptions??{},s=r.reconcileEvents===!1?!1:r.reconcileEvents??(()=>ln(this.paths,{agentObserver:{daemonAvailable:!0,getSnapshots:()=>this.runtime.getActivitySnapshots(),subscribe:()=>()=>{},close:()=>{}}}));this.pullRequestEventReconciliationEnabled=!!s,this.pullRequestSyncSupervisor=new Zo(this.paths,{...r,reconcileEvents:s,minimumIntervalMs:r.minimumIntervalMs??(t.github?.watchIntervalSeconds??5)*1e3,onTasksChanged:async i=>{this.broadcastTasksChanged(i),await r.onTasksChanged?.(i)},onError:async i=>{await ue.appendErrorLogBestEffort(this.paths,{context:"pull request sync supervisor",message:i instanceof Error?i.message:String(i)}),await r.onError?.(i)}}),this.pullRequestSyncSupervisor.start(),this.updateRuntimeActivityEnabled()}let n=(await Je(this.paths)).some(r=>r.state==="queued"||r.state==="delivering");(T.previews.isEnabled(t,"agentOrchestration")||n)&&await this.ensureOrchestrationSupervisor()}async stop(){await this.pullRequestSyncSupervisor?.stop(),this.pullRequestSyncSupervisor=null,this.pullRequestEventReconciliationEnabled=!1,this.updateRuntimeActivityEnabled(),await this.orchestrationSupervisor?.stop(),this.orchestrationSupervisor=null}handleConnection(t){let n="";this.clients.add(t),this.subscriptions.set(t,{activityEnabled:!1,tabId:null,view:null,rowKeys:[],pullRequestPollView:{selectedTaskId:null,reviewVisible:!1},navigationEnabled:!1}),t.setEncoding("utf8"),t.on("data",s=>{n+=String(s);let i=n.indexOf(`
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=WA(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)}}},zu=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 ue.appendErrorLogBestEffort(this.paths,{context:"pull request sync supervisor",message:i instanceof Error?i.message:String(i)}),await r.onError?.(i)}}),this.pullRequestSyncSupervisor.start(),this.updateRuntimeActivityEnabled()}let n=(await Me(this.paths)).some(r=>r.state==="queued"||r.state==="delivering")||(await Pi(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(`
282
286
  `);for(;i!==-1;){let o=n.slice(0,i);n=n.slice(i+1),this.handleLine(t,o),i=n.indexOf(`
283
- `)}});let r=()=>{this.clients.delete(t),this.subscriptions.delete(t),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()),this.hasActivitySubscribers()||(this.updateRuntimeActivityEnabled(),this.clearPendingActivityBroadcasts())};t.on("close",r),t.on("error",r)}disposeAll(){for(let t of this.updateTimers.values())clearTimeout(t);this.updateTimers.clear();for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear(),this.runtime.disposeAll()}sessionCount(){return this.runtime.sessionTabIds().length}closeClients(){for(let t of this.clients)t.destroy();this.clients.clear(),this.subscriptions.clear(),this.updateRuntimeActivityEnabled()}async handleLine(t,n){if(n.trim().length===0)return;let r;try{r=JSON.parse(n)}catch{mn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);mn(t,{id:r.id,ok:!0,...r.type==="ping"?{protocolVersion:na,sessionCount:this.runtime.sessionTabIds().length}:{},...r.type==="getActivitySnapshots"?{activities:this.runtime.getActivitySnapshots()}:{},...typeof s=="number"?{deliveredCount:s}:s?{view:s}:{}})}catch(s){let i=s instanceof Error?s.message:String(s);mn(t,{id:r.id,ok:!1,error:i})}}async handleRequest(t,n){switch(n.type){case"ping":return null;case"ensureSession":{let r=this.runtime.hasRunningSession(n.tabId),s=this.runtime.ensureSession(n.taskId,n.tabId,n.size,n.spec);return r||this.log({level:"info",component:"pty",event:"spawned",message:"PTY session spawned.",taskId:n.taskId,tabId:n.tabId}),this.attachedTabId=n.tabId,this.subscribe(t,n.tabId,s)}case"hydrateSession":return this.runtime.getViewState(n.tabId);case"write":return this.runtime.write(n.input),null;case"writeKey":return this.runtime.writeKey(n.key),null;case"scrollViewport":return this.runtime.scrollViewport(n.lines),this.runtime.getViewState(this.attachedTabId);case"resize":return this.runtime.resize(n.size),this.runtime.getViewState(this.attachedTabId);case"detach":return this.attachedTabId&&this.log({level:"debug",component:"pty",event:"detached",message:"Client detached from PTY session.",tabId:this.attachedTabId}),this.runtime.detach(),this.attachedTabId=null,null;case"disposeSession":return this.log({level:"info",component:"pty",event:"disposed",message:"PTY session disposed because its tab was closed.",tabId:n.tabId,details:{reason:"tab_closed"}}),this.runtime.disposeSession(n.tabId),this.attachedTabId===n.tabId&&(this.attachedTabId=null),null;case"setViewUpdateMode":return this.runtime.getViewState(this.attachedTabId);case"setActivityEnabled":return this.setActivityEnabled(t,n.enabled),null;case"subscribeView":return this.subscribe(t,n.tabId,this.runtime.getViewState(n.tabId));case"pruneStale":{let r=new Set(n.keepTabIds),s=new Set([...this.runtime.sessionTabIds(),...this.runtime.getActivitySnapshots().map(i=>i.tabId)]);for(let i of s)r.has(i)||(this.log({level:"info",component:"pty",event:"disposed",message:"PTY session disposed because its tab is no longer active.",tabId:i,details:{reason:"stale_tab"}}),this.runtime.disposeSession(i),this.attachedTabId===i&&(this.attachedTabId=null));return null}case"getViewState":return this.runtime.getViewState(n.tabId);case"getActivitySnapshots":return null;case"setPullRequestPollView":return this.setPullRequestPollView(t,n.view),null;case"subscribeNavigation":{let r=this.subscriptions.get(t);return r&&this.subscriptions.set(t,{...r,navigationEnabled:!0}),null}case"openFile":return this.broadcastOpenFile(t,n.path);case"wakeOrchestration":return await this.ensureOrchestrationSupervisor(),await this.orchestrationSupervisor.wake(),null;case"shutdown":return this.log({level:"warn",component:"daemon",event:"shutdown.requested",message:"PTY daemon shutdown was explicitly requested.",details:{liveSessionCount:this.runtime.sessionTabIds().length}}),setTimeout(()=>this.onShutdown?.(),0),null;default:return VA(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(Gd),pullRequestPollView:s?.pullRequestPollView??{selectedTaskId:null,reviewVisible:!1},navigationEnabled:s?.navigationEnabled??!1}),r}setActivityEnabled(t,n){let r=this.subscriptions.get(t);if(!r)return;this.subscriptions.set(t,{...r,activityEnabled:n});let s=this.hasActivitySubscribers();this.updateRuntimeActivityEnabled(),s||this.clearPendingActivityBroadcasts()}setPullRequestPollView(t,n){let r=this.subscriptions.get(t);r&&(this.subscriptions.set(t,{...r,pullRequestPollView:n}),this.pullRequestSyncSupervisor?.setView(this.getPullRequestPollView()))}getPullRequestPollView(){let t=[...this.subscriptions.values()].map(n=>n.pullRequestPollView);return t.find(n=>n.selectedTaskId&&n.reviewVisible)??t.find(n=>n.selectedTaskId)??{selectedTaskId:null,reviewVisible:!1}}broadcastTasksChanged(t){for(let n of this.clients)mn(n,{type:"tasksChanged",taskIds:t})}broadcastOpenFile(t,n){let r=0;for(let[s,i]of this.subscriptions)s===t||!i.navigationEnabled||(mn(s,{type:"openFile",path:n}),r+=1);return r}handleRuntimeUpdate(t){this.scheduleBroadcastUpdate(t)}handleActivityUpdate(t){if(t.sessionState!=="running"&&this.log({level:t.sessionState==="failed"||t.exitCode!==0?"error":"info",component:"pty",event:"exited",message:t.sessionState==="failed"?"PTY session failed.":"PTY process exited.",taskId:t.taskId,tabId:t.tabId,details:{sessionState:t.sessionState,exitCode:t.exitCode,error:t.error}}),this.pullRequestSyncSupervisor?.notifyActivity(t),!!this.hasActivitySubscribers()){if(this.pendingActivities.set(t.tabId,t),t.sessionState!=="running"){let n=this.activityTimers.get(t.tabId);n&&(clearTimeout(n),this.activityTimers.delete(t.tabId)),this.broadcastActivity(t.tabId);return}this.activityTimers.has(t.tabId)||this.activityTimers.set(t.tabId,setTimeout(()=>{this.activityTimers.delete(t.tabId),this.broadcastActivity(t.tabId)},_A))}}handleActivityRemoved(t){this.pullRequestSyncSupervisor?.notifyActivityRemoved(t);let n=this.activityTimers.get(t);n&&(clearTimeout(n),this.activityTimers.delete(t)),this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&mn(r,{type:"activityRemoved",tabId:t})}broadcastActivity(t){let n=this.pendingActivities.get(t);if(n){this.pendingActivities.delete(t);for(let[r,s]of this.subscriptions)s.activityEnabled&&mn(r,{type:"activity",snapshot:n})}}hasActivitySubscribers(){return[...this.subscriptions.values()].some(t=>t.activityEnabled)}clearPendingActivityBroadcasts(){for(let t of this.activityTimers.values())clearTimeout(t);this.activityTimers.clear(),this.pendingActivities.clear()}async ensureOrchestrationSupervisor(){this.orchestrationSupervisor||(this.orchestrationSupervisorStartup||(this.orchestrationSupervisorStartup=this.startOrchestrationSupervisor().finally(()=>{this.orchestrationSupervisorStartup=null})),this.orchestrationSupervisor=await this.orchestrationSupervisorStartup,this.updateRuntimeActivityEnabled())}async startOrchestrationSupervisor(){let t=new Xo(this.paths,this.runtime,{onError:n=>ue.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor",message:n instanceof Error?n.message:String(n)})});try{return await t.start(),await ue.appendLogBestEffort(this.paths,{level:"info",component:"orchestration",event:"supervisor.started",message:"Orchestration supervisor is ready."}),t}catch(n){throw await ue.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor startup",message:n instanceof Error?n.message:String(n)}),n}}updateRuntimeActivityEnabled(){this.runtime.setActivityEnabled(this.orchestrationSupervisor!==null||this.pullRequestEventReconciliationEnabled||this.hasActivitySubscribers())}log(t){ue.appendLogBestEffort(this.paths,t)}scheduleBroadcastUpdate(t){this.updateTimers.has(t)||!this.hasViewSubscriber(t)||this.updateTimers.set(t,setTimeout(()=>{this.updateTimers.delete(t),this.broadcastUpdate(t)},DA))}hasViewSubscriber(t){for(let n of this.subscriptions.values())if(n.tabId===t)return!0;return!1}broadcastUpdate(t){let n=this.runtime.getViewState(t);for(let r of this.clients){let s=this.subscriptions.get(r);if(!s||s.tabId!==t)continue;let i=xA(s,n),o=FA(s.view,n);s.view=n,s.rowKeys=n.rows.map(Gd),(i.rows.length>0||o)&&mn(r,{type:"update",tabId:t,patch:i})}}};function xA(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==Gd(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 FA(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 LA(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function Gd(e){return JSON.stringify(e)}async function MA(e,t,n){if(await jA(e.socketPath,1e3))return;if(await py(e.socketPath)){let i=await fy(e.socketPath).catch(()=>null),o=i?.ok?i.protocolVersion??"unknown":"unknown",a=i?.ok?i.sessionCount??"unknown":"unknown";throw await ue.appendLogBestEffort(t,{level:"warn",component:"daemon",event:"upgrade.blocked",message:`Left incompatible protocol ${o} daemon running to preserve possible live PTYs.`,details:{protocolVersion:o,sessionCount:a}}),new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly; this client will not replace a live workspace daemon.")}await qA(e,t),bo(t,n);let r=Date.now();for(;Date.now()-r<5e3;){if(await dy(e.socketPath))return;await gy(50)}let s=await oy(NA.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${s?`
284
- ${s.slice(-2e3)}`:""}`)}async function dy(e){let t=await fy(e).catch(()=>null);return t?.ok===!0&&uy(t.protocolVersion)}function uy(e){return Xt(e)}async function jA(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await dy(e))return!0;await gy(50)}return!1}async function qA(e,t){let n=await oy(e.pidPath,"utf8").catch(()=>null);if(n){let r=Number(n.trim());if(Number.isInteger(r)&&r>0&&WA(r))return;await ue.appendLogBestEffort(t,{level:"warn",component:"daemon",event:"previous_exit.unclean",message:"Found stale daemon state from a process that is no longer running.",details:{previousPid:Number.isInteger(r)?r:null}})}await Ls(e.socketPath,{force:!0}),await Ls(e.pidPath,{force:!0})}async function py(e){let t=await hy(e).catch(()=>null);return t?(t.end(),!0):!1}async function UA(e){await my(e,{id:1,type:"shutdown"}).catch(()=>null)}async function fy(e){return my(e,{id:1,type:"ping"})}function my(e,t){return new Promise((n,r)=>{let s=iy(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)}
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{hn(t,{id:-1,ok:!1,error:"Malformed daemon request."});return}try{let s=await this.handleRequest(t,r);hn(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);hn(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=>ue.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 JA(n)}}subscribe(t,n,r){let s=this.subscriptions.get(t);return this.subscriptions.set(t,{activityEnabled:s?.activityEnabled??!1,tabId:n,view:r,rowKeys:r.rows.map(Ju),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)hn(n,{type:"tasksChanged",taskIds:t})}broadcastOpenFile(t,n){let r=0;for(let[s,i]of this.subscriptions)s===t||!i.navigationEnabled||(hn(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)},qA))}}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&&hn(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&&hn(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=>ue.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor",message:n instanceof Error?n.message:String(n)})});try{return await t.start({deferReconciliation:!0}),await ue.appendLogBestEffort(this.paths,{level:"info",component:"orchestration",event:"supervisor.started",message:"Orchestration supervisor is ready."}),t}catch(n){throw await ue.appendErrorLogBestEffort(this.paths,{context:"orchestration supervisor startup",message:n instanceof Error?n.message:String(n)}),n}}updateRuntimeActivityEnabled(){this.runtime.setActivityEnabled(this.orchestrationSupervisor!==null||this.pullRequestEventReconciliationEnabled||this.hasActivitySubscribers())}log(t){ue.appendLogBestEffort(this.paths,t)}scheduleBroadcastUpdate(t){this.updateTimers.has(t)||!this.hasViewSubscriber(t)||this.updateTimers.set(t,setTimeout(()=>{this.updateTimers.delete(t),this.broadcastUpdate(t)},jA))}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=UA(s,n),o=BA(s.view,n);s.view=n,s.rowKeys=n.rows.map(Ju),(i.rows.length>0||o)&&hn(r,{type:"update",tabId:t,patch:i})}}};function UA(e,t){let n=[];for(let r=0;r<t.rows.length;r+=1){let s=t.rows[r];e.rowKeys[r]!==Ju(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 BA(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 WA(e,t){return e.status!==t.status||e.error!==t.error||(e.scrolledBack??!1)!==t.scrolledBack||e.rows.length!==t.rowCount}function Ju(e){return JSON.stringify(e)}async function VA(e,t,n){if(await KA(e.socketPath,1e3))return;if(await wy(e.socketPath)){let i=await ky(e.socketPath).catch(()=>null),o=i?.ok?i.protocolVersion??"unknown":"unknown",a=i?.ok?i.sessionCount??"unknown":"unknown";throw await ue.appendLogBestEffort(t,{level:"warn",component:"daemon",event:"upgrade.blocked",message:`Left incompatible protocol ${o} daemon running to preserve possible live PTYs.`,details:{protocolVersion:o,sessionCount:a}}),new Error("A live Craig PTY daemon is using an incompatible protocol. Exit the other Craig instance and restart explicitly; this client will not replace a live workspace daemon.")}await GA(e,t),Ro(t,n);let r=Date.now();for(;Date.now()-r<5e3;){if(await gy(e.socketPath))return;await Ry(50)}let s=await py(MA.join(t.runtimeDir,"pty-daemon.log"),"utf8").catch(()=>"");throw new Error(`Craig PTY daemon did not start.${s?`
288
+ ${s.slice(-2e3)}`:""}`)}async function gy(e){let t=await ky(e).catch(()=>null);return t?.ok===!0&&yy(t.protocolVersion)}function yy(e){return Qt(e)}async function KA(e,t){let n=Date.now();for(;Date.now()-n<t;){if(await gy(e))return!0;await Ry(50)}return!1}async function GA(e,t){let n=await py(e.pidPath,"utf8").catch(()=>null);if(n){let r=Number(n.trim());if(Number.isInteger(r)&&r>0&&zA(r))return;await ue.appendLogBestEffort(t,{level:"warn",component:"daemon",event:"previous_exit.unclean",message:"Found stale daemon state from a process that is no longer running.",details:{previousPid:Number.isInteger(r)?r:null}})}await Ms(e.socketPath,{force:!0}),await Ms(e.pidPath,{force:!0})}async function wy(e){let t=await by(e).catch(()=>null);return t?(t.end(),!0):!1}async function HA(e){await Ty(e,{id:1,type:"shutdown"}).catch(()=>null)}async function ky(e){return Ty(e,{id:1,type:"ping"})}function Ty(e,t){return new Promise((n,r)=>{let s=dy(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)}
285
289
  `)),s.once("error",l=>{a(),r(l)}),s.on("data",l=>{i+=String(l);let c=i.indexOf(`
286
- `);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 hy(e){return new Promise((t,n)=>{let r=iy(e);r.once("connect",()=>t(r)),r.once("error",n)})}function BA(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,n)})}function mn(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
287
- `)}catch{}}function WA(e){try{return process.kill(e,0),!0}catch{return!1}}function gy(e){return new Promise(t=>setTimeout(t,e))}function VA(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var wy=["Runners","Feature Previews","Logs","Help"],ky=["piRunner","fileOpen","panelPolish"],Ty={agentOrchestration:"Agent orchestration",fileOpen:"Agent file opening",piRunner:"Pi coding agent runner",panelPolish:"Panel polish"};function Yd(e,t){return Hd(e).map(n=>{let r=T.runners.getProfile(n),s=e.runners?.[n]?.enabled!==!1,i=e.runners?.[n]?.path?.trim(),o=t.pathEdit?.runner===n?`${t.pathEdit.value}_`:i&&i.length>0?i:`default (${r.executable})`;return`${r.displayName} ${s?"enabled":"disabled"} ${o}`})}function by(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 Ry(e=[]){let t=ky.some(n=>!e.includes(n));return wy.map((n,r)=>r===1&&t?`${n} \xB7 NEW`:n)}function Py(e,t=[]){return De.map(n=>{let r=T.previews.isEnabled(e,n),s=ky.includes(n)&&!t.includes(n);return`${r?"[x]":"[ ]"} ${Ty[n]}${s?" \xB7 NEW":""}`})}function Sy(e){return e.message??"Experimental features may change or be removed. Enter toggles."}function Iy(e,t){return t==="UP"||t==="k"?{kind:"render",menuIndex:Math.max(0,e-1)}:t==="DOWN"||t==="j"?{kind:"render",menuIndex:Math.min(wy.length-1,e+1)}:t==="ESCAPE"?{kind:"back"}:ra(t)?e===0?{kind:"runners"}:e===1?{kind:"previews"}:e===2?{kind:"logs"}:{kind:"help"}:{kind:"noop",menuIndex:e}}function vy(e,t,n){if(n==="UP"||n==="k")return{kind:"render",state:{...e,menuIndex:Math.max(0,e.menuIndex-1),message:null}};if(n==="DOWN"||n==="j")return{kind:"render",state:{...e,menuIndex:Math.min(De.length-1,e.menuIndex+1),message:null}};if(n==="ESCAPE")return{kind:"back",state:e};if(!ra(n))return{kind:"noop",state:e};let r=De[e.menuIndex]??De[0],s=!T.previews.isEnabled(t,r);return{kind:"save-enabled",feature:r,enabled:s,state:{...e,message:`${Ty[r]} ${s?"enabled":"disabled"}.`}}}function Cy(e,t,n,r){if(e.pathEdit)return KA({...e,pathEdit:e.pathEdit},t,n);let s=Yd(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=Hd(t)[e.menuIndex]??"codex";return{kind:"render",state:{...e,message:null,pathEdit:{runner:a,value:t.runners?.[a]?.path??""}}}}if(!ra(n))return{kind:"noop",state:e};let i=Hd(t)[e.menuIndex]??"codex",o=t.runners?.[i]?.enabled!==!1;return o&&r.length<=1?{kind:"render",state:{...e,message:"At least one runner must stay enabled."}}:{kind:"save-enabled",runner:i,enabled:!o,state:{...e,message:`${T.runners.getProfile(i).displayName} ${o?"disabled":"enabled"}.`}}}function Hd(e){return de.filter(t=>t!=="pi"||T.previews.isEnabled(e,"piRunner"))}function KA(e,t,n){if(n==="ESCAPE")return{kind:"render",state:yy({...e,message:null})};if(n==="BACKSPACE")return{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:e.pathEdit.value.slice(0,-1)}}};if(ra(n)){let r=e.pathEdit.runner,s=e.pathEdit.value.trim();return{kind:"save-path",runner:r,path:s.length>0?s:null,state:yy({...e,message:s.length>0?`${T.runners.getProfile(r).displayName} executable saved.`:`${T.runners.getProfile(r).displayName} executable reset to default.`})}}return GA(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function yy(e){let t={...e};return delete t.pathEdit,t}function ra(e){return e==="ENTER"||e==="RETURN"||e==="CTRL_M"||e==="\r"||e===`
288
- `}function GA(e){return e.length===1&&e>=" "&&e!==""}var HA=/^\d+\.\d+\.\d+$/;async function Ay(e,t={runCommand:K}){if(!HA.test(e))throw new Error(`Cannot install invalid Craig version: ${e}`);await t.runCommand("npm",["install","--global",`craig-cli@${e}`])}import Ms from"node:path";function Ey(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 Oy="\u{F024B} ",$y="\u{F0DCF} ",Ny="\u25CB",zd="\uEA64",Dy="\uEAFE",_y="\uEBDA",Jd="\u25CB",Xd="\u25CF",Qd="\u2713",Zd="\u2715";function xy(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 eu=150,Fy=6;function Ly(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||Ge(i.id,n,r)!=="ready"||e.readAgentActivityAt[i.id]===o.lastActivityAt?e:{...e,readAgentActivityAt:{...e.readAgentActivityAt,[i.id]:o.lastActivityAt}}}function sa(e,t,n,r){return t.some(s=>e.includes(s.tabId)&&Ge(s.tabId,t,n)==="ready"&&s.lastActivityAt>(r[s.tabId]??-1))}var oa="empty",fe={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function Uy(e,t,n){let r=JA(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=DE(t.tasks),u=ZA(e,a),d=QA(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?T.runners.getDisplayName(a.runner):T.runners.getDisplayName(e.selectedRunner);return{inputMode:e.inputMode,modalInput:e.taskPromptInput!==null||e.workspaceBrowser!==null,focusedRegion:e.focusedRegion,actionMessage:e.actionMessage,footerToast:e.footerToast,terminal:e.terminal,footerText:e.workspaceBrowser!==null?e.workspaceBrowser.query!==null?`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} Search: ${e.workspaceBrowser.query} \u2191\u2193 move Enter select Esc clear search`:`BROWSE WORKSPACE ${e.workspaceBrowser.cwd} \u2191\u2193 move \u2192 open \u2190 up / search Enter add repo Esc cancel`:e.taskPromptInput!==null?`NEW TASK [${e.taskPromptTarget?.name??s?.name??"no workspace"}] \xB7 ${T.runners.getDisplayName(e.selectedRunner)} Ctrl+R switch runner Enter create Esc cancel \u203A ${e.taskPromptInput}${e.taskPromptError?` \u2717 ${e.taskPromptError}`:""}`:e.inputMode==="terminal"?"TERMINAL \u2191\u2193/PgUp/PgDn scroll Ctrl+] return to control":e.focusedRegion==="tasks"?e.selectedLeftItemId?.startsWith("new-task:")||e.selectedLeftItemId?.startsWith("new-task-workspace:")?`r runner [${T.runners.getDisplayName(e.selectedRunner)}] Enter create task Esc pause ? help`:$s(e.selectedLeftItemId)?"n new task Enter attach X close task Esc pause ? help":e.selectedLeftItemId?.startsWith("workspace:")?"n new task Enter select X remove workspace Esc pause ? help":"n new task Enter select Esc pause ? help":e.focusedRegion==="center"?a===null?"n new task Tab tasks Esc pause ? help":u===V?"\u2191\u2193/wheel/PgUp/PgDn scroll \u2190/\u2192 switch Tab inspector Esc pause ? help":`+ new tab a ${T.runners.getDisplayName(e.centerTabRunner??a?.runner??e.selectedRunner)} r runner t terminal x close Enter attach Esc pause ? help`:e.inspectionMode==="review"?l?"\u2191\u2193 targets Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 changes Enter open change Wheel/PgUp/PgDn scroll o open PR R refresh checks X close task \u2190/\u2192 mode Esc pause ? help":e.inspectionMode==="files"?e.fileSearchQuery!==null?`Search: ${e.fileSearchQuery} \u2191\u2193 navigate Enter open Esc cancel search`:"\u2191\u2193 navigate / search Enter open file \u2190/\u2192 mode Esc pause ? help":"\u2191\u2193 navigate \u2190/\u2192 mode Esc pause ? help",topRail:{workspacePath:Ms.relative(process.env.HOME??"",t.workspaceRoot).length>0?`~/${Ms.relative(process.env.HOME??"",t.workspaceRoot)}`:t.workspaceRoot,agent:m},leftTree:YA(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>_E(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:f,agent:m},centerTranscript:XA(u,e,s,a,e.workspaceBrowser,h,r),tabs:d,rightContext:NE(s,a),rightInspection:pE(e,a,h)}}function YA(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 zA(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=Fo(t.tasks,o.id);if(c.length===0)r.push({text:" \xB7 no tasks yet",indent:0,muted:!0});else for(let{task:u,visualDepth:d}of Es(c)){let p=e.selectedLeftItemId===`task:${u.id}`,h=u.title.length>28?`${u.title.slice(0,25)}\u2026`:u.title,f={id:`task:${u.id}`,taskId:u.id,text:n?h:`${p?"\u25B8":"\u2022"} ${h}`,indent:d===0?2:4,selected:p,focused:p&&e.focusedRegion==="tasks",...n?{activity:rr(u,n.snapshots,n.now),activityAnimationFrame:n.animationFrame,unread:sa(u.ptyTabs.filter(y=>y.kind==="agent").map(y=>y.id),n.snapshots,n.now,e.readAgentActivityAt)}:{}},m=Wy(u);m&&(f.prBadge=m),r.push(f)}if(o.kind==="project"){let u=`new-task-workspace:${o.id}`,d=e.selectedLeftItemId===u;r.push({id:u,text:`+ New Project Task [${T.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:d,focused:d&&e.focusedRegion==="tasks",muted:!d})}if(o.kind==="repo"){let u=`new-task:${o.primaryRepoId}`,d=e.selectedLeftItemId===u;r.push({id:u,text:`+ New Task [${T.runners.getDisplayName(e.selectedRunner)}]`,indent:2,selected:d,focused:d&&e.focusedRegion==="tasks",muted:!d})}else{r.push({text:` Repos (${l.length})`,indent:0,muted:!0});for(let u of l.slice(0,6)){let d=t.repos.find(p=>p.id===u);r.push({text:` \xB7 ${d?.name??u}`,indent:0,muted:!0})}l.length>6&&r.push({text:` \xB7 ${l.length-6} more`,indent:0,muted:!0})}}let i=e.selectedLeftItemId==="new-workspace";return r.push({text:"",muted:!0}),r.push({id:"new-workspace",text:"+ New Workspace",selected:i,focused:i&&e.focusedRegion==="tasks"}),r}function zA(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=Lo(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 Es(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:rr(d,s.snapshots,s.now),activityAnimationFrame:s.animationFrame,unread:sa(d.ptyTabs.filter(k=>k.kind==="agent").map(k=>k.id),s.snapshots,s.now,t.readAgentActivityAt)}:{}},y=Wy(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 [${T.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 JA(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 XA(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 ht(["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 ht(["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 ht([`No tasks in ${c}.`,"",`Press n or choose + New ${u} to create one with ${T.runners.getDisplayName(t.selectedRunner)}.`])}let a=r.ptyTabs.find(l=>l.id===e)??null;return a?a.kind==="agent"?ht([`${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."]):ht([`${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"?nE(r,i,t.fileScrollOffset):e===V&&t.openInspectionKind==="diff"?rE(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?ht(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):ht(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function QA(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:eE(o),...o.kind==="agent"&&r&&t?{activity:Jt(t,o.id,r.snapshots,r.now),activityAnimationFrame:r.animationFrame,unread:sa([o.id],r.snapshots,r.now,e.readAgentActivityAt)}:{}}))??[];if(!t)return[{id:oa,label:"EMPTY",active:n===oa,focused:e.focusedRegion==="center"&&n===oa}];let i=e.openInspectionKind||n===V?[{id:V,label:tE(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function ZA(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:oa}function eE(e){return e.title.toUpperCase()}function tE(e){let t=e.openInspectionKind==="diff"?e.selectedDiffPath:e.selectedFilePath,n=t?Ms.basename(t):e.inspectionMode.toUpperCase();return e.openInspectionKind==="diff"?`${n} \u0394`:n}function nE(e,t,n){if(!e)return ht(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return ht(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=By(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:""},...sE(r.lines,n,s)]}function rE(e,t,n){if(!e)return ht(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return ht(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=By(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:""},...iE(r.lines,n,s)]}function ht(e){return e.map(t=>({text:t}))}function sE(e,t,n){let r=Math.max(3,String(e.length).length),s=Math.max(0,Math.min(t,Math.max(0,e.length-1)));return e.slice(s).map((i,o)=>{let a=s+o+1;return{text:`${`${String(a).padStart(r," ")} \u2502 `}${i}`,segments:[{text:String(a).padStart(r," "),style:{fg:fe.lineNumber}},{text:" \u2502 ",style:{fg:fe.gutter}},...tu(i,n)],tone:"default"}})}function iE(e,t,n){let r=oE(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>aE(i,n))}function oE(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=My(e.oldNumber),r=My(e.newNumber),s=e.kind==="delete"?n:r,i=e.kind==="delete"?{bg:"2a1111",fallbackFg:fe.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:fe.diffAdd}:null,o=`${s} \u2502 ${e.text}`,a=i?cE(tu(e.text,t),i.bg,i.fallbackFg):tu(e.text,t),l=i?{fg:fe.lineNumber,bg:i.bg}:{fg:fe.lineNumber},c=i?{fg:fe.gutter,bg:i.bg}:{fg:fe.gutter};return{text:o,segments:[{text:s,style:l},{text:" \u2502 ",style:c},...a],fullBleed:i!==null}}function My(e){return e===null?" ":String(e).padStart(4," ")}function By(e){let t=Ms.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 tu(e,t){return t==="diff"?lE(e):t==="markdown"?dE(e):t==="json"?nu(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?nu(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 lE(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:fe.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:fe.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:fe.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:fe.diffMeta}}]:[{text:e}]}function cE(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function dE(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:fe.markup,bold:!0}}]:nu(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function nu(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:uE(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function uE(e){return e.startsWith("//")||e.startsWith("/*")?{fg:fe.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:fe.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:fe.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:fe.markup}:{fg:fe.keyword}}function pE(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"?Vy(t.repoTargets??[]):s?.pullRequest??(t?H(t):null),o=[fE(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=Hy(e,t,n),l=ru(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,...EE(e,n)]}:{title:"",rows:[...o,...ru(e,n)]}}function fE(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=su(t),o=iu(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function jy(e){return[{text:" "},su(e),{text:" "},iu(e)]}function Wy(e){if(e.type==="project"&&e.repoTargets?.length){let n=Vy(e.repoTargets);return n?jy(n):null}let t=H(e);return t?.number?jy(t):null}function Vy(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=hE(n);return{number:-1,status:mE(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 mE(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 hE(e){let t=e.map(n=>Ky(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 su(e){return!e||!e.number?{text:Ny,style:{fg:"565f89"}}:e.status==="merged"?{text:Dy,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:_y,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:zd,style:{fg:"565f89"}}:{text:zd,style:{fg:"9ece6a"}}}function iu(e){return e?.aggregateReadiness?qy(e.aggregateReadiness):qy(Ky(e))}function qy(e){return e==="failed"?{text:Zd,style:{fg:"f7768e"}}:e==="pending"?{text:Xd,style:{fg:"e0af68"}}:e==="success"?{text:Qd,style:{fg:"9ece6a"}}:{text:Jd,style:{fg:"565f89"}}}function Ky(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")?Gy(e)?"failed":gE(e)?"success":"pending":"pending"}function gE(e){return!!(e.mergeable&&!e.draft&&!Gy(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function Gy(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function Hy(e,t,n){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return yE(e,t,n);let r=H(t),s=Jy("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 ia=32;function yE(e,t,n){let r=[],s=ou(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=ia-f.length-1,y=p.length>m?p.slice(0,m-1)+"\u2026":p,k=ia-y.length-f.length;r.push({id:`project-review:${c.repoId}`,text:y+" ".repeat(Math.max(1,k))+f,selected:u,focused:d,muted:!0})}else{let h=su(c.pullRequest),f=iu(c.pullRequest),m=`${h.text} ${f.text}`,y=ia-m.length-1,k=p.length>y?p.slice(0,y-1)+"\u2026":p,R=ia-k.length-m.length,b=k+" ".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?wE(t,a):[];return a?.status==="ready"&&(a.pullRequest.number||l.length>0)&&(r.push({id:"target-detail-spacer",text:""}),r.push(...Jy("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 ou(e,t){if(e?.type!=="project")return[];let n=new Set(t?.taskId===e.id?t.diffRows.map(r=>r.path.split("/")[0]).filter(r=>!!r):[]);return(e.repoTargets??[]).filter(r=>!!r.pullRequest.number||n.has(r.repoId)||Yy(e,r).length>0)}function wE(e,t){return Yy(e,t).filter(n=>n.number!==t.pullRequest.number&&(n.status==="merged"||n.status==="closed"))}function Yy(e,t){let n=kE(t,e.prs);return n?e.prs.filter(r=>r.owner?.toLowerCase()===n.owner&&r.repo?.toLowerCase()===n.repo):[]}function kE(e,t){if(e.pullRequest.owner&&e.pullRequest.repo)return{owner:e.pullRequest.owner.toLowerCase(),repo:e.pullRequest.repo.toLowerCase()};let n=TE(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 TE(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 zy(e,t,n=null){return 3+Hy(e,t,n).length+ru(e,n).length}function Jy(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=RE(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:PE(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${Xy(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(SE)):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)=>IE(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 RE(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function PE(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function Xy(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 SE(e){let{icon:t,color:n}=CE(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," ")} ${AE(e.status)}`,color:n,muted:!1}}function IE(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${Xy(e.createdAt)}`:"",s=vE(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 vE(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 CE(e){switch(e){case"success":return{icon:Qd,color:"9ece6a"};case"pending":return{icon:Xd,color:"e0af68"};case"failed":return{icon:Zd,color:"f7768e"};case"skipped":return{icon:Jd,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function AE(e){return e==="success"?"passing":e==="failed"?"failing":e}function EE(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=au(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)?Oy:$y:Ey(l.label),p=l.kind==="directory"?"7aa2f7":xy(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 au(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 ru(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(OE(t))return $E(e,t);let n=[];for(let r of["branch","staged","unstaged","untracked"]){let s=t.diffRows.filter(i=>i.group===r);s.length!==0&&(n.push({id:r,text:r.toUpperCase(),muted:!0}),n.push(...s.map(i=>Qy(i,e,t))))}return n}function OE(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function $E(e,t){let n=[],r=[...new Set(t.diffRows.map(s=>s.path.split("/")[0]).filter(s=>typeof s=="string"&&s.length>0))].sort();for(let s of r){let i=t.diffRows.filter(a=>a.path.startsWith(`${s}/`)),o=s.startsWith("repo_")?s.slice(5):s;n.push({id:`repo-diff:${s}`,text:o,muted:!0});for(let a of["branch","staged","unstaged","untracked"]){let l=i.filter(c=>c.group===a);l.length!==0&&(n.push({id:`repo-diff:${s}:${a}`,text:` ${a}`,muted:!0}),n.push(...l.map(c=>Qy(c,e,t,s.length+1))))}}return n}function Qy(e,t,n,r=0){let s=e.additions===null?"-":`+${e.additions}`,i=e.deletions===null?"-":`-${e.deletions}`,o=e.status==="A"||e.group==="untracked"?"9ece6a":e.status==="D"?"f7768e":"e0af68",a=r>0?e.path.slice(r):e.path;return{id:`${e.group}:${e.path}`,text:` ${e.status.padEnd(2," ")} ${a} ${s}/${i}`,selected:e.path===(t.selectedDiffPath??n.selectedDiffPath),focused:e.path===(t.selectedDiffPath??n.selectedDiffPath)&&t.focusedRegion==="inspector",color:o}}function NE(e,t){return e?t?[{label:"Task",value:t.id},{label:"Repo",value:e.name},{label:"Agent",value:T.runners.getDisplayName(t.runner)},{label:"Branch",value:t.branch},{label:"Status",value:t.status},{label:"Worktree",value:Ms.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 DE(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0,pi:0})}function _E(e,t){return{name:T.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function Zy(e,t,n,r,s=null,i=!1){if(s)return xE(e,t,n,r,s,i);let o=Od(e,t,{centerOnly:r,panelPolish:i});return FE(n,o)?{output:zo(o.rows,n.rows,o.row,o.column),region:o}:null}function xE(e,t,n,r,s,i){let o=wg(e,t,s,{centerOnly:r,panelPolish:i});if(!o||!LE(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 FE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function LE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function ew(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!ME(o,a))return null;!o||!a||(s+=zo(a.rows,o.rows,a.row,a.column),r[i]=a)}return{output:s,regions:r}}function ME(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 jE=["tasks","center","inspector"];function qE(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 cu(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return uu({...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 uu(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 qE(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"&&(Mo(e.selectedLeftItemId)||jo(e.selectedLeftItemId)))return E({state:{...e,selectedRunner:xo(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return tw(e,1);if(t==="SHIFT_TAB"||t==="[")return tw(e,-1);if(t==="z"||t==="Z")return E({state:{...e,centerZoomed:!e.centerZoomed,actionMessage:null},changed:!0});if(t==="UP"||t==="k")return e.focusedRegion==="center"&&e.activeTab===V?hn(e,-1,n):cu(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===V?hn(e,1,n):cu(e,1,n);if(t==="PAGE_UP")return hn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return hn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return hn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return hn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??yt,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=YE(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"&&$s(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"&&sw(e.activeTab,n.ptyTabIds??[]))return E({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return lu(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return nw(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return lu(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return nw(e,1)}if(et(t)){if(e.focusedRegion==="tasks"&&(Mo(e.selectedLeftItemId)||jo(e.selectedLeftItemId))){let r=qo(e.selectedLeftItemId),s=Uo(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"&&$s(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"&&sw(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:WE({...e,selectedFileTreePath:r}),changed:!0});let s=r&&(n.fileTreeFileIds??[]).includes(r)?r:e.selectedFilePath;return E({state:{...e,selectedFileTreePath:s,selectedFilePath:s,activeTab:V,openInspectionKind:"file",fileScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0})}if(e.focusedRegion==="inspector"&&e.inspectionMode==="review"){let r=e.selectedDiffPath??n.diffPathIds?.[0]??null;return r?E({state:{...e,selectedDiffPath:r,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0,actionMessage:null},changed:!0,refreshInspection:!0}):e.selectedActionId==="close-task"&&!n.projectTargetIds?.length?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,selectedActionId:"refresh-checks",actionMessage:null},changed:!0,refreshPullRequestChecks:!0})}return e.focusedRegion!=="actions"?E({state:e}):e.selectedActionId==="refresh-checks"?E({state:{...e,actionMessage:null},changed:!0,refreshPullRequestChecks:!0}):e.selectedActionId==="close-task"?E({state:{...e,actionMessage:null},changed:!0,closeTask:!0}):E({state:{...e,actionMessage:`Action queued: ${e.selectedActionId} (inspection surfaces land in phase 4.1).`},changed:!0})}return E({state:e})}function hn(e,t,n){if(t===0)return E({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?iw(e,t,n):e.inspectionMode==="review"?rw(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):E({state:e});if(e.focusedRegion==="center"&&e.activeTab===V){if(e.openInspectionKind==="file")return rw(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return VE(e,t,n)}return E({state:e})}function tw(e,t){return aa(e,"focusedRegion",jE,t)}function lu(e,t,n){let r=aa(e,"activeTab",n&&n.length>0?n:zE(e),t);return!r.changed||eg(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:Pr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function cu(e,t,n){if(e.focusedRegion==="tasks")return UE(e,t,n.leftItemIds);if(e.focusedRegion==="center")return lu(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return iw(e,t,n);if(n.projectTargetIds?.length){let s=du(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=du(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:aa(e,"selectedActionId",zh,t)}return aa(e,"selectedActionId",kd,t)}function UE(e,t,n){let r=du(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=Rd(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=qo(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=Uo(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function BE(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 nw(e,t){return BE(e,HE(e.inspectionMode,Td,t))}function iw(e,t,n){let r=n.fileTreeRowIds&&n.fileTreeRowIds.length>0?n.fileTreeRowIds:n.filePathIds??[];if(r.length===0)return E({state:e});let s=e.selectedFileTreePath??e.selectedFilePath??r[0]??null,i=r.indexOf(s??""),o=Vt(i===-1?0:i+t,0,r.length-1),a=r[o]??null;if(a===e.selectedFileTreePath)return E({state:e});let l=a!==null&&(n.fileTreeFileIds??n.filePathIds??[]).includes(a);return E({state:{...e,selectedFileTreePath:a,selectedFilePath:l?a:e.selectedFilePath,activeTab:l?V:e.activeTab,openInspectionKind:l?"file":e.openInspectionKind,fileScrollOffset:l?0:e.fileScrollOffset,actionMessage:null},changed:!0,refreshInspection:l})}function WE(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 rw(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=Vt(e[t]+n,0,i);return o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function VE(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return KE(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=Vt(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=Vt(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=Vt(o,0,i);return c===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function KE(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=Vt(e.diffScrollOffset+t,0,i),a=GE(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 GE(e,t){return e.find(n=>t>=n.start&&t<n.end)?.path??e.at(-1)?.path??null}function aa(e,t,n,r){let s=n.indexOf(e[t]),i=Vt(s+r,0,n.length-1),o=n[i];return!o||o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function du(e,t,n,r,s=!1){if(n.length===0)return E({state:e});let i=n.indexOf(e[t]??n[0]??""),o=Vt(i===-1?0:i+r,0,n.length-1),a=n[o]??null;return a===e[t]?E({state:e}):E({state:{...e,[t]:a,actionMessage:null},changed:!0,refreshInspection:s})}function HE(e,t,n){let r=t.indexOf(e);return t[Vt(r+n,0,t.length-1)]??e}function E(e){return{state:e.state,changed:e.changed??!1,exit:e.exit??!1,pause:e.pause??!1,attachTerminal:e.attachTerminal??!1,detachTerminal:e.detachTerminal??!1,beginTaskPrompt:e.beginTaskPrompt??!1,openWorkspaceBrowser:e.openWorkspaceBrowser??!1,createWorkspaceTask:e.createWorkspaceTask??!1,createPtyTab:e.createPtyTab??!1,createPtyTabKind:e.createPtyTabKind??null,createPtyTabRunner:e.createPtyTabRunner??null,closePtyTab:e.closePtyTab??!1,refreshPullRequestChecks:e.refreshPullRequestChecks??!1,closeTask:e.closeTask??!1,removeWorkspace:e.removeWorkspace??!1,refreshInspection:e.refreshInspection??!1,openPrUrl:e.openPrUrl??!1}}function sw(e,t){return t.includes(e)}function YE(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Pr(e.activeTab)??e.preferredPtyTabKind}function zE(e){return[e.selectedPtyTabId,e.openInspectionKind?V:null].filter(t=>typeof t=="string")}function Vt(e,t,n){return Math.min(n,Math.max(t,e))}var ow=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??JE(i,e.activeTab,e.preferredPtyTabKind),a=dw(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"}`}}},aw=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}`}}},lw=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})})},cw=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=dw(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 JE(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function dw(e,t,n,r={}){let s=n??e.runner,i=T.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(h=>h.id)),c=1,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"?T.runners.buildCommand(s,void 0,r):[],createdAt:d,updatedAt:d}}var Er=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},uw=async(e,t,n,r,s)=>{T.runners.assertEnabled(r,s.config);let i=t?await s.taskService.provisionProjectTask(s.paths,t,n,{runner:r,config:s.config}):await s.taskService.provisionTask(s.paths,e??"",n,{runner:r,config:s.config});T.previews.isEnabled(s.config,"agentOrchestration")&&await rt(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=ko();To(T.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",u=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new Er(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}},pw=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},fw=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 Fr(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}`}}},mw=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Fr(t.paths,n.id)))),Or=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await ue.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var hw=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 gw=async(e,t,n)=>{let r=T.runners.setRunnerEnabled(n.config,e,t);return await T.save(n.paths,r),r},yw=async(e,t,n)=>{let r=T.runners.setRunnerPath(n.config,e,t);return await T.save(n.paths,r),r},ww=async(e,t,n)=>{let r=T.previews.setEnabled(n.config,e,t);return await T.save(n.paths,r),r};var XE=250;function Kt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function Gt(e,t){return Ut(t,e.ptyRuntime.getViewState($r(e,t)))}function $r(e,t){let n=Kt(e.model.tasks,t);return n?n.ptyTabs.some(r=>r.id===t.activeTab)?t.activeTab:t.activeTab==="agent"||t.activeTab==="terminal"?n.ptyTabs.find(r=>r.kind===t.activeTab)?.id??t.selectedPtyTabId:t.selectedPtyTabId:t.selectedPtyTabId}function v(e,t){return Gt(e,ig(t,e.model))}function kw(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 Tw(e,t,n){return kw(e,t,n?{tone:"success",message:n}:null)}function ie(e,t,n){return kw(e,t,{tone:"error",message:n})}function ne(e,t,n,r){let s=n instanceof Error?n.message:r,i=n instanceof Error?n.stack??n.message:String(n);return ue.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function X(e,t){if(!e.uiStateFile)return;e.runtimeState=Do(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>gt({uiStateFile:e.uiStateFile},n),()=>gt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function pu(e,t){if(!e.uiStateFile){e.runtimeState={...Do(e.runtimeState,e.state.shell),...t};return}e.runtimeState={...Do(e.runtimeState,e.state.shell),...t};let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>gt({uiStateFile:e.uiStateFile},n),()=>gt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function QE(e,t){let n=e.taskMutationQueue.then(t,t);return e.taskMutationQueue=n.then(()=>{},()=>{}),n}function oe(e){return{paths:e.paths,config:e.config,taskService:S,workspaceService:Te,queueTaskMutation:t=>QE(e,t)}}function fu(e,t){let n=Kt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?au(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:jn(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:zy(t,n,s),pageRows:Math.max(5,Ue(e.activeTerminal.width,e.activeTerminal.height).height-Q.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:ou(n,s).map(a=>a.repoId)}}async function bw(e,t){await lw(t,oe(e))}async function Pe(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 la(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 ca(e,t){let n=++e.inspectionRefreshSequence,r=Pd(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 xh(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)},X(e,e.state.shell),e.render())}function Rw(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)&&ca(e,n).catch(r=>{let s=ne(e,"refresh inspection",r,"Failed to refresh inspection.");e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,actionMessage:s}),s)},e.render()})},XE))}function Pw(e,t){t!==0&&(e.pendingInspectionScrollLines+=t,!e.inspectionScrollRenderTimer&&(e.inspectionScrollRenderTimer=setTimeout(()=>{e.inspectionScrollRenderTimer=null;let n=e.pendingInspectionScrollLines;if(e.pendingInspectionScrollLines=0,n===0||e.state.mode!=="main"||e.state.shell.inputMode!=="control")return;let r=hn(e.state.shell,n,fu(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:v(e,r.state)},X(e,e.state.shell),e.render(),ca(e,e.state.shell).catch(s=>{let i=ne(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:v(e,r.state)},X(e,e.state.shell),e.render()}},16)))}function mu(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function hu(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 Iw(e){hu(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=Kt(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 Ut(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,Bt(Ue(e.activeTerminal.width,e.activeTerminal.height),T.previews.isEnabled(e.config,"panelPolish"),n.centerZoomed));return Ut({...n,inputMode:"control"},o)}function gu(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 yu(e,t){try{let n=v(e,t),r=Kt(e.model.tasks,n),s=n.selectedPtyTabId;if(r&&n.focusedRegion==="tasks"){let a=r.ptyTabs.find(l=>l.kind==="agent")??null;a?s=a.id:(r=await Sw(e,r),await Pe(e),s=r.selectedPtyTabId)}r&&!s&&(r=await Sw(e,r),await Pe(e),s=r.selectedPtyTabId);let i=v(e,{...n,activeTab:s??n.activeTab,selectedPtyTabId:s,focusedRegion:s?"center":n.focusedRegion});if(!i.selectedTaskId||!s){e.state={mode:"main",shell:i},e.render();return}e.state={mode:"main",shell:Ut({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},X(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,Bt(Ue(e.activeTerminal.width,e.activeTerminal.height),T.previews.isEnabled(e.config,"panelPolish"),i.centerZoomed));e.suppressTerminalEnterOnAttach=Wt(s),e.lastTerminalKey=null,e.state={mode:"main",shell:Ut({...i,inputMode:"terminal"},o)},X(e,e.state.shell)}catch(n){let r=ne(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&Wt(t.selectedPtyTabId)&&(await ZE(e,t.selectedTaskId,r).catch(()=>{}),await Pe(e).catch(()=>{})),e.state={mode:"main",shell:ie(e,Qh(v(e,t),r),r)},X(e,e.state.shell)}e.render()}async function ZE(e,t,n){await pw(t,n,oe(e))}async function Cw(e,t,n,r){let s=v(e,t),{nextShell:i}=await ow(s,n,r,oe(e));return await Pe(e),v(e,{...s,...i})}async function Aw(e,t){let n=v(e,t),{closedTab:r,nextShell:s}=await aw(n,oe(e));return e.ptyRuntime.disposeSession(r.id),await Pe(e),v(e,{...n,...s})}async function Ew(e,t){let n=v(e,t),r=jn(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await fw(n,oe(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Pe(e),v(e,{...n,...o,selectedLeftItemId:e0(r,jn(e.model),s)})}async function Ow(e,t){let n=v(e,t),{nextShell:r}=await hw(n,oe(e));return await Pe(e),v(e,{...n,...r})}async function Sw(e,t){return cw(t,oe(e))}function da(e,t){e.pendingScrollLines+=t,!e.scrollRenderTimer&&(e.scrollRenderTimer=setTimeout(()=>{e.scrollRenderTimer=null;let n=e.pendingScrollLines;e.pendingScrollLines=0,n!==0&&(e.ptyRuntime.scrollViewport(n),e.state={mode:"main",shell:Gt(e,e.state.shell)},e.render())},16))}function $w(e){e.scrollRenderTimer&&(clearTimeout(e.scrollRenderTimer),e.scrollRenderTimer=null),e.pendingScrollLines=0,e.ptyRuntime.scrollViewport(Number.MAX_SAFE_INTEGER),e.state.mode==="main"&&(e.state={mode:"main",shell:Gt(e,e.state.shell)},e.render())}function e0(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 Dw(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=Nw(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await mw(s,oe(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)la(e,o);t.recordSuccess(i,Nw(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,Or("background PR polling",i,oe(e)))}}function Nw(e){return e.state.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.state.shell.selectedTaskId,reviewVisible:e.state.shell.inspectionMode==="review"}}async function _w(e,t){let n=v(e,t),r=Kt(e.model.tasks,n),s=null,i=null;if(r?.type==="project"&&r.repoTargets?.length){let o=await S.prs.discoverOrRefreshAll(e.paths,n.selectedTaskId);await Pe(e);let a=o.synced+o.discovered+o.notFound;i=`Refreshed ${o.synced}/${a} targets`}else{let{disposition:o,task:a}=await S.prs.discoverOrRefresh(e.paths,n.selectedTaskId);await Pe(e),s=o==="not_found"?`No PR found for ${a.branch}`:null,o!=="not_found"&&(i=`Refreshed checks: ${H(a)?.requiredChecks.length??0} reported`)}return v(e,{...Tw(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import i0 from"node:path";import{readdir as t0,stat as n0}from"node:fs/promises";import xw from"node:path";async function r0(e){let t=await t0(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=xw.join(e,r.name);n.push({name:r.name,path:s,kind:await s0(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 Fw(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function Lw(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 ua(e,t){let n=await r0(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 s0(e){let t=xw.join(e,".git");return await n0(t).catch(()=>null)!==null}function Mw(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function jw(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function o0(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 uw(r.repoId,r.workspaceId,n,t.selectedRunner,oe(e));s=i.task,await Pe(e);let o=v(e,{...e.state.shell,...i.nextShell,selectedLeftItemId:`task:${s.id}`,inputMode:"terminal",taskPromptTarget:null,taskPromptInput:null,taskPromptError:null,actionMessage:null}),a=await e.ptyRuntime.ensureSession(s.id,o.selectedPtyTabId??Lg(s,"agent"),Bt(Ue(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Wt(o.selectedPtyTabId),e.state={mode:"main",shell:Ut(o,a)},X(e,e.state.shell)}catch(i){i instanceof Er&&(s=i.task);let o=ne(e,"create task",i,"Failed to create task.");s&&!(i instanceof Er)?(await G(e.paths,s.id,a=>({...a,status:"draft",runnerSession:{...a.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:o})).catch(()=>{}),await Pe(e).catch(()=>{})):s&&(await G(e.paths,s.id,a=>({...a,lastFailureReason:o})).catch(()=>{}),await Pe(e).catch(()=>{})),e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,inputMode:"control",selectedTaskId:s?.id??e.state.shell.selectedTaskId,selectedPtyTabId:s?.selectedPtyTabId??e.state.shell.selectedPtyTabId,selectedLeftItemId:s?`task:${s.id}`:e.state.shell.selectedLeftItemId,activeTab:s?.selectedPtyTabId??e.state.shell.activeTab,taskPromptInput:s?null:"",taskPromptError:o,actionMessage:null}),o)}}finally{e.creatingTask=!1,e.render()}}function 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(et(t)){o0(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:xo(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}bd(t)&&(e.state={mode:"main",shell:v(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function l0(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=Fw(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"){ua(e,i0.dirname(n.cwd)).catch(s=>{let i=ne(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:i}}),i)},e.render()});return}if(t==="RIGHT"||t==="l"||et(t)){let s=r[n.selectedIndex]??null;if(!s)return;if((t==="RIGHT"||t==="l")&&(s.kind==="directory"||s.kind==="repo")){ua(e,s.path).catch(o=>{let a=ne(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()});return}let{workspaceService:i}=oe(e);i.addWorkspace(e.paths,s.path).then(async o=>{await Pe(e);let a=o.repos[0]??null,l=v(e,{...e.state.shell,workspaceBrowser:null,selectedLeftItemId:`workspace:${o.workspace.id}`,selectedWorkspaceId:o.workspace.id,selectedRepoId:a?.id??null,selectedTaskId:null,selectedPtyTabId:null,actionMessage:`Registered workspace: ${o.workspace.name??o.workspace.id}`});e.state={mode:"main",shell:l},X(e,e.state.shell),e.render()}).catch(o=>{let a=ne(e,"add workspace",o,"Failed to add workspace.");e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()})}}function c0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="options")return;let n=Iy(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;d0(e,r)}}}async function d0(e,t){let n;try{n=await ue.readLog(e.paths)}catch(r){let s=ne(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 u0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=Cy(Mw(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"?gw(n.runner,n.enabled,oe(e)):yw(n.runner,n.path,oe(e))).then(s=>{e.state.mode!=="overlay"||e.state.variant!=="runners"||(e.config=s,e.enabledRunnerIds=T.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:v(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:T.runners.getDefault(e.config)}),runnerOptions:n.state},e.render())}).catch(s=>{if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let i=ne(e,"save runner option",s,"Failed to save runner option.");e.state={...e.state,shell:ie(e,v(e,e.state.shell),i),runnerOptions:{...Mw(e),message:i}},e.render()})}function p0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=vy(jw(e),e.config,t);if(n.kind!=="noop"){if(n.kind==="back"){pu(e,{seenPreviewIds:[...De]});let r=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:1,optionsMessage:null,shell:e.state.shell,...r!==void 0?{parentVariant:r}:{}},e.pendingClear=!0,e.render();return}if(n.kind==="render"){e.state={...e.state,previewOptions:n.state},e.render();return}ww(n.feature,n.enabled,oe(e)).then(r=>{e.state.mode!=="overlay"||e.state.variant!=="previews"||(e.config=r,e.enabledRunnerIds=T.runners.getEnabled(e.config),e.model={...e.model,enabledRunnerIds:e.enabledRunnerIds},e.state={...e.state,shell:v(e,{...e.state.shell,selectedRunner:e.enabledRunnerIds.includes(e.state.shell.selectedRunner)?e.state.shell.selectedRunner:T.runners.getDefault(e.config)}),previewOptions:n.state},e.render())}).catch(r=>{if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let s=ne(e,"save feature preview",r,"Failed to save feature preview.");e.state={...e.state,shell:ie(e,v(e,e.state.shell),s),previewOptions:{...jw(e),message:s}},e.render()})}}function pa(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},X(e,e.state.shell),e.render())}).catch(n=>{if(e.state.mode!=="main"||e.state.shell!==t)return;let r=ne(e,"warm selected PTY",n,"Failed to start selected PTY.");e.state={mode:"main",shell:ie(e,v(e,e.state.shell),r)},X(e,e.state.shell),e.render()})})}function f0(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 qw(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=f0(n);ne(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 m0(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"){pa(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){qw(e);return}if(n==="ready"&&e.state.menuIndex===2){pu(e,{ignoredUpdateVersion:e.state.update.latest}),pa(e);return}if(n==="error"&&e.state.menuIndex===0){qw(e);return}if(n==="success"&&e.state.menuIndex===1){e.exit(0);return}pa(e)}}function Uw(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){l0(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){g0(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=uu(e.state.shell,n,fu(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)},X(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)},X(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&et(n)){e.suppressTerminalEnterOnAttach=!1;return}e.suppressTerminalEnterOnAttach&&(e.suppressTerminalEnterOnAttach=!1);let s=xs(n);if(s){e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(h0(e,n))return;e.lastTerminalKey=Mg(n)?{key:n,at:Date.now()}:null;let i=jg(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){da(e,i);return}bd(n)&&(e.state.shell.terminal.scrolledBack||e.pendingScrollLines<0)&&Wt(e.state.shell.selectedPtyTabId)&&$w(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"}}},X(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){ua(e,e.workspaceRoot).catch(s=>{let i=ne(e,"browse workspaces",s,"Failed to browse workspaces.");e.state={mode:"main",shell:ie(e,v(e,{...r.state,workspaceBrowser:{cwd:e.workspaceRoot,entries:[],selectedIndex:0,query:null,error:i}}),i)},e.render()});return}if(r.createPtyTab){Cw(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{yu(e,s)}).catch(s=>{let i=ne(e,"create PTY tab",s,"Failed to create tab.");e.state={mode:"main",shell:ie(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.closePtyTab){Aw(e,r.state).then(s=>{e.state={mode:"main",shell:s},X(e,e.state.shell),e.render()}).catch(s=>{let i=ne(e,"close PTY tab",s,"Failed to close tab.");e.state={mode:"main",shell:ie(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.refreshPullRequestChecks){_w(e,r.state).then(s=>{e.state={mode:"main",shell:s},X(e,e.state.shell),e.render()}).catch(s=>{let i=ne(e,"refresh PR checks",s,"Failed to refresh PR checks.");e.state={mode:"main",shell:ie(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.openPrUrl){let s=Kt(e.model.tasks,r.state),i=s?H(s)?.url??null:null;i?Lw(i).catch(o=>{let a=ne(e,"open PR URL",o,"Failed to open PR in browser.");e.state={mode:"main",shell:ie(e,v(e,r.state),a)},e.render()}):(e.state={mode:"main",shell:ie(e,v(e,r.state),"No PR URL available.")},e.render());return}if(r.closeTask){Ew(e,r.state).then(s=>{e.state={mode:"main",shell:s},X(e,e.state.shell),e.render()}).catch(s=>{let i=ne(e,"close task",s,"Failed to close task.");e.state={mode:"main",shell:ie(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.removeWorkspace){Ow(e,r.state).then(s=>{e.state={mode:"main",shell:s},X(e,e.state.shell),e.render()}).catch(s=>{let i=ne(e,"remove workspace",s,"Failed to remove workspace.");e.state={mode:"main",shell:ie(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.attachTerminal){yu(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:v(e,r.state)},X(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){Rw(e,e.state.shell);return}ca(e,e.state.shell).catch(s=>{let i=ne(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:ie(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}r.changed&&(e.state={mode:"main",shell:v(e,r.state)},bw(e,e.state.shell).catch(()=>{}),X(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"){c0(e,n);return}if(e.state.variant==="runners"){u0(e,n);return}if(e.state.variant==="previews"){p0(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"){m0(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"?pa(e):(e.state={mode:"main",shell:v(e,{...e.state.shell,inputMode:"control"})},e.pendingClear=!0,e.render(),Iw(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 Bw(e,t){let n=Vg(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=xs(i);if(o){Vw(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(xd(i)){e.pendingTerminalKeySequence.raw=i,Ww(e);return}fa(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"})},X(e,e.state.shell),e.render();return}let r=qg(n);if(r!==0){da(e,r);return}let s=xs(n);if(s){e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s);return}if(e.suppressTerminalEnterOnAttach&&n!=="\r"&&n!==`
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 by(e){return new Promise((t,n)=>{let r=dy(e);r.once("connect",()=>t(r)),r.once("error",n)})}function YA(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,n)})}function hn(e,t){if(!e.destroyed)try{e.write(`${JSON.stringify(t)}
291
+ `)}catch{}}function zA(e){try{return process.kill(e,0),!0}catch{return!1}}function Ry(e){return new Promise(t=>setTimeout(t,e))}function JA(e){throw new Error(`Unhandled daemon request: ${JSON.stringify(e)}`)}var Sy=["Runners","Feature Previews","Logs","Help"],Iy=["piRunner","fileOpen","panelPolish"],vy={agentOrchestration:"Agent orchestration",fileOpen:"Agent file opening",piRunner:"Pi coding agent runner",panelPolish:"Panel polish"};function Qu(e,t){return Xu(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 Cy(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 Ay(e=[]){let t=Iy.some(n=>!e.includes(n));return Sy.map((n,r)=>r===1&&t?`${n} \xB7 NEW`:n)}function Ey(e,t=[]){return wt.map(n=>{let r=k.previews.isEnabled(e,n),s=Iy.includes(n)&&!t.includes(n);return`${r?"[x]":"[ ]"} ${vy[n]}${s?" \xB7 NEW":""}`})}function Oy(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(Sy.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 Ny(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(wt.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=wt[e.menuIndex]??wt[0],s=!k.previews.isEnabled(t,r);return{kind:"save-enabled",feature:r,enabled:s,state:{...e,message:`${vy[r]} ${s?"enabled":"disabled"}.`}}}function Dy(e,t,n,r){if(e.pathEdit)return XA({...e,pathEdit:e.pathEdit},t,n);let s=Qu(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=Xu(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=Xu(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 Xu(e){return fe.filter(t=>t!=="pi"||k.previews.isEnabled(e,"piRunner"))}function XA(e,t,n){if(n==="ESCAPE")return{kind:"render",state:Py({...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:Py({...e,message:s.length>0?`${k.runners.getProfile(r).displayName} executable saved.`:`${k.runners.getProfile(r).displayName} executable reset to default.`})}}return QA(n)?{kind:"render",state:{...e,pathEdit:{...e.pathEdit,value:`${e.pathEdit.value}${n}`}}}:{kind:"noop",state:e}}function Py(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 QA(e){return e.length===1&&e>=" "&&e!==""}var ZA=/^\d+\.\d+\.\d+$/;async function _y(e,t={runCommand:K}){if(!ZA.test(e))throw new Error(`Cannot install invalid Craig version: ${e}`);await t.runCommand("npm",["install","--global",`craig-cli@${e}`])}import js from"node:path";function xy(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 Fy="\u{F024B} ",Ly="\u{F0DCF} ",My="\u25CB",Zu="\uEA64",jy="\uEAFE",qy="\uEBDA",ed="\u25CB",td="\u25CF",nd="\u2713",rd="\u2715";function Uy(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 sd=150,By=6;function Wy(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))}var la="empty",me={lineNumber:"3b4261",gutter:"3b4261",keyword:"9d7cd8",string:"9ece6a",literal:"ff9e64",comment:"565f89",markup:"f7768e",diffAdd:"9ece6a",diffDelete:"f7768e",diffMeta:"565f89",diffHunk:"565f89"};function Hy(e,t,n){let r=nE(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=jE(t.tasks),d=iE(e,a),u=sE(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`:_s(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:eE(e,t,n),runners:(t.enabledRunnerIds??["codex","cursor","claude"]).map(y=>qE(y,c[y])),centerHeader:{tabLabel:e.workspaceBrowser?"BROWSER":p.label,taskId:e.workspaceBrowser?"new workspace":a?.id??"no task",repo:f,agent:m},centerTranscript:rE(d,e,s,a,e.workspaceBrowser,h,r),tabs:u,rightContext:ME(s,a),rightInspection:wE(e,a,h)}}function eE(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 tE(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=Lo(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 Ns(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 tE(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=Mo(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 Ns(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 nE(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 rE(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 ht(["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 ht(["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 ht([`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"?ht([`${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."]):ht([`${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"?lE(r,i,t.fileScrollOffset):e===V&&t.openInspectionKind==="diff"?cE(r,i,t.diffScrollOffset):r.ptyTabs.length===0&&!t.openInspectionKind?ht(["No task tabs open.","","Press a to create an agent tab, t to create a Terminal tab, or + to create the preferred tab kind."]):ht(["No center tab selected.","","Choose a task PTY tab or open an inspection item from the right panel."])}function sE(e,t,n,r){let s=t?.ptyTabs.map(o=>({id:o.id,label:oE(o),...o.kind==="agent"&&r&&t?{activity:Xt(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:aE(e)}]:[];return[...s,...i].map(o=>({...o,active:o.id===n,focused:e.focusedRegion==="center"&&o.id===n}))}function iE(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 oE(e){return e.title.toUpperCase()}function aE(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 lE(e,t,n){if(!e)return ht(["No task selected.","","Select or create a task to inspect files."]);if(!t||t.error)return ht(["Files unavailable.","",t?.error??"Craig has not loaded file inspection for this task yet."]);let r=t.selectedFile,s=Yy(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:""},...uE(r.lines,n,s)]}function cE(e,t,n){if(!e)return ht(["No task selected.","","Select or create a task to inspect diffs."]);if(!t||t.error)return ht(["Diff unavailable.","",t?.error??"Craig has not loaded diff inspection for this task yet."]);let r=t.selectedDiff,s=Yy(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:""},...dE(r.lines,n,s)]}function ht(e){return e.map(t=>({text:t}))}function uE(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:me.lineNumber}},{text:" \u2502 ",style:{fg:me.gutter}},...id(i,n)],tone:"default"}})}function dE(e,t,n){let r=pE(e),s=Math.max(0,Math.min(t,Math.max(0,r.length-1)));return r.slice(s).map(i=>fE(i,n))}function pE(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 fE(e,t){let n=Vy(e.oldNumber),r=Vy(e.newNumber),s=e.kind==="delete"?n:r,i=e.kind==="delete"?{bg:"2a1111",fallbackFg:me.diffDelete}:e.kind==="add"?{bg:"10210f",fallbackFg:me.diffAdd}:null,o=`${s} \u2502 ${e.text}`,a=i?hE(id(e.text,t),i.bg,i.fallbackFg):id(e.text,t),l=i?{fg:me.lineNumber,bg:i.bg}:{fg:me.lineNumber},c=i?{fg:me.gutter,bg:i.bg}:{fg:me.gutter};return{text:o,segments:[{text:s,style:l},{text:" \u2502 ",style:c},...a],fullBleed:i!==null}}function Vy(e){return e===null?" ":String(e).padStart(4," ")}function Yy(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 id(e,t){return t==="diff"?mE(e):t==="markdown"?gE(e):t==="json"?od(e,/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\b\d+(?:\.\d+)?\b/g):t==="javascript"||t==="css"?od(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 mE(e){return e.startsWith("+")&&!e.startsWith("+++")?[{text:e,style:{fg:me.diffAdd}}]:e.startsWith("-")&&!e.startsWith("---")?[{text:e,style:{fg:me.diffDelete}}]:e.startsWith("@@")?[{text:e,style:{fg:me.diffHunk}}]:e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("+++ ")||e.startsWith("--- ")?[{text:e,style:{fg:me.diffMeta}}]:[{text:e}]}function hE(e,t,n){return e.map(r=>({text:r.text,style:{...r.style??{fg:n},bg:t}}))}function gE(e){return/^#{1,6}\s/.test(e)?[{text:e,style:{fg:me.markup,bold:!0}}]:od(e,/(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)]+\))/g)}function od(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:yE(i)}),r=o+i.length}return r<e.length&&n.push({text:e.slice(r)}),n.length>0?n:[{text:e}]}function yE(e){return e.startsWith("//")||e.startsWith("/*")?{fg:me.comment,italic:!0}:e.startsWith('"')||e.startsWith("'")||e.startsWith("`")?{fg:me.string}:/^-?\d/.test(e)||e==="true"||e==="false"||e==="null"||e==="undefined"?{fg:me.literal}:e.startsWith("**")||e.startsWith("[")||e.startsWith("`")?{fg:me.markup}:{fg:me.keyword}}function wE(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"?Jy(t.repoTargets??[]):s?.pullRequest??(t?H(t):null),o=[kE(e,i),{id:"mode-spacer",text:"",muted:!0}];if(e.inspectionMode==="review"){let a=Zy(e,t,n),l=ad(e,n),c=CE([{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,...xE(e,n)]}:{title:"",rows:[...o,...ad(e,n)]}}function kE(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=ld(t),o=cd(t);return s.push({text:" "},i,{text:" "},o),{id:"inspection-mode",text:s.map(l=>l.text).join(""),segments:s}}function Ky(e){return[{text:" "},ld(e),{text:" "},cd(e)]}function zy(e){if(e.type==="project"&&e.repoTargets?.length){let n=Jy(e.repoTargets);return n?Ky(n):null}let t=H(e);return t?.number?Ky(t):null}function Jy(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=bE(n);return{number:-1,status:TE(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 TE(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 bE(e){let t=e.map(n=>Xy(n));return t.some(n=>n==="failed")?"failed":t.some(n=>n==="pending")?"pending":t.length>0&&t.every(n=>n==="success")?"success":"none"}function ld(e){return!e||!e.number?{text:My,style:{fg:"565f89"}}:e.status==="merged"?{text:jy,style:{fg:"9d7cd8"}}:e.status==="closed"?{text:qy,style:{fg:"f7768e"}}:e.status==="draft"||e.draft?{text:Zu,style:{fg:"565f89"}}:{text:Zu,style:{fg:"9ece6a"}}}function cd(e){return e?.aggregateReadiness?Gy(e.aggregateReadiness):Gy(Xy(e))}function Gy(e){return e==="failed"?{text:rd,style:{fg:"f7768e"}}:e==="pending"?{text:td,style:{fg:"e0af68"}}:e==="success"?{text:nd,style:{fg:"9ece6a"}}:{text:ed,style:{fg:"565f89"}}}function Xy(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")?Qy(e)?"failed":RE(e)?"success":"pending":"pending"}function RE(e){return!!(e.mergeable&&!e.draft&&!Qy(e)&&e.requiredChecks.length>0&&e.requiredChecks.every(t=>t.status==="success"||t.status==="skipped"))}function Qy(e){return e.reviewDecision==="REVIEW_REQUIRED"||e.reviewDecision==="CHANGES_REQUESTED"||e.mergeStateStatus==="REVIEW_REQUIRED"}function Zy(e,t,n){if(!t)return[{id:"review-empty",text:"No task selected.",muted:!0}];if(t.type==="project"&&t.repoTargets?.length)return PE(e,t,n);let r=H(t),s=nw("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 PE(e,t,n){let r=[],s=ud(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=ld(c.pullRequest),f=cd(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?SE(t,a):[];return a?.status==="ready"&&(a.pullRequest.number||l.length>0)&&(r.push({id:"target-detail-spacer",text:""}),r.push(...nw("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 ud(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)||ew(e,r).length>0)}function SE(e,t){return ew(e,t).filter(n=>n.number!==t.pullRequest.number&&(n.status==="merged"||n.status==="closed"))}function ew(e,t){let n=IE(t,e.prs);return n?e.prs.filter(r=>r.owner?.toLowerCase()===n.owner&&r.repo?.toLowerCase()===n.repo):[]}function IE(e,t){if(e.pullRequest.owner&&e.pullRequest.repo)return{owner:e.pullRequest.owner.toLowerCase(),repo:e.pullRequest.repo.toLowerCase()};let n=vE(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 vE(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 tw(e,t,n=null){return 3+Zy(e,t,n).length+ad(e,n).length}function nw(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=AE(n.reviewDecision,n.mergeStateStatus),c=l&&l!=="review approved"?"merge blocked":n.mergeable?"merge ready":n.mergeStateStatus?`merge ${n.mergeStateStatus}`:"merge unknown";l?s.push({id:r("pr-merge"),text:`${c} \xB7 ${l}`,muted:!0,segments:[{text:c},{text:" \xB7 "},{text:l,style:{fg:EE(n.reviewDecision,n.mergeStateStatus)}}]}):s.push({id:r("pr-merge"),text:c,muted:!0}),s.push({id:r("pr-synced"),text:`synced ${rw(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(OE)):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)=>$E(u,r(`comment:${p}`))))),s}function CE(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 AE(e,t){return e==="CHANGES_REQUESTED"?"review changes requested":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"review required":e==="APPROVED"?"review approved":null}function EE(e,t){return e==="CHANGES_REQUESTED"?"f7768e":e==="APPROVED"?"9ece6a":e==="REVIEW_REQUIRED"||t==="REVIEW_REQUIRED"?"e0af68":"565f89"}function rw(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 OE(e){let{icon:t,color:n}=DE(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," ")} ${_E(e.status)}`,color:n,muted:!1}}function $E(e,t){let n=e.author??"unknown",r=e.createdAt?` \xB7 ${rw(e.createdAt)}`:"",s=NE(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 NE(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 DE(e){switch(e){case"success":return{icon:nd,color:"9ece6a"};case"pending":return{icon:td,color:"e0af68"};case"failed":return{icon:rd,color:"f7768e"};case"skipped":return{icon:ed,color:"565f89"};default:return{icon:"?",color:"565f89"}}}function _E(e){return e==="success"?"passing":e==="failed"?"failing":e}function xE(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=dd(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)?Fy:Ly:xy(l.label),p=l.kind==="directory"?"7aa2f7":Uy(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 dd(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 ad(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(FE(t))return LE(e,t);let n=[];for(let r of["branch","staged","unstaged","untracked"]){let s=t.diffRows.filter(i=>i.group===r);s.length!==0&&(n.push({id:r,text:r.toUpperCase(),muted:!0}),n.push(...s.map(i=>sw(i,e,t))))}return n}function FE(e){return e.filePaths.some(t=>t.startsWith("repo_"))||e.diffRows.some(t=>t.path.startsWith("repo_"))}function LE(e,t){let n=[],r=[...new Set(t.diffRows.map(s=>s.path.split("/")[0]).filter(s=>typeof s=="string"&&s.length>0))].sort();for(let s of r){let i=t.diffRows.filter(a=>a.path.startsWith(`${s}/`)),o=s.startsWith("repo_")?s.slice(5):s;n.push({id:`repo-diff:${s}`,text:o,muted:!0});for(let a of["branch","staged","unstaged","untracked"]){let l=i.filter(c=>c.group===a);l.length!==0&&(n.push({id:`repo-diff:${s}:${a}`,text:` ${a}`,muted:!0}),n.push(...l.map(c=>sw(c,e,t,s.length+1))))}}return n}function sw(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 ME(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 jE(e){return e.reduce((t,n)=>(t[n.runner]+=1,t),{codex:0,cursor:0,claude:0,pi:0})}function qE(e,t){return{name:k.runners.getDisplayName(e).toLowerCase(),health:t>0?1:0,count:String(t)}}function iw(e,t,n,r,s=null,i=!1){if(s)return UE(e,t,n,r,s,i);let o=Fu(e,t,{centerOnly:r,panelPolish:i});return BE(n,o)?{output:Xo(o.rows,n.rows,o.row,o.column),region:o}:null}function UE(e,t,n,r,s,i){let o=Ig(e,t,s,{centerOnly:r,panelPolish:i});if(!o||!WE(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 BE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rows.length}function WE(e,t){return e.row===t.row&&e.column===t.column&&e.width===t.width&&e.rows.length===t.rowCount}function ow(e,t,n){let r={...e},s="";for(let i of n){let o=e[i],a=t[i];if(!VE(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 VE(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 KE=["tasks","center","inspector"];function GE(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 fd(e,t==="UP"||t==="k"?-1:1,n);if(t==="ENTER")return hd({...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 hd(e,t,n={leftItemIds:[]}){if(e.inputMode==="terminal")return og(t)?E({state:{...e,inputMode:"control",centerZoomed:!1,actionMessage:null,focusedRegion:"center"},changed:!0,detachTerminal:!0}):E({state:e});if(e.fileSearchQuery!==null)return GE(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"&&(jo(e.selectedLeftItemId)||qo(e.selectedLeftItemId)))return E({state:{...e,selectedRunner:Fo(e.selectedRunner,n.enabledRunnerIds),actionMessage:null,taskPromptError:null},changed:!0});if(t==="TAB"||t==="]")return aw(e,1);if(t==="SHIFT_TAB"||t==="[")return aw(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?gn(e,-1,n):fd(e,-1,n);if(t==="DOWN"||t==="j")return e.focusedRegion==="center"&&e.activeTab===V?gn(e,1,n):fd(e,1,n);if(t==="PAGE_UP")return gn(e,-(n.pageRows??10),n);if(t==="PAGE_DOWN")return gn(e,n.pageRows??10,n);if(t==="MOUSE_WHEEL_UP")return gn(e,-3,n);if(t==="MOUSE_WHEEL_DOWN")return gn(e,3,n);if(t==="r"&&e.focusedRegion==="center"&&e.selectedTaskId){let r=n.enabledRunnerIds??yt,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=e0(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"&&_s(e.selectedLeftItemId)&&e.selectedTaskId)return E({state:{...e,selectedActionId:"close-task",actionMessage:null},changed:!0,closeTask:!0});if(t==="X"&&e.focusedRegion==="tasks"&&dg(e.selectedLeftItemId)&&e.selectedWorkspaceId)return E({state:{...e,actionMessage:null},changed:!0,removeWorkspace:!0});if(t==="x"&&e.focusedRegion==="center"&&uw(e.activeTab,n.ptyTabIds??[]))return E({state:{...e,actionMessage:null},changed:!0,closePtyTab:!0});if(t==="LEFT"||t==="h"){if(e.focusedRegion==="center")return pd(e,-1,n.centerTabIds);if(e.focusedRegion==="inspector")return lw(e,-1)}if(t==="RIGHT"||t==="l"){if(e.focusedRegion==="center")return pd(e,1,n.centerTabIds);if(e.focusedRegion==="inspector")return lw(e,1)}if(et(t)){if(e.focusedRegion==="tasks"&&(jo(e.selectedLeftItemId)||qo(e.selectedLeftItemId))){let r=Uo(e.selectedLeftItemId),s=Bo(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"&&_s(e.selectedLeftItemId)&&e.selectedTaskId){let r=e.selectedPtyTabId??e.activeTab;return E({state:{...e,inputMode:"terminal",focusedRegion:"center",activeTab:r,selectedPtyTabId:r,preferredPtyTabKind:Rr(r)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0})}if(e.focusedRegion==="center"&&uw(e.activeTab,n.ptyTabIds??[])&&e.selectedTaskId)return E({state:{...e,inputMode:"terminal",selectedPtyTabId:e.activeTab,preferredPtyTabKind:Rr(e.activeTab)??e.preferredPtyTabKind,actionMessage:null},changed:!0,attachTerminal:!0});if(e.focusedRegion==="center"&&e.activeTab===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:zE({...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 gn(e,t,n){if(t===0)return E({state:e});if(e.focusedRegion==="inspector")return e.inspectionMode==="files"?dw(e,t,n):e.inspectionMode==="review"?cw(e,"reviewScrollOffset",t,n.reviewRowCount??100,n.pageRows):E({state:e});if(e.focusedRegion==="center"&&e.activeTab===V){if(e.openInspectionKind==="file")return cw(e,"fileScrollOffset",t,n.fileLineCount??0,n.pageRows);if(e.openInspectionKind==="diff")return JE(e,t,n)}return E({state:e})}function aw(e,t){return ca(e,"focusedRegion",KE,t)}function pd(e,t,n){let r=ca(e,"activeTab",n&&n.length>0?n:t0(e),t);return!r.changed||ag(r.state.activeTab)?r:{...r,state:{...r.state,selectedPtyTabId:r.state.activeTab,preferredPtyTabKind:Rr(r.state.activeTab)??r.state.preferredPtyTabKind}}}function fd(e,t,n){if(e.focusedRegion==="tasks")return HE(e,t,n.leftItemIds);if(e.focusedRegion==="center")return pd(e,t,n.centerTabIds);if(e.focusedRegion==="inspector"){if(e.inspectionMode==="files")return dw(e,t,n);if(n.projectTargetIds?.length){let s=md(e,"selectedProjectTargetId",n.projectTargetIds,t);return s.changed?{...s,state:{...s.state,reviewScrollOffset:0,selectedActionId:"refresh-checks"}}:s}let r=md(e,"selectedDiffPath",n.diffPathIds??[],t,!0);return r.changed?{...r,state:{...r.state,activeTab:V,openInspectionKind:"diff",diffScrollOffset:0},refreshInspection:!0}:ca(e,"selectedActionId",ng,t)}return ca(e,"selectedActionId",Iu,t)}function HE(e,t,n){let r=md(e,"selectedLeftItemId",n,t);if(!r.changed)return r;let s=Au(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=Uo(r.state.selectedLeftItemId);if(i)return{...r,state:{...r.state,selectedRepoId:i}};let o=Bo(r.state.selectedLeftItemId);return o?{...r,state:{...r.state,selectedWorkspaceId:o}}:r}function YE(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 lw(e,t){return YE(e,ZE(e.inspectionMode,vu,t))}function dw(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=Kt(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 zE(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 cw(e,t,n,r,s=10){let i=Math.max(0,r-Math.max(1,s)),o=Kt(e[t]+n,0,i);return o===e[t]?E({state:e}):E({state:{...e,[t]:o,actionMessage:null},changed:!0})}function JE(e,t,n){if(n.diffPathRanges&&n.diffPathRanges.length>0)return XE(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=Kt(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=Kt(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=Kt(o,0,i);return c===e.diffScrollOffset?E({state:e}):E({state:{...e,diffScrollOffset:c,actionMessage:null},changed:!0})}function XE(e,t,n){let r=n.diffLineCount??0,s=n.pageRows??10,i=Math.max(0,r-Math.max(1,s)),o=Kt(e.diffScrollOffset+t,0,i),a=QE(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 QE(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=Kt(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 md(e,t,n,r,s=!1){if(n.length===0)return E({state:e});let i=n.indexOf(e[t]??n[0]??""),o=Kt(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 ZE(e,t,n){let r=t.indexOf(e);return t[Kt(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 uw(e,t){return t.includes(e)}function e0(e,t){return t==="a"||t==="A"?"agent":t==="t"||t==="T"?"terminal":Rr(e.activeTab)??e.preferredPtyTabKind}function t0(e){return[e.selectedPtyTabId,e.openInspectionKind?V:null].filter(t=>typeof t=="string")}function Kt(e,t,n){return Math.min(n,Math.max(t,e))}var pw=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??n0(i,e.activeTab,e.preferredPtyTabKind),a=gw(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"}`}}},fw=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}`}}},mw=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})})},hw=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=gw(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 n0(e,t,n){return e.ptyTabs.find(r=>r.id===t)?.kind??n}function gw(e,t,n,r={}){let s=n??e.runner,i=k.runners.getProfile(s),o=t==="agent"?i.defaultAgentTitle:"Terminal",a=t==="agent"&&n&&n!==e.runner?`${e.id}:${n}`:`${e.id}:${t}`,l=new Set(e.ptyTabs.map(h=>h.id)),c=1,d=a;for(;l.has(d);)c+=1,d=`${a}-${c}`;let u=new Date().toISOString(),p=n&&n!==e.runner?n:void 0;return{id:d,kind:t,...p?{runner:p}:{},title:c===1?o:`${o} ${c}`,command:t==="agent"?k.runners.buildCommand(s,void 0,r):[],createdAt:u,updatedAt:u}}var Or=class extends Error{task;constructor(t,n){super(t),this.name="InteractiveTaskStartupError",this.task=n}},yw=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 rt(s.paths,i.task,{type:"human",source:"tui",processId:process.pid});try{let l=To();bo(k.runners.getConfiguredProfile(r,s.config).executable,{cwd:i.repoRoot,env:l})}catch(l){let c=l instanceof Error?l.message:"Failed to start runner.",d=await s.taskService.recordStartupFailure(s.paths,i.task.id,c);throw new Or(c,d)}let o=await s.taskService.markTaskStarted(s.paths,i.task.id),a={selectedRepoId:o.repoId,selectedWorkspaceId:o.workspaceId,selectedTaskId:o.id,selectedPtyTabId:o.selectedPtyTabId,inputMode:"control",focusedRegion:"center",activeTab:o.selectedPtyTabId??"agent",selectedActionId:"commit"};return{task:o,nextShell:a}},ww=async(e,t,n)=>{await n.queueTaskMutation(async()=>{await n.taskService.markRunnerFailed(n.paths,e,t)})},kw=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}`}}},Tw=async(e,t)=>(await t.taskService.prs.discoverOrRefreshMany(t.paths,e),Promise.all(e.map(n=>Lr(t.paths,n.id)))),$r=async(e,t,n)=>{let r=t instanceof Error?t.message:String(t);await ue.appendErrorLogBestEffort(n.paths,{context:e,message:r,details:t instanceof Error?t.stack??t.message:String(t)})};var bw=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 Rw=async(e,t,n)=>{let r=k.runners.setRunnerEnabled(n.config,e,t);return await k.save(n.paths,r),r},Pw=async(e,t,n)=>{let r=k.runners.setRunnerPath(n.config,e,t);return await k.save(n.paths,r),r},Sw=async(e,t,n)=>{let r=k.previews.setEnabled(n.config,e,t);return await k.save(n.paths,r),r};var r0=250;function Gt(e,t){return e.find(n=>n.id===t.selectedTaskId)??null}function Ht(e,t){return Bt(t,e.ptyRuntime.getViewState(Nr(e,t)))}function Nr(e,t){let n=Gt(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 Ht(e,pg(t,e.model))}function Iw(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 vw(e,t,n){return Iw(e,t,n?{tone:"success",message:n}:null)}function le(e,t,n){return Iw(e,t,{tone:"error",message:n})}function se(e,t,n,r){let s=n instanceof Error?n.message:r,i=n instanceof Error?n.stack??n.message:String(n);return ue.appendErrorLogBestEffort(e.paths,{context:t,message:s,details:i}),s}function Q(e,t){if(!e.uiStateFile)return;e.runtimeState=_o(e.runtimeState,t);let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>gt({uiStateFile:e.uiStateFile},n),()=>gt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function gd(e,t){if(!e.uiStateFile){e.runtimeState={..._o(e.runtimeState,e.state.shell),...t};return}e.runtimeState={..._o(e.runtimeState,e.state.shell),...t};let n=e.runtimeState;e.persistQueue=e.persistQueue.then(()=>gt({uiStateFile:e.uiStateFile},n),()=>gt({uiStateFile:e.uiStateFile},n)),e.persistQueue.catch(()=>{})}function s0(e,t){let n=e.taskMutationQueue.then(t,t);return e.taskMutationQueue=n.then(()=>{},()=>{}),n}function ce(e){return{paths:e.paths,config:e.config,taskService:S,workspaceService:be,queueTaskMutation:t=>s0(e,t)}}function yd(e,t){let n=Gt(e.model.tasks,t),r=e.model.inspection,s=r&&r.taskId===n?.id?r:null,o=t.focusedRegion==="inspector"||t.activeTab==="inspection"?dd(s?.fileRows??[],t.collapsedFileTreePaths):[];return{leftItemIds:jn(e.model),centerTabIds:cg(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:tw(t,n,s),pageRows:Math.max(5,We(e.activeTerminal.width,e.activeTerminal.height).height-Z.topRailHeight-9),enabledRunnerIds:e.enabledRunnerIds,projectTargetIds:ud(n,s).map(a=>a.repoId)}}async function Cw(e,t){await mw(t,ce(e))}async function Se(e){e.model=await Pr(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 ua(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 da(e,t){let n=++e.inspectionRefreshSequence,r=Eu(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 Bh(r,s,a);if(n!==e.inspectionRefreshSequence)return;o={...e.model,inspection:l}}else if(o=await Pr(e.workspaceRoot,t,e.enabledRunnerIds),n!==e.inspectionRefreshSequence)return;e.model=o,e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,e.state.shell)},Q(e,e.state.shell),e.render())}function Aw(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)&&da(e,n).catch(r=>{let s=se(e,"refresh inspection",r,"Failed to refresh inspection.");e.state={mode:"main",shell:le(e,v(e,{...e.state.shell,actionMessage:s}),s)},e.render()})},r0))}function Ew(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=gn(e.state.shell,n,yd(e,e.state.shell));if(r.changed){if(r.refreshInspection){e.state={mode:"main",shell:v(e,r.state)},Q(e,e.state.shell),e.render(),da(e,e.state.shell).catch(s=>{let i=se(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:le(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}e.state={mode:"main",shell:v(e,r.state)},Q(e,e.state.shell),e.render()}},16)))}function wd(e){e.pendingClear=!0,e.activeTerminal.fullscreen(!0)}async function kd(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 $w(e){kd(e).catch(()=>{}).then(()=>{e.state.mode==="main"&&(e.state={mode:"main",shell:v(e,e.state.shell)},e.render())})}async function Nw(e,t){let n=v(e,t),r=Gt(e.model.tasks,n),s=Nr(e,n);if(!r||!s||!r.ptyTabs.some(a=>a.id===s))return n;let i=e.ptyRuntime.getViewState(s);if(i.status!=="idle"||i.rows.length>0||i.error)return Bt(n,i);let o=await e.ptyRuntime.ensureSession(r.id,s,Wt(We(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),n.centerZoomed));return Bt({...n,inputMode:"control"},o)}function Td(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 bd(e,t){try{let n=v(e,t),r=Gt(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 Ow(e,r),await Se(e),s=r.selectedPtyTabId)}r&&!s&&(r=await Ow(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:Bt({...i,inputMode:"terminal"},e.ptyRuntime.getViewState(s))},Q(e,e.state.shell);let o=await e.ptyRuntime.ensureSession(i.selectedTaskId,s,Wt(We(e.activeTerminal.width,e.activeTerminal.height),k.previews.isEnabled(e.config,"panelPolish"),i.centerZoomed));e.suppressTerminalEnterOnAttach=Vt(s),e.lastTerminalKey=null,e.state={mode:"main",shell:Bt({...i,inputMode:"terminal"},o)},Q(e,e.state.shell)}catch(n){let r=se(e,"attach PTY",n,"Failed to start PTY.");t.selectedTaskId&&t.selectedPtyTabId&&Vt(t.selectedPtyTabId)&&(await i0(e,t.selectedTaskId,r).catch(()=>{}),await Se(e).catch(()=>{})),e.state={mode:"main",shell:le(e,ig(v(e,t),r),r)},Q(e,e.state.shell)}e.render()}async function i0(e,t,n){await ww(t,n,ce(e))}async function Dw(e,t,n,r){let s=v(e,t),{nextShell:i}=await pw(s,n,r,ce(e));return await Se(e),v(e,{...s,...i})}async function _w(e,t){let n=v(e,t),{closedTab:r,nextShell:s}=await fw(n,ce(e));return e.ptyRuntime.disposeSession(r.id),await Se(e),v(e,{...n,...s})}async function xw(e,t){let n=v(e,t),r=jn(e.model),s=r.indexOf(n.selectedLeftItemId??""),{closedTabIds:i,nextShell:o}=await kw(n,ce(e));for(let a of i)e.ptyRuntime.disposeSession(a);return await Se(e),v(e,{...n,...o,selectedLeftItemId:o0(r,jn(e.model),s)})}async function Fw(e,t){let n=v(e,t),{nextShell:r}=await bw(n,ce(e));return await Se(e),v(e,{...n,...r})}async function Ow(e,t){return hw(t,ce(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:Ht(e,e.state.shell)},e.render())},16))}function Lw(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:Ht(e,e.state.shell)},e.render())}function o0(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 jw(e,t,n){if(n?.aborted||e.state.mode!=="main")return;let r=Mw(e),s=t.takeDueTasks(e.model.tasks,r);if(s.length!==0)try{let i=await Tw(s,ce(e));if(n?.aborted||(e.lastBackgroundPrPollError=null,e.state.mode!=="main"))return;for(let o of i)ua(e,o);t.recordSuccess(i,Mw(e)),e.state={mode:"main",shell:v(e,e.state.shell)},e.render()}catch(i){if(n?.aborted)return;t.recordFailure(s,i);let o=i instanceof Error?i.message:"Background PR discovery failed.";o!==e.lastBackgroundPrPollError&&(e.lastBackgroundPrPollError=o,$r("background PR polling",i,ce(e)))}}function Mw(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=Gt(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 Se(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 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,{...vw(e,n,i),focusedRegion:"inspector",inspectionMode:"review",selectedActionId:"refresh-checks",actionMessage:s})}import d0 from"node:path";import{readdir as a0,stat as l0}from"node:fs/promises";import Uw from"node:path";async function c0(e){let t=await a0(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let s=Uw.join(e,r.name);n.push({name:r.name,path:s,kind:await u0(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 Bw(e){if(!e.query)return e.entries;let t=e.query.toLowerCase();return e.entries.filter(n=>n.name.toLowerCase().includes(t))}async function Ww(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 c0(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 u0(e){let t=Uw.join(e,".git");return await l0(t).catch(()=>null)!==null}function Vw(e){let t=e.state;return t.runnerOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}function Kw(e){let t=e.state;return t.previewOptions??{menuIndex:t.menuIndex,message:t.optionsMessage}}async function p0(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 yw(r.repoId,r.workspaceId,n,t.selectedRunner,ce(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??Wg(s,"agent"),Wt(We(e.activeTerminal.width,e.activeTerminal.height)));e.suppressTerminalEnterOnAttach=Vt(o.selectedPtyTabId),e.state={mode:"main",shell:Bt(o,a)},Q(e,e.state.shell)}catch(i){i instanceof Or&&(s=i.task);let o=se(e,"create task",i,"Failed to create task.");s&&!(i instanceof Or)?(await G(e.paths,s.id,a=>({...a,status:"draft",runnerSession:{...a.runnerSession,lastKnownState:"failed",exitedAt:new Date().toISOString()},lastFailureReason:o})).catch(()=>{}),await Se(e).catch(()=>{})):s&&(await G(e.paths,s.id,a=>({...a,lastFailureReason:o})).catch(()=>{}),await Se(e).catch(()=>{})),e.state={mode:"main",shell:le(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 f0(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)){p0(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:Fo(n.selectedRunner,e.enabledRunnerIds),taskPromptError:null})},e.render();return}Cu(t)&&(e.state={mode:"main",shell:v(e,{...n,taskPromptInput:`${n.taskPromptInput}${t}`,taskPromptError:null})},e.render())}}function m0(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=Bw(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,d0.dirname(n.cwd)).catch(s=>{let i=se(e,"open parent workspace directory",s,"Failed to open parent directory.");e.state={mode:"main",shell:le(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=se(e,"open workspace directory",o,"Failed to open directory.");e.state={mode:"main",shell:le(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()});return}let{workspaceService:i}=ce(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},Q(e,e.state.shell),e.render()}).catch(o=>{let a=se(e,"add workspace",o,"Failed to add workspace.");e.state={mode:"main",shell:le(e,v(e,{...e.state.shell,workspaceBrowser:{...n,error:a}}),a)},e.render()})}}function h0(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;g0(e,r)}}}async function g0(e,t){let n;try{n=await ue.readLog(e.paths)}catch(r){let s=se(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 y0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="runners")return;let n=Dy(Vw(e),e.config,t,e.enabledRunnerIds);if(n.kind==="noop")return;if(n.kind==="back"){let s=e.state.parentVariant;e.state={mode:"overlay",variant:"options",menuIndex:0,optionsMessage:null,shell:e.state.shell,...s!==void 0?{parentVariant:s}:{}},e.pendingClear=!0,e.render();return}if(n.kind==="render"){e.state={...e.state,runnerOptions:n.state},e.render();return}(n.kind==="save-enabled"?Rw(n.runner,n.enabled,ce(e)):Pw(n.runner,n.path,ce(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=se(e,"save runner option",s,"Failed to save runner option.");e.state={...e.state,shell:le(e,v(e,e.state.shell),i),runnerOptions:{...Vw(e),message:i}},e.render()})}function w0(e,t){if(e.state.mode!=="overlay"||e.state.variant!=="previews")return;let n=Ny(Kw(e),e.config,t);if(n.kind!=="noop"){if(n.kind==="back"){gd(e,{seenPreviewIds:[...wt]});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}Sw(n.feature,n.enabled,ce(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=se(e,"save feature preview",r,"Failed to save feature preview.");e.state={...e.state,shell:le(e,v(e,e.state.shell),s),previewOptions:{...Kw(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||Nw(e,t).then(n=>{e.state.mode!=="main"||e.state.shell!==t||(e.state={mode:"main",shell:n},Q(e,e.state.shell),e.render())}).catch(n=>{if(e.state.mode!=="main"||e.state.shell!==t)return;let r=se(e,"warm selected PTY",n,"Failed to start selected PTY.");e.state={mode:"main",shell:le(e,v(e,e.state.shell),r)},Q(e,e.state.shell),e.render()})})}function k0(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 Gw(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=k0(n);se(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 T0(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){Gw(e);return}if(n==="ready"&&e.state.menuIndex===2){gd(e,{ignoredUpdateVersion:e.state.update.latest}),e.updateText=null,ma(e);return}if(n==="error"&&e.state.menuIndex===0){Gw(e);return}if(n==="success"&&e.state.menuIndex===1){e.exit(0);return}ma(e)}}function Hw(e,t){let n=typeof t=="string"?t:"";if(e.state.mode==="main"&&e.state.shell.taskPromptInput!==null){f0(e,n);return}if(e.state.mode==="main"&&e.state.shell.workspaceBrowser!==null){m0(e,n);return}if(e.state.mode==="main"&&e.state.shell.inputMode==="control"){if(n==="F"){R0(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=hd(e.state.shell,n,yd(e,e.state.shell));if(r.exit){e.exit(0);return}if(r.detachTerminal){e.ptyRuntime.detach(),e.state={mode:"main",shell:v(e,r.state)},Q(e,e.state.shell),e.render();return}if(e.state.shell.inputMode==="terminal"){if(r.changed){e.state={mode:"main",shell:v(e,r.state)},Q(e,e.state.shell),e.render();return}if(e.suppressTerminalEnterOnAttach&&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(b0(e,n))return;e.lastTerminalKey=Vg(n)?{key:n,at:Date.now()}:null;let i=Kg(n,e.state.shell.terminal.scrolledBack??!1);if(i!==0){pa(e,i);return}Cu(n)&&(e.state.shell.terminal.scrolledBack||e.pendingScrollLines<0)&&Vt(e.state.shell.selectedPtyTabId)&&Lw(e),e.ptyRuntime.writeKey(n);return}if(n==="CTRL_C"){e.exit(0);return}if(n==="?"&&e.state.shell.inputMode==="control"){e.state={mode:"overlay",variant:"help",menuIndex:0,optionsMessage:null,shell:e.state.shell},e.pendingClear=!0,e.render();return}if(r.pause){e.state={mode:"overlay",variant:"pause",menuIndex:0,optionsMessage:null,shell:v(e,r.state)},e.pendingClear=!0,e.render();return}if(r.beginTaskPrompt){let s=v(e,r.state),i=e.model.workspaces?.find(a=>a.id===s.selectedWorkspaceId),o=e.model.repos.find(a=>a.id===s.selectedRepoId);e.state={mode:"main",shell:{...s,taskPromptTarget:{workspaceId:i?.id??null,repoId:o?.id??null,name:i?.name??o?.name??"no workspace"}}},Q(e,e.state.shell),e.render();return}if(r.openWorkspaceBrowser){fa(e,e.workspaceRoot).catch(s=>{let i=se(e,"browse workspaces",s,"Failed to browse workspaces.");e.state={mode:"main",shell:le(e,v(e,{...r.state,workspaceBrowser:{cwd:e.workspaceRoot,entries:[],selectedIndex:0,query:null,error:i}}),i)},e.render()});return}if(r.createPtyTab){Dw(e,r.state,r.createPtyTabKind,r.createPtyTabRunner).then(s=>{bd(e,s)}).catch(s=>{let i=se(e,"create PTY tab",s,"Failed to create tab.");e.state={mode:"main",shell:le(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.closePtyTab){_w(e,r.state).then(s=>{e.state={mode:"main",shell:s},Q(e,e.state.shell),e.render()}).catch(s=>{let i=se(e,"close PTY tab",s,"Failed to close tab.");e.state={mode:"main",shell:le(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},Q(e,e.state.shell),e.render()}).catch(s=>{let i=se(e,"refresh PR checks",s,"Failed to refresh PR checks.");e.state={mode:"main",shell:le(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.openPrUrl){let s=Gt(e.model.tasks,r.state),i=s?H(s)?.url??null:null;i?Ww(i).catch(o=>{let a=se(e,"open PR URL",o,"Failed to open PR in browser.");e.state={mode:"main",shell:le(e,v(e,r.state),a)},e.render()}):(e.state={mode:"main",shell:le(e,v(e,r.state),"No PR URL available.")},e.render());return}if(r.closeTask){xw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Q(e,e.state.shell),e.render()}).catch(s=>{let i=se(e,"close task",s,"Failed to close task.");e.state={mode:"main",shell:le(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.removeWorkspace){Fw(e,r.state).then(s=>{e.state={mode:"main",shell:s},Q(e,e.state.shell),e.render()}).catch(s=>{let i=se(e,"remove workspace",s,"Failed to remove workspace.");e.state={mode:"main",shell:le(e,v(e,{...r.state,actionMessage:i}),i)},e.render()});return}if(r.attachTerminal){bd(e,r.state);return}if(r.refreshInspection){if(e.state={mode:"main",shell:v(e,r.state)},Q(e,e.state.shell),(e.state.shell.focusedRegion!=="tasks"||!e.renderTaskNavigation())&&e.render(),e.state.shell.focusedRegion==="tasks"){Aw(e,e.state.shell);return}da(e,e.state.shell).catch(s=>{let i=se(e,"refresh inspection",s,"Failed to refresh inspection.");e.state={mode:"main",shell:le(e,v(e,{...e.state.shell,actionMessage:i}),i)},e.render()});return}r.changed&&(e.state={mode:"main",shell:v(e,r.state)},Cw(e,e.state.shell).catch(()=>{}),Q(e,e.state.shell),e.render());return}if(e.state.variant==="help"){e.state.viaOptions&&e.state.parentVariant?e.state={mode:"overlay",variant:"options",menuIndex:3,optionsMessage:null,shell:e.state.shell,parentVariant:e.state.parentVariant}:e.state.parentVariant?e.state={mode:"overlay",variant:e.state.parentVariant,menuIndex:1,optionsMessage:null,shell:e.state.shell}:e.state={mode:"main",shell:v(e,e.state.shell)},e.pendingClear=!0,e.render();return}if(e.state.variant==="options"){h0(e,n);return}if(e.state.variant==="runners"){y0(e,n);return}if(e.state.variant==="previews"){w0(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"){T0(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(),$w(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 Yw(e,t){let n=Jg(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){Jw(e),e.suppressTerminalEnterOnAttach=!1,e.lastTerminalKey={key:o,at:Date.now()},e.ptyRuntime.writeKey(o);return}if(Bu(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"})},Q(e,e.state.shell),e.render();return}let r=Gg(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!==`
289
293
  `&&n!==`\r
290
- `&&(e.suppressTerminalEnterOnAttach=!1),Wg(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function h0(e,t){if(e.pendingTerminalKeySequence){let n=Ug(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=xs(r);if(s)return Vw(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(xd(r))return e.pendingTerminalKeySequence.raw=r,Ww(e),!0}return fa(e),!1}return t!=="ESCAPE"?!1:(e.pendingTerminalKeySequence={raw:"\x1B",timer:setTimeout(()=>fa(e),30)},!0)}function Ww(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence.timer=setTimeout(()=>fa(e),30))}function fa(e){if(!e.pendingTerminalKeySequence)return;let t=e.pendingTerminalKeySequence;e.pendingTerminalKeySequence=null,clearTimeout(t.timer),e.ptyRuntime.write(t.raw)}function Vw(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function Kw(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){Pw(e,_d(t));return}let n=_d(t);n!==0&&da(e,n)}function g0(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var w0=y0(import.meta.url),k0=w0("terminal-kit"),T0=k0.terminal;function wu(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Gw(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Hw(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function 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 Yw(e={}){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Craig terminal shell requires a TTY.");let t=e.workspaceRoot??process.cwd(),n=Ee(t),r=await T.load(n),s=T.runners.getEnabled(r),i=e.uiStateFile?await Un({uiStateFile:e.uiStateFile}):null,o=await Sr(t,void 0,s),a=Os(Xh(i,r),o);o=await Sr(t,a,s);let l={current:o},c=()=>{},u=()=>{},d=()=>{},p={workspaceRoot:t,onUpdate:f=>c(f),onActivity:f=>u(f),onActivityRemoved:f=>d(f),resolveSessionSpec:(f,m)=>Fg(l.current,m,t)},h=e.ptyRuntime??await ay({...p,paths:n,activityEnabled:!0});return new Promise(f=>{let m=e.terminal??T0,y=null,k=null,R=null,b=null,$=null,N=0,D=!1,_=new Map,A=h.managesPullRequestSync?null:new Ar({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,Se=new fn({resolutionMs:eu,onError:(P,L)=>Or(`heartbeat job "${P}"`,L,oe(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:Os(a,o)},get model(){return l.current},set model(P){l.current=P},config:r,enabledRunnerIds:s,creatingTask:!1,suppressTerminalEnterOnAttach:!1,lastTerminalKey:null,pendingScrollLines:0,pendingInspectionScrollLines:0,leftNavInspectionTimer:null,pendingLeftNavInspectionShell:null,pendingTerminalKeySequence:null,scrollRenderTimer:null,inspectionScrollRenderTimer:null,ptyRenderTimer:null,footerToastTimer:null,focusFlashUntil:null,focusFlashTimer:null,lastBackgroundPrPollError:null,versionText:`Craig v${T.version.getCurrent()}`,updateText:null,inspectionRefreshSequence:0,pendingClear:!0,inputCaptureMode:null,runtimeState:i,persistQueue:Promise.resolve(),taskMutationQueue:Promise.resolve(),bootHydrationReady:Promise.resolve(),paths:n,workspaceRoot:t,uiStateFile:e.uiStateFile,activeTerminal:m,ptyRuntime:h,resolve:f,render:()=>{},renderTaskNavigation:()=>!1,exit:P=>f(P),installUpdate:e.installUpdate??Ay},w.ptyRuntime.setActivityEnabled?.(!0),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 Z=Gt(w,w.state.shell);if(w.state={mode:"main",shell:Z},!b||!k){w.render();return}let me=Ue(m.width,m.height),he={...b,terminal:Z.terminal},Be=Zy(me,he,k,Z.centerZoomed,L?.kind==="rows"?L.rowIndices:null,T.previews.isEnabled(w.config,"panelPolish"));if(!Be){w.render();return}Be.output.length>0&&m.noFormat(Be.output),b=he,k=Be.region,R&&(R={...R,center:Be.region}),y=null,m.hideCursor(!0)}},0)))},u=P=>{let L=Ge(P.tabId,[P],Date.now());w.state.mode==="main"&&Wt(P.tabId)&&(_.get(P.tabId)!==L||L==="ready")&&w.render()},d=P=>{w.state.mode==="main"&&Wt(P)&&_.get(P)!=="idle"&&w.render()};let we=Promise.resolve(),z=P=>{we=we.then(async()=>{let L=await Promise.all([...new Set(P)].map(Z=>S.getTask(w.paths,Z)));for(let Z of L)la(w,Z);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=>Or("daemon task-state refresh",L,oe(w)))};w.ptyRuntime.setTasksChangedHandler?.(z);let gn=Promise.resolve(),ma=P=>{gn=gn.then(async()=>{let L=w.state.shell,Z=w.model.tasks.find(js=>js.id===L.selectedTaskId)??null,me=Z&&w.model.inspection?.taskId===Z.id?w.model.inspection:null;if(!Z||!me)throw new Error("Craig needs an active task before it can open a file from an agent session.");let he=await Wh(P);w.model={...w.model,inspection:{...me,filePaths:[...new Set([...me.filePaths,P])],selectedFilePath:P,selectedFile:he,error:null}},w.ptyRuntime.detach();let Be=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:Be},X(w,Be),w.render()}).catch(L=>Or("open file from agent",L,oe(w)))};w.ptyRuntime.setOpenFileHandler?.(ma);let Nr=null,ku=P=>{let L=Ue(m.width,m.height);if(T.previews.isEnabled(w.config,"panelPolish")){let qs=`${L.width}:${L.height}:${P.shell.centerZoomed}`;Nr!==qs&&(Nr=qs,w.ptyRuntime.resize(Bt(L,!0,P.shell.centerZoomed)),P.shell=Gt(w,P.shell))}else Nr=null;let Z=w.ptyRuntime.getActivitySnapshots?.()??[],me=Date.now(),he=v(w,P.shell),Be=Ly(he,w.model.tasks,Z,me);Be!==he&&(P.shell.readAgentActivityAt=Be.readAgentActivityAt,X(w,P.shell));let js=Uy(Be,w.model,{snapshots:Z,now:me,animationFrame:N});_.clear();for(let qs of w.model.tasks)for(let ha of qs.ptyTabs)ha.kind==="agent"&&_.set(ha.id,Ge(ha.id,Z,me));let Xw=yg(L,js,{centerOnly:P.shell.centerZoomed,panelPolish:T.previews.isEnabled(w.config,"panelPolish"),focusFlashActive:w.focusFlashUntil!==null&&Date.now()<w.focusFlashUntil});return{data:js,presentation:Xw}},Tu=(P,L,Z,me)=>{if(!R)return!1;let he=ew(R,L.regions,Z);return he?(he.output.length>0&&m.noFormat(he.output),b=P,R=he.regions,k=he.regions.center,y=me?L.frame:null,m.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;gu(w),w.ptyRuntime.setPullRequestPollView?.(Hw(w.state)),w.ptyRuntime.setViewedTab?.($r(w,w.state.shell));let{data:P,presentation:L}=ku(w.state);return Tu(P,L,["rail","left","center","footer"],!1)},w.render=()=>{gu(w);let P=w.state;w.ptyRuntime.setPullRequestPollView?.(Hw(P)),w.ptyRuntime.setViewedTab?.(P.mode==="main"?$r(w,P.shell):null);let L=Ue(m.width,m.height),Z,me=null;if(P.mode==="main"){let he=ku(P);if(me=he.presentation,Z=me.frame,!w.pendingClear&&Tu(he.data,me,["rail","left","center","right","footer"],!0))return;b=he.data,k=me.center}else Z=P.variant==="boot"?pg(L,{panelPolish:T.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMessage:P.optionsMessage,versionText:w.versionText,updateText:w.updateText}):P.variant==="pause"?fg(L,{panelPolish:T.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMessage:P.optionsMessage,versionText:w.versionText,updateText:w.updateText}):P.variant==="options"?Ko(L,{panelPolish:T.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMenuItems:Ry(w.runtimeState?.seenPreviewIds)}):P.variant==="runners"?Ko(L,{panelPolish:T.previews.isEnabled(w.config,"panelPolish"),menuIndex:wu(P).menuIndex,optionsMenuItems:Yd(w.config,wu(P)),optionsMessage:by(wu(P)),optionsSubtitle:"Runners"}):P.variant==="previews"?Ko(L,{panelPolish:T.previews.isEnabled(w.config,"panelPolish"),menuIndex:Gw(P).menuIndex,optionsMenuItems:Py(w.config,w.runtimeState?.seenPreviewIds),optionsMessage:Sy(Gw(P)),optionsSubtitle:"Feature Previews - Experimental"}):P.variant==="update"&&P.update?mg(L,P.update,{menuIndex:P.menuIndex}):P.variant==="logs"?gg(L,{logPath:P.log?.path??n.logFile,logLines:P.log?.lines??[]}):hg(L),b=null,k=null,R=null;w.pendingClear&&(m.moveTo(1,1),m.eraseDisplayBelow(),w.pendingClear=!1,y=null),m.noFormat(Kg(Z,y)),y=Z,R=me?.regions??null,m.hideCursor(!0)};let bu=P=>Uw(w,P),Ru=P=>Bw(w,P),Pu=P=>Kw(w,P),Jw=()=>{process.stdout.off("resize",Su),process.off("SIGCONT",Iu),m.removeListener("key",bu),m.removeListener("unknown",Ru),m.removeListener("mouse",Pu),w.scrollRenderTimer&&(clearTimeout(w.scrollRenderTimer),w.scrollRenderTimer=null),w.inspectionScrollRenderTimer&&(clearTimeout(w.inspectionScrollRenderTimer),w.inspectionScrollRenderTimer=null),w.leftNavInspectionTimer&&(clearTimeout(w.leftNavInspectionTimer),w.leftNavInspectionTimer=null),w.pendingTerminalKeySequence&&(clearTimeout(w.pendingTerminalKeySequence.timer),w.pendingTerminalKeySequence=null),w.ptyRenderTimer&&(clearTimeout(w.ptyRenderTimer),w.ptyRenderTimer=null),w.footerToastTimer&&(clearTimeout(w.footerToastTimer),w.footerToastTimer=null),w.focusFlashTimer&&(clearTimeout(w.focusFlashTimer),w.focusFlashTimer=null),Se.stop(),w.ptyRuntime.disposeAll(),m.grabInput(!1),m.hideCursor(!1),m.fullscreen(!1)};w.exit=P=>{Jw(),f(P)};let Su=()=>{mu(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Bt(Ue(m.width,m.height),T.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Gt(w,w.state.shell)}),w.render()},Iu=()=>{mu(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Bt(Ue(m.width,m.height),T.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Gt(w,w.state.shell)}),w.render()};process.stdout.on("resize",Su),process.on("SIGCONT",Iu),m.grabInput(!0),w.inputCaptureMode="control",m.hideCursor(!0),m.fullscreen(!0),m.on("key",bu),m.on("unknown",Ru),m.on("mouse",Pu),A&&Se.register({id:"github.pull-requests",intervalMs:1e3,run:P=>Dw(w,A,P)}),Se.register({id:"agent.activity-indicators",intervalMs:eu,run:()=>{let P=Date.now(),L=Ti(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],P);(L||D)&&(N=(N+1)%Fy,w.state.mode==="main"&&w.render()),D=L}}),Se.start(),(e.checkForUpdate??T.version.checkForUpdate)().then(P=>{if(P.updateAvailable&&P.latest){if(w.runtimeState?.ignoredUpdateVersion===P.latest)return;w.updateText=`Update available: v${P.latest}`,w.state.mode==="overlay"&&w.state.variant==="boot"&&(w.state={mode:"overlay",variant:"update",menuIndex:0,optionsMessage:null,shell:w.state.shell,update:{current:P.current,latest:P.latest,phase:"ready"}},w.pendingClear=!0),w.render()}}),w.bootHydrationReady=hu(w).catch(()=>{}),w.render()})}async function P0(){try{if(process.argv[2]==="__craig-daemon"){let e=await zw(process.argv[3]??process.cwd()),t=Ee(e);return await ly(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await zw(process.argv[3]??process.cwd()),t=Ee(e);return await cy(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
291
- `),1}return Nh({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=>Yw({uiStateFile:Ee(e).uiStateFile,workspaceRoot:e})})}async function zw(e){return R0(e)}var S0=await P0();process.exit(S0);
294
+ `&&(e.suppressTerminalEnterOnAttach=!1),zg(e.suppressTerminalEnterOnAttach,e.lastTerminalKey,n)){e.suppressTerminalEnterOnAttach=!1;return}e.ptyRuntime.write(n)}function b0(e,t){if(e.pendingTerminalKeySequence){let n=Hg(t);if(n!==null){let r=`${e.pendingTerminalKeySequence.raw}${n}`,s=Ls(r);if(s)return Jw(e),e.lastTerminalKey={key:s,at:Date.now()},e.ptyRuntime.writeKey(s),!0;if(Bu(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 Jw(e){e.pendingTerminalKeySequence&&(clearTimeout(e.pendingTerminalKeySequence.timer),e.pendingTerminalKeySequence=null)}function Xw(e,t){if(e.state.mode!=="main")return;if(e.state.shell.inputMode==="control"){Ew(e,Uu(t));return}let n=Uu(t);n!==0&&pa(e,n)}function R0(e){e.focusFlashUntil=Date.now()+600,e.focusFlashTimer&&clearTimeout(e.focusFlashTimer),e.focusFlashTimer=setTimeout(()=>{e.focusFlashUntil=null,e.focusFlashTimer=null,e.render()},600)}var S0=P0(import.meta.url),I0=S0("terminal-kit"),v0=I0.terminal;function Rd(e){return e.runnerOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Qw(e){return e.previewOptions??{menuIndex:e.menuIndex,message:e.optionsMessage}}function Zw(e){return e.mode!=="main"?{selectedTaskId:null,reviewVisible:!1}:{selectedTaskId:e.shell.selectedTaskId,reviewVisible:e.shell.inspectionMode==="review"}}function C0(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 ek(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 Un({uiStateFile:e.uiStateFile}):null,o=await Pr(t,void 0,s),a=Ds(sg(i,r),o);o=await Pr(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)=>Bg(l.current,m,t)},h=e.ptyRuntime??await fy({...p,paths:n,activityEnabled:!0});return new Promise(f=>{let m=e.terminal??v0,y=null,T=null,R=null,b=null,$=null,N=0,D=!1,_=new Map,A=h.managesPullRequestSync?null:new Er({minimumIntervalMs:(r.github?.watchIntervalSeconds??5)*1e3}),w,Ie=new mn({resolutionMs:sd,onError:(P,L)=>$r(`heartbeat job "${P}"`,L,ce(w))});w={state:{mode:"overlay",variant:"boot",menuIndex:0,optionsMessage:null,shell:Ds(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??_y},w.ptyRuntime.setActivityEnabled?.(!0),c=P=>{w.state.mode==="main"&&($=C0($,P),w.ptyRenderTimer||(w.ptyRenderTimer=setTimeout(()=>{w.ptyRenderTimer=null;let L=$;if($=null,w.state.mode==="main"){let te=Ht(w,w.state.shell);if(w.state={mode:"main",shell:te},!b||!T){w.render();return}let he=We(m.width,m.height),ge={...b,terminal:te.terminal},Ve=iw(he,ge,T,te.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=ge,T=Ve.region,R&&(R={...R,center:Ve.region}),y=null,m.hideCursor(!0)}},0)))},d=P=>{let L=Ye(P.tabId,[P],Date.now());w.state.mode==="main"&&Vt(P.tabId)&&(_.get(P.tabId)!==L||L==="ready")&&w.render()},u=P=>{w.state.mode==="main"&&Vt(P)&&_.get(P)!=="idle"&&w.render()};let ke=Promise.resolve(),z=P=>{ke=ke.then(async()=>{let L=await Promise.all([...new Set(P)].map(te=>S.getTask(w.paths,te)));for(let te of L)ua(w,te);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=>$r("daemon task-state refresh",L,ce(w)))};w.ptyRuntime.setTasksChangedHandler?.(z);let yn=Promise.resolve(),ga=P=>{yn=yn.then(async()=>{let L=w.state.shell,te=w.model.tasks.find(qs=>qs.id===L.selectedTaskId)??null,he=te&&w.model.inspection?.taskId===te.id?w.model.inspection:null;if(!te||!he)throw new Error("Craig needs an active task before it can open a file from an agent session.");let ge=await Jh(P);w.model={...w.model,inspection:{...he,filePaths:[...new Set([...he.filePaths,P])],selectedFilePath:P,selectedFile:ge,error:null}},w.ptyRuntime.detach();let Ve=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:Ve},Q(w,Ve),w.render()}).catch(L=>$r("open file from agent",L,ce(w)))};w.ptyRuntime.setOpenFileHandler?.(ga);let Dr=null,Pd=P=>{let L=We(m.width,m.height);if(k.previews.isEnabled(w.config,"panelPolish")){let Us=`${L.width}:${L.height}:${P.shell.centerZoomed}`;Dr!==Us&&(Dr=Us,w.ptyRuntime.resize(Wt(L,!0,P.shell.centerZoomed)),P.shell=Ht(w,P.shell))}else Dr=null;let te=w.ptyRuntime.getActivitySnapshots?.()??[],he=Date.now(),ge=v(w,P.shell),Ve=Wy(ge,w.model.tasks,te,he);Ve!==ge&&(P.shell.readAgentActivityAt=Ve.readAgentActivityAt,Q(w,P.shell));let qs=Hy(Ve,w.model,{snapshots:te,now:he,animationFrame:N});_.clear();for(let Us of w.model.tasks)for(let ya of Us.ptyTabs)ya.kind==="agent"&&_.set(ya.id,Ye(ya.id,te,he));let rk=Sg(L,qs,{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:qs,presentation:rk}},Sd=(P,L,te,he)=>{if(!R)return!1;let ge=ow(R,L.regions,te);return ge?(ge.output.length>0&&m.noFormat(ge.output),b=P,R=ge.regions,T=ge.regions.center,y=he?L.frame:null,m.hideCursor(!0),!0):!1};w.renderTaskNavigation=()=>{if(w.state.mode!=="main"||w.pendingClear)return!1;Td(w),w.ptyRuntime.setPullRequestPollView?.(Zw(w.state)),w.ptyRuntime.setViewedTab?.(Nr(w,w.state.shell));let{data:P,presentation:L}=Pd(w.state);return Sd(P,L,["rail","left","center","footer"],!1)},w.render=()=>{Td(w);let P=w.state;w.ptyRuntime.setPullRequestPollView?.(Zw(P)),w.ptyRuntime.setViewedTab?.(P.mode==="main"?Nr(w,P.shell):null);let L=We(m.width,m.height),te,he=null;if(P.mode==="main"){let ge=Pd(P);if(he=ge.presentation,te=he.frame,!w.pendingClear&&Sd(ge.data,he,["rail","left","center","right","footer"],!0))return;b=ge.data,T=he.center}else te=P.variant==="boot"?kg(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMessage:P.optionsMessage,versionText:w.versionText,updateText:w.updateText}):P.variant==="pause"?Tg(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMessage:P.optionsMessage,versionText:w.versionText,updateText:w.updateText}):P.variant==="options"?Go(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:P.menuIndex,optionsMenuItems:Ay(w.runtimeState?.seenPreviewIds)}):P.variant==="runners"?Go(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:Rd(P).menuIndex,optionsMenuItems:Qu(w.config,Rd(P)),optionsMessage:Cy(Rd(P)),optionsSubtitle:"Runners"}):P.variant==="previews"?Go(L,{panelPolish:k.previews.isEnabled(w.config,"panelPolish"),menuIndex:Qw(P).menuIndex,optionsMenuItems:Ey(w.config,w.runtimeState?.seenPreviewIds),optionsMessage:Oy(Qw(P)),optionsSubtitle:"Feature Previews - Experimental"}):P.variant==="update"&&P.update?bg(L,P.update,{menuIndex:P.menuIndex}):P.variant==="logs"?Pg(L,{logPath:P.log?.path??n.logFile,logLines:P.log?.lines??[]}):Rg(L),b=null,T=null,R=null;w.pendingClear&&(m.moveTo(1,1),m.eraseDisplayBelow(),w.pendingClear=!1,y=null),m.noFormat(Xg(te,y)),y=te,R=he?.regions??null,m.hideCursor(!0)};let Id=P=>Hw(w,P),vd=P=>Yw(w,P),Cd=P=>Xw(w,P),nk=()=>{process.stdout.off("resize",Ad),process.off("SIGCONT",Ed),m.removeListener("key",Id),m.removeListener("unknown",vd),m.removeListener("mouse",Cd),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),Ie.stop(),w.ptyRuntime.disposeAll(),m.grabInput(!1),m.hideCursor(!1),m.fullscreen(!1)};w.exit=P=>{nk(),f(P)};let Ad=()=>{wd(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Wt(We(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Ht(w,w.state.shell)}),w.render()},Ed=()=>{wd(w),w.state.mode==="main"&&w.state.shell.inputMode==="terminal"&&(w.ptyRuntime.resize(Wt(We(m.width,m.height),k.previews.isEnabled(w.config,"panelPolish"),w.state.shell.centerZoomed)),w.state={mode:"main",shell:Ht(w,w.state.shell)}),w.render()};process.stdout.on("resize",Ad),process.on("SIGCONT",Ed),m.grabInput(!0),w.inputCaptureMode="control",m.hideCursor(!0),m.fullscreen(!0),m.on("key",Id),m.on("unknown",vd),m.on("mouse",Cd),A&&Ie.register({id:"github.pull-requests",intervalMs:1e3,run:P=>jw(w,A,P)}),Ie.register({id:"agent.activity-indicators",intervalMs:sd,run:()=>{let P=Date.now(),L=bi(w.model.tasks,w.ptyRuntime.getActivitySnapshots?.()??[],P);(L||D)&&(N=(N+1)%By,w.state.mode==="main"&&w.render()),D=L}}),Ie.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=kd(w).catch(()=>{}),w.render()})}async function E0(){try{if(process.argv[2]==="__craig-daemon"){let e=await tk(process.argv[3]??process.cwd()),t=$e(e);return await my(t),0}if(process.argv[2]==="__craig-daemon-shutdown"){let e=await tk(process.argv[3]??process.cwd()),t=$e(e);return await hy(t),0}}catch(e){let t=e instanceof Error?e.message:"Unknown Craig error";return process.stderr.write(`${t}
295
+ `),1}return jh({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=>ek({uiStateFile:$e(e).uiStateFile,workspaceRoot:e})})}async function tk(e){return A0(e)}var O0=await E0();await Promise.all([process.stdout,process.stderr].filter(e=>e.writableLength>0).map(e=>new Promise(t=>e.write("",()=>t()))));process.exit(O0);